ZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThiNzNmLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0XzEuMC4wLioKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjExYWYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzBiNGJjLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZTQyYmIuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gUnVudGltZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQ4MTI2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC8ucHJvamVjdCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhMmJmNS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQucGF0Y2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzgxZmIyLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotc3JjLmluY2x1ZGVzID0gZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanB0LnBhdGNoLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qcHQucGF0Y2guaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxMTVmNC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qcHQucGF0Y2guaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLQotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkJ1aWxkIiBjb250ZW50PSJCdWlsZCI+Ci0gICA8dGl0bGU+SmF2YSBQZXJzaXN0ZW5jZSBUb29scyAoSlRQKSAxLjAuMiBQYXRjaGVzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMT5KVFAgMi4wLjIgUGF0Y2hlczwvaDE+Ci0KLTxoMj5GZWF0dXJlIFBhdGNoZWQ6IG9yZy5lY2xpcHNlLmpwdC5wYXRjaDwvaDI+Ci08aDM+UGx1Z2luKHMpIHJlcGxhY2VkOjwvaDM+Ci08dWw+PGxpPm9yZy5lY2xpcHNlLmpwdC5nZW48L2xpPjwvdWw+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzIyMDI5Nyc+MjIwMjk3PC9hPi4gRW50aXR5IGdlbmVyYXRpb24gY3JlYXRlcyBFbWJlZGRhYmxlcyB3aXRoIGNvbXBpbGUgZXJyb3JzIGluIHNvbWUgY2FzZXMuPC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NDU3ZWEuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SmF2YSBQZXJzaXN0ZW5jZSBUb29scyAoSlRQKSBQYXRjaGVzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249XAotUGF0Y2gocykgZm9yIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIFRvb2xzLiBcblwKLVNlZSBidWcgMjIwMjk3IChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy8yMjAyOTcpIEVudGl0eSBnZW5lcmF0aW9uIGNyZWF0ZXMgRW1iZWRkYWJsZXMgd2l0aCBjb21waWxlIGVycm9ycyBpbiBzb21lIGNhc2VzIFxuXAotCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNi0wOCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZmVhdHVyZS54bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYWU5MmIuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnBhdGNoIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4yLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvcGF0Y2hlcy8iPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQYXRjaGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy9wYXRjaGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmZlYXR1cmUiIHZlcnNpb249IjEuMC4yLnYyMDA4MDIxNDAxMDAtNzctN19DWVFDRDJDYUxZQ0hDRCIgcGF0Y2g9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvbGljZW5zZS5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay8uY3ZzaWdub3JlIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzJhYmY3Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotKi5iaW4uZGlzdC56aXAKLWJ1aWxkLnhtbAotZmVhdHVyZXMKLXBsdWdpbnMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjFkNDUzLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuc2RrPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9idWlsZC5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjAwOTM5Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjBjODguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgcHJvamVjdCBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHByb2plY3QgU0RLCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzNDhkNy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnNkayIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvbGljZW5zZS5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YWJmYjQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+Ci0gICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NDQ2OTMuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotKi5iaW4uZGlzdC56aXAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0LnRlc3RzXzEuMC4wLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzQ4OTljLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YWNiNjUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMTowNSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNThmZTYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHByb2plY3QgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHByb2plY3QgVGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZmI2NGIuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+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+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTQ0NjkzLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0qLmJpbi5kaXN0LnppcAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHQudGVzdHNfMS4wLjAuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8ucHJvamVjdCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxZGRlNi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhY2I2NS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMTowNSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2VwbC12MTAuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1OGZlNi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHByb2plY3QgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHByb2plY3QgVGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3ZTdjMi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudGVzdHMiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0Ly5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4YjczZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHRfMS4wLjAuKgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0Ly5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2FhZWMyLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9idWlsZC5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MGI0YmMuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2VwbC12MTAuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFlNDJiYi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gUnVudGltZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZmVhdHVyZS54bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzgxY2IuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0IgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9saWNlbnNlLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzJhYmY3Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0qLmJpbi5kaXN0LnppcAotYnVpbGQueG1sCi1mZWF0dXJlcwotcGx1Z2lucwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTAxMzcyLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMDA5MzkuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiMGM4OC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHByb2plY3QgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBwcm9qZWN0IFNESwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRiOWJhLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmFiZmI0Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+Ci0gICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDAxYTIuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHRfMS4wLjAuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5wcm9qZWN0IGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MWIwNGMuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZWMyOWQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDowOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTNhOWUwLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbCBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LmluaSBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4YTMyNS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5tYXBwaW5ncyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LnByb3BlcnRpZXMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTliZmNlLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDYuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjY2ZiMGUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9jb21wb25lbnQueG1sIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmMTMzZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdCI+Ci08ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0IiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLmdpZiBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5wbmcgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhmYWMxLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9wbHVnaW4ucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVhMDhkLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZjE5YjEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiNTgzNy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDo0NyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjAwOTM5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMGZkODAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IChPcHRpb25hbCkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgKE9wdGlvbmFsKQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYtMDggT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTgxNzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIChKUEEpIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIgdmVyc2lvbj0iMi4wLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzczNzIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGMwYTllLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1KYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmY2Q2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjFkNTAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+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+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkNWYxYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWJlNjYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NjY0MDYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IChPcHRpb25hbCkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBKUEEgRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+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+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYzBhOWUuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2ZjZDYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiMWQ1MC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGQ1ZjFjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2NWQzZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWZlYXR1cmUudGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlXzEuMC4xLioKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWY5MTU3Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M3ZDRiLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNTowOTo1OSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NzljY2IuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ0N2Q3Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IFNESyAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlBBIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LTA4IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmI4OTI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzczNzIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZWIyZjAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiNTgzNy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDo0NyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjAwOTM5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYjM5ZjMuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYtMDcgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzg5ZTJlLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIChKUEEpIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZ2VmIiB2ZXJzaW9uPSIzLjQuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZHQiIHZlcnNpb249IjMuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLnhzZCIgdmVyc2lvbj0iMi40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4iIHZlcnNpb249IjIuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIgdmVyc2lvbj0iMi40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUiIHZlcnNpb249IjMuMC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjYuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjYuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsZGV2dG9vbHMuZmVhdHVyZSIgdmVyc2lvbj0iMS42LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjYuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRiIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRiLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3NzM3Mi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDE3ZmYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgVG9vbHMgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTk1MjliLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiMWQ1MC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ4NTQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwZGFkMy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3ZjUzNC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgMjAwOCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+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+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0MTdmZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scyBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTUyOWIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGIxZDUwLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDg1NDcuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIFRvb2xzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTc2MGYyLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWI4NGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MTcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhNGRjZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNlYzUzNi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLSMgVE9SRVZJRVcgLSB1cGRhdGVTaXRlTmFtZQotdXBkYXRlU2l0ZU5hbWU9V2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgVG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjNmQxNy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSJEYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIChKUEEpIEpVbml0IFRlc3RzIgotICAgICAgdmVyc2lvbj0iMi4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+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+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjVkM2QuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZV8xLjAuMS4qCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkYTc1MC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjN2Q0Yi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MDk6NTkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDdhYjhkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0MjA0YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIFBsdWctaW4gU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlBBIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNi0wNyBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlmOGM2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRvYy5pc3YiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzczNzIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlN2M3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qc3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEzNjJhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLWphdmFDb21waWxlci4uLmFyZ3MuKgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiMzAzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmMDFjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjEwOjMzIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwNzBiNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jU3VuIE5vdiAxMiAxNToyNDozNiBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTNlNTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4yMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjEwMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5kYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmplZS5lamI7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UueHNkO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucHJlZnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5jb21tb24udHJhbnNsYXRvcnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSxvcmcuZWNsaXBzZS5qcHQuZ2VuIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS50cmFuc2xhdG9yczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnN5bmNoO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHksCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjNWEzMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS41Ci1qYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zcmMuaW5jbHVkZXMgPSBtb2RlbC8sXAotICAgICAgICAgICAgICAgc2NoZW1hLwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMTEwMjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9EYWxpRW1mRm9ybWF0dGVyLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL0RhbGlFbWZGb3JtYXR0ZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGVkMmRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL0RhbGlFbWZGb3JtYXR0ZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvZmlsZXMgdmVyc2lvbj0iMTEiPgotPHByb2ZpbGUga2luZD0iQ29kZUZvcm1hdHRlclByb2ZpbGUiIG5hbWU9IkRhbGlFTUZGb3JtYXR0ZXIiIHZlcnNpb249IjExIj4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZSIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucyIgdmFsdWU9IjIiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHkiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplIiB2YWx1ZT0iNCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHMiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bmsiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbiIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50IiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGUiIHZhbHVlPSIyIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb24iIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZSIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb24iIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWwiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3MiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWwiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplIiB2YWx1ZT0iNCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2ZvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdCIgdmFsdWU9IjgwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jayIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50IiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMzIiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlciIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGwiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3NpbmciIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2siIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3QiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9IjQ4Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZCIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2giIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbiIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2giIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9IjMyIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3MiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWwiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyIiB2YWx1ZT0iZXJyb3IiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudCIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlIiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb24iIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZSIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcyIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3ciIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGUiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlIiB2YWx1ZT0iMS41Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlciIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoIiB2YWx1ZT0iODAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZSIgdmFsdWU9IjEuNSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWYiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucyIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoIiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5IiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaCIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyIiB2YWx1ZT0iZXJyb3IiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmUiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybSIgdmFsdWU9IjEuNSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2giIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmIiB2YWx1ZT0iNTIiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jayIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlciIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZSIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlciIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHMiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyIiB2YWx1ZT0idGFiIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmUiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZCIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jayIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08L3Byb2ZpbGU+Ci08L3Byb2ZpbGVzPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvanB0UmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9qcHRSZXNvdXJjZU1vZGVscy5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwZTBjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9qcHRSZXNvdXJjZU1vZGVscy5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMiCi0gICAgY3JlYXRpb25Db21tYW5kcz0iZmFsc2UiIGNyZWF0aW9uSWNvbnM9ImZhbHNlIiBlZGl0RGlyZWN0b3J5PSIiIGVkaXRvckRpcmVjdG9yeT0iIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiBtb2RlbE5hbWU9IkNvcmUiIGVkaXRQbHVnaW5DbGFzcz0iIiBlZGl0b3JQbHVnaW5DbGFzcz0iIgotICAgIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdCIgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdCIKLSAgICBzdXBwcmVzc0ludGVyZmFjZXM9InRydWUiIHRlc3RzRGlyZWN0b3J5PSIiIHRlc3RTdWl0ZUNsYXNzPSIiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5lY29yZSIKLSAgICBjb21wbGlhbmNlTGV2ZWw9IjUuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSIgdXNlZEdlblBhY2thZ2VzPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlIj4KLSAgPGZvcmVpZ25Nb2RlbD5vcm0uZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5wZXJzaXN0ZW5jZS5lY29yZTwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJPcm0iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIgZWNvcmVQYWNrYWdlPSJvcm0uZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09Im9ybS5lY29yZSMvL0FjY2Vzc1R5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9BY2Nlc3NUeXBlL1BST1BFUlRZIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0FjY2Vzc1R5cGUvRklFTEQiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvcm0uZWNvcmUjLy9EaXNjcmltaW5hdG9yVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0Rpc2NyaW1pbmF0b3JUeXBlL1NUUklORyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9EaXNjcmltaW5hdG9yVHlwZS9DSEFSIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0Rpc2NyaW1pbmF0b3JUeXBlL0lOVEVHRVIiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvcm0uZWNvcmUjLy9FbnVtVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0VudW1UeXBlL09SRElOQUwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vRW51bVR5cGUvU1RSSU5HIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vRmV0Y2hUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vRmV0Y2hUeXBlL0xBWlkiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vRmV0Y2hUeXBlL0VBR0VSIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vR2VuZXJhdGlvblR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9HZW5lcmF0aW9uVHlwZS9UQUJMRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9HZW5lcmF0aW9uVHlwZS9TRVFVRU5DRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9HZW5lcmF0aW9uVHlwZS9JREVOVElUWSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9HZW5lcmF0aW9uVHlwZS9BVVRPIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vSW5oZXJpdGFuY2VUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vSW5oZXJpdGFuY2VUeXBlL1NJTkdMRV9UQUJMRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9Jbmhlcml0YW5jZVR5cGUvSk9JTkVEIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0luaGVyaXRhbmNlVHlwZS9UQUJMRV9QRVJfQ0xBU1MiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvcm0uZWNvcmUjLy9UZW1wb3JhbFR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9UZW1wb3JhbFR5cGUvREFURSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9UZW1wb3JhbFR5cGUvVElNRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9UZW1wb3JhbFR5cGUvVElNRVNUQU1QIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im9ybS5lY29yZSMvL0Rpc2NyaW1pbmF0b3JWYWx1ZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ib3JtLmVjb3JlIy8vRW51bWVyYXRlZCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ib3JtLmVjb3JlIy8vT3JkZXJCeSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ib3JtLmVjb3JlIy8vVmVyc2lvblR5cGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL3BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvcGFja2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL3NjaGVtYSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL2NhdGFsb2ciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9hY2Nlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3Mvc2VxdWVuY2VHZW5lcmF0b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL3RhYmxlR2VuZXJhdG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9uYW1lZFF1ZXJpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvbmFtZWROYXRpdmVRdWVyaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL3NxbFJlc3VsdFNldE1hcHBpbmdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL21hcHBlZFN1cGVyY2xhc3NlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9lbnRpdGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9lbWJlZGRhYmxlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEveG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEvcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzL3NjaGVtYSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzL2NhdGFsb2ciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy9hY2Nlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy9jYXNjYWRlUGVyc2lzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy9lbnRpdHlMaXN0ZW5lcnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFR5cGVNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFR5cGVNYXBwaW5nL2NsYXNzTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Fic3RyYWN0WG1sVHlwZU1hcHBpbmcvYWNjZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxUeXBlTWFwcGluZy9tZXRhZGF0YUNvbXBsZXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxUeXBlTWFwcGluZy9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFR5cGVNYXBwaW5nL2F0dHJpYnV0ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvaWRDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvZW50aXR5TGlzdGVuZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvcHJlUGVyc2lzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL3Bvc3RQZXJzaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvcHJlUmVtb3ZlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvcG9zdFJlbW92ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL3ByZVVwZGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL3Bvc3RVcGRhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcy9wb3N0TG9hZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxFbnRpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS90YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvc2Vjb25kYXJ5VGFibGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9wcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L2lkQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L2luaGVyaXRhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRW50aXR5L2Rpc2NyaW1pbmF0b3JWYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvZGlzY3JpbWluYXRvckNvbHVtbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvc2VxdWVuY2VHZW5lcmF0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L3RhYmxlR2VuZXJhdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9uYW1lZFF1ZXJpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L25hbWVkTmF0aXZlUXVlcmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvc3FsUmVzdWx0U2V0TWFwcGluZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L2VudGl0eUxpc3RlbmVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvcHJlUGVyc2lzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvcG9zdFBlcnNpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L3ByZVJlbW92ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvcG9zdFJlbW92ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvcHJlVXBkYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9wb3N0VXBkYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9wb3N0TG9hZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvYXR0cmlidXRlT3ZlcnJpZGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9hc3NvY2lhdGlvbk92ZXJyaWRlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxFbWJlZGRhYmxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQXR0cmlidXRlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0F0dHJpYnV0ZXMvaWRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0F0dHJpYnV0ZXMvZW1iZWRkZWRJZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9iYXNpY3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy92ZXJzaW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL21hbnlUb09uZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9vbmVUb01hbnlzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0F0dHJpYnV0ZXMvb25lVG9PbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0F0dHJpYnV0ZXMvbWFueVRvTWFueXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9lbWJlZGRlZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy90cmFuc2llbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlTWFwcGluZy9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxOdWxsQXR0cmlidXRlTWFwcGluZyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0NvbHVtbk1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9Db2x1bW5NYXBwaW5nL2NvbHVtbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFJlbGF0aW9uc2hpcE1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFJlbGF0aW9uc2hpcE1hcHBpbmcvdGFyZ2V0RW50aXR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUmVsYXRpb25zaGlwTWFwcGluZy9mZXRjaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxSZWxhdGlvbnNoaXBNYXBwaW5nL2pvaW5UYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxSZWxhdGlvbnNoaXBNYXBwaW5nL2Nhc2NhZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy9tYXBwZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy9vcmRlckJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy9tYXBLZXkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nL29wdGlvbmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcvam9pbkNvbHVtbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxJZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbElkL2dlbmVyYXRlZFZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sSWQvdGVtcG9yYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sSWQvdGFibGVHZW5lcmF0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sSWQvc2VxdWVuY2VHZW5lcmF0b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sSWRJbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9CYXNlWG1sRW1iZWRkZWQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9CYXNlWG1sRW1iZWRkZWQvYXR0cmlidXRlT3ZlcnJpZGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRW1iZWRkZWRJZCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEVtYmVkZGVkSWRJbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxFbWJlZGRlZCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEVtYmVkZGVkSW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQmFzaWMiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEJhc2ljL2ZldGNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQmFzaWMvb3B0aW9uYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxCYXNpYy9sb2IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxCYXNpYy90ZW1wb3JhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEJhc2ljL2VudW1lcmF0ZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQmFzaWNJbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxWZXJzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxWZXJzaW9uL3RlbXBvcmFsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFZlcnNpb25JbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxNYW55VG9PbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxNYW55VG9PbmVJbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxPbmVUb01hbnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxPbmVUb01hbnkvam9pbkNvbHVtbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sT25lVG9NYW55SW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sT25lVG9PbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbE9uZVRvT25lL21hcHBlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbE9uZVRvT25lL3ByaW1hcnlLZXlKb2luQ29sdW1ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxPbmVUb09uZUltcGwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE1hbnlUb01hbnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxNYW55VG9NYW55SW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sVHJhbnNpZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sVHJhbnNpZW50SW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlL2pvaW5Db2x1bW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQXNzb2NpYXRpb25PdmVycmlkZS9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlL2NvbHVtbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlL25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQ2FzY2FkZVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9DYXNjYWRlVHlwZS9jYXNjYWRlQWxsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Nhc2NhZGVUeXBlL2Nhc2NhZGVQZXJzaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Nhc2NhZGVUeXBlL2Nhc2NhZGVNZXJnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9DYXNjYWRlVHlwZS9jYXNjYWRlUmVtb3ZlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Nhc2NhZGVUeXBlL2Nhc2NhZGVSZWZyZXNoIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0Nhc2NhZGVUeXBlSW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTmFtZWRDb2x1bW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbE5hbWVkQ29sdW1uL2NvbHVtbkRlZmluaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxOYW1lZENvbHVtbi9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxOYW1lZENvbHVtbiIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQWJzdHJhY3RDb2x1bW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEFic3RyYWN0Q29sdW1uL2luc2VydGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxBYnN0cmFjdENvbHVtbi9udWxsYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEFic3RyYWN0Q29sdW1uL3RhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQWJzdHJhY3RDb2x1bW4vdW5pcXVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQWJzdHJhY3RDb2x1bW4vdXBkYXRhYmxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQ29sdW1uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxDb2x1bW4vbGVuZ3RoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQ29sdW1uL3ByZWNpc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbENvbHVtbi9zY2FsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxDb2x1bW5JbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQ29sdW1uUmVzdWx0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9Db2x1bW5SZXN1bHQvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxEaXNjcmltaW5hdG9yQ29sdW1uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxEaXNjcmltaW5hdG9yQ29sdW1uL2Rpc2NyaW1pbmF0b3JUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRGlzY3JpbWluYXRvckNvbHVtbi9sZW5ndGgiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vRW50aXR5TGlzdGVuZXJzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vRW50aXR5TGlzdGVuZXJzL2VudGl0eUxpc3RlbmVycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9FbnRpdHlMaXN0ZW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vRW50aXR5TGlzdGVuZXIvY2xhc3NOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVyL3ByZVBlcnNpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vRW50aXR5TGlzdGVuZXIvcG9zdFBlcnNpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vRW50aXR5TGlzdGVuZXIvcHJlUmVtb3ZlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVyL3Bvc3RSZW1vdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vRW50aXR5TGlzdGVuZXIvcHJlVXBkYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVyL3Bvc3RVcGRhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vRW50aXR5TGlzdGVuZXIvcG9zdExvYWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vRW50aXR5UmVzdWx0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9FbnRpdHlSZXN1bHQvZGlzY3JpbWluYXRvckNvbHVtbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0VudGl0eVJlc3VsdC9lbnRpdHlDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9FbnRpdHlSZXN1bHQvZmllbGRSZXN1bHRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0V2ZW50TWV0aG9kIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9FdmVudE1ldGhvZC9tZXRob2ROYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0ZpZWxkUmVzdWx0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9GaWVsZFJlc3VsdC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vRmllbGRSZXN1bHQvY29sdW1uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sR2VuZXJhdGVkVmFsdWUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEdlbmVyYXRlZFZhbHVlL2dlbmVyYXRvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEdlbmVyYXRlZFZhbHVlL3N0cmF0ZWd5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEdlbmVyYXRlZFZhbHVlSW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbElkQ2xhc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbElkQ2xhc3MvY2xhc3NOYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0luaGVyaXRhbmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9Jbmhlcml0YW5jZS9zdHJhdGVneSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEpvaW5Db2x1bW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEpvaW5Db2x1bW4vcmVmZXJlbmNlZENvbHVtbk5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sSm9pbkNvbHVtbkltcGwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEpvaW5UYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEpvaW5UYWJsZS9qb2luQ29sdW1ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxKb2luVGFibGUvaW52ZXJzZUpvaW5Db2x1bW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEpvaW5UYWJsZUltcGwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Mb2IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9NYXBLZXkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL01hcEtleS9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL01hcEtleUltcGwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFF1ZXJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxRdWVyeS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUXVlcnkvcXVlcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sUXVlcnkvaGludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTmFtZWROYXRpdmVRdWVyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sTmFtZWROYXRpdmVRdWVyeS9yZXN1bHRDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbE5hbWVkTmF0aXZlUXVlcnkvcmVzdWx0U2V0TWFwcGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxOYW1lZFF1ZXJ5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vUG9zdExvYWQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Qb3N0UGVyc2lzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1Bvc3RSZW1vdmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Qb3N0VXBkYXRlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vUHJlUGVyc2lzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1ByZVJlbW92ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1ByZVVwZGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFByaW1hcnlLZXlKb2luQ29sdW1uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi9yZWZlcmVuY2VkQ29sdW1uTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxRdWVyeUhpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFF1ZXJ5SGludC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUXVlcnlIaW50L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxCYXNlVGFibGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEJhc2VUYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQmFzZVRhYmxlL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxCYXNlVGFibGUvY2F0YWxvZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEJhc2VUYWJsZS9zY2hlbWEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sQmFzZVRhYmxlL3VuaXF1ZUNvbnN0cmFpbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFRhYmxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sU2Vjb25kYXJ5VGFibGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxTZWNvbmRhcnlUYWJsZS9wcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sU2Vjb25kYXJ5VGFibGVJbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxHZW5lcmF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEdlbmVyYXRvci9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sR2VuZXJhdG9yL2luaXRpYWxWYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEdlbmVyYXRvci9hbGxvY2F0aW9uU2l6ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFNlcXVlbmNlR2VuZXJhdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxTZXF1ZW5jZUdlbmVyYXRvci9zZXF1ZW5jZU5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vU3FsUmVzdWx0U2V0TWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vU3FsUmVzdWx0U2V0TWFwcGluZy9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1NxbFJlc3VsdFNldE1hcHBpbmcvZW50aXR5UmVzdWx0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9TcWxSZXN1bHRTZXRNYXBwaW5nL2NvbHVtblJlc3VsdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVGFibGVHZW5lcmF0b3IvdGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvci9jYXRhbG9nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVGFibGVHZW5lcmF0b3Ivc2NoZW1hIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVGFibGVHZW5lcmF0b3IvcGtDb2x1bW5OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVGFibGVHZW5lcmF0b3IvdmFsdWVDb2x1bW5OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVGFibGVHZW5lcmF0b3IvcGtDb2x1bW5WYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvci91bmlxdWVDb25zdHJhaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvckltcGwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxVbmlxdWVDb25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxVbmlxdWVDb25zdHJhaW50L2NvbHVtbk5hbWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFVuaXF1ZUNvbnN0cmFpbnRJbXBsIi8+Ci0gIDwvZ2VuUGFja2FnZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlBlcnNpc3RlbmNlIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0icGVyc2lzdGVuY2UuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUvSlRBIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlL1JFU09VUkNFX0xPQ0FMIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFZlcnNpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZVVuaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZS92ZXJzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdC9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L3Byb3ZpZGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvanRhRGF0YVNvdXJjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L25vbkp0YURhdGFTb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvbWFwcGluZ0ZpbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvamFyRmlsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvY2xhc3NlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L2V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvcHJvcGVydGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdC90cmFuc2FjdGlvblR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxNYXBwaW5nRmlsZVJlZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxNYXBwaW5nRmlsZVJlZi9maWxlTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbEphdmFDbGFzc1JlZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxKYXZhQ2xhc3NSZWYvamF2YUNsYXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUHJvcGVydGllcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUHJvcGVydGllcy9wcm9wZXJ0aWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUHJvcGVydHkvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmZiNWZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJvcm0iCi0gICAgbnNVUkk9ImpwdC5vcm0ueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbnRpdHlNYXBwaW5ncyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9WZXJzaW9uVHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMS4wIiB1bnNldHRhYmxlPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhY2thZ2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjaGVtYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0YWxvZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWNjZXNzIiBlVHlwZT0iIy8vQWNjZXNzVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iUFJPUEVSVFkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VxdWVuY2VHZW5lcmF0b3JzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFNlcXVlbmNlR2VuZXJhdG9yIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhYmxlR2VuZXJhdG9ycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxUYWJsZUdlbmVyYXRvciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZFF1ZXJpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sTmFtZWRRdWVyeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZE5hdGl2ZVF1ZXJpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sTmFtZWROYXRpdmVRdWVyeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzcWxSZXN1bHRTZXRNYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TcWxSZXN1bHRTZXRNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcHBlZFN1cGVyY2xhc3NlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxNYXBwZWRTdXBlcmNsYXNzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGl0aWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEVudGl0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbWJlZGRhYmxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxFbWJlZGRhYmxlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIKLSAgICAgICAgZVR5cGU9IiMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZW1hIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRhbG9nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY2Nlc3MiIGVUeXBlPSIjLy9BY2Nlc3NUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJQUk9QRVJUWSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNjYWRlUGVyc2lzdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGl0eUxpc3RlbmVycyIgZVR5cGU9IiMvL0VudGl0eUxpc3RlbmVycyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzTmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWNjZXNzIiBlVHlwZT0iIy8vQWNjZXNzVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iUFJPUEVSVFkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0YWRhdGFDb21wbGV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdHRyaWJ1dGVzIiBlVHlwZT0iIy8vQXR0cmlidXRlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYXBwZWRTdXBlcmNsYXNzIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxUeXBlTWFwcGluZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImlkQ2xhc3MiIGVUeXBlPSIjLy9YbWxJZENsYXNzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnRpdHlMaXN0ZW5lcnMiIGVUeXBlPSIjLy9FbnRpdHlMaXN0ZW5lcnMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlUGVyc2lzdCIgZVR5cGU9IiMvL1ByZVBlcnNpc3QiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdFBlcnNpc3QiIGVUeXBlPSIjLy9Qb3N0UGVyc2lzdCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVSZW1vdmUiIGVUeXBlPSIjLy9QcmVSZW1vdmUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdFJlbW92ZSIgZVR5cGU9IiMvL1Bvc3RSZW1vdmUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlVXBkYXRlIiBlVHlwZT0iIy8vUHJlVXBkYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3RVcGRhdGUiIGVUeXBlPSIjLy9Qb3N0VXBkYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3RMb2FkIiBlVHlwZT0iIy8vUG9zdExvYWQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5IiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxUeXBlTWFwcGluZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhYmxlIiBlVHlwZT0iIy8vWG1sVGFibGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2Vjb25kYXJ5VGFibGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFNlY29uZGFyeVRhYmxlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByaW1hcnlLZXlKb2luQ29sdW1ucyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpZENsYXNzIiBlVHlwZT0iIy8vWG1sSWRDbGFzcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmhlcml0YW5jZSIgZVR5cGU9IiMvL0luaGVyaXRhbmNlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2NyaW1pbmF0b3JWYWx1ZSIgZVR5cGU9IiMvL0Rpc2NyaW1pbmF0b3JWYWx1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNjcmltaW5hdG9yQ29sdW1uIiBlVHlwZT0iIy8vWG1sRGlzY3JpbWluYXRvckNvbHVtbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXF1ZW5jZUdlbmVyYXRvciIgZVR5cGU9IiMvL1htbFNlcXVlbmNlR2VuZXJhdG9yIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhYmxlR2VuZXJhdG9yIiBlVHlwZT0iIy8vWG1sVGFibGVHZW5lcmF0b3IiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZWRRdWVyaWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbE5hbWVkUXVlcnkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZWROYXRpdmVRdWVyaWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbE5hbWVkTmF0aXZlUXVlcnkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3FsUmVzdWx0U2V0TWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vU3FsUmVzdWx0U2V0TWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlRGVmYXVsdExpc3RlbmVycyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW50aXR5TGlzdGVuZXJzIiBlVHlwZT0iIy8vRW50aXR5TGlzdGVuZXJzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZVBlcnNpc3QiIGVUeXBlPSIjLy9QcmVQZXJzaXN0IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3RQZXJzaXN0IiBlVHlwZT0iIy8vUG9zdFBlcnNpc3QiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlUmVtb3ZlIiBlVHlwZT0iIy8vUHJlUmVtb3ZlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3RSZW1vdmUiIGVUeXBlPSIjLy9Qb3N0UmVtb3ZlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZVVwZGF0ZSIgZVR5cGU9IiMvL1ByZVVwZGF0ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0VXBkYXRlIiBlVHlwZT0iIy8vUG9zdFVwZGF0ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0TG9hZCIgZVR5cGU9IiMvL1Bvc3RMb2FkIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF0dHJpYnV0ZU92ZXJyaWRlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NvY2lhdGlvbk92ZXJyaWRlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGFibGUiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbFR5cGVNYXBwaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXR0cmlidXRlcyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImlkcyIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxJZCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbWJlZGRlZElkcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxFbWJlZGRlZElkIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2ljcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxCYXNpYyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2ZXJzaW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxWZXJzaW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbnlUb09uZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sTWFueVRvT25lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9uZVRvTWFueXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sT25lVG9NYW55IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9uZVRvT25lcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxPbmVUb09uZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW55VG9NYW55cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxNYW55VG9NYW55IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVtYmVkZGVkcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxFbWJlZGRlZCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0cmFuc2llbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFRyYW5zaWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBdHRyaWJ1dGVNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEF0dHJpYnV0ZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb2x1bW5NYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29sdW1uIiBlVHlwZT0iIy8vWG1sQ29sdW1uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFJlbGF0aW9uc2hpcE1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldEVudGl0eSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmV0Y2giIGVUeXBlPSIjLy9GZXRjaFR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkxBWlkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iam9pblRhYmxlIiBlVHlwZT0iIy8vWG1sSm9pblRhYmxlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhc2NhZGUiIGVUeXBlPSIjLy9DYXNjYWRlVHlwZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sUmVsYXRpb25zaGlwTWFwcGluZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hcHBlZEJ5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlckJ5IiBlVHlwZT0iIy8vT3JkZXJCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBLZXkiIGVUeXBlPSIjLy9NYXBLZXkiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9YbWxSZWxhdGlvbnNoaXBNYXBwaW5nIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3B0aW9uYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqb2luQ29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbElkIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vQ29sdW1uTWFwcGluZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdlbmVyYXRlZFZhbHVlIiBlVHlwZT0iIy8vWG1sR2VuZXJhdGVkVmFsdWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGVtcG9yYWwiIGVUeXBlPSIjLy9UZW1wb3JhbFR5cGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFibGVHZW5lcmF0b3IiIGVUeXBlPSIjLy9YbWxUYWJsZUdlbmVyYXRvciIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXF1ZW5jZUdlbmVyYXRvciIgZVR5cGU9IiMvL1htbFNlcXVlbmNlR2VuZXJhdG9yIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbElkSW1wbCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxJZCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJhc2VYbWxFbWJlZGRlZCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXR0cmlidXRlT3ZlcnJpZGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGVkSWQiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9CYXNlWG1sRW1iZWRkZWQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRlZElkSW1wbCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxFbWJlZGRlZElkIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkZWQiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vQmFzZVhtbEVtYmVkZGVkIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkZWRJbXBsIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEVtYmVkZGVkIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWMiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9Db2x1bW5NYXBwaW5nIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmV0Y2giIGVUeXBlPSIjLy9GZXRjaFR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkxBWlkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3B0aW9uYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2IiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZW1wb3JhbCIgZVR5cGU9IiMvL1RlbXBvcmFsVHlwZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbnVtZXJhdGVkIiBlVHlwZT0iIy8vRW51bVR5cGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWNJbXBsIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEJhc2ljIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVmVyc2lvbiIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL0NvbHVtbk1hcHBpbmciPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZW1wb3JhbCIgZVR5cGU9IiMvL1RlbXBvcmFsVHlwZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxWZXJzaW9uSW1wbCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxWZXJzaW9uIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvT25lIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9PbmVJbXBsIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbE1hbnlUb09uZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9uZVRvTWFueSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmciPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqb2luQ29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9uZVRvTWFueUltcGwiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sT25lVG9NYW55Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9PbmUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hcHBlZEJ5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmltYXJ5S2V5Sm9pbkNvbHVtbnMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9PbmVJbXBsIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbE9uZVRvT25lIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvTWFueSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9NYW55SW1wbCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxNYW55VG9NYW55Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVHJhbnNpZW50IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEF0dHJpYnV0ZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUcmFuc2llbnRJbXBsIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbFRyYW5zaWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iam9pbkNvbHVtbnMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sSm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCIgZVN1cGVyVHlwZXM9IiMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBdHRyaWJ1dGVPdmVycmlkZSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb2x1bW4iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxDb2x1bW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsIiBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlT3ZlcnJpZGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXNjYWRlVHlwZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVBbGwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNjYWRlUGVyc2lzdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVNZXJnZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVSZW1vdmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNjYWRlUmVmcmVzaCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhc2NhZGVUeXBlSW1wbCIgZVN1cGVyVHlwZXM9IiMvL0Nhc2NhZGVUeXBlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTmFtZWRDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb2x1bW5EZWZpbml0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBYnN0cmFjdFhtbE5hbWVkQ29sdW1uIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxOYW1lZENvbHVtbiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEFic3RyYWN0Q29sdW1uIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbE5hbWVkQ29sdW1uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5zZXJ0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bGxhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXF1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVwZGF0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sTmFtZWRDb2x1bW4gIy8vWG1sQWJzdHJhY3RDb2x1bW4iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQWJzdHJhY3RDb2x1bW4iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWNpc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbHVtbkltcGwiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uICMvL1htbENvbHVtbiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbHVtblJlc3VsdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbERpc2NyaW1pbmF0b3JDb2x1bW4iIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbE5hbWVkQ29sdW1uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzY3JpbWluYXRvclR5cGUiIGVUeXBlPSIjLy9EaXNjcmltaW5hdG9yVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iU1RSSU5HIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxlbmd0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRW50aXR5TGlzdGVuZXJzIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW50aXR5TGlzdGVuZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0VudGl0eUxpc3RlbmVyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVudGl0eUxpc3RlbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NOYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVQZXJzaXN0IiBlVHlwZT0iIy8vUHJlUGVyc2lzdCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0UGVyc2lzdCIgZVR5cGU9IiMvL1Bvc3RQZXJzaXN0IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZVJlbW92ZSIgZVR5cGU9IiMvL1ByZVJlbW92ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0UmVtb3ZlIiBlVHlwZT0iIy8vUG9zdFJlbW92ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVVcGRhdGUiIGVUeXBlPSIjLy9QcmVVcGRhdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdFVwZGF0ZSIgZVR5cGU9IiMvL1Bvc3RVcGRhdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdExvYWQiIGVUeXBlPSIjLy9Qb3N0TG9hZCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbnRpdHlSZXN1bHQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNjcmltaW5hdG9yQ29sdW1uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbnRpdHlDbGFzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmllbGRSZXN1bHRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0ZpZWxkUmVzdWx0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV2ZW50TWV0aG9kIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0aG9kTmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmllbGRSZXN1bHQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb2x1bW4iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEdlbmVyYXRlZFZhbHVlIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdG9yIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdHJhdGVneSIgZVR5cGU9IiMvL0dlbmVyYXRpb25UeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJUQUJMRSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxHZW5lcmF0ZWRWYWx1ZUltcGwiIGVTdXBlclR5cGVzPSIjLy9YbWxHZW5lcmF0ZWRWYWx1ZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbElkQ2xhc3MiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbGFzc05hbWUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkluaGVyaXRhbmNlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RyYXRlZ3kiIGVUeXBlPSIjLy9Jbmhlcml0YW5jZVR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IlNJTkdMRV9UQUJMRSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxKb2luQ29sdW1uIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEFic3RyYWN0Q29sdW1uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmZXJlbmNlZENvbHVtbk5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5Db2x1bW5JbXBsIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiAjLy9YbWxKb2luQ29sdW1uIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSm9pblRhYmxlIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEJhc2VUYWJsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImpvaW5Db2x1bW5zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEpvaW5Db2x1bW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW52ZXJzZUpvaW5Db2x1bW5zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEpvaW5Db2x1bW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSm9pblRhYmxlSW1wbCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQmFzZVRhYmxlICMvL1htbEpvaW5UYWJsZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxvYiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1hcEtleSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1hcEtleUltcGwiIGVTdXBlclR5cGVzPSIjLy9NYXBLZXkiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxRdWVyeSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InF1ZXJ5IiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJoaW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxRdWVyeUhpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTmFtZWROYXRpdmVRdWVyeSIgZVN1cGVyVHlwZXM9IiMvL1htbFF1ZXJ5Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdWx0Q2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VsdFNldE1hcHBpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE5hbWVkUXVlcnkiIGVTdXBlclR5cGVzPSIjLy9YbWxRdWVyeSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvc3RMb2FkIiBlU3VwZXJUeXBlcz0iIy8vRXZlbnRNZXRob2QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3N0UGVyc2lzdCIgZVN1cGVyVHlwZXM9IiMvL0V2ZW50TWV0aG9kIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9zdFJlbW92ZSIgZVN1cGVyVHlwZXM9IiMvL0V2ZW50TWV0aG9kIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9zdFVwZGF0ZSIgZVN1cGVyVHlwZXM9IiMvL0V2ZW50TWV0aG9kIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJlUGVyc2lzdCIgZVN1cGVyVHlwZXM9IiMvL0V2ZW50TWV0aG9kIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJlUmVtb3ZlIiBlU3VwZXJUeXBlcz0iIy8vRXZlbnRNZXRob2QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmVVcGRhdGUiIGVTdXBlclR5cGVzPSIjLy9FdmVudE1ldGhvZCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByaW1hcnlLZXlKb2luQ29sdW1uIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbE5hbWVkQ29sdW1uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmZXJlbmNlZENvbHVtbk5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sTmFtZWRDb2x1bW4gIy8vWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxRdWVyeUhpbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RYbWxCYXNlVGFibGUiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEJhc2VUYWJsZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2VUYWJsZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGFsb2ciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjaGVtYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idW5pcXVlQ29uc3RyYWludHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sVW5pcXVlQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQmFzZVRhYmxlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU2Vjb25kYXJ5VGFibGUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQmFzZVRhYmxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJpbWFyeUtleUpvaW5Db2x1bW5zIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1htbFByaW1hcnlLZXlKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFNlY29uZGFyeVRhYmxlSW1wbCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQmFzZVRhYmxlICMvL1htbFNlY29uZGFyeVRhYmxlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sR2VuZXJhdG9yIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5pdGlhbFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludE9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGxvY2F0aW9uU2l6ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU2VxdWVuY2VHZW5lcmF0b3IiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sR2VuZXJhdG9yIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VxdWVuY2VOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwiIGVTdXBlclR5cGVzPSIjLy9YbWxTZXF1ZW5jZUdlbmVyYXRvciIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNxbFJlc3VsdFNldE1hcHBpbmciPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnRpdHlSZXN1bHRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0VudGl0eVJlc3VsdCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb2x1bW5SZXN1bHRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbHVtblJlc3VsdCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZUdlbmVyYXRvciIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxHZW5lcmF0b3IiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0YWxvZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZW1hIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwa0NvbHVtbk5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlQ29sdW1uTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGtDb2x1bW5WYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idW5pcXVlQ29uc3RyYWludHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sVW5pcXVlQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZUdlbmVyYXRvckltcGwiIGVTdXBlclR5cGVzPSIjLy9YbWxUYWJsZUdlbmVyYXRvciIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFVuaXF1ZUNvbnN0cmFpbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29sdW1uTmFtZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxVbmlxdWVDb25zdHJhaW50SW1wbCIgZVN1cGVyVHlwZXM9IiMvL1htbFVuaXF1ZUNvbnN0cmFpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEaXNjcmltaW5hdG9yVmFsdWUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRW51bWVyYXRlZCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3JkZXJCeSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJWZXJzaW9uVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkFjY2Vzc1R5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUFJPUEVSVFkiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkZJRUxEIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkRpc2NyaW1pbmF0b3JUeXBlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlNUUklORyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0hBUiIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOVEVHRVIiIHZhbHVlPSIyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iRW51bVR5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1JESU5BTCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU1RSSU5HIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkZldGNoVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJMQVpZIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJFQUdFUiIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJHZW5lcmF0aW9uVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJUQUJMRSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU0VRVUVOQ0UiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJREVOVElUWSIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkFVVE8iIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iSW5oZXJpdGFuY2VUeXBlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlNJTkdMRV9UQUJMRSIgbGl0ZXJhbD0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJKT0lORUQiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJUQUJMRV9QRVJfQ0xBU1MiIHZhbHVlPSIyIiBsaXRlcmFsPSJUQUJMRV9QRVJfQ0xBU1MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJUZW1wb3JhbFR5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iREFURSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVElNRSIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlRJTUVTVEFNUCIgdmFsdWU9IjIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvcGVyc2lzdGVuY2UuZWNvcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9wZXJzaXN0ZW5jZS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkNjJlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9wZXJzaXN0ZW5jZS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InBlcnNpc3RlbmNlIgotICAgIG5zVVJJPSJqcHQucGVyc2lzdGVuY2UueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBlcnNpc3RlbmNlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVuY2VVbml0cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxQZXJzaXN0ZW5jZVVuaXQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1htbFZlcnNpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb3ZpZGVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqdGFEYXRhU291cmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub25KdGFEYXRhU291cmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBwaW5nRmlsZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sTWFwcGluZ0ZpbGVSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamFyRmlsZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjbGFzc2VzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1htbEphdmFDbGFzc1JlZiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlVW5saXN0ZWRDbGFzc2VzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydGllcyIgZVR5cGU9IiMvL1htbFByb3BlcnRpZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNhY3Rpb25UeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJKVEEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwcGluZ0ZpbGVSZWYiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWxlTmFtZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSmF2YUNsYXNzUmVmIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YUNsYXNzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcm9wZXJ0aWVzIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydGllcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxQcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcm9wZXJ0eSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJKVEEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJFU09VUkNFX0xPQ0FMIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3QiCi0gICAgICBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJYbWxWZXJzaW9uIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIvPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZmIzYjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIENvcmUKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KLUpQQV9QTEFURk9STT0iSlBBIFBsYXRmb3JtIgotSlBBX1BST0JMRU1fTUFSS0VSPUpQQSBQcm9ibGVtIE1hcmtlcgotSlBBX0ZJTEVfQ09OVEVOVD1KUEEgRmlsZSBDb250ZW50Ci0KLUdFTkVSSUNfUExBVEZPUk1fTEFCRUw9R2VuZXJpYwotCi1KUEFfRkFDRVRfTEFCRUw9SmF2YSBQZXJzaXN0ZW5jZQotSlBBX0ZBQ0VUX0RFU0NSSVBUSU9OPUFkZHMgc3VwcG9ydCBmb3Igd3JpdGluZyBwZXJzaXN0ZW50IG1ldGEtZGF0YSB1c2luZyBKYXZhIFBlcnNpc3RlbmNlIEFyY2hpdGVjdHVyZS4KLUpQQV9QUkVTRVRfTEFCRUw9VXRpbGl0eSBKUEEgcHJvamVjdCB3aXRoIEphdmEgNS4wCi1KUEFfVEVNUExBVEVfTEFCRUw9SlBBIFByb2plY3QKLUpQQV9WQUxJREFUT1I9SlBBIFZhbGlkYXRvcgotCi1PUk1fWE1MX0NPTlRFTlQgPSBPUk0gWE1MIENvbnRlbnQKLVBFUlNJU1RFTkNFX1hNTF9DT05URU5UID0gUGVyc2lzdGVuY2UgWE1MIENvbnRlbnQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3BsdWdpbi54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRiN2NmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotCTwhLS0gKioqKiogZXh0ZW5zaW9uIHBvaW50cyAqKioqKiAtLT4KLQotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImpwYVBsYXRmb3JtIgotCQluYW1lPSIlSlBBX1BMQVRGT1JNIgotCQlzY2hlbWE9InNjaGVtYS9qcGFQbGF0Zm9ybS5leHNkIgotCS8+Ci0JCi0JCi0JPCEtLSAqKioqKiBFY2xpcHNlIGNvcmUgZXh0ZW5zaW9ucyAqKioqKiAtLT4KLQkKLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotCQkKLQkJPHByb3BlcnR5VGVzdGVyCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUucHJvcGVydHlUZXN0ZXIucGVyc2lzdGVudEF0dHJpYnV0ZSIKLQkJCXR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZSIKLQkJCW5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUiCi0JCQlwcm9wZXJ0aWVzPSJpc01hcHBlZCwgaXNWaXJ0dWFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZVByb3BlcnR5VGVzdGVyIj4KLQkJPC9wcm9wZXJ0eVRlc3Rlcj4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIKLQkJaWQ9ImpwYVByb2JsZW1NYXJrZXIiCi0JCW5hbWU9IiVKUEFfUFJPQkxFTV9NQVJLRVIiPgotCi0JCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0JCQotCQk8IS0tIENhbid0IHVzZSB0ZXh0IG1hcmtlciB1bnRpbCB3ZSBoYXZlIHNwZWNpZmljIG1vZGVscyBmb3IgZWFjaCBpbnB1dCB0eXBlIChYTUwsIGphdmEpCi0JCTxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50ZXh0bWFya2VyIi8+Ci0JCS0tPgotCQkKLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXIiLz4KLQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0JCQotCQk8ZmFjdG9yeQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYVByb2plY3RBZGFwdGVyRmFjdG9yeSIKLQkJCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCTxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QiLz4KLQkJPC9mYWN0b3J5PgotCQkKLQkJPGZhY3RvcnkKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcGFQcm9qZWN0QWRhcHRlckZhY3RvcnkiCi0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QiPgotCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCIvPgotCQk8L2ZhY3Rvcnk+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotCQkKLQkJPGNvbnRlbnQtdHlwZQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRlbnQub3JtIgotCQkJbmFtZT0iJU9STV9YTUxfQ09OVEVOVCIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWZpbGUtbmFtZXM9Im9ybS54bWwiPgotCQkJPGRlc2NyaWJlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5YTUxSb290RWxlbWVudENvbnRlbnREZXNjcmliZXIiPgotCQkJCTxwYXJhbWV0ZXIgbmFtZT0iZWxlbWVudCIgdmFsdWU9ImVudGl0eS1tYXBwaW5ncyIvPgotCQkJPC9kZXNjcmliZXI+Ci0JCTwvY29udGVudC10eXBlPgotICAJCQotICAJCTxjb250ZW50LXR5cGUKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50LnBlcnNpc3RlbmNlIgotCQkJbmFtZT0iJVBFUlNJU1RFTkNFX1hNTF9DT05URU5UIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJZmlsZS1uYW1lcz0icGVyc2lzdGVuY2UueG1sIj4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuWE1MUm9vdEVsZW1lbnRDb250ZW50RGVzY3JpYmVyIj4KLQkJCQk8cGFyYW1ldGVyIG5hbWU9ImVsZW1lbnQiIHZhbHVlPSJwZXJzaXN0ZW5jZSIvPgotCQkJPC9kZXNjcmliZXI+Ci0JCTwvY29udGVudC10eXBlPgotIAkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQkKLQkJPGluaXRpYWxpemVyIAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnByZWZzLkpwYVByZWZlcmVuY2VJbml0aWFsaXplciIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8IS0tICoqKioqIEpQVCBleHRlbnNpb25zIChlYXQgb3VyIG93biBkb2dmb29kKSAqKioqKiAtLT4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVBsYXRmb3JtIj4KLQkJCi0JCTxqcGFQbGF0Zm9ybQotCQkJaWQ9ImdlbmVyaWMiCi0JCQlsYWJlbD0iJUdFTkVSSUNfUExBVEZPUk1fTEFCRUwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uR2VuZXJpY0pwYVBsYXRmb3JtIgotCQkJZGVmYXVsdD0iZmFsc2UiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPCEtLSAqKioqKiBXVFAgZXh0ZW5zaW9ucyAqKioqKiAtLT4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5yZXNvdXJjZUZhY3RvcmllcyI+Ci0JCQotCQk8cmVzb3VyY2VGYWN0b3J5Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZUZhY3RvcnkiCi0JCQlpc0RlZmF1bHQ9InRydWUiCi0JCQlzaG9ydFNlZ21lbnQ9InBlcnNpc3RlbmNlLnhtbCI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGVudC5wZXJzaXN0ZW5jZSI+Ci0JCQk8L2NvbnRlbnRUeXBlQmluZGluZz4KLQkJPC9yZXNvdXJjZUZhY3Rvcnk+Ci0JCQotCQk8cmVzb3VyY2VGYWN0b3J5Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlRmFjdG9yeSIKLQkJCWlzRGVmYXVsdD0idHJ1ZSIKLQkJCXNob3J0U2VnbWVudD0ib3JtLnhtbCI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGVudC5vcm0iPgotCQkJPC9jb250ZW50VHlwZUJpbmRpbmc+Ci0JCTwvcmVzb3VyY2VGYWN0b3J5PgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotCQkKLQkJPHByb2plY3QtZmFjZXQgaWQ9ImpwdC5qcGEiPgotCQkJPGxhYmVsPiVKUEFfRkFDRVRfTEFCRUw8L2xhYmVsPgotCQkJPGRlc2NyaXB0aW9uPiVKUEFfRkFDRVRfREVTQ1JJUFRJT048L2Rlc2NyaXB0aW9uPgotCQk8L3Byb2plY3QtZmFjZXQ+Ci0JCQotCQk8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqcHQuanBhIiB2ZXJzaW9uPSIxLjAiPgotCQkJPGNvbnN0cmFpbnQ+Ci0JCQkJPGFuZD4KLQkJCQkJPHJlcXVpcmVzIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iWzUuMCIvPgotCQkJCQk8b3I+Ci0JCQkJCQk8cmVxdWlyZXMgZmFjZXQ9ImpzdC51dGlsaXR5IiB2ZXJzaW9uPSJbMS4wIi8+Ci0JCQkJCQk8cmVxdWlyZXMgZmFjZXQ9ImpzdC5hcHBjbGllbnQiIHZlcnNpb249IlsxLjIiLz4KLQkJCQkJCTxyZXF1aXJlcyBmYWNldD0ianN0LmVqYiIgdmVyc2lvbj0iWzEuMSIvPgotCQkJCQkJPHJlcXVpcmVzIGZhY2V0PSJqc3QuY29ubmVjdG9yIiB2ZXJzaW9uPSJbMS4wIi8+Ci0JCQkJCQk8cmVxdWlyZXMgZmFjZXQ9ImpzdC53ZWIiIHZlcnNpb249IlsyLjIiLz4KLQkJCQkJPC9vcj4KLQkJCQk8L2FuZD4KLQkJCTwvY29uc3RyYWludD4KLQkJPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0JCQotCQk8dGVtcGxhdGUgaWQ9ImpwdC5qcGEudGVtcGxhdGUiPgotCQkJPGxhYmVsPiVKUEFfVEVNUExBVEVfTEFCRUw8L2xhYmVsPgotCQkJPGZpeGVkIGZhY2V0PSJqc3QuamF2YSIvPgotCQkJPGZpeGVkIGZhY2V0PSJqc3QudXRpbGl0eSIvPgotCQkJPGZpeGVkIGZhY2V0PSJqcHQuanBhIi8+Ci0JCQk8cHJlc2V0IGlkPSJqcHQuanBhLnByZXNldCIvPgotCQk8L3RlbXBsYXRlPgotCQkKLQkJPGFjdGlvbiBmYWNldD0ianB0LmpwYSIgdHlwZT0iaW5zdGFsbCIgaWQ9ImpwdC5qcGEuaW5zdGFsbCI+Ci0JCQk8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIiLz4KLQkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLQkJPC9hY3Rpb24+Ci0JCQotCQk8IS0tIAotCQkJVGhlIHVuaW5zdGFsbCBhY3Rpb24gaXMgb25seSB1c2VkIHRvIGVuYWJsZSBmYWNldCB1bmluc3RhbGxhdGlvbgotCQkJdGhyb3VnaCB0aGUgZmFjZXQgVUkuICBUaGUgZGVsZWdhdGUgY3VycmVudGx5IGhhcyBubyBmdW5jdGlvbmFsaXR5LiAKLQkJLS0+Ci0JCTxhY3Rpb24gZmFjZXQ9ImpwdC5qcGEiIHR5cGU9InVuaW5zdGFsbCIgaWQ9ImpwdC5qcGEudW5pbnN0YWxsIj4KLQkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZSIvPgotCQk8L2FjdGlvbj4KLQkJCi0JCTwhLS0gCi0JCQlUaGVyZSBpcyBubyB2ZXJzaW9uIGNoYW5nZSBkZWxlZ2F0ZSwgYmVjYXVzZSBhcyBvZiBub3csIHRoZXJlIGlzIAotCQkgICAgb25seSBhIHNpbmdsZSB2ZXJzaW9uIG9mIEpQQSAKLQkJLS0+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJlc2V0cyI+Ci0JCQotCQk8c3RhdGljLXByZXNldCBpZD0ianB0LmpwYS5wcmVzZXQiPgotCQkJPGxhYmVsPiVKUEFfUFJFU0VUX0xBQkVMPC9sYWJlbD4KLQkJCTxmYWNldCBpZD0ianN0LmphdmEiIHZlcnNpb249IjUuMCIvPgotCQkJPGZhY2V0IGlkPSJqc3QudXRpbGl0eSIgdmVyc2lvbj0iMS4wIi8+Ci0JCQk8ZmFjZXQgaWQ9ImpwdC5qcGEiIHZlcnNpb249IjEuMCIvPgotCQk8L3N0YXRpYy1wcmVzZXQ+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24gCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0JCQotCQk8c3VwcG9ydGVkPgotCQkJPHJ1bnRpbWUtY29tcG9uZW50IGFueT0idHJ1ZSIvPgotCQkJPGZhY2V0IGlkPSJqcHQuanBhIi8+Ci0JCTwvc3VwcG9ydGVkPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkJCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIgotICAgIAlpZD0ianBhVmFsaWRhdG9yIgotCQluYW1lPSIlSlBBX1ZBTElEQVRPUiI+Ci0JCQotCQk8dmFsaWRhdG9yPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPGFuZD4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGEiLz4KLQkJCQk8L2FuZD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJCQotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSJvcm0ueG1sIi8+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9InBlcnNpc3RlbmNlLnhtbCIvPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmphdmEiLz4KLSAgICAgICAgIAkKLSAgICAgICAgIAk8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRvciIvPgotCQkJPGhlbHBlciBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFIZWxwZXIiLz4KLQkJCQotCQkJPG1hcmtlcklkIG1hcmtlcklkVmFsdWU9ImpwYVByb2JsZW1NYXJrZXIiLz4KLQkJCQotICAgICAgICAgCTwhLS0gZG9uJ3Qga25vdyB3aGF0IHRoaXMgZG9lcwotCQkJPGRlcGVuZGVudFZhbGlkYXRvciBkZXBWYWxWYWx1ZT0idHJ1ZSIvPgotCQkJLS0+Ci0JCQkKLQkJPC92YWxpZGF0b3I+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9wcm9wZXJ0eV9maWxlcy9qcGFfY29yZS5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcHJvcGVydHlfZmlsZXMvanBhX2NvcmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlZjJmYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9wcm9wZXJ0eV9maWxlcy9qcGFfY29yZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVZBTElEQVRFX1BST0pFQ1RfTk9UX1NQRUNJRklFRD1Qcm9qZWN0IG11c3QgYmUgc3BlY2lmaWVkCi1WQUxJREFURV9TT1VSQ0VfRk9MREVSX05PVF9TUEVDSUZJRUQ9U291cmNlIGZvbGRlciBtdXN0IGJlIHNwZWNpZmllZAotVkFMSURBVEVfU09VUkNFX0ZPTERFUl9JTExFR0FMPVNvdXJjZSBmb2xkZXIgcGF0aCBpcyBpbGxlZ2FsCi1WQUxJREFURV9TT1VSQ0VfRk9MREVSX0RPRVNfTk9UX0VYSVNUPVNvdXJjZSBmb2xkZXIgJyd7MH0nJyBkb2VzIG5vdCBleGlzdAotVkFMSURBVEVfU09VUkNFX0ZPTERFUl9OT1RfSU5fUFJPSkVDVD1Tb3VyY2UgZm9sZGVyICcnezB9JycgaXMgbm90IGluIHByb2plY3QgJyd7MX0nJwotVkFMSURBVEVfU09VUkNFX0ZPTERFUl9OT1RfU09VUkNFX0ZPTERFUj1Tb3VyY2UgZm9sZGVyICcnezB9JycgaXMgbm90IGFuIGFjdHVhbCBzb3VyY2UgZm9sZGVyCi1WQUxJREFURV9PUk1fRklMRV9BTFJFQURZX0VYSVNUUz1GaWxlIGFscmVhZHkgZXhpc3RzIGF0IHRoaXMgbG9jYXRpb24KLVZBTElEQVRFX1BFUlNJU1RFTkNFX1VOSVRfRE9FU19OT1RfU1BFQ0lGSUVEPVBlcnNpc3RlbmNlIHVuaXQgbm90IHNwZWNpZmllZAotVkFMSURBVEVfUEVSU0lTVEVOQ0VfVU5JVF9OT1RfSU5fUFJPSkVDVD1QZXJzaXN0ZW5jZSB1bml0ICcnezB9Jycgbm90IGRlZmluZWQgaW4gcHJvamVjdCAnJ3sxfScnCi1WQUxJREFURV9QTEFURk9STV9OT1RfU1BFQ0lGSUVEPVBsYXRmb3JtIG11c3QgYmUgc3BlY2lmaWVkCi1WQUxJREFURV9DT05ORUNUSU9OX05PVF9TUEVDSUZJRUQ9Q29ubmVjdGlvbiBtdXN0IGJlIHNwZWNpZmllZAotVkFMSURBVEVfQ09OTkVDVElPTl9OT1RfQ09OTkVDVEVEPUNvbm5lY3Rpb24gbXVzdCBiZSBhY3RpdmUgdG8gZ2V0IGRhdGEgc291cmNlIHNwZWNpZmljIGhlbHAgYW5kIHZhbGlkYXRpb24uCi1WQUxJREFURV9ERUZBVUxUX1NDSEVNQV9OT1RfU1BFQ0lGSUVEPURlZmF1bHQgc2NoZW1hIGlzIG5vdCBzcGVjaWZpZWQKLVZBTElEQVRFX1JVTlRJTUVfTk9UX1NQRUNJRklFRD1UaGVyZSBpcyBubyBzZXJ2ZXIgcnVudGltZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0IHRvIHByb3ZpZGUgYSBKUEEgaW1wbGVtZW50YXRpb24KLVZBTElEQVRFX1JVTlRJTUVfRE9FU19OT1RfU1VQUE9SVF9FSkJfMzA9VGhlIHNlcnZlciBydW50aW1lIHNlbGVjdGVkIGRvZXMgbm90IHN1cHBvcnQgRUpCIDMuMCwgc28gaXQgbGlrZWx5IGRvZXMgbm90IHByb3ZpZGUgYSBKUEEgaW1wbGVtZW50YXRpb24KLVZBTElEQVRFX0xJQlJBUllfTk9UX1NQRUNJRklFRD1ObyBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSBzcGVjaWZpZWQKLVNZTkNIUk9OSVpFX0NMQVNTRVNfSk9CPVN5bmNocm9uaXppbmcgY2xhc3NlcwotU1lOQ0hST05JWklOR19DTEFTU0VTX1RBU0s9U3luY2hyb25pemluZyBjbGFzc2VzIC4uLgotSU5WQUxJRF9QRVJTSVNURU5DRV9YTUxfQ09OVEVOVD1JbnZhbGlkIHBlcnNpc3RlbmNlLnhtbCBjb250ZW50Ci1FUlJPUl9TWU5DSFJPTklaSU5HX0NMQVNTRVNfQ09VTERfTk9UX1ZBTElEQVRFPUVycm9yIHN5bmNocm9uaXppbmcgY2xhc3Nlcy4gIENvdWxkIG5vdCB2YWxpZGF0ZS4KLUVSUk9SX1dSSVRJTkdfRklMRT1Db3VsZCBub3Qgd3JpdGUgdG8gcGVyc2lzdGVuY2UueG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcHJvcGVydHlfZmlsZXMvanBhX3ZhbGlkYXRpb24ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwYV92YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDRiZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcHJvcGVydHlfZmlsZXMvanBhX3ZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1QUk9KRUNUX05PX0NPTk5FQ1RJT049Tm8gY29ubmVjdGlvbiBzcGVjaWZpZWQgZm9yIHByb2plY3QuICBObyBkYXRhYmFzZS1zcGVjaWZpYyB2YWxpZGF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkLiAKLVBST0pFQ1RfSU5BQ1RJVkVfQ09OTkVDVElPTj1Db25uZWN0aW9uIFwiezB9XCIgaXMgbm90IGFjdGl2ZS4gIE5vIHZhbGlkYXRpb24gd2lsbCBiZSBkb25lIGFnYWluc3QgdGhlIGRhdGEgc291cmNlLgotUFJPSkVDVF9OT19QRVJTSVNURU5DRV9YTUw9Tm8gcGVyc2lzdGVuY2UueG1sIGZpbGUgZm91bmQgaW4gcHJvamVjdAotUFJPSkVDVF9NVUxUSVBMRV9QRVJTSVNURU5DRV9YTUw9TXVsdGlwbGUgcGVyc2lzdGVuY2UueG1sIGZpbGVzIGluIHByb2plY3QKLVBFUlNJU1RFTkNFX1hNTF9JTlZBTElEX0NPTlRFTlQ9SW52YWxpZCBjb250ZW50IChubyByb290IG5vZGUpCi1QRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUPU5vIHBlcnNpc3RlbmNlIHVuaXQgZGVmaW5lZAotUEVSU0lTVEVOQ0VfTVVMVElQTEVfUEVSU0lTVEVOQ0VfVU5JVFM9TXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMgZGVmaW5lZCAtIHRvb2xpbmcgb25seSBzdXBwb3J0cyAxIHBlcnNpc3RlbmNlIHVuaXQgcGVyIHByb2plY3QKLVBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfTUFQUElOR19GSUxFPVVuc3BlY2lmaWVkIG1hcHBpbmcgZmlsZQotUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9NQVBQSU5HX0ZJTEU9TWFwcGluZyBmaWxlIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1QRVJTSVNURU5DRV9VTklUX0lOVkFMSURfTUFQUElOR19GSUxFPU1hcHBpbmcgZmlsZSBcInswfVwiIGRvZXMgbm90IGhhdmUgT1JNIGNvbnRlbnQKLVBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX01BUFBJTkdfRklMRT1EdXBsaWNhdGUgbWFwcGluZyBmaWxlIFwiezB9XCIKLVBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfQ0xBU1M9VW5zcGVjaWZpZWQgY2xhc3MKLVBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfQ0xBU1M9Q2xhc3MgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLVBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9DTEFTUz1DbGFzcyBcInswfVwiIGlzIGxpc3RlZCBpbiB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgYnV0IG5vdCBtYXBwZWQKLVBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0NMQVNTPUR1cGxpY2F0ZSBjbGFzcyBcInswfVwiCi1QRVJTSVNURU5DRV9VTklUX1JFRFVOREFOVF9DTEFTUz1DbGFzcyBcInswfVwiIGlzIGFscmVhZHkgc3BlY2lmaWVkIGluIG1hcHBpbmcgZmlsZSBcInsxfVwiCi1HRU5FUkFUT1JfRFVQTElDQVRFX05BTUU9RHVwbGljYXRlIGdlbmVyYXRvciBuYW1lZCBcInswfVwiIGRlZmluZWQgaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0Ci1RVUVSWV9EVVBMSUNBVEVfTkFNRT1EdXBsaWNhdGUgcXVlcnkgbmFtZWQgXCJ7MH1cIiBkZWZpbmVkIGluIHRoaXMgcGVyc2lzdGVuY2UgdW5pdAotRU5USVRZX01BUFBJTkdTX01VTFRJUExFX01FVEFEQVRBPU1ldGFkYXRhIGZvciBwZXJzaXN0ZW5jZSB1bml0IFwiezB9XCIgc3BlY2lmaWVkIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMKLVBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DT05URVhUPVRoaXMgbWFwcGVkIGNsYXNzIGlzIG5vdCBzcGVjaWZpZWQgaW4gcGVyc2lzdGVuY2UgdW5pdCBcInswfVwiCi1QRVJTSVNURU5UX1RZUEVfVU5TUEVDSUZJRURfQ0xBU1M9VW5zcGVjaWZpZWQgY2xhc3MKLVBFUlNJU1RFTlRfVFlQRV9VTlJFU09MVkVEX0NMQVNTPUNsYXNzIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1FTlRJVFlfTk9fSUQ9RW50aXR5IFwiezB9XCIgaGFzIG5vIElkIG9yIEVtYmVkZGVkSWQKLVBFUlNJU1RFTlRfQVRUUklCVVRFX1VOU1BFQ0lGSUVEX05BTUU9VW5zcGVjaWZpZWQgbmFtZQotUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5SRVNPTFZFRF9OQU1FPUF0dHJpYnV0ZSBcInswfVwiIGluIGNsYXNzIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1QRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX01BUFBJTkc9QXR0cmlidXRlIFwiezB9XCIgaGFzIGludmFsaWQgbWFwcGluZyB0eXBlIGluIHRoaXMgY29udGV4dAotUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfRklFTEQ9VGhlIGphdmEgZmllbGQgZm9yIGF0dHJpYnV0ZSBcInswfVwiIGlzIGZpbmFsCi1QRVJTSVNURU5UX0FUVFJJQlVURV9QVUJMSUNfRklFTEQ9VGhlIGphdmEgZmllbGQgZm9yIGF0dHJpYnV0ZSBcInswfVwiIGlzIHB1YmxpYwotTUFQUElOR19VTlJFU09MVkVEX01BUFBFRF9CWT1DYW5ub3QgcmVzb2x2ZSBhdHRyaWJ1dGUgbmFtZWQgXCJ7MH1cIgotTUFQUElOR19JTlZBTElEX01BUFBFRF9CWT1BdHRyaWJ1dGUgbmFtZWQgXCJ7MH1cIiBoYXMgaW52YWxpZCBtYXBwaW5nIGZvciB0aGlzIHJlbGF0aW9uc2hpcAotTUFQUElOR19NQVBQRURfQllfV0lUSF9KT0lOX1RBQkxFPUNhbm5vdCBzcGVjaWZ5IGpvaW4gdGFibGUgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgbWFwcGVkIGJ5IGFub3RoZXIgYXR0cmlidXRlCi1NQVBQSU5HX01BUFBFRF9CWV9PTl9CT1RIX1NJREVTPVJlbGF0aW9uc2hpcCBtdXN0IGhhdmUgYW4gb3duZXIKLUlEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRT1VbnJlc29sdmVkIGdlbmVyYXRvciBuYW1lIFwiezB9XCIKLVRBQkxFX1VOUkVTT0xWRURfU0NIRU1BPVNjaGVtYSBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBmb3IgdGFibGUgXCJ7MX1cIgotVEFCTEVfVU5SRVNPTFZFRF9OQU1FPVRhYmxlIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1TRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE9U2NoZW1hIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkIGZvciBzZWNvbmRhcnkgdGFibGUgXCJ7MX1cIgotU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRT1TZWNvbmRhcnkgdGFibGUgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLUpPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE9U2NoZW1hIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlIFwiezF9XCIKLVZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgc2NoZW1hIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlIFwiezJ9XCIKLUpPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FPUpvaW4gdGFibGUgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLVZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIGpvaW4gdGFibGUgXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLUNPTFVNTl9VTlJFU09MVkVEX1RBQkxFPVRhYmxlIFwiezB9XCIgZm9yIGNvbHVtbiBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZAotVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfVEFCTEU9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgdGFibGUgXCJ7MX1cIiBmb3IgY29sdW1uIFwiezJ9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBvdmVycmlkZSBcInswfVwiLCB0YWJsZSBcInsxfVwiIGZvciBjb2x1bW4gXCJ7Mn1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLUNPTFVNTl9VTlJFU09MVkVEX05BTUU9Q29sdW1uIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIGNvbHVtbiBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZAotVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBvdmVycmlkZSBcInswfVwiLCBjb2x1bW4gXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLUpPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEU9VGFibGUgXCJ7MH1cIiBmb3Igam9pbiBjb2x1bW4gXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLVZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEU9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgdGFibGUgXCJ7MX1cIiBmb3Igam9pbiBjb2x1bW4gXCJ7Mn1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgCi1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEU9SW4gaW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInswfVwiLCB0YWJsZSBcInsxfVwiIGZvciBqb2luIGNvbHVtbiBcInsyfVwiIGNhbm5vdCBiZSByZXNvbHZlZCAKLUpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1Kb2luIGNvbHVtbiBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZAotVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIGpvaW4gY29sdW1uIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIFwiezB9XCIsIGpvaW4gY29sdW1uIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9UmVmZXJlbmNlZCBjb2x1bW4gXCJ7MH1cIiBpbiBqb2luIGNvbHVtbiBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCAKLVZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCByZWZlcmVuY2VkIGNvbHVtbiBcInsxfVwiIGluIGpvaW4gY29sdW1uIFwiezJ9XCIgY2Fubm90IGJlIHJlc29sdmVkIAotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9SW4gaW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInswfVwiLCByZWZlcmVuY2VkIGNvbHVtbiBcInsxfVwiIGluIGpvaW4gY29sdW1uIFwiezJ9XCIgY2Fubm90IGJlIHJlc29sdmVkIAotR0VORVJBVEVEX1ZBTFVFX1VOUkVTT0xWRURfR0VORVJBVE9SPU5vIGdlbmVyYXRvciBuYW1lZCBcInswfVwiIGlzIGRlZmluZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLVBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1QcmltYXJ5IGtleSBqb2luIGNvbHVtbiBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZAotUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPVJlZmVyZW5jZWQgQ29sdW1uIFwiezB9XCIgaW4gcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NjaGVtYS9qcGFQbGF0Zm9ybS5leHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc2NoZW1hL2pwYVBsYXRmb3JtLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTU2Y2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc2NoZW1hL2pwYVBsYXRmb3JtLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmNvcmUiIGlkPSJqcGFQbGF0Zm9ybSIgbmFtZT0iSlBBIFBsYXRmb3JtIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImpwYVBsYXRmb3JtIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImpwYVBsYXRmb3JtIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIEpQQSBwbGF0Zm9ybS4gU2VlICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtJmx0Oy9zYW1wJmd0OyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBKUEEgcGxhdGZvcm1zLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHRyYW5zbGF0YWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBsYXRmb3JtLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybSZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm0iLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJmYWxzZSI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRGVjbGFyZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtIHNob3VsZCBiZSB1c2VkIGFzIGEgZGVmYXVsdCBKUEEgcGxhdGZvcm0gZm9yIG5ldyBKUEEgcHJvamVjdCBjb250ZW50LiAgTm90ZSB0aGF0IGlmIGEgd29ya3NwYWNlIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgZGVmYXVsdCBwbGF0Zm9ybSwgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gYXQgcmFuZG9tLiAgQnkgZGVmYXVsdCwgYSBwbGF0Zm9ybSBpcyBub3QgYSBkZWZhdWx0IHBsYXRmb3JtLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9FbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGZmZmFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9FbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotCi0vKioKLSAqIFByb3ZpZGUgYSBwbHVnZ2FibGUgd2F5IHRvIGRldGVybWluZSB3aGV0aGVyIGFuZCBob3cgdGhlIGVudGl0eSBnZW5lcmF0b3IKLSAqIHByaW50cyB0aGUgbmFtZXMgb2YgdmFyaW91cyBkYXRhYmFzZSBvYmplY3RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIHsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGVudGl0eSBhbmQgdGhlIHRhYmxlIHRvIHdoaWNoIGl0IGlzIG1hcHBlZCwKLQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgZW50aXR5J3MKLQkgKiBUYWJsZSBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuIFJldHVybiBudWxsIGlmIHRoZSBlbnRpdHkKLQkgKiBtYXBzIHRvIHRoZSB0YWJsZSBieSBkZWZhdWx0LgotCSAqLwotCVN0cmluZyBidWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGVudGl0eU5hbWUsIFRhYmxlIHRhYmxlKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpIGFuZCB0aGUgY29sdW1uCi0JICogdG8gd2hpY2ggaXQgaXMgbWFwcGVkLAotCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUncwotCSAqIENvbHVtbiBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuIFJldHVybiBudWxsIGlmIHRoZSBhdHRyaWJ1dGUKLQkgKiBtYXBzIHRvIHRoZSBjb2x1bW4gYnkgZGVmYXVsdC4KLQkgKi8KLQlTdHJpbmcgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgQ29sdW1uIGNvbHVtbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KSBhbmQgdGhlCi0JICogbWFueS10by1vbmUgb3IgbWFueS10by1tYW55IGZvcmVpZ24ga2V5IHRvIHdoaWNoIGl0IGlzIG1hcHBlZCwKLQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlJ3MKLQkgKiBKb2luQ29sdW1uIGFubm90YXRpb24ncyAnbmFtZScgZWxlbWVudC4gUmV0dXJuIG51bGwgaWYgdGhlIGF0dHJpYnV0ZQotCSAqIG1hcHMgdG8gdGhlIGpvaW4gY29sdW1uIGJ5IGRlZmF1bHQuCi0JICogVGhlIHNwZWNpZmllZCBmb3JlaWduIGtleSBjb25zaXN0cyBvZiBhIHNpbmdsZSBjb2x1bW4gcGFpciB3aG9zZQotCSAqIHJlZmVyZW5jZWQgY29sdW1uIGlzIHRoZSBzaW5nbGUtY29sdW1uIHByaW1hcnkga2V5IG9mIHRoZSBmb3JlaWduCi0JICoga2V5J3MgcmVmZXJlbmNlZCB0YWJsZS4KLQkgKi8KLQlTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciBhIEpvaW5Db2x1bW4KLQkgKiBhbm5vdGF0aW9uJ3MgJ25hbWUnIG9yICdyZWZlcmVuY2VkQ29sdW1uTmFtZScgZWxlbWVudC4KLQkgKiBUaGlzIGlzIGNhbGxlZCBmb3IgbWFueS10by1vbmUgYW5kIG1hbnktdG8tbWFueSBtYXBwaW5ncyB3aGVuCi0JICogdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbmFtZSBhbmQvb3IgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBhcmUvaXMKLQkgKiBub3QgYXBwbGljYWJsZS4KLQkgKiBAc2VlIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZywgRm9yZWlnbktleSkKLQkgKi8KLQlTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoQ29sdW1uIGNvbHVtbik7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciBhIEpvaW5UYWJsZQotCSAqIGFubm90YXRpb24ncyAnbmFtZScgZWxlbWVudC4KLQkgKiBUaGlzIGlzIGNhbGxlZCBmb3IgbWFueS10by1tYW55IG1hcHBpbmdzIHdoZW4gdGhlIGRlZmF1bHQKLQkgKiBqb2luIHRhYmxlIG5hbWUgaXMgbm90IGFwcGxpY2FibGUuCi0JICovCi0JU3RyaW5nIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbk5hbWUoVGFibGUgdGFibGUpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhQW5ub3RhdGlvblByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhQW5ub3RhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOTdjYTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYUFubm90YXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhQW5ub3RhdGlvblByb3ZpZGVyCi17Ci0JLyoqCi0JICogQnVpbGQgYW4gQW5ub3RhdGlvbiB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZmVkIGFubm90YXRpb24gbmFtZS4KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBtYXBwaW5nQW5ub3RhdGlvbk5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JQW5ub3RhdGlvbiBidWlsZFR5cGVNYXBwaW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSwgU3RyaW5nIG1hcHBpbmdBbm5vdGF0aW9uTmFtZSk7Ci0KLQlBbm5vdGF0aW9uIGJ1aWxkTnVsbFR5cGVNYXBwaW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSwgU3RyaW5nIG1hcHBpbmdBbm5vdGF0aW9uTmFtZSk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbiBBbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmlmZWQgYW5ub3RhdGlvbiBuYW1lLgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lCi0JICogQHJldHVybgotCSAqLwotCUFubm90YXRpb24gYnVpbGRUeXBlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSwgU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQkKLQlBbm5vdGF0aW9uIGJ1aWxkTnVsbFR5cGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCQotCS8qKgotCSAqIE9yZGVyZWQgaXRlcmF0b3Igb2YgZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24gbmFtZXMgdGhhdCBjYW4gYXBwbHkgdG8gYSBUeXBlCi0JICovCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gdHlwZU1hcHBpbmdBbm5vdGF0aW9uTmFtZXMoKTsKLQkKLQkvKioKLQkgKiBJdGVyYXRvciBvZiBmdWxseSBxdWFsaWZpZWQgYW5ub3RhdGlvbihub24tbWFwcGluZykgbmFtZXMgdGhhdCBjYW4gYXBwbHkgdG8gYSBUeXBlCi0JICovCi0JSXRlcmF0b3I8U3RyaW5nPiB0eXBlQW5ub3RhdGlvbk5hbWVzKCk7Ci0JCi0JLyoqCi0JICogQnVpbGQgYSBBbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmlmZWQgYW5ub3RhdGlvbiBuYW1lLgotCSAqIEBwYXJhbSBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gbWFwcGluZ0Fubm90YXRpb25OYW1lCi0JICogQHJldHVybgotCSAqLwotCUFubm90YXRpb24gYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSwgU3RyaW5nIG1hcHBpbmdBbm5vdGF0aW9uTmFtZSk7Ci0JCi0JQW5ub3RhdGlvbiBidWlsZE51bGxBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSwgU3RyaW5nIG1hcHBpbmdBbm5vdGF0aW9uTmFtZSk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbiBBbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmlmZWQgYW5ub3RhdGlvbiBuYW1lLgotCSAqIEBwYXJhbSBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JQW5ub3RhdGlvbiBidWlsZEF0dHJpYnV0ZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7Ci0JCi0JQW5ub3RhdGlvbiBidWlsZE51bGxBdHRyaWJ1dGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCi0JCi0JLyoqCi0JICogT3JkZXJlZCBpdGVyYXRvciBvZiBmdWxseSBxdWFsaWZpZWQgYW5ub3RhdGlvbiBuYW1lcyB0aGF0IGNhbiBhcHBseSB0byBhbiBBdHRyaWJ1dGUKLQkgKi8KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbk5hbWVzKCk7Ci0JCi0JLyoqCi0JICogSXRlcmF0b3Igb2YgZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24obm9uLW1hcHBpbmcpIG5hbWVzIHRoYXQgY2FuIGFwcGx5IHRvIGFuIEF0dHJpYnV0ZQotCSAqLwotCUl0ZXJhdG9yPFN0cmluZz4gIGF0dHJpYnV0ZUFubm90YXRpb25OYW1lcygpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhRGF0YVNvdXJjZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYURhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyZjRjMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhRGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYURhdGFTb3VyY2UgZXh0ZW5kcyBKcGFOb2RlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YSBzb3VyY2UncyBjb25uZWN0aW9uIHByb2ZpbGUgbmFtZS4KLQkgKiBUaGUgY29ubmVjdGlvbiBwcm9maWxlIGlzIGxvb2tlZCB1cCBiYXNlZCBvbiB0aGlzIHNldHRpbmcuCi0JICovCi0JU3RyaW5nIGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgZGF0YSBzb3VyY2UncyBjb25uZWN0aW9uIHByb2ZpbGUgbmFtZS4KLQkgKiBUaGUgY29ubmVjdGlvbiBwcm9maWxlIGlzIGxvb2tlZCB1cCBiYXNlZCBvbiB0aGlzIHNldHRpbmcuCi0JICovCi0Jdm9pZCBzZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoU3RyaW5nIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSk7Ci0JCi0JLyoqCi0JICogSUQgc3RyaW5nIHVzZWQgd2hlbiBjb25uZWN0aW9uUHJvZmlsZU5hbWUgcHJvcGVydHkgaXMgY2hhbmdlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWwjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9QUk9GSUxFX05BTUVfUFJPUEVSVFkgPSAiY29ubmVjdGlvblByb2ZpbGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBkYXRhIHNvdXJjZSdzIGNvbm5lY3Rpb24gcHJvZmlsZSBzaG91bGQgbmV2ZXIgYmUgbnVsbC4KLQkgKiBJZiB3ZSBkbyBub3QgaGF2ZSBhIGNvbm5lY3Rpb24sIHJldHVybiBhICJudWxsIiBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICovCi0JQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkKLQkvKioKLQkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIGNvbm5lY3Rpb25Qcm9maWxlIHByb3BlcnR5IGlzIGNoYW5nZWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fUFJPRklMRV9QUk9QRVJUWSA9ICJjb25uZWN0aW9uUHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQkKLQlEYXRhYmFzZSBnZXREYXRhYmFzZSgpOwotCi0JSXRlcmF0b3I8U3RyaW5nPiBjYXRhbG9nTmFtZXMoKTsKLQotCUNhdGFsb2cgZ2V0Q2F0YWxvZ05hbWVkKFN0cmluZyBuYW1lKTsKLQkKLQlDYXRhbG9nIGdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCi0JSXRlcmF0b3I8U3RyaW5nPiBzY2hlbWFOYW1lcygpOwotCi0JU2NoZW1hIGdldFNjaGVtYU5hbWVkKFN0cmluZyBuYW1lKTsKLQotCVNjaGVtYSBnZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQk8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIGdldERhdGFiYXNlT2JqZWN0TmFtZWQoVFtdIGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIG5hbWUpOwotCi0Jdm9pZCBkaXNwb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDEwYzYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eTsKLQotLyoqCi0gKiBVc2UgSnBhRmFjdG9yeSB0byBidWlsZCBhbnkgY29yZSAoZS5nLiBKcGFQcm9qZWN0KSBtb2RlbCBvYmplY3Qgb3IgYW55Ci0gKiBqYXZhIChlLmcuIEphdmFFbnRpdHkpLCBvcm0gKGUuZy4gRW50aXR5TWFwcGluZ3MpLCBvciAKLSAqIHBlcnNpc3RlbmNlIChlLmcuIFBlcnNpc3RlbmNlVW5pdCkgY29udGV4dCBtb2RlbCBvYmplY3RzLgotICogCi0gKiBBc3N1bWVzIGEgYmFzZSBKUEEgcHJvamVjdCBjb250ZXh0IHN0cnVjdHVyZSAKLSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpQQSBzcGVjOgotICogCi0gKiAJUm9vdENvbnRlbnQKLSAqIAkgfC0gcGVyc2lzdGVuY2UueG1sCi0gKiAJICAgICB8LSBwZXJzaXN0ZW5jZSB1bml0KHMpCi0gKiAgICAgICAgICAgfC0gbWFwcGluZyBmaWxlKHMpICAoZS5nLiBvcm0ueG1sKQotICogICAgICAgICAgIHwgICB8LSBwZXJzaXN0ZW50IHR5cGUgbWFwcGluZyhzKSAgKGUuZy4gRW50aXR5KQotICogICAgICAgICAgIHwgICAgICAgIHwtIHBlcnNpc3RlbnQgYXR0cmlidXRlIG1hcHBpbmcocykgIChlLmcuIEJhc2ljKQotICogICAgICAgICAgIHwtIHBlcnNpc3RlbnQgdHlwZSBtYXBwaW5nKHMpCi0gKiAgIAotICogICAuLi4gYW5kIGFzc29jaWF0ZWQgb2JqZWN0cy4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkdlbmVyaWNKcGFGYWN0b3J5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYUZhY3RvcnkgCi17Ci0JLy8gKioqKioqKioqKioqKioqKiBjb3JlIG9iamVjdHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEpwYVByb2plY3QgZm9yIHRoZSBzcGVjaWZpZWQgY29uZmlnLCB0byBiZQotCSAqIGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgSlBBIHByb2plY3QuIFJldHVybiBudWxsIGlmIHVuYWJsZSB0byBjcmVhdGUKLQkgKiB0aGUgSlBBIGZpbGUgKGUuZy4gdGhlIGNvbnRlbnQgdHlwZSBpcyB1bnJlY29nbml6ZWQpLgotCSAqLwotCUpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JSnBhRGF0YVNvdXJjZSBidWlsZEpwYURhdGFTb3VyY2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBKUEEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlIGFuZCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UKLQkgKiBtb2RlbCwgdG8gYmUgYWRkZWQgdG8gdGhlIHNwZWNpZmllZCBKUEEgcHJvamVjdC4KLQkgKiBUaGlzIHNob3VsZCBiZSBub24tbnVsbCBpZmYgKGlmIGFuZCBvbmx5IGlmKSB7QGxpbmsgI2hhc1JlbGV2YW50Q29udGVudChJRmlsZSl9Ci0JICogcmV0dXJucyB0cnVlLgotCSAqLwotCUpwYUZpbGUgYnVpbGRKcGFGaWxlKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSwgUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhIHJlc291cmNlIG1vZGVsIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHRoZSBnaXZlbiBmaWxlCi0JICogKHRoaXMgbWV0aG9kIHNob3VsZCBiZSBtb3ZlZCB0byBKcGFQbGF0Zm9ybSkKLQkgKi8KLQlib29sZWFuIGhhc1JlbGV2YW50Q29udGVudChJRmlsZSBmaWxlKTsKLQkKLQkvKioKLQkgKiBCdWlsZCBhIHJlc291cmNlIG1vZGVsIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmlsZS4KLQkgKiBUaGlzIHNob3VsZCBiZSBub24tbnVsbCBpZmYgKGlmIGFuZCBvbmx5IGlmKSB7QGxpbmsgI2hhc1JlbGV2YW50Q29udGVudChJRmlsZSl9Ci0JICogcmV0dXJucyB0cnVlLiAKLQkgKi8KLQlSZXNvdXJjZU1vZGVsIGJ1aWxkUmVzb3VyY2VNb2RlbChKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUpOwotCQotCS8qKgotCSAqIEJ1aWxkIGEgKC9hbiB1cGRhdGVkKSByb290IGNvbnRleHQgbm9kZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIAotCSAqIEpQQSBwcm9qZWN0LgotCSAqIFRoZSByb290IGNvbnRleHQgbm9kZSB3aWxsIGJlIGJ1aWx0IG9uY2UsIGJ1dCB1cGRhdGVkIG1hbnkgdGltZXMuCi0JICogQHNlZSBKcGFQcm9qZWN0LnVwZGF0ZShQcm9ncmVzc01vbml0b3IpCi0JICovCi0JSnBhUm9vdENvbnRleHROb2RlIGJ1aWxkUm9vdENvbnRleHQoSnBhUHJvamVjdCBqcGFQcm9qZWN0KTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHBlcnNpc3RlbmNlIGNvbnRleHQgb2JqZWN0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JUGVyc2lzdGVuY2VYbWwgYnVpbGRQZXJzaXN0ZW5jZVhtbChKcGFSb290Q29udGV4dE5vZGUgcGFyZW50LCBQZXJzaXN0ZW5jZVJlc291cmNlIHBlcnNpc3RlbmNlUmVzb3VyY2UpOwotCQotCVBlcnNpc3RlbmNlIGJ1aWxkUGVyc2lzdGVuY2UoUGVyc2lzdGVuY2VYbWwgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSk7Ci0JCi0JUGVyc2lzdGVuY2VVbml0IGJ1aWxkUGVyc2lzdGVuY2VVbml0KFBlcnNpc3RlbmNlIHBhcmVudCwgWG1sUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCk7Ci0JCi0JLyoqCi0JICogeG1sTWFwcGluZ0ZpbGVSZWYgaXMgYWxsb3dlZCB0byBiZSBudWxsLCB0aGlzIHdvdWxkIGJlIHVzZWQgZm9yIHRoZSBpbXBsaWVkIG1hcHBpbmcgZmlsZSByZWYKLQkgKi8KLQlNYXBwaW5nRmlsZVJlZiBidWlsZE1hcHBpbmdGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmKTsKLQkKLQlDbGFzc1JlZiBidWlsZENsYXNzUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZik7Ci0JCi0JQ2xhc3NSZWYgYnVpbGRDbGFzc1JlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBTdHJpbmcgY2xhc3NOYW1lKTsKLQotCVByb3BlcnR5IGJ1aWxkUHJvcGVydHkoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sUHJvcGVydHkgcHJvcGVydHkpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogb3JtIGNvbnRleHQgb2JqZWN0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlPcm1YbWwgYnVpbGRPcm1YbWwoTWFwcGluZ0ZpbGVSZWYgcGFyZW50LCBPcm1SZXNvdXJjZSBvcm1SZXNvdXJjZSk7Ci0KLQlFbnRpdHlNYXBwaW5ncyBidWlsZEVudGl0eU1hcHBpbmdzKE9ybVhtbCBwYXJlbnQsIFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKTsKLQkKLQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBidWlsZFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVudGl0eU1hcHBpbmdzIHBhcmVudCwgWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpOwotCQotCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyk7Ci0JCi0JT3JtUGVyc2lzdGVudFR5cGUgYnVpbGRPcm1QZXJzaXN0ZW50VHlwZShFbnRpdHlNYXBwaW5ncyBwYXJlbnQsIFN0cmluZyBtYXBwaW5nS2V5KTsKLQkKLQlPcm1FbnRpdHkgYnVpbGRPcm1FbnRpdHkoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50KTsKLQkKLQlPcm1NYXBwZWRTdXBlcmNsYXNzIGJ1aWxkT3JtTWFwcGVkU3VwZXJjbGFzcyhPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQpOwotCQotCU9ybUVtYmVkZGFibGUgYnVpbGRPcm1FbWJlZGRhYmxlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCk7Ci0JCi0JT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBTdHJpbmcgbWFwcGluZ0tleSk7Ci0JCi0JT3JtVGFibGUgYnVpbGRPcm1UYWJsZShPcm1FbnRpdHkgcGFyZW50KTsKLQkKLQlPcm1TZWNvbmRhcnlUYWJsZSBidWlsZE9ybVNlY29uZGFyeVRhYmxlKE9ybUVudGl0eSBwYXJlbnQsIFhtbFNlY29uZGFyeVRhYmxlIHhtbFNlY29uZGFyeVRhYmxlKTsKLQkKLQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZE9ybVByaW1hcnlLZXlKb2luQ29sdW1uKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3JtQmFzZUpvaW5Db2x1bW4uT3duZXIgb3duZXIpOwotCQotCU9ybUpvaW5UYWJsZSBidWlsZE9ybUpvaW5UYWJsZShPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIHBhcmVudCk7Ci0JCi0JT3JtSm9pbkNvbHVtbiBidWlsZE9ybUpvaW5Db2x1bW4oT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPcm1Kb2luQ29sdW1uLk93bmVyIG93bmVyKTsKLQkKLQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBidWlsZE9ybUF0dHJpYnV0ZU92ZXJyaWRlKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgb3duZXIsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlIHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkKLQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGJ1aWxkT3JtQXNzb2NpYXRpb25PdmVycmlkZShPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgb3duZXIsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0KLQlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkT3JtRGlzY3JpbWluYXRvckNvbHVtbihPcm1FbnRpdHkgcGFyZW50LCBPcm1OYW1lZENvbHVtbi5Pd25lciBvd25lcik7Ci0JCi0JT3JtQ29sdW1uIGJ1aWxkT3JtQ29sdW1uKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3JtQ29sdW1uLk93bmVyIG93bmVyKTsKLQkKLQlPcm1HZW5lcmF0ZWRWYWx1ZSBidWlsZE9ybUdlbmVyYXRlZFZhbHVlKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCk7Ci0JCi0JT3JtU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRPcm1TZXF1ZW5jZUdlbmVyYXRvcihPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQpOwotCQotCU9ybVRhYmxlR2VuZXJhdG9yIGJ1aWxkT3JtVGFibGVHZW5lcmF0b3IoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50KTsKLQkKLQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IGJ1aWxkT3JtTmFtZWROYXRpdmVRdWVyeShPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQpOwotCi0JT3JtTmFtZWRRdWVyeSBidWlsZE9ybU5hbWVkUXVlcnkoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50KTsKLQkKLQlPcm1RdWVyeUhpbnQgYnVpbGRPcm1RdWVyeUhpbnQoT3JtUXVlcnkgcGFyZW50KTsKLQotCU9ybUJhc2ljTWFwcGluZyBidWlsZE9ybUJhc2ljTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JT3JtTWFueVRvTWFueU1hcHBpbmcgYnVpbGRPcm1NYW55VG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JT3JtT25lVG9NYW55TWFwcGluZyBidWlsZE9ybU9uZVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCU9ybU1hbnlUb09uZU1hcHBpbmcgYnVpbGRPcm1NYW55VG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlPcm1PbmVUb09uZU1hcHBpbmcgYnVpbGRPcm1PbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCU9ybUVtYmVkZGVkSWRNYXBwaW5nIGJ1aWxkT3JtRW1iZWRkZWRJZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCU9ybUVtYmVkZGVkTWFwcGluZyBidWlsZE9ybUVtYmVkZGVkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JT3JtSWRNYXBwaW5nIGJ1aWxkT3JtSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlPcm1UcmFuc2llbnRNYXBwaW5nIGJ1aWxkT3JtVHJhbnNpZW50TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JT3JtVmVyc2lvbk1hcHBpbmcgYnVpbGRPcm1WZXJzaW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZE9ybU51bGxBdHRyaWJ1dGVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlPcm1VbmlxdWVDb25zdHJhaW50IGJ1aWxkT3JtVW5pcXVlQ29uc3RyYWludChPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQsIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIgb3duZXIsIFhtbFVuaXF1ZUNvbnN0cmFpbnQgeG1sVW5pcXVlQ29uc3RyYWludCk7Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBqYXZhIGNvbnRleHQgb2JqZWN0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUphdmFQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFQZXJzaXN0ZW50VHlwZShKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQotCUphdmFFbnRpdHkgYnVpbGRKYXZhRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpOwotCQotCUphdmFNYXBwZWRTdXBlcmNsYXNzIGJ1aWxkSmF2YU1hcHBlZFN1cGVyY2xhc3MoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCk7Ci0JCi0JSmF2YUVtYmVkZGFibGUgYnVpbGRKYXZhRW1iZWRkYWJsZShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KTsKLQkKLQlKYXZhVHlwZU1hcHBpbmcgYnVpbGRKYXZhTnVsbFR5cGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpOwotCQotCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCk7Ci0KLQlKYXZhQmFzaWNNYXBwaW5nIGJ1aWxkSmF2YUJhc2ljTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCUphdmFFbWJlZGRlZElkTWFwcGluZyBidWlsZEphdmFFbWJlZGRlZElkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCUphdmFFbWJlZGRlZE1hcHBpbmcgYnVpbGRKYXZhRW1iZWRkZWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JSmF2YUlkTWFwcGluZyBidWlsZEphdmFJZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlKYXZhTWFueVRvTWFueU1hcHBpbmcgYnVpbGRKYXZhTWFueVRvTWFueU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlKYXZhTWFueVRvT25lTWFwcGluZyBidWlsZEphdmFNYW55VG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JSmF2YU9uZVRvTWFueU1hcHBpbmcgYnVpbGRKYXZhT25lVG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCUphdmFPbmVUb09uZU1hcHBpbmcgYnVpbGRKYXZhT25lVG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0KLQlKYXZhVHJhbnNpZW50TWFwcGluZyBidWlsZEphdmFUcmFuc2llbnRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JSmF2YVZlcnNpb25NYXBwaW5nIGJ1aWxkSmF2YVZlcnNpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlKYXZhVGFibGUgYnVpbGRKYXZhVGFibGUoSmF2YUVudGl0eSBwYXJlbnQpOwotCQotCUphdmFKb2luVGFibGUgYnVpbGRKYXZhSm9pblRhYmxlKEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nIHBhcmVudCk7Ci0JCi0JSmF2YUNvbHVtbiBidWlsZEphdmFDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUNvbHVtbi5Pd25lciBvd25lcik7Ci0KLQlKYXZhRGlzY3JpbWluYXRvckNvbHVtbiBidWlsZEphdmFEaXNjcmltaW5hdG9yQ29sdW1uKEphdmFFbnRpdHkgcGFyZW50LCBKYXZhTmFtZWRDb2x1bW4uT3duZXIgb3duZXIpOwotCQotCUphdmFKb2luQ29sdW1uIGJ1aWxkSmF2YUpvaW5Db2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUpvaW5Db2x1bW4uT3duZXIgb3duZXIpOwotCi0JSmF2YVNlY29uZGFyeVRhYmxlIGJ1aWxkSmF2YVNlY29uZGFyeVRhYmxlKEphdmFFbnRpdHkgcGFyZW50KTsKLQkKLQlKYXZhU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRKYXZhU2VxdWVuY2VHZW5lcmF0b3IoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCk7Ci0JCi0JSmF2YVRhYmxlR2VuZXJhdG9yIGJ1aWxkSmF2YVRhYmxlR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpOwotCQotCUphdmFHZW5lcmF0ZWRWYWx1ZSBidWlsZEphdmFHZW5lcmF0ZWRWYWx1ZShKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpOwotCQotCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhQmFzZUpvaW5Db2x1bW4uT3duZXIgb3duZXIpOwotCQotCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBidWlsZEphdmFBdHRyaWJ1dGVPdmVycmlkZShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBBdHRyaWJ1dGVPdmVycmlkZS5Pd25lciBvd25lcik7Ci0JCi0JSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIG93bmVyKTsKLQotCUphdmFOYW1lZFF1ZXJ5IGJ1aWxkSmF2YU5hbWVkUXVlcnkoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCk7Ci0JCi0JSmF2YU5hbWVkTmF0aXZlUXVlcnkgYnVpbGRKYXZhTmFtZWROYXRpdmVRdWVyeShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KTsKLQkKLQlKYXZhUXVlcnlIaW50IGJ1aWxkSmF2YVF1ZXJ5SGludChKYXZhUXVlcnkgcGFyZW50KTsKLQkKLQlKYXZhVW5pcXVlQ29uc3RyYWludCBidWlsZEphdmFVbmlxdWVDb25zdHJhaW50KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIgb3duZXIpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYUZpbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTQ3M2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci0KLS8qKgotICogQSBKcGFQcm9qZWN0IGNvbnRhaW5zIEpwYSBmaWxlcyBmb3IgYWxsIElGaWxlcyBpbiB0aGUgcHJvamVjdCB0aGF0Ci0gKiBhcmUgcmVsZXZhbnQgdG8gdGhlIEpwYVBsYXRmb3JtLgotICogQHNlZSBKcGFGYWN0b3J5I2hhc1JlbGV2YW50Q29udGVudChJRmlsZSksIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBtb3ZlZCB0byBKcGFQbGF0Zm9ybQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFGaWxlIGV4dGVuZHMgSnBhTm9kZQotewotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBvZiByZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGlzIEpQQSBmaWxlCi0JICogQHNlZSBSZXNvdXJjZU1vZGVsI2dldFJlc291cmNlVHlwZSgpCi0JICovCi0JU3RyaW5nIGdldFJlc291cmNlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBKUEEgZmlsZQotCSAqLwotCUlGaWxlIGdldEZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbW9kZWwgcmVwcmVzZW50ZWQgYnkgdGhpcyBKUEEgZmlsZQotCSAqLwotCVJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbCgpOwotCQotCS8qKgotCSAqIEZvcndhcmQgdGhlIEphdmEgZWxlbWVudCBjaGFuZ2VkIGV2ZW50IHRvIHRoZSBKUEEgZmlsZSdzIGNvbnRlbnQuCi0JICovCi0Jdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIEpQQSByZXNvdXJjZSBtb2RlbCBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLgotCSAqLwotCXZvaWQgdXBkYXRlRnJvbVJlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBUaGUgSlBBIGZpbGUgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBKUEEgcHJvamVjdC4gQ2xlYW4gdXAgYW55Ci0JICogaG9va3MgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzIGV0Yy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLQkKLQotCS8vICoqKioqKioqKioqKioqKiogcm9vdCBzdHJ1Y3R1cmUgbm9kZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcm9vdCBzdHJ1Y3R1cmUgbm9kZXMgY29sbGVjdGlvbgotCSAqLwotCVN0cmluZyBST09UX1NUUlVDVFVSRV9OT0RFU19DT0xMRUNUSU9OID0gInJvb3RTdHJ1Y3R1cmVOb2RlcyI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb290IGNvbnRleHQgbW9kZWwgb2JqZWN0cyByZXByZXNlbnRlZCBieSB0aGlzIEpQQSBmaWxlLgotCSAqLwotCUl0ZXJhdG9yPEpwYVN0cnVjdHVyZU5vZGU+IHJvb3RTdHJ1Y3R1cmVOb2RlcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHJvb3QgY29udGV4dCBtb2RlbCBvYmplY3RzIHJlcHJlc2VudGVkIGJ5IHRoaXMgSlBBIGZpbGUuCi0JICovCi0JaW50IHJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKTsKLQotCS8qKgotCSAqIEFkZCBhIHJvb3QgY29udGV4dCBtb2RlbCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBKUEEgZmlsZS4KLQkgKiBUaGVyZSBpcyB0aGUgcG90ZW50aWFsIGZvciBtdWx0aXBsZSByb290IHN0cnVjdHVyZSBub2RlcyAKLQkgKiBmb3IgYSBwYXJ0aWN1bGFyIGtleS4gIEZvciBleGFtcGxlIGEgamF2YSBmaWxlIHRoYXQgaXMgbGlzdGVkCi0JICogYm90aCBhcyBhIDxjbGFzcz4gaW4gdGhlIHBlcnNpc3RlbmNlLnhtbCBhbmQgYXMgYW4gPGVudGl0eT4gaW4KLQkgKiBhbiBvcm0ueG1sIGZpbGUuICBJbiB0aGlzIGNhc2UgdGhlIG9ybS54bWwgZmlsZSBuZWVkcyB0byBzZXQKLQkgKiB0aGUgcm9vdCBzdHJ1Y3R1cmUgbm9kZSBhZnRlciB0aGUgamF2YSBjbGFzcyByZWZlcmVuY2UuCi0JICogTGFzdCBvbmUgaW4gZHVyaW5nIHByb2plY3QgdXBkYXRlIHdpbnMuCi0JICogCi0JICogQ2FsbCByZW1vdmVSb290U3RydWN0dXJlTm9kZShPYmplY3QpIHRvIGNsZWFuIHVwIHdoZW4gYSBmaWxlIGlzCi0JICogZGVsZXRlZC4KLQkgKi8KLQl2b2lkIGFkZFJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXksIEpwYVN0cnVjdHVyZU5vZGUgcm9vdFN0cnVjdHVyZU5vZGUpOwkKLQkKLQl2b2lkIHJlbW92ZVJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXkpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJ1Y3R1cmUgbm9kZSBiZXN0IHJlcHJlc2VudGVkIGJ5IHRoZSBsb2NhdGlvbiBpbiB0aGUgZmlsZS4KLQkgKi8KLQlKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDIxMzRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBUaGUgSlBBIG1vZGVsIGhvbGRzIGFsbCB0aGUgSlBBIHByb2plY3RzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFNb2RlbCBleHRlbmRzIE1vZGVsIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKiBSZXR1cm4gbnVsbCBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0Ci0JICogd2l0aCBhIEpQQSBwcm9qZWN0LgotCSAqLwotCUpwYVByb2plY3QgZ2V0SnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBKUEEgbW9kZWwgY29udGFpbnMgYSBKUEEgcHJvamVjdCBjb3JyZXNwb25kaW5nCi0JICogdG8gdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCi0JICovCi0JYm9vbGVhbiBjb250YWluc0pwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBtb2RlbCdzIEpQQSBwcm9qZWN0cy4gVGhpcyBoYXMgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLAotCSAqIGl0IHdpbGwgYnVpbGQgYWxsIHRoZSBKUEEgcHJvamVjdHMuCi0JICovCi0JSXRlcmF0b3I8SnBhUHJvamVjdD4ganBhUHJvamVjdHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX1BST0pFQ1RTX0NPTExFQ1RJT04gPSAianBhUHJvamVjdHMiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBKUEEgbW9kZWwncyBsaXN0IG9mIEpQQSBwcm9qZWN0cy4KLQkgKi8KLQlpbnQganBhUHJvamVjdHNTaXplKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBmaWxlLAotCSAqIG9yIG51bGwgaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIGZpbGUgd2l0aCBhIEpQQSBmaWxlLgotCSAqLwotCUpwYUZpbGUgZ2V0SnBhRmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYU5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZTM3MjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogSlBBLXNwZWNpZmljIHByb3RvY29sLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFOb2RlIGV4dGVuZHMgTW9kZWwsIElBZGFwdGFibGUKLXsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QgdGhlIG5vZGUgYmVsb25ncyB0by4KLQkgKi8KLQlKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgdGhhdCBtb3N0IGRpcmVjdGx5IGNvbnRhaW5zIHRoZSBub2RlLgotCSAqIFRoaXMgaXMgdXNlZCBieSBKcGFIZWxwZXIuCi0JICovCi0JSVJlc291cmNlIGdldFJlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBub2RlJ3MgcGFyZW50LiBUaGUgSlBBIHByb2plY3Qgd2lsbCBub3QgaGF2ZSBhIHBhcmVudC4KLQkgKi8KLQlKcGFOb2RlIGdldFBhcmVudCgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUGxhdGZvcm0uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFQbGF0Zm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDc1ZGIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFQbGF0Zm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlRmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBKUEEgdmVuZG9yIHRvIHByb3ZpZGUgZXh0ZW5zaW9ucyB0byAKLSAqIHRoZSBjb3JlIEpQQSBtb2RlbC4gIFRoZSBjb3JlIEpQQSBtb2RlbCB3aWxsIHByb3ZpZGUgZnVuY3Rpb25hbGl0eSBmb3IgSlBBCi0gKiBzcGVjIGFubm90YXRpb25zIGluIGphdmEsIHBlcnNpc3RlbmNlLnhtbCBhbmQgKG9ybS54bWwpIG1hcHBpbmcgZmlsZXMuCi0gKiBUaGUgb3JnLmVjbGlwc2UuanB0LmNvcmUuZ2VuZXJpY1BsYXRmb3JtIGV4dGVuc2lvbiBzdXBwbGllcyAKLSAqIHJlc291cmNlIG1vZGVscyBmb3IgdGhvc2UgZmlsZSB0eXBlcy4gIEFzIGFub3RoZXIgdmVuZG9yIG9wdGlvbiB5b3UgCi0gKiB3aWxsIGhhdmUgdG8gc3VwcGx5IHRob3NlIHJlc291cmNlIG1vZGVscyBhcyB3ZWxsIG9yIGRpZmZlcmVudCBvbmVzIAotICogYXMgbmVjZXNzYXJ5LgotICogCi0gKiBTZWUgdGhlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVBsYXRmb3JtIGV4dGVuc2lvbiBwb2ludAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFQbGF0Zm9ybQotewotCS8qKgotCSAqIEdldCB0aGUgSUQgZm9yIHRoaXMgcGxhdGZvcm0KLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgSUQgZm9yIHRoaXMgcGxhdGZvcm0uICBUaGlzIGlzIGFuIGV4dGVuc2lvbgotCSAqIHNvIHlvdSBjYW4ndCB1c2UgYSBub24tZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiAqKioqKioqKioqKioqCi0JICogKiBJTVBPUlRBTlQgKiAgRm9yIElOVEVSTkFMIHVzZSBvbmx5ISEKLQkgKiAqKioqKioqKioqKioqCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdGhlSWQpOwotCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBNb2RlbCBjb25zdHJ1Y3Rpb24vdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBKUEEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLCB0byBiZSBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIAotCSAqIEpQQSBwcm9qZWN0LiAoRGVmZXIgdG8gdGhlIGZhY3RvcnkgZm9yIGFjdHVhbCBvYmplY3QgY3JlYXRpb24uKSAgCi0JICogUmV0dXJuIG51bGwgaWYgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgSlBBIGZpbGUgKGUuZy4gdGhlIGNvbnRlbnQgdHlwZSBpcyAKLQkgKiB1bnJlY29nbml6ZWQpLgotCSAqLwotCUpwYUZpbGUgYnVpbGRKcGFGaWxlKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgY29yZSAoZS5nLiBKcGFQcm9qZWN0KSwgcmVzb3VyY2UKLQkgKiAoZS5nLiBQZXJzaXN0ZW5jZVJlc291cmNlKSwgYW5kIGNvbnRleHQgKGUuZy4gUGVyc2lzdGVuY2VVbml0KSBtb2RlbAotCSAqIG9iamVjdHMKLQkgKi8KLQlKcGFGYWN0b3J5IGdldEpwYUZhY3RvcnkoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIEphdmEgYW5ub3RhdGlvbiBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGFubm90YXRpb24gcHJvdmlkZXIgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHdoYXQgYW5ub3RhdGlvbnMKLQkgKiBhcmUgc3VwcG9ydGVkIGFuZCBjb25zdHJ1Y3RpbmcgamF2YSByZXNvdXJjZSBtb2RlbCBvYmplY3RzCi0JICovCi0JSnBhQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSmF2YSB0eXBlIG1hcHBpbmcgcHJvdmlkZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQnVpbGQgYSBKYXZhIHR5cGUgbWFwcGluZyB3aXRoIHRoZSBnaXZlbiBtYXBwaW5nIGtleSBhbmQgcGFyZW50LiAgVGhyb3dzIGEgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogaWYgdGhlIHR5cGVNYXBwaW5nS2V5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KLQkgKiBPdmVycmlkZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uR2VuZXJpY0pwYVBsYXRmb3JtI2FkZEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyc1RvKExpc3Q8SmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI+KX0KLQkgKiB0byBhZGQgbmV3IHN1cHBvcnRlZCB0eXBlIG1hcHBpbmdzIHRvIHRoZSBwbGF0Zm9ybQotCSAqLwotCUphdmFUeXBlTWFwcGluZyBidWlsZEphdmFUeXBlTWFwcGluZ0Zyb21NYXBwaW5nS2V5KFN0cmluZyB0eXBlTWFwcGluZ0tleSwgSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCk7Ci0JCi0JLyoqCi0JICogQnVpbGQgYSBKYXZhIHR5cGUgbWFwcGluZyB3aXRoIHRoZSBnaXZlbiBtYXBwaW5nIGFubm90YXRpb24gYW5kIHBhcmVudC4gIFRocm93cyBhIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIGlmIHRoZSBtYXBwaW5nIGFubm90YXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtLgotCSAqIE92ZXJyaWRlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5HZW5lcmljSnBhUGxhdGZvcm0jYWRkSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzVG8oTGlzdDxKYXZhVHlwZU1hcHBpbmdQcm92aWRlcj4pfQotCSAqIHRvIGFkZCBuZXcgc3VwcG9ydGVkIHR5cGUgbWFwcGluZ3MgdG8gdGhlIHBsYXRmb3JtCi0JICovCi0JSmF2YVR5cGVNYXBwaW5nIGJ1aWxkSmF2YVR5cGVNYXBwaW5nRnJvbUFubm90YXRpb24oU3RyaW5nIG1hcHBpbmdBbm5vdGF0aW9uTmFtZSwgSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCk7Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZyBwcm92aWRlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGEgSmF2YSBhdHRyaWJ1dGUgbWFwcGluZyB3aXRoIHRoZSBnaXZlbiBtYXBwaW5nIGtleSBhbmQgcGFyZW50LiAgVGhyb3dzIGEgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogaWYgdGhlIGF0dHJpYnV0ZU1hcHBpbmdLZXkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtLgotCSAqIE92ZXJyaWRlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5HZW5lcmljSnBhUGxhdGZvcm0jYWRkSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnNUbyhMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+KX0KLQkgKiB0byBhZGQgbmV3IHN1cHBvcnRlZCBhdHRyaWJ1dGUgbWFwcGluZ3MgdG8gdGhlIHBsYXRmb3JtCi0JICovCi0JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhQXR0cmlidXRlTWFwcGluZ0Zyb21NYXBwaW5nS2V5KFN0cmluZyBhdHRyaWJ1dGVNYXBwaW5nS2V5LCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCS8qKgotCSAqIEJ1aWxkIGEgSmF2YSBhdHRyaWJ1dGUgbWFwcGluZyB3aXRoIHRoZSBnaXZlbiBtYXBwaW5nIGFubm90YXRpb24gYW5kIHBhcmVudC4gIFRocm93cyBhIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIGlmIHRoZSBtYXBwaW5nIGFubm90YXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtLgotCSAqIE92ZXJyaWRlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5HZW5lcmljSnBhUGxhdGZvcm0jYWRkSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnNUbyhMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+KX0KLQkgKiB0byBhZGQgbmV3IHN1cHBvcnRlZCBhdHRyaWJ1dGUgbWFwcGluZ3MgdG8gdGhlIHBsYXRmb3JtCi0JICovCi0JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhQXR0cmlidXRlTWFwcGluZ0Zyb21Bbm5vdGF0aW9uKFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JLyoqCi0JICogQnVpbGQgYSBkZWZhdWx0IEphdmEgYXR0cmlidXRlIG1hcHBpbmcgd2l0aCB0aGUgZ2l2ZW4gbWFwcGluZyBhbm5vdGF0aW9uIGFuZCBwYXJlbnQuICBUaHJvd3MgYSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBpZiB0aGUgbWFwcGluZyBhbm5vdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KLQkgKiBPdmVycmlkZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uR2VuZXJpY0pwYVBsYXRmb3JtI2FkZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyc1RvKExpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+KX0KLQkgKiB0byBhZGQgbmV3IHN1cHBvcnRlZCBhdHRyaWJ1dGUgbWFwcGluZ3MgdG8gdGhlIHBsYXRmb3JtCi0JICovCi0JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBtYXBwaW5nIGtleSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZWZhdWx0IGF0cmlidXRlIG1hcHBpbmcKLQkgKiB0aGF0IGFwcGxpZXMgdG8gdGhlIEphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGUuICBUaGlzIHdpbGwgYmUgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZSdzCi0JICogdHlwZS4gIFNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyI2RlZmF1bHRBcHBsaWVzKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKX0KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nS2V5KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCi0KLQkvLyAqKioqKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQWRkcyB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRvIHRoZSBncm93aW5nIGxpc3Qgb2YgbWVzc2FnZXMgZm9yIGEgZ2l2ZW4gcHJvamVjdAotCSAqLwotCXZvaWQgYWRkVG9NZXNzYWdlcyhKcGFQcm9qZWN0IHByb2plY3QsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKTsKLQkKLQotCS8vICoqKioqKioqKioqKiogRGF0YWJhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGEgY29ubmVjdGlvbiByZXBvc2l0b3J5IHRoYXQgY2FuIGJlIHVzZWQgdG8gcXVlcnkgdGhlIGRhdGFiYXNlCi0JICogYWJvdXQgZGF0YWJhc2UgbWV0YWRhdGEuCi0JICovCi0JQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGVudGl0eSBnZW5lcmF0b3IgZGF0YWJhc2UgYW5ub3RhdGlvbiBuYW1lIGJ1aWxkZXIsIHdoaWNoIGlzCi0JICogdXNlZCBieSBFbnRpdHkgR2VuZXJhdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBhbmQgaG93IHRoZSBlbnRpdHkgZ2VuZXJhdG9yCi0JICogcHJpbnRzIHRoZSBuYW1lcyBvZiB2YXJpb3VzIGRhdGFiYXNlIG9iamVjdHMuCi0JICovCi0JRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgZ2V0RW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGZpbmRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvb2sgdXAgdmFyaW91cyBvYmplY3RzIChzY2hlbWF0YSwKLQkgKiB0YWJsZXMsIGNvbHVtbnMsIGV0Yy4pIG9uIHRoZSBkYXRhYmFzZSwgcmVzcGVjdGluZyB0aGUgcGxhdGZvcm0ncyBhbmQKLQkgKiBkYXRhYmFzZSdzIGNhc2Utc2Vuc2l0aXZpdHkuCi0JICovCi0JRGF0YWJhc2VGaW5kZXIgZ2V0RGF0YWJhc2VGaW5kZXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYVByb2plY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDZiOTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVByb2plY3QgZXh0ZW5kcyBKcGFOb2RlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QncyBuYW1lLCB3aGljaCBpcyB0aGUgRWNsaXBzZSBwcm9qZWN0J3MgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBFY2xpcHNlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBKUEEgcHJvamVjdC4KLQkgKi8KLQlJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIEpQQSBwcm9qZWN0LgotCSAqLwotCUlKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2ZW5kb3Itc3BlY2lmaWMgSlBBIHBsYXRmb3JtIHRoYXQgYnVpbGRzIHRoZSBKUEEgcHJvamVjdAotCSAqIGFuZCBpdHMgY29udGVudHMuCi0JICovCi0JSnBhUGxhdGZvcm0gZ2V0SnBhUGxhdGZvcm0oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvamVjdCdzIGNvbm5lY3Rpb24KLQkgKi8KLQlDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmltYXJ5IHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0LCB3aGljaCB1bmxlc3Mgb3ZlcnJpZGRlbiwgCi0JICogaXMgdGhlIGRlZmF1bHQgc2NoZW1hIGZyb20gdGhlIGNvbm5lY3Rpb24KLQkgKiBAc2VlIEpwYVByb2plY3QjZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpCi0JICogQHJldHVybiBUaGUgZGVmYXVsdCBzY2hlbWEuICBNYXkgYmUgbnVsbCBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgY29ubmVjdGVkLgotCSAqLwotCVNjaGVtYSBnZXREZWZhdWx0U2NoZW1hKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB1c2VyIHNwZWNpZmllZCBzY2hlbWEgdG8gYmUgdXNlZCBhcyBhIGRlZmF1bHQgZm9yIHRoaXMgcHJvamVjdC4KLQkgKiBAc2VlIEpwYVByb2plY3QjZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUoKQotCSAqIEByZXR1cm4gIFRoZSB1c2VyIHNwZWNpZmllZCBkZWZhdWx0IHNjaGVtYS4gTWF5IGJlIG51bGwgaWYgdGhlIGNvbm5lY3Rpb24KLQkgKiAgIGlzIG5vdCBjb25uZWN0ZWQgb3IgaWYgdGhlIHVzZXIgaGFzIG5vdCBvdmVycmlkZGVuIHRoZSBzY2hlbWEgKGltcGxpZXMgCi0JICogICB0aGUgZGVmYXVsdCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgc2hvdWxkIGJlIHVzZWQpLgotCSAqLwotCVNjaGVtYSBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhIHNvdXJjZSB0aGUgSlBBIHByb2plY3QgaXMgbWFwcGVkIHRvLgotCSAqLwotCUpwYURhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZSgpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdXNlciBvdmVycmlkZSBkZWZhdWx0IHNjaGVtYSBuYW1lICoqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKiogCi0JICogSUQgc3RyaW5nIHVzZWQgd2hlbiB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSBwcm9wZXJ0eSBpcyBjaGFuZ2VkLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWwjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JU3RyaW5nIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUFfTkFNRV9QUk9QRVJUWSA9ICJ1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNjaGVtYSB0byBiZSB1c2VkIGFzIGEgZGVmYXVsdCBmb3IgdGhlIHByb2plY3QKLQkgKiBpbnN0ZWFkIG9mIHRoZSBvbmUgdGhhdCBpcyBkZWZhdWx0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICogQHJldHVybiBUaGUgc2NoZW1hIG5hbWUuIE1heSBiZSBudWxsIChpbXBsaWVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZQotCSAqICAgZGVmYXVsdCBzY2hlbWEgc2hvdWxkIGJlIHVzZWQpLgotCSAqLwotCVN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgc2NoZW1hIHRvIGJlIHVzZWQgYXMgYSBkZWZhdWx0IGZvciB0aGUgcHJvamVjdAotCSAqIGluc3RlYWQgb2YgdGhlIG9uZSB0aGF0IGlzIGRlZmF1bHRseSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKiBAcGFyYW1ldGVyIGRlZmF1bHRTY2hlbWFOYW1lIC0gVGhlIGRlZmF1bHQgc2NoZW1hIG5hbWUgdG8gdXNlIGluc3RlYWQgb2YKLQkgKiAgIHRoZSBkZWZhdWx0IHNjaGVtYSBvZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlLiBNYXkgYmUgbnVsbCAoaW1wbGllcyB0aGF0Ci0JICogICB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGRlZmF1bHQgc2NoZW1hIHNob3VsZCBiZSB1c2VkKS4KLQkgKi8KLQl2b2lkIHNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKFN0cmluZyBkZWZhdWx0U2NoZW1hTmFtZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBkaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKiAKLQkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIGRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMgcHJvcGVydHkgaXMgY2hhbmdlZC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCVN0cmluZyBESVNDT1ZFUlNfQU5OT1RBVEVEX0NMQVNTRVNfUFJPUEVSVFkgPSAiZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgSlBBIHByb2plY3Qgd2lsbCAiZGlzY292ZXIiIGFubm90YXRlZCBjbGFzc2VzCi0JICogYXV0b21hdGljYWxseSwgYXMgb3Bwb3NlZCB0byByZXF1aXJpbmcgdGhlIGNsYXNzZXMgdG8gYmUKLQkgKiBsaXN0ZWQgaW4gcGVyc2lzdGVuY2UueG1sLgotCSAqLwotCWJvb2xlYW4gZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcygpOwotCQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHRoZSBKUEEgcHJvamVjdCB3aWxsICJkaXNjb3ZlciIgYW5ub3RhdGVkIGNsYXNzZXMKLQkgKiBhdXRvbWF0aWNhbGx5LCBhcyBvcHBvc2VkIHRvIHJlcXVpcmluZyB0aGUgY2xhc3NlcyB0byBiZQotCSAqIGxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwuCi0JICovCi0Jdm9pZCBzZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGJvb2xlYW4gZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBqcGEgZmlsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKiAKLQkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIGpwYUZpbGVzIGNvbGxlY3Rpb24gaXMgY2hhbmdlZC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsI2FkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlTdHJpbmcgSlBBX0ZJTEVTX0NPTExFQ1RJT04gPSAianBhRmlsZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0J3MgSlBBIGZpbGVzLgotCSAqLwotCUl0ZXJhdG9yPEpwYUZpbGU+IGpwYUZpbGVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBKUEEgcHJvamVjdCdzIEpQQSBmaWxlcy4KLQkgKi8KLQlpbnQganBhRmlsZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFJldHVybiBudWxsIGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIGdpdmVuIGZpbGUKLQkgKiB3aXRoIGEgSlBBIGZpbGUuCi0JICovCi0JSnBhRmlsZSBnZXRKcGFGaWxlKElGaWxlIGZpbGUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIEpQQSBmaWxlcyBmb3IgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUgSUQuCi0JICogVGhlIGNvbnRlbnQgdHlwZSBJRCBzaG91bGQgbWF0Y2ggdGhhdCBnaXZlbiBpbiB0aGUKLQkgKiBKUEEgZmlsZSBjb250ZW50IHByb3ZpZGVyLgotCSAqLwotCUl0ZXJhdG9yPEpwYUZpbGU+IGpwYUZpbGVzKFN0cmluZyBjb250ZW50VHlwZUlkKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhcmlvdXMgcXVlcmllcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIHJvb3QgImRlcGxveSBwYXRoIi4KLQkgKiBKUEEgcHJvamVjdHMgYXNzb2NpYXRlZCB3aXRoIFdlYiBwcm9qZWN0cyByZXR1cm4gIldFQi1JTkYvY2xhc3NlcyI7Ci0JICogYWxsIG90aGVycyBzaW1wbHkgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKi8KLQlTdHJpbmcgZ2V0Um9vdERlcGxveUxvY2F0aW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgSnBhUm9vdENvbnRleHROb2RlfSByZXByZXNlbnRpbmcgdGhlIEpQQSBjb250ZW50IG9mIHRoaXMgcHJvamVjdAotCSAqLwotCUpwYVJvb3RDb250ZXh0Tm9kZSBnZXRSb290Q29udGV4dCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIEpQQSBwcm9qZWN0J3MgYW5ub3RhdGVkIGNsYXNzZXMuCi0JICovCi0JSXRlcmF0b3I8U3RyaW5nPiBhbm5vdGF0ZWRDbGFzc05hbWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHBlcnNpc3RlbnQgdHlwZSByZXNvdXJjZSBmb3IgdGhlIHNwZWNpZmllZCBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lOwotCSAqIG51bGwsIGlmIG5vbmUgZXhpc3RzLgotCSAqLwotCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFN0cmluZyB0eXBlTmFtZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBqcGEgbW9kZWwgc3luY2hyb25pemF0aW9uIGFuZCBsaWZlY3ljbGUgKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBKUEEgcHJvamVjdCdzIEpQQSBmaWxlcyB3aXRoIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UKLQkgKiBkZWx0YSwgd2F0Y2hpbmcgZm9yIGFkZGVkIGFuZCByZW1vdmVkIGZpbGVzLgotCSAqLwotCXZvaWQgc3luY2hyb25pemVKcGFGaWxlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGb3J3YXJkIHRoZSBKYXZhIGVsZW1lbnQgY2hhbmdlIGV2ZW50IHRvIHRoZSBKUEEgcHJvamVjdCdzIEpQQSBmaWxlcy4KLQkgKi8KLQl2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSBKUEEgcHJvamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIEpQQSBtb2RlbC4gQ2xlYW4gdXAgYW55Ci0JICogaG9va3MgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzIGV0Yy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHByb2plY3QncyB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotCSAqLwotCUl0ZXJhdG9yPElNZXNzYWdlPiB2YWxpZGF0aW9uTWVzc2FnZXMoKTsKLQotCS8qKgotCSAqIEFkZCB0byB0aGUgbGlzdCBvZiBjdXJyZW50IHZhbGlkYXRpb24gbWVzc2FnZXMKLQkgKi8KLQl2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpOwotCi0KLQkvLyAqKioqKioqKioqKioqKioqIHN1cHBvcnQgZm9yIG1vZGlmeWluZyBzaGFyZWQgZG9jdW1lbnRzICoqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgYSB0aHJlYWQtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvbW1hbmRFeGVjdXRvcgotCSAqIGludGVyZmFjZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBleGVjdXRlIGEgY29tbWFuZCB0byBtb2RpZnkgYSBzaGFyZWQKLQkgKiBkb2N1bWVudC4gSWYgbmVjZXNzYXJ5LCB0aGUgY29tbWFuZCBleGVjdXRvciBjYW4gYmUgY2xlYXJlZCBieQotCSAqIHNldHRpbmcgaXQgdG8gbnVsbC4KLQkgKiBUaGlzIGFsbG93cyBiYWNrZ3JvdW5kIGNsaWVudHMgdG8gbW9kaWZ5IGRvY3VtZW50cyB0aGF0IGFyZQotCSAqIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgVUkuIFNlZSBpbXBsZW1lbnRhdGlvbnMgb2YgQ29tbWFuZEV4ZWN1dG9yLgotCSAqLwotCXZvaWQgc2V0VGhyZWFkTG9jYWxNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcihDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvamVjdC13aWRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21tYW5kRXhlY3V0b3JQcm92aWRlcgotCSAqIGludGVyZmFjZS4KLQkgKi8KLQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCk7Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogcHJvamVjdCAidXBkYXRlIiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVwZGF0ZXIKLQkgKiBpbnRlcmZhY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gInVwZGF0ZSIgYSBKUEEgcHJvamVjdC4KLQkgKi8KLQlVcGRhdGVyIGdldFVwZGF0ZXIoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVwZGF0ZXIKLQkgKiBpbnRlcmZhY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gInVwZGF0ZSIgYSBKUEEgcHJvamVjdC4KLQkgKiBCZWZvcmUgc2V0dGluZyB0aGUgdXBkYXRlciwgQ2xpZW50cyBzaG91bGQgc2F2ZSB0aGUgY3VycmVudCB1cGRhdGVyIHNvCi0JICogaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyLgotCSAqLwotCXZvaWQgc2V0VXBkYXRlcihVcGRhdGVyIHVwZGF0ZXIpOwotCi0JLyoqCi0JICogU29tZXRoaW5nIGluIHRoZSBKUEEgcHJvamVjdCBoYXMgY2hhbmdlZCwgInVwZGF0ZSIgdGhvc2UgcGFydHMgb2YgdGhlCi0JICogSlBBIHByb2plY3QgdGhhdCBhcmUgZGVwZW5kZW50IG9uIG90aGVyIHBhcnRzIG9mIHRoZSBKUEEgcHJvamVjdC4KLQkgKiBUaGlzIGlzIGNhbGxlZCB3aGVuCi0JICogLSBUaGUgSlBBIHByb2plY3QgdXBkYXRlciBpcyBjaGFuZ2VkIHtAbGluayBKcGFQcm9qZWN0I3NldFVwZGF0ZXIoVXBkYXRlcil9Ci0JICogLSBhbnl0aGluZyBpbiB0aGUgSlBBIHByb2plY3QgY2hhbmdlcwotCSAqIC0gdGhlIEpQQSBwcm9qZWN0J3MgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBjaGFuZ2VkLCBvcGVuZWQsIG9yIGNsb3NlZAotCSAqLwotCXZvaWQgdXBkYXRlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayB1c2VkIGJ5IHRoZSB1cGRhdGVyIHRvIHBlcmZvcm0gdGhlIGFjdHVhbAotCSAqICJ1cGRhdGUiLgotCSAqLwotCUlTdGF0dXMgdXBkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQotCS8qKgotCSAqIERlZmluZSBhIHN0cmF0ZWd5IHRoYXQgY2FuIGJlIHVzZWQgdG8gInVwZGF0ZSIgYSBKUEEgcHJvamVjdCB3aGVuZXZlcgotCSAqIHNvbWV0aGluZyBjaGFuZ2VzLgotCSAqLwotCWludGVyZmFjZSBVcGRhdGVyIHsKLQotCQkvKioKLQkJICogVGhlIHVwZGF0ZXIgaGFzIGp1c3QgYmVlbiBhc3NpZ25lZCB0byBpdHMgSlBBIHByb2plY3QuCi0JCSAqLwotCQl2b2lkIHN0YXJ0KCk7Ci0KLQkJLyoqCi0JCSAqIFVwZGF0ZSB0aGUgSlBBIHByb2plY3QuCi0JCSAqLwotCQl2b2lkIHVwZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgSlBBIHByb2plY3QgaXMgZGlzcG9zZWQ7IGRpc3Bvc2UgdGhlIHVwZGF0ZXIuCi0JCSAqLwotCQl2b2lkIGRpc3Bvc2UoKTsKLQotCQkvKioKLQkJICogVGhpcyB1cGRhdGVyIGRvZXMgbm90aGluZy4gVXNlZnVsIGZvciB0ZXN0aW5nLgotCQkgKi8KLQkJZmluYWwgY2xhc3MgTnVsbCBpbXBsZW1lbnRzIFVwZGF0ZXIgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXBkYXRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlwdWJsaWMgc3RhdGljIFVwZGF0ZXIgaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJKcGFQcm9qZWN0LlVwZGF0ZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIGNvbmZpZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBhIEpQQSBwcm9qZWN0ICoqKioqCi0KLQkvKioKLQkgKiBUaGUgc2V0dGluZ3MgdXNlZCB0byBjb25zdHJ1Y3QgYSBKUEEgcHJvamVjdC4KLQkgKi8KLQlpbnRlcmZhY2UgQ29uZmlnIHsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBFY2xpcHNlIHByb2plY3QgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgSlBBIHByb2plY3QuCi0JCSAqLwotCQlJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgSlBBIHBsYXRmb3JtIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IEpQQSBwcm9qZWN0LgotCQkgKi8KLQkJSnBhUGxhdGZvcm0gZ2V0SnBhUGxhdGZvcm0oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgdG8gYmUgYXNzb2NpYXRlZAotCQkgKiB3aXRoIHRoZSBuZXcgSlBBIHByb2plY3QuIChUaGlzIGNvbm5lY3Rpb24gcHJvZmlsZSB3cmFwcyBhIERUUAotCQkgKiBjb25uZWN0aW9uIHByb2ZpbGUuKQotCQkgKi8KLQkJU3RyaW5nIGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc2NoZW1hIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHNjaGVtYQotCQkgKiBvZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlLgotCQkgKiBNYXkgYmUgbnVsbC4KLQkJICovCi0JCVN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbmV3IEpQQSBwcm9qZWN0IGlzIHRvICJkaXNjb3ZlciIgYW5ub3RhdGVkCi0JCSAqIGNsYXNzZXMuCi0JCSAqLwotCQlib29sZWFuIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcygpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhU3RydWN0dXJlTm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYVN0cnVjdHVyZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhY2JjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhU3RydWN0dXJlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLS8qKgotICogSW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgYXBwZWFyIGluIHRoZSBTdHJ1Y3R1cmUgdmlldwotICogVGhpcyBpcyB1c2VkIGJ5IEpwYVNlbGVjdGlvbiB0byBkZXRlcm1pbmUgc2VsZWN0aW9uIGluIHRoZSBlZGl0b3IuCi0gKiBEZXRhaWxzIHBhZ2VzIGFyZSBhbHNvIHByb3ZpZGVkIGZvciBlYWNoIEpwYVN0cnVjdHVyZU5vZGUuCi0gKiAKLSAqIEkgZGlkIG5vdCBpbXBsZW1lbnQgSnBhQ29udGV4dE5vZGUgYW5kIEknbSBub3QgZXZlbiBzdXJlIHdlIHNob3VsZCBpbXBsZW1lbnQKLSAqIEpwYU5vZGUuICBJdCBpcyBwb3NzaWJseSBzb21lb25lIGNvdWxkIHdhbnQgYSBzdHJ1Y3R1cmUgbm9kZSB0aGF0IGlzCi0gKiBub3QgYWN0dWFsbHkgYSBjb250ZXh0Tm9kZSBpbiB0aGUgbW9kZWwuLy9UT0RPCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVN0cnVjdHVyZU5vZGUgZXh0ZW5kcyBKcGFOb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJ1Y3R1cmUgbm9kZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgotCSAqLwotCUpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIHRvIGJlIHVzZWQgdG8gc2VsZWN0IHRleHQgaW4gdGhlIGVkaXRvcgotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBub2RlLgotCSAqLwotCVRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYWxsIG9mIHRoaXMgY2xhc3Mgb2Ygc3RydWN0dXJlIG5vZGVzCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBEaXNwb3NlIG9mIHRoaXMgc3RydWN0dXJlTm9kZSBhbmQgZGlzcG9zZSBvZiBjaGlsIHN0cnVjdHVyZU5vZGVzLgotCSAqIFR5cGljYWxseSB0aGlzIHdvdWxkIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBKcGFGaWxlIHJvb3RTdHJ1Y3R1cmVOb2Rlcy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcHRDb3JlUGx1Z2luLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnB0Q29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTdjODk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcHRDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkdlbmVyaWNKcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnByZWZzLkpwYVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucHJlZnMuSnBhUHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIFRoZSBKUFQgcGx1Zy1pbiBsaWZlY3ljbGUgaW1wbGVtZW50YXRpb24uCi0gKiBBIG51bWJlciBvZiBnbG9iYWxseS1hdmFpbGFibGUgY29uc3RhbnRzIGFuZCBtZXRob2RzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi0vLyBUT0RPIGtlZXAgcHJlZmVyZW5jZXMgaW4gc3luY2ggd2l0aCB0aGUgSlBBIHByb2plY3QKLS8vIChjb25uZWN0aW9uIHByb2ZpbGUgbmFtZSwgImRpc2NvdmVyIiBmbGFnKQotLy8gdXNlIGxpc3RlbmVycz8KLXB1YmxpYyBjbGFzcyBKcHRDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgY29uc3RhbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBwbHVnLWluIGlkZW50aWZpZXIgb2YgdGhlIHBlcnNpc3RlbmNlIHN1cHBvcnQKLQkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb3JlIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29yZSI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIEpQQSBmYWNldAotCSAqICh2YWx1ZSA8Y29kZT4ianB0LmpwYSI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9JRCA9ICJqcHQuanBhIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIHN0b3JpbmcgYSBKUEEgcHJvamVjdCdzIHBsYXRmb3JtIGluIHRoZSBFY2xpcHNlCi0JICogcHJvamVjdCdzIHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9QTEFURk9STSA9IFBMVUdJTl9JRCArICIucGxhdGZvcm0iOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIHN0b3JpbmcgYSBKUEEgcHJvamVjdCdzICJkaXNjb3ZlciIgZmxhZyBpbiB0aGUgRWNsaXBzZQotCSAqIHByb2plY3QncyBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUyA9IFBMVUdJTl9JRCArICIuZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIHN0b3JpbmcgYSBKUEEgcHJvamVjdCdzIGRhdGEgc291cmNlIGNvbm5lY3Rpb24gcHJvZmlsZSBuYW1lCi0JICogaW4gdGhlIEVjbGlwc2UgcHJvamVjdCdzIHBlcnNpc3RlbnQgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgREFUQV9TT1VSQ0VfQ09OTkVDVElPTl9QUk9GSUxFX05BTUUgPSAKLQkJCW5ldyBRdWFsaWZpZWROYW1lKFBMVUdJTl9JRCwgImRhdGFTb3VyY2UuY29ubmVjdGlvblByb2ZpbGVOYW1lIik7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUga2V5IGZvciBzdG9yaW5nIGEgSlBBIHByb2plY3QncyB1c2VyIG92ZXJyaWRkZW4gZGVmYXVsdCBzY2hlbWEgbmFtZQotCSAqIGluIHRoZSBFY2xpcHNlIHByb2plY3QncyBwZXJzaXN0ZW50IHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUFfTkFNRSA9IAotCQkJbmV3IFF1YWxpZmllZE5hbWUoUExVR0lOX0lELCAidXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUiKTsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIEpQQSB2YWxpZGF0aW9uIG1hcmtlcgotCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvcmUuanBhUHJvYmxlbU1hcmtlciI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9JRCA9IFBMVUdJTl9JRCArICIuanBhUHJvYmxlbU1hcmtlciI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBWYWx1ZSBvZiB0aGUgY29udGVudC10eXBlIGZvciBvcm0ueG1sIG1hcHBpbmdzIGZpbGVzLiBVc2UgdGhpcyB2YWx1ZSB0byByZXRyaWV2ZSAKLQkgKiB0aGUgT1JNIHhtbCBjb250ZW50IHR5cGUgZnJvbSB0aGUgY29udGVudCB0eXBlIG1hbmFnZXIgYW5kIHRvIGFkZCBuZXcgCi0JICogb3JtLnhtbC1saWtlIGV4dGVuc2lvbnMgdG8gdGhpcyBjb250ZW50IHR5cGUuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyI2dldENvbnRlbnRUeXBlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUk1fWE1MX0NPTlRFTlRfVFlQRSA9IFBMVUdJTl9JRCArICIuY29udGVudC5vcm0iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEaXR0byBmb3IgcGVyc2lzdGVuY2UueG1sLgotCSAqIEBzZWUgI09STV9YTUxfQ09OVEVOVF9UWVBFCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRSA9IFBMVUdJTl9JRCArICIuY29udGVudC5wZXJzaXN0ZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFdlYiBwcm9qZWN0cyBoYXZlIHNvbWUgc3BlY2lhbCBleGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QUk9KRUNUX0ZBQ0VUX0lEID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRTsKLQotCS8qKgotCSAqIFdlYiBwcm9qZWN0cyBoYXZlIHNvbWUgc3BlY2lhbCBleGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QUk9KRUNUX0RFUExPWV9QUkVGSVggPSBKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEVSU0lTVEVOQ0VfWE1MX0ZJTEVfUEFUSCA9ICJNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCA9ICJNRVRBLUlORi9vcm0ueG1sIjsKLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgSnB0Q29yZVBsdWdpbiBJTlNUQU5DRTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uIEpQVCBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0Q29yZVBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5ndWxhciBKUEEgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFNb2RlbCBnZXRKcGFNb2RlbCgpIHsKLQkJcmV0dXJuIEpwYU1vZGVsTWFuYWdlci5pbnN0YW5jZSgpLmdldEpwYU1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LAotCSAqIG9yIG51bGwgaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIHByb2plY3Qgd2l0aCBhCi0JICogSlBBIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuIEpwYU1vZGVsTWFuYWdlci5pbnN0YW5jZSgpLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCWxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgZmlsZSwKLQkgKiBvciBudWxsIGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIHNwZWNpZmllZCBmaWxlIHdpdGggYSBKUEEgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYUZpbGUgZ2V0SnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSnBhTW9kZWxNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0SnBhRmlsZShmaWxlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJbG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QgaGFzIGEgSlBBIGZhY2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9qZWN0SGFzSnBhRmFjZXQoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gcHJvamVjdEhhc0ZhY2V0KHByb2plY3QsIEZBQ0VUX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdCBoYXMgYSBKUEEgZmFjZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHByb2plY3RIYXNXZWJGYWNldChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBwcm9qZWN0SGFzRmFjZXQocHJvamVjdCwgV0VCX1BST0pFQ1RfRkFDRVRfSUQpOwotCX0KLQotCS8qKgotCSAqIENoZWNrZWQgZXhjZXB0aW9ucyBiaXRlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJvamVjdEhhc0ZhY2V0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmYWNldElkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuaGFzUHJvamVjdEZhY2V0KHByb2plY3QsIGZhY2V0SWQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2coZXgpOyAgLy8gcHJvYmxlbXMgcmVhZGluZyB0aGUgcHJvamVjdCBtZXRhZGF0YSAtIGFzc3VtZSBmYWNldCBkb2Vzbid0IGV4aXN0IC0gcmV0dXJuICdmYWxzZScKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UueG1sIChzcGVjaWZpZWQgYXMgIk1FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpCi0JICogZGVwbG95bWVudCBVUkkgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQZXJzaXN0ZW5jZVhtbERlcGxveW1lbnRVUkkoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0RGVwbG95bWVudFVSSShwcm9qZWN0LCBERUZBVUxUX1BFUlNJU1RFTkNFX1hNTF9GSUxFX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBtYXBwaW5nIGZpbGUgKHNwZWNpZmllZCBhcyAiTUVUQS1JTkYvb3JtLnhtbCIpCi0JICogZGVwbG95bWVudCBVUkkgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0T3JtWG1sRGVwbG95bWVudFVSSShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXREZXBsb3ltZW50VVJJKHByb2plY3QsIERFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcgZmlsZSAoc3BlY2lmaWVkIGFzICJNRVRBLUlORi88bWFwcGluZ0ZpbGVOYW1lPiIpCi0JICogZGVwbG95bWVudCBVUkkgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPcm1YbWxEZXBsb3ltZW50VVJJKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBtYXBwaW5nRmlsZU5hbWUpIHsKLQkJcmV0dXJuIGdldERlcGxveW1lbnRVUkkocHJvamVjdCwgbWFwcGluZ0ZpbGVOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogVHdlYWsgdGhlIHNwZWNpZmllZCBkZXBsb3ltZW50IFVSSSBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QKLQkgKiBoYXMgYSB3ZWIgZmFjZXQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERlcGxveW1lbnRVUkkoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGRlZmF1bHRVUkkpIHsKLQkJcmV0dXJuIHByb2plY3RIYXNXZWJGYWNldChwcm9qZWN0KSA/Ci0JCQkJV0VCX1BST0pFQ1RfREVQTE9ZX1BSRUZJWCArICIvIiArIGRlZmF1bHRVUkkKLQkJCToKLQkJCQlkZWZhdWx0VVJJOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgSlBBIHByZWZlcmVuY2VzCi0JICogQHNlZSBKcGFQcmVmZXJlbmNlSW5pdGlhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0RGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRGVmYXVsdFNjb3BlKCk7Ci0JCXJldHVybiBjb250ZXh0LmdldE5vZGUoUExVR0lOX0lEKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJlZmVyZW5jZXMgZm9yIHRoZSBjdXJyZW50IHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0V29ya3NwYWNlUHJlZmVyZW5jZXMoKSB7Ci0JCUlTY29wZUNvbnRleHQgY29udGV4dCA9IG5ldyBJbnN0YW5jZVNjb3BlKCk7Ci0JCXJldHVybiBjb250ZXh0LmdldE5vZGUoUExVR0lOX0lEKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJlZmVyZW5jZXMgZm9yIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVjbGlwc2VQcmVmZXJlbmNlcyBnZXRQcm9qZWN0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpOwotCQlyZXR1cm4gY29udGV4dC5nZXROb2RlKFBMVUdJTl9JRCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBKUEEgbGlicmFyeSBmb3IgY3JlYXRpbmcgbmV3IEpQQSBwcm9qZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRKcGFMaWJyYXJ5KCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0KAotCQkJCUpwYVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0pQQV9MSUIsIG51bGwsCi0JCQkJbmV3IFByZWZlcmVuY2VzW10ge2dldFdvcmtzcGFjZVByZWZlcmVuY2VzKCksIGdldERlZmF1bHRQcmVmZXJlbmNlcygpfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBKUEEgcGxhdGZvcm0gSUQgZm9yIGNyZWF0aW5nIG5ldyBKUEEgcHJvamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0SnBhUGxhdGZvcm1JZCgpIHsKLQkJU3RyaW5nIHBsYXRmb3JtSWQgPSAKLQkJCVBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldCgKLQkJCQlKcGFQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9KUEFfUExBVEZPUk0sIEdlbmVyaWNKcGFQbGF0Zm9ybS5JRCwKLQkJCQluZXcgUHJlZmVyZW5jZXNbXSB7Z2V0V29ya3NwYWNlUHJlZmVyZW5jZXMoKSwgZ2V0RGVmYXVsdFByZWZlcmVuY2VzKCl9KTsKLQkJaWYgKCEgSnBhUGxhdGZvcm1SZWdpc3RyeS5pbnN0YW5jZSgpLmNvbnRhaW5zUGxhdGZvcm0ocGxhdGZvcm1JZCkpIHsKLQkJCXBsYXRmb3JtSWQgPSAKLQkJCQlQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXQoCi0JCQkJCUpwYVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0pQQV9QTEFURk9STSwgR2VuZXJpY0pwYVBsYXRmb3JtLklELAotCQkJCQluZXcgUHJlZmVyZW5jZXNbXSB7Z2V0RGVmYXVsdFByZWZlcmVuY2VzKCl9KTsKLQkJfQotCQlyZXR1cm4gcGxhdGZvcm1JZDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBkZWZhdWx0IEpQQSBwbGF0Zm9ybSBJRCBmb3IgY3JlYXRpbmcgbmV3IEpQQSBwcm9qZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0SnBhUGxhdGZvcm1JZChTdHJpbmcgcGxhdGZvcm1JZCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gZ2V0V29ya3NwYWNlUHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMucHV0KEpwYVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0pQQV9QTEFURk9STSwgcGxhdGZvcm1JZCk7Ci0JCWZsdXNoKHByZWZzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBwbGF0Zm9ybSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybSBnZXRKcGFQbGF0Zm9ybShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKcGFQbGF0Zm9ybVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm0oZ2V0SnBhUGxhdGZvcm1JZChwcm9qZWN0KSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHBsYXRmb3JtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKcGFQbGF0Zm9ybUlkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KS5nZXQoSlBBX1BMQVRGT1JNLCBHZW5lcmljSnBhUGxhdGZvcm0uSUQpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgSlBBIHBsYXRmb3JtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SnBhUGxhdGZvcm1JZChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcganBhUGxhdGZvcm1JZCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpOwotCQlwcmVmcy5wdXQoSlBBX1BMQVRGT1JNLCBqcGFQbGF0Zm9ybUlkKTsKLQkJZmx1c2gocHJlZnMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSAiZGlzY292ZXIiIGZsYWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBFY2xpcHNlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCkuZ2V0Qm9vbGVhbihESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgSlBBICJkaXNjb3ZlciIgZmxhZyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCk7Ci0JCXByZWZzLnB1dEJvb2xlYW4oRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlcyk7Ci0JCWZsdXNoKHByZWZzKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVja2VkIGV4Y2VwdGlvbnMgYml0ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmx1c2goSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcykgewotCQl0cnkgewotCQkJcHJlZnMuZmx1c2goKTsKLQkJfSBjYXRjaChCYWNraW5nU3RvcmVFeGNlcHRpb24gZXgpIHsKLQkJCWxvZyhleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuIHByb2plY3QuZ2V0UGVyc2lzdGVudFByb3BlcnR5KERBVEFfU09VUkNFX0NPTk5FQ1RJT05fUFJPRklMRV9OQU1FKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJbG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBFY2xpcHNlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlwcm9qZWN0LnNldFBlcnNpc3RlbnRQcm9wZXJ0eShEQVRBX1NPVVJDRV9DT05ORUNUSU9OX1BST0ZJTEVfTkFNRSwgY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJbG9nKGV4KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgc2NoZW1hIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotCSAqIEBzZWUgSnBhUHJvamVjdCNnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuIHByb2plY3QuZ2V0UGVyc2lzdGVudFByb3BlcnR5KFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUFfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWxvZyhjZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGRlZmF1bHQgc2NoZW1hIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotCSAqIEBzZWUgSnBhUHJvamVjdCNzZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBkZWZhdWx0U2NoZW1hTmFtZSkgewotCQl0cnkgewotCQkJcHJvamVjdC5zZXRQZXJzaXN0ZW50UHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQV9OQU1FLCBkZWZhdWx0U2NoZW1hTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWxvZyhjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBzdGF0dXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotICAgIH0KLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBvciBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCB0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCB0aHJvd2FibGUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSnB0Q29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKElOU1RBTkNFICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQkvLyB0aGlzIGNvbnZlbnRpb24gaXMgKndhY2sqLi4uICB+Ymp2Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlKcGFNb2RlbE1hbmFnZXIuaW5zdGFuY2UoKS5zdGFydCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUpwYU1vZGVsTWFuYWdlci5pbnN0YW5jZSgpLnN0b3AoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9NYXBwaW5nS2V5cy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL01hcHBpbmdLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NmI4OTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL01hcHBpbmdLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdLZXlzIHsKLQotCVN0cmluZyBFTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSA9ICJlbnRpdHkiOwotCVN0cmluZyBNQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZID0gIm1hcHBlZFN1cGVyY2xhc3MiOwotCVN0cmluZyBFTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkgPSAiZW1iZWRkYWJsZSI7Ci0JU3RyaW5nIE5VTExfVFlQRV9NQVBQSU5HX0tFWSA9IG51bGw7Ci0KLQlTdHJpbmcgQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gImJhc2ljIjsKLQlTdHJpbmcgSURfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gImlkIjsKLQlTdHJpbmcgVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAidmVyc2lvbiI7Ci0JU3RyaW5nIE9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZICA9ICJvbmVUb09uZSI7Ci0JU3RyaW5nIE9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJvbmVUb01hbnkiOwotCVN0cmluZyBNQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAibWFueVRvT25lIjsKLQlTdHJpbmcgTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJtYW55VG9NYW55IjsKLQlTdHJpbmcgRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gImVtYmVkZGVkIjsKLQlTdHJpbmcgRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gImVtYmVkZGVkSWQiOwotCVN0cmluZyBUUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInRyYW5zaWVudCI7Ci0JU3RyaW5nIE5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gbnVsbDsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL1Jlc291cmNlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9SZXNvdXJjZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzFmNjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL1Jlc291cmNlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZU1vZGVsIGV4dGVuZHMgTW9kZWwKLXsKLQkvKioKLQkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBKYXZhIHJlc291cmNlIHR5cGUKLQkgKiBAc2VlIFJlc291cmNlTW9kZWwjZ2V0UmVzb3VyY2VUeXBlKCkKLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfUkVTT1VSQ0VfVFlQRSA9ICJKQVZBX1JFU09VUkNFX1RZUEUiOwotCQotCS8qKgotCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIHBlcnNpc3RlbmNlLnhtbCByZXNvdXJjZSB0eXBlCi0JICogQHNlZSBSZXNvdXJjZU1vZGVsI2dldFJlc291cmNlVHlwZSgpCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9SRVNPVVJDRV9UWVBFID0gIlBFUlNJU1RFTkNFX1JFU09VUkNFX1RZUEUiOwotCQotCS8qKgotCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIG1hcHBpbmcgZmlsZSAoZS5nLiBvcm0ueG1sKSByZXNvdXJjZSB0eXBlCi0JICogQHNlZSBSZXNvdXJjZU1vZGVsI2dldFJlc291cmNlVHlwZSgpCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBPUk1fUkVTT1VSQ0VfVFlQRSA9ICJPUk1fUkVTT1VSQ0VfVFlQRSI7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGFsbCByZXNvdXJjZSBtb2RlbHMgb2YgdGhpcyB0eXBlCi0JICovCi0JU3RyaW5nIGdldFJlc291cmNlVHlwZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSUZpbGUgdGhhdCB0aGlzIHJlc291cmNlIG1vZGVsIHJlcHJlc2VudHMKLQkgKi8KLQlJRmlsZSBnZXRGaWxlKCk7Ci0JCi0Jdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCk7Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSByZXNvdXJjZSBtb2RlbCBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLgotCSAqLwotCXZvaWQgdXBkYXRlRnJvbVJlc291cmNlKCk7Ci0KLQkKLQl2b2lkIGFkZFJlc291cmNlTW9kZWxDaGFuZ2VMaXN0ZW5lcihSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpOwotCQotCXZvaWQgcmVtb3ZlUmVzb3VyY2VNb2RlbENoYW5nZUxpc3RlbmVyKFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JCi0Jdm9pZCBkaXNwb3NlKCk7Ci0JCi0JLyoqCi0JICogVXNlZCB0byByZXNvbHZlIHR5cGUgaW5mb3JtYXRpb24gdGhhdCBjb3VsZCBiZSBkZXBlbmRlbnQgb24gb3RoZXIgZmlsZXMgYmVpbmcgYWRkZWQvcmVtb3ZlZC4KLQkgKi8KLQl2b2lkIHJlc29sdmVUeXBlcygpOwotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvUmVzb3VyY2VNb2RlbExpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvUmVzb3VyY2VNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODgyZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL1Jlc291cmNlTW9kZWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZU1vZGVsTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcgotewotCXZvaWQgcmVzb3VyY2VNb2RlbENoYW5nZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0FjY2Vzc1R5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0FjY2Vzc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3Y2FhNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9BY2Nlc3NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZW51bSBBY2Nlc3NUeXBlIHsKLQotCUZJRUxELAotCVBST1BFUlRZOwotCi0KLQlwdWJsaWMgc3RhdGljIEFjY2Vzc1R5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZSBqYXZhQWNjZXNzVHlwZSkgewotCQlpZiAoamF2YUFjY2Vzc1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChqYXZhQWNjZXNzVHlwZSkgewotCQkJY2FzZSBGSUVMRDoKLQkJCQlyZXR1cm4gRklFTEQ7Ci0JCQljYXNlIFBST1BFUlRZOgotCQkJCXJldHVybiBQUk9QRVJUWTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBhY2Nlc3MgdHlwZTogIiArIGphdmFBY2Nlc3NUeXBlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEFjY2Vzc1R5cGUgZnJvbVhtbFJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUgb3JtQWNjZXNzVHlwZSkgewotCQlpZiAob3JtQWNjZXNzVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKG9ybUFjY2Vzc1R5cGUpIHsKLQkJCWNhc2UgRklFTEQ6Ci0JCQkJcmV0dXJuIEZJRUxEOwotCQkJY2FzZSBQUk9QRVJUWToKLQkJCQlyZXR1cm4gUFJPUEVSVFk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYWNjZXNzIHR5cGU6ICIgKyBvcm1BY2Nlc3NUeXBlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlIHRvWG1sUmVzb3VyY2VNb2RlbChBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUpIHsKLQkJaWYgKGFjY2Vzc1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChhY2Nlc3NUeXBlKSB7Ci0JCQljYXNlIEZJRUxEOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRDsKLQkJCWNhc2UgUFJPUEVSVFk6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGFjY2VzcyB0eXBlOiAiICsgYWNjZXNzVHlwZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2ZTQyZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIGV4dGVuZHMgQmFzZU92ZXJyaWRlCi17Ci0JPFQgZXh0ZW5kcyBKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gam9pbkNvbHVtbnMoKTsKLQk8VCBleHRlbmRzIEpvaW5Db2x1bW4+IExpc3RJdGVyYXRvcjxUPiBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCTxUIGV4dGVuZHMgSm9pbkNvbHVtbj4gTGlzdEl0ZXJhdG9yPFQ+IGRlZmF1bHRKb2luQ29sdW1ucygpOwotCWludCBqb2luQ29sdW1uc1NpemUoKTsKLQlpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0JaW50IGRlZmF1bHRKb2luQ29sdW1uc1NpemUoKTsKLQlKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQl2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQl2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJU3RyaW5nIFNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCA9ICJzcGVjaWZpZWRKb2luQ29sdW1uc0xpc3QiOwotCQlTdHJpbmcgREVGQVVMVF9KT0lOX0NPTFVNTlNfTElTVCA9ICJkZWZhdWx0Sm9pbkNvbHVtbnNMaXN0IjsKLQkJCi0JYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0KLQlBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIGdldE93bmVyKCk7Ci0JCi0JQXNzb2NpYXRpb25PdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCk7Ci0JCi0JaW50ZXJmYWNlIE93bmVyIGV4dGVuZHMgQmFzZU92ZXJyaWRlLk93bmVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSByZWxhdGlvbnNoaXAgbWFwcGluZyB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbmFtZS4KLQkJICogUmV0dXJuIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuICBUaGlzIHJlbGF0aW9uc2hpcCBtYXBwaW5nCi0JCSAqIHdpbGwgYmUgZm91bmQgaW4gdGhlIG1hcHBlZCBzdXBlcmNsYXNzLCBub3QgaW4gdGhlIG93bmluZyBlbnRpdHkKLQkJICovCi0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZyhTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0F0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0F0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVjOTBmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9BdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZU1hcHBpbmcgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCi0JYm9vbGVhbiBpc0RlZmF1bHQoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHVuaXF1ZSBrZXkgZm9yIHRoZSBJUGVyc2lzdGVudEF0dHJpYnV0ZU1hcHBpbmcuICBJZiB0aGlzIGlzIGRlZmluZWQgaW4KLQkgKiBhbiBleHRlbnNpb24gdGhleSBzaG91bGQgYmUgZXF1YWwuCi0JICovCi0JU3RyaW5nIGdldEtleSgpOwotCi0JLyoqCi0JICogSWYgdGhlIG1hcHBpbmcgaXMgZm9yIGEgcHJpbWFyeSBrZXkgY29sdW1uLCByZXR1cm4gdGhlIGNvbHVtbidzIG5hbWUsCi0JICogb3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqLwotCVN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXBwaW5nIGZvciB0aGUgYXR0cmlidXRlIG1hcHBpbmcncyBhdHRyaWJ1dGUncyB0eXBlLgotCSAqLwotCVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgImF0dHJpYnV0ZSIgbWFwcGluZyBjYW4gYmUgb3ZlcnJpZGRlbi4KLQkgKi8KLQlib29sZWFuIGlzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgImFzc29jaWF0aW9uIiBtYXBwaW5nIGNhbiBiZSBvdmVycmlkZGVuLgotCSAqLwotCWJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlICJhdHRyaWJ1dGUiIG1hcHBpbmcgaXMgZm9yIGFuIElELgotCSAqLwotCWJvb2xlYW4gaXNJZE1hcHBpbmcoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9BdHRyaWJ1dGVPdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0NjM2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9BdHRyaWJ1dGVPdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSBleHRlbmRzIEJhc2VPdmVycmlkZSwgQ29sdW1uLk93bmVyCi17Ci0JQ29sdW1uIGdldENvbHVtbigpOwotCi0JQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgZ2V0T3duZXIoKTsKLQkKLQlBdHRyaWJ1dGVPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCk7Ci0JCi0JaW50ZXJmYWNlIE93bmVyIGV4dGVuZHMgQmFzZU92ZXJyaWRlLk93bmVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb2x1bW4gbWFwcGluZyB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbmFtZS4KLQkJICogUmV0dXJuIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuICBUaGlzIGNvbHVtbiBtYXBwaW5nCi0JCSAqIHdpbGwgYmUgZm91bmQgaW4gdGhlIG1hcHBlZCBzdXBlcmNsYXNzIChvciBlbWJlZGRhYmxlKSwgbm90IGluIHRoZSBvd25pbmcgZW50aXR5Ci0JCSAqLwotCQlDb2x1bW5NYXBwaW5nIGdldENvbHVtbk1hcHBpbmcoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9CYXNlQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9CYXNlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MTRjMmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlQ29sdW1uIGV4dGVuZHMgTmFtZWRDb2x1bW4KLXsKLQotCVN0cmluZyBnZXRUYWJsZSgpOwotCi0JU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpOwotCQlTdHJpbmcgREVGQVVMVF9UQUJMRV9QUk9QRVJUWSA9ICJkZWZhdWx0VGFibGVQcm9wZXJ0eSI7Ci0KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQl2b2lkIHNldFNwZWNpZmllZFRhYmxlKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVGFibGVQcm9wZXJ0eSI7Ci0KLQkKLQlCb29sZWFuIGdldFVuaXF1ZSgpOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFVuaXF1ZSgpOwotCQlTdHJpbmcgREVGQVVMVF9VTklRVUVfUFJPUEVSVFkgPSAiZGVmYXVsdFVuaXF1ZVByb3BlcnR5IjsKLQkJQm9vbGVhbiBERUZBVUxUX1VOSVFVRSA9IEJvb2xlYW4uRkFMU0U7Ci0JQm9vbGVhbiBnZXRTcGVjaWZpZWRVbmlxdWUoKTsKLQl2b2lkIHNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuIG5ld1NwZWNpZmllZFVuaXF1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfVU5JUVVFX1BST1BFUlRZID0gInNwZWNpZmllZFVuaXF1ZVByb3BlcnR5IjsKLQkKLQotCUJvb2xlYW4gZ2V0TnVsbGFibGUoKTsKLQkJCi0JQm9vbGVhbiBnZXREZWZhdWx0TnVsbGFibGUoKTsKLQkJU3RyaW5nIERFRkFVTFRfTlVMTEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsdE51bGxhYmxlUHJvcGVydHkiOwotCQlCb29sZWFuIERFRkFVTFRfTlVMTEFCTEUgPSBCb29sZWFuLlRSVUU7Ci0JQm9vbGVhbiBnZXRTcGVjaWZpZWROdWxsYWJsZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWROdWxsYWJsZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfTlVMTEFCTEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkTnVsbGFibGVQcm9wZXJ0eSI7Ci0KLQotCUJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdEluc2VydGFibGUoKTsKLQkJU3RyaW5nIERFRkFVTFRfSU5TRVJUQUJMRV9QUk9QRVJUWSA9ICJkZWZhdWxJbnNlcnRhYmxlUHJvcGVydHkiOwotCQlCb29sZWFuIERFRkFVTFRfSU5TRVJUQUJMRSA9IEJvb2xlYW4uVFJVRTsKLQlCb29sZWFuIGdldFNwZWNpZmllZEluc2VydGFibGUoKTsKLQl2b2lkIHNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRJbnNlcnRhYmxlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZID0gInNwZWNpZmllZEluc2VydGFibGVQcm9wZXJ0eSI7Ci0JCi0JCi0JQm9vbGVhbiBnZXRVcGRhdGFibGUoKTsKLQkKLQlCb29sZWFuIGdldERlZmF1bHRVcGRhdGFibGUoKTsKLQkJU3RyaW5nIERFRkFVTFRfVVBEQVRBQkxFX1BST1BFUlRZID0gImRlZmF1bFVwZGF0YWJsZVByb3BlcnR5IjsKLQkJQm9vbGVhbiBERUZBVUxUX1VQREFUQUJMRSA9IEJvb2xlYW4uVFJVRTsKLQlCb29sZWFuIGdldFNwZWNpZmllZFVwZGF0YWJsZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4gbmV3U3BlY2lmaWVkVXBkYXRhYmxlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9VUERBVEFCTEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVXBkYXRhYmxlUHJvcGVydHkiOwotCi0JLy9UT0RPIG5vdCBzdXJlIHdlIHJlYWxseSBuZWVkL3dhbnQgdGhpcyB0byBiZSBwdWJsaWMuICBUaGlzCi0JLy9pcyB1c2VkIGJ5IENvbHVtbkNvbXBvc2l0ZSB0byBnZXQgYSBsaXN0IG9mIHBvc3NpYmxlIGFzc29jaWF0ZWQgdGFibGVzLCBidXQKLQkvL3JpZ2h0IG5vdyB0aGF0IGxpc3QgaXNuJ3QgZ29pbmcgdG8gdXBkYXRlIGluIHRoZSBVSSBleGNlcHQgd2hlbiB3ZSByZXBvcHVsYXRlCi0JT3duZXIgZ2V0T3duZXIoKTsKLQkKLQkvKioKLQkgKiBpbnRlcmZhY2UgYWxsb3dpbmcgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIGJhc2ljIG1hcHBpbmdzIGFuZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzKQotCSAqLwotCWludGVyZmFjZSBPd25lciBleHRlbmRzIE5hbWVkQ29sdW1uLk93bmVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSB0aGF0IGNvbnRhaW5zIHRoZSBjb2x1bW4uCi0JCSAqLwotCQlTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2VFbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkMTc3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9CYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlRW1iZWRkZWRNYXBwaW5nIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZywgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIKLXsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIGF0dHJpYnV0ZSBvdmVycmlkZXMgd2hldGhlciBzcGVjaWZpZWQgb3IgdmlydHVhbC4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZT4gTGlzdEl0ZXJhdG9yPFQ+IGF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZSBvdmVycmlkZXMsIGJvdGggc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgotCSAqLwotCWludCBhdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZT4gTGlzdEl0ZXJhdG9yPFQ+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCA9ICJzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0IjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcy4KLQkgKi8KLQlpbnQgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBMaXN0SXRlcmF0b3I8VD4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QgPSAidmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3QiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzLgotCSAqLwotCWludCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCQkKLQkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBvdmVycmlkZXMsIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHQsCi0JICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKi8KLQlBdHRyaWJ1dGVPdmVycmlkZSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzZUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2VKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNzk0MzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzZUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlSm9pbkNvbHVtbiBleHRlbmRzIE5hbWVkQ29sdW1uCi17Ci0JU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JU3RyaW5nIGdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCVN0cmluZyBnZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lIjsKLQkJU3RyaW5nIERFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSA9ICJkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUiOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgd3JhcHBlciBmb3IgdGhlIGRhdGFzb3VyY2UgcmVmZXJlbmNlZCBjb2x1bW4KLQkgKi8KLQlDb2x1bW4gZ2V0RGJSZWZlcmVuY2VkQ29sdW1uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcmVmZXJlbmNlIGNvbHVtbiBpcyBmb3VuZCBvbiB0aGUgZGF0YXNvdXJjZQotCSAqLwotCWJvb2xlYW4gaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKTsKLQotCWJvb2xlYW4gaXNWaXJ0dWFsKCk7Ci0KLQlpbnRlcmZhY2UgT3duZXIgZXh0ZW5kcyBOYW1lZENvbHVtbi5Pd25lcgotCXsKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgd3JhcHBlciBmb3IgdGhlIGRhdGFzb3VyY2UgdGFibGUgZm9yIHRoZSByZWZlcmVuY2VkIGNvbHVtbgotCQkgKi8KLQkJVGFibGUgZ2V0RGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKTsKLQkJCi0JCWJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2VPdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzZU92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMmFiZWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzZU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VPdmVycmlkZSBleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOwotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIG92ZXJyaWRlIGV4aXN0cyBhcyBzcGVjaWZpZWQgb24gdGhlIG93bmluZyBvYmplY3QsIG9yIGZhbHNlCi0JICogaWYgdGhlIG92ZXJyaWRlIGlzICJnb3R0ZW4gZm9yIGZyZWUiIGFzIGEgcmVzdWx0IG9mIGRlZmF1bHRzIGNhbGN1bGF0aW9uCi0JICovCi0JYm9vbGVhbiBpc1ZpcnR1YWwoKTsKLQotCUJhc2VPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCk7Ci0JCi0JaW50ZXJmYWNlIE93bmVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcgdGhhdCB0aGlzIG92ZXJyaWRlIGlzIGNvbnRhaW5lZCBpbgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gb3ZlcnJpZGUgaXMgdmlydHVhbC4gVmlydHVhbCBtZWFucyB0aGF0Ci0JCSAqIGl0IGlzIG5vdCBzcGVjaWZpZWQsIGJ1dCBkZWZhdWx0ZWQgaW4gZnJvbSB0aGUgbWFwcGVkIHN1cGVyY2xhc3Mgb3IKLQkJICogZW1iZWRkYWJsZS4KLQkJICovCi0JCWJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VPdmVycmlkZSBvdmVycmlkZSk7Ci0JCQotCQkvKioKLQkJICogSWYgZmFsc2UsIGFkZCB0aGUgZ2l2ZSBvdmVycmlkZSBhcyBhIHNwZWNpZmllZCBvdmVycmlkZSBhbmQgcmVtb3ZlCi0JCSAqIGl0IGZyb20gdGhlIGxpc3Qgb2YgdmlydHVhbCBvdmVycmlkZXMuICBJZiB0cnVlLCB0aGVuIHJlbW92ZSBpdAotCQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgb3ZlcnJpZGVzIGFuZCBhZGQgaXQgdG8gdGhlIHZpcnR1YWwgb3ZlcnJpZGVzCi0JCSAqIGFzIGFwcGxpY2FibGUuICBSZXR1cm4gdGhlIG5ldyBvdmVycmlkZSAod2hldGhlciB2aXJ0dWFsIG9yIHNwZWNpZmllZCkKLQkJICovCi0JCUJhc2VPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgQmFzZU92ZXJyaWRlIG92ZXJyaWRlKTsJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzaWNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MDA1YWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzaWNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2ljTWFwcGluZyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcsIENvbHVtbk1hcHBpbmcsIEZldGNoYWJsZSwgTnVsbGFibGUKLXsKLQlGZXRjaFR5cGUgREVGQVVMVF9GRVRDSF9UWVBFID0gRmV0Y2hUeXBlLkVBR0VSOwotCi0JYm9vbGVhbiBpc0xvYigpOwotCi0Jdm9pZCBzZXRMb2IoYm9vbGVhbiB2YWx1ZSk7Ci0JCVN0cmluZyBMT0JfUFJPUEVSVFkgPSAibG9iUHJvcGVydHkiOwotCQotCUVudW1UeXBlIGdldEVudW1lcmF0ZWQoKTsKLQkKLQlFbnVtVHlwZSBnZXREZWZhdWx0RW51bWVyYXRlZCgpOwotCQlTdHJpbmcgREVGQVVMVF9FTlVNRVJBVEVEX1BST1BFUlRZID0gImRlZmF1bHRFbnVtZXJhdGVkUHJvcGVydHkiOwotCQlFbnVtVHlwZSBERUZBVUxUX0VOVU1FUkFURUQgPSBFbnVtVHlwZS5PUkRJTkFMOwotCi0JRW51bVR5cGUgZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpOwotCXZvaWQgc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZSBuZXdTcGVjaWZpZWRFbnVtZXJhdGVkKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9FTlVNRVJBVEVEX1BST1BFUlRZID0gInNwZWNpZmllZEVudW1lcmF0ZWRQcm9wZXJ0eSI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Nhc2NhZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Nhc2NhZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2ODY1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9DYXNjYWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhc2NhZGUgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCi0JYm9vbGVhbiBpc0FsbCgpOwotCXZvaWQgc2V0QWxsKGJvb2xlYW4gdmFsdWUpOwotCQlTdHJpbmcgQUxMX1BST1BFUlRZID0gImFsbFByb3BlcnR5IjsKLQotCWJvb2xlYW4gaXNQZXJzaXN0KCk7Ci0Jdm9pZCBzZXRQZXJzaXN0KGJvb2xlYW4gdmFsdWUpOwotCQlTdHJpbmcgUEVSU0lTVF9QUk9QRVJUWSA9ICJwZXJzaXN0UHJvcGVydHkiOwotCi0JYm9vbGVhbiBpc01lcmdlKCk7Ci0Jdm9pZCBzZXRNZXJnZShib29sZWFuIHZhbHVlKTsKLQkJU3RyaW5nIE1FUkdFX1BST1BFUlRZID0gIm1lcmdlUHJvcGVydHkiOwotCi0JYm9vbGVhbiBpc1JlbW92ZSgpOwotCXZvaWQgc2V0UmVtb3ZlKGJvb2xlYW4gdmFsdWUpOwotCQlTdHJpbmcgUkVNT1ZFX1BST1BFUlRZID0gInJlbW92ZVByb3BlcnR5IjsKLQotCWJvb2xlYW4gaXNSZWZyZXNoKCk7Ci0Jdm9pZCBzZXRSZWZyZXNoKGJvb2xlYW4gdmFsdWUpOwotCQlTdHJpbmcgUkVGUkVTSF9QUk9QRVJUWSA9ICJyZWZyZXNoUHJvcGVydHkiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4MzRjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sdW1uIGV4dGVuZHMgQmFzZUNvbHVtbgotewotCUludGVnZXIgZ2V0TGVuZ3RoKCk7Ci0KLQlJbnRlZ2VyIGdldERlZmF1bHRMZW5ndGgoKTsKLQlJbnRlZ2VyIERFRkFVTFRfTEVOR1RIID0gSW50ZWdlci52YWx1ZU9mKDI1NSk7Ci0JCVN0cmluZyBERUZBVUxUX0xFTkdUSF9QUk9QRVJUWSA9ICJkZWZhdWx0TGVuZ3RoUHJvcGVydHkiOwotCi0JSW50ZWdlciBnZXRTcGVjaWZpZWRMZW5ndGgoKTsKLQl2b2lkIHNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyIG5ld1NwZWNpZmllZExlbmd0aCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZID0gInNwY2lmaWVkTGVuZ3RoUHJvcGVydHkiOwotCQkKLQlJbnRlZ2VyIGdldFByZWNpc2lvbigpOwotCi0JSW50ZWdlciBnZXREZWZhdWx0UHJlY2lzaW9uKCk7Ci0JCUludGVnZXIgREVGQVVMVF9QUkVDSVNJT04gPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCVN0cmluZyBERUZBVUxUX1BSRUNJU0lPTl9QUk9QRVJUWSA9ICJkZWZhdWx0UHJlY2lzaW9uUHJvcGVydHkiOwotCi0JSW50ZWdlciBnZXRTcGVjaWZpZWRQcmVjaXNpb24oKTsKLQl2b2lkIHNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyIG5ld1NwZWNpZmllZFByZWNpc2lvbik7Ci0JCVN0cmluZyBTUEVDSUZJRURfUFJFQ0lTSU9OX1BST1BFUlRZID0gInNwY2lmaWVkUHJlY2lzaW9uUHJvcGVydHkiOwotCi0JCi0JSW50ZWdlciBnZXRTY2FsZSgpOwotCi0JSW50ZWdlciBnZXREZWZhdWx0U2NhbGUoKTsKLQkJSW50ZWdlciBERUZBVUxUX1NDQUxFID0gSW50ZWdlci52YWx1ZU9mKDApOwotCQlTdHJpbmcgREVGQVVMVF9TQ0FMRV9QUk9QRVJUWSA9ICJkZWZhdWx0U2NhbGVQcm9wZXJ0eSI7Ci0KLQlJbnRlZ2VyIGdldFNwZWNpZmllZFNjYWxlKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyIG5ld1NwZWNpZmllZFNjYWxlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9TQ0FMRV9QUk9QRVJUWSA9ICJzcGNpZmllZFNjYWxlUHJvcGVydHkiOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBmb3VuZCBvbiB0aGUgZGF0YXNvdXJjZQotCSAqLwotCWJvb2xlYW4gaXNSZXNvbHZlZCgpOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQ29sdW1uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQ29sdW1uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTZhZDIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0NvbHVtbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sdW1uTWFwcGluZyBleHRlbmRzIEpwYUNvbnRleHROb2RlLCBDb2x1bW4uT3duZXIKLXsKLQlDb2x1bW4gZ2V0Q29sdW1uKCk7Ci0JCi0JVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCk7Ci0Jdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgdmFsdWUpOwotCQlTdHJpbmcgVEVNUE9SQUxfUFJPUEVSVFkgPSAidGVtcG9yYWxQcm9wZXJ0eSI7Ci0KLX0gCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9EaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9EaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YmUzMWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIGV4dGVuZHMgTmFtZWRDb2x1bW4KLXsKLQlTdHJpbmcgREVGQVVMVF9OQU1FID0gIkRUWVBFIjsKLQotCURpc2NyaW1pbmF0b3JUeXBlIGdldERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0KLQlEaXNjcmltaW5hdG9yVHlwZSBnZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKTsKLQkJU3RyaW5nIERFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZID0gImRlZmF1bHREaXNjcmltaW5hdG9yVHlwZVByb3BlcnR5IjsKLQkJRGlzY3JpbWluYXRvclR5cGUgREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEUgPSBEaXNjcmltaW5hdG9yVHlwZS5TVFJJTkc7Ci0JCQotCURpc2NyaW1pbmF0b3JUeXBlIGdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZSBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlUHJvcGVydHkiOwotCi0KLQlJbnRlZ2VyIGdldExlbmd0aCgpOwotCi0JSW50ZWdlciBnZXREZWZhdWx0TGVuZ3RoKCk7Ci0JCUludGVnZXIgREVGQVVMVF9MRU5HVEggPSBJbnRlZ2VyLnZhbHVlT2YoMzEpOwotCQlTdHJpbmcgREVGQVVMVF9MRU5HVEhfUFJPUEVSVFkgPSAiZGVmYXVsdExlbmd0aFByb3BlcnR5IjsKLQotCUludGVnZXIgZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlciB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZID0gInNwY2lmaWVkTGVuZ3RoUHJvcGVydHkiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9EaXNjcmltaW5hdG9yVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRGlzY3JpbWluYXRvclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxNDZmNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9EaXNjcmltaW5hdG9yVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgewotCi0JU1RSSU5HLAotCUNIQVIsCi0JSU5URUdFUjsKLQkKLQotCXB1YmxpYyBzdGF0aWMgRGlzY3JpbWluYXRvclR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUgamF2YURpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCWlmIChqYXZhRGlzY3JpbWluYXRvclR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChqYXZhRGlzY3JpbWluYXRvclR5cGUpIHsKLQkJCWNhc2UgU1RSSU5HOgotCQkJCXJldHVybiBTVFJJTkc7Ci0JCQljYXNlIENIQVI6Ci0JCQkJcmV0dXJuIENIQVI7Ci0JCQljYXNlIElOVEVHRVI6Ci0JCQkJcmV0dXJuIElOVEVHRVI7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZGlzY3JpbWluYXRvciB0eXBlOiAiICsgamF2YURpc2NyaW1pbmF0b3JUeXBlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSkgewotCQlpZiAoZGlzY3JpbWluYXRvclR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChkaXNjcmltaW5hdG9yVHlwZSkgewotCQkJY2FzZSBTVFJJTkc6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HOwotCQkJY2FzZSBDSEFSOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlLkNIQVI7Ci0JCQljYXNlIElOVEVHRVI6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUjsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBkaXNjcmltaW5hdG9yIHR5cGU6ICIgKyBkaXNjcmltaW5hdG9yVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERpc2NyaW1pbmF0b3JUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZSBvcm1EaXNjcmltaW5hdG9yVHlwZSkgewotCQlpZiAob3JtRGlzY3JpbWluYXRvclR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChvcm1EaXNjcmltaW5hdG9yVHlwZSkgewotCQkJY2FzZSBTVFJJTkc6Ci0JCQkJcmV0dXJuIFNUUklORzsKLQkJCWNhc2UgQ0hBUjoKLQkJCQlyZXR1cm4gQ0hBUjsKLQkJCWNhc2UgSU5URUdFUjoKLQkJCQlyZXR1cm4gSU5URUdFUjsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBkaXNjcmltaW5hdG9yIHR5cGU6ICIgKyBvcm1EaXNjcmltaW5hdG9yVHlwZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCWlmIChkaXNjcmltaW5hdG9yVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGRpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCQljYXNlIFNUUklORzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlLlNUUklORzsKLQkJCWNhc2UgQ0hBUjoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlLkNIQVI7Ci0JCQljYXNlIElOVEVHRVI6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGRpc2NyaW1pbmF0b3IgdHlwZTogIiArIGRpc2NyaW1pbmF0b3JUeXBlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRW1iZWRkYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWY0ZDE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0VtYmVkZGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW1iZWRkYWJsZSBleHRlbmRzIFR5cGVNYXBwaW5nIHsKLQkvLyBub3RoaW5nIHlldAotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9FbWJlZGRlZElkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRW1iZWRkZWRJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmNzFkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9FbWJlZGRlZElkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFbWJlZGRlZElkTWFwcGluZyBleHRlbmRzIEJhc2VFbWJlZGRlZE1hcHBpbmcKLXsKLQkvL25vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9FbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0VtYmVkZGVkTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGZhNTEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0VtYmVkZGVkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFbWJlZGRlZE1hcHBpbmcgZXh0ZW5kcyBCYXNlRW1iZWRkZWRNYXBwaW5nCi17Ci0JLy9ub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9FbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3ZGI4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9FbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFbnRpdHkgZXh0ZW5kcyBUeXBlTWFwcGluZywgR2VuZXJhdG9ySG9sZGVyLCBRdWVyeUhvbGRlciwgSWRDbGFzcwotewotCS8vICoqKioqKioqKioqKioqKiogbmFtZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lLCBzcGVjaWZpZWQgb3IgZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIG5hbWUgb24gdGhlIGVudGl0eS4KLQkgKi8KLQl2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZE5hbWVQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IG5hbWUsIGJhc2VkIG9uIHRoZSBjbGFzcyBuYW1lLgotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0TmFtZSgpOwotCQlTdHJpbmcgREVGQVVMVF9OQU1FX1BST1BFUlRZID0gImRlZmF1bHROYW1lUHJvcGVydHkiOwotCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB0YWJsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUgZm9yIHRoaXMgZW50aXR5LCBlaXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHQuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCVRhYmxlIGdldFRhYmxlKCk7Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogc2Vjb25kYXJ5IHRhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgc2Vjb25kYXJ5IHRhYmxlcyB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0LgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIFNlY29uZGFyeVRhYmxlPiBMaXN0SXRlcmF0b3I8VD4gc2Vjb25kYXJ5VGFibGVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2Vjb25kYXJ5IHRhYmxlcywgYm90aCBzcGVjaWZpZWQgYW5kIGRlZmF1bHQuCi0JICovCi0JaW50IHNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQgc2Vjb25kYXJ5IHRhYmxlcy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBTZWNvbmRhcnlUYWJsZT4gTGlzdEl0ZXJhdG9yPFQ+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGVzLgotCSAqLwotCWludCBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCk7Ci0JCi0JLyoqCi0JICogQWRkIGEgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZSB0byB0aGUgZW50aXR5IHJldHVybiB0aGUgb2JqZWN0IAotCSAqIHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlTZWNvbmRhcnlUYWJsZSBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZSBmcm9tIHRoZSBlbnRpdHkuCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZSBhdCB0aGUgaW5kZXggZnJvbSB0aGUgZW50aXR5LgotCSAqLwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpOwotCQotCS8qKgotCSAqIE1vdmUgdGhlIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGUgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCA9ICJzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNMaXN0IjsKLQkKLQkJCi0JLy8gKioqKioqKioqKioqKioqKiBpbmhlcml0YW5jZSBzdHJhdGVneSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUluaGVyaXRhbmNlVHlwZSBnZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JCi0JSW5oZXJpdGFuY2VUeXBlIGdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JCVN0cmluZyBERUZBVUxUX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZID0gImRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5UHJvcGVydHkiOwotCQkKLQlJbmhlcml0YW5jZVR5cGUgZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgbmV3SW5oZXJpdGFuY2VUeXBlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5UHJvcGVydHkiOwotCQotCQkKLQkvLyAqKioqKioqKioqKioqKioqIGRpc2NyaW1pbmF0b3IgY29sdW1uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQotCURpc2NyaW1pbmF0b3JDb2x1bW4gZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBkaXNjcmltaW5hdG9yIHZhbHVlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JU3RyaW5nIGdldERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQotCVN0cmluZyBnZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCVN0cmluZyBERUZBVUxUX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFkgPSAiZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZVByb3BlcnR5IjsKLQotCVN0cmluZyBnZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQl2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlUHJvcGVydHkiOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBEaXNjcmltaW5hdG9yVmFsdWUgaXMgYWxsb3dlZCBmb3IgdGhpcyBFbnRpdHkKLQkgKiBJdCBpcyBhbGxvd2VkIGlmIHRoZSBJVHlwZSBpcyBjb25jcmV0ZSAobm90IGFic3RyYWN0KQotCSAqLwotCWJvb2xlYW4gaXNEaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKCk7Ci0gCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9WQUxVRV9BTExPV0VEX1BST1BFUlRZID0gImRpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWRQcm9wZXJ0eSI7Ci0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JPFQgZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gTGlzdEl0ZXJhdG9yPFQ+IHByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCi0JaW50IHByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQotCTxUIGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW4+IExpc3RJdGVyYXRvcjxUPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCA9ICJzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0IjsKLQotCWludCBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0KLQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJU3RyaW5nIERFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4gPSAiZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uIjsKLQotCVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQl2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQl2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQotCXZvaWQgbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCQotCS8vICoqKioqKioqKioqKioqKiogYXR0cmlidXRlIG92ZXJyaWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgYXR0cmlidXRlIG92ZXJyaWRlcyB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0LgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBMaXN0SXRlcmF0b3I8VD4gYXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlIG92ZXJyaWRlcywgYm90aCBzcGVjaWZpZWQgYW5kIGRlZmF1bHQuCi0JICovCi0JaW50IGF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4gIE5vIGFkZC9yZW1vdmUgZm9yIHNwZWNpZmllZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzLCB0aGUKLQkgKiB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgd2lsbCBiZSBwb3B1bGF0ZWQgZnJvbSBzdXBlcmNsYXNzZXMsIHRoZW4gdXNlCi0JICoge0BsaW5rIEF0dHJpYnV0ZU92ZXJyaWRlI3NldFZpcnR1YWwoYm9vbGVhbil9IHRvIGFkZC9yZW1vdmUgdGhlIGF0dHJpYnV0ZQotCSAqIG92ZXJyaWRlIGZyb20gdGhlIHNvdXJjZQotCSAqLwotCTxUIGV4dGVuZHMgQXR0cmlidXRlT3ZlcnJpZGU+IExpc3RJdGVyYXRvcjxUPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcy4KLQkgKi8KLQlpbnQgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzLCB0aG9zZSBub3Qgc3BlY2lmaWVkLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBMaXN0SXRlcmF0b3I8VD4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVmYXVsdCBhdHRyaWJ1dGUgb3ZlcnJpZGVzLgotCSAqLwotCWludCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCQotCS8qKgotCSAqIE1vdmUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgb3ZlcnJpZGUgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCA9ICJzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0IjsKLQkJU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNUID0gInZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNMaXN0IjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXR0cmlidXRlIG92ZXJyaWRlcywgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdCwKLQkgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqLwotCUF0dHJpYnV0ZU92ZXJyaWRlIGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLy8gKioqKioqKioqKioqKioqKiBhc3NvY2lhdGlvbiBvdmVycmlkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBhc3NvY2lhdGlvbiBvdmVycmlkZXMgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlPiBMaXN0SXRlcmF0b3I8VD4gYXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhc3NvY2lhdGlvbiBvdmVycmlkZXMsIGJvdGggc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgotCSAqLwotCWludCBhc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGVzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4gIE5vIGFkZC9yZW1vdmUgZm9yIHNwZWNpZmllZCBhc3NvY2lhdGlvbiBvdmVycmlkZXMsIHRoZQotCSAqIHZpcnR1YWwgYXNzb2NpYXRpb24gb3ZlcnJpZGVzIHdpbGwgYmUgcG9wdWxhdGVkIGZyb20gc3VwZXJjbGFzc2VzLCB0aGVuIHVzZQotCSAqIHtAbGluayBBc3NvY2lhdGlvbk92ZXJyaWRlI3NldFZpcnR1YWwoYm9vbGVhbil9IHRvIGFkZC9yZW1vdmUgdGhlIGFzc29jaWF0aW9uCi0JICogb3ZlcnJpZGUgZnJvbSB0aGUgc291cmNlCi0JICovCi0JPFQgZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlPiBMaXN0SXRlcmF0b3I8VD4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGVzLgotCSAqLwotCWludCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGRlZmF1bHQgYXNzb2NpYXRpb24gb3ZlcnJpZGVzLgotCSAqLwotCTxUIGV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZT4gTGlzdEl0ZXJhdG9yPFQ+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVmYXVsdCBhc3NvY2lhdGlvbiBvdmVycmlkZXMuCi0JICovCi0JaW50IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKTsKLQotCS8qKgotCSAqIE1vdmUgdGhlIHNwZWNpZmllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJU3RyaW5nIFNQRUNJRklFRF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCA9ICJzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc0xpc3QiOwotCQlTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCA9ICJ2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNMaXN0IjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdWx0aW1hdGUgdG9wIG9mIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIHJldHVybiBudWxsLiBUaGUgcm9vdAotCSAqIGlzIGRlZmluZWQgYXMgdGhlIHBlcnNpc3RlbnQgdHlwZSBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0JICogdGhhdCBoYXMgbm8gcGFyZW50LiAgVGhlIHJvb3Qgc2hvdWxkIGJlIGFuIGVudGl0eQotCSAqICAKLQkgKiBOb24tZW50aXRpZXMgaW4gdGhlIGhpZXJhcmNoeSBzaG91bGQgYmUgaWdub3JlZCwgaWUgc2tpcAotCSAqIG92ZXIgdGhlbSBpbiB0aGUgc2VhcmNoIGZvciB0aGUgcm9vdC4gCi0JICovCi0JRW50aXR5IGdldFJvb3RFbnRpdHkoKTsKLQotCS8qKgotCSAqIFRoZSBmaXJzdCBwYXJlbnQgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeSB0aGF0IGlzIGFuIGVudGl0eS4gCi0JICogVGhpcyBpcyB0aGUgcGFyZW50IGluIHRoZSBlbnRpdHkgKHBlcnNpc3RlbnQpIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotCSAqICh2cyBjbGFzcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkpCi0JICovCi0JRW50aXR5IGdldFBhcmVudEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkncyBwcmltYXJ5IGtleSBjb2x1bW4uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVudGl0eSdzIHByaW1hcnkga2V5IGlzICJjb21wb3VuZCIKLQkgKiAoaS5lLiB0aGUgcHJpbWFyeSBrZXkgaXMgY29tcG9zZWQgb2YgbXVsdGlwbGUgY29sdW1ucykuCi0JICovCi0JU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0VudW1UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9FbnVtVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWZhYjBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0VudW1UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZW51bSBFbnVtVHlwZSB7Ci0KLQlPUkRJTkFMLAotCVNUUklORzsKLQkKLQotCXB1YmxpYyBzdGF0aWMgRW51bVR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUgamF2YUVudW1UeXBlKSB7Ci0JCWlmIChqYXZhRW51bVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChqYXZhRW51bVR5cGUpIHsKLQkJCWNhc2UgT1JESU5BTDoKLQkJCQlyZXR1cm4gT1JESU5BTDsKLQkJCWNhc2UgU1RSSU5HOgotCQkJCXJldHVybiBTVFJJTkc7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZW51bSB0eXBlOiAiICsgamF2YUVudW1UeXBlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChFbnVtVHlwZSBlbnVtVHlwZSkgewotCQlpZiAoZW51bVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChlbnVtVHlwZSkgewotCQkJY2FzZSBPUkRJTkFMOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLk9SRElOQUw7Ci0JCQljYXNlIFNUUklORzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkc7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZW51bSB0eXBlOiAiICsgZW51bVR5cGUpOwotCQl9Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBFbnVtVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUgb3JtRW51bVR5cGUpIHsKLQkJaWYgKG9ybUVudW1UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAob3JtRW51bVR5cGUpIHsKLQkJCWNhc2UgT1JESU5BTDoKLQkJCQlyZXR1cm4gT1JESU5BTDsKLQkJCWNhc2UgU1RSSU5HOgotCQkJCXJldHVybiBTVFJJTkc7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZW51bSB0eXBlOiAiICsgb3JtRW51bVR5cGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChFbnVtVHlwZSBlbnVtVHlwZSkgewotCQlpZiAoZW51bVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChlbnVtVHlwZSkgewotCQkJY2FzZSBPUkRJTkFMOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTDsKLQkJCWNhc2UgU1RSSU5HOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGVudW0gdHlwZTogIiArIGVudW1UeXBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0ZldGNoVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRmV0Y2hUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YWFkZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRmV0Y2hUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZW51bSBGZXRjaFR5cGUgewotCi0JRUFHRVIsCi0JTEFaWTsKLQkKLQotCXB1YmxpYyBzdGF0aWMgRmV0Y2hUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZSBqYXZhRmV0Y2hUeXBlKSB7Ci0JCWlmIChqYXZhRmV0Y2hUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YUZldGNoVHlwZSkgewotCQkJY2FzZSBFQUdFUjoKLQkJCQlyZXR1cm4gRUFHRVI7Ci0JCQljYXNlIExBWlk6Ci0JCQkJcmV0dXJuIExBWlk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZmV0Y2ggdHlwZTogIiArIGphdmFGZXRjaFR5cGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEZldGNoVHlwZSBmZXRjaFR5cGUpIHsKLQkJaWYgKGZldGNoVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGZldGNoVHlwZSkgewotCQkJY2FzZSBFQUdFUjoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVI7Ci0JCQljYXNlIExBWlk6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZmV0Y2ggdHlwZTogIiArIGZldGNoVHlwZSk7Ci0JCX0KLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIEZldGNoVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIG9ybUZldGNoVHlwZSkgewotCQlpZiAob3JtRmV0Y2hUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAob3JtRmV0Y2hUeXBlKSB7Ci0JCQljYXNlIEVBR0VSOgotCQkJCXJldHVybiBFQUdFUjsKLQkJCWNhc2UgTEFaWToKLQkJCQlyZXR1cm4gTEFaWTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBmZXRjaCB0eXBlOiAiICsgb3JtRmV0Y2hUeXBlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEZldGNoVHlwZSBmZXRjaFR5cGUpIHsKLQkJaWYgKGZldGNoVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGZldGNoVHlwZSkgewotCQkJY2FzZSBFQUdFUjoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUjsKLQkJCWNhc2UgTEFaWToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGZldGNoIHR5cGU6ICIgKyBmZXRjaFR5cGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9GZXRjaGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0ZldGNoYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2UzZDJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0ZldGNoYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBGZXRjaGFibGUgZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JRmV0Y2hUeXBlIGdldEZldGNoKCk7Ci0KLQlGZXRjaFR5cGUgZ2V0RGVmYXVsdEZldGNoKCk7Ci0JCVN0cmluZyBERUZBVUxUX0ZFVENIX1BST1BFUlRZID0gImRlZmF1bHRGZXRjaFByb3BlcnR5IjsKLQkJCi0JRmV0Y2hUeXBlIGdldFNwZWNpZmllZEZldGNoKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUgbmV3U3BlY2lmaWVkRmV0Y2gpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZID0gInNwZWNpZmllZEZldGNoUHJvcGVydHkiOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdGVkVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0dlbmVyYXRlZFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZDg3M2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdGVkVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCi0JR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKTsKLQlHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0U3RyYXRlZ3koKTsKLQlHZW5lcmF0aW9uVHlwZSBnZXRTcGVjaWZpZWRTdHJhdGVneSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkU3RyYXRlZ3koR2VuZXJhdGlvblR5cGUgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1NUUkFURUdZX1BST1BFUlRZID0gInNwZWNpZmllZFN0cmF0ZWd5UHJvcGVydHkiOwotCQlTdHJpbmcgREVGQVVMVF9TVFJBVEVHWV9QUk9QRVJUWSA9ICJkZWZhdWx0U3RyYXRlZ3lQcm9wZXJ0eSI7Ci0JCi0JU3RyaW5nIGdldEdlbmVyYXRvcigpOwotCVN0cmluZyBnZXREZWZhdWx0R2VuZXJhdG9yKCk7Ci0JCUdlbmVyYXRpb25UeXBlIERFRkFVTFRfU1RSQVRFR1kgPSBHZW5lcmF0aW9uVHlwZS5BVVRPOwotCVN0cmluZyBnZXRTcGVjaWZpZWRHZW5lcmF0b3IoKTsKLQl2b2lkIHNldFNwZWNpZmllZEdlbmVyYXRvcihTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0dFTkVSQVRPUl9QUk9QRVJUWSA9ICJzcGVjaWZpZWRHZW5lcmF0b3JQcm9wZXJ0eSI7Ci0JCVN0cmluZyBERUZBVUxUX0dFTkVSQVRPUl9QUk9QRVJUWSA9ICJkZWZhdWx0R2VuZXJhdG9yUHJvcGVydHkiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9HZW5lcmF0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2OTkwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9HZW5lcmF0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsKLQotCVRBQkxFLAotCVNFUVVFTkNFLAotCUlERU5USVRZLAotCUFVVE87Ci0JCi0KLQlwdWJsaWMgc3RhdGljIEdlbmVyYXRpb25UeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRpb25UeXBlIGphdmFHZW5lcmF0aW9uVHlwZSkgewotCQlpZiAoamF2YUdlbmVyYXRpb25UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YUdlbmVyYXRpb25UeXBlKSB7Ci0JCQljYXNlIFRBQkxFOgotCQkJCXJldHVybiBUQUJMRTsKLQkJCWNhc2UgU0VRVUVOQ0U6Ci0JCQkJcmV0dXJuIFNFUVVFTkNFOwotCQkJY2FzZSBJREVOVElUWToKLQkJCQlyZXR1cm4gSURFTlRJVFk7Ci0JCQljYXNlIEFVVE86Ci0JCQkJcmV0dXJuIEFVVE87Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZ2VuZXJhdGlvbiB0eXBlOiAiICsgamF2YUdlbmVyYXRpb25UeXBlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChHZW5lcmF0aW9uVHlwZSBnZW5lcmF0aW9uVHlwZSkgewotCQlpZiAoZ2VuZXJhdGlvblR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChnZW5lcmF0aW9uVHlwZSkgewotCQkJY2FzZSBUQUJMRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZS5UQUJMRTsKLQkJCWNhc2UgU0VRVUVOQ0U6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0U7Ci0JCQljYXNlIElERU5USVRZOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRpb25UeXBlLklERU5USVRZOwotCQkJY2FzZSBBVVRPOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRpb25UeXBlLkFVVE87Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZ2VuZXJhdGlvbiB0eXBlOiAiICsgZ2VuZXJhdGlvblR5cGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHZW5lcmF0aW9uVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUgb3JtR2VuZXJhdGlvblR5cGUpIHsKLQkJaWYgKG9ybUdlbmVyYXRpb25UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAob3JtR2VuZXJhdGlvblR5cGUpIHsKLQkJCWNhc2UgVEFCTEU6Ci0JCQkJcmV0dXJuIFRBQkxFOwotCQkJY2FzZSBTRVFVRU5DRToKLQkJCQlyZXR1cm4gU0VRVUVOQ0U7Ci0JCQljYXNlIElERU5USVRZOgotCQkJCXJldHVybiBJREVOVElUWTsKLQkJCWNhc2UgQVVUTzoKLQkJCQlyZXR1cm4gQVVUTzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBnZW5lcmF0aW9uIHR5cGU6ICIgKyBvcm1HZW5lcmF0aW9uVHlwZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEdlbmVyYXRpb25UeXBlIGdlbmVyYXRpb25UeXBlKSB7Ci0JCWlmIChnZW5lcmF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGdlbmVyYXRpb25UeXBlKSB7Ci0JCQljYXNlIFRBQkxFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUuVEFCTEU7Ci0JCQljYXNlIFNFUVVFTkNFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0U7Ci0JCQljYXNlIElERU5USVRZOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUuSURFTlRJVFk7Ci0JCQljYXNlIEFVVE86Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZS5BVVRPOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGdlbmVyYXRpb24gdHlwZTogIiArIGdlbmVyYXRpb25UeXBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0dlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzODBhY2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJhdG9yIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqKioqKioqIG5hbWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsKLQkKLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogaW5pdGlhbCB2YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlJbnRlZ2VyIGdldEluaXRpYWxWYWx1ZSgpOwotCQotCVN0cmluZyBERUZBVUxUX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFkgPSAiZGVmYXVsdEluaXRpYWxWYWx1ZVByb3BlcnR5IjsKLQkKLQlJbnRlZ2VyIGdldERlZmF1bHRJbml0aWFsVmFsdWUoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkSW5pdGlhbFZhbHVlUHJvcGVydHkiOwotCQotCUludGVnZXIgZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCk7Ci0JCi0Jdm9pZCBzZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlciB2YWx1ZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBhbGxvY2F0aW9uIHNpemUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUludGVnZXIgZ2V0QWxsb2NhdGlvblNpemUoKTsKLQkKLQlTdHJpbmcgREVGQVVMVF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFkgPSAiZGVmYXVsdEFsbG9jYXRpb25TaXplUHJvcGVydHkiOwotCQotCUludGVnZXIgREVGQVVMVF9BTExPQ0FUSU9OX1NJWkUgPSBJbnRlZ2VyLnZhbHVlT2YoNTApOwotCQotCUludGVnZXIgZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCk7Ci0JCQotCVN0cmluZyBTUEVDSUZJRURfQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZID0gInNwZWNpZmllZEFsbG9jYXRpb25TaXplUHJvcGVydHkiOwotCQotCUludGVnZXIgZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKTsKLQkKLQl2b2lkIHNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIgdmFsdWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGdlbmVyYXRvciBvdmVycmlkZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIHNwZWNpZmllZAotCSAqIGdlbmVyYXRvcgotCSAqIChmb3IgZXhhbXBsZSwgYSBnZW5lcmF0b3IgZGVmaW5lZCBpbiBvcm0ueG1sIG92ZXJyaWRlcyBvbmUgZGVmaW5lZCBpbiBqYXZhKQotCSAqLwotCWJvb2xlYW4gb3ZlcnJpZGVzKEdlbmVyYXRvciBnZW5lcmF0b3IpOwotCQotCQotCWJvb2xlYW4gaXNWaXJ0dWFsKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0dlbmVyYXRvckhvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdG9ySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjRlZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdG9ySG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRvckhvbGRlciBleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLy8qKioqKioqKioqKioqKioqKioqKiB0YWJsZSBnZW5lcmF0b3IgKioqKioqKioqKioqKioqKioKLQlUYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpOwotCi0JVGFibGVHZW5lcmF0b3IgYWRkVGFibGVHZW5lcmF0b3IoKTsKLQotCXZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKLQotCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFkgPSAidGFibGVHZW5lcmF0b3JQcm9wZXJ0eSI7Ci0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKioqIHNlcXVlbmNlIGdlbmVyYXRvciAqKioqKioqKioqKioqKioqKgotCVNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0KLQlTZXF1ZW5jZUdlbmVyYXRvciBhZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0Jdm9pZCByZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0JU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSA9ICJzZXF1ZW5jZUdlbmVyYXRvclByb3BlcnR5IjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9JZENsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9JZENsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MmFlMjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSWRDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJZENsYXNzIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlTdHJpbmcgZ2V0SWRDbGFzcygpOwotCQotCXZvaWQgc2V0SWRDbGFzcyhTdHJpbmcgdmFsdWUpOwotCQotCQlTdHJpbmcgSURfQ0xBU1NfUFJPUEVSVFkgPSAiaWRDbGFzc1Byb3BlcnR5IjsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0lkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmM2Y3ZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElkTWFwcGluZyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcsIENvbHVtbk1hcHBpbmcsIEdlbmVyYXRvckhvbGRlcgotewotCUdlbmVyYXRlZFZhbHVlIGdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JR2VuZXJhdGVkVmFsdWUgYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQl2b2lkIHJlbW92ZUdlbmVyYXRlZFZhbHVlKCk7Ci0JCVN0cmluZyBHRU5FUkFURURfVkFMVUVfUFJPUEVSVFkgPSAiZ2VuZXJhdGVkVmFsdWVQcm9wZXJ0eSI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0luaGVyaXRhbmNlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSW5oZXJpdGFuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NGI4MDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSW5oZXJpdGFuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUgewotCi0KLQlTSU5HTEVfVEFCTEUsCi0JSk9JTkVELAotCVRBQkxFX1BFUl9DTEFTUzsKLQotCi0JcHVibGljIHN0YXRpYyBJbmhlcml0YW5jZVR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlIGphdmFJbmhlcml0YW5jZVR5cGUpIHsKLQkJaWYgKGphdmFJbmhlcml0YW5jZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChqYXZhSW5oZXJpdGFuY2VUeXBlKSB7Ci0JCQljYXNlIFNJTkdMRV9UQUJMRToKLQkJCQlyZXR1cm4gU0lOR0xFX1RBQkxFOwotCQkJY2FzZSBKT0lORUQ6Ci0JCQkJcmV0dXJuIEpPSU5FRDsKLQkJCWNhc2UgVEFCTEVfUEVSX0NMQVNTOgotCQkJCXJldHVybiBUQUJMRV9QRVJfQ0xBU1M7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gaW5oZXJpdGFuY2UgdHlwZTogIiArIGphdmFJbmhlcml0YW5jZVR5cGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChJbmhlcml0YW5jZVR5cGUgaW5oZXJpdGFuY2VUeXBlKSB7Ci0JCWlmIChpbmhlcml0YW5jZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChpbmhlcml0YW5jZVR5cGUpIHsKLQkJCWNhc2UgU0lOR0xFX1RBQkxFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEU7Ci0JCQljYXNlIEpPSU5FRDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUuSk9JTkVEOwotCQkJY2FzZSBUQUJMRV9QRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBpbmhlcml0YW5jZSB0eXBlOiAiICsgaW5oZXJpdGFuY2VUeXBlKTsKLQkJfQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgSW5oZXJpdGFuY2VUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUgb3JtSW5oZXJpdGFuY2VUeXBlKSB7Ci0JCWlmIChvcm1Jbmhlcml0YW5jZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChvcm1Jbmhlcml0YW5jZVR5cGUpIHsKLQkJCWNhc2UgU0lOR0xFX1RBQkxFOgotCQkJCXJldHVybiBTSU5HTEVfVEFCTEU7Ci0JCQljYXNlIEpPSU5FRDoKLQkJCQlyZXR1cm4gSk9JTkVEOwotCQkJY2FzZSBUQUJMRV9QRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIFRBQkxFX1BFUl9DTEFTUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBpbmhlcml0YW5jZSB0eXBlOiAiICsgb3JtSW5oZXJpdGFuY2VUeXBlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEluaGVyaXRhbmNlVHlwZSBpbmhlcml0YW5jZVR5cGUpIHsKLQkJaWYgKGluaGVyaXRhbmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGluaGVyaXRhbmNlVHlwZSkgewotCQkJY2FzZSBTSU5HTEVfVEFCTEU6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFOwotCQkJY2FzZSBKT0lORUQ6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUuSk9JTkVEOwotCQkJY2FzZSBUQUJMRV9QRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGluaGVyaXRhbmNlIHR5cGU6ICIgKyBpbmhlcml0YW5jZVR5cGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Kb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Kb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OGExMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKb2luQ29sdW1uIGV4dGVuZHMgQmFzZUNvbHVtbiwgQmFzZUpvaW5Db2x1bW4KLXsKLQlKb2luQ29sdW1uLk93bmVyIGdldE93bmVyKCk7Ci0KLQkvKioKLQkgKiBpbnRlcmZhY2UgYWxsb3dpbmcgam9pbiBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCi0JICogKGUuZy4gMToxIG1hcHBpbmdzIGFuZCBqb2luIHRhYmxlcykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbi5Pd25lciwgQmFzZUNvbHVtbi5Pd25lcgotCXsKLQkJLyoqCi0JCSAqIHJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGFibGUgY2Fubm90IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkCi0JCSAqIGluIHRoZSBqb2luIGNvbHVtbidzICd0YWJsZScgZWxlbWVudAotCQkgKi8KLQkJYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSk7Ci0KLQkJLyoqCi0JCSAqIHJldHVybiB3aGV0aGVyIHRoZSBqb2luIGNvbHVtbidzIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQgZXhwbGljaXRseQotCQkgKi8KLQkJYm9vbGVhbiB0YWJsZUlzQWxsb3dlZCgpOwotCi0JCS8qKgotCQkgKiByZXR1cm4gdGhlIGVudGl0eSByZWZlcmVuY2VkIGJ5IHRoZSBqb2luIGNvbHVtbgotCQkgKi8KLQkJRW50aXR5IGdldFRhcmdldEVudGl0eSgpOwotCi0JCS8qKgotCQkgKiByZXR1cm4gdGhlIGpvaW4gY29sdW1uJ3MgYXR0cmlidXRlIG5hbWUKLQkJICovCi0JCVN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIHJldHVybiB0aGUgcmVsYXRpb25zaGlwIG1hcHBpbmcgZm9yIHRoaXMgam9pbiBjb2x1bW4KLQkJICovCi0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQkKLQkJLyoqCi0JCSAqIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgam9pbkNvbHVtbnMgY29sbGVjdGlvbiB0aGlzIGpvaW4gY29sdW1uIGlzIGEgcGFydCBvZgotCQkgKi8KLQkJaW50IGpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pvaW5UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSm9pblRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTMyZmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSm9pblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSm9pblRhYmxlIGV4dGVuZHMgVGFibGUKLXsKLQotCVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UGFyZW50KCk7Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBqb2luIGNvbHVtbnMgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gam9pbkNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGpvaW4gY29sdW1ucywgYm90aCBzcGVjaWZpZWQgYW5kIGRlZmF1bHQuCi0JICovCi0JaW50IGpvaW5Db2x1bW5zU2l6ZSgpOwotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCTxUIGV4dGVuZHMgSm9pbkNvbHVtbj4gTGlzdEl0ZXJhdG9yPFQ+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QgPSAic3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0IjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgam9pbiBjb2x1bW5zLgotCSAqLwotCWludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBqb2luIGNvbHVtbiBvciBudWxsLiAgQSBkZWZhdWx0IGpvaW4gY29sdW1uCi0JICogb25seSBleGlzdHMgaWYgdGhlcmUgYXJlIG5vIHNwZWNpZmllZCBqb2luIGNvbHVtbnMuCi0JICovCi0JSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQlTdHJpbmcgREVGQVVMVF9KT0lOX0NPTFVNTiA9ICJkZWZhdWx0Sm9pbkNvbHVtbiI7Ci0JCQotCS8qKgotCSAqIEFkZCBhIHNwZWNpZmllZCBqb2luIGNvbHVtbiB0byB0aGUgam9pbiB0YWJsZSByZXR1cm4gdGhlIG9iamVjdCAKLQkgKiByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gZnJvbSB0aGUgam9pbiB0YWJsZS4KLQkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbiBhdCB0aGUgaW5kZXggZnJvbSB0aGUgam9pbiB0YWJsZS4KLQkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKTsKLQkKLQkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0JYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCi0KLQkvLyAqKioqKioqKioqKioqKioqIGludmVyc2Ugam9pbiBjb2x1bW5zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgaW52ZXJzZSBqb2luIGNvbHVtbnMgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gaW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaW52ZXJzZSBqb2luIGNvbHVtbnMsIGJvdGggc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgotCSAqLwotCWludCBpbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgc3BlY2lmaWVkIGludmVyc2Ugam9pbiBjb2x1bW5zLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIEpvaW5Db2x1bW4+IExpc3RJdGVyYXRvcjxUPiBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUID0gInNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc0xpc3QiOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNwZWNpZmllZCBpbnZlcnNlIGpvaW4gY29sdW1ucy4KLQkgKi8KLQlpbnQgc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IGludmVyc2Ugam9pbiBjb2x1bW4gb3IgbnVsbC4gIEEgZGVmYXVsdCBpbnZlcnNlIGpvaW4gY29sdW1uCi0JICogb25seSBleGlzdHMgaWYgdGhlcmUgYXJlIG5vIHNwZWNpZmllZCBpbnZlcnNlIGpvaW4gY29sdW1ucy4KLQkgKi8KLQlKb2luQ29sdW1uIGdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpOwotCQlTdHJpbmcgREVGQVVMVF9JTlZFUlNFX0pPSU5fQ09MVU1OID0gImRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiI7Ci0JCi0JLyoqCi0JICogQWRkIGEgc3BlY2lmaWVkIGludmVyc2Ugam9pbiBjb2x1bW4gdG8gdGhlIGpvaW4gdGFibGUgcmV0dXJuIHRoZSBvYmplY3QgCi0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpbnZlcnNlIGpvaW4gY29sdW1uIGZyb20gdGhlIGpvaW4gdGFibGUuCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGludmVyc2Ugam9pbiBjb2x1bW4gYXQgdGhlIGluZGV4IGZyb20gdGhlIGpvaW4gdGFibGUuCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pOwotCQotCQotCS8qKgotCSAqIE1vdmUgdGhlIHNwZWNpZmllZCBpbnZlcnNlIGpvaW4gY29sdW1uIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCWJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSnBhQ29udGV4dE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pwYUNvbnRleHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2Y1M2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSnBhQ29udGV4dE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYUNvbnRleHROb2RlIGV4dGVuZHMgSnBhTm9kZQotewotCVBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIEVudGl0eU1hcHBpbmdzIGlmIHRoaXMgY29udGV4dE5vZGUgaXMgd2l0aGluIGFuIG9ybS54bWwgY29udGV4dAotCSAqIFJldHVybiBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpOwotCi0JT3JtUGVyc2lzdGVudFR5cGUgZ2V0T3JtUGVyc2lzdGVudFR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pwYVJvb3RDb250ZXh0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSnBhUm9vdENvbnRleHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNzNlZWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSnBhUm9vdENvbnRleHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVJvb3RDb250ZXh0Tm9kZSBleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZVhtbCBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1hNTF9QUk9QRVJUWSA9ICJwZXJzaXN0ZW5jZVhtbCI7Ci0JCi0JLyoqIAotCSAqIFJldHVybiB0aGUgY29udGVudCByZXByZXNlbnRlZCBieSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgYXNzb2NpYXRlZCB3aXRoIAotCSAqIHRoaXMgcHJvamVjdC4KLQkgKiBUaGlzIG1heSBiZSBudWxsLiAKLQkgKi8KLQlQZXJzaXN0ZW5jZVhtbCBnZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQotCS8qKgotCSAqIEFkZCBhIHBlcnNpc3RlbmNlLnhtbCBmaWxlIHRvIHRoaXMgY29udGVudCBhbmQgcmV0dXJuIHRoZSBjb250ZW50IGFzc29jaWF0ZWQKLQkgKiB3aXRoIGl0LgotCSAqIFRocm93cyB7QGxpbmsgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBpZiBhIHBlcnNpc3RlbmNlLnhtbCBhbHJlYWR5IGV4aXN0cy4KLQkgKi8KLQlQZXJzaXN0ZW5jZVhtbCBhZGRQZXJzaXN0ZW5jZVhtbCgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgZnJvbSB0aGlzIGNvbnRlbnQuCi0JICogVGhyb3dzIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlmIGEgcGVyc2lzdGVuY2UueG1sIGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXZvaWQgcmVtb3ZlUGVyc2lzdGVuY2VYbWwoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSBjb250ZXh0IG1vZGVsIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIEpQQSBwcm9qZWN0Ci0JICovCi0Jdm9pZCB1cGRhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQWxsIHN1YmNsYXNzIGltcGxlbWVudGF0aW9ucyB7QGxpbmsgI2FkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4pfSAKLQkgKiBzaG91bGQgYmUgcHJlY2VkZWQgYnkgYSAic3VwZXIiIGNhbGwgdG8gdGhpcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYW55VG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmFjN2E4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hbnlUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hbnlUb01hbnlNYXBwaW5nIGV4dGVuZHMgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hbnlUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4NTc2Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYW55VG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hbnlUb09uZU1hcHBpbmcgZXh0ZW5kcyBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY0ZWMyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYXBwZWRTdXBlcmNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3MgZXh0ZW5kcyBUeXBlTWFwcGluZywgSWRDbGFzcwotewotCS8vbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L011bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTE0MWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBleHRlbmRzIE5vbk93bmluZ01hcHBpbmcKLXsKLQlGZXRjaFR5cGUgREVGQVVMVF9GRVRDSF9UWVBFID0gRmV0Y2hUeXBlLkxBWlk7Ci0KLQlTdHJpbmcgZ2V0T3JkZXJCeSgpOwotCXZvaWQgc2V0T3JkZXJCeShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgT1JERVJfQllfUFJPUEVSVFkgPSAib3JkZXJCeVByb3BlcnR5IjsKLQotCi0JYm9vbGVhbiBpc05vT3JkZXJpbmcoKTsKLQl2b2lkIHNldE5vT3JkZXJpbmcoYm9vbGVhbiBuZXdOb09yZGVyaW5nKTsKLQkJU3RyaW5nIE5PX09SREVSSU5HX1BST1BFUlRZID0gIm5vT3JkZXJpbmdQcm9wZXJ0eSI7Ci0KLQlib29sZWFuIGlzUGtPcmRlcmluZygpOwotCXZvaWQgc2V0UGtPcmRlcmluZyhib29sZWFuIG5ld1BrT3JkZXJpbmcpOwotCVN0cmluZyBQS19PUkRFUklOR19QUk9QRVJUWSA9ICJwa09yZGVyaW5nUHJvcGVydHkiOwotCi0JYm9vbGVhbiBpc0N1c3RvbU9yZGVyaW5nKCk7Ci0Jdm9pZCBzZXRDdXN0b21PcmRlcmluZyhib29sZWFuIG5ld0N1c3RvbU9yZGVyaW5nKTsKLQlTdHJpbmcgQ1VTVE9NX09SREVSSU5HX1BST1BFUlRZID0gImN1c3RvbU9yZGVyaW5nUHJvcGVydHkiOwotCi0JCi0JSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpOwotCQotCWJvb2xlYW4gaXNKb2luVGFibGVTcGVjaWZpZWQoKTsKLQotCi0JU3RyaW5nIGdldE1hcEtleSgpOwotCXZvaWQgc2V0TWFwS2V5KFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBNQVBfS0VZX1BST1BFUlRZID0gIm1hcEtleVByb3BlcnR5IjsKLQotCUl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L05hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9OYW1lZENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWNhODI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L05hbWVkQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWRDb2x1bW4gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKTsKLQkJU3RyaW5nIERFRkFVTFRfTkFNRV9QUk9QRVJUWSA9ICJkZWZhdWx0TmFtZVByb3BlcnR5IjsKLQotCVN0cmluZyBnZXRTcGVjaWZpZWROYW1lKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWROYW1lKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfTkFNRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWROYW1lUHJvcGVydHkiOwotCi0KLQlTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCi0Jdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBDT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSA9ICJjb2x1bW5EZWZpbml0aW9uUHJvcGVydHkiOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdyYXBwZXIgZm9yIHRoZSBkYXRhc291cmNlIGNvbHVtbgotCSAqLwotCUNvbHVtbiBnZXREYkNvbHVtbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB3cmFwcGVyIGZvciB0aGUgZGF0YXNvdXJjZSB0YWJsZQotCSAqLwotCVRhYmxlIGdldERiVGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgZm91bmQgb24gdGhlIGRhdGFzb3VyY2UuCi0JICovCi0JYm9vbGVhbiBpc1Jlc29sdmVkKCk7Ci0KLQlPd25lciBnZXRPd25lcigpOwotCQotCS8qKgotCSAqIGludGVyZmFjZSBhbGxvd2luZyBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCi0JICogKGUuZy4gYmFzaWMgbWFwcGluZ3MgYW5kIGF0dHJpYnV0ZSBvdmVycmlkZXMpCi0JICovCi0JaW50ZXJmYWNlIE93bmVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcgdGhhdCBjb250YWlucyB0aGUgY29sdW1uLgotCQkgKi8KLQkJVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSB3cmFwcGVyIGZvciB0aGUgZGF0YXNvdXJjZSB0YWJsZSBmb3IgdGhlIGdpdmVuIHRhYmxlIG5hbWUKLQkJICovCi0JCVRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSk7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBkZWZhdWx0IGNvbHVtbiBuYW1lCi0JCSAqLwotCQlTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5M2U5ZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTmFtZWROYXRpdmVRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5IGV4dGVuZHMgUXVlcnkKLXsKLQlTdHJpbmcgZ2V0UmVzdWx0Q2xhc3MoKTsKLQl2b2lkIHNldFJlc3VsdENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBSRVNVTFRfQ0xBU1NfUFJPUEVSVFkgPSAicmVzdWx0Q2xhc3NQcm9wZXJ0eSI7Ci0KLQlTdHJpbmcgZ2V0UmVzdWx0U2V0TWFwcGluZygpOwotCXZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgUkVTVUxUX1NFVF9NQVBQSU5HX1BST1BFUlRZID0gInJlc3VsdFNldE1hcHBpbmdQcm9wZXJ0eSI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L05hbWVkUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L05hbWVkUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5NTIwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9OYW1lZFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkUXVlcnkgZXh0ZW5kcyBRdWVyeSB7Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L05vbk93bmluZ01hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L05vbk93bmluZ01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgzMDMxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Ob25Pd25pbmdNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vbk93bmluZ01hcHBpbmcgZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JU3RyaW5nIGdldE1hcHBlZEJ5KCk7Ci0Jdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgTUFQUEVEX0JZX1BST1BFUlRZID0gIm1hcHBlZEJ5UHJvcGVydHkiOwotCi0JSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0KLQlib29sZWFuIG1hcHBlZEJ5SXNWYWxpZChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBlZEJ5TWFwcGluZyk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9OdWxsYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTnVsbGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyOTJmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9OdWxsYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBmb3IgbWFwcGluZ3MgdGhhdCBzdXBwb3J0IHRoZSBvcHRpb25hbCBlbGVtZW50LgotICogRnJvbSB0aGUgSlBBIHNwZWM6Ci0gKiAJCVdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSBtYXkgYmUgbnVsbC4gVGhpcyBpcyBhIGhpbnQgCi0gKiAJCWFuZCBpcyBkaXNyZWdhcmRlZCBmb3IgcHJpbWl0aXZlIHR5cGVzOyBpdCBtYXkgYmUgdXNlZCBpbiBzY2hlbWEgZ2VuZXJhdGlvbi4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTnVsbGFibGUgZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JQm9vbGVhbiBnZXRPcHRpb25hbCgpOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdE9wdGlvbmFsKCk7Ci0JCVN0cmluZyBERUZBVUxUX09QVElPTkFMX1BST1BFUlRZID0gImRlZmF1bHRPcHRpb25hbFByb3BlcnR5IjsKLQkJQm9vbGVhbiBERUZBVUxUX09QVElPTkFMID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKTsKLQl2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3B0aW9uYWwpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZID0gInNwZWNpZmllZE9wdGlvbmFsUHJvcGVydHkiOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvT25lVG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzlmMmI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L09uZVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT25lVG9NYW55TWFwcGluZyBleHRlbmRzIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyB7Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L09uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvT25lVG9PbmVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTYwN2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPbmVUb09uZU1hcHBpbmcKLQlleHRlbmRzIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcsIE5vbk93bmluZ01hcHBpbmcKLXsKLQkvLyAqKioqKioqKioqKioqKioqIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBqb2luIGNvbHVtbnMsIGJvdGggc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgotCSAqLwotCWludCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JLyoqCi0JICogQWRkIGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uIHRvIHRoZSBqb2luIHRhYmxlIHJldHVybiB0aGUgb2JqZWN0IAotCSAqIHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGpvaW4gY29sdW1uIGZyb20gdGhlIGpvaW4gdGFibGUuCi0JICovCi0Jdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGpvaW4gY29sdW1uIGF0IHRoZSBpbmRleCBmcm9tIHRoZSBqb2luIHRhYmxlLgotCSAqLwotCXZvaWQgcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQotCS8qKgotCSAqIE1vdmUgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbiBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQlib29sZWFuIGNvbnRhaW5zUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCVN0cmluZyBQUklNQVlfS0VZX0pPSU5fQ09MVU1OU19MSVNUID0gInByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3QiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNTIwNWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLQotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW50QXR0cmlidXRlIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUKLXsKLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBrZXkgZm9yIHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nLgotCSAqIFRoZSBrZXkgbWF5IGJlIGZvciBlaXRoZXIgdGhlICJzcGVjaWZpZWQiIG1hcHBpbmcgb3IsIGlmIHRoZSAic3BlY2lmaWVkIgotCSAqIG1hcHBpbmcgaXMgbWlzc2luZywgdGhlICJkZWZhdWx0IiBtYXBwaW5nLgotCSAqLwotCVN0cmluZyBnZXRNYXBwaW5nS2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGtleSBmb3IgdGhlIGF0dHJpYnV0ZSdzICJkZWZhdWx0IiBtYXBwaW5nLgotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0TWFwcGluZ0tleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyAic3BlY2lmaWVkIiBtYXBwaW5nLCBvciBpZiBpdCBpcyBudWxsCi0JICogcmV0dXJuIHRoZSAiZGVmYXVsdCIgbWFwcGluZy4gIFdJbGwgbm90IHJldHVybiBudWxsLgotCSAqLwotCUF0dHJpYnV0ZU1hcHBpbmcgZ2V0TWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyAic3BlY2lmaWVkIiBtYXBwaW5nLCBjb3VsZCBiZSBudWxsCi0JICovCi0JQXR0cmlidXRlTWFwcGluZyBnZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCi0JLyoqCi0JICogQ2xpZW50cyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSdzIG1hcHBpbmcuCi0JICogUGFzc2luZyBpbiBhIG51bGwga2V5IHdpbGwgY2F1c2UgdGhlICJzcGVjaWZpZWQiIG1hcHBpbmcgdG8gYmUKLQkgKiBjbGVhcmVkIGFuZCB0aGUgYXR0cmlidXRlJ3MgbWFwcGluZyB0byBiZSBpdHMgImRlZmF1bHQiIG1hcHBpbmcuCi0JICovCi0Jdm9pZCBzZXRTcGVjaWZpZWRNYXBwaW5nS2V5KFN0cmluZyBrZXkpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX01BUFBJTkdfUFJPUEVSVFkgPSAic3BlY2lmaWVkTWFwcGluZ1Byb3BlcnR5IjsKLQkJU3RyaW5nIERFRkFVTFRfTUFQUElOR19QUk9QRVJUWSA9ICJkZWZhdWx0TWFwcGluZ1Byb3BlcnR5IjsKLQkKLQlUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpOwotCi0JUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQkKLQkvKioKLQkgKiBJZiB0aGUgYXR0cmlidXRlIGlzIG1hcHBlZCB0byBhIHByaW1hcnkga2V5IGNvbHVtbiwgcmV0dXJuIHRoZQotCSAqIGNvbHVtbidzIG5hbWUsIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUncyAiYXR0cmlidXRlIiBtYXBwaW5nIGNhbiBiZSBvdmVycmlkZGVuLgotCSAqLwotCWJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSdzICJhc3NvY2lhdGlvbiIgbWFwcGluZyBjYW4gYmUgb3ZlcnJpZGRlbi4KLQkgKi8KLQlib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSdzICJhdHRyaWJ1dGUiIG1hcHBpbmcgaXMgZm9yIGFuIElELgotCSAqLwotCWJvb2xlYW4gaXNJZEF0dHJpYnV0ZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIGFjdHVhbGx5IGhhcyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24KLQkgKiBpbiBpdHMgdW5kZXJseWluZyByZXNvdXJjZSAoZmFsc2UgPSBubykKLQkgKi8KLQlib29sZWFuIGlzVmlydHVhbCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUGVyc2lzdGVudFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1BlcnNpc3RlbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNzFkMjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUGVyc2lzdGVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbnRUeXBlIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUKLXsKLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOwotCQotCUFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCk7Ci0JCVN0cmluZyBBQ0NFU1NfUFJPUEVSVFkgPSAiYWNjZXNzUHJvcGVydHkiOwotCQkKLQlUeXBlTWFwcGluZyBnZXRNYXBwaW5nKCk7Ci0JU3RyaW5nIGdldE1hcHBpbmdLZXkoKTsKLQl2b2lkIHNldE1hcHBpbmdLZXkoU3RyaW5nIGtleSk7Ci0JCVN0cmluZyBNQVBQSU5HX1BST1BFUlRZID0gIm1hcHBpbmdQcm9wZXJ0eSI7Ci0KLQlib29sZWFuIGlzTWFwcGVkKCk7Ci0JCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhcmVudCB7QGxpbmsgUGVyc2lzdGVudFR5cGV9IGZyb20gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLQkgKiBJZiB0aGUgamF2YSBpbmhlcml0YW5jZSBwYXJlbnQgaXMgbm90IGEge0BsaW5rIFBlcnNpc3RlbnRUeXBlfSB0aGVuIGNvbnRpbnVlCi0JICogdXAgdGhlIGhpZXJhcmNoeSh0aGUgSlBBIHNwZWMgYWxsb3dzIG5vbi1wZXJzaXN0ZW50IHR5cGVzIHRvIGJlIHBhcnQgb2YgdGhlIGhpZXJhcmNoeS4pICAKLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGlzIHBlcnNpc3RlbnRUeXBlIGlzIHRoZSByb290IHBlcnNpc3RlbnQgdHlwZS4gCi0JICogRXhhbXBsZToKLQkgKiA8cHJlPgotCSAqICYjNjQ7RW50aXR5Ci0JICogcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsIHt9Ci0JICogPGE+Ci0JICogcHVibGljIGFic3RyYWN0IGNsYXNzIEFuaW1hbCBleHRlbmRzIE1vZGVsIHt9Ci0JICogPGE+Ci0JICogJiM2NDtFbnRpdHkKLQkgKiBwdWJsaWMgY2xhc3MgQ2F0IGV4dGVuZHMgQW5pbWFsIHt9Ci0JICogPC9wcmU+IAotCSAqIAotCSAqIElmIHRoaXMgaXMgdGhlIENhdCBKYXZhUGVyc2lzdGVudFR5cGUgdGhlbiBwYXJlbnRQZXJzaXN0ZW50VHlwZSBpcyB0aGUgTW9kZWwgSmF2YVBlcnNpc3RlbnRUeXBlCi0JICogVGhlIHBhcmVudFBlcnNpc3RlbnRUeXBlIGNvdWxkIGJlIGZvdW5kIGluIGphdmEgb3IgeG1sLgotCSAqLwotCVBlcnNpc3RlbnRUeXBlIGdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCk7Ci0JCVN0cmluZyBQQVJFTlRfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZID0gInBhcmVudFBlcnNpc3RlbnRUeXBlUHJvcGVydHkiOwotCi0JLyoqCi0JICogUmV0dXJuIGEgcmVhZC1vbmx5IGl0ZXJhdG9yIG9mIHRoZSBjb250YWluZWQge0BsaW5rIFBlcnNpc3RlbnRBdHRyaWJ1dGV9Ci0JICovCi0JPFQgZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlPiBMaXN0SXRlcmF0b3I8VD4gYXR0cmlidXRlcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB7QGxpbmsgUGVyc2lzdGVudEF0dHJpYnV0ZX1zIGxpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IGF0dHJpYnV0ZXNTaXplKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQVRUUklCVVRFU19MSVNUID0gInNwZWNpZmllZEF0dHJpYnV0ZXNMaXN0IjsKLQkKLQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSByZWFkLW9ubHkgaXRlcmF0b3Igb2YgdGhlIGFsbCB0aGUge0BsaW5rIFBlcnNpc3RlbnRBdHRyaWJ1dGV9cwotCSAqIGluIHRoZSBoaWVyYXJjaHkKLQkgKi8KLQlJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBhbGxBdHRyaWJ1dGVzKCk7Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGFsbEF0dHJpYnV0ZU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBuYW1lZCA8Y29kZT5hdHRyaWJ1dGVOYW1lPC9jb2RlPiBpZgotCSAqIGl0IGV4aXN0cyBsb2NhbGx5IG9uIHRoaXMgdHlwZQotCSAqLwotCVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlTmFtZWQoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotCi0JLyoqCi0JICogUmVzb2x2ZSBhbmQgcmV0dXJuIHRoZSBhdHRyaWJ1dGUgbmFtZWQgPGNvZGU+YXR0cmlidXRlTmFtZTwvY29kZT4gaWYgaXQKLQkgKiBpcyBkaXN0aW5jdCBhbmQgZXhpc3RzIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIHR5cGUKLQkgKi8KLQlQZXJzaXN0ZW50QXR0cmlidXRlIHJlc29sdmVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotCi0JSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGluaGVyaXRhbmNlSGllcmFyY2h5KCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgdG8gdGhlIGxpc3Qgb2YgY3VycmVudCB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0JICovCi0Jdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1ByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTkxNzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW4KLQlleHRlbmRzIEJhc2VKb2luQ29sdW1uCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9RdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzNjdmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9RdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVlcnkgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCS8vICoqKioqKioqKioqKioqKiogbmFtZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOwotCQotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKioqKioqKiogcXVlcnkgKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlTdHJpbmcgUVVFUllfUFJPUEVSVFkgPSAicXVlcnlQcm9wZXJ0eSI7Ci0JCi0JU3RyaW5nIGdldFF1ZXJ5KCk7Ci0JCi0Jdm9pZCBzZXRRdWVyeShTdHJpbmcgdmFsdWUpOwotCQotCQotCS8vKioqKioqKioqKioqKioqKioqKioqKioqIGhpbnRzICoqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JU3RyaW5nIEhJTlRTX0xJU1QgPSAiaGludHNMaXN0IjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBoaW50cy4gIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIFF1ZXJ5SGludD4gTGlzdEl0ZXJhdG9yPFQ+IGhpbnRzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaGludHMuCi0JICovCi0JaW50IGhpbnRzU2l6ZSgpOwotCQotCS8qKgotCSAqIEFkZCBhIGhpbnQgdG8gdGhlIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JUXVlcnlIaW50IGFkZEhpbnQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIGhpbnQgZnJvbSB0aGUgcXVlcnkuCi0JICovCi0Jdm9pZCByZW1vdmVIaW50KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBoaW50IGF0IHRoZSBpbmRleCBmcm9tIHRoZSBxdWVyeS4KLQkgKi8KLQl2b2lkIHJlbW92ZUhpbnQoUXVlcnlIaW50IHF1ZXJ5SGludCk7Ci0JCi0JLyoqCi0JICogTW92ZSB0aGUgaGludCBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVIaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBxdWVyeSBvdmVycmlkZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIHNwZWNpZmllZAotCSAqIHF1ZXJ5Ci0JICogKGZvciBleGFtcGxlLCBhIHF1ZXJ5IGRlZmluZWQgaW4gb3JtLnhtbCBvdmVycmlkZXMgb25lIGRlZmluZWQgaW4gamF2YSkKLQkgKi8KLQlib29sZWFuIG92ZXJyaWRlcyhRdWVyeSBxdWVyeSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9RdWVyeUhpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1F1ZXJ5SGludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGY1MWM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1F1ZXJ5SGludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBRdWVyeUhpbnQgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCi0JU3RyaW5nIGdldE5hbWUoKTsKLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsKLQotCVN0cmluZyBnZXRWYWx1ZSgpOwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlUHJvcGVydHkiOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUXVlcnlIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1F1ZXJ5SG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZjAxODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUXVlcnlIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5SG9sZGVyIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBuYW1lZCBxdWVyaWVzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIE5hbWVkUXVlcnk+IExpc3RJdGVyYXRvcjxUPiBuYW1lZFF1ZXJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG5hbWVkIHF1ZXJpZXMuCi0JICovCi0JaW50IG5hbWVkUXVlcmllc1NpemUoKTsKLQotCS8qKgotCSAqIEFkZCBhIG5hbWVkIHF1ZXJ5IHRvIHRoZSBlbnRpdHkgcmV0dXJuIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCU5hbWVkUXVlcnkgYWRkTmFtZWRRdWVyeShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBuYW1lZCBxdWVyeSBhdCB0aGUgaW5kZXggZnJvbSB0aGUgZW50aXR5LgotCSAqLwotCXZvaWQgcmVtb3ZlTmFtZWRRdWVyeShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBuYW1lZCBxdWVyeSBhdCBmcm9tIHRoZSBlbnRpdHkuCi0JICovCi0Jdm9pZCByZW1vdmVOYW1lZFF1ZXJ5KE5hbWVkUXVlcnkgbmFtZWRRdWVyeSk7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBuYW1lZCBxdWVyeSBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVOYW1lZFF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCVN0cmluZyBOQU1FRF9RVUVSSUVTX0xJU1QgPSAibmFtZWRRdWVyaWVzTGlzdCI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCTxUIGV4dGVuZHMgTmFtZWROYXRpdmVRdWVyeT4gTGlzdEl0ZXJhdG9yPFQ+IG5hbWVkTmF0aXZlUXVlcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuCi0JICovCi0JaW50IG5hbWVkTmF0aXZlUXVlcmllc1NpemUoKTsKLQotCS8qKgotCSAqIEFkZCBhIG5hbWVkIG5hdGl2ZSBxdWVyeSB0byB0aGUgZW50aXR5IHJldHVybiB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlOYW1lZE5hdGl2ZVF1ZXJ5IGFkZE5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgbmFtZWQgbmF0aXZlIHF1ZXJ5IGF0IHRoZSBpbmRleCBmcm9tIHRoZSBlbnRpdHkuCi0JICovCi0Jdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIG5hbWVkIG5hdGl2ZSBxdWVyeSBhdCBmcm9tIHRoZSBlbnRpdHkuCi0JICovCi0Jdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSk7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBuYW1lZCBuYXRpdmUgcXVlcnkgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlTmFtZWROYXRpdmVRdWVyeShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQlTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCA9ICJuYW1lZE5hdGl2ZVF1ZXJpZXNMaXN0IjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9SZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9SZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NTM5MmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWxhdGlvbnNoaXBNYXBwaW5nIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZywgRmV0Y2hhYmxlCi17Ci0KLQkvLyAqKioqKioqKioqKioqKioqIHRhcmdldCBlbnRpdHkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCk7Ci0KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZID0gInNwZWNpZmllZFRhcmdldEVudGl0eVByb3BlcnR5IjsKLQotCVN0cmluZyBnZXREZWZhdWx0VGFyZ2V0RW50aXR5KCk7Ci0JCVN0cmluZyBERUZBVUxUX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFkgPSAiZGVmYXVsdFRhcmdldEVudGl0eVByb3BlcnR5IjsKLQotCUVudGl0eSBnZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlTdHJpbmcgUkVTT0xWRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSA9ICJyZXNvbHZlZFRhcmdldEVudGl0eVByb3BlcnR5IjsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNhc2NhZGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUNhc2NhZGUgZ2V0Q2FzY2FkZSgpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEVudGl0eSB0aGF0IG93bnMgdGhpcyByZWxhdGlvbnNoaXAgbWFwcGluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlFbnRpdHkgZ2V0RW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1hcHBpbmcgaXMgdGhlIG93bmluZyBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0JICogRWl0aGVyIHRoaXMgaXMgYSB1bmlkaXJlY3Rpb25hbCBtYXBwaW5nIG9yIGl0IGlzIHRoZSBvd25pbmcgc2lkZSBvZiBhIGJpZGlyZWN0aW9uYWwKLQkgKiByZWxhdGlvbnNoaXAuICBJZiBiaWRpcmVjdGlvbmFsLCB0aGUgb3duaW5nIHNpZGUgaXMgdGhlIHNpZGUgdGhhdCBkb2Vzbid0IHNwZWNpZnkKLQkgKiBtYXBwZWRCeS4gIFRoaXMgaXMgdGhlIHNpZGUgd2hlcmUgYSBqb2luIHRhYmxlIHdvdWxkIGJlIHNwZWNpZmllZAotCSAqLwotCWJvb2xlYW4gaXNSZWxhdGlvbnNoaXBPd25lcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1NlY29uZGFyeVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9TZWNvbmRhcnlUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjBhMGFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1NlY29uZGFyeVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSBleHRlbmRzIFRhYmxlCi17Ci0KLQlwdWJsaWMgRW50aXR5IGdldFBhcmVudCgpOwotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucyB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0LgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QgPSAic3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdCI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMsIGJvdGggc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgotCSAqLwotCWludCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLgotCSAqLwotCWludCBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb3IgbnVsbC4gIEEgZGVmYXVsdCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbgotCSAqIG9ubHkgZXhpc3RzIGlmIHRoZXJlIGFyZSBubyBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLgotCSAqLwotCVByaW1hcnlLZXlKb2luQ29sdW1uIGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlTdHJpbmcgREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiA9ICJkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4iOwotCi0JLyoqCi0JICogQWRkIGEgc3BlY2lmaWVkIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIHRvIHRoZSBzZWNvbmRhcnkgdGFibGUgcmV0dXJuIHRoZSBvYmplY3QgCi0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBmcm9tIHRoZSBzZWNvbmRhcnkgdGFibGUuCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gYXQgdGhlIGluZGV4IGZyb20gdGhlIHNlY29uZGFyeSB0YWJsZS4KLQkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbik7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHNlY29uZGFyeSB0YWJsZSBleGlzdHMgYXMgc3BlY2lmaWVkIG9uIHRoZSBvd25pbmcgb2JqZWN0LCAKLQkgKiBvciBmYWxzZSBpZiB0aGUgc2Vjb25kYXJ5IHRhYmxlIGlzIGEgcmVzdWx0IG9mIGRlZmF1bHRzIGNhbGN1bGF0aW9uCi0JICovCi0JYm9vbGVhbiBpc1ZpcnR1YWwoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1NlcXVlbmNlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9TZXF1ZW5jZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzBhMjUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1NlcXVlbmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yCi17Ci0JSW50ZWdlciBERUZBVUxUX0lOSVRJQUxfVkFMVUUgPSBJbnRlZ2VyLnZhbHVlT2YoMSk7Ci0KLQlTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCk7Ci0JCi0JU3RyaW5nIGdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKTsKLQkJU3RyaW5nIERFRkFVTFRfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSA9ICJkZWZhdWx0U2VxdWVuY2VOYW1lUHJvcGVydHkiOwotCVN0cmluZyBnZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKTsKLQl2b2lkIHNldFNwZWNpZmllZFNlcXVlbmNlTmFtZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1NFUVVFTkNFX05BTUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2VxdWVuY2VOYW1lUHJvcGVydHkiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjA5NjJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1NpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nLCBOdWxsYWJsZQotewotCQotCS8vICoqKioqKioqKioqKioqKiogZmV0Y2ggdHlwZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JRmV0Y2hUeXBlIERFRkFVTFRfRkVUQ0hfVFlQRSA9IEZldGNoVHlwZS5FQUdFUjsKLQotCS8vICoqKioqKioqKioqKioqKiogam9pbiBjb2x1bW5zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBqb2luIGNvbHVtbnMgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gam9pbkNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGpvaW4gY29sdW1ucywgYm90aCBzcGVjaWZpZWQgYW5kIGRlZmF1bHQuCi0JICovCi0JaW50IGpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgc3BlY2lmaWVkIGpvaW4gY29sdW1ucy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCA9ICJzcGVjaWZpZWRKb2luQ29sdW1uc0xpc3QiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWVkIGpvaW4gY29sdW1ucy4KLQkgKi8KLQlpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gb3IgbnVsbC4gIEEgZGVmYXVsdCBqb2luIGNvbHVtbgotCSAqIG9ubHkgZXhpc3RzIGlmIHRoZXJlIGFyZSBubyBzcGVjaWZpZWQgam9pbiBjb2x1bW5zLgotCSAqLwotCUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJU3RyaW5nIERFRkFVTFRfSk9JTl9DT0xVTU4gPSAiZGVmYXVsdEpvaW5Db2x1bW4iOwotCi0JLyoqCi0JICogQWRkIGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uIHRvIHRoZSBqb2luIHRhYmxlIHJldHVybiB0aGUgb2JqZWN0IAotCSAqIHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbiBmcm9tIHRoZSBqb2luIHRhYmxlLgotCSAqLwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGpvaW4gY29sdW1uIGF0IHRoZSBpbmRleCBmcm9tIHRoZSBqb2luIHRhYmxlLgotCSAqLwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pOwotCQotCS8qKgotCSAqIE1vdmUgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbiBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCWJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzk1NGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQotCVN0cmluZyBnZXREZWZhdWx0TmFtZSgpOwotCQlTdHJpbmcgREVGQVVMVF9OQU1FX1BST1BFUlRZID0gImRlZmF1bHROYW1lUHJvcGVydHkiOwotCi0JU3RyaW5nIGdldFNwZWNpZmllZE5hbWUoKTsKLQl2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZE5hbWVQcm9wZXJ0eSI7Ci0KLQlTdHJpbmcgZ2V0Q2F0YWxvZygpOwotCi0JU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCVN0cmluZyBERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkgPSAiZGVmYXVsdENhdGFsb2dQcm9wZXJ0eSI7Ci0KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCXZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ2F0YWxvZ1Byb3BlcnR5IjsKLQotCi0JU3RyaW5nIGdldFNjaGVtYSgpOwotCi0JU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKTsKLQkJU3RyaW5nIERFRkFVTFRfU0NIRU1BX1BST1BFUlRZID0gImRlZmF1bHRTY2hlbWFQcm9wZXJ0eSI7Ci0KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2NoZW1hUHJvcGVydHkiOwotCi0KLQkvLyAqKioqKioqKioqKioqKioqIHVuaXF1ZSBjb25zdHJhaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgdW5pcXVlIGNvbnN0cmFpbnRzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIFVuaXF1ZUNvbnN0cmFpbnQ+IExpc3RJdGVyYXRvcjxUPiB1bmlxdWVDb25zdHJhaW50cygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBjb25zdHJhaW50cy4KLQkgKi8KLQlpbnQgdW5pcXVlQ29uc3RyYWludHNTaXplKCk7Ci0JCQotCS8qKgotCSAqIEFkZCBhIHVuaXF1ZSBjb25zdHJhaW50IHRvIHRoZSB0YWJsZSBhbmQgcmV0dXJuIHRoZSBvYmplY3QgCi0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB1bmlxdWUgY29uc3RyYWludCBhdCB0aGUgZ2l2ZW4gaW5kZXggZnJvbSB0aGUgVGFibGUKLQkgKi8KLQl2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHVuaXF1ZSBjb25zdHJhaW50IGZyb20gdGhlIFRhYmxlCi0JICovCi0Jdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCk7Ci0JCi0JLyoqCi0JICogTW92ZSB0aGUgdW5pcXVlIGNvbnN0cmFpbnQgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCVN0cmluZyBVTklRVUVfQ09OU1RSQUlOVFNfTElTVCA9ICJ1bmlxdWVDb25zdHJhaW50c0xpc3QiOwotCi0KLQotCW9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlRhYmxlKCk7Ci0KLQlTY2hlbWEgZ2V0RGJTY2hlbWEoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHRhYmxlIGlzIGNvbm5lY3RlZCB0byBhIGRhdGFzb3VyY2UKLQkgKi8KLQlib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQotCS8qKiAKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHRhYmxlJ3Mgc2NoZW1hIGNhbiBiZSByZXNvbHZlZCB0byBhIHNjaGVtYSBvbiB0aGUgYWN0aXZlIGNvbm5lY3Rpb24KLQkgKi8KLQlib29sZWFuIGhhc1Jlc29sdmVkU2NoZW1hKCk7Ci0KLQkvKiogCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBjYW4gYmUgcmVzb2x2ZWQgdG8gYSB0YWJsZSBvbiB0aGUgYWN0aXZlIGNvbm5lY3Rpb24KLQkgKi8KLQlib29sZWFuIGlzUmVzb2x2ZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1RhYmxlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9UYWJsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTU0ODA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1RhYmxlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IKLXsKLQlJbnRlZ2VyIERFRkFVTFRfSU5JVElBTF9WQUxVRSA9IEludGVnZXIudmFsdWVPZigwKTsKLQotCVN0cmluZyBnZXRUYWJsZSgpOwotCQotCVN0cmluZyBnZXREZWZhdWx0VGFibGUoKTsKLQkJU3RyaW5nIERFRkFVTFRfVEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsdFRhYmxlUHJvcGVydHkiOwotCVN0cmluZyBnZXRTcGVjaWZpZWRUYWJsZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkVGFibGUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRUYWJsZVByb3BlcnR5IjsKLQotCi0KLQlTdHJpbmcgZ2V0Q2F0YWxvZygpOwotCi0JU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCVN0cmluZyBERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkgPSAiZGVmYXVsdENhdGFsb2dQcm9wZXJ0eSI7Ci0KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCXZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ2F0YWxvZ1Byb3BlcnR5IjsKLQotCi0KLQlTdHJpbmcgZ2V0U2NoZW1hKCk7Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlTdHJpbmcgREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgPSAiZGVmYXVsdFNjaGVtYVByb3BlcnR5IjsKLQotCVN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQl2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTY2hlbWFQcm9wZXJ0eSI7Ci0KLQotCi0JU3RyaW5nIGdldFBrQ29sdW1uTmFtZSgpOwotCi0JU3RyaW5nIGdldERlZmF1bHRQa0NvbHVtbk5hbWUoKTsKLQkJU3RyaW5nIERFRkFVTFRfUEtfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdFBrQ29sdW1uTmFtZVByb3BlcnR5IjsKLQotCVN0cmluZyBnZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKTsKLQl2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uTmFtZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZFBrQ29sdW1uTmFtZVByb3BlcnR5IjsKLQotCi0JU3RyaW5nIGdldFZhbHVlQ29sdW1uTmFtZSgpOwotCi0JU3RyaW5nIGdldERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoKTsKLQkJU3RyaW5nIERFRkFVTFRfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdFZhbHVlQ29sdW1uTmFtZVByb3BlcnR5IjsKLQkKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWVQcm9wZXJ0eSI7Ci0KLQotCVN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCk7Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoKTsKLQkJU3RyaW5nIERFRkFVTFRfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZID0gImRlZmF1bHRQa0NvbHVtbVZhbHVlUHJvcGVydHkiOwotCi0JU3RyaW5nIGdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKTsKLQl2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9QS19DT0xVTU5fVkFMVUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkUGtDb2x1bW1WYWx1ZVByb3BlcnR5IjsKLQotCi0JLy8gKioqKioqKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIHVuaXF1ZSBjb25zdHJhaW50cy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBVbmlxdWVDb25zdHJhaW50PiBMaXN0SXRlcmF0b3I8VD4gdW5pcXVlQ29uc3RyYWludHMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB1bmlxdWUgY29uc3RyYWludHMuCi0JICovCi0JaW50IHVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpOwotCQkKLQkvKioKLQkgKiBBZGQgYSB1bmlxdWUgY29uc3RyYWludCB0byB0aGUgdGFibGUgYW5kIHJldHVybiB0aGUgb2JqZWN0IAotCSAqIHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdW5pcXVlIGNvbnN0cmFpbnQgYXQgdGhlIGdpdmVuIGluZGV4IGZyb20gdGhlIFRhYmxlCi0JICovCi0Jdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSB1bmlxdWUgY29uc3RyYWludCBmcm9tIHRoZSBUYWJsZQotCSAqLwotCXZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpOwotCQotCS8qKgotCSAqIE1vdmUgdGhlIHVuaXF1ZSBjb25zdHJhaW50IGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QgPSAidW5pcXVlQ29uc3RyYWludHNMaXN0IjsKLQotCS8qKgotCSAqIFJldHVybiBhIGRiIFNjaGVtYSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkL2RlZmF1bHQgc2NoZW1hIG5hbWUuCi0JICogVGhpcyBjYW4gcmV0dXJuIG51bGwgaWYgbm8gU2NoZW1hIGV4aXN0cyBvbiB0aGUgZGF0YWJhc2Ugd2l0aCB0aGF0IG5hbWUuCi0JICovCi0JU2NoZW1hIGdldERiU2NoZW1hKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBkYiBUYWJsZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkL2RlZmF1bHQgdGFibGUgbmFtZS4KLQkgKiBUaGlzIGNhbiByZXR1cm4gbnVsbCBpZiBubyBUYWJsZSBleGlzdHMgb24gdGhlIGRhdGFiYXNlIHdpdGggdGhhdCBuYW1lLgotCSAqLwotCVRhYmxlIGdldERiVGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1RlbXBvcmFsVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVGVtcG9yYWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMTBiYmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVGVtcG9yYWxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotCi0JREFURSwKLQlUSU1FLAotCVRJTUVTVEFNUDsKLQkKLQotCXB1YmxpYyBzdGF0aWMgVGVtcG9yYWxUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZSBqYXZhVGVtcG9yYWxUeXBlKSB7Ci0JCWlmIChqYXZhVGVtcG9yYWxUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YVRlbXBvcmFsVHlwZSkgewotCQkJY2FzZSBEQVRFOgotCQkJCXJldHVybiBEQVRFOwotCQkJY2FzZSBUSU1FOgotCQkJCXJldHVybiBUSU1FOwotCQkJY2FzZSBUSU1FU1RBTVA6Ci0JCQkJcmV0dXJuIFRJTUVTVEFNUDsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biB0ZW1wb3JhbCB0eXBlOiAiICsgamF2YVRlbXBvcmFsVHlwZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUpIHsKLQkJaWYgKHRlbXBvcmFsVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKHRlbXBvcmFsVHlwZSkgewotCQkJY2FzZSBEQVRFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5EQVRFOwotCQkJY2FzZSBUSU1FOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FOwotCQkJY2FzZSBUSU1FU1RBTVA6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUVTVEFNUDsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biB0ZW1wb3JhbCB0eXBlOiAiICsgdGVtcG9yYWxUeXBlKTsKLQkJfQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgVGVtcG9yYWxUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUgb3JtVGVtcG9yYWxUeXBlKSB7Ci0JCWlmIChvcm1UZW1wb3JhbFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChvcm1UZW1wb3JhbFR5cGUpIHsKLQkJCWNhc2UgREFURToKLQkJCQlyZXR1cm4gREFURTsKLQkJCWNhc2UgVElNRToKLQkJCQlyZXR1cm4gVElNRTsKLQkJCWNhc2UgVElNRVNUQU1QOgotCQkJCXJldHVybiBUSU1FU1RBTVA7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gdGVtcG9yYWwgdHlwZTogIiArIG9ybVRlbXBvcmFsVHlwZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKSB7Ci0JCWlmICh0ZW1wb3JhbFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoICh0ZW1wb3JhbFR5cGUpIHsKLQkJCWNhc2UgREFURToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFOwotCQkJY2FzZSBUSU1FOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUU7Ci0JCQljYXNlIFRJTUVTVEFNUDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVA7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gdGVtcG9yYWwgdHlwZTogIiArIHRlbXBvcmFsVHlwZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1RyYW5zaWVudE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1RyYW5zaWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViZDRjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9UcmFuc2llbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyYW5zaWVudE1hcHBpbmcKLQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1R5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODgxODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlTWFwcGluZyBleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIGEgdW5pcXVlIGtleSBmb3IgdGhlIElUeXBlTWFwcGluZy4gIElmIHRoaXMgaXMgZGVmaW5lZCBpbgotCSAqIGFuIGV4dGVuc2lvbiB0aGV5IHNob3VsZCBiZSBlcXVhbC4KLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldEtleSgpOwotCi0JUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQotCWJvb2xlYW4gaXNNYXBwZWQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgbWFwcGluZydzIHByaW1hcnkgdGFibGUgbmFtZSwgbnVsbCBpZiBhIHByaW1hcnkgdGFibGUgZG9lcyBub3QgYXBwbHkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFibGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgbWFwcGluZydzICJhc3NvY2lhdGVkIiB0YWJsZXMsIHdoaWNoIGluY2x1ZGVzIHRoZQotCSAqIHByaW1hcnkgdGFibGUgYW5kIHRoZSBjb2xsZWN0aW9uIG9mIHNlY29uZGFyeSB0YWJsZXMuCi0JICovCi0JSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBtYXBwaW5nJ3MgImFzc29jaWF0ZWQiIHRhYmxlcywgd2hpY2ggaW5jbHVkZXMgdGhlCi0JICogcHJpbWFyeSB0YWJsZSBhbmQgdGhlIGNvbGxlY3Rpb24gb2Ygc2Vjb25kYXJ5IHRhYmxlcywgYXMgd2VsbCBhcyBhbGwKLQkgKiBpbmhlcml0ZWQgImFzc29jaWF0ZWQiIHRhYmxlcy4KLQkgKi8KLQlJdGVyYXRvcjxUYWJsZT4gYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgdHlwZSBtYXBwaW5nJ3MgImFzc29jaWF0ZWQiIHRhYmxlcywKLQkgKiB3aGljaCBpbmNsdWRlcyB0aGUgcHJpbWFyeSB0YWJsZSBhbmQgdGhlIGNvbGxlY3Rpb24gb2Ygc2Vjb25kYXJ5Ci0JICogdGFibGVzLCBhcyB3ZWxsIGFzIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGluaGVyaXRlZCAiYXNzb2NpYXRlZCIgdGFibGVzLgotCSAqLwotCUl0ZXJhdG9yPFN0cmluZz4gYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKTsKLQotCS8qKgotCSAqIHJldHVybiB0aGUgcmVzb2x2ZWQgcHJpbWFyeSBkYiB0YWJsZQotCSAqLwotCW9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXRQcmltYXJ5RGJUYWJsZSgpOwotCi0JU2NoZW1hIGdldERiU2NoZW1hKCk7Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHJlc29sdmVkIGFzc29jaWF0ZWQgZGIgdGFibGUgd2l0aCB0aGUgcGFzc2VkIGluIG5hbWUKLQkgKi8KLQlvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGFibGUgaXMgaW52YWxpZCBmb3IgYW55IGFubm90YXRpb25zCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlIG1hcHBpbmcuCi0JICovCi0JYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgYXR0cmlidXRlcy4gIFRoZSBhdHRyaWJ1dGVzIG11c3QgYmUgQmFzaWNNYXBwaW5ncyBvciBJZE1hcHBpbmdzCi0JICogZm91bmQgaW4gdGhpcyB0eXBlIG1hcHBpbmcKLQkgKi8KLQk8VCBleHRlbmRzIFBlcnNpc3RlbnRBdHRyaWJ1dGU+IEl0ZXJhdG9yPFQ+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIEl0ZXJhdG9yIG9mIGF0dHJpYnV0ZXMgbmFtZXMuICBUaGUgYXR0cmlidXRlcyBtdXN0IGJlIEJhc2ljTWFwcGluZ3Mgb3IgSWRNYXBwaW5ncwotCSAqIGZvdW5kIGluIHRoaXMgdHlwZSBtYXBwaW5nCi0JICovCi0JSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgYXR0cmlidXRlcy4gIFRoZSBhdHRyaWJ1dGVzIG11c3QgYmUgQmFzaWNNYXBwaW5ncyBvciBJZE1hcHBpbmdzCi0JICogZm91bmQgaW4gYW55IE1hcHBlZFN1cGVyY2xhc3MgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gCi0JICogU2VlIHtAbGluayBUeXBlTWFwcGluZyNvdmVycmlkYWJsZUF0dHJpYnV0ZXMoKX0gYW5kIHtAbGluayBQZXJzaXN0ZW50VHlwZSNpbmhlcml0YW5jZUhpZXJhcmNoeSgpfQotCSAqLwotCUl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIEl0ZXJhdG9yIG9mIGF0dHJpYnV0ZXMgbmFtZXMuICBUaGUgYXR0cmlidXRlcyBtdXN0IGJlIEJhc2ljTWFwcGluZ3Mgb3IgSWRNYXBwaW5ncwotCSAqIGZvdW5kIGluIGFueSBNYXBwZWRTdXBlcmNsYXNzIGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuICAKLQkgKiBTZWUge0BsaW5rIFR5cGVNYXBwaW5nI292ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKX0gYW5kIHtAbGluayBQZXJzaXN0ZW50VHlwZSNpbmhlcml0YW5jZUhpZXJhcmNoeSgpfQotCSAqLwotCUl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCi0JCi0JLyoqCi0JICogUmV0dXJuIGFuIEl0ZXJhdG9yIG9mIGFzc29jaWF0aW9ucyB0aGF0IGNhbiBiZSBvdmVycmlkZW4uICBUaGUgYXNzb2NpYXRpb25zIG11c3QgYmUgCi0JICogT25lVG9PbmVNYXBwaW5ncyBvciBNYW55VG9PbmVNYXBwaW5ncyBmb3VuZCBpbiB0aGlzIHR5cGUgbWFwcGluZwotCSAqLwotCTxUIGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZT4gSXRlcmF0b3I8VD4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBJdGVyYXRvciBvZiBhc3NvY2lhdGlvbiBuYW1lcy4gIFRoZSBhc3NvY2lhdGlvbnMgbXVzdCBiZSBPbmVUb09uZU1hcHBpbmdzIG9yIE1hbnlUb09uZU1hcHBpbmdzCi0JICogZm91bmQgaW4gYW55IE1hcHBlZFN1cGVyY2xhc3MgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotCSAqLwotCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgYXNzb2NpYXRpb25zLiAgVGhlIGFzc29jaWF0aW9ucyBtdXN0IGJlIE9uZVRvT25lTWFwcGluZ3Mgb3IgTWFueVRvT25lTWFwcGluZ3MKLQkgKiBmb3VuZCBpbiBhbnkgTWFwcGVkU3VwZXJjbGFzcyBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0JICogU2VlIHtAbGluayBUeXBlTWFwcGluZyNvdmVycmlkYWJsZUFzc29jaWF0aW9ucygpfSBhbmQge0BsaW5rIFBlcnNpc3RlbnRUeXBlI2luaGVyaXRhbmNlSGllcmFyY2h5KCl9Ci0JICovCi0JSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBJdGVyYXRvciBvZiBhc3NvY2lhdGlvbiBuYW1lcy4gIFRoZSBhc3NvY2lhdGlvbnMgbXVzdCBiZSBPbmVUb09uZU1hcHBpbmdzIG9yIE1hbnlUb09uZU1hcHBpbmdzCi0JICogZm91bmQgaW4gYW55IE1hcHBlZFN1cGVyY2xhc3MgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotCSAqIFNlZSB7QGxpbmsgVHlwZU1hcHBpbmcjb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCl9IGFuZCB7QGxpbmsgUGVyc2lzdGVudFR5cGUjaW5oZXJpdGFuY2VIaWVyYXJjaHkoKX0KLQkgKi8KLQlJdGVyYXRvcjxTdHJpbmc+IGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGF0dHJpYnV0ZSBtYXBwaW5nIGtleSBpcyB2YWxpZCBmb3IgdGhpcyBwYXJ0aWN1bGFyCi0JICogdHlwZSBtYXBwaW5nCi0JICogKGZvciBleGFtcGxlLCBpZCdzIGFyZSBub3QgdmFsaWQgZm9yIGFuIGVtYmVkZGFibGUgdHlwZSBtYXBwaW5nKQotCSAqLwotCWJvb2xlYW4gYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoU3RyaW5nIGF0dHJpYnV0ZU1hcHBpbmdLZXkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVW5pcXVlQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRiNjk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1VuaXF1ZUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNvbHVtbiBuYW1lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgY29sdW1uIG5hbWVzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBjb2x1bW5OYW1lcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbHVtbiBuYW1lcy4KLQkgKi8KLQlpbnQgY29sdW1uTmFtZXNTaXplKCk7Ci0JCQotCS8qKgotCSAqIEFkZCBhIGNvbHVtbiBuYW1lIHRvIHRoZSBsaXN0IGF0IHRoZSBnaXZlbiBpbmRleAotCSAqLwotCXZvaWQgYWRkQ29sdW1uTmFtZShpbnQgaW5kZXgsIFN0cmluZyBjb2x1bW5OYW1lKTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIGNvbHVtbiBuYW1lIGF0IHRoZSBnaXZlbiBpbmRleCBmcm9tIHRoZSB1bmlxdWUgY29uc3RyYWludAotCSAqLwotCXZvaWQgcmVtb3ZlQ29sdW1uTmFtZShpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgY29sdW1uIG5hbWUgZnJvbSB0aGUgdW5pcXVlIGNvbnN0cmFpbnQKLQkgKi8KLQl2b2lkIHJlbW92ZUNvbHVtbk5hbWUoU3RyaW5nIGNvbHVtbk5hbWUpOwotCQotCS8qKgotCSAqIE1vdmUgdGhlIGNvbHVtbiBuYW1lIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZUNvbHVtbk5hbWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQlTdHJpbmcgQ09MVU1OX05BTUVTX0xJU1QgPSAiY29sdW1uTmFtZXNMaXN0IjsKLQkJCi0JLyoqCi0JICogQWxsIGNvbnRhaW5lcnMgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0JICovCi0JaW50ZXJmYWNlIE93bmVyCi0JewotCQlJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZVVuaXF1ZUNvbnN0cmFpbnRDb2x1bW5OYW1lcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1ZlcnNpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9WZXJzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNkMGRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1ZlcnNpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZlcnNpb25NYXBwaW5nCi0JZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nLCBDb2x1bW5NYXBwaW5nCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmMzcwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0RlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotCi0vKioKLSAqIE1hcCBhIHN0cmluZyBrZXkgdG8gYW4gYXR0cmlidXRlIG1hcHBpbmcgYW5kIGl0cyBjb3JyZXNwb25kaW5nCi0gKiBKYXZhIGFubm90YXRpb24gYWRhcHRlci4gIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgewotCi0JLyoqCi0JICogR2l2ZW4gdGhlIElKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXR1cm4gd2hldGhlciB0aGUgZGVmYXVsdCBtYXBwaW5nIGFwcGxpZXMuCi0JICogVGhpcyB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IG1hcHBpbmcgaW4gdGhlIGNhc2Ugd2hlcmUgbm8gCi0JICogbWFwcGluZyBoYXMgYmVlbiBzcGVjaWZpZWQuCi0JICovCi0JYm9vbGVhbiBkZWZhdWx0QXBwbGllcyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTIyM2FkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlLCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gZGVmYXVsdEpvaW5Db2x1bW5zKCk7Ci0JSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCXZvaWQgaW5pdGlhbGl6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkKLQl2b2lkIHVwZGF0ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QzYzU2OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcsIEphdmFKcGFDb250ZXh0Tm9kZQotewotCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkKLQl2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCi0Jdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQotCVN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybiBhbGwgZnVsbHkgcXVhbGZpZWQgYW5ub3RhdGlvbiBuYW1lcyB0aGF0IGFyZSBzdXBwb3J0ZWQgd2l0aCB0aGlzIG1hcHBpbmcgdHlwZS4KLQkgKiBUaGlzIGluY2x1ZGVzIGFsbCBwb3NzaWJsZSBhbm5vdGF0aW9ucywgbm90IGp1c3QgdGhlIG9uZXMgdGhhdCBjdXJyZW50bHkgZXhpc3Qgb24gdGhlIGF0dHJpYnV0ZS4KLQkgKi8KLQlJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwZDRmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLQotLyoqCi0gKiBNYXAgYSBzdHJpbmcga2V5IHRvIGEgdHlwZSBtYXBwaW5nIGFuZCBpdHMgY29ycmVzcG9uZGluZwotICogSmF2YSBhbm5vdGF0aW9uIGFkYXB0ZXIuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgewotCi0JLyoqCi0JICogQSB1bmlxdWUgU3RyaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIElKYXZhQXR0cmlidXRlTWFwcGluZyBrZXkgCi0JICovCi0JU3RyaW5nIGdldEtleSgpOwotCi0JU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIHtAbGluayBKYXZhQXR0cmlidXRlTWFwcGluZ30gZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUuICBVc2UgdGhlIHtAbGluayBKcGFGYWN0b3J5fQotCSAqIGZvciBjcmVhdGlvbiBzbyB0aGF0IGV4dGVuZGVycyBjYW4gY3JlYXRlIHRoZWlyIG93biB7QGxpbmsgSnBhRmFjdG9yeX0gaW5zdGVhZCBvZiAKLQkgKiBjcmVhdGluZyB0aGVpciBvd24ge0BsaW5rIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJ9LgotCSAqLwotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNWE1YmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGV4dGVuZHMgQXR0cmlidXRlT3ZlcnJpZGUsIEphdmFKcGFDb250ZXh0Tm9kZSwgSmF2YUNvbHVtbi5Pd25lcgotewotCUphdmFDb2x1bW4gZ2V0Q29sdW1uKCk7Ci0JCi0Jdm9pZCBpbml0aWFsaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCi0Jdm9pZCB1cGRhdGUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUJhc2VDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUJhc2VDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkZTBhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFCYXNlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQmFzZUNvbHVtbiBleHRlbmRzIEJhc2VDb2x1bW4sIEphdmFOYW1lZENvbHVtbgotewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAoYmVzdCBndWVzcykgdGV4dCBsb2NhdGlvbiBvZiB0aGUgY29sdW1uJ3MgdGFibGUuCi0JICovCi0JVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCU93bmVyIGdldE93bmVyKCk7Ci0JCi0JLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKiAoZS5nLiBiYXNpYyBtYXBwaW5ncyBhbmQgYXR0cmlidXRlIG92ZXJyaWRlcykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIgZXh0ZW5kcyBKYXZhTmFtZWRDb2x1bW4uT3duZXIsIEJhc2VDb2x1bW4uT3duZXIKLQl7Ci0JCS8vIG5vdGhpbmc/Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzNTZmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFCYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlRW1iZWRkZWRNYXBwaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQmFzZUVtYmVkZGVkTWFwcGluZyBleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nLCBCYXNlRW1iZWRkZWRNYXBwaW5nCi17Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQotCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQmFzZUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUJhc2VKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MmFmODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQmFzZUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQmFzZUpvaW5Db2x1bW4gZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbiwgSmF2YU5hbWVkQ29sdW1uCi17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIChiZXN0IGd1ZXNzKSB0ZXh0IGxvY2F0aW9uIG9mIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lCi0JICovCi0JVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCQotCU93bmVyIGdldE93bmVyKCk7Ci0JLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIGpvaW4gY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIDE6MSBtYXBwaW5ncyBhbmQgam9pbiB0YWJsZXMpCi0JICovCi0JaW50ZXJmYWNlIE93bmVyIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW4uT3duZXIsIEphdmFOYW1lZENvbHVtbi5Pd25lcgotCXsKLQkJLy8gbm90aGluZz8KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQmFzaWNNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM2OGE0NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFCYXNpY01hcHBpbmcKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nLCBCYXNpY01hcHBpbmcsIEphdmFDb2x1bW5NYXBwaW5nCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMTM2OGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNvbHVtbiBleHRlbmRzIENvbHVtbiwgSmF2YUJhc2VDb2x1bW4KLXsKLQl2b2lkIGluaXRpYWxpemUoQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5SZXNvdXJjZSk7Ci0JCi0Jdm9pZCB1cGRhdGUoQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5SZXNvdXJjZSk7Ci0JCi0JYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCi0JT3duZXIgZ2V0T3duZXIoKTsKLQkvKioKLQkgKiBpbnRlcmZhY2UgYWxsb3dpbmcgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIGJhc2ljIG1hcHBpbmdzIGFuZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzKQotCSAqLwotCWludGVyZmFjZSBPd25lciBleHRlbmRzIEphdmFCYXNlQ29sdW1uLk93bmVyCi0JewotCQlDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtblJlc291cmNlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQxMjQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUNvbHVtbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQ29sdW1uTWFwcGluZyBleHRlbmRzIEphdmFKcGFDb250ZXh0Tm9kZSwgQ29sdW1uTWFwcGluZywgSmF2YUNvbHVtbi5Pd25lcgotewotCUphdmFDb2x1bW4gZ2V0Q29sdW1uKCk7Ci19IApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmMwYzljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4gZXh0ZW5kcyBKYXZhTmFtZWRDb2x1bW4sIERpc2NyaW1pbmF0b3JDb2x1bW4KLXsJCi0Jdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGVyc2lzdGVudFJlc291cmNlKTsKLQkKLQl2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBlcnNpc3RlbnRSZXNvdXJjZSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNjdmMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRW1iZWRkYWJsZQotCWV4dGVuZHMgSmF2YVR5cGVNYXBwaW5nLCBFbWJlZGRhYmxlCi17Ci0JSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCQotCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucygpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlYjRjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFFbWJlZGRlZElkTWFwcGluZyBleHRlbmRzIEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nLCBFbWJlZGRlZElkTWFwcGluZwotewotCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOTY1ZDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFFbWJlZGRlZE1hcHBpbmcgZXh0ZW5kcyBKYXZhQmFzZUVtYmVkZGVkTWFwcGluZywgRW1iZWRkZWRNYXBwaW5nCi17Ci0JTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0ODE4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFFbnRpdHkgZXh0ZW5kcyBKYXZhVHlwZU1hcHBpbmcsIEVudGl0eSwgSmF2YUdlbmVyYXRvckhvbGRlcgotewotCUphdmFUYWJsZSBnZXRUYWJsZSgpOwotCQotCUphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMoKTsJCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7Ci0JSmF2YVNlY29uZGFyeVRhYmxlIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCBpbmRleCk7Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSk7Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzKCk7Ci0JSmF2YU5hbWVkUXVlcnkgYWRkTmFtZWRRdWVyeShpbnQgaW5kZXgpOwotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JSmF2YU5hbWVkTmF0aXZlUXVlcnkgYWRkTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpOwotCQotCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLQkKLQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdGVkVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRlZFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ODkwNmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdGVkVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhR2VuZXJhdGVkVmFsdWUgZXh0ZW5kcyBHZW5lcmF0ZWRWYWx1ZSwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIChiZXN0IGd1ZXNzKSB0ZXh0IGxvY2F0aW9uIG9mIHRoZSBnZW5lcmF0b3IuCi0JICovCi0JVGV4dFJhbmdlIGdldEdlbmVyYXRvclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0Jdm9pZCBpbml0aWFsaXplKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZSk7Ci0JCi0Jdm9pZCB1cGRhdGUoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZWUzOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IsIEphdmFKcGFDb250ZXh0Tm9kZQotewotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFHZW5lcmF0b3JIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRvckhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGNlM2U0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRvckhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvckhvbGRlcjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUdlbmVyYXRvckhvbGRlciBleHRlbmRzIEdlbmVyYXRvckhvbGRlcgotewotCUphdmFTZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0JSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0KLQlKYXZhVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQotCUphdmFUYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNmJmYTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhSWRNYXBwaW5nIGV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcsIElkTWFwcGluZywgSmF2YUNvbHVtbk1hcHBpbmcsIEphdmFHZW5lcmF0b3JIb2xkZXIKLXsKLQlKYXZhR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQlKYXZhR2VuZXJhdGVkVmFsdWUgYWRkR2VuZXJhdGVkVmFsdWUoKTsKLX0gCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM0M2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUpvaW5Db2x1bW4gZXh0ZW5kcyBKb2luQ29sdW1uLCBKYXZhQmFzZUpvaW5Db2x1bW4sIEphdmFCYXNlQ29sdW1uCi17Ci0Jdm9pZCBpbml0aWFsaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pOwotCQotCWJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQotCXZvaWQgdXBkYXRlKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pOwotCi0JT3duZXIgZ2V0T3duZXIoKTsKLQkKLQkvKioKLQkgKiBpbnRlcmZhY2UgYWxsb3dpbmcgam9pbiBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCi0JICogKGUuZy4gMToxIG1hcHBpbmdzIGFuZCBqb2luIHRhYmxlcykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIgZXh0ZW5kcyBKb2luQ29sdW1uLk93bmVyLCBKYXZhQmFzZUpvaW5Db2x1bW4uT3duZXIsIEphdmFCYXNlQ29sdW1uLk93bmVyCi0JewotCQkvLyBub3RoaW5nIHlldAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODE3MGFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUpvaW5UYWJsZSBleHRlbmRzIEpvaW5UYWJsZSwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0Jdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UpOwotCQotCXZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UpOwotCQotCWJvb2xlYW4gaXNTcGVjaWZpZWQoKTsKLQkKLQkKLQkvLyoqKioqKioqKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKTsKLQkKLQlKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkKLQlKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCi0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBpbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkKLQlKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQotCUphdmFKb2luQ29sdW1uIGFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCi0JSmF2YVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpwYUNvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKcGFDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzAxMjMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpwYUNvbnRleHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFKcGFDb250ZXh0Tm9kZSBleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIGNvZGUtY29tcGxldGlvbiBwcm9wb3NhbHMgZm9yIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KLQkgKiBpbiB0aGUgc291cmNlIGNvZGUuCi0JICovCi0JSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQotCS8vICoqKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqOAotCQotCS8qKgotCSAqIEFkZHMgdG8gdGhlIGxpc3Qgb2YgY3VycmVudCB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0JICovCi0Jdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQlUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWM2ZTY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFNYW55VG9NYW55TWFwcGluZwotCWV4dGVuZHMgSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZywgTWFueVRvTWFueU1hcHBpbmcKLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjM0MTFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFNYW55VG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZywgTWFueVRvT25lTWFwcGluZwotewotCS8vICoqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqCi0JCi0JTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucygpOwotCi0JTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YjhkYjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhTWFwcGVkU3VwZXJjbGFzcwotCWV4dGVuZHMgSmF2YVR5cGVNYXBwaW5nLCBNYXBwZWRTdXBlcmNsYXNzCi17Ci0JSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCQotCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucygpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0N2Y4OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgZXh0ZW5kcyBKYXZhUmVsYXRpb25zaGlwTWFwcGluZywgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0KLQlKYXZhSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWRDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU5hbWVkQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODFiMjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWRDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhTmFtZWRDb2x1bW4gZXh0ZW5kcyBOYW1lZENvbHVtbiwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0KLQlPd25lciBnZXRPd25lcigpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgKGJlc3QgZ3Vlc3MpIHRleHQgbG9jYXRpb24gb2YgdGhlIGNvbHVtbidzIG5hbWUuCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKiAoZS5nLiBiYXNpYyBtYXBwaW5ncyBhbmQgYXR0cmlidXRlIG92ZXJyaWRlcykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIgZXh0ZW5kcyBOYW1lZENvbHVtbi5Pd25lcgotCXsKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgY29sdW1uIG93bmVyJ3MgdGV4dCByYW5nZS4gVGhpcyBjYW4gYmUgcmV0dXJuZWQgYnkgdGhlCi0JCSAqIGNvbHVtbiB3aGVuIGl0cyBhbm5vdGF0aW9uIGlzIG5vdCBwcmVzZW50LgotCQkgKi8KLQkJVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWROYXRpdmVRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWROYXRpdmVRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWUyOGNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU5hbWVkTmF0aXZlUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU5hbWVkTmF0aXZlUXVlcnkKLQlleHRlbmRzIE5hbWVkTmF0aXZlUXVlcnksIEphdmFRdWVyeQotewotCi0JTGlzdEl0ZXJhdG9yPEphdmFRdWVyeUhpbnQ+IGhpbnRzKCk7Ci0KLQl2b2lkIGluaXRpYWxpemUoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gcXVlcnlSZXNvdXJjZSk7Ci0KLQl2b2lkIHVwZGF0ZShOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBxdWVyeVJlc291cmNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWRRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWRRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDY2ZmU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU5hbWVkUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU5hbWVkUXVlcnkKLQlleHRlbmRzIE5hbWVkUXVlcnksIEphdmFRdWVyeQotewotCi0JTGlzdEl0ZXJhdG9yPEphdmFRdWVyeUhpbnQ+IGhpbnRzKCk7Ci0KLQl2b2lkIGluaXRpYWxpemUoTmFtZWRRdWVyeUFubm90YXRpb24gcXVlcnlSZXNvdXJjZSk7Ci0KLQl2b2lkIHVwZGF0ZShOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBxdWVyeVJlc291cmNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmRiMTIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhT25lVG9NYW55TWFwcGluZwotCWV4dGVuZHMgSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZywgT25lVG9NYW55TWFwcGluZwotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDhhMWFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhT25lVG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZywgT25lVG9PbmVNYXBwaW5nCi17Ci0JLy8gKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioKLQkKLQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCk7Ci0KLQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCi0JSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZGQzMWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JCi0JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0TWFwcGluZygpOwotCQotCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkKLQlKYXZhQXR0cmlidXRlTWFwcGluZyBnZXREZWZhdWx0TWFwcGluZygpOwotCQotCUphdmFUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpOwotCQotCUphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpOwotCQotCXZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0KLQl2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCi0JSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIGNvbnRhaW5zIHRoZSBnaXZlbiBvZmZzZXQgaW50byB0aGUgdGV4dCBmaWxlLgotCSAqLwotCWJvb2xlYW4gY29udGFpbnMoaW50IG9mZnNldCwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVBlcnNpc3RlbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDM3NWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUGVyc2lzdGVudFR5cGUgZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZSwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JSmF2YVR5cGVNYXBwaW5nIGdldE1hcHBpbmcoKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMoKTsKLQkKLQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVOYW1lZChTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXNvbHZlIGFuZCByZXR1cm4gdGhlIGF0dHJpYnV0ZSBuYW1lZCA8Y29kZT5hdHRyaWJ1dGVOYW1lPC9jb2RlPiBpZiBpdAotCSAqIGlzIGRpc3RpbmN0IGFuZCBleGlzdHMgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoaXMgdHlwZQotCSAqLwotCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb2x2ZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IGF0dHJpYnV0ZSBpbiB0aGlzIHBlcnNpc3RlbnQgdHlwZSBjb250YWlucyBhIG1hcHBpbmcgYW5ub3RhdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGhhc0FueUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9ucygpOwotCi0JCi0Jdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlNmVlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbiwgSmF2YUJhc2VKb2luQ29sdW1uCi17Ci0Jdm9pZCBpbml0aWFsaXplKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCi0Jdm9pZCB1cGRhdGUoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODBlZmU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUXVlcnkgZXh0ZW5kcyBRdWVyeSwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFRdWVyeUhpbnQ+IGhpbnRzKCk7Ci0KLQlKYXZhUXVlcnlIaW50IGFkZEhpbnQoaW50IGluZGV4KTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUXVlcnlIaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFRdWVyeUhpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2MWM2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFRdWVyeUhpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUXVlcnlIaW50IGV4dGVuZHMgUXVlcnlIaW50LCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQl2b2lkIGluaXRpYWxpemUoUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnQpOwotCQotCXZvaWQgdXBkYXRlKFF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3OTFlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nLCBSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVNlY29uZGFyeVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFTZWNvbmRhcnlUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjgxMDY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVNlY29uZGFyeVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVNlY29uZGFyeVRhYmxlIGV4dGVuZHMgU2Vjb25kYXJ5VGFibGUsIEphdmFKcGFDb250ZXh0Tm9kZQotewotCi0Jdm9pZCBpbml0aWFsaXplKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSk7Ci0JCi0Jdm9pZCB1cGRhdGUoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlKTsKLQotCi0JLy8qKioqKioqKioqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkKLQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCi0JSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cygpOwotCQotCUphdmFVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVNlcXVlbmNlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFTZXF1ZW5jZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2EwNjcyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVNlcXVlbmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFTZXF1ZW5jZUdlbmVyYXRvcgotCWV4dGVuZHMgSmF2YUdlbmVyYXRvciwgU2VxdWVuY2VHZW5lcmF0b3IKLXsKLQotCXZvaWQgaW5pdGlhbGl6ZShTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yKTsKLQkKLQl2b2lkIHVwZGF0ZShTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzkyOTY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIGV4dGVuZHMgSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcsIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCk7Ci0JCi0JSmF2YUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCi0JSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhU3RydWN0dXJlTm9kZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVN0cnVjdHVyZU5vZGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGRlNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhU3RydWN0dXJlTm9kZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVN0cnVjdHVyZU5vZGVzIAotewotCVN0cmluZyBDT01QSUxBVElPTl9VTklUX0lEID0gCi0JCUpwdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5qYXZhLmNvbXBpbGF0aW9uVW5pdCI7Ci0JCi0JU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9JRCA9IAotCQlKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuamF2YS5wZXJzaXN0ZW50VHlwZSI7Ci0JCi0JU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lEID0gCi0JCUpwdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5qYXZhLnBlcnNpc3RlbnRBdHRyaWJ1dGUiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYTkzOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVRhYmxlIGV4dGVuZHMgVGFibGUsIEphdmFKcGFDb250ZXh0Tm9kZQotewotCXZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBlcnNpc3RlbnRSZXNvdXJjZSk7Ci0JCi0Jdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwZXJzaXN0ZW50UmVzb3VyY2UpOwotCi0JCi0JLy8qKioqKioqKioqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCi0JSmF2YVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVRhYmxlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUYWJsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTBkYjFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVRhYmxlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVRhYmxlR2VuZXJhdG9yCi0JZXh0ZW5kcyBKYXZhR2VuZXJhdG9yLCBUYWJsZUdlbmVyYXRvcgotewotCXZvaWQgaW5pdGlhbGl6ZShUYWJsZUdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yKTsKLQkKLQl2b2lkIHVwZGF0ZShUYWJsZUdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yKTsKLQkKLQkKLQkvLyoqKioqKioqKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMoKTsKLQkKLQlKYXZhVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUcmFuc2llbnRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUcmFuc2llbnRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhY2NhYWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFUcmFuc2llbnRNYXBwaW5nCi0JZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZywgVHJhbnNpZW50TWFwcGluZwotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljYmNmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVHlwZU1hcHBpbmcgZXh0ZW5kcyBUeXBlTWFwcGluZywgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0Jdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCQotCXZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCQotCVN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCQotCUl0ZXJhdG9yPFN0cmluZz4gY29ycmVzcG9uZGluZ0Fubm90YXRpb25OYW1lcygpOwotCQotCUphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpOwotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUeXBlTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUeXBlTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZTllOTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVHlwZU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotCi0vKioKLSAqIE1hcCBhIHN0cmluZyBrZXkgdG8gYSB0eXBlIG1hcHBpbmcgYW5kIGl0cyBjb3JyZXNwb25kaW5nCi0gKiBKYXZhIGFubm90YXRpb24gYWRhcHRlci4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIgewotCi0JLyoqCi0JICogQSB1bmlxdWUgU3RyaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIElKYXZhVHlwZU1hcHBpbmcga2V5IAotCSAqLwotCVN0cmluZyBnZXRLZXkoKTsKLQotCVN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBJSmF2YVR5cGVNYXBwaW5nIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlLiAgVXNlIHRoZSBJSnBhRmFjdG9yeQotCSAqIGZvciBjcmVhdGlvbiBzbyB0aGF0IGV4dGVuZGVycyBjYW4gY3JlYXRlIHRoZWlyIG93biBJSnBhRmFjdG9yeSBpbnN0ZWFkIG9mIAotCSAqIGNyZWF0aW5nIHRoZWlyIG93biB0eXBlTWFwcGluZ1Byb3ZpZGVyLgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGpwYUZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFVbmlxdWVDb25zdHJhaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFVbmlxdWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjZlZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVVuaXF1ZUNvbnN0cmFpbnQgZXh0ZW5kcyBVbmlxdWVDb25zdHJhaW50LCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQl2b2lkIGluaXRpYWxpemUoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pOwotCQotCXZvaWQgdXBkYXRlKFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA3N2IxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVmVyc2lvbk1hcHBpbmcKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nLCBWZXJzaW9uTWFwcGluZywgSmF2YUNvbHVtbk1hcHBpbmcKLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL0VudGl0eU1hcHBpbmdzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vRW50aXR5TWFwcGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4N2FhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vRW50aXR5TWFwcGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5SG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW50aXR5TWFwcGluZ3MgZXh0ZW5kcyBPcm1KcGFDb250ZXh0Tm9kZSwgSnBhU3RydWN0dXJlTm9kZSwgUXVlcnlIb2xkZXIKLXsKLQkKLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCQkKLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbik7Ci0JCVN0cmluZyBERVNDUklQVElPTl9QUk9QRVJUWSA9ICJkZXNjcmlwdGlvblByb3BlcnR5IjsKLQotCVN0cmluZyBnZXRQYWNrYWdlKCk7Ci0Jdm9pZCBzZXRQYWNrYWdlKFN0cmluZyBuZXdQYWNrYWdlKTsKLQkJU3RyaW5nIFBBQ0tBR0VfUFJPUEVSVFkgPSAicGFja2FnZVByb3BlcnR5IjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkU2NoZW1hIGlmIG5vdCBudWxsLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0U2NoZW1hLgotCSAqLwotCVN0cmluZyBnZXRTY2hlbWEoKTsKLQlTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlTdHJpbmcgREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgPSAiZGVmYXVsdFNjaGVtYVByb3BlcnR5IjsKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIG5ld1NwZWNpZmllZFNjaGVtYSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZID0gInNwZWNpZmllZFNjaGVtYVByb3BlcnR5IjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkQ2F0YWxvZyBpZiBub3QgbnVsbCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdENhdGFsb2cuCi0JICovCi0JU3RyaW5nIGdldENhdGFsb2coKTsKLQlTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSA9ICJkZWZhdWx0Q2F0YWxvZ1Byb3BlcnR5IjsKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCXZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgbmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSA9ICJzcGVjaWZpZWRDYXRhbG9nUHJvcGVydHkiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWRBY2Nlc3MgaWYgbm90IG51bGwsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHRBY2Nlc3MuCi0JICovCi0JQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKTsKLQlBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKTsKLQkJU3RyaW5nIERFRkFVTFRfQUNDRVNTX1BST1BFUlRZID0gImRlZmF1bHRBY2Nlc3NQcm9wZXJ0eSI7Ci0JQWNjZXNzVHlwZSBnZXRTcGVjaWZpZWRBY2Nlc3MoKTsKLQl2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIG5ld1NwZWNpZmllZEFjY2Vzcyk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZID0gInNwZWNpZmllZEFjY2Vzc1Byb3BlcnR5IjsKLQotCQkKLQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQotCQotCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gb3JtUGVyc2lzdGVudFR5cGVzKCk7Ci0JaW50IG9ybVBlcnNpc3RlbnRUeXBlc1NpemUoKTsKLQlPcm1QZXJzaXN0ZW50VHlwZSBhZGRPcm1QZXJzaXN0ZW50VHlwZShTdHJpbmcgbWFwcGluZ0tleSwgU3RyaW5nIGNsYXNzTmFtZSk7Ci0Jdm9pZCByZW1vdmVPcm1QZXJzaXN0ZW50VHlwZShpbnQgaW5kZXgpOwotCXZvaWQgcmVtb3ZlT3JtUGVyc2lzdGVudFR5cGUoT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUpOwotCS8vdm9pZCBtb3ZlT3JtUGVyc2lzdGVudFR5cGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCWJvb2xlYW4gY29udGFpbnNQZXJzaXN0ZW50VHlwZShTdHJpbmcgY2xhc3NOYW1lKTsKLQkJU3RyaW5nIFBFUlNJU1RFTlRfVFlQRVNfTElTVCA9ICJwZXJzaXN0ZW50VHlwZXMiOwotCQotCi0JTGlzdEl0ZXJhdG9yPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvcnMoKTsKLQlpbnQgc2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpOwotCU9ybVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKGludCBpbmRleCk7Ci0Jdm9pZCByZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcihpbnQgaW5kZXgpOwotCXZvaWQgcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoT3JtU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IpOwotCXZvaWQgbW92ZVNlcXVlbmNlR2VuZXJhdG9yKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUlNfTElTVCA9ICJzZXF1ZW5jZUdlbmVyYXRvcnNMaXN0IjsKLQotCUxpc3RJdGVyYXRvcjxPcm1UYWJsZUdlbmVyYXRvcj4gdGFibGVHZW5lcmF0b3JzKCk7Ci0JaW50IHRhYmxlR2VuZXJhdG9yc1NpemUoKTsKLQlPcm1UYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcihpbnQgaW5kZXgpOwotCXZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoaW50IGluZGV4KTsKLQl2b2lkIHJlbW92ZVRhYmxlR2VuZXJhdG9yKE9ybVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKTsKLQl2b2lkIG1vdmVUYWJsZUdlbmVyYXRvcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JTX0xJU1QgPSAidGFibGVHZW5lcmF0b3JzTGlzdCI7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzKCk7Ci0JaW50IG5hbWVkUXVlcmllc1NpemUoKTsKLQlPcm1OYW1lZFF1ZXJ5IGFkZE5hbWVkUXVlcnkoaW50IGluZGV4KTsKLQl2b2lkIHJlbW92ZU5hbWVkUXVlcnkoaW50IGluZGV4KTsKLQl2b2lkIG1vdmVOYW1lZFF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQlpbnQgbmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpOwotCU9ybU5hbWVkTmF0aXZlUXVlcnkgYWRkTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpOwotCXZvaWQgcmVtb3ZlTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpOwotCXZvaWQgbW92ZU5hbWVkTmF0aXZlUXVlcnkoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JCQotCQotCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgT3JtUGVyc2lzdGVudFR5cGUpIGxpc3RlZCBpbiB0aGlzIG1hcHBpbmcgZmlsZQotCSAqIHdpdGggdGhlIGdpdmVuIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUuICBSZXR1cm4gbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCi0Jdm9pZCBjaGFuZ2VNYXBwaW5nKE9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlLCBPcm1UeXBlTWFwcGluZyBvbGRNYXBwaW5nLCBPcm1UeXBlTWFwcGluZyBuZXdNYXBwaW5nKTsKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQotCXZvaWQgdXBkYXRlKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKTsKLQkKLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyYWVmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZSwgT3JtSnBhQ29udGV4dE5vZGUKLXsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBkZWZhdWx0Sm9pbkNvbHVtbnMoKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCi0JT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQl2b2lkIHVwZGF0ZShYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1BdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWYxMGM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1BdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcsIE9ybUpwYUNvbnRleHROb2RlCi17Ci0JT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSk7Ci0JU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsKLQotCi0JSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQlTdHJpbmcgSkFWQV9QRVJTSVNURU5UX0FUVFJJQlVURV9QUk9QRVJUWSA9ICJqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBBdHRyaWJ1dGVzIGFyZSBhIHNlcXVlbmNlIGluIHRoZSBvcm0gc2NoZW1hLiBXZSBtdXN0IGtlZXAKLQkgKiB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGluIHRoZSBhcHByb3ByaWF0ZSBvcmRlciBzbyB0aGUgd3RwIHhtbCAKLQkgKiB0cmFuc2xhdG9ycyB3aWxsIHdyaXRlIHRoZW0gdG8gdGhlIHhtbCBpbiB0aGF0IG9yZGVyIGFuZCB0aGV5Ci0JICogd2lsbCBhZGhlcmUgdG8gdGhlIHNjaGVtYS4gIAotCSAqIAotCSAqIEVhY2ggY29uY3JldGUgc3ViY2xhc3Mgb2YgWG1sQXR0cmlidXRlTWFwcGluZyBtdXN0IGltcGxlbWVudCB0aGlzCi0JICogbWV0aG9kIGFuZCByZXR1cm4gYW4gaW50IHRoYXQgbWF0Y2hlcyBpdCdzIG9yZGVyIGluIHRoZSBzY2hlbWEKLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IGdldFhtbFNlcXVlbmNlKCk7Ci0KLQl2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpOwotCQotCVhtbEF0dHJpYnV0ZU1hcHBpbmcgYWRkVG9SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpOwotCi0KLQl2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbU9ybUF0dHJpYnV0ZU1hcHBpbmcoT3JtQXR0cmlidXRlTWFwcGluZyBvbGRNYXBwaW5nKTsKLQotCXZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1CYXNpY01hcHBpbmcoT3JtQmFzaWNNYXBwaW5nIG9sZE1hcHBpbmcpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbU9ybUlkTWFwcGluZyhPcm1JZE1hcHBpbmcgb2xkTWFwcGluZyk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tT3JtVHJhbnNpZW50TWFwcGluZyhPcm1UcmFuc2llbnRNYXBwaW5nIG9sZE1hcHBpbmcpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbU9ybUVtYmVkZGVkTWFwcGluZyhPcm1FbWJlZGRlZE1hcHBpbmcgb2xkTWFwcGluZyk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tT3JtRW1iZWRkZWRJZE1hcHBpbmcoT3JtRW1iZWRkZWRJZE1hcHBpbmcgb2xkTWFwcGluZyk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tT3JtVmVyc2lvbk1hcHBpbmcoT3JtVmVyc2lvbk1hcHBpbmcgb2xkTWFwcGluZyk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tT3JtT25lVG9NYW55TWFwcGluZyhPcm1PbmVUb01hbnlNYXBwaW5nIG9sZE1hcHBpbmcpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbU9ybU1hbnlUb09uZU1hcHBpbmcoT3JtTWFueVRvT25lTWFwcGluZyBvbGRNYXBwaW5nKTsKLQotCXZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1PbmVUb09uZU1hcHBpbmcoT3JtT25lVG9PbmVNYXBwaW5nIG9sZE1hcHBpbmcpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbU9ybU1hbnlUb01hbnlNYXBwaW5nKE9ybU1hbnlUb01hbnlNYXBwaW5nIG9sZE1hcHBpbmcpOwotCi0JYm9vbGVhbiBjb250YWlucyhpbnQgdGV4dE9mZnNldCk7Ci0KLQlUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MDQ2MjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCVN0cmluZyBnZXRLZXkoKTsKLQkKLQlPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQXR0cmlidXRlTWFwcGluZyhKcGFGYWN0b3J5IGZhY3RvcnksIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2NDZmNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQXR0cmlidXRlT3ZlcnJpZGUgZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZSwgT3JtSnBhQ29udGV4dE5vZGUKLXsKLQlPcm1Db2x1bW4gZ2V0Q29sdW1uKCk7Ci0KLQl2b2lkIHVwZGF0ZShYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2VDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1CYXNlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMmIyMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2VDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQmFzZUNvbHVtbiBleHRlbmRzIEJhc2VDb2x1bW4sIE9ybU5hbWVkQ29sdW1uCi17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIChiZXN0IGd1ZXNzKSB0ZXh0IGxvY2F0aW9uIG9mIHRoZSBjb2x1bW4ncyB0YWJsZS4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoKTsKLQotCU93bmVyIGdldE93bmVyKCk7Ci0JCi0JLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKiAoZS5nLiBiYXNpYyBtYXBwaW5ncyBhbmQgYXR0cmlidXRlIG92ZXJyaWRlcykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIgZXh0ZW5kcyBPcm1OYW1lZENvbHVtbi5Pd25lciwgQmFzZUNvbHVtbi5Pd25lcgotCXsKLQkJLy8gbm90aGluZz8KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1CYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGI2OWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUVtYmVkZGVkTWFwcGluZzsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQmFzZUVtYmVkZGVkTWFwcGluZyBleHRlbmRzIEJhc2VFbWJlZGRlZE1hcHBpbmcsIE9ybUF0dHJpYnV0ZU1hcHBpbmcKLXsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0KLQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQmFzZUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1CYXNlSm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjE0MTU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1CYXNlSm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUJhc2VKb2luQ29sdW1uIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW4sIE9ybU5hbWVkQ29sdW1uCi17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIChiZXN0IGd1ZXNzKSB0ZXh0IGxvY2F0aW9uIG9mIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lCi0JICovCi0JVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCk7Ci0KLQkKLQlPd25lciBnZXRPd25lcigpOwotCS8qKgotCSAqIGludGVyZmFjZSBhbGxvd2luZyBqb2luIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKiAoZS5nLiAxOjEgbWFwcGluZ3MgYW5kIGpvaW4gdGFibGVzKQotCSAqLwotCWludGVyZmFjZSBPd25lciBleHRlbmRzIEJhc2VKb2luQ29sdW1uLk93bmVyLCBPcm1OYW1lZENvbHVtbi5Pd25lcgotCXsKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQmFzaWNNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQmFzaWNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjkwYjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQmFzaWNNYXBwaW5nIGV4dGVuZHMgQmFzaWNNYXBwaW5nLCBPcm1BdHRyaWJ1dGVNYXBwaW5nLCBPcm1Db2x1bW5NYXBwaW5nCi17Ci0Jdm9pZCBpbml0aWFsaXplKFhtbEJhc2ljIGJhc2ljKTsKLQotCXZvaWQgdXBkYXRlKFhtbEJhc2ljIGJhc2ljKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjcwNWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUNvbHVtbiBleHRlbmRzIENvbHVtbiwgT3JtQmFzZUNvbHVtbgotewotCQotCU93bmVyIGdldE93bmVyKCk7Ci0JCi0Jdm9pZCBpbml0aWFsaXplRnJvbShDb2x1bW4gb2xkQ29sdW1uKTsKLQl2b2lkIGluaXRpYWxpemUoWG1sQ29sdW1uIGNvbHVtbik7Ci0Jdm9pZCB1cGRhdGUoWG1sQ29sdW1uIGNvbHVtbik7Ci0KLQkJLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKiAoZS5nLiBiYXNpYyBtYXBwaW5ncyBhbmQgYXR0cmlidXRlIG92ZXJyaWRlcykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIgZXh0ZW5kcyBPcm1CYXNlQ29sdW1uLk93bmVyCi0JewotCQlYbWxDb2x1bW4gZ2V0Q29sdW1uUmVzb3VyY2UoKTsKLQkJCi0JCXZvaWQgYWRkQ29sdW1uUmVzb3VyY2UoKTsKLQkJCi0JCXZvaWQgcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQ29sdW1uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUNvbHVtbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiYThkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQ29sdW1uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uTWFwcGluZzsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQ29sdW1uTWFwcGluZyBleHRlbmRzIENvbHVtbk1hcHBpbmcsIE9ybUNvbHVtbi5Pd25lcgotewotCi0JT3JtQ29sdW1uIGdldENvbHVtbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1EaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MDAxNTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRGlzY3JpbWluYXRvckNvbHVtbiBleHRlbmRzIERpc2NyaW1pbmF0b3JDb2x1bW4sIE9ybU5hbWVkQ29sdW1uCi17Ci0Jdm9pZCBpbml0aWFsaXplKFhtbEVudGl0eSBlbnRpdHkpOwotCi0Jdm9pZCB1cGRhdGUoWG1sRW50aXR5IGVudGl0eSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1FbWJlZGRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YjhiMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1FbWJlZGRhYmxlIGV4dGVuZHMgRW1iZWRkYWJsZSwgT3JtVHlwZU1hcHBpbmcKLXsKLQl2b2lkIGluaXRpYWxpemUoWG1sRW1iZWRkYWJsZSBtYXBwZWRTdXBlcmNsYXNzKTsKLQotCXZvaWQgdXBkYXRlKFhtbEVtYmVkZGFibGUgbWFwcGVkU3VwZXJjbGFzcyk7Ci0JCi0JSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCk7Ci0KLQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MjI5OGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1FbWJlZGRlZElkTWFwcGluZyBleHRlbmRzIEVtYmVkZGVkSWRNYXBwaW5nLCBPcm1CYXNlRW1iZWRkZWRNYXBwaW5nCi17Ci0JTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCi0Jdm9pZCBpbml0aWFsaXplKFhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZCk7Ci0KLQkgdm9pZCB1cGRhdGUoWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NjBhNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1FbWJlZGRlZE1hcHBpbmcgZXh0ZW5kcyBFbWJlZGRlZE1hcHBpbmcsIE9ybUJhc2VFbWJlZGRlZE1hcHBpbmcKLXsKLQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0KLQl2b2lkIGluaXRpYWxpemUoWG1sRW1iZWRkZWQgZW1iZWRkZWQpOwotCi0Jdm9pZCB1cGRhdGUoWG1sRW1iZWRkZWQgZW1iZWRkZWQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1FbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1FbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4NDg0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUVudGl0eSBleHRlbmRzIE9ybVR5cGVNYXBwaW5nLCBFbnRpdHksIE9ybUdlbmVyYXRvckhvbGRlcgotewotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgdmlydHVhbChub3Qgc3BlY2lmaWVkKSBzZWNvbmRhcnkgdGFibGVzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKTsKLQkJU3RyaW5nIFZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNUID0gInZpcnR1YWxTZWNvbmRhcnlUYWJsZXNMaXN0IjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB2aXJ0dWFsIHNlY29uZGFyeSB0YWJsZXMuCi0JICovCi0JaW50IHZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBjb250YWlucyB0aGUgZ2l2ZW4gc2Vjb25kYXJ5IHRhYmxlIGluIGl0cyBsaXN0IG9mCi0JICogdmlydHVhbCBzZWNvbmRhcnkgdGFibGVzCi0JICovCQotCWJvb2xlYW4gY29udGFpbnNWaXJ0dWFsU2Vjb25kYXJ5VGFibGUoT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpOwotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBubyB2aXJ0dWFsIHNlY29uZGFyeSB0YWJsZXMgb24gdGhlIG9ybSBlbnRpdHkuCi0JICogVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBjYW4gYWRkIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGVzLgotCSAqIFlvdSBtdXN0IGZpcnN0IG1ha2Ugc3VyZSBhbGwgdmlydHVhbCBzZWNvbmRhcnkgdGFibGVzIGhhdmUgYmVlbiBzcGVjaWZpZWQKLQkgKiBpbiB4bWwgYmVmb3JlIGFkZGluZyBtb3JlLiAgVGhpcyBpcyBiZWNhdXNlIGFkZGluZyBvbmUgc2Vjb25kYXJ5IHRhYmxlIHRvIHhtbAotCSAqIHdpbGwgb3ZlcnJpZGUgYWxsIHRoZSBzZWNvbmRhcnkgdGFibGVzIHNwZWNpZmllZCBpbiB0aGUgamF2YSBlbnRpdHkKLQkgKi8KLQlib29sZWFuIHNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbCgpOwotCQotCS8qKgotCSAqIElmIHRydWUsIHRoZW4gYWxsIHZpcnR1YWwgc2Vjb25kYXJ5IHRhYmxlcyBhcmUgYWRkZWQgaW4gYXMgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZXMgdG8gdGhlIHhtbC4KLQkgKiBJZiBmYWxzZSwgdGhlbiBhbGwgdGhlIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGVzIGFyZSByZW12b2VkIGZyb20gdGhlIHhtbC4KLQkgKi8KLQl2b2lkIHNldFNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbChib29sZWFuIGRlZmluZUluWG1sKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgRW50aXR5IHRoaXMgT1JNIEVudGl0eSBjb3JyZXNwb25kcyB0by4gIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vCi0JICogamF2YSBlbnRpdHkuCi0JICovCi0JSmF2YUVudGl0eSBnZXRKYXZhRW50aXR5KCk7Ci0KLQl2b2lkIGluaXRpYWxpemUoWG1sRW50aXR5IGVudGl0eSk7Ci0KLQl2b2lkIHVwZGF0ZShYbWxFbnRpdHkgZW50aXR5KTsKLQkKLQkKLQkvLyoqKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioqKioKLQkKLQlPcm1UYWJsZSBnZXRUYWJsZSgpOwotCQotCU9ybURpc2NyaW1pbmF0b3JDb2x1bW4gZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzKCk7CQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7Ci0JT3JtU2Vjb25kYXJ5VGFibGUgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IGluZGV4KTsKLQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCVN0cmluZyBERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUID0gImRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0IjsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JT3JtQXR0cmlidXRlT3ZlcnJpZGUgZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSk7Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMoKTsKLQlPcm1OYW1lZFF1ZXJ5IGFkZE5hbWVkUXVlcnkoaW50IGluZGV4KTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JT3JtTmFtZWROYXRpdmVRdWVyeSBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCk7Ci0JCi0JSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCk7Ci0KLQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUdlbmVyYXRlZFZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdGVkVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwMzFlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdGVkVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtR2VuZXJhdGVkVmFsdWUgZXh0ZW5kcyBHZW5lcmF0ZWRWYWx1ZSwgT3JtSnBhQ29udGV4dE5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIChiZXN0IGd1ZXNzKSB0ZXh0IGxvY2F0aW9uIG9mIHRoZSBnZW5lcmF0b3IuCi0JICovCi0JVGV4dFJhbmdlIGdldEdlbmVyYXRvclRleHRSYW5nZSgpOwotCi0Jdm9pZCBpbml0aWFsaXplKFhtbEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlKTsKLQotCXZvaWQgdXBkYXRlKFhtbEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZmE2YTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yCi17Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdG9ySG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdG9ySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzVkNzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUdlbmVyYXRvckhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9ySG9sZGVyOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1HZW5lcmF0b3JIb2xkZXIgZXh0ZW5kcyBHZW5lcmF0b3JIb2xkZXIKLXsKLQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0JT3JtU2VxdWVuY2VHZW5lcmF0b3IgYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCU9ybVRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0KLQlPcm1UYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1JZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1JZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2MzI3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1JZE1hcHBpbmcgZXh0ZW5kcyBJZE1hcHBpbmcsIE9ybUNvbHVtbk1hcHBpbmcsIE9ybUF0dHJpYnV0ZU1hcHBpbmcsIE9ybUdlbmVyYXRvckhvbGRlcgotewotCU9ybUdlbmVyYXRlZFZhbHVlIGdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JT3JtR2VuZXJhdGVkVmFsdWUgYWRkR2VuZXJhdGVkVmFsdWUoKTsJCi0JCi0Jdm9pZCBpbml0aWFsaXplKFhtbElkIGlkKTsKLQotCXZvaWQgdXBkYXRlKFhtbElkIGlkKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmNmQxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtSm9pbkNvbHVtbiBleHRlbmRzIEpvaW5Db2x1bW4sIE9ybUJhc2VKb2luQ29sdW1uLCBPcm1CYXNlQ29sdW1uCi17Ci0Jdm9pZCBpbml0aWFsaXplRnJvbShKb2luQ29sdW1uIG9sZENvbHVtbik7Ci0JCi0Jdm9pZCBpbml0aWFsaXplKFhtbEpvaW5Db2x1bW4gY29sdW1uKTsKLQkKLQl2b2lkIHVwZGF0ZShYbWxKb2luQ29sdW1uIGNvbHVtbik7Ci0JCi0JT3duZXIgZ2V0T3duZXIoKTsKLQotCS8qKgotCSAqIGludGVyZmFjZSBhbGxvd2luZyBqb2luIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKiAoZS5nLiAxOjEgbWFwcGluZ3MgYW5kIGpvaW4gdGFibGVzKQotCSAqLwotCWludGVyZmFjZSBPd25lciBleHRlbmRzIEpvaW5Db2x1bW4uT3duZXIsIE9ybUJhc2VKb2luQ29sdW1uLk93bmVyLCBPcm1CYXNlQ29sdW1uLk93bmVyCi0JewotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3OTQxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZzsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtSm9pblRhYmxlIGV4dGVuZHMgSm9pblRhYmxlLCBPcm1KcGFDb250ZXh0Tm9kZQotewotCi0JYm9vbGVhbiBpc1NwZWNpZmllZCgpOwotCi0Jdm9pZCBpbml0aWFsaXplKFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyk7Ci0KLQl2b2lkIHVwZGF0ZShYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQkKLQl2b2lkIGluaXRpYWxpemVGcm9tKEpvaW5UYWJsZSBvbGRKb2luVGFibGUpOwotCi0JCi0JLy8qKioqKioqKioqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqKioqKioqKioqCi0JCi0JT3JtUmVsYXRpb25zaGlwTWFwcGluZyBnZXRQYXJlbnQoKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKTsKLQotCU9ybUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQotCU9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGludmVyc2VKb2luQ29sdW1ucygpOwotCi0JT3JtSm9pbkNvbHVtbiBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0KLQlPcm1Kb2luQ29sdW1uIGFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCi0JT3JtVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUpwYUNvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSnBhQ29udGV4dE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhMzQ2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSnBhQ29udGV4dE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUpwYUNvbnRleHROb2RlIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCB0byB0aGUgbGlzdCBvZiBjdXJyZW50IHZhbGlkYXRpb24gbWVzc2FnZXMKLQkgKi8KLQl2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpOwotCi0JVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QwZmE3OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1NYW55VG9NYW55TWFwcGluZyBleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nLCBPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQotCXZvaWQgaW5pdGlhbGl6ZShYbWxNYW55VG9NYW55IHhtbE1hbnlUb01hbnkpOwotCi0Jdm9pZCB1cGRhdGUoWG1sTWFueVRvTWFueSB4bWxNYW55VG9NYW55KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzM2I4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU1hbnlUb09uZU1hcHBpbmcgZXh0ZW5kcyBNYW55VG9PbmVNYXBwaW5nLCBPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCk7Ci0JCi0JTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0KLQl2b2lkIGluaXRpYWxpemUoWG1sTWFueVRvT25lIHhtbE1hbnlUb09uZSk7Ci0KLQl2b2lkIHVwZGF0ZShYbWxNYW55VG9PbmUgeG1sTWFueVRvT25lKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NThhODg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTWFwcGVkU3VwZXJjbGFzcyBleHRlbmRzIE1hcHBlZFN1cGVyY2xhc3MsIE9ybVR5cGVNYXBwaW5nCi17Ci0Jdm9pZCBpbml0aWFsaXplKFhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyk7Ci0KLQl2b2lkIHVwZGF0ZShYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MpOwotCQotCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCi0JSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NTUyM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgZXh0ZW5kcyBPcm1SZWxhdGlvbnNoaXBNYXBwaW5nLCBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQotCU9ybUpvaW5UYWJsZSBnZXRKb2luVGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1OYW1lZENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU5hbWVkQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNmE5ZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU5hbWVkQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1OYW1lZENvbHVtbiBleHRlbmRzIE5hbWVkQ29sdW1uLCBPcm1KcGFDb250ZXh0Tm9kZQotewotCi0JT3duZXIgZ2V0T3duZXIoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIChiZXN0IGd1ZXNzKSB0ZXh0IGxvY2F0aW9uIG9mIHRoZSBjb2x1bW4ncyBuYW1lLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCk7Ci0KLQkvKioKLQkgKiBpbnRlcmZhY2UgYWxsb3dpbmcgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIGJhc2ljIG1hcHBpbmdzIGFuZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzKQotCSAqLwotCWludGVyZmFjZSBPd25lciBleHRlbmRzIE5hbWVkQ29sdW1uLk93bmVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb2x1bW4gb3duZXIncyB0ZXh0IHJhbmdlLiBUaGlzIGNhbiBiZSByZXR1cm5lZCBieSB0aGUKLQkJICogY29sdW1uIHdoZW4gaXRzIGFubm90YXRpb24gaXMgbm90IHByZXNlbnQuCi0JCSAqLwotCQlUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTmFtZWROYXRpdmVRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBlMTEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnk7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU5hbWVkTmF0aXZlUXVlcnkgZXh0ZW5kcyBPcm1RdWVyeSwgTmFtZWROYXRpdmVRdWVyeQotewotCUxpc3RJdGVyYXRvcjxPcm1RdWVyeUhpbnQ+IGhpbnRzKCk7Ci0KLQl2b2lkIGluaXRpYWxpemUoWG1sTmFtZWROYXRpdmVRdWVyeSBxdWVyeVJlc291cmNlKTsKLQotCXZvaWQgdXBkYXRlKFhtbE5hbWVkTmF0aXZlUXVlcnkgcXVlcnlSZXNvdXJjZSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTmFtZWRRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU5hbWVkUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzN2JhNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTmFtZWRRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1OYW1lZFF1ZXJ5IGV4dGVuZHMgT3JtUXVlcnksIE5hbWVkUXVlcnkKLXsJCi0JTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gaGludHMoKTsKLQkKLQl2b2lkIGluaXRpYWxpemUoWG1sTmFtZWRRdWVyeSBxdWVyeVJlc291cmNlKTsKLQotCXZvaWQgdXBkYXRlKFhtbE5hbWVkUXVlcnkgcXVlcnlSZXNvdXJjZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMDU2MGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtT25lVG9NYW55TWFwcGluZyBleHRlbmRzIE9uZVRvTWFueU1hcHBpbmcsIE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZwotewotCi0Jdm9pZCBpbml0aWFsaXplKFhtbE9uZVRvTWFueSB4bWxPbmVUb01hbnkpOwotCi0Jdm9pZCB1cGRhdGUoWG1sT25lVG9NYW55IHhtbE9uZVRvTWFueSk7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmUyYWFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtT25lVG9PbmVNYXBwaW5nIGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nLCBPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0KLQl2b2lkIGluaXRpYWxpemUoWG1sT25lVG9PbmUgb25lVG9PbmUpOwotCi0Jdm9pZCB1cGRhdGUoWG1sT25lVG9PbmUgb25lVG9PbmUpOwotCQotCQotCS8vICoqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqCi0JTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCk7Ci0KLQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQotCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhZGYzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBleHRlbmRzIFBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybUpwYUNvbnRleHROb2RlCi17Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGVuIHRvIHJldHVybiB7QGxpbmsgT3JtQXR0cmlidXRlTWFwcGluZ31zCi0JICovCi0JT3JtQXR0cmlidXRlTWFwcGluZyBnZXRNYXBwaW5nKCk7Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGVuIHRvIHJldHVybiB7QGxpbmsgT3JtQXR0cmlidXRlTWFwcGluZ31zCi0JICovCi0JT3JtQXR0cmlidXRlTWFwcGluZyBnZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGVuIHRvIHJldHVybiB7QGxpbmsgT3JtVHlwZU1hcHBpbmd9cwotCSAqLwotCU9ybVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCk7Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGVuIHRvIHJldHVybiB7QGxpbmsgT3JtUGVyc2lzdGVudFR5cGV9cwotCSAqLwotCU9ybVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCi0JYm9vbGVhbiBjb250YWlucyhpbnQgdGV4dE9mZnNldCk7Ci0KLQkvKioKLQkgKiBNYWtlIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSB2aXJ0dWFsLiBUaGUgYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZAotCSAqIGZyb20gdGhlIGxpc3Qgb2Ygc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlcyBvbiB0aGUge0BsaW5rIE9ybVBlcnNpc3RlbnRUeXBlfSAKLQkgKiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBvcm0ueG1sIGZpbGUuCi0JICogCi0JICogSWYgdGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlIGlzIGFscmVhZHkgdmlydHVhbCwgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzIHRocm93bgotCSAqIEBzZWUgUGVyc2lzdGVudEF0dHJpYnV0ZSNpc1ZpcnR1YWwoKQotCSAqLwotCXZvaWQgbWFrZVZpcnR1YWwoKTsKLQkKLQkvKioKLQkgKiBUYWtlIGEgdmlydHVhbCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBhbmQgc3BlY2lmeSBpdC4KLQkgKiBUaGUgYXR0cmlidXRlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2Ygc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlcwotCSAqIGFuZCBhZGRlZCB0byB0aGUgb3JtLnhtbCBmaWxlLiBUaGUgbWFwcGluZ0tleSB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KLQkgKiAKLQkgKiBJZiB0aGUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgaXMgYWxyZWFkeSBzcGVjaWZpZWQsIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpcyB0aHJvd24KLQkgKiBAc2VlIFBlcnNpc3RlbnRBdHRyaWJ1dGUjaXNWaXJ0dWFsKCkKLQkgKi8KLQl2b2lkIG1ha2VTcGVjaWZpZWQoKTsKLQkKLQkvKioKLQkgKiBUYWtlIGEgdmlydHVhbCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBhbmQgc3BlY2lmeSBpdC4KLQkgKiBUaGUgYXR0cmlidXRlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2Ygc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlcwotCSAqIGFuZCBhZGRlZCB0byB0aGUgb3JtLnhtbCBmaWxlLiBUaGUgbWFwcGluZ0tleSB3aWxsIGRldGVybWluZSB0aGUgdHlwZSBvZiBtYXBwaW5nIGFkZGVkCi0JICogaW5zdGVhZCBvZiB0aGUgbWFwcGluZ0tleSBhbHJlYWR5IG9uIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZQotCSAqIAotCSAqIElmIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBpcyBhbHJlYWR5IHNwZWNpZmllZCwgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzIHRocm93bgotCSAqIEBzZWUgUGVyc2lzdGVudEF0dHJpYnV0ZSNpc1ZpcnR1YWwoKQotCSAqLwotCXZvaWQgbWFrZVNwZWNpZmllZChTdHJpbmcgbWFwcGluZ0tleSk7Ci0JCi0Jdm9pZCBuYW1lQ2hhbmdlZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpOwotCi0JCi0JLy8qKioqKioqKioqKioqKioqKioqIGluaXRpYWxpemF0aW9uL3VwZGF0aW5nICoqKioqKioqKioqKioqKioqKioKLQotCXZvaWQgaW5pdGlhbGl6ZShYbWxCYXNpYyBiYXNpYyk7Ci0JCi0Jdm9pZCBpbml0aWFsaXplKFhtbEVtYmVkZGVkIGVtYmVkZGVkKTsKLQkKLQl2b2lkIGluaXRpYWxpemUoWG1sVmVyc2lvbiB2ZXJzaW9uKTsKLQkKLQl2b2lkIGluaXRpYWxpemUoWG1sTWFueVRvT25lIG1hbnlUb09uZSk7Ci0JCi0Jdm9pZCBpbml0aWFsaXplKFhtbE9uZVRvTWFueSBvbmVUb01hbnkpOwotCQotCXZvaWQgaW5pdGlhbGl6ZShYbWxPbmVUb09uZSBvbmVUb09uZSk7Ci0JCi0Jdm9pZCBpbml0aWFsaXplKFhtbE1hbnlUb01hbnkgbWFueVRvTWFueSk7Ci0JCi0Jdm9pZCBpbml0aWFsaXplKFhtbElkIGlkKTsKLQkKLQl2b2lkIGluaXRpYWxpemUoWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkKTsKLQkKLQl2b2lkIGluaXRpYWxpemUoWG1sVHJhbnNpZW50IHRyYW5zaWVudFJlc291cmNlKTsKLQkKLQl2b2lkIGluaXRpYWxpemUoWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQotCXZvaWQgdXBkYXRlKFhtbElkIGlkKTsKLQkKLQl2b2lkIHVwZGF0ZShYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWQpOwotCi0Jdm9pZCB1cGRhdGUoWG1sQmFzaWMgYmFzaWMpOwotCQotCXZvaWQgdXBkYXRlKFhtbFZlcnNpb24gdmVyc2lvbik7Ci0JCi0Jdm9pZCB1cGRhdGUoWG1sTWFueVRvT25lIG1hbnlUb09uZSk7Ci0JCi0Jdm9pZCB1cGRhdGUoWG1sT25lVG9NYW55IG9uZVRvTWFueSk7Ci0JCi0Jdm9pZCB1cGRhdGUoWG1sT25lVG9PbmUgb25lVG9PbmUpOwotCQotCXZvaWQgdXBkYXRlKFhtbE1hbnlUb01hbnkgbWFueVRvTWFueSk7Ci0KLQl2b2lkIHVwZGF0ZShYbWxFbWJlZGRlZCBlbWJlZGRlZCk7Ci0JCi0Jdm9pZCB1cGRhdGUoWG1sVHJhbnNpZW50IHRyYW5zaWVudFJlc291cmNlKTsKLQkKLQl2b2lkIHVwZGF0ZShYbWxOdWxsQXR0cmlidXRlTWFwcGluZyB4bWxOdWxsQXR0cmlidXRlTWFwcGluZyk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA3ZGUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1QZXJzaXN0ZW50VHlwZSBleHRlbmRzIFBlcnNpc3RlbnRUeXBlLCBPcm1KcGFDb250ZXh0Tm9kZQotewotCS8qKgotCSAqIE92ZXJyaWRlbiB0byByZXR1cm4ge0BsaW5rIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGV9cwotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzKCk7Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGVuIHRvIHJldHVybiBhbiB7QGxpbmsgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZX0KLQkgKi8KLQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotCS8qKgotCSAqIE92ZXJyaWRlbiB0byByZXR1cm4gYW4ge0BsaW5rIE9ybVR5cGVNYXBwaW5nfQotCSAqLwotCU9ybVR5cGVNYXBwaW5nIGdldE1hcHBpbmcoKTsKLQotCS8vKioqKioqKioqKioqKioqKioqKiBzcGVjaWZpZWQgYXR0cmlidXRlcyAqKioqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSByZWFkIG9ubHkgaXRlcmF0b3Igb2YgdGhlIHNwZWNpZmllZCB7QGxpbmsgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZX1zLgotCSAqLwotCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWVkIHtAbGluayBPcm1QZXJzaXN0ZW50QXR0cmlidXRlfXMuCi0JICovCi0JaW50IHNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCk7Ci0KLQkvL1RPRE8gdGhlc2UgYXJlIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgdGVzdHMsIHBvc3NpYmx5IHJlbW92ZSB0aGVtLiAgT3JtUGVyc2lzdGVuQXR0cmlidXRlcy5zZXRWaXJ0dWFsKGJvb2xlYW4pIGlzIHVzZWQgYnkgdGhlIFVJCi0JT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKFN0cmluZyBtYXBwaW5nS2V5LCBTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0Jdm9pZCByZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKiogdnJpdHVhbCBhdHRyaWJ1dGVzICoqKioqKioqKioqKioqKioqKioKLQlTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVTX0xJU1QgPSAidmlydHVhbEF0dHJpYnV0ZXNMaXN0IjsKLQotCS8qKgotCSAqIFJldHVybiBhIHJlYWQgb25seSBpdGVyYXRvciBvZiB0aGUgdmlydHVhbCBvcm0gcGVyc2lzdGVudCBhdHRyaWJ1dGVzLiAgVGhlc2UKLQkgKiBhcmUgYXR0cmlidXRlcyB0aGF0IGV4aXN0IGluIHRoZSB1bmRlcnlsaW5nIGphdmEgY2xhc3MsIGJ1dCBhcmUgbm90IHNwZWNpZmllZAotCSAqIGluIHRoZSBvcm0ueG1sCi0JICovCi0JTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdmlydHVhbCBvcm0gcGVyc2lzdGVudCBhdHRyaWJ1dGVzLiAgVGhlc2UgYXJlIGF0dHJpYnV0ZXMgdGhhdCAKLQkgKiBleGlzdCBpbiB0aGUgdW5kZXJ5bGluZyBqYXZhIGNsYXNzLCBidXQgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIG9ybS54bWwKLQkgKi8KLQlpbnQgdmlydHVhbEF0dHJpYnV0ZXNTaXplKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBwZXJzaXN0ZW50IHR5cGUgY29udGFpbnMgdGhlIGdpdmVuIHZpcnR1YWwgcGVyc2lzdGVudCBhdHRyaWJ1dGUuCi0JICovCi0JYm9vbGVhbiBjb250YWluc1ZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBnaXZlbiBzcGVjaWZpZWQgb3JtIHBlcnNpc3RlbnQgYXR0cmlidXRlIGZyb20gdGhlIG9ybS54bWwuIFRoZSBhdHRyaWJ1dGUgCi0JICogd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG9ybS54bWwgYW5kIG1vdmVkIGZyb20gdGhlIGxpc3Qgb2Ygc3BlY2lmaWVkIGF0dHJpYnV0ZXMgCi0JICogdG8gdGhlIGxpc3Qgb2YgdmlydHVhbCBhdHRyaWJ1dGVzLgotCSAqLwotCXZvaWQgbWFrZVBlcnNpc3RlbnRBdHRyaWJ1dGVWaXJ0dWFsKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCS8qKgotCSAqIEFkZCB0aGUgZ2l2ZW4gdmlydHVhbCBvcm0gcGVyc2lzdGVudCBhdHRyaWJ1dGUgdG8gdGhlIG9ybS54bWwuIFRoZSBhdHRyaWJ1dGUgd2lsbAotCSAqIGJlIGFkZGVkIHRvIHRoZSBvcm0ueG1sIGFuZCBtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHZpcnR1YWwgYXR0cmlidXRlcyB0byB0aGUgbGlzdAotCSAqIG9mIHNwZWNpZmllZCBhdHRyaWJ1dGVzCi0JICovCi0Jdm9pZCBtYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVNwZWNpZmllZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCi0JLyoqCi0JICogQWRkIHRoZSBnaXZlbiB2aXJ0dWFsIG9ybSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSB0byB0aGUgb3JtLnhtbCB3aXRoIGEgbWFwcGluZyBvZiAKLQkgKiB0eXBlIG1hcHBpbmdLZXkuIFRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBhZGRlZCB0byB0aGUgb3JtLnhtbCBhbmQgbW92ZWQgZnJvbSAKLQkgKiB0aGUgbGlzdCBvZiB2aXJ0dWFsIGF0dHJpYnV0ZXMgdG8gdGhlIGxpc3Qgb2Ygc3BlY2lmaWVkIGF0dHJpYnV0ZXMKLQkgKi8KLQl2b2lkIG1ha2VQZXJzaXN0ZW50QXR0cmlidXRlU3BlY2lmaWVkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nIG1hcHBpbmdLZXkpOwotCi0JLy8qKioqKioqKioqKioqKioqKioqIG1hcHBpbmcgbW9ycGhpbmcgKioqKioqKioqKioqKioqKioqKgotCXZvaWQgY2hhbmdlTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybUF0dHJpYnV0ZU1hcHBpbmcgb2xkTWFwcGluZywgT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKTsKLQkKLQkKLQkvLyoqKioqKioqKioqKioqKioqKiogaW5pdGlhbGl6YXRpb24vdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKgotCi0Jdm9pZCBpbml0aWFsaXplKFhtbEVudGl0eSBlbnRpdHkpOwotCQotCXZvaWQgaW5pdGlhbGl6ZShYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MpOwotCQkKLQl2b2lkIGluaXRpYWxpemUoWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlKTsKLQkKLQl2b2lkIHVwZGF0ZShYbWxFbnRpdHkgZW50aXR5KTsKLQkKLQl2b2lkIHVwZGF0ZShYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MpOwotCQotCXZvaWQgdXBkYXRlKFhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSk7Ci0KLQkKLQkKLQlib29sZWFuIGNvbnRhaW5zKGludCB0ZXh0T2Zmc2V0KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHtAbGluayBPcm1QZXJzaXN0ZW50VHlwZSkgYXBwbGllcyB0byB0aGUKLQkgKiBnaXZlbiBmdWxseVF1YWxpZmllZFR5cGVOYW1lLgotCSAqLwotCWJvb2xlYW4gaXNGb3IoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCQotCXZvaWQgY2xhc3NDaGFuZ2VkKFN0cmluZyBvbGRDbGFzcywgU3RyaW5nIG5ld0NsYXNzKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgcGVyc2lzdGVudCB0eXBlIHRoYXQgaXMgcmVmZXJyZWQgdG8gYnkgdGhpcyBvcm0ueG1sIHBlcnNpc3RlbnQgdHlwZS4KLQkgKiBJZiB0aGVyZSBpcyBubyB1bmRlcmx5aW5nIGphdmEgcGVyc2lzdGVudCB0eXBlLCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCi0JICogQHJldHVybgotCSAqLwotCUphdmFQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlZmVlMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbiwgT3JtQmFzZUpvaW5Db2x1bW4KLXsKLQl2b2lkIGluaXRpYWxpemUoWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gY29sdW1uKTsKLQkKLQl2b2lkIHVwZGF0ZShYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBjb2x1bW4pOwotCQotCXZvaWQgaW5pdGlhbGl6ZUZyb20oUHJpbWFyeUtleUpvaW5Db2x1bW4gb2xkUGtKb2luQ29sdW1uKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1RdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzc5MGNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1RdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUXVlcnkgZXh0ZW5kcyBRdWVyeSwgT3JtSnBhQ29udGV4dE5vZGUKLXsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtUXVlcnlIaW50PiBoaW50cygpOwotCQotCU9ybVF1ZXJ5SGludCBhZGRIaW50KGludCBpbmRleCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVF1ZXJ5SGludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVF1ZXJ5SGludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDMxZmY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1RdWVyeUhpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1RdWVyeUhpbnQgZXh0ZW5kcyBRdWVyeUhpbnQsIE9ybUpwYUNvbnRleHROb2RlCi17Ci0Jdm9pZCBpbml0aWFsaXplKFhtbFF1ZXJ5SGludCBxdWVyeUhpbnQpOwotCi0Jdm9pZCB1cGRhdGUoWG1sUXVlcnlIaW50IHF1ZXJ5SGludCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzVlYTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcKLQlleHRlbmRzIE9ybUF0dHJpYnV0ZU1hcHBpbmcsIFJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtU2Vjb25kYXJ5VGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlNWNiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtU2Vjb25kYXJ5VGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1TZWNvbmRhcnlUYWJsZSBleHRlbmRzIFNlY29uZGFyeVRhYmxlLCBPcm1KcGFDb250ZXh0Tm9kZQotewotCi0Jdm9pZCB1cGRhdGUoWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbShTZWNvbmRhcnlUYWJsZSBvbGRTZWNvbmRhcnlUYWJsZSk7Ci0KLQkKLQkvLyoqKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioqKioKLQotCU9ybUVudGl0eSBnZXRQYXJlbnQoKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQotCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCi0JT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMoKTsKLQkKLQlPcm1VbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtU2VxdWVuY2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1TZXF1ZW5jZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDc1YTNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1TZXF1ZW5jZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1TZXF1ZW5jZUdlbmVyYXRvciBleHRlbmRzIFNlcXVlbmNlR2VuZXJhdG9yLCBPcm1HZW5lcmF0b3IsIE9ybUpwYUNvbnRleHROb2RlCi17Ci0Jdm9pZCBpbml0aWFsaXplKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKTsKLQotCXZvaWQgdXBkYXRlKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWQxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIGV4dGVuZHMgT3JtUmVsYXRpb25zaGlwTWFwcGluZywgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwotewotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucygpOwotCQotCU9ybUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkKLQlPcm1Kb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1TdHJ1Y3R1cmVOb2Rlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVN0cnVjdHVyZU5vZGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTVkYmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVN0cnVjdHVyZU5vZGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtU3RydWN0dXJlTm9kZXMgCi17Ci0JCi0JU3RyaW5nIEVOVElUWV9NQVBQSU5HU19JRCA9IAotCQlKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIub3JtLmVudGl0eU1hcHBpbmdzIjsKLQkKLQlTdHJpbmcgUEVSU0lTVEVOVF9UWVBFX0lEID0gCi0JCUpwdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5vcm0ucGVyc2lzdGVudFR5cGUiOwotCQotCVN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9JRCA9Ci0JCUpwdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5vcm0ucGVyc2lzdGVudEF0dHJpYnV0ZSI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTBkMmI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1UYWJsZSBleHRlbmRzIFRhYmxlLCBPcm1KcGFDb250ZXh0Tm9kZQotewotCXZvaWQgaW5pdGlhbGl6ZShYbWxFbnRpdHkgZW50aXR5KTsKLQotCXZvaWQgdXBkYXRlKFhtbEVudGl0eSBlbnRpdHkpOwotCi0JCi0JLy8qKioqKioqKioqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMoKTsKLQkKLQlPcm1VbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVGFibGVHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UYWJsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjMxODNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UYWJsZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVRhYmxlR2VuZXJhdG9yIGV4dGVuZHMgVGFibGVHZW5lcmF0b3IsIE9ybUdlbmVyYXRvciwgT3JtSnBhQ29udGV4dE5vZGUKLXsKLQl2b2lkIGluaXRpYWxpemUoWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpOwotCi0Jdm9pZCB1cGRhdGUoWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpOwotCQotCS8vKioqKioqKioqKioqKioqKioqIGNvdmFyaWFudCBvdmVycmlkZXMgKioqKioqKioqKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCi0JT3JtVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVHJhbnNpZW50TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmZmVjNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVHJhbnNpZW50TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1UcmFuc2llbnRNYXBwaW5nIGV4dGVuZHMgVHJhbnNpZW50TWFwcGluZywgT3JtQXR0cmlidXRlTWFwcGluZwotewotCXZvaWQgaW5pdGlhbGl6ZShYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UpOwotCi0Jdm9pZCB1cGRhdGUoWG1sVHJhbnNpZW50IHRyYW5zaWVudFJlc291cmNlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjQyNGFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVHlwZU1hcHBpbmcgZXh0ZW5kcyBUeXBlTWFwcGluZywgT3JtSnBhQ29udGV4dE5vZGUKLXsKLQlTdHJpbmcgSkFWQV9QRVJTSVNURU5UX1RZUEVfUFJPUEVSVFkgPSAiamF2YVBlcnNpc3RlbnRUeXBlUHJvcGVydHkiOwotCi0JU3RyaW5nIGdldENsYXNzXygpOwotCXZvaWQgc2V0Q2xhc3MoU3RyaW5nIG5ld0NsYXNzKTsKLQlTdHJpbmcgQ0xBU1NfUFJPUEVSVFkgPSAiY2xhc3NQcm9wZXJ0eSI7Ci0KLQlBY2Nlc3NUeXBlIGdldEFjY2VzcygpOwotCUFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpOwotCVN0cmluZyBERUZBVUxUX0FDQ0VTU19QUk9QRVJUWSA9ICJkZWZhdWx0QWNjZXNzUHJvcGVydHkiOwotCi0JQWNjZXNzVHlwZSBnZXRTcGVjaWZpZWRBY2Nlc3MoKTsKLQl2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIG5ld1NwZWNpZmllZEFjY2Vzcyk7Ci0JU3RyaW5nIFNQRUNJRklFRF9BQ0NFU1NfUFJPUEVSVFkgPSAic3BlY2lmaWVkQWNjZXNzUHJvcGVydHkiOwotCi0JCi0JYm9vbGVhbiBpc01ldGFkYXRhQ29tcGxldGUoKTsKLQlCb29sZWFuIGdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKTsKLQl2b2lkIHNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9NRVRBREFUQV9DT01QTEVURV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlUHJvcGVydHkiOwotCi0JYm9vbGVhbiBpc0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JCVN0cmluZyBERUZBVUxUX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZID0gImRlZmF1bHRNZXRhZGF0YUNvbXBsZXRlUHJvcGVydHkiOwotCi0JCi0JLyoqCi0JICogdHlwZSBtYXBwaW5ncyBhcmUgYSBzZXF1ZW5jZSBpbiB0aGUgb3JtIHNjaGVtYS4gV2UgbXVzdCBrZWVwCi0JICogdGhlIGxpc3Qgb2YgdHlwZSBtYXBwaW5ncyBpbiB0aGUgYXBwcm9wcmlhdGUgb3JkZXIgc28gdGhlIHd0cCB4bWwgCi0JICogdHJhbnNsYXRvcnMgd2lsbCB3cml0ZSB0aGVtIHRvIHRoZSB4bWwgaW4gdGhhdCBvcmRlciBhbmQgdGhleQotCSAqIHdpbGwgYWRoZXJlIHRvIHRoZSBzY2hlbWEuICAKLQkgKiAKLQkgKiBFYWNoIGNvbmNyZXRlIHN1YmNsYXNzIG9mIFhtbFR5cGVNYXBwaW5nIG11c3QgaW1wbGVtZW50IHRoaXMKLQkgKiBtZXRob2QgYW5kIHJldHVybiBhbiBpbnQgdGhhdCBtYXRjaGVzIGl0J3Mgb3JkZXIgaW4gdGhlIHNjaGVtYQotCSAqIEByZXR1cm4KLQkgKi8KLQlpbnQgZ2V0WG1sU2VxdWVuY2UoKTsKLQotCXZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpOwotCQkKLQlBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIGFkZFRvUmVzb3VyY2VNb2RlbChYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tKE9ybVR5cGVNYXBwaW5nIG9sZE1hcHBpbmcpOwotCi0JQWJzdHJhY3RYbWxUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCk7Ci0JCi0JSmF2YVBlcnNpc3RlbnRUeXBlIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCi0JVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpOwotCi0JVGV4dFJhbmdlIGdldEF0dHJpYnV0ZXNUZXh0UmFuZ2UoKTsKLQkKLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KTsKLQkKLQlPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpOwotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVHlwZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVR5cGVNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2MGY2Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVHlwZU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVR5cGVNYXBwaW5nUHJvdmlkZXIKLXsKLQlTdHJpbmcgZ2V0S2V5KCk7Ci0JCi0JT3JtVHlwZU1hcHBpbmcgYnVpbGRUeXBlTWFwcGluZyhKcGFGYWN0b3J5IGZhY3RvcnksIE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCk7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVVuaXF1ZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlhYmNjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVW5pcXVlQ29uc3RyYWludCBleHRlbmRzIFVuaXF1ZUNvbnN0cmFpbnQsIE9ybUpwYUNvbnRleHROb2RlCi17Ci0Jdm9pZCB1cGRhdGUoWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVmVyc2lvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1WZXJzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjE5MmM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1WZXJzaW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVZlcnNpb25NYXBwaW5nIGV4dGVuZHMgVmVyc2lvbk1hcHBpbmcsIE9ybUNvbHVtbk1hcHBpbmcsIE9ybUF0dHJpYnV0ZU1hcHBpbmcKLXsKLQl2b2lkIGluaXRpYWxpemUoWG1sVmVyc2lvbiB2ZXJzaW9uKTsKLQotCXZvaWQgdXBkYXRlKFhtbFZlcnNpb24gdmVyc2lvbik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVhtbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVhtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWI2YWY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1YbWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1YbWwgZXh0ZW5kcyBPcm1KcGFDb250ZXh0Tm9kZSwgSnBhU3RydWN0dXJlTm9kZQotewotCQotCU1hcHBpbmdGaWxlUmVmIGdldFBhcmVudCgpOwotCQotCS8vICoqKioqKioqKioqKioqKiogcGVyc2lzdGVuY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZW50aXR5LW1hcHBpbmdzIHByb3BlcnR5Ci0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU5USVRZX01BUFBJTkdTX1BST1BFUlRZID0gImVudGl0eU1hcHBpbmdzUHJvcGVydHkiOwotCQotCS8qKiAKLQkgKiBSZXR1cm4gdGhlIGNvbnRlbnQgcmVwcmVzZW50ZWQgYnkgdGhlIHJvb3Qgb2YgdGhlIG9ybS54bWwgZmlsZS4KLQkgKiBUaGlzIG1heSBiZSBudWxsLgotCSAqLwotCUVudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCi0JLyoqCi0JICogQWRkIGEgZW50aXR5LW1hcHBpbmdzIG5vZGUgdG8gdGhlIG9ybS54bWwgZmlsZSBhbmQgcmV0dXJuIHRoZSBvYmplY3QgCi0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqIFRocm93cyB7QGxpbmsgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBpZiBhIGVudGl0eS1tYXBwaW5ncyBub2RlIGFscmVhZHkgZXhpc3RzLgotCSAqLwotCUVudGl0eU1hcHBpbmdzIGFkZEVudGl0eU1hcHBpbmdzKCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBlbnRpdHktbWFwcGluZ3Mgbm9kZSBmcm9tIHRoZSBvcm0ueG1sIGZpbGUuCi0JICogVGhyb3dzIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlmIGEgcGVyc2lzdGVuY2Ugbm9kZSBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQl2b2lkIHJlbW92ZUVudGl0eU1hcHBpbmdzKCk7Ci0JCi0JUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIE9ybVBlcnNpc3RlbnRUeXBlIGxpc3RlZCBpbiB0aGlzIG1hcHBpbmcgZmlsZQotCSAqIHdpdGggdGhlIGdpdmVuIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUuICBSZXR1cm4gbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0KLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQl2b2lkIHVwZGF0ZShPcm1SZXNvdXJjZSBvcm1SZXNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTIyZmJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGV4dGVuZHMgT3JtSnBhQ29udGV4dE5vZGUKLXsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkU2NoZW1hIGlmIG5vdCBudWxsLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0U2NoZW1hLgotCSAqLwotCVN0cmluZyBnZXRTY2hlbWEoKTsKLQlTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlTdHJpbmcgREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgPSAiZGVmYXVsdFNjaGVtYVByb3BlcnR5IjsKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIG5ld1NwZWNpZmllZFNjaGVtYSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZID0gInNwZWNpZmllZFNjaGVtYVByb3BlcnR5IjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkQ2F0YWxvZyBpZiBub3QgbnVsbCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdENhdGFsb2cuCi0JICovCi0JU3RyaW5nIGdldENhdGFsb2coKTsKLQlTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSA9ICJkZWZhdWx0Q2F0YWxvZ1Byb3BlcnR5IjsKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCXZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgbmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSA9ICJzcGVjaWZpZWRDYXRhbG9nUHJvcGVydHkiOwotCi0JQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKTsKLQl2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKTsKLQkJU3RyaW5nIEFDQ0VTU19QUk9QRVJUWSA9ICJhY2Nlc3NQcm9wZXJ0eSI7Ci0KLQlib29sZWFuIGlzQ2FzY2FkZVBlcnNpc3QoKTsKLQotCXZvaWQgc2V0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbiB2YWx1ZSk7Ci0JU3RyaW5nIENBU0NBREVfUEVSU0lTVF9QUk9QRVJUWSA9ICJjYXNjYWRlUGVyc2lzdFByb3BlcnR5IjsKLQkKLQkKLQl2b2lkIHVwZGF0ZShYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMDBmMDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBleHRlbmRzIE9ybUpwYUNvbnRleHROb2RlCi17Ci0JYm9vbGVhbiBpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCk7Ci0Jdm9pZCBzZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShib29sZWFuIHZhbHVlKTsKLQkJU3RyaW5nIFhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZID0gInhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlUHJvcGVydHkiOwotCi0JUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJCi0Jdm9pZCB1cGRhdGUoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9DbGFzc1JlZi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2xhc3NSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0MGEwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9DbGFzc1JlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NSZWYgZXh0ZW5kcyBQZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIElDbGFzc1JlZiBtYXRjaGVzIHRoZSBmdWxseVF1YWxmaWVkVHlwZU5hbWUKLQkgKi8KLQlib29sZWFuIGlzRm9yKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1hcHBpbmcgZmlsZSByZWYgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW50cnkgaW4gdGhlCi0JICogcGVyc2lzdGVuY2UueG1sIChmYWxzZSkgb3IgaWYgaXQgaXMgaW5zdGVhZCB2aXJ0dWFsCi0JICovCi0JYm9vbGVhbiBpc1ZpcnR1YWwoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNsYXNzIG5hbWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBjbGFzcyBuYW1lCi0JICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19OQU1FX1BST1BFUlRZID0gImNsYXNzTmFtZSI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyByZWYuCi0JICovCi0JU3RyaW5nIGdldENsYXNzTmFtZSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MgcmVmLgotCSAqLwotCXZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogamF2YSBwZXJzaXN0ZW50IHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIGphdmEgcGVyc2lzdGVudCB0eXBlCi0JICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX1BFUlNJU1RFTlRfVFlQRV9QUk9QRVJUWSA9ICJqYXZhUGVyc2lzdGVudFR5cGUiOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YVBlcnNpc3RlbnRUeXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBJQ2xhc3NSZWYuCi0JICogVGhpcyBjYW4gYmUgbnVsbC4KLQkgKiBUaGlzIGlzIG5vdCBzZXR0YWJsZSBieSB1c2VycyBvZiB0aGlzIEFQSS4KLQkgKi8KLQlKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB1cGRhdGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQl2b2lkIHVwZGF0ZShYbWxKYXZhQ2xhc3NSZWYgY2xhc3NSZWYpOwotCQotCXZvaWQgdXBkYXRlKFN0cmluZyBjbGFzc05hbWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgY29udGFpbnMKLQkgKiB0aGUgZ2l2ZW4gdGV4dCBvZmZzZXQKLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KTsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL01hcHBpbmdGaWxlUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9NYXBwaW5nRmlsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTZmYTE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL01hcHBpbmdGaWxlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFwcGluZ0ZpbGVSZWYgZXh0ZW5kcyBQZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtYXBwaW5nIGZpbGUgcmVmIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVudHJ5IGluIHRoZQotCSAqIHBlcnNpc3RlbmNlLnhtbCAoZmFsc2UpIG9yIGlmIGl0IGlzIGluc3RlYWQgdmlydHVhbAotCSAqLwotCWJvb2xlYW4gaXNWaXJ0dWFsKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBmaWxlIG5hbWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZmlsZSBuYW1lCi0JICovCi0JU3RyaW5nIEZJTEVfTkFNRV9QUk9QRVJUWSA9ICJmaWxlTmFtZVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbGUgbmFtZSBvZiB0aGUgbWFwcGluZyBmaWxlIHJlZi4KLQkgKi8KLQlTdHJpbmcgZ2V0RmlsZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGZpbGUgbmFtZSBvZiB0aGUgbWFwcGluZyBmaWxlIHJlZi4KLQkgKi8KLQl2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0geG1sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCVN0cmluZyBPUk1fWE1MX1BST1BFUlRZID0gIm9ybVhtbFByb3BlcnR5IjsKLQkKLQlPcm1YbWwgZ2V0T3JtWG1sKCk7CQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdWRwYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQl2b2lkIHVwZGF0ZShYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZik7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBPcm1QZXJzaXN0ZW50VHlwZSBsaXN0ZWQgaW4gdGhpcyBtYXBwaW5nIGZpbGUKLQkgKiB3aXRoIHRoZSBnaXZlbiBmdWxseVF1YWxpZmllZFR5cGVOYW1lLiAgUmV0dXJuIG51bGwgaWYgbm9uZSBleGlzdHMuCi0JICovCi0JT3JtUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGVyc2lzdGVuY2UgdW5pdCBjb250YWlucwotCSAqIHRoZSBnaXZlbiB0ZXh0IG9mZnNldAotCSAqLwotCWJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyMWYwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZSBleHRlbmRzIFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUKLXsKLQkvLyAqKioqKioqKioqKioqKioqIHBlcnNpc3RlbmNlIHVuaXRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0cyBsaXN0Ci0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVFNfTElTVCA9ICJwZXJzaXN0ZW5jZVVuaXRzIjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGxpc3Qgb2YgcGVyc2lzdGVuY2UgdW5pdHMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCUxpc3RJdGVyYXRvcjxQZXJzaXN0ZW5jZVVuaXQ+IHBlcnNpc3RlbmNlVW5pdHMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQgbGlzdC4KLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IHBlcnNpc3RlbmNlVW5pdHNTaXplKCk7Ci0JCi0JLyoqCi0JICogQWRkIGEgcGVyc2lzdGVuY2UgdW5pdCB0byB0aGUgcGVyc2lzdGVuY2Ugbm9kZSBhbmQgcmV0dXJuIHRoZSBvYmplY3QgCi0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCVBlcnNpc3RlbmNlVW5pdCBhZGRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkKLQkvKioKLQkgKiBBZGQgYSBwZXJzaXN0ZW5jZSB1bml0IHRvIHRoZSBwZXJzaXN0ZW5jZSBub2RlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggYW5kIAotCSAqIHJldHVybiB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlQZXJzaXN0ZW5jZVVuaXQgYWRkUGVyc2lzdGVuY2VVbml0KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGZyb20gdGhlIHBlcnNpc3RlbmNlIG5vZGUuCi0JICovCi0Jdm9pZCByZW1vdmVQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgcGVyc2lzdGVuY2Ugbm9kZS4KLQkgKi8KLQl2b2lkIHJlbW92ZVBlcnNpc3RlbmNlVW5pdChpbnQgaW5kZXgpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCi0Jdm9pZCB1cGRhdGUoWG1sUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdGV4dCByYW5nZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBlcnNpc3RlbmNlIGNvbnRhaW5zCi0JICogdGhlIGdpdmVuIHRleHQgb2Zmc2V0Ci0JICovCi0JYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCk7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDY4Y2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCB0byB0aGUgbGlzdCBvZiBjdXJyZW50IHZhbGlkYXRpb24gbWVzc2FnZXMKLQkgKi8KLQl2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpOwotCi0JVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VTdHJ1Y3R1cmVOb2Rlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VTdHJ1Y3R1cmVOb2Rlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTdlZWZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMgCi17Ci0JCi0JU3RyaW5nIFBFUlNJU1RFTkNFX0lEID0gCi0JCUpwdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5wZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZSI7Ci0JCi0JU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfSUQgPSAKLQkJSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLnBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlVW5pdCI7Ci0JCi0JU3RyaW5nIENMQVNTX1JFRl9JRCA9Ci0JCUpwdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5wZXJzaXN0ZW5jZS5jbGFzc1JlZiI7Ci0JCi0JU3RyaW5nIE1BUFBJTkdfRklMRV9SRUZfSUQgPQotCQlKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIucGVyc2lzdGVuY2UubWFwcGluZ0ZpbGVSZWYiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkN2IyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlVW5pdCBleHRlbmRzIFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUKLXsKLQkvLyAqKioqKioqKioqKioqKioqIHBhcmVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JUGVyc2lzdGVuY2UgZ2V0UGFyZW50KCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBuYW1lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIG5hbWUKLQkgKi8KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB0cmFuc2FjdGlvbiB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCVBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIAotCSAqIHNwZWNpZmllZCB0cmFuc2FjdGlvbiB0eXBlCi0JICovCi0JU3RyaW5nIFNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZID0gInRyYW5zYWN0aW9uVHlwZSI7Ci0JCi0JLyoqIAotCSAqIFJldHVybiB0aGUgdHJhbnNhY3Rpb24gdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgb25lIG9mIHRoZSB2YWx1ZXMgb2YgCi0JICoge0BsaW5rIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZX0gCi0JICovCi0JUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpOwotCQotCS8qKiAKLQkgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG9uZSBvZiB0aGUgdmFsdWVzIG9mIAotCSAqIHtAbGluayBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGV9IAotCSAqLwotCXZvaWQgc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB0cmFuc2FjdGlvblR5cGUpOwotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIAotCSAqIGRlZmF1bHQgdHJhbnNhY3Rpb24gdHlwZSAobm90IHR5cGljYWxseSBjaGFuZ2VkKQotCSAqLwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZID0gImRlZmF1bHRUcmFuc2FjdGlvblR5cGUiOwotCQotCS8qKiAKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgdHJhbnNhY3Rpb24gdHlwZSAKLQkgKi8KLQlQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZSgpOwotCQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogZGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBkZXNjcmlwdGlvbgotCSAqLwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT05fUFJPUEVSVFkgPSAiZGVzY3JpcHRpb24iOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbik7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBwcm92aWRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHByb3ZpZGVyCi0JICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBQUk9WSURFUl9QUk9QRVJUWSA9ICJwcm92aWRlciI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm92aWRlciBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJvdmlkZXIoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHByb3ZpZGVyIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXZvaWQgc2V0UHJvdmlkZXIoU3RyaW5nIHByb3ZpZGVyKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGp0YSBkYXRhIHNvdXJjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgSlRBIGRhdGEgc291cmNlCi0JICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBKVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkgPSAianRhRGF0YVNvdXJjZSI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKVEEgZGF0YSBzb3VyY2Ugb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JU3RyaW5nIGdldEp0YURhdGFTb3VyY2UoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIEpUQSBkYXRhIHNvdXJjZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQl2b2lkIHNldEp0YURhdGFTb3VyY2UoU3RyaW5nIGp0YURhdGFTb3VyY2UpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbm9uLWp0YSBkYXRhIHNvdXJjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBub24tSlRBIGRhdGEgc291cmNlCi0JICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBOT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZID0gIm5vbkp0YURhdGFTb3VyY2UiOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9uLUpUQSBkYXRhIHNvdXJjZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlTdHJpbmcgZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgbm9uLUpUQSBkYXRhIHNvdXJjZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQl2b2lkIHNldE5vbkp0YURhdGFTb3VyY2UoU3RyaW5nIG5vbkp0YURhdGFTb3VyY2UpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbWFwcGluZyBmaWxlIHJlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGxpc3Qgb2YgbWFwcGluZyBmaWxlIHJlZnMsIHdoZXRoZXIgc3BlY2lmaWVkIG9yCi0JICogaW1wbGllZC4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPiBtYXBwaW5nRmlsZVJlZnMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gb2YgbWFwcGluZyBmaWxlIHJlZnMsIHNwZWNpZmllZCBhbmQgaW1wbGllZC4KLQkgKi8KLQlpbnQgbWFwcGluZ0ZpbGVSZWZzU2l6ZSgpOwotCQotCS8vICoqKioqKioqKioqKioqKiogc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBtYXBwaW5nIGZpbGUgcmVmcyBsaXN0Ci0JICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBTUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRl9MSVNUID0gInNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcyI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZSBsaXN0IG9mIHNwZWNpZmllZCBtYXBwaW5nIGZpbGUgcmVmcy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPiBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gb2Ygc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWZzLgotCSAqLwotCWludCBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgbWFwcGluZyBmaWxlIHJlZiB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgcmV0dXJuIHRoZSBvYmplY3QgCi0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCU1hcHBpbmdGaWxlUmVmIGFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKCk7Ci0JCi0JLyoqCi0JICogQWRkIGEgc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWYgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBhbmQgCi0JICogcmV0dXJuIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCU1hcHBpbmdGaWxlUmVmIGFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbWFwcGluZyBmaWxlIHJlZiBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWYgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoaW50IGluZGV4KTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGltcGxpZWQgbWFwcGluZyBmaWxlIHJlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBpbXBsaWVkIG1hcHBpbmcgZmlsZSByZWYKLQkgKi8KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIElNUExJRURfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSA9ICJpbXBsaWVkTWFwcGluZ0ZpbGVSZWYiOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBpbXBsaWVkIG1hcHBpbmcgZmlsZSByZWYuCi0JICogVGhpcyBtYXkgYmUgbnVsbC4KLQkgKi8KLQlNYXBwaW5nRmlsZVJlZiBnZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNsYXNzIHJlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZSBsaXN0IG9mIGNsYXNzIHJlZnMsIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGltcGxpZWQuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWVkIGFuZCBpbXBsaWVkIGNsYXNzIHJlZnMuCi0JICovCi0JaW50IGNsYXNzUmVmc1NpemUoKTsKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHNwZWNpZmllZCBjbGFzcyByZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3MgcmVmcyBsaXN0Ci0JICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBTUEVDSUZJRURfQ0xBU1NfUkVGX0xJU1QgPSAic3BlY2lmaWVkQ2xhc3NSZWZzIjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGxpc3Qgb2Ygc3BlY2lmaWVkIGNsYXNzIHJlZnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWVkIGNsYXNzIHJlZnMuCi0JICovCi0JaW50IHNwZWNpZmllZENsYXNzUmVmc1NpemUoKTsKLQkKLQkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgY2xhc3MgcmVmIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCByZXR1cm4gdGhlIG9iamVjdCAKLQkgKiByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JQ2xhc3NSZWYgYWRkU3BlY2lmaWVkQ2xhc3NSZWYoKTsKLQkKLQkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgY2xhc3MgcmVmIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggYW5kIAotCSAqIHJldHVybiB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlDbGFzc1JlZiBhZGRTcGVjaWZpZWRDbGFzc1JlZihpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNsYXNzIHJlZiBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWYoQ2xhc3NSZWYgY2xhc3NSZWYpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNsYXNzIHJlZiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRDbGFzc1JlZihpbnQgaW5kZXgpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogaW1wbGllZCBjbGFzcyByZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIGltcGxpZWQgY2xhc3MgcmVmcyBsaXN0Ci0JICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBJTVBMSUVEX0NMQVNTX1JFRl9MSVNUID0gImltcGxpZWRDbGFzc1JlZnMiOwotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgbGlzdCBvZiBpbXBsaWVkIGNsYXNzIHJlZnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gaW1wbGllZENsYXNzUmVmcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGltcGxpZWQgY2xhc3MgcmVmcy4KLQkgKi8KLQlpbnQgaW1wbGllZENsYXNzUmVmc1NpemUoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGV4Y2x1ZGUgdW5saXN0ZWQgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqIAotCSAqIFJldHVybiB0aGUgImV4Y2x1ZGUgdW5saXN0ZWQgY2xhc3NlcyIgc2V0dGluZyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlib29sZWFuIGlzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpOwotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgCi0JICogImV4Y2x1ZGUgdW5saXN0ZWQgY2xhc3NlcyIgc2V0dGluZwotCSAqLwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1BFQ0lGSUVEX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzIjsKLQkKLQkvKiogCi0JICogUmV0dXJuIHRoZSAiZXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzIiBzZXR0aW5nIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpOwotCQotCS8qKiAKLQkgKiBTZXQgdGhlICJleGNsdWRlIHVubGlzdGVkIGNsYXNzZXMiIHNldHRpbmcgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0Jdm9pZCBzZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKEJvb2xlYW4gZXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyk7Ci0JCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIAotCSAqIGRlZmF1bHQgImV4Y2x1ZGUgdW5saXN0ZWQgY2xhc3NlcyIgc2V0dGluZyAobm90IHR5cGljYWxseSBjaGFuZ2VkKQotCSAqLwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9FWENMVURFX1VOTElTVEVEX0NMQVNTRURfUFJPUEVSVFkgPSAiZGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMiOwotCQotCS8qKiAKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgImV4Y2x1ZGUgdW5saXN0ZWQgY2xhc3NlcyIgc2V0dGluZwotCSAqLwotCWJvb2xlYW4gZ2V0RGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHByb3BlcnRpZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwcm9wZXJ0aWVzIGxpc3QKLQkgKi8KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfTElTVCA9ICJwcm9wZXJ0aWVzIjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGxpc3Qgb2YgcHJvcGVydGllcy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JTGlzdEl0ZXJhdG9yPFByb3BlcnR5PiBwcm9wZXJ0aWVzKCk7Ci0JCi0JaW50IHByb3BlcnRpZXNTaXplKCk7Ci0JCi0JLyoqCi0JICogQWRkIGEgcHJvcGVydHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIHJldHVybiB0aGUgb2JqZWN0IAotCSAqIHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlQcm9wZXJ0eSBhZGRQcm9wZXJ0eSgpOwotCQotCVByb3BlcnR5IGFkZFByb3BlcnR5KGludCBpbmRleCk7Ci0KLQlQcm9wZXJ0eSBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KTsKLQkKLQlQcm9wZXJ0eSBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotCi0JTGlzdEl0ZXJhdG9yPFByb3BlcnR5PiBwcm9wZXJ0aWVzV2l0aFByZWZpeChTdHJpbmcga2V5UHJlZml4KTsKLQkKLQl2b2lkIHB1dFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZXMpOwotCQotCXZvaWQgcmVwbGFjZVByb3BlcnR5VmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIG9sZFZhbHVlLCBTdHJpbmcgbmV3VmFsdWUpOwotCQotCWJvb2xlYW4gY29udGFpbnNQcm9wZXJ0eShTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgcHJvcGVydHkgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQl2b2lkIHJlbW92ZVByb3BlcnR5KFByb3BlcnR5IHByb3BlcnR5KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGtleSk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQl2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7Ci0JCVN0cmluZyBERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSA9ICJkZWZhdWx0U2NoZW1hIjsKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCVN0cmluZyBERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkgPSAiZGVmYXVsdENhdGFsb2ciOwotCQotCUFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpOwotCQlTdHJpbmcgREVGQVVMVF9BQ0NFU1NfUFJPUEVSVFkgPSAiZGVmYXVsdEFjY2VzcyI7Ci0JCi0JYm9vbGVhbiBnZXREZWZhdWx0Q2FzY2FkZVBlcnNpc3QoKTsKLQkJU3RyaW5nIERFRkFVTFRfQ0FTQ0FERV9QRVJTSVNUX1BST1BFUlRZID0gImRlZmF1bHRDYXNjYWRlUGVyc2lzdCI7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBnbG9iYWwgZ2VuZXJhdG9yIGFuZCBxdWVyeSBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIElkZW50aWZpZXIgZm9yIGNoYW5nZXMgdG8gdGhlIGxpc3Qgb2YgZ2xvYmFsIGdlbmVyYXRvcnMuCi0JICogTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBncmFudWxhciBjaGFuZ2VzIHRvIHRoaXMgbGlzdC4gIFRoZXJlIGlzIG9ubHkKLQkgKiBub3RpZmljYXRpb24gdGhhdCB0aGUgZW50aXJlIGxpc3QgaGFzIGNoYW5nZWQuCi0JICovCi0JU3RyaW5nIEdFTkVSQVRPUlNfTElTVCA9ICJnZW5lcmF0b3JzIjsKLQkKLQkvKioKLQkgKiBBZGQgdGhlIGdlbmVyYXRvciAoZGVmaW5lZCBlbHNld2hlcmUpIHRvIHRoZSBsaXN0IG9mIGdlbmVyYXRvcnMgZGVmaW5lZAotCSAqIHdpdGhpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi0JICogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0aGUgcHJvY2VzcyBvZiB1cGRhdGluZyB0aGUKLQkgKiBsb2NhbCBnZW5lcmF0b3IgZGVmaW5pdGlvbi4KLQkgKiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFjY29tcGFuaWVzIHRoaXMgYWN0aW9uIHNwZWNpZmljYWxseS4KLQkgKi8KLQl2b2lkIGFkZEdlbmVyYXRvcihHZW5lcmF0b3IgZ2VuZXJhdG9yKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIGdlbmVyYXRvcnMgZGVmaW5lZCB3aXRoaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0LAotCSAqIGluY2x1ZGVkIGR1cGxpY2F0ZWx5IG5hbWVkIGdlbmVyYXRvcnMuCi0JICovCi0JTGlzdEl0ZXJhdG9yPEdlbmVyYXRvcj4gYWxsR2VuZXJhdG9ycygpOwotCQotCS8qKgotCSAqIElkZW50aWZpZXIgZm9yIGNoYW5nZXMgdG8gdGhlIGxpc3Qgb2YgZ2xvYmFsIHF1ZXJpZXMuCi0JICogTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBncmFudWxhciBjaGFuZ2VzIHRvIHRoaXMgbGlzdC4gIFRoZXJlIGlzIG9ubHkKLQkgKiBub3RpZmljYXRpb24gdGhhdCB0aGUgZW50aXJlIGxpc3QgaGFzIGNoYW5nZWQuCi0JICovCi0JU3RyaW5nIFFVRVJJRVNfTElTVCA9ICJxdWVyaWVzIjsKLQkKLQkvKioKLQkgKiBBZGQgdGhlIHF1ZXJ5IChkZWZpbmVkIGVsc2V3aGVyZSkgdG8gdGhlIGxpc3Qgb2YgcXVlcmllcyBkZWZpbmVkIAotCSAqIHdpdGhpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi0JICogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0aGUgcHJvY2VzcyBvZiB1cGRhdGluZyB0aGUKLQkgKiBsb2NhbCBxdWVyeSBkZWZpbml0aW9uLgotCSAqIE5vIGNoYW5nZSBub3RpZmljYXRpb24gYWNjb21wYW5pZXMgdGhpcyBhY3Rpb24gc3BlY2lmaWNhbGx5LgotCSAqLwotCXZvaWQgYWRkUXVlcnkoUXVlcnkgcXVlcnkpOwotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgcXVlcmllcyBkZWZpbmVkIHdpdGhpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQsCi0JICogaW5jbHVkZWQgZHVwbGljYXRlbHkgbmFtZWQgcXVlcmllcy4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8UXVlcnk+IGFsbFF1ZXJpZXMoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0Jdm9pZCB1cGRhdGUoWG1sUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUgUGVyc2lzdGVudFR5cGUgc3BlY2lmaWVkIGluIHRoaXMgUGVyc2lzdGVuY2VVbml0IHdpdGggdGhlIGdpdmVuCi0JICogZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZQotCSAqLwotCVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgY29udGFpbnMKLQkgKiB0aGUgZ2l2ZW4gdGV4dCBvZmZzZXQKLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmNTJmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBlbnVtIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSAKLXsKLQkvKiogQ29ycmVzcG9uZHMgdG8gSlRBIHRyYW5zYWN0aW9uIHR5cGUgKiovCi0JSlRBLAotCQotCS8qKiBDb3JyZXNwb25kcyB0byBSRVNPVVJDRV9MT0NBTCB0cmFuc2FjdGlvbiB0eXBlICoqLwotCVJFU09VUkNFX0xPQ0FMOwotCQotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGZyb21YbWxSZXNvdXJjZU1vZGVsKFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB0cmFuc2FjdGlvblR5cGUpIHsKLQkJaWYgKHRyYW5zYWN0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKHRyYW5zYWN0aW9uVHlwZSkgewotCQkJY2FzZSBKVEE6Ci0JCQkJcmV0dXJuIEpUQTsKLQkJCWNhc2UgUkVTT1VSQ0VfTE9DQUw6Ci0JCQkJcmV0dXJuIFJFU09VUkNFX0xPQ0FMOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIHRyYW5zYWN0aW9uIHR5cGU6ICIgKyB0cmFuc2FjdGlvblR5cGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHRvWG1sUmVzb3VyY2VNb2RlbChQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdHJhbnNhY3Rpb25UeXBlKSB7Ci0JCWlmICh0cmFuc2FjdGlvblR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoICh0cmFuc2FjdGlvblR5cGUpIHsKLQkJCWNhc2UgSlRBOgotCQkJCXJldHVybiBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBOwotCQkJY2FzZSBSRVNPVVJDRV9MT0NBTDoKLQkJCQlyZXR1cm4gWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIHRyYW5zYWN0aW9uIHR5cGU6ICIgKyB0cmFuc2FjdGlvblR5cGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwY2JjZGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VYbWwgZXh0ZW5kcyBQZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlCi17Ci0JLy8gKioqKioqKioqKioqKioqKiBwZXJzaXN0ZW5jZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1BST1BFUlRZID0gInBlcnNpc3RlbmNlIjsKLQkKLQkvKiogCi0JICogUmV0dXJuIHRoZSBjb250ZW50IHJlcHJlc2VudGVkIGJ5IHRoZSByb290IG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZS4KLQkgKiBUaGlzIG1heSBiZSBudWxsLgotCSAqLwotCVBlcnNpc3RlbmNlIGdldFBlcnNpc3RlbmNlKCk7Ci0JCi0JLyoqCi0JICogQWRkIGEgcGVyc2lzdGVuY2Ugbm9kZSB0byB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgYW5kIHJldHVybiB0aGUgb2JqZWN0IAotCSAqIHJlcHJlc2VudGluZyBpdC4KLQkgKiBUaHJvd3Mge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaWYgYSBwZXJzaXN0ZW5jZSBub2RlIGFscmVhZHkgZXhpc3RzLgotCSAqLwotCVBlcnNpc3RlbmNlIGFkZFBlcnNpc3RlbmNlKCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBwZXJzaXN0ZW5jZSBub2RlIGZyb20gdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLgotCSAqIFRocm93cyB7QGxpbmsgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBpZiBhIHBlcnNpc3RlbmNlIG5vZGUgZG9lcyBub3QgZXhpc3QuCi0JICovCi0Jdm9pZCByZW1vdmVQZXJzaXN0ZW5jZSgpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXZvaWQgdXBkYXRlKFBlcnNpc3RlbmNlUmVzb3VyY2UgcGVyc2lzdGVuY2VSZXNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Qcm9wZXJ0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcyZTBhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHk7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5IGV4dGVuZHMgUGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZQotewotCS8vICoqKioqKioqKioqKioqKiogbmFtZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsdWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsKLQkKLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0JCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkKLQl2b2lkIHVwZGF0ZShYbWxQcm9wZXJ0eSBwcm9wZXJ0eSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKcGFOb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKcGFOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWVkZTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNhbGxiYWNrQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFOb2RlCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBKcGFOb2RlLCBDYWxsYmFja0NoYW5nZVN1cHBvcnQuU291cmNlCi17Ci0JcHJpdmF0ZSBmaW5hbCBKcGFOb2RlIHBhcmVudDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKcGFOb2RlKEpwYU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY2hlY2tQYXJlbnQocGFyZW50KTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KEpwYU5vZGUgcCkgewotCQlpZiAocCA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5yZXF1aXJlc1BhcmVudCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ3BhcmVudCcgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuZm9yYmlkc1BhcmVudCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ3BhcmVudCcgbXVzdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3JiaWRzUGFyZW50KCkgewotCQlyZXR1cm4gISB0aGlzLnJlcXVpcmVzUGFyZW50KCk7ICAvLyBhc3N1bWUgJ3BhcmVudCcgaXMgbm90IG9wdGlvbmFsCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IENhbGxiYWNrQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIElBZGFwdGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIElKcGFOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKcGFOb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQkKLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UmVzb3VyY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm0gZ2V0SnBhUGxhdGZvcm0oKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpOwotCX0KLQotCXByb3RlY3RlZCBKcGFGYWN0b3J5IGdldEpwYUZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVBsYXRmb3JtKCkuZ2V0SnBhRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBKcGFGaWxlIGdldEpwYUZpbGUoUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKcGFGaWxlKHJlc291cmNlTW9kZWwuZ2V0RmlsZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhRGF0YVNvdXJjZSBnZXREYXRhU291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGF0YVNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFTb3VyY2UoKS5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0ZSBtb2RlbCAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdEpwYU5vZGU+LCBIYXNoU2V0PFN0cmluZz4+IG5vblVwZGF0ZUFzcGVjdE5hbWVTZXRzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0SnBhTm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4oKTsKLQotCXB1YmxpYyB2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJaWYgKHRoaXMuYXNwZWN0VHJpZ2dlcnNVcGRhdGUoYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBcInVwZGF0ZVwiIGNoYW5nZTogIiArIHRoaXMgKyAiOiAiICsgYXNwZWN0TmFtZSk7Ci0JCQl0aGlzLmdldEpwYVByb2plY3QoKS51cGRhdGUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhc3BlY3RUcmlnZ2Vyc1VwZGF0ZShTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmFzcGVjdERvZXNOb3RUcmlnZ2VyVXBkYXRlKGFzcGVjdE5hbWUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhc3BlY3REb2VzTm90VHJpZ2dlclVwZGF0ZShTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5ub25VcGRhdGVBc3BlY3ROYW1lcygpLmNvbnRhaW5zKGFzcGVjdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTZXQ8U3RyaW5nPiBub25VcGRhdGVBc3BlY3ROYW1lcygpIHsKLQkJc3luY2hyb25pemVkIChub25VcGRhdGVBc3BlY3ROYW1lU2V0cykgewotCQkJSGFzaFNldDxTdHJpbmc+IG5vblVwZGF0ZUFzcGVjdE5hbWVzID0gbm9uVXBkYXRlQXNwZWN0TmFtZVNldHMuZ2V0KHRoaXMuZ2V0Q2xhc3MoKSk7Ci0JCQlpZiAobm9uVXBkYXRlQXNwZWN0TmFtZXMgPT0gbnVsbCkgewotCQkJCW5vblVwZGF0ZUFzcGVjdE5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQkJCXRoaXMuYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhub25VcGRhdGVBc3BlY3ROYW1lcyk7Ci0JCQkJbm9uVXBkYXRlQXNwZWN0TmFtZVNldHMucHV0KHRoaXMuZ2V0Q2xhc3MoKSwgbm9uVXBkYXRlQXNwZWN0TmFtZXMpOwotCQkJfQotCQkJcmV0dXJuIG5vblVwZGF0ZUFzcGVjdE5hbWVzOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2V0PFN0cmluZz4gbm9uVXBkYXRlQXNwZWN0TmFtZXMpIHsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhub25VcGRhdGVBc3BlY3ROYW1lcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RSZXNvdXJjZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RSZXNvdXJjZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjc0NTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0Fic3RyYWN0UmVzb3VyY2VNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VNb2RlbAotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgUmVzb3VyY2VNb2RlbAotewotCXByb3RlY3RlZCBmaW5hbCBJRmlsZSBmaWxlOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0UmVzb3VyY2VNb2RlbChJRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JfQotCQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gdGhpcy5maWxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9Bc3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0FzeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMWY1YzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0FzeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgdXBkYXRlciB3aWxsICJ1cGRhdGUiIHRoZSBwcm9qZWN0IGluIGEgam9iIHRoYXQgZXhlY3V0ZXMgaW4gYSBzZXBhcmF0ZQotICogdGhyZWFkIGFuZCBhbGxvd3MgY2FsbHMgdG8gI3VwZGF0ZSgpIHRvIHJldHVybiBpbW1lZGlhdGVseS4KLSAqLwotcHVibGljIGNsYXNzIEFzeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyIGltcGxlbWVudHMgSnBhUHJvamVjdC5VcGRhdGVyIHsKLQlwcm90ZWN0ZWQgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCXByb3RlY3RlZCBmaW5hbCBVcGRhdGVKb2Igam9iOwotCi0JcHVibGljIEFzeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyKEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLmpvYiA9IHRoaXMuYnVpbGRKb2IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVXBkYXRlSm9iIGJ1aWxkSm9iKCkgewotCQlyZXR1cm4gbmV3IFVwZGF0ZUpvYigpOwotCX0KLQotCS8qKgotCSAqIEFsbG93IHRoZSBqb2IgdG8gYmUgc2NoZWR1bGVkIGFuZCBleGVjdXRlIGFuICJ1cGRhdGUiLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQl0aGlzLmpvYi5zdGFydCgpOwotCQl0aGlzLnVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIExldCB0aGUgam9iIHJ1biB0byBjb21wbGV0aW9uIChpLmUuIGRvIG5vdCBjYW5jZWwgaXQpLgotCSAqIFRoaXMgc2hvdWxkIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBqb2IgaXMgcmUtc2NoZWR1bGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJdGhpcy5qb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmpvYi5kaXNwb3NlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5qcGFQcm9qZWN0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGpvYiB0aGF0IGdldHMgc2NoZWR1bGVkIGJ5IHRoZSBhc3luY2hyb25vdXMgdXBkYXRlci4KLQkgKiBXaGVuIHRoZSBqb2IgaXMgcnVuIGl0IHRlbGxzIHRoZSBKUEEgcHJvamVjdCB0byAidXBkYXRlIi4KLQkgKiBPbmx5IGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoaXMgam9iIHBlciBwcm9qZWN0IGNhbiBydW4gYXQgYSB0aW1lLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBVcGRhdGVKb2IgZXh0ZW5kcyBKb2IgewotCQkvKioKLQkJICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0IHRvIGZhbHNlLCB0aGUgam9iIGRvZXMgbm90IHN0b3AgaW1tZWRpYXRlbHk7Ci0JCSAqIGJ1dCBpdCBjYW5ub3QgYmUgc2NoZWR1bGVkIHRvIHJ1biBhZ2Fpbi4KLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNjaGVkdWxlOwotCi0JCXByb3RlY3RlZCBVcGRhdGVKb2IoKSB7Ci0JCQlzdXBlcigiVXBkYXRlIEpQQSBwcm9qZWN0OiAiICsgQXN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIudGhpcy5qcGFQcm9qZWN0LmdldE5hbWUoKSk7ICAvLyBUT0RPIGkxOG4KLQkJCXRoaXMuc2hvdWxkU2NoZWR1bGUgPSBmYWxzZTsKLQkJCXRoaXMuc2V0UnVsZShBc3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlci50aGlzLmpwYVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlyZXR1cm4gQXN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIudGhpcy5qcGFQcm9qZWN0LnVwZGF0ZShtb25pdG9yKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRTY2hlZHVsZSgpIHsKLQkJCXJldHVybiB0aGlzLnNob3VsZFNjaGVkdWxlOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgc3RhcnQoKSB7Ci0JCQlpZiAodGhpcy5zaG91bGRTY2hlZHVsZSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBVcGRhdGVyIHdhcyBub3Qgc3RvcHBlZC4iKTsKLQkJCX0KLQkJCXRoaXMuc2hvdWxkU2NoZWR1bGUgPSB0cnVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFByZXZlbnQgdGhlIGpvYiBmcm9tIHJ1bm5pbmcgYWdhaW4gYW5kIHdhaXQgZm9yIHRoZSBjdXJyZW50Ci0JCSAqIGV4ZWN1dGlvbiwgaWYgdGhlcmUgaXMgYW55LCB0byBlbmQgYmVmb3JlIHJldHVybmluZy4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkvLyB0aGlzIHdpbGwgcHJldmVudCB0aGUgam9iIGZyb20gYmVpbmcgc2NoZWR1bGVkIHRvIHJ1biBhZ2FpbgotCQkJdGhpcy5zaG91bGRTY2hlZHVsZSA9IGZhbHNlOwotCQkJLy8gdGhpcyB3aWxsIGNhbmNlbCB0aGUgam9iIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gc2NoZWR1bGVkLCBidXQgaXMgY3VycmVudGx5IFdBSVRJTkcKLQkJCXRoaXMuY2FuY2VsKCk7Ci0JCQl0cnkgewotCQkJCS8vIGlmIHRoZSBqb2IgaXMgY3VycmVudGx5IFJVTk5JTkcsIHdhaXQgdW50aWwgaXQgaXMgZG9uZSBiZWZvcmUgcmV0dXJuaW5nCi0JCQkJdGhpcy5qb2luKCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHRoZSBqb2IgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIC0gaWdub3JlCi0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFEYXRhU291cmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYURhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyZDg5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYURhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLQotLyoqCi0gKiBHZW5lcmljSnBhRGF0YVNvdXJjZQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYURhdGFTb3VyY2UKLQlleHRlbmRzIEFic3RyYWN0SnBhTm9kZQotCWltcGxlbWVudHMgSnBhRGF0YVNvdXJjZQotewotCS8qKgotCSAqIGNhY2hlIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgbmFtZSBzbyB3ZSBjYW4gZGV0ZWN0IHdoZW4KLQkgKiBpdCBjaGFuZ2VzIGFuZCBub3RpZnkgbGlzdGVuZXJzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uUHJvZmlsZU5hbWU7Ci0KLQlwcm90ZWN0ZWQgdHJhbnNpZW50IENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlOwotCi0JLyoqCi0JICogbGlzdGVuIGZvciB0aGUgY29ubmVjdGlvbiB0byBiZSBhZGRlZCBvciByZW1vdmVkIG9yIGl0cyBuYW1lIGNoYW5nZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBjb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyOwotCi0JLyoqCi0JICogbGlzdGVuIGZvciB0aGUgY29ubmVjdGlvbiB0byBiZSBvcGVuZWQgb3IgY2xvc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEdlbmVyaWNKcGFEYXRhU291cmNlKEpwYVByb2plY3QganBhUHJvamVjdCwgU3RyaW5nIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSkgewotCQlzdXBlcihqcGFQcm9qZWN0KTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmFkZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWUgPSBjb25uZWN0aW9uUHJvZmlsZU5hbWU7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKLQkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGUgIT0gbnVsbCkgewotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBnZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVBsYXRmb3JtKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExvY2FsQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnBhRGF0YVNvdXJjZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTmFtZTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWUgPSBjb25uZWN0aW9uUHJvZmlsZU5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05ORUNUSU9OX1BST0ZJTEVfTkFNRV9QUk9QRVJUWSwgb2xkLCBjb25uZWN0aW9uUHJvZmlsZU5hbWUpOwotCQkgLy8gc3luY2ggdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSB3aGVuIHRoZSBuYW1lIGNoYW5nZXMKLQkJdGhpcy5zZXRDb25uZWN0aW9uUHJvZmlsZSh0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoY29ubmVjdGlvblByb2ZpbGVOYW1lKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGU7Ci0JCXJldHVybiAoY3AgIT0gbnVsbCkgJiYgY3AuaXNBY3RpdmUoKTsKLQl9Ci0KLQlwdWJsaWMgRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZTsKLQkJcmV0dXJuIChjcCA9PSBudWxsKSA/IG51bGwgOiBjcC5nZXREYXRhYmFzZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNhdGFsb2dOYW1lcygpIHsKLQkJRGF0YWJhc2UgZGIgPSB0aGlzLmdldERhdGFiYXNlKCk7Ci0JCXJldHVybiAoZGIgPT0gbnVsbCkgPyBudWxsIDogZGIuY2F0YWxvZ05hbWVzKCk7Ci0JfQotCi0JcHVibGljIENhdGFsb2cgZ2V0Q2F0YWxvZ05hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCURhdGFiYXNlIGRiID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCQlyZXR1cm4gKGRiID09IG51bGwpID8gbnVsbCA6IGRiLmdldENhdGFsb2dOYW1lZChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ2F0YWxvZyBnZXREZWZhdWx0Q2F0YWxvZygpIHsKLQkJRGF0YWJhc2UgZGIgPSB0aGlzLmdldERhdGFiYXNlKCk7Ci0JCXJldHVybiAoZGIgPT0gbnVsbCkgPyBudWxsIDogZGIuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBzY2hlbWFOYW1lcygpIHsKLQkJRGF0YWJhc2UgZGIgPSB0aGlzLmdldERhdGFiYXNlKCk7Ci0JCXJldHVybiAoZGIgPT0gbnVsbCkgPyBudWxsIDogZGIuc2NoZW1hTmFtZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldFNjaGVtYU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCURhdGFiYXNlIGRiID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCQlyZXR1cm4gKGRiID09IG51bGwpID8gbnVsbCA6IGRiLmdldFNjaGVtYU5hbWVkKG5hbWUpOwotCX0KLQotCXB1YmxpYyBTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJRGF0YWJhc2UgZGIgPSB0aGlzLmdldERhdGFiYXNlKCk7Ci0JCXJldHVybiAoZGIgPT0gbnVsbCkgPyBudWxsIDogZGIuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCXB1YmxpYyA8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIGdldERhdGFiYXNlT2JqZWN0TmFtZWQoVFtdIGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIG5hbWUpIHsKLQkJRGF0YWJhc2UgZGIgPSB0aGlzLmdldERhdGFiYXNlKCk7Ci0JCXJldHVybiAoZGIgPT0gbnVsbCkgPyBudWxsIDogZGIuZ2V0RGF0YWJhc2VPYmplY3ROYW1lZChkYXRhYmFzZU9iamVjdHMsIG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLnJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUsIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKS5nZXREYXRhYmFzZUZpbmRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb25uZWN0aW9uUHJvZmlsZShDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBvbGQgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCQlpZiAob2xkICE9IG51bGwpIHsKLQkJCW9sZC5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBjb25uZWN0aW9uUHJvZmlsZTsKLQkJaWYgKGNvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpIHsKLQkJCWNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTk5FQ1RJT05fUFJPRklMRV9QUk9QRVJUWSwgb2xkLCBjb25uZWN0aW9uUHJvZmlsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIExpc3RlbiBmb3IgYSBjb25uZWN0aW9uIHByb2ZpbGUgd2l0aCBvdXIgbmFtZSBiZWluZyByZW1vdmVkLgotCSAqIEFsc28gbGlzdGVuIGZvciBvdXIgY29ubmVjdGlvbidzIG5hbWUgYmVpbmcgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgTG9jYWxDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGltcGxlbWVudHMgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciB7Ci0KLQkJcHJvdGVjdGVkIExvY2FsQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZUFkZGVkKFN0cmluZyBuYW1lKSB7Ci0JCQkvLyBjaGVjayB0byBzZWUgaWYgYSBjb25uZWN0aW9uIHByb2ZpbGUgd2l0aCBvdXIgbmFtZSB3YXMgYWRkZWQKLQkJCS8vIChhc3N1bWUgb3VyIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBudWxsKQotCQkJaWYgKEdlbmVyaWNKcGFEYXRhU291cmNlLnRoaXMuY29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJCWlmIChuYW1lLmVxdWFscyhHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpKSkgewotCQkJCQlHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShuYW1lKTsgIC8vIHRoaXMgd2lsbCB0cmlnZ2VyIGNyZWF0aW9uIG9mIENQCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW1vdmVkKFN0cmluZyBuYW1lKSB7Ci0JCQlpZiAoR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKG5hbWUuZXF1YWxzKEdlbmVyaWNKcGFEYXRhU291cmNlLnRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCUdlbmVyaWNKcGFEYXRhU291cmNlLnRoaXMuc2V0Q29ubmVjdGlvblByb2ZpbGUobnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbmFtZWQoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCQlpZiAoR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSB3aWxsIGFscmVhZHkgaGF2ZSB0aGUgbmV3IG5hbWUsCi0JCQkvLyB3ZSBqdXN0IG5lZWQgdG8gc3luY2ggdGhlIG5hbWUgaGVsZCBieSB0aGUgZGF0YSBzb3VyY2UKLQkJCWlmIChuZXdOYW1lLmVxdWFscyhHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldE5hbWUoKSkpIHsKLQkJCQlHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShuZXdOYW1lKTsKLQkJCX0KLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXaGVuZXZlciB0aGUgY29ubmVjdGlvbiBpcyBvcGVuZWQgb3IgY2xvc2VkIHRyaWdnZXIgYSBwcm9qZWN0IHVwZGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBDb25uZWN0aW9uQWRhcHRlciB7Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQlHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLmdldEpwYVByb2plY3QoKS51cGRhdGUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5nZXRKcGFQcm9qZWN0KCkudXBkYXRlKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFGaWxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhZTcyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSnBhRmlsZSBleHRlbmRzIEFic3RyYWN0SnBhTm9kZSBpbXBsZW1lbnRzIEpwYUZpbGUKLXsKLQkvKioKLQkgKiBUaGUgSUZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSlBBIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSUZpbGUgZmlsZTsKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgbW9kZWwgcmVwcmVzZW50ZWQgYnkgdGhpcyBKUEEgZmlsZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWw7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnRleHQgbW9kZWwgcm9vdCBub2RlcyByZXByZXNlbnRlZCBieSB0aGlzIEpQQSBmaWxlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEhhc2h0YWJsZTxPYmplY3QsIEpwYVN0cnVjdHVyZU5vZGU+IHJvb3RTdHJ1Y3R1cmVOb2RlczsKLQkKLQlwdWJsaWMgR2VuZXJpY0pwYUZpbGUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlLCBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwpIHsKLQkJc3VwZXIoanBhUHJvamVjdCk7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbCA9IHJlc291cmNlTW9kZWw7Ci0JCXRoaXMucm9vdFN0cnVjdHVyZU5vZGVzID0gbmV3IEhhc2h0YWJsZTxPYmplY3QsIEpwYVN0cnVjdHVyZU5vZGU+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25VcGRhdGVBc3BlY3ROYW1lcykgewotCQlzdXBlci5hZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKG5vblVwZGF0ZUFzcGVjdE5hbWVzKTsKLQkJLy9KcGFGaWxlLlJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04gZG9lcyBub3QgbmVlZCB0byB0cmlnZ2VyIGEgcHJvamVjdCB1cGRhdGUsIAotCQkvL29ubHkgdGhlIFVJIGNhcmVzIGFib3V0IHRoZSByb290U3RydWN0dXJlTm9kZS4KLQkJLy9JZiB5b3UgZG8gYSBwcm9qZWN0IHVwZGF0ZSBvbiB0aGlzIHlvdSBnZXQgaW4gYW4gaW5maW5pdGUgbG9vcCBpZiB5b3UKLQkJLy9zcGVjaWZ5IGEgamF2YSBjbGFzcyBpbiBtb3JlIHRoYW4gb25lIGxvY2F0aW9uIGluIHlvdXIgcGVyc2lzdGVuY2UgdW5pdC4KLQkJbm9uVXBkYXRlQXNwZWN0TmFtZXMuYWRkKEpwYUZpbGUuUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTik7Ci0JfQotCQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gdGhpcy5maWxlOwotCX0KLQkKLQlwdWJsaWMgUmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZU1vZGVsOwotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8SnBhU3RydWN0dXJlTm9kZT4gcm9vdFN0cnVjdHVyZU5vZGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8SnBhU3RydWN0dXJlTm9kZT4odGhpcy5yb290U3RydWN0dXJlTm9kZXMudmFsdWVzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgcm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucm9vdFN0cnVjdHVyZU5vZGVzLnNpemUoKTsKLQl9Ci0KLQkvLyBUT0RPIG1vdmUgZXZlbnRzIG91dHNpZGUgb2YgJ3N5bmNocm9uaXplZCcgYmxvY2s/Ci0JLy8gbmVlZCBmaXJlSXRlbVJlcGxhY2VkKFN0cmluZywgT2JqZWN0LCBPYmplY3QpIGZvciBDb2xsZWN0aW9uPwotCXB1YmxpYyB2b2lkIGFkZFJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXksIEpwYVN0cnVjdHVyZU5vZGUgcm9vdFN0cnVjdHVyZU5vZGUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLnJvb3RTdHJ1Y3R1cmVOb2RlcykgewotCQkJSnBhU3RydWN0dXJlTm9kZSBub2RlID0gdGhpcy5yb290U3RydWN0dXJlTm9kZXMuZ2V0KGtleSk7Ci0JCQlpZiAobm9kZSA9PSByb290U3RydWN0dXJlTm9kZSkgewotCQkJCXJldHVybjsgIC8vIG5vIGR1cGxpY2F0ZXMKLQkJCX0KLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQl0aGlzLnJvb3RTdHJ1Y3R1cmVOb2Rlcy5yZW1vdmUoa2V5KTsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChKcGFGaWxlLlJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04sIG5vZGUpOwotCQkJfQotCQkJdGhpcy5yb290U3RydWN0dXJlTm9kZXMucHV0KGtleSwgcm9vdFN0cnVjdHVyZU5vZGUpOwotCQkJdGhpcy5maXJlSXRlbUFkZGVkKEpwYUZpbGUuUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTiwgcm9vdFN0cnVjdHVyZU5vZGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXkpIHsKLQkJSnBhU3RydWN0dXJlTm9kZSByZW1vdmVkU3RydWN0dXJlTm9kZSA9IHRoaXMucm9vdFN0cnVjdHVyZU5vZGVzLnJlbW92ZShrZXkpOwotCQlmaXJlSXRlbVJlbW92ZWQoSnBhRmlsZS5ST09UX1NUUlVDVFVSRV9OT0RFU19DT0xMRUNUSU9OLCByZW1vdmVkU3RydWN0dXJlTm9kZSk7Ci0JfQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKLQkJZm9yIChKcGFTdHJ1Y3R1cmVOb2RlIHJvb3ROb2RlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHJvb3RTdHJ1Y3R1cmVOb2RlcygpKSkgewotCQkJSnBhU3RydWN0dXJlTm9kZSBub2RlID0gcm9vdE5vZGUuZ2V0U3RydWN0dXJlTm9kZSh0ZXh0T2Zmc2V0KTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPE9iamVjdD4gcm9vdFN0cnVjdHVyZU5vZGVLZXlzKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8T2JqZWN0Pih0aGlzLnJvb3RTdHJ1Y3R1cmVOb2Rlcy5rZXlTZXQoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZU1vZGVsKCkuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWdldFJlc291cmNlTW9kZWwoKS5kaXNwb3NlKCk7Ci0KLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMucm9vdFN0cnVjdHVyZU5vZGVLZXlzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5yZW1vdmVSb290U3RydWN0dXJlTm9kZShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQlnZXRSZXNvdXJjZU1vZGVsKCkuamF2YUVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoZ2V0RmlsZSgpLnRvU3RyaW5nKCkpOwotCQlzYi5hcHBlbmQoIiAocmVzb3VyY2VUeXBlOiAiKTsKLQkJc2IuYXBwZW5kKGdldFJlc291cmNlVHlwZSgpKTsKLQkJc2IuYXBwZW5kKCIpIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbVJlc291cmNlKCkgewotCQl0aGlzLnJlc291cmNlTW9kZWwudXBkYXRlRnJvbVJlc291cmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMzE2ZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0LkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByb2plY3RGYWNldEFjdGlvbkV2ZW50OwotCi0vKioKLSAqIFRoZSBKUEEgbW9kZWwgaXMgc3luY2hyb25pemVkIHNvIGFsbCBjaGFuZ2VzIHRvIHRoZSBsaXN0IG9mIEpQQSBwcm9qZWN0cwotICogYXJlIHRocmVhZC1zYWZlLgotICogCi0gKiBUaGUgSlBBIG1vZGVsIGhvbGRzIG9uIHRvIGEgbGlzdCBvZiBKUEEgcHJvamVjdCBjb25maWdzIGFuZCBvbmx5IGluc3RhbnRpYXRlcwotICogdGhlaXIgYXNzb2NpYXRlZCBKUEEgcHJvamVjdHMgd2hlbiBuZWNlc3NhcnkuIE90aGVyIHRoYW4gcGVyZm9ybWFuY2UsCi0gKiB0aGlzIHNob3VsZCBiZSB0cmFuc3BhcmVudCB0byBjbGllbnRzLgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYU1vZGVsCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBKcGFNb2RlbAotewotCi0JLyoqIG1haW50YWluIGEgbGlzdCBvZiBhbGwgdGhlIGN1cnJlbnQgSlBBIHByb2plY3RzICovCi0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SnBhUHJvamVjdEhvbGRlcj4ganBhUHJvamVjdEhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PEpwYVByb2plY3RIb2xkZXI+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSlBBIG1vZGVsIGFuZCBwb3B1bGF0ZSBpdCB3aXRoIEpQQSBwcm9qZWN0cyBmb3IgYWxsIHRoZQotCSAqIGN1cnJlbnQgRWNsaXBzZSBwcm9qZWN0cyB3aXRoIEpQQSBmYWNldHMuCi0JICogVGhlIEpQQSBtb2RlbCBjYW4gb25seSBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIEpQQSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCUdlbmVyaWNKcGFNb2RlbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5hY2NlcHQobmV3IFJlc291cmNlUHJveHlWaXNpdG9yKCksIElSZXNvdXJjZS5OT05FKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSUpwYU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoZSBKUEEgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVByb2plY3RIb2xkZXIocHJvamVjdCkuanBhUHJvamVjdCgpOwotCX0KLQotCS8qKgotCSAqIFdlIGNhbiBhbnN3ZXIgdGhpcyBxdWVzdGlvbiB3aXRob3V0IGluc3RhbnRpYXRpbmcgdGhlCi0JICogYXNzb2NpYXRlZCBKUEEgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnNKcGFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdEhvbGRlcihwcm9qZWN0KS5ob2xkc0pwYVByb2plY3RGb3IocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHRyaWdnZXIgdGhlIGluc3RhbnRpYXRpb24gb2YgYWxsIHRoZSBKUEEgcHJvamVjdHMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJdGVyYXRvcjxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZm9yY2UgdGhlIENvcmVFeGNlcHRpb24gdG8gb2NjdXIgaGVyZSAoaW5zdGVhZCBvZiBsYXRlciwgaW4gSXRlcmF0b3IjbmV4dCgpKQotCQlBcnJheUxpc3Q8SnBhUHJvamVjdD4ganBhUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PEpwYVByb2plY3Q+KHRoaXMuanBhUHJvamVjdEhvbGRlcnMuc2l6ZSgpKTsKLQkJZm9yIChKcGFQcm9qZWN0SG9sZGVyIGhvbGRlciA6IHRoaXMuanBhUHJvamVjdEhvbGRlcnMpIHsKLQkJCWpwYVByb2plY3RzLmFkZChob2xkZXIuanBhUHJvamVjdCgpKTsKLQkJfQotCQlyZXR1cm4ganBhUHJvamVjdHMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBjYW4gYW5zd2VyIHRoaXMgcXVlc3Rpb24gd2l0aG91dCBpbnN0YW50aWF0aW5nIGFueSBKUEEgcHJvamVjdHMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQganBhUHJvamVjdHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0SG9sZGVycy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHRyaWdnZXIgdGhlIGluc3RhbnRpYXRpb24gb2YgdGhlIEpQQSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIEpwYUZpbGUgZ2V0SnBhRmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IHRoaXMuZ2V0SnBhUHJvamVjdChmaWxlLmdldFByb2plY3QoKSk7Ci0JCXJldHVybiAoanBhUHJvamVjdCA9PSBudWxsKSA/IG51bGwgOiBqcGFQcm9qZWN0LmdldEpwYUZpbGUoZmlsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogbmV2ZXIgcmV0dXJuIG51bGwKLQkgKi8KLQlwcml2YXRlIEpwYVByb2plY3RIb2xkZXIgZ2V0SnBhUHJvamVjdEhvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZvciAoSnBhUHJvamVjdEhvbGRlciBob2xkZXIgOiB0aGlzLmpwYVByb2plY3RIb2xkZXJzKSB7Ci0JCQlpZiAoaG9sZGVyLmhvbGRzSnBhUHJvamVjdEZvcihwcm9qZWN0KSkgewotCQkJCXJldHVybiBob2xkZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE51bGxKcGFQcm9qZWN0SG9sZGVyLmluc3RhbmNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBKcGFQcm9qZWN0LkNvbmZpZyBidWlsZEpwYVByb2plY3RDb25maWcoSVByb2plY3QgcHJvamVjdCkgewotCQlTaW1wbGVKcGFQcm9qZWN0Q29uZmlnIGNvbmZpZyA9IG5ldyBTaW1wbGVKcGFQcm9qZWN0Q29uZmlnKCk7Ci0JCWNvbmZpZy5zZXRQcm9qZWN0KHByb2plY3QpOwotCQljb25maWcuc2V0SnBhUGxhdGZvcm0oSnB0Q29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybShwcm9qZWN0KSk7Ci0JCWNvbmZpZy5zZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUocHJvamVjdCkpOwotCQljb25maWcuc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUoSnB0Q29yZVBsdWdpbi5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZShwcm9qZWN0KSk7Ci0JCWNvbmZpZy5zZXREaXNjb3ZlckFubm90YXRlZENsYXNzZXMoSnB0Q29yZVBsdWdpbi5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMocHJvamVjdCkpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qIHByaXZhdGUgKi8gdm9pZCBhZGRKcGFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5hZGRKcGFQcm9qZWN0KHRoaXMuYnVpbGRKcGFQcm9qZWN0Q29uZmlnKHByb2plY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBKUEEgcHJvamVjdCB0byB0aGUgSlBBIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKiBKUEEgcHJvamVjdHMgY2FuIG9ubHkgYmUgYWRkZWQgYnkgdGhlIEpQQSBtb2RlbCBtYW5hZ2VyLgotCSAqIFRoZSBKUEEgcHJvamVjdCB3aWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGxhdGVyLCBvbiBkZW1hbmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEpwYVByb2plY3QoSnBhUHJvamVjdC5Db25maWcgY29uZmlnKSB7Ci0JCWR1bXBTdGFja1RyYWNlKCk7ICAvLyBmaWd1cmUgb3V0IGV4YWN0bHkgd2hlbiBKUEEgcHJvamVjdHMgYXJlIGFkZGVkCi0JCXRoaXMuanBhUHJvamVjdEhvbGRlcnMuYWRkKHRoaXMuZ2V0SnBhUHJvamVjdEhvbGRlcihjb25maWcuZ2V0UHJvamVjdCgpKS5idWlsZEpwYVByb2plY3RIb2xkZXIodGhpcywgY29uZmlnKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBKUEEgcHJvamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0Ci0JICogZnJvbSB0aGUgSlBBIG1vZGVsLiBSZXR1cm4gd2hldGhlciB0aGUgcmVtb3ZhbCBhY3R1YWxseSBoYXBwZW5lZC4KLQkgKiBKUEEgcHJvamVjdHMgY2FuIG9ubHkgYmUgcmVtb3ZlZCBieSB0aGUgSlBBIG1vZGVsIG1hbmFnZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlkdW1wU3RhY2tUcmFjZSgpOyAgLy8gZmlndXJlIG91dCBleGFjdGx5IHdoZW4gSlBBIHByb2plY3RzIGFyZSByZW1vdmVkCi0JCXRoaXMuZ2V0SnBhUHJvamVjdEhvbGRlcihwcm9qZWN0KS5yZW1vdmUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUmVzb3VyY2UgZXZlbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgcHJvamVjdCBpcyBiZWluZyBkZWxldGVkLiBSZW1vdmUgaXRzIGNvcnJlc3BvbmRpbmcKLQkgKiBKUEEgcHJvamVjdCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLQlzeW5jaHJvbml6ZWQgdm9pZCBwcm9qZWN0UHJlRGVsZXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5yZW1vdmVKcGFQcm9qZWN0KHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBkZWx0YSB0byB0aGUgSlBBIHByb2plY3QgY29ycmVzcG9uZGluZwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotCSAqLwotCXN5bmNocm9uaXplZCB2b2lkIHN5bmNocm9uaXplRmlsZXMoSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdEhvbGRlcihwcm9qZWN0KS5zeW5jaHJvbml6ZUpwYUZpbGVzKGRlbHRhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUmVzb3VyY2UgYW5kL29yIEZhY2V0IGV2ZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBKUEEgZmFjZXQgaGFzIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKi8KLQlzeW5jaHJvbml6ZWQgdm9pZCBjaGVja0ZvclRyYW5zaXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGpwYUZhY2V0ID0gSnB0Q29yZVBsdWdpbi5wcm9qZWN0SGFzSnBhRmFjZXQocHJvamVjdCk7Ci0JCWJvb2xlYW4ganBhUHJvamVjdCA9IHRoaXMuY29udGFpbnNKcGFQcm9qZWN0KHByb2plY3QpOwotCi0JCWlmIChqcGFGYWNldCkgewotCQkJaWYgKCAhIGpwYVByb2plY3QpIHsgIC8vIEpQQSBmYWNldCBhZGRlZAotCQkJCXRoaXMuYWRkSnBhUHJvamVjdChwcm9qZWN0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChqcGFQcm9qZWN0KSB7ICAvLyBKUEEgZmFjZXQgcmVtb3ZlZAotCQkJCXRoaXMucmVtb3ZlSnBhUHJvamVjdChwcm9qZWN0KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBGYWNldCBldmVudHMgKioqKioqKioqKgotCi0JLy8gY3JlYXRlIHBlcnNpc3RlbmNlLnhtbCBhbmQgb3JtLnhtbCBpbiBqb2JzIHNvIHdlIGRvbid0IGRlYWRsb2NrCi0JLy8gd2l0aCB0aGUgUmVzb3VyY2UgQ2hhbmdlIEV2ZW50IHRoYXQgY29tZXMgaW4gZnJvbSBhbm90aGVyCi0JLy8gdGhyZWFkIGFmdGVyIHRoZSBFY2xpcHNlIHByb2plY3QgaXMgY3JlYXRlZCBieSB0aGUgcHJvamVjdCBmYWNldAotCS8vIHdpemFyZCAod2hpY2ggaGFwcGVucyBiZWZvcmUgdGhlIHdpemFyZCBub3RpZmllcyB1cyk7IHRoZSBBcnRpZmFjdAotCS8vIEVkaXRzIHdpbGwgaGFuZyBkdXJpbmcgI3NhdmUoKSwgd2FpdGluZyBmb3IgdGhlIHdvcmtzcGFjZSBsb2NrIGhlbGQKLQkvLyBieSB0aGUgUmVzb3VyY2UgQ2hhbmdlIE5vdGlmaWNhdGlvbiBsb29wCi0Jc3luY2hyb25pemVkIHZvaWQganBhRmFjZXRlZFByb2plY3RQb3N0SW5zdGFsbChJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGV2ZW50LmdldFByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gKElEYXRhTW9kZWwpIGV2ZW50LmdldEFjdGlvbkNvbmZpZygpOwotCi0JCWJvb2xlYW4gYnVpbGRPcm1YbWwgPSBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCk7Ci0JCXRoaXMuYnVpbGRQcm9qZWN0WG1sSm9iKHByb2plY3QsIGJ1aWxkT3JtWG1sKS5zY2hlZHVsZSgpOwotCi0JCS8vIGFzc3VtZSg/KSB0aGlzIGlzIHRoZSBmaXJzdCBldmVudCB0byBpbmRpY2F0ZSB3ZSBuZWVkIHRvIGFkZCB0aGUgSlBBIHByb2plY3QgdG8gdGhlIEpQQSBtb2RlbAotCQl0aGlzLmFkZEpwYVByb2plY3QocHJvamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSBKb2IgYnVpbGRQcm9qZWN0WG1sSm9iKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIGJvb2xlYW4gYnVpbGRPcm1YbWwpIHsKLQkJSm9iIGpvYiA9IG5ldyBKb2IoIkNyZWF0ZSBQcm9qZWN0IFhNTCBmaWxlcyIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCUdlbmVyaWNKcGFNb2RlbC50aGlzLmNyZWF0ZVByb2plY3RYbWwocHJvamVjdCwgYnVpbGRPcm1YbWwpOwotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQlqb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJcmV0dXJuIGpvYjsKLQl9Ci0KLQkvKiBwcml2YXRlICovIHZvaWQgY3JlYXRlUHJvamVjdFhtbChJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGJ1aWxkT3JtWG1sKSB7Ci0JCXRoaXMuY3JlYXRlUGVyc2lzdGVuY2VYbWwocHJvamVjdCk7Ci0KLQkJaWYgKGJ1aWxkT3JtWG1sKSB7Ci0JCQl0aGlzLmNyZWF0ZU9ybVhtbChwcm9qZWN0KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBlcnNpc3RlbmNlWG1sKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgcGFlID0gUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQotCQkvLyAyMDI4MTEgLSBkbyBub3QgYWRkIGNvbnRlbnQgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcmVzb3VyY2UgPSBwYWUuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKCEgcmVzb3VyY2UuZ2V0RmlsZSgpLmV4aXN0cygpKSB7Ci0JCQlwYWUuY3JlYXRlRGVmYXVsdFJlc291cmNlKCk7Ci0JCX0KLQkJCi0JCXBhZS5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9ybVhtbChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCU9ybUFydGlmYWN0RWRpdCBvYWUgPSBPcm1BcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCU9ybVJlc291cmNlIHJlc291cmNlID0gb2FlLmdldFJlc291cmNlKEpwdENvcmVQbHVnaW4uZ2V0RGVmYXVsdE9ybVhtbERlcGxveW1lbnRVUkkocHJvamVjdCkpOwotCi0JCS8vIDIwMjgxMSAtIGRvIG5vdCBhZGQgY29udGVudCBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQKLQkJaWYgKHJlc291cmNlLmdldEVudGl0eU1hcHBpbmdzKCkgPT0gbnVsbCkgewotCQkJWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOwotCQkJZW50aXR5TWFwcGluZ3Muc2V0VmVyc2lvbigiMS4wIik7Ci0JCQl0aGlzLmdldFJlc291cmNlQ29udGVudHMocmVzb3VyY2UpLmFkZChlbnRpdHlNYXBwaW5ncyk7Ci0JCQlvYWUuc2F2ZShudWxsKTsKLQkJfQotCQkKLQkJb2FlLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEVMaXN0PEVPYmplY3Q+IGdldFJlc291cmNlQ29udGVudHMoT3JtUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIHJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JfQotCi0JLy8gVE9ETyByZW1vdmUgY2xhc3NwYXRoIGl0ZW1zPyBwZXJzaXN0ZW5jZS54bWw/IG9ybS54bWw/Ci0Jc3luY2hyb25pemVkIHZvaWQganBhRmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGwoSVByb2plY3RGYWNldEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCS8vIGFzc3VtZSg/KSB0aGlzIGlzIHRoZSBmaXJzdCBldmVudCB0byBpbmRpY2F0ZSB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgSlBBIHByb2plY3QgdG8gdGhlIEpQQSBtb2RlbAotCQl0aGlzLnJlbW92ZUpwYVByb2plY3QoZXZlbnQuZ2V0UHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgZXZlbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIEZvcndhcmQgdGhlIEphdmEgZWxlbWVudCBjaGFuZ2VkIGV2ZW50IHRvIGFsbCB0aGUgSlBBIHByb2plY3RzCi0JICogYmVjYXVzZSB0aGUgZXZlbnQgY291bGQgYWZmZWN0IG11bHRpcGxlIHByb2plY3RzLgotCSAqLwotCXN5bmNocm9uaXplZCB2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoSnBhUHJvamVjdEhvbGRlciBqcGFQcm9qZWN0SG9sZGVyIDogdGhpcy5qcGFQcm9qZWN0SG9sZGVycykgewotCQkJanBhUHJvamVjdEhvbGRlci5qYXZhRWxlbWVudENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2NlbGxhbmVvdXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIEpQQSBzZXR0aW5ncyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QKLQkgKiBoYXZlIGNoYW5nZWQgaW4gc3VjaCBhIHdheSBhcyB0byByZXF1aXJlIHRoZSBhc3NvY2lhdGVkCi0JICogSlBBIHByb2plY3QgdG8gYmUgY29tcGxldGVseSByZWJ1aWx0Ci0JICogKGUuZy4gd2hlbiB0aGUgdXNlciBjaGFuZ2VzIGEgcHJvamVjdCdzIEpQQSBwbGF0Zm9ybSkuCi0JICovCi0Jc3luY2hyb25pemVkIHZvaWQgcmVidWlsZEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLnJlbW92ZUpwYVByb2plY3QocHJvamVjdCk7Ci0JCXRoaXMuYWRkSnBhUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIHRoZSBKUEEgbW9kZWwgYnkgZGlzcG9zaW5nIGFuZCByZW1vdmluZyBhbGwgaXRzIEpQQSBwcm9qZWN0cy4KLQkgKiBUaGUgSlBBIG1vZGVsIGNhbiBvbmx5IGJlIGRpc3Bvc2VkIGJ5IHRoZSBKUEEgbW9kZWwgbWFuYWdlci4KLQkgKi8KLQlzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBjbG9uZSB0aGUgbGlzdCB0byBwcmV2ZW50IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbnMKLQkJSnBhUHJvamVjdEhvbGRlcltdIGhvbGRlcnMgPSB0aGlzLmpwYVByb2plY3RIb2xkZXJzLnRvQXJyYXkobmV3IEpwYVByb2plY3RIb2xkZXJbdGhpcy5qcGFQcm9qZWN0SG9sZGVycy5zaXplKCldKTsKLQkJZm9yIChKcGFQcm9qZWN0SG9sZGVyIGhvbGRlciA6IGhvbGRlcnMpIHsKLQkJCWhvbGRlci5yZW1vdmUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCJKUEEgcHJvamVjdHMgc2l6ZTogIiArIHRoaXMuanBhUHJvamVjdHNTaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBob2xkZXIgY2FsbGJhY2tzICoqKioqKioqKioKLQotCS8qKgotCSAqIGNhbGxlZCBieSB0aGUgSlBBIHByb2plY3QgaG9sZGVyIHdoZW4gdGhlIEpQQSBwcm9qZWN0IGlzIGFjdHVhbGx5Ci0JICogaW5zdGFudGlhdGVkCi0JICovCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGpwYVByb2plY3RCdWlsdChKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEpQQV9QUk9KRUNUU19DT0xMRUNUSU9OLCBqcGFQcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBjYWxsZWQgYnkgdGhlIEpQQSBwcm9qZWN0IGhvbGRlciBpZiB0aGUgSlBBIHByb2plY3QgaGFzIGJlZW4KLQkgKiBpbnN0YW50aWF0ZWQgYW5kIHdlIG5lZWQgdG8gcmVtb3ZlIGl0Ci0JICovCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGpwYVByb2plY3RSZW1vdmVkKEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChKUEFfUFJPSkVDVFNfQ09MTEVDVElPTiwganBhUHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogY2FsbGVkIGJ5IHRoZSBKUEEgcHJvamVjdCBob2xkZXIKLQkgKi8KLQkvKiBwcml2YXRlICovIHZvaWQgcmVtb3ZlSnBhUHJvamVjdEhvbGRlcihKcGFQcm9qZWN0SG9sZGVyIGpwYVByb2plY3RIb2xkZXIpIHsKLQkJdGhpcy5qcGFQcm9qZWN0SG9sZGVycy5yZW1vdmUoanBhUHJvamVjdEhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpQQSBwcm9qZWN0IGhvbGRlcnMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgSnBhUHJvamVjdEhvbGRlciB7Ci0KLQkJYm9vbGVhbiBob2xkc0pwYVByb2plY3RGb3IoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkJdm9pZCBzeW5jaHJvbml6ZUpwYUZpbGVzKElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCQl2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KTsKLQotCQlKcGFQcm9qZWN0SG9sZGVyIGJ1aWxkSnBhUHJvamVjdEhvbGRlcihHZW5lcmljSnBhTW9kZWwganBhTW9kZWwsIEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZyk7Ci0KLQkJdm9pZCByZW1vdmUoKTsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxKcGFQcm9qZWN0SG9sZGVyIGltcGxlbWVudHMgSnBhUHJvamVjdEhvbGRlciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVByb2plY3RIb2xkZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbEpwYVByb2plY3RIb2xkZXIoKTsKLQotCQlzdGF0aWMgSnBhUHJvamVjdEhvbGRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsSnBhUHJvamVjdEhvbGRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBob2xkc0pwYVByb2plY3RGb3IoSVByb2plY3QgcHJvamVjdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIEpwYVByb2plY3QganBhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3luY2hyb25pemVKcGFGaWxlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyBKcGFQcm9qZWN0SG9sZGVyIGJ1aWxkSnBhUHJvamVjdEhvbGRlcihHZW5lcmljSnBhTW9kZWwganBhTW9kZWwsIENvbmZpZyBjb25maWcpIHsKLQkJCXJldHVybiBuZXcgRGVmYXVsdEpwYVByb2plY3RIb2xkZXIoanBhTW9kZWwsIGNvbmZpZyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFpciBhIEpQQSBwcm9qZWN0IGNvbmZpZyB3aXRoIGl0cyBsYXppbHktaW5pdGlhbGl6ZWQgSlBBIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVmYXVsdEpwYVByb2plY3RIb2xkZXIgaW1wbGVtZW50cyBKcGFQcm9qZWN0SG9sZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBHZW5lcmljSnBhTW9kZWwganBhTW9kZWw7Ci0JCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdC5Db25maWcgY29uZmlnOwotCQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCQlEZWZhdWx0SnBhUHJvamVjdEhvbGRlcihHZW5lcmljSnBhTW9kZWwganBhTW9kZWwsIEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuanBhTW9kZWwgPSBqcGFNb2RlbDsKLQkJCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaG9sZHNKcGFQcm9qZWN0Rm9yKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCXJldHVybiB0aGlzLmNvbmZpZy5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpOwotCQl9Ci0KLQkJcHVibGljIEpwYVByb2plY3QganBhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmICh0aGlzLmpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJCXRoaXMuanBhUHJvamVjdCA9IHRoaXMuYnVpbGRKcGFQcm9qZWN0KCk7Ci0JCQkJLy8gbm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgSlBBIG1vZGVsCi0JCQkJdGhpcy5qcGFNb2RlbC5qcGFQcm9qZWN0QnVpbHQodGhpcy5qcGFQcm9qZWN0KTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLmpwYVByb2plY3Q7Ci0JCX0KLQotCQlwcml2YXRlIEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gdGhpcy5jb25maWcuZ2V0SnBhUGxhdGZvcm0oKS5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKcGFQcm9qZWN0KHRoaXMuY29uZmlnKTsKLQkJCWpwYVByb2plY3Quc2V0VXBkYXRlcihuZXcgQXN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIoanBhUHJvamVjdCkpOwotCQkJcmV0dXJuIGpwYVByb2plY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZUpwYUZpbGVzKElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAodGhpcy5qcGFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmpwYVByb2plY3Quc3luY2hyb25pemVKcGFGaWxlcyhkZWx0YSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQkJaWYgKHRoaXMuanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5qcGFQcm9qZWN0LmphdmFFbGVtZW50Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgSnBhUHJvamVjdEhvbGRlciBidWlsZEpwYVByb2plY3RIb2xkZXIoR2VuZXJpY0pwYU1vZGVsIGptLCBDb25maWcgYykgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5qcGFNb2RlbC5yZW1vdmVKcGFQcm9qZWN0SG9sZGVyKHRoaXMpOwotCQkJaWYgKHRoaXMuanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5qcGFNb2RlbC5qcGFQcm9qZWN0UmVtb3ZlZCh0aGlzLmpwYVByb2plY3QpOwotCQkJCXRoaXMuanBhUHJvamVjdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29uZmlnLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgcHJveHkgdmlzaXRvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBWaXNpdCB0aGUgd29ya3NwYWNlIHJlc291cmNlIHRyZWUsIGFkZGluZyBhIEpQQSBwcm9qZWN0IHRvIHRoZQotCSAqIEpQQSBtb2RlbCBmb3IgZWFjaCBvcGVuIEVjbGlwc2UgcHJvamVjdCB0aGF0IGhhcyBhIEpQQSBmYWNldC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlc291cmNlUHJveHlWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQotCQlSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSByZXNvdXJjZVByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlzd2l0Y2ggKHJlc291cmNlUHJveHkuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6Ci0JCQkJCXJldHVybiB0cnVlOyAgLy8gYWxsIHByb2plY3RzIGFyZSBpbiB0aGUgInJvb3QiCi0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCXRoaXMuY2hlY2tQcm9qZWN0KHJlc291cmNlUHJveHkpOwotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBuZXN0ZWQgcHJvamVjdHMKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrUHJvamVjdChJUmVzb3VyY2VQcm94eSByZXNvdXJjZVByb3h5KSB7Ci0JCQlpZiAocmVzb3VyY2VQcm94eS5pc0FjY2Vzc2libGUoKSkgeyAgLy8gdGhlIHByb2plY3QgZXhpc3RzIGFuZCBpcyBvcGVuCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2VQcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQlpZiAoSnB0Q29yZVBsdWdpbi5wcm9qZWN0SGFzSnBhRmFjZXQocHJvamVjdCkpIHsKLQkJCQkJR2VuZXJpY0pwYU1vZGVsLnRoaXMuYWRkSnBhUHJvamVjdChwcm9qZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogREVCVUcgKioqKioqKioqKgotCi0JLy8gQHNlZSBKcGFNb2RlbFRlc3RzI3Rlc3RERUJVRygpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkdW1wU3RhY2tUcmFjZSgpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQkvLyBsb2NrIFN5c3RlbS5vdXQgc28gdGhlIHN0YWNrIGVsZW1lbnRzIGFyZSBwcmludGVkIG91dCBjb250aWd1b3VzbHkKLQkJCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJCVN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0U3RhY2tUcmFjZSgpOwotCQkJCS8vIHNraXAgdGhlIGZpcnN0IDMgZWxlbWVudHMgLSB0aG9zZSBhcmUgdGhpcyBtZXRob2QgYW5kIDIgbWV0aG9kcyBpbiBUaHJlYWQKLQkJCQlmb3IgKGludCBpID0gMzsgaSA8IHN0YWNrVHJhY2UubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RhY2tUcmFjZUVsZW1lbnQgZWxlbWVudCA9IHN0YWNrVHJhY2VbaV07Ci0JCQkJCWlmIChlbGVtZW50LmdldE1ldGhvZE5hbWUoKS5lcXVhbHMoImludm9rZTAiKSkgewotCQkJCQkJYnJlYWs7ICAvLyBza2lwIGFsbCBlbGVtZW50cyBvdXRzaWRlIG9mIHRoZSBKVW5pdCB0ZXN0Ci0JCQkJCX0KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhUHJvamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjcyN2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KcGFDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYVByb2plY3QgZXh0ZW5kcyBBYnN0cmFjdEpwYU5vZGUgaW1wbGVtZW50cyBKcGFQcm9qZWN0IHsKLQotCS8qKgotCSAqIFRoZSBFY2xpcHNlIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgSlBBIHByb2plY3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0KLQkvKioKLQkgKiBUaGUgdmVuZG9yLXNwZWNpZmljIEpQQSBwbGF0Zm9ybSB0aGF0IGJ1aWxkcyB0aGUgSlBBIHByb2plY3QKLQkgKiBhbmQgYWxsIGl0cyBjb250ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSnBhUGxhdGZvcm0ganBhUGxhdGZvcm07Ci0KLQkvKioKLQkgKiBUaGUgZGF0YSBzb3VyY2UgdGhhdCB3cmFwcyB0aGUgRFRQIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKcGFEYXRhU291cmNlIGRhdGFTb3VyY2U7Ci0JCi0JLyoqCi0JICogQSBzY2hlbWEgbmFtZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBjb25uZWN0aW9uJ3MgZGVmYXVsdCBzY2hlbWEKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lOwotCi0JLyoqCi0JICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHByb2plY3Qgc2hvdWxkICJkaXNjb3ZlciIgYW5ub3RhdGVkCi0JICogY2xhc3NlcyBhdXRvbWF0aWNhbGx5LCBhcyBvcHBvc2VkIHRvIHJlcXVpcmluZyB0aGUgY2xhc3NlcyB0byBiZQotCSAqIGxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlczsKLQotCS8qKgotCSAqIFRoZSBKUEEgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBKUEEgcHJvamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPEpwYUZpbGU+IGpwYUZpbGVzOwotCi0JLyoqCi0JICogVGhlIHJvb3Qgb2YgdGhlIG1vZGVsIHJlcHJlc2VudGluZyB0aGUgY29sbGF0ZWQgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCAKLQkgKiB0aGUgSlBBIHByb2plY3QuCi0JICovCi0JcHJvdGVjdGVkIEpwYVJvb3RDb250ZXh0Tm9kZSByb290Q29udGV4dE5vZGU7Ci0KLQkvKioKLQkgKiBTdXBwb3J0IGZvciBtb2RpZnlpbmcgZG9jdW1lbnRzIHNoYXJlZCB3aXRoIHRoZSBVSS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGhyZWFkTG9jYWw8Q29tbWFuZEV4ZWN1dG9yPiB0aHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yOwotCXByb3RlY3RlZCBmaW5hbCBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotCi0JLyoqCi0JICogQSBwbHVnZ2FibGUgdXBkYXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvICJ1cGRhdGUiIHRoZSBwcm9qZWN0IGVpdGhlcgotCSAqIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkgKG9yIG5vdCBhdCBhbGwpLiBBbiBhc3luY2hyb25vdXMKLQkgKiB1cGRhdGVyIGlzIHRoZSBkZWZhdWx0IGFuZCBpcyB1c2VkIHdoZW4gdGhlIHByb2plY3QgaXMgYmVpbmcgbWFuaXB1bGF0ZWQKLQkgKiBieSB0aGUgVUkuIEEgc3luY2hyb25vdXMgdXBkYXRlciBpcyB1c2VkIHdoZW4gdGhlIHByb2plY3QgaXMgYmVpbmcKLQkgKiBtYW5pcHVsYXRlZCBieSBhICJiYXRjaCIgKG9yIG5vbi1VSSkgY2xpZW50IChlLmcuIHdoZW4gdGVzdGluZyB0aGUKLQkgKiAidXBkYXRlIiBiZWhhdmlvcikuIEEgbnVsbCB1cGRhdGVyIGlzIHVzZWQgZHVyaW5nIHRlc3RzIHRoYXQKLQkgKiBkbyBub3QgY2FyZSB3aGV0aGVyICJ1cGRhdGVzIiBvY2N1ci4gQ2xpZW50cyB3aWxsIG5lZWQgdG8gZXhwbGljaXRseQotCSAqIGNvbmZpZ3VyZSB0aGUgdXBkYXRlciBpZiB0aGV5IHJlcXVpcmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4KLQkgKiBhc3luY2hyb25vdXMgdXBkYXRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgVXBkYXRlciB1cGRhdGVyOwotCi0JLyoqCi0JICogUmVzb3VyY2UgbW9kZWxzIG5vdGlmeSB0aGlzIGxpc3RlbmVyIHdoZW4gdGhleSBjaGFuZ2UuIEEgcHJvamVjdCB1cGRhdGUKLQkgKiBzaG91bGQgb2NjdXIgYW55IHRpbWUgYSByZXNvdXJjZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZU1vZGVsTGlzdGVuZXIgcmVzb3VyY2VNb2RlbExpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBwcm9qZWN0IGFuZCBKUEEgcGxhdGZvcm0gYXJlIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBHZW5lcmljSnBhUHJvamVjdChKcGFQcm9qZWN0LkNvbmZpZyBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIobnVsbCk7ICAvLyBKUEEgcHJvamVjdCBpcyB0aGUgcm9vdCBvZiB0aGUgY29udGFpbm1lbnQgdHJlZQotCQlpZiAoKGNvbmZpZy5nZXRQcm9qZWN0KCkgPT0gbnVsbCkgfHwgKGNvbmZpZy5nZXRKcGFQbGF0Zm9ybSgpID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnByb2plY3QgPSBjb25maWcuZ2V0UHJvamVjdCgpOwotCQl0aGlzLmpwYVBsYXRmb3JtID0gY29uZmlnLmdldEpwYVBsYXRmb3JtKCk7Ci0JCXRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSnBhRGF0YVNvdXJjZSh0aGlzLCBjb25maWcuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCkpOwotCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lID0gY29uZmlnLmdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKCk7Ci0JCXRoaXMuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcyA9IGNvbmZpZy5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMoKTsKLQkJdGhpcy5qcGFGaWxlcyA9IHRoaXMuYnVpbGRFbXB0eUpwYUZpbGVzKCk7Ci0KLQkJdGhpcy50aHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yID0gdGhpcy5idWlsZFRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKTsKLQkJdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyID0gdGhpcy5idWlsZE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIoKTsKLQotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lciA9IHRoaXMuYnVpbGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoKTsKLQkJLy8gYnVpbGQgdGhlIEpQQSBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBFY2xpcHNlIHByb2plY3QncyBmaWxlcwotCQl0aGlzLnByb2plY3QuYWNjZXB0KHRoaXMuYnVpbGRJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IoKSwgSVJlc291cmNlLk5PTkUpOwotCi0JCXRoaXMucm9vdENvbnRleHROb2RlID0gdGhpcy5idWlsZFJvb3RDb250ZXh0Tm9kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFZlY3RvcjxKcGFGaWxlPiBidWlsZEVtcHR5SnBhRmlsZXMoKSB7Ci0JCXJldHVybiBuZXcgVmVjdG9yPEpwYUZpbGU+KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlRGVsdGFWaXNpdG9yIGJ1aWxkUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkTG9jYWw8Q29tbWFuZEV4ZWN1dG9yPiBidWlsZFRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXJldHVybiBuZXcgVGhyZWFkTG9jYWw8Q29tbWFuZEV4ZWN1dG9yPigpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBidWlsZE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZU1vZGVsTGlzdGVuZXIgYnVpbGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFJlc291cmNlTW9kZWxMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBJUmVzb3VyY2VQcm94eVZpc2l0b3IgYnVpbGRJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IoKSB7Ci0JCXJldHVybiBuZXcgSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVJvb3RDb250ZXh0Tm9kZSBidWlsZFJvb3RDb250ZXh0Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkUm9vdENvbnRleHQodGhpcyk7Ci0JfQotCi0JLy8gKioqKiogaW5uZXIgY2xhc3MKLQlwcm90ZWN0ZWQgY2xhc3MgSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQkJcHJvdGVjdGVkIEluaXRpYWxSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gYWRkIGEgSlBBIGZpbGUgZm9yIGV2ZXJ5IFthcHByb3ByaWF0ZV0gZmlsZSBlbmNvdW50ZXJlZCBieSB0aGUgdmlzaXRvcgotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDogIC8vIHNob3VsZG4ndCBoYXBwZW4KLQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCi0JCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCUdlbmVyaWNKcGFQcm9qZWN0LnRoaXMuYWRkSnBhRmlsZUludGVybmFsKChJRmlsZSkgcmVzb3VyY2UucmVxdWVzdFJlc291cmNlKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbgotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbgotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYWwgcXVlcmllcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3QuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3Q7Ci0JfQotCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZSh0aGlzLnByb2plY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBnZXRKcGFQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUGxhdGZvcm07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYURhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKTsKLQkJcmV0dXJuIChzY2hlbWEgIT0gbnVsbCkgPyBzY2hlbWEgOiB0aGlzLmdldERhdGFTb3VyY2UoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JfQotCQotCXB1YmxpYyBTY2hlbWEgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuICh0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0RGF0YVNvdXJjZSgpLmdldFNjaGVtYU5hbWVkKHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVzZXIgb3ZlcnJpZGUgZGVmYXVsdCBzY2hlbWEgbmFtZSAqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKFN0cmluZyBuZXdEZWZhdWx0U2NoZW1hTmFtZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFNjaGVtYU5hbWUgPSB0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lOwotCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lID0gbmV3RGVmYXVsdFNjaGVtYU5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BX05BTUVfUFJPUEVSVFksIAotCQkJCW9sZERlZmF1bHRTY2hlbWFOYW1lLCBuZXdEZWZhdWx0U2NoZW1hTmFtZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkgewotCQlyZXR1cm4gdGhpcy5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGJvb2xlYW4gZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcykgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlczsKLQkJdGhpcy5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzID0gZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU0NPVkVSU19BTk5PVEFURURfQ0xBU1NFU19QUk9QRVJUWSwgb2xkLCBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBKUEEgZmlsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEpwYUZpbGU+IGpwYUZpbGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8SnBhRmlsZT4odGhpcy5qcGFGaWxlcyk7ICAvLyByZWFkLW9ubHkKLQl9Ci0KLQlwdWJsaWMgaW50IGpwYUZpbGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhRmlsZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBKcGFGaWxlIGdldEpwYUZpbGUoSUZpbGUgZmlsZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMuanBhRmlsZXMpIHsKLQkJCWZvciAoSnBhRmlsZSBqcGFGaWxlIDogdGhpcy5qcGFGaWxlcykgewotCQkJCWlmIChqcGFGaWxlLmdldEZpbGUoKS5lcXVhbHMoZmlsZSkpIHsKLQkJCQkJcmV0dXJuIGpwYUZpbGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxKcGFGaWxlPiBqcGFGaWxlcyhmaW5hbCBTdHJpbmcgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SnBhRmlsZSwgSnBhRmlsZT4odGhpcy5qcGFGaWxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKcGFGaWxlIG8pIHsKLQkJCQlyZXR1cm4gby5nZXRSZXNvdXJjZVR5cGUoKS5lcXVhbHMocmVzb3VyY2VUeXBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBKUEEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLCBpZiBhcHByb3ByaWF0ZS4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhIEpQQSBGaWxlIHdhcyBjcmVhdGVkIGFuZCBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkSnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuYWRkSnBhRmlsZUludGVybmFsKGZpbGUpOwotCQlpZiAoanBhRmlsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoSlBBX0ZJTEVTX0NPTExFQ1RJT04sIGpwYUZpbGUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIEpQQSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUsIGlmIGFwcHJvcHJpYXRlLCB3aXRob3V0IGZpcmluZwotCSAqIGFuIGV2ZW50OyB1c2VmdWwgZHVyaW5nIGNvbnN0cnVjdGlvbi4KLQkgKiBSZXR1cm4gdGhlIG5ldyBKUEEgZmlsZSwgbnVsbCBpZiBpdCB3YXMgbm90IGNyZWF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIEpwYUZpbGUgYWRkSnBhRmlsZUludGVybmFsKElGaWxlIGZpbGUpIHsKLQkJSnBhRmlsZSBqcGFGaWxlID0gdGhpcy5qcGFQbGF0Zm9ybS5idWlsZEpwYUZpbGUodGhpcywgZmlsZSk7Ci0JCWlmIChqcGFGaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRoaXMuanBhRmlsZXMuYWRkKGpwYUZpbGUpOwotCQlqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKS5hZGRSZXNvdXJjZU1vZGVsQ2hhbmdlTGlzdGVuZXIodGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXIpOwotCQlyZXR1cm4ganBhRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIEpQQSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBJRmlsZSwgaWYgaXQgZXhpc3RzLgotCSAqIFJldHVybiB0cnVlIGlmIGEgSlBBIEZpbGUgd2FzIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUpwYUZpbGUoSUZpbGUgZmlsZSkgewotCQlKcGFGaWxlIGpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoZmlsZSk7Ci0JCWlmIChqcGFGaWxlICE9IG51bGwpIHsgLy9hIEpwYUZpbGUgaXMgbm90IGFkZGVkIGZvciBldmVyeSBJRmlsZQotCQkJcmVtb3ZlSnBhRmlsZShqcGFGaWxlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBKUEEgZmlsZSBhbmQgZGlzcG9zZSBvZiBpdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUpwYUZpbGUoSnBhRmlsZSBqcGFGaWxlKSB7Ci0JCWpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpLnJlbW92ZVJlc291cmNlTW9kZWxDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcik7Ci0JCWpwYUZpbGUuZGlzcG9zZSgpOwotCQlpZiAoICEgdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oanBhRmlsZSwgdGhpcy5qcGFGaWxlcywgSlBBX0ZJTEVTX0NPTExFQ1RJT04pKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJKUEEgZmlsZTogIiArIGpwYUZpbGUuZ2V0RmlsZSgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zSnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiAodGhpcy5nZXRKcGFGaWxlKGZpbGUpICE9IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250ZXh0IG1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyBKcGFSb290Q29udGV4dE5vZGUgZ2V0Um9vdENvbnRleHQoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3RDb250ZXh0Tm9kZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW9yZSBxdWVyaWVzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFubm90YXRlZENsYXNzTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgU3RyaW5nPih0aGlzLmFubm90YXRlZEphdmFQZXJzaXN0ZW50VHlwZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IGFubm90YXRlZEphdmFQZXJzaXN0ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPih0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgewotCQkJCXJldHVybiAocGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgPyBmYWxzZSA6IHBlcnNpc3RlbnRUeXBlLmlzUGVyc2lzdGVkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEpwYUNvbXBpbGF0aW9uVW5pdCwgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+PihqcGFDb21waWxhdGlvblVuaXRSZXNvdXJjZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gdHJhbnNmb3JtKEpwYUNvbXBpbGF0aW9uVW5pdCBuZXh0KSB7Ci0JCQkJCWlmIChuZXh0LmdldFBlcnNpc3RlbnRUeXBlKCkgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPihuZXh0LmdldFBlcnNpc3RlbnRUeXBlKCksIG5leHQuZ2V0UGVyc2lzdGVudFR5cGUoKS5uZXN0ZWRUeXBlcygpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8SnBhRmlsZT4gamF2YUpwYUZpbGVzKCkgewotCQlyZXR1cm4gdGhpcy5qcGFGaWxlcyhSZXNvdXJjZU1vZGVsLkpBVkFfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYXRvcjxKcGFDb21waWxhdGlvblVuaXQ+IGpwYUNvbXBpbGF0aW9uVW5pdFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEpwYUZpbGUsIEpwYUNvbXBpbGF0aW9uVW5pdD4odGhpcy5qYXZhSnBhRmlsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhQ29tcGlsYXRpb25Vbml0IHRyYW5zZm9ybShKcGFGaWxlIGpwYUZpbGUpIHsKLQkJCQlyZXR1cm4gKChKYXZhUmVzb3VyY2VNb2RlbCkganBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCkpLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpOwotCQkJfQotCQl9OwotCX0KLQotCS8vIGxvb2sgZm9yIGJpbmFyeSBzdHVmZiBoZXJlLi4uCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlmb3IgKEpwYUNvbXBpbGF0aW9uVW5pdCBqcENvbXBpbGF0aW9uVW5pdFJlc291cmNlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuanBhQ29tcGlsYXRpb25Vbml0UmVzb3VyY2VzKCkpKSB7Ci0JCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcHRyID0gIGpwQ29tcGlsYXRpb25Vbml0UmVzb3VyY2UuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UodHlwZU5hbWUpOwotCQkJaWYgKGpwdHIgIT0gbnVsbCkgewotCQkJCXJldHVybiBqcHRyOwotCQkJfQotCQl9Ci0vLwkJdGhpcy5qYXZhUHJvamVjdCgpLmZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgY2hhbmdlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoSXRlcmF0b3I8SnBhRmlsZT4gc3RyZWFtID0gdGhpcy5qcGFGaWxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCkuamF2YUVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgSXRlcmF0b3I8SU1lc3NhZ2U+IHZhbGlkYXRpb25NZXNzYWdlcygpIHsKLQkJTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PElNZXNzYWdlPigpOwotCQl0aGlzLmpwYVBsYXRmb3JtLmFkZFRvTWVzc2FnZXModGhpcywgbWVzc2FnZXMpOwotCQlyZXR1cm4gbWVzc2FnZXMuaXRlcmF0b3IoKTsKLQl9Ci0JCi0JLyogSWYgdGhpcyBpcyB0cnVlLCBpdCBtYXkgYmUgYXNzdW1lZCB0aGF0IGFsbCB0aGUgcmVxdWlyZW1lbnRzIGFyZSB2YWxpZCAKLQkgKiBmb3IgZnVydGhlciB2YWxpZGF0aW9uLiAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgaXMgdHJ1ZSBhdCB0aGUgcG9pbnQgd2UKLQkgKiBhcmUgdmFsaWRhdGluZyBwZXJzaXN0ZW5jZSB1bml0cywgaXQgbWF5IGJlIGFzc3VtZWQgdGhhdCB0aGVyZSBpcyBhIAotCSAqIHNpbmdsZSBwZXJzaXN0ZW5jZS54bWwgYW5kIHRoYXQgaXQgaGFzIHZhbGlkIGNvbnRlbnQgZG93biB0byB0aGUgCi0JICogcGVyc2lzdGVuY2UgdW5pdCBsZXZlbC4gICovCi0JcHJpdmF0ZSBib29sZWFuIG9rVG9Db250aW51ZVZhbGlkYXRpb24gPSB0cnVlOwotCQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJLy9zdGFydCB3aXRoIHRoZSBwcm9qZWN0IC0gdGhlbiBkb3duCi0JCS8vcHJvamVjdCB2YWxpZGF0aW9uCi0JCWFkZFByb2plY3RMZXZlbE1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCi0JCS8vY29udGV4dCBtb2RlbCB2YWxpZGF0aW9uCi0JCWdldFJvb3RDb250ZXh0KCkuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvamVjdExldmVsTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJYWRkQ29ubmVjdGlvbk1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJYWRkTXVsdGlwbGVQZXJzaXN0ZW5jZVhtbE1lc3NhZ2UobWVzc2FnZXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJYWRkTm9Db25uZWN0aW9uTWVzc2FnZShtZXNzYWdlcyk7Ci0JCWFkZEluYWN0aXZlQ29ubmVjdGlvbk1lc3NhZ2UobWVzc2FnZXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBva1RvUHJvY2VlZEZvckNvbm5lY3Rpb25WYWxpZGF0aW9uID0gdHJ1ZTsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGROb0Nvbm5lY3Rpb25NZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICh0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX05PX0NPTk5FQ1RJT04sCi0JCQkJCQl0aGlzKQotCQkJCSk7Ci0JCQlva1RvUHJvY2VlZEZvckNvbm5lY3Rpb25WYWxpZGF0aW9uID0gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5hY3RpdmVDb25uZWN0aW9uTWVzc2FnZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAob2tUb1Byb2NlZWRGb3JDb25uZWN0aW9uVmFsaWRhdGlvbiAmJiAhIHRoaXMuZ2V0RGF0YVNvdXJjZSgpLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX0lOQUNUSVZFX0NPTk5FQ1RJT04sCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0RGF0YVNvdXJjZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpfSwKLQkJCQkJCXRoaXMpCi0JCQkJKTsKLQkJfQotCQlva1RvUHJvY2VlZEZvckNvbm5lY3Rpb25WYWxpZGF0aW9uID0gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTXVsdGlwbGVQZXJzaXN0ZW5jZVhtbE1lc3NhZ2UoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0vLwkJaWYgKHZhbGlkUGVyc2lzdGVuY2VYbWxGaWxlcy5zaXplKCkgPiAxKSB7Ci0vLwkJCW1lc3NhZ2VzLmFkZCgKLS8vCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotLy8JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotLy8JCQkJCQlJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfTVVMVElQTEVfUEVSU0lTVEVOQ0VfWE1MLAotLy8JCQkJCQlqcGFQcm9qZWN0KQotLy8JCQkJKTsKLS8vCQkJb2tUb0NvbnRpbnVlVmFsaWRhdGlvbiA9IGZhbHNlOwotLy8JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiByb290IGRlcGxveSBsb2NhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUFJPSkVDVF9ST09UX0RFUExPWV9MT0NBVElPTiA9IEoyRUVDb25zdGFudHMuV0VCX0lORl9DTEFTU0VTOwotCi0JcHVibGljIFN0cmluZyBnZXRSb290RGVwbG95TG9jYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmlzV2ViUHJvamVjdCgpID8gV0VCX1BST0pFQ1RfUk9PVF9ERVBMT1lfTE9DQVRJT04gOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpTVF9XRUJfTU9EVUxFID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzV2ViUHJvamVjdCgpIHsKLQkJcmV0dXJuIEpwdENvcmVQbHVnaW4ucHJvamVjdEhhc1dlYkZhY2V0KHRoaXMucHJvamVjdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc3Bvc2UgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHRoaXMudXBkYXRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnVwZGF0ZXIuZGlzcG9zZSgpOwotCQl9Ci0JCS8vIHVzZSBjbG9uZSBpdGVyYXRvciB3aGlsZSBkZWxldGluZyBKUEEgZmlsZXMKLQkJZm9yIChJdGVyYXRvcjxKcGFGaWxlPiBzdHJlYW0gPSB0aGlzLmpwYUZpbGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5yZW1vdmVKcGFGaWxlKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXRoaXMuZGF0YVNvdXJjZS5kaXNwb3NlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVsIGxpc3RlbmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGltcGxlbWVudHMgUmVzb3VyY2VNb2RlbExpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIERlZmF1bHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlc291cmNlTW9kZWxDaGFuZ2VkKCkgewotCQkJR2VuZXJpY0pwYVByb2plY3QudGhpcy51cGRhdGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBoYW5kbGluZyByZXNvdXJjZSBkZWx0YXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVKcGFGaWxlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZURlbHRhVmlzaXRvciByZXNvdXJjZURlbHRhVmlzaXRvciA9IHRoaXMuYnVpbGRSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCQlkZWx0YS5hY2NlcHQocmVzb3VyY2VEZWx0YVZpc2l0b3IpOwotCQlpZiAocmVzb3VyY2VEZWx0YVZpc2l0b3IuanBhRmlsZXNDaGFuZ2VkKCkpIHsKLQkJCWZvcihKcGFGaWxlIGpwYUZpbGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoanBhRmlsZXMoKSkpIHsKLQkJCQlqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKS5yZXNvbHZlVHlwZXMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlc291cmNlIGRlbHRhIHZpc2l0b3IgY2FsbGJhY2sKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhIEpwYUZpbGUgd2FzIGVpdGhlciBhZGRlZCBvciByZW1vdmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3luY2hyb25pemVKcGFGaWxlcyhJRmlsZSBmaWxlLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCXN3aXRjaCAoZGVsdGFLaW5kKSB7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKLQkJCQlyZXR1cm4gdGhpcy5hZGRKcGFGaWxlKGZpbGUpOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKLQkJCQlyZXR1cm4gdGhpcy5yZW1vdmVKcGFGaWxlKGZpbGUpOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTSA6Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSA6Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsgIC8vIG9ubHkgd29ycmllZCBhYm91dCBhZGRlZCBhbmQgcmVtb3ZlZCBmaWxlcwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vICoqKioqIGlubmVyIGNsYXNzCi0JLyoqCi0JICogYWRkIGEgSlBBIGZpbGUgZm9yIGV2ZXJ5IFthcHByb3ByaWF0ZV0gZmlsZSBlbmNvdW50ZXJlZCBieSB0aGUgdmlzaXRvcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBqcGFGaWxlc0NoYW5nZWQgPSBmYWxzZTsKLQkJCi0JCXByb3RlY3RlZCBSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlSZXNvdXJjZSByZXMgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJc3dpdGNoIChyZXMuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQlpZiAoR2VuZXJpY0pwYVByb2plY3QudGhpcy5zeW5jaHJvbml6ZUpwYUZpbGVzKChJRmlsZSkgcmVzLCBkZWx0YS5nZXRLaW5kKCkpKSB7Ci0JCQkJCQl0aGlzLmpwYUZpbGVzQ2hhbmdlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gbm8gY2hpbGRyZW4KLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gbm8gY2hpbGRyZW4KLQkJCX0KLQkJfQotCQkvKioKLQkJICogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIEpQQSBmaWxlcyBjb2xsZWN0aW9uIHdhcyBtb2RpZmllZCB3aGlsZQotCQkgKiB0cmF2ZXJzaW5nIHRoZSBJUmVzb3VyY2VEZWx0YS4gIFJldHVybiB0cnVlIGlmIGEgSlBBIGZpbGUgd2FzIGFkZGVkL3JlbW92ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIGpwYUZpbGVzQ2hhbmdlZCgpIHsKLQkJCXJldHVybiB0aGlzLmpwYUZpbGVzQ2hhbmdlZDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdXBwb3J0IGZvciBtb2RpZnlpbmcgZG9jdW1lbnRzIHNoYXJlZCB3aXRoIHRoZSBVSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGVyZSBpcyBubyB0aHJlYWQtc3BlY2lmaWMgY29tbWFuZCBleGVjdXRvciwgdXNlIHRoZSBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24sIHdoaWNoIHNpbXBseSBleGVjdXRlcyB0aGUgY29tbWFuZCBkaXJlY3RseS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZEV4ZWN1dG9yIGdldFRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCUNvbW1hbmRFeGVjdXRvciBjZSA9IHRoaXMudGhyZWFkTG9jYWxNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvci5nZXQoKTsKLQkJcmV0dXJuIChjZSAhPSBudWxsKSA/IGNlIDogQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUaHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcy50aHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLnNldChjb21tYW5kRXhlY3V0b3IpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCkgewotCQlyZXR1cm4gdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotCX0KLQotCS8vICoqKioqIGlubmVyIGNsYXNzCi0JcHJvdGVjdGVkIGNsYXNzIE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgaW1wbGVtZW50cyBDb21tYW5kRXhlY3V0b3JQcm92aWRlciB7Ci0JCXByb3RlY3RlZCBNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgQ29tbWFuZEV4ZWN1dG9yIGdldENvbW1hbmRFeGVjdXRvcigpIHsKLQkJCXJldHVybiBHZW5lcmljSnBhUHJvamVjdC50aGlzLmdldFRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9qZWN0ICJ1cGRhdGUiICoqKioqKioqKioKLQotCXB1YmxpYyBVcGRhdGVyIGdldFVwZGF0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnVwZGF0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlcihVcGRhdGVyIHVwZGF0ZXIpIHsKLQkJaWYgKHRoaXMudXBkYXRlciAhPSBudWxsKSB7ICAvLyBmaXJzdCB0aW1lIHRocm91Z2gsIHRoZSB1cGRhdGVyIHdpbGwgYmUgbnVsbAotCQkJdGhpcy51cGRhdGVyLmRpc3Bvc2UoKTsKLQkJfQotCQl0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyOwotCQl0aGlzLnVwZGF0ZXIuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxlZ2F0ZSB0byB0aGUgdXBkYXRlciBzbyBjbGllbnRzIGNhbiBjb25maWd1cmUgaG93IHVwZGF0ZXMgb2NjdXIuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlpZiAodGhpcy51cGRhdGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVwZGF0ZXIgaXMgbnVsbCwgdXNlICNzZXRVcGRhdGVyKFVwZGF0ZXIpIGFmdGVyIGNvbnN0cnVjdGlvbiBvZiBHZW5lcmljSnBhUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy51cGRhdGVyLnVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSB0aGUgdXBkYXRlci4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB1cGRhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmdldFJvb3RDb250ZXh0KCkudXBkYXRlKG1vbml0b3IpOwotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCS8vIEV4Y2VwdGlvbnMgY2FuIG9jY3VyIHdoZW4gdGhlIHVwZGF0ZSBpcyBydW5uaW5nIGFuZCBjaGFuZ2VzIGFyZQotCQkJLy8gbWFkZSBjb25jdXJyZW50bHkgdG8gdGhlIEphdmEgc291cmNlLiBXaGVuIHRoYXQgaGFwcGVucywgb3VyCi0JCQkvLyBtb2RlbCBtaWdodCBiZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgYmVjYXVzZSBpdCBpcyBub3QgeWV0IGluCi0JCQkvLyBzeW5jIHdpdGggdGhlIGNoYW5nZWQgSmF2YSBzb3VyY2UuCi0JCQkvLyBMb2cgdGhlc2UgZXhjZXB0aW9ucyBhbmQgYXNzdW1lIHRoZXkgd29uJ3QgaGFwcGVuIHdoZW4gdGhlCi0JCQkvLyB1cGRhdGUgcnVucyBhZ2FpbiBhcyBhIHJlc3VsdCBvZiB0aGUgY29uY3VycmVudCBKYXZhIHNvdXJjZSBjaGFuZ2VzLgotCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYU1vZGVsTWFuYWdlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYU1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTIxZTM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JT3BlbmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnByZWZzLkpwYVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByb2plY3RGYWNldEFjdGlvbkV2ZW50OwotCi0vKioKLSAqICJJbnRlcm5hbCIgZ2xvYmFsIHN0dWZmLgotICogUHJvdmlkZSBhY2Nlc3MgdmlhIGEgc2luZ2xldG9uLgotICogSG9sZCBhbmQgbWFuYWdlIHRoZSBKUEEgbW9kZWwgKHdoaWNoIGhvbGRzIGFsbCB0aGUgSlBBIHByb2plY3RzKQotICogYW5kIHRoZSB2YXJpb3VzIGdsb2JhbCBsaXN0ZW5lcnMuIFdlIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgZXZlbnRzCi0gKiBhcmUgcmVsZXZhbnQgYmVmb3JlIGZvcndhcmRpbmcgdGhlbSB0byB0aGUgSlBBIG1vZGVsLgotICogCi0gKiBWYXJpb3VzIHRoaW5ncyB0aGF0IGNhdXNlIHVzIHRvIGFkZCBvciByZW1vdmUgYSBKUEEgcHJvamVjdDoKLSAqIC0gU3RhcnR1cCBvZiB0aGUgRGFsaSBwbHVnLWluIHdpbGwgdHJpZ2dlciBhbGwgdGhlIEpQQSBwcm9qZWN0cyB0byBiZSBhZGRlZAotICogCi0gKiAtIFByb2plY3QgY3JlYXRlZCBhbmQgZmFjZXQgaW5zdGFsbGVkCi0gKiAgICAgZmFjZXQgUE9TVF9JTlNUQUxMCi0gKiAtIFByb2plY3QgZmFjZXQgdW5pbnN0YWxsZWQKLSAqICAgICBmYWNldCBQUkVfVU5JTlNUQUxMCi0gKiAKLSAqIC0gUHJvamVjdCBvcGVuZWQKLSAqICAgICBmYWNldCBQUk9KRUNUX01PRElGSUVECi0gKiAtIFByb2plY3QgY2xvc2VkCi0gKiAgICAgZmFjZXQgUFJPSkVDVF9NT0RJRklFRAotICogCi0gKiAtIFByZS1leGlzdGluZyBwcm9qZWN0IGltcG9ydGVkIChjcmVhdGVkIGFuZCBvcGVuZWQpCi0gKiAgICAgcmVzb3VyY2UgUE9TVF9DSEFOR0UgLT4gUFJPSkVDVCAtPiBDSEFOR0VEIC0+IE9QRU4KLSAqIC0gUHJvamVjdCBkZWxldGVkCi0gKiAgICAgcmVzb3VyY2UgUFJFX0RFTEVURQotICogCi0gKiAtIFByb2plY3QgZmFjZXQgaW5zdGFsbGVkIGJ5IGVkaXRpbmcgdGhlIGZhY2V0cyBzZXR0aW5ncyBmaWxlIGRpcmVjdGx5Ci0gKiAgICAgZmFjZXQgUFJPSkVDVF9NT0RJRklFRAotICogLSBQcm9qZWN0IGZhY2V0IHVuaW5zdGFsbGVkIGJ5IGVkaXRpbmcgdGhlIGZhY2V0cyBzZXR0aW5ncyBmaWxlIGRpcmVjdGx5Ci0gKiAgICAgZmFjZXQgUFJPSkVDVF9NT0RJRklFRAotICovCi1wdWJsaWMgY2xhc3MgSnBhTW9kZWxNYW5hZ2VyIHsKLQotCS8qKgotCSAqIFRoZSBKUEEgbW9kZWwgLSBudWxsIHVudGlsIHRoZSBwbHVnLWluIGlzIHN0YXJ0ZWQuCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljSnBhTW9kZWwganBhTW9kZWw7Ci0KLQkvKioKLQkgKiBMaXN0ZW4gZm9yIGNoYW5nZXMgdG8gcHJvamVjdHMgYW5kIGZpbGVzLgotCSAqLwotCXByaXZhdGUgZmluYWwgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIExpc3RlbiBmb3IgdGhlIEpQQSBmYWNldCBiZWluZyBhZGRlZCBvciByZW1vdmVkIGZyb20gYSBwcm9qZWN0LgotCSAqLwotCXByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgZmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLQotCS8qKgotCSAqIExpc3RlbiBmb3IgSmF2YSBjaGFuZ2VzIGFuZCBmb3J3YXJkIHRoZW0gdG8gdGhlIEpQQSBtb2RlbCwKLQkgKiB3aGljaCB3aWxsIGZvcndhcmQgdGhlbSB0byB0aGUgSlBBIHByb2plY3RzLgotCSAqLwotCXByaXZhdGUgZmluYWwgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIExpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgIkRlZmF1bHQgSlBBIExpYiIgcHJlZmVyZW5jZQotCSAqIHNvIHdlIGNhbiB1cGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NwYXRoIHZhcmlhYmxlLgotCSAqLwotCXByaXZhdGUgZmluYWwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZXNMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhTW9kZWxNYW5hZ2VyIElOU1RBTkNFID0gbmV3IEpwYU1vZGVsTWFuYWdlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24gSlBBIG1vZGVsIG1hbmFnZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFNb2RlbE1hbmFnZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogUHJpdmF0ZSAtIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKcGFNb2RlbE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZmFjZXRlZFByb2plY3RMaXN0ZW5lciA9IG5ldyBGYWNldGVkUHJvamVjdExpc3RlbmVyKCk7Ci0JCXRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucHJlZmVyZW5jZXNMaXN0ZW5lciA9IG5ldyBQcmVmZXJlbmNlc0xpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBsdWctaW4gY29udHJvbGxlZCBsaWZlLWN5Y2xlICoqKioqKioqKioKLQotCS8qKgotCSAqIGludGVybmFsIC0gY2FsbGVkIGJ5IEpwdENvcmVQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZGVidWcoIioqKiBTVEFSVCBKUEEgbW9kZWwgbWFuYWdlciAqKioiKTsKLQkJdHJ5IHsKLQkJCXRoaXMuanBhTW9kZWwgPSBuZXcgR2VuZXJpY0pwYU1vZGVsKCk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQkJRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIodGhpcy5mYWNldGVkUHJvamVjdExpc3RlbmVyLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLnZhbHVlcygpKTsKLQkJCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKTsKLQkJCUpwdENvcmVQbHVnaW4uaW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcy5wcmVmZXJlbmNlc0xpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJdGhpcy5sb2coZXgpOwotCQkJdGhpcy5zdG9wKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpbnRlcm5hbCAtIGNhbGxlZCBieSBKcHRDb3JlUGx1Z2luCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZGVidWcoIioqKiBTVE9QIEpQQSBtb2RlbCBtYW5hZ2VyICoqKiIpOwotCQlKcHRDb3JlUGx1Z2luLmluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZXNMaXN0ZW5lcik7Ci0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKTsKLQkJRmFjZXRlZFByb2plY3RGcmFtZXdvcmsucmVtb3ZlTGlzdGVuZXIodGhpcy5mYWNldGVkUHJvamVjdExpc3RlbmVyKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5yZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5qcGFNb2RlbC5kaXNwb3NlKCk7Ci0JCXRoaXMuanBhTW9kZWwgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB3b3Jrc3BhY2Utd2lkZSBKUEEgbW9kZWwuCi0JICovCi0JcHVibGljIEpwYU1vZGVsIGdldEpwYU1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5qcGFNb2RlbDsKLQl9Ci0KLQkvKiogCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LAotCSAqIG9yIG51bGwgaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIHByb2plY3Qgd2l0aCBhCi0JICogSlBBIHByb2plY3QuCi0JICovCi0JcHVibGljIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmpwYU1vZGVsLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBmaWxlLAotCSAqIG9yIG51bGwgaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIGZpbGUgd2l0aCBhIEpQQSBmaWxlLgotCSAqLwotCXB1YmxpYyBKcGFGaWxlIGdldEpwYUZpbGUoSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qcGFNb2RlbC5nZXRKcGFGaWxlKGZpbGUpOwotCX0KLQotCS8qKgotCSAqIFRoZSBKUEEgc2V0dGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0Ci0JICogaGF2ZSBjaGFuZ2VkIGluIHN1Y2ggYSB3YXkgYXMgdG8gcmVxdWlyZSB0aGUgYXNzb2NpYXRlZAotCSAqIEpQQSBwcm9qZWN0IHRvIGJlIGNvbXBsZXRlbHkgcmVidWlsdAotCSAqIChlLmcuIHdoZW4gdGhlIHVzZXIgY2hhbmdlcyBhIHByb2plY3QncyBKUEEgcGxhdGZvcm0pLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlYnVpbGRKcGFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5qcGFNb2RlbC5yZWJ1aWxkSnBhUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBzdGF0dXMuCi0JICovCi0JcHVibGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCUpwdENvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotCQlKcHRDb3JlUGx1Z2luLmxvZyhtc2cpOwotICAgIH0KLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBvciBlcnJvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlKcHRDb3JlUGx1Z2luLmxvZyh0aHJvd2FibGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBjaGFuZ2VkICoqKioqKioqKioKLQotCS8qKgotCSAqIENoZWNrIGZvcjoKLQkgKiAgIC0gcHJvamVjdCBjbG9zZS9kZWxldGUKLQkgKiAgIC0gZmlsZSBhZGQvcmVtb3ZlCi0JICovCi0JLyogcHJpdmF0ZSAqLyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoISAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJV29ya3NwYWNlKSkgewotCQkJcmV0dXJuOyAgLy8gdGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgaGFwcGVuLi4uCi0JCX0KLQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpewotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIDogIC8vIHByb2plY3Qtb25seSBldmVudAotCQkJCXRoaXMucmVzb3VyY2VQcmVEZWxldGUoZXZlbnQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSA6Ci0JCQkJdGhpcy5yZXNvdXJjZVBvc3RDaGFuZ2UoZXZlbnQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgOiAgLy8gcHJvamVjdC1vbmx5IGV2ZW50Ci0JCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCA6Ci0JCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQgOgotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIHByb2plY3QgaXMgYmVpbmcgZGVsZXRlZC4gUmVtb3ZlIGl0cyBjb3JyZXNwb25kaW5nCi0JICogSlBBIHByb2plY3QgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc291cmNlUHJlRGVsZXRlKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWRlYnVnKCJSZXNvdXJjZSAoUHJvamVjdCkgUFJFX0RFTEVURTogIiArIGV2ZW50LmdldFJlc291cmNlKCkpOwotCQl0aGlzLmpwYU1vZGVsLnByb2plY3RQcmVEZWxldGUoKElQcm9qZWN0KSBldmVudC5nZXRSZXNvdXJjZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBIHJlc291cmNlIGhhcyBjaGFuZ2VkIHNvbWVob3cuCi0JICogQ2hlY2sgZm9yIGZpbGVzIGJlaW5nIGFkZGVkIG9yIHJlbW92ZWQuCi0JICogKFRoZSBKUEEgcHJvamVjdCBvbmx5IGhhbmRsZXMgYWRkZWQgYW5kIHJlbW92ZWQgZmlsZXMgaGVyZSwgaWdub3JpbmcKLQkgKiBjaGFuZ2VkIGZpbGVzLikKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzb3VyY2VQb3N0Q2hhbmdlKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWRlYnVnKCJSZXNvdXJjZSBQT1NUX0NIQU5HRSIpOwotCQl0aGlzLnN5bmNocm9uaXplRmlsZXMoZXZlbnQuZ2V0RGVsdGEoKSk7Ci0JCXRoaXMuY2hlY2tGb3JPcGVuZWRQcm9qZWN0cyhldmVudC5nZXREZWx0YSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY2hyb25pemVGaWxlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6Ci0JCQkJdGhpcy5zeW5jaHJvbml6ZUZpbGVzKGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSk7ICAvLyByZWN1cnNlCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQl0aGlzLnN5bmNocm9uaXplRmlsZXMoKElQcm9qZWN0KSByZXNvdXJjZSwgZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY2hyb25pemVGaWxlcyhJUmVzb3VyY2VEZWx0YVtdIGRlbHRhcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJdGhpcy5zeW5jaHJvbml6ZUZpbGVzKGRlbHRhc1tpXSk7ICAvLyByZWN1cnNlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja2VkIGV4Y2VwdGlvbnMgYml0ZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3luY2hyb25pemVGaWxlcyhJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQl0cnkgewotCQkJdGhpcy5qcGFNb2RlbC5zeW5jaHJvbml6ZUZpbGVzKHByb2plY3QsIGRlbHRhKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJdGhpcy5sb2coZXgpOyAgLy8gcHJvYmxlbSB0cmF2ZXJzaW5nIHRoZSBwcm9qZWN0J3MgcmVzb3VyY2VzIC0gbm90IG11Y2ggd2UgY2FuIGRvCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmF3bCB0aGUgc3BlY2lmaWVkIGRlbHRhLCBsb29raW5nIGZvciBwcm9qZWN0cyBiZWluZyBvcGVuZWQuCi0JICogUHJvamVjdHMgYmVpbmcgZGVsZXRlZCBhcmUgaGFuZGxlZCBpbiBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFLgotCSAqIFByb2plY3RzIGJlaW5nIGNsb3NlZCBhcmUgaGFuZGxlZCBpbiBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBST0pFQ1RfTU9ESUZJRUQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yT3BlbmVkUHJvamVjdHMoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCXRoaXMuY2hlY2tGb3JPcGVuZWRQcm9qZWN0cyhkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpOyAgLy8gcmVjdXJzZQotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJdGhpcy5jaGVja0Zvck9wZW5lZFByb2plY3QoKElQcm9qZWN0KSByZXNvdXJjZSwgZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tGb3JPcGVuZWRQcm9qZWN0cyhJUmVzb3VyY2VEZWx0YVtdIGRlbHRhcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJdGhpcy5jaGVja0Zvck9wZW5lZFByb2plY3RzKGRlbHRhc1tpXSk7ICAvLyByZWN1cnNlCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tGb3JPcGVuZWRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOiAKLQkJCQl0aGlzLmNoZWNrRGVsdGFGbGFnc0Zvck9wZW5lZFByb2plY3QocHJvamVjdCwgZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDogIC8vIGFscmVhZHkgaGFuZGxlZCB3aXRoIHRoZSBQUkVfREVMRVRFIGV2ZW50Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDogIC8vIGFsbCBidXQgcHJvamVjdCByZW5hbWUgaGFuZGxlZCB3aXRoIHRoZSBmYWNldCBQT1NUX0lOU1RBTEwgZXZlbnQKLQkJCQl0aGlzLmNoZWNrRGVsdGFGbGFnc0ZvclJlbmFtZWRQcm9qZWN0KHByb2plY3QsIGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTSA6ICAvLyBpZ25vcmUKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRF9QSEFOVE9NIDogIC8vIGlnbm9yZQotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBkb24ndCBnZXQgYW55IGV2ZW50cyBmcm9tIHRoZSBGYWNldHMgRnJhbWV3b3JrIHdoZW4gYSBwcmUtZXhpc3RpbmcKLQkgKiBwcm9qZWN0IGlzIGltcG9ydGVkLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aGUgbmV3bHkgaW1wb3J0ZWQgcHJvamVjdCBoZXJlLgotCSAqIAotCSAqIFRoaXMgZXZlbnQgYWxzbyBvY2N1cnMgd2hlbiBhIHByb2plY3QgaXMgc2ltcGx5IG9wZW5lZC4gUHJvamVjdCBvcGVuaW5nCi0JICogYWxzbyB0cmlnZ2VycyBhIEZhY2V0IFBST0pFQ1RfTU9ESUZJRUQgZXZlbnQgYW5kIHRoYXQgaXMgd2hlcmUgd2UgYWRkCi0JICogdGhlIEpQQSBwcm9qZWN0LCBub3QgaGVyZQotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0RlbHRhRmxhZ3NGb3JPcGVuZWRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCWlmIChCaXRUb29scy5mbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgSVJlc291cmNlRGVsdGEuT1BFTikgJiYgcHJvamVjdC5pc09wZW4oKSkgewotCQkJZGVidWcoIlx0UHJvamVjdCBDSEFOR0VEIC0gT1BFTjogIiArIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCXRoaXMuanBhTW9kZWwuY2hlY2tGb3JUcmFuc2l0aW9uKHByb2plY3QpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFdlIGRvbid0IGdldCBhbnkgZXZlbnRzIGZyb20gdGhlIEZhY2V0cyBGcmFtZXdvcmsgd2hlbiBhIHByb2plY3QgaXMgcmVuYW1lZCwKLQkgKiBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aGUgcmVuYW1lZCBwcm9qZWN0cyBoZXJlLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0RlbHRhRmxhZ3NGb3JSZW5hbWVkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlpZiAoQml0VG9vbHMuZmxhZ0lzU2V0KGRlbHRhLmdldEZsYWdzKCksIElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00pICYmIHByb2plY3QuaXNPcGVuKCkpIHsKLQkJCWRlYnVnKCJcdFByb2plY3QgQURERUQgLSBNT1ZFRF9GUk9NOiAiICsgZGVsdGEuZ2V0TW92ZWRGcm9tUGF0aCgpKTsKLQkJCXRoaXMuanBhTW9kZWwuY2hlY2tGb3JUcmFuc2l0aW9uKHByb2plY3QpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY2V0ZWQgcHJvamVjdCBjaGFuZ2VkICoqKioqKioqKioKLQotCS8qKgotCSAqIENoZWNrIGZvcjoKLQkgKiAgIC0gaW5zdGFsbCBvZiBKUEEgZmFjZXQKLQkgKiAgIC0gdW4taW5zdGFsbCBvZiBKUEEgZmFjZXQKLQkgKiAgIC0gYW55IG90aGVyIGFwcGVhcmFuY2Ugb3IgZGlzYXBwZWFyYW5jZSBvZiB0aGUgSlBBIGZhY2V0Ci0JICovCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGZhY2V0ZWRQcm9qZWN0Q2hhbmdlZChJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCkgewotCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgewotCQkJY2FzZSBQT1NUX0lOU1RBTEwgOgotCQkJCXRoaXMuZmFjZXRlZFByb2plY3RQb3N0SW5zdGFsbCgoSVByb2plY3RGYWNldEFjdGlvbkV2ZW50KSBldmVudCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBSRV9VTklOU1RBTEwgOgotCQkJCXRoaXMuZmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGwoKElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCkgZXZlbnQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQUk9KRUNUX01PRElGSUVEIDoKLQkJCQl0aGlzLmZhY2V0ZWRQcm9qZWN0TW9kaWZpZWQoZXZlbnQuZ2V0UHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmYWNldGVkUHJvamVjdFBvc3RJbnN0YWxsKElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCBldmVudCkgewotCQlkZWJ1ZygiRmFjZXQgUE9TVF9JTlNUQUxMOiAiICsgZXZlbnQuZ2V0UHJvamVjdEZhY2V0KCkpOwotCQlpZiAoZXZlbnQuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5GQUNFVF9JRCkpIHsKLQkJCXRoaXMuanBhTW9kZWwuanBhRmFjZXRlZFByb2plY3RQb3N0SW5zdGFsbChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGwoSVByb2plY3RGYWNldEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWRlYnVnKCJGYWNldCBQUkVfVU5JTlNUQUxMOiAiICsgZXZlbnQuZ2V0UHJvamVjdEZhY2V0KCkpOwotCQlpZiAoZXZlbnQuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5GQUNFVF9JRCkpIHsKLQkJCXRoaXMuanBhTW9kZWwuanBhRmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGwoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgZm9yIGFueSBjaGFuZ2UgdG8gYSBmYWNldGVkIHByb2plY3QuCi0JICogV2UgdXNlIHRoZSBldmVudCB0byB3YXRjaCBmb3IgdGhlIGZvbGxvd2luZzoKLQkgKiAgIC0gYW4gb3BlbiBwcm9qZWN0IGlzIGNsb3NlZAotCSAqICAgLSBhIGNsb3NlZCBwcm9qZWN0IGlzIG9wZW5lZAotCSAqICAgLSBvbmUgb2YgYSBwcm9qZWN0J3MgKGZhY2V0KSBtZXRhZGF0YSBmaWxlcyBpcyBlZGl0ZWQgZGlyZWN0bHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmFjZXRlZFByb2plY3RNb2RpZmllZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWRlYnVnKCJGYWNldCBQUk9KRUNUX01PRElGSUVEOiAiICsgcHJvamVjdC5nZXROYW1lKCkpOwotCQl0aGlzLmpwYU1vZGVsLmNoZWNrRm9yVHJhbnNpdGlvbihwcm9qZWN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBlbGVtZW50IGNoYW5nZWQgKioqKioqKioqKgotCi0JLyoqCi0JICogRm9yd2FyZCB0aGUgZXZlbnQgdG8gdGhlIEpQQSBtb2RlbC4KLQkgKi8KLQkvKiBwcml2YXRlICovIHZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuZXZlbnRJbmRpY2F0ZXNQcm9qZWN0QWRkZWRCdXROb3RPcGVuKGV2ZW50KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuanBhTW9kZWwuamF2YUVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQkvLzIwOTI3NSAtIFRoaXMgcGFydGljdWxhciBldmVudCBvbmx5IGNhdXNlcyBwcm9ibGVtcyBpbiBhIGNsZWFuIHdvcmtzcGFjZSB0aGUgZmlyc3QgdGltZSBhIEpQQSBwcm9qZWN0Ci0JLy9pcyBjcmVhdGVkIHRocm91Z2ggdGhlIEpQQSB3aXphcmQuIFRoZSBzZWNvbmQgdGltZSBhIEpQQSBwcm9qZWN0IGlzIGNyZWF0ZWQsIHRoaXMgZXZlbnQgb2NjdXJzLCBidXQgCi0JLy9pdCBvY2N1cnMgYXMgdGhlIHdpemFyZCBpcyBjbG9zaW5nIHNvIGl0IGRvZXMgbm90IGNhdXNlIGEgZGVhZGxvY2suCi0JcHJpdmF0ZSBib29sZWFuIGV2ZW50SW5kaWNhdGVzUHJvamVjdEFkZGVkQnV0Tm90T3BlbihFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCUlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEKSB7Ci0JCQlpZiAoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfTU9ERUwpIHsKLQkJCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCWlmIChjaGlsZHJlbi5sZW5ndGggPT0gMSkgewotCQkJCQlJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhID0gY2hpbGRyZW5bMF07Ci0JCQkJCWlmIChjaGlsZERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCkgewotCQkJCQkJSUphdmFFbGVtZW50IGNoaWxkRWxlbWVudCA9IGNoaWxkRGVsdGEuZ2V0RWxlbWVudCgpOwotCQkJCQkJaWYgKGNoaWxkRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpIHsKLQkJCQkJCQlpZiAoY2hpbGREZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCQkJaWYgKCEoKElPcGVuYWJsZSkgY2hpbGRFbGVtZW50KS5pc09wZW4oKSkgewotCQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHByZWZlcmVuY2UgY2hhbmdlZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXaGVuIHRoZSAiRGVmYXVsdCBKUEEgTGliIiBwcmVmZXJlbmNlIGNoYW5nZXMsCi0JICogdXBkYXRlIHRoZSBhcHByb3ByaWF0ZSBKRFQgQ29yZSBjbGFzc3BhdGggdmFyaWFibGUuCi0JICovCi0JLyogcHJpdmF0ZSAqLyB2b2lkIHByZWZlcmVuY2VDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkgPT0gSnBhUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfSlBBX0xJQikgewotCQkJdHJ5IHsKLQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhWYXJpYWJsZSgiREVGQVVMVF9KUEFfTElCIiwgbmV3IFBhdGgoKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKSksIG51bGwpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhpcy5sb2coZXgpOyAgLy8gbm90IHN1cmUgd2hhdCB3b3VsZCBjYXVzZSB0aGlzLi4uCi0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEZvcndhcmQgdGhlIFJlc291cmNlIGNoYW5nZSBldmVudCBiYWNrIHRvIHRoZSBKUEEgbW9kZWwgbWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSnBhTW9kZWxNYW5hZ2VyLnRoaXMucmVzb3VyY2VDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY2V0ZWQgcHJvamVjdCBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGb3J3YXJkIHRoZSBGYWNldGVkIHByb2plY3QgY2hhbmdlIGV2ZW50IGJhY2sgdG8gdGhlIEpQQSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgY2xhc3MgRmFjZXRlZFByb2plY3RMaXN0ZW5lciBpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdExpc3RlbmVyIHsKLQkJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQpIHsKLQkJCUpwYU1vZGVsTWFuYWdlci50aGlzLmZhY2V0ZWRQcm9qZWN0Q2hhbmdlZChldmVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGVsZW1lbnQgY2hhbmdlIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEZvcndhcmQgdGhlIEphdmEgZWxlbWVudCBjaGFuZ2UgZXZlbnQgYmFjayB0byB0aGUgSlBBIG1vZGVsIG1hbmFnZXIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewotCQlKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlKcGFNb2RlbE1hbmFnZXIudGhpcy5qYXZhRWxlbWVudENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJlZmVyZW5jZXMgbGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogRm9yd2FyZCB0aGUgUHJlZmVyZW5jZXMgY2hhbmdlIGV2ZW50IGJhY2sgdG8gdGhlIEpQQSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgY2xhc3MgUHJlZmVyZW5jZXNMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJUHJlZmVyZW5jZXNMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSnBhTW9kZWxNYW5hZ2VyLnRoaXMucHJlZmVyZW5jZUNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVidWcgKioqKioqKioqKgotCi0JLy8gQHNlZSBKcGFNb2RlbFRlc3RzI3Rlc3RERUJVRygpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWJ1ZyhTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArICI6ICIgKyBtZXNzYWdlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYVByb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYVByb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjQ0ZDY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFQcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBKcGFQcm9qZWN0QWRhcHRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotewotCXByaXZhdGUgc3RhdGljIENsYXNzW10gUFJPUEVSVElFUz0gbmV3IENsYXNzW10gewotCQlKcGFQcm9qZWN0LmNsYXNzCi0JfTsKLQkJCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBQUk9QRVJUSUVTOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGVsZW1lbnQsIENsYXNzIGtleSkgewotCQlJUHJvamVjdCBwcm9qZWN0OwotCQkKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0JCQlwcm9qZWN0ID0gKChJSmF2YVByb2plY3QpIGVsZW1lbnQpLmdldFByb2plY3QoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnB0Q29yZU1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnB0Q29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYWI3MjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwdENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBjb3JlLgotICovCi1wdWJsaWMgY2xhc3MgSnB0Q29yZU1lc3NhZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PTkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfUFJPSkVDVF9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX1NPVVJDRV9GT0xERVJfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9TT1VSQ0VfRk9MREVSX0lMTEVHQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfU09VUkNFX0ZPTERFUl9ET0VTX05PVF9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9TT1VSQ0VfRk9MREVSX05PVF9JTl9QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX1NPVVJDRV9GT0xERVJfTk9UX1NPVVJDRV9GT0xERVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfT1JNX0ZJTEVfQUxSRUFEWV9FWElTVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfUEVSU0lTVEVOQ0VfVU5JVF9ET0VTX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfUEVSU0lTVEVOQ0VfVU5JVF9OT1RfSU5fUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9QTEFURk9STV9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0NPTk5FQ1RJT05fTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9DT05ORUNUSU9OX05PVF9DT05ORUNURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfREVGQVVMVF9TQ0hFTUFfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9SVU5USU1FX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfUlVOVElNRV9ET0VTX05PVF9TVVBQT1JUX0VKQl8zMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9MSUJSQVJZX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1lOQ0hST05JWkVfQ0xBU1NFU19KT0I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1lOQ0hST05JWklOR19DTEFTU0VTX1RBU0s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9QRVJTSVNURU5DRV9YTUxfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9TWU5DSFJPTklaSU5HX0NMQVNTRVNfQ09VTERfTk9UX1ZBTElEQVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1dSSVRJTkdfRklMRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcGFfY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRDb3JlTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRDb3JlTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL1NpbXBsZUpwYVByb2plY3RDb25maWcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9TaW1wbGVKcGFQcm9qZWN0Q29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NDJlZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL1NpbXBsZUpwYVByb2plY3RDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSlBBIHByb2plY3QgY29uZmlnLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlSnBhUHJvamVjdENvbmZpZyBpbXBsZW1lbnRzIEpwYVByb2plY3QuQ29uZmlnIHsKLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm0ganBhUGxhdGZvcm07Ci0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uUHJvZmlsZU5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkaXNjb3ZlckFubm90YXRlZENsYXNzZXM7Ci0KLQlwdWJsaWMgU2ltcGxlSnBhUHJvamVjdENvbmZpZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm0gZ2V0SnBhUGxhdGZvcm0oKSB7Ci0JCXJldHVybiB0aGlzLmpwYVBsYXRmb3JtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEpwYVBsYXRmb3JtKEpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtKSB7Ci0JCXRoaXMuanBhUGxhdGZvcm0gPSBqcGFQbGF0Zm9ybTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lKSB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lID0gY29ubmVjdGlvblByb2ZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKCkgewotCQlyZXR1cm4gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUoU3RyaW5nIHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKSB7Ci0JCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUgPSB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKCkgewotCQlyZXR1cm4gdGhpcy5kaXNjb3ZlckFubm90YXRlZENsYXNzZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKGJvb2xlYW4gZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKSB7Ci0JCXRoaXMuZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzID0gZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucHJvamVjdC5nZXROYW1lKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL1N5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9TeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTYyMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL1N5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotCi0vKioKLSAqIFRoaXMgdXBkYXRlciB3aWxsICJ1cGRhdGUiIHRoZSBKUEEgcHJvamVjdCBpbW1lZGlhdGVseSBhbmQgbm90IHJldHVybiB1bnRpbAotICogdGhlICJ1cGRhdGUiIGFuZCBhbGwgcmVzdWx0aW5nICJ1cGRhdGVzIiBhcmUgY29tcGxldGUuIFRoaXMgaW1wbGVtZW50YXRpb24KLSAqIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseSBhbmQgZm9yIGFzIHNob3J0IGEgdGltZSBhcyBwb3NzaWJsZSwgYXMgaXQgaW5jcmVhc2VzCi0gKiB0aGUgcHJvYmFiaWxpdHkgb2YgZGVhZGxvY2tzLiBBIGRlYWRsb2NrIGNhbiBvY2N1ciB3aGVuIGEgSlBBIHByb2plY3QgaXMKLSAqIHVwZGF0ZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGFuZCB2YXJpb3VzIHJlc291cmNlcyBhcmUgbG9ja2VkIGluIHZhcnlpbmcKLSAqIG9yZGVycy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIgaW1wbGVtZW50cyBKcGFQcm9qZWN0LlVwZGF0ZXIgewotCXByb3RlY3RlZCBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JcHJvdGVjdGVkIGZpbmFsIFN5bmNocm9uaXplZEZsYWdzIGZsYWdzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIE5VTExfUFJPR1JFU1NfTU9OSVRPUiA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLQlwdWJsaWMgU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlcihKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5mbGFncyA9IG5ldyBTeW5jaHJvbml6ZWRGbGFncygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGZsYWdzIGFuZCBleGVjdXRlIGFuICJ1cGRhdGUiLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQl0aGlzLmZsYWdzLnN0YXJ0KCk7Ci0JCXRoaXMudXBkYXRlKCk7Ci0JfQotCi0JLy8gcmVjdXJzaW9uOiB3ZSBjb21lIGJhY2sgaGVyZSB3aGVuIElKcGFQcm9qZWN0I3VwZGF0ZSgpIGlzIGNhbGxlZCBkdXJpbmcgdGhlICJ1cGRhdGUiCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlpZiAodGhpcy5mbGFncy51cGRhdGVDYW5TdGFydCgpKSB7Ci0JCQlkbyB7Ci0JCQkJdGhpcy5qcGFQcm9qZWN0LnVwZGF0ZShOVUxMX1BST0dSRVNTX01PTklUT1IpOwotCQkJfSB3aGlsZSAodGhpcy5mbGFncy51cGRhdGVNdXN0RXhlY3V0ZUFnYWluKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5mbGFncy5kaXNwb3NlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5qcGFQcm9qZWN0KTsKLQl9Ci0KLQotCS8qKgotCSAqIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgcGFpciBvZiAndXBkYXRpbmcnIGFuZCAnYWdhaW4nIGZsYWdzCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBTeW5jaHJvbml6ZWRGbGFncyB7Ci0JCXByb3RlY3RlZCBTeW5jaHJvbml6ZWRCb29sZWFuIHVwZGF0aW5nID0gbmV3IFN5bmNocm9uaXplZEJvb2xlYW4oZmFsc2UsIHRoaXMpOwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBhZ2FpbiA9IGZhbHNlOwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBzdG9wID0gdHJ1ZTsKLQotCQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7Ci0JCQlpZiAoICEgdGhpcy5zdG9wKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIFVwZGF0ZXIgd2FzIG5vdCBzdG9wcGVkLiIpOwotCQkJfQotCQkJdGhpcy5zdG9wID0gZmFsc2U7Ci0JCX0KLQotCQkvKioKLQkJICogQSBjbGllbnQgaGFzIHJlcXVlc3RlZCBhbiAidXBkYXRlIjsKLQkJICogcmV0dXJuIHdoZXRoZXIgdGhlIHVwZGF0ZXIgY2FuIHN0YXJ0IGFuICJ1cGRhdGUiLgotCQkgKiBTaWRlLWVmZmVjdHM6Ci0JCSAqICAgLSBJZiB3ZSBhcmUgY3VycmVudGx5IHVwZGF0aW5nLCBzZXQgdGhlICdhZ2FpbicgZmxhZy4KLQkJICogICAtIElmIHdlIGFyZSBub3QgY3VycmVudGx5IHVwZGF0aW5nLCBzZXQgdGhlICd1cGRhdGluZycgZmxhZyBhbmQgY2xlYXIgdGhlICdhZ2FpbicgZmxhZy4KLQkJICovCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiB1cGRhdGVDYW5TdGFydCgpIHsKLQkJCWlmICh0aGlzLnN0b3ApIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAodGhpcy51cGRhdGluZy5pc1RydWUoKSkgewotCQkJCXRoaXMuYWdhaW4gPSB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXRoaXMudXBkYXRpbmcuc2V0VHJ1ZSgpOwotCQkJdGhpcy5hZ2FpbiA9IGZhbHNlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlICJ1cGRhdGUiIGhhcyBmaW5pc2hlZDsKLQkJICogcmV0dXJuIHdoZXRoZXIgdGhlIHVwZGF0ZXIgbXVzdCBleGVjdXRlIGFub3RoZXIgInVwZGF0ZSIuCi0JCSAqIFNpZGUtZWZmZWN0czoKLQkJICogICAtIElmIHdlIGFyZSBzdXBwb3NlZCB0byBzdG9wLCBjbGVhciB0aGUgYm90aCB0aGUgJ3VwZGF0aW5nJyBhbmQgJ2FnYWluJyBmbGFncy4KLQkJICogICAtIElmIHdlIGhhdmUgdG8gInVwZGF0ZSIgYWdhaW4sIGNsZWFyIHRoZSAnYWdhaW4nIGZsYWcgYW5kIGxlYXZlIHRoZSAndXBkYXRpbmcnIGZsYWcgc2V0LgotCQkgKiAgIC0gSWYgd2UgYXJlIGZpbmlzaGVkLCBjbGVhciB0aGUgJ3VwZGF0aW5nJyBmbGFnLgotCQkgKi8KLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIHVwZGF0ZU11c3RFeGVjdXRlQWdhaW4oKSB7Ci0JCQlpZiAodGhpcy5zdG9wKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHRoaXMuYWdhaW4pIHsKLQkJCQl0aGlzLmFnYWluID0gZmFsc2U7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQl0aGlzLnVwZGF0aW5nLnNldEZhbHNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXRoaXMuc3RvcCA9IHRydWU7Ci0JCQl0aGlzLmFnYWluID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCXRoaXMudXBkYXRpbmcud2FpdFVudGlsRmFsc2UoKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gdGhlICJ1cGRhdGUiIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyAtIGlnbm9yZQotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L0Fic3RyYWN0SnBhQ29udGV4dE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L0Fic3RyYWN0SnBhQ29udGV4dE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3Y2FiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdEpwYUNvbnRleHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFOb2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFDb250ZXh0Tm9kZSBleHRlbmRzIEFic3RyYWN0SnBhTm9kZQotCWltcGxlbWVudHMgSnBhQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEFic3RyYWN0SnBhQ29udGV4dE5vZGUoSnBhTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBKcGFOb2RlIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSnBhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIEpwYUNvbnRleHROb2RlIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogT3ZlcmlkZGVuIGluIEJhc2VKcGFDb250ZXh0LCBQZXJzaXN0ZW5jZSwgUGVyc2l0c2VuY2VYbWwgdG8gdGhyb3cgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLQkgKiBPdmVyaWRkZW4gaW4gUGVyc2lzdGVuY2VVbml0IHRvIHJldHVybiBpdC4KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQkKLQkvKioKLQkgKiBPdmVyaWRkZW4gaW4gQmFzZUpwYUNvbnRleHQgdG8gcmV0dXJuIG51bGwKLQkgKiBPdmVyaWRkZW4gaW4gRW50aXR5TWFwcGluZ3MgdG8gcmV0dXJuIGl0LgotCSAqLwotCXB1YmxpYyBFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldEVudGl0eU1hcHBpbmdzKCk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJpZGRlbiBpbiBCYXNlSnBhQ29udGV4dCB0byByZXR1cm4gbnVsbAotCSAqIE92ZXJpZGRlbiBpbiBPcm1QZXJzaXN0ZW50VHlwZSB0byByZXR1cm4gaXQuCi0JICovCi0JcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlIGdldE9ybVBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0T3JtUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9HZW5lcmljUm9vdENvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9HZW5lcmljUm9vdENvbnRleHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGNhOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZSBleHRlbmRzIEFic3RyYWN0SnBhQ29udGV4dE5vZGUgCi0JaW1wbGVtZW50cyBKcGFSb290Q29udGV4dE5vZGUKLXsKLQkvKiBUaGlzIG9iamVjdCBoYXMgbm8gcGFyZW50LCBzbyBpdCBtdXN0IHBvaW50IHRvIHRoZSBKUEEgcHJvamVjdCAqLwotCXByb3RlY3RlZCBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JCi0JLyogTWFpbiBjb250ZXh0IG9iamVjdCAqLwotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbDsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZShKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBKUEEgcHJvamVjdCBtdXN0IG5vdCBiZSBudWxsIik7Ci0JCX0KLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgcGFlID0gUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChqcGFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcHIgPSBwYWUuZ2V0UmVzb3VyY2UoKTsKLQkJCi0JCWlmIChwci5leGlzdHMoKSkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVhtbCA9IHRoaXMuYnVpbGRQZXJzaXN0ZW5jZVhtbChwcik7Ci0JCX0KLQkJCi0JCXBhZS5kaXNwb3NlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSnBhTm9kZSBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSnBhQ29udGV4dE5vZGUgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJLy8gTm8gUGVyc2lzdGVuY2VVbml0IGluIHRoaXMgY29udGV4dAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgewotCQkvLyBObyBFbnRpdHlNYXBwaW5ncyBpbiB0aGlzIGNvbnRleHQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRPcm1QZXJzaXN0ZW50VHlwZSgpIHsKLQkJLy8gTm8gT3JtUGVyc2lzdGVudFR5cGUgaW4gdGhpcyBjb250ZXh0Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHBlcnNpc3RlbmNlIHhtbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sIGdldFBlcnNpc3RlbmNlWG1sKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVhtbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGVyc2lzdGVuY2VYbWwoUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwpIHsKLQkJUGVyc2lzdGVuY2VYbWwgb2xkID0gdGhpcy5wZXJzaXN0ZW5jZVhtbDsKLQkJdGhpcy5wZXJzaXN0ZW5jZVhtbCA9IHBlcnNpc3RlbmNlWG1sOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEVSU0lTVEVOQ0VfWE1MX1BST1BFUlRZLCBvbGQsIHBlcnNpc3RlbmNlWG1sKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sIGFkZFBlcnNpc3RlbmNlWG1sKCkgewotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVhtbCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgcGFlID0gUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUodGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZSBwciA9IHBhZS5jcmVhdGVEZWZhdWx0UmVzb3VyY2UoKTsKLQkJcGFlLmRpc3Bvc2UoKTsKLQkJUGVyc2lzdGVuY2VYbWwgcHggPSB0aGlzLmJ1aWxkUGVyc2lzdGVuY2VYbWwocHIpOwotCQl0aGlzLnNldFBlcnNpc3RlbmNlWG1sKHB4KTsKLQkJcmV0dXJuIHB4OwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVQZXJzaXN0ZW5jZVhtbCgpIHsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucGVyc2lzdGVuY2VYbWwuZGlzcG9zZSgpOwotCQlQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBwYWUgPSBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZSBwciA9IHBhZS5nZXRSZXNvdXJjZSgpOwotCQlwYWUuZGlzcG9zZSgpOwotCQl0cnkgewotCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZGVsZXRlUmVzb3VyY2UocHIpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlKcHRDb3JlUGx1Z2luLmxvZyhjZSk7Ci0JCX0KLQkJCi0JCWlmICghIHByLmV4aXN0cygpKSB7Ci0JCQlzZXRQZXJzaXN0ZW5jZVhtbChudWxsKTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgdXBkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBwYWUgPSBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQlQZXJzaXN0ZW5jZVJlc291cmNlIHByID0gcGFlLmdldFJlc291cmNlKCk7Ci0JCQotCQlpZiAocHIuZXhpc3RzKCkpIHsKLQkJCWlmICh0aGlzLnBlcnNpc3RlbmNlWG1sICE9IG51bGwpIHsKLQkJCQl0aGlzLnBlcnNpc3RlbmNlWG1sLnVwZGF0ZShwcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRQZXJzaXN0ZW5jZVhtbCh0aGlzLmJ1aWxkUGVyc2lzdGVuY2VYbWwocHIpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFBlcnNpc3RlbmNlWG1sKG51bGwpOwotCQl9Ci0JCQotCQlwYWUuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbCBidWlsZFBlcnNpc3RlbmNlWG1sKFBlcnNpc3RlbmNlUmVzb3VyY2UgcGVyc2lzdGVuY2VSZXNvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRQZXJzaXN0ZW5jZVhtbCh0aGlzLCBwZXJzaXN0ZW5jZVJlc291cmNlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qIElmIHRoaXMgaXMgdHJ1ZSwgaXQgbWF5IGJlIGFzc3VtZWQgdGhhdCBhbGwgdGhlIHJlcXVpcmVtZW50cyBhcmUgdmFsaWQgCi0JICogZm9yIGZ1cnRoZXIgdmFsaWRhdGlvbi4gIEZvciBleGFtcGxlLCBpZiB0aGlzIGlzIHRydWUgYXQgdGhlIHBvaW50IHdlCi0JICogYXJlIHZhbGlkYXRpbmcgcGVyc2lzdGVuY2UgdW5pdHMsIGl0IG1heSBiZSBhc3N1bWVkIHRoYXQgdGhlcmUgaXMgYSAKLQkgKiBzaW5nbGUgcGVyc2lzdGVuY2UueG1sIGFuZCB0aGF0IGl0IGhhcyB2YWxpZCBjb250ZW50IGRvd24gdG8gdGhlIAotCSAqIHBlcnNpc3RlbmNlIHVuaXQgbGV2ZWwuICAqLwotCXByaXZhdGUgYm9vbGVhbiBva1RvQ29udGludWVWYWxpZGF0aW9uID0gdHJ1ZTsKLQkKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWFkZE5vUGVyc2lzdGVuY2VYbWxNZXNzYWdlKG1lc3NhZ2VzKTsKLQkJLy9UT0RPIC0gbXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdCBtZXNzYWdlCi0JCWFkZE9ycGhhbmVkSmF2YUNsYXNzTWVzc2FnZXMobWVzc2FnZXMpOwotCQkKLQkJaWYob2tUb0NvbnRpbnVlVmFsaWRhdGlvbikgewotCQkJZ2V0UGVyc2lzdGVuY2VYbWwoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9QZXJzaXN0ZW5jZVhtbE1lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHBlcnNpc3RlbmNlWG1sID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCAKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTCwKLQkJCQkJCXRoaXMpCi0JCQkJKTsKLQkJCW9rVG9Db250aW51ZVZhbGlkYXRpb24gPSBmYWxzZTsKLQkJfQotCX0KLQkKLQkKLQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE9ycGhhbmVkSmF2YUNsYXNzTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKGdldFBlcnNpc3RlbmNlWG1sKCkgPT0gbnVsbCkgewotCQkJLy9oYW5kbGVkIHdpdGggb3RoZXIgdmFsaWRhdGlvbgotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkgPT0gbnVsbCkgewotCQkJLy9oYW5kbGVkIHdpdGggb3RoZXIgdmFsaWRhdGlvbgotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRKcGFQcm9qZWN0KCkuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG9ycGhhbmVkQ2xhc3NOYW1lcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGdldEpwYVByb2plY3QoKS5hbm5vdGF0ZWRDbGFzc05hbWVzKCkpOwotCQlpZiAoZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLnBlcnNpc3RlbmNlVW5pdHNTaXplKCkgIT0gMSkgewotCQkJLy9jb250ZXh0IG1vZGVsIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIDEgcGVyc2lzdGVuY2VVbml0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKS5wZXJzaXN0ZW5jZVVuaXRzKCkubmV4dCgpOwotCQlmb3IgKFN0cmluZyB0eXBlTmFtZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShnZXRKcGFQcm9qZWN0KCkuYW5ub3RhdGVkQ2xhc3NOYW1lcygpKSkgewotCQkJZm9yIChDbGFzc1JlZiBjbGFzc1JlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkQ2xhc3NSZWZzKCkpKSB7Ci0JCQkJaWYgKGNsYXNzUmVmLmlzRm9yKHR5cGVOYW1lKSkgewotCQkJCQlvcnBoYW5lZENsYXNzTmFtZXMucmVtb3ZlKHR5cGVOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHBlcnNpc3RlbmNlVW5pdC5tYXBwaW5nRmlsZVJlZnMoKSkpIHsKLQkJCQlpZiAobWFwcGluZ0ZpbGVSZWYuZ2V0T3JtWG1sKCkgPT0gbnVsbCB8fCBtYXBwaW5nRmlsZVJlZi5nZXRPcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChtYXBwaW5nRmlsZVJlZi5nZXRPcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKHR5cGVOYW1lKSAhPSBudWxsKSB7Ci0JCQkJCW9ycGhhbmVkQ2xhc3NOYW1lcy5yZW1vdmUodHlwZU5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZm9yIChTdHJpbmcgb3JwaGFuZWRUeXBlTmFtZSA6IG9ycGhhbmVkQ2xhc3NOYW1lcykgewotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUob3JwaGFuZWRUeXBlTmFtZSk7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX1VOU1BFQ0lGSUVEX0NPTlRFWFQsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpfSwKLQkJCQkJCQlqYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZU1vZGVsKCkuZ2V0RmlsZSgpLAotCQkJCQkJCWphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChqYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRKcGFDb21waWxhdGlvblVuaXQoKS5nZXRDb21waWxhdGlvblVuaXQoKSkpKQotCQkJCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvSnBhQ29udGV4dE5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvSnBhQ29udGV4dE5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWRiY2EyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L0pwYUNvbnRleHROb2RlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi1wdWJsaWMgY2xhc3MgSnBhQ29udGV4dE5vZGVBZGFwdGVyRmFjdG9yeQotCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBQUk9QRVJUSUVTID0gCi0JCW5ldyBDbGFzc1tdIHsgSVJlc291cmNlLmNsYXNzLCBJRmlsZS5jbGFzcyB9OwotCQotCQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gUFJPUEVSVElFUzsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBlbGVtZW50LCBDbGFzcyBrZXkpIHsKLQkJSnBhQ29udGV4dE5vZGUgbm9kZTsKLQkJCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSnBhQ29udGV4dE5vZGUpIHsKLQkJCW5vZGUgPSAoSnBhQ29udGV4dE5vZGUpIGVsZW1lbnQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSVJlc291cmNlIHJlc291cmNlID0gbm9kZS5nZXRSZXNvdXJjZSgpOwotCQkKLQkJaWYgKGtleS5lcXVhbHMoSVJlc291cmNlLmNsYXNzKSkgewotCQkJcmV0dXJuIHJlc291cmNlOwotCQl9Ci0JCWVsc2UgaWYgKGtleS5lcXVhbHMoSUZpbGUuY2xhc3MpICYmIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQlyZXR1cm4gKElGaWxlKSByZXNvdXJjZTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9NYXBwaW5nVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L01hcHBpbmdUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2NmODkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L01hcHBpbmdUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBNYXBwaW5nVG9vbHMKLXsKLQkvKioKLQkgKiBEZWZhdWx0IGpvaW4gdGFibGUgbmFtZSBmcm9tIHRoZSBKUEEgc3BlYzoKLQkgKiAJVGhlIGNvbmNhdGVuYXRlZCBuYW1lcyBvZiB0aGUgdHdvIGFzc29jaWF0ZWQgcHJpbWFyeQotCSAqIAllbnRpdHkgdGFibGVzLCBzZXBhcmF0ZWQgYnkgYSB1bmRlcnNjb3JlLgotCSAqIAotCSAqIFtvd25pbmcgdGFibGUgbmFtZV1fW3RhcmdldCB0YWJsZSBuYW1lXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkSm9pblRhYmxlRGVmYXVsdE5hbWUoUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCWlmICghcmVsYXRpb25zaGlwTWFwcGluZy5pc1JlbGF0aW9uc2hpcE93bmVyKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBvd25pbmdUYWJsZU5hbWUgPSByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JCWlmIChvd25pbmdUYWJsZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRW50aXR5IHRhcmdldEVudGl0eSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgdGFyZ2V0VGFibGVOYW1lID0gdGFyZ2V0RW50aXR5LmdldFRhYmxlTmFtZSgpOwotCQlpZiAodGFyZ2V0VGFibGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBvd25pbmdUYWJsZU5hbWUgKyAnXycgKyB0YXJnZXRUYWJsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBqb2luIGNvbHVtbidzIGRlZmF1bHQgbmFtZTsKLQkgKiB3aGljaCBpcyB0eXBpY2FsbHkgJmx0O2F0dHJpYnV0ZSBuYW1lJmd0O18mbHQ7cmVmZXJlbmNlZCBjb2x1bW4gbmFtZSZndDsKLQkgKiBidXQsIGlmIHdlIGRvbid0IGhhdmUgYW4gYXR0cmlidXRlIG5hbWUgKGUuZy4gaW4gYSB1bmlkaXJlY3Rpb25hbAotCSAqIE9uZVRvTWFueSBvciBNYW55VG9NYW55KSBpcwotCSAqICZsdDt0YXJnZXQgZW50aXR5IG5hbWUmZ3Q7XyZsdDtyZWZlcmVuY2VkIGNvbHVtbiBuYW1lJmd0OwotCSAqLwotCS8vIDxhdHRyaWJ1dGUgbmFtZT5fPHJlZmVyZW5jZWQgY29sdW1uIG5hbWU+Ci0JLy8gICAgIG9yCi0JLy8gPHRhcmdldCBlbnRpdHkgbmFtZT5fPHJlZmVyZW5jZWQgY29sdW1uIG5hbWU+Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uRGVmYXVsdE5hbWUoSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWlmIChqb2luQ29sdW1uLmdldE93bmVyKCkuam9pbkNvbHVtbnNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHByZWZpeCA9IGpvaW5Db2x1bW4uZ2V0T3duZXIoKS5nZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JCWlmIChwcmVmaXggPT0gbnVsbCkgewotCQkJcHJlZml4ID0gdGFyZ2V0RW50aXR5TmFtZShqb2luQ29sdW1uKTsKLQkJfQotCQlpZiAocHJlZml4ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vIFRPRE8gbm90IHN1cmUgd2hpY2ggb2YgdGhlc2UgaXMgY29ycmVjdC4uLgotCQkvLyAodGhlIHNwZWMgaW1wbGllcyB0aGF0IHRoZSByZWZlcmVuY2VkIGNvbHVtbiBpcyBhbHdheXMgdGhlCi0JCS8vIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgdGFyZ2V0IGVudGl0eSkKLQkJLy8gU3RyaW5nIHRhcmdldENvbHVtbiA9IHRoaXMudGFyZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQkJU3RyaW5nIHRhcmdldENvbHVtbiA9IGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJaWYgKHRhcmdldENvbHVtbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcHJlZml4ICsgJ18nICsgdGFyZ2V0Q29sdW1uOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGVudGl0eQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHRhcmdldEVudGl0eU5hbWUoSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBqb2luQ29sdW1uLmdldE93bmVyKCkuZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVudGl0eS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlpZiAoam9pbkNvbHVtbi5nZXRPd25lcigpLmpvaW5Db2x1bW5zU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0YXJnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZShqb2luQ29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNpbmdsZSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHRhcmdldCBlbnRpdHkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB0YXJnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZShKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJRW50aXR5IHRhcmdldEVudGl0eSA9IGpvaW5Db2x1bW4uZ2V0T3duZXIoKS5nZXRUYXJnZXRFbnRpdHkoKTsKLQkJcmV0dXJuICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0RW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgRW1iZWRkYWJsZSBnZXRFbWJlZGRhYmxlRm9yKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRRdWFsaWZpZWRUeXBlTmFtZSgpOwotCQlpZiAocXVhbGlmaWVkVHlwZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKHF1YWxpZmllZFR5cGVOYW1lKTsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCWlmIChwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nS2V5KCkgPT0gTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKSB7Ci0JCQkJcmV0dXJuIChFbWJlZGRhYmxlKSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sdW1uTWFwcGluZyBnZXRDb2x1bW5NYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBFbWJlZGRhYmxlIGVtYmVkZGFibGUpIHsKLQkJaWYgKGF0dHJpYnV0ZU5hbWUgPT0gbnVsbCB8fCBlbWJlZGRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gZW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc0F0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMocGVyc0F0dHJpYnV0ZS5nZXROYW1lKCkpKSB7Ci0JCQkJaWYgKHBlcnNBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQ29sdW1uTWFwcGluZykgewotCQkJCQlyZXR1cm4gKENvbHVtbk1hcHBpbmcpIHBlcnNBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbnRBdHRyaWJ1dGVQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudEF0dHJpYnV0ZVByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZWU1ZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudEF0dHJpYnV0ZVByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZVByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfTUFQUEVEID0gImlzTWFwcGVkIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19WSVJUVUFMID0gImlzVmlydHVhbCI7Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJaWYgKElTX01BUFBFRC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlCb29sZWFuIGV4cGVjdGVkSXNNYXBwZWQ7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJZXhwZWN0ZWRJc01hcHBlZCA9IChCb29sZWFuKSBleHBlY3RlZFZhbHVlOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCUJvb2xlYW4gYWN0dWFsSXNNYXBwZWQgPSAoKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIHJlY2VpdmVyKS5nZXRNYXBwaW5nS2V5KCkgIT0gTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JCQkKLQkJCXJldHVybiBhY3R1YWxJc01hcHBlZCA9PSBleHBlY3RlZElzTWFwcGVkOwotCQl9Ci0JCWVsc2UgaWYgKElTX1ZJUlRVQUwuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJQm9vbGVhbiBleHBlY3RlZElzVmlydHVhbDsKLQkJCQotCQkJdHJ5IHsKLQkJCQlleHBlY3RlZElzVmlydHVhbCA9IChCb29sZWFuKSBleHBlY3RlZFZhbHVlOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCUJvb2xlYW4gYWN0dWFsSXNWaXJ0dWFsID0gZmFsc2U7Ci0JCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQkJYWN0dWFsSXNWaXJ0dWFsID0gKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSByZWNlaXZlcikuaXNWaXJ0dWFsKCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBhY3R1YWxJc1ZpcnR1YWwgPT0gZXhwZWN0ZWRJc1ZpcnR1YWw7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmYwYTBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8VCBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGU+IGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotCQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBUIGdldE1hcHBpbmdSZXNvdXJjZSgpIHsKLQkJaWYgKGlzRGVmYXVsdCgpKSB7Ci0JCQlyZXR1cm4gKFQpIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldE51bGxNYXBwaW5nQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gKFQpIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiAoR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotCX0KLQkKLQkvKioKLQkgKiB0aGUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgY2FuIHRlbGwgd2hldGhlciB0aGVyZSBpcyBhICJzcGVjaWZpZWQiIG1hcHBpbmcKLQkgKiBvciBhICJkZWZhdWx0IiBvbmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5tYXBwaW5nSXNEZWZhdWx0KHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGVtYmVkZGFibGVPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGVudGl0eU93bmVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldEtleSgpID09IE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRUeXBlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIFRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gbnVsbDsKLQkJVCBtYXBwaW5nUmVzb3VyY2UgPSBnZXRNYXBwaW5nUmVzb3VyY2UoKTsKLQkJaWYgKG1hcHBpbmdSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQl0ZXh0UmFuZ2UgPSBtYXBwaW5nUmVzb3VyY2UuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJZE1hcHBpbmcoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0gcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotCQlpbml0aWFsaXplKGdldE1hcHBpbmdSZXNvdXJjZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFQgbWFwcGluZ1Jlc291cmNlKSB7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQkJdGhpcy51cGRhdGUoZ2V0TWFwcGluZ1Jlc291cmNlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoVCBtYXBwaW5nUmVzb3VyY2UpIHsKLQkJCi0JfQotCi0JCi0JLy8qKioqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCQotCQlhZGRNb2RpZmllck1lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJYWRkSW52YWxpZE1hcHBpbmdNZXNzYWdlKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTW9kaWZpZXJNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlpZiAoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICggdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNGb3JGaWVsZCgpKSB7Ci0JCQlpZiAodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNGaW5hbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfRklFTEQsCi0JCQkJCQluZXcgU3RyaW5nW10ge2F0dHJpYnV0ZS5nZXROYW1lKCl9LAotCQkJCQkJYXR0cmlidXRlLCBhdHRyaWJ1dGUuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQkJCi0JCQlpZiAodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNQdWJsaWMoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX1BVQkxJQ19GSUVMRCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7YXR0cmlidXRlLmdldE5hbWUoKX0sCi0JCQkJCQlhdHRyaWJ1dGUsIGF0dHJpYnV0ZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW52YWxpZE1hcHBpbmdNZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAoISBnZXRUeXBlTWFwcGluZygpLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKHRoaXMuZ2V0S2V5KCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX01BUFBJTkcsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpfSwKLQkJCQkJdGhpcywgdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQmFzZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFCYXNlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOGExZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFCYXNlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNlQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhQmFzZUNvbHVtbjxUIGV4dGVuZHMgQmFzZUNvbHVtbkFubm90YXRpb24+IGV4dGVuZHMgQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW48VD4KLQlpbXBsZW1lbnRzIEphdmFCYXNlQ29sdW1uCi17Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhYmxlOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhYmxlOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkVW5pcXVlOwotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE51bGxhYmxlOwotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEluc2VydGFibGU7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkVXBkYXRhYmxlOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YUJhc2VDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUJhc2VDb2x1bW4uT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoVCBjb2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShjb2x1bW4pOwotCQl0aGlzLmRlZmF1bHRUYWJsZSA9IHRoaXMuZGVmYXVsdFRhYmxlKCk7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0aGlzLnNwZWNpZmllZFRhYmxlKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkVW5pcXVlID0gdGhpcy5zcGVjaWZpZWRVbmlxdWUoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWROdWxsYWJsZSA9IHRoaXMuc3BlY2lmaWVkTnVsbGFibGUoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlID0gdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlID0gdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUoY29sdW1uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFCYXNlQ29sdW1uLk93bmVyIGdldE93bmVyKCkgewotCQlyZXR1cm4gKEphdmFCYXNlQ29sdW1uLk93bmVyKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCS8vKioqKioqKioqKioqKiogSUFic3RyYWN0Q29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioKLQkKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRUYWJsZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFRhYmxlKCkgOiB0aGlzLmdldFNwZWNpZmllZFRhYmxlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVGFibGUoU3RyaW5nIG5ld1NwZWNpZmllZFRhYmxlKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRUYWJsZSA9IHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSBuZXdTcGVjaWZpZWRUYWJsZTsKLQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRUYWJsZShuZXdTcGVjaWZpZWRUYWJsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFRhYmxlLCBuZXdTcGVjaWZpZWRUYWJsZSk7Ci0JfQotCQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVGFibGVfKFN0cmluZyBuZXdTcGVjaWZpZWRUYWJsZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkVGFibGUgPSB0aGlzLnNwZWNpZmllZFRhYmxlOwotCQl0aGlzLnNwZWNpZmllZFRhYmxlID0gbmV3U3BlY2lmaWVkVGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFRhYmxlLCBuZXdTcGVjaWZpZWRUYWJsZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VGFibGUoU3RyaW5nIG5ld0RlZmF1bHRUYWJsZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFRhYmxlID0gdGhpcy5kZWZhdWx0VGFibGU7Ci0JCXRoaXMuZGVmYXVsdFRhYmxlID0gbmV3RGVmYXVsdFRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uREVGQVVMVF9UQUJMRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFRhYmxlLCBuZXdEZWZhdWx0VGFibGUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFVuaXF1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFVuaXF1ZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0VW5pcXVlKCkgOiB0aGlzLmdldFNwZWNpZmllZFVuaXF1ZSgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VW5pcXVlKCkgewotCQlyZXR1cm4gQmFzZUNvbHVtbi5ERUZBVUxUX1VOSVFVRTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkVW5pcXVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRVbmlxdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuIG5ld1NwZWNpZmllZFVuaXF1ZSkgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZFVuaXF1ZSA9IHRoaXMuc3BlY2lmaWVkVW5pcXVlOwotCQl0aGlzLnNwZWNpZmllZFVuaXF1ZSA9IG5ld1NwZWNpZmllZFVuaXF1ZTsKLQkJdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLnNldFVuaXF1ZShuZXdTcGVjaWZpZWRVbmlxdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VOSVFVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVW5pcXVlLCBuZXdTcGVjaWZpZWRVbmlxdWUpOwotCX0KLQkKLQkvKioKLQkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KLQkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQotCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KLQkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFVuaXF1ZV8oQm9vbGVhbiBuZXdTcGVjaWZpZWRVbmlxdWUpIHsKLQkJQm9vbGVhbiBvbGRTcGVjaWZpZWRVbmlxdWUgPSB0aGlzLnNwZWNpZmllZFVuaXF1ZTsKLQkJdGhpcy5zcGVjaWZpZWRVbmlxdWUgPSBuZXdTcGVjaWZpZWRVbmlxdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfVU5JUVVFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRVbmlxdWUsIG5ld1NwZWNpZmllZFVuaXF1ZSk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldE51bGxhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdE51bGxhYmxlKCkgOiB0aGlzLmdldFNwZWNpZmllZE51bGxhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIEJhc2VDb2x1bW4uREVGQVVMVF9OVUxMQUJMRTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE51bGxhYmxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuIG5ld1NwZWNpZmllZE51bGxhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkTnVsbGFibGUgPSB0aGlzLnNwZWNpZmllZE51bGxhYmxlOwotCQl0aGlzLnNwZWNpZmllZE51bGxhYmxlID0gbmV3U3BlY2lmaWVkTnVsbGFibGU7Ci0JCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXROdWxsYWJsZShuZXdTcGVjaWZpZWROdWxsYWJsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfTlVMTEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE51bGxhYmxlLCBuZXdTcGVjaWZpZWROdWxsYWJsZSk7Ci0JfQotCQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTnVsbGFibGVfKEJvb2xlYW4gbmV3U3BlY2lmaWVkTnVsbGFibGUpIHsKLQkJQm9vbGVhbiBvbGRTcGVjaWZpZWROdWxsYWJsZSA9IHRoaXMuc3BlY2lmaWVkTnVsbGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkTnVsbGFibGUgPSBuZXdTcGVjaWZpZWROdWxsYWJsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLlNQRUNJRklFRF9OVUxMQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTnVsbGFibGUsIG5ld1NwZWNpZmllZE51bGxhYmxlKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEluc2VydGFibGUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEluc2VydGFibGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIEJhc2VDb2x1bW4uREVGQVVMVF9JTlNFUlRBQkxFOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4gbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSkgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZEluc2VydGFibGUgPSB0aGlzLnNwZWNpZmllZEluc2VydGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZSA9IG5ld1NwZWNpZmllZEluc2VydGFibGU7Ci0JCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRJbnNlcnRhYmxlKG5ld1NwZWNpZmllZEluc2VydGFibGUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX0lOU0VSVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZEluc2VydGFibGUsIG5ld1NwZWNpZmllZEluc2VydGFibGUpOwotCX0KLQkKLQkvKioKLQkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KLQkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQotCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KLQkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEluc2VydGFibGVfKEJvb2xlYW4gbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSkgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZEluc2VydGFibGUgPSB0aGlzLnNwZWNpZmllZEluc2VydGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZSA9IG5ld1NwZWNpZmllZEluc2VydGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfSU5TRVJUQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkSW5zZXJ0YWJsZSwgbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0VXBkYXRhYmxlKCkgOiB0aGlzLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VXBkYXRhYmxlKCkgewotCQlyZXR1cm4gQmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRVcGRhdGFibGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuIG5ld1NwZWNpZmllZFVwZGF0YWJsZSkgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZFVwZGF0YWJsZSA9IHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlOwotCQl0aGlzLnNwZWNpZmllZFVwZGF0YWJsZSA9IG5ld1NwZWNpZmllZFVwZGF0YWJsZTsKLQkJdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLnNldFVwZGF0YWJsZShuZXdTcGVjaWZpZWRVcGRhdGFibGUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VQREFUQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVXBkYXRhYmxlLCBuZXdTcGVjaWZpZWRVcGRhdGFibGUpOwotCX0KLQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVXBkYXRhYmxlXyhCb29sZWFuIG5ld1NwZWNpZmllZFVwZGF0YWJsZSkgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZFVwZGF0YWJsZSA9IHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlOwotCQl0aGlzLnNwZWNpZmllZFVwZGF0YWJsZSA9IG5ld1NwZWNpZmllZFVwZGF0YWJsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLlNQRUNJRklFRF9VUERBVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFVwZGF0YWJsZSwgbmV3U3BlY2lmaWVkVXBkYXRhYmxlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldENvbHVtblJlc291cmNlKCkuZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRPd25lcigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRDb2x1bW5SZXNvdXJjZSgpLnRhYmxlVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZUlzQWxsb3dlZCgpID8gdGhpcy5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz4gaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlVGFibGVOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy5jYW5kaWRhdGVUYWJsZU5hbWVzKCksIGZpbHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IHF1b3RlZENhbmRpZGF0ZVRhYmxlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZVRhYmxlTmFtZXMoZmlsdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlICd0YWJsZScgZWxlbWVudCBpcyBhbGxvd2VkLiBJdCBpcyBub3QgYWxsb3dlZCBmb3IKLQkgKiBqb2luIGNvbHVtbnMgaW5zaWRlIG9mIGpvaW4gdGFibGVzLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHRhYmxlSXNBbGxvd2VkKCk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMudGFibGVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZVRhYmxlTmFtZXMoZmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKFQgY29sdW1uKSB7Ci0JCXN1cGVyLnVwZGF0ZShjb2x1bW4pOwotCQl0aGlzLnNldERlZmF1bHRUYWJsZSh0aGlzLmRlZmF1bHRUYWJsZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYWJsZV8odGhpcy5zcGVjaWZpZWRUYWJsZShjb2x1bW4pKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRVbmlxdWVfKHRoaXMuc3BlY2lmaWVkVW5pcXVlKGNvbHVtbikpOwotCQl0aGlzLnNldFNwZWNpZmllZE51bGxhYmxlXyh0aGlzLnNwZWNpZmllZE51bGxhYmxlKGNvbHVtbikpOwotCQl0aGlzLnNldFNwZWNpZmllZEluc2VydGFibGVfKHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZShjb2x1bW4pKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRVcGRhdGFibGVfKHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlKGNvbHVtbikpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYWJsZShCYXNlQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbi5nZXRUYWJsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRVbmlxdWUoQmFzZUNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4uZ2V0VW5pcXVlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE51bGxhYmxlKEJhc2VDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgewotCQlyZXR1cm4gY29sdW1uLmdldE51bGxhYmxlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEluc2VydGFibGUoQmFzZUNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRVcGRhdGFibGUoQmFzZUNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4uZ2V0VXBkYXRhYmxlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzZGU5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmc8VCBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGU+IGV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxUPgotCWltcGxlbWVudHMgSmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlczsKLQotCXByaXZhdGUgRW1iZWRkYWJsZSBlbWJlZGRhYmxlOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEFycmF5TGlzdDxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KCk7Ci0JCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPigpOwotCX0KLQotCS8vKioqKioqKioqKioqKioqKioqIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVuYXRpb24gKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29ycmVzcG9uZGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oCi0JCQlKUEEuQVRUUklCVVRFX09WRVJSSURFLAotCQkJSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKiBBdHRyaWJ1dGVPdmVycmlkZS5Pd25lciBpbXBsZW1lbmF0aW9uICoqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgQ29sdW1uTWFwcGluZyBnZXRDb2x1bW5NYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuZ2V0Q29sdW1uTWFwcGluZyhhdHRyaWJ1dGVOYW1lLCBlbWJlZGRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5jb250YWlucyhvdmVycmlkZSk7Ci0JfQotCQotCXB1YmxpYyBCYXNlT3ZlcnJpZGUgc2V0VmlydHVhbChib29sZWFuIHZpcnR1YWwsIEJhc2VPdmVycmlkZSBvdmVycmlkZSkgewotCQkvLyBBZGQgYSBuZXcgYXR0cmlidXRlIG92ZXJyaWRlCi0JCWlmICh2aXJ0dWFsKSB7Ci0JCQlyZXR1cm4gc2V0QXR0cmlidXRlT3ZlcnJpZGVWaXJ0dWFsKChKYXZhQXR0cmlidXRlT3ZlcnJpZGUpIG92ZXJyaWRlKTsKLQkJfQotCQlyZXR1cm4gc2V0QXR0cmlidXRlT3ZlcnJpZGVTcGVjaWZpZWQoKEphdmFBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIHNldEF0dHJpYnV0ZU92ZXJyaWRlVmlydHVhbChKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaW5kZXhPZihhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZShpbmRleCk7Ci0JCVN0cmluZyBhdHRyaWJ1dGVPdmVycmlkZU5hbWUgPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCk7Ci0JCS8vYWRkIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZSBzbyB0aGF0IEkgY2FuIGNvbnRyb2wgdGhlIG9yZGVyIHRoYXQgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcyBzZW50LgotCQkvL290aGVyd2lzZSB3aGVuIHdlIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIGphdmEgd2Ugd2lsbCBnZXQgYW4gdXBkYXRlIGFuZCBhZGQgdGhlIGF0dHJpYnV0ZSBvdmVycmlkZQotCQkvL2R1cmluZyB0aGUgdWRwYXRlLiAgVGhpcyBjYXVzZXMgdGhlIFVJIHRvIGJlIGZsYWt5LCBzaW5jZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1pZ2h0IG5vdCBvY2N1ciBpbiB0aGUgY29ycmVjdCBvcmRlcgotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gbnVsbDsKLQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSAhPSBudWxsKSB7Ci0JCQlmb3IgKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSkpIHsKLQkJCQlpZiAocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSkpIHsKLQkJCQkJLy9zdG9yZSB0aGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHNvIHdlIGNhbiBmaXJlIGNoYW5nZSBub3RpZmljYXRpb24gbGF0ZXIKLQkJCQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmFkZCh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCi0JCWlmICh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgIT0gbnVsbCkgewotCQkJZmlyZUl0ZW1BZGRlZChFbnRpdHkuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgLSAxLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpOwotCQl9Ci0JCXJldHVybiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgc2V0QXR0cmlidXRlT3ZlcnJpZGVTcGVjaWZpZWQoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIG9sZEF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWludCBpbmRleCA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIG5ld0F0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKHRoaXMsIHRoaXMpOwotCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoaW5kZXgsIG5ld0F0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihpbmRleCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQluZXdBdHRyaWJ1dGVPdmVycmlkZS5pbml0aWFsaXplKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UpOwotCQkKLQkJaW50IGRlZmF1bHRJbmRleCA9IHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5pbmRleE9mKG9sZEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZShkZWZhdWx0SW5kZXgpOwotCi0JCW5ld0F0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUob2xkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJbmV3QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShvbGRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoRW50aXR5LlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBkZWZhdWx0SW5kZXgsIG9sZEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEVudGl0eS5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBpbmRleCwgbmV3QXR0cmlidXRlT3ZlcnJpZGUpOwkJCi0KLQkJcmV0dXJuIG5ld0F0dHJpYnV0ZU92ZXJyaWRlOwotCX0KLQotCQotCS8vKioqKioqKioqKioqKioqKioqIEJhc2VFbWJlZGRlZE1hcHBpbmcgaW1wbGVtZW5hdGlvbiAqKioqKioqKioqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCksIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0JCi0JcHVibGljIGludCBhdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgKyB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4odGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoaW50IGluZGV4LCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLCBCYXNlRW1iZWRkZWRNYXBwaW5nLlNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlXyhKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcywgQmFzZUVtYmVkZGVkTWFwcGluZy5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtTW92ZWQoQmFzZUVtYmVkZGVkTWFwcGluZy5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJYWRkSXRlbVRvTGlzdChhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLCBCYXNlRW1iZWRkZWRNYXBwaW5nLlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcywgQmFzZUVtYmVkZGVkTWFwcGluZy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCk7Ci0JfQotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKSBnZXRPdmVycmlkZU5hbWVkKG5hbWUsIGF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0F0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0RlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQmFzZU92ZXJyaWRlIGdldE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgQmFzZU92ZXJyaWRlPiBvdmVycmlkZXMpIHsKLQkJZm9yIChCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3ZlcnJpZGVzKSkgewotCQkJU3RyaW5nIG92ZXJyaWRlTmFtZSA9IG92ZXJyaWRlLmdldE5hbWUoKTsKLQkJCWlmIChvdmVycmlkZU5hbWUgPT0gbnVsbCAmJiBuYW1lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gb3ZlcnJpZGU7Ci0JCQl9Ci0JCQlpZiAob3ZlcnJpZGVOYW1lICE9IG51bGwgJiYgb3ZlcnJpZGVOYW1lLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBvdmVycmlkZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc092ZXJyaWRlKFN0cmluZyBuYW1lLCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVzKSB7Ci0JCXJldHVybiBnZXRPdmVycmlkZU5hbWVkKG5hbWUsIG92ZXJyaWRlcykgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkYWJsZSBlbWJlZGRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5lbWJlZGRhYmxlOwotCX0KLQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLmluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXMocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy5pbml0aWFsaXplRGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcyhyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLmVtYmVkZGFibGUgPSBNYXBwaW5nVG9vbHMuZ2V0RW1iZWRkYWJsZUZvcihnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBhbm5vdGF0aW9ucyA9IHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQl3aGlsZShhbm5vdGF0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCB0aGlzKTsKLQkJCWF0dHJpYnV0ZU92ZXJyaWRlLmluaXRpYWxpemUoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYW5ub3RhdGlvbnMubmV4dCgpKTsKLQkJCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmFkZChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gaS5uZXh0KCk7Ci0JCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOwotCQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlID09IG51bGwpIHsKLQkJCQl0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSwgYXR0cmlidXRlTmFtZSkpOwotCQkJfQotCQl9Ci0JfQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJc3VwZXIudXBkYXRlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuZW1iZWRkYWJsZSA9IE1hcHBpbmdUb29scy5nZXRFbWJlZGRhYmxlRm9yKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMudXBkYXRlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyhyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gcmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUgKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKSB7Ci0JCQkJYXR0cmlidXRlT3ZlcnJpZGUudXBkYXRlKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZV8oYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCksIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKSk7Ci0JCX0JCi0JfQotCQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSkgewotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgdGhpcyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmluaXRpYWxpemUoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSk7Ci0JCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUsIGF0dHJpYnV0ZU5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUNvbHVtbk1hcHBpbmcgY29sdW1uTWFwcGluZyA9IChDb2x1bW5NYXBwaW5nKSB0aGlzLmVtYmVkZGFibGUoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYnV0ZU5hbWUpLmdldE1hcHBpbmcoKTsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLCBhdHRyaWJ1dGVOYW1lLCBjb2x1bW5NYXBwaW5nLmdldENvbHVtbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpID0gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGkubmV4dCgpOwotCQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChhdHRyaWJ1dGVPdmVycmlkZSA9PSBudWxsKSB7Ci0JCQkJYWRkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSwgYXR0cmlidXRlTmFtZSkpOwotCQkJfQotCQkJZWxzZSBpZiAoYXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpIHsKLQkJCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS51cGRhdGUobmV3IE51bGxDb2x1bW4ocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSk7Ci0JCi0JCS8vcmVtb3ZlIGFueSBkZWZhdWx0IG1hcHBpbmdzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgYXR0cmlidXRlTmFtZXMgY29sbGVjdGlvbgotCQlmb3IgKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkpKSB7Ci0JCQlpZiAoIWF0dHJpYnV0ZU5hbWVzLmNvbnRhaW5zKGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSkKLQkJCQl8fCBjb250YWluc1NwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSkpIHsKLQkJCQlyZW1vdmVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nPih0aGlzLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHsKLQkJaWYgKHRoaXMuZW1iZWRkYWJsZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlLCBQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLmVtYmVkZGFibGUoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoUGVyc2lzdGVudEF0dHJpYnV0ZSBvKSB7Ci0JCQkJcmV0dXJuIG8uaXNPdmVycmlkYWJsZUF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKEF0dHJpYnV0ZU92ZXJyaWRlIG92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVzKCkpKSB7Ci0JCQlyZXN1bHQgPSAoKEphdmFBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8qKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQkKLQkJZm9yIChJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHN0cmVhbSA9IGF0dHJpYnV0ZU92ZXJyaWRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzOTJlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgCi0JaW1wbGVtZW50cyBKYXZhR2VuZXJhdG9yCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkSW5pdGlhbFZhbHVlOwotCQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCi0JcHJvdGVjdGVkIEdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yUmVzb3VyY2U7Ci0JCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YUdlbmVyYXRvcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvclJlc291cmNlKSB7Ci0JCXRoaXMuZ2VuZXJhdG9yUmVzb3VyY2UgPSBnZW5lcmF0b3JSZXNvdXJjZTsKLQkJdGhpcy5uYW1lID0gdGhpcy5uYW1lKGdlbmVyYXRvclJlc291cmNlKTsKLQkJdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUgPSB0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZShnZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCXRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemUgPSB0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplKGdlbmVyYXRvclJlc291cmNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEdlbmVyYXRvckFubm90YXRpb24gZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvclJlc291cmNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUoR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JSZXNvdXJjZSkgewotCQlyZXR1cm4gZ2VuZXJhdG9yUmVzb3VyY2UuZ2V0TmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRJbml0aWFsVmFsdWUoR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JSZXNvdXJjZSkgewotCQlyZXR1cm4gZ2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZEFsbG9jYXRpb25TaXplKEdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldE5hbWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR2VuZXJhdG9yLk5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVfKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdlbmVyYXRvci5OQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRJbml0aWFsVmFsdWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlciBuZXdTcGVjaWZpZWRJbml0aWFsVmFsdWUpIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRJbml0aWFsVmFsdWUgPSB0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZTsKLQkJdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUgPSBuZXdTcGVjaWZpZWRJbml0aWFsVmFsdWU7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0SW5pdGlhbFZhbHVlKG5ld1NwZWNpZmllZEluaXRpYWxWYWx1ZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR2VuZXJhdG9yLlNQRUNJRklFRF9JTklUSUFMX1ZBTFVFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRJbml0aWFsVmFsdWUsIG5ld1NwZWNpZmllZEluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlXyhJbnRlZ2VyIG5ld1NwZWNpZmllZEluaXRpYWxWYWx1ZSkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZEluaXRpYWxWYWx1ZSA9IHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlOwotCQl0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZSA9IG5ld1NwZWNpZmllZEluaXRpYWxWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChHZW5lcmF0b3IuU1BFQ0lGSUVEX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZEluaXRpYWxWYWx1ZSwgbmV3U3BlY2lmaWVkSW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyIG5ld1NwZWNpZmllZEFsbG9jYXRpb25TaXplKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkQWxsb2NhdGlvblNpemUgPSB0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCQl0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplID0gbmV3U3BlY2lmaWVkQWxsb2NhdGlvblNpemU7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0QWxsb2NhdGlvblNpemUobmV3U3BlY2lmaWVkQWxsb2NhdGlvblNpemUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdlbmVyYXRvci5TUEVDSUZJRURfQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSwgbmV3U3BlY2lmaWVkQWxsb2NhdGlvblNpemUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplXyhJbnRlZ2VyIG5ld1NwZWNpZmllZEFsbG9jYXRpb25TaXplKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkQWxsb2NhdGlvblNpemUgPSB0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCQl0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplID0gbmV3U3BlY2lmaWVkQWxsb2NhdGlvblNpemU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR2VuZXJhdG9yLlNQRUNJRklFRF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFksIG9sZFNwZWNpZmllZEFsbG9jYXRpb25TaXplLCBuZXdTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkgewotCQlyZXR1cm4gR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvclJlc291cmNlLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvclJlc291cmNlLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKEdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJdGhpcy5nZW5lcmF0b3JSZXNvdXJjZSA9IGdlbmVyYXRvclJlc291cmNlOwotCQl0aGlzLnNldE5hbWVfKHRoaXMubmFtZShnZW5lcmF0b3JSZXNvdXJjZSkpOwotCQl0aGlzLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZV8odGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUoZ2VuZXJhdG9yUmVzb3VyY2UpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZV8odGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShnZW5lcmF0b3JSZXNvdXJjZSkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXMoR2VuZXJhdG9yIGdlbmVyYXRvcikgewotCQkvLyBqYXZhIGlzIGF0IHRoZSBiYXNlIG9mIHRoZSB0cmVlCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YmNjMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5BYnN0cmFjdEpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgZXh0ZW5kcyBBYnN0cmFjdEpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUoSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAodGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkpIHsKLQkJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gdGhpcy5jb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaWYgdGhlIGRhdGFiYXNlIGlzIGNvbm5lY3RlZCwgYWxsb3dpbmcgdXMgdG8KLQkgKiBnZXQgY2FuZGlkYXRlcyBmcm9tIHRoZSB2YXJpb3VzIGRhdGFiYXNlIHRhYmxlcyBldGMuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIE5PVCBiZSBjYXNjYWRlZCB0byAiY2hpbGQiIG9iamVjdHM7IGl0IHNob3VsZAotCSAqIG9ubHkgcmV0dXJuIGNhbmRpZGF0ZXMgZm9yIHRoZSBjdXJyZW50IG9iamVjdC4gVGhlIGNhc2NhZGluZyBpcwotCSAqIGhhbmRsZWQgYnkgI2phdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCwgRmlsdGVyLCBDb21waWxhdGlvblVuaXQpLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0JCi0JLyoqCi0JICogQWxsIHN1YmNsYXNzIGltcGxlbWVudGF0aW9ucyB7QGxpbmsgI2FkZFRvTWVzc2FnZXMoTGlzdCwgQ29tcGlsYXRpb25Vbml0KSl9IAotCSAqIHNob3VsZCBiZSBwcmVjZWRlZCBieSBhICJzdXBlciIgY2FsbCB0byB0aGlzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MGQ4YTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTm9uT3duaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYXBLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5SZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzxUIGV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nPFQ+IGltcGxlbWVudHMgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZEJ5OwotCi0JcHJvdGVjdGVkIFN0cmluZyBvcmRlckJ5OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOb09yZGVyaW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQa09yZGVyaW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDdXN0b21PcmRlcmluZzsKLQkKLQkvL1RPRE8gc2hvdWxkIHRoaXMgYmUgbnVsbCBpZiB0aGlzIGlzIHRoZSBub24tb3duaW5nIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcD8/Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFKb2luVGFibGUgam9pblRhYmxlOyAKLQotCXByb3RlY3RlZCBTdHJpbmcgbWFwS2V5OwotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luVGFibGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhSm9pblRhYmxlKHRoaXMpOyAKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbmV3TWFwcGVkQnkpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQl0aGlzLnNldE1hcHBlZEJ5T25SZXNvdXJjZU1vZGVsKG5ld01hcHBlZEJ5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOb25Pd25pbmdNYXBwaW5nLk1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkTWFwcGVkQnksIG5ld01hcHBlZEJ5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwZWRCeV8oU3RyaW5nIG5ld01hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGRNYXBwZWRCeSA9IHRoaXMubWFwcGVkQnk7Ci0JCXRoaXMubWFwcGVkQnkgPSBuZXdNYXBwZWRCeTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOb25Pd25pbmdNYXBwaW5nLk1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkTWFwcGVkQnksIG5ld01hcHBlZEJ5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRNYXBwZWRCeU9uUmVzb3VyY2VNb2RlbChTdHJpbmcgbWFwcGVkQnkpOwotCi0JcHVibGljIFN0cmluZyBnZXRPcmRlckJ5KCkgewotCQlyZXR1cm4gdGhpcy5vcmRlckJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9yZGVyQnkoU3RyaW5nIG5ld09yZGVyQnkpIHsKLQkJU3RyaW5nIG9sZE9yZGVyQnkgPSB0aGlzLm9yZGVyQnk7Ci0JCXRoaXMub3JkZXJCeSA9IG5ld09yZGVyQnk7Ci0JCWlmIChuZXdPcmRlckJ5ID09IG51bGwpIHsKLQkJCWlmIChnZXRPcmRlckJ5UmVzb3VyY2UoKSAhPSBudWxsKSB7IAotCQkJCXJlbW92ZU9yZGVyQnlSZXNvdXJjZSgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldE9yZGVyQnlSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQlhZGRPcmRlckJ5UmVzb3VyY2UoKTsKLQkJCX0KLQkJCWdldE9yZGVyQnlSZXNvdXJjZSgpLnNldFZhbHVlKG5ld09yZGVyQnkpOwotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLk9SREVSX0JZX1BST1BFUlRZLCBvbGRPcmRlckJ5LCBuZXdPcmRlckJ5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3JkZXJCeV8oU3RyaW5nIG5ld09yZGVyQnkpIHsKLQkJU3RyaW5nIG9sZE9yZGVyQnkgPSB0aGlzLm9yZGVyQnk7Ci0JCXRoaXMub3JkZXJCeSA9IG5ld09yZGVyQnk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLk9SREVSX0JZX1BST1BFUlRZLCBvbGRPcmRlckJ5LCBuZXdPcmRlckJ5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9yZGVyQnlBbm5vdGF0aW9uIGdldE9yZGVyQnlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChPcmRlckJ5QW5ub3RhdGlvbikgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JkZXJCeUFubm90YXRpb24gYWRkT3JkZXJCeVJlc291cmNlKCkgewotCQlyZXR1cm4gKE9yZGVyQnlBbm5vdGF0aW9uKSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU9yZGVyQnlSZXNvdXJjZSgpIHsKLQkJZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc05vT3JkZXJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmlzTm9PcmRlcmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb09yZGVyaW5nKGJvb2xlYW4gbmV3Tm9PcmRlcmluZykgewotCQlib29sZWFuIG9sZE5vT3JkZXJpbmcgPSB0aGlzLmlzTm9PcmRlcmluZzsKLQkJdGhpcy5pc05vT3JkZXJpbmcgPSBuZXdOb09yZGVyaW5nOwotCQlpZiAobmV3Tm9PcmRlcmluZykgewotCQkJaWYgKGdldE9yZGVyQnlSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlyZW1vdmVPcmRlckJ5UmVzb3VyY2UoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vPz8KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5PX09SREVSSU5HX1BST1BFUlRZLCBvbGROb09yZGVyaW5nLCBuZXdOb09yZGVyaW5nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Tm9PcmRlcmluZ18oYm9vbGVhbiBuZXdOb09yZGVyaW5nKSB7Ci0JCWJvb2xlYW4gb2xkTm9PcmRlcmluZyA9IHRoaXMuaXNOb09yZGVyaW5nOwotCQl0aGlzLmlzTm9PcmRlcmluZyA9IG5ld05vT3JkZXJpbmc7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9fT1JERVJJTkdfUFJPUEVSVFksIG9sZE5vT3JkZXJpbmcsIG5ld05vT3JkZXJpbmcpOwkJCQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGtPcmRlcmluZygpIHsKLQkJcmV0dXJuIHRoaXMuaXNQa09yZGVyaW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQa09yZGVyaW5nKGJvb2xlYW4gbmV3UGtPcmRlcmluZykgewotCQlib29sZWFuIG9sZFBrT3JkZXJpbmcgPSB0aGlzLmlzUGtPcmRlcmluZzsKLQkJdGhpcy5pc1BrT3JkZXJpbmcgPSBuZXdQa09yZGVyaW5nOwotCQlpZiAobmV3UGtPcmRlcmluZykgewotCQkJaWYgKGdldE9yZGVyQnlSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQlhZGRPcmRlckJ5UmVzb3VyY2UoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdldE9yZGVyQnlSZXNvdXJjZSgpLnNldFZhbHVlKG51bGwpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEtfT1JERVJJTkdfUFJPUEVSVFksIG9sZFBrT3JkZXJpbmcsIG5ld1BrT3JkZXJpbmcpOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGtPcmRlcmluZ18oYm9vbGVhbiBuZXdQa09yZGVyaW5nKSB7Ci0JCWJvb2xlYW4gb2xkUGtPcmRlcmluZyA9IHRoaXMuaXNQa09yZGVyaW5nOwotCQl0aGlzLmlzUGtPcmRlcmluZyA9IG5ld1BrT3JkZXJpbmc7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEtfT1JERVJJTkdfUFJPUEVSVFksIG9sZFBrT3JkZXJpbmcsIG5ld1BrT3JkZXJpbmcpOwkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0N1c3RvbU9yZGVyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5pc0N1c3RvbU9yZGVyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1c3RvbU9yZGVyaW5nKGJvb2xlYW4gbmV3Q3VzdG9tT3JkZXJpbmcpIHsKLQkJYm9vbGVhbiBvbGRDdXN0b21PcmRlcmluZyA9IHRoaXMuaXNDdXN0b21PcmRlcmluZzsKLQkJdGhpcy5pc0N1c3RvbU9yZGVyaW5nID0gbmV3Q3VzdG9tT3JkZXJpbmc7Ci0JCWlmIChuZXdDdXN0b21PcmRlcmluZykgewotCQkJc2V0T3JkZXJCeSgiIik7Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDVVNUT01fT1JERVJJTkdfUFJPUEVSVFksIG9sZEN1c3RvbU9yZGVyaW5nLCBuZXdDdXN0b21PcmRlcmluZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbU9yZGVyaW5nXyhib29sZWFuIG5ld0N1c3RvbU9yZGVyaW5nKSB7Ci0JCWJvb2xlYW4gb2xkQ3VzdG9tT3JkZXJpbmcgPSB0aGlzLmlzQ3VzdG9tT3JkZXJpbmc7Ci0JCXRoaXMuaXNDdXN0b21PcmRlcmluZyA9IG5ld0N1c3RvbU9yZGVyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9PUkRFUklOR19QUk9QRVJUWSwgb2xkQ3VzdG9tT3JkZXJpbmcsIG5ld0N1c3RvbU9yZGVyaW5nKTsKLQl9Ci0JCi0JcHVibGljIEZldGNoVHlwZSBnZXREZWZhdWx0RmV0Y2goKSB7Ci0JCXJldHVybiBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuREVGQVVMVF9GRVRDSF9UWVBFOwotCX0KLQotCXB1YmxpYyBKYXZhSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSm9pblRhYmxlU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gZ2V0Sm9pblRhYmxlKCkuaXNTcGVjaWZpZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aW9uc2hpcE93bmVyKCkgewotCQlyZXR1cm4gZ2V0TWFwcGVkQnkoKSA9PSBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcEtleSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwS2V5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcEtleShTdHJpbmcgbmV3TWFwS2V5KSB7Ci0JCVN0cmluZyBvbGRNYXBLZXkgPSB0aGlzLm1hcEtleTsKLQkJdGhpcy5tYXBLZXkgPSBuZXdNYXBLZXk7Ci0JCWlmIChvbGRNYXBLZXkgIT0gbmV3TWFwS2V5KSB7Ci0JCQlpZiAodGhpcy5nZXRNYXBLZXlSZXNvdXJjZShnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkgIT0gbnVsbCkgewotCQkJCWlmIChuZXdNYXBLZXkgIT0gbnVsbCkgewotCQkJCQl0aGlzLmdldE1hcEtleVJlc291cmNlKGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKS5zZXROYW1lKG5ld01hcEtleSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQkJCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3TWFwS2V5ICE9IG51bGwpIHsKLQkJCQlnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCQlnZXRNYXBLZXlSZXNvdXJjZShnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkuc2V0TmFtZShuZXdNYXBLZXkpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLk1BUF9LRVlfUFJPUEVSVFksIG9sZE1hcEtleSwgbmV3TWFwS2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBLZXlfKFN0cmluZyBuZXdNYXBLZXkpIHsKLQkJU3RyaW5nIG9sZE1hcEtleSA9IHRoaXMubWFwS2V5OwotCQl0aGlzLm1hcEtleSA9IG5ld01hcEtleTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuTUFQX0tFWV9QUk9QRVJUWSwgb2xkTWFwS2V5LCBuZXdNYXBLZXkpOwotCX0KLQotLy9UT0RPIGRlZmF1bHQgb3JkZXJCeSAtIHRoaXMgd2Fzbid0IHN1cHBvcnRlZCBpbiAxLjAgZWl0aGVyCi0vLwlwdWJsaWMgdm9pZCByZWZyZXNoRGVmYXVsdHMoRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotLy8JCXN1cGVyLnJlZnJlc2hEZWZhdWx0cyhkZWZhdWx0c0NvbnRleHQpOwotLy8JCS8vCQlpZiAoaXNPcmRlckJ5UGsoKSkgewotLy8JCS8vCQkJcmVmcmVzaERlZmF1bHRPcmRlckJ5KGRlZmF1bHRzQ29udGV4dCk7Ci0vLwkJLy8JCX0KLS8vCX0KLS8vCi0vLwkvL3ByaW1hcnkga2V5IG9yZGVyaW5nIHdoZW4ganVzdCB0aGUgQE9yZGVyQnkgYW5ub3RhdGlvbiBpcyBwcmVzZW50Ci0vLwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRGVmYXVsdE9yZGVyQnkoRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotLy8JCUlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLS8vCQlpZiAodGFyZ2V0RW50aXR5ICE9IG51bGwpIHsKLS8vCQkJc2V0T3JkZXJCeSh0YXJnZXRFbnRpdHkucHJpbWFyeUtleUF0dHJpYnV0ZU5hbWUoKSArICIgQVNDIik7Ci0vLwkJfQotLy8JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFyZ2V0RW50aXR5KEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCWlmICghcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnR5cGVJc0NvbnRhaW5lcigpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFwS2V5TmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKGdldE1hcEtleVJlc291cmNlKGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0TWFwS2V5UmVzb3VyY2UoZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpLm5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgTWFwS2V5QW5ub3RhdGlvbiBnZXRNYXBLZXlSZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBLZXlOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuYWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTmFtZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBLZXlOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHF1b3RlZENhbmRpZGF0ZU1hcEtleU5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMucXVvdGUodGhpcy5jYW5kaWRhdGVNYXBLZXlOYW1lcyhmaWx0ZXIpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5nZXRKb2luVGFibGUoKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5tYXBwZWRCeVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIHRoaXMucXVvdGVkQ2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcyhmaWx0ZXIpOwotCQl9Ci0JCWlmICh0aGlzLm1hcEtleU5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZU1hcEtleU5hbWVzKGZpbHRlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IHRoaXMuZ2V0TWFwS2V5UmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKG1hcEtleSAhPSBudWxsKSB7Ci0JCQl0aGlzLm1hcEtleSA9IG1hcEtleS5nZXROYW1lKCk7Ci0JCX0KLQkJdGhpcy5pbml0aWFsaXplT3JkZXJCeSh0aGlzLmdldE9yZGVyQnlSZXNvdXJjZSgpKTsKLQkJdGhpcy5qb2luVGFibGUuaW5pdGlhbGl6ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFQgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplKHJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLm1hcHBlZEJ5ID0gdGhpcy5tYXBwZWRCeShyZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9yZGVyQnkoT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSkgewotCQlpZiAob3JkZXJCeSAhPSBudWxsKSB7Ci0JCQl0aGlzLm9yZGVyQnkgPSBvcmRlckJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAob3JkZXJCeS5nZXRWYWx1ZSgpID09IG51bGwpIHsKLQkJCQl0aGlzLmlzUGtPcmRlcmluZyA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmlzQ3VzdG9tT3JkZXJpbmcgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5pc05vT3JkZXJpbmcgPSB0cnVlOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlzdXBlci51cGRhdGUocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy51cGRhdGVNYXBLZXkocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy51cGRhdGVPcmRlckJ5KHRoaXMuZ2V0T3JkZXJCeVJlc291cmNlKCkpOwotCQl0aGlzLmpvaW5UYWJsZS51cGRhdGUocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShUIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJc3VwZXIudXBkYXRlKHJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLnNldE1hcHBlZEJ5Xyh0aGlzLm1hcHBlZEJ5KHJlbGF0aW9uc2hpcE1hcHBpbmcpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWFwS2V5KEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gdGhpcy5nZXRNYXBLZXlSZXNvdXJjZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlpZiAobWFwS2V5ICE9IG51bGwpIHsKLQkJCXNldE1hcEtleV8obWFwS2V5LmdldE5hbWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRNYXBLZXlfKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9yZGVyQnkoT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSkgewotCQlpZiAob3JkZXJCeSAhPSBudWxsKSB7Ci0JCQlzZXRPcmRlckJ5XyhvcmRlckJ5LmdldFZhbHVlKCkpOwotCQkJaWYgKG9yZGVyQnkuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0JCQkJc2V0UGtPcmRlcmluZ18odHJ1ZSk7Ci0JCQkJc2V0Q3VzdG9tT3JkZXJpbmdfKGZhbHNlKTsKLQkJCQlzZXROb09yZGVyaW5nXyhmYWxzZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRQa09yZGVyaW5nXyhmYWxzZSk7Ci0JCQkJc2V0Q3VzdG9tT3JkZXJpbmdfKHRydWUpOwotCQkJCXNldE5vT3JkZXJpbmdfKGZhbHNlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldE9yZGVyQnlfKG51bGwpOwotCQkJc2V0UGtPcmRlcmluZ18oZmFsc2UpOwotCQkJc2V0Q3VzdG9tT3JkZXJpbmdfKGZhbHNlKTsKLQkJCXNldE5vT3JkZXJpbmdfKHRydWUpOwotCQl9Ci0JfQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgbWFwcGVkQnkoVCByZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQotCS8vKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBhYnN0cmFjdCBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQkKLQkJaWYgKGVudGl0eU93bmVkKCkgJiYgKHRoaXMuaXNKb2luVGFibGVTcGVjaWZpZWQoKSB8fCBpc1JlbGF0aW9uc2hpcE93bmVyKCkpKSB7Ci0JCQlnZXRKb2luVGFibGUoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJfQotCQlpZiAodGhpcy5nZXRNYXBwZWRCeSgpICE9IG51bGwpIHsKLQkJCWFkZE1hcHBlZEJ5TWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1hcHBlZEJ5TWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZyBtYXBwZWRCeSA9IHRoaXMuZ2V0TWFwcGVkQnkoKTsKLQkJCi0JCWlmICh0aGlzLmlzSm9pblRhYmxlU3BlY2lmaWVkKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfTUFQUEVEX0JZX1dJVEhfSk9JTl9UQUJMRSwKLQkJCQkJCXRoaXMuZ2V0Sm9pblRhYmxlKCksIAotCQkJCQkJdGhpcy5nZXRKb2luVGFibGUoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCSk7Ci0JCQkJCQkKLQkJfQotCQkKLQkJRW50aXR5IHRhcmdldEVudGl0eSA9IHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJCi0JCWlmICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgewotCQkJLy8gYWxyZWFkeSBoYXZlIHZhbGlkYXRpb24gbWVzc2FnZXMgZm9yIHRoYXQKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSB0YXJnZXRFbnRpdHkuZ2V0UGVyc2lzdGVudFR5cGUoKS5yZXNvbHZlQXR0cmlidXRlKG1hcHBlZEJ5KTsKLQkJCi0JCWlmIChhdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19VTlJFU09MVkVEX01BUFBFRF9CWSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwcGVkQnl9LCAKLQkJCQkJCXRoaXMsIAotCQkJCQkJdGhpcy5nZXRNYXBwZWRCeVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoISB0aGlzLm1hcHBlZEJ5SXNWYWxpZChhdHRyaWJ1dGUuZ2V0TWFwcGluZygpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19JTlZBTElEX01BUFBFRF9CWSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwcGVkQnl9LCAKLQkJCQkJCXRoaXMsIAotCQkJCQkJdGhpcy5nZXRNYXBwZWRCeVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlOb25Pd25pbmdNYXBwaW5nIG1hcHBlZEJ5TWFwcGluZzsKLQkJdHJ5IHsKLQkJCW1hcHBlZEJ5TWFwcGluZyA9IChOb25Pd25pbmdNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKSB7Ci0JCQkvLyB0aGVyZSBpcyBubyBlcnJvciB0aGVuCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChtYXBwZWRCeU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX01BUFBFRF9CWV9PTl9CT1RIX1NJREVTLAotCQkJCQkJdGhpcywgCi0JCQkJCQl0aGlzLmdldE1hcHBlZEJ5VGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU5hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU5hbWVkQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDk1YjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFOYW1lZENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZENvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW48VCBleHRlbmRzIE5hbWVkQ29sdW1uQW5ub3RhdGlvbj4gZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YU5hbWVkQ29sdW1uCi17Ci0KLQlwcm90ZWN0ZWQgT3duZXIgb3duZXI7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbjsKLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFOYW1lZENvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JfQotCi0JLy8gKioqKioqKioqKioqKioqKioqKiBpbml0aWFsaXphdGlvbiBmcm9tIGphdmEgcmVzb3VyY2UgbW9kZWwgKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFQgY29sdW1uKSB7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IGNvbHVtbi5nZXROYW1lKCk7Ci0JCXRoaXMuZGVmYXVsdE5hbWUgPSB0aGlzLmRlZmF1bHROYW1lKCk7Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCk7CQotCX0KLQkKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBUIGdldENvbHVtblJlc291cmNlKCk7Ci0KLQkKLQkvLyoqKioqKioqKioqKioqIElOYW1lZENvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsKSA/IGdldERlZmF1bHROYW1lKCkgOiB0aGlzLmdldFNwZWNpZmllZE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkTmFtZSA9IHRoaXMuc3BlY2lmaWVkTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gbmV3U3BlY2lmaWVkTmFtZTsKLQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXROYW1lKG5ld1NwZWNpZmllZE5hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5hbWVkQ29sdW1uLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWROYW1lLCBuZXdTcGVjaWZpZWROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCi0JICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKLQkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCi0JICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkTmFtZSA9IHRoaXMuc3BlY2lmaWVkTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gbmV3U3BlY2lmaWVkTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTmFtZSwgbmV3U3BlY2lmaWVkTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE5hbWUoU3RyaW5nIG5ld0RlZmF1bHROYW1lKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0TmFtZSA9IHRoaXMuZGVmYXVsdE5hbWU7Ci0JCXRoaXMuZGVmYXVsdE5hbWUgPSBuZXdEZWZhdWx0TmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOYW1lZENvbHVtbi5ERUZBVUxUX05BTUVfUFJPUEVSVFksIG9sZERlZmF1bHROYW1lLCBuZXdEZWZhdWx0TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5EZWZpbml0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyBuZXdDb2x1bW5EZWZpbml0aW9uKSB7Ci0JCVN0cmluZyBvbGRDb2x1bW5EZWZpbml0aW9uID0gdGhpcy5jb2x1bW5EZWZpbml0aW9uOwotCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gPSBuZXdDb2x1bW5EZWZpbml0aW9uOwotCQlnZXRDb2x1bW5SZXNvdXJjZSgpLnNldENvbHVtbkRlZmluaXRpb24obmV3Q29sdW1uRGVmaW5pdGlvbik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTmFtZWRDb2x1bW4uQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFksIG9sZENvbHVtbkRlZmluaXRpb24sIG5ld0NvbHVtbkRlZmluaXRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KLQkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQotCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KLQkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldENvbHVtbkRlZmluaXRpb25fKFN0cmluZyBuZXdDb2x1bW5EZWZpbml0aW9uKSB7Ci0JCVN0cmluZyBvbGRDb2x1bW5EZWZpbml0aW9uID0gdGhpcy5jb2x1bW5EZWZpbml0aW9uOwotCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gPSBuZXdDb2x1bW5EZWZpbml0aW9uOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5hbWVkQ29sdW1uLkNPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZLCBvbGRDb2x1bW5EZWZpbml0aW9uLCBuZXdDb2x1bW5EZWZpbml0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgT3duZXIgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRPd25lcigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgQ29sdW1uIGdldERiQ29sdW1uKCkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGJUYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlID09IG51bGwpID8gbnVsbCA6IHRhYmxlLmdldENvbHVtbk5hbWVkKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0RGJUYWJsZSh0aGlzLmdldFRhYmxlTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbHVtbidzIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VGFibGVOYW1lKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYkNvbHVtbigpICE9IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29ubmVjdGVkSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmNvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWlmICh0aGlzLm5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZU5hbWVzKGZpbHRlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZU5hbWVzKCkgewotCQlUYWJsZSBkYlRhYmxlID0gdGhpcy5nZXREYlRhYmxlKCk7Ci0JCXJldHVybiAoZGJUYWJsZSAhPSBudWxsKSA/IGRiVGFibGUuY29sdW1uTmFtZXMoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz4gaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlTmFtZXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGVkQ2FuZGlkYXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZU5hbWVzKGZpbHRlcikpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKioqKiB1cGRhdGUgZnJvbSBqYXZhIHJlc291cmNlIG1vZGVsICoqKioqKioqKioqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoVCBjb2x1bW4pIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWROYW1lXyhjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0TmFtZSh0aGlzLmRlZmF1bHROYW1lKCkpOwotCQl0aGlzLnNldENvbHVtbkRlZmluaXRpb25fKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgY29sdW1uIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIoKS5nZXREZWZhdWx0Q29sdW1uTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFPdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzFhMzU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhT3ZlcnJpZGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIEJhc2VPdmVycmlkZQotewotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JcHJvdGVjdGVkIGZpbmFsIE93bmVyIG93bmVyOwotCi0JcHJvdGVjdGVkIE92ZXJyaWRlQW5ub3RhdGlvbiBvdmVycmlkZVJlc291cmNlOwotCQotCXB1YmxpYyBBYnN0cmFjdEphdmFPdmVycmlkZShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoT3ZlcnJpZGVBbm5vdGF0aW9uIG92ZXJyaWRlUmVzb3VyY2UpIHsKLQkJdGhpcy5vdmVycmlkZVJlc291cmNlID0gb3ZlcnJpZGVSZXNvdXJjZTsKLQkJdGhpcy5uYW1lID0gdGhpcy5uYW1lKG92ZXJyaWRlUmVzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCBPdmVycmlkZUFubm90YXRpb24gZ2V0T3ZlcnJpZGVSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGVSZXNvdXJjZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMub3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoT3ZlcnJpZGVBbm5vdGF0aW9uIG92ZXJyaWRlUmVzb3VyY2UpIHsKLQkJdGhpcy5vdmVycmlkZVJlc291cmNlID0gb3ZlcnJpZGVSZXNvdXJjZTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLm5hbWUob3ZlcnJpZGVSZXNvdXJjZSkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZShPdmVycmlkZUFubm90YXRpb24gb3ZlcnJpZGVSZXNvdXJjZSkgewotCQlyZXR1cm4gb3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5pc1ZpcnR1YWwodGhpcyk7Ci0JfQotCi0JcHVibGljIEJhc2VPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5zZXRWaXJ0dWFsKHZpcnR1YWwsIHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgT3duZXIgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUpwYUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhSnBhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZU5hbWVzKCk7Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlTmFtZXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGVkQ2FuZGlkYXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZU5hbWVzKGZpbHRlcikpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gdGhpcy5xdW90ZWRDYW5kaWRhdGVOYW1lcyhmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5vdmVycmlkZVJlc291cmNlLm5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5vdmVycmlkZVJlc291cmNlLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwODU5MTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgCi0JaW1wbGVtZW50cyBKYXZhUXVlcnkKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5OwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YVF1ZXJ5SGludD4gaGludHM7Ci0KLQlwcm90ZWN0ZWQgUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5QW5ub3RhdGlvbjsKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhUXVlcnkoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmhpbnRzID0gbmV3IEFycmF5TGlzdDxKYXZhUXVlcnlIaW50PigpOwotCX0KLQotCXByb3RlY3RlZCBRdWVyeUFubm90YXRpb24gZ2V0UXVlcnlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlBbm5vdGF0aW9uOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5xdWVyeUFubm90YXRpb24uc2V0TmFtZShuZXdOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChRdWVyeS5OQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUXVlcnkuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeSgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIG5ld1F1ZXJ5KSB7Ci0JCVN0cmluZyBvbGRRdWVyeSA9IHRoaXMucXVlcnk7Ci0JCXRoaXMucXVlcnkgPSBuZXdRdWVyeTsKLQkJdGhpcy5xdWVyeUFubm90YXRpb24uc2V0UXVlcnkobmV3UXVlcnkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFF1ZXJ5LlFVRVJZX1BST1BFUlRZLCBvbGRRdWVyeSwgbmV3UXVlcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRRdWVyeV8oU3RyaW5nIG5ld1F1ZXJ5KSB7Ci0JCVN0cmluZyBvbGRRdWVyeSA9IHRoaXMucXVlcnk7Ci0JCXRoaXMucXVlcnkgPSBuZXdRdWVyeTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChRdWVyeS5RVUVSWV9QUk9QRVJUWSwgb2xkUXVlcnksIG5ld1F1ZXJ5KTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFRdWVyeUhpbnQ+IGhpbnRzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFRdWVyeUhpbnQ+KHRoaXMuaGludHMpOwotCX0KLQotCXB1YmxpYyBpbnQgaGludHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5oaW50cy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhUXVlcnlIaW50IGFkZEhpbnQoaW50IGluZGV4KSB7Ci0JCUphdmFRdWVyeUhpbnQgaGludCA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFRdWVyeUhpbnQodGhpcyk7Ci0JCXRoaXMuaGludHMuYWRkKGluZGV4LCBoaW50KTsKLQkJdGhpcy5nZXRRdWVyeVJlc291cmNlKCkuYWRkSGludChpbmRleCk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChRdWVyeS5ISU5UU19MSVNULCBpbmRleCwgaGludCk7Ci0JCXJldHVybiBoaW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEhpbnQoaW50IGluZGV4LCBKYXZhUXVlcnlIaW50IGhpbnQpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgaGludCwgdGhpcy5oaW50cywgUXVlcnkuSElOVFNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUhpbnQoUXVlcnlIaW50IHF1ZXJ5SGludCkgewotCQlyZW1vdmVIaW50KHRoaXMuaGludHMuaW5kZXhPZihxdWVyeUhpbnQpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlSGludChpbnQgaW5kZXgpIHsKLQkJSmF2YVF1ZXJ5SGludCByZW1vdmVkSGludCA9IHRoaXMuaGludHMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5nZXRRdWVyeVJlc291cmNlKCkucmVtb3ZlSGludChpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChRdWVyeS5ISU5UU19MSVNULCBpbmRleCwgcmVtb3ZlZEhpbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVIaW50XyhKYXZhUXVlcnlIaW50IGhpbnQpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGhpbnQsIHRoaXMuaGludHMsIFF1ZXJ5LkhJTlRTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlSGludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmhpbnRzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFF1ZXJ5UmVzb3VyY2UoKS5tb3ZlSGludCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKFF1ZXJ5LkhJTlRTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShRdWVyeUFubm90YXRpb24gcXVlcnlBbm5vdGF0aW9uKSB7Ci0JCXRoaXMucXVlcnlBbm5vdGF0aW9uID0gcXVlcnlBbm5vdGF0aW9uOwotCQl0aGlzLm5hbWUgPSBxdWVyeUFubm90YXRpb24uZ2V0TmFtZSgpOwotCQl0aGlzLnF1ZXJ5ID0gcXVlcnlBbm5vdGF0aW9uLmdldFF1ZXJ5KCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVF1ZXJ5SGludHMocXVlcnlBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5QW5ub3RhdGlvbikgewotCQl0aGlzLnF1ZXJ5QW5ub3RhdGlvbiA9IHF1ZXJ5QW5ub3RhdGlvbjsKLQkJdGhpcy5zZXROYW1lXyhxdWVyeUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJdGhpcy5zZXRRdWVyeV8ocXVlcnlBbm5vdGF0aW9uLmdldFF1ZXJ5KCkpOwotCQl0aGlzLnVwZGF0ZVF1ZXJ5SGludHMocXVlcnlBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUXVlcnlIaW50cyhRdWVyeUFubm90YXRpb24gcXVlcnlSZXNvdXJjZSkgewotCQlMaXN0SXRlcmF0b3I8UXVlcnlIaW50QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBxdWVyeVJlc291cmNlLmhpbnRzKCk7Ci0JCQotCQl3aGlsZShhbm5vdGF0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMuaGludHMuYWRkKGNyZWF0ZVF1ZXJ5SGludChhbm5vdGF0aW9ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVRdWVyeUhpbnRzKFF1ZXJ5QW5ub3RhdGlvbiBxdWVyeVJlc291cmNlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUXVlcnlIaW50PiBoaW50cyA9IGhpbnRzKCk7Ci0JCUxpc3RJdGVyYXRvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPiByZXNvdXJjZUhpbnRzID0gcXVlcnlSZXNvdXJjZS5oaW50cygpOwotCQkKLQkJd2hpbGUgKGhpbnRzLmhhc05leHQoKSkgewotCQkJSmF2YVF1ZXJ5SGludCBoaW50ID0gaGludHMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlSGludHMuaGFzTmV4dCgpKSB7Ci0JCQkJaGludC51cGRhdGUocmVzb3VyY2VIaW50cy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlSGludF8oaGludCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZUhpbnRzLmhhc05leHQoKSkgewotCQkJYWRkSGludChoaW50c1NpemUoKSwgY3JlYXRlUXVlcnlIaW50KHJlc291cmNlSGludHMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVF1ZXJ5SGludCBjcmVhdGVRdWVyeUhpbnQoUXVlcnlIaW50QW5ub3RhdGlvbiBoaW50UmVzb3VyY2UpIHsKLQkJSmF2YVF1ZXJ5SGludCBxdWVyeUhpbnQgPSAgZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVF1ZXJ5SGludCh0aGlzKTsKLQkJcXVlcnlIaW50LmluaXRpYWxpemUoaGludFJlc291cmNlKTsKLQkJcmV0dXJuIHF1ZXJ5SGludDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlBbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5QW5ub3RhdGlvbi5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXMoUXVlcnkgcXVlcnkpIHsKLQkJLy8gamF2YSBpcyBhdCB0aGUgYmFzZSBvZiB0aGUgdHJlZQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3NDZjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nPFQgZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbj4gZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPFQ+Ci0JaW1wbGVtZW50cyBKYXZhUmVsYXRpb25zaGlwTWFwcGluZwotewotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYXJnZXRFbnRpdHk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYXJnZXRFbnRpdHk7Ci0KLQlwcm90ZWN0ZWQgRW50aXR5IHJlc29sdmVkVGFyZ2V0RW50aXR5OwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFDYXNjYWRlIGNhc2NhZGU7Ci0JCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaDsKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jYXNjYWRlID0gbmV3IEphdmFDYXNjYWRlKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpIDogdGhpcy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFRhcmdldEVudGl0eShTdHJpbmcgbmV3U3BlY2lmaWVkVGFyZ2V0RW50aXR5KSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRUYXJnZXRFbnRpdHkgPSB0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eTsKLQkJdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHkgPSBuZXdTcGVjaWZpZWRUYXJnZXRFbnRpdHk7Ci0JCXRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkuc2V0VGFyZ2V0RW50aXR5KG5ld1NwZWNpZmllZFRhcmdldEVudGl0eSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUmVsYXRpb25zaGlwTWFwcGluZy5TUEVDSUZJRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVGFyZ2V0RW50aXR5LCBuZXdTcGVjaWZpZWRUYXJnZXRFbnRpdHkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHlfKFN0cmluZyBuZXdTcGVjaWZpZWRUYXJnZXRFbnRpdHkpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFRhcmdldEVudGl0eSA9IHRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5OwotCQl0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eSA9IG5ld1NwZWNpZmllZFRhcmdldEVudGl0eTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRUYXJnZXRFbnRpdHksIG5ld1NwZWNpZmllZFRhcmdldEVudGl0eSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUYXJnZXRFbnRpdHkoU3RyaW5nIG5ld0RlZmF1bHRUYXJnZXRFbnRpdHkpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRUYXJnZXRFbnRpdHkgPSB0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHk7Ci0JCXRoaXMuZGVmYXVsdFRhcmdldEVudGl0eSA9IG5ld0RlZmF1bHRUYXJnZXRFbnRpdHk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUmVsYXRpb25zaGlwTWFwcGluZy5ERUZBVUxUX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFksIG9sZERlZmF1bHRUYXJnZXRFbnRpdHksIG5ld0RlZmF1bHRUYXJnZXRFbnRpdHkpOwotCX0KLQotCXB1YmxpYyBFbnRpdHkgZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFJlc29sdmVkVGFyZ2V0RW50aXR5KEVudGl0eSBuZXdSZXNvbHZlZFRhcmdldEVudGl0eSkgewotCQlFbnRpdHkgb2xkUmVzb2x2ZWRUYXJnZXRFbnRpdHkgPSB0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5OwotCQl0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5ID0gbmV3UmVzb2x2ZWRUYXJnZXRFbnRpdHk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUmVsYXRpb25zaGlwTWFwcGluZy5SRVNPTFZFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGRSZXNvbHZlZFRhcmdldEVudGl0eSwgbmV3UmVzb2x2ZWRUYXJnZXRFbnRpdHkpOwotCX0KLQotCXB1YmxpYyBKYXZhQ2FzY2FkZSBnZXRDYXNjYWRlKCkgewotCQlyZXR1cm4gdGhpcy5jYXNjYWRlOwotCX0KLQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRGZXRjaCgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0RmV0Y2goKSA6IHRoaXMuZ2V0U3BlY2lmaWVkRmV0Y2goKTsKLQl9Ci0JCi0JcHVibGljIEZldGNoVHlwZSBnZXRTcGVjaWZpZWRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRmV0Y2g7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZSBuZXdTcGVjaWZpZWRGZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSB0aGlzLnNwZWNpZmllZEZldGNoOwotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gbmV3U3BlY2lmaWVkRmV0Y2g7Ci0JCXRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkuc2V0RmV0Y2goRmV0Y2hUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRmV0Y2gpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGRGZXRjaCwgbmV3U3BlY2lmaWVkRmV0Y2gpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaF8oRmV0Y2hUeXBlIG5ld1NwZWNpZmllZEZldGNoKSB7Ci0JCUZldGNoVHlwZSBvbGRGZXRjaCA9IHRoaXMuc3BlY2lmaWVkRmV0Y2g7Ci0JCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSBuZXdTcGVjaWZpZWRGZXRjaDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGRGZXRjaCwgbmV3U3BlY2lmaWVkRmV0Y2gpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5ID0gdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5KHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXN1cGVyLmluaXRpYWxpemUocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXRoaXMuc2V0RGVmYXVsdFRhcmdldEVudGl0eSh0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHkocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSk7Ci0JCXN1cGVyLnVwZGF0ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFQgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gdGhpcy5mZXRjaChyZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJdGhpcy5jYXNjYWRlLmluaXRpYWxpemUocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0gdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHkocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMucmVzb2x2ZWRUYXJnZXRFbnRpdHkgPSB0aGlzLnJlc29sdmVUYXJnZXRFbnRpdHkocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKFQgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQlzdXBlci51cGRhdGUocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRmV0Y2hfKHRoaXMuZmV0Y2gocmVsYXRpb25zaGlwTWFwcGluZykpOwotCQl0aGlzLmNhc2NhZGUudXBkYXRlKHJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLnNldFNwZWNpZmllZFRhcmdldEVudGl0eV8odGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHkocmVsYXRpb25zaGlwTWFwcGluZykpOwotCQl0aGlzLnNldFJlc29sdmVkVGFyZ2V0RW50aXR5KHRoaXMucmVzb2x2ZVRhcmdldEVudGl0eShyZWxhdGlvbnNoaXBNYXBwaW5nKSk7Ci0JfQotCQotCXByb3RlY3RlZCBGZXRjaFR5cGUgZmV0Y2goVCByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXJldHVybiBGZXRjaFR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVGFyZ2V0RW50aXR5KFQgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQlyZXR1cm4gcmVsYXRpb25zaGlwTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkZWZhdWx0VGFyZ2V0RW50aXR5KEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkKLQlwcm90ZWN0ZWQgRW50aXR5IHJlc29sdmVUYXJnZXRFbnRpdHkoVCByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCVN0cmluZyBxdWFsaWZpZWRUYXJnZXRFbnRpdHkgPSBnZXREZWZhdWx0VGFyZ2V0RW50aXR5KCk7Ci0JCWlmIChnZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSAhPSBudWxsKSB7Ci0JCQlxdWFsaWZpZWRUYXJnZXRFbnRpdHkgPSByZWxhdGlvbnNoaXBNYXBwaW5nLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQkJaWYgKHF1YWxpZmllZFRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKHF1YWxpZmllZFRhcmdldEVudGl0eSk7Ci0JCWlmIChwZXJzaXN0ZW50VHlwZSAhPSBudWxsICYmIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSkgewotCQkJcmV0dXJuIChFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5IGdldEVudGl0eSgpIHsKLQkJaWYgKGdldFR5cGVNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCXJldHVybiAoRW50aXR5KSBnZXRUeXBlTWFwcGluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbFRhcmdldEVudGl0eUF0dHJpYnV0ZU5hbWVzKCkgewotCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPFN0cmluZz4gaW5zdGFuY2UoKSA6IHRhcmdldEVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZU5hbWVzKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuYWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTmFtZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBxdW90ZWRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMucXVvdGUodGhpcy5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKGZpbHRlcikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkOTdjMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk51bGxhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5SZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc8VCBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uPgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwTWFwcGluZzxUPiBpbXBsZW1lbnRzIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zOwotCi0JcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkT3B0aW9uYWw7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8SmF2YUpvaW5Db2x1bW4+KCk7Ci0JfQotCQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RGVmYXVsdEZldGNoKCkgewotCQlyZXR1cm4gU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5ERUZBVUxUX0ZFVENIX1RZUEU7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKiogSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucygpIDogdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Sm9pbkNvbHVtbihKYXZhSm9pbkNvbHVtbiBuZXdKb2luQ29sdW1uKSB7Ci0JCUphdmFKb2luQ29sdW1uIG9sZEpvaW5Db2x1bW4gPSB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOwotCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gbmV3Sm9pbkNvbHVtbjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLkRFRkFVTFRfSk9JTl9DT0xVTU4sIG9sZEpvaW5Db2x1bW4sIG5ld0pvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGRlZmF1bHRKb2luQ29sdW1ucygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRKb2luQ29sdW1uKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBkZWZhdWx0Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+KHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMpOwotCX0KLQotCXB1YmxpYyBpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICF0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJSmF2YUpvaW5Db2x1bW4gb2xkRGVmYXVsdEpvaW5Db2x1bW4gPSB0aGlzLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCWlmIChvbGREZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL251bGwgdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbm93IGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkJCS8vaWYgb25lIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBpcyBhbHJlYWR5IGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uLgotCQkJLy9SZW1vdmUgaXQgbm93IHNvIHRoYXQgaXQgZG9lc24ndCBnZXQgcmVtb3ZlZCBkdXJpbmcgYW4gdXBkYXRlIGFuZAotCQkJLy9jYXVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBzZW50IHRvIHRoZSBVSSBpbiB0aGUgd3Jvbmcgb3JkZXIKLQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBudWxsOwotCQl9Ci0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhSm9pbkNvbHVtbih0aGlzLCBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSk7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuYWRkKGluZGV4LCBqb2luQ29sdW1uKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtblJlc291cmNlID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKGluZGV4LCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luQ29sdW1uLmluaXRpYWxpemUoam9pbkNvbHVtblJlc291cmNlKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgam9pbkNvbHVtbik7Ci0JCWlmIChvbGREZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5ERUZBVUxUX0pPSU5fQ09MVU1OLCBvbGREZWZhdWx0Sm9pbkNvbHVtbiwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmluZGV4T2Yoam9pbkNvbHVtbikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlKYXZhSm9pbkNvbHVtbiByZW1vdmVkSm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKLQkJaWYgKCFjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpIHsKLQkJCS8vY3JlYXRlIHRoZSBkZWZhdWx0Sm9pbkNvbHVtbiBub3cgb3IgdGhpcyB3aWxsIGhhcHBlbiBkdXJpbmcgcHJvamVjdCB1cGRhdGUgCi0JCQkvL2FmdGVyIHJlbW92aW5nIHRoZSBqb2luIGNvbHVtbiBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4gVGhhdCBjYXVzZXMgcHJvYmxlbXMgCi0JCQkvL2luIHRoZSBVSSBiZWNhdXNlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBlbmQgdXAgaW4gdGhlIHdyb25nIG9yZGVyLgotCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IGJ1aWxkSm9pbkNvbHVtbihuZXcgTnVsbEpvaW5Db2x1bW4oZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpKTsKLQkJfQotCQlnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlmaXJlSXRlbVJlbW92ZWQoU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCByZW1vdmVkSm9pbkNvbHVtbik7Ci0JCWlmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIGEgZGVmYXVsdEpvaW5Db2x1bW4gd2FzIGNyZWF0ZWQgYWJvdmUKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLkRFRkFVTFRfSk9JTl9DT0xVTU4sIG51bGwsIHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4pOwkJCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uXyhKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZmlyZUl0ZW1Nb3ZlZChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgewotCQlyZXR1cm4gZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSA9PSBudWxsID8gZ2V0RGVmYXVsdE9wdGlvbmFsKCkgOiBnZXRTcGVjaWZpZWRPcHRpb25hbCgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiBOdWxsYWJsZS5ERUZBVUxUX09QVElPTkFMOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGRTcGVjaWZpZWRPcHRpb25hbCA9IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7Ci0JCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSBuZXdTcGVjaWZpZWRPcHRpb25hbDsKLQkJc2V0T3B0aW9uYWxPblJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkT3B0aW9uYWwpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE51bGxhYmxlLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkT3B0aW9uYWwsIG5ld1NwZWNpZmllZE9wdGlvbmFsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkT3B0aW9uYWxfKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGRTcGVjaWZpZWRPcHRpb25hbCA9IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7Ci0JCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSBuZXdTcGVjaWZpZWRPcHRpb25hbDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOdWxsYWJsZS5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIG9sZFNwZWNpZmllZE9wdGlvbmFsLCBuZXdTcGVjaWZpZWRPcHRpb25hbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0T3B0aW9uYWxPblJlc291cmNlTW9kZWwoQm9vbGVhbiBuZXdPcHRpb25hbCk7Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRKb2luQ29sdW1ucyhyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLmluaXRpYWxpemVEZWZhdWx0Sm9pbkNvbHVtbihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFQgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplKHJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gdGhpcy5zcGVjaWZpZWRPcHRpb25hbChyZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEpvaW5Db2x1bW5zKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBhbm5vdGF0aW9ucyA9IHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUoYW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmFkZChidWlsZEpvaW5Db2x1bW4oKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhbm5vdGF0aW9ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRCdWlsZERlZmF1bHRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gIWNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSAmJiBpc1JlbGF0aW9uc2hpcE93bmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0Sm9pbkNvbHVtbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBidWlsZEpvaW5Db2x1bW4obmV3IE51bGxKb2luQ29sdW1uKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkpOwotCX0JCi0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyLnVwZGF0ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4ocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKFQgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQlzdXBlci51cGRhdGUocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkT3B0aW9uYWxfKHRoaXMuc3BlY2lmaWVkT3B0aW9uYWwocmVsYXRpb25zaGlwTWFwcGluZykpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQm9vbGVhbiBzcGVjaWZpZWRPcHRpb25hbChUIHJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gcmVzb3VyY2VKb2luQ29sdW1ucyA9IHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUgKGpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJCWpvaW5Db2x1bW4udXBkYXRlKChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbl8oam9pbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSwgYnVpbGRKb2luQ29sdW1uKChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSkgewotCQkJc2V0RGVmYXVsdEpvaW5Db2x1bW4obnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGdldERlZmF1bHRKb2luQ29sdW1uKCkgPT0gbnVsbCkgewotCQkJdGhpcy5zZXREZWZhdWx0Sm9pbkNvbHVtbihidWlsZEpvaW5Db2x1bW4obmV3IE51bGxKb2luQ29sdW1uKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4udXBkYXRlKG5ldyBOdWxsSm9pbkNvbHVtbihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpKTsKLQkJfQotCX0JCi0KLQlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gYnVpbGRKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5SZXNvdXJjZSkgewotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUpvaW5Db2x1bW4odGhpcywgY3JlYXRlSm9pbkNvbHVtbk93bmVyKCkpOwotCQlqb2luQ29sdW1uLmluaXRpYWxpemUoam9pbkNvbHVtblJlc291cmNlKTsKLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCQotCS8qKgotCSAqIGVsaW1pbmF0ZSBhbnkgImNvbnRhaW5lciIgdHlwZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYXJnZXRFbnRpdHkoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJaWYgKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS50eXBlSXNDb250YWluZXIoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKEphdmFKb2luQ29sdW1uIGNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlyZXN1bHQgPSBjb2x1bW4uamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqIFZhbGlkYXRpb24gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJCi0JCWlmIChhZGRKb2luQ29sdW1uTWVzc2FnZXMoKSkgewotCQkJYWRkSm9pbkNvbHVtbk1lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQkvL2J1ZyAxOTIyODcgLSBkbyBub3Qgd2FudCBqb2luQ29sdW1uIHZhbGlkYXRpb24gZXJyb3JzIG9uIHRoZSBub24tb3duaW5nIHNpZGUKLQkvL29mIGEgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXAuICBUaGlzIGlzIGEgbG93IHJpc2sgZml4IGZvciBSQzMsIGJ1dCBhIGJldHRlcgotCS8vc29sdXRpb24gd291bGQgYmUgdG8gbm90IGhhdmUgdGhlIGRlZmF1bHQgam9pbkNvbHVtbnMgb24gdGhlIG5vbi1vd25pbmcgc2lkZS4KLQkvL1RoaXMgd291bGQgZml4IGFub3RoZXIgYnVnIHRoYXQgd2Ugc2hvdyBkZWZhdWx0IGpvaW5Db2x1bW5zIGluIHRoaXMgc2l0dWF0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIGFkZEpvaW5Db2x1bW5NZXNzYWdlcygpIHsKLQkJcmV0dXJuIChlbnRpdHlPd25lZCgpICYmIGlzUmVsYXRpb25zaGlwT3duZXIoKSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKb2luQ29sdW1uTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBzdHJlYW0gPSB0aGlzLmpvaW5Db2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3RyZWFtLm5leHQoKTsKLQkJCVN0cmluZyB0YWJsZSA9IGpvaW5Db2x1bW4uZ2V0VGFibGUoKTsKLQkJCWJvb2xlYW4gZG9Db250aW51ZSA9IGpvaW5Db2x1bW4uY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQkJCi0JCQlpZiAoZG9Db250aW51ZSAmJiB0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJam9pbkNvbHVtbiwgam9pbkNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYgKGRvQ29udGludWUgJiYgISBqb2luQ29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWpvaW5Db2x1bW4sIGpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQkJCi0JCQlpZiAoZG9Db250aW51ZSAmJiAhIGpvaW5Db2x1bW4uaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJam9pbkNvbHVtbiwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCQotCi0JcHVibGljIGNsYXNzIEpvaW5Db2x1bW5Pd25lciBpbXBsZW1lbnRzIEphdmFKb2luQ29sdW1uLk93bmVyCi0JewotCi0JCXB1YmxpYyBKb2luQ29sdW1uT3duZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGJ5IGRlZmF1bHQsIHRoZSBqb2luIGNvbHVtbiBpcyBpbiB0aGUgdHlwZSBtYXBwaW5nJ3MgcHJpbWFyeSB0YWJsZQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEVudGl0eSBnZXRUYXJnZXRFbnRpdHkoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpczsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIGpvaW4gY29sdW1uIGNhbiBiZSBvbiBhIHNlY29uZGFyeSB0YWJsZQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdGFibGVJc0FsbG93ZWQoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRUYXJnZXRFbnRpdHkoKTsKLQkJCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuam9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNGFjMmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk5hbWVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhVGFibGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIKLXsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDYXRhbG9nOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNjaGVtYTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWE7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhVGFibGUoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzID0gbmV3IEFycmF5TGlzdDxKYXZhVW5pcXVlQ29uc3RyYWludD4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUpwYUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhSnBhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgamF2YSB0YWJsZSByZXNvdXJjZSwgZG8gbm90IHJldHVybiBudWxsIGlmIHRoZSBqYXZhIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3QuCi0JICogVXNlIGEgbnVsbCByZXNvdXJjZSBvYmplY3QgaW5zdGVhZCBvZiBudWxsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBUYWJsZUFubm90YXRpb24gZ2V0VGFibGVSZXNvdXJjZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24gbmFtZSBvZiB0aGUgamF2YSB0YWJsZSByZXNvdXJjZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0TmFtZSgpIDogdGhpcy5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7Ci0JCWdldFRhYmxlUmVzb3VyY2UoKS5zZXROYW1lKG5ld1NwZWNpZmllZE5hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWROYW1lLCBuZXdTcGVjaWZpZWROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCi0JICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKLQkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCi0JICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkTmFtZSA9IHRoaXMuc3BlY2lmaWVkTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gbmV3U3BlY2lmaWVkTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTmFtZSwgbmV3U3BlY2lmaWVkTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpID09IG51bGwpID8gZ2V0RGVmYXVsdENhdGFsb2coKSA6IHRoaXMuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyBuZXdTcGVjaWZpZWRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBuZXdTcGVjaWZpZWRDYXRhbG9nOwotCQlnZXRUYWJsZVJlc291cmNlKCkuc2V0Q2F0YWxvZyhuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ2F0YWxvZywgbmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JfQotCi0JLyoqCi0JICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCi0JICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKLQkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCi0JICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nXyhTdHJpbmcgbmV3U3BlY2lmaWVkQ2F0YWxvZykgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkQ2F0YWxvZyA9IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gbmV3U3BlY2lmaWVkQ2F0YWxvZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ2F0YWxvZywgbmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTY2hlbWEoKSA9PSBudWxsKSA/IGdldERlZmF1bHRTY2hlbWEoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyBuZXdTcGVjaWZpZWRTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFNjaGVtYSA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IG5ld1NwZWNpZmllZFNjaGVtYTsKLQkJZ2V0VGFibGVSZXNvdXJjZSgpLnNldFNjaGVtYShuZXdTcGVjaWZpZWRTY2hlbWEpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNjaGVtYSwgbmV3U3BlY2lmaWVkU2NoZW1hKTsKLQl9Ci0JCi0JLyoqCi0JICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCi0JICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKLQkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCi0JICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWFfKFN0cmluZyBuZXdTcGVjaWZpZWRTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFNjaGVtYSA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IG5ld1NwZWNpZmllZFNjaGVtYTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTY2hlbWEsIG5ld1NwZWNpZmllZFNjaGVtYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHVuaXF1ZSBjb25zdHJhaW50cyAqKioqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+KHRoaXMudW5pcXVlQ29uc3RyYWludHMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludHMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFVbmlxdWVDb25zdHJhaW50KHRoaXMsIHRoaXMpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZChpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7Ci0JCVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uID0gdGhpcy5nZXRUYWJsZVJlc291cmNlKCkuYWRkVW5pcXVlQ29uc3RyYWludChpbmRleCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnQuaW5pdGlhbGl6ZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbik7Ci0JCWZpcmVJdGVtQWRkZWQoVGFibGUuVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIGluZGV4LCB1bmlxdWVDb25zdHJhaW50KTsKLQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQl0aGlzLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQodGhpcy51bmlxdWVDb25zdHJhaW50cy5pbmRleE9mKHVuaXF1ZUNvbnN0cmFpbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlKYXZhVW5pcXVlQ29uc3RyYWludCByZW1vdmVkVW5pcXVlQ29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludHMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5nZXRUYWJsZVJlc291cmNlKCkucmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChUYWJsZS5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIHJlbW92ZWRVbmlxdWVDb25zdHJhaW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy51bmlxdWVDb25zdHJhaW50cywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5nZXRUYWJsZVJlc291cmNlKCkubW92ZVVuaXF1ZUNvbnN0cmFpbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChUYWJsZS5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCwgSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCB1bmlxdWVDb25zdHJhaW50LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCBUYWJsZS5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnRfKEphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KHVuaXF1ZUNvbnN0cmFpbnQsIHRoaXMudW5pcXVlQ29uc3RyYWludHMsIFRhYmxlLlVOSVFVRV9DT05TVFJBSU5UU19MSVNUKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRUYWJsZVJlc291cmNlKCkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldFRhYmxlUmVzb3VyY2UoKS5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRUYWJsZVJlc291cmNlKCkuZ2V0U2NoZW1hVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzY2hlbWFUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRUYWJsZVJlc291cmNlKCkuc2NoZW1hVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0VGFibGVSZXNvdXJjZSgpLmdldENhdGFsb2dUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2F0YWxvZ1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldFRhYmxlUmVzb3VyY2UoKS5jYXRhbG9nVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHROYW1lKFN0cmluZyBuZXdEZWZhdWx0TmFtZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdE5hbWUgPSB0aGlzLmRlZmF1bHROYW1lOwotCQl0aGlzLmRlZmF1bHROYW1lID0gbmV3RGVmYXVsdE5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVGFibGUuREVGQVVMVF9OQU1FX1BST1BFUlRZLCBvbGREZWZhdWx0TmFtZSwgbmV3RGVmYXVsdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYXRhbG9nKFN0cmluZyBuZXdEZWZhdWx0Q2F0YWxvZykgewotCQlTdHJpbmcgb2xkRGVmYXVsdENhdGFsb2cgPSB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gbmV3RGVmYXVsdENhdGFsb2c7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVGFibGUuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZLCBvbGREZWZhdWx0Q2F0YWxvZywgbmV3RGVmYXVsdENhdGFsb2cpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTY2hlbWEoU3RyaW5nIG5ld0RlZmF1bHRTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRTY2hlbWEgPSB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYSA9IG5ld0RlZmF1bHRTY2hlbWE7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFksIG9sZERlZmF1bHRTY2hlbWEsIG5ld0RlZmF1bHRTY2hlbWEpOwotCX0KLQkKLQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoVGFibGVBbm5vdGF0aW9uIHRhYmxlKSB7Ci0JCXRoaXMuZGVmYXVsdE5hbWUgPSB0aGlzLmRlZmF1bHROYW1lKCk7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYSA9IHRoaXMuZGVmYXVsdFNjaGVtYSgpOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gdGhpcy5kZWZhdWx0Q2F0YWxvZygpOwotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSB0YWJsZS5nZXROYW1lKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gdGFibGUuZ2V0U2NoZW1hKCk7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IHRhYmxlLmdldENhdGFsb2coKTsKLQkJdGhpcy5pbml0aWFsaXplVW5pcXVlQ29uc3RyYWludHModGFibGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVVbmlxdWVDb25zdHJhaW50cyhUYWJsZUFubm90YXRpb24gdGFibGUpIHsKLQkJZm9yIChVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0YWJsZS51bmlxdWVDb25zdHJhaW50cygpKSkgewotCQkJdGhpcy51bmlxdWVDb25zdHJhaW50cy5hZGQoYnVpbGRVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKFRhYmxlQW5ub3RhdGlvbiB0YWJsZSkgewotCQl0aGlzLnNldFNwZWNpZmllZE5hbWVfKHRhYmxlLmdldE5hbWUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18odGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJdGhpcy5zZXREZWZhdWx0TmFtZSh0aGlzLmRlZmF1bHROYW1lKCkpOwotCQl0aGlzLnNldERlZmF1bHRTY2hlbWEodGhpcy5kZWZhdWx0U2NoZW1hKCkpOwotCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuZGVmYXVsdENhdGFsb2coKSk7Ci0JCXRoaXMudXBkYXRlVW5pcXVlQ29uc3RyYWludHModGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRlZmF1bHROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWEoKSB7Ci0JCWlmIChnZXRFbnRpdHlNYXBwaW5ncygpICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpOwotCQl9Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2coKSB7Ci0JCWlmIChnZXRFbnRpdHlNYXBwaW5ncygpICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKTsKLQkJfQotCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVW5pcXVlQ29uc3RyYWludHMoVGFibGVBbm5vdGF0aW9uIHRhYmxlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB1bmlxdWVDb25zdHJhaW50cygpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHJlc291cmNlVW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQkKLQkJd2hpbGUgKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSkgewotCQkJSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSkgewotCQkJCXVuaXF1ZUNvbnN0cmFpbnQudXBkYXRlKHJlc291cmNlVW5pcXVlQ29uc3RyYWludHMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVVuaXF1ZUNvbnN0cmFpbnRfKHVuaXF1ZUNvbnN0cmFpbnQpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKLQkJCWFkZFVuaXF1ZUNvbnN0cmFpbnQodW5pcXVlQ29uc3RyYWludHNTaXplKCksIGJ1aWxkVW5pcXVlQ29uc3RyYWludChyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFVbmlxdWVDb25zdHJhaW50IGJ1aWxkVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbikgewotCQlKYXZhVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVVuaXF1ZUNvbnN0cmFpbnQodGhpcywgdGhpcyk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnQuaW5pdGlhbGl6ZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbik7Ci0JCXJldHVybiB1bmlxdWVDb25zdHJhaW50OwotCX0KLQkKLQkKLQkvLyoqKioqKioqKioqKioqKioqKiogVW5pcXVlQ29uc3RyYWludC5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVVbmlxdWVDb25zdHJhaW50Q29sdW1uTmFtZXMoKSB7Ci0JCW9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBkYlRhYmxlID0gZ2V0RGJUYWJsZSgpOwotCQlpZiAoZGJUYWJsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGJUYWJsZS5jb2x1bW5OYW1lcygpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0VGFibGVSZXNvdXJjZSgpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlRhYmxlKCkgewotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYlNjaGVtYSgpOwotCQlyZXR1cm4gKHNjaGVtYSA9PSBudWxsKSA/IG51bGwgOiBzY2hlbWEuZ2V0VGFibGVOYW1lZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YVNvdXJjZSgpLmdldFNjaGVtYU5hbWVkKHRoaXMuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1Jlc29sdmVkU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYlNjaGVtYSgpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGJUYWJsZSgpICE9IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWZvciAoSmF2YVVuaXF1ZUNvbnN0cmFpbnQgY29uc3RyYWludCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKCkpKSB7Ci0JCQlyZXN1bHQgPSBjb25zdHJhaW50LmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogY2FsbGVkIGlmIHRoZSBkYXRhYmFzZSBpcyBjb25uZWN0ZWQKLQkgKiBuYW1lLCBzY2hlbWEsIGNhdGFsb2cKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuY29ubmVjdGVkSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMubmFtZVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIHRoaXMucXVvdGVkQ2FuZGlkYXRlTmFtZXMoZmlsdGVyKTsKLQkJfQotCQlpZiAodGhpcy5zY2hlbWFUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZVNjaGVtYXMoZmlsdGVyKTsKLQkJfQotCQlpZiAodGhpcy5jYXRhbG9nVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gdGhpcy5xdW90ZWRDYW5kaWRhdGVDYXRhbG9ncyhmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVOYW1lcygpIHsKLQkJU2NoZW1hIGRiU2NoZW1hID0gdGhpcy5nZXREYlNjaGVtYSgpOwotCQlyZXR1cm4gKGRiU2NoZW1hICE9IG51bGwpID8gZGJTY2hlbWEudGFibGVOYW1lcygpIDogRW1wdHlJdGVyYXRvci48U3RyaW5nPiBpbnN0YW5jZSgpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy5jYW5kaWRhdGVOYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBxdW90ZWRDYW5kaWRhdGVOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnF1b3RlKHRoaXMuY2FuZGlkYXRlTmFtZXMoZmlsdGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZVNjaGVtYXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFTb3VyY2UoKS5zY2hlbWFOYW1lcygpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVTY2hlbWFzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmNhbmRpZGF0ZVNjaGVtYXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGVkQ2FuZGlkYXRlU2NoZW1hcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnF1b3RlKHRoaXMuY2FuZGlkYXRlU2NoZW1hcyhmaWx0ZXIpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFTb3VyY2UoKS5jYXRhbG9nTmFtZXMoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlQ2F0YWxvZ3MoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlQ2F0YWxvZ3MoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGVkQ2FuZGlkYXRlQ2F0YWxvZ3MoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZUNhdGFsb2dzKGZpbHRlcikpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZSh0aGlzLmdldENhdGFsb2coKSwgdGhpcy5nZXRTY2hlbWEoKSwgdGhpcy5nZXROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTNmZmM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotCQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZU5vZGUgZ2V0TWFwcGluZ1Jlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqKioqIElUeXBlTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiAoSmF2YVBlcnNpc3RlbnRUeXBlKSBnZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXRQcmltYXJ5RGJUYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoU3RyaW5nIGF0dHJpYnV0ZU1hcHBpbmdLZXkpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxUYWJsZT4gYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKioqKiogdXBkYXRhdGluZyAqKioqKioqKioqKioqKioqKioqKioKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjBhNTE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFPdmVycmlkZQotCWltcGxlbWVudHMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUKLXsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1uczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFKb2luQ29sdW1uPiBkZWZhdWx0Sm9pbkNvbHVtbnM7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8SmF2YUpvaW5Db2x1bW4+KCk7Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxKYXZhSm9pbkNvbHVtbj4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgc2V0VmlydHVhbChib29sZWFuIHZpcnR1YWwpIHsKLQkJcmV0dXJuIChKYXZhQXNzb2NpYXRpb25PdmVycmlkZSkgc3VwZXIuc2V0VmlydHVhbCh2aXJ0dWFsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gZ2V0T3ZlcnJpZGVSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgc3VwZXIuZ2V0T3ZlcnJpZGVSZXNvdXJjZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lciBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaXNFbXB0eSgpID8gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnMoKSA6IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKSA/IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gZGVmYXVsdEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRKb2luQ29sdW1ucyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+KHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFKb2luQ29sdW1uKHRoaXMsIGNyZWF0ZUpvaW5Db2x1bW5Pd25lcigpKTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5hZGQoaW5kZXgsIGpvaW5Db2x1bW4pOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBnZXRPdmVycmlkZVJlc291cmNlKCkuYWRkSm9pbkNvbHVtbihpbmRleCk7Ci0JCWpvaW5Db2x1bW4uaW5pdGlhbGl6ZShqb2luQ29sdW1uUmVzb3VyY2UpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoQXNzb2NpYXRpb25PdmVycmlkZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgQXNzb2NpYXRpb25PdmVycmlkZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlKYXZhSm9pbkNvbHVtbiByZW1vdmVkSm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKLQkJZ2V0T3ZlcnJpZGVSZXNvdXJjZSgpLnJlbW92ZUpvaW5Db2x1bW4oaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoRW50aXR5LlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIEFzc29jaWF0aW9uT3ZlcnJpZGUuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJZ2V0T3ZlcnJpZGVSZXNvdXJjZSgpLm1vdmVKb2luQ29sdW1uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCW1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgQXNzb2NpYXRpb25PdmVycmlkZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOwkJCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICF0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWZvciAoSmF2YUpvaW5Db2x1bW4gY29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuam9pbkNvbHVtbnMoKSkpIHsKLQkJCXJlc3VsdCA9IGNvbHVtbi5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlzdXBlci5pbml0aWFsaXplKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQl0aGlzLm5hbWUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKTsKLQkJaW5pdGlhbGl6ZVNwZWNpZmllZEpvaW5Db2x1bW5zKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkSm9pbkNvbHVtbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGFubm90YXRpb25zID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpOwotCQkKLQkJd2hpbGUoYW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmFkZChjcmVhdGVKb2luQ29sdW1uKGFubm90YXRpb25zLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJc3VwZXIudXBkYXRlKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQl1cGRhdGVTcGVjaWZpZWRKb2luQ29sdW1ucyhhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRKb2luQ29sdW1ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IHJlc291cmNlSm9pbkNvbHVtbnMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCk7Ci0JCQotCQl3aGlsZSAoam9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJam9pbkNvbHVtbi51cGRhdGUocmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRKb2luQ29sdW1uKHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpLCBjcmVhdGVKb2luQ29sdW1uKHJlc291cmNlSm9pbkNvbHVtbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uIGNyZWF0ZUpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtblJlc291cmNlKSB7Ci0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhSm9pbkNvbHVtbih0aGlzLCBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSk7Ci0JCWpvaW5Db2x1bW4uaW5pdGlhbGl6ZShqb2luQ29sdW1uUmVzb3VyY2UpOwotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJCi0JCWFkZEpvaW5Db2x1bW5NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEpvaW5Db2x1bW5NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJZm9yIChKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlTdHJpbmcgdGFibGUgPSBqb2luQ29sdW1uLmdldFRhYmxlKCk7Ci0JCQlib29sZWFuIGRvQ29udGludWUgPSBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCQkKLQkJCWlmIChkb0NvbnRpbnVlICYmIGdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGUpKSB7Ci0JCQkJaWYgKGlzVmlydHVhbCgpKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2dldE5hbWUoKSwgdGFibGUsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpfSwKLQkJCQkJCQlqb2luQ29sdW1uLCAKLQkJCQkJCQlqb2luQ29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCQkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJCWpvaW5Db2x1bW4sIAotCQkJCQkJCWpvaW5Db2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYgKGRvQ29udGludWUgJiYgISBqb2luQ29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2dldE5hbWUoKSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCQlqb2luQ29sdW1uLCAKLQkJCQkJCQlqb2luQ29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJCWpvaW5Db2x1bW4sIAotCQkJCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkJKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChkb0NvbnRpbnVlICYmICEgam9pbkNvbHVtbi5pc1JlZmVyZW5jZWRDb2x1bW5SZXNvbHZlZCgpKSB7Ci0JCQkJaWYgKGlzVmlydHVhbCgpKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCksIGpvaW5Db2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQkJam9pbkNvbHVtbiwgCi0JCQkJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2pvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCQlqb2luQ29sdW1uLAotCQkJCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uT3duZXIgaW1wbGVtZW50cyBKYXZhSm9pbkNvbHVtbi5Pd25lcgotCXsKLQotCQlwdWJsaWMgSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMgaW4gdGhlIHR5cGUgbWFwcGluZydzIHByaW1hcnkgdGFibGUKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUudGhpcy5vd25lci5nZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFbnRpdHkgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQkJcmV0dXJuIHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCA/IG51bGwgOiByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnRoaXMuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUudGhpcy5nZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnRoaXMuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQkJfQotCi0JCS8qKgotCQkgKiB0aGUgam9pbiBjb2x1bW4gY2FuIGJlIG9uIGEgc2Vjb25kYXJ5IHRhYmxlCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZUlzQWxsb3dlZCgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUudGhpcy5vd25lci5nZXRUeXBlTWFwcGluZygpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCkgewotCQkJRW50aXR5IHRhcmdldEVudGl0eSA9IGdldFRhcmdldEVudGl0eSgpOwotCQkJcmV0dXJuICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zLmNvbnRhaW5zKGpvaW5Db2x1bW4pOwotCQl9Ci0KLQkJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnRoaXMuam9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDJlYjhjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFPdmVycmlkZQotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlCi17Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUNvbHVtbiBjb2x1bW47Ci0JCi0KLQlwdWJsaWMgR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBBdHRyaWJ1dGVPdmVycmlkZS5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQkJdGhpcy5jb2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQ29sdW1uKHRoaXMsIHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIHNldFZpcnR1YWwoYm9vbGVhbiB2aXJ0dWFsKSB7Ci0JCXJldHVybiAoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKSBzdXBlci5zZXRWaXJ0dWFsKHZpcnR1YWwpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGdldE92ZXJyaWRlUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBzdXBlci5nZXRPdmVycmlkZVJlc291cmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZS5Pd25lciBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChBdHRyaWJ1dGVPdmVycmlkZS5Pd25lcikgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0JCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldE92ZXJyaWRlUmVzb3VyY2UoKS5nZXROb25OdWxsQ29sdW1uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKLQkJQ29sdW1uTWFwcGluZyBjb2x1bW5NYXBwaW5nID0gZ2V0Q29sdW1uTWFwcGluZygpOwotCQlpZiAoY29sdW1uTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gY29sdW1uTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJQ29sdW1uTWFwcGluZyBjb2x1bW5NYXBwaW5nID0gZ2V0Q29sdW1uTWFwcGluZygpOwotCQlpZiAoY29sdW1uTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgdGFibGVOYW1lID0gY29sdW1uTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCQlpZiAodGFibGVOYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiB0YWJsZU5hbWU7Ci0JCX0KLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5nZXRUYWJsZU5hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbHVtbk1hcHBpbmcgZ2V0Q29sdW1uTWFwcGluZygpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0Q29sdW1uTWFwcGluZyhnZXROYW1lKCkpOwotCX0KLQotCS8vKioqKioqKioqKioqKiBJQ29sdW1uLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKiBJQXR0cmlidXRlT3ZlcnJpZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSmF2YUNvbHVtbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQkvLyoqKioqKioqKioqKiogSmF2YU92ZXJyaWRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKiBqYXZhIHJlc291cmNlIG1vZGVsIC0+IGphdmEgY29udGV4dCBtb2RlbCAqKioqKioqKioqKioqKgkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSk7Ci0JCXRoaXMuY29sdW1uLmluaXRpYWxpemUodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UpIHsKLQkJc3VwZXIudXBkYXRlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UpOwotCQl0aGlzLmNvbHVtbi51cGRhdGUodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpKTsJCQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLmdldENvbHVtbigpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKgotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQotCQlhZGRDb2x1bW5NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbHVtbk1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmcgdGFibGUgPSBnZXRDb2x1bW4oKS5nZXRUYWJsZSgpOwotCQlib29sZWFuIGRvQ29udGludWUgPSBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCQotCQlpZiAoZG9Db250aW51ZSAmJiBnZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZSkpIHsKLQkJCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCksIHRhYmxlLCBnZXRDb2x1bW4oKS5nZXROYW1lKCl9LAotCQkJCQkJZ2V0Q29sdW1uKCksIAotCQkJCQkJZ2V0Q29sdW1uKCkuZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGFibGUsIGdldENvbHVtbigpLmdldE5hbWUoKX0sIAotCQkJCQkJCWdldENvbHVtbigpLCAKLQkJCQkJCQlnZXRDb2x1bW4oKS5nZXRUYWJsZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkJKTsKLQkJCX0KLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISBnZXRDb2x1bW4oKS5pc1Jlc29sdmVkKCkpIHsKLQkJCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2dldE5hbWUoKSwgZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpfSwgCi0JCQkJCQlnZXRDb2x1bW4oKSwgCi0JCQkJCQlnZXRDb2x1bW4oKS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0Q29sdW1uKCkuZ2V0TmFtZSgpfSwgCi0JCQkJCQkJZ2V0Q29sdW1uKCksIAotCQkJCQkJCWdldENvbHVtbigpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFCYXNpY01hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFCYXNpY01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmMmRhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQmFzaWNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk51bGxhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bWVyYXRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTG9iQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFCYXNpY01hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEJhc2ljQW5ub3RhdGlvbj4gaW1wbGVtZW50cyBKYXZhQmFzaWNNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaDsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE9wdGlvbmFsOwotCQotCXByb3RlY3RlZCBFbnVtVHlwZSBzcGVjaWZpZWRFbnVtZXJhdGVkOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhQ29sdW1uIGNvbHVtbjsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2I7Ci0KLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHRlbXBvcmFsOwotCi0JcHVibGljIEdlbmVyaWNKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbHVtbiA9IGNyZWF0ZUphdmFDb2x1bW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvbHVtbiBjcmVhdGVKYXZhQ29sdW1uKCkgewotCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUNvbHVtbih0aGlzLCB0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy5jb2x1bW4uaW5pdGlhbGl6ZSh0aGlzLmdldENvbHVtblJlc291cmNlKCkpOwotCQl0aGlzLnNwZWNpZmllZEVudW1lcmF0ZWQgPSB0aGlzLnNwZWNpZmllZEVudW1lcmF0ZWQodGhpcy5nZXRFbnVtZXJhdGVkUmVzb3VyY2UoKSk7Ci0JCXRoaXMubG9iID0gdGhpcy5sb2IocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy50ZW1wb3JhbCA9IHRoaXMudGVtcG9yYWwodGhpcy5nZXRUZW1wb3JhbFJlc291cmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEJhc2ljQW5ub3RhdGlvbiBiYXNpY1Jlc291cmNlKSB7Ci0JCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSB0aGlzLnNwZWNpZmllZEZldGNoVHlwZShiYXNpY1Jlc291cmNlKTsKLQkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWwoYmFzaWNSZXNvdXJjZSk7Ci0JfQotCQotCXByb3RlY3RlZCBFbnVtZXJhdGVkQW5ub3RhdGlvbiBnZXRFbnVtZXJhdGVkUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoRW51bWVyYXRlZEFubm90YXRpb24pIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXByb3RlY3RlZCBUZW1wb3JhbEFubm90YXRpb24gZ2V0VGVtcG9yYWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChUZW1wb3JhbEFubm90YXRpb24pIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtblJlc291cmNlKCkgewotCQlyZXR1cm4gKENvbHVtbkFubm90YXRpb24pIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKiBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAotCQkJSlBBLkNPTFVNTiwKLQkJCUpQQS5MT0IsCi0JCQlKUEEuVEVNUE9SQUwsCi0JCQlKUEEuRU5VTUVSQVRFRCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRUYWJsZU5hbWUoKTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKiBJQmFzaWNNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgotCi0JcHVibGljIEphdmFDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRGZXRjaCgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0RmV0Y2goKSA6IHRoaXMuZ2V0U3BlY2lmaWVkRmV0Y2goKTsKLQl9Ci0KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldERlZmF1bHRGZXRjaCgpIHsKLQkJcmV0dXJuIEJhc2ljTWFwcGluZy5ERUZBVUxUX0ZFVENIX1RZUEU7Ci0JfQotCQkKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldFNwZWNpZmllZEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRGZXRjaDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlIG5ld1NwZWNpZmllZEZldGNoKSB7Ci0JCUZldGNoVHlwZSBvbGRGZXRjaCA9IHRoaXMuc3BlY2lmaWVkRmV0Y2g7Ci0JCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSBuZXdTcGVjaWZpZWRGZXRjaDsKLQkJdGhpcy5nZXRNYXBwaW5nUmVzb3VyY2UoKS5zZXRGZXRjaChGZXRjaFR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRGZXRjaCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEZldGNoYWJsZS5TUEVDSUZJRURfRkVUQ0hfUFJPUEVSVFksIG9sZEZldGNoLCBuZXdTcGVjaWZpZWRGZXRjaCk7Ci0JfQotCQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2hfKEZldGNoVHlwZSBuZXdTcGVjaWZpZWRGZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSB0aGlzLnNwZWNpZmllZEZldGNoOwotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gbmV3U3BlY2lmaWVkRmV0Y2g7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRmV0Y2hhYmxlLlNQRUNJRklFRF9GRVRDSF9QUk9QRVJUWSwgb2xkRmV0Y2gsIG5ld1NwZWNpZmllZEZldGNoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZE9wdGlvbmFsKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRPcHRpb25hbCgpIDogdGhpcy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiBOdWxsYWJsZS5ERUZBVUxUX09QVElPTkFMOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGRPcHRpb25hbCA9IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7Ci0JCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSBuZXdTcGVjaWZpZWRPcHRpb25hbDsKLQkJdGhpcy5nZXRNYXBwaW5nUmVzb3VyY2UoKS5zZXRPcHRpb25hbChuZXdTcGVjaWZpZWRPcHRpb25hbCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTnVsbGFibGUuU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBvbGRPcHRpb25hbCwgbmV3U3BlY2lmaWVkT3B0aW9uYWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsXyhCb29sZWFuIG5ld1NwZWNpZmllZE9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkT3B0aW9uYWwgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gbmV3U3BlY2lmaWVkT3B0aW9uYWw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTnVsbGFibGUuU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBvbGRPcHRpb25hbCwgbmV3U3BlY2lmaWVkT3B0aW9uYWwpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTG9iKCkgewotCQlyZXR1cm4gdGhpcy5sb2I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9iKGJvb2xlYW4gbmV3TG9iKSB7Ci0JCWJvb2xlYW4gb2xkTG9iID0gdGhpcy5sb2I7Ci0JCXRoaXMubG9iID0gbmV3TG9iOwotCQlpZiAobmV3TG9iKSB7Ci0JCQlpZiAobG9iUmVzb3VyY2UoZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpID09IG51bGwpIHsKLQkJCQlnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChsb2JSZXNvdXJjZShnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkgIT0gbnVsbCkgewotCQkJCWdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzaWNNYXBwaW5nLkxPQl9QUk9QRVJUWSwgb2xkTG9iLCBuZXdMb2IpOwotCX0KLQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7Ci0JCXJldHVybiB0aGlzLnRlbXBvcmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkgewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0aGlzLnRlbXBvcmFsOwotCQl0aGlzLnRlbXBvcmFsID0gbmV3VGVtcG9yYWw7Ci0JCXRoaXMuZ2V0VGVtcG9yYWxSZXNvdXJjZSgpLnNldFZhbHVlKFRlbXBvcmFsVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKG5ld1RlbXBvcmFsKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ29sdW1uTWFwcGluZy5URU1QT1JBTF9QUk9QRVJUWSwgb2xkVGVtcG9yYWwsIG5ld1RlbXBvcmFsKTsKLQl9Ci0JCi0JLyoqCi0JICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCi0JICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKLQkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCi0JICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZW1wb3JhbF8oVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKSB7Ci0JCVRlbXBvcmFsVHlwZSBvbGRUZW1wb3JhbCA9IHRoaXMudGVtcG9yYWw7Ci0JCXRoaXMudGVtcG9yYWwgPSBuZXdUZW1wb3JhbDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDb2x1bW5NYXBwaW5nLlRFTVBPUkFMX1BST1BFUlRZLCBvbGRUZW1wb3JhbCwgbmV3VGVtcG9yYWwpOwotCX0KLQkKLQlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEVudW1lcmF0ZWQoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpOwotCX0KLQkKLQlwdWJsaWMgRW51bVR5cGUgZ2V0RGVmYXVsdEVudW1lcmF0ZWQoKSB7Ci0JCXJldHVybiBCYXNpY01hcHBpbmcuREVGQVVMVF9FTlVNRVJBVEVEOwotCX0KLQkKLQlwdWJsaWMgRW51bVR5cGUgZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRW51bWVyYXRlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZSBuZXdTcGVjaWZpZWRFbnVtZXJhdGVkKSB7Ci0JCUVudW1UeXBlIG9sZEVudW1lcmF0ZWQgPSB0aGlzLnNwZWNpZmllZEVudW1lcmF0ZWQ7Ci0JCXRoaXMuc3BlY2lmaWVkRW51bWVyYXRlZCA9IG5ld1NwZWNpZmllZEVudW1lcmF0ZWQ7Ci0JCXRoaXMuZ2V0RW51bWVyYXRlZFJlc291cmNlKCkuc2V0VmFsdWUoRW51bVR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRFbnVtZXJhdGVkKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzaWNNYXBwaW5nLlNQRUNJRklFRF9FTlVNRVJBVEVEX1BST1BFUlRZLCBvbGRFbnVtZXJhdGVkLCBuZXdTcGVjaWZpZWRFbnVtZXJhdGVkKTsKLQl9Ci0JCi0JLyoqCi0JICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCi0JICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKLQkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCi0JICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRFbnVtZXJhdGVkXyhFbnVtVHlwZSBuZXdTcGVjaWZpZWRFbnVtZXJhdGVkKSB7Ci0JCUVudW1UeXBlIG9sZEVudW1lcmF0ZWQgPSB0aGlzLnNwZWNpZmllZEVudW1lcmF0ZWQ7Ci0JCXRoaXMuc3BlY2lmaWVkRW51bWVyYXRlZCA9IG5ld1NwZWNpZmllZEVudW1lcmF0ZWQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzaWNNYXBwaW5nLlNQRUNJRklFRF9FTlVNRVJBVEVEX1BST1BFUlRZLCBvbGRFbnVtZXJhdGVkLCBuZXdTcGVjaWZpZWRFbnVtZXJhdGVkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJc3VwZXIudXBkYXRlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZSh0aGlzLmdldENvbHVtblJlc291cmNlKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZEVudW1lcmF0ZWRfKHRoaXMuc3BlY2lmaWVkRW51bWVyYXRlZCh0aGlzLmdldEVudW1lcmF0ZWRSZXNvdXJjZSgpKSk7Ci0JCXRoaXMuc2V0TG9iKHRoaXMubG9iKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkpOwotCQl0aGlzLnNldFRlbXBvcmFsXyh0aGlzLnRlbXBvcmFsKHRoaXMuZ2V0VGVtcG9yYWxSZXNvdXJjZSgpKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShCYXNpY0Fubm90YXRpb24gYmFzaWNSZXNvdXJjZSkgewotCQl0aGlzLnNldFNwZWNpZmllZEZldGNoXyh0aGlzLnNwZWNpZmllZEZldGNoVHlwZShiYXNpY1Jlc291cmNlKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkT3B0aW9uYWxfKHRoaXMuc3BlY2lmaWVkT3B0aW9uYWwoYmFzaWNSZXNvdXJjZSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIHNwZWNpZmllZEZldGNoVHlwZShCYXNpY0Fubm90YXRpb24gYmFzaWMpIHsKLQkJcmV0dXJuIEZldGNoVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoYmFzaWMuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE9wdGlvbmFsKEJhc2ljQW5ub3RhdGlvbiBiYXNpYykgewotCQlyZXR1cm4gYmFzaWMuZ2V0T3B0aW9uYWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVudW1UeXBlIHNwZWNpZmllZEVudW1lcmF0ZWQoRW51bWVyYXRlZEFubm90YXRpb24gZW51bWVyYXRlZCkgewotCQlyZXR1cm4gRW51bVR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGxvYihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gbG9iUmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSAhPSBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgTG9iQW5ub3RhdGlvbiBsb2JSZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gKExvYkFubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbChUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwpIHsKLQkJcmV0dXJuIFRlbXBvcmFsVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwodGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJlc3VsdCA9IHRoaXMuZ2V0Q29sdW1uKCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMgLGFzdFJvb3QpOwotCQkKLQkJYWRkQ29sdW1uTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSmF2YUNvbHVtbiBjb2x1bW4gPSB0aGlzLmdldENvbHVtbigpOwotCQlTdHJpbmcgdGFibGUgPSBjb2x1bW4uZ2V0VGFibGUoKTsKLQkJYm9vbGVhbiBkb0NvbnRpbnVlID0gZW50aXR5T3duZWQoKSAmJiBjb2x1bW4uY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgdGhpcy5nZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0YWJsZSwgY29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJY29sdW1uLCBjb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISBjb2x1bW4uaXNSZXNvbHZlZCgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sIGNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmODZhY2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RKYXZhQmFzZUNvbHVtbjxDb2x1bW5Bbm5vdGF0aW9uPiBpbXBsZW1lbnRzIEphdmFDb2x1bW4KLXsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZExlbmd0aDsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFByZWNpc2lvbjsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFNjYWxlOwotCQotCXB1YmxpYyBHZW5lcmljSmF2YUNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbHVtbkFubm90YXRpb24gY29sdW1uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSB0aGlzLnNwZWNpZmllZExlbmd0aChjb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFByZWNpc2lvbiA9IHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkU2NhbGUgPSB0aGlzLnNwZWNpZmllZFNjYWxlKGNvbHVtbik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhQ29sdW1uLk93bmVyIGdldE93bmVyKCkgewotCQlyZXR1cm4gKEphdmFDb2x1bW4uT3duZXIpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmVyKCkuZ2V0Q29sdW1uUmVzb3VyY2UoKTsKLQl9Ci0JCi0JcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0TGVuZ3RoKCkgOiB0aGlzLmdldFNwZWNpZmllZExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRMZW5ndGgoKSB7Ci0JCXJldHVybiBDb2x1bW4uREVGQVVMVF9MRU5HVEg7Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyIG5ld1NwZWNpZmllZExlbmd0aCkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZExlbmd0aCA9IHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IG5ld1NwZWNpZmllZExlbmd0aDsKLQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRMZW5ndGgobmV3U3BlY2lmaWVkTGVuZ3RoKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRMZW5ndGgsIG5ld1NwZWNpZmllZExlbmd0aCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZExlbmd0aF8oSW50ZWdlciBuZXdTcGVjaWZpZWRMZW5ndGgpIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRMZW5ndGggPSB0aGlzLnNwZWNpZmllZExlbmd0aDsKLQkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSBuZXdTcGVjaWZpZWRMZW5ndGg7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTGVuZ3RoLCBuZXdTcGVjaWZpZWRMZW5ndGgpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFByZWNpc2lvbigpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFByZWNpc2lvbigpID09IG51bGwpID8gZ2V0RGVmYXVsdFByZWNpc2lvbigpIDogdGhpcy5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0UHJlY2lzaW9uKCkgewotCQlyZXR1cm4gQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OOwotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByZWNpc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlciBuZXdTcGVjaWZpZWRQcmVjaXNpb24pIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRQcmVjaXNpb24gPSB0aGlzLnNwZWNpZmllZFByZWNpc2lvbjsKLQkJdGhpcy5zcGVjaWZpZWRQcmVjaXNpb24gPSBuZXdTcGVjaWZpZWRQcmVjaXNpb247Ci0JCWdldENvbHVtblJlc291cmNlKCkuc2V0UHJlY2lzaW9uKG5ld1NwZWNpZmllZFByZWNpc2lvbik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1BSRUNJU0lPTl9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUHJlY2lzaW9uLCBuZXdTcGVjaWZpZWRQcmVjaXNpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRQcmVjaXNpb25fKEludGVnZXIgbmV3U3BlY2lmaWVkUHJlY2lzaW9uKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkUHJlY2lzaW9uID0gdGhpcy5zcGVjaWZpZWRQcmVjaXNpb247Ci0JCXRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uID0gbmV3U3BlY2lmaWVkUHJlY2lzaW9uOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QUkVDSVNJT05fUFJPUEVSVFksIG9sZFNwZWNpZmllZFByZWNpc2lvbiwgbmV3U3BlY2lmaWVkUHJlY2lzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTY2FsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFNjYWxlKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0U2NhbGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2NhbGUoKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0U2NhbGUoKSB7Ci0JCXJldHVybiBDb2x1bW4uREVGQVVMVF9TQ0FMRTsKLQl9Ci0JCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkU2NhbGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNjYWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjYWxlKEludGVnZXIgbmV3U3BlY2lmaWVkU2NhbGUpIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRTY2FsZSA9IHRoaXMuc3BlY2lmaWVkU2NhbGU7Ci0JCXRoaXMuc3BlY2lmaWVkU2NhbGUgPSBuZXdTcGVjaWZpZWRTY2FsZTsKLQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRTY2FsZShuZXdTcGVjaWZpZWRTY2FsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDQUxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTY2FsZSwgbmV3U3BlY2lmaWVkU2NhbGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTY2FsZV8oSW50ZWdlciBuZXdTcGVjaWZpZWRTY2FsZSkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZFNjYWxlID0gdGhpcy5zcGVjaWZpZWRTY2FsZTsKLQkJdGhpcy5zcGVjaWZpZWRTY2FsZSA9IG5ld1NwZWNpZmllZFNjYWxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0FMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2NhbGUsIG5ld1NwZWNpZmllZFNjYWxlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB0YWJsZUlzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0Q29sdW1uUmVzb3VyY2UoKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRPd25lcigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4pIHsKLQkJc3VwZXIudXBkYXRlKGNvbHVtbik7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTGVuZ3RoXyh0aGlzLnNwZWNpZmllZExlbmd0aChjb2x1bW4pKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRQcmVjaXNpb25fKHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uKGNvbHVtbikpOwotCQl0aGlzLnNldFNwZWNpZmllZFNjYWxlXyh0aGlzLnNwZWNpZmllZFNjYWxlKGNvbHVtbikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRMZW5ndGgoQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbi5nZXRMZW5ndGgoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkUHJlY2lzaW9uKENvbHVtbkFubm90YXRpb24gY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4uZ2V0UHJlY2lzaW9uKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFNjYWxlKENvbHVtbkFubm90YXRpb24gY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4uZ2V0U2NhbGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4Mzc5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRGlzY3JpbWluYXRvckNvbHVtbiBleHRlbmRzIEFic3RyYWN0SmF2YU5hbWVkQ29sdW1uPERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4KLXsKLQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBzcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZExlbmd0aDsKLQkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwZXJzaXN0ZW5jZVJlc291cmNlOwotCQotCXB1YmxpYyBHZW5lcmljSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4oSmF2YUVudGl0eSBwYXJlbnQsIEphdmFOYW1lZENvbHVtbi5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGVyc2lzdGVudFJlc291cmNlKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VSZXNvdXJjZSA9IHBlcnNpc3RlbnRSZXNvdXJjZTsKLQkJdGhpcy5pbml0aWFsaXplKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IHRoaXMuZGlzY3JpbWluYXRvclR5cGUoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSB0aGlzLmxlbmd0aChjb2x1bW4pOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUVudGl0eSBnZXRKYXZhRW50aXR5KCkgewotCQlyZXR1cm4gKEphdmFFbnRpdHkpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdGhpcy5wZXJzaXN0ZW5jZVJlc291cmNlLmdldE5vbk51bGxBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpIDogdGhpcy5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpOwotCX0KLQotCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFOwotCX0KLQkJCi0JcHVibGljIERpc2NyaW1pbmF0b3JUeXBlIGdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpIHsKLQkJRGlzY3JpbWluYXRvclR5cGUgb2xkRGlzY3JpbWluYXRvclR5cGUgPSB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOwotCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlID0gbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7Ci0JCWdldENvbHVtblJlc291cmNlKCkuc2V0RGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkRGlzY3JpbWluYXRvclR5cGUsIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCi0JICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKLQkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCi0JICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZV8oRGlzY3JpbWluYXRvclR5cGUgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpIHsKLQkJRGlzY3JpbWluYXRvclR5cGUgb2xkRGlzY3JpbWluYXRvclR5cGUgPSB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOwotCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlID0gbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRGlzY3JpbWluYXRvckNvbHVtbi5TUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZLCBvbGREaXNjcmltaW5hdG9yVHlwZSwgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpOwotCX0KLQkJCi0JcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRMZW5ndGgoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdExlbmd0aCgpIHsKLQkJcmV0dXJuIERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEg7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIgbmV3U3BlY2lmaWVkTGVuZ3RoKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gbmV3U3BlY2lmaWVkTGVuZ3RoOwotCQlnZXRDb2x1bW5SZXNvdXJjZSgpLnNldExlbmd0aChuZXdTcGVjaWZpZWRMZW5ndGgpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTGVuZ3RoLCBuZXdTcGVjaWZpZWRMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoXyhJbnRlZ2VyIG5ld1NwZWNpZmllZExlbmd0aCkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZExlbmd0aCA9IHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IG5ld1NwZWNpZmllZExlbmd0aDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChEaXNjcmltaW5hdG9yQ29sdW1uLlNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZFNwZWNpZmllZExlbmd0aCwgbmV3U3BlY2lmaWVkTGVuZ3RoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZU5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRDb2x1bW5SZXNvdXJjZSgpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldE93bmVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsJCi0JfQotCi0JCi0JLy8gKioqKioqKioqKiBqYXZhIGFubm90YXRpb25zIC0+IHBlcnNpc3RlbmNlIG1vZGVsICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwZXJzaXN0ZW50UmVzb3VyY2UpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVJlc291cmNlID0gcGVyc2lzdGVudFJlc291cmNlOwotCQl0aGlzLnVwZGF0ZSh0aGlzLmdldENvbHVtblJlc291cmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZGlzY3JpbWluYXRvckNvbHVtbikgewotCQlzdXBlci51cGRhdGUoZGlzY3JpbWluYXRvckNvbHVtbik7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGVfKHRoaXMuZGlzY3JpbWluYXRvclR5cGUoZGlzY3JpbWluYXRvckNvbHVtbikpOwotCQl0aGlzLnNldFNwZWNpZmllZExlbmd0aF8odGhpcy5sZW5ndGgoZGlzY3JpbWluYXRvckNvbHVtbikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZGlzY3JpbWluYXRvckNvbHVtbikgewotCQlyZXR1cm4gRGlzY3JpbWluYXRvclR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGRpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIGxlbmd0aChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uKSB7Ci0JCXJldHVybiBkaXNjcmltaW5hdG9yQ29sdW1uLmdldExlbmd0aCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWQyYmNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVtYmVkZGFibGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZyBpbXBsZW1lbnRzIEphdmFFbWJlZGRhYmxlCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhRW1iZWRkYWJsZShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKFN0cmluZyBhdHRyaWJ1dGVNYXBwaW5nS2V5KSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSB8fCBhdHRyaWJ1dGVNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlNGI1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbWJlZGRlZElkTWFwcGluZyBleHRlbmRzIEFic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmc8RW1iZWRkZWRJZEFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBKYXZhRW1iZWRkZWRJZE1hcHBpbmcKLXsKLQotCXB1YmxpYyBHZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vKioqKioqKioqKioqKioqKioqIElKYXZhQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbmF0aW9uICoqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSWRNYXBwaW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGZlOWM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZyBleHRlbmRzIEFic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmc8RW1iZWRkZWRBbm5vdGF0aW9uPiBpbXBsZW1lbnRzIEphdmFFbWJlZGRlZE1hcHBpbmcKLXsKLQlwdWJsaWMgR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKioqIElKYXZhQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbmF0aW9uICoqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTI5OTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyaWVzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZyBpbXBsZW1lbnRzIEphdmFFbnRpdHkKLXsKLQlwcm90ZWN0ZWQgRW50aXR5QW5ub3RhdGlvbiBlbnRpdHlSZXNvdXJjZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFUYWJsZSB0YWJsZTsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFTZWNvbmRhcnlUYWJsZT4gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0KLQlwcm90ZWN0ZWQgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKLQkKLQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbjsKLQotCXByb3RlY3RlZCBKYXZhU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0KLQlwcm90ZWN0ZWQgSmF2YVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkQ2xhc3M7Ci0KLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnRhYmxlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVRhYmxlKHRoaXMpOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4gPSBidWlsZEphdmFEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzID0gbmV3IEFycmF5TGlzdDxKYXZhU2Vjb25kYXJ5VGFibGU+KCk7Ci0JCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEFycmF5TGlzdDxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KCk7Ci0JCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPigpOwotCQl0aGlzLm5hbWVkUXVlcmllcyA9IG5ldyBBcnJheUxpc3Q8SmF2YU5hbWVkUXVlcnk+KCk7Ci0JCXRoaXMubmFtZWROYXRpdmVRdWVyaWVzID0gbmV3IEFycmF5TGlzdDxKYXZhTmFtZWROYXRpdmVRdWVyeT4oKTsKLQkJdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+KCk7Ci0JCXRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gbmV3IEFycmF5TGlzdDxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFCYXNlSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4oKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhRGlzY3JpbWluYXRvckNvbHVtbih0aGlzLCBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFOYW1lZENvbHVtbi5Pd25lciBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhTmFtZWRDb2x1bW4uT3duZXIoKXsKLQkJCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXMuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQkJfQotCi0JCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCQlyZXR1cm4gR2VuZXJpY0phdmFFbnRpdHkudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQkJfQotCi0JCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXM7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCQkJcmV0dXJuIERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9OQU1FOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlzdXBlci5pbml0aWFsaXplKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLmVudGl0eVJlc291cmNlID0gKEVudGl0eUFubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gdGhpcy5zcGVjaWZpZWROYW1lKHRoaXMuZW50aXR5UmVzb3VyY2UpOwotCQl0aGlzLmRlZmF1bHROYW1lID0gdGhpcy5kZWZhdWx0TmFtZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSA9IHRoaXMuZGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKTsKLQkJdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KGdldEluaGVyaXRhbmNlUmVzb3VyY2UoKSk7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5nZXREaXNjcmltaW5hdG9yVmFsdWVSZXNvdXJjZSgpLmdldFZhbHVlKCk7Ci0JCXRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSA9IHRoaXMuamF2YURlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkID0gdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi5pbml0aWFsaXplKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnRhYmxlLmluaXRpYWxpemUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5pbml0aWFsaXplVGFibGVHZW5lcmF0b3IocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLmluaXRpYWxpemVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLmluaXRpYWxpemVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5pbml0aWFsaXplRGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLmluaXRpYWxpemVOYW1lZFF1ZXJpZXMocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZU5hbWVkTmF0aXZlUXVlcmllcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5pbml0aWFsaXplSWRDbGFzcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW5jZVVuaXRHZW5lcmF0b3JzQW5kUXVlcmllcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGFubm90YXRpb25zID0gcmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQl3aGlsZShhbm5vdGF0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLmFkZChidWlsZFNlY29uZGFyeVRhYmxlKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIGFubm90YXRpb25zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZUdlbmVyYXRvcihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gdGFibGVHZW5lcmF0b3IocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCWlmICh0YWJsZUdlbmVyYXRvclJlc291cmNlICE9IG51bGwpIHsKLQkJCXRoaXMudGFibGVHZW5lcmF0b3IgPSBidWlsZFRhYmxlR2VuZXJhdG9yKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvcihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gc2VxdWVuY2VHZW5lcmF0b3IocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCWlmIChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlICE9IG51bGwpIHsKLQkJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBidWlsZFNlcXVlbmNlR2VuZXJhdG9yKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYW5ub3RhdGlvbnMgPSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXdoaWxlKGFubm90YXRpb25zLmhhc05leHQoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYW5ub3RhdGlvbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQnVpbGREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJaWYgKCFzaG91bGRCdWlsZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG5ldyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW4ocGVyc2lzdGVudFR5cGVSZXNvdXJjZSkpOwotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGFubm90YXRpb25zID0gcGVyc2lzdGVudFR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQl3aGlsZShhbm5vdGF0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmFkZChidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGFubm90YXRpb25zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJZm9yIChQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkpKSB7Ci0JCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCWlmIChhdHRyaWJ1dGVPdmVycmlkZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmFkZChidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShwZXJzaXN0ZW50VHlwZVJlc291cmNlLCBwZXJzaXN0ZW50QXR0cmlidXRlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGFubm90YXRpb25zID0gcmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUoYW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmFkZChidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhbm5vdGF0aW9ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSBhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIGFzc29jaWF0aW9uTmFtZSA9IGkubmV4dCgpOwotCQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IGdldEFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lZChhc3NvY2lhdGlvbk5hbWUpOwotCQkJaWYgKGFzc29jaWF0aW9uT3ZlcnJpZGUgPT0gbnVsbCkgewotCQkJCXRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmFkZChidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUobmV3IE51bGxBc3NvY2lhdGlvbk92ZXJyaWRlKHJlc291cmNlUGVyc2lzdGVudFR5cGUsIGFzc29jaWF0aW9uTmFtZSkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVOYW1lZFF1ZXJpZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYW5ub3RhdGlvbnMgPSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUoYW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLm5hbWVkUXVlcmllcy5hZGQoYnVpbGROYW1lZFF1ZXJ5KChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgYW5ub3RhdGlvbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU5hbWVkTmF0aXZlUXVlcmllcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBhbm5vdGF0aW9ucyA9IHJlc291cmNlUGVyc2lzdGVudFR5cGUuYW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQl3aGlsZShhbm5vdGF0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmFtZWROYXRpdmVRdWVyaWVzLmFkZChidWlsZE5hbWVkTmF0aXZlUXVlcnkoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQotCS8vcXVlcnkgZm9yIHRoZSBpbmhlcml0YW5jZSByZXNvdXJjZSBldmVyeSB0aW1lIG9uIHNldHRlcnMuCi0JLy9jYWxsIG9uZSBzZXR0ZXIgYW5kIHRoZSBpbmhlcml0YW5jZVJlc291cmNlIGNvdWxkIGNoYW5nZS4gCi0JLy9Zb3UgY291bGQgY2FsbCBtb3JlIHRoYW4gb25lIHNldHRlciBiZWZvcmUgdGhpcyBvYmplY3QgaGFzIHJlY2VpdmVkIGFueSBub3RpZmljYXRpb24KLQkvL2Zyb20gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VBbm5vdGF0aW9uIGdldEluaGVyaXRhbmNlUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoSW5oZXJpdGFuY2VBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldE5vbk51bGxBbm5vdGF0aW9uKEluaGVyaXRhbmNlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbiBnZXREaXNjcmltaW5hdG9yVmFsdWVSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldE5vbk51bGxBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRDbGFzcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UpIHsKLQkJSWRDbGFzc0Fubm90YXRpb24gaWRDbGFzc1Jlc291cmNlID0gKElkQ2xhc3NBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlpZiAoaWRDbGFzc1Jlc291cmNlICE9IG51bGwpIHsKLQkJCXRoaXMuaWRDbGFzcyA9IGlkQ2xhc3NSZXNvdXJjZS5nZXRWYWx1ZSgpOwotCQl9Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKioqIElUeXBlTWFwcGluZyBpbXBsZW1lbmF0aW9uICoqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFRhYmxlKCkuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0UHJpbWFyeURiVGFibGUoKSB7Ci0JCXJldHVybiBnZXRUYWJsZSgpLmdldERiVGFibGUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGVbXSBFTVBUWV9EQl9UQUJMRV9BUlJBWSA9IG5ldyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGVbMF07Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkvLyB0aGUgSlBBIHBsYXRmb3JtIHNlYXJjaGVzIGRhdGFiYXNlIG9iamVjdHMgZm9yIHVzCi0JCXJldHVybiB0aGlzLmdldERhdGFTb3VyY2UoKS5nZXREYXRhYmFzZU9iamVjdE5hbWVkKAotCQkJCQkJQ29sbGVjdGlvblRvb2xzLmFycmF5KHRoaXMuYXNzb2NpYXRlZERiVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCksIEVNUFRZX0RCX1RBQkxFX0FSUkFZKSwKLQkJCQkJCXRhYmxlTmFtZQotCQkJCQkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8b3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlPiBhc3NvY2lhdGVkRGJUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8b3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlLCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU+KHRoaXMuYXNzb2NpYXRlZERiVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkXygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgdCkgewotCQkJCXJldHVybiB0ICE9IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU+IGFzc29jaWF0ZWREYlRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZF8oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUYWJsZSwgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlPih0aGlzLmFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIHRyYW5zZm9ybShUYWJsZSB0KSB7Ci0JCQkJcmV0dXJuIHQuZ2V0RGJUYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7Ci0JCXJldHVybiBnZXRUYWJsZSgpLmdldERiU2NoZW1hKCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKioqKiBJSmF2YVR5cGVNYXBwaW5nIGltcGxlbWVuYXRpb24gKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAotCQkJSlBBLlRBQkxFLAotCQkJSlBBLlNFQ09OREFSWV9UQUJMRSwKLQkJCUpQQS5TRUNPTkRBUllfVEFCTEVTLAotCQkJSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLAotCQkJSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUywKLQkJCUpQQS5JRF9DTEFTUywKLQkJCUpQQS5JTkhFUklUQU5DRSwKLQkJCUpQQS5ESVNDUklNSU5BVE9SX1ZBTFVFLAotCQkJSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OLAotCQkJSlBBLlNFUVVFTkNFX0dFTkVSQVRPUiwKLQkJCUpQQS5UQUJMRV9HRU5FUkFUT1IsCi0JCQlKUEEuTkFNRURfUVVFUlksCi0JCQlKUEEuTkFNRURfUVVFUklFUywKLQkJCUpQQS5OQU1FRF9OQVRJVkVfUVVFUlksCi0JCQlKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMsCi0JCQlKUEEuU1FMX1JFU1VMVF9TRVRfTUFQUElORywKLQkJCUpQQS5FWENMVURFX0RFRkFVTFRfTElTVEVORVJTLAotCQkJSlBBLkVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMsCi0JCQlKUEEuRU5USVRZX0xJU1RFTkVSUywKLQkJCUpQQS5QUkVfUEVSU0lTVCwKLQkJCUpQQS5QT1NUX1BFUlNJU1QsCi0JCQlKUEEuUFJFX1JFTU9WRSwKLQkJCUpQQS5QT1NUX1JFTU9WRSwKLQkJCUpQQS5QUkVfVVBEQVRFLAotCQkJSlBBLlBPU1RfVVBEQVRFLAotCQkJSlBBLlBPU1RfTE9BRCwKLQkJCUpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsCi0JCQlKUEEuQVRUUklCVVRFX09WRVJSSURFUywKLQkJCUpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwKLQkJCUpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCX0KLQotCS8vKioqKioqKioqKioqKioqKioqIElFbnRpdHkgaW1wbGVtZW5hdGlvbiAqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0TmFtZSgpIDogdGhpcy5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7Ci0JCXRoaXMuZW50aXR5UmVzb3VyY2Uuc2V0TmFtZShuZXdTcGVjaWZpZWROYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHkuU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE5hbWUsIG5ld1NwZWNpZmllZE5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkTmFtZSA9IHRoaXMuc3BlY2lmaWVkTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gbmV3U3BlY2lmaWVkTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHkuU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE5hbWUsIG5ld1NwZWNpZmllZE5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHROYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQvKnByaXZhdGUtcHJvdGVjdGVkKi8gdm9pZCBzZXREZWZhdWx0TmFtZShTdHJpbmcgbmV3RGVmYXVsdE5hbWUpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHROYW1lID0gdGhpcy5kZWZhdWx0TmFtZTsKLQkJdGhpcy5kZWZhdWx0TmFtZSA9IG5ld0RlZmF1bHROYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVudGl0eS5ERUZBVUxUX05BTUVfUFJPUEVSVFksIG9sZERlZmF1bHROYW1lLCBuZXdEZWZhdWx0TmFtZSk7Ci0JfQotCi0JcHVibGljIEphdmFUYWJsZSBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGU7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+KHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVNlY29uZGFyeVRhYmxlIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCBpbmRleCkgewotCQlKYXZhU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhU2Vjb25kYXJ5VGFibGUodGhpcyk7Ci0JCXRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLmFkZChpbmRleCwgc2Vjb25kYXJ5VGFibGUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihpbmRleCwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlzZWNvbmRhcnlUYWJsZS5pbml0aWFsaXplKHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpOwotCQlmaXJlSXRlbUFkZGVkKEVudGl0eS5TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNULCBpbmRleCwgc2Vjb25kYXJ5VGFibGUpOwotCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCBpbmRleCwgSmF2YVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHNlY29uZGFyeVRhYmxlLCB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcywgRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLmluZGV4T2Yoc2Vjb25kYXJ5VGFibGUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IGluZGV4KSB7Ci0JCUphdmFTZWNvbmRhcnlUYWJsZSByZW1vdmVkU2Vjb25kYXJ5VGFibGUgPSB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZmlyZUl0ZW1SZW1vdmVkKEVudGl0eS5TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNULCBpbmRleCwgcmVtb3ZlZFNlY29uZGFyeVRhYmxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVfKEphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qoc2Vjb25kYXJ5VGFibGUsIHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLCBFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlmaXJlSXRlbU1vdmVkKEVudGl0eS5TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMoKSB7Ci0JCXJldHVybiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNlY29uZGFyeVRhYmxlc1NpemUoKSB7Ci0JCXJldHVybiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCk7Ci0JfQotCi0JcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpIDogdGhpcy5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JfQotCQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgbmV3SW5oZXJpdGFuY2VUeXBlKSB7Ci0JCUluaGVyaXRhbmNlVHlwZSBvbGRJbmhlcml0YW5jZVR5cGUgPSB0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCQl0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gbmV3SW5oZXJpdGFuY2VUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5IRVJJVEFOQ0VfU1RSQVRFR1lfUFJPUEVSVFksIG9sZEluaGVyaXRhbmNlVHlwZSwgbmV3SW5oZXJpdGFuY2VUeXBlKTsKLQl9Ci0JCi0JcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZSBuZXdJbmhlcml0YW5jZVR5cGUpIHsKLQkJSW5oZXJpdGFuY2VUeXBlIG9sZEluaGVyaXRhbmNlVHlwZSA9IHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKLQkJdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gbmV3SW5oZXJpdGFuY2VUeXBlOwotCQlnZXRJbmhlcml0YW5jZVJlc291cmNlKCkuc2V0U3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3SW5oZXJpdGFuY2VUeXBlKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZLCBvbGRJbmhlcml0YW5jZVR5cGUsIG5ld0luaGVyaXRhbmNlVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneV8oSW5oZXJpdGFuY2VUeXBlIG5ld0luaGVyaXRhbmNlVHlwZSkgewotCQlJbmhlcml0YW5jZVR5cGUgb2xkSW5oZXJpdGFuY2VUeXBlID0gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCQl0aGlzLnNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kgPSBuZXdJbmhlcml0YW5jZVR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZLCBvbGRJbmhlcml0YW5jZVR5cGUsIG5ld0luaGVyaXRhbmNlVHlwZSk7Ci0JfQotCi0JcHVibGljIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW47Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoU3RyaW5nIG5ld0RlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWU7Ci0JCXRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSA9IG5ld0RlZmF1bHREaXNjcmltaW5hdG9yVmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9ESVNDUklNSU5BVE9SX1ZBTFVFX1BST1BFUlRZLCBvbGREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlLCBuZXdEZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZShTdHJpbmcgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgPSBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7Ci0JCWdldERpc2NyaW1pbmF0b3JWYWx1ZVJlc291cmNlKCkuc2V0VmFsdWUobmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlLCBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlXyhTdHJpbmcgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgPSBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSwgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQoYm9vbGVhbiBuZXdEaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKSB7Ci0JCWJvb2xlYW4gb2xkRGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCA9IHRoaXMuZGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZDsKLQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkID0gbmV3RGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHkuRElTQ1JJTUlOQVRPUl9WQUxVRV9BTExPV0VEX1BST1BFUlRZLCBvbGREaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkLCBuZXdEaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKTsKLQl9Ci0JCi0JcHVibGljIEphdmFUYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcigpIHsKLQkJaWYgKGdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGFibGVHZW5lcmF0b3IgYWxyZWFkeSBleGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhVGFibGVHZW5lcmF0b3IodGhpcyk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLnRhYmxlR2VuZXJhdG9yLmluaXRpYWxpemUodGFibGVHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZLCBudWxsLCB0aGlzLnRhYmxlR2VuZXJhdG9yKTsKLQkJcmV0dXJuIHRoaXMudGFibGVHZW5lcmF0b3I7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVRhYmxlR2VuZXJhdG9yKCkgewotCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0YWJsZUdlbmVyYXRvciBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGJlIHJlbW92ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUphdmFUYWJsZUdlbmVyYXRvciBvbGRUYWJsZUdlbmVyYXRvciA9IHRoaXMudGFibGVHZW5lcmF0b3I7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSBudWxsOwotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRUYWJsZUdlbmVyYXRvciwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihKYXZhVGFibGVHZW5lcmF0b3IgbmV3VGFibGVHZW5lcmF0b3IpIHsKLQkJSmF2YVRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGhpcy50YWJsZUdlbmVyYXRvcjsKLQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IG5ld1RhYmxlR2VuZXJhdG9yOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkVGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZXF1ZW5jZUdlbmVyYXRvciBhbHJlYWR5IGV4aXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFTZXF1ZW5jZUdlbmVyYXRvcih0aGlzKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IuaW5pdGlhbGl6ZShzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFksIG51bGwsIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3IpOwotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNlcXVlbmNlR2VuZXJhdG9yIGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgYmUgcmVtb3ZlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSmF2YVNlcXVlbmNlR2VuZXJhdG9yIG9sZFNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IG51bGw7Ci0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUucmVtb3ZlQW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZFNlcXVlbmNlR2VuZXJhdG9yLG51bGwpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZXF1ZW5jZUdlbmVyYXRvcihKYXZhU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJSmF2YVNlcXVlbmNlR2VuZXJhdG9yIG9sZFNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IG5ld1NlcXVlbmNlR2VuZXJhdG9yOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEphdmFHZW5lcmF0b3I+IGdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8SmF2YUdlbmVyYXRvcj4oCi0JCQkoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSA6IG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSksCi0JCQkoZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSA6IG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoZ2V0VGFibGVHZW5lcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIDogdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgcHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA/IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4odGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gIXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQl9CQotCQotCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gbmV3UGtKb2luQ29sdW1uKSB7Ci0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBvbGRQa0pvaW5Db2x1bW4gPSB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBuZXdQa0pvaW5Db2x1bW47Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIG9sZFBrSm9pbkNvbHVtbiwgbmV3UGtKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBvbGREZWZhdWx0UGtKb2luQ29sdW1uID0gdGhpcy5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJaWYgKG9sZERlZmF1bHRQa0pvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJLy9udWxsIHRoZSBkZWZhdWx0IGpvaW4gY29sdW1uIG5vdyBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JCQkvL2lmIG9uZSBkb2VzIG5vdCBleGlzdCwgdGhlcmUgaXMgYWxyZWFkeSBhIHNwZWNpZmllZCBqb2luIGNvbHVtbi4KLQkJCS8vUmVtb3ZlIGl0IG5vdyBzbyB0aGF0IGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQgZHVyaW5nIGFuIHVwZGF0ZSBhbmQKLQkJCS8vY2F1c2UgY2hhbmdlIG5vdGlmaWNhdGlvbnMgdG8gYmUgc2VudCB0byB0aGUgVUkgaW4gdGhlIHdyb25nIG9yZGVyCi0JCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG51bGw7Ci0JCX0KLQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKSk7Ci0JCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChpbmRleCwgcHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uUmVzb3VyY2UgPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oaW5kZXgsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW4uaW5pdGlhbGl6ZShwa0pvaW5Db2x1bW5SZXNvdXJjZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQlpZiAob2xkRGVmYXVsdFBrSm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIG9sZERlZmF1bHRQa0pvaW5Db2x1bW4sIG51bGwpOwotCQl9Ci0JCXJldHVybiBwcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKLQkJcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaW5kZXhPZihwcmltYXJ5S2V5Sm9pbkNvbHVtbikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIHJlbW92ZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7Ci0JCWlmICghY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJLy9jcmVhdGUgdGhlIGRlZmF1bHRKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKLQkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKLQkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCi0JCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4obmV3IE51bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSk7Ci0JCX0KLQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJaWYgKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIGEgZGVmYXVsdEpvaW5Db2x1bW4gd2FzIGNyZWF0ZWQgYWJvdmUKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHkuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5fKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QocHJpbWFyeUtleUpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucywgRW50aXR5LlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCk7CQkKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPihzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0JCi0JcHVibGljIGludCBhdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgKyB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4odGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCBpbmRleCkgewotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpKTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKGluZGV4LCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmluaXRpYWxpemUoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChFbnRpdHkuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIHNldEF0dHJpYnV0ZU92ZXJyaWRlVmlydHVhbChib29sZWFuIHZpcnR1YWwsIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQkvLyBBZGQgYSBuZXcgYXR0cmlidXRlIG92ZXJyaWRlCi0JCWlmICh2aXJ0dWFsKSB7Ci0JCQlyZXR1cm4gc2V0QXR0cmlidXRlT3ZlcnJpZGVWaXJ0dWFsKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJfQotCQlyZXR1cm4gc2V0QXR0cmlidXRlT3ZlcnJpZGVTcGVjaWZpZWQoYXR0cmlidXRlT3ZlcnJpZGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIHNldEF0dHJpYnV0ZU92ZXJyaWRlVmlydHVhbChKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaW5kZXhPZihhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZShpbmRleCk7Ci0JCVN0cmluZyBhdHRyaWJ1dGVPdmVycmlkZU5hbWUgPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCk7Ci0JCS8vYWRkIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZSBzbyB0aGF0IEkgY2FuIGNvbnRyb2wgdGhlIG9yZGVyIHRoYXQgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcyBzZW50LgotCQkvL290aGVyd2lzZSB3aGVuIHdlIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIGphdmEgd2Ugd2lsbCBnZXQgYW4gdXBkYXRlIGFuZCBhZGQgdGhlIGF0dHJpYnV0ZSBvdmVycmlkZQotCQkvL2R1cmluZyB0aGUgdWRwYXRlLiAgVGhpcyBjYXVzZXMgdGhlIFVJIHRvIGJlIGZsYWt5LCBzaW5jZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1pZ2h0IG5vdCBvY2N1ciBpbiB0aGUgY29ycmVjdCBvcmRlcgotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gbnVsbDsKLQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSAhPSBudWxsKSB7Ci0JCQlmb3IgKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSkpIHsKLQkJCQlpZiAocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSkpIHsKLQkJCQkJLy9zdG9yZSB0aGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHNvIHdlIGNhbiBmaXJlIGNoYW5nZSBub3RpZmljYXRpb24gbGF0ZXIKLQkJCQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUodGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgcGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQkJCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCi0JCWlmICh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgIT0gbnVsbCkgewotCQkJZmlyZUl0ZW1BZGRlZChFbnRpdHkuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgLSAxLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpOwotCQl9Ci0JCXJldHVybiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgc2V0QXR0cmlidXRlT3ZlcnJpZGVTcGVjaWZpZWQoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIG9sZEF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWludCBpbmRleCA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIG5ld0F0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKHRoaXMsIGNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlT3duZXIoKSk7Ci0JCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmFkZChpbmRleCwgbmV3QXR0cmlidXRlT3ZlcnJpZGUpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oaW5kZXgsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbmV3QXR0cmlidXRlT3ZlcnJpZGUuaW5pdGlhbGl6ZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKTsKLQkJCi0JCWludCBkZWZhdWx0SW5kZXggPSB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaW5kZXhPZihvbGRBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5yZW1vdmUoZGVmYXVsdEluZGV4KTsKLQotCQluZXdBdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKG9sZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW5ld0F0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUob2xkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKEVudGl0eS5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgZGVmYXVsdEluZGV4LCBvbGRBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChFbnRpdHkuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgaW5kZXgsIG5ld0F0dHJpYnV0ZU92ZXJyaWRlKTsJCQotCi0JCXJldHVybiBuZXdBdHRyaWJ1dGVPdmVycmlkZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIGNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShpbnQgaW5kZXgsIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIEVudGl0eS5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVfKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLCBFbnRpdHkuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtTW92ZWQoRW50aXR5LlNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlhZGRJdGVtVG9MaXN0KGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMsIEVudGl0eS5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMsIEVudGl0eS5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCk7Ci0JfQotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKSBnZXRPdmVycmlkZU5hbWVkKG5hbWUsIGF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0F0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0RlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQotCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChKYXZhQXNzb2NpYXRpb25PdmVycmlkZSkgZ2V0T3ZlcnJpZGVOYW1lZChuYW1lLCBhc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0Fzc29jaWF0aW9uT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgYXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotCX0KLQotCXByaXZhdGUgQmFzZU92ZXJyaWRlIGdldE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgQmFzZU92ZXJyaWRlPiBvdmVycmlkZXMpIHsKLQkJZm9yIChCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3ZlcnJpZGVzKSkgewotCQkJU3RyaW5nIG92ZXJyaWRlTmFtZSA9IG92ZXJyaWRlLmdldE5hbWUoKTsKLQkJCWlmIChvdmVycmlkZU5hbWUgPT0gbnVsbCAmJiBuYW1lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gb3ZlcnJpZGU7Ci0JCQl9Ci0JCQlpZiAob3ZlcnJpZGVOYW1lICE9IG51bGwgJiYgb3ZlcnJpZGVOYW1lLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBvdmVycmlkZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNPdmVycmlkZShTdHJpbmcgbmFtZSwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+IG92ZXJyaWRlcykgewotCQlyZXR1cm4gZ2V0T3ZlcnJpZGVOYW1lZChuYW1lLCBvdmVycmlkZXMpICE9IG51bGw7Ci0JfQotCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+KHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCksIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9Ci0JCi0JcHVibGljIGludCBhc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpICsgdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCk7Ci0JfQotCi0JcHVibGljICBMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4odGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPih0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShpbnQgaW5kZXgpIHsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlKHRoaXMsIGNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVPd25lcigpKTsKLQkJdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5hZGQoaW5kZXgsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihpbmRleCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5pbml0aWFsaXplKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChFbnRpdHkuU1BFQ0lGSUVEX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNULCBpbmRleCwgYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lciBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZU93bmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoaW50IGluZGV4LCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMsIEVudGl0eS5TUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlXyhKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChhc3NvY2lhdGlvbk92ZXJyaWRlLCB0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLCBFbnRpdHkuU1BFQ0lGSUVEX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtTW92ZWQoRW50aXR5LlNQRUNJRklFRF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQotCXByb3RlY3RlZCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBzZXRBc3NvY2lhdGlvbk92ZXJyaWRlVmlydHVhbChib29sZWFuIHZpcnR1YWwsIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJLy8gQWRkIGEgbmV3IGF0dHJpYnV0ZSBvdmVycmlkZQotCQlpZiAodmlydHVhbCkgewotCQkJcmV0dXJuIHNldEFzc29jaWF0aW9uT3ZlcnJpZGVWaXJ0dWFsKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQl9Ci0JCXJldHVybiBzZXRBc3NvY2lhdGlvbk92ZXJyaWRlU3BlY2lmaWVkKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgc2V0QXNzb2NpYXRpb25PdmVycmlkZVZpcnR1YWwoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlpbnQgaW5kZXggPSB0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmluZGV4T2YoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCXRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMucmVtb3ZlKGluZGV4KTsKLQkJU3RyaW5nIGFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCk7Ci0JCS8vYWRkIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZSBzbyB0aGF0IEkgY2FuIGNvbnRyb2wgdGhlIG9yZGVyIHRoYXQgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcyBzZW50LgotCQkvL290aGVyd2lzZSB3aGVuIHdlIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIGphdmEgd2Ugd2lsbCBnZXQgYW4gdXBkYXRlIGFuZCBhZGQgdGhlIGF0dHJpYnV0ZSBvdmVycmlkZQotCQkvL2R1cmluZyB0aGUgdWRwYXRlLiAgVGhpcyBjYXVzZXMgdGhlIFVJIHRvIGJlIGZsYWt5LCBzaW5jZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1pZ2h0IG5vdCBvY2N1ciBpbiB0aGUgY29ycmVjdCBvcmRlcgotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG51bGw7Ci0JCWlmIChhc3NvY2lhdGlvbk92ZXJyaWRlTmFtZSAhPSBudWxsKSB7Ci0JCQlmb3IgKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpKSkgewotCQkJCWlmIChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKS5lcXVhbHMoYXNzb2NpYXRpb25PdmVycmlkZU5hbWUpKSB7Ci0JCQkJCS8vc3RvcmUgdGhlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHNvIHdlIGNhbiBmaXJlIGNoYW5nZSBub3RpZmljYXRpb24gbGF0ZXIKLQkJCQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUobmV3IE51bGxBc3NvY2lhdGlvbk92ZXJyaWRlKHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUsIGFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lKSk7Ci0JCQkJCXRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmFkZCh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUucmVtb3ZlQW5ub3RhdGlvbihpbmRleCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZmlyZUl0ZW1SZW1vdmVkKEVudGl0eS5TUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJCi0JCWlmICh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSAhPSBudWxsKSB7Ci0JCQlmaXJlSXRlbUFkZGVkKEVudGl0eS5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNULCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgLSAxLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCX0KLQkJcmV0dXJuIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgc2V0QXNzb2NpYXRpb25PdmVycmlkZVNwZWNpZmllZChKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBvbGRBc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCWludCBpbmRleCA9IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBuZXdBc3NvY2lhdGlvbk92ZXJyaWRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUodGhpcywgY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZU93bmVyKCkpOwotCQl0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmFkZChpbmRleCwgbmV3QXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oaW5kZXgsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW5ld0Fzc29jaWF0aW9uT3ZlcnJpZGUuaW5pdGlhbGl6ZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKTsKLQkJCi0JCWludCB2aXJ0dWFsSW5kZXggPSB0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5pbmRleE9mKG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQl0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5yZW1vdmUodmlydHVhbEluZGV4KTsKLQotCQluZXdBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUob2xkQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoRW50aXR5LlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QsIHZpcnR1YWxJbmRleCwgb2xkQXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChFbnRpdHkuU1BFQ0lGSUVEX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNULCBpbmRleCwgbmV3QXNzb2NpYXRpb25PdmVycmlkZSk7CQkKLQotCQlyZXR1cm4gbmV3QXNzb2NpYXRpb25PdmVycmlkZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlhZGRJdGVtVG9MaXN0KGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLCBFbnRpdHkuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLCBFbnRpdHkuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFOYW1lZFF1ZXJ5Pih0aGlzLm5hbWVkUXVlcmllcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmFtZWRRdWVyaWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZWRRdWVyaWVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFOYW1lZFF1ZXJ5IGFkZE5hbWVkUXVlcnkoaW50IGluZGV4KSB7Ci0JCUphdmFOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhTmFtZWRRdWVyeSh0aGlzKTsKLQkJdGhpcy5uYW1lZFF1ZXJpZXMuYWRkKGluZGV4LCBuYW1lZFF1ZXJ5KTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeUFubm90YXRpb24gPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihpbmRleCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW5hbWVkUXVlcnkuaW5pdGlhbGl6ZShuYW1lZFF1ZXJ5QW5ub3RhdGlvbik7Ci0JCWZpcmVJdGVtQWRkZWQoUXVlcnlIb2xkZXIuTkFNRURfUVVFUklFU19MSVNULCBpbmRleCwgbmFtZWRRdWVyeSk7Ci0JCXJldHVybiBuYW1lZFF1ZXJ5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lZFF1ZXJ5KGludCBpbmRleCwgSmF2YU5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBuYW1lZFF1ZXJ5LCB0aGlzLm5hbWVkUXVlcmllcywgUXVlcnlIb2xkZXIuTkFNRURfUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTmFtZWRRdWVyeShOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpIHsKLQkJcmVtb3ZlTmFtZWRRdWVyeSh0aGlzLm5hbWVkUXVlcmllcy5pbmRleE9mKG5hbWVkUXVlcnkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTmFtZWRRdWVyeShpbnQgaW5kZXgpIHsKLQkJSmF2YU5hbWVkUXVlcnkgcmVtb3ZlZE5hbWVkUXVlcnkgPSB0aGlzLm5hbWVkUXVlcmllcy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlmaXJlSXRlbVJlbW92ZWQoUXVlcnlIb2xkZXIuTkFNRURfUVVFUklFU19MSVNULCBpbmRleCwgcmVtb3ZlZE5hbWVkUXVlcnkpOwotCX0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTmFtZWRRdWVyeV8oSmF2YU5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QobmFtZWRRdWVyeSwgdGhpcy5uYW1lZFF1ZXJpZXMsIFF1ZXJ5SG9sZGVyLk5BTUVEX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVOYW1lZFF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMubmFtZWRRdWVyaWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtTW92ZWQoUXVlcnlIb2xkZXIuTkFNRURfUVVFUklFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhTmFtZWROYXRpdmVRdWVyeT4odGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IG5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhTmFtZWROYXRpdmVRdWVyeSBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCkgewotCQlKYXZhTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YU5hbWVkTmF0aXZlUXVlcnkodGhpcyk7Ci0JCXRoaXMubmFtZWROYXRpdmVRdWVyaWVzLmFkZChpbmRleCwgbmFtZWROYXRpdmVRdWVyeSk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oaW5kZXgsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LmluaXRpYWxpemUobmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pOwkJCi0JCWZpcmVJdGVtQWRkZWQoUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCwgaW5kZXgsIG5hbWVkTmF0aXZlUXVlcnkpOwotCQlyZXR1cm4gbmFtZWROYXRpdmVRdWVyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgsIEphdmFOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgbmFtZWROYXRpdmVRdWVyeSwgdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMsIFF1ZXJ5SG9sZGVyLk5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSkgewotCQl0aGlzLnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkodGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuaW5kZXhPZihuYW1lZE5hdGl2ZVF1ZXJ5KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KSB7Ci0JCUphdmFOYW1lZE5hdGl2ZVF1ZXJ5IHJlbW92ZWROYW1lZE5hdGl2ZVF1ZXJ5ID0gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFF1ZXJ5SG9sZGVyLk5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QsIGluZGV4LCByZW1vdmVkTmFtZWROYXRpdmVRdWVyeSk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5XyhKYXZhTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChuYW1lZE5hdGl2ZVF1ZXJ5LCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtTW92ZWQoUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SmF2YVF1ZXJ5PiBxdWVyaWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEphdmFRdWVyeT4odGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMoKSwgdGhpcy5uYW1lZFF1ZXJpZXMoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5pZENsYXNzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJZENsYXNzKFN0cmluZyBuZXdJZENsYXNzKSB7Ci0JCVN0cmluZyBvbGRJZENsYXNzID0gdGhpcy5pZENsYXNzOwotCQl0aGlzLmlkQ2xhc3MgPSBuZXdJZENsYXNzOwotCQlpZiAobmV3SWRDbGFzcyAhPSBvbGRJZENsYXNzKSB7Ci0JCQlpZiAobmV3SWRDbGFzcyAhPSBudWxsKSB7Ci0JCQkJaWYgKGdldElkQ2xhc3NSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJYWRkSWRDbGFzc1Jlc291cmNlKCk7Ci0JCQkJfQotCQkJCWdldElkQ2xhc3NSZXNvdXJjZSgpLnNldFZhbHVlKG5ld0lkQ2xhc3MpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlSWRDbGFzc1Jlc291cmNlKCk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJZENsYXNzLklEX0NMQVNTX1BST1BFUlRZLCBvbGRJZENsYXNzLCBuZXdJZENsYXNzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SWRDbGFzc18oU3RyaW5nIG5ld0lkQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZElkQ2xhc3MgPSB0aGlzLmlkQ2xhc3M7Ci0JCXRoaXMuaWRDbGFzcyA9IG5ld0lkQ2xhc3M7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSWRDbGFzcy5JRF9DTEFTU19QUk9QRVJUWSwgb2xkSWRDbGFzcywgbmV3SWRDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIElkQ2xhc3NBbm5vdGF0aW9uIGdldElkQ2xhc3NSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChJZENsYXNzQW5ub3RhdGlvbikgdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZElkQ2xhc3NSZXNvdXJjZSgpIHsKLQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUlkQ2xhc3NSZXNvdXJjZSgpIHsKLQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHVibGljIEVudGl0eSBnZXRQYXJlbnRFbnRpdHkoKSB7Ci0JCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGkgPSBnZXRQZXJzaXN0ZW50VHlwZSgpLmluaGVyaXRhbmNlSGllcmFyY2h5KCk7IGkuaGFzTmV4dCgpOykgewotCQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSBpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQlpZiAodHlwZU1hcHBpbmcgIT0gdGhpcyAmJiB0eXBlTWFwcGluZyBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXJldHVybiAoRW50aXR5KSB0eXBlTWFwcGluZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5IGdldFJvb3RFbnRpdHkoKSB7Ci0JCUVudGl0eSByb290RW50aXR5ID0gdGhpczsKLQkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gaSA9IGdldFBlcnNpc3RlbnRUeXBlKCkuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGkubmV4dCgpOwotCQkJaWYgKHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXJvb3RFbnRpdHkgPSAoRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3RFbnRpdHk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKGdldFBlcnNpc3RlbnRUeXBlKCkuYWxsQXR0cmlidXRlcygpKTsKLQl9Ci0JCi0JLy9jb3BpZWQgaW4gR2VuZXJpY09ybUVudGl0eSB0byBhdm9pZCBhbiBBUEkgY2hhbmdlIGZvciBmaXhpbmcgYnVnIDIyOTQyMyBpbiBSQzEKLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nIHBrQ29sdW1uTmFtZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gYXR0cmlidXRlczsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJLy9pZiB0aGUgYXR0cmlidXRlIGlzIGEgcHJpbWFyeSBrZXkgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGlzIGFuIGF0dHJpYnV0ZSBvdmVycmlkZQotCQkJCS8vYW5kIHVzZSBpdHMgY29sdW1uIG5hbWUgaW5zdGVhZCAoYnVnIDIyOTQyMykKLQkJCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlICE9IG51bGwpIHsKLQkJCQkJbmFtZSA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocGtDb2x1bW5OYW1lID09IG51bGwpIHsKLQkJCQlwa0NvbHVtbk5hbWUgPSBuYW1lOwotCQkJfQotCQkJZWxzZSBpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJLy8gaWYgd2UgZW5jb3VudGVyIGEgY29tcG9zaXRlIHByaW1hcnkga2V5LCByZXR1cm4gbnVsbAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGVuY291bnRlciBvbmx5IGEgc2luZ2xlIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lLCByZXR1cm4gaXQKLQkJcmV0dXJuIHBrQ29sdW1uTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gIUNvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCksIHRhYmxlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFRhYmxlPih0aGlzLmdldFRhYmxlKCksIHRoaXMuc2Vjb25kYXJ5VGFibGVzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxUYWJsZT4gYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxUYWJsZT4obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VHlwZU1hcHBpbmcsIEl0ZXJhdG9yPFRhYmxlPj4odGhpcy5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxUYWJsZT4gdHJhbnNmb3JtKFR5cGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFRhYmxlLCBUYWJsZT4obWFwcGluZy5hc3NvY2lhdGVkVGFibGVzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChUYWJsZSBvKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCS8vVE9ETwotCQkJCQkJLy9maWx0ZXJpbmcgdGhlc2Ugb3V0IHNvIGFzIHRvIGF2b2lkIHRoZSBkdXBsaWNhdGUgdGFibGUsIHJvb3QgYW5kIGNoaWxkcmVuIHNoYXJlIHRoZSBzYW1lIHRhYmxlCi0JCQkJCQkvL3JldHVybiAhKG8gaW5zdGFuY2VvZiBTaW5nbGVUYWJsZUluaGVyaXRhbmNlQ2hpbGRUYWJsZUltcGwpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk51bGxUYWJsZU5hbWVzKHRoaXMuYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBub25OdWxsVGFibGVOYW1lcyhJdGVyYXRvcjxUYWJsZT4gdGFibGVzKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMudGFibGVOYW1lcyh0YWJsZXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChTdHJpbmcgbykgewotCQkJCXJldHVybiBvICE9IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdGFibGVOYW1lcyhJdGVyYXRvcjxUYWJsZT4gdGFibGVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUYWJsZSwgU3RyaW5nPih0YWJsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oVGFibGUgdCkgewotCQkJCXJldHVybiB0LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb2YgRW50aXRpZXMsIGVhY2ggd2hpY2ggaW5oZXJpdHMgZnJvbSB0aGUgb25lIGJlZm9yZSwKLQkgKiBhbmQgdGVybWluYXRlcyBhdCB0aGUgcm9vdCBlbnRpdHkgKG9yIGF0IHRoZSBwb2ludCBvZiBjeWNsaWNpdHkpLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxUeXBlTWFwcGluZz4gaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQZXJzaXN0ZW50VHlwZSwgVHlwZU1hcHBpbmc+KGdldFBlcnNpc3RlbnRUeXBlKCkuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgdHJhbnNmb3JtKFBlcnNpc3RlbnRUeXBlIHR5cGUpIHsKLQkJCQlyZXR1cm4gdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFR5cGVNYXBwaW5nLCBJdGVyYXRvcjxTdHJpbmc+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKFR5cGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCQlyZXR1cm4gbWFwcGluZy5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUeXBlTWFwcGluZywgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gdHJhbnNmb3JtKFR5cGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCQlyZXR1cm4gbWFwcGluZy5vdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+KG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFR5cGVNYXBwaW5nLCBJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPj4odGhpcy5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgbWFwcGluZykgewotCQkJCXJldHVybiBtYXBwaW5nLm92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUeXBlTWFwcGluZywgSXRlcmF0b3I8U3RyaW5nPj4odGhpcy5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHRyYW5zZm9ybShUeXBlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQkJcmV0dXJuIG1hcHBpbmcub3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlzdXBlci51cGRhdGUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuZW50aXR5UmVzb3VyY2UgPSAoRW50aXR5QW5ub3RhdGlvbikgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQl0aGlzLnNldFNwZWNpZmllZE5hbWVfKHRoaXMuc3BlY2lmaWVkTmFtZSh0aGlzLmVudGl0eVJlc291cmNlKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdE5hbWUodGhpcy5kZWZhdWx0TmFtZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSk7Ci0JCQotCQl0aGlzLnVwZGF0ZUluaGVyaXRhbmNlKGdldEluaGVyaXRhbmNlUmVzb3VyY2UoKSk7Ci0JCXRoaXMudXBkYXRlRGlzY3JpbWluYXRvckNvbHVtbihyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy51cGRhdGVEaXNjcmltaW5hdG9yVmFsdWUoZ2V0RGlzY3JpbWluYXRvclZhbHVlUmVzb3VyY2UoKSk7Ci0JCXRoaXMuc2V0RGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZChkaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkpOwotCQl0aGlzLnVwZGF0ZVRhYmxlKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnVwZGF0ZVNlY29uZGFyeVRhYmxlcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy51cGRhdGVUYWJsZUdlbmVyYXRvcihyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy51cGRhdGVTZXF1ZW5jZUdlbmVyYXRvcihyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy51cGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy51cGRhdGVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnVwZGF0ZVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy51cGRhdGVOYW1lZFF1ZXJpZXMocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMudXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnVwZGF0ZUlkQ2xhc3MocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMudXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9yc0FuZFF1ZXJpZXMoKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTmFtZShFbnRpdHlBbm5vdGF0aW9uIGVudGl0eUFubm90YXRpb24pIHsKLQkJcmV0dXJuIGVudGl0eUFubm90YXRpb24uZ2V0TmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UuZ2V0TmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRhYmxlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJZ2V0VGFibGUoKS51cGRhdGUocGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUluaGVyaXRhbmNlKEluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbmhlcml0YW5jZVJlc291cmNlKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneV8odGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KGluaGVyaXRhbmNlUmVzb3VyY2UpKTsKLQkJdGhpcy5zZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSh0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIHNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VBbm5vdGF0aW9uIGluaGVyaXRhbmNlUmVzb3VyY2UpIHsKLQkJcmV0dXJuIEluaGVyaXRhbmNlVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoaW5oZXJpdGFuY2VSZXNvdXJjZS5nZXRTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBkZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpIHsKLQkJaWYgKGdldFJvb3RFbnRpdHkoKSA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRTsKLQkJfQotCQlyZXR1cm4gZ2V0Um9vdEVudGl0eSgpLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGlzY3JpbWluYXRvckNvbHVtbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKSB7Ci0JCWdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS51cGRhdGUocGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURpc2NyaW1pbmF0b3JWYWx1ZShEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JWYWx1ZVJlc291cmNlKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlXyhkaXNjcmltaW5hdG9yVmFsdWVSZXNvdXJjZS5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKHRoaXMuamF2YURlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIEZyb20gdGhlIFNwZWM6Ci0JICogSWYgdGhlIERpc2NyaW1pbmF0b3JWYWx1ZSBhbm5vdGF0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIGEKLQkgKiBwcm92aWRlci1zcGVjaWZpYyBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIHZhbHVlIHJlcHJlc2VudGluZwotCSAqIHRoZSBlbnRpdHkgdHlwZSBpcyB1c2VkIGZvciB0aGUgdmFsdWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IKLQkgKiBjb2x1bW4uIElmIHRoZSBEaXNjcmltaW5hdG9yVHlwZSBpcyBTVFJJTkcsIHRoZSBkaXNjcmltaW5hdG9yCi0JICogdmFsdWUgZGVmYXVsdCBpcyB0aGUgZW50aXR5IG5hbWUuCi0JICogCi0JICogVE9ETyBleHRlbnNpb24gcG9pbnQgZm9yIHByb3ZpZGVyLXNwZWNpZmljIGZ1bmN0aW9uPwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgamF2YURlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSB7Ci0JCWlmICh0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmlzQWJzdHJhY3QoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSAhPSBEaXNjcmltaW5hdG9yVHlwZS5TVFJJTkcpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldE5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlyZXR1cm4gIXBlcnNpc3RlbnRUeXBlUmVzb3VyY2UuaXNBYnN0cmFjdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWNvbmRhcnlUYWJsZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMgPSBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHJlc291cmNlU2Vjb25kYXJ5VGFibGVzID0gcGVyc2lzdGVudFR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQl3aGlsZSAoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSkgewotCQkJSmF2YVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCQlzZWNvbmRhcnlUYWJsZS51cGRhdGUoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VTZWNvbmRhcnlUYWJsZXMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlXyhzZWNvbmRhcnlUYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZVNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSwgYnVpbGRTZWNvbmRhcnlUYWJsZSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVNlY29uZGFyeVRhYmxlcy5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhU2Vjb25kYXJ5VGFibGUgYnVpbGRTZWNvbmRhcnlUYWJsZShTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSkgewotCQlKYXZhU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhU2Vjb25kYXJ5VGFibGUodGhpcyk7Ci0JCXNlY29uZGFyeVRhYmxlLmluaXRpYWxpemUoc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSk7Ci0JCXJldHVybiBzZWNvbmRhcnlUYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYWJsZUdlbmVyYXRvcihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKSB7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gdGFibGVHZW5lcmF0b3IocGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7Ci0JCWlmICh0YWJsZUdlbmVyYXRvclJlc291cmNlID09IG51bGwpIHsKLQkJCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcihidWlsZFRhYmxlR2VuZXJhdG9yKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdldFRhYmxlR2VuZXJhdG9yKCkudXBkYXRlKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhVGFibGVHZW5lcmF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvcihUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JSZXNvdXJjZSkgewotCQlKYXZhVGFibGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVRhYmxlR2VuZXJhdG9yKHRoaXMpOwotCQlnZW5lcmF0b3IuaW5pdGlhbGl6ZSh0YWJsZUdlbmVyYXRvclJlc291cmNlKTsKLQkJcmV0dXJuIGdlbmVyYXRvcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvcihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKSB7Ci0JCXJldHVybiAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBwZXJzaXN0ZW50VHlwZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VxdWVuY2VHZW5lcmF0b3IoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IHNlcXVlbmNlR2VuZXJhdG9yKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCQlpZiAoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlnZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnVwZGF0ZShzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFTZXF1ZW5jZUdlbmVyYXRvcih0aGlzKTsKLQkJZ2VuZXJhdG9yLmluaXRpYWxpemUoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCXJldHVybiBnZW5lcmF0b3I7Ci0JfQotCQotCXByb3RlY3RlZCBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlyZXR1cm4gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgcGVyc2lzdGVudFR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gcmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBwZXJzaXN0ZW50VHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXdoaWxlIChwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJCXByaW1hcnlLZXlKb2luQ29sdW1uLnVwZGF0ZSgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5fKHByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpLCBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSkgewotCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW4uaW5pdGlhbGl6ZShwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlKTsKLQkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKSB7Ci0JCWlmICghc2hvdWxkQnVpbGREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSkgewotCQkJc2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG5ldyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uLnVwZGF0ZShuZXcgTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpKTsKLQkJfQotCX0KLQkJCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiByZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUgKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKSB7Ci0JCQkJYXR0cmlidXRlT3ZlcnJpZGUudXBkYXRlKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZV8oYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCksIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKSk7Ci0JCX0JCi0JfQotCQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSkgewotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuaW5pdGlhbGl6ZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKTsKLQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUsIFBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXJldHVybiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgYXR0cmlidXRlKSk7Ci0JfQotCQotCXByb3RlY3RlZCBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlLCBQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlDb2x1bW5NYXBwaW5nIGNvbHVtbk1hcHBpbmcgPSAoQ29sdW1uTWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgYXR0cmlidXRlLmdldE5hbWUoKSwgY29sdW1uTWFwcGluZy5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCWZvciAoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpKSkgewotCQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGUgPT0gbnVsbCkgewotCQkJCWFkZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlLCBwZXJzaXN0ZW50QXR0cmlidXRlKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSkgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlLnVwZGF0ZShidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKHJlc291cmNlUGVyc2lzdGVudFR5cGUsIHBlcnNpc3RlbnRBdHRyaWJ1dGUpKTsKLQkJCX0KLQkJfQotCQkKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpKTsKLQkKLQkJLy9yZW1vdmUgYW55IGRlZmF1bHQgbWFwcGluZ3MgdGhhdCBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBhdHRyaWJ1dGVOYW1lcyBjb2xsZWN0aW9uCi0JCWZvciAoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSkpIHsKLQkJCWlmICghYXR0cmlidXRlTmFtZXMuY29udGFpbnMoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKQotCQkJCXx8IGNvbnRhaW5zU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKSkgewotCQkJCXJlbW92ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlUGVyc2lzdGVudFR5cGUuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXdoaWxlIChhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnVwZGF0ZSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVfKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCksIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKSk7Ci0JCX0JCi0JfQotCQotCXByb3RlY3RlZCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlKSB7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZSh0aGlzLCBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIoKSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuaW5pdGlhbGl6ZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UpOwotCQlyZXR1cm4gYXNzb2NpYXRpb25PdmVycmlkZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSBhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIGFzc29jaWF0aW9uTmFtZSA9IGkubmV4dCgpOwotCQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IGdldEFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lZChhc3NvY2lhdGlvbk5hbWUpOwotCQkJaWYgKGFzc29jaWF0aW9uT3ZlcnJpZGUgPT0gbnVsbCkgewotCQkJCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUobmV3IE51bGxBc3NvY2lhdGlvbk92ZXJyaWRlKHJlc291cmNlUGVyc2lzdGVudFR5cGUsIGFzc29jaWF0aW9uTmFtZSkpOwotCQkJCWFkZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQkJfQotCQkJZWxzZSBpZiAoYXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSkgewotCQkJCWFzc29jaWF0aW9uT3ZlcnJpZGUudXBkYXRlKG5ldyBOdWxsQXNzb2NpYXRpb25PdmVycmlkZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlLCBhc3NvY2lhdGlvbk5hbWUpKTsKLQkJCX0KLQkJfQotCQkKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFzc29jaWF0aW9uTmFtZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSk7Ci0JCi0JCS8vcmVtb3ZlIGFueSBkZWZhdWx0IG1hcHBpbmdzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgYXNzb2NpYXRpb25OYW1lcyBjb2xsZWN0aW9uCi0JCWZvciAoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSkpIHsKLQkJCWlmICghYXNzb2NpYXRpb25OYW1lcy5jb250YWlucyhhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSkKLQkJCQl8fCBjb250YWluc1NwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpKSB7Ci0JCQkJcmVtb3ZlVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVOYW1lZFF1ZXJpZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkUXVlcnk+IHF1ZXJpZXMgPSBuYW1lZFF1ZXJpZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHJlc291cmNlTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXdoaWxlIChxdWVyaWVzLmhhc05leHQoKSkgewotCQkJSmF2YU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IHF1ZXJpZXMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlTmFtZWRRdWVyaWVzLmhhc05leHQoKSkgewotCQkJCW5hbWVkUXVlcnkudXBkYXRlKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VOYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZU5hbWVkUXVlcnlfKG5hbWVkUXVlcnkpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VOYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKSB7Ci0JCQlhZGROYW1lZFF1ZXJ5KG5hbWVkUXVlcmllc1NpemUoKSwgYnVpbGROYW1lZFF1ZXJ5KChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VOYW1lZFF1ZXJpZXMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFOYW1lZE5hdGl2ZVF1ZXJ5PiBxdWVyaWVzID0gbmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiByZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcyA9IHJlc291cmNlUGVyc2lzdGVudFR5cGUuYW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQl3aGlsZSAocXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCUphdmFOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkUXVlcnkgPSBxdWVyaWVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCQluYW1lZFF1ZXJ5LnVwZGF0ZSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5XyhuYW1lZFF1ZXJ5KTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSkgewotCQkJYWRkTmFtZWROYXRpdmVRdWVyeShuYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCksIGJ1aWxkTmFtZWROYXRpdmVRdWVyeSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSkpOwotCQl9CQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSmF2YU5hbWVkUXVlcnkgYnVpbGROYW1lZFF1ZXJ5KE5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnlSZXNvdXJjZSkgewotCQlKYXZhTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YU5hbWVkUXVlcnkodGhpcyk7Ci0JCW5hbWVkUXVlcnkuaW5pdGlhbGl6ZShuYW1lZFF1ZXJ5UmVzb3VyY2UpOwotCQlyZXR1cm4gbmFtZWRRdWVyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFOYW1lZE5hdGl2ZVF1ZXJ5IGJ1aWxkTmFtZWROYXRpdmVRdWVyeShOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UpIHsKLQkJSmF2YU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFOYW1lZE5hdGl2ZVF1ZXJ5KHRoaXMpOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LmluaXRpYWxpemUobmFtZWROYXRpdmVRdWVyeVJlc291cmNlKTsKLQkJcmV0dXJuIG5hbWVkTmF0aXZlUXVlcnk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSWRDbGFzcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCUlkQ2xhc3NBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoSWRDbGFzc0Fubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlzZXRJZENsYXNzXyhhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0SWRDbGFzc18obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9yc0FuZFF1ZXJpZXMoKSB7Ci0JCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZEdlbmVyYXRvcihnZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJfQotCQkKLQkJaWYgKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkR2VuZXJhdG9yKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQl9Ci0JCQotCQlmb3IgKFF1ZXJ5IHF1ZXJ5IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5hbWVkUXVlcmllcygpKSkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkUXVlcnkocXVlcnkpOwotCQl9Ci0JCQotCQlmb3IgKFF1ZXJ5IHF1ZXJ5IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5hbWVkTmF0aXZlUXVlcmllcygpKSkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkUXVlcnkocXVlcnkpOwotCQl9Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKioqKioqIENvZGUgQ29tcGxldGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5nZXRUYWJsZSgpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWZvciAoSmF2YVNlY29uZGFyeVRhYmxlIHNUYWJsZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLnNlY29uZGFyeVRhYmxlcygpKSkgewotCQkJcmVzdWx0ID0gc1RhYmxlLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJZm9yIChKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gY29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlyZXN1bHQgPSBjb2x1bW4uamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlmb3IgKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBvdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlcygpKSkgewotCQkJcmVzdWx0ID0gb3ZlcnJpZGUuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlmb3IgKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMoKSkpIHsKLQkJCXJlc3VsdCA9IG92ZXJyaWRlLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLmdldFRhYmxlR2VuZXJhdG9yKCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlpZiAodGhpcy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQkKLQkJZ2V0VGFibGUoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJYWRkSWRNZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCWFkZEdlbmVyYXRvck1lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJYWRkUXVlcnlNZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc3RyZWFtID0gdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCkuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3RyZWFtID0gdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCkuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHN0cmVhbSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCkuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCX0KLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZElkTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWFkZE5vSWRNZXNzYWdlKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9JZE1lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmIChlbnRpdHlIYXNOb0lkKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9OT19JRCwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCXRoaXMsIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkKLQkJCSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGVudGl0eUhhc05vSWQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZW50aXR5SGFzSWQoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW50aXR5SGFzSWQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaXNJZEF0dHJpYnV0ZSgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmF0b3JNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJTGlzdDxHZW5lcmF0b3I+IG1hc3Rlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpOwotCQkKLQkJZm9yIChJdGVyYXRvcjxKYXZhR2VuZXJhdG9yPiBzdHJlYW0gPSB0aGlzLmdlbmVyYXRvcnMoKTsgc3RyZWFtLmhhc05leHQoKSA7ICkgewotCQkJSmF2YUdlbmVyYXRvciBjdXJyZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJCW1hc3Rlckxpc3QucmVtb3ZlKGN1cnJlbnQpOwotCQkJCi0JCQlmb3IgKEdlbmVyYXRvciBlYWNoIDogbWFzdGVyTGlzdCkgewotCQkJCWlmICghIGVhY2gub3ZlcnJpZGVzKGN1cnJlbnQpICYmIGVhY2guZ2V0TmFtZSgpICE9IG51bGwgJiYgZWFjaC5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnQuZ2V0TmFtZSgpKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5HRU5FUkFUT1JfRFVQTElDQVRFX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldE5hbWUoKX0sCi0JCQkJCQkJY3VycmVudCwKLQkJCQkJCQljdXJyZW50LmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQltYXN0ZXJMaXN0LmFkZChjdXJyZW50KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRRdWVyeU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlMaXN0PFF1ZXJ5PiBtYXN0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8SmF2YVF1ZXJ5PiBzdHJlYW0gPSB0aGlzLnF1ZXJpZXMoKTsgc3RyZWFtLmhhc05leHQoKSA7ICkgewotCQkJSmF2YVF1ZXJ5IGN1cnJlbnQgPSBzdHJlYW0ubmV4dCgpOwotCQkJbWFzdGVyTGlzdC5yZW1vdmUoY3VycmVudCk7Ci0JCQkKLQkJCWZvciAoUXVlcnkgZWFjaCA6IG1hc3Rlckxpc3QpIHsKLQkJCQlpZiAoISBlYWNoLm92ZXJyaWRlcyhjdXJyZW50KSAmJiBlYWNoLmdldE5hbWUoKSAhPSBudWxsICYmIGVhY2guZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUVVFUllfRFVQTElDQVRFX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldE5hbWUoKX0sCi0JCQkJCQkJY3VycmVudCwKLQkJCQkJCQljdXJyZW50LmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQltYXN0ZXJMaXN0LmFkZChjdXJyZW50KTsKLQkJfQotCX0KLQkKLQljbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyIGltcGxlbWVudHMgSmF2YUJhc2VKb2luQ29sdW1uLk93bmVyCi0JewotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUVudGl0eS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbnRpdHkudGhpczsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbnRpdHkudGhpcy5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCkgewotCQkJRW50aXR5IHBhcmVudEVudGl0eSA9IEdlbmVyaWNKYXZhRW50aXR5LnRoaXMuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCQlyZXR1cm4gKHBhcmVudEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBwYXJlbnRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCQlpZiAoam9pbkNvbHVtbnNTaXplKCkgIT0gMSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXMuZ2V0UGFyZW50RW50aXR5KCkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQkJfQotCX0KLQkKLQljbGFzcyBBdHRyaWJ1dGVPdmVycmlkZU93bmVyIGltcGxlbWVudHMgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgewotCi0JCXB1YmxpYyBDb2x1bW5NYXBwaW5nIGdldENvbHVtbk1hcHBpbmcoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJCWlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzQXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMocGVyc0F0dHJpYnV0ZS5nZXROYW1lKCkpKSB7Ci0JCQkJCWlmIChwZXJzQXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIENvbHVtbk1hcHBpbmcpIHsKLQkJCQkJCXJldHVybiAoQ29sdW1uTWFwcGluZykgcGVyc0F0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUVudGl0eS50aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuY29udGFpbnMob3ZlcnJpZGUpOwotCQl9Ci0KLQkJcHVibGljIEJhc2VPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgQmFzZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbnRpdHkudGhpcy5zZXRBdHRyaWJ1dGVPdmVycmlkZVZpcnR1YWwodmlydHVhbCwgKEphdmFBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGUpOwotCQl9Ci0KLQkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXM7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIHZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZU93bmVyIGltcGxlbWVudHMgQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lciB7Ci0KLQkJcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZyhTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJaWYgKGF0dHJpYnV0ZU5hbWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBnZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNBdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhwZXJzQXR0cmlidXRlLmdldE5hbWUoKSkpIHsKLQkJCQkJaWYgKHBlcnNBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgUmVsYXRpb25zaGlwTWFwcGluZykgewotCQkJCQkJcmV0dXJuIChSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VPdmVycmlkZSBvdmVycmlkZSkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmNvbnRhaW5zKG92ZXJyaWRlKTsKLQkJfQotCQkKLQkJcHVibGljIEJhc2VPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgQmFzZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbnRpdHkudGhpcy5zZXRBc3NvY2lhdGlvbk92ZXJyaWRlVmlydHVhbCh2aXJ0dWFsLCAoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUVudGl0eS50aGlzOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSB2YWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFHZW5lcmF0ZWRWYWx1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMjUzY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFHZW5lcmF0ZWRWYWx1ZSBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgSmF2YUdlbmVyYXRlZFZhbHVlCi17Ci0JcHJvdGVjdGVkIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0b3I7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRHZW5lcmF0b3I7Ci0JCi0JcHJvdGVjdGVkIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlOwotCQotCXB1YmxpYyBHZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlKSB7Ci0JCXRoaXMuZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZSA9IGdlbmVyYXRlZFZhbHVlOwotCQl0aGlzLnN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVneShnZW5lcmF0ZWRWYWx1ZSk7Ci0JCXRoaXMuZ2VuZXJhdG9yID0gdGhpcy5nZW5lcmF0b3IoZ2VuZXJhdGVkVmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTdHJhdGVneSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0U3RyYXRlZ3koKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0RGVmYXVsdFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gR2VuZXJhdGVkVmFsdWUuREVGQVVMVF9TVFJBVEVHWTsKLQl9Ci0JCi0JcHVibGljIEdlbmVyYXRpb25UeXBlIGdldFNwZWNpZmllZFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSBuZXdTdHJhdGVneSkgewotCQlHZW5lcmF0aW9uVHlwZSBvbGRTdHJhdGVneSA9IHRoaXMuc3RyYXRlZ3k7Ci0JCXRoaXMuc3RyYXRlZ3kgPSBuZXdTdHJhdGVneTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZVJlc291cmNlLnNldFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3RyYXRlZ3kpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfU1RSQVRFR1lfUFJPUEVSVFksIG9sZFN0cmF0ZWd5LCBuZXdTdHJhdGVneSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU3RyYXRlZ3lfKEdlbmVyYXRpb25UeXBlIG5ld1N0cmF0ZWd5KSB7Ci0JCUdlbmVyYXRpb25UeXBlIG9sZFN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVneTsKLQkJdGhpcy5zdHJhdGVneSA9IG5ld1N0cmF0ZWd5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdlbmVyYXRlZFZhbHVlLlNQRUNJRklFRF9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkU3RyYXRlZ3ksIG5ld1N0cmF0ZWd5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEdlbmVyYXRvcigpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0R2VuZXJhdG9yKCkgOiB0aGlzLmdldFNwZWNpZmllZEdlbmVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3I7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0R2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0R2VuZXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRHZW5lcmF0b3IoU3RyaW5nIG5ld0dlbmVyYXRvcikgewotCQlTdHJpbmcgb2xkR2VuZXJhdG9yID0gdGhpcy5nZW5lcmF0b3I7Ci0JCXRoaXMuZ2VuZXJhdG9yID0gbmV3R2VuZXJhdG9yOwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlUmVzb3VyY2Uuc2V0R2VuZXJhdG9yKG5ld0dlbmVyYXRvcik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR2VuZXJhdGVkVmFsdWUuU1BFQ0lGSUVEX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkR2VuZXJhdG9yLCBuZXdHZW5lcmF0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEdlbmVyYXRvcl8oU3RyaW5nIG5ld0dlbmVyYXRvcikgewotCQlTdHJpbmcgb2xkR2VuZXJhdG9yID0gdGhpcy5nZW5lcmF0b3I7Ci0JCXRoaXMuZ2VuZXJhdG9yID0gbmV3R2VuZXJhdG9yOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdlbmVyYXRlZFZhbHVlLlNQRUNJRklFRF9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZEdlbmVyYXRvciwgbmV3R2VuZXJhdG9yKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlUmVzb3VyY2UuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlUmVzb3VyY2UuZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWwgLT4gamF2YSBjb250ZXh0IG1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUpIHsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gZ2VuZXJhdGVkVmFsdWU7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU3RyYXRlZ3lfKHRoaXMuc3RyYXRlZ3koZ2VuZXJhdGVkVmFsdWUpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRHZW5lcmF0b3JfKHRoaXMuZ2VuZXJhdG9yKGdlbmVyYXRlZFZhbHVlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZSkgewotCQlyZXR1cm4gR2VuZXJhdGlvblR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRvcihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUpIHsKLQkJcmV0dXJuIGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQxZTgyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFJZE1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPElkQW5ub3RhdGlvbj4gaW1wbGVtZW50cyBKYXZhSWRNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFDb2x1bW4gY29sdW1uOwotCi0JcHJvdGVjdGVkIEphdmFHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZTsKLQotCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWw7Ci0KLQlwcm90ZWN0ZWQgSmF2YVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yOwotCi0JcHJvdGVjdGVkIEphdmFTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjsKLQotCXB1YmxpYyBHZW5lcmljSmF2YUlkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb2x1bW4gPSBjcmVhdGVKYXZhQ29sdW1uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb2x1bW4gY3JlYXRlSmF2YUNvbHVtbigpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFDb2x1bW4odGhpcywgdGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlzdXBlci5pbml0aWFsaXplKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuY29sdW1uLmluaXRpYWxpemUodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpKTsKLQkJdGhpcy50ZW1wb3JhbCA9IHRoaXMudGVtcG9yYWwodGhpcy5nZXRUZW1wb3JhbFJlc291cmNlKCkpOwotCQl0aGlzLmluaXRpYWxpemVUYWJsZUdlbmVyYXRvcihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLmluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvcihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLmluaXRpYWxpemVHZW5lcmF0ZWRWYWx1ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlVW5pdEdlbmVyYXRvcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9yKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gdGFibGVHZW5lcmF0b3IocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IGJ1aWxkVGFibGVHZW5lcmF0b3IodGFibGVHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gc2VxdWVuY2VHZW5lcmF0b3IocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3Ioc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRlZFZhbHVlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gZ2VuZXJhdGVkVmFsdWUocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKGdlbmVyYXRlZFZhbHVlUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IGJ1aWxkR2VuZXJhdGVkVmFsdWUoZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFRlbXBvcmFsQW5ub3RhdGlvbiBnZXRUZW1wb3JhbFJlc291cmNlKCkgewotCQlyZXR1cm4gKFRlbXBvcmFsQW5ub3RhdGlvbikgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtblJlc291cmNlKCkgewotCQlyZXR1cm4gKENvbHVtbkFubm90YXRpb24pIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqIElKYXZhQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKLQkJCUpQQS5DT0xVTU4sCi0JCQlKUEEuR0VORVJBVEVEX1ZBTFVFLAotCQkJSlBBLlRFTVBPUkFMLAotCQkJSlBBLlRBQkxFX0dFTkVSQVRPUiwKLQkJCUpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKiBJSWRNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKYXZhQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCX0KLQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7Ci0JCXJldHVybiB0aGlzLnRlbXBvcmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkgewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0aGlzLnRlbXBvcmFsOwotCQl0aGlzLnRlbXBvcmFsID0gbmV3VGVtcG9yYWw7Ci0JCXRoaXMuZ2V0VGVtcG9yYWxSZXNvdXJjZSgpLnNldFZhbHVlKFRlbXBvcmFsVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKG5ld1RlbXBvcmFsKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ29sdW1uTWFwcGluZy5URU1QT1JBTF9QUk9QRVJUWSwgb2xkVGVtcG9yYWwsIG5ld1RlbXBvcmFsKTsKLQl9Ci0JCi0JLyoqCi0JICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCi0JICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKLQkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCi0JICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZW1wb3JhbF8oVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKSB7Ci0JCVRlbXBvcmFsVHlwZSBvbGRUZW1wb3JhbCA9IHRoaXMudGVtcG9yYWw7Ci0JCXRoaXMudGVtcG9yYWwgPSBuZXdUZW1wb3JhbDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDb2x1bW5NYXBwaW5nLlRFTVBPUkFMX1BST1BFUlRZLCBvbGRUZW1wb3JhbCwgbmV3VGVtcG9yYWwpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUdlbmVyYXRlZFZhbHVlIGFkZEdlbmVyYXRlZFZhbHVlKCkgewotCQlpZiAoZ2V0R2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZW1lcmF0ZWRWYWx1ZSBhbHJlYWR5IGV4aXN0cyIpOwotCQl9Ci0JCXRoaXMuZ2VuZXJhdGVkVmFsdWUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhR2VuZXJhdGVkVmFsdWUodGhpcyk7Ci0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZS5pbml0aWFsaXplKGdlbmVyYXRlZFZhbHVlUmVzb3VyY2UpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSwgbnVsbCwgdGhpcy5nZW5lcmF0ZWRWYWx1ZSk7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVHZW5lcmF0ZWRWYWx1ZSgpIHsKLQkJaWYgKGdldEdlbmVyYXRlZFZhbHVlKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2VtZXJhdGVkVmFsdWUgZG9lcyBub3QgZXhpc3QsIGNhbm5vdCBiZSByZW1vdmVkIik7Ci0JCX0KLQkJSmF2YUdlbmVyYXRlZFZhbHVlIG9sZEdlbmVyYXRlZFZhbHVlID0gdGhpcy5nZW5lcmF0ZWRWYWx1ZTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IG51bGw7Ci0JCWdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZLCBvbGRHZW5lcmF0ZWRWYWx1ZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRHZW5lcmF0ZWRWYWx1ZShKYXZhR2VuZXJhdGVkVmFsdWUgbmV3R2VuZXJhdGVkVmFsdWUpIHsKLQkJSmF2YUdlbmVyYXRlZFZhbHVlIG9sZEdlbmVyYXRlZFZhbHVlID0gdGhpcy5nZW5lcmF0ZWRWYWx1ZTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IG5ld0dlbmVyYXRlZFZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSwgb2xkR2VuZXJhdGVkVmFsdWUsIG5ld0dlbmVyYXRlZFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVRhYmxlR2VuZXJhdG9yIGFkZFRhYmxlR2VuZXJhdG9yKCkgewotCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0YWJsZUdlbmVyYXRvciBhbHJlYWR5IGV4aXN0cyIpOwotCQl9Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhVGFibGVHZW5lcmF0b3IodGhpcyk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGhpcy50YWJsZUdlbmVyYXRvci5pbml0aWFsaXplKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy50YWJsZUdlbmVyYXRvcik7Ci0JCXJldHVybiB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVUYWJsZUdlbmVyYXRvcigpIHsKLQkJaWYgKGdldFRhYmxlR2VuZXJhdG9yKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGFibGVHZW5lcmF0b3IgZG9lcyBub3QgZXhpc3QsIGNhbm5vdCBiZSByZW1vdmVkIik7Ci0JCX0KLQkJSmF2YVRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGhpcy50YWJsZUdlbmVyYXRvcjsKLQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IG51bGw7Ci0JCWdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRUYWJsZUdlbmVyYXRvciwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihKYXZhVGFibGVHZW5lcmF0b3IgbmV3VGFibGVHZW5lcmF0b3IpIHsKLQkJSmF2YVRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGhpcy50YWJsZUdlbmVyYXRvcjsKLQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IG5ld1RhYmxlR2VuZXJhdG9yOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkVGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZXF1ZW5jZUdlbmVyYXRvciBhbHJlYWR5IGV4aXN0cyIpOwotCQl9Ci0JCQotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVNlcXVlbmNlR2VuZXJhdG9yKHRoaXMpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IuaW5pdGlhbGl6ZShzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFksIG51bGwsIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3IpOwotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNlcXVlbmNlR2VuZXJhdG9yIGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgYmUgcmVtb3ZlZCIpOwotCQl9Ci0JCUphdmFTZXF1ZW5jZUdlbmVyYXRvciBvbGRTZXF1ZW5jZUdlbmVyYXRvciA9IHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBudWxsOwotCQlnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZXF1ZW5jZUdlbmVyYXRvcihKYXZhU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJSmF2YVNlcXVlbmNlR2VuZXJhdG9yIG9sZFNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IG5ld1NlcXVlbmNlR2VuZXJhdG9yOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEphdmFHZW5lcmF0b3I+IGdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8SmF2YUdlbmVyYXRvcj4oCi0JCQkoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSA6IG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSksCi0JCQkoZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSA6IG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoZ2V0VGFibGVHZW5lcmF0b3IoKSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJc3VwZXIudXBkYXRlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZSh0aGlzLmdldENvbHVtblJlc291cmNlKCkpOwotCQl0aGlzLnNldFRlbXBvcmFsXyh0aGlzLnRlbXBvcmFsKHRoaXMuZ2V0VGVtcG9yYWxSZXNvdXJjZSgpKSk7Ci0JCXRoaXMudXBkYXRlVGFibGVHZW5lcmF0b3IocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy51cGRhdGVTZXF1ZW5jZUdlbmVyYXRvcihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLnVwZGF0ZUdlbmVyYXRlZFZhbHVlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMudXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9ycygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHRlbXBvcmFsKFRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCkgewotCQlyZXR1cm4gVGVtcG9yYWxUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbCh0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYWJsZUdlbmVyYXRvcihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IHRhYmxlR2VuZXJhdG9yKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCWlmICh0YWJsZUdlbmVyYXRvclJlc291cmNlID09IG51bGwpIHsKLQkJCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcihidWlsZFRhYmxlR2VuZXJhdG9yKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdldFRhYmxlR2VuZXJhdG9yKCkudXBkYXRlKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhVGFibGVHZW5lcmF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvcihUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JSZXNvdXJjZSkgewotCQlKYXZhVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhVGFibGVHZW5lcmF0b3IodGhpcyk7Ci0JCXRhYmxlR2VuZXJhdG9yLmluaXRpYWxpemUodGFibGVHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VxdWVuY2VHZW5lcmF0b3IoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBzZXF1ZW5jZUdlbmVyYXRvcihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlpZiAoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlnZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnVwZGF0ZShzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJSmF2YVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVNlcXVlbmNlR2VuZXJhdG9yKHRoaXMpOwotCQlzZXF1ZW5jZUdlbmVyYXRvci5pbml0aWFsaXplKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUdlbmVyYXRlZFZhbHVlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gZ2VuZXJhdGVkVmFsdWUocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKGdlbmVyYXRlZFZhbHVlUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJaWYgKGdldEdlbmVyYXRlZFZhbHVlKCkgIT0gbnVsbCkgewotCQkJCXNldEdlbmVyYXRlZFZhbHVlKG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldEdlbmVyYXRlZFZhbHVlKCkgPT0gbnVsbCkgewotCQkJCXNldEdlbmVyYXRlZFZhbHVlKGJ1aWxkR2VuZXJhdGVkVmFsdWUoZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ2V0R2VuZXJhdGVkVmFsdWUoKS51cGRhdGUoZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFHZW5lcmF0ZWRWYWx1ZSBidWlsZEdlbmVyYXRlZFZhbHVlKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlKSB7Ci0JCUphdmFHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFHZW5lcmF0ZWRWYWx1ZSh0aGlzKTsKLQkJZ2VuZXJhdGVkVmFsdWUuaW5pdGlhbGl6ZShnZW5lcmF0ZWRWYWx1ZVJlc291cmNlKTsKLQkJcmV0dXJuIGdlbmVyYXRlZFZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBlcnNpc3RlbmNlVW5pdEdlbmVyYXRvcnMoKSB7Ci0JCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZEdlbmVyYXRvcihnZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJfQotCQkKLQkJaWYgKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkR2VuZXJhdG9yKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLmdldENvbHVtbigpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbigpLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJZE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vKioqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJCi0JCWFkZENvbHVtbk1lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJYWRkR2VuZXJhdGVkVmFsdWVNZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCWFkZEdlbmVyYXRvck1lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbHVtbk1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlKYXZhQ29sdW1uIGNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uKCk7Ci0JCVN0cmluZyB0YWJsZSA9IGNvbHVtbi5nZXRUYWJsZSgpOwotCQlib29sZWFuIGRvQ29udGludWUgPSBlbnRpdHlPd25lZCgpICYmIGNvbHVtbi5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCQotCQlpZiAoZG9Db250aW51ZSAmJiB0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlLCBjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sIGNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJZG9Db250aW51ZSA9IGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoZG9Db250aW51ZSAmJiAhIGNvbHVtbi5pc1Jlc29sdmVkKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2NvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWNvbHVtbiwgY29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmF0ZWRWYWx1ZU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlKYXZhR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSB0aGlzLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlmIChnZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGdlbmVyYXRvck5hbWUgPSBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKTsKLQkJaWYgKGdlbmVyYXRvck5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlmb3IgKEdlbmVyYXRvciBuZXh0TWFzdGVyR2VuZXJhdG9yIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpIHsKLQkJCWlmIChnZW5lcmF0b3JOYW1lLmVxdWFscyhuZXh0TWFzdGVyR2VuZXJhdG9yLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCW1lc3NhZ2VzLmFkZCgKLQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRSwKLQkJCQluZXcgU3RyaW5nW10ge2dlbmVyYXRvck5hbWV9LAotCQkJCXRoaXMsCi0JCQkJZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkR2VuZXJhdG9yTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUxpc3Q8R2VuZXJhdG9yPiBtYXN0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8SmF2YUdlbmVyYXRvcj4gc3RyZWFtID0gdGhpcy5nZW5lcmF0b3JzKCk7IHN0cmVhbS5oYXNOZXh0KCkgOyApIHsKLQkJCUphdmFHZW5lcmF0b3IgY3VycmVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQltYXN0ZXJMaXN0LnJlbW92ZShjdXJyZW50KTsKLQkJCQotCQkJZm9yIChHZW5lcmF0b3IgZWFjaCA6IG1hc3Rlckxpc3QpIHsKLQkJCQlpZiAoISBlYWNoLm92ZXJyaWRlcyhjdXJyZW50KSAmJiBlYWNoLmdldE5hbWUoKSAhPSBudWxsICYmIGVhY2guZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7Y3VycmVudC5nZXROYW1lKCl9LAotCQkJCQkJCWN1cnJlbnQsCi0JCQkJCQkJY3VycmVudC5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJbWFzdGVyTGlzdC5hZGQoY3VycmVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmYTNhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUpvaW5Db2x1bW4gZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNlQ29sdW1uPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbXBsZW1lbnRzIEphdmFKb2luQ29sdW1uCi17Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0KLQlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbjsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFKb2luQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFKb2luQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID09IG51bGwpID8gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgOiB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUpvaW5Db2x1bW4uU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUpvaW5Db2x1bW4uU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VKb2luQ29sdW1uLkRFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFKb2luQ29sdW1uLk93bmVyIGdldE93bmVyKCkgewotCQlyZXR1cm4gKEphdmFKb2luQ29sdW1uLk93bmVyKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuaXNWaXJ0dWFsKHRoaXMpOwotCX0KLQotCXB1YmxpYyBUYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0RGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ29sdW1uIGdldERiUmVmZXJlbmNlZENvbHVtbigpIHsKLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCk7Ci0JCXJldHVybiAodGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGFibGUuZ2V0Q29sdW1uTmFtZWQodGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB0YWJsZUlzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIoKS50YWJsZUlzQWxsb3dlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0Q29sdW1uUmVzb3VyY2UoKS5yZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKCkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0T3duZXIoKS5nZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlICE9IG51bGwpID8gdGFibGUuY29sdW1uTmFtZXMoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz4gaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBxdW90ZWRDYW5kaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhmaWx0ZXIpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuY29ubmVjdGVkSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlZENvbHVtblJlc29sdmVkKCkgewotCQlyZXR1cm4gZ2V0RGJSZWZlcmVuY2VkQ29sdW1uKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRDb2x1bW5SZXNvdXJjZSgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IGdldE93bmVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMuam9pbkNvbHVtbiA9IGpvaW5Db2x1bW47Ci0JCXN1cGVyLmluaXRpYWxpemUoam9pbkNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5qb2luQ29sdW1uID0gam9pbkNvbHVtbjsKLQkJc3VwZXIudXBkYXRlKGpvaW5Db2x1bW4pOwotCQl0aGlzLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lXyhqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQl0aGlzLnNldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSh0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCWlmIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuaXNSZWxhdGlvbnNoaXBPd25lcigpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHROYW1lKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCWlmIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuaXNSZWxhdGlvbnNoaXBPd25lcigpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSh0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFibGUoKSB7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IGdldE93bmVyKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQlpZiAocmVsYXRpb25zaGlwTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoIWdldE93bmVyKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmlzUmVsYXRpb25zaGlwT3duZXIoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmRlZmF1bHRUYWJsZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkOWUyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTm9uT3duaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUpvaW5UYWJsZSBleHRlbmRzIEFic3RyYWN0SmF2YVRhYmxlIGltcGxlbWVudHMgSmF2YUpvaW5UYWJsZQotewotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1uczsKLQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbjsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnM7Ci0KLQlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gZGVmYXVsdEludmVyc2VKb2luQ29sdW1uOwotCQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlOwotCQotCXB1YmxpYyBHZW5lcmljSmF2YUpvaW5UYWJsZShKYXZhUmVsYXRpb25zaGlwTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8SmF2YUpvaW5Db2x1bW4+KCk7Ci0JCXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxKYXZhSm9pbkNvbHVtbj4oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVsYXRpb25zaGlwTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKioqKiBBYnN0cmFjdEphdmFUYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQkvKioKLQkgKiBEZWZhdWx0IGpvaW4gdGFibGUgbmFtZSBmcm9tIHRoZSBKUEEgc3BlYzoKLQkgKiAJVGhlIGNvbmNhdGVuYXRlZCBuYW1lcyBvZiB0aGUgdHdvIGFzc29jaWF0ZWQgcHJpbWFyeQotCSAqIAllbnRpdHkgdGFibGVzLCBzZXBhcmF0ZWQgYnkgYSB1bmRlcnNjb3JlLgotCSAqIAotCSAqIFtvd25pbmcgdGFibGUgbmFtZV1fW3RhcmdldCB0YWJsZSBuYW1lXQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luVGFibGVEZWZhdWx0TmFtZShnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2coKSB7Ci0JCWlmICghZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmlzUmVsYXRpb25zaGlwT3duZXIoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmRlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYSgpIHsKLQkJaWYgKCFnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuaXNSZWxhdGlvbnNoaXBPd25lcigpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZGVmYXVsdFNjaGVtYSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9pblRhYmxlQW5ub3RhdGlvbiBnZXRUYWJsZVJlc291cmNlKCkgewotCQlyZXR1cm4gKEpvaW5UYWJsZUFubm90YXRpb24pIHRoaXMuYXR0cmlidXRlUmVzb3VyY2UuZ2V0Tm9uTnVsbEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGpvaW4gdGFibGUgamF2YSByZXNvdXJjZSwgbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBkb2VzIG5vdCBleGlzdC4KLQkgKiBVc2UgdGFibGVSZXNvdXJjZSgpIGlmIHlvdSB3YW50IGEgbm9uIG51bGwgaW1wbGVtZW50YXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSm9pblRhYmxlQW5ub3RhdGlvbiBnZXRKb2luVGFibGVSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChKb2luVGFibGVBbm5vdGF0aW9uKSB0aGlzLmF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKb2luVGFibGVSZXNvdXJjZSgpIHsKLQkJdGhpcy5hdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKioqIElKb2luVGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkgOiB0aGlzLmRlZmF1bHRKb2luQ29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIG5ld0pvaW5Db2x1bW4pIHsKLQkJSmF2YUpvaW5Db2x1bW4gb2xkSm9pbkNvbHVtbiA9IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBuZXdKb2luQ29sdW1uOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEpvaW5UYWJsZS5ERUZBVUxUX0pPSU5fQ09MVU1OLCBvbGRKb2luQ29sdW1uLCBuZXdKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBkZWZhdWx0Sm9pbkNvbHVtbnMoKSB7Ci0JCWlmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0Sm9pbkNvbHVtbik7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAhdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEphdmFKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUpvaW5Db2x1bW4gb2xkRGVmYXVsdEpvaW5Db2x1bW4gPSB0aGlzLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCWlmIChvbGREZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL251bGwgdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbm93IGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkJCS8vaWYgb25lIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBpcyBhbHJlYWR5IGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uLgotCQkJLy9SZW1vdmUgaXQgbm93IHNvIHRoYXQgaXQgZG9lc24ndCBnZXQgcmVtb3ZlZCBkdXJpbmcgYW4gdXBkYXRlIGFuZAotCQkJLy9jYXVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBzZW50IHRvIHRoZSBVSSBpbiB0aGUgd3Jvbmcgb3JkZXIKLQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBudWxsOwotCQl9Ci0JCWlmIChnZXRKb2luVGFibGVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCS8vQWRkIHRoZSBKb2luVGFibGUgYmVmb3JlIGNyZWF0aW5nIHRoZSBzcGVjaWZpZWRKb2luQ29sdW1uLgotCQkJLy9PdGhlcndpc2Ugd2Ugd2lsbCByZW1vdmUgaXQgYW5kIGNyZWF0ZSBhbm90aGVyIGR1cmluZyBhbiB1cGRhdGUKLQkJCS8vZnJvbSB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAotCQkJYWRkSm9pblRhYmxlUmVzb3VyY2UoKTsKLQkJfQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUpvaW5Db2x1bW4odGhpcywgY3JlYXRlSm9pbkNvbHVtbk93bmVyKCkpOwotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmFkZChpbmRleCwgam9pbkNvbHVtbik7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IHRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLmFkZEpvaW5Db2x1bW4oaW5kZXgpOwotCQlqb2luQ29sdW1uLmluaXRpYWxpemUoam9pbkNvbHVtblJlc291cmNlKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKLQkJaWYgKG9sZERlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChKb2luVGFibGUuREVGQVVMVF9KT0lOX0NPTFVNTiwgb2xkRGVmYXVsdEpvaW5Db2x1bW4sIG51bGwpOwotCQl9Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4LCBKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUphdmFKb2luQ29sdW1uIHJlbW92ZWRKb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOwotCQlpZiAoIWNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkgewotCQkJLy9jcmVhdGUgdGhlIGRlZmF1bHRKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKLQkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKLQkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCi0JCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gYnVpbGRKb2luQ29sdW1uKG5ldyBOdWxsSm9pbkNvbHVtbihnZXRUYWJsZVJlc291cmNlKCkpKTsKLQkJfQotCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5yZW1vdmVKb2luQ29sdW1uKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCByZW1vdmVkSm9pbkNvbHVtbik7Ci0JCWlmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIGEgZGVmYXVsdEpvaW5Db2x1bW4gd2FzIGNyZWF0ZWQgYWJvdmUKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChKb2luVGFibGUuREVGQVVMVF9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbik7CQkKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW5fKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5tb3ZlSm9pbkNvbHVtbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBpbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIDogdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBpbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIG5ld0ludmVyc2VKb2luQ29sdW1uKSB7Ci0JCUphdmFKb2luQ29sdW1uIG9sZEludmVyc2VKb2luQ29sdW1uID0gdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gbmV3SW52ZXJzZUpvaW5Db2x1bW47Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSm9pblRhYmxlLkRFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTiwgb2xkSW52ZXJzZUpvaW5Db2x1bW4sIG5ld0ludmVyc2VKb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gZGVmYXVsdEludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4pOwotCQl9Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZGVmYXVsdEludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyk7Ci0JfQotCi0JcHVibGljIGludCBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gIXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUpvaW5Db2x1bW4gb2xkRGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gdGhpcy5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkJaWYgKG9sZERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL251bGwgdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbm93IGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkJCS8vaWYgb25lIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBpcyBhbHJlYWR5IGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uLgotCQkJLy9SZW1vdmUgaXQgbm93IHNvIHRoYXQgaXQgZG9lc24ndCBnZXQgcmVtb3ZlZCBkdXJpbmcgYW4gdXBkYXRlIGFuZAotCQkJLy9jYXVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBzZW50IHRvIHRoZSBVSSBpbiB0aGUgd3Jvbmcgb3JkZXIKLQkJCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gbnVsbDsKLQkJfQotCQlpZiAoZ2V0Sm9pblRhYmxlUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkvL0FkZCB0aGUgSm9pblRhYmxlIGJlZm9yZSBjcmVhdGluZyB0aGUgc3BlY2lmaWVkSm9pbkNvbHVtbi4KLQkJCS8vT3RoZXJ3aXNlIHdlIHdpbGwgcmVtb3ZlIGl0IGFuZCBjcmVhdGUgYW5vdGhlciBkdXJpbmcgYW4gdXBkYXRlCi0JCQkvL2Zyb20gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQkJCWFkZEpvaW5UYWJsZVJlc291cmNlKCk7Ci0JCX0KLQkJSmF2YUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhSm9pbkNvbHVtbih0aGlzLCBjcmVhdGVJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCkpOwotCQl0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5hZGQoaW5kZXgsIGludmVyc2VKb2luQ29sdW1uKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtblJlc291cmNlID0gdGhpcy5nZXRUYWJsZVJlc291cmNlKCkuYWRkSW52ZXJzZUpvaW5Db2x1bW4oaW5kZXgpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5pbml0aWFsaXplKGpvaW5Db2x1bW5SZXNvdXJjZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChKb2luVGFibGUuU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBpbnZlcnNlSm9pbkNvbHVtbik7Ci0JCWlmIChvbGREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpvaW5UYWJsZS5ERUZBVUxUX0lOVkVSU0VfSk9JTl9DT0xVTU4sIG9sZERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGludmVyc2VKb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGludmVyc2VKb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucywgSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLmluZGV4T2YoaW52ZXJzZUpvaW5Db2x1bW4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJSmF2YUpvaW5Db2x1bW4gcmVtb3ZlZEpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOwotCQlpZiAoIWNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkpIHsKLQkJCS8vY3JlYXRlIHRoZSBkZWZhdWx0Sm9pbkNvbHVtbiBub3cgb3IgdGhpcyB3aWxsIGhhcHBlbiBkdXJpbmcgcHJvamVjdCB1cGRhdGUgCi0JCQkvL2FmdGVyIHJlbW92aW5nIHRoZSBqb2luIGNvbHVtbiBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4gVGhhdCBjYXVzZXMgcHJvYmxlbXMgCi0JCQkvL2luIHRoZSBVSSBiZWNhdXNlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBlbmQgdXAgaW4gdGhlIHdyb25nIG9yZGVyLgotCQkJdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPSBidWlsZEludmVyc2VKb2luQ29sdW1uKG5ldyBOdWxsSm9pbkNvbHVtbihnZXRUYWJsZVJlc291cmNlKCkpKTsKLQkJfQotCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbihpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChKb2luVGFibGUuU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCByZW1vdmVkSm9pbkNvbHVtbik7Ci0JCWlmICh0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL2ZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbiBpZiBhIGRlZmF1bHRKb2luQ29sdW1uIHdhcyBjcmVhdGVkIGFib3ZlCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSm9pblRhYmxlLkRFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4pOwkJCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbl8oSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMsIEpvaW5UYWJsZS5TUEVDSUZJRURfSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5nZXRUYWJsZVJlc291cmNlKCkubW92ZUludmVyc2VKb2luQ29sdW1uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCi0KLQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIGdldEpvaW5UYWJsZVJlc291cmNlKCkgIT0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZm9yIChKYXZhSm9pbkNvbHVtbiBjb2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5qb2luQ29sdW1ucygpKSkgewotCQkJcmVzdWx0ID0gY29sdW1uLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJZm9yIChKYXZhSm9pbkNvbHVtbiBjb2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMoKSkpIHsKLQkJCXJlc3VsdCA9IGNvbHVtbi5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IEludmVyc2VKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UpIHsKLQkJdGhpcy5hdHRyaWJ1dGVSZXNvdXJjZSA9IGF0dHJpYnV0ZVJlc291cmNlOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGdldFRhYmxlUmVzb3VyY2UoKTsKLQkJdGhpcy5pbml0aWFsaXplKGpvaW5UYWJsZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZEpvaW5Db2x1bW5zKGpvaW5UYWJsZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRKb2luQ29sdW1uKGpvaW5UYWJsZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyhqb2luVGFibGUpOwotCQl0aGlzLmluaXRpYWxpemVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oam9pblRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkSm9pbkNvbHVtbnMoSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSkgewotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGFubm90YXRpb25zID0gam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbnMoKTsKLQkJCi0JCXdoaWxlKGFubm90YXRpb25zLmhhc05leHQoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5hZGQoYnVpbGRKb2luQ29sdW1uKGFubm90YXRpb25zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpICYmIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5pc1JlbGF0aW9uc2hpcE93bmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0Sm9pbkNvbHVtbihKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBidWlsZEpvaW5Db2x1bW4obmV3IE51bGxKb2luQ29sdW1uKGpvaW5UYWJsZSkpOwotCX0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyhKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJCi0JCXdoaWxlKGFubm90YXRpb25zLmhhc05leHQoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMuYWRkKGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4oYW5ub3RhdGlvbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQnVpbGREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhY29udGFpbnNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSAmJiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuaXNSZWxhdGlvbnNoaXBPd25lcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKEpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlKSB7Ci0JCWlmICghc2hvdWxkQnVpbGREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihuZXcgTnVsbEpvaW5Db2x1bW4oam9pblRhYmxlKSk7CQkKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlKSB7Ci0JCXRoaXMuYXR0cmlidXRlUmVzb3VyY2UgPSBhdHRyaWJ1dGVSZXNvdXJjZTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGUgPSBnZXRUYWJsZVJlc291cmNlKCk7Ci0JCXRoaXMudXBkYXRlKGpvaW5UYWJsZSk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoam9pblRhYmxlKTsKLQkJdGhpcy51cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbihqb2luVGFibGUpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyhqb2luVGFibGUpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihqb2luVGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRKb2luQ29sdW1ucyhKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IHJlc291cmNlSm9pbkNvbHVtbnMgPSBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1ucygpOwotCQkKLQkJd2hpbGUgKGpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJCWpvaW5Db2x1bW4udXBkYXRlKHJlc291cmNlSm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW5fKGpvaW5Db2x1bW4pOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZEpvaW5Db2x1bW4oc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCksIGJ1aWxkSm9pbkNvbHVtbihyZXNvdXJjZUpvaW5Db2x1bW5zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRKb2luQ29sdW1uKEpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlKSB7Ci0JCWlmICghc2hvdWxkQnVpbGREZWZhdWx0Sm9pbkNvbHVtbigpKSB7Ci0JCQlzZXREZWZhdWx0Sm9pbkNvbHVtbihudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldERlZmF1bHRKb2luQ29sdW1uKGJ1aWxkSm9pbkNvbHVtbihuZXcgTnVsbEpvaW5Db2x1bW4oam9pblRhYmxlKSkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbi51cGRhdGUobmV3IE51bGxKb2luQ29sdW1uKGpvaW5UYWJsZSkpOwotCQl9Ci0JfQkKLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyhKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiByZXNvdXJjZUpvaW5Db2x1bW5zID0gam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCQotCQl3aGlsZSAoam9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJam9pbkNvbHVtbi51cGRhdGUocmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5fKGpvaW5Db2x1bW4pOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKHNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSwgYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihyZXNvdXJjZUpvaW5Db2x1bW5zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkpIHsKLQkJCXNldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgPT0gbnVsbCkgewotCQkJdGhpcy5zZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihuZXcgTnVsbEpvaW5Db2x1bW4oam9pblRhYmxlKSkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4udXBkYXRlKG5ldyBOdWxsSm9pbkNvbHVtbihqb2luVGFibGUpKTsKLQkJfQotCX0JCi0JCi0JcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uIGJ1aWxkSm9pbkNvbHVtbihKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uUmVzb3VyY2UpIHsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFKb2luQ29sdW1uKHRoaXMsIGNyZWF0ZUpvaW5Db2x1bW5Pd25lcigpKTsKLQkJam9pbkNvbHVtbi5pbml0aWFsaXplKGpvaW5Db2x1bW5SZXNvdXJjZSk7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uUmVzb3VyY2UpIHsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFKb2luQ29sdW1uKHRoaXMsIGNyZWF0ZUludmVyc2VKb2luQ29sdW1uT3duZXIoKSk7Ci0JCWpvaW5Db2x1bW4uaW5pdGlhbGl6ZShqb2luQ29sdW1uUmVzb3VyY2UpOwotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCWJvb2xlYW4gZG9Db250aW51ZSA9IGNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQkJU3RyaW5nIHNjaGVtYSA9IGdldFNjaGVtYSgpOwotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISBoYXNSZXNvbHZlZFNjaGVtYSgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtzY2hlbWEsIGdldE5hbWUoKX0sIAotCQkJCQkJdGhpcywgCi0JCQkJCQlnZXRTY2hlbWFUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgIWlzUmVzb2x2ZWQoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCWdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gc3RyZWFtID0gam9pbkNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3RyZWFtLm5leHQoKTsKLQkJCQotCQkJaWYgKGRvQ29udGludWUgJiYgISBqb2luQ29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWpvaW5Db2x1bW4sIGpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQkJCi0JCQlpZiAoZG9Db250aW51ZSAmJiAhIGpvaW5Db2x1bW4uaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJam9pbkNvbHVtbiwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBzdHJlYW0gPSBpbnZlcnNlSm9pbkNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3RyZWFtLm5leHQoKTsKLQkJCQotCQkJaWYgKGRvQ29udGludWUgJiYgISBqb2luQ29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWpvaW5Db2x1bW4sIGpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQkJCi0JCQlpZiAoZG9Db250aW51ZSAmJiAhIGpvaW5Db2x1bW4uaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJam9pbkNvbHVtbiwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQkJCi0JCi0JLyoqCi0JICoganVzdCBhIGxpdHRsZSBjb21tb24gYmVoYXZpb3IKLQkgKi8KLQlhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lciBpbXBsZW1lbnRzIEphdmFKb2luQ29sdW1uLk93bmVyCi0JewotCQlBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIGRlZmF1bHQgdGFibGUgbmFtZSBpcyBhbHdheXMgdmFsaWQgYW5kIGEgc3BlY2lmaWVkIHRhYmxlIG5hbWUKLQkJICogaXMgcHJvaGliaXRlZCAod2hpY2ggd2lsbCBiZSBoYW5kbGVkIGVsc2V3aGVyZSkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIGpvaW4gY29sdW1uIGNhbiBvbmx5IGJlIG9uIHRoZSBqb2luIHRhYmxlIGl0c2VsZgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdGFibGVJc0FsbG93ZWQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJaWYgKEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiAoR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXROYW1lKCkuZXF1YWxzKHRhYmxlTmFtZSkpID8gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXREYlRhYmxlKCkgOiBudWxsOwotCQl9Ci0JCQotCQkvKioKLQkJICogYnkgZGVmYXVsdCwgdGhlIGpvaW4gY29sdW1uIGlzLCBvYnZpb3VzbHksIGluIHRoZSBqb2luIHRhYmxlOwotCQkgKiBub3Qgc3VyZSB3aGV0aGVyIGl0IGNhbiBiZSBhbnl3aGVyZSBlbHNlLi4uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogb3duZXIgZm9yICJmb3J3YXJkLXBvaW50ZXIiIEpvaW5Db2x1bW5zOwotCSAqIHRoZXNlIHBvaW50IGF0IHRoZSB0YXJnZXQvaW52ZXJzZSBlbnRpdHkKLQkgKi8KLQljbGFzcyBJbnZlcnNlSm9pbkNvbHVtbk93bmVyIGV4dGVuZHMgQWJzdHJhY3RKb2luQ29sdW1uT3duZXIKLQl7Ci0JCXB1YmxpYyBJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGRiVGFibGUgPSBzdXBlci5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCQlpZiAoZGJUYWJsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGRiVGFibGU7Ci0JCQl9Ci0JCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiB0YXJnZXRFbnRpdHkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRUYXJnZXRFbnRpdHkoKTsKLQkJCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIG93bmVyIGZvciAiYmFjay1wb2ludGVyIiBKb2luQ29sdW1uczsKLQkgKiB0aGVzZSBwb2ludCBhdCB0aGUgc291cmNlL293bmluZyBlbnRpdHkKLQkgKi8KLQljbGFzcyBKb2luQ29sdW1uT3duZXIgZXh0ZW5kcyBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcgotCXsKLQkJcHVibGljIEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50aXR5IGdldFRhcmdldEVudGl0eSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHRhcmdldEVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCQlpZiAobWFwcGluZyBpbnN0YW5jZW9mIE5vbk93bmluZ01hcHBpbmcpIHsKLQkJCQkJU3RyaW5nIG1hcHBlZEJ5ID0gKChOb25Pd25pbmdNYXBwaW5nKSBtYXBwaW5nKS5nZXRNYXBwZWRCeSgpOwotCQkJCQlpZiAoKG1hcHBlZEJ5ICE9IG51bGwpICYmIG1hcHBlZEJ5LmVxdWFscyhhdHRyaWJ1dGVOYW1lKSkgewotCQkJCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGRiVGFibGUgPSBzdXBlci5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCQlyZXR1cm4gKGRiVGFibGUgIT0gbnVsbCkgPyBkYlRhYmxlIDogdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5YmYwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZyBleHRlbmRzIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzxNYW55VG9NYW55QW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFNYW55VG9NYW55TWFwcGluZwotewotCQotCXB1YmxpYyBHZW5lcmljSmF2YU1hbnlUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAotCQkJSlBBLk9SREVSX0JZLAotCQkJSlBBLk1BUF9LRVksCi0JCQlKUEEuSk9JTl9UQUJMRSk7Ci0JfQotCQkKLQkvLyAqKioqKioqKioqIEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFwcGVkQnlUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmdSZXNvdXJjZSgpLm1hcHBlZEJ5VG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwZWRCeU9uUmVzb3VyY2VNb2RlbChTdHJpbmcgbWFwcGVkQnkpIHsKLQkJZ2V0TWFwcGluZ1Jlc291cmNlKCkuc2V0TWFwcGVkQnkobWFwcGVkQnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZEJ5KE1hbnlUb01hbnlBbm5vdGF0aW9uIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJcmV0dXJuIHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0TWFwcGVkQnkoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBJTm9uT3duaW5nTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gbWFwcGVkQnlJc1ZhbGlkKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGVkQnlNYXBwaW5nKSB7Ci0JCVN0cmluZyBtYXBwZWRCeUtleSA9IG1hcHBlZEJ5TWFwcGluZy5nZXRLZXkoKTsKLQkJcmV0dXJuIChtYXBwZWRCeUtleSA9PSBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nUmVzb3VyY2UoKS5nZXRNYXBwZWRCeVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMWNhNDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZyBleHRlbmRzIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc8TWFueVRvT25lQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFNYW55VG9PbmVNYXBwaW5nCi17Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAotCQkJSlBBLkpPSU5fQ09MVU1OLAotCQkJSlBBLkpPSU5fQ09MVU1OUywKLQkJCUpQQS5KT0lOX1RBQkxFKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRPcHRpb25hbE9uUmVzb3VyY2VNb2RlbChCb29sZWFuIG5ld09wdGlvbmFsKSB7Ci0JCXRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkuc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRPcHRpb25hbChNYW55VG9PbmVBbm5vdGF0aW9uIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJcmV0dXJuIHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0T3B0aW9uYWwoKTsKLQl9Ci0JCi0JLy9NYW55VG9PbmUgbWFwcGluZyBpcyBhbHdheXMgdGhlIG93bmluZyBzaWRlCi0JcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBPd25lcigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYXBwZWRTdXBlcmNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MTczYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRDbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFwcGVkU3VwZXJjbGFzcyBleHRlbmRzIEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nCi0JaW1wbGVtZW50cyBKYXZhTWFwcGVkU3VwZXJjbGFzcwotewotCi0JcHJvdGVjdGVkIFN0cmluZyBpZENsYXNzOwotCi0JcHVibGljIEdlbmVyaWNKYXZhTWFwcGVkU3VwZXJjbGFzcyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYXBwZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKLQkJCUpQQS5JRF9DTEFTUywKLQkJCUpQQS5FWENMVURFX0RFRkFVTFRfTElTVEVORVJTLAotCQkJSlBBLkVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMsCi0JCQlKUEEuRU5USVRZX0xJU1RFTkVSUywKLQkJCUpQQS5QUkVfUEVSU0lTVCwKLQkJCUpQQS5QT1NUX1BFUlNJU1QsCi0JCQlKUEEuUFJFX1JFTU9WRSwKLQkJCUpQQS5QT1NUX1JFTU9WRSwKLQkJCUpQQS5QUkVfVVBEQVRFLAotCQkJSlBBLlBPU1RfVVBEQVRFLAotCQkJSlBBLlBPU1RfTE9BRCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuaWRDbGFzczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SWRDbGFzcyhTdHJpbmcgbmV3SWRDbGFzcykgewotCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKLQkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKLQkJaWYgKG5ld0lkQ2xhc3MgIT0gb2xkSWRDbGFzcykgewotCQkJaWYgKG5ld0lkQ2xhc3MgIT0gbnVsbCkgewotCQkJCWlmIChnZXRJZENsYXNzUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJCWFkZElkQ2xhc3NSZXNvdXJjZSgpOwotCQkJCX0KLQkJCQlnZXRJZENsYXNzUmVzb3VyY2UoKS5zZXRWYWx1ZShuZXdJZENsYXNzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZUlkQ2xhc3NSZXNvdXJjZSgpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSWRDbGFzcy5JRF9DTEFTU19QUk9QRVJUWSwgb2xkSWRDbGFzcywgbmV3SWRDbGFzcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldElkQ2xhc3NfKFN0cmluZyBuZXdJZENsYXNzKSB7Ci0JCVN0cmluZyBvbGRJZENsYXNzID0gdGhpcy5pZENsYXNzOwotCQl0aGlzLmlkQ2xhc3MgPSBuZXdJZENsYXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElkQ2xhc3MuSURfQ0xBU1NfUFJPUEVSVFksIG9sZElkQ2xhc3MsIG5ld0lkQ2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBJZENsYXNzQW5ub3RhdGlvbiBnZXRJZENsYXNzUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoSWRDbGFzc0Fubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZENsYXNzUmVzb3VyY2UoKSB7Ci0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJZENsYXNzUmVzb3VyY2UoKSB7Ci0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUucmVtb3ZlQW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc09mKHRoaXMub3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgewotCQkJCXJldHVybiBvLmlzT3ZlcnJpZGFibGVBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzT2YodGhpcy5vdmVycmlkYWJsZUFzc29jaWF0aW9ucygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgewotCQkJCXJldHVybiBvLmlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzT2YoSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBTdHJpbmc+KGF0dHJpYnV0ZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUocGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUlkQ2xhc3MocGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUlkQ2xhc3MoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlKSB7Ci0JCUlkQ2xhc3NBbm5vdGF0aW9uIGlkQ2xhc3NSZXNvdXJjZSA9IChJZENsYXNzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJaWYgKGlkQ2xhc3NSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmlkQ2xhc3MgPSBpZENsYXNzUmVzb3VyY2UuZ2V0VmFsdWUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKSB7Ci0JCXN1cGVyLnVwZGF0ZShwZXJzaXN0ZW50VHlwZVJlc291cmNlKTsKLQkJdGhpcy51cGRhdGVJZENsYXNzKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJZENsYXNzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSkgewotCQlJZENsYXNzQW5ub3RhdGlvbiBpZENsYXNzID0gKElkQ2xhc3NBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlpZiAoaWRDbGFzcyAhPSBudWxsKSB7Ci0JCQlzZXRJZENsYXNzXyhpZENsYXNzLmdldFZhbHVlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0SWRDbGFzc18obnVsbCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTmFtZWROYXRpdmVRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTFmYjY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU5hbWVkTmF0aXZlUXVlcnkgZXh0ZW5kcyBBYnN0cmFjdEphdmFRdWVyeQotCWltcGxlbWVudHMgSmF2YU5hbWVkTmF0aXZlUXVlcnkKLXsKLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzdWx0Q2xhc3M7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmc7Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gZ2V0UXVlcnlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgc3VwZXIuZ2V0UXVlcnlSZXNvdXJjZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDbGFzcyhTdHJpbmcgbmV3UmVzdWx0Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZFJlc3VsdENsYXNzID0gdGhpcy5yZXN1bHRDbGFzczsKLQkJdGhpcy5yZXN1bHRDbGFzcyA9IG5ld1Jlc3VsdENsYXNzOwotCQlnZXRRdWVyeVJlc291cmNlKCkuc2V0UmVzdWx0Q2xhc3MobmV3UmVzdWx0Q2xhc3MpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5hbWVkTmF0aXZlUXVlcnkuUkVTVUxUX0NMQVNTX1BST1BFUlRZLCBvbGRSZXN1bHRDbGFzcywgbmV3UmVzdWx0Q2xhc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXN1bHRDbGFzc18oU3RyaW5nIG5ld1Jlc3VsdENsYXNzKSB7Ci0JCVN0cmluZyBvbGRSZXN1bHRDbGFzcyA9IHRoaXMucmVzdWx0Q2xhc3M7Ci0JCXRoaXMucmVzdWx0Q2xhc3MgPSBuZXdSZXN1bHRDbGFzczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOYW1lZE5hdGl2ZVF1ZXJ5LlJFU1VMVF9DTEFTU19QUk9QRVJUWSwgb2xkUmVzdWx0Q2xhc3MsIG5ld1Jlc3VsdENsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFNldE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnJlc3VsdFNldE1hcHBpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgbmV3UmVzdWx0U2V0TWFwcGluZykgewotCQlTdHJpbmcgb2xkUmVzdWx0U2V0TWFwcGluZyA9IHRoaXMucmVzdWx0U2V0TWFwcGluZzsKLQkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nID0gbmV3UmVzdWx0U2V0TWFwcGluZzsKLQkJZ2V0UXVlcnlSZXNvdXJjZSgpLnNldFJlc3VsdFNldE1hcHBpbmcobmV3UmVzdWx0U2V0TWFwcGluZyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTmFtZWROYXRpdmVRdWVyeS5SRVNVTFRfU0VUX01BUFBJTkdfUFJPUEVSVFksIG9sZFJlc3VsdFNldE1hcHBpbmcsIG5ld1Jlc3VsdFNldE1hcHBpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFJlc3VsdFNldE1hcHBpbmdfKFN0cmluZyBuZXdSZXN1bHRTZXRNYXBwaW5nKSB7Ci0JCVN0cmluZyBvbGRSZXN1bHRTZXRNYXBwaW5nID0gdGhpcy5yZXN1bHRTZXRNYXBwaW5nOwotCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSBuZXdSZXN1bHRTZXRNYXBwaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5hbWVkTmF0aXZlUXVlcnkuUkVTVUxUX1NFVF9NQVBQSU5HX1BST1BFUlRZLCBvbGRSZXN1bHRTZXRNYXBwaW5nLCBuZXdSZXN1bHRTZXRNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5UmVzb3VyY2UpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShxdWVyeVJlc291cmNlKTsKLQkJdGhpcy5yZXN1bHRDbGFzcyA9IHF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0Q2xhc3MoKTsKLQkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nID0gcXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBxdWVyeVJlc291cmNlKSB7Ci0JCXN1cGVyLnVwZGF0ZShxdWVyeVJlc291cmNlKTsKLQkJdGhpcy5zZXRSZXN1bHRDbGFzc18ocXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJdGhpcy5zZXRSZXN1bHRTZXRNYXBwaW5nXyhxdWVyeVJlc291cmNlLmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTmFtZWRRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU5hbWVkUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNDU1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTmFtZWRRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTmFtZWRRdWVyeSBleHRlbmRzIEFic3RyYWN0SmF2YVF1ZXJ5IGltcGxlbWVudHMgSmF2YU5hbWVkUXVlcnkKLXsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFOYW1lZFF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5hbWVkUXVlcnlBbm5vdGF0aW9uIGdldFF1ZXJ5UmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoTmFtZWRRdWVyeUFubm90YXRpb24pIHN1cGVyLmdldFF1ZXJ5UmVzb3VyY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKE5hbWVkUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5UmVzb3VyY2UpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShxdWVyeVJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKE5hbWVkUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5UmVzb3VyY2UpIHsKLQkJc3VwZXIudXBkYXRlKHF1ZXJ5UmVzb3VyY2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGI2OTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxKYXZhUmVzb3VyY2VOb2RlPgotewotCXB1YmxpYyBHZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29ycmVzcG9uZGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZU5vZGUgZ2V0TWFwcGluZ1Jlc291cmNlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NjgyZGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZyBleHRlbmRzIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzxPbmVUb01hbnlBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YU9uZVRvTWFueU1hcHBpbmcKLXsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAotCQkJSlBBLk9SREVSX0JZLAotCQkJSlBBLk1BUF9LRVksCi0JCQlKUEEuSk9JTl9UQUJMRSwKLQkJCUpQQS5KT0lOX0NPTFVNTiwKLQkJCUpQQS5KT0lOX0NPTFVNTlMpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nUmVzb3VyY2UoKS5tYXBwZWRCeVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwZWRCeU9uUmVzb3VyY2VNb2RlbChTdHJpbmcgbWFwcGVkQnkpIHsKLQkJdGhpcy5nZXRNYXBwaW5nUmVzb3VyY2UoKS5zZXRNYXBwZWRCeShtYXBwZWRCeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkQnkoT25lVG9NYW55QW5ub3RhdGlvbiByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXJldHVybiByZWxhdGlvbnNoaXBNYXBwaW5nLmdldE1hcHBlZEJ5KCk7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBJTm9uT3duaW5nTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JcHVibGljIGJvb2xlYW4gbWFwcGVkQnlJc1ZhbGlkKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGVkQnlNYXBwaW5nKSB7Ci0JCVN0cmluZyBtYXBwZWRCeUtleSA9IG1hcHBlZEJ5TWFwcGluZy5nZXRLZXkoKTsKLQkJcmV0dXJuIChtYXBwZWRCeUtleSA9PSBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4ZTNiNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTm9uT3duaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzxPbmVUb09uZUFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBKYXZhT25lVG9PbmVNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1uczsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAotCQkJSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLAotCQkJSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUywKLQkJCUpQQS5KT0lOX0NPTFVNTiwKLQkJCUpQQS5KT0lOX0NPTFVNTlMsCi0JCQlKUEEuSk9JTl9UQUJMRSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7Ci0JCXJldHVybiBnZXRNYXBwZWRCeSgpID09IG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgcHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLCBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSk7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChpbmRleCwgcGtKb2luQ29sdW1uKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtblJlc291cmNlID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihpbmRleCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlwa0pvaW5Db2x1bW4uaW5pdGlhbGl6ZShwa0pvaW5Db2x1bW5SZXNvdXJjZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChPbmVUb09uZU1hcHBpbmcuUFJJTUFZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHBrSm9pbkNvbHVtbik7Ci0JCXJldHVybiBwa0pvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4LCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBqb2luQ29sdW1uLCB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucywgT25lVG9PbmVNYXBwaW5nLlBSSU1BWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLmluZGV4T2YocGtKb2luQ29sdW1uKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVtb3ZlZFBrSm9pbkNvbHVtbiA9IHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7Ci0JCWdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZmlyZUl0ZW1SZW1vdmVkKE9uZVRvT25lTWFwcGluZy5QUklNQVlfS0VZX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZFBrSm9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW5fKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucywgT25lVG9PbmVNYXBwaW5nLlBSSU1BWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtTW92ZWQoT25lVG9PbmVNYXBwaW5nLlBSSU1BWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAhdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbmV3TWFwcGVkQnkpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQl0aGlzLmdldE1hcHBpbmdSZXNvdXJjZSgpLnNldE1hcHBlZEJ5KG5ld01hcHBlZEJ5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOb25Pd25pbmdNYXBwaW5nLk1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkTWFwcGVkQnksIG5ld01hcHBlZEJ5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwZWRCeV8oU3RyaW5nIG5ld01hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGRNYXBwZWRCeSA9IHRoaXMubWFwcGVkQnk7Ci0JCXRoaXMubWFwcGVkQnkgPSBuZXdNYXBwZWRCeTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOb25Pd25pbmdNYXBwaW5nLk1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkTWFwcGVkQnksIG5ld01hcHBlZEJ5KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXBwZWRCeUlzVmFsaWQoQXR0cmlidXRlTWFwcGluZyBtYXBwZWRCeU1hcHBpbmcpIHsKLQkJU3RyaW5nIG1hcHBlZEJ5S2V5ID0gbWFwcGVkQnlNYXBwaW5nLmdldEtleSgpOwotCQlyZXR1cm4gKG1hcHBlZEJ5S2V5ID09IE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRPcHRpb25hbE9uUmVzb3VyY2VNb2RlbChCb29sZWFuIG5ld09wdGlvbmFsKSB7Ci0JCXRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkuc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmdSZXNvdXJjZSgpLmdldE1hcHBlZEJ5VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nUmVzb3VyY2UoKS5tYXBwZWRCeVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMubWFwcGVkQnlUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoZmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lUmVzb3VyY2UpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShvbmVUb09uZVJlc291cmNlKTsKLQkJdGhpcy5tYXBwZWRCeSA9IG9uZVRvT25lUmVzb3VyY2UuZ2V0TWFwcGVkQnkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRPcHRpb25hbChPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmVSZXNvdXJjZSkgewotCQlyZXR1cm4gb25lVG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy5pbml0aWFsaXplUHJpbWFyeUtleUpvaW5Db2x1bW5zKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGFubm90YXRpb25zID0gcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXdoaWxlKGFubm90YXRpb25zLmhhc05leHQoKSkgewotCQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYW5ub3RhdGlvbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UpIHsKLQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLCBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSk7Ci0JCXBrSm9pbkNvbHVtbi5pbml0aWFsaXplKHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UpOwotCQlyZXR1cm4gcGtKb2luQ29sdW1uOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lUmVzb3VyY2UpIHsKLQkJc3VwZXIudXBkYXRlKG9uZVRvT25lUmVzb3VyY2UpOwotCQl0aGlzLnNldE1hcHBlZEJ5XyhvbmVUb09uZVJlc291cmNlLmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlzdXBlci51cGRhdGUocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy51cGRhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHBrSm9pbkNvbHVtbnMgPSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHJlc291cmNlUGtKb2luQ29sdW1ucyA9IHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQl3aGlsZSAocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBwa0pvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJcGtKb2luQ29sdW1uLnVwZGF0ZSgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVBrSm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uXyhwa0pvaW5Db2x1bW4pOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VQa0pvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCksIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VQa0pvaW5Db2x1bW5zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCi0KLQkvLyoqKioqKioqKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJCi0JCWlmICh0aGlzLmdldE1hcHBlZEJ5KCkgIT0gbnVsbCkgewotCQkJYWRkTWFwcGVkQnlNZXNzYWdlcyhtZXNzYWdlcyAsYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkSm9pbkNvbHVtbk1lc3NhZ2VzKCkgewotCQlpZiAoY29udGFpbnNQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSAmJiAhY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmFkZEpvaW5Db2x1bW5NZXNzYWdlcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXBwZWRCeU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmcgbWFwcGVkQnkgPSB0aGlzLmdldE1hcHBlZEJ5KCk7Ci0JCUVudGl0eSB0YXJnZXRFbnRpdHkgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCQotCQlpZiAodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKLQkJCS8vIGFscmVhZHkgaGF2ZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGF0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gdGFyZ2V0RW50aXR5LmdldFBlcnNpc3RlbnRUeXBlKCkucmVzb2x2ZUF0dHJpYnV0ZShtYXBwZWRCeSk7Ci0JCQotCQlpZiAoYXR0cmlidXRlID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlksCi0JCQkJCQluZXcgU3RyaW5nW10ge21hcHBlZEJ5fSwgCi0JCQkJCQl0aGlzLCB0aGlzLmdldE1hcHBlZEJ5VGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghIHRoaXMubWFwcGVkQnlJc1ZhbGlkKGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX0lOVkFMSURfTUFQUEVEX0JZLAotCQkJCQkJbmV3IFN0cmluZ1tdIHttYXBwZWRCeX0sIAotCQkJCQkJdGhpcywgdGhpcy5nZXRNYXBwZWRCeVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlOb25Pd25pbmdNYXBwaW5nIG1hcHBlZEJ5TWFwcGluZzsKLQkJdHJ5IHsKLQkJCW1hcHBlZEJ5TWFwcGluZyA9IChOb25Pd25pbmdNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKSB7Ci0JCQkvLyB0aGVyZSBpcyBubyBlcnJvciB0aGVuCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChtYXBwZWRCeU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX01BUFBFRF9CWV9PTl9CT1RIX1NJREVTLAotCQkJCQkJdGhpcywgdGhpcy5nZXRNYXBwZWRCeVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZjI1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZQotewotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZyBkZWZhdWx0TWFwcGluZzsKLQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZyBzcGVjaWZpZWRNYXBwaW5nOwotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotCi0JcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBKYXZhU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSUQ7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZTsKLQkJdGhpcy5uYW1lID0gdGhpcy5uYW1lKHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSk7Ci0JCWluaXRpYWxpemVEZWZhdWx0TWFwcGluZyhwZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UpOwotCQlpbml0aWFsaXplU3BlY2lmaWVkTWFwcGluZyhwZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdE1hcHBpbmcoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UpIHsKLQkJdGhpcy5kZWZhdWx0TWFwcGluZyA9IGdldEpwYVBsYXRmb3JtKCkuYnVpbGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmcodGhpcyk7Ci0JCXRoaXMuZGVmYXVsdE1hcHBpbmcuaW5pdGlhbGl6ZShwZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRNYXBwaW5nKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlKSB7Ci0JCVN0cmluZyBqYXZhTWFwcGluZ0Fubm90YXRpb25OYW1lID0gdGhpcy5qYXZhTWFwcGluZ0Fubm90YXRpb25OYW1lKHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSk7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwcGluZyA9IGNyZWF0ZUphdmFBdHRyaWJ1dGVNYXBwaW5nRnJvbUFubm90YXRpb24oamF2YU1hcHBpbmdBbm5vdGF0aW9uTmFtZSwgcGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JfQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiAoSmF2YVBlcnNpc3RlbnRUeXBlKSB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBKYXZhVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5pc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuaXNJZE1hcHBpbmcoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0RGVmYXVsdE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIGNsaWVudHMgZG8gbm90IHNldCB0aGUgImRlZmF1bHQiIG1hcHBpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TWFwcGluZyhKYXZhQXR0cmlidXRlTWFwcGluZyBuZXdEZWZhdWx0TWFwcGluZykgewotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBvbGRNYXBwaW5nID0gdGhpcy5kZWZhdWx0TWFwcGluZzsKLQkJdGhpcy5kZWZhdWx0TWFwcGluZyA9IG5ld0RlZmF1bHRNYXBwaW5nOwkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQZXJzaXN0ZW50QXR0cmlidXRlLkRFRkFVTFRfTUFQUElOR19QUk9QRVJUWSwgb2xkTWFwcGluZywgbmV3RGVmYXVsdE1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXRTcGVjaWZpZWRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIGNsaWVudHMgZG8gbm90IHNldCB0aGUgInNwZWNpZmllZCIgbWFwcGluZzsKLQkgKiB1c2UgI3NldE1hcHBpbmdLZXkoU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE1hcHBpbmcoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbmV3U3BlY2lmaWVkTWFwcGluZykgewotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBvbGRNYXBwaW5nID0gdGhpcy5zcGVjaWZpZWRNYXBwaW5nOwotCQl0aGlzLnNwZWNpZmllZE1hcHBpbmcgPSBuZXdTcGVjaWZpZWRNYXBwaW5nOwkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQZXJzaXN0ZW50QXR0cmlidXRlLlNQRUNJRklFRF9NQVBQSU5HX1BST1BFUlRZLCBvbGRNYXBwaW5nLCBuZXdTcGVjaWZpZWRNYXBwaW5nKTsKLQl9Ci0KLQkKLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE1hcHBpbmcgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE1hcHBpbmcgOiB0aGlzLmRlZmF1bHRNYXBwaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmdldEtleSgpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vICJkZWZhdWx0IiBtYXBwaW5nIGZvciB0aGUgYXR0cmlidXRlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE1hcHBpbmcuZ2V0S2V5KCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gInNwZWNpZmllZCIgbWFwcGluZyBmb3IgdGhlIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5zcGVjaWZpZWRNYXBwaW5nLmdldEtleSgpOwotCX0KLQotCS8vIFRPRE8gc3VwcG9ydCBtb3JwaGluZyBtYXBwaW5ncywgaS5lLiBjb3B5aW5nIGNvbW1vbiBzZXR0aW5ncyBvdmVyCi0JLy8gdG8gdGhlIG5ldyBtYXBwaW5nOyB0aGlzIGNhbid0IGJlIGRvbmUgaW4gdGhlIHNhbWUgd2FzIGFzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkvLyBzaW5jZSB3ZSBkb24ndCBrbm93IGFsbCB0aGUgcG9zc2libGUgbWFwcGluZyB0eXBlcwotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE1hcHBpbmdLZXkoU3RyaW5nIG5ld0tleSkgewotCQlpZiAobmV3S2V5ID09IGdldFNwZWNpZmllZE1hcHBpbmdLZXkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG9sZE1hcHBpbmcgPSBnZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcgPSBjcmVhdGVKYXZhQXR0cmlidXRlTWFwcGluZ0Zyb21NYXBwaW5nS2V5KG5ld0tleSk7Ci0KLQkJdGhpcy5zcGVjaWZpZWRNYXBwaW5nID0gbmV3TWFwcGluZzsJCi0JCWlmIChuZXdNYXBwaW5nICE9IG51bGwpIHsKLQkJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdBbm5vdGF0aW9uKG5ld01hcHBpbmcuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihudWxsKTsJCQkKLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbnRBdHRyaWJ1dGUuU1BFQ0lGSUVEX01BUFBJTkdfUFJPUEVSVFksIG9sZE1hcHBpbmcsIG5ld01hcHBpbmcpOwotCQkKLQkJaWYgKG9sZE1hcHBpbmcgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFubm90YXRpb25zVG9SZW1vdmUgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihvbGRNYXBwaW5nLmNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSk7Ci0JCQlpZiAoZ2V0TWFwcGluZygpICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGFubm90YXRpb25zVG9SZW1vdmUsIGdldE1hcHBpbmcoKS5jb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkpOwotCQkJfQotCQkJCi0JCQlmb3IgKFN0cmluZyBhbm5vdGF0aW9uTmFtZSA6IGFubm90YXRpb25zVG9SZW1vdmUpIHsKLQkJCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBvZmZzZXQsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSBmdWxsVGV4dFJhbmdlID0gdGhpcy5nZXRGdWxsVGV4dFJhbmdlKGFzdFJvb3QpOwotCQkvLyAnZnVsbFRleHRSYW5nZScgd2lsbCBiZSBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgbm8gbG9uZ2VyIGV4aXN0cyBpbiB0aGUgamF2YTsKLQkJLy8gdGhlIGNvbnRleHQgbW9kZWwgY2FuIGJlIG91dCBvZiBzeW5jaCB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbAotCQkvLyB3aGVuIGEgc2VsZWN0aW9uIGV2ZW50IG9jY3VycyBiZWZvcmUgdGhlIGNvbnRleHQgbW9kZWwgaGFzIGEKLQkJLy8gY2hhbmNlIHRvIHN5bmNoIHdpdGggdGhlIHJlc291cmNlIG1vZGVsIHZpYSB0aGUgdXBkYXRlIHRocmVhZAotCQlyZXR1cm4gKGZ1bGxUZXh0UmFuZ2UgPT0gbnVsbCkgPyBmYWxzZSA6IGZ1bGxUZXh0UmFuZ2UuaW5jbHVkZXMob2Zmc2V0KTsKLQl9Ci0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RnVsbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKHRoaXMuYnVpbGRBU1RSb290KCkpOwotCX0KLQotCXByb3RlY3RlZCBDb21waWxhdGlvblVuaXQgYnVpbGRBU1RSb290KCkgewotCQlyZXR1cm4gSkRUVG9vbHMuYnVpbGRBU1RSb290KHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpLmdldENvbXBpbGF0aW9uVW5pdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0ganJwYTsKLQkJdGhpcy5zZXROYW1lKHRoaXMubmFtZShqcnBhKSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdE1hcHBpbmcoanJwYSk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkTWFwcGluZyhqcnBhKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgewotCQlyZXR1cm4ganJwYS5nZXROYW1lKCk7CQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHNwZWNpZmllZE1hcHBpbmdBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5zcGVjaWZpZWRNYXBwaW5nLmdldEFubm90YXRpb25OYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZE1hcHBpbmcoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7Ci0JCVN0cmluZyBqYXZhTWFwcGluZ0Fubm90YXRpb25OYW1lID0gdGhpcy5qYXZhTWFwcGluZ0Fubm90YXRpb25OYW1lKGpycGEpOwotCQlpZiAoc3BlY2lmaWVkTWFwcGluZ0Fubm90YXRpb25OYW1lKCkgIT0gamF2YU1hcHBpbmdBbm5vdGF0aW9uTmFtZSkgewotCQkJc2V0U3BlY2lmaWVkTWFwcGluZyhjcmVhdGVKYXZhQXR0cmlidXRlTWFwcGluZ0Zyb21Bbm5vdGF0aW9uKGphdmFNYXBwaW5nQW5ub3RhdGlvbk5hbWUsIGpycGEpKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXRTcGVjaWZpZWRNYXBwaW5nKCkgIT0gbnVsbCkgewotCQkJCWdldFNwZWNpZmllZE1hcHBpbmcoKS51cGRhdGUoanJwYSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdE1hcHBpbmcoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7Ci0JCVN0cmluZyBkZWZhdWx0TWFwcGluZ0tleSA9IGdldEpwYVBsYXRmb3JtKCkuZ2V0RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nS2V5KHRoaXMpOwotCQlpZiAoZ2V0RGVmYXVsdE1hcHBpbmcoKS5nZXRLZXkoKSAhPSBkZWZhdWx0TWFwcGluZ0tleSkgewotCQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgb2xkRGVmYXVsdE1hcHBpbmcgPSB0aGlzLmRlZmF1bHRNYXBwaW5nOwotCQkJdGhpcy5kZWZhdWx0TWFwcGluZyA9IGdldEpwYVBsYXRmb3JtKCkuYnVpbGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmcodGhpcyk7Ci0JCQl0aGlzLmRlZmF1bHRNYXBwaW5nLmluaXRpYWxpemUoanJwYSk7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbnRBdHRyaWJ1dGUuREVGQVVMVF9NQVBQSU5HX1BST1BFUlRZLCBvbGREZWZhdWx0TWFwcGluZywgdGhpcy5kZWZhdWx0TWFwcGluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXREZWZhdWx0TWFwcGluZygpLnVwZGF0ZShqcnBhKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGphdmFNYXBwaW5nQW5ub3RhdGlvbk5hbWUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7Ci0JCUFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24gPSAoQW5ub3RhdGlvbikganJwYS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlpZiAobWFwcGluZ0Fubm90YXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIG1hcHBpbmdBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZyBjcmVhdGVKYXZhQXR0cmlidXRlTWFwcGluZ0Zyb21NYXBwaW5nS2V5KFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSA9PSBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldEpwYVBsYXRmb3JtKCkuYnVpbGRKYXZhQXR0cmlidXRlTWFwcGluZ0Zyb21NYXBwaW5nS2V5KGtleSwgdGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGNyZWF0ZUphdmFBdHRyaWJ1dGVNYXBwaW5nRnJvbUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lLCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKLQkJaWYgKGFubm90YXRpb25OYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSBnZXRKcGFQbGF0Zm9ybSgpLmJ1aWxkSmF2YUF0dHJpYnV0ZU1hcHBpbmdGcm9tQW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSwgdGhpcyk7Ci0JCW1hcHBpbmcuaW5pdGlhbGl6ZShqcnBhKTsKLQkJcmV0dXJuIG1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogdGhlIG1hcHBpbmcgbWlnaHQgYmUgImRlZmF1bHQiLCBidXQgaXQgc3RpbGwgbWlnaHQgYmUgYSAibnVsbCIgbWFwcGluZy4uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hcHBpbmdJc0RlZmF1bHQoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TWFwcGluZyA9PSBtYXBwaW5nOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJCi0JCWlmICh0aGlzLnNwZWNpZmllZE1hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5zcGVjaWZpZWRNYXBwaW5nLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuZGVmYXVsdE1hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5kZWZhdWx0TWFwcGluZy5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKGdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vbm90aGluZyB0byBkaXNwb3NlCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzYWNmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIEphdmFQZXJzaXN0ZW50VHlwZQotewotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQkKLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nIG1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlczsKLQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGFjY2VzczsKLQotCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBwYXJlbnRQZXJzaXN0ZW50VHlwZTsKLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotCi0JcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUoSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZU1vZGVsKCkuZ2V0SnBhQ29tcGlsYXRpb25Vbml0KCkuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0UmVzb3VyY2UoKTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqKioqKiBKcGFTdHJ1Y3R1cmVOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gSmF2YVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfVFlQRV9JRDsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKioqKiogUGVyc2lzdGVudFR5cGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0JCi0JcHVibGljIEphdmFUeXBlTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5tYXBwaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIGdldE1hcHBpbmcoKS5nZXRLZXkoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWFwcGluZ0tleShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gZ2V0TWFwcGluZygpLmdldEtleSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSmF2YVR5cGVNYXBwaW5nIG9sZE1hcHBpbmcgPSBnZXRNYXBwaW5nKCk7Ci0JCUphdmFUeXBlTWFwcGluZyBuZXdNYXBwaW5nID0gY3JlYXRlSmF2YVR5cGVNYXBwaW5nRnJvbU1hcHBpbmdLZXkoa2V5KTsKLQkKLQkJdGhpcy5tYXBwaW5nID0gbmV3TWFwcGluZzsJCi0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihuZXdNYXBwaW5nLmdldEFubm90YXRpb25OYW1lKCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbnRUeXBlLk1BUFBJTkdfUFJPUEVSVFksIG9sZE1hcHBpbmcsIG5ld01hcHBpbmcpOwotCQotCQlpZiAob2xkTWFwcGluZyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uPFN0cmluZz4gYW5ub3RhdGlvbnNUb1JlbW92ZSA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG9sZE1hcHBpbmcuY29ycmVzcG9uZGluZ0Fubm90YXRpb25OYW1lcygpKTsKLQkJCWlmIChnZXRNYXBwaW5nKCkgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYW5ub3RhdGlvbnNUb1JlbW92ZSwgZ2V0TWFwcGluZygpLmNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSk7Ci0JCQl9Ci0JCQkKLQkJCWZvciAoU3RyaW5nIGFubm90YXRpb25OYW1lIDogYW5ub3RhdGlvbnNUb1JlbW92ZSkgewotCQkJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwaW5nKEphdmFUeXBlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCUphdmFUeXBlTWFwcGluZyBvbGRNYXBwaW5nID0gdGhpcy5tYXBwaW5nOwotCQl0aGlzLm1hcHBpbmcgPSBuZXdNYXBwaW5nOwkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQZXJzaXN0ZW50VHlwZS5NQVBQSU5HX1BST1BFUlRZLCBvbGRNYXBwaW5nLCBuZXdNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYXBwZWQoKSB7Ci0JCXJldHVybiBnZXRNYXBwaW5nKCkuaXNNYXBwZWQoKTsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLmFjY2VzczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgbmV3QWNjZXNzKSB7Ci0JCUFjY2Vzc1R5cGUgb2xkQWNjZXNzID0gdGhpcy5hY2Nlc3M7Ci0JCXRoaXMuYWNjZXNzID0gbmV3QWNjZXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbnRUeXBlLkFDQ0VTU19QUk9QRVJUWSwgb2xkQWNjZXNzLCBuZXdBY2Nlc3MpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlc05hbWVkKGZpbmFsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPihhdHRyaWJ1dGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG8pIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlTmFtZS5lcXVhbHMoby5nZXROYW1lKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVOYW1lZChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gYXR0cmlidXRlc05hbWVkKGF0dHJpYnV0ZU5hbWUpOwotCQlyZXR1cm4gKHN0cmVhbS5oYXNOZXh0KCkpID8gc3RyZWFtLm5leHQoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb2x2ZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gYXR0cmlidXRlc05hbWVkKGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCXJldHVybiAoc3RyZWFtLmhhc05leHQoKSkgPyBudWxsIC8qbW9yZSB0aGFuIG9uZSovOiBhdHRyaWJ1dGU7Ci0JCX0KLQkJcmV0dXJuIChnZXRQYXJlbnRQZXJzaXN0ZW50VHlwZSgpID09IG51bGwpID8gbnVsbCA6IGdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkucmVzb2x2ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5hdHRyaWJ1dGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBhdHRyaWJ1dGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlcy5zaXplKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoYXR0cmlidXRlLCB0aGlzLmF0dHJpYnV0ZXMsIFBlcnNpc3RlbnRUeXBlLlNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChhdHRyaWJ1dGUsIHRoaXMuYXR0cmlidXRlcywgUGVyc2lzdGVudFR5cGUuU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lcyh0aGlzLmF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzKEl0ZXJhdG9yPD8gZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRycykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nPihhdHRycykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQZXJzaXN0ZW50VHlwZSwgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gdHJhbnNmb3JtKFBlcnNpc3RlbnRUeXBlIHB0KSB7Ci0JCQkJcmV0dXJuIHB0LmF0dHJpYnV0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbEF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lcyh0aGlzLmFsbEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCUl0ZXJhdG9yPFN0cmluZz4gdmFsdWVzID0gdGhpcy5tYXBwaW5nLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdmFsdWVzOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IGF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXZhbHVlcyA9IHN0cmVhbS5uZXh0KCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHZhbHVlczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQkKLQkvLyBpdCB3b3VsZCBiZSBuaWNlIGlmIHRoZSB3ZSBwYXNzZWQgaW4gYW4gYXN0Um9vdCBoZXJlLCBidXQgdGhlbiB3ZQotCS8vIHdvdWxkIG5lZWQgdG8gcGFzcyBpdCB0byB0aGUgWE1MIHN0cnVjdHVyZSBub2RlcyB0b28uLi4KLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCBvZmZzZXQpIHsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdCgpOyAKLQkJCi0JCWlmICh0aGlzLmNvbnRhaW5zKG9mZnNldCwgYXN0Um9vdCkpIHsKLQkJCWZvciAoSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHRoaXMuYXR0cmlidXRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChwZXJzaXN0ZW50QXR0cmlidXRlLmNvbnRhaW5zKG9mZnNldCwgYXN0Um9vdCkpIHsKLQkJCQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdCgpIHsKLQkJcmV0dXJuIEpEVFRvb2xzLmJ1aWxkQVNUUm9vdCh0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0SnBhQ29tcGlsYXRpb25Vbml0KCkuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgZnVsbFRleHRSYW5nZSA9IHRoaXMuZ2V0RnVsbFRleHRSYW5nZShhc3RSb290KTsKLQkJLy8gJ2Z1bGxUZXh0UmFuZ2UnIHdpbGwgYmUgbnVsbCBpZiB0aGUgdHlwZSBubyBsb25nZXIgZXhpc3RzIGluIHRoZSBqYXZhOwotCQkvLyB0aGUgY29udGV4dCBtb2RlbCBjYW4gYmUgb3V0IG9mIHN5bmNoIHdpdGggdGhlIHJlc291cmNlIG1vZGVsCi0JCS8vIHdoZW4gYSBzZWxlY3Rpb24gZXZlbnQgb2NjdXJzIGJlZm9yZSB0aGUgY29udGV4dCBtb2RlbCBoYXMgYQotCQkvLyBjaGFuY2UgdG8gc3luY2ggd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwgdmlhIHRoZSB1cGRhdGUgdGhyZWFkCi0JCXJldHVybiAoZnVsbFRleHRSYW5nZSA9PSBudWxsKSA/IGZhbHNlIDogZnVsbFRleHRSYW5nZS5pbmNsdWRlcyhvZmZzZXQpOwotCX0KLQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRGdWxsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKHRoaXMuYnVpbGRBU1RSb290KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGluaGVyaXRhbmNlSGllcmFyY2h5KCkgewotCQkvLyB1c2luZyBhIGNoYWluIGl0ZXJhdG9yIHRvIHRyYXZlcnNlIHVwIHRoZSBpbmhlcml0YW5jZSB0cmVlCi0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4odGhpcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgbmV4dExpbmsoUGVyc2lzdGVudFR5cGUgcHQpIHsKLQkJCQlyZXR1cm4gcHQuZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVudFR5cGUgZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudFBlcnNpc3RlbnRUeXBlKFBlcnNpc3RlbnRUeXBlIG5ld1BhcmVudFBlcnNpc3RlbnRUeXBlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZSwgbmV3UGFyZW50UGVyc2lzdGVudFR5cGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUGVyc2lzdGVudFR5cGUgb2xkUGFyZW50UGVyc2lzdGVudFR5cGUgPSB0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlOwotCQl0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlID0gbmV3UGFyZW50UGVyc2lzdGVudFR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVudFR5cGUuUEFSRU5UX1BFUlNJU1RFTlRfVFlQRV9QUk9QRVJUWSwgb2xkUGFyZW50UGVyc2lzdGVudFR5cGUsIG5ld1BhcmVudFBlcnNpc3RlbnRUeXBlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQW55QXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25zKCkgewotCQlpZiAodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmhhc0FueUF0dHJpYnV0ZUFubm90YXRpb25zKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKioqKiogVXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKgotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBqcnB0OwotCQl0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlID0gdGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZShqcnB0KTsKLQkJdGhpcy5hY2Nlc3MgPSB0aGlzLmFjY2VzcyhqcnB0KTsKLQkJdGhpcy5uYW1lID0gdGhpcy5uYW1lKGpycHQpOwotCQl0aGlzLmluaXRpYWxpemVNYXBwaW5nKGpycHQpOwotCQl0aGlzLmluaXRpYWxpemVQZXJzaXN0ZW50QXR0cmlidXRlcyhqcnB0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcHBpbmcoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQl0aGlzLm1hcHBpbmcgID0gZ2V0SnBhUGxhdGZvcm0oKS5idWlsZEphdmFUeXBlTWFwcGluZ0Zyb21Bbm5vdGF0aW9uKHRoaXMuamF2YU1hcHBpbmdBbm5vdGF0aW9uTmFtZShwZXJzaXN0ZW50VHlwZVJlc291cmNlKSwgdGhpcyk7Ci0JCXRoaXMubWFwcGluZy5pbml0aWFsaXplKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUGVyc2lzdGVudEF0dHJpYnV0ZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiByZXNvdXJjZUF0dHJpYnV0ZXMgPSBwZXJzaXN0ZW50VHlwZVJlc291cmNlLmZpZWxkcygpOwotCQlpZiAoZ2V0QWNjZXNzKCkgPT0gQWNjZXNzVHlwZS5QUk9QRVJUWSkgewotCQkJcmVzb3VyY2VBdHRyaWJ1dGVzID0gcGVyc2lzdGVudFR5cGVSZXNvdXJjZS5wcm9wZXJ0aWVzKCk7Ci0JCX0JCQotCQkKLQkJd2hpbGUgKHJlc291cmNlQXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMuYXR0cmlidXRlcy5hZGQoY3JlYXRlQXR0cmlidXRlKHJlc291cmNlQXR0cmlidXRlcy5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpycHQ7Ci0JCWdldEpwYUZpbGUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlTW9kZWwoKSkuYWRkUm9vdFN0cnVjdHVyZU5vZGUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKSwgdGhpcyk7Ci0JCXVwZGF0ZVBhcmVudFBlcnNpc3RlbnRUeXBlKGpycHQpOwotCQl1cGRhdGVBY2Nlc3MoanJwdCk7Ci0JCXVwZGF0ZU5hbWUoanJwdCk7Ci0JCXVwZGF0ZU1hcHBpbmcoanJwdCk7Ci0JCXVwZGF0ZVBlcnNpc3RlbnRBdHRyaWJ1dGVzKGpycHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBY2Nlc3MoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQl0aGlzLnNldEFjY2Vzcyh0aGlzLmFjY2VzcyhqcnB0KSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdGhlIGFjY2VzcyAic3BlY2lmaWVkIiBieSB0aGUgamF2YSByZXNvdXJjZSBtb2RlbC4KLQkgKiAJCUNoZWNrIHhtbCBtYXBwaW5nIHNwZWNpZmllZCBhY2Nlc3MgZmlyc3QKLQkgKiAJCUlmIHN0aWxsIG51bGwgY2hlY2sgamF2YSBhbm5vdGF0aW9ucyBpZiB0aGUgeG1sIGlzIG5vdCBtZXRhZGF0YS1jb21wbGV0ZSA9IHRydWUKLQkgKgkJSWYgc3RpbGwgbnVsbCB0aGVuIHNldCB0byBwYXJlbnRQZXJzaXN0ZW50VHlwZSBhY2Nlc3MuCi0JICogCQlJZiBzdGlsbCBudWxsIGNoZWNrIGVudGl0eS1tYXBwaW5ncyBzcGVjaWZpZWQgYWNjZXNzIHNldHRpbmcgaWYgdGhpcyBwZXJzaXN0ZW50LXR5cGUgaXMgbGlzdGVkIGluIGFuIG9ybS54bWwgZmlsZQotCSAqIAkJSWYgc3RpbGwgbnVsbCBjaGVjayB0aGUgcGVyc2lzdGVuY2UtdW5pdCBkZWZhdWx0IEFjY2VzcwotCSAqIAkJRGVmYXVsdCB0byBGSUVMRCBpZiBhbGwgZWxzZSBmYWlscy4KLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBhY2Nlc3MoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQlBY2Nlc3NUeXBlIGphdmFBY2Nlc3MgPSBudWxsOwotCQlib29sZWFuIG1ldGFkYXRhQ29tcGxldGUgPSBmYWxzZTsKLQkJaWYgKGdldE9ybVBlcnNpc3RlbnRUeXBlKCkgIT0gbnVsbCkgewotCQkJamF2YUFjY2VzcyA9IGdldE9ybVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmdldFNwZWNpZmllZEFjY2VzcygpOwotCQkJbWV0YWRhdGFDb21wbGV0ZSA9IGdldE9ybVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCQl9Ci0JCWlmIChqYXZhQWNjZXNzID09IG51bGwgJiYgIW1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCWphdmFBY2Nlc3MgPSBBY2Nlc3NUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChqcnB0LmdldEFjY2VzcygpKTsKLQkJfQotCQlpZiAoamF2YUFjY2VzcyA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJamF2YUFjY2VzcyA9IGdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGphdmFBY2Nlc3MgPT0gbnVsbCkgewotCQkJaWYgKGdldEVudGl0eU1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJCWphdmFBY2Nlc3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpOwotCQkJfQotCQl9Ci0JCWlmIChqYXZhQWNjZXNzID09IG51bGwpIHsKLQkJCS8vaGF2ZSB0byBjaGVjayBwZXJzaXN0ZW5jZS11bml0IHNlcGFyYXRlbHkgaW4gdGhlIGNhc2Ugd2hlcmUgaXQgaXMgbm90IGxpc3RlZCBkaXJlY3RseSBpbiBhbiBvcm0ueG1sCi0JCQkvL2lmIGl0IGlzIGxpc3RlZCBpbiBhbiBvcm0ueG1sIHRoZW4gdGhlIGVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkgY2hlY2sgd2lsbCBjb3ZlciBwZXJzaXN0ZW5jZS11bml0LmRlZmF1bHRBY2Nlc3MKLQkJCWlmIChnZXRQZXJzaXN0ZW5jZVVuaXQoKSAhPSBudWxsKSB7Ci0JCQkJamF2YUFjY2VzcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldERlZmF1bHRBY2Nlc3MoKTsKLQkJCX0KLQkJfQotCQlpZiAoamF2YUFjY2VzcyA9PSBudWxsKSB7Ci0JCQlqYXZhQWNjZXNzID0gQWNjZXNzVHlwZS5GSUVMRDsKLQkJfQotCQlyZXR1cm4gamF2YUFjY2VzczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCXRoaXMuc2V0TmFtZSh0aGlzLm5hbWUoanJwdCkpOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKLQkJcmV0dXJuIGpycHQuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNYXBwaW5nKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKLQkJU3RyaW5nIGphdmFNYXBwaW5nQW5ub3RhdGlvbk5hbWUgPSB0aGlzLmphdmFNYXBwaW5nQW5ub3RhdGlvbk5hbWUoanJwdCk7Ci0JCWlmIChnZXRNYXBwaW5nKCkuZ2V0QW5ub3RhdGlvbk5hbWUoKSAhPSBqYXZhTWFwcGluZ0Fubm90YXRpb25OYW1lKSB7Ci0JCQlzZXRNYXBwaW5nKGNyZWF0ZUphdmFUeXBlTWFwcGluZ0Zyb21Bbm5vdGF0aW9uKGphdmFNYXBwaW5nQW5ub3RhdGlvbk5hbWUsIGpycHQpKTsKLQkJfQotCQllbHNlIHsKLQkJCWdldE1hcHBpbmcoKS51cGRhdGUoanJwdCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZyBjcmVhdGVKYXZhVHlwZU1hcHBpbmdGcm9tTWFwcGluZ0tleShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRKcGFQbGF0Zm9ybSgpLmJ1aWxkSmF2YVR5cGVNYXBwaW5nRnJvbU1hcHBpbmdLZXkoa2V5LCB0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZyBjcmVhdGVKYXZhVHlwZU1hcHBpbmdGcm9tQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKLQkJSmF2YVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gZ2V0SnBhUGxhdGZvcm0oKS5idWlsZEphdmFUeXBlTWFwcGluZ0Zyb21Bbm5vdGF0aW9uKGFubm90YXRpb25OYW1lLCB0aGlzKTsKLQkJdHlwZU1hcHBpbmcuaW5pdGlhbGl6ZShqcnB0KTsKLQkJcmV0dXJuIHR5cGVNYXBwaW5nOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgamF2YU1hcHBpbmdBbm5vdGF0aW9uTmFtZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCUFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24gPSAoQW5ub3RhdGlvbikganJwdC5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlpZiAobWFwcGluZ0Fubm90YXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIG1hcHBpbmdBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGVyc2lzdGVudEF0dHJpYnV0ZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzID0gYXR0cmlidXRlcygpOwotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiByZXNvdXJjZUF0dHJpYnV0ZXMgPSBqcnB0LmZpZWxkcygpOwotCQlpZiAoZ2V0QWNjZXNzKCkgPT0gQWNjZXNzVHlwZS5QUk9QRVJUWSkgewotCQkJcmVzb3VyY2VBdHRyaWJ1dGVzID0ganJwdC5wcm9wZXJ0aWVzKCk7Ci0JCX0JCQotCQkKLQkJd2hpbGUgKGNvbnRleHRBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGNvbnRleHRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0JCQkJcGVyc2lzdGVudEF0dHJpYnV0ZS51cGRhdGUocmVzb3VyY2VBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVBdHRyaWJ1dGUocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRBdHRyaWJ1dGUoY3JlYXRlQXR0cmlidXRlKHJlc291cmNlQXR0cmlidXRlcy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY3JlYXRlQXR0cmlidXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlKSB7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcyk7Ci0JCWphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUocGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlKTsKLQkJcmV0dXJuIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVQYXJlbnRQZXJzaXN0ZW50VHlwZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKSB7Ci0JCXNldFBhcmVudFBlcnNpc3RlbnRUeXBlKHBhcmVudFBlcnNpc3RlbnRUeXBlKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIHBhcmVudFBlcnNpc3RlbnRUeXBlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJcmV0dXJuIHBhcmVudFBlcnNpc3RlbnRUeXBlKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UuZ2V0U3VwZXJDbGFzc1F1YWxpZmllZE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBwYXJlbnRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlQZXJzaXN0ZW50VHlwZSBwb3NzaWJsZVBhcmVudCA9IHBvc3NpYmxlUGFyZW50KGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCQlpZiAocG9zc2libGVQYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHBvc3NpYmxlUGFyZW50LmlzTWFwcGVkKCkpIHsKLQkJCXJldHVybiBwb3NzaWJsZVBhcmVudDsKLQkJfQotCQlyZXR1cm4gcG9zc2libGVQYXJlbnQuZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBKUEEgc3BlYyBzdXBwb3J0cyB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgbm9uLXBlcnNpc3RlbnQgdHlwZXMgaW4gdGhlIGhpZXJhcmNoeQotCSAqIFRoaXMgd2lsbCBjaGVjayBmb3IgYSBQZXJzaXN0ZW50VHlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoaXMgUGVyc2lzdGVuY2VVbml0LgotCSAqIElmIGl0IGlzIG5vdCBmb3VuZCB0aGVuIGZpbmQgdGhlIEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlIGFuZCBsb29rIGZvciBpdHMgcGFyZW50IHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgcG9zc2libGVQYXJlbnQoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJUGVyc2lzdGVudFR5cGUgcG9zc2libGVQYXJlbnQgPSBnZXRQZXJzaXN0ZW50VHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQkJaWYgKHBvc3NpYmxlUGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwb3NzaWJsZVBhcmVudDsKLQkJfQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCQlyZXR1cm4gKGpycHQgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5wb3NzaWJsZVBhcmVudChqcnB0LmdldFN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCX0KLQotCS8vKioqKioqKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQkvL2dldCBhc3RSb290IGhlcmUgdG8gcGFzcyBkb3duCi0JCWFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIHRoaXMuYnVpbGRBU1RSb290KCkpOwkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubWFwcGluZy5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJfSBjYXRjaChUaHJvd2FibGUgdCkgewotCQkJSnB0Q29yZVBsdWdpbi5sb2codCk7Ci0JCX0KLQkJYWRkQXR0cmlidXRlTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlIDogdGhpcy5hdHRyaWJ1dGVzKSB7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCQl9IGNhdGNoKFRocm93YWJsZSB0KSB7Ci0JCQkJSnB0Q29yZVBsdWdpbi5sb2codCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZChnZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUpwYUZpbGUganBhRmlsZSA9IGdldEpwYUZpbGUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlTW9kZWwoKSk7Ci0JCQotCQlpZiAoanBhRmlsZSAhPSBudWxsKSB7Ci0JCQkvL2pwYUZpbGUgY2FuIGJlIG51bGwgaWYgdGhlIC5qYXZhIGZpbGUgd2FzIGRlbGV0ZWQsCi0JCQkvL3Jvb3RTdHJ1Y3R1cmVOb2RlcyBhcmUgY2xlYXJlZCBpbiB0aGUgZGlzcG9zZSBvZiBKcGFGaWxlCi0JCQlqcGFGaWxlLnJlbW92ZVJvb3RTdHJ1Y3R1cmVOb2RlKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGU1NGE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBleHRlbmRzIEFic3RyYWN0SmF2YU5hbWVkQ29sdW1uPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbgotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZTsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhQmFzZUpvaW5Db2x1bW4uT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSA9IGNvbHVtbjsKLQkJc3VwZXIuaW5pdGlhbGl6ZShjb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShjb2x1bW4pOwotCQl0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKiBKYXZhTmFtZWRDb2x1bW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFCYXNlSm9pbkNvbHVtbi5Pd25lciBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChKYXZhQmFzZUpvaW5Db2x1bW4uT3duZXIpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2U7Ci0JfQotCQotCS8vKioqKioqKioqKioqKiogSUFic3RyYWN0Sm9pbkNvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPT0gbnVsbCkgPyB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSA6IHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmlzVmlydHVhbCh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBDb2x1bW4gZ2V0RGJSZWZlcmVuY2VkQ29sdW1uKCkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKTsKLQkJcmV0dXJuICh0YWJsZSA9PSBudWxsKSA/IG51bGwgOiB0YWJsZS5nZXRDb2x1bW5OYW1lZCh0aGlzLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBUYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0RGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5yZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKCkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0T3duZXIoKS5nZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlICE9IG51bGwpID8gdGFibGUuY29sdW1uTmFtZXMoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz4gaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBxdW90ZWRDYW5kaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhmaWx0ZXIpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuY29ubmVjdGVkSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlZENvbHVtblJlc29sdmVkKCkgewotCQlyZXR1cm4gZ2V0RGJSZWZlcmVuY2VkQ29sdW1uKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtblJlc291cmNlKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0Q29sdW1uUmVzb3VyY2UoKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRPd25lcigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSA9IGNvbHVtbjsKLQkJc3VwZXIudXBkYXRlKGNvbHVtbik7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoY29sdW1uKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCX0KLQkKLQkvL1RPRE8gbm90IGNvcnJlY3Qgd2hlbiB3ZSBzdGFydCBzdXBwb3J0aW5nIHByaW1hcnlLZXlKb2luQ29sdW1ucyBpbiAxLTEgbWFwcGluZ3MKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiPT4iKTsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUXVlcnlIaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUXVlcnlIaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YWJhOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVF1ZXJ5SGludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFRdWVyeUhpbnQgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIEphdmFRdWVyeUhpbnQKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOwotCi0JcHJvdGVjdGVkIFF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50OwotCQotCXB1YmxpYyBHZW5lcmljSmF2YVF1ZXJ5SGludChKYXZhUXVlcnkgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMucXVlcnlIaW50LnNldE5hbWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUXVlcnlIaW50Lk5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7Ci0JCXRoaXMucXVlcnlIaW50LnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50KSB7Ci0JCXRoaXMucXVlcnlIaW50ID0gcXVlcnlIaW50OwotCQl0aGlzLm5hbWUgPSBxdWVyeUhpbnQuZ2V0TmFtZSgpOwotCQl0aGlzLnZhbHVlID0gcXVlcnlIaW50LmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShRdWVyeUhpbnRBbm5vdGF0aW9uIHF1ZXJ5SGludCkgewotCQl0aGlzLnF1ZXJ5SGludCA9IHF1ZXJ5SGludDsKLQkJdGhpcy5zZXROYW1lKHF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQl0aGlzLnNldFZhbHVlKHF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGM4MDk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFUYWJsZQotCWltcGxlbWVudHMgSmF2YVNlY29uZGFyeVRhYmxlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0KLQlwcm90ZWN0ZWQgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQotCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZTsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZShKYXZhRW50aXR5IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVudGl0eSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUVudGl0eSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKioqKiBBYnN0cmFjdEphdmFUYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIGdldFRhYmxlUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZGFyeVRhYmxlUmVzb3VyY2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKiogSVNlY29uZGFyeVRhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqCi0JCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA6IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQkKLQlwdWJsaWMgaW50IHByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKTsKLQl9Ci0JCi0JcHVibGljIGludCBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICF0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JfQkKLQkKLQlwdWJsaWMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIG5ld1BrSm9pbkNvbHVtbikgewotCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gb2xkUGtKb2luQ29sdW1uID0gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gbmV3UGtKb2luQ29sdW1uOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNlY29uZGFyeVRhYmxlLkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIG9sZFBrSm9pbkNvbHVtbiwgbmV3UGtKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBvbGREZWZhdWx0UGtKb2luQ29sdW1uID0gdGhpcy5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJaWYgKG9sZERlZmF1bHRQa0pvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJLy9udWxsIHRoZSBkZWZhdWx0IGpvaW4gY29sdW1uIG5vdyBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JCQkvL2lmIG9uZSBkb2VzIG5vdCBleGlzdCwgdGhlcmUgaXMgYWxyZWFkeSBhIHNwZWNpZmllZCBqb2luIGNvbHVtbi4KLQkJCS8vUmVtb3ZlIGl0IG5vdyBzbyB0aGF0IGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQgZHVyaW5nIGFuIHVwZGF0ZSBhbmQKLQkJCS8vY2F1c2UgY2hhbmdlIG5vdGlmaWNhdGlvbnMgdG8gYmUgc2VudCB0byB0aGUgVUkgaW4gdGhlIHdyb25nIG9yZGVyCi0JCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG51bGw7Ci0JCX0KLQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKSk7Ci0JCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChpbmRleCwgcHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uUmVzb3VyY2UgPSB0aGlzLnNlY29uZGFyeVRhYmxlUmVzb3VyY2UuYWRkUGtKb2luQ29sdW1uKGluZGV4KTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW4uaW5pdGlhbGl6ZShwa0pvaW5Db2x1bW5SZXNvdXJjZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChTZWNvbmRhcnlUYWJsZS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCWlmIChvbGREZWZhdWx0UGtKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTZWNvbmRhcnlUYWJsZS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBvbGREZWZhdWx0UGtKb2luQ29sdW1uLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4LCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgcHJpbWFyeUtleUpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBTZWNvbmRhcnlUYWJsZS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVtb3ZlZFByaW1hcnlLZXlKb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKLQkJaWYgKCFjb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQkvL2NyZWF0ZSB0aGUgZGVmYXVsdEpvaW5Db2x1bW4gbm93IG9yIHRoaXMgd2lsbCBoYXBwZW4gZHVyaW5nIHByb2plY3QgdXBkYXRlIAotCQkJLy9hZnRlciByZW1vdmluZyB0aGUgam9pbiBjb2x1bW4gZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuIFRoYXQgY2F1c2VzIHByb2JsZW1zIAotCQkJLy9pbiB0aGUgVUkgYmVjYXVzZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgZW5kIHVwIGluIHRoZSB3cm9uZyBvcmRlci4KLQkJCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihuZXcgTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMuc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSkpOwotCQl9Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5yZW1vdmVQa0pvaW5Db2x1bW4oaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoU2Vjb25kYXJ5VGFibGUuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJaWYgKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIGEgZGVmYXVsdEpvaW5Db2x1bW4gd2FzIGNyZWF0ZWQgYWJvdmUKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHkuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQl9Ci0JfQkKLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uXyhKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KHByaW1hcnlLZXlKb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucywgU2Vjb25kYXJ5VGFibGUuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlUmVzb3VyY2UubW92ZVBrSm9pbkNvbHVtbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKFNlY29uZGFyeVRhYmxlLlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlwdWJsaWMgSmF2YUVudGl0eSBnZXRKYXZhRW50aXR5KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCk7Ci0JfQotCQotCQotCS8vKioqKioqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoc2Vjb25kYXJ5VGFibGUpOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBzZWNvbmRhcnlUYWJsZTsKLQkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKHNlY29uZGFyeVRhYmxlKTsKLQkJdGhpcy5pbml0aWFsaXplRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKHNlY29uZGFyeVRhYmxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUpIHsKLQkJTGlzdEl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBzZWNvbmRhcnlUYWJsZS5wa0pvaW5Db2x1bW5zKCk7Ci0JCQotCQl3aGlsZShhbm5vdGF0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKGFubm90YXRpb25zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEJ1aWxkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gIWNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlKSB7Ci0JCWlmICghc2hvdWxkQnVpbGREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihuZXcgTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uKHNlY29uZGFyeVRhYmxlKSk7Ci0JfQkKLQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSkgewotCQl0aGlzLnNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBzZWNvbmRhcnlUYWJsZVJlc291cmNlOwotCQlzdXBlci51cGRhdGUoc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihzZWNvbmRhcnlUYWJsZVJlc291cmNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZVJlc291cmNlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiByZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlUmVzb3VyY2UucGtKb2luQ29sdW1ucygpOwotCQkKLQkJd2hpbGUgKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJcHJpbWFyeUtleUpvaW5Db2x1bW4udXBkYXRlKHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbl8ocHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCksIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZVJlc291cmNlKSB7Ci0JCWlmICghc2hvdWxkQnVpbGREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSkgewotCQkJc2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG5ldyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW4oc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSkpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uLnVwZGF0ZShuZXcgTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uKHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpKTsKLQkJfQotCX0JCi0JCi0JcHJvdGVjdGVkIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlKSB7Ci0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLCBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCkpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbi5pbml0aWFsaXplKHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UpOwotCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQmFzZUpvaW5Db2x1bW4uT3duZXIgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQlib29sZWFuIGRvQ29udGludWUgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQkJU3RyaW5nIHNjaGVtYSA9IGdldFNjaGVtYSgpOwotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISBoYXNSZXNvbHZlZFNjaGVtYSgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5TRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsCi0JCQkJCQluZXcgU3RyaW5nW10ge3NjaGVtYSwgZ2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCWdldFNjaGVtYVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJZG9Db250aW51ZSA9IGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoZG9Db250aW51ZSAmJiAhIGlzUmVzb2x2ZWQoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCWdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJfQotCX0KLQotCi0JLy8qKioqKioqKioqKioqKioqKioqKiogY29kZSBjb21wbGV0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWZvciAoSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucygpKSkgewotCQkJcmVzdWx0ID0gY29sdW1uLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCWNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgaW1wbGVtZW50cyBKYXZhQmFzZUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0KLQkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUudGhpcy5nZXRKYXZhRW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS50aGlzLmdldERiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVNlY29uZGFyeVRhYmxlLnRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUudGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKLQkJCWlmIChqb2luQ29sdW1uc1NpemUoKSAhPSAxKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0SmF2YUVudGl0eSgpLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlOWNjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEphdmFHZW5lcmF0b3IKLQlpbXBsZW1lbnRzIEphdmFTZXF1ZW5jZUdlbmVyYXRvcgotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2VxdWVuY2VOYW1lOwotCi0JcHVibGljIEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSBzdXBlci5nZXRHZW5lcmF0b3JSZXNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoc2VxdWVuY2VHZW5lcmF0b3IpOwotCQl0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lKHNlcXVlbmNlR2VuZXJhdG9yKTsKLQl9Ci0JCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpIHsKLQkJcmV0dXJuIFNlcXVlbmNlR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZU5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSA9PSBudWxsKSA/IGdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZFNlcXVlbmNlTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkU2VxdWVuY2VOYW1lID0gdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lID0gbmV3U3BlY2lmaWVkU2VxdWVuY2VOYW1lOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldFNlcXVlbmNlTmFtZShuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TRVFVRU5DRV9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUsIG5ld1NwZWNpZmllZFNlcXVlbmNlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkU2VxdWVuY2VOYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUgPSB0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWUgPSBuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NFUVVFTkNFX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNlcXVlbmNlTmFtZSwgbmV3U3BlY2lmaWVkU2VxdWVuY2VOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJc3VwZXIudXBkYXRlKHNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWVfKHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lKHNlcXVlbmNlR2VuZXJhdG9yKSk7IAotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNlcXVlbmNlTmFtZShTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGdlbmVyYXRvclJlc291cmNlLmdldFNlcXVlbmNlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhMzAzMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVGFibGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFUYWJsZSBpbXBsZW1lbnRzIEphdmFUYWJsZQotewotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBlcnNpc3RlbnRSZXNvdXJjZTsKLQotCXB1YmxpYyBHZW5lcmljSmF2YVRhYmxlKEphdmFFbnRpdHkgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwZXJzaXN0ZW50UmVzb3VyY2UpIHsKLQkJdGhpcy5wZXJzaXN0ZW50UmVzb3VyY2UgPSBwZXJzaXN0ZW50UmVzb3VyY2U7Ci0JCWluaXRpYWxpemUoZ2V0VGFibGVSZXNvdXJjZSgpKTsKLQl9Ci0KLQkKLQkvL3F1ZXJ5IGZvciB0aGUgdGFibGUgcmVzb3VyY2UgZXZlcnkgdGltZSBvbiBzZXR0ZXJzLgotCS8vY2FsbCBvbmUgc2V0dGVyIGFuZCB0aGUgdGFibGVSZXNvdXJjZSBjb3VsZCBjaGFuZ2UuIAotCS8vWW91IGNvdWxkIGNhbGwgbW9yZSB0aGFuIG9uZSBzZXR0ZXIgYmVmb3JlIHRoaXMgb2JqZWN0IGhhcyByZWNlaXZlZCBhbnkgbm90aWZpY2F0aW9uCi0JLy9mcm9tIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRhYmxlQW5ub3RhdGlvbiBnZXRUYWJsZVJlc291cmNlKCkgewotCQkvL1RPRE8gZ2V0IHRoZSBOdWxsVGFibGUgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwgb3IgYnVpbGQgaXQgaGVyZSBpbiB0aGUgY29udGV4dCBtb2RlbD8/Ci0JCXJldHVybiAoVGFibGVBbm5vdGF0aW9uKSB0aGlzLnBlcnNpc3RlbnRSZXNvdXJjZS5nZXROb25OdWxsQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFbnRpdHkgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFFbnRpdHkpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUVudGl0eSBnZXRKYXZhRW50aXR5KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCBFbnRpdHkgZ2V0Um9vdEVudGl0eSgpIHsKLQkJcmV0dXJuIGdldEphdmFFbnRpdHkoKS5nZXRSb290RW50aXR5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCS8qKgotCSAqIFRhYmxlIG5hbWUgZGVmYXVsdCB0byB0aGUgb3duaW5nIGphdmEgZW50aXR5IG5hbWUuCi0JICogSWYgdGhpcyBlbnRpdHkgaXMgcGFydCBvZiBhIHNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSBoaWVyYXJjaHksIHRhYmxlCi0JICogbmFtZSBkZWZhdWx0cyB0byB0aGUgcm9vdCBlbnRpdHkncyB0YWJsZSBuYW1lLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWUoKSB7Ci0JCWlmIChnZXRKYXZhRW50aXR5KCkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUpIHsKLQkJCWlmIChnZXRSb290RW50aXR5KCkgIT0gZ2V0SmF2YUVudGl0eSgpKSB7Ci0JCQkJcmV0dXJuIGdldFJvb3RFbnRpdHkoKS5nZXRUYWJsZSgpLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0SmF2YUVudGl0eSgpLmdldE5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hKCkgewotCQlpZiAoZ2V0SmF2YUVudGl0eSgpLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKSB7Ci0JCQlpZiAoZ2V0Um9vdEVudGl0eSgpICE9IGdldEphdmFFbnRpdHkoKSkgewotCQkJCXJldHVybiBnZXRSb290RW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTY2hlbWEoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZGVmYXVsdFNjaGVtYSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nKCkgewotCQlpZiAoZ2V0SmF2YUVudGl0eSgpLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKSB7Ci0JCQlpZiAoZ2V0Um9vdEVudGl0eSgpICE9IGdldEphdmFFbnRpdHkoKSkgewotCQkJCXJldHVybiBnZXRSb290RW50aXR5KCkuZ2V0VGFibGUoKS5nZXRDYXRhbG9nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmRlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBlcnNpc3RlbnRSZXNvdXJjZSkgewotCQl0aGlzLnBlcnNpc3RlbnRSZXNvdXJjZSA9IHBlcnNpc3RlbnRSZXNvdXJjZTsKLQkJdGhpcy51cGRhdGUoZ2V0VGFibGVSZXNvdXJjZSgpKTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCWJvb2xlYW4gZG9Db250aW51ZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQlTdHJpbmcgc2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0JCQotCQlpZiAoZG9Db250aW51ZSAmJiAhIGhhc1Jlc29sdmVkU2NoZW1hKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBQkxFX1VOUkVTT0xWRURfU0NIRU1BLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtzY2hlbWEsIGdldE5hbWUoKX0sIAotCQkJCQkJdGhpcywgCi0JCQkJCQlnZXRTY2hlbWFUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISBpc1Jlc29sdmVkKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBQkxFX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCWdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTI2MGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RKYXZhR2VuZXJhdG9yCi0JaW1wbGVtZW50cyBKYXZhVGFibGVHZW5lcmF0b3IsIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIKLXsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVGFibGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYWJsZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENhdGFsb2c7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNjaGVtYTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWE7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtbk5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRQa0NvbHVtbk5hbWU7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZUNvbHVtbk5hbWU7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtblZhbHVlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UGtDb2x1bW5WYWx1ZTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHM7Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludHMgPSBuZXcgQXJyYXlMaXN0PEphdmFVbmlxdWVDb25zdHJhaW50PigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUYWJsZUdlbmVyYXRvckFubm90YXRpb24gZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBzdXBlci5nZXRHZW5lcmF0b3JSZXNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRJbml0aWFsVmFsdWUoKSB7Ci0JCXJldHVybiBUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0lOSVRJQUxfVkFMVUU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRUYWJsZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFRhYmxlKCkgOiB0aGlzLmdldFNwZWNpZmllZFRhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFRhYmxlKFN0cmluZyBuZXdTcGVjaWZpZWRUYWJsZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkVGFibGUgPSB0aGlzLnNwZWNpZmllZFRhYmxlOwotCQl0aGlzLnNwZWNpZmllZFRhYmxlID0gbmV3U3BlY2lmaWVkVGFibGU7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0VGFibGUobmV3U3BlY2lmaWVkVGFibGUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVGFibGUsIG5ld1NwZWNpZmllZFRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUYWJsZV8oU3RyaW5nIG5ld1NwZWNpZmllZFRhYmxlKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRUYWJsZSA9IHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSBuZXdTcGVjaWZpZWRUYWJsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFRhYmxlLCBuZXdTcGVjaWZpZWRUYWJsZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRDYXRhbG9nKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0Q2F0YWxvZygpIDogdGhpcy5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIG5ld1NwZWNpZmllZENhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZENhdGFsb2cgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IG5ld1NwZWNpZmllZENhdGFsb2c7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0Q2F0YWxvZyhuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ2F0YWxvZywgbmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhdGFsb2dfKFN0cmluZyBuZXdTcGVjaWZpZWRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBuZXdTcGVjaWZpZWRDYXRhbG9nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRDYXRhbG9nLCBuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgbmV3RGVmYXVsdENhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRDYXRhbG9nID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IG5ld0RlZmF1bHRDYXRhbG9nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSwgb2xkRGVmYXVsdENhdGFsb2csIG5ld0RlZmF1bHRDYXRhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFNjaGVtYSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFNjaGVtYSgpIDogdGhpcy5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgbmV3U3BlY2lmaWVkU2NoZW1hKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRTY2hlbWEgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBuZXdTcGVjaWZpZWRTY2hlbWE7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0U2NoZW1hKG5ld1NwZWNpZmllZFNjaGVtYSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2NoZW1hLCBuZXdTcGVjaWZpZWRTY2hlbWEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNjaGVtYV8oU3RyaW5nIG5ld1NwZWNpZmllZFNjaGVtYSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkU2NoZW1hID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gbmV3U3BlY2lmaWVkU2NoZW1hOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNjaGVtYSwgbmV3U3BlY2lmaWVkU2NoZW1hKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNjaGVtYShTdHJpbmcgbmV3RGVmYXVsdFNjaGVtYSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFNjaGVtYSA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gbmV3RGVmYXVsdFNjaGVtYTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkRGVmYXVsdFNjaGVtYSwgbmV3RGVmYXVsdFNjaGVtYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQa0NvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSA9PSBudWxsKSA/IGdldERlZmF1bHRQa0NvbHVtbk5hbWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZFBrQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUGtDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUGtDb2x1bW5OYW1lOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldFBrQ29sdW1uTmFtZShuZXdTcGVjaWZpZWRQa0NvbHVtbk5hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUGtDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRQa0NvbHVtbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uTmFtZV8oU3RyaW5nIG5ld1NwZWNpZmllZFBrQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUGtDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUGtDb2x1bW5OYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUGtDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRQa0NvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFBrQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUgPSBuZXdTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0VmFsdWVDb2x1bW5OYW1lKG5ld1NwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUsIG5ld1NwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUgPSBuZXdTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUsIG5ld1NwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWVDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGtDb2x1bW5WYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSA9PSBudWxsKSA/IGdldERlZmF1bHRQa0NvbHVtblZhbHVlKCkgOiB0aGlzLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZShTdHJpbmcgbmV3U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKLQkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlID0gbmV3U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5zZXRQa0NvbHVtblZhbHVlKG5ld1NwZWNpZmllZFBrQ29sdW1uVmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QS19DT0xVTU5fVkFMVUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFBrQ29sdW1uVmFsdWUsIG5ld1NwZWNpZmllZFBrQ29sdW1uVmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWVfKFN0cmluZyBuZXdTcGVjaWZpZWRQa0NvbHVtblZhbHVlKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRQa0NvbHVtblZhbHVlID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlOwotCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWUgPSBuZXdTcGVjaWZpZWRQa0NvbHVtblZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QS19DT0xVTU5fVkFMVUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFBrQ29sdW1uVmFsdWUsIG5ld1NwZWNpZmllZFBrQ29sdW1uVmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRQa0NvbHVtblZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludHMgKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50Pih0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKLQl9Ci0JCi0JcHVibGljIGludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCUphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhVW5pcXVlQ29uc3RyYWludCh0aGlzLCB0aGlzKTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50cy5hZGQoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQpOwotCQlVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiA9IHRoaXMuZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5hZGRVbmlxdWVDb25zdHJhaW50KGluZGV4KTsKLQkJdW5pcXVlQ29uc3RyYWludC5pbml0aWFsaXplKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1BZGRlZChUYWJsZUdlbmVyYXRvci5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQpOwotCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludDsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXRoaXMucmVtb3ZlVW5pcXVlQ29uc3RyYWludCh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmluZGV4T2YodW5pcXVlQ29uc3RyYWludCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCUphdmFVbmlxdWVDb25zdHJhaW50IHJlbW92ZWRVbmlxdWVDb25zdHJhaW50ID0gdGhpcy51bmlxdWVDb25zdHJhaW50cy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmdldEdlbmVyYXRvclJlc291cmNlKCkucmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChUYWJsZUdlbmVyYXRvci5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIHJlbW92ZWRVbmlxdWVDb25zdHJhaW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy51bmlxdWVDb25zdHJhaW50cywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5nZXRHZW5lcmF0b3JSZXNvdXJjZSgpLm1vdmVVbmlxdWVDb25zdHJhaW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoVGFibGVHZW5lcmF0b3IuVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgsIEphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgdW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVGFibGVHZW5lcmF0b3IuVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50XyhKYXZhVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdCh1bmlxdWVDb25zdHJhaW50LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCBUYWJsZUdlbmVyYXRvci5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCk7Ci0JfQotCQotCQotCS8vKioqKioqKioqKioqKioqKioqKiBVbmlxdWVDb25zdHJhaW50Lk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlVW5pcXVlQ29uc3RyYWludENvbHVtbk5hbWVzKCkgewotCQlvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZGJUYWJsZSA9IGdldERiVGFibGUoKTsKLQkJaWYgKGRiVGFibGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRiVGFibGUuY29sdW1uTmFtZXMoKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqYXZhIHJlc291cmNlIG1vZGVsIC0+IGphdmEgY29udGV4dCBtb2RlbCAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSh0YWJsZUdlbmVyYXRvcik7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0aGlzLnNwZWNpZmllZFRhYmxlKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IHRoaXMuZGVmYXVsdENhdGFsb2coKTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSB0aGlzLnNwZWNpZmllZFNjaGVtYSh0YWJsZUdlbmVyYXRvcik7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYSA9IHRoaXMuZGVmYXVsdFNjaGVtYSgpOwotCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSh0YWJsZUdlbmVyYXRvcik7Ci0JCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSh0YWJsZUdlbmVyYXRvcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVVuaXF1ZUNvbnN0cmFpbnRzKHRhYmxlR2VuZXJhdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVW5pcXVlQ29uc3RyYWludHMoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCWZvciAoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHMoKSkpIHsKLQkJCXRoaXMudW5pcXVlQ29uc3RyYWludHMuYWRkKGJ1aWxkVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvcikgewotCQlzdXBlci51cGRhdGUodGFibGVHZW5lcmF0b3IpOwotCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlXyh0aGlzLnNwZWNpZmllZFRhYmxlKHRhYmxlR2VuZXJhdG9yKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18odGhpcy5zcGVjaWZpZWRDYXRhbG9nKHRhYmxlR2VuZXJhdG9yKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdENhdGFsb2codGhpcy5kZWZhdWx0Q2F0YWxvZygpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2hlbWFfKHRoaXMuc3BlY2lmaWVkU2NoZW1hKHRhYmxlR2VuZXJhdG9yKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNjaGVtYSh0aGlzLmRlZmF1bHRTY2hlbWEoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lXyh0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZSh0YWJsZUdlbmVyYXRvcikpOwotCQl0aGlzLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZV8odGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUodGFibGVHZW5lcmF0b3IpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlXyh0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWUodGFibGVHZW5lcmF0b3IpKTsKLQkJdGhpcy51cGRhdGVVbmlxdWVDb25zdHJhaW50cyh0YWJsZUdlbmVyYXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvcikgewotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdW5pcXVlQ29uc3RyYWludHMoKTsKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiByZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJCi0JCXdoaWxlICh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKLQkJCUphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgPSB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKLQkJCQl1bmlxdWVDb25zdHJhaW50LnVwZGF0ZShyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVVbmlxdWVDb25zdHJhaW50Xyh1bmlxdWVDb25zdHJhaW50KTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlVW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpLCBidWlsZFVuaXF1ZUNvbnN0cmFpbnQocmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cy5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhVW5pcXVlQ29uc3RyYWludCBidWlsZFVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pIHsKLQkJSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFVbmlxdWVDb25zdHJhaW50KHRoaXMsIHRoaXMpOwotCQl1bmlxdWVDb25zdHJhaW50LmluaXRpYWxpemUodW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pOwotCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYWJsZShUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yLmdldFRhYmxlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZyhUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yLmdldENhdGFsb2coKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTY2hlbWEoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvci5nZXRTY2hlbWEoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtbk5hbWUoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtbk5hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtblZhbHVlKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvcikgewotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYSgpIHsKLQkJaWYgKGdldEVudGl0eU1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCk7Ci0JCX0KLQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZygpIHsKLQkJaWYgKGdldEVudGl0eU1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpOwotCQl9Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCX0KLQotCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKCkgewotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYlNjaGVtYSgpOwotCQlyZXR1cm4gKHNjaGVtYSA9PSBudWxsKSA/IG51bGwgOiBzY2hlbWEuZ2V0VGFibGVOYW1lZCh0aGlzLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFTb3VyY2UoKS5nZXRTY2hlbWFOYW1lZCh0aGlzLmdldFNjaGVtYSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUcmFuc2llbnRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2Q5MTlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUcmFuc2llbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZyBleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8VHJhbnNpZW50QW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFUcmFuc2llbnRNYXBwaW5nCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29ycmVzcG9uZGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVVuaXF1ZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMzJjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhVW5pcXVlQ29uc3RyYWludAotewotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lczsKLQotCXByb3RlY3RlZCBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLQkKLQlwcm90ZWN0ZWQgT3duZXIgb3duZXI7Ci0JcHVibGljIEdlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludChKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMuY29sdW1uTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQl9Ci0KLQlwdWJsaWMgT3duZXIgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmNvbHVtbk5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbHVtbk5hbWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uTmFtZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aGlzLmNvbHVtbk5hbWVzLmFkZChpbmRleCwgY29sdW1uTmFtZSk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uYWRkQ29sdW1uTmFtZShpbmRleCwgY29sdW1uTmFtZSk7Ci0JCWZpcmVJdGVtQWRkZWQoVW5pcXVlQ29uc3RyYWludC5DT0xVTU5fTkFNRVNfTElTVCwgaW5kZXgsIGNvbHVtbk5hbWUpOwkJCi0JfQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5OYW1lXyhpbnQgaW5kZXgsIFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0JCXRoaXMuY29sdW1uTmFtZXMuYWRkKGluZGV4LCBjb2x1bW5OYW1lKTsKLQkJZmlyZUl0ZW1BZGRlZChVbmlxdWVDb25zdHJhaW50LkNPTFVNTl9OQU1FU19MSVNULCBpbmRleCwgY29sdW1uTmFtZSk7CQkKLQl9CQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aGlzLnJlbW92ZUNvbHVtbk5hbWUodGhpcy5jb2x1bW5OYW1lcy5pbmRleE9mKGNvbHVtbk5hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5OYW1lKGludCBpbmRleCkgewotCQlTdHJpbmcgcmVtb3ZlZENvbHVtbk5hbWUgPSB0aGlzLmNvbHVtbk5hbWVzLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludEFubm90YXRpb24ucmVtb3ZlQ29sdW1uTmFtZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChVbmlxdWVDb25zdHJhaW50LkNPTFVNTl9OQU1FU19MSVNULCBpbmRleCwgcmVtb3ZlZENvbHVtbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb2x1bW5OYW1lXyhpbnQgaW5kZXgpIHsKLQkJU3RyaW5nIHJlbW92ZWRDb2x1bW5OYW1lID0gdGhpcy5jb2x1bW5OYW1lcy5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoVW5pcXVlQ29uc3RyYWludC5DT0xVTU5fTkFNRVNfTElTVCwgaW5kZXgsIHJlbW92ZWRDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQ29sdW1uTmFtZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmNvbHVtbk5hbWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLm1vdmVDb2x1bW5OYW1lKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoVW5pcXVlQ29uc3RyYWludC5DT0xVTU5fTkFNRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiA9IHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotCQl0aGlzLmluaXRpYWxpemVDb2x1bW5OYW1lcyh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb2x1bW5OYW1lcyhVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbikgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBhbm5vdGF0aW9uQ29sdW1uTmFtZXMgPSB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5jb2x1bW5OYW1lcygpOwotCQkKLQkJZm9yIChTdHJpbmcgYW5ub3RhdGlvbkNvbHVtbk5hbWUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoYW5ub3RhdGlvbkNvbHVtbk5hbWVzKSkgewotCQkJdGhpcy5jb2x1bW5OYW1lcy5hZGQoYW5ub3RhdGlvbkNvbHVtbk5hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKSB7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gPSB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLQkJdGhpcy51cGRhdGVDb2x1bW5OYW1lcyh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29sdW1uTmFtZXMoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gYW5ub3RhdGlvbkNvbHVtbk5hbWVzID0gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uY29sdW1uTmFtZXMoKTsKLQkJCi0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoU3RyaW5nIGFubm90YXRpb25Db2x1bW5OYW1lIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFubm90YXRpb25Db2x1bW5OYW1lcykpIHsKLQkJCWlmIChjb2x1bW5OYW1lc1NpemUoKSA+IGluZGV4KSB7Ci0JCQkJaWYgKHRoaXMuY29sdW1uTmFtZXMuZ2V0KGluZGV4KSAhPSBhbm5vdGF0aW9uQ29sdW1uTmFtZSkgewotCQkJCQlhZGRDb2x1bW5OYW1lXyhpbmRleCwgYW5ub3RhdGlvbkNvbHVtbk5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWFkZENvbHVtbk5hbWVfKGluZGV4LCBhbm5vdGF0aW9uQ29sdW1uTmFtZSk7CQkJCi0JCQl9Ci0JCQlpbmRleCsrOwotCQl9Ci0JCQotCQlmb3IgKCA7IGluZGV4IDwgY29sdW1uTmFtZXNTaXplKCk7ICkgewotCQkJcmVtb3ZlQ29sdW1uTmFtZV8oaW5kZXgpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0JCi0KLQlwcml2YXRlIGJvb2xlYW4gY29sdW1uTmFtZXNUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmNvbHVtbk5hbWVzVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVDb2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIoKS5jYW5kaWRhdGVVbmlxdWVDb25zdHJhaW50Q29sdW1uTmFtZXMoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlQ29sdW1uTmFtZXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGVkQ2FuZGlkYXRlQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZUNvbHVtbk5hbWVzKGZpbHRlcikpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5jb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5jb2x1bW5OYW1lc1RvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIHRoaXMucXVvdGVkQ2FuZGlkYXRlQ29sdW1uTmFtZXMoZmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzQwZWQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPFZlcnNpb25Bbm5vdGF0aW9uPiBpbXBsZW1lbnRzIEphdmFWZXJzaW9uTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhQ29sdW1uIGNvbHVtbjsKLQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHRlbXBvcmFsOwotCi0JcHVibGljIEdlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29sdW1uID0gY3JlYXRlSmF2YUNvbHVtbigpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29sdW1uIGNyZWF0ZUphdmFDb2x1bW4oKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQ29sdW1uKHRoaXMsIHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy5jb2x1bW4uaW5pdGlhbGl6ZSh0aGlzLmdldENvbHVtblJlc291cmNlKCkpOwotCQl0aGlzLnRlbXBvcmFsID0gdGhpcy50ZW1wb3JhbCh0aGlzLnRlbXBvcmFsUmVzb3VyY2UoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChUZW1wb3JhbEFubm90YXRpb24pIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChDb2x1bW5Bbm5vdGF0aW9uKSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKiBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAotCQkJSlBBLkNPTFVNTiwKLQkJCUpQQS5URU1QT1JBTCk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKiBJTmFtZWRDb2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCX0KLQotCS8vKioqKioqKioqKioqKiogSVZlcnNpb25NYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKYXZhQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCX0KLQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7Ci0JCXJldHVybiB0aGlzLnRlbXBvcmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkgewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0aGlzLnRlbXBvcmFsOwotCQl0aGlzLnRlbXBvcmFsID0gbmV3VGVtcG9yYWw7Ci0JCXRoaXMudGVtcG9yYWxSZXNvdXJjZSgpLnNldFZhbHVlKFRlbXBvcmFsVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKG5ld1RlbXBvcmFsKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ29sdW1uTWFwcGluZy5URU1QT1JBTF9QUk9QRVJUWSwgb2xkVGVtcG9yYWwsIG5ld1RlbXBvcmFsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJc3VwZXIudXBkYXRlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZSh0aGlzLmdldENvbHVtblJlc291cmNlKCkpOwotCQl0aGlzLnNldFRlbXBvcmFsKHRoaXMudGVtcG9yYWwodGhpcy50ZW1wb3JhbFJlc291cmNlKCkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbChUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwpIHsKLQkJcmV0dXJuIFRlbXBvcmFsVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwodGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJlc3VsdCA9IHRoaXMuZ2V0Q29sdW1uKCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8vKioqKioqKioqKiogIFZhbGlkYXRpb24gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQkKLQkJYWRkQ29sdW1uTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSmF2YUNvbHVtbiBjb2x1bW4gPSB0aGlzLmdldENvbHVtbigpOwotCQlTdHJpbmcgdGFibGUgPSBjb2x1bW4uZ2V0VGFibGUoKTsKLQkJYm9vbGVhbiBkb0NvbnRpbnVlID0gZW50aXR5T3duZWQoKSAmJiBjb2x1bW4uY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgdGhpcy5nZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0YWJsZSwgY29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJY29sdW1uLCBjb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISBjb2x1bW4uaXNSZXNvbHZlZCgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sIGNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQmFzaWNNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzN2Q3Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUJhc2ljTWFwcGluZ1Byb3ZpZGVyCi0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUJhc2ljTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFCYXNpY01hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSmF2YUJhc2ljTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YUJhc2ljTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkZWZhdWx0QXBwbGllcyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnR5cGVJc0Jhc2ljKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFDYXNjYWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFDYXNjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YTIxZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQ2FzY2FkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQ2FzY2FkZSBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgQ2FzY2FkZQotewotCXByb3RlY3RlZCBib29sZWFuIGFsbDsKLQotCXByb3RlY3RlZCBib29sZWFuIHBlcnNpc3Q7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXJnZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlZnJlc2g7Ci0KLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gcmVsYXRpb25zaGlwTWFwcGluZzsKLQotCXByb3RlY3RlZCBKYXZhQ2FzY2FkZShKYXZhUmVsYXRpb25zaGlwTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbCgpIHsKLQkJcmV0dXJuIHRoaXMuYWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsbChib29sZWFuIG5ld0FsbCkgewotCQlib29sZWFuIG9sZEFsbCA9IHRoaXMuYWxsOwotCQl0aGlzLmFsbCA9IG5ld0FsbDsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLnNldENhc2NhZGVBbGwobmV3QWxsKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLkFMTF9QUk9QRVJUWSwgb2xkQWxsLCBuZXdBbGwpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdCgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0KGJvb2xlYW4gbmV3UGVyc2lzdCkgewotCQlib29sZWFuIG9sZFBlcnNpc3QgPSB0aGlzLnBlcnNpc3Q7Ci0JCXRoaXMucGVyc2lzdCA9IG5ld1BlcnNpc3Q7Ci0JCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5zZXRDYXNjYWRlUGVyc2lzdChuZXdQZXJzaXN0KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLlBFUlNJU1RfUFJPUEVSVFksIG9sZFBlcnNpc3QsIG5ld1BlcnNpc3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWVyZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm1lcmdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lcmdlKGJvb2xlYW4gbmV3TWVyZ2UpIHsKLQkJYm9vbGVhbiBvbGRNZXJnZSA9IHRoaXMubWVyZ2U7Ci0JCXRoaXMubWVyZ2UgPSBuZXdNZXJnZTsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLnNldENhc2NhZGVNZXJnZShuZXdNZXJnZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ2FzY2FkZS5NRVJHRV9QUk9QRVJUWSwgb2xkTWVyZ2UsIG5ld01lcmdlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlbW92ZShib29sZWFuIG5ld1JlbW92ZSkgewotCQlib29sZWFuIG9sZFJlbW92ZSA9IHRoaXMucmVtb3ZlOwotCQl0aGlzLnJlbW92ZSA9IG5ld1JlbW92ZTsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLnNldENhc2NhZGVSZW1vdmUobmV3UmVtb3ZlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLlJFTU9WRV9QUk9QRVJUWSwgb2xkUmVtb3ZlLCBuZXdSZW1vdmUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMucmVmcmVzaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoKGJvb2xlYW4gbmV3UmVmcmVzaCkgewotCQlib29sZWFuIG9sZFJlZnJlc2ggPSB0aGlzLnJlZnJlc2g7Ci0JCXRoaXMucmVmcmVzaCA9IG5ld1JlZnJlc2g7Ci0JCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5zZXRDYXNjYWRlUmVmcmVzaChuZXdSZWZyZXNoKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLlJFRlJFU0hfUFJPUEVSVFksIG9sZFJlZnJlc2gsIG5ld1JlZnJlc2gpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLmdldENhc2NhZGVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gcmVsYXRpb25zaGlwTWFwcGluZykgewotCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcgPSByZWxhdGlvbnNoaXBNYXBwaW5nOwotCQl0aGlzLmFsbCA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlQWxsKCk7Ci0JCXRoaXMucGVyc2lzdCA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUGVyc2lzdCgpOwotCQl0aGlzLm1lcmdlID0gcmVsYXRpb25zaGlwTWFwcGluZy5pc0Nhc2NhZGVNZXJnZSgpOwotCQl0aGlzLnJlbW92ZSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUmVtb3ZlKCk7Ci0JCXRoaXMucmVmcmVzaCA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUmVmcmVzaCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gcmVsYXRpb25zaGlwTWFwcGluZykgewotCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcgPSByZWxhdGlvbnNoaXBNYXBwaW5nOwotCQl0aGlzLnNldEFsbChyZWxhdGlvbnNoaXBNYXBwaW5nLmlzQ2FzY2FkZUFsbCgpKTsKLQkJdGhpcy5zZXRQZXJzaXN0KHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJdGhpcy5zZXRNZXJnZShyZWxhdGlvbnNoaXBNYXBwaW5nLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQl0aGlzLnNldFJlbW92ZShyZWxhdGlvbnNoaXBNYXBwaW5nLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJdGhpcy5zZXRSZWZyZXNoKHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjg1NjczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGFibGVQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbWJlZGRhYmxlUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YUVtYmVkZGFibGVQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSmF2YUVtYmVkZGFibGVQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVtYmVkZGFibGUgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFFbWJlZGRhYmxlKHBhcmVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzBhY2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbWJlZGRlZElkTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFFbWJlZGRlZElkTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKYXZhRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YUVtYmVkZGVkSWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRlZmF1bHRBcHBsaWVzKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIE1hcHBpbmdUb29scy5nZXRFbWJlZGRhYmxlRm9yKHBlcnNpc3RlbnRBdHRyaWJ1dGUpICE9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZDZmMTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFbWJlZGRlZE1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbWJlZGRlZE1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFFbWJlZGRlZE1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFFbWJlZGRlZE1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZGVmYXVsdEFwcGxpZXMoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmdldEVtYmVkZGFibGVGb3IocGVyc2lzdGVudEF0dHJpYnV0ZSkgIT0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbnRpdHlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW50aXR5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExNGEwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbnRpdHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFFbnRpdHlQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbnRpdHlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhRW50aXR5UHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFFbnRpdHlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEphdmFFbnRpdHkgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFFbnRpdHkocGFyZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFJZE1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmRiNzk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFJZE1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUlkTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFJZE1hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKYXZhSWRNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhSWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjgzNzBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhTWFueVRvTWFueU1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSmF2YU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhTWFueVRvTWFueU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTdhOWMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hbnlUb09uZU1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YU1hbnlUb09uZU1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhTWFueVRvT25lTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFNYW55VG9PbmVNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YU1hbnlUb09uZU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjMzMTdjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFNYXBwZWRTdXBlcmNsYXNzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEphdmFNYXBwZWRTdXBlcmNsYXNzIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhTWFwcGVkU3VwZXJjbGFzcyhwYXJlbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDIwOWI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCi0vKioKLSAqIFRoaXMgbWFwcGluZyBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIEphdmFOdWxsQXR0cmlidXRlTWFwcGluZy4KLSAqIEEgSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nIHNob3VsZCBiZSB1c2VkIHdoZW4gbm8gIm1hcHBpbmciIGFubm90YXRpb24KLSAqIGV4aXN0cyBvbiBhIEphdmEgYXR0cmlidXRlICphbmQqIG5vIGRlZmF1bHQgbWFwcGluZyBhcHBsaWVzLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFOdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFOdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFOdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFOdWxsQXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU51bGxUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTnVsbFR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDY3ZTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTnVsbFR5cGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEphdmFOdWxsVHlwZU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZwotewotCXB1YmxpYyBKYXZhTnVsbFR5cGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vQWRkaW5nIHRoaXMgbWVzc2FnZSBoZXJlIGJlY2F1c2UgdGhlIGxpa2VseSBzb2x1dGlvbiBpcyB0byBhZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgamF2YSBmaWxlLgotCQkvL1RoaXMgbWVzc2FnZSB1c2VkIHRvIGJlIGZvdW5kIG9uIHRoZSA8Y2xhc3M+IHRhZyBpbiB0aGUgcGVyc2lzdGVuY2UueG1sLiAgVGhlIG90aGVyIHBvc3NpYmxlCi0JCS8vd2F5IHRvIGZpeCB0aGUgZXJyb3IgaXMgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIHBlcnNpc3RuY2UueG1sLiAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkCi0JCS8vd2l0aCB0aGUgU3luY2hyb25pemUgQ2xhc3NlcyBhY3Rpb24uICBXZSBjb3VsZCBhbHNvIGFkZCBhIHF1aWNrIGZpeCBmb3IgdGhpcyBlcnJvci4KLQkJbWVzc2FnZXMuYWRkKERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0lOVkFMSURfQ0xBU1MsCi0JCQluZXcgU3RyaW5nW10geyB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpIH0sCi0JCQl0aGlzLAotCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTnVsbFR5cGVNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU51bGxUeXBlTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzYzMTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTnVsbFR5cGVNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgbWFwcGluZyBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIEphdmFOdWxsQXR0cmlidXRlTWFwcGluZy4KLSAqIEEgSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nIHNob3VsZCBiZSB1c2VkIHdoZW4gbm8gIm1hcHBpbmciIGFubm90YXRpb24KLSAqIGV4aXN0cyBvbiBhIEphdmEgdHlwZS4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhTnVsbFR5cGVNYXBwaW5nUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyCi17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhTnVsbFR5cGVNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YU51bGxUeXBlTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKYXZhTnVsbFR5cGVNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhTnVsbFR5cGVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWI5MWY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YU9uZVRvTWFueU1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YU9uZVRvTWFueU1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhT25lVG9NYW55TWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFPbmVUb01hbnlNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YU9uZVRvTWFueU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5YjllZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFPbmVUb09uZU1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSmF2YU9uZVRvT25lTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhT25lVG9PbmVNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiNWFhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFUcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YVRyYW5zaWVudE1hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKYXZhVHJhbnNpZW50TWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhVHJhbnNpZW50TWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVZlcnNpb25NYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVZlcnNpb25NYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3ZWRiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YVZlcnNpb25NYXBwaW5nUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFWZXJzaW9uTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFWZXJzaW9uTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFWZXJzaW9uTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFWZXJzaW9uTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1ZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTg5MWUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudHMgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXByaXZhdGUgZmluYWwgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uIGNvbHVtbjsKLQkKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkKLQlwdWJsaWMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSwgQ29sdW1uIGNvbHVtbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmNvbHVtbiA9IG5ldyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4odGhpcywgY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbnVsbCwgbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSgpLnNldE5hbWUobmFtZSk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGdldE5vbk51bGxDb2x1bW4oKSB7Ci0JCXJldHVybiBnZXRDb2x1bW4oKTsKLQl9Ci0JCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGFkZENvbHVtbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKCkgewotCQlyZXR1cm4gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgZ2V0UGFyZW50KCkuYWRkQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCi0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1ZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwZThlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1ZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotcHVibGljIGNsYXNzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbiBleHRlbmRzIE51bGxCYXNlQ29sdW1uIGltcGxlbWVudHMgQ29sdW1uQW5ub3RhdGlvbiwgQW5ub3RhdGlvbgotewkKLQlwcml2YXRlIENvbHVtbiBjb2x1bW47Ci0JCi0JcHVibGljIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gcGFyZW50LCBDb2x1bW4gY29sdW1uKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29sdW1uID0gY29sdW1uOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sdW1uQW5ub3RhdGlvbiBjcmVhdGVDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmFkZENvbHVtbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMuY29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlpZiAodGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJaWYgKHRoaXMuY29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKSB7Ci0JCWlmICh0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBCb29sZWFuIGdldE51bGxhYmxlKCkgewotCQlpZiAodGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgewotCQlpZiAodGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpIHsKLQkJaWYgKHRoaXMuY29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbGVuZ3RoKSB7Ci0JCWlmIChsZW5ndGggIT0gbnVsbCkgewotCQkJY3JlYXRlQ29sdW1uUmVzb3VyY2UoKS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRTY2FsZSgpIHsKLQkJaWYgKHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNjYWxlKEludGVnZXIgc2NhbGUpIHsKLQkJaWYgKHNjYWxlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0U2NhbGUoc2NhbGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFByZWNpc2lvbigpIHsKLQkJaWYgKHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJlY2lzaW9uKEludGVnZXIgcHJlY2lzaW9uKSB7Ci0JCWlmIChwcmVjaXNpb24gIT0gbnVsbCkgewotCQkJY3JlYXRlQ29sdW1uUmVzb3VyY2UoKS5zZXRQcmVjaXNpb24ocHJlY2lzaW9uKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjYWxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldExlbmd0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcmVjaXNpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzExNTNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Ob25Pd25pbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8VCBleHRlbmRzIFhtbEF0dHJpYnV0ZU1hcHBpbmc+IGV4dGVuZHMgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZwotewotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQkKLQlwcm90ZWN0ZWQgVCBhdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9CQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG9sZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gdGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQkJdGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG5ld0phdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9ybUF0dHJpYnV0ZU1hcHBpbmcuSkFWQV9QRVJTSVNURU5UX0FUVFJJQlVURV9QUk9QRVJUWSwgb2xkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG5ld0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMuYXR0cmlidXRlTWFwcGluZy5zZXROYW1lKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9ybUF0dHJpYnV0ZU1hcHBpbmcuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5uYW1lQ2hhbmdlZChvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPcm1BdHRyaWJ1dGVNYXBwaW5nLk5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkubmFtZUNoYW5nZWQob2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybUF0dHJpYnV0ZU1hcHBpbmcoT3JtQXR0cmlidXRlTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXNldE5hbWUob2xkTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tWG1sQ29sdW1uTWFwcGluZyhPcm1Db2x1bW5NYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKChPcm1BdHRyaWJ1dGVNYXBwaW5nKSBvbGRNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVhtbE5vbk93bmluZ01hcHBpbmcoTm9uT3duaW5nTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZygoT3JtQXR0cmlidXRlTWFwcGluZykgb2xkTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1CYXNpY01hcHBpbmcoT3JtQmFzaWNNYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJaW5pdGlhbGl6ZUZyb21YbWxDb2x1bW5NYXBwaW5nKG9sZE1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tT3JtSWRNYXBwaW5nKE9ybUlkTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tWG1sQ29sdW1uTWFwcGluZyhvbGRNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybVRyYW5zaWVudE1hcHBpbmcoT3JtVHJhbnNpZW50TWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyhvbGRNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybUJhc2VFbWJlZGRlZE1hcHBpbmcoT3JtQmFzZUVtYmVkZGVkTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyhvbGRNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybUVtYmVkZGVkTWFwcGluZyhPcm1FbWJlZGRlZE1hcHBpbmcgb2xkTWFwcGluZykgewotCQlpbml0aWFsaXplRnJvbU9ybUJhc2VFbWJlZGRlZE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1FbWJlZGRlZElkTWFwcGluZyhPcm1FbWJlZGRlZElkTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tT3JtQmFzZUVtYmVkZGVkTWFwcGluZyhvbGRNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybVZlcnNpb25NYXBwaW5nKE9ybVZlcnNpb25NYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJaW5pdGlhbGl6ZUZyb21YbWxDb2x1bW5NYXBwaW5nKG9sZE1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tWG1sUmVsYXRpb25zaGlwTWFwcGluZyhPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKG9sZE1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tWG1sTXVsaXRSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tWG1sUmVsYXRpb25zaGlwTWFwcGluZyhvbGRNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tWG1sUmVsYXRpb25zaGlwTWFwcGluZyhvbGRNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybU9uZVRvTWFueU1hcHBpbmcoT3JtT25lVG9NYW55TWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tWG1sTm9uT3duaW5nTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJaW5pdGlhbGl6ZUZyb21YbWxNdWxpdFJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1NYW55VG9PbmVNYXBwaW5nKE9ybU1hbnlUb09uZU1hcHBpbmcgb2xkTWFwcGluZykgewotCQlpbml0aWFsaXplRnJvbVhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1PbmVUb09uZU1hcHBpbmcoT3JtT25lVG9PbmVNYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJaW5pdGlhbGl6ZUZyb21YbWxOb25Pd25pbmdNYXBwaW5nKG9sZE1hcHBpbmcpOwotCQlpbml0aWFsaXplRnJvbVhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1NYW55VG9NYW55TWFwcGluZyhPcm1NYW55VG9NYW55TWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tWG1sTm9uT3duaW5nTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJaW5pdGlhbGl6ZUZyb21YbWxNdWxpdFJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9ybVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSWRNYXBwaW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIFQgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFQgYXR0cmlidXRlTWFwcGluZykgewotCQl0aGlzLmF0dHJpYnV0ZU1hcHBpbmcgPSBhdHRyaWJ1dGVNYXBwaW5nOwotCQl0aGlzLm5hbWUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKTsKLQkJdGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoVCBhdHRyaWJ1dGVNYXBwaW5nKSB7Ci0JCXRoaXMuYXR0cmlidXRlTWFwcGluZyA9IGF0dHJpYnV0ZU1hcHBpbmc7Ci0JCXRoaXMuc2V0TmFtZV8oYXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCkpOwotCQl0aGlzLnNldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwgJiYgZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW50aXR5T3duZWQoKSB7Ci0JCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldEtleSgpID09IE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmcuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOwotCX0JCi0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSA/IHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRBdHRyaWJ1dGVzVGV4dFJhbmdlKCkgOiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmcuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQlhZGRBdHRyaWJ1dGVNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCWFkZEludmFsaWRNYXBwaW5nTWVzc2FnZShtZXNzYWdlcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWFkZFVuc3BlY2lmaWVkQXR0cmlidXRlTWVzc2FnZShtZXNzYWdlcyk7Ci0JCWFkZFVucmVzb2x2ZWRBdHRyaWJ1dGVNZXNzYWdlKG1lc3NhZ2VzKTsKLQkJYWRkTW9kaWZpZXJNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFVuc3BlY2lmaWVkQXR0cmlidXRlTWVzc2FnZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXROYW1lKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9VTlNQRUNJRklFRF9OQU1FLAotCQkJCQl0aGlzLCAKLQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpKQotCQkJKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRVbnJlc29sdmVkQXR0cmlidXRlTWVzc2FnZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldE5hbWUoKSkKLQkJCQkmJiBmaW5kSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSA9PSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9VTlJFU09MVkVEX05BTUUsCi0JCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpLCBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCl9LAotCQkJCQl0aGlzLCAKLQkJCQkJZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2RpZmllck1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmIChnZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0KLQkJaWYgKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5pc0ZvckZpZWxkKCkpIHsKLQkJCS8vVE9ETyB2YWxpZGF0aW9uIDogbmVlZCB0byBoYXZlIGEgdmFsaWRhdGlvbiBtZXNzYWdlIGZvciBmaW5hbCBtZXRob2RzIGFzIHdlbGwuCi0JCQkvL0Zyb20gdGhlIEpQQSBzcGVjIDogTm8gbWV0aG9kcyBvciBwZXJzaXN0ZW50IGluc3RhbmNlIHZhcmlhYmxlcyBvZiB0aGUgZW50aXR5IGNsYXNzIG1heSBiZSBmaW5hbC4KLQkJCWlmIChyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNGaW5hbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfRklFTEQsCi0JCQkJCQluZXcgU3RyaW5nW10ge2dldE5hbWUoKX0sCi0JCQkJCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksCi0JCQkJCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNQdWJsaWMoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX1BVQkxJQ19GSUVMRCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpfSwKLQkJCQkJCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgCi0JCQkJCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvL1RPRE8gdmFsaWRhdGlvbiBtZXNzYWdlIC0gaSB0aGluayBtb3JlIGluZm8gaXMgbmVlZGVkIGluIHRoaXMgbWVzc2FnZS4gIGluY2x1ZGUgdHlwZSBtYXBwaW5nIHR5cGU/Ci0JcHJvdGVjdGVkIHZvaWQgYWRkSW52YWxpZE1hcHBpbmdNZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICghIGdldFR5cGVNYXBwaW5nKCkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoZ2V0S2V5KCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX01BUFBJTkcsCi0JCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpfSwKLQkJCQkJdGhpcywgCi0JCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSkKLQkJCSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1CYXNlQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1CYXNlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTU2MTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQmFzZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtQmFzZUNvbHVtbjxUIGV4dGVuZHMgWG1sQWJzdHJhY3RDb2x1bW4+IGV4dGVuZHMgQWJzdHJhY3RPcm1OYW1lZENvbHVtbjxUPgotCWltcGxlbWVudHMgT3JtQmFzZUNvbHVtbgotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVGFibGU7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFibGU7Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRVbmlxdWU7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTnVsbGFibGU7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkSW5zZXJ0YWJsZTsKLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRVcGRhdGFibGU7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1CYXNlQ29sdW1uKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3JtQmFzZUNvbHVtbi5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oQmFzZUNvbHVtbiBvbGRDb2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQ29sdW1uKTsKLQkJc2V0U3BlY2lmaWVkVGFibGUob2xkQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlzZXRTcGVjaWZpZWRVbmlxdWUob2xkQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJc2V0U3BlY2lmaWVkTnVsbGFibGUob2xkQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlzZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG9sZENvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlzZXRTcGVjaWZpZWRVcGRhdGFibGUob2xkQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUJhc2VDb2x1bW4uT3duZXIgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoT3JtQmFzZUNvbHVtbi5Pd25lcikgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0JCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCB2b2lkIGFkZEluc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzVG8oU2V0PEludGVnZXI+IGluc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzKSB7Ci0vLwkJc3VwZXIuYWRkSW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHNUbyhpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcyk7Ci0vLwkJaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMuYWRkKEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFCU1RSQUNUX0NPTFVNTl9fREVGQVVMVF9UQUJMRSk7Ci0vLwkJaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMuYWRkKEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFCU1RSQUNUX0NPTFVNTl9fVEFCTEUpOwotLy8JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRUYWJsZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFRhYmxlKCkgOiB0aGlzLmdldFNwZWNpZmllZFRhYmxlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVGFibGUoU3RyaW5nIG5ld1NwZWNpZmllZFRhYmxlKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRUYWJsZSA9IHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSBuZXdTcGVjaWZpZWRUYWJsZTsKLQkJaWYgKG9sZFNwZWNpZmllZFRhYmxlICE9IG5ld1NwZWNpZmllZFRhYmxlKSB7Ci0JCQlpZiAodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldENvbHVtblJlc291cmNlKCkuc2V0VGFibGUobmV3U3BlY2lmaWVkVGFibGUpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdTcGVjaWZpZWRUYWJsZSAhPSBudWxsKSB7Ci0JCQkJYWRkQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQlnZXRDb2x1bW5SZXNvdXJjZSgpLnNldFRhYmxlKG5ld1NwZWNpZmllZFRhYmxlKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRUYWJsZSwgbmV3U3BlY2lmaWVkVGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUYWJsZV8oU3RyaW5nIG5ld1NwZWNpZmllZFRhYmxlKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRUYWJsZSA9IHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSBuZXdTcGVjaWZpZWRUYWJsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVGFibGUsIG5ld1NwZWNpZmllZFRhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUYWJsZShTdHJpbmcgbmV3RGVmYXVsdFRhYmxlKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0VGFibGUgPSB0aGlzLmRlZmF1bHRUYWJsZTsKLQkJdGhpcy5kZWZhdWx0VGFibGUgPSBuZXdEZWZhdWx0VGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5ERUZBVUxUX1RBQkxFX1BST1BFUlRZLCBvbGREZWZhdWx0VGFibGUsIG5ld0RlZmF1bHRUYWJsZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkVW5pcXVlKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRVbmlxdWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkVW5pcXVlKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRVbmlxdWUoKSB7Ci0JCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRVbmlxdWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFVuaXF1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4gbmV3U3BlY2lmaWVkVW5pcXVlKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkVW5pcXVlID0gdGhpcy5zcGVjaWZpZWRVbmlxdWU7Ci0JCXRoaXMuc3BlY2lmaWVkVW5pcXVlID0gbmV3U3BlY2lmaWVkVW5pcXVlOwotCQlpZiAob2xkU3BlY2lmaWVkVW5pcXVlICE9IG5ld1NwZWNpZmllZFVuaXF1ZSkgewotCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLnNldFVuaXF1ZShuZXdTcGVjaWZpZWRVbmlxdWUpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdTcGVjaWZpZWRVbmlxdWUgIT0gbnVsbCkgewotCQkJCWFkZENvbHVtblJlc291cmNlKCk7Ci0JCQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRVbmlxdWUobmV3U3BlY2lmaWVkVW5pcXVlKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VOSVFVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVW5pcXVlLCBuZXdTcGVjaWZpZWRVbmlxdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRVbmlxdWVfKEJvb2xlYW4gbmV3U3BlY2lmaWVkVW5pcXVlKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkVW5pcXVlID0gdGhpcy5zcGVjaWZpZWRVbmlxdWU7Ci0JCXRoaXMuc3BlY2lmaWVkVW5pcXVlID0gbmV3U3BlY2lmaWVkVW5pcXVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VOSVFVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVW5pcXVlLCBuZXdTcGVjaWZpZWRVbmlxdWUpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZE51bGxhYmxlKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHROdWxsYWJsZSgpIDogdGhpcy5nZXRTcGVjaWZpZWROdWxsYWJsZSgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0TnVsbGFibGUoKSB7Ci0JCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEU7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE51bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROdWxsYWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWROdWxsYWJsZSkgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZE51bGxhYmxlID0gdGhpcy5zcGVjaWZpZWROdWxsYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWROdWxsYWJsZSA9IG5ld1NwZWNpZmllZE51bGxhYmxlOwotCQlpZiAob2xkU3BlY2lmaWVkTnVsbGFibGUgIT0gbmV3U3BlY2lmaWVkTnVsbGFibGUpIHsKLQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXROdWxsYWJsZShuZXdTcGVjaWZpZWROdWxsYWJsZSk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVDb2x1bW5SZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZE51bGxhYmxlICE9IG51bGwpIHsKLQkJCQlhZGRDb2x1bW5SZXNvdXJjZSgpOwotCQkJCWdldENvbHVtblJlc291cmNlKCkuc2V0TnVsbGFibGUobmV3U3BlY2lmaWVkTnVsbGFibGUpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfTlVMTEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE51bGxhYmxlLCBuZXdTcGVjaWZpZWROdWxsYWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTnVsbGFibGVfKEJvb2xlYW4gbmV3U3BlY2lmaWVkTnVsbGFibGUpIHsKLQkJQm9vbGVhbiBvbGRTcGVjaWZpZWROdWxsYWJsZSA9IHRoaXMuc3BlY2lmaWVkTnVsbGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkTnVsbGFibGUgPSBuZXdTcGVjaWZpZWROdWxsYWJsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLlNQRUNJRklFRF9OVUxMQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTnVsbGFibGUsIG5ld1NwZWNpZmllZE51bGxhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gQmFzZUNvbHVtbi5ERUZBVUxUX0lOU0VSVEFCTEU7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZEluc2VydGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEluc2VydGFibGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRJbnNlcnRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkSW5zZXJ0YWJsZSA9IHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlID0gbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZTsKLQkJaWYgKG9sZFNwZWNpZmllZEluc2VydGFibGUgIT0gbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSkgewotCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLnNldEluc2VydGFibGUobmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVDb2x1bW5SZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZEluc2VydGFibGUgIT0gbnVsbCkgewotCQkJCWFkZENvbHVtblJlc291cmNlKCk7Ci0JCQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRJbnNlcnRhYmxlKG5ld1NwZWNpZmllZEluc2VydGFibGUpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfSU5TRVJUQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkSW5zZXJ0YWJsZSwgbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEluc2VydGFibGVfKEJvb2xlYW4gbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSkgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZEluc2VydGFibGUgPSB0aGlzLnNwZWNpZmllZEluc2VydGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZSA9IG5ld1NwZWNpZmllZEluc2VydGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfSU5TRVJUQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkSW5zZXJ0YWJsZSwgbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0VXBkYXRhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRVcGRhdGFibGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfVVBEQVRBQkxFOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFVwZGF0YWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4gbmV3U3BlY2lmaWVkVXBkYXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkVXBkYXRhYmxlID0gdGhpcy5zcGVjaWZpZWRVcGRhdGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlID0gbmV3U3BlY2lmaWVkVXBkYXRhYmxlOwotCQlpZiAob2xkU3BlY2lmaWVkVXBkYXRhYmxlICE9IG5ld1NwZWNpZmllZFVwZGF0YWJsZSkgewotCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLnNldFVwZGF0YWJsZShuZXdTcGVjaWZpZWRVcGRhdGFibGUpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdTcGVjaWZpZWRVcGRhdGFibGUgIT0gbnVsbCkgewotCQkJCWFkZENvbHVtblJlc291cmNlKCk7Ci0JCQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRVcGRhdGFibGUobmV3U3BlY2lmaWVkVXBkYXRhYmxlKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VQREFUQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVXBkYXRhYmxlLCBuZXdTcGVjaWZpZWRVcGRhdGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRVcGRhdGFibGVfKEJvb2xlYW4gbmV3U3BlY2lmaWVkVXBkYXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkVXBkYXRhYmxlID0gdGhpcy5zcGVjaWZpZWRVcGRhdGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlID0gbmV3U3BlY2lmaWVkVXBkYXRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VQREFUQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVXBkYXRhYmxlLCBuZXdTcGVjaWZpZWRVcGRhdGFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgdGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZSgpOwotCX0KLQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZSgpIHsKLQkJaWYgKGdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldENvbHVtblJlc291cmNlKCkuZ2V0VGFibGVUZXh0UmFuZ2UoKTsKLQkJCWlmICh0ZXh0UmFuZ2UgIT0gbnVsbCkgewotCQkJCXJldHVybiB0ZXh0UmFuZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOyAKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShUIGNvbHVtbikgewotCQlzdXBlci5pbml0aWFsaXplKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0aGlzLnNwZWNpZmllZFRhYmxlKGNvbHVtbik7Ci0JCXRoaXMuZGVmYXVsdFRhYmxlID0gdGhpcy5kZWZhdWx0VGFibGUoKTsKLQkJLy9UT0RPIGRlZmF1bHQgZnJvbSBqYXZhIGZvciBhbGwgb2YgdGhlc2Ugc2V0dGluZ3MKLQkJdGhpcy5zcGVjaWZpZWROdWxsYWJsZSA9IHRoaXMuc3BlY2lmaWVkTnVsbGFibGUoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgPSB0aGlzLnNwZWNpZmllZFVwZGF0YWJsZShjb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFVuaXF1ZSA9IHRoaXMuc3BlY2lmaWVkVW5pcXVlKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZSA9IHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZShjb2x1bW4pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoVCBjb2x1bW4pIHsKLQkJc3VwZXIudXBkYXRlKGNvbHVtbik7Ci0JCXNldFNwZWNpZmllZFRhYmxlXyh0aGlzLnNwZWNpZmllZFRhYmxlKGNvbHVtbikpOwotCQlzZXREZWZhdWx0VGFibGUodGhpcy5kZWZhdWx0VGFibGUoKSk7Ci0JCXNldFNwZWNpZmllZE51bGxhYmxlXyh0aGlzLnNwZWNpZmllZE51bGxhYmxlKGNvbHVtbikpOwotCQlzZXRTcGVjaWZpZWRVcGRhdGFibGVfKHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlKGNvbHVtbikpOwotCQlzZXRTcGVjaWZpZWRVbmlxdWVfKHRoaXMuc3BlY2lmaWVkVW5pcXVlKGNvbHVtbikpOwotCQlzZXRTcGVjaWZpZWRJbnNlcnRhYmxlXyh0aGlzLnNwZWNpZmllZEluc2VydGFibGUoY29sdW1uKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYWJsZShUIGNvbHVtbikgewotCQlyZXR1cm4gY29sdW1uID09IG51bGwgPyBudWxsIDogY29sdW1uLmdldFRhYmxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTnVsbGFibGUoVCBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5nZXROdWxsYWJsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRVcGRhdGFibGUoVCBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5nZXRVcGRhdGFibGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkVW5pcXVlKFQgY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBjb2x1bW4uZ2V0VW5pcXVlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEluc2VydGFibGUoVCBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5nZXRJbnNlcnRhYmxlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXREZWZhdWx0VGFibGVOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOWMxYmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNlRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkJhc2VYbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZzxUIGV4dGVuZHMgQmFzZVhtbEVtYmVkZGVkPiBleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxUPiBpbXBsZW1lbnRzIE9ybUJhc2VFbWJlZGRlZE1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzOwotCi0JcHJpdmF0ZSBFbWJlZGRhYmxlIGVtYmVkZGFibGU7Ci0JCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KCk7Ci0JCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1CYXNlRW1iZWRkZWRNYXBwaW5nKE9ybUJhc2VFbWJlZGRlZE1hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbU9ybUJhc2VFbWJlZGRlZE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob2xkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSkpIHsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgbmV3QXR0cmlidXRlT3ZlcnJpZGUgPSBhZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShpbmRleCsrKTsKLQkJCW5ld0F0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCW5ld0F0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmluaXRpYWxpemVGcm9tKGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpKTsKLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpICsgdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJYWRkSXRlbVRvTGlzdChhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLCBCYXNlRW1iZWRkZWRNYXBwaW5nLlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLCBCYXNlRW1iZWRkZWRNYXBwaW5nLlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyk7Ci0JfQotCi0JcHVibGljIGludCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuc2l6ZSgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBhZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShpbnQgaW5kZXgpIHsKLQkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgeG1sQXR0cmlidXRlT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChpbmRleCwgeG1sQXR0cmlidXRlT3ZlcnJpZGUpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoQmFzZUVtYmVkZGVkTWFwcGluZy5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUpOwotCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoaW50IGluZGV4LCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIEJhc2VFbWJlZGRlZE1hcHBpbmcuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZV8oT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcywgQmFzZUVtYmVkZGVkTWFwcGluZy5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoQmFzZUVtYmVkZGVkTWFwcGluZy5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCi0JcHVibGljIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChPcm1BdHRyaWJ1dGVPdmVycmlkZSkgZ2V0T3ZlcnJpZGVOYW1lZChuYW1lLCBhdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJhc2VPdmVycmlkZSBnZXRPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lLCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVzKSB7Ci0JCWZvciAoQmFzZU92ZXJyaWRlIG92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG92ZXJyaWRlcykpIHsKLQkJCVN0cmluZyBvdmVycmlkZU5hbWUgPSBvdmVycmlkZS5nZXROYW1lKCk7Ci0JCQlpZiAob3ZlcnJpZGVOYW1lID09IG51bGwgJiYgbmFtZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG92ZXJyaWRlOwotCQkJfQotCQkJaWYgKG92ZXJyaWRlTmFtZSAhPSBudWxsICYmIG92ZXJyaWRlTmFtZS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gb3ZlcnJpZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKioqKiogQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgaW1wbGVtZW5hdGlvbiAqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZU92ZXJyaWRlIG92ZXJyaWRlKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuY29udGFpbnMob3ZlcnJpZGUpOwotCX0KLQotCXB1YmxpYyBCYXNlT3ZlcnJpZGUgc2V0VmlydHVhbChib29sZWFuIHZpcnR1YWwsIEJhc2VPdmVycmlkZSBvdmVycmlkZSkgewotCQkvLyBBZGQgYSBuZXcgYXR0cmlidXRlIG92ZXJyaWRlCi0JCWlmICh2aXJ0dWFsKSB7Ci0JCQlyZXR1cm4gc2V0VmlydHVhbCgoT3JtQXR0cmlidXRlT3ZlcnJpZGUpIG92ZXJyaWRlKTsKLQkJfQotCQlyZXR1cm4gc2V0U3BlY2lmaWVkKChPcm1BdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGUgc2V0VmlydHVhbChPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlpbnQgaW5kZXggPSB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5pbmRleE9mKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMucmVtb3ZlKGluZGV4KTsKLQkJU3RyaW5nIGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKTsKLQkJLy9hZGQgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlIHNvIHRoYXQgSSBjYW4gY29udHJvbCB0aGUgb3JkZXIgdGhhdCBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlzIHNlbnQuCi0JCS8vb3RoZXJ3aXNlIHdoZW4gd2UgcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGZyb20gamF2YSB3ZSB3aWxsIGdldCBhbiB1cGRhdGUgYW5kIGFkZCB0aGUgYXR0cmlidXRlIG92ZXJyaWRlCi0JCS8vZHVyaW5nIHRoZSB1ZHBhdGUuICBUaGlzIGNhdXNlcyB0aGUgVUkgdG8gYmUgZmxha3ksIHNpbmNlIGNoYW5nZSBub3RpZmljYXRpb24gbWlnaHQgbm90IG9jY3VyIGluIHRoZSBjb3JyZWN0IG9yZGVyCi0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG51bGw7Ci0JCWlmIChhdHRyaWJ1dGVPdmVycmlkZU5hbWUgIT0gbnVsbCkgewotCQkJZm9yIChQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkpKSB7Ci0JCQkJaWYgKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpLmVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZU5hbWUpKSB7Ci0JCQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOwotCQkJCQlpZiAoZ2V0SmF2YUVtYmVkZGVkTWFwcGluZygpICE9IG51bGwpIHsKLQkJCQkJCWphdmFBdHRyaWJ1dGVPdmVycmlkZSA9IGdldEphdmFFbWJlZGRlZE1hcHBpbmcoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSk7Ci0JCQkJCX0KLQkJCQkJLy9zdG9yZSB0aGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHNvIHdlIGNhbiBmaXJlIGNoYW5nZSBub3RpZmljYXRpb24gbGF0ZXIKLQkJCQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUocGVyc2lzdGVudEF0dHJpYnV0ZSwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmFkZCh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoQmFzZUVtYmVkZGVkTWFwcGluZy5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkKLQkJaWYgKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSAhPSBudWxsKSB7Ci0JCQlmaXJlSXRlbUFkZGVkKEJhc2VFbWJlZGRlZE1hcHBpbmcuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgLSAxLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpOwotCQl9Ci0JCXJldHVybiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBzZXRTcGVjaWZpZWQoT3JtQXR0cmlidXRlT3ZlcnJpZGUgb2xkQXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJaW50IGluZGV4ID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSB4bWxBdHRyaWJ1dGVPdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBuZXdBdHRyaWJ1dGVPdmVycmlkZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUF0dHJpYnV0ZU92ZXJyaWRlKHRoaXMsIHRoaXMsIHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGluZGV4LCBuZXdBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQotCQlnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCi0JCWludCBkZWZhdWx0SW5kZXggPSB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaW5kZXhPZihvbGRBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5yZW1vdmUoZGVmYXVsdEluZGV4KTsKLQotCQluZXdBdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKG9sZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW5ld0F0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUob2xkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKEJhc2VFbWJlZGRlZE1hcHBpbmcuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIGRlZmF1bHRJbmRleCwgb2xkQXR0cmlidXRlT3ZlcnJpZGUpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoQmFzZUVtYmVkZGVkTWFwcGluZy5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBpbmRleCwgbmV3QXR0cmlidXRlT3ZlcnJpZGUpOwkJCi0KLQkJcmV0dXJuIG5ld0F0dHJpYnV0ZU92ZXJyaWRlOwotCX0KLQotCXB1YmxpYyBDb2x1bW5NYXBwaW5nIGdldENvbHVtbk1hcHBpbmcoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIE1hcHBpbmdUb29scy5nZXRDb2x1bW5NYXBwaW5nKGF0dHJpYnV0ZU5hbWUsIGdldEVtYmVkZGFibGUoKSk7Ci0JfQotCi0JcHVibGljIEVtYmVkZGFibGUgZ2V0RW1iZWRkYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW1iZWRkYWJsZTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZz4odGhpcy5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB7Ci0JCWlmICh0aGlzLmdldEVtYmVkZGFibGUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZSwgUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5nZXRFbWJlZGRhYmxlKCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgewotCQkJCXJldHVybiBvLmlzT3ZlcnJpZGFibGVBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RKYXZhQmFzZUVtYmVkZGVkTWFwcGluZzw/PiBnZXRKYXZhRW1iZWRkZWRNYXBwaW5nKCkgewotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWlmIChqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSAhPSBudWxsICYmIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBnZXRLZXkoKSkgewotCQkJcmV0dXJuIChBYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nPD8+KSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVCBlbWJlZGRlZCkgewotCQlzdXBlci5pbml0aWFsaXplKGVtYmVkZGVkKTsKLQkJdGhpcy5lbWJlZGRhYmxlID0gZW1iZWRkYWJsZUZvcihmaW5kSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyhlbWJlZGRlZCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyhUIGVtYmVkZGVkKSB7Ci0JCWZvciAoWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiBlbWJlZGRlZC5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoYXR0cmlidXRlT3ZlcnJpZGUpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJaWYgKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJLy9zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgYXJlIHVzZWQgaWYgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgaXMgdmlydHVhbAotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpKSkgewotCQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCWlmIChhdHRyaWJ1dGVPdmVycmlkZSA9PSBudWxsKSB7Ci0JCQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGphdmFBdHRyaWJ1dGVPdmVycmlkZSA9IG51bGw7Ci0JCQkJaWYgKGdldEphdmFFbWJlZGRlZE1hcHBpbmcoKSAhPSBudWxsKSB7Ci0JCQkJCWphdmFBdHRyaWJ1dGVPdmVycmlkZSA9IGdldEphdmFFbWJlZGRlZE1hcHBpbmcoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmFkZChidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShwZXJzaXN0ZW50QXR0cmlidXRlLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBqYXZhQXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJcmV0dXJuIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoYnVpbGRWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGUocGVyc2lzdGVudEF0dHJpYnV0ZSwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlKSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxBdHRyaWJ1dGVPdmVycmlkZSBidWlsZFZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZShQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBqYXZhQXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJWG1sQ29sdW1uIHhtbENvbHVtbjsKLQkJaWYgKGphdmFBdHRyaWJ1dGVPdmVycmlkZSA9PSBudWxsKSB7Ci0JCQlDb2x1bW5NYXBwaW5nIGNvbHVtbk1hcHBpbmcgPSAoQ29sdW1uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQl4bWxDb2x1bW4gPSBuZXcgVmlydHVhbFhtbENvbHVtbihnZXRUeXBlTWFwcGluZygpLCBjb2x1bW5NYXBwaW5nLmdldENvbHVtbigpLCBmYWxzZSk7CQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQl4bWxDb2x1bW4gPSBuZXcgVmlydHVhbFhtbENvbHVtbihnZXRUeXBlTWFwcGluZygpLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCksIHRydWUpOwotCQl9Ci0JCXJldHVybiBuZXcgVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpLCB4bWxDb2x1bW4pOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgdGhpcywgYXR0cmlidXRlT3ZlcnJpZGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoVCBlbWJlZGRlZCkgewotCQlzdXBlci51cGRhdGUoZW1iZWRkZWQpOwotCQl0aGlzLmVtYmVkZGFibGUgPSBlbWJlZGRhYmxlRm9yKGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJdGhpcy51cGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoZW1iZWRkZWQpOwotCQl0aGlzLnVwZGF0ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKFQgZW1iZWRkZWQpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiByZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxBdHRyaWJ1dGVPdmVycmlkZT4oZW1iZWRkZWQuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCQlhdHRyaWJ1dGVPdmVycmlkZS51cGRhdGUocmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlXyhhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSwgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShyZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB7Ci0JCUl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQotCQlpZiAoIWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJLy9zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgYXJlIHVzZWQgaWYgdGhlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgaXMgdmlydHVhbAotCQkJZm9yIChQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3ZlcnJpZGFibGVBdHRyaWJ1dGVzKSkgewotCQkJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIG9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQkJaWYgKG9ybUF0dHJpYnV0ZU92ZXJyaWRlICE9IG51bGwgJiYgIW9ybUF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgamF2YUF0dHJpYnV0ZU92ZXJyaWRlID0gbnVsbDsKLQkJCQlpZiAoZ2V0SmF2YUVtYmVkZGVkTWFwcGluZygpICE9IG51bGwpIHsKLQkJCQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0SmF2YUVtYmVkZGVkTWFwcGluZygpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQlpZiAob3JtQXR0cmlidXRlT3ZlcnJpZGUgIT0gbnVsbCkgewotCQkJCQlpZiAodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCQkJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQkJCQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnVwZGF0ZShidWlsZFZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZShwZXJzaXN0ZW50QXR0cmlidXRlLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWFkZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShwZXJzaXN0ZW50QXR0cmlidXRlLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWRkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGphdmFBdHRyaWJ1dGVPdmVycmlkZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3IgKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKSkgewotCQkJcmVtb3ZlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCX0KLQkJCi0JfQotCQotCS8vKioqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgRW1iZWRkYWJsZSBlbWJlZGRhYmxlRm9yKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCWlmIChqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmdldEVtYmVkZGFibGVGb3IoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODc1MWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUdlbmVyYXRvcjxUIGV4dGVuZHMgWG1sR2VuZXJhdG9yPiBleHRlbmRzIEFic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUgCi0JaW1wbGVtZW50cyBPcm1HZW5lcmF0b3IKLXsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZEluaXRpYWxWYWx1ZTsKLQlwcm90ZWN0ZWQgSW50ZWdlciBkZWZhdWx0SW5pdGlhbFZhbHVlOwotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkQWxsb2NhdGlvblNpemU7Ci0JcHJvdGVjdGVkIEludGVnZXIgZGVmYXVsdEFsbG9jYXRpb25TaXplOwotCi0JcHJvdGVjdGVkIFQgZ2VuZXJhdG9yUmVzb3VyY2U7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1HZW5lcmF0b3IoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5pc1ZpcnR1YWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUpwYUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1KcGFDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldE5hbWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVfKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldEluaXRpYWxWYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkgOiB0aGlzLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShJbnRlZ2VyIG5ld1NwZWNpZmllZEluaXRpYWxWYWx1ZSkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZEluaXRpYWxWYWx1ZSA9IHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlOwotCQl0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZSA9IG5ld1NwZWNpZmllZEluaXRpYWxWYWx1ZTsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5zZXRJbml0aWFsVmFsdWUobmV3U3BlY2lmaWVkSW5pdGlhbFZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfSU5JVElBTF9WQUxVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkSW5pdGlhbFZhbHVlLCBuZXdTcGVjaWZpZWRJbml0aWFsVmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRJbml0aWFsVmFsdWVfKEludGVnZXIgbmV3U3BlY2lmaWVkSW5pdGlhbFZhbHVlKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkSW5pdGlhbFZhbHVlID0gdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlID0gbmV3U3BlY2lmaWVkSW5pdGlhbFZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JTklUSUFMX1ZBTFVFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRJbml0aWFsVmFsdWUsIG5ld1NwZWNpZmllZEluaXRpYWxWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRJbml0aWFsVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbml0aWFsVmFsdWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRJbml0aWFsVmFsdWUoSW50ZWdlciBuZXdEZWZhdWx0SW5pdGlhbFZhbHVlKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkSW5pdGlhbFZhbHVlID0gdGhpcy5kZWZhdWx0SW5pdGlhbFZhbHVlOwotCQl0aGlzLmRlZmF1bHRJbml0aWFsVmFsdWUgPSBuZXdEZWZhdWx0SW5pdGlhbFZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5JVElBTF9WQUxVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkSW5pdGlhbFZhbHVlLCBuZXdEZWZhdWx0SW5pdGlhbFZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEludGVnZXIgZ2V0QWxsb2NhdGlvblNpemUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0QWxsb2NhdGlvblNpemUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlciBuZXdTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZEFsbG9jYXRpb25TaXplID0gdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZTsKLQkJdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IG5ld1NwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldEFsbG9jYXRpb25TaXplKG5ld1NwZWNpZmllZEFsbG9jYXRpb25TaXplKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSwgbmV3U3BlY2lmaWVkQWxsb2NhdGlvblNpemUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZV8oSW50ZWdlciBuZXdTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZEFsbG9jYXRpb25TaXplID0gdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZTsKLQkJdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IG5ld1NwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFksIG9sZFNwZWNpZmllZEFsbG9jYXRpb25TaXplLCBuZXdTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWxsb2NhdGlvblNpemU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyIG5ld0RlZmF1bHRBbGxvY2F0aW9uU2l6ZSkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZEFsbG9jYXRpb25TaXplID0gdGhpcy5kZWZhdWx0QWxsb2NhdGlvblNpemU7Ci0JCXRoaXMuZGVmYXVsdEFsbG9jYXRpb25TaXplID0gbmV3RGVmYXVsdEFsbG9jYXRpb25TaXplOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSwgbmV3RGVmYXVsdEFsbG9jYXRpb25TaXplKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFQgZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJdGhpcy5nZW5lcmF0b3JSZXNvdXJjZSA9IGdlbmVyYXRvclJlc291cmNlOwotCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUoZ2VuZXJhdG9yUmVzb3VyY2UpOwotCQl0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZSA9IHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlKGdlbmVyYXRvclJlc291cmNlKTsKLQkJdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IHRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemUoZ2VuZXJhdG9yUmVzb3VyY2UpOwotCQkvL1RPRE8gZGVmYXVsdHMKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFQgZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJdGhpcy5nZW5lcmF0b3JSZXNvdXJjZSA9IGdlbmVyYXRvclJlc291cmNlOwotCQl0aGlzLnNldE5hbWVfKHRoaXMubmFtZShnZW5lcmF0b3JSZXNvdXJjZSkpOwotCQl0aGlzLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZV8odGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUoZ2VuZXJhdG9yUmVzb3VyY2UpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZV8odGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShnZW5lcmF0b3JSZXNvdXJjZSkpOwotCQkvL1RPRE8gZGVmYXVsdHMKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gb3ZlcnJpZGVzKEdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gdGhpcyBpc24ndCBpZGVhbCwgYnV0IGl0IHdpbGwgaGF2ZSB0byBkbyB1bnRpbCB3ZSBoYXZlIGZ1cnRoZXIgYWRvcHRlciBpbnB1dAotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCkuZXF1YWxzKGdlbmVyYXRvci5nZXROYW1lKCkpICYmIGdlbmVyYXRvciBpbnN0YW5jZW9mIEphdmFHZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIFQgZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvclJlc291cmNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUoWG1sR2VuZXJhdG9yIGdlbmVyYXRvclJlc291cmNlKSB7Ci0JCXJldHVybiBnZW5lcmF0b3JSZXNvdXJjZS5nZXROYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZEluaXRpYWxWYWx1ZShYbWxHZW5lcmF0b3IgZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGdlbmVyYXRvclJlc291cmNlLmdldEluaXRpYWxWYWx1ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShYbWxHZW5lcmF0b3IgZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdmFsaWRhdGlvblRleHRSYW5nZSA9IHRoaXMuZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiB2YWxpZGF0aW9uVGV4dFJhbmdlICE9IG51bGwgPyB2YWxpZGF0aW9uVGV4dFJhbmdlIDogZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSBuYW1lVGV4dFJhbmdlID0gdGhpcy5nZXRHZW5lcmF0b3JSZXNvdXJjZSgpLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQkJcmV0dXJuIG5hbWVUZXh0UmFuZ2UgIT0gbnVsbCA/IG5hbWVUZXh0UmFuZ2UgOiBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDFkODgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LkFic3RyYWN0SnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUgZXh0ZW5kcyBBYnN0cmFjdEpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgT3JtSnBhQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlKEpwYU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0JCi0JLyoqCi0JICogQWxsIHN1YmNsYXNzIGltcGxlbWVudGF0aW9ucyB7QGxpbmsgI2FkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4pfSAKLQkgKiBzaG91bGQgYmUgcHJlY2VkZWQgYnkgYSAic3VwZXIiIGNhbGwgdG8gdGhpcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4M2JhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTm9uT3duaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPFQgZXh0ZW5kcyBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybVJlbGF0aW9uc2hpcE1hcHBpbmc8VD4KLQlpbXBsZW1lbnRzIE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZwotewotCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeTsKLQotCXByb3RlY3RlZCBTdHJpbmcgb3JkZXJCeTsvL1RPRE8gY2hhbmdlIHRoaXMgdG8gZGVmYXVsdE9yZGVyQnkgYW5kIHNwZWNpZmllZE9yZGVyQnk/Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vT3JkZXJpbmc7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BrT3JkZXJpbmc7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1c3RvbU9yZGVyaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUpvaW5UYWJsZSBqb2luVGFibGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcEtleTsKLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpvaW5UYWJsZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUpvaW5UYWJsZSh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVhtbE11bGl0UmVsYXRpb25zaGlwTWFwcGluZyhPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVhtbE11bGl0UmVsYXRpb25zaGlwTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJZ2V0Sm9pblRhYmxlKCkuaW5pdGlhbGl6ZUZyb20ob2xkTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7Ci0JCXJldHVybiBnZXRNYXBwZWRCeSgpID09IG51bGw7Ci0JfQotCi0JcHVibGljIEZldGNoVHlwZSBnZXREZWZhdWx0RmV0Y2goKSB7Ci0JCXJldHVybiBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuREVGQVVMVF9GRVRDSF9UWVBFOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbmV3TWFwcGVkQnkpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQlnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0TWFwcGVkQnkobmV3TWFwcGVkQnkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkTWFwcGVkQnksIG5ld01hcHBlZEJ5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGVkQnlfKFN0cmluZyBuZXdNYXBwZWRCeSkgewotCQlTdHJpbmcgb2xkTWFwcGVkQnkgPSB0aGlzLm1hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5ID0gbmV3TWFwcGVkQnk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX1BST1BFUlRZLCBvbGRNYXBwZWRCeSwgbmV3TWFwcGVkQnkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpIHsKLQkJcmV0dXJuIHRoaXMub3JkZXJCeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5KFN0cmluZyBuZXdPcmRlckJ5KSB7Ci0JCVN0cmluZyBvbGRPcmRlckJ5ID0gdGhpcy5vcmRlckJ5OwotCQl0aGlzLm9yZGVyQnkgPSBuZXdPcmRlckJ5OwotCQlnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0T3JkZXJCeShuZXdPcmRlckJ5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPUkRFUl9CWV9QUk9QRVJUWSwgb2xkT3JkZXJCeSwgbmV3T3JkZXJCeSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE9yZGVyQnlfKFN0cmluZyBuZXdPcmRlckJ5KSB7Ci0JCVN0cmluZyBvbGRPcmRlckJ5ID0gdGhpcy5vcmRlckJ5OwotCQl0aGlzLm9yZGVyQnkgPSBuZXdPcmRlckJ5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9SREVSX0JZX1BST1BFUlRZLCBvbGRPcmRlckJ5LCBuZXdPcmRlckJ5KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vT3JkZXJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmlzTm9PcmRlcmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb09yZGVyaW5nKGJvb2xlYW4gbmV3Tm9PcmRlcmluZykgewotCQlib29sZWFuIG9sZE5vT3JkZXJpbmcgPSB0aGlzLmlzTm9PcmRlcmluZzsKLQkJdGhpcy5pc05vT3JkZXJpbmcgPSBuZXdOb09yZGVyaW5nOwotCQlpZiAobmV3Tm9PcmRlcmluZykgewotCQkJZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldE9yZGVyQnkobnVsbCk7Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOT19PUkRFUklOR19QUk9QRVJUWSwgb2xkTm9PcmRlcmluZywgbmV3Tm9PcmRlcmluZyk7CQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE5vT3JkZXJpbmdfKGJvb2xlYW4gbmV3Tm9PcmRlcmluZykgewotCQlib29sZWFuIG9sZE5vT3JkZXJpbmcgPSB0aGlzLmlzTm9PcmRlcmluZzsKLQkJdGhpcy5pc05vT3JkZXJpbmcgPSBuZXdOb09yZGVyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5PX09SREVSSU5HX1BST1BFUlRZLCBvbGROb09yZGVyaW5nLCBuZXdOb09yZGVyaW5nKTsJCQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQa09yZGVyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5pc1BrT3JkZXJpbmc7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFBrT3JkZXJpbmcoYm9vbGVhbiBuZXdQa09yZGVyaW5nKSB7Ci0JCWJvb2xlYW4gb2xkUGtPcmRlcmluZyA9IHRoaXMuaXNQa09yZGVyaW5nOwotCQl0aGlzLmlzUGtPcmRlcmluZyA9IG5ld1BrT3JkZXJpbmc7Ci0JCWlmIChuZXdQa09yZGVyaW5nKSB7Ci0JCQlnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0T3JkZXJCeSgiIik7Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQS19PUkRFUklOR19QUk9QRVJUWSwgb2xkUGtPcmRlcmluZywgbmV3UGtPcmRlcmluZyk7CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQa09yZGVyaW5nXyhib29sZWFuIG5ld1BrT3JkZXJpbmcpIHsKLQkJYm9vbGVhbiBvbGRQa09yZGVyaW5nID0gdGhpcy5pc1BrT3JkZXJpbmc7Ci0JCXRoaXMuaXNQa09yZGVyaW5nID0gbmV3UGtPcmRlcmluZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQS19PUkRFUklOR19QUk9QRVJUWSwgb2xkUGtPcmRlcmluZywgbmV3UGtPcmRlcmluZyk7CQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0N1c3RvbU9yZGVyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5pc0N1c3RvbU9yZGVyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1c3RvbU9yZGVyaW5nKGJvb2xlYW4gbmV3Q3VzdG9tT3JkZXJpbmcpIHsKLQkJYm9vbGVhbiBvbGRDdXN0b21PcmRlcmluZyA9IHRoaXMuaXNDdXN0b21PcmRlcmluZzsKLQkJdGhpcy5pc0N1c3RvbU9yZGVyaW5nID0gbmV3Q3VzdG9tT3JkZXJpbmc7Ci0JCWlmIChuZXdDdXN0b21PcmRlcmluZykgewotCQkJc2V0T3JkZXJCeSgiIik7Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDVVNUT01fT1JERVJJTkdfUFJPUEVSVFksIG9sZEN1c3RvbU9yZGVyaW5nLCBuZXdDdXN0b21PcmRlcmluZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbU9yZGVyaW5nXyhib29sZWFuIG5ld0N1c3RvbU9yZGVyaW5nKSB7Ci0JCWJvb2xlYW4gb2xkQ3VzdG9tT3JkZXJpbmcgPSB0aGlzLmlzQ3VzdG9tT3JkZXJpbmc7Ci0JCXRoaXMuaXNDdXN0b21PcmRlcmluZyA9IG5ld0N1c3RvbU9yZGVyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9PUkRFUklOR19QUk9QRVJUWSwgb2xkQ3VzdG9tT3JkZXJpbmcsIG5ld0N1c3RvbU9yZGVyaW5nKTsKLQl9Ci0JCi0JcHVibGljIE9ybUpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5UYWJsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0pvaW5UYWJsZVNwZWNpZmllZCgpIHsKLQkJcmV0dXJuIGdldEpvaW5UYWJsZSgpLmlzU3BlY2lmaWVkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcEtleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXkoU3RyaW5nIG5ld01hcEtleSkgewotCQlTdHJpbmcgb2xkTWFwS2V5ID0gdGhpcy5tYXBLZXk7Ci0JCXRoaXMubWFwS2V5ID0gbmV3TWFwS2V5OwotCQlpZiAob2xkTWFwS2V5ICE9IG5ld01hcEtleSkgewotCQkJaWYgKHRoaXMuZ2V0TWFwS2V5UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRNYXBLZXlSZXNvdXJjZSgpLnNldE5hbWUobmV3TWFwS2V5KTsJCQkJCQkKLQkJCQlpZiAodGhpcy5nZXRNYXBLZXlSZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZU1hcEtleVJlc291cmNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3TWFwS2V5ICE9IG51bGwpIHsKLQkJCQlhZGRNYXBLZXlSZXNvdXJjZSgpOwotCQkJCWdldE1hcEtleVJlc291cmNlKCkuc2V0TmFtZShuZXdNYXBLZXkpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQX0tFWV9QUk9QRVJUWSwgb2xkTWFwS2V5LCBuZXdNYXBLZXkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBLZXlfKFN0cmluZyBuZXdNYXBLZXkpIHsKLQkJU3RyaW5nIG9sZE1hcEtleSA9IHRoaXMubWFwS2V5OwotCQl0aGlzLm1hcEtleSA9IG5ld01hcEtleTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBfS0VZX1BST1BFUlRZLCBvbGRNYXBLZXksIG5ld01hcEtleSk7Ci0JfQotCQotCXByb3RlY3RlZCBNYXBLZXkgZ2V0TWFwS2V5UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0TWFwS2V5KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1hcEtleVJlc291cmNlKCkgewotCQlnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0TWFwS2V5KG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXBLZXlSZXNvdXJjZSgpIHsKLQkJZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldE1hcEtleShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNYXBLZXlJbXBsKCkpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZU1hcEtleU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5hbGxUYXJnZXRFbnRpdHlBdHRyaWJ1dGVOYW1lcygpOwotCX0KLQotLy8JcHVibGljIHZvaWQgcmVmcmVzaERlZmF1bHRzKERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKLS8vCQlzdXBlci5yZWZyZXNoRGVmYXVsdHMoZGVmYXVsdHNDb250ZXh0KTsKLS8vCQkvLyBUT0RPCi0vLwkJLy8JCWlmIChpc09yZGVyQnlQaygpKSB7Ci0vLwkJLy8JCQlyZWZyZXNoRGVmYXVsdE9yZGVyQnkoZGVmYXVsdHNDb250ZXh0KTsKLS8vCQkvLwkJfQotLy8JfQotLy8KLS8vCS8vcHJpbWFyeSBrZXkgb3JkZXJpbmcgd2hlbiBqdXN0IHRoZSBAT3JkZXJCeSBhbm5vdGF0aW9uIGlzIHByZXNlbnQKLS8vCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hEZWZhdWx0T3JkZXJCeShEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7Ci0vLwkJSUVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotLy8JCWlmICh0YXJnZXRFbnRpdHkgIT0gbnVsbCkgewotLy8JCQlzZXRPcmRlckJ5KHRhcmdldEVudGl0eS5wcmltYXJ5S2V5QXR0cmlidXRlTmFtZSgpICsgIiBBU0MiKTsKLS8vCQl9Ci0vLwl9Ci0vLwotLy8JLy9UT0RPIGNvcGllZCBmcm9tIEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKLS8vCS8qKgotLy8JICogZXh0cmFjdCB0aGUgZWxlbWVudCB0eXBlIGZyb20gdGhlIHNwZWNpZmllZCBjb250YWluZXIgc2lnbmF0dXJlIGFuZAotLy8JICogY29udmVydCBpdCBpbnRvIGEgcmVmZXJlbmNlIGVudGl0eSB0eXBlIG5hbWU7Ci0vLwkgKiByZXR1cm4gbnVsbCBpZiB0aGUgdHlwZSBpcyBub3QgYSB2YWxpZCByZWZlcmVuY2UgZW50aXR5IHR5cGUgKGUuZy4gaXQncwotLy8JICogYW5vdGhlciBjb250YWluZXIgb3IgYW4gYXJyYXkgb3IgYSBwcmltaXRpdmUgb3Igb3RoZXIgQmFzaWMgdHlwZSkKLS8vCSAqLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgU3RyaW5nIGphdmFEZWZhdWx0VGFyZ2V0RW50aXR5KElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotLy8JCVN0cmluZyB0eXBlTmFtZSA9IHN1cGVyLmphdmFEZWZhdWx0VGFyZ2V0RW50aXR5KHR5cGVCaW5kaW5nKTsKLS8vCQlyZXR1cm4gSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcudHlwZU5hbWVkSXNDb250YWluZXIodHlwZU5hbWUpID8gdGhpcy5qYXZhRGVmYXVsdFRhcmdldEVudGl0eUZyb21Db250YWluZXIodHlwZUJpbmRpbmcpIDogbnVsbDsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgU3RyaW5nIGphdmFEZWZhdWx0VGFyZ2V0RW50aXR5RnJvbUNvbnRhaW5lcihJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKLS8vCQlyZXR1cm4gSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhRGVmYXVsdFRhcmdldEVudGl0eUZyb21Db250YWluZXIodHlwZUJpbmRpbmcpOwotLy8JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSBtYXBwZWRCeVRleHRSYW5nZSA9IGdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRNYXBwZWRCeVRleHRSYW5nZSgpOwotCQlyZXR1cm4gbWFwcGVkQnlUZXh0UmFuZ2UgIT0gbnVsbCA/IG1hcHBlZEJ5VGV4dFJhbmdlIDogZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFQgbXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUobXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJdGhpcy5tYXBwZWRCeSA9IG11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5nZXRNYXBwZWRCeSgpOwotCQl0aGlzLm1hcEtleSA9IHRoaXMubWFwS2V5KG11bHRpUmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMub3JkZXJCeSA9IHRoaXMub3JkZXJCeShtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQlpZiAodGhpcy5vcmRlckJ5ID09IG51bGwpIHsgCi0JCQl0aGlzLmlzTm9PcmRlcmluZyA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmlzQ3VzdG9tT3JkZXJpbmcgPSB0cnVlOwotCQl9Ci0JCXRoaXMuam9pblRhYmxlLmluaXRpYWxpemUobXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKFQgbXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXN1cGVyLnVwZGF0ZShtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLnNldE1hcHBlZEJ5XyhtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCXRoaXMuc2V0TWFwS2V5Xyh0aGlzLm1hcEtleShtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcpKTsKLQkJdGhpcy5zZXRPcmRlckJ5Xyh0aGlzLm9yZGVyQnkobXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKSk7Ci0JCWlmIChnZXRPcmRlckJ5KCkgPT0gbnVsbCkgeyAKLQkJCXNldE5vT3JkZXJpbmdfKHRydWUpOwotCQkJc2V0UGtPcmRlcmluZ18oZmFsc2UpOwotCQkJc2V0Q3VzdG9tT3JkZXJpbmdfKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldE5vT3JkZXJpbmdfKGZhbHNlKTsKLQkJCXNldFBrT3JkZXJpbmdfKGZhbHNlKTsKLQkJCXNldEN1c3RvbU9yZGVyaW5nXyh0cnVlKTsKLQkJfQotCQl0aGlzLmpvaW5UYWJsZS51cGRhdGUobXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBLZXkoVCBtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJcmV0dXJuIG11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5nZXRNYXBLZXkoKSA9PSBudWxsID8gbnVsbCA6IG11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5nZXRNYXBLZXkoKS5nZXROYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgb3JkZXJCeShUIG11bHRpUmVsYXRpb25zaGlwTWFwcGluZykgewotCQlyZXR1cm4gbXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmdldE9yZGVyQnkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFyZ2V0RW50aXR5KEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlKSB7Ci0JCWlmICghcGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlLnR5cGVJc0NvbnRhaW5lcigpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlLmdldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZSgpOwotCX0KLQotCS8vKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqOAotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCQotCQlpZiAoZW50aXR5T3duZWQoKSAmJiAodGhpcy5pc0pvaW5UYWJsZVNwZWNpZmllZCgpIHx8IGlzUmVsYXRpb25zaGlwT3duZXIoKSkpIHsKLQkJCWdldEpvaW5UYWJsZSgpLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQl9Ci0JCWlmIChnZXRNYXBwZWRCeSgpICE9IG51bGwpIHsKLQkJCWFkZE1hcHBlZEJ5TWVzc2FnZXMobWVzc2FnZXMpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1hcHBlZEJ5TWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsJCi0JCWlmIChpc0pvaW5UYWJsZVNwZWNpZmllZCgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX01BUFBFRF9CWV9XSVRIX0pPSU5fVEFCTEUsCi0JCQkJCQlnZXRKb2luVGFibGUoKSwKLQkJCQkJCWdldEpvaW5UYWJsZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQl9Ci0JCQotCQlpZiAoZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSA9PSBudWxsKSB7Ci0JCQkvLyBhbHJlYWR5IGhhdmUgdmFsaWRhdGlvbiBtZXNzYWdlcyBmb3IgdGhhdAotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5yZXNvbHZlQXR0cmlidXRlKGdldE1hcHBlZEJ5KCkpOwotCQkKLQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX1VOUkVTT0xWRURfTUFQUEVEX0JZLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRNYXBwZWRCeSgpfSwgCi0JCQkJCQl0aGlzLAotCQkJCQkJZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoISBtYXBwZWRCeUlzVmFsaWQoYXR0cmlidXRlLmdldE1hcHBpbmcoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfSU5WQUxJRF9NQVBQRURfQlksCi0JCQkJCQluZXcgU3RyaW5nW10ge2dldE1hcHBlZEJ5KCl9LCAKLQkJCQkJCXRoaXMsCi0JCQkJCQlnZXRNYXBwZWRCeVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCU5vbk93bmluZ01hcHBpbmcgbWFwcGVkQnlNYXBwaW5nOwotCQl0cnkgewotCQkJbWFwcGVkQnlNYXBwaW5nID0gKE5vbk93bmluZ01hcHBpbmcpIGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLQkJCS8vIHRoZXJlIGlzIG5vIGVycm9yIHRoZW4KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKG1hcHBlZEJ5TWFwcGluZy5nZXRNYXBwZWRCeSgpICE9IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfTUFQUEVEX0JZX09OX0JPVEhfU0lERVMsCi0JCQkJCQl0aGlzLAotCQkJCQkJZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTmFtZWRDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU5hbWVkQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NGE1ODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTmFtZWRDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtTmFtZWRDb2x1bW48VCBleHRlbmRzIFhtbE5hbWVkQ29sdW1uPiAgZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1OYW1lZENvbHVtbgotewotCXByb3RlY3RlZCBPd25lciBvd25lcjsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE5hbWU7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbjsKLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybU5hbWVkQ29sdW1uKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1KcGFDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtSnBhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOYW1lZENvbHVtbiBvbGRDb2x1bW4pIHsKLQkJc2V0U3BlY2lmaWVkTmFtZShvbGRDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJc2V0Q29sdW1uRGVmaW5pdGlvbihvbGRDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVCBnZXRDb2x1bW5SZXNvdXJjZSgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlbW92ZUNvbHVtblJlc291cmNlKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkQ29sdW1uUmVzb3VyY2UoKTsKLQotCXB1YmxpYyBPd25lciBnZXRPd25lcigpIHsKLQkJcmV0dXJuIHRoaXMub3duZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTmFtZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTmFtZSA6IHRoaXMuZGVmYXVsdE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7Ci0JCWlmIChvbGRTcGVjaWZpZWROYW1lICE9IG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXROYW1lKG5ld1NwZWNpZmllZE5hbWUpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdTcGVjaWZpZWROYW1lICE9IG51bGwpIHsKLQkJCQlhZGRDb2x1bW5SZXNvdXJjZSgpOwotCQkJCWdldENvbHVtblJlc291cmNlKCkuc2V0TmFtZShuZXdTcGVjaWZpZWROYW1lKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWROYW1lLCBuZXdTcGVjaWZpZWROYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTmFtZV8oU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE5hbWUsIG5ld1NwZWNpZmllZE5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHROYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHROYW1lKFN0cmluZyBuZXdEZWZhdWx0TmFtZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdE5hbWUgPSB0aGlzLmRlZmF1bHROYW1lOwotCQl0aGlzLmRlZmF1bHROYW1lID0gbmV3RGVmYXVsdE5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9OQU1FX1BST1BFUlRZLCBvbGREZWZhdWx0TmFtZSwgbmV3RGVmYXVsdE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbkRlZmluaXRpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIG5ld0NvbHVtbkRlZmluaXRpb24pIHsKLQkJU3RyaW5nIG9sZENvbHVtbkRlZmluaXRpb24gPSB0aGlzLmNvbHVtbkRlZmluaXRpb247Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IG5ld0NvbHVtbkRlZmluaXRpb247Ci0JCWlmIChvbGRDb2x1bW5EZWZpbml0aW9uICE9IG5ld0NvbHVtbkRlZmluaXRpb24pIHsKLQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRDb2x1bW5EZWZpbml0aW9uKG5ld0NvbHVtbkRlZmluaXRpb24pOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdDb2x1bW5EZWZpbml0aW9uICE9IG51bGwpIHsKLQkJCQlhZGRDb2x1bW5SZXNvdXJjZSgpOwotCQkJCWdldENvbHVtblJlc291cmNlKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihuZXdDb2x1bW5EZWZpbml0aW9uKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZLCBvbGRDb2x1bW5EZWZpbml0aW9uLCBuZXdDb2x1bW5EZWZpbml0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbl8oU3RyaW5nIG5ld0NvbHVtbkRlZmluaXRpb24pIHsKLQkJU3RyaW5nIG9sZENvbHVtbkRlZmluaXRpb24gPSB0aGlzLmNvbHVtbkRlZmluaXRpb247Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IG5ld0NvbHVtbkRlZmluaXRpb247Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFksIG9sZENvbHVtbkRlZmluaXRpb24sIG5ld0NvbHVtbkRlZmluaXRpb24pOwotCX0KLQotCXB1YmxpYyBDb2x1bW4gZ2V0RGJDb2x1bW4oKSB7Ci0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREYlRhYmxlKCk7Ci0JCXJldHVybiAodGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGFibGUuZ2V0Q29sdW1uTmFtZWQoZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0RGJUYWJsZSh0aGlzLnRhYmxlTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIHRhYmxlTmFtZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIGdldERiQ29sdW1uKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCWlmIChnZXRDb2x1bW5SZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRDb2x1bW5SZXNvdXJjZSgpLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQkJCWlmICh0ZXh0UmFuZ2UgIT0gbnVsbCkgewotCQkJCXJldHVybiB0ZXh0UmFuZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldENvbHVtblJlc291cmNlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlpZiAodGV4dFJhbmdlICE9IG51bGwpIHsKLQkJCXJldHVybiB0ZXh0UmFuZ2U7Ci0JCX0KLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCQotCS8vICoqKioqKioqKioqKioqKioqKiogaW5pdGlhbGl6YXRpb24gZnJvbSBvcm0geG1sIHJlc291cmNlIG1vZGVsICoqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShUIGNvbHVtbikgewotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWUoY29sdW1uKTsKLQkJdGhpcy5kZWZhdWx0TmFtZSA9IHRoaXMuZGVmYXVsdE5hbWUoKTsKLQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uID0gdGhpcy5zcGVjaWZpZWRDb2x1bW5EZWZpbml0aW9uKGNvbHVtbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShUIGNvbHVtbikgewotCQlzZXRTcGVjaWZpZWROYW1lXyh0aGlzLnNwZWNpZmllZE5hbWUoY29sdW1uKSk7Ci0JCXNldERlZmF1bHROYW1lKHRoaXMuZGVmYXVsdE5hbWUoKSk7Ci0JCXNldENvbHVtbkRlZmluaXRpb25fKHRoaXMuc3BlY2lmaWVkQ29sdW1uRGVmaW5pdGlvbihjb2x1bW4pKTsJCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lKFQgY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBjb2x1bW4uZ2V0TmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENvbHVtbkRlZmluaXRpb24oVCBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBjb2x1bW4gbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldERlZmF1bHRDb2x1bW5OYW1lKCk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1RdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjZjM2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1RdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtUXVlcnk8RSBleHRlbmRzIFhtbFF1ZXJ5PiBleHRlbmRzIEFic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUgCi0JaW1wbGVtZW50cyBPcm1RdWVyeQotewotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBxdWVyeTsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVF1ZXJ5SGludD4gaGludHM7Ci0KLQlwcm90ZWN0ZWQgRSBxdWVyeVJlc291cmNlOwotCQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVF1ZXJ5KE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmhpbnRzID0gbmV3IEFycmF5TGlzdDxPcm1RdWVyeUhpbnQ+KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEUgZ2V0UXVlcnlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlSZXNvdXJjZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMuZ2V0UXVlcnlSZXNvdXJjZSgpLnNldE5hbWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUXVlcnkuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeSgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIG5ld1F1ZXJ5KSB7Ci0JCVN0cmluZyBvbGRRdWVyeSA9IHRoaXMucXVlcnk7Ci0JCXRoaXMucXVlcnkgPSBuZXdRdWVyeTsKLQkJdGhpcy5nZXRRdWVyeVJlc291cmNlKCkuc2V0UXVlcnkobmV3UXVlcnkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFF1ZXJ5LlFVRVJZX1BST1BFUlRZLCBvbGRRdWVyeSwgbmV3UXVlcnkpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtUXVlcnlIaW50PiBoaW50cygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1RdWVyeUhpbnQ+KHRoaXMuaGludHMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGhpbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaGludHMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgT3JtUXVlcnlIaW50IGFkZEhpbnQoaW50IGluZGV4KSB7Ci0JCU9ybVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1RdWVyeUhpbnQodGhpcyk7Ci0JCXRoaXMuaGludHMuYWRkKGluZGV4LCBxdWVyeUhpbnQpOwotCQl0aGlzLmdldFF1ZXJ5UmVzb3VyY2UoKS5nZXRIaW50cygpLmFkZChpbmRleCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUXVlcnlIaW50KCkpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoUXVlcnkuSElOVFNfTElTVCwgaW5kZXgsIHF1ZXJ5SGludCk7Ci0JCXJldHVybiBxdWVyeUhpbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGludChpbnQgaW5kZXgsIE9ybVF1ZXJ5SGludCBxdWVyeUhpbnQpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgcXVlcnlIaW50LCB0aGlzLmhpbnRzLCBRdWVyeS5ISU5UU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlSGludChRdWVyeUhpbnQgcXVlcnlIaW50KSB7Ci0JCXJlbW92ZUhpbnQodGhpcy5oaW50cy5pbmRleE9mKHF1ZXJ5SGludCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVIaW50KGludCBpbmRleCkgewotCQlPcm1RdWVyeUhpbnQgcXVlcnlIaW50ID0gdGhpcy5oaW50cy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLnF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoUXVlcnkuSElOVFNfTElTVCwgaW5kZXgsIHF1ZXJ5SGludCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSGludF8oT3JtUXVlcnlIaW50IHF1ZXJ5SGludCkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QocXVlcnlIaW50LCB0aGlzLmhpbnRzLCBRdWVyeS5ISU5UU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZUhpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5xdWVyeVJlc291cmNlLmdldEhpbnRzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQltb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuaGludHMsIFF1ZXJ5LkhJTlRTX0xJU1QpOwkJCi0JCQotCX0KLQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoRSBxdWVyeVJlc291cmNlKSB7Ci0JCXRoaXMucXVlcnlSZXNvdXJjZSA9IHF1ZXJ5UmVzb3VyY2U7Ci0JCXRoaXMubmFtZSA9IHF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpOwotCQl0aGlzLnF1ZXJ5ID0gcXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpOwotCQl0aGlzLmluaXRpYWxpemVIaW50cyhxdWVyeVJlc291cmNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUhpbnRzKEUgcXVlcnlSZXNvdXJjZSkgewotCQlmb3IgKFhtbFF1ZXJ5SGludCBxdWVyeWhpbnQgOiBxdWVyeVJlc291cmNlLmdldEhpbnRzKCkpIHsKLQkJCXRoaXMuaGludHMuYWRkKGNyZWF0ZUhpbnQocXVlcnloaW50KSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUXVlcnlIaW50IGNyZWF0ZUhpbnQoWG1sUXVlcnlIaW50IHF1ZXJ5SGludCkgewotCQlPcm1RdWVyeUhpbnQgb3JtUXVlcnlIaW50ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUXVlcnlIaW50KHRoaXMpOwotCQlvcm1RdWVyeUhpbnQuaW5pdGlhbGl6ZShxdWVyeUhpbnQpOwotCQlyZXR1cm4gb3JtUXVlcnlIaW50OwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoRSBxdWVyeVJlc291cmNlKSB7Ci0JCXRoaXMucXVlcnlSZXNvdXJjZSA9IHF1ZXJ5UmVzb3VyY2U7Ci0JCXRoaXMuc2V0TmFtZShxdWVyeVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCXRoaXMuc2V0UXVlcnkocXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKLQkJdGhpcy51cGRhdGVIaW50cyhxdWVyeVJlc291cmNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGludHMoRSBxdWVyeVJlc291cmNlKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1RdWVyeUhpbnQ+IGhpbnRzID0gaGludHMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbFF1ZXJ5SGludD4gcmVzb3VyY2VIaW50cyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxRdWVyeUhpbnQ+KHF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCQotCQl3aGlsZSAoaGludHMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1RdWVyeUhpbnQgaGludCA9IGhpbnRzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZUhpbnRzLmhhc05leHQoKSkgewotCQkJCWhpbnQudXBkYXRlKHJlc291cmNlSGludHMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZUhpbnRfKGhpbnQpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VIaW50cy5oYXNOZXh0KCkpIHsKLQkJCWFkZEhpbnQoaGludHNTaXplKCksIGNyZWF0ZUhpbnQocmVzb3VyY2VIaW50cy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXMoUXVlcnkgcXVlcnkpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gdGhpcyBpc24ndCBpZGVhbCwgYnV0IGl0IHdpbGwgaGF2ZSB0byBkbyB1bnRpbCB3ZSBoYXZlIGZ1cnRoZXIgYWRvcHRlciBpbnB1dAotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCkuZXF1YWxzKHF1ZXJ5LmdldE5hbWUoKSkgJiYgcXVlcnkgaW5zdGFuY2VvZiBKYXZhUXVlcnk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRRdWVyeVJlc291cmNlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFF1ZXJ5UmVzb3VyY2UoKS5nZXROYW1lVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDA2ZjZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVJlbGF0aW9uc2hpcE1hcHBpbmc8VCBleHRlbmRzIFhtbFJlbGF0aW9uc2hpcE1hcHBpbmc+IGV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFQ+Ci0JaW1wbGVtZW50cyBPcm1SZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYXJnZXRFbnRpdHk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYXJnZXRFbnRpdHk7Ci0KLQlwcm90ZWN0ZWQgRW50aXR5IHJlc29sdmVkVGFyZ2V0RW50aXR5OwotCQotCXByb3RlY3RlZCBGZXRjaFR5cGUgc3BlY2lmaWVkRmV0Y2g7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUNhc2NhZGUgY2FzY2FkZTsKLQotCQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jYXNjYWRlID0gbmV3IE9ybUNhc2NhZGUodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSA9PSBudWxsKSA/IGdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoU3RyaW5nIG5ld1NwZWNpZmllZFRhcmdldEVudGl0eSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0gdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHk7Ci0JCXRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0gbmV3U3BlY2lmaWVkVGFyZ2V0RW50aXR5OwotCQlnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0VGFyZ2V0RW50aXR5KG5ld1NwZWNpZmllZFRhcmdldEVudGl0eSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFksIG9sZFNwZWNpZmllZFRhcmdldEVudGl0eSwgbmV3U3BlY2lmaWVkVGFyZ2V0RW50aXR5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHlfKFN0cmluZyBuZXdTcGVjaWZpZWRUYXJnZXRFbnRpdHkpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFRhcmdldEVudGl0eSA9IHRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5OwotCQl0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eSA9IG5ld1NwZWNpZmllZFRhcmdldEVudGl0eTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVGFyZ2V0RW50aXR5LCBuZXdTcGVjaWZpZWRUYXJnZXRFbnRpdHkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhcmdldEVudGl0eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VGFyZ2V0RW50aXR5KFN0cmluZyBuZXdEZWZhdWx0VGFyZ2V0RW50aXR5KSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0VGFyZ2V0RW50aXR5ID0gdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5OwotCQl0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHkgPSBuZXdEZWZhdWx0VGFyZ2V0RW50aXR5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkRGVmYXVsdFRhcmdldEVudGl0eSwgbmV3RGVmYXVsdFRhcmdldEVudGl0eSk7Ci0JfQotCi0JcHVibGljIEVudGl0eSBnZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUYXJnZXRFbnRpdHk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoRW50aXR5IG5ld1Jlc29sdmVkVGFyZ2V0RW50aXR5KSB7Ci0JCUVudGl0eSBvbGRSZXNvbHZlZFRhcmdldEVudGl0eSA9IHRoaXMucmVzb2x2ZWRUYXJnZXRFbnRpdHk7Ci0JCXRoaXMucmVzb2x2ZWRUYXJnZXRFbnRpdHkgPSBuZXdSZXNvbHZlZFRhcmdldEVudGl0eTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChSRVNPTFZFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGRSZXNvbHZlZFRhcmdldEVudGl0eSwgbmV3UmVzb2x2ZWRUYXJnZXRFbnRpdHkpOwotCX0KLQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRGZXRjaCgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0RmV0Y2goKSA6IHRoaXMuZ2V0U3BlY2lmaWVkRmV0Y2goKTsKLQl9Ci0KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldFNwZWNpZmllZEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRGZXRjaDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlIG5ld1NwZWNpZmllZEZldGNoKSB7Ci0JCUZldGNoVHlwZSBvbGRGZXRjaCA9IHRoaXMuc3BlY2lmaWVkRmV0Y2g7Ci0JCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSBuZXdTcGVjaWZpZWRGZXRjaDsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0RmV0Y2goRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRGZXRjaCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEZldGNoYWJsZS5TUEVDSUZJRURfRkVUQ0hfUFJPUEVSVFksIG9sZEZldGNoLCBuZXdTcGVjaWZpZWRGZXRjaCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2hfKEZldGNoVHlwZSBuZXdTcGVjaWZpZWRGZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSB0aGlzLnNwZWNpZmllZEZldGNoOwotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gbmV3U3BlY2lmaWVkRmV0Y2g7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRmV0Y2hhYmxlLlNQRUNJRklFRF9GRVRDSF9QUk9QRVJUWSwgb2xkRmV0Y2gsIG5ld1NwZWNpZmllZEZldGNoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtQ2FzY2FkZSBnZXRDYXNjYWRlKCkgewotCQlyZXR1cm4gdGhpcy5jYXNjYWRlOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21YbWxSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVhtbFJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JCXNldFNwZWNpZmllZFRhcmdldEVudGl0eShvbGRNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJc2V0U3BlY2lmaWVkRmV0Y2gob2xkTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJZ2V0Q2FzY2FkZSgpLmluaXRpYWxpemVGcm9tKG9sZE1hcHBpbmcuZ2V0Q2FzY2FkZSgpKTsKLQkJLy9UT0RPIHNob3VsZCB3ZSBzZXQgdGhlIGZldGNoIHR5cGUgZnJvbSBhIEJhc2ljTWFwcGluZz8/Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTmFtZXMoKSB7Ci0JCUVudGl0eSB0YXJnZXRFbnRpdHkgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gRW1wdHlJdGVyYXRvci48U3RyaW5nPiBpbnN0YW5jZSgpIDogdGFyZ2V0RW50aXR5LmdldFBlcnNpc3RlbnRUeXBlKCkuYWxsQXR0cmlidXRlTmFtZXMoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5hbGxUYXJnZXRFbnRpdHlBdHRyaWJ1dGVOYW1lcygpOwotCX0KLQkJCi0JcHVibGljIEVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCWlmIChnZXRUeXBlTWFwcGluZygpIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlyZXR1cm4gKEVudGl0eSkgZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShUIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShyZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHkgPSByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpOwotCQl0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHkgPSB0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHkoKTsKLQkJdGhpcy5yZXNvbHZlZFRhcmdldEVudGl0eSA9IHRoaXMucmVzb2x2ZVRhcmdldEVudGl0eSgpOwotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gdGhpcy5zcGVjaWZpZWRGZXRjaChyZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJdGhpcy5jYXNjYWRlLmluaXRpYWxpemUocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShUIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJc3VwZXIudXBkYXRlKHJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLnNldFNwZWNpZmllZFRhcmdldEVudGl0eV8ocmVsYXRpb25zaGlwTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFRhcmdldEVudGl0eSh0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JCXRoaXMuc2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkodGhpcy5yZXNvbHZlVGFyZ2V0RW50aXR5KCkpOwotCQl0aGlzLnNldFNwZWNpZmllZEZldGNoXyh0aGlzLnNwZWNpZmllZEZldGNoKHJlbGF0aW9uc2hpcE1hcHBpbmcpKTsKLQkJdGhpcy5jYXNjYWRlLnVwZGF0ZShyZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaChYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJcmV0dXJuIEZldGNoVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbChyZWxhdGlvbnNoaXBNYXBwaW5nLmdldEZldGNoKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwTWFwcGluZyBqYXZhUmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJaWYgKGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBmaW5kSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWlmIChqYXZhQXR0cmlidXRlTWFwcGluZyBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJCXJldHVybiAoKFJlbGF0aW9uc2hpcE1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFyZ2V0RW50aXR5KCkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIGphdmFNYXBwaW5nID0gamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJaWYgKGphdmFNYXBwaW5nICE9IG51bGwpIHsKLQkJCWlmIChnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkgJiYgIWdldFR5cGVNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCQlyZXR1cm4gamF2YU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWZhdWx0VGFyZ2V0RW50aXR5KGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkZWZhdWx0VGFyZ2V0RW50aXR5KEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlKTsKLQotCXByb3RlY3RlZCBFbnRpdHkgcmVzb2x2ZVRhcmdldEVudGl0eSgpIHsKLQkJaWYgKGdldFRhcmdldEVudGl0eSgpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0VGFyZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwgJiYgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKSB7Ci0JCQlyZXR1cm4gKEVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgZ2V0VGFyZ2V0UGVyc2lzdGVudFR5cGUoKSB7Ci0JCS8vIHRyeSB0byByZXNvbHZlIGJ5IG9ubHkgdGhlIGxvY2FsbHkgc3BlY2lmaWVkIG5hbWUKLQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZShnZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWlmIChwZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQkvLyB0cnkgdG8gcmVzb2x2ZSBieSBwcmVwZW5kaW5nIHRoZSBnbG9iYWwgcGFja2FnZSBuYW1lCi0JCQlwZXJzaXN0ZW50VHlwZSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpICsgIi4iICsgZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW50VHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDJlYmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OdWxsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPFQgZXh0ZW5kcyBYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RPcm1SZWxhdGlvbnNoaXBNYXBwaW5nPFQ+IGltcGxlbWVudHMgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwotewotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zOwotCi0JcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW47Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRPcHRpb25hbDsKLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8T3JtSm9pbkNvbHVtbj4oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9sZE1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkpIHsKLQkJCU9ybUpvaW5Db2x1bW4gbmV3Sm9pbkNvbHVtbiA9IGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgrKyk7Ci0JCQluZXdKb2luQ29sdW1uLmluaXRpYWxpemVGcm9tKGpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RGVmYXVsdEZldGNoKCkgewotCQlyZXR1cm4gU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5ERUZBVUxUX0ZFVENIX1RZUEU7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKioqKiBJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKSA/IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zKCkgOiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKSA/IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Sm9pbkNvbHVtbihPcm1Kb2luQ29sdW1uIG5ld0pvaW5Db2x1bW4pIHsKLQkJT3JtSm9pbkNvbHVtbiBvbGRKb2luQ29sdW1uID0gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKLQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IG5ld0pvaW5Db2x1bW47Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5ERUZBVUxUX0pPSU5fQ09MVU1OLCBvbGRKb2luQ29sdW1uLCBuZXdKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGRlZmF1bHRKb2luQ29sdW1ucygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4pOwotCQl9Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IGRlZmF1bHRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+KHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMpOwotCX0KLQotCXB1YmxpYyBpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICF0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlPcm1Kb2luQ29sdW1uIG9sZERlZmF1bHRKb2luQ29sdW1uID0gdGhpcy5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQlpZiAob2xkRGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJLy9udWxsIHRoZSBkZWZhdWx0IGpvaW4gY29sdW1uIG5vdyBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JCQkvL2lmIG9uZSBkb2VzIG5vdCBleGlzdCwgdGhlcmUgaXMgYWxyZWFkeSBhIHNwZWNpZmllZCBqb2luIGNvbHVtbi4KLQkJCS8vUmVtb3ZlIGl0IG5vdyBzbyB0aGF0IGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQgZHVyaW5nIGFuIHVwZGF0ZSBhbmQKLQkJCS8vY2F1c2UgY2hhbmdlIG5vdGlmaWNhdGlvbnMgdG8gYmUgc2VudCB0byB0aGUgVUkgaW4gdGhlIHdyb25nIG9yZGVyCi0JCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gbnVsbDsKLQkJfQotCQlYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uSW1wbCgpOwotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBidWlsZEpvaW5Db2x1bW4oeG1sSm9pbkNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuYWRkKGluZGV4LCBqb2luQ29sdW1uKTsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoaW5kZXgsIHhtbEpvaW5Db2x1bW4pOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKLQkJaWYgKG9sZERlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLkRFRkFVTFRfSk9JTl9DT0xVTU4sIG9sZERlZmF1bHRKb2luQ29sdW1uLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCwgT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJT3JtSm9pbkNvbHVtbiByZW1vdmVkSm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKLQkJaWYgKCFjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpIHsKLQkJCS8vY3JlYXRlIHRoZSBkZWZhdWx0Sm9pbkNvbHVtbiBub3cgb3IgdGhpcyB3aWxsIGhhcHBlbiBkdXJpbmcgcHJvamVjdCB1cGRhdGUgCi0JCQkvL2FmdGVyIHJlbW92aW5nIHRoZSBqb2luIGNvbHVtbiBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4gVGhhdCBjYXVzZXMgcHJvYmxlbXMgCi0JCQkvL2luIHRoZSBVSSBiZWNhdXNlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBlbmQgdXAgaW4gdGhlIHdyb25nIG9yZGVyLgotCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IGJ1aWxkSm9pbkNvbHVtbihudWxsKTsKLQkJfQotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRKb2luQ29sdW1uKTsKLQkJaWYgKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJLy9maXJlIGNoYW5nZSBub3RpZmljYXRpb24gaWYgYSBkZWZhdWx0Sm9pbkNvbHVtbiB3YXMgY3JlYXRlZCBhYm92ZQotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuREVGQVVMVF9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbik7CQkKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW5fKE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRKb2luQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgewotCQlyZXR1cm4gZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSA9PSBudWxsID8gZ2V0RGVmYXVsdE9wdGlvbmFsKCkgOiBnZXRTcGVjaWZpZWRPcHRpb25hbCgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiBOdWxsYWJsZS5ERUZBVUxUX09QVElPTkFMOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE9wdGlvbmFsKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRPcHRpb25hbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbiBuZXdTcGVjaWZpZWRPcHRpb25hbCkgewotCQlCb29sZWFuIG9sZFNwZWNpZmllZE9wdGlvbmFsID0gdGhpcy5zcGVjaWZpZWRPcHRpb25hbDsKLQkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IG5ld1NwZWNpZmllZE9wdGlvbmFsOwotCQlnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0T3B0aW9uYWwobmV3U3BlY2lmaWVkT3B0aW9uYWwpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE51bGxhYmxlLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkT3B0aW9uYWwsIG5ld1NwZWNpZmllZE9wdGlvbmFsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkT3B0aW9uYWxfKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGRTcGVjaWZpZWRPcHRpb25hbCA9IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7Ci0JCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSBuZXdTcGVjaWZpZWRPcHRpb25hbDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOdWxsYWJsZS5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIG9sZFNwZWNpZmllZE9wdGlvbmFsLCBuZXdTcGVjaWZpZWRPcHRpb25hbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVCBzaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSBzaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmdldE9wdGlvbmFsKCk7Ci0JCS8vVE9ETyBkZWZhdWx0T3B0aW9uYWwKLQkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkSm9pbkNvbHVtbnMoc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRKb2luQ29sdW1uKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRKb2luQ29sdW1ucyhUIHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJaWYgKHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5nZXRKb2luQ29sdW1ucygpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmFkZChidWlsZEpvaW5Db2x1bW4oam9pbkNvbHVtbikpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpICYmIGlzUmVsYXRpb25zaGlwT3duZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRKb2luQ29sdW1uKCkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBidWlsZEpvaW5Db2x1bW4obnVsbCk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBidWlsZEpvaW5Db2x1bW4oWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUpvaW5Db2x1bW4odGhpcywgbmV3IEpvaW5Db2x1bW5Pd25lcigpKTsKLQkJb3JtSm9pbkNvbHVtbi5pbml0aWFsaXplKGpvaW5Db2x1bW4pOwotCQlyZXR1cm4gb3JtSm9pbkNvbHVtbjsKLQl9CQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKFQgc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZykgewotCQlzdXBlci51cGRhdGUoc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkT3B0aW9uYWxfKHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0T3B0aW9uYWwoKSk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoVCBzaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxKb2luQ29sdW1uPiByZXNvdXJjZUpvaW5Db2x1bW5zID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJaWYgKHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgIT0gbnVsbCkgewotCQkJcmVzb3VyY2VKb2luQ29sdW1ucyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxKb2luQ29sdW1uPihzaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQl9Ci0JCQotCQl3aGlsZSAoam9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQlqb2luQ29sdW1uLnVwZGF0ZShyZXNvdXJjZUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uXyhqb2luQ29sdW1uKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRKb2luQ29sdW1uKHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpLCBidWlsZEpvaW5Db2x1bW4ocmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJaWYgKCFzaG91bGRCdWlsZERlZmF1bHRKb2luQ29sdW1uKCkpIHsKLQkJCXNldERlZmF1bHRKb2luQ29sdW1uKG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXREZWZhdWx0Sm9pbkNvbHVtbigpID09IG51bGwpIHsKLQkJCXRoaXMuc2V0RGVmYXVsdEpvaW5Db2x1bW4oYnVpbGRKb2luQ29sdW1uKG51bGwpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4udXBkYXRlKG51bGwpOwotCQl9Ci0JfQkKLQotCS8qKgotCSAqIGVsaW1pbmF0ZSBhbnkgImNvbnRhaW5lciIgdHlwZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYXJnZXRFbnRpdHkoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UpIHsKLQkJaWYgKHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZS50eXBlSXNDb250YWluZXIoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZS5nZXRRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSgpOwotCX0KLQotCS8vKioqKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCi0JCWlmIChhZGRKb2luQ29sdW1uTWVzc2FnZXMoKSkgewotCQkJYWRkSm9pbkNvbHVtbk1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCX0KLQkKLQkvL2J1ZyAxOTIyODcgLSBkbyBub3Qgd2FudCBqb2luQ29sdW1uIHZhbGlkYXRpb24gZXJyb3JzIG9uIHRoZSBub24tb3duaW5nIHNpZGUKLQkvL29mIGEgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXAuICBUaGlzIGlzIGEgbG93IHJpc2sgZml4IGZvciBSQzMsIGJ1dCBhIGJldHRlcgotCS8vc29sdXRpb24gd291bGQgYmUgdG8gbm90IGhhdmUgdGhlIGRlZmF1bHQgam9pbkNvbHVtbnMgb24gdGhlIG5vbi1vd25pbmcgc2lkZS4KLQkvL1RoaXMgd291bGQgZml4IGFub3RoZXIgYnVnIHRoYXQgd2Ugc2hvdyBkZWZhdWx0IGpvaW5Db2x1bW5zIGluIHRoaXMgc2l0dWF0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIGFkZEpvaW5Db2x1bW5NZXNzYWdlcygpIHsKLQkJcmV0dXJuIChlbnRpdHlPd25lZCgpICYmIGlzUmVsYXRpb25zaGlwT3duZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSm9pbkNvbHVtbk1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWJvb2xlYW4gZG9Db250aW51ZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQkKLQkJZm9yIChPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoam9pbkNvbHVtbnMoKSkpIHsKLQkJCVN0cmluZyB0YWJsZSA9IGpvaW5Db2x1bW4uZ2V0VGFibGUoKTsKLQkJCQotCQkJaWYgKGRvQ29udGludWUgJiYgZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGUpKSB7Ci0JCQkJaWYgKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpLCB0YWJsZSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LAotCQkJCQkJCWpvaW5Db2x1bW4sIAotCQkJCQkJCWpvaW5Db2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoKSkKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHt0YWJsZSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCQlqb2luQ29sdW1uLCAKLQkJCQkJCQlqb2luQ29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYgKGRvQ29udGludWUgJiYgISBqb2luQ29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJCWlmIChnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJCWpvaW5Db2x1bW4sIAotCQkJCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCQkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCQlqb2luQ29sdW1uLCAKLQkJCQkJCQlqb2luQ29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkJKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChkb0NvbnRpbnVlICYmICEgam9pbkNvbHVtbi5pc1JlZmVyZW5jZWRDb2x1bW5SZXNvbHZlZCgpKSB7Ci0JCQkJaWYgKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCQlqb2luQ29sdW1uLCAKLQkJCQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCksIGpvaW5Db2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQkJam9pbkNvbHVtbiwgCi0JCQkJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgY2xhc3MgSm9pbkNvbHVtbk93bmVyIGltcGxlbWVudHMgT3JtSm9pbkNvbHVtbi5Pd25lcgotCXsKLQotCQlwdWJsaWMgSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMgaW4gdGhlIHR5cGUgbWFwcGluZydzIHByaW1hcnkgdGFibGUKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEVudGl0eSBnZXRUYXJnZXRFbnRpdHkoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50aGlzOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRoZSBqb2luIGNvbHVtbiBjYW4gYmUgb24gYSBzZWNvbmRhcnkgdGFibGUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlSXNBbGxvd2VkKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRUYXJnZXRFbnRpdHkoKTsKLQkJCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZDJjZGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVRhYmxlIGV4dGVuZHMgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDYXRhbG9nOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1UYWJsZShPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50cyA9IG5ldyBBcnJheUxpc3Q8T3JtVW5pcXVlQ29uc3RyYWludD4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtSnBhQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUpwYUNvbnRleHROb2RlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oVGFibGUgb2xkVGFibGUpIHsKLQkJc2V0U3BlY2lmaWVkTmFtZShvbGRUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlzZXRTcGVjaWZpZWRDYXRhbG9nKG9sZFRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCXNldFNwZWNpZmllZFNjaGVtYShvbGRUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdE5hbWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIG51bGwgaWYgbm8gdGFibGUgcmVzb3VyY2UgZWxlbWVudCBleGlzdHMKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgWG1sQmFzZVRhYmxlIGdldFRhYmxlUmVzb3VyY2UoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlbW92ZVRhYmxlUmVzb3VyY2UoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRUYWJsZVJlc291cmNlKCk7Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkTmFtZSA9IHRoaXMuc3BlY2lmaWVkTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gbmV3U3BlY2lmaWVkTmFtZTsKLQkJaWYgKG9sZFNwZWNpZmllZE5hbWUgIT0gbmV3U3BlY2lmaWVkTmFtZSkgewotCQkJaWYgKHRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5zZXROYW1lKG5ld1NwZWNpZmllZE5hbWUpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVUYWJsZVJlc291cmNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkTmFtZSAhPSBudWxsKSB7Ci0JCQkJYWRkVGFibGVSZXNvdXJjZSgpOwotCQkJCWdldFRhYmxlUmVzb3VyY2UoKS5zZXROYW1lKG5ld1NwZWNpZmllZE5hbWUpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVGFibGUuU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE5hbWUsIG5ld1NwZWNpZmllZE5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkTmFtZSA9IHRoaXMuc3BlY2lmaWVkTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gbmV3U3BlY2lmaWVkTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTmFtZSwgbmV3U3BlY2lmaWVkTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE5hbWUoU3RyaW5nIG5ld0RlZmF1bHROYW1lKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0TmFtZSA9IHRoaXMuZGVmYXVsdE5hbWU7Ci0JCXRoaXMuZGVmYXVsdE5hbWUgPSBuZXdEZWZhdWx0TmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5ERUZBVUxUX05BTUVfUFJPUEVSVFksIG9sZERlZmF1bHROYW1lLCBuZXdEZWZhdWx0TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpID09IG51bGwpID8gZ2V0RGVmYXVsdENhdGFsb2coKSA6IHRoaXMuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyBuZXdTcGVjaWZpZWRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBuZXdTcGVjaWZpZWRDYXRhbG9nOwotCQlpZiAob2xkU3BlY2lmaWVkQ2F0YWxvZyAhPSBuZXdTcGVjaWZpZWRDYXRhbG9nKSB7Ci0JCQlpZiAodGhpcy5nZXRUYWJsZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLnNldENhdGFsb2cobmV3U3BlY2lmaWVkQ2F0YWxvZyk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZVRhYmxlUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdTcGVjaWZpZWRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQlhZGRUYWJsZVJlc291cmNlKCk7Ci0JCQkJZ2V0VGFibGVSZXNvdXJjZSgpLnNldENhdGFsb2cobmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ2F0YWxvZywgbmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhdGFsb2dfKFN0cmluZyBuZXdTcGVjaWZpZWRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBuZXdTcGVjaWZpZWRDYXRhbG9nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRDYXRhbG9nLCBuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgbmV3RGVmYXVsdENhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRDYXRhbG9nID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IG5ld0RlZmF1bHRDYXRhbG9nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSwgb2xkRGVmYXVsdENhdGFsb2csIG5ld0RlZmF1bHRDYXRhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFNjaGVtYSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFNjaGVtYSgpIDogdGhpcy5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgbmV3U3BlY2lmaWVkU2NoZW1hKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRTY2hlbWEgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBuZXdTcGVjaWZpZWRTY2hlbWE7Ci0JCWlmIChvbGRTcGVjaWZpZWRTY2hlbWEgIT0gbmV3U3BlY2lmaWVkU2NoZW1hKSB7Ci0JCQlpZiAodGhpcy5nZXRUYWJsZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLnNldFNjaGVtYShuZXdTcGVjaWZpZWRTY2hlbWEpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVUYWJsZVJlc291cmNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkU2NoZW1hICE9IG51bGwpIHsKLQkJCQlhZGRUYWJsZVJlc291cmNlKCk7Ci0JCQkJZ2V0VGFibGVSZXNvdXJjZSgpLnNldFNjaGVtYShuZXdTcGVjaWZpZWRTY2hlbWEpOwotCQkJfQotCQl9Ci0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTY2hlbWEsIG5ld1NwZWNpZmllZFNjaGVtYSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNjaGVtYV8oU3RyaW5nIG5ld1NwZWNpZmllZFNjaGVtYSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkU2NoZW1hID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gbmV3U3BlY2lmaWVkU2NoZW1hOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNjaGVtYSwgbmV3U3BlY2lmaWVkU2NoZW1hKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTY2hlbWEoU3RyaW5nIG5ld0RlZmF1bHRTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRTY2hlbWEgPSB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYSA9IG5ld0RlZmF1bHRTY2hlbWE7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFksIG9sZERlZmF1bHRTY2hlbWEsIG5ld0RlZmF1bHRTY2hlbWEpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogdW5pcXVlIGNvbnN0cmFpbnRzICoqKioqKioqKioKLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+KHRoaXMudW5pcXVlQ29uc3RyYWludHMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludHMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgT3JtVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7Ci0JCU9ybVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9ICBidWlsZFVuaXF1ZUNvbnN0cmFpbnQodW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50cy5hZGQoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQpOwotCQkKLQkJaWYgKHRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCWFkZFRhYmxlUmVzb3VyY2UoKTsKLQkJfQotCQkKLQkJZ2V0VGFibGVSZXNvdXJjZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKGluZGV4LCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQlmaXJlSXRlbUFkZGVkKFRhYmxlLlVOSVFVRV9DT05TVFJBSU5UU19MSVNULCBpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7Ci0JCXJldHVybiB1bmlxdWVDb25zdHJhaW50OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCwgT3JtVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQsIHRoaXMudW5pcXVlQ29uc3RyYWludHMsIFRhYmxlLlVOSVFVRV9DT05TVFJBSU5UU19MSVNUKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJdGhpcy5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHRoaXMudW5pcXVlQ29uc3RyYWludHMuaW5kZXhPZih1bmlxdWVDb25zdHJhaW50KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCU9ybVVuaXF1ZUNvbnN0cmFpbnQgcmVtb3ZlZFVuaXF1ZUNvbnN0cmFpbnQgPSB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnJlbW92ZShpbmRleCk7Ci0JCWdldFRhYmxlUmVzb3VyY2UoKS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChUYWJsZS5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIHJlbW92ZWRVbmlxdWVDb25zdHJhaW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludF8oT3JtVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdCh1bmlxdWVDb25zdHJhaW50LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCBUYWJsZS5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMudW5pcXVlQ29uc3RyYWludHMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKFRhYmxlLlVOSVFVRV9DT05TVFJBSU5UU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCS8vKioqKioqKioqKioqKioqKioqKiBVbmlxdWVDb25zdHJhaW50Lk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlVW5pcXVlQ29uc3RyYWludENvbHVtbk5hbWVzKCkgewotCQlvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZGJUYWJsZSA9IGdldERiVGFibGUoKTsKLQkJaWYgKGRiVGFibGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRiVGFibGUuY29sdW1uTmFtZXMoKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoKSB7Ci0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERiU2NoZW1hKCk7Ci0JCXJldHVybiAoc2NoZW1hID09IG51bGwpID8gbnVsbCA6IHNjaGVtYS5nZXRUYWJsZU5hbWVkKGdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YVNvdXJjZSgpLmdldFNjaGVtYU5hbWVkKGdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZXNvbHZlZFNjaGVtYSgpIHsKLQkJcmV0dXJuIGdldERiU2NoZW1hKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewotCQlyZXR1cm4gZ2V0RGJUYWJsZSgpICE9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sQmFzZVRhYmxlIHRhYmxlKSB7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IHRoaXMuc3BlY2lmaWVkTmFtZSh0YWJsZSk7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gdGhpcy5zcGVjaWZpZWRTY2hlbWEodGFibGUpOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSB0aGlzLnNwZWNpZmllZENhdGFsb2codGFibGUpOwotCQl0aGlzLmRlZmF1bHROYW1lID0gdGhpcy5kZWZhdWx0TmFtZSgpOwotCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSB0aGlzLmRlZmF1bHRTY2hlbWEoKTsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IHRoaXMuZGVmYXVsdENhdGFsb2coKTsKLQkJdGhpcy5pbml0aWFsaXplVW5pcXVlQ29udHJhaW50cyh0YWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVVbmlxdWVDb250cmFpbnRzKFhtbEJhc2VUYWJsZSB0YWJsZSkgewotCQlpZiAodGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50IDogdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKSkgewotCQkJdGhpcy51bmlxdWVDb25zdHJhaW50cy5hZGQoYnVpbGRVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoWG1sQmFzZVRhYmxlIHRhYmxlKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTmFtZV8odGhpcy5zcGVjaWZpZWROYW1lKHRhYmxlKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyh0aGlzLnNwZWNpZmllZFNjaGVtYSh0YWJsZSkpOwotCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2dfKHRoaXMuc3BlY2lmaWVkQ2F0YWxvZyh0YWJsZSkpOwotCQl0aGlzLnNldERlZmF1bHROYW1lKHRoaXMuZGVmYXVsdE5hbWUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNjaGVtYSh0aGlzLmRlZmF1bHRTY2hlbWEoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdENhdGFsb2codGhpcy5kZWZhdWx0Q2F0YWxvZygpKTsKLQkJdGhpcy51cGRhdGVVbmlxdWVDb25zdHJhaW50cyh0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lKFhtbEJhc2VUYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gdGFibGUgPT0gbnVsbCA/IG51bGwgOiB0YWJsZS5nZXROYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hKFhtbEJhc2VUYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gdGFibGUgPT0gbnVsbCA/IG51bGwgOiB0YWJsZS5nZXRTY2hlbWEoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDYXRhbG9nKFhtbEJhc2VUYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gdGFibGUgPT0gbnVsbCA/IG51bGwgOiB0YWJsZS5nZXRDYXRhbG9nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZGVmYXVsdE5hbWUoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRlZmF1bHRTY2hlbWEoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRlZmF1bHRDYXRhbG9nKCk7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVW5pcXVlQ29uc3RyYWludHMoWG1sQmFzZVRhYmxlIHRhYmxlKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiByZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzOwotCQlpZiAodGFibGUgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cyA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+KHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQl9Ci0JCXdoaWxlICh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKLQkJCU9ybVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSkgewotCQkJCXVuaXF1ZUNvbnN0cmFpbnQudXBkYXRlKHJlc291cmNlVW5pcXVlQ29uc3RyYWludHMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVVuaXF1ZUNvbnN0cmFpbnRfKHVuaXF1ZUNvbnN0cmFpbnQpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKLQkJCWFkZFVuaXF1ZUNvbnN0cmFpbnQodW5pcXVlQ29uc3RyYWludHNTaXplKCksIGJ1aWxkVW5pcXVlQ29uc3RyYWludChyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVVuaXF1ZUNvbnN0cmFpbnQgYnVpbGRVbmlxdWVDb25zdHJhaW50KFhtbFVuaXF1ZUNvbnN0cmFpbnQgeG1sVW5pcXVlQ29uc3RyYWludCkgewotCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtVW5pcXVlQ29uc3RyYWludCh0aGlzLCB0aGlzLCB4bWxVbmlxdWVDb25zdHJhaW50KTsKLQl9Ci0JCi0KLQlwdWJsaWMgU3RyaW5nIHF1YWxpZmllZE5hbWUoKSB7Ci0JCXJldHVybiBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUodGhpcy5nZXRDYXRhbG9nKCksIHRoaXMuZ2V0U2NoZW1hKCksIHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCWlmIChnZXRUYWJsZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldFRhYmxlUmVzb3VyY2UoKS5nZXROYW1lVGV4dFJhbmdlKCk7Ci0JCQlpZiAodGV4dFJhbmdlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGV4dFJhbmdlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsgCi0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZSgpIHsKLQkJaWYgKGdldFRhYmxlUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0VGFibGVSZXNvdXJjZSgpLmdldENhdGFsb2dUZXh0UmFuZ2UoKTsKLQkJCWlmICh0ZXh0UmFuZ2UgIT0gbnVsbCkgewotCQkJCXJldHVybiB0ZXh0UmFuZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOyAKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoKSB7Ci0JCWlmIChnZXRUYWJsZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldFRhYmxlUmVzb3VyY2UoKS5nZXRTY2hlbWFUZXh0UmFuZ2UoKTsKLQkJCWlmICh0ZXh0UmFuZ2UgIT0gbnVsbCkgewotCQkJCXJldHVybiB0ZXh0UmFuZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOyAKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlpZiAoZ2V0VGFibGVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCQlpZiAodGV4dFJhbmdlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGV4dFJhbmdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZChxdWFsaWZpZWROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIHF1YWxpZmllZE5hbWUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNjYwMWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1UeXBlTWFwcGluZzxUIGV4dGVuZHMgQWJzdHJhY3RYbWxUeXBlTWFwcGluZz4gZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgT3JtVHlwZU1hcHBpbmcKLXsKLQotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NfOwotCQotCXB1YmxpYyBBY2Nlc3NUeXBlIGRlZmF1bHRBY2Nlc3M7Ci0KLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3M7Ci0KLQlwdWJsaWMgYm9vbGVhbiBkZWZhdWx0TWV0YWRhdGFDb21wbGV0ZTsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGU7Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZTsKLQotCXByb3RlY3RlZCBUIHR5cGVNYXBwaW5nOwotCQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVR5cGVNYXBwaW5nKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc18oKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzXzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzcyhTdHJpbmcgbmV3Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZENsYXNzID0gdGhpcy5jbGFzc187Ci0JCXRoaXMuY2xhc3NfID0gbmV3Q2xhc3M7Ci0JCXRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLnNldENsYXNzTmFtZShuZXdDbGFzcyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0xBU1NfUFJPUEVSVFksIG9sZENsYXNzLCBuZXdDbGFzcyk7Ci0JCWdldFBlcnNpc3RlbnRUeXBlKCkuY2xhc3NDaGFuZ2VkKG9sZENsYXNzLCBuZXdDbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBY2Nlc3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEFjY2VzcyhBY2Nlc3NUeXBlIG5ld0RlZmF1bHRBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGREZWZhdWx0QWNjZXNzID0gdGhpcy5kZWZhdWx0QWNjZXNzOwotCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSBuZXdEZWZhdWx0QWNjZXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1BST1BFUlRZLCBvbGREZWZhdWx0QWNjZXNzLCBuZXdEZWZhdWx0QWNjZXNzKTsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRTcGVjaWZpZWRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFjY2VzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdTcGVjaWZpZWRBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGRTcGVjaWZpZWRBY2Nlc3MgPSB0aGlzLnNwZWNpZmllZEFjY2VzczsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3MgPSBuZXdTcGVjaWZpZWRBY2Nlc3M7Ci0JCXRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLnRvWG1sUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRBY2Nlc3MpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRBY2Nlc3MsIG5ld1NwZWNpZmllZEFjY2Vzcyk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRBY2Nlc3MoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkQWNjZXNzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlpZiAoaXNEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQkvL2VudGl0eS1tYXBwaW5ncy9wZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhL3htbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGlzIHNwZWNpZmllZCwgdGhlbiBpdCBvdmVycmlkZXMKLQkJCS8vYW55dGhpbmcgc2V0IGhlcmUKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkgPT0gbnVsbCkgPyB0aGlzLmlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRNZXRhZGF0YUNvbXBsZXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuIG5ld0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCWJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZSA9IHRoaXMuZGVmYXVsdE1ldGFkYXRhQ29tcGxldGU7Ci0JCXRoaXMuZGVmYXVsdE1ldGFkYXRhQ29tcGxldGUgPSBuZXdEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZLCBvbGRNZXRhZGF0YUNvbXBsZXRlLCBuZXdEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCUJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZSA9IHRoaXMuc3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZTsKLQkJdGhpcy5zcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlID0gbmV3U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZTsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0TWV0YWRhdGFDb21wbGV0ZShuZXdTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFksIG9sZE1ldGFkYXRhQ29tcGxldGUsIG5ld1NwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUpOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIChPcm1QZXJzaXN0ZW50VHlwZSkgZ2V0UGFyZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSVR5cGVNYXBwaW5nIGlzIGNoYW5nZWQgYW5kIHZhcmlvdXMgSVR5cGVNYXBwaW5ncyBtYXkgaGF2ZQotCSAqIGNvbW1vbiBzZXR0aW5ncy4gIEluIHRoaXMgbWV0aG9kIGluaXRpYWxpemUgdGhlIG5ldyBJVHlwZU1hcHBpbmcgKHRoaXMpCi0JICogZnJvbXRoZSBvbGQgSVR5cGVNYXBwaW5nIChvbGRNYXBwaW5nKQotCSAqIEBwYXJhbSBvbGRNYXBwaW5nCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oT3JtVHlwZU1hcHBpbmcgb2xkTWFwcGluZykgewotCQl0aGlzLnNldENsYXNzKG9sZE1hcHBpbmcuZ2V0Q2xhc3NfKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZEFjY2VzcyhvbGRNYXBwaW5nLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG9sZE1hcHBpbmcuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0QWNjZXNzKG9sZE1hcHBpbmcuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJdGhpcy5zZXREZWZhdWx0TWV0YWRhdGFDb21wbGV0ZShvbGRNYXBwaW5nLmlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCQotCXB1YmxpYyBUYWJsZSBnZXRQcmltYXJ5RGJUYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFR5cGVNYXBwaW5nI2F0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKFN0cmluZykKLQkgKiAKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uOiAgb3ZlcnJpZGUgd2hlcmUgbmVlZGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoU3RyaW5nIGF0dHJpYnV0ZU1hcHBpbmdLZXkpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0JCi0JCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIFQgZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZU1hcHBpbmc7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKLQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGRlZmF1bHRBY2Nlc3MoKSB7Ci0JCWlmICghaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCWlmIChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmhhc0FueUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9ucygpKSB7Ci0JCQkJCXJldHVybiBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKTsKLQkJCQl9Ci0JCQkJaWYgKGdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBnZXRQZXJzaXN0ZW50VHlwZSgpLmdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRKYXZhUGVyc2lzdGVudFR5cGUoSmF2YVBlcnNpc3RlbnRUeXBlIG5ld0phdmFQZXJzaXN0ZW50VHlwZSkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgb2xkSmF2YVBlcnNpc3RlbnRUeXBlID0gdGhpcy5qYXZhUGVyc2lzdGVudFR5cGU7Ci0JCXRoaXMuamF2YVBlcnNpc3RlbnRUeXBlID0gbmV3SmF2YVBlcnNpc3RlbnRUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEpBVkFfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZLCBvbGRKYXZhUGVyc2lzdGVudFR5cGUsIG5ld0phdmFQZXJzaXN0ZW50VHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKYXZhUGVyc2lzdGVudFR5cGUoKSB7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UgPSBnZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpOwotCQlpZiAocGVyc2lzdGVudFR5cGVSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSA9IGJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCQl9CQotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpIHsKLQkJLy8gdHJ5IHRvIHJlc29sdmUgYnkgb25seSB0aGUgbG9jYWxseSBzcGVjaWZpZWQgbmFtZQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKGdldENsYXNzXygpKTsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJLy8gdHJ5IHRvIHJlc29sdmUgYnkgcHJlcGVuZGluZyB0aGUgZ2xvYmFsIHBhY2thZ2UgbmFtZQotCQkJcGVyc2lzdGVudFR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSArICIuIiArIGdldENsYXNzXygpKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVudFR5cGVSZXNvdXJjZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKCkgewotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlID0gZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJc2V0SmF2YVBlcnNpc3RlbnRUeXBlKG51bGwpOwotCQl9Ci0JCWVsc2UgeyAKLQkJCWlmIChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkudXBkYXRlKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0SmF2YVBlcnNpc3RlbnRUeXBlKGJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpKTsKLQkJCX0KLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKHRoaXMsIHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVCB0eXBlTWFwcGluZykgewotCQl0aGlzLnR5cGVNYXBwaW5nID0gdHlwZU1hcHBpbmc7Ci0JCXRoaXMuY2xhc3NfID0gdHlwZU1hcHBpbmcuZ2V0Q2xhc3NOYW1lKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQl0aGlzLnNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUgPSB0aGlzLm1ldGFkYXRhQ29tcGxldGUodHlwZU1hcHBpbmcpOwotCQl0aGlzLmRlZmF1bHRNZXRhZGF0YUNvbXBsZXRlID0gdGhpcy5kZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpOwotCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IEFjY2Vzc1R5cGUuZnJvbVhtbFJlc291cmNlTW9kZWwodHlwZU1hcHBpbmcuZ2V0QWNjZXNzKCkpOwotCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSB0aGlzLmRlZmF1bHRBY2Nlc3MoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFQgdHlwZU1hcHBpbmcpIHsKLQkJdGhpcy50eXBlTWFwcGluZyA9IHR5cGVNYXBwaW5nOwotCQl0aGlzLnNldENsYXNzKHR5cGVNYXBwaW5nLmdldENsYXNzTmFtZSgpKTsKLQkJdGhpcy51cGRhdGVKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKHRoaXMubWV0YWRhdGFDb21wbGV0ZSh0eXBlTWFwcGluZykpOwotCQl0aGlzLnNldERlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKHRoaXMuZGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuZnJvbVhtbFJlc291cmNlTW9kZWwodHlwZU1hcHBpbmcuZ2V0QWNjZXNzKCkpKTsKLQkJdGhpcy5zZXREZWZhdWx0QWNjZXNzKHRoaXMuZGVmYXVsdEFjY2VzcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZShBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiB0eXBlTWFwcGluZy5nZXRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCi0KLQkKLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgb2Zmc2V0KSB7Ci0JCWlmICh0aGlzLnR5cGVNYXBwaW5nLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCXJldHVybiBnZXRQZXJzaXN0ZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZU1hcHBpbmcuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVNYXBwaW5nLmdldENsYXNzVGV4dFJhbmdlKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlc1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlc1RleHRSYW5nZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KSB7Ci0JCWlmICh0aGlzLnR5cGVNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy50eXBlTWFwcGluZy5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJYWRkQ2xhc3NNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGFkZENsYXNzTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJYWRkVW5zcGVjaWZpZWRDbGFzc01lc3NhZ2UobWVzc2FnZXMpOwotCQlhZGRVbnJlc29sdmVkQ2xhc3NNZXNzYWdlKG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVW5zcGVjaWZpZWRDbGFzc01lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0Q2xhc3NfKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfVU5TUEVDSUZJRURfQ0xBU1MsCi0JCQkJCXRoaXMsIAotCQkJCQl0aGlzLmdldENsYXNzVGV4dFJhbmdlKCkpCi0JCQkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFVucmVzb2x2ZWRDbGFzc01lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRDbGFzc18oKSkKLQkJCQkmJiBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSA9PSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfVU5SRVNPTFZFRF9DTEFTUywKLQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRDbGFzc18oKX0sCi0JCQkJCXRoaXMsIAotCQkJCQl0aGlzLmdldENsYXNzVGV4dFJhbmdlKCkpCi0JCQkpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlTWFwcGluZy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNFbnRpdHlNYXBwaW5ncy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNFbnRpdHlNYXBwaW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjcyOTNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljRW50aXR5TWFwcGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TdHJ1Y3R1cmVOb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0VudGl0eU1hcHBpbmdzIGV4dGVuZHMgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIEVudGl0eU1hcHBpbmdzCi17Ci0JcHJvdGVjdGVkIFhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzOwotCQotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlXzsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZzsKLQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGRlZmF1bHRBY2Nlc3M7Ci0KLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3M7Ci0JCQotCXByb3RlY3RlZCBmaW5hbCBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JzOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvcnM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXM7Ci0KLQotCXB1YmxpYyBHZW5lcmljRW50aXR5TWFwcGluZ3MoT3JtWG1sIHBhcmVudCwgWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKHRoaXMsIHhtbEVudGl0eU1hcHBpbmdzKTsKLQkJdGhpcy5wZXJzaXN0ZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9ybVBlcnNpc3RlbnRUeXBlPigpOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycyA9IG5ldyBBcnJheUxpc3Q8T3JtU2VxdWVuY2VHZW5lcmF0b3I+KCk7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3JzID0gbmV3IEFycmF5TGlzdDxPcm1UYWJsZUdlbmVyYXRvcj4oKTsKLQkJdGhpcy5uYW1lZFF1ZXJpZXMgPSBuZXcgQXJyYXlMaXN0PE9ybU5hbWVkUXVlcnk+KCk7Ci0JCXRoaXMubmFtZWROYXRpdmVRdWVyaWVzID0gbmV3IEFycmF5TGlzdDxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PigpOwotCQl0aGlzLmluaXRpYWxpemUoeG1sRW50aXR5TWFwcGluZ3MpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gT3JtU3RydWN0dXJlTm9kZXMuRU5USVRZX01BUFBJTkdTX0lEOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtWG1sIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1YbWwpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJZm9yIChPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvcm1QZXJzaXN0ZW50VHlwZXMoKSkpIHsKLQkJCWlmIChvcm1QZXJzaXN0ZW50VHlwZS5pc0ZvcihmdWxseVF1YWxpZmllZFR5cGVOYW1lKSkgewotCQkJCXJldHVybiBvcm1QZXJzaXN0ZW50VHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSB7Ci0JCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFja2FnZV87Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2UoU3RyaW5nIG5ld1BhY2thZ2UpIHsKLQkJU3RyaW5nIG9sZFBhY2thZ2UgPSB0aGlzLnBhY2thZ2VfOwotCQl0aGlzLnBhY2thZ2VfID0gbmV3UGFja2FnZTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5zZXRQYWNrYWdlKG5ld1BhY2thZ2UpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBBQ0tBR0VfUFJPUEVSVFksIG9sZFBhY2thZ2UsIG5ld1BhY2thZ2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMudmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERVNDUklQVElPTl9QUk9QRVJUWSwgb2xkRGVzY3JpcHRpb24sIG5ld0Rlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNjaGVtYShTdHJpbmcgbmV3RGVmYXVsdFNjaGVtYSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFNjaGVtYSA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gbmV3RGVmYXVsdFNjaGVtYTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkRGVmYXVsdFNjaGVtYSwgbmV3RGVmYXVsdFNjaGVtYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIG5ld1NwZWNpZmllZFNjaGVtYSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkU2NoZW1hID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gbmV3U3BlY2lmaWVkU2NoZW1hOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLnNldFNjaGVtYShuZXdTcGVjaWZpZWRTY2hlbWEpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNjaGVtYSwgbmV3U3BlY2lmaWVkU2NoZW1hKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFNjaGVtYSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkgOiB0aGlzLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYXRhbG9nKFN0cmluZyBuZXdEZWZhdWx0Q2F0YWxvZykgewotCQlTdHJpbmcgb2xkRGVmYXVsdENhdGFsb2cgPSB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gbmV3RGVmYXVsdENhdGFsb2c7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZLCBvbGREZWZhdWx0Q2F0YWxvZywgbmV3RGVmYXVsdENhdGFsb2cpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyBuZXdTcGVjaWZpZWRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBuZXdTcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLnNldENhdGFsb2cobmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZFNwZWNpZmllZENhdGFsb2csIG5ld1NwZWNpZmllZENhdGFsb2cpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZENhdGFsb2coKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKSA6IHRoaXMuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCX0KLQkKLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEFjY2VzcygpIDogdGhpcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKTsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXREZWZhdWx0QWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWNjZXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdEZWZhdWx0QWNjZXNzKSB7Ci0JCUFjY2Vzc1R5cGUgb2xkRGVmYXVsdEFjY2VzcyA9IHRoaXMuZGVmYXVsdEFjY2VzczsKLQkJdGhpcy5kZWZhdWx0QWNjZXNzID0gbmV3RGVmYXVsdEFjY2VzczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0FDQ0VTU19QUk9QRVJUWSwgb2xkRGVmYXVsdEFjY2VzcywgbmV3RGVmYXVsdEFjY2Vzcyk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUgbmV3U3BlY2lmaWVkQWNjZXNzKSB7Ci0JCUFjY2Vzc1R5cGUgb2xkU3BlY2lmaWVkQWNjZXNzID0gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7Ci0JCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gbmV3U3BlY2lmaWVkQWNjZXNzOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLnNldEFjY2VzcyhBY2Nlc3NUeXBlLnRvWG1sUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRBY2Nlc3MpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRBY2Nlc3MsIG5ld1NwZWNpZmllZEFjY2Vzcyk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gb3JtUGVyc2lzdGVudFR5cGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPih0aGlzLnBlcnNpc3RlbnRUeXBlcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgb3JtUGVyc2lzdGVudFR5cGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVudFR5cGVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlIGFkZE9ybVBlcnNpc3RlbnRUeXBlKFN0cmluZyBtYXBwaW5nS2V5LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudFR5cGUodGhpcywgbWFwcGluZ0tleSk7Ci0JCWludCBpbmRleCA9IGluc2VydGlvbkluZGV4KHBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5wZXJzaXN0ZW50VHlwZXMuYWRkKGluZGV4LCBwZXJzaXN0ZW50VHlwZSk7Ci0JCWlmIChjbGFzc05hbWUuc3RhcnRzV2l0aChnZXRQYWNrYWdlKCkgKyAiLiIpKSB7Ci0JCQkvLyBhZGRzIHNob3J0IG5hbWUgaWYgcGFja2FnZSBuYW1lIGlzIHNwZWNpZmllZAotCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhnZXRQYWNrYWdlKCkubGVuZ3RoKCkgKyAxKTsKLQkJfQotCQlBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLmFkZFRvUmVzb3VyY2VNb2RlbCh0aGlzLnhtbEVudGl0eU1hcHBpbmdzKTsKLQkJdHlwZU1hcHBpbmcuc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0JCWZpcmVJdGVtQWRkZWQoUEVSU0lTVEVOVF9UWVBFU19MSVNULCBpbmRleCwgcGVyc2lzdGVudFR5cGUpOwotCQlyZXR1cm4gcGVyc2lzdGVudFR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE9ybVBlcnNpc3RlbnRUeXBlKE9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlKSB7IAotCQlhZGRJdGVtVG9MaXN0KG9ybVBlcnNpc3RlbnRUeXBlLCB0aGlzLnBlcnNpc3RlbnRUeXBlcywgUEVSU0lTVEVOVF9UWVBFU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGluc2VydGlvbkluZGV4KE9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZih0aGlzLnBlcnNpc3RlbnRUeXBlcywgb3JtUGVyc2lzdGVudFR5cGUsIGJ1aWxkTWFwcGluZ0NvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBidWlsZE1hcHBpbmdDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9ybVBlcnNpc3RlbnRUeXBlIG8xLCBPcm1QZXJzaXN0ZW50VHlwZSBvMikgewotCQkJCWludCBvMVNlcXVlbmNlID0gbzEuZ2V0TWFwcGluZygpLmdldFhtbFNlcXVlbmNlKCk7Ci0JCQkJaW50IG8yU2VxdWVuY2UgPSBvMi5nZXRNYXBwaW5nKCkuZ2V0WG1sU2VxdWVuY2UoKTsKLQkJCQlpZiAobzFTZXF1ZW5jZSA8IG8yU2VxdWVuY2UpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlpZiAobzFTZXF1ZW5jZSA9PSBvMlNlcXVlbmNlKSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVPcm1QZXJzaXN0ZW50VHlwZShpbnQgaW5kZXgpIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSB0aGlzLnBlcnNpc3RlbnRUeXBlcy5nZXQoaW5kZXgpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5kaXNwb3NlKCk7Ci0JCXRoaXMucGVyc2lzdGVudFR5cGVzLnJlbW92ZShpbmRleCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5yZW1vdmVGcm9tUmVzb3VyY2VNb2RlbCh0aGlzLnhtbEVudGl0eU1hcHBpbmdzKTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFBFUlNJU1RFTlRfVFlQRVNfTElTVCwgaW5kZXgsIG9ybVBlcnNpc3RlbnRUeXBlKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVPcm1QZXJzaXN0ZW50VHlwZShPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSkgewotCQlyZW1vdmVPcm1QZXJzaXN0ZW50VHlwZSh0aGlzLnBlcnNpc3RlbnRUeXBlcy5pbmRleE9mKG9ybVBlcnNpc3RlbnRUeXBlKSk7CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVPcm1QZXJzaXN0ZW50VHlwZV8oT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUpIHsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZGlzcG9zZSgpOwotCQlyZW1vdmVJdGVtRnJvbUxpc3Qob3JtUGVyc2lzdGVudFR5cGUsIHRoaXMucGVyc2lzdGVudFR5cGVzLCBQRVJTSVNURU5UX1RZUEVTX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNoYW5nZU1hcHBpbmcoT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUsIE9ybVR5cGVNYXBwaW5nIG9sZE1hcHBpbmcsIE9ybVR5cGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZGlzcG9zZSgpOwotCQlpbnQgc291cmNlSW5kZXggPSB0aGlzLnBlcnNpc3RlbnRUeXBlcy5pbmRleE9mKG9ybVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5wZXJzaXN0ZW50VHlwZXMucmVtb3ZlKHNvdXJjZUluZGV4KTsKLQkJb2xkTWFwcGluZy5yZW1vdmVGcm9tUmVzb3VyY2VNb2RlbCh0aGlzLnhtbEVudGl0eU1hcHBpbmdzKTsKLQkJaW50IHRhcmdldEluZGV4ID0gaW5zZXJ0aW9uSW5kZXgob3JtUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnBlcnNpc3RlbnRUeXBlcy5hZGQodGFyZ2V0SW5kZXgsIG9ybVBlcnNpc3RlbnRUeXBlKTsKLQkJbmV3TWFwcGluZy5hZGRUb1Jlc291cmNlTW9kZWwodGhpcy54bWxFbnRpdHlNYXBwaW5ncyk7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb20ob2xkTWFwcGluZyk7Ci0JCS8vVE9ETyBhcmUgdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGNvcnJlY3QgaW4gdGhpcyBjYXNlLCBvciBpcyB0YXJnZXQgb2ZmIGJ5IG9uZT8/PwotCQlmaXJlSXRlbU1vdmVkKFBFUlNJU1RFTlRfVFlQRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVNlcXVlbmNlR2VuZXJhdG9yPih0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgc2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3JzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE9ybVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKGludCBpbmRleCkgewotCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBvcm1TZXF1ZW5jZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKHRoaXMpOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycy5hZGQoaW5kZXgsIG9ybVNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwoKTsKLQkJb3JtU2VxdWVuY2VHZW5lcmF0b3IuaW5pdGlhbGl6ZShzZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuYWRkKGluZGV4LCBzZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCWZpcmVJdGVtQWRkZWQoU0VRVUVOQ0VfR0VORVJBVE9SU19MSVNULCBpbmRleCwgb3JtU2VxdWVuY2VHZW5lcmF0b3IpOwotCQlyZXR1cm4gb3JtU2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VxdWVuY2VHZW5lcmF0b3IoaW50IGluZGV4LCBPcm1TZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBzZXF1ZW5jZUdlbmVyYXRvciwgdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcnMsIEVudGl0eU1hcHBpbmdzLlNFUVVFTkNFX0dFTkVSQVRPUlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoT3JtU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IodGhpcy5zZXF1ZW5jZUdlbmVyYXRvcnMuaW5kZXhPZihzZXF1ZW5jZUdlbmVyYXRvcikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcihpbnQgaW5kZXgpIHsKLQkJT3JtU2VxdWVuY2VHZW5lcmF0b3IgcmVtb3ZlZFNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcnMucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFNFUVVFTkNFX0dFTkVSQVRPUlNfTElTVCwgaW5kZXgsIHJlbW92ZWRTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3JfKE9ybVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChzZXF1ZW5jZUdlbmVyYXRvciwgdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcnMsIEVudGl0eU1hcHBpbmdzLlNFUVVFTkNFX0dFTkVSQVRPUlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVNlcXVlbmNlR2VuZXJhdG9yKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc2VxdWVuY2VHZW5lcmF0b3JzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChFbnRpdHlNYXBwaW5ncy5TRVFVRU5DRV9HRU5FUkFUT1JTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtVGFibGVHZW5lcmF0b3I+KHRoaXMudGFibGVHZW5lcmF0b3JzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHRhYmxlR2VuZXJhdG9yc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlR2VuZXJhdG9ycy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBPcm1UYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcihpbnQgaW5kZXgpIHsKLQkJT3JtVGFibGVHZW5lcmF0b3IgeG1sVGFibGVHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1UYWJsZUdlbmVyYXRvcih0aGlzKTsKLQkJdGhpcy50YWJsZUdlbmVyYXRvcnMuYWRkKGluZGV4LCB4bWxUYWJsZUdlbmVyYXRvcik7Ci0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGVHZW5lcmF0b3JJbXBsKCk7Ci0JCXhtbFRhYmxlR2VuZXJhdG9yLmluaXRpYWxpemUodGFibGVHZW5lcmF0b3IpOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFRhYmxlR2VuZXJhdG9ycygpLmFkZChpbmRleCwgdGFibGVHZW5lcmF0b3IpOwotCQlmaXJlSXRlbUFkZGVkKFRBQkxFX0dFTkVSQVRPUlNfTElTVCwgaW5kZXgsIHhtbFRhYmxlR2VuZXJhdG9yKTsKLQkJcmV0dXJuIHhtbFRhYmxlR2VuZXJhdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWJsZUdlbmVyYXRvcihpbnQgaW5kZXgsIE9ybVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHRhYmxlR2VuZXJhdG9yLCB0aGlzLnRhYmxlR2VuZXJhdG9ycywgRW50aXR5TWFwcGluZ3MuVEFCTEVfR0VORVJBVE9SU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUYWJsZUdlbmVyYXRvcihPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcikgewotCQlyZW1vdmVUYWJsZUdlbmVyYXRvcih0aGlzLnRhYmxlR2VuZXJhdG9ycy5pbmRleE9mKHRhYmxlR2VuZXJhdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoaW50IGluZGV4KSB7Ci0JCU9ybVRhYmxlR2VuZXJhdG9yIHJlbW92ZWRUYWJsZUdlbmVyYXRvciA9IHRoaXMudGFibGVHZW5lcmF0b3JzLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0VGFibGVHZW5lcmF0b3JzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFRBQkxFX0dFTkVSQVRPUlNfTElTVCwgaW5kZXgsIHJlbW92ZWRUYWJsZUdlbmVyYXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVRhYmxlR2VuZXJhdG9yXyhPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QodGFibGVHZW5lcmF0b3IsIHRoaXMudGFibGVHZW5lcmF0b3JzLCBFbnRpdHlNYXBwaW5ncy5UQUJMRV9HRU5FUkFUT1JTX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVUYWJsZUdlbmVyYXRvcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnRhYmxlR2VuZXJhdG9ycywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRUYWJsZUdlbmVyYXRvcnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoRW50aXR5TWFwcGluZ3MuVEFCTEVfR0VORVJBVE9SU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5Pih0aGlzLm5hbWVkUXVlcmllcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmFtZWRRdWVyaWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZWRRdWVyaWVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE9ybU5hbWVkUXVlcnkgYWRkTmFtZWRRdWVyeShpbnQgaW5kZXgpIHsKLQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtTmFtZWRRdWVyeSh0aGlzKTsKLQkJdGhpcy5uYW1lZFF1ZXJpZXMuYWRkKGluZGV4LCBuYW1lZFF1ZXJ5KTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXROYW1lZFF1ZXJpZXMoKS5hZGQoaW5kZXgsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChRdWVyeUhvbGRlci5OQU1FRF9RVUVSSUVTX0xJU1QsIGluZGV4LCBuYW1lZFF1ZXJ5KTsKLQkJcmV0dXJuIG5hbWVkUXVlcnk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVkUXVlcnkoaW50IGluZGV4LCBPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgbmFtZWRRdWVyeSwgdGhpcy5uYW1lZFF1ZXJpZXMsIFF1ZXJ5SG9sZGVyLk5BTUVEX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkUXVlcnkoTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5KSB7Ci0JCXRoaXMucmVtb3ZlTmFtZWRRdWVyeSh0aGlzLm5hbWVkUXVlcmllcy5pbmRleE9mKG5hbWVkUXVlcnkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZFF1ZXJ5KGludCBpbmRleCkgewotCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSB0aGlzLm5hbWVkUXVlcmllcy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChRdWVyeUhvbGRlci5OQU1FRF9RVUVSSUVTX0xJU1QsIGluZGV4LCBuYW1lZFF1ZXJ5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOYW1lZFF1ZXJ5XyhPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KG5hbWVkUXVlcnksIHRoaXMubmFtZWRRdWVyaWVzLCBRdWVyeUhvbGRlci5OQU1FRF9RVUVSSUVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlTmFtZWRRdWVyeShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldE5hbWVkUXVlcmllcygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJbW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLm5hbWVkUXVlcmllcywgUXVlcnlIb2xkZXIuTkFNRURfUVVFUklFU19MSVNUKTsJCQotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5Pih0aGlzLm5hbWVkTmF0aXZlUXVlcmllcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE9ybU5hbWVkTmF0aXZlUXVlcnkgYWRkTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpIHsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtTmFtZWROYXRpdmVRdWVyeSh0aGlzKTsKLQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuYWRkKGluZGV4LCBuYW1lZE5hdGl2ZVF1ZXJ5KTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5hZGQoaW5kZXgsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChRdWVyeUhvbGRlci5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNULCBpbmRleCwgbmFtZWROYXRpdmVRdWVyeSk7Ci0JCXJldHVybiBuYW1lZE5hdGl2ZVF1ZXJ5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCwgT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIG5hbWVkTmF0aXZlUXVlcnksIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLCBRdWVyeUhvbGRlci5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTmFtZWROYXRpdmVRdWVyeShOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkpIHsKLQkJcmVtb3ZlTmFtZWROYXRpdmVRdWVyeSh0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5pbmRleE9mKG5hbWVkTmF0aXZlUXVlcnkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCkgewotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChRdWVyeUhvbGRlci5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNULCBpbmRleCwgbmFtZWROYXRpdmVRdWVyeSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTmFtZWROYXRpdmVRdWVyeV8oT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChuYW1lZE5hdGl2ZVF1ZXJ5LCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQltb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLCBRdWVyeUhvbGRlci5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsJCQotCX0KLQotCS8vVE9ETyB3aGF0IGFib3V0IHF1YWxpZmllZCBuYW1lPyAgcGFja2FnZSArIGNsYXNzCi0JLy90aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgYm90aCBmb3IgY2xhc3NOYW1lIGFuZCBwZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkuCi0JLy9tb3Zpbmcgb24gZm9yIG5vdyBzaW5jZSBJIGFtIGp1c3QgdHJ5aW5nIHRvIGdldCB0aGUgdWkgY29tcGlsZWQhICBqdXN0IGEgd2FybmluZyB0aGF0IHRoaXMgaXNuJ3QgZ29vZCBhcGkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1BlcnNpc3RlbnRUeXBlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJZm9yIChPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvcm1QZXJzaXN0ZW50VHlwZXMoKSkpIHsKLQkJCWlmIChwZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MgPSBlbnRpdHlNYXBwaW5nczsKLQkJdGhpcy52ZXJzaW9uID0gZW50aXR5TWFwcGluZ3MuZ2V0VmVyc2lvbigpOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZW50aXR5TWFwcGluZ3MuZ2V0RGVzY3JpcHRpb24oKTsKLQkJdGhpcy5wYWNrYWdlXyA9IGVudGl0eU1hcHBpbmdzLmdldFBhY2thZ2UoKTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBlbnRpdHlNYXBwaW5ncy5nZXRTY2hlbWEoKTsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gZW50aXR5TWFwcGluZ3MuZ2V0Q2F0YWxvZygpOwotCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzKGVudGl0eU1hcHBpbmdzKTsKLQkJdGhpcy5kZWZhdWx0QWNjZXNzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdEFjY2VzcygpOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQl0aGlzLmluaXRpYWxpemVQZXJzaXN0ZW50VHlwZXMoZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLmluaXRpYWxpemVUYWJsZUdlbmVyYXRvcnMoZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLmluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvcnMoZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLmluaXRpYWxpemVOYW1lZFF1ZXJpZXMoZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLmluaXRpYWxpemVOYW1lZE5hdGl2ZVF1ZXJpZXMoZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlVW5pdEdlbmVyYXRvcnNBbmRRdWVyaWVzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQZXJzaXN0ZW50VHlwZXMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJdGhpcy5pbml0aWFsaXplTWFwcGVkU3VwZXJjbGFzc2VzKGVudGl0eU1hcHBpbmdzKTsKLQkJdGhpcy5pbml0aWFsaXplRW50aXRpZXMoZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLmluaXRpYWxpemVFbWJlZGRhYmxlcyhlbnRpdHlNYXBwaW5ncyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzZXMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJZm9yIChYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgOiBlbnRpdHlNYXBwaW5ncy5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKSkgewotCQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50VHlwZSh0aGlzLCBNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmluaXRpYWxpemUobWFwcGVkU3VwZXJjbGFzcyk7Ci0JCQl0aGlzLnBlcnNpc3RlbnRUeXBlcy5hZGQob3JtUGVyc2lzdGVudFR5cGUpOwotCQl9CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW50aXRpZXMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJZm9yIChYbWxFbnRpdHkgZW50aXR5IDogZW50aXR5TWFwcGluZ3MuZ2V0RW50aXRpZXMoKSkgewotCQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50VHlwZSh0aGlzLCBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5pbml0aWFsaXplKGVudGl0eSk7Ci0JCQl0aGlzLnBlcnNpc3RlbnRUeXBlcy5hZGQob3JtUGVyc2lzdGVudFR5cGUpOwotCQl9CQkJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkYWJsZXMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJZm9yIChYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGUgOiBlbnRpdHlNYXBwaW5ncy5nZXRFbWJlZGRhYmxlcygpKSB7Ci0JCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRUeXBlKHRoaXMsIE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5pbml0aWFsaXplKGVtYmVkZGFibGUpOwotCQkJdGhpcy5wZXJzaXN0ZW50VHlwZXMuYWRkKG9ybVBlcnNpc3RlbnRUeXBlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGVHZW5lcmF0b3JzKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCWZvciAoWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgOiBlbnRpdHlNYXBwaW5ncy5nZXRUYWJsZUdlbmVyYXRvcnMoKSkgewotCQkJdGhpcy50YWJsZUdlbmVyYXRvcnMuYWRkKGJ1aWxkVGFibGVHZW5lcmF0b3IodGFibGVHZW5lcmF0b3IpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3JzKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCWZvciAoWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgOiBlbnRpdHlNYXBwaW5ncy5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKSkgewotCQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcnMuYWRkKGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3Ioc2VxdWVuY2VHZW5lcmF0b3IpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTmFtZWRRdWVyaWVzKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCWZvciAoWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5IDogZW50aXR5TWFwcGluZ3MuZ2V0TmFtZWRRdWVyaWVzKCkpIHsKLQkJCXRoaXMubmFtZWRRdWVyaWVzLmFkZChidWlsZE5hbWVkUXVlcnkobmFtZWRRdWVyeSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVOYW1lZE5hdGl2ZVF1ZXJpZXMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJZm9yIChYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgOiBlbnRpdHlNYXBwaW5ncy5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSkgewotCQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuYWRkKGJ1aWxkTmFtZWROYXRpdmVRdWVyeShuYW1lZE5hdGl2ZVF1ZXJ5KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncyA9IGVudGl0eU1hcHBpbmdzOwotCQlnZXRKcGFGaWxlKGVudGl0eU1hcHBpbmdzLmdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VNb2RlbCgpKS5hZGRSb290U3RydWN0dXJlTm9kZSh0aGlzLmdldE1hcHBpbmdGaWxlTmFtZSgpLCB0aGlzKTsKLQkJdGhpcy5zZXREZXNjcmlwdGlvbihlbnRpdHlNYXBwaW5ncy5nZXREZXNjcmlwdGlvbigpKTsKLQkJdGhpcy5zZXRQYWNrYWdlKGVudGl0eU1hcHBpbmdzLmdldFBhY2thZ2UoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hKGVudGl0eU1hcHBpbmdzLmdldFNjaGVtYSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nKGVudGl0eU1hcHBpbmdzLmdldENhdGFsb2coKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQWNjZXNzKHRoaXMuc3BlY2lmaWVkQWNjZXNzKGVudGl0eU1hcHBpbmdzKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEudXBkYXRlKGVudGl0eU1hcHBpbmdzKTsKLQkJdGhpcy5zZXREZWZhdWx0QWNjZXNzKGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdENhdGFsb2coZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNjaGVtYShnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbnRUeXBlcyhlbnRpdHlNYXBwaW5ncyk7Ci0JCXRoaXMudXBkYXRlVGFibGVHZW5lcmF0b3JzKGVudGl0eU1hcHBpbmdzKTsKLQkJdGhpcy51cGRhdGVTZXF1ZW5jZUdlbmVyYXRvcnMoZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLnVwZGF0ZU5hbWVkUXVlcmllcyhlbnRpdHlNYXBwaW5ncyk7Ci0JCXRoaXMudXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKGVudGl0eU1hcHBpbmdzKTsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW5jZVVuaXRHZW5lcmF0b3JzQW5kUXVlcmllcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBpbmdGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldEZpbGVOYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzcyhYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQlyZXR1cm4gQWNjZXNzVHlwZS5mcm9tWG1sUmVzb3VyY2VNb2RlbChlbnRpdHlNYXBwaW5ncy5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBlcnNpc3RlbnRUeXBlcyhYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IG9ybVBlcnNpc3RlbnRUeXBlcyA9IHRoaXMub3JtUGVyc2lzdGVudFR5cGVzKCk7Ci0JCXRoaXMudXBkYXRlTWFwcGVkU3VwZXJjbGFzc2VzKGVudGl0eU1hcHBpbmdzLCBvcm1QZXJzaXN0ZW50VHlwZXMpOwotCQl0aGlzLnVwZGF0ZUVudGl0aWVzKGVudGl0eU1hcHBpbmdzLCBvcm1QZXJzaXN0ZW50VHlwZXMpOwotCQl0aGlzLnVwZGF0ZUVtYmVkZGFibGVzKGVudGl0eU1hcHBpbmdzLCBvcm1QZXJzaXN0ZW50VHlwZXMpOwotCQkKLQkJd2hpbGUgKG9ybVBlcnNpc3RlbnRUeXBlcy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMucmVtb3ZlT3JtUGVyc2lzdGVudFR5cGVfKG9ybVBlcnNpc3RlbnRUeXBlcy5uZXh0KCkpOwotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWFwcGVkU3VwZXJjbGFzc2VzKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzLCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IG9ybVBlcnNpc3RlbnRUeXBlcykgewotCQlMaXN0SXRlcmF0b3I8WG1sTWFwcGVkU3VwZXJjbGFzcz4gbWFwcGVkU3VwZXJjbGFzc2VzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbE1hcHBlZFN1cGVyY2xhc3M+KGVudGl0eU1hcHBpbmdzLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJZm9yIChYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgOiAgQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG1hcHBlZFN1cGVyY2xhc3NlcykpIHsKLQkJCWlmIChvcm1QZXJzaXN0ZW50VHlwZXMuaGFzTmV4dCgpKSB7Ci0JCQkJb3JtUGVyc2lzdGVudFR5cGVzLm5leHQoKS51cGRhdGUobWFwcGVkU3VwZXJjbGFzcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRUeXBlKHRoaXMsIE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOwotCQkJCW9ybVBlcnNpc3RlbnRUeXBlLmluaXRpYWxpemUobWFwcGVkU3VwZXJjbGFzcyk7Ci0JCQkJYWRkT3JtUGVyc2lzdGVudFR5cGUob3JtUGVyc2lzdGVudFR5cGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVudGl0aWVzKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzLCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IG9ybVBlcnNpc3RlbnRUeXBlcykgewotCQlMaXN0SXRlcmF0b3I8WG1sRW50aXR5PiBlbnRpdGllcyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxFbnRpdHk+KGVudGl0eU1hcHBpbmdzLmdldEVudGl0aWVzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQlmb3IgKFhtbEVudGl0eSBlbnRpdHkgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoZW50aXRpZXMpKSB7Ci0JCQlpZiAob3JtUGVyc2lzdGVudFR5cGVzLmhhc05leHQoKSkgewotCQkJCW9ybVBlcnNpc3RlbnRUeXBlcy5uZXh0KCkudXBkYXRlKGVudGl0eSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRUeXBlKHRoaXMsIE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCQlvcm1QZXJzaXN0ZW50VHlwZS5pbml0aWFsaXplKGVudGl0eSk7Ci0JCQkJYWRkT3JtUGVyc2lzdGVudFR5cGUob3JtUGVyc2lzdGVudFR5cGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVtYmVkZGFibGVzKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzLCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IG9ybVBlcnNpc3RlbnRUeXBlcykgewotCQlMaXN0SXRlcmF0b3I8WG1sRW1iZWRkYWJsZT4gZW1iZWRkYWJsZXMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sRW1iZWRkYWJsZT4oZW50aXR5TWFwcGluZ3MuZ2V0RW1iZWRkYWJsZXMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCWZvciAoWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGVtYmVkZGFibGVzKSkgewotCQkJaWYgKG9ybVBlcnNpc3RlbnRUeXBlcy5oYXNOZXh0KCkpIHsKLQkJCQlvcm1QZXJzaXN0ZW50VHlwZXMubmV4dCgpLnVwZGF0ZShlbWJlZGRhYmxlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudFR5cGUodGhpcywgTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCQlvcm1QZXJzaXN0ZW50VHlwZS5pbml0aWFsaXplKGVtYmVkZGFibGUpOwotCQkJCWFkZE9ybVBlcnNpc3RlbnRUeXBlKG9ybVBlcnNpc3RlbnRUeXBlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYWJsZUdlbmVyYXRvcnMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybVRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvcnMgPSB0YWJsZUdlbmVyYXRvcnMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbFRhYmxlR2VuZXJhdG9yPiByZXNvdXJjZVRhYmxlR2VuZXJhdG9ycyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxUYWJsZUdlbmVyYXRvcj4oZW50aXR5TWFwcGluZ3MuZ2V0VGFibGVHZW5lcmF0b3JzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQl3aGlsZSAodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSkgewotCQkJT3JtVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSB0YWJsZUdlbmVyYXRvcnMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlVGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSkgewotCQkJCXRhYmxlR2VuZXJhdG9yLnVwZGF0ZShyZXNvdXJjZVRhYmxlR2VuZXJhdG9ycy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlVGFibGVHZW5lcmF0b3JfKHRhYmxlR2VuZXJhdG9yKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlVGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSkgewotCQkJYWRkVGFibGVHZW5lcmF0b3IodGFibGVHZW5lcmF0b3JzU2l6ZSgpLCBidWlsZFRhYmxlR2VuZXJhdG9yKHJlc291cmNlVGFibGVHZW5lcmF0b3JzLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVRhYmxlR2VuZXJhdG9yIGJ1aWxkVGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSkgewotCQlPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVRhYmxlR2VuZXJhdG9yKHRoaXMpOwotCQl0YWJsZUdlbmVyYXRvci5pbml0aWFsaXplKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VxdWVuY2VHZW5lcmF0b3JzKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JzID0gc2VxdWVuY2VHZW5lcmF0b3JzKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxTZXF1ZW5jZUdlbmVyYXRvcj4gcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcnMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sU2VxdWVuY2VHZW5lcmF0b3I+KGVudGl0eU1hcHBpbmdzLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJd2hpbGUgKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCU9ybVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCQlzZXF1ZW5jZUdlbmVyYXRvci51cGRhdGUocmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yXyhzZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNlcXVlbmNlR2VuZXJhdG9yKHNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSwgYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihyZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1TZXF1ZW5jZUdlbmVyYXRvciBidWlsZFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJT3JtU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1TZXF1ZW5jZUdlbmVyYXRvcih0aGlzKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3IuaW5pdGlhbGl6ZShzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKTsKLQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVOYW1lZFF1ZXJpZXMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IG5hbWVkUXVlcmllcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sTmFtZWRRdWVyeT4gcmVzb3VyY2VOYW1lZFF1ZXJpZXMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sTmFtZWRRdWVyeT4oZW50aXR5TWFwcGluZ3MuZ2V0TmFtZWRRdWVyaWVzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VOYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKSB7Ci0JCQkJbmFtZWRRdWVyeS51cGRhdGUocmVzb3VyY2VOYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZU5hbWVkUXVlcnlfKG5hbWVkUXVlcnkpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VOYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKSB7Ci0JCQlhZGROYW1lZFF1ZXJ5KG5hbWVkUXVlcmllc1NpemUoKSwgYnVpbGROYW1lZFF1ZXJ5KHJlc291cmNlTmFtZWRRdWVyaWVzLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybU5hbWVkUXVlcnkgYnVpbGROYW1lZFF1ZXJ5KFhtbE5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1OYW1lZFF1ZXJ5KHRoaXMpOwotCQlvcm1OYW1lZFF1ZXJ5LmluaXRpYWxpemUobmFtZWRRdWVyeSk7Ci0JCXJldHVybiBvcm1OYW1lZFF1ZXJ5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU5hbWVkTmF0aXZlUXVlcmllcyhYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzID0gbmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiByZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PihlbnRpdHlNYXBwaW5ncy5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCQotCQl3aGlsZSAobmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSkgewotCQkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZFF1ZXJ5ID0gbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCQluYW1lZFF1ZXJ5LnVwZGF0ZShyZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlTmFtZWROYXRpdmVRdWVyeV8obmFtZWRRdWVyeSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCWFkZE5hbWVkTmF0aXZlUXVlcnkobmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpLCBidWlsZE5hbWVkTmF0aXZlUXVlcnkocmVzb3VyY2VOYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtTmFtZWROYXRpdmVRdWVyeSBidWlsZE5hbWVkTmF0aXZlUXVlcnkoWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZFF1ZXJ5KSB7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9Z2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtTmFtZWROYXRpdmVRdWVyeSh0aGlzKTsKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5pbml0aWFsaXplKG5hbWVkUXVlcnkpOwotCQlyZXR1cm4gb3JtTmFtZWROYXRpdmVRdWVyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9yc0FuZFF1ZXJpZXMoKSB7Ci0JCWZvciAoR2VuZXJhdG9yIGdlbmVyYXRvciA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0YWJsZUdlbmVyYXRvcnMoKSkpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZEdlbmVyYXRvcihnZW5lcmF0b3IpOwotCQl9Ci0JCQotCQlmb3IgKEdlbmVyYXRvciBnZW5lcmF0b3IgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoc2VxdWVuY2VHZW5lcmF0b3JzKCkpKSB7Ci0JCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hZGRHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKLQkJfQotCQkKLQkJZm9yIChRdWVyeSBxdWVyeSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShuYW1lZFF1ZXJpZXMoKSkpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZFF1ZXJ5KHF1ZXJ5KTsKLQkJfQotCQkKLQkJZm9yIChRdWVyeSBxdWVyeSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShuYW1lZE5hdGl2ZVF1ZXJpZXMoKSkpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZFF1ZXJ5KHF1ZXJ5KTsKLQkJfQotCX0KLQotCQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCWZvciAoT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGU6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvcm1QZXJzaXN0ZW50VHlwZXMoKSkpIHsKLQkJCWlmIChwZXJzaXN0ZW50VHlwZS5jb250YWlucyh0ZXh0T2Zmc2V0KSkgewotCQkJCXJldHVybiBwZXJzaXN0ZW50VHlwZS5nZXRTdHJ1Y3R1cmVOb2RlKHRleHRPZmZzZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCkgewotCQlpZiAodGhpcy54bWxFbnRpdHlNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMueG1sRW50aXR5TWFwcGluZ3MuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJdHJ5IHsKLQkJCWFkZEdlbmVyYXRvck1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCWFkZFF1ZXJ5TWVzc2FnZXMobWVzc2FnZXMpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQlKcHRDb3JlUGx1Z2luLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCWZvciAoT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5vcm1QZXJzaXN0ZW50VHlwZXMoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJSnB0Q29yZVBsdWdpbi5sb2coZXhjZXB0aW9uKTsJCQkKLQkJCX0KLQkJfQotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmF0b3JNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlMaXN0PEdlbmVyYXRvcj4gbWFzdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KGdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPE9ybUdlbmVyYXRvcj4gc3RyZWFtID0gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPE9ybUdlbmVyYXRvcj4odGhpcy50YWJsZUdlbmVyYXRvcnMoKSwgdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcnMoKSk7IHN0cmVhbS5oYXNOZXh0KCkgOyApIHsKLQkJCU9ybUdlbmVyYXRvciBjdXJyZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJCW1hc3Rlckxpc3QucmVtb3ZlKGN1cnJlbnQpOwotCQkJCi0JCQlmb3IgKEdlbmVyYXRvciBlYWNoIDogbWFzdGVyTGlzdCkgewotCQkJCWlmICghIGVhY2gub3ZlcnJpZGVzKGN1cnJlbnQpICYmIGVhY2guZ2V0TmFtZSgpICE9IG51bGwgJiYgZWFjaC5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnQuZ2V0TmFtZSgpKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5HRU5FUkFUT1JfRFVQTElDQVRFX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldE5hbWUoKX0sCi0JCQkJCQkJY3VycmVudCwKLQkJCQkJCQljdXJyZW50LmdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkJKTsKLQkJCQl9Ci0JCQl9Ci0JCQltYXN0ZXJMaXN0LmFkZChjdXJyZW50KTsKLQkJfQotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgdm9pZCBhZGRRdWVyeU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCUxpc3Q8UXVlcnk+IG1hc3Rlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpOwotCQkKLQkJZm9yIChJdGVyYXRvcjxPcm1RdWVyeT4gc3RyZWFtID0gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPE9ybVF1ZXJ5Pih0aGlzLm5hbWVkUXVlcmllcygpLCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcygpKTsgc3RyZWFtLmhhc05leHQoKSA7ICkgewotCQkJT3JtUXVlcnkgY3VycmVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQltYXN0ZXJMaXN0LnJlbW92ZShjdXJyZW50KTsKLQkJCQotCQkJZm9yIChRdWVyeSBlYWNoIDogbWFzdGVyTGlzdCkgewotCQkJCWlmICghIGVhY2gub3ZlcnJpZGVzKGN1cnJlbnQpICYmIGVhY2guZ2V0TmFtZSgpICE9IG51bGwgJiYgZWFjaC5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnQuZ2V0TmFtZSgpKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5RVUVSWV9EVVBMSUNBVEVfTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2N1cnJlbnQuZ2V0TmFtZSgpfSwKLQkJCQkJCQljdXJyZW50LAotCQkJCQkJCWN1cnJlbnQuZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJCW1hc3Rlckxpc3QuYWRkKGN1cnJlbnQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJLy90aGUgcmVzb3VyY2UgaXMgbnVsbCBpZiB0aGUgb3JtLnhtbCBmaWxlIHdhcyBkZWxldGVkCi0JCQkvL3Jvb3RTdHJ1Y3R1cmVOb2RlcyBhcmUgY2xlYXJlZCBpbiB0aGUgZGlzcG9zZSBvZiBKcGFGaWxlCi0JCQlKcGFGaWxlIGpwYUZpbGUgPSBnZXRKcGFGaWxlKHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZU1vZGVsKCkpOwotCQkKLQkJCWlmIChqcGFGaWxlICE9IG51bGwpIHsKLQkJCQkvL3llcywgdGhpcyBjYW4gYWxzbyBiZSBudWxsLCBzZWVtcyB0aGF0IHNvbWV0aW1lcyB0aGUgcmVzb3VyY2UgaXMgbnVsbCBhbmQKLQkJCQkvL3NvbWV0aGluZyBpdCBpcyBub3QgeWV0IG51bGwsIGJ1dCB3ZSB3aWxsIGhhdmUgbm8ganBhRmlsZSBmb3IgaXQgYWZ0ZXIgYSBkZWxldGUuCi0JCQkJanBhRmlsZS5yZW1vdmVSb290U3RydWN0dXJlTm9kZShnZXRNYXBwaW5nRmlsZU5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJLy9zdGlsbCBuZWVkIHRvIGRpc3Bvc2UgdGhlc2UgZXZlbiBpbiB0aGUgY2FzZSBvZiBhIGZpbGUgYmVpbmcgZGVsZXRlZC4gIAotCQkvL0pwYUZpbGUuZGlzcG9zZSgpIGp1c3QgcmVtb3ZlcyB0aGUgcm9vdCBzdHJ1Y3R1cmUgbm9kZXMgZm9yIHRoaXMgZmlsZSwgbm90IG90aGVyIGZpbGVzIChqYXZhIGZpbGVzKQotCQlmb3IgKE9ybVBlcnNpc3RlbnRUeXBlICBvcm1QZXJzaXN0ZW50VHlwZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvcm1QZXJzaXN0ZW50VHlwZXMoKSkpIHsKLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZjI5OTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGV4dGVuZHMgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtQXNzb2NpYXRpb25PdmVycmlkZQotewotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1Kb2luQ29sdW1uPiBkZWZhdWx0Sm9pbkNvbHVtbnM7Ci0KLQlwcml2YXRlIGZpbmFsIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgb3duZXI7Ci0KLQlwcm90ZWN0ZWQgWG1sQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlOwotCi0KLQlwdWJsaWMgR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIG93bmVyLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxPcm1Kb2luQ29sdW1uPigpOwotCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8T3JtSm9pbkNvbHVtbj4oKTsKLQkJdGhpcy5pbml0aWFsaXplKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCkgewotCQlyZXR1cm4gKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUpIGdldE93bmVyKCkuc2V0VmlydHVhbCh2aXJ0dWFsLCB0aGlzKTsKLQl9Ci0JCi0JcHVibGljIE93bmVyIGdldE93bmVyKCkgewotCQlyZXR1cm4gdGhpcy5vd25lcjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIElBc3NvY2lhdGlvbk92ZXJyaWRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZU92ZXJyaWRlLk5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaXNFbXB0eSgpID8gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnMoKSA6IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKSA/IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBkZWZhdWx0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGRlZmF1bHRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4odGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUpvaW5Db2x1bW4odGhpcywgY3JlYXRlSm9pbkNvbHVtbk93bmVyKCkpOwotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmFkZChpbmRleCwgam9pbkNvbHVtbik7Ci0JCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmFkZChpbmRleCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbkltcGwoKSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChBc3NvY2lhdGlvbk92ZXJyaWRlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIGpvaW5Db2x1bW4pOwotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW4uT3duZXIgY3JlYXRlSm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5Pd25lcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4LCBPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgQXNzb2NpYXRpb25PdmVycmlkZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlPcm1Kb2luQ29sdW1uIHJlbW92ZWRKb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoRW50aXR5LlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgQXNzb2NpYXRpb25PdmVycmlkZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCW1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgQXNzb2NpYXRpb25PdmVycmlkZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOwkJCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICF0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQl9CQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5pc1ZpcnR1YWwodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0JCXRoaXMubmFtZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpOwotCQlpbml0aWFsaXplU3BlY2lmaWVkSm9pbkNvbHVtbnMoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRKb2luQ29sdW1ucyhYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJZm9yIChYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkpIHsKLQkJCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuYWRkKGNyZWF0ZUpvaW5Db2x1bW4oam9pbkNvbHVtbikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlOwotCQl0aGlzLnNldE5hbWUoYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQl1cGRhdGVTcGVjaWZpZWRKb2luQ29sdW1ucyhhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8WG1sSm9pbkNvbHVtbj4gcmVzb3VyY2VKb2luQ29sdW1ucyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxKb2luQ29sdW1uPihhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKGpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJam9pbkNvbHVtbi51cGRhdGUocmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRKb2luQ29sdW1uKHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpLCBjcmVhdGVKb2luQ29sdW1uKHJlc291cmNlSm9pbkNvbHVtbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW4gY3JlYXRlSm9pbkNvbHVtbihYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtSm9pbkNvbHVtbih0aGlzLCBuZXcgSm9pbkNvbHVtbk93bmVyKCkpOwotCQlvcm1Kb2luQ29sdW1uLmluaXRpYWxpemUoam9pbkNvbHVtbik7Ci0JCXJldHVybiBvcm1Kb2luQ29sdW1uOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQljbGFzcyBKb2luQ29sdW1uT3duZXIgaW1wbGVtZW50cyBPcm1Kb2luQ29sdW1uLk93bmVyCi0JewotCi0JCXB1YmxpYyBKb2luQ29sdW1uT3duZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGJ5IGRlZmF1bHQsIHRoZSBqb2luIGNvbHVtbiBpcyBpbiB0aGUgdHlwZSBtYXBwaW5nJ3MgcHJpbWFyeSB0YWJsZQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnRoaXMub3duZXIuZ2V0VHlwZU1hcHBpbmcoKS5nZXRUYWJsZU5hbWUoKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgRW50aXR5IGdldFRhcmdldEVudGl0eSgpIHsKLQkJCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJCXJldHVybiByZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwgPyBudWxsIDogcmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnRoaXMuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZS50aGlzLm93bmVyLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUudGhpcy5nZXROYW1lKCkpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRoZSBqb2luIGNvbHVtbiBjYW4gYmUgb24gYSBzZWNvbmRhcnkgdGFibGUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlSXNBbGxvd2VkKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUudGhpcy5vd25lci5nZXRUeXBlTWFwcGluZygpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCkgewotCQkJRW50aXR5IHRhcmdldEVudGl0eSA9IGdldFRhcmdldEVudGl0eSgpOwotCQkJcmV0dXJuICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUudGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnMuY29udGFpbnMoam9pbkNvbHVtbik7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZS50aGlzLmpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNDQ3MDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZSBleHRlbmRzIEFic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU92ZXJyaWRlLCBPcm1Db2x1bW4uT3duZXIKLXsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgZmluYWwgT3duZXIgb3duZXI7Ci0KLQlwcm90ZWN0ZWQgWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGU7Ci0JCi0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtQ29sdW1uIGNvbHVtbjsKLQotCXB1YmxpYyBHZW5lcmljT3JtQXR0cmlidXRlT3ZlcnJpZGUoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBBdHRyaWJ1dGVPdmVycmlkZS5Pd25lciBvd25lciwgWG1sQXR0cmlidXRlT3ZlcnJpZGUgeG1sQXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUNvbHVtbih0aGlzLCB0aGlzKTsKLQkJdGhpcy5pbml0aWFsaXplKHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUpwYUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1KcGFDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIHNldFZpcnR1YWwoYm9vbGVhbiB2aXJ0dWFsKSB7Ci0JCXJldHVybiAoT3JtQXR0cmlidXRlT3ZlcnJpZGUpIGdldE93bmVyKCkuc2V0VmlydHVhbCh2aXJ0dWFsLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgT3duZXIgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZShuZXdOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlT3ZlcnJpZGUuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZU92ZXJyaWRlLk5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBPcm1Db2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZW5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlRhYmxlKGdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewotCQlDb2x1bW5NYXBwaW5nIGNvbHVtbk1hcHBpbmcgPSBnZXRDb2x1bW5NYXBwaW5nKCk7Ci0JCWlmIChjb2x1bW5NYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBjb2x1bW5NYXBwaW5nLmdldENvbHVtbigpLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQlDb2x1bW5NYXBwaW5nIGNvbHVtbk1hcHBpbmcgPSBnZXRDb2x1bW5NYXBwaW5nKCk7Ci0JCWlmIChjb2x1bW5NYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyB0YWJsZU5hbWUgPSBjb2x1bW5NYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCk7Ci0JCWlmICh0YWJsZU5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRhYmxlTmFtZTsKLQkJfQotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sdW1uTWFwcGluZyBnZXRDb2x1bW5NYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRDb2x1bW5NYXBwaW5nKGdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5pc1ZpcnR1YWwodGhpcyk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5hdHRyaWJ1dGVPdmVycmlkZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiB0ZXh0UmFuZ2UgPT0gbnVsbCA/IGdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSA6IHRleHRSYW5nZTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqKiogSVhtbENvbHVtbi5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZENvbHVtblJlc291cmNlKCkgewotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW5JbXBsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5SZXNvdXJjZSgpIHsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZS5zZXRDb2x1bW4obnVsbCk7Ci0JfQotCQotCQotCS8vKioqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlOwotCQl0aGlzLm5hbWUgPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCk7Ci0JCXRoaXMuY29sdW1uLmluaXRpYWxpemUoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlOwotCQl0aGlzLnNldE5hbWVfKGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZShhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQotCQlhZGRDb2x1bW5NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbHVtbk1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCU9ybUNvbHVtbiBjb2x1bW4gPSBnZXRDb2x1bW4oKTsKLQkJU3RyaW5nIHRhYmxlID0gY29sdW1uLmdldFRhYmxlKCk7Ci0JCWJvb2xlYW4gZG9Db250aW51ZSA9IGNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmIGdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlKSkgewotCQkJaWYgKGlzVmlydHVhbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2dldE5hbWUoKSwgdGFibGUsIGNvbHVtbi5nZXROYW1lKCl9LAotCQkJCQkJY29sdW1uLCAKLQkJCQkJCWNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlLCBjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQkJY29sdW1uLAotCQkJCQkJCWNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSgpKQotCQkJCQkpOwotCQkJfQotCQkJZG9Db250aW51ZSA9IGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoZG9Db250aW51ZSAmJiAhY29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJaWYgKGlzVmlydHVhbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpLCBjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sCi0JCQkJCQljb2x1bW4uZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQkJY29sdW1uLAotCQkJCQkJCWNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUJhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1CYXNpY01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2MzRlMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUJhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk51bGxhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtQmFzaWNNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFhtbEJhc2ljPgotCWltcGxlbWVudHMgT3JtQmFzaWNNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUNvbHVtbiBjb2x1bW47Ci0JCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaDsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE9wdGlvbmFsOwotCQotCXByb3RlY3RlZCBFbnVtVHlwZSBzcGVjaWZpZWRFbnVtZXJhdGVkOwotCQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHRlbXBvcmFsOwotCQotCXByb3RlY3RlZCBib29sZWFuIGxvYjsKLQkKLQlwdWJsaWMgR2VuZXJpY09ybUJhc2ljTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUNvbHVtbih0aGlzLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkRmV0Y2goKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEZldGNoKCkgOiB0aGlzLmdldFNwZWNpZmllZEZldGNoKCk7Ci0JfQotCi0JcHVibGljIEZldGNoVHlwZSBnZXREZWZhdWx0RmV0Y2goKSB7Ci0JCXJldHVybiBCYXNpY01hcHBpbmcuREVGQVVMVF9GRVRDSF9UWVBFOwotCX0KLQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0U3BlY2lmaWVkRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEZldGNoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUgbmV3U3BlY2lmaWVkRmV0Y2gpIHsKLQkJRmV0Y2hUeXBlIG9sZEZldGNoID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IG5ld1NwZWNpZmllZEZldGNoOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRGZXRjaChGZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZEZldGNoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRmV0Y2hhYmxlLlNQRUNJRklFRF9GRVRDSF9QUk9QRVJUWSwgb2xkRmV0Y2gsIG5ld1NwZWNpZmllZEZldGNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaF8oRmV0Y2hUeXBlIG5ld1NwZWNpZmllZEZldGNoKSB7Ci0JCUZldGNoVHlwZSBvbGRGZXRjaCA9IHRoaXMuc3BlY2lmaWVkRmV0Y2g7Ci0JCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSBuZXdTcGVjaWZpZWRGZXRjaDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGRGZXRjaCwgbmV3U3BlY2lmaWVkRmV0Y2gpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdE9wdGlvbmFsKCkgOiB0aGlzLmdldFNwZWNpZmllZE9wdGlvbmFsKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIE51bGxhYmxlLkRFRkFVTFRfT1BUSU9OQUw7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuIG5ld1NwZWNpZmllZE9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkT3B0aW9uYWwgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gbmV3U3BlY2lmaWVkT3B0aW9uYWw7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldE9wdGlvbmFsKG5ld1NwZWNpZmllZE9wdGlvbmFsKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOdWxsYWJsZS5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIG9sZE9wdGlvbmFsLCBuZXdTcGVjaWZpZWRPcHRpb25hbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsXyhCb29sZWFuIG5ld1NwZWNpZmllZE9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkT3B0aW9uYWwgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gbmV3U3BlY2lmaWVkT3B0aW9uYWw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTnVsbGFibGUuU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBvbGRPcHRpb25hbCwgbmV3U3BlY2lmaWVkT3B0aW9uYWwpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTG9iKCkgewotCQlyZXR1cm4gdGhpcy5sb2I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9iKGJvb2xlYW4gbmV3TG9iKSB7Ci0JCWJvb2xlYW4gb2xkTG9iID0gdGhpcy5sb2I7Ci0JCXRoaXMubG9iID0gbmV3TG9iOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRMb2IobmV3TG9iKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNpY01hcHBpbmcuTE9CX1BST1BFUlRZLCBvbGRMb2IsIG5ld0xvYik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldExvYl8oYm9vbGVhbiBuZXdMb2IpIHsKLQkJYm9vbGVhbiBvbGRMb2IgPSB0aGlzLmxvYjsKLQkJdGhpcy5sb2IgPSBuZXdMb2I7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzaWNNYXBwaW5nLkxPQl9QUk9QRVJUWSwgb2xkTG9iLCBuZXdMb2IpOwotCX0KLQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7Ci0JCXJldHVybiB0aGlzLnRlbXBvcmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkgewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0aGlzLnRlbXBvcmFsOwotCQl0aGlzLnRlbXBvcmFsID0gbmV3VGVtcG9yYWw7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3VGVtcG9yYWwpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDb2x1bW5NYXBwaW5nLlRFTVBPUkFMX1BST1BFUlRZLCBvbGRUZW1wb3JhbCwgbmV3VGVtcG9yYWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRlbXBvcmFsXyhUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpIHsKLQkJVGVtcG9yYWxUeXBlIG9sZFRlbXBvcmFsID0gdGhpcy50ZW1wb3JhbDsKLQkJdGhpcy50ZW1wb3JhbCA9IG5ld1RlbXBvcmFsOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENvbHVtbk1hcHBpbmcuVEVNUE9SQUxfUFJPUEVSVFksIG9sZFRlbXBvcmFsLCBuZXdUZW1wb3JhbCk7Ci0JfQotCQotCXB1YmxpYyBFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0RW51bWVyYXRlZCgpIDogdGhpcy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCk7Ci0JfQotCQotCXB1YmxpYyBFbnVtVHlwZSBnZXREZWZhdWx0RW51bWVyYXRlZCgpIHsKLQkJcmV0dXJuIEJhc2ljTWFwcGluZy5ERUZBVUxUX0VOVU1FUkFURUQ7Ci0JfQotCQotCXB1YmxpYyBFbnVtVHlwZSBnZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRFbnVtZXJhdGVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlIG5ld1NwZWNpZmllZEVudW1lcmF0ZWQpIHsKLQkJRW51bVR5cGUgb2xkRW51bWVyYXRlZCA9IHRoaXMuc3BlY2lmaWVkRW51bWVyYXRlZDsKLQkJdGhpcy5zcGVjaWZpZWRFbnVtZXJhdGVkID0gbmV3U3BlY2lmaWVkRW51bWVyYXRlZDsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0RW51bWVyYXRlZChFbnVtVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRW51bWVyYXRlZCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2ljTWFwcGluZy5TUEVDSUZJRURfRU5VTUVSQVRFRF9QUk9QRVJUWSwgb2xkRW51bWVyYXRlZCwgbmV3U3BlY2lmaWVkRW51bWVyYXRlZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEVudW1lcmF0ZWRfKEVudW1UeXBlIG5ld1NwZWNpZmllZEVudW1lcmF0ZWQpIHsKLQkJRW51bVR5cGUgb2xkRW51bWVyYXRlZCA9IHRoaXMuc3BlY2lmaWVkRW51bWVyYXRlZDsKLQkJdGhpcy5zcGVjaWZpZWRFbnVtZXJhdGVkID0gbmV3U3BlY2lmaWVkRW51bWVyYXRlZDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNpY01hcHBpbmcuU1BFQ0lGSUVEX0VOVU1FUkFURURfUFJPUEVSVFksIG9sZEVudW1lcmF0ZWQsIG5ld1NwZWNpZmllZEVudW1lcmF0ZWQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybUJhc2ljTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tWG1sQ29sdW1uTWFwcGluZyhPcm1Db2x1bW5NYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21YbWxDb2x1bW5NYXBwaW5nKG9sZE1hcHBpbmcpOwotCQlzZXRUZW1wb3JhbChvbGRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlnZXRDb2x1bW4oKS5pbml0aWFsaXplRnJvbShvbGRNYXBwaW5nLmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gMjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIE9ybUNvbHVtbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewkJCi0JCXJldHVybiBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxCYXNpYyBiYXNpYykgewotCQlzdXBlci5pbml0aWFsaXplKGJhc2ljKTsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IHRoaXMuc3BlY2lmaWVkRmV0Y2goYmFzaWMpOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gdGhpcy5zcGVjaWZpZWRPcHRpb25hbChiYXNpYyk7Ci0JCXRoaXMuc3BlY2lmaWVkRW51bWVyYXRlZCA9IHRoaXMuc3BlY2lmaWVkRW51bWVyYXRlZChiYXNpYyk7Ci0JCXRoaXMudGVtcG9yYWwgPSB0aGlzLnNwZWNpZmllZFRlbXBvcmFsKGJhc2ljKTsKLQkJdGhpcy5sb2IgPSBzcGVjaWZpZWRMb2IoYmFzaWMpOwotCQl0aGlzLmNvbHVtbi5pbml0aWFsaXplKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEJhc2ljIGJhc2ljKSB7Ci0JCXN1cGVyLnVwZGF0ZShiYXNpYyk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRmV0Y2hfKHRoaXMuc3BlY2lmaWVkRmV0Y2goYmFzaWMpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRPcHRpb25hbF8odGhpcy5zcGVjaWZpZWRPcHRpb25hbChiYXNpYykpOwotCQl0aGlzLnNldFNwZWNpZmllZEVudW1lcmF0ZWRfKHRoaXMuc3BlY2lmaWVkRW51bWVyYXRlZChiYXNpYykpOwotCQl0aGlzLnNldFRlbXBvcmFsXyh0aGlzLnNwZWNpZmllZFRlbXBvcmFsKGJhc2ljKSk7Ci0JCXRoaXMuc2V0TG9iXyh0aGlzLnNwZWNpZmllZExvYihiYXNpYykpOwotCQl0aGlzLmNvbHVtbi51cGRhdGUoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRPcHRpb25hbChYbWxCYXNpYyBiYXNpYykgewotCQlyZXR1cm4gYmFzaWMuZ2V0T3B0aW9uYWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaChYbWxCYXNpYyBiYXNpYykgewotCQlyZXR1cm4gRmV0Y2hUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKGJhc2ljLmdldEZldGNoKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRW51bVR5cGUgc3BlY2lmaWVkRW51bWVyYXRlZChYbWxCYXNpYyBiYXNpYykgewotCQlyZXR1cm4gRW51bVR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoYmFzaWMuZ2V0RW51bWVyYXRlZCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSBzcGVjaWZpZWRUZW1wb3JhbChYbWxCYXNpYyBiYXNpYykgewotCQlyZXR1cm4gVGVtcG9yYWxUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKGJhc2ljLmdldFRlbXBvcmFsKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNwZWNpZmllZExvYihYbWxCYXNpYyBiYXNpYykgewotCQlyZXR1cm4gYmFzaWMuaXNMb2IoKTsKLQl9Ci0JCi0JcHVibGljIFhtbEJhc2ljIGFkZFRvUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCVhtbEJhc2ljIGJhc2ljID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQmFzaWNJbXBsKCk7Ci0JCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pbml0aWFsaXplKGJhc2ljKTsKLQkJdHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmFkZChiYXNpYyk7Ci0JCXJldHVybiBiYXNpYzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkucmVtb3ZlKHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpKTsKLQkJaWYgKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJdHlwZU1hcHBpbmcuc2V0QXR0cmlidXRlcyhudWxsKTsKLQkJfQotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKioqIElYbWxDb2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRDb2x1bW4oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW5JbXBsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5SZXNvdXJjZSgpIHsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0Q29sdW1uKG51bGwpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJaWYgKGVudGl0eU93bmVkKCkpIHsKLQkJCWFkZENvbHVtbk1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlPcm1Db2x1bW4gY29sdW1uID0gZ2V0Q29sdW1uKCk7Ci0JCVN0cmluZyB0YWJsZSA9IGNvbHVtbi5nZXRUYWJsZSgpOwotCQlib29sZWFuIGRvQ29udGludWUgPSBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCQotCQlpZiAoZG9Db250aW51ZSAmJiBnZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZSkpIHsKLQkJCWlmIChnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpLCB0YWJsZSwgY29sdW1uLmdldE5hbWUoKX0sCi0JCQkJCQljb2x1bW4sIAotCQkJCQkJY29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0YWJsZSwgY29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJY29sdW1uLCAKLQkJCQkJCWNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCQlkb0NvbnRpbnVlID0gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmICEgY29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJaWYgKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2dldE5hbWUoKSwgY29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJY29sdW1uLCAKLQkJCQkJCWNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2NvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWNvbHVtbiwgCi0JCQkJCQljb2x1bW4uZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzY2NGZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUNvbHVtbiBleHRlbmRzIEFic3RyYWN0T3JtQmFzZUNvbHVtbjxYbWxDb2x1bW4+IGltcGxlbWVudHMgT3JtQ29sdW1uCi17Ci0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkTGVuZ3RoOwotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkUHJlY2lzaW9uOwotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkU2NhbGU7Ci0KLQlwdWJsaWMgR2VuZXJpY09ybUNvbHVtbihPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybUNvbHVtbi5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUNvbHVtbi5Pd25lciBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChPcm1Db2x1bW4uT3duZXIpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKENvbHVtbiBvbGRDb2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQ29sdW1uKTsKLQkJc2V0U3BlY2lmaWVkTGVuZ3RoKG9sZENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCXNldFNwZWNpZmllZFByZWNpc2lvbihvbGRDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlzZXRTcGVjaWZpZWRTY2FsZShvbGRDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0TGVuZ3RoKCkgOiB0aGlzLmdldFNwZWNpZmllZExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRMZW5ndGgoKSB7Ci0JCXJldHVybiBDb2x1bW4uREVGQVVMVF9MRU5HVEg7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIgbmV3U3BlY2lmaWVkTGVuZ3RoKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gbmV3U3BlY2lmaWVkTGVuZ3RoOwotCQlpZiAob2xkU3BlY2lmaWVkTGVuZ3RoICE9IG5ld1NwZWNpZmllZExlbmd0aCkgewotCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLnNldExlbmd0aChuZXdTcGVjaWZpZWRMZW5ndGgpOwotCQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdTcGVjaWZpZWRMZW5ndGggIT0gbnVsbCkgewotCQkJCWFkZENvbHVtblJlc291cmNlKCk7Ci0JCQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRMZW5ndGgobmV3U3BlY2lmaWVkTGVuZ3RoKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZFNwZWNpZmllZExlbmd0aCwgbmV3U3BlY2lmaWVkTGVuZ3RoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoXyhJbnRlZ2VyIG5ld1NwZWNpZmllZExlbmd0aCkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZExlbmd0aCA9IHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IG5ld1NwZWNpZmllZExlbmd0aDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRMZW5ndGgsIG5ld1NwZWNpZmllZExlbmd0aCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0UHJlY2lzaW9uKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0UHJlY2lzaW9uKCkgOiB0aGlzLmdldFNwZWNpZmllZFByZWNpc2lvbigpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiBDb2x1bW4uREVGQVVMVF9QUkVDSVNJT047Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyIG5ld1NwZWNpZmllZFByZWNpc2lvbikgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZFByZWNpc2lvbiA9IHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uOwotCQl0aGlzLnNwZWNpZmllZFByZWNpc2lvbiA9IG5ld1NwZWNpZmllZFByZWNpc2lvbjsKLQkJaWYgKG9sZFNwZWNpZmllZFByZWNpc2lvbiAhPSBuZXdTcGVjaWZpZWRQcmVjaXNpb24pIHsKLQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRQcmVjaXNpb24obmV3U3BlY2lmaWVkUHJlY2lzaW9uKTsKLQkJCQlpZiAodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZUNvbHVtblJlc291cmNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkUHJlY2lzaW9uICE9IG51bGwpIHsKLQkJCQlhZGRDb2x1bW5SZXNvdXJjZSgpOwotCQkJCWdldENvbHVtblJlc291cmNlKCkuc2V0UHJlY2lzaW9uKG5ld1NwZWNpZmllZFByZWNpc2lvbik7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUFJFQ0lTSU9OX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRQcmVjaXNpb24sIG5ld1NwZWNpZmllZFByZWNpc2lvbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFByZWNpc2lvbl8oSW50ZWdlciBuZXdTcGVjaWZpZWRQcmVjaXNpb24pIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRQcmVjaXNpb24gPSB0aGlzLnNwZWNpZmllZFByZWNpc2lvbjsKLQkJdGhpcy5zcGVjaWZpZWRQcmVjaXNpb24gPSBuZXdTcGVjaWZpZWRQcmVjaXNpb247Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1BSRUNJU0lPTl9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUHJlY2lzaW9uLCBuZXdTcGVjaWZpZWRQcmVjaXNpb24pOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNjYWxlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkU2NhbGUoKSA9PSBudWxsKSA/IGdldERlZmF1bHRTY2FsZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRTY2FsZSgpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRTY2FsZSgpIHsKLQkJcmV0dXJuIENvbHVtbi5ERUZBVUxUX1NDQUxFOwotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRTY2FsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NhbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlciBuZXdTcGVjaWZpZWRTY2FsZSkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZFNjYWxlID0gdGhpcy5zcGVjaWZpZWRTY2FsZTsKLQkJdGhpcy5zcGVjaWZpZWRTY2FsZSA9IG5ld1NwZWNpZmllZFNjYWxlOwotCQlpZiAob2xkU3BlY2lmaWVkU2NhbGUgIT0gbmV3U3BlY2lmaWVkU2NhbGUpIHsKLQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRTY2FsZShuZXdTcGVjaWZpZWRTY2FsZSk7Ci0JCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVDb2x1bW5SZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZFNjYWxlICE9IG51bGwpIHsKLQkJCQlhZGRDb2x1bW5SZXNvdXJjZSgpOwotCQkJCWdldENvbHVtblJlc291cmNlKCkuc2V0U2NhbGUobmV3U3BlY2lmaWVkU2NhbGUpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDQUxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTY2FsZSwgbmV3U3BlY2lmaWVkU2NhbGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNjYWxlXyhJbnRlZ2VyIG5ld1NwZWNpZmllZFNjYWxlKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkU2NhbGUgPSB0aGlzLnNwZWNpZmllZFNjYWxlOwotCQl0aGlzLnNwZWNpZmllZFNjYWxlID0gbmV3U3BlY2lmaWVkU2NhbGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDQUxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTY2FsZSwgbmV3U3BlY2lmaWVkU2NhbGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxDb2x1bW4gZ2V0Q29sdW1uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldENvbHVtblJlc291cmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZENvbHVtblJlc291cmNlKCkgewotCQlnZXRPd25lcigpLmFkZENvbHVtblJlc291cmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbHVtblJlc291cmNlKCkgewotCQlnZXRPd25lcigpLnJlbW92ZUNvbHVtblJlc291cmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sQ29sdW1uIGNvbHVtbikgewotCQlzdXBlci5pbml0aWFsaXplKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5zcGVjaWZpZWRMZW5ndGgoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWRQcmVjaXNpb24gPSB0aGlzLnNwZWNpZmllZFByZWNpc2lvbihjb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFNjYWxlID0gdGhpcy5zcGVjaWZpZWRTY2FsZShjb2x1bW4pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sQ29sdW1uIGNvbHVtbikgewotCQlzdXBlci51cGRhdGUoY29sdW1uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGhfKHRoaXMuc3BlY2lmaWVkTGVuZ3RoKGNvbHVtbikpOwotCQl0aGlzLnNldFNwZWNpZmllZFByZWNpc2lvbl8odGhpcy5zcGVjaWZpZWRQcmVjaXNpb24oY29sdW1uKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2NhbGVfKHRoaXMuc3BlY2lmaWVkU2NhbGUoY29sdW1uKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkTGVuZ3RoKFhtbENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRQcmVjaXNpb24oWG1sQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gY29sdW1uID09IG51bGwgPyBudWxsIDogY29sdW1uLmdldFByZWNpc2lvbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRTY2FsZShYbWxDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBjb2x1bW4uZ2V0U2NhbGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2Y4NjY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtRGlzY3JpbWluYXRvckNvbHVtbiBleHRlbmRzIEFic3RyYWN0T3JtTmFtZWRDb2x1bW48WG1sRGlzY3JpbWluYXRvckNvbHVtbj4KLQlpbXBsZW1lbnRzIE9ybURpc2NyaW1pbmF0b3JDb2x1bW4KLXsKLQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBzcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQkKLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlOwotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkTGVuZ3RoOwotCi0JcHJvdGVjdGVkIFhtbEVudGl0eSBlbnRpdHk7Ci0JCi0JcHVibGljIEdlbmVyaWNPcm1EaXNjcmltaW5hdG9yQ29sdW1uKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3JtTmFtZWRDb2x1bW4uT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JfQotCi0JcHVibGljIERpc2NyaW1pbmF0b3JUeXBlIGdldERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgOiB0aGlzLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JfQotCi0JcHVibGljIERpc2NyaW1pbmF0b3JUeXBlIGdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuIERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEU7Ci0JfQotCQkKLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZSBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSkgewotCQlEaXNjcmltaW5hdG9yVHlwZSBvbGREaXNjcmltaW5hdG9yVHlwZSA9IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUgPSBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQkJaWYgKG9sZERpc2NyaW1pbmF0b3JUeXBlICE9IG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCQlpZiAodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldENvbHVtblJlc291cmNlKCkuc2V0RGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKSk7Ci0JCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVDb2x1bW5SZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlICE9IG51bGwpIHsKLQkJCQlhZGRDb2x1bW5SZXNvdXJjZSgpOwotCQkJCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkRGlzY3JpbWluYXRvclR5cGUsIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGVfKERpc2NyaW1pbmF0b3JUeXBlIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCURpc2NyaW1pbmF0b3JUeXBlIG9sZERpc2NyaW1pbmF0b3JUeXBlID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkRGlzY3JpbWluYXRvclR5cGUsIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKTsKLQl9Ci0JCQotCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZExlbmd0aCgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0TGVuZ3RoKCkgOiB0aGlzLmdldFNwZWNpZmllZExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRMZW5ndGgoKSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RIOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyIG5ld1NwZWNpZmllZExlbmd0aCkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZExlbmd0aCA9IHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IG5ld1NwZWNpZmllZExlbmd0aDsKLQkJaWYgKG9sZFNwZWNpZmllZExlbmd0aCAhPSBuZXdTcGVjaWZpZWRMZW5ndGgpIHsKLQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRMZW5ndGgobmV3U3BlY2lmaWVkTGVuZ3RoKTsKLQkJCQlpZiAodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZUNvbHVtblJlc291cmNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkTGVuZ3RoICE9IG51bGwpIHsKLQkJCQlhZGRDb2x1bW5SZXNvdXJjZSgpOwotCQkJCWdldENvbHVtblJlc291cmNlKCkuc2V0TGVuZ3RoKG5ld1NwZWNpZmllZExlbmd0aCk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRMZW5ndGgsIG5ld1NwZWNpZmllZExlbmd0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoXyhJbnRlZ2VyIG5ld1NwZWNpZmllZExlbmd0aCkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZExlbmd0aCA9IHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IG5ld1NwZWNpZmllZExlbmd0aDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRMZW5ndGgsIG5ld1NwZWNpZmllZExlbmd0aCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB0YWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5nZXRUYWJsZU5hbWUoKTsKLQl9Ci0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sRGlzY3JpbWluYXRvckNvbHVtbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCXRoaXMuZW50aXR5LnNldERpc2NyaW1pbmF0b3JDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRGlzY3JpbWluYXRvckNvbHVtbigpKTsJCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb2x1bW5SZXNvdXJjZSgpIHsKLQkJdGhpcy5lbnRpdHkuc2V0RGlzY3JpbWluYXRvckNvbHVtbihudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCXRoaXMuZW50aXR5ID0gZW50aXR5OwotCQl0aGlzLmluaXRpYWxpemUodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEVudGl0eSBlbnRpdHkpIHsKLQkJdGhpcy5lbnRpdHkgPSBlbnRpdHk7Ci0JCXRoaXMudXBkYXRlKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKSk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxEaXNjcmltaW5hdG9yQ29sdW1uIGNvbHVtbikgewotCQlzdXBlci5pbml0aWFsaXplKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5zcGVjaWZpZWRMZW5ndGgoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoY29sdW1uKTsKLQkJLy9UT0RPIGRlZmF1bHRMZW5ndGgsIGRpc2NyaW1pbmF0b3IgdHlwZSBqYXZhIGNvbHVtbgotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoWG1sRGlzY3JpbWluYXRvckNvbHVtbiBjb2x1bW4pIHsKLQkJc3VwZXIudXBkYXRlKGNvbHVtbik7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTGVuZ3RoXyh0aGlzLnNwZWNpZmllZExlbmd0aChjb2x1bW4pKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZV8odGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShjb2x1bW4pKTsKLQkJLy9UT0RPIGRlZmF1bHRMZW5ndGgsIHNjYWxlLCBwcmVjaXNpb24gZnJvbSBqYXZhIGNvbHVtbgotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRMZW5ndGgoWG1sRGlzY3JpbWluYXRvckNvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5nZXRMZW5ndGgoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIHNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKFhtbERpc2NyaW1pbmF0b3JDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBEaXNjcmltaW5hdG9yVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbChjb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzdlNDk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1FbWJlZGRhYmxlIGV4dGVuZHMgQWJzdHJhY3RPcm1UeXBlTWFwcGluZzxYbWxFbWJlZGRhYmxlPiBpbXBsZW1lbnRzIE9ybUVtYmVkZGFibGUKLXsKLQlwdWJsaWMgR2VuZXJpY09ybUVtYmVkZGFibGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAyOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKFN0cmluZyBhdHRyaWJ1dGVNYXBwaW5nS2V5KSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSB8fCBhdHRyaWJ1dGVNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZShYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGUpIHsKLQkJcmV0dXJuIGVtYmVkZGFibGUuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQllbnRpdHlNYXBwaW5ncy5nZXRFbWJlZGRhYmxlcygpLnJlbW92ZSh0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKSk7Ci0JfQotCi0JcHVibGljIFhtbEVtYmVkZGFibGUgYWRkVG9SZXNvdXJjZU1vZGVsKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVtYmVkZGFibGUoKTsKLQkJZ2V0UGVyc2lzdGVudFR5cGUoKS5pbml0aWFsaXplKGVtYmVkZGFibGUpOwotCQllbnRpdHlNYXBwaW5ncy5nZXRFbWJlZGRhYmxlcygpLmFkZChlbWJlZGRhYmxlKTsKLQkJcmV0dXJuIGVtYmVkZGFibGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZElkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZElkTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzliMjM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkZWRJZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQ7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1FbWJlZGRlZElkTWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZzxYbWxFbWJlZGRlZElkPiBpbXBsZW1lbnRzIE9ybUVtYmVkZGVkSWRNYXBwaW5nCi17Ci0KLQlwdWJsaWMgR2VuZXJpY09ybUVtYmVkZGVkSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtRW1iZWRkZWRJZE1hcHBpbmcodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAxOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKiBBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0lkTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFhtbEVtYmVkZGVkSWQgYWRkVG9SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW1iZWRkZWRJZEltcGwoKTsKLQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmluaXRpYWxpemUoZW1iZWRkZWRJZCk7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmFkZChlbWJlZGRlZElkKTsKLQkJcmV0dXJuIGVtYmVkZGVkSWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJdHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkucmVtb3ZlKHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpKTsKLQkJaWYgKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJdHlwZU1hcHBpbmcuc2V0QXR0cmlidXRlcyhudWxsKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbEVtYmVkZGVkSWQgZW1iZWRkZWQpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShlbWJlZGRlZCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxFbWJlZGRlZElkIGVtYmVkZGVkKSB7Ci0JCXN1cGVyLnVwZGF0ZShlbWJlZGRlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZDAxZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZzxYbWxFbWJlZGRlZD4gaW1wbGVtZW50cyBPcm1FbWJlZGRlZE1hcHBpbmcKLXsKLQkKLQlwdWJsaWMgR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybUVtYmVkZGVkTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gODsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgWG1sRW1iZWRkZWQgYWRkVG9SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWQgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbWJlZGRlZEltcGwoKTsKLQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmluaXRpYWxpemUoZW1iZWRkZWQpOwotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuYWRkKGVtYmVkZGVkKTsKLQkJcmV0dXJuIGVtYmVkZGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJdHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLnJlbW92ZSh0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCWlmICh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCXR5cGVNYXBwaW5nLnNldEF0dHJpYnV0ZXMobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxFbWJlZGRlZCBlbWJlZGRlZCkgewotCQlzdXBlci5pbml0aWFsaXplKGVtYmVkZGVkKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEVtYmVkZGVkIGVtYmVkZGVkKSB7Ci0JCXN1cGVyLnVwZGF0ZShlbWJlZGRlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYTM3YzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZENsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUVudGl0eSBleHRlbmRzIEFic3RyYWN0T3JtVHlwZU1hcHBpbmc8WG1sRW50aXR5PiBpbXBsZW1lbnRzIE9ybUVudGl0eQotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkQ2xhc3M7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtVGFibGUgdGFibGU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1TZWNvbmRhcnlUYWJsZT4gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVNlY29uZGFyeVRhYmxlPiB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0KLQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIHNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3k7Ci0JCi0JcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBkZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZDsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1EaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW47Ci0KLQlwcm90ZWN0ZWQgT3JtU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0KLQlwcm90ZWN0ZWQgT3JtVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3I7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXM7Ci0KLQlwdWJsaWMgR2VuZXJpY09ybUVudGl0eShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy50YWJsZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVRhYmxlKHRoaXMpOwotCQl0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcyA9IG5ldyBBcnJheUxpc3Q8T3JtU2Vjb25kYXJ5VGFibGU+KCk7Ci0JCXRoaXMudmlydHVhbFNlY29uZGFyeVRhYmxlcyA9IG5ldyBBcnJheUxpc3Q8T3JtU2Vjb25kYXJ5VGFibGU+KCk7Ci0JCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbiA9IGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEFycmF5TGlzdDxPcm1BdHRyaWJ1dGVPdmVycmlkZT4oKTsKLQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEFycmF5TGlzdDxPcm1BdHRyaWJ1dGVPdmVycmlkZT4oKTsKLQkJdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4oKTsKLQkJdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgQXJyYXlMaXN0PE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+KCk7Ci0JCXRoaXMubmFtZWRRdWVyaWVzID0gbmV3IEFycmF5TGlzdDxPcm1OYW1lZFF1ZXJ5PigpOwotCQl0aGlzLm5hbWVkTmF0aXZlUXVlcmllcyA9IG5ldyBBcnJheUxpc3Q8T3JtTmFtZWROYXRpdmVRdWVyeT4oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybURpc2NyaW1pbmF0b3JDb2x1bW4gYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uKCkgewotCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtRGlzY3JpbWluYXRvckNvbHVtbih0aGlzLCBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybU5hbWVkQ29sdW1uLk93bmVyIGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybU5hbWVkQ29sdW1uLk93bmVyKCl7Ci0JCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJCXJldHVybiBHZW5lcmljT3JtRW50aXR5LnRoaXMuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQkJfQotCi0JCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQkJcmV0dXJuIEdlbmVyaWNPcm1FbnRpdHkudGhpczsKLQkJCX0KLQkJCQotCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKLQkJCQkvL1RPRE8gZGVmYXVsdCBjb2x1bW4gbmFtZSBmcm9tIGphdmEgaGVyZSBvciBpbiBYbWxEaXNjcmltaW5hdG9yQ29sdW1uPwotCQkJCXJldHVybiBEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRTsKLQkJCX0KLQkJCQotCQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQl9OwotCX0KLQotCS8vICoqKioqKioqKioqKioqKioqKiogSVR5cGVNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZOwotCX0JCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFRhYmxlKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldFByaW1hcnlEYlRhYmxlKCkgewotCQlyZXR1cm4gZ2V0VGFibGUoKS5nZXREYlRhYmxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlW10gRU1QVFlfREJfVEFCTEVfQVJSQVkgPSBuZXcgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlWzBdOwotCi0JQE92ZXJyaWRlCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJLy8gdGhlIEpQQSBwbGF0Zm9ybSBzZWFyY2hlcyBkYXRhYmFzZSBvYmplY3RzIGZvciB1cwotCQlyZXR1cm4gdGhpcy5nZXREYXRhU291cmNlKCkuZ2V0RGF0YWJhc2VPYmplY3ROYW1lZCgKLQkJCQkJCUNvbGxlY3Rpb25Ub29scy5hcnJheSh0aGlzLmFzc29jaWF0ZWREYlRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpLCBFTVBUWV9EQl9UQUJMRV9BUlJBWSksCi0JCQkJCQl0YWJsZU5hbWUKLQkJCQkJKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZT4gYXNzb2NpYXRlZERiVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSwgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlPih0aGlzLmFzc29jaWF0ZWREYlRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZF8oKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQob3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIHQpIHsKLQkJCQlyZXR1cm4gdCAhPSBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8b3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlPiBhc3NvY2lhdGVkRGJUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWRfKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VGFibGUsIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZT4odGhpcy5hc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSB0cmFuc2Zvcm0oVGFibGUgdCkgewotCQkJCXJldHVybiB0LmdldERiVGFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKLQkJcmV0dXJuIGdldFRhYmxlKCkuZ2V0RGJTY2hlbWEoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFFbnRpdHkgZ2V0SmF2YUVudGl0eSgpIHsKLQkJaWYgKHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwgJiYgdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKSB7Ci0JCQlyZXR1cm4gKEphdmFFbnRpdHkpIHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0TmFtZSgpIDogdGhpcy5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7Ci0JCXRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLnNldE5hbWUobmV3U3BlY2lmaWVkTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE5hbWUsIG5ld1NwZWNpZmllZE5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHROYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHROYW1lKFN0cmluZyBuZXdEZWZhdWx0TmFtZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdE5hbWUgPSB0aGlzLmRlZmF1bHROYW1lOwotCQl0aGlzLmRlZmF1bHROYW1lID0gbmV3RGVmYXVsdE5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9OQU1FX1BST1BFUlRZLCBvbGREZWZhdWx0TmFtZSwgbmV3RGVmYXVsdE5hbWUpOwotCX0KLQotCXB1YmxpYyBPcm1UYWJsZSBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGU7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzKCkgewotCQlpZiAoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpID4gMCkgewotCQkJcmV0dXJuIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQl9Ci0JCXJldHVybiB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCk7Ci0JfQotCi0JcHVibGljIGludCBzZWNvbmRhcnlUYWJsZXNTaXplKCkgewotCQlpZiAoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpID4gMCkgewotCQkJcmV0dXJuIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkJfQotCQlyZXR1cm4gdmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gdmlydHVhbFNlY29uZGFyeVRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4odGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLnNpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmlydHVhbFNlY29uZGFyeVRhYmxlKE9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3Qoc2Vjb25kYXJ5VGFibGUsIHRoaXMudmlydHVhbFNlY29uZGFyeVRhYmxlcywgT3JtRW50aXR5LlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVmlydHVhbFNlY29uZGFyeVRhYmxlKE9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChzZWNvbmRhcnlUYWJsZSwgdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLCBPcm1FbnRpdHkuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4odGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE9ybVNlY29uZGFyeVRhYmxlIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCBpbmRleCkgewotCQlpZiAoIXNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJWaXJ0dWFsIHNlY29uZGFyeSB0YWJsZXMgZXhpc3QsIG11c3QgZmlyc3QgY2FsbCBzZXRTZWNvbmRhcnlUYWJsZXNEZWZpbmVkSW5YbWwodHJ1ZSkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZUltcGwoKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSAgYnVpbGRTZWNvbmRhcnlUYWJsZShzZWNvbmRhcnlUYWJsZVJlc291cmNlKTsKLQkJdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuYWRkKGluZGV4LCBzZWNvbmRhcnlUYWJsZSk7Ci0JCWdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5hZGQoaW5kZXgsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpOwotCQlmaXJlSXRlbUFkZGVkKEVudGl0eS5TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNULCBpbmRleCwgc2Vjb25kYXJ5VGFibGUpOwotCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCBpbmRleCwgT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgc2Vjb25kYXJ5VGFibGUsIHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLCBFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUodGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuaW5kZXhPZihzZWNvbmRhcnlUYWJsZSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgpIHsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgcmVtb3ZlZFNlY29uZGFyeVRhYmxlID0gdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMucmVtb3ZlKGluZGV4KTsKLQkJZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCwgaW5kZXgsIHJlbW92ZWRTZWNvbmRhcnlUYWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlXyhPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qoc2Vjb25kYXJ5VGFibGUsIHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLCBFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKEVudGl0eS5TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU2Vjb25kYXJ5VGFibGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zU2Vjb25kYXJ5VGFibGUobmFtZSwgc2Vjb25kYXJ5VGFibGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZFNlY29uZGFyeVRhYmxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjb250YWluc1NlY29uZGFyeVRhYmxlKG5hbWUsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNWaXJ0dWFsU2Vjb25kYXJ5VGFibGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zU2Vjb25kYXJ5VGFibGUobmFtZSwgdmlydHVhbFNlY29uZGFyeVRhYmxlcygpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNWaXJ0dWFsU2Vjb25kYXJ5VGFibGUoT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFNlY29uZGFyeVRhYmxlcy5jb250YWlucyhzZWNvbmRhcnlUYWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNTZWNvbmRhcnlUYWJsZShTdHJpbmcgbmFtZSwgTGlzdEl0ZXJhdG9yPE9ybVNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMpIHsKLQkJZm9yIChPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzZWNvbmRhcnlUYWJsZXMpKSB7Ci0JCQlTdHJpbmcgc2Vjb25kYXJ5VGFibGVOYW1lID0gc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpOwotCQkJaWYgKHNlY29uZGFyeVRhYmxlTmFtZSAhPSBudWxsICYmIHNlY29uZGFyeVRhYmxlTmFtZS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2Vjb25kYXJ5VGFibGVzRGVmaW5lZEluWG1sKCkgewotCQlyZXR1cm4gdmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKSA9PSAwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZWNvbmRhcnlUYWJsZXNEZWZpbmVkSW5YbWwoYm9vbGVhbiBkZWZpbmVJblhtbCkgewotCQlpZiAoZGVmaW5lSW5YbWwgPT0gc2Vjb25kYXJ5VGFibGVzRGVmaW5lZEluWG1sKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZGVmaW5lSW5YbWwpIHsKLQkJCXNwZWNpZnlTZWNvbmRhcnlUYWJsZXNJblhtbCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVtb3ZlU2Vjb25kYXJ5VGFibGVzRnJvbVhtbCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byB0YWtlIGFsbCB0aGUgamF2YSBzZWNvbmRhcnkgdGFibGVzIGFuZCBzcGVjaWZ5IHRoZW0gaW4gdGhlIHhtbC4gIFlvdSBtdXN0Ci0JICogdXNlIHNldFNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbChib29sZWFuKSBiZWZvcmUgY2FsbGluZyBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgpLgotCSAqIAotCSAqIFllcyB0aGlzIGNvZGUgbG9va3Mgb2RkLCBidXQgYmUgY2FyZWZ1bCBtYWtpbmcgY2hhbmdlcyB0byBpdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNwZWNpZnlTZWNvbmRhcnlUYWJsZXNJblhtbCgpIHsKLQkJaWYgKHZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCkgIT0gMCkgewotCQkJTGlzdDxPcm1TZWNvbmRhcnlUYWJsZT4gdmlydHVhbFNlY29uZGFyeVRhYmxlczEgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKSk7Ci0JCQlMaXN0PE9ybVNlY29uZGFyeVRhYmxlPiB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzMiA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMudmlydHVhbFNlY29uZGFyeVRhYmxlcygpKTsKLQkJCS8vcmVtb3ZlIGFsbCB0aGUgdmlydHVhbCBzZWNvbmRhcnkgdGFibGVzIHdpdGhvdXQgZmlyaW5nIGNoYW5nZSBub3RpZmljYXRpb24uCi0JCQlmb3IgKE9ybVNlY29uZGFyeVRhYmxlIHZpcnR1YWxTZWNvbmRhcnlUYWJsZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkpKSB7Ci0JCQkJdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLnJlbW92ZSh2aXJ0dWFsU2Vjb25kYXJ5VGFibGUpOwkJCQkKLQkJCX0KLQkJCS8vYWRkIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGVzIGZvciBlYWNoIHZpcnR1YWwgc2Vjb25kYXJ5IHRhYmxlLiBJZiB0aGUgdmlydHVhbCBzZWNvbmRhcnkgdGFibGVzCi0JCQkvL2FyZSBub3QgcmVtb3ZlZCBmaXJzdCwgdGhleSB3aWxsIGJlIHJlbW92ZWQgYXMgYSBzaWRlIGVmZmVjdCBvZiBhZGRpbmcgdGhlIGZpcnN0IHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGUuCi0JCQkvL1RoaXMgc2NyZXdzIHVwIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRvIHRoZSBVSSwgc2luY2UgdGhhdCBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlzIGluIGEgZGlmZmVyZW50IHRocmVhZAotCQkJZm9yIChPcm1TZWNvbmRhcnlUYWJsZSB2aXJ0dWFsU2Vjb25kYXJ5VGFibGUgOiB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzMikgewotCQkJCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZUltcGwoKTsKLQkJCQlPcm1TZWNvbmRhcnlUYWJsZSBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSA9ICBidWlsZFNlY29uZGFyeVRhYmxlKHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpOwotCQkJCXRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLmFkZChzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSk7Ci0JCQkJZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChzZWNvbmRhcnlUYWJsZVJlc291cmNlKTsKLQkJCQlzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZS5pbml0aWFsaXplRnJvbSh2aXJ0dWFsU2Vjb25kYXJ5VGFibGUpOwotCQkJfQotCQkJLy9maXJlIGNoYW5nZSBub3RpZmljYXRpb24gYXQgdGhlIGVuZAotCQkJZmlyZUl0ZW1zUmVtb3ZlZChPcm1FbnRpdHkuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVTX0xJU1QsIDAsIHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMxKTsKLQkJCWZpcmVJdGVtc0FkZGVkKEVudGl0eS5TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNULCAwLCB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcyk7CQkKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZWNvbmRhcnlUYWJsZXNGcm9tWG1sKCkgewotCQlpZiAoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpICE9IDApIHsKLQkJCUxpc3Q8T3JtU2Vjb25kYXJ5VGFibGU+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc0NvcHkgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpKTsKLQkJCWZvciAoT3JtU2Vjb25kYXJ5VGFibGUgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkpKSB7Ci0JCQkJaW50IGluZGV4ID0gdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuaW5kZXhPZihzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSk7Ci0JCQkJdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMucmVtb3ZlKHNwZWNpZmllZFNlY29uZGFyeVRhYmxlKTsKLQkJCQlpZiAodGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuc2l6ZSgpID09IDApIHsKLQkJCQkJaW5pdGlhbGl6ZVZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKTsKLQkJCQl9Ci0JCQkJZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZShpbmRleCk7Ci0JCQl9Ci0JCQlmaXJlSXRlbXNSZW1vdmVkKEVudGl0eS5TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNULCAwLCBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNDb3B5KTsKLQkJCWlmICh0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMuc2l6ZSgpICE9IDApIHsKLQkJCQlmaXJlSXRlbXNBZGRlZChPcm1FbnRpdHkuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVTX0xJU1QsIDAsIHRoaXMudmlydHVhbFNlY29uZGFyeVRhYmxlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdGFibGVOYW1lcyhJdGVyYXRvcjxUYWJsZT4gdGFibGVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUYWJsZSwgU3RyaW5nPih0YWJsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oVGFibGUgdCkgewotCQkJCXJldHVybiB0LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMubm9uTnVsbFRhYmxlTmFtZXModGhpcy5hc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IG5vbk51bGxUYWJsZU5hbWVzKEl0ZXJhdG9yPFRhYmxlPiB0YWJsZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy50YWJsZU5hbWVzKHRhYmxlcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBvKSB7Ci0JCQkJcmV0dXJuIG8gIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8VGFibGU+KHRoaXMuZ2V0VGFibGUoKSwgdGhpcy5zZWNvbmRhcnlUYWJsZXMoKSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFRhYmxlPihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUeXBlTWFwcGluZywgSXRlcmF0b3I8VGFibGU+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFRhYmxlPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgbWFwcGluZykgewotCQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8VGFibGUsIFRhYmxlPihtYXBwaW5nLmFzc29jaWF0ZWRUYWJsZXMoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFRhYmxlIG8pIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJLy9UT0RPCi0JCQkJCQkvL2ZpbHRlcmluZyB0aGVzZSBvdXQgc28gYXMgdG8gYXZvaWQgdGhlIGR1cGxpY2F0ZSB0YWJsZSwgcm9vdCBhbmQgY2hpbGRyZW4gc2hhcmUgdGhlIHNhbWUgdGFibGUKLQkJCQkJCS8vcmV0dXJuICEobyBpbnN0YW5jZW9mIFNpbmdsZVRhYmxlSW5oZXJpdGFuY2VDaGlsZFRhYmxlSW1wbCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gIUNvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCksIHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpIDogdGhpcy5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JfQotCQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgbmV3SW5oZXJpdGFuY2VUeXBlKSB7Ci0JCUluaGVyaXRhbmNlVHlwZSBvbGRJbmhlcml0YW5jZVR5cGUgPSB0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCQl0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gbmV3SW5oZXJpdGFuY2VUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5IRVJJVEFOQ0VfU1RSQVRFR1lfUFJPUEVSVFksIG9sZEluaGVyaXRhbmNlVHlwZSwgbmV3SW5oZXJpdGFuY2VUeXBlKTsKLQl9Ci0JCi0JcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZSBuZXdJbmhlcml0YW5jZVR5cGUpIHsKLQkJSW5oZXJpdGFuY2VUeXBlIG9sZEluaGVyaXRhbmNlVHlwZSA9IHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKLQkJdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gbmV3SW5oZXJpdGFuY2VUeXBlOwotCQlpZiAob2xkSW5oZXJpdGFuY2VUeXBlICE9IG5ld0luaGVyaXRhbmNlVHlwZSkgewotCQkJaWYgKHRoaXMuaW5oZXJpdGFuY2VSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmluaGVyaXRhbmNlUmVzb3VyY2UoKS5zZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld0luaGVyaXRhbmNlVHlwZSkpOwkJCQkJCQotCQkJCWlmICh0aGlzLmluaGVyaXRhbmNlUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVJbmhlcml0YW5jZVJlc291cmNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3SW5oZXJpdGFuY2VUeXBlICE9IG51bGwpIHsKLQkJCQlhZGRJbmhlcml0YW5jZVJlc291cmNlKCk7Ci0JCQkJaW5oZXJpdGFuY2VSZXNvdXJjZSgpLnNldFN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3SW5oZXJpdGFuY2VUeXBlKSk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfSU5IRVJJVEFOQ0VfU1RSQVRFR1lfUFJPUEVSVFksIG9sZEluaGVyaXRhbmNlVHlwZSwgbmV3SW5oZXJpdGFuY2VUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneV8oSW5oZXJpdGFuY2VUeXBlIG5ld0luaGVyaXRhbmNlVHlwZSkgewotCQlJbmhlcml0YW5jZVR5cGUgb2xkSW5oZXJpdGFuY2VUeXBlID0gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCQl0aGlzLnNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kgPSBuZXdJbmhlcml0YW5jZVR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZLCBvbGRJbmhlcml0YW5jZVR5cGUsIG5ld0luaGVyaXRhbmNlVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEluaGVyaXRhbmNlIGluaGVyaXRhbmNlUmVzb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0SW5oZXJpdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5oZXJpdGFuY2VSZXNvdXJjZSgpIHsKLQkJZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLnNldEluaGVyaXRhbmNlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaGVyaXRhbmNlKCkpOwkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUluaGVyaXRhbmNlUmVzb3VyY2UoKSB7Ci0JCWdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5zZXRJbmhlcml0YW5jZShudWxsKTsKLQl9Ci0KLQlwdWJsaWMgT3JtRGlzY3JpbWluYXRvckNvbHVtbiBnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uOwotCX0KLQotCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvciBhZGRTZXF1ZW5jZUdlbmVyYXRvcigpIHsKLQkJaWYgKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2VxdWVuY2VHZW5lcmF0b3IgYWxyZWFkeSBleGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1TZXF1ZW5jZUdlbmVyYXRvcih0aGlzKTsKLQkJZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLnNldFNlcXVlbmNlR2VuZXJhdG9yKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFksIG51bGwsIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3IpOwotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNlcXVlbmNlR2VuZXJhdG9yIGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgYmUgcmVtb3ZlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJT3JtU2VxdWVuY2VHZW5lcmF0b3Igb2xkU2VxdWVuY2VHZW5lcmF0b3IgPSB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gbnVsbDsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0U2VxdWVuY2VHZW5lcmF0b3IobnVsbCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRTZXF1ZW5jZUdlbmVyYXRvciwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoT3JtU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJT3JtU2VxdWVuY2VHZW5lcmF0b3Igb2xkU2VxdWVuY2VHZW5lcmF0b3IgPSB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gbmV3U2VxdWVuY2VHZW5lcmF0b3I7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRTZXF1ZW5jZUdlbmVyYXRvciwgbmV3U2VxdWVuY2VHZW5lcmF0b3IpOwotCX0KLQotCXB1YmxpYyBPcm1UYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcigpIHsKLQkJaWYgKGdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGFibGVHZW5lcmF0b3IgYWxyZWFkeSBleGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1UYWJsZUdlbmVyYXRvcih0aGlzKTsKLQkJZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLnNldFRhYmxlR2VuZXJhdG9yKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlR2VuZXJhdG9ySW1wbCgpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFksIG51bGwsIHRoaXMudGFibGVHZW5lcmF0b3IpOwotCQlyZXR1cm4gdGhpcy50YWJsZUdlbmVyYXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoKSB7Ci0JCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRhYmxlR2VuZXJhdG9yIGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgYmUgcmVtb3ZlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJT3JtVGFibGVHZW5lcmF0b3Igb2xkVGFibGVHZW5lcmF0b3IgPSB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCQl0aGlzLnRhYmxlR2VuZXJhdG9yID0gbnVsbDsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0VGFibGVHZW5lcmF0b3IobnVsbCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRUYWJsZUdlbmVyYXRvciwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBPcm1UYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVHZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVHZW5lcmF0b3IoT3JtVGFibGVHZW5lcmF0b3IgbmV3VGFibGVHZW5lcmF0b3IpIHsKLQkJT3JtVGFibGVHZW5lcmF0b3Igb2xkVGFibGVHZW5lcmF0b3IgPSB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCQl0aGlzLnRhYmxlR2VuZXJhdG9yID0gbmV3VGFibGVHZW5lcmF0b3I7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRUYWJsZUdlbmVyYXRvciwgbmV3VGFibGVHZW5lcmF0b3IpOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8T3JtR2VuZXJhdG9yPiBnZW5lcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPE9ybUdlbmVyYXRvcj4oCi0JCQkoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSA6IG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSksCi0JCQkoZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSA6IG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoZ2V0VGFibGVHZW5lcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKFN0cmluZyBuZXdEZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOwotCQl0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUgPSBuZXdEZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSwgbmV3RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoU3RyaW5nIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlID0gbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlOwotCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0RGlzY3JpbWluYXRvclZhbHVlKG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSwgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKCkgewotCQlyZXR1cm4gdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKGJvb2xlYW4gbmV3RGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCkgewotCQlib29sZWFuIG9sZERpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQgPSB0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQ7Ci0JCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCA9IG5ld0Rpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LkRJU0NSSU1JTkFUT1JfVkFMVUVfQUxMT1dFRF9QUk9QRVJUWSwgb2xkRGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCwgbmV3RGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKTsKLQl9Ci0JCi0JcHVibGljIGludCBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1c2UgZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpIGluc3RlYWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UGtKb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoZGVmYXVsdFBrSm9pbkNvbHVtbiwgdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLCBPcm1FbnRpdHkuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UGtKb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChkZWZhdWx0UGtKb2luQ29sdW1uLCB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIE9ybUVudGl0eS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpID8gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgOiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQkKLQlwdWJsaWMgaW50IHByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCkgPyB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyk7Ci0JfQotCi0JcHVibGljIGludCBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICF0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JfQkKLQotCXB1YmxpYyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJaWYgKCF0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuY2xlYXIoKTsKLQkJfQotCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpOwotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oeG1sUHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoaW5kZXgsIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKGluZGV4LCB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0KLQkJdGhpcy5maXJlSXRlbUFkZGVkKEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCXRoaXMuZmlyZUxpc3RDbGVhcmVkKE9ybUVudGl0eS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtQmFzZUpvaW5Db2x1bW4uT3duZXIgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4LCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmluZGV4T2YocHJpbWFyeUtleUpvaW5Db2x1bW4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHJlbW92ZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7Ci0JCWlmICghY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJLy9jcmVhdGUgdGhlIGRlZmF1bHRKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKLQkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKLQkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCi0JCQlpbml0aWFsaXplRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQl9Ci0JCXRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJaWYgKCF0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpKSB7Ci0JCQlmaXJlTGlzdENoYW5nZWQoT3JtRW50aXR5LkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5fKE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpICsgdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcywgRW50aXR5LlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLCBFbnRpdHkuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGUgc2V0QXR0cmlidXRlT3ZlcnJpZGVWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJaWYgKHZpcnR1YWwpIHsKLQkJCXJldHVybiBzZXRBdHRyaWJ1dGVPdmVycmlkZVZpcnR1YWwoYXR0cmlidXRlT3ZlcnJpZGUpOwotCQl9Ci0JCXJldHVybiBzZXRBdHRyaWJ1dGVPdmVycmlkZVNwZWNpZmllZChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBzZXRBdHRyaWJ1dGVPdmVycmlkZVZpcnR1YWwoT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaW5kZXhPZihhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZShpbmRleCk7Ci0JCVN0cmluZyBhdHRyaWJ1dGVPdmVycmlkZU5hbWUgPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCk7Ci0JCS8vYWRkIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZSBzbyB0aGF0IEkgY2FuIGNvbnRyb2wgdGhlIG9yZGVyIHRoYXQgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcyBzZW50LgotCQkvL290aGVyd2lzZSB3aGVuIHdlIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIGphdmEgd2Ugd2lsbCBnZXQgYW4gdXBkYXRlIGFuZCBhZGQgdGhlIGF0dHJpYnV0ZSBvdmVycmlkZQotCQkvL2R1cmluZyB0aGUgdWRwYXRlLiAgVGhpcyBjYXVzZXMgdGhlIFVJIHRvIGJlIGZsYWt5LCBzaW5jZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1pZ2h0IG5vdCBvY2N1ciBpbiB0aGUgY29ycmVjdCBvcmRlcgotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOwotCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGVOYW1lICE9IG51bGwpIHsKLQkJCWZvciAoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpKSkgewotCQkJCWlmIChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKS5lcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGVOYW1lKSkgewotCQkJCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgamF2YUF0dHJpYnV0ZU92ZXJyaWRlID0gbnVsbDsKLQkJCQkJaWYgKGdldEphdmFFbnRpdHkoKSAhPSBudWxsKSB7Ci0JCQkJCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGVPdmVycmlkZU5hbWUpOwotCQkJCQl9Ci0JCQkJCS8vc3RvcmUgdGhlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBzbyB3ZSBjYW4gZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGxhdGVyCi0JCQkJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGphdmFBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQkJCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKEVudGl0eS5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkKLQkJaWYgKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSAhPSBudWxsKSB7Ci0JCQlmaXJlSXRlbUFkZGVkKEVudGl0eS5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSAtIDEsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCX0KLQkJcmV0dXJuIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIHNldEF0dHJpYnV0ZU92ZXJyaWRlU3BlY2lmaWVkKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIG9sZEF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWludCBpbmRleCA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKTsKLQkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgeG1sQXR0cmlidXRlT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgbmV3QXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1BdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZU93bmVyKCksIHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGluZGV4LCBuZXdBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQotCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCi0JCWludCBkZWZhdWx0SW5kZXggPSB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaW5kZXhPZihvbGRBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5yZW1vdmUoZGVmYXVsdEluZGV4KTsKLQotCQluZXdBdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKG9sZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW5ld0F0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUob2xkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKEVudGl0eS5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgZGVmYXVsdEluZGV4LCBvbGRBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChFbnRpdHkuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgaW5kZXgsIG5ld0F0dHJpYnV0ZU92ZXJyaWRlKTsJCQotCi0JCXJldHVybiBuZXdBdHRyaWJ1dGVPdmVycmlkZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5zaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoaW50IGluZGV4LCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIEVudGl0eS5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVfKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIEVudGl0eS5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoRW50aXR5LlNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPihzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGludCBhc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpICsgdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4odGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4odGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyk7Ci0JfQotCi0JcHVibGljIGludCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKGludCBpbmRleCwgT3JtQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMsIEVudGl0eS5TUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlXyhPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMsIEVudGl0eS5TUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCi0JcHVibGljIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChPcm1BdHRyaWJ1dGVPdmVycmlkZSkgZ2V0T3ZlcnJpZGVOYW1lZChuYW1lLCBhdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBdHRyaWJ1dGVPdmVycmlkZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCBhdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNEZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZSBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlKSBnZXRPdmVycmlkZU5hbWVkKG5hbWUsIGFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCBhc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNEZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBCYXNlT3ZlcnJpZGUgZ2V0T3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+IG92ZXJyaWRlcykgewotCQlmb3IgKEJhc2VPdmVycmlkZSBvdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvdmVycmlkZXMpKSB7Ci0JCQlTdHJpbmcgb3ZlcnJpZGVOYW1lID0gb3ZlcnJpZGUuZ2V0TmFtZSgpOwotCQkJaWYgKG92ZXJyaWRlTmFtZSA9PSBudWxsICYmIG5hbWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBvdmVycmlkZTsKLQkJCX0KLQkJCWlmIChvdmVycmlkZU5hbWUgIT0gbnVsbCAmJiBvdmVycmlkZU5hbWUuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIG92ZXJyaWRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc092ZXJyaWRlKFN0cmluZyBuYW1lLCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVzKSB7Ci0JCXJldHVybiBnZXRPdmVycmlkZU5hbWVkKG5hbWUsIG92ZXJyaWRlcykgIT0gbnVsbDsKLQl9Ci0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5Pih0aGlzLm5hbWVkUXVlcmllcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmFtZWRRdWVyaWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZWRRdWVyaWVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE9ybU5hbWVkUXVlcnkgYWRkTmFtZWRRdWVyeShpbnQgaW5kZXgpIHsKLQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtTmFtZWRRdWVyeSh0aGlzKTsKLQkJdGhpcy5uYW1lZFF1ZXJpZXMuYWRkKGluZGV4LCBuYW1lZFF1ZXJ5KTsKLQkJWG1sTmFtZWRRdWVyeSB4bWxOYW1lZFF1ZXJ5ID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpOwotCQluYW1lZFF1ZXJ5LmluaXRpYWxpemUoeG1sTmFtZWRRdWVyeSk7Ci0JCXRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldE5hbWVkUXVlcmllcygpLmFkZChpbmRleCwgeG1sTmFtZWRRdWVyeSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChRdWVyeUhvbGRlci5OQU1FRF9RVUVSSUVTX0xJU1QsIGluZGV4LCBuYW1lZFF1ZXJ5KTsKLQkJcmV0dXJuIG5hbWVkUXVlcnk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVkUXVlcnkoaW50IGluZGV4LCBPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgbmFtZWRRdWVyeSwgdGhpcy5uYW1lZFF1ZXJpZXMsIFF1ZXJ5SG9sZGVyLk5BTUVEX1FVRVJJRVNfTElTVCk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZFF1ZXJ5KE5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlyZW1vdmVOYW1lZFF1ZXJ5KHRoaXMubmFtZWRRdWVyaWVzLmluZGV4T2YobmFtZWRRdWVyeSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZFF1ZXJ5KGludCBpbmRleCkgewotCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSB0aGlzLm5hbWVkUXVlcmllcy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoUXVlcnlIb2xkZXIuTkFNRURfUVVFUklFU19MSVNULCBpbmRleCwgbmFtZWRRdWVyeSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5hbWVkUXVlcnlfKE9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QobmFtZWRRdWVyeSwgdGhpcy5uYW1lZFF1ZXJpZXMsIFF1ZXJ5SG9sZGVyLk5BTUVEX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVOYW1lZFF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMubmFtZWRRdWVyaWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXROYW1lZFF1ZXJpZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoUXVlcnlIb2xkZXIuTkFNRURfUVVFUklFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+KHRoaXMubmFtZWROYXRpdmVRdWVyaWVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBuYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgT3JtTmFtZWROYXRpdmVRdWVyeSBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCkgewotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1OYW1lZE5hdGl2ZVF1ZXJ5KHRoaXMpOwotCQl0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5hZGQoaW5kZXgsIG5hbWVkTmF0aXZlUXVlcnkpOwotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IHhtbE5hbWVkTmF0aXZlUXVlcnkgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCW5hbWVkTmF0aXZlUXVlcnkuaW5pdGlhbGl6ZSh4bWxOYW1lZE5hdGl2ZVF1ZXJ5KTsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKGluZGV4LCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCwgaW5kZXgsIG5hbWVkTmF0aXZlUXVlcnkpOwotCQlyZXR1cm4gbmFtZWROYXRpdmVRdWVyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgsIE9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBuYW1lZE5hdGl2ZVF1ZXJ5LCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KSB7Ci0JCXRoaXMucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSh0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5pbmRleE9mKG5hbWVkTmF0aXZlUXVlcnkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpIHsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFF1ZXJ5SG9sZGVyLk5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QsIGluZGV4LCBuYW1lZE5hdGl2ZVF1ZXJ5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5XyhPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KG5hbWVkTmF0aXZlUXVlcnksIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLCBRdWVyeUhvbGRlci5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIG1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8T3JtUXVlcnk+IHF1ZXJpZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8T3JtUXVlcnk+KHRoaXMubmFtZWRRdWVyaWVzKCksIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuaWRDbGFzczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SWRDbGFzcyhTdHJpbmcgbmV3SWRDbGFzcykgewotCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKLQkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKLQkJaWYgKG9sZElkQ2xhc3MgIT0gbmV3SWRDbGFzcykgewotCQkJaWYgKHRoaXMuaWRDbGFzc1Jlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuaWRDbGFzc1Jlc291cmNlKCkuc2V0Q2xhc3NOYW1lKG5ld0lkQ2xhc3MpOwkJCQkJCQotCQkJCWlmICh0aGlzLmlkQ2xhc3NSZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZUlkQ2xhc3NSZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld0lkQ2xhc3MgIT0gbnVsbCkgewotCQkJCWFkZElkQ2xhc3NSZXNvdXJjZSgpOwotCQkJCWlkQ2xhc3NSZXNvdXJjZSgpLnNldENsYXNzTmFtZShuZXdJZENsYXNzKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElkQ2xhc3MuSURfQ0xBU1NfUFJPUEVSVFksIG9sZElkQ2xhc3MsIG5ld0lkQ2xhc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJZENsYXNzXyhTdHJpbmcgbmV3SWRDbGFzcykgewotCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKLQkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJZENsYXNzLklEX0NMQVNTX1BST1BFUlRZLCBvbGRJZENsYXNzLCBuZXdJZENsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sSWRDbGFzcyBpZENsYXNzUmVzb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0SWRDbGFzcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZENsYXNzUmVzb3VyY2UoKSB7Ci0JCWdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5zZXRJZENsYXNzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbElkQ2xhc3MoKSk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSWRDbGFzc1Jlc291cmNlKCkgewotCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0SWRDbGFzcyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5IGdldFBhcmVudEVudGl0eSgpIHsKLQkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gaSA9IGdldFBlcnNpc3RlbnRUeXBlKCkuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlUeXBlTWFwcGluZyB0bSA9IGkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCWlmICh0bSAhPSB0aGlzICYmIHRtIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJcmV0dXJuIChFbnRpdHkpIHRtOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBFbnRpdHkgZ2V0Um9vdEVudGl0eSgpIHsKLQkJRW50aXR5IHJvb3RFbnRpdHkgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBpID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5pbmhlcml0YW5jZUhpZXJhcmNoeSgpOyBpLmhhc05leHQoKTspIHsKLQkJCVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gaS5uZXh0KCk7Ci0JCQlpZiAocGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJcm9vdEVudGl0eSA9IChFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9vdEVudGl0eTsKLQl9Ci0KLS8vCXB1YmxpYyBTdHJpbmcgcHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7Ci0vLwkJU3RyaW5nIHBrQ29sdW1uTmFtZSA9IG51bGw7Ci0vLwkJZm9yIChJdGVyYXRvcjxJUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0vLwkJCUlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0vLwkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlLnByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0vLwkJCWlmIChwa0NvbHVtbk5hbWUgPT0gbnVsbCkgewotLy8JCQkJcGtDb2x1bW5OYW1lID0gbmFtZTsKLS8vCQkJfQotLy8JCQllbHNlIGlmIChuYW1lICE9IG51bGwpIHsKLS8vCQkJCS8vIGlmIHdlIGVuY291bnRlciBhIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgcmV0dXJuIG51bGwKLS8vCQkJCXJldHVybiBudWxsOwotLy8JCQl9Ci0vLwkJfQotLy8JCS8vIGlmIHdlIGVuY291bnRlciBvbmx5IGEgc2luZ2xlIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lLCByZXR1cm4gaXQKLS8vCQlyZXR1cm4gcGtDb2x1bW5OYW1lOwotLy8JfQotLy8KLS8vCXB1YmxpYyBTdHJpbmcgcHJpbWFyeUtleUF0dHJpYnV0ZU5hbWUoKSB7Ci0vLwkJU3RyaW5nIHBrQ29sdW1uTmFtZSA9IG51bGw7Ci0vLwkJU3RyaW5nIHBrQXR0cmlidXRlTmFtZSA9IG51bGw7Ci0vLwkJZm9yIChJdGVyYXRvcjxJUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0vLwkJCUlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0vLwkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlLnByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0vLwkJCWlmIChwa0NvbHVtbk5hbWUgPT0gbnVsbCkgewotLy8JCQkJcGtDb2x1bW5OYW1lID0gbmFtZTsKLS8vCQkJCXBrQXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0vLwkJCX0KLS8vCQkJZWxzZSBpZiAobmFtZSAhPSBudWxsKSB7Ci0vLwkJCQkvLyBpZiB3ZSBlbmNvdW50ZXIgYSBjb21wb3NpdGUgcHJpbWFyeSBrZXksIHJldHVybiBudWxsCi0vLwkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJfQotLy8JCX0KLS8vCQkvLyBpZiB3ZSBlbmNvdW50ZXIgb25seSBhIHNpbmdsZSBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZSwgcmV0dXJuIGl0Ci0vLwkJcmV0dXJuIHBrQXR0cmlidXRlTmFtZTsKLS8vCX0KLS8vCi0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvZiBFbnRpdGllcywgZWFjaCB3aGljaCBpbmhlcml0cyBmcm9tIHRoZSBvbmUgYmVmb3JlLAotCSAqIGFuZCB0ZXJtaW5hdGVzIGF0IHRoZSByb290IGVudGl0eSAob3IgYXQgdGhlIHBvaW50IG9mIGN5Y2xpY2l0eSkuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFR5cGVNYXBwaW5nPiBpbmhlcml0YW5jZUhpZXJhcmNoeSgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlLCBUeXBlTWFwcGluZz4oZ2V0UGVyc2lzdGVudFR5cGUoKS5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUeXBlTWFwcGluZyB0cmFuc2Zvcm0oUGVyc2lzdGVudFR5cGUgdHlwZSkgewotCQkJCXJldHVybiB0eXBlLmdldE1hcHBpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUeXBlTWFwcGluZywgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gdHJhbnNmb3JtKFR5cGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCQlyZXR1cm4gbWFwcGluZy5vdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFR5cGVNYXBwaW5nLCBJdGVyYXRvcjxTdHJpbmc+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKFR5cGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCQlyZXR1cm4gbWFwcGluZy5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFR5cGVNYXBwaW5nLCBJdGVyYXRvcjxTdHJpbmc+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKFR5cGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCQlyZXR1cm4gbWFwcGluZy5vdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0vLwotLy8JcHVibGljIElBdHRyaWJ1dGVPdmVycmlkZSBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZShpbnQgaW5kZXgpIHsKLS8vCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUobmV3IElFbnRpdHkuQXR0cmlidXRlT3ZlcnJpZGVPd25lcih0aGlzKSk7Ci0vLwl9Ci0vLwotLy8JcHVibGljIElBc3NvY2lhdGlvbk92ZXJyaWRlIGNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGUoaW50IGluZGV4KSB7Ci0vLwkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUobmV3IElFbnRpdHkuQXNzb2NpYXRpb25PdmVycmlkZU93bmVyKHRoaXMpKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgSUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLS8vCQlyZXR1cm4gKElBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGVOYW1lZChuYW1lLCBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0vLwl9Ci0vLwotLy8JcHVibGljIGJvb2xlYW4gY29udGFpbnNBdHRyaWJ1dGVPdmVycmlkZShTdHJpbmcgbmFtZSkgewotLy8JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBuYW1lKSB7Ci0vLwkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgZ2V0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotLy8JfQotLy8KLS8vCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgewotLy8JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotLy8JfQotLy8KLS8vCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgewotLy8JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGdldFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotLy8JfQotLy8KLS8vCXByaXZhdGUgSU92ZXJyaWRlIG92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUsIExpc3Q8PyBleHRlbmRzIElPdmVycmlkZT4gb3ZlcnJpZGVzKSB7Ci0vLwkJZm9yIChJT3ZlcnJpZGUgb3ZlcnJpZGUgOiBvdmVycmlkZXMpIHsKLS8vCQkJU3RyaW5nIG92ZXJyaWRlTmFtZSA9IG92ZXJyaWRlLmdldE5hbWUoKTsKLS8vCQkJaWYgKG92ZXJyaWRlTmFtZSA9PSBudWxsICYmIG5hbWUgPT0gbnVsbCkgewotLy8JCQkJcmV0dXJuIG92ZXJyaWRlOwotLy8JCQl9Ci0vLwkJCWlmIChvdmVycmlkZU5hbWUgIT0gbnVsbCAmJiBvdmVycmlkZU5hbWUuZXF1YWxzKG5hbWUpKSB7Ci0vLwkJCQlyZXR1cm4gb3ZlcnJpZGU7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zT3ZlcnJpZGUoU3RyaW5nIG5hbWUsIExpc3Q8PyBleHRlbmRzIElPdmVycmlkZT4gb3ZlcnJpZGVzKSB7Ci0vLwkJcmV0dXJuIG92ZXJyaWRlTmFtZWQobmFtZSwgb3ZlcnJpZGVzKSAhPSBudWxsOwotLy8JfQotLy8KLS8vCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotLy8JCXJldHVybiAhdGhpcy5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCk7Ci0vLwl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoZW50aXR5KTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gZW50aXR5LmdldE5hbWUoKTsKLQkJdGhpcy5kZWZhdWx0TmFtZSA9IHRoaXMuZGVmYXVsdE5hbWUoKTsKLQkJdGhpcy5pbml0aWFsaXplSW5oZXJpdGFuY2UodGhpcy5pbmhlcml0YW5jZVJlc291cmNlKCkpOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4uaW5pdGlhbGl6ZShlbnRpdHkpOwotCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSA9IGVudGl0eS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCA9IHRoaXMuZGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkKCk7Ci0JCXRoaXMudGFibGUuaW5pdGlhbGl6ZShlbnRpdHkpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoZW50aXR5KTsKLQkJdGhpcy5pbml0aWFsaXplVmlydHVhbFNlY29uZGFyeVRhYmxlcygpOwotCQl0aGlzLmluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvcihlbnRpdHkpOwotCQl0aGlzLmluaXRpYWxpemVUYWJsZUdlbmVyYXRvcihlbnRpdHkpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoZW50aXR5KTsKLQkJdGhpcy5pbml0aWFsaXplRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoZW50aXR5KTsKLQkJdGhpcy5pbml0aWFsaXplVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyhlbnRpdHkpOwotCQl0aGlzLmluaXRpYWxpemVOYW1lZFF1ZXJpZXMoZW50aXR5KTsKLQkJdGhpcy5pbml0aWFsaXplTmFtZWROYXRpdmVRdWVyaWVzKGVudGl0eSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUlkQ2xhc3ModGhpcy5pZENsYXNzUmVzb3VyY2UoKSk7Ci0JCXRoaXMudXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9yc0FuZFF1ZXJpZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUluaGVyaXRhbmNlKEluaGVyaXRhbmNlIGluaGVyaXRhbmNlUmVzb3VyY2UpIHsKLQkJdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KGluaGVyaXRhbmNlUmVzb3VyY2UpOwotCQl0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gdGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoWG1sRW50aXR5IGVudGl0eSkgewotCQlmb3IgKFhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlIDogZW50aXR5LmdldFNlY29uZGFyeVRhYmxlcygpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5hZGQoYnVpbGRTZWNvbmRhcnlUYWJsZShzZWNvbmRhcnlUYWJsZSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkgewotCQlpZiAoaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0SmF2YUVudGl0eSgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpID4gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUxpc3RJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IGphdmFTZWNvbmRhcnlUYWJsZXMgPSBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7Ci0JCXdoaWxlKGphdmFTZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlID0gamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCk7Ci0JCQlpZiAoamF2YVNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLmFkZChidWlsZFZpcnR1YWxTZWNvbmRhcnlUYWJsZShqYXZhU2Vjb25kYXJ5VGFibGUpKTsKLQkJCX0KLQkJfQotCX0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCWlmIChpc01ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRKYXZhRW50aXR5KCkgPT0gbnVsbCkgewotCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG51bGwpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpID4gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGphdmFQa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQl3aGlsZShqYXZhUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUGtKb2luQ29sdW1uID0gamF2YVBrSm9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKGphdmFQa0pvaW5Db2x1bW4uZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGJ1aWxkVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uKGphdmFQa0pvaW5Db2x1bW4pKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZUdlbmVyYXRvcihYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCWlmIChlbnRpdHkuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnRhYmxlR2VuZXJhdG9yID0gYnVpbGRUYWJsZUdlbmVyYXRvcihlbnRpdHkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVRhYmxlR2VuZXJhdG9yIGJ1aWxkVGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSkgewotCQlPcm1UYWJsZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1UYWJsZUdlbmVyYXRvcih0aGlzKTsKLQkJZ2VuZXJhdG9yLmluaXRpYWxpemUodGFibGVHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCXJldHVybiBnZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yKFhtbEVudGl0eSBlbnRpdHkpIHsKLQkJaWYgKGVudGl0eS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBidWlsZFNlcXVlbmNlR2VuZXJhdG9yKGVudGl0eS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciB4bWxTZXF1ZW5jZUdlbmVyYXRvcikgewotCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1TZXF1ZW5jZUdlbmVyYXRvcih0aGlzKTsKLQkJZ2VuZXJhdG9yLmluaXRpYWxpemUoeG1sU2VxdWVuY2VHZW5lcmF0b3IpOwotCQlyZXR1cm4gZ2VuZXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoWG1sRW50aXR5IGVudGl0eSkgewotCQlmb3IgKFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uIDogZW50aXR5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihwcmltYXJ5S2V5Sm9pbkNvbHVtbikpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoWG1sRW50aXR5IGVudGl0eSkgewotCQlmb3IgKFhtbEF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlIDogZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShhdHRyaWJ1dGVPdmVycmlkZSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlmb3IgKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSkpIHsKLQkJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGUgPT0gbnVsbCkgewotCQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOwotCQkJCWlmIChnZXRKYXZhRW50aXR5KCkgIT0gbnVsbCkgewotCQkJCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUocGVyc2lzdGVudEF0dHJpYnV0ZSwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgamF2YUF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJldHVybiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKGJ1aWxkVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGphdmFBdHRyaWJ1dGVPdmVycmlkZSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGUoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgamF2YUF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCVhtbENvbHVtbiB4bWxDb2x1bW47Ci0JCWlmIChqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPT0gbnVsbCkgewotCQkJQ29sdW1uTWFwcGluZyBjb2x1bW5NYXBwaW5nID0gKENvbHVtbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkJeG1sQ29sdW1uID0gbmV3IFZpcnR1YWxYbWxDb2x1bW4odGhpcywgY29sdW1uTWFwcGluZy5nZXRDb2x1bW4oKSwgZmFsc2UpOwkJCi0JCX0KLQkJZWxzZSB7Ci0JCQl4bWxDb2x1bW4gPSBuZXcgVmlydHVhbFhtbENvbHVtbih0aGlzLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCksIGlzTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJfQotCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSwgeG1sQ29sdW1uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKFhtbEVudGl0eSBlbnRpdHkpIHsKLQkJZm9yIChYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgOiBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5hZGQoYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlKGFzc29jaWF0aW9uT3ZlcnJpZGUpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTmFtZWRRdWVyaWVzKFhtbEVudGl0eSBlbnRpdHkpIHsKLQkJZm9yIChYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgOiBlbnRpdHkuZ2V0TmFtZWRRdWVyaWVzKCkpIHsKLQkJCXRoaXMubmFtZWRRdWVyaWVzLmFkZChidWlsZE5hbWVkUXVlcnkobmFtZWRRdWVyeSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVOYW1lZE5hdGl2ZVF1ZXJpZXMoWG1sRW50aXR5IGVudGl0eSkgewotCQlmb3IgKFhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA6IGVudGl0eS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSkgewotCQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuYWRkKGJ1aWxkTmFtZWROYXRpdmVRdWVyeShuYW1lZE5hdGl2ZVF1ZXJ5KSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUlkQ2xhc3MoWG1sSWRDbGFzcyBpZENsYXNzUmVzb3VyY2UpIHsKLQkJdGhpcy5pZENsYXNzID0gdGhpcy5pZENsYXNzKGlkQ2xhc3NSZXNvdXJjZSk7CQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgaWRDbGFzcyhYbWxJZENsYXNzIGlkQ2xhc3NSZXNvdXJjZSkgewotCQlyZXR1cm4gaWRDbGFzc1Jlc291cmNlID09IG51bGwgPyBudWxsIDogaWRDbGFzc1Jlc291cmNlLmdldENsYXNzTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCXN1cGVyLnVwZGF0ZShlbnRpdHkpOwotCQl0aGlzLnNldFNwZWNpZmllZE5hbWUoZW50aXR5LmdldE5hbWUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdE5hbWUodGhpcy5kZWZhdWx0TmFtZSgpKTsKLQkJdGhpcy51cGRhdGVJbmhlcml0YW5jZSh0aGlzLmluaGVyaXRhbmNlUmVzb3VyY2UoKSk7Ci0JCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi51cGRhdGUoZW50aXR5KTsKLQkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoZW50aXR5LmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKGRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCXRoaXMuc2V0RGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCh0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCgpKTsKLQkJdGhpcy50YWJsZS51cGRhdGUoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCXRoaXMudXBkYXRlU2VxdWVuY2VHZW5lcmF0b3IoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVUYWJsZUdlbmVyYXRvcihlbnRpdHkpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyhlbnRpdHkpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJdGhpcy51cGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVOYW1lZFF1ZXJpZXMoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVOYW1lZE5hdGl2ZVF1ZXJpZXMoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVJZENsYXNzKHRoaXMuaWRDbGFzc1Jlc291cmNlKCkpOwotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlVW5pdEdlbmVyYXRvcnNBbmRRdWVyaWVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZSgpIHsKLQkJaWYgKCFpc01ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQkJaWYgKGphdmFFbnRpdHkgIT0gbnVsbCkgewotCQkJCXJldHVybiBqYXZhRW50aXR5LmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NfKCk7Ci0JCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIENsYXNzVG9vbHMuc2hvcnROYW1lRm9yQ2xhc3NOYW1lZChjbGFzc05hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSB7Ci0JCS8vVE9ETyBkZWZhdWx0IGRpc2NyaW1pbmF0b3IgdmFsdWUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGRpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCgpIHsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpOwotCQlyZXR1cm4gamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgPT0gbnVsbCA/IGZhbHNlIDogIWphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmlzQWJzdHJhY3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJbmhlcml0YW5jZShJbmhlcml0YW5jZSBpbmhlcml0YW5jZVJlc291cmNlKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneV8odGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KGluaGVyaXRhbmNlUmVzb3VyY2UpKTsKLQkJdGhpcy5zZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSh0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoWG1sRW50aXR5IGVudGl0eSkgewotCQlMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sU2Vjb25kYXJ5VGFibGU+IHJlc291cmNlU2Vjb25kYXJ5VGFibGVzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbFNlY29uZGFyeVRhYmxlPihlbnRpdHkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCQlzZWNvbmRhcnlUYWJsZS51cGRhdGUocmVzb3VyY2VTZWNvbmRhcnlUYWJsZXMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlXyhzZWNvbmRhcnlUYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZVNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSwgYnVpbGRTZWNvbmRhcnlUYWJsZShyZXNvdXJjZVNlY29uZGFyeVRhYmxlcy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQkvL2lmIGFueSBzZWNvbmRhcnktdGFibGVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHhtbCBmaWxlLCB0aGVuIGFsbCBvZiB0aGUgamF2YSBzZWNvbmRhcnlUYWJsZXMgYXJlIG92ZXJyaWRlbgotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gdmlydHVhbFNlY29uZGFyeVRhYmxlcygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBqYXZhU2Vjb25kYXJ5VGFibGVzID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCi0JCWlmIChnZXRKYXZhRW50aXR5KCkgIT0gbnVsbCAmJiAhaXNNZXRhZGF0YUNvbXBsZXRlKCkgJiYgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpID09IDApIHsKLQkJCWphdmFTZWNvbmRhcnlUYWJsZXMgPSBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7Ci0JCX0KLQkJd2hpbGUgKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCU9ybVNlY29uZGFyeVRhYmxlIHZpcnR1YWxTZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXh0KCk7Ci0JCQlpZiAoamF2YVNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlID0gamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCk7Ci0JCQkJdmlydHVhbFNlY29uZGFyeVRhYmxlLnVwZGF0ZShuZXcgVmlydHVhbFhtbFNlY29uZGFyeVRhYmxlKGphdmFTZWNvbmRhcnlUYWJsZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlVmlydHVhbFNlY29uZGFyeVRhYmxlKHZpcnR1YWxTZWNvbmRhcnlUYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChqYXZhU2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSkgewotCQkJSmF2YVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSA9IGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpOwotCQkJYWRkVmlydHVhbFNlY29uZGFyeVRhYmxlKGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlKGphdmFTZWNvbmRhcnlUYWJsZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVNlY29uZGFyeVRhYmxlIGJ1aWxkU2Vjb25kYXJ5VGFibGUoWG1sU2Vjb25kYXJ5VGFibGUgeG1sU2Vjb25kYXJ5VGFibGUpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVNlY29uZGFyeVRhYmxlKHRoaXMsIHhtbFNlY29uZGFyeVRhYmxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVNlY29uZGFyeVRhYmxlIGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlKEphdmFTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGUpIHsKLQkJcmV0dXJuIGJ1aWxkU2Vjb25kYXJ5VGFibGUobmV3IFZpcnR1YWxYbWxTZWNvbmRhcnlUYWJsZShqYXZhU2Vjb25kYXJ5VGFibGUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGFibGVHZW5lcmF0b3IoWG1sRW50aXR5IGVudGl0eSkgewotCQlpZiAoZW50aXR5LmdldFRhYmxlR2VuZXJhdG9yKCkgPT0gbnVsbCkgewotCQkJaWYgKGdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJCXNldFRhYmxlR2VuZXJhdG9yKG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldFRhYmxlR2VuZXJhdG9yKCkgPT0gbnVsbCkgewotCQkJCXNldFRhYmxlR2VuZXJhdG9yKGJ1aWxkVGFibGVHZW5lcmF0b3IoZW50aXR5LmdldFRhYmxlR2VuZXJhdG9yKCkpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdldFRhYmxlR2VuZXJhdG9yKCkudXBkYXRlKGVudGl0eS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZXF1ZW5jZUdlbmVyYXRvcihYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCWlmIChlbnRpdHkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihlbnRpdHkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS51cGRhdGUoZW50aXR5LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBzcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlIGluaGVyaXRhbmNlUmVzb3VyY2UpIHsKLQkJaWYgKGluaGVyaXRhbmNlUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIEluaGVyaXRhbmNlVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbChpbmhlcml0YW5jZVJlc291cmNlLmdldFN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlpZiAoaW5oZXJpdGFuY2VSZXNvdXJjZSgpID09IG51bGwgJiYgIWlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlpZiAoZ2V0SmF2YUVudGl0eSgpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0SmF2YUVudGl0eSgpLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKTsKLQkJCX0KLQkJfQotCQlpZiAoZ2V0Um9vdEVudGl0eSgpID09IHRoaXMpIHsKLQkJCXJldHVybiBJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFOwotCQl9Ci0JCXJldHVybiBnZXRSb290RW50aXR5KCkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoWG1sRW50aXR5IGVudGl0eSkgewotCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPihlbnRpdHkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uID0gcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbi51cGRhdGUocmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uXyhwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSwgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQkvL2lmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWVkIHBrSm9pbkNvbHVtbnMsIHRoZW4gbm8gZGVmYXVsdCBwa0pvaW5Db2x1bW5zCi0JLy9pZiB0aGUgamF2YSBoYXMgc3BlY2lmaWVkIHBrSm9pbkNvbHVtbnMsIHRoZW4gdGhvc2UgYXJlIHRoZSBkZWZhdWx0IHBrSm9pbkNvbHVtbnMKLQkvL290aGVyd2lzZSwganVzdCAxIHBrSm9pbkNvbHVtbiwgZGVmYXVsdHMgYmVpbmcgbnVsbCBpZiBtdWx0aXBsZSBwcmltYXJ5S2V5IGNvbHVtbnMKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGRlZmF1bHRQa0pvaW5Db2x1bW5zID0gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBqYXZhUGtKb2luQ29sdW1ucyA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQotCQlpZiAoZ2V0SmF2YUVudGl0eSgpICE9IG51bGwgJiYgIWlzTWV0YWRhdGFDb21wbGV0ZSgpICYmIHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSA9PSAwKSB7Ci0JCQlqYXZhUGtKb2luQ29sdW1ucyA9IGdldEphdmFFbnRpdHkoKS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJfQotCQl3aGlsZSAoZGVmYXVsdFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UGtKb2luQ29sdW1uID0gZGVmYXVsdFBrSm9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKGphdmFQa0pvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUGtKb2luQ29sdW1uID0gamF2YVBrSm9pbkNvbHVtbnMubmV4dCgpOwotCQkJCWRlZmF1bHRQa0pvaW5Db2x1bW4udXBkYXRlKG5ldyBWaXJ0dWFsWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oamF2YVBrSm9pbkNvbHVtbikpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPT0gMSkgewotCQkJCQlkZWZhdWx0UGtKb2luQ29sdW1uLnVwZGF0ZShudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlbW92ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihkZWZhdWx0UGtKb2luQ29sdW1uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChqYXZhUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUGtKb2luQ29sdW1uID0gamF2YVBrSm9pbkNvbHVtbnMubmV4dCgpOwotCQkJYWRkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKGJ1aWxkVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uKGphdmFQa0pvaW5Db2x1bW4pKTsKLQkJfQotCQkKLQkJaWYgKGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPT0gMCAmJiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPT0gMCkgewotCQkJYWRkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4obnVsbCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gamF2YVNlY29uZGFyeVRhYmxlKSB7Ci0JCXJldHVybiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG5ldyBWaXJ0dWFsWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oamF2YVNlY29uZGFyeVRhYmxlKSk7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKSB7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpKTsKLQkJb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uaW5pdGlhbGl6ZShwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCXJldHVybiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoWG1sRW50aXR5IGVudGl0eSkgewotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbEF0dHJpYnV0ZU92ZXJyaWRlPihlbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCQlhdHRyaWJ1dGVPdmVycmlkZS51cGRhdGUocmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlXyhhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSwgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShyZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzQ29weSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJCi0JCWZvciAoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG92ZXJyaWRhYmxlQXR0cmlidXRlcykpIHsKLQkJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIG9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQlpZiAob3JtQXR0cmlidXRlT3ZlcnJpZGUgIT0gbnVsbCAmJiAhb3JtQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOwotCQkJaWYgKGdldEphdmFFbnRpdHkoKSAhPSBudWxsKSB7Ci0JCQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKG9ybUF0dHJpYnV0ZU92ZXJyaWRlICE9IG51bGwpIHsKLQkJCQlpZiAodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc0NvcHkuaGFzTmV4dCgpKSB7Ci0JCQkJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNDb3B5Lm5leHQoKTsKLQkJCQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnVwZGF0ZShidWlsZFZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZShwZXJzaXN0ZW50QXR0cmlidXRlLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWFkZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShwZXJzaXN0ZW50QXR0cmlidXRlLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUocGVyc2lzdGVudEF0dHJpYnV0ZSwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlKSk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChPcm1BdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc0NvcHkpKSB7Ci0JCQlyZW1vdmVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpLCBhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIGNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKFhtbEVudGl0eSBlbnRpdHkpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4oZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSkgewotCQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKSB7Ci0JCQkJYXNzb2NpYXRpb25PdmVycmlkZS51cGRhdGUocmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZV8oYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSkgewotCQkJYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSwgYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlKHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlKFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtQXNzb2NpYXRpb25PdmVycmlkZSh0aGlzLCBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIoKSwgYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZU93bmVyKCkgewotCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVPd25lcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVOYW1lZFF1ZXJpZXMoWG1sRW50aXR5IGVudGl0eSkgewotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gcXVlcmllcyA9IG5hbWVkUXVlcmllcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sTmFtZWRRdWVyeT4gcmVzb3VyY2VOYW1lZFF1ZXJpZXMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sTmFtZWRRdWVyeT4oZW50aXR5LmdldE5hbWVkUXVlcmllcygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJCi0JCXdoaWxlIChxdWVyaWVzLmhhc05leHQoKSkgewotCQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gcXVlcmllcy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VOYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKSB7Ci0JCQkJbmFtZWRRdWVyeS51cGRhdGUocmVzb3VyY2VOYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZU5hbWVkUXVlcnlfKG5hbWVkUXVlcnkpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VOYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKSB7Ci0JCQlhZGROYW1lZFF1ZXJ5KG5hbWVkUXVlcmllc1NpemUoKSwgYnVpbGROYW1lZFF1ZXJ5KHJlc291cmNlTmFtZWRRdWVyaWVzLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybU5hbWVkUXVlcnkgYnVpbGROYW1lZFF1ZXJ5KFhtbE5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1OYW1lZFF1ZXJ5KHRoaXMpOwotCQlvcm1OYW1lZFF1ZXJ5LmluaXRpYWxpemUobmFtZWRRdWVyeSk7Ci0JCXJldHVybiBvcm1OYW1lZFF1ZXJ5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU5hbWVkTmF0aXZlUXVlcmllcyhYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBxdWVyaWVzID0gbmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiByZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PihlbnRpdHkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKHF1ZXJpZXMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkUXVlcnkgPSBxdWVyaWVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCQluYW1lZFF1ZXJ5LnVwZGF0ZShyZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlTmFtZWROYXRpdmVRdWVyeV8obmFtZWRRdWVyeSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCWFkZE5hbWVkTmF0aXZlUXVlcnkobmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpLCBidWlsZE5hbWVkTmF0aXZlUXVlcnkocmVzb3VyY2VOYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtTmFtZWROYXRpdmVRdWVyeSBidWlsZE5hbWVkTmF0aXZlUXVlcnkoWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZFF1ZXJ5KSB7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybU5hbWVkTmF0aXZlUXVlcnkodGhpcyk7Ci0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuaW5pdGlhbGl6ZShuYW1lZFF1ZXJ5KTsKLQkJcmV0dXJuIG9ybU5hbWVkTmF0aXZlUXVlcnk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUlkQ2xhc3MoWG1sSWRDbGFzcyBpZENsYXNzUmVzb3VyY2UpIHsKLQkJdGhpcy5zZXRJZENsYXNzXyh0aGlzLmlkQ2xhc3MoaWRDbGFzc1Jlc291cmNlKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBlcnNpc3RlbmNlVW5pdEdlbmVyYXRvcnNBbmRRdWVyaWVzKCkgewotCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hZGRHZW5lcmF0b3IoZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCX0KLQkJCi0JCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZEdlbmVyYXRvcihnZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJfQotCQkKLQkJZm9yIChRdWVyeSBxdWVyeSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShuYW1lZFF1ZXJpZXMoKSkpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZFF1ZXJ5KHF1ZXJ5KTsKLQkJfQotCQkKLQkJZm9yIChRdWVyeSBxdWVyeSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShuYW1lZE5hdGl2ZVF1ZXJpZXMoKSkpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZFF1ZXJ5KHF1ZXJ5KTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKGdldFBlcnNpc3RlbnRUeXBlKCkuYWxsQXR0cmlidXRlcygpKTsKLQl9Ci0JCi0JLy9jb3BpZWQgaW4gR2VuZXJpY0phdmFFbnRpdHkgdG8gYXZvaWQgYW4gQVBJIGNoYW5nZSBmb3IgZml4aW5nIGJ1ZyAyMjk0MjMgaW4gUkMxCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZShJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzKSB7Ci0JCVN0cmluZyBwa0NvbHVtbk5hbWUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IGF0dHJpYnV0ZXM7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCS8vaWYgdGhlIGF0dHJpYnV0ZSBpcyBhIHByaW1hcnkga2V5IHRoZW4gd2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUKLQkJCQkvL2FuZCB1c2UgaXRzIGNvbHVtbiBuYW1lIGluc3RlYWQgKGJ1ZyAyMjk0MjMpCi0JCQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkJCWlmIChhdHRyaWJ1dGVPdmVycmlkZSAhPSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHBrQ29sdW1uTmFtZSA9PSBudWxsKSB7Ci0JCQkJcGtDb2x1bW5OYW1lID0gbmFtZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCS8vIGlmIHdlIGVuY291bnRlciBhIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgcmV0dXJuIG51bGwKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBlbmNvdW50ZXIgb25seSBhIHNpbmdsZSBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZSwgcmV0dXJuIGl0Ci0JCXJldHVybiBwa0NvbHVtbk5hbWU7Ci0JfQotCi0JLy8qKioqKioqKioqICBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJZ2V0VGFibGUoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsJCi0JCWFkZElkTWVzc2FnZXMobWVzc2FnZXMpOwotCQlhZGRHZW5lcmF0b3JNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCWFkZFF1ZXJ5TWVzc2FnZXMobWVzc2FnZXMpOwotCQlmb3IgKE9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHNlY29uZGFyeVRhYmxlcygpKSkgewotCQkJc2Vjb25kYXJ5VGFibGUuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCX0KLQotCQlmb3IgKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGF0dHJpYnV0ZU92ZXJyaWRlcygpKSkgewotCQkJYXR0cmlidXRlT3ZlcnJpZGUuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCX0KLQotCQlmb3IgKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhc3NvY2lhdGlvbk92ZXJyaWRlcygpKSkgewotCQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZE1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWFkZE5vSWRNZXNzYWdlKG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9JZE1lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKGVudGl0eUhhc05vSWQoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX05PX0lELAotCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJdGhpcywgCi0JCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpKQotCQkJKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZW50aXR5SGFzTm9JZCgpIHsKLQkJcmV0dXJuICEgdGhpcy5lbnRpdHlIYXNJZCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmF0b3JNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlMaXN0PEdlbmVyYXRvcj4gbWFzdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KGdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPE9ybUdlbmVyYXRvcj4gc3RyZWFtID0gdGhpcy5nZW5lcmF0b3JzKCk7IHN0cmVhbS5oYXNOZXh0KCkgOyApIHsKLQkJCU9ybUdlbmVyYXRvciBjdXJyZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJCW1hc3Rlckxpc3QucmVtb3ZlKGN1cnJlbnQpOwotCQkJCi0JCQlmb3IgKEdlbmVyYXRvciBlYWNoIDogbWFzdGVyTGlzdCkgewotCQkJCWlmICghIGVhY2gub3ZlcnJpZGVzKGN1cnJlbnQpICYmIGVhY2guZ2V0TmFtZSgpICE9IG51bGwgJiYgZWFjaC5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnQuZ2V0TmFtZSgpKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5HRU5FUkFUT1JfRFVQTElDQVRFX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldE5hbWUoKX0sCi0JCQkJCQkJY3VycmVudCwKLQkJCQkJCQljdXJyZW50LmdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkJKTsKLQkJCQl9Ci0JCQl9Ci0JCQotCQkJbWFzdGVyTGlzdC5hZGQoY3VycmVudCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkUXVlcnlNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlMaXN0PFF1ZXJ5PiBtYXN0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8T3JtUXVlcnk+IHN0cmVhbSA9IHRoaXMucXVlcmllcygpOyBzdHJlYW0uaGFzTmV4dCgpIDsgKSB7Ci0JCQlPcm1RdWVyeSBjdXJyZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJCW1hc3Rlckxpc3QucmVtb3ZlKGN1cnJlbnQpOwotCQkJCi0JCQlmb3IgKFF1ZXJ5IGVhY2ggOiBtYXN0ZXJMaXN0KSB7Ci0JCQkJaWYgKCEgZWFjaC5vdmVycmlkZXMoY3VycmVudCkgJiYgZWFjaC5nZXROYW1lKCkgIT0gbnVsbCAmJiBlYWNoLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlFVRVJZX0RVUExJQ0FURV9OQU1FLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7Y3VycmVudC5nZXROYW1lKCl9LAotCQkJCQkJCWN1cnJlbnQsCi0JCQkJCQkJY3VycmVudC5nZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQltYXN0ZXJMaXN0LmFkZChjdXJyZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBlbnRpdHlIYXNJZCgpIHsKLQkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuYWxsQXR0cmlidXRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmlzSWRBdHRyaWJ1dGUoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJZW50aXR5TWFwcGluZ3MuZ2V0RW50aXRpZXMoKS5yZW1vdmUodGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgWG1sRW50aXR5IGFkZFRvUmVzb3VyY2VNb2RlbChYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQlYbWxFbnRpdHkgZW50aXR5ID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW50aXR5KCk7Ci0JCWdldFBlcnNpc3RlbnRUeXBlKCkuaW5pdGlhbGl6ZShlbnRpdHkpOwotCQllbnRpdHlNYXBwaW5ncy5nZXRFbnRpdGllcygpLmFkZChlbnRpdHkpOwotCQlyZXR1cm4gZW50aXR5OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKGdldE5hbWUoKSk7Ci0JfQotCQotCWNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgaW1wbGVtZW50cyBPcm1CYXNlSm9pbkNvbHVtbi5Pd25lcgotCXsKLQkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1FbnRpdHkudGhpczsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUVudGl0eS50aGlzLmdldERiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKSB7Ci0JCQlFbnRpdHkgcGFyZW50RW50aXR5ID0gR2VuZXJpY09ybUVudGl0eS50aGlzLmdldFBhcmVudEVudGl0eSgpOwotCQkJcmV0dXJuIChwYXJlbnRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogcGFyZW50RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtRW50aXR5LnRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1FbnRpdHkudGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLmNvbnRhaW5zKGpvaW5Db2x1bW4pOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewotCQkJaWYgKGpvaW5Db2x1bW5zU2l6ZSgpICE9IDEpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBHZW5lcmljT3JtRW50aXR5LnRoaXMuZ2V0UGFyZW50RW50aXR5KCkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQkJfQotCQkKLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVPd25lciBpbXBsZW1lbnRzIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIHsKLQotCQlwdWJsaWMgQ29sdW1uTWFwcGluZyBnZXRDb2x1bW5NYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IGdldFBlcnNpc3RlbnRUeXBlKCkuYWxsQXR0cmlidXRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc0F0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKHBlcnNBdHRyaWJ1dGUuZ2V0TmFtZSgpKSkgewotCQkJCQlpZiAocGVyc0F0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBDb2x1bW5NYXBwaW5nKSB7Ci0JCQkJCQlyZXR1cm4gKENvbHVtbk1hcHBpbmcpIHBlcnNBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZU92ZXJyaWRlIG92ZXJyaWRlKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUVudGl0eS50aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuY29udGFpbnMob3ZlcnJpZGUpOwotCQl9Ci0KLQkJcHVibGljIEJhc2VPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgQmFzZU92ZXJyaWRlIG92ZXJyaWRlKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUVudGl0eS50aGlzLnNldEF0dHJpYnV0ZU92ZXJyaWRlVmlydHVhbCh2aXJ0dWFsLCAoT3JtQXR0cmlidXRlT3ZlcnJpZGUpIG92ZXJyaWRlKTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtRW50aXR5LnRoaXM7Ci0JCX0KLQkJCi0JfQotCi0JY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZU93bmVyIGltcGxlbWVudHMgQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lciB7Ci0KLQkJcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZyhTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJaWYgKGF0dHJpYnV0ZU5hbWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBnZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNBdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhwZXJzQXR0cmlidXRlLmdldE5hbWUoKSkpIHsKLQkJCQkJaWYgKHBlcnNBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgUmVsYXRpb25zaGlwTWFwcGluZykgewotCQkJCQkJcmV0dXJuIChSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VPdmVycmlkZSBvdmVycmlkZSkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1FbnRpdHkudGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuY29udGFpbnMob3ZlcnJpZGUpOwotCQl9Ci0KLQkJcHVibGljIEJhc2VPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgQmFzZU92ZXJyaWRlIG92ZXJyaWRlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtRW50aXR5LnRoaXM7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZTVkYWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1HZW5lcmF0ZWRWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlIGV4dGVuZHMgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIE9ybUdlbmVyYXRlZFZhbHVlCi17Ci0KLQlwcm90ZWN0ZWQgR2VuZXJhdGlvblR5cGUgc3BlY2lmaWVkU3RyYXRlZ3k7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZEdlbmVyYXRvcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRHZW5lcmF0b3I7Ci0KLQlwcm90ZWN0ZWQgWG1sR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWU7Ci0JCi0JcHVibGljIEdlbmVyaWNPcm1HZW5lcmF0ZWRWYWx1ZShPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUpwYUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1KcGFDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBHZW5lcmF0aW9uVHlwZSBnZXRTdHJhdGVneSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFN0cmF0ZWd5KCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRTdHJhdGVneSgpIDogdGhpcy5nZXRTcGVjaWZpZWRTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX1NUUkFURUdZOwotCX0KLQkKLQlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlIG5ld1NwZWNpZmllZFN0cmF0ZWd5KSB7Ci0JCUdlbmVyYXRpb25UeXBlIG9sZFN0cmF0ZWd5ID0gdGhpcy5zcGVjaWZpZWRTdHJhdGVneTsKLQkJdGhpcy5zcGVjaWZpZWRTdHJhdGVneSA9IG5ld1NwZWNpZmllZFN0cmF0ZWd5OwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlLnNldFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRTdHJhdGVneSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkU3RyYXRlZ3ksIG5ld1NwZWNpZmllZFN0cmF0ZWd5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU3RyYXRlZ3lfKEdlbmVyYXRpb25UeXBlIG5ld1NwZWNpZmllZFN0cmF0ZWd5KSB7Ci0JCUdlbmVyYXRpb25UeXBlIG9sZFN0cmF0ZWd5ID0gdGhpcy5zcGVjaWZpZWRTdHJhdGVneTsKLQkJdGhpcy5zcGVjaWZpZWRTdHJhdGVneSA9IG5ld1NwZWNpZmllZFN0cmF0ZWd5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkU3RyYXRlZ3ksIG5ld1NwZWNpZmllZFN0cmF0ZWd5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEdlbmVyYXRvcigpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0R2VuZXJhdG9yKCkgOiB0aGlzLmdldFNwZWNpZmllZEdlbmVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEdlbmVyYXRvcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEdlbmVyYXRvcihTdHJpbmcgbmV3RGVmYXVsdEdlbmVyYXRvcikgewotCQlTdHJpbmcgb2xkR2VuZXJhdG9yID0gdGhpcy5kZWZhdWx0R2VuZXJhdG9yOwotCQl0aGlzLmRlZmF1bHRHZW5lcmF0b3IgPSBuZXdEZWZhdWx0R2VuZXJhdG9yOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRHZW5lcmF0b3IsIG5ld0RlZmF1bHRHZW5lcmF0b3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRHZW5lcmF0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkR2VuZXJhdG9yKFN0cmluZyBuZXdTcGVjaWZpZWRHZW5lcmF0b3IpIHsKLQkJU3RyaW5nIG9sZEdlbmVyYXRvciA9IHRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yOwotCQl0aGlzLnNwZWNpZmllZEdlbmVyYXRvciA9IG5ld1NwZWNpZmllZEdlbmVyYXRvcjsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZS5zZXRHZW5lcmF0b3IobmV3U3BlY2lmaWVkR2VuZXJhdG9yKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRHZW5lcmF0b3IsIG5ld1NwZWNpZmllZEdlbmVyYXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkR2VuZXJhdG9yXyhTdHJpbmcgbmV3U3BlY2lmaWVkR2VuZXJhdG9yKSB7Ci0JCVN0cmluZyBvbGRHZW5lcmF0b3IgPSB0aGlzLnNwZWNpZmllZEdlbmVyYXRvcjsKLQkJdGhpcy5zcGVjaWZpZWRHZW5lcmF0b3IgPSBuZXdTcGVjaWZpZWRHZW5lcmF0b3I7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkR2VuZXJhdG9yLCBuZXdTcGVjaWZpZWRHZW5lcmF0b3IpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gIHRoaXMuZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKCk7Ci0JCXJldHVybiB0ZXh0UmFuZ2UgIT0gbnVsbCA/IHRleHRSYW5nZSA6IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVsIC0+IGphdmEgY29udGV4dCBtb2RlbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlKSB7Ci0JCXRoaXMuZ2VuZXJhdGVkVmFsdWUgPSBnZW5lcmF0ZWRWYWx1ZTsKLQkJdGhpcy5zcGVjaWZpZWRTdHJhdGVneSA9IHRoaXMuc3RyYXRlZ3koZ2VuZXJhdGVkVmFsdWUpOwotCQl0aGlzLnNwZWNpZmllZEdlbmVyYXRvciA9IHRoaXMuZ2VuZXJhdG9yKGdlbmVyYXRlZFZhbHVlKTsKLQkJLy9UT0RPCi0JCXRoaXMuZGVmYXVsdEdlbmVyYXRvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlKSB7Ci0JCXRoaXMuZ2VuZXJhdGVkVmFsdWUgPSBnZW5lcmF0ZWRWYWx1ZTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTdHJhdGVneV8odGhpcy5zdHJhdGVneShnZW5lcmF0ZWRWYWx1ZSkpOwotCQl0aGlzLnNldFNwZWNpZmllZEdlbmVyYXRvcl8odGhpcy5nZW5lcmF0b3IoZ2VuZXJhdGVkVmFsdWUpKTsKLQkJLy9UT0RPCi0JCXRoaXMuc2V0RGVmYXVsdEdlbmVyYXRvcihudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koWG1sR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUpIHsKLQkJcmV0dXJuIEdlbmVyYXRpb25UeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRvcihYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSkgewotCQlyZXR1cm4gZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHZhbGlkYXRpb25UZXh0UmFuZ2UgPSB0aGlzLmdlbmVyYXRlZFZhbHVlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJcmV0dXJuIHZhbGlkYXRpb25UZXh0UmFuZ2UgIT0gbnVsbCA/IHZhbGlkYXRpb25UZXh0UmFuZ2UgOiBnZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1JZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YjNmNzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1JZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtSWRNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFhtbElkPgotCWltcGxlbWVudHMgT3JtSWRNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUNvbHVtbiBjb2x1bW47Ci0KLQlwcm90ZWN0ZWQgT3JtR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWU7Ci0JCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbDsKLQkKLQlwcm90ZWN0ZWQgT3JtVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3I7Ci0JcHJvdGVjdGVkIE9ybVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yOwotCi0JCi0JcHVibGljIEdlbmVyaWNPcm1JZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1Db2x1bW4odGhpcywgdGhpcyk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1JZE1hcHBpbmcodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21YbWxDb2x1bW5NYXBwaW5nKE9ybUNvbHVtbk1hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVhtbENvbHVtbk1hcHBpbmcob2xkTWFwcGluZyk7Ci0JCXNldFRlbXBvcmFsKG9sZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JCWdldENvbHVtbigpLmluaXRpYWxpemVGcm9tKG9sZE1hcHBpbmcuZ2V0Q29sdW1uKCkpOwotCX0KLQotCQotCXB1YmxpYyBPcm1Db2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpIHsKLQkJcmV0dXJuIHRoaXMudGVtcG9yYWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKSB7Ci0JCVRlbXBvcmFsVHlwZSBvbGRUZW1wb3JhbCA9IHRoaXMudGVtcG9yYWw7Ci0JCXRoaXMudGVtcG9yYWwgPSBuZXdUZW1wb3JhbDsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChuZXdUZW1wb3JhbCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENvbHVtbk1hcHBpbmcuVEVNUE9SQUxfUFJPUEVSVFksIG9sZFRlbXBvcmFsLCBuZXdUZW1wb3JhbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFRlbXBvcmFsXyhUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpIHsKLQkJVGVtcG9yYWxUeXBlIG9sZFRlbXBvcmFsID0gdGhpcy50ZW1wb3JhbDsKLQkJdGhpcy50ZW1wb3JhbCA9IG5ld1RlbXBvcmFsOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENvbHVtbk1hcHBpbmcuVEVNUE9SQUxfUFJPUEVSVFksIG9sZFRlbXBvcmFsLCBuZXdUZW1wb3JhbCk7Ci0JfQotCi0JcHVibGljIE9ybUdlbmVyYXRlZFZhbHVlIGFkZEdlbmVyYXRlZFZhbHVlKCkgewotCQlpZiAoZ2V0R2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZW1lcmF0ZWRWYWx1ZSBhbHJlYWR5IGV4aXN0cyIpOwotCQl9Ci0JCXRoaXMuZ2VuZXJhdGVkVmFsdWUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1HZW5lcmF0ZWRWYWx1ZSh0aGlzKTsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0R2VuZXJhdGVkVmFsdWUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sR2VuZXJhdGVkVmFsdWVJbXBsKCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSwgbnVsbCwgdGhpcy5nZW5lcmF0ZWRWYWx1ZSk7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVHZW5lcmF0ZWRWYWx1ZSgpIHsKLQkJaWYgKGdldEdlbmVyYXRlZFZhbHVlKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2VtZXJhdGVkVmFsdWUgZG9lcyBub3QgZXhpc3QsIGNhbm5vdCBiZSByZW1vdmVkIik7Ci0JCX0KLQkJT3JtR2VuZXJhdGVkVmFsdWUgb2xkR2VuZXJhdGVkVmFsdWUgPSB0aGlzLmdlbmVyYXRlZFZhbHVlOwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlID0gbnVsbDsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0R2VuZXJhdGVkVmFsdWUobnVsbCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZLCBvbGRHZW5lcmF0ZWRWYWx1ZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBPcm1HZW5lcmF0ZWRWYWx1ZSBnZXRHZW5lcmF0ZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVkVmFsdWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEdlbmVyYXRlZFZhbHVlKE9ybUdlbmVyYXRlZFZhbHVlIG5ld0dlbmVyYXRlZFZhbHVlKSB7Ci0JCU9ybUdlbmVyYXRlZFZhbHVlIG9sZEdlbmVyYXRlZFZhbHVlID0gdGhpcy5nZW5lcmF0ZWRWYWx1ZTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IG5ld0dlbmVyYXRlZFZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSwgb2xkR2VuZXJhdGVkVmFsdWUsIG5ld0dlbmVyYXRlZFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgT3JtU2VxdWVuY2VHZW5lcmF0b3IgYWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNlcXVlbmNlR2VuZXJhdG9yIGFscmVhZHkgZXhpc3RzIik7Ci0JCX0KLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKHRoaXMpOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRTZXF1ZW5jZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZLCBudWxsLCB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJcmV0dXJuIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZXF1ZW5jZUdlbmVyYXRvciBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGJlIHJlbW92ZWQiKTsKLQkJfQotCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBvbGRTZXF1ZW5jZUdlbmVyYXRvciA9IHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBudWxsOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZFNlcXVlbmNlR2VuZXJhdG9yLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIE9ybVNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZXF1ZW5jZUdlbmVyYXRvcihPcm1TZXF1ZW5jZUdlbmVyYXRvciBuZXdTZXF1ZW5jZUdlbmVyYXRvcikgewotCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBvbGRTZXF1ZW5jZUdlbmVyYXRvciA9IHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBuZXdTZXF1ZW5jZUdlbmVyYXRvcjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZFNlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JfQotCi0JcHVibGljIE9ybVRhYmxlR2VuZXJhdG9yIGFkZFRhYmxlR2VuZXJhdG9yKCkgewotCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0YWJsZUdlbmVyYXRvciBhbHJlYWR5IGV4aXN0cyIpOwotCQl9Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1UYWJsZUdlbmVyYXRvcih0aGlzKTsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0VGFibGVHZW5lcmF0b3IoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGVHZW5lcmF0b3JJbXBsKCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy50YWJsZUdlbmVyYXRvcik7Ci0JCXJldHVybiB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVUYWJsZUdlbmVyYXRvcigpIHsKLQkJaWYgKGdldFRhYmxlR2VuZXJhdG9yKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGFibGVHZW5lcmF0b3IgZG9lcyBub3QgZXhpc3QsIGNhbm5vdCBiZSByZW1vdmVkIik7Ci0JCX0KLQkJT3JtVGFibGVHZW5lcmF0b3Igb2xkVGFibGVHZW5lcmF0b3IgPSB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCQl0aGlzLnRhYmxlR2VuZXJhdG9yID0gbnVsbDsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0VGFibGVHZW5lcmF0b3IobnVsbCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRUYWJsZUdlbmVyYXRvciwgbnVsbCk7CQotCX0KLQkKLQlwdWJsaWMgT3JtVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKE9ybVRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yKSB7Ci0JCU9ybVRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGhpcy50YWJsZUdlbmVyYXRvcjsKLQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IG5ld1RhYmxlR2VuZXJhdG9yOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkVGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPE9ybUdlbmVyYXRvcj4gZ2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxPcm1HZW5lcmF0b3I+KAotCQkJKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkgOiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkpLAotCQkJKGdldFRhYmxlR2VuZXJhdG9yKCkgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkgOiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yKGdldFRhYmxlR2VuZXJhdG9yKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW4oKS5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSWRNYXBwaW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIFhtbElkIGFkZFRvUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCVhtbElkIGlkID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSWRJbXBsKCk7Ci0JCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pbml0aWFsaXplKGlkKTsKLQkJdHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmFkZChpZCk7Ci0JCXJldHVybiBpZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkucmVtb3ZlKHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpKTsKLQkJaWYgKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJdHlwZU1hcHBpbmcuc2V0QXR0cmlidXRlcyhudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7CQkKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbElkIGlkKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoaWQpOwotCQl0aGlzLnRlbXBvcmFsID0gdGhpcy5zcGVjaWZpZWRUZW1wb3JhbChpZCk7Ci0JCXRoaXMuY29sdW1uLmluaXRpYWxpemUoaWQuZ2V0Q29sdW1uKCkpOwotCQl0aGlzLmluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvcihpZCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9yKGlkKTsKLQkJdGhpcy5pbml0aWFsaXplR2VuZXJhdGVkVmFsdWUoaWQpOwotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlVW5pdEdlbmVyYXRvcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSBzcGVjaWZpZWRUZW1wb3JhbChYbWxJZCBpZCkgewotCQlyZXR1cm4gVGVtcG9yYWxUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKGlkLmdldFRlbXBvcmFsKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3IoWG1sSWQgaWQpIHsKLQkJaWYgKGlkLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoaWQuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgeG1sU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJT3JtU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1TZXF1ZW5jZUdlbmVyYXRvcih0aGlzKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3IuaW5pdGlhbGl6ZSh4bWxTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCXJldHVybiBzZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGVHZW5lcmF0b3IoWG1sSWQgaWQpIHsKLQkJaWYgKGlkLmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IGJ1aWxkVGFibGVHZW5lcmF0b3IoaWQuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVRhYmxlR2VuZXJhdG9yIGJ1aWxkVGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSkgewotCQlPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVRhYmxlR2VuZXJhdG9yKHRoaXMpOwotCQl0YWJsZUdlbmVyYXRvci5pbml0aWFsaXplKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRlZFZhbHVlKFhtbElkIGlkKSB7Ci0JCWlmIChpZC5nZXRHZW5lcmF0ZWRWYWx1ZSgpICE9IG51bGwpIHsKLQkJCXRoaXMuZ2VuZXJhdGVkVmFsdWUgPSBidWlsZEdlbmVyYXRlZFZhbHVlKGlkLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBPcm1HZW5lcmF0ZWRWYWx1ZSBidWlsZEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIHhtbEdlbmVyYXRlZFZhbHVlKSB7Ci0JCU9ybUdlbmVyYXRlZFZhbHVlIG9ybUdlbmVyYXRlZFZhbHVlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtR2VuZXJhdGVkVmFsdWUodGhpcyk7Ci0JCW9ybUdlbmVyYXRlZFZhbHVlLmluaXRpYWxpemUoeG1sR2VuZXJhdGVkVmFsdWUpOwotCQlyZXR1cm4gb3JtR2VuZXJhdGVkVmFsdWU7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxJZCBpZCkgewotCQlzdXBlci51cGRhdGUoaWQpOwotCQl0aGlzLnNldFRlbXBvcmFsXyh0aGlzLnNwZWNpZmllZFRlbXBvcmFsKGlkKSk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZShpZC5nZXRDb2x1bW4oKSk7Ci0JCXRoaXMudXBkYXRlU2VxdWVuY2VHZW5lcmF0b3IoaWQpOwotCQl0aGlzLnVwZGF0ZVRhYmxlR2VuZXJhdG9yKGlkKTsKLQkJdGhpcy51cGRhdGVHZW5lcmF0ZWRWYWx1ZShpZCk7Ci0JCXRoaXMudXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9ycygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZXF1ZW5jZUdlbmVyYXRvcihYbWxJZCBpZCkgewotCQlpZiAoaWQuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihpZC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlnZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnVwZGF0ZShpZC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYWJsZUdlbmVyYXRvcihYbWxJZCBpZCkgewotCQlpZiAoaWQuZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IoYnVpbGRUYWJsZUdlbmVyYXRvcihpZC5nZXRUYWJsZUdlbmVyYXRvcigpKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlnZXRUYWJsZUdlbmVyYXRvcigpLnVwZGF0ZShpZC5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVHZW5lcmF0ZWRWYWx1ZShYbWxJZCBpZCkgewotCQlpZiAoaWQuZ2V0R2VuZXJhdGVkVmFsdWUoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0R2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkJc2V0R2VuZXJhdGVkVmFsdWUobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0R2VuZXJhdGVkVmFsdWUoKSA9PSBudWxsKSB7Ci0JCQkJc2V0R2VuZXJhdGVkVmFsdWUoYnVpbGRHZW5lcmF0ZWRWYWx1ZShpZC5nZXRHZW5lcmF0ZWRWYWx1ZSgpKSk7Ci0JCQkJZ2V0R2VuZXJhdGVkVmFsdWUoKS5pbml0aWFsaXplKGlkLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ2V0R2VuZXJhdGVkVmFsdWUoKS51cGRhdGUoaWQuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9ycygpIHsKLQkJaWYgKGdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkR2VuZXJhdG9yKGdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQl9Ci0JCQotCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hZGRHZW5lcmF0b3IoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCX0KLQl9Ci0KLQkvLyoqKioqKioqKioqKioqKioqIElYbWxDb2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRDb2x1bW4oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW5JbXBsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5SZXNvdXJjZSgpIHsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0Q29sdW1uKG51bGwpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQkKLQkJaWYgKGVudGl0eU93bmVkKCkpIHsKLQkJCWFkZENvbHVtbk1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCQlhZGRHZW5lcmF0ZWRWYWx1ZU1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJYWRkR2VuZXJhdG9yTWVzc2FnZXMobWVzc2FnZXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlPcm1Db2x1bW4gY29sdW1uID0gZ2V0Q29sdW1uKCk7Ci0JCVN0cmluZyB0YWJsZSA9IGNvbHVtbi5nZXRUYWJsZSgpOwotCQlib29sZWFuIGRvQ29udGludWUgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmIGdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlKSkgewotCQkJaWYgKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpLCB0YWJsZSwgY29sdW1uLmdldE5hbWUoKX0sCi0JCQkJCQljb2x1bW4sIAotCQkJCQkJY29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0YWJsZSwgY29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJY29sdW1uLCAKLQkJCQkJCWNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCQlkb0NvbnRpbnVlID0gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmICEgY29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJaWYgKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2dldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCksIGNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWNvbHVtbiwgCi0JCQkJCQljb2x1bW4uZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sIAotCQkJCQkJY29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEdlbmVyYXRlZFZhbHVlTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJT3JtR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSBnZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZiAoZ2VuZXJhdGVkVmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBnZW5lcmF0b3JOYW1lID0gZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCk7Ci0JCWlmIChnZW5lcmF0b3JOYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZm9yIChHZW5lcmF0b3IgbmV4dE1hc3RlckdlbmVyYXRvciA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKSB7Ci0JCQlpZiAoZ2VuZXJhdG9yTmFtZS5lcXVhbHMobmV4dE1hc3RlckdlbmVyYXRvci5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQltZXNzYWdlcy5hZGQoCi0JCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5JRF9NQVBQSU5HX1VOUkVTT0xWRURfR0VORVJBVE9SX05BTUUsCi0JCQkJbmV3IFN0cmluZ1tdIHtnZW5lcmF0b3JOYW1lfSwKLQkJCQl0aGlzLAotCQkJCWdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvclRleHRSYW5nZSgpKQotCQkJKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkR2VuZXJhdG9yTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJTGlzdDxHZW5lcmF0b3I+IG1hc3Rlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpOwotCQkKLQkJZm9yIChJdGVyYXRvcjxPcm1HZW5lcmF0b3I+IHN0cmVhbSA9IHRoaXMuZ2VuZXJhdG9ycygpOyBzdHJlYW0uaGFzTmV4dCgpIDsgKSB7Ci0JCQlPcm1HZW5lcmF0b3IgY3VycmVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudC5pc1ZpcnR1YWwoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCW1hc3Rlckxpc3QucmVtb3ZlKGN1cnJlbnQpOwotCQkJCi0JCQlmb3IgKEdlbmVyYXRvciBlYWNoIDogbWFzdGVyTGlzdCkgewotCQkJCWlmICghIGVhY2gub3ZlcnJpZGVzKGN1cnJlbnQpICYmIGVhY2guZ2V0TmFtZSgpICE9IG51bGwgJiYgZWFjaC5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnQuZ2V0TmFtZSgpKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5HRU5FUkFUT1JfRFVQTElDQVRFX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldE5hbWUoKX0sCi0JCQkJCQkJY3VycmVudCwKLQkJCQkJCQljdXJyZW50LmdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkJKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCW1hc3Rlckxpc3QuYWRkKGN1cnJlbnQpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjIxMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUpvaW5Db2x1bW4gZXh0ZW5kcyBBYnN0cmFjdE9ybUJhc2VDb2x1bW48WG1sSm9pbkNvbHVtbj4gaW1wbGVtZW50cyBPcm1Kb2luQ29sdW1uCi17Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0KLQlwcm90ZWN0ZWQgWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uOwotCi0JcHVibGljIEdlbmVyaWNPcm1Kb2luQ29sdW1uKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3JtSm9pbkNvbHVtbi5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShKb2luQ29sdW1uIG9sZENvbHVtbikgewotCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRDb2x1bW4pOwotCQlzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShvbGRDb2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgOiB0aGlzLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuZXdEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgbmV3RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmlzVmlydHVhbCh0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUpvaW5Db2x1bW4uT3duZXIgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoT3JtSm9pbkNvbHVtbi5Pd25lcikgdGhpcy5vd25lcjsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCk7Ci0JfQotCi0JcHVibGljIENvbHVtbiBnZXREYlJlZmVyZW5jZWRDb2x1bW4oKSB7Ci0JCVRhYmxlIHRhYmxlID0gZGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKTsKLQkJcmV0dXJuICh0YWJsZSA9PSBudWxsKSA/IG51bGwgOiB0YWJsZS5nZXRDb2x1bW5OYW1lZChnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZWRDb2x1bW5SZXNvbHZlZCgpIHsKLQkJcmV0dXJuIGdldERiUmVmZXJlbmNlZENvbHVtbigpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpIHsKLQkJaWYgKGdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldENvbHVtblJlc291cmNlKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKTsKLQkJCWlmICh0ZXh0UmFuZ2UgIT0gbnVsbCkgewotCQkJCXJldHVybiB0ZXh0UmFuZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbEpvaW5Db2x1bW4gZ2V0Q29sdW1uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCS8vam9pbkNvbHVtbnMgYXJlIHBhcnQgb2YgYSBjb2xsZWN0aW9uLCB0aGUgam9pbi1jb2x1bW4gZWxlbWVudCB3aWxsIGJlIHJlbW92ZWQvYWRkZWQKLQkJLy93aGVuIHRoZSBYbWxKb2luQ29sdW1uIGlzIHJlbW92ZWQvYWRkZWQgdG8gdGhlIFhtbEVudGl0eSBjb2xsZWN0aW9uCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbHVtblJlc291cmNlKCkgewotCQkvL2pvaW5Db2x1bW5zIGFyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgdGhlIHBrLWpvaW4tY29sdW1uIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkL2FkZGVkCi0JCS8vd2hlbiB0aGUgWG1sSm9pbkNvbHVtbiBpcyByZW1vdmVkL2FkZGVkIHRvIHRoZSBYbWxFbnRpdHkgY29sbGVjdGlvbgotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbEpvaW5Db2x1bW4gY29sdW1uKSB7Ci0JCXRoaXMuam9pbkNvbHVtbiA9IGNvbHVtbjsKLQkJc3VwZXIuaW5pdGlhbGl6ZShjb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoY29sdW1uKTsKLQkJdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEpvaW5Db2x1bW4gY29sdW1uKSB7Ci0JCXRoaXMuam9pbkNvbHVtbiA9IGNvbHVtbjsKLQkJc3VwZXIudXBkYXRlKGNvbHVtbik7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKHNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKGNvbHVtbikpOwotCQl0aGlzLnNldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZShkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShYbWxKb2luQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gY29sdW1uID09IG51bGwgPyBudWxsIDogY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCWlmIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuaXNSZWxhdGlvbnNoaXBPd25lcigpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHROYW1lKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCWlmIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghcmVsYXRpb25zaGlwTWFwcGluZy5pc1JlbGF0aW9uc2hpcE93bmVyKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luQ29sdW1uRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYWJsZSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCWlmIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghcmVsYXRpb25zaGlwTWFwcGluZy5pc1JlbGF0aW9uc2hpcE93bmVyKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5kZWZhdWx0VGFibGUoKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKiogdXNlZCBpbnRlcm5hbGx5IGFzIGEgbWVjaGFuaXNtIHRvIHNob3J0IGNpcmN1aXQgY29udGludWVkIG1lc3NhZ2UgYWRkaW5nICovCi0JcHJpdmF0ZSBib29sZWFuIGRvQ29udGludWU7Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJdGhpcy5kb0NvbnRpbnVlID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCi0JCU9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZyA9IChPcm1SZWxhdGlvbnNoaXBNYXBwaW5nKSBnZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJLy9UT0RPIHdoeSBpcyB0aGlzIGNvbW1lbnRlZCBvdXQ/ICBpIGNvcGllZCBpdCBsaWtlIHRoaXMgZnJvbSB0aGUgbWFpbnRlbmFuY2Ugc3RyZWFtCi0vLwkJaWYgKGRvQ29udGludWUgJiYgdHlwZU1hcHBpbmcudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlKSkgewotLy8JCQlpZiAobWFwcGluZy5pc1ZpcnR1YWwoKSkgewotLy8JCQkJbWVzc2FnZXMuYWRkKAotLy8JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0vLwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0vLwkJCQkJCUlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0vLwkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpLCB0YWJsZSwgY29sdW1uLmdldE5hbWUoKX0sCi0vLwkJCQkJCWNvbHVtbiwgY29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkpCi0vLwkJCQkpOwotLy8JCQl9Ci0vLwkJCWVsc2UgewotLy8JCQkJbWVzc2FnZXMuYWRkKAotLy8JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0vLwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0vLwkJCQkJCUlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0vLwkJCQkJCW5ldyBTdHJpbmdbXSB7dGFibGUsIGNvbHVtbi5nZXROYW1lKCl9LCAKLS8vCQkJCQkJY29sdW1uLCBjb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoKSkKLS8vCQkJCSk7Ci0vLwkJCX0KLS8vCQkJZG9Db250aW51ZSA9IGZhbHNlOwotLy8JCX0KLS8vCQkKLQkJaWYgKHRoaXMuZG9Db250aW51ZSAmJiAhIGlzUmVzb2x2ZWQoKSkgewotCQkJaWYgKG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwcGluZy5nZXROYW1lKCksIGdldE5hbWUoKX0sIAotCQkJCQkJdGhpcywgCi0JCQkJCQlnZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2dldE5hbWUoKX0sIAotCQkJCQkJdGhpcywgCi0JCQkJCQlnZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtSm9pblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDYwOWRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtSm9pblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTm9uT3duaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtSm9pblRhYmxlIGV4dGVuZHMgQWJzdHJhY3RPcm1UYWJsZSBpbXBsZW1lbnRzIE9ybUpvaW5UYWJsZQotewotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnM7Ci0KLQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbjsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUpvaW5Db2x1bW4+IHNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uczsKLQotCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uIGRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKLQkKLQlwcm90ZWN0ZWQgWG1sUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nUmVzb3VyY2U7Ci0JCi0JcHVibGljIEdlbmVyaWNPcm1Kb2luVGFibGUoT3JtUmVsYXRpb25zaGlwTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8T3JtSm9pbkNvbHVtbj4oKTsKLQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE9ybUpvaW5Db2x1bW4+KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1SZWxhdGlvbnNoaXBNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKEpvaW5UYWJsZSBvbGRKb2luVGFibGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkSm9pblRhYmxlKTsKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yIChKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob2xkSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlPcm1Kb2luQ29sdW1uIG5ld0pvaW5Db2x1bW4gPSBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGluZGV4KyspOwotCQkJbmV3Sm9pbkNvbHVtbi5pbml0aWFsaXplRnJvbShqb2luQ29sdW1uKTsKLQkJfQotCQlpbmRleCA9IDA7Ci0JCWZvciAoSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9sZEpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSkpIHsKLQkJCU9ybUpvaW5Db2x1bW4gbmV3Sm9pbkNvbHVtbiA9IGFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGluZGV4KyspOwotCQkJbmV3Sm9pbkNvbHVtbi5pbml0aWFsaXplRnJvbShqb2luQ29sdW1uKTsKLQkJfQotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKiogQWJzdHJhY3RPcm1UYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2coKSB7Ci0JCWlmICghZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmlzUmVsYXRpb25zaGlwT3duZXIoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pblRhYmxlRGVmYXVsdE5hbWUoZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hKCkgewotCQlpZiAoIWdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5pc1JlbGF0aW9uc2hpcE93bmVyKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVRhYmxlUmVzb3VyY2UoKSB7Ci0JCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZ1Jlc291cmNlLnNldEpvaW5UYWJsZShudWxsKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFibGVSZXNvdXJjZSgpIHsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nUmVzb3VyY2Uuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKSk7Ci0JCQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxKb2luVGFibGUgZ2V0VGFibGVSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwTWFwcGluZ1Jlc291cmNlLmdldEpvaW5UYWJsZSgpOwotCX0KLQotCQotCS8vKioqKioqKioqKioqKioqKioqKiBKb2luVGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQotCS8vKioqKioqKioqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqKioqKioqKioqKioqCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucygpIDogdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA/IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmRlZmF1bHRKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+KHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMpOwotCX0KLQotCXB1YmxpYyBpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gZGVmYXVsdEpvaW5Db2x1bW5zKCkgewotCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0Sm9pbkNvbHVtbik7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7Ci0JfQotCQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEpvaW5Db2x1bW4oT3JtSm9pbkNvbHVtbiBuZXdKb2luQ29sdW1uKSB7Ci0JCU9ybUpvaW5Db2x1bW4gb2xkSm9pbkNvbHVtbiA9IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBuZXdKb2luQ29sdW1uOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEpvaW5UYWJsZS5ERUZBVUxUX0pPSU5fQ09MVU1OLCBvbGRKb2luQ29sdW1uLCBuZXdKb2luQ29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gIXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCWlmIChnZXRUYWJsZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJYWRkVGFibGVSZXNvdXJjZSgpOwotCQl9Ci0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUpvaW5Db2x1bW4odGhpcywgbmV3IEpvaW5Db2x1bW5Pd25lcigpKTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5hZGQoaW5kZXgsIGpvaW5Db2x1bW4pOwotCQlYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uSW1wbCgpOwotCQlqb2luQ29sdW1uLmluaXRpYWxpemUoeG1sSm9pbkNvbHVtbik7Ci0JCXRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLmdldEpvaW5Db2x1bW5zKCkuYWRkKGluZGV4LCB4bWxKb2luQ29sdW1uKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgsIE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCBKb2luVGFibGUuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJT3JtSm9pbkNvbHVtbiByZW1vdmVkSm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKLQkJaWYgKCFjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpIHsKLQkJCS8vY3JlYXRlIHRoZSBkZWZhdWx0Sm9pbkNvbHVtbiBub3cgb3IgdGhpcyB3aWxsIGhhcHBlbiBkdXJpbmcgcHJvamVjdCB1cGRhdGUgCi0JCQkvL2FmdGVyIHJlbW92aW5nIHRoZSBqb2luIGNvbHVtbiBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4gVGhhdCBjYXVzZXMgcHJvYmxlbXMgCi0JCQkvL2luIHRoZSBVSSBiZWNhdXNlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBlbmQgdXAgaW4gdGhlIHdyb25nIG9yZGVyLgotCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IGJ1aWxkSm9pbkNvbHVtbihudWxsKTsKLQkJfQotCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChKb2luVGFibGUuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZEpvaW5Db2x1bW4pOwotCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL2ZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbiBpZiBhIGRlZmF1bHRKb2luQ29sdW1uIHdhcyBjcmVhdGVkIGFib3ZlCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSm9pblRhYmxlLkRFRkFVTFRfSk9JTl9DT0xVTU4sIG51bGwsIHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbl8oT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCBKb2luVGFibGUuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5nZXRUYWJsZVJlc291cmNlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoSm9pblRhYmxlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQkKLQkvLyoqKioqKioqKioqKioqKioqKiBpbnZlcnNlIGpvaW4gY29sdW1ucyAqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbnNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSA/IHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgOiB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBpbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4odGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMpOwotCX0KLQotCXB1YmxpYyBpbnQgc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlpZiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oT3JtSm9pbkNvbHVtbiBuZXdKb2luQ29sdW1uKSB7Ci0JCU9ybUpvaW5Db2x1bW4gb2xkSm9pbkNvbHVtbiA9IHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uOwotCQl0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiA9IG5ld0pvaW5Db2x1bW47Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSm9pblRhYmxlLkRFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTiwgb2xkSm9pbkNvbHVtbiwgbmV3Sm9pbkNvbHVtbik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gIXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJaWYgKGdldFRhYmxlUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQlhZGRUYWJsZVJlc291cmNlKCk7Ci0JCX0KLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtSm9pbkNvbHVtbih0aGlzLCBuZXcgSW52ZXJzZUpvaW5Db2x1bW5Pd25lcigpKTsKLQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMuYWRkKGluZGV4LCBqb2luQ29sdW1uKTsKLQkJWG1sSm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbkltcGwoKTsKLQkJam9pbkNvbHVtbi5pbml0aWFsaXplKHhtbEpvaW5Db2x1bW4pOwotCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5hZGQoaW5kZXgsIHhtbEpvaW5Db2x1bW4pOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgam9pbkNvbHVtbik7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgsIE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucywgSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU9ybUpvaW5Db2x1bW4gcmVtb3ZlZEpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOwotCQlpZiAoIWNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkpIHsKLQkJCS8vY3JlYXRlIHRoZSBkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gbm93IG9yIHRoaXMgd2lsbCBoYXBwZW4gZHVyaW5nIHByb2plY3QgdXBkYXRlIAotCQkJLy9hZnRlciByZW1vdmluZyB0aGUgam9pbiBjb2x1bW4gZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuIFRoYXQgY2F1c2VzIHByb2JsZW1zIAotCQkJLy9pbiB0aGUgVUkgYmVjYXVzZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgZW5kIHVwIGluIHRoZSB3cm9uZyBvcmRlci4KLQkJCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihudWxsKTsKLQkJfQotCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZEpvaW5Db2x1bW4pOwotCQlpZiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJLy9maXJlIGNoYW5nZSBub3RpZmljYXRpb24gaWYgYSBkZWZhdWx0Sm9pbkNvbHVtbiB3YXMgY3JlYXRlZCBhYm92ZQotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpvaW5UYWJsZS5ERUZBVUxUX0lOVkVSU0VfSk9JTl9DT0xVTU4sIG51bGwsIHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uXyhPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLCBKb2luVGFibGUuU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLmdldEludmVyc2VKb2luQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChKb2luVGFibGUuU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKioqIE9ybUpvaW5UYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZVJlc291cmNlKCkgIT0gbnVsbCAmJiBnZXRUYWJsZVJlc291cmNlKCkuaXNTcGVjaWZpZWQoKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZ1Jlc291cmNlID0gcmVsYXRpb25zaGlwTWFwcGluZzsKLQkJdGhpcy5pbml0aWFsaXplKHRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmdSZXNvdXJjZSA9IHJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0JCXRoaXMudXBkYXRlKHRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbEpvaW5UYWJsZSBqb2luVGFibGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShqb2luVGFibGUpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRKb2luQ29sdW1ucyhqb2luVGFibGUpOwotCQl0aGlzLmluaXRpYWxpemVEZWZhdWx0Sm9pbkNvbHVtbigpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoam9pblRhYmxlKTsKLQkJdGhpcy5pbml0aWFsaXplRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRKb2luQ29sdW1ucyhYbWxKb2luVGFibGUgam9pblRhYmxlKSB7Ci0JCWlmIChqb2luVGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkpIHsKLQkJCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuYWRkKGJ1aWxkSm9pbkNvbHVtbihqb2luQ29sdW1uKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRKb2luQ29sdW1uKCkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBidWlsZEpvaW5Db2x1bW4obnVsbCk7Ci0JfQkKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoWG1sSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCQlpZiAoam9pblRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKFhtbEpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMuYWRkKGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4oam9pbkNvbHVtbikpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCWlmICghc2hvdWxkQnVpbGREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihudWxsKTsKLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShYbWxKb2luVGFibGUgam9pblRhYmxlKSB7Ci0JCXN1cGVyLnVwZGF0ZShqb2luVGFibGUpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKGpvaW5UYWJsZSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJdGhpcy51cGRhdGVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoam9pblRhYmxlKTsKLQkJdGhpcy51cGRhdGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKFhtbEpvaW5UYWJsZSBqb2luVGFibGUpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbEpvaW5Db2x1bW4+IHJlc291cmNlSm9pbkNvbHVtbnMgPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlpZiAoam9pblRhYmxlICE9IG51bGwpIHsKLQkJCXJlc291cmNlSm9pbkNvbHVtbnMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sSm9pbkNvbHVtbj4oam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQl9Ci0JCQotCQl3aGlsZSAoam9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQlqb2luQ29sdW1uLnVwZGF0ZShyZXNvdXJjZUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uXyhqb2luQ29sdW1uKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRKb2luQ29sdW1uKHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpLCBidWlsZEpvaW5Db2x1bW4ocmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRCdWlsZERlZmF1bHRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gIWNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJaWYgKCFzaG91bGRCdWlsZERlZmF1bHRKb2luQ29sdW1uKCkpIHsKLQkJCXNldERlZmF1bHRKb2luQ29sdW1uKG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXREZWZhdWx0Sm9pbkNvbHVtbigpID09IG51bGwpIHsKLQkJCXRoaXMuc2V0RGVmYXVsdEpvaW5Db2x1bW4oYnVpbGRKb2luQ29sdW1uKG51bGwpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4udXBkYXRlKG51bGwpOwotCQl9Ci0JfQkKLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyhYbWxKb2luVGFibGUgam9pblRhYmxlKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbEpvaW5Db2x1bW4+IHJlc291cmNlSW52ZXJzZUpvaW5Db2x1bW5zID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJaWYgKGpvaW5UYWJsZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZUludmVyc2VKb2luQ29sdW1ucyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxKb2luQ29sdW1uPihqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQl9Ci0JCQotCQl3aGlsZSAoaW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZUludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQlqb2luQ29sdW1uLnVwZGF0ZShyZXNvdXJjZUludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5fKGpvaW5Db2x1bW4pOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VJbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCksIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4ocmVzb3VyY2VJbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQnVpbGREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhY29udGFpbnNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCWlmICghc2hvdWxkQnVpbGREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSkgewotCQkJc2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihidWlsZEludmVyc2VKb2luQ29sdW1uKG51bGwpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uLnVwZGF0ZShudWxsKTsKLQkJfQotCX0JCi0JCi0JcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW4gYnVpbGRKb2luQ29sdW1uKFhtbEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1Kb2luQ29sdW1uKHRoaXMsIG5ldyBKb2luQ29sdW1uT3duZXIoKSk7Ci0JCW9ybUpvaW5Db2x1bW4uaW5pdGlhbGl6ZShqb2luQ29sdW1uKTsKLQkJcmV0dXJuIG9ybUpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4oWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUpvaW5Db2x1bW4odGhpcywgbmV3IEludmVyc2VKb2luQ29sdW1uT3duZXIoKSk7Ci0JCW9ybUpvaW5Db2x1bW4uaW5pdGlhbGl6ZShqb2luQ29sdW1uKTsKLQkJcmV0dXJuIG9ybUpvaW5Db2x1bW47Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKiogdXNlZCBpbnRlcm5hbGx5IGFzIGEgbWVjaGFuaXNtIHRvIHNob3J0IGNpcmN1aXQgY29udGludWVkIG1lc3NhZ2UgYWRkaW5nICovCi0JcHJpdmF0ZSBib29sZWFuIGRvQ29udGludWU7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQl0aGlzLmFkZFRhYmxlTWVzc2FnZXMobWVzc2FnZXMpOwotCQkKLQkJaWYgKHRoaXMuZG9Db250aW51ZSkgewotCQkJZm9yIChPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoam9pbkNvbHVtbnMoKSkpIHsKLQkJCQlqb2luQ29sdW1uLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQkJfQotCQkJCi0JCQlmb3IgKE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMoKSkpIHsKLQkJCQlqb2luQ29sdW1uLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJdGhpcy5kb0NvbnRpbnVlID0gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQlTdHJpbmcgc2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0JCU9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZyA9IGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkKLQkJaWYgKHRoaXMuZG9Db250aW51ZSAmJiAhIGhhc1Jlc29sdmVkU2NoZW1hKCkpIHsKLQkJCWlmIChtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsCi0JCQkJCQluZXcgU3RyaW5nW10ge21hcHBpbmcuZ2V0TmFtZSgpLCBzY2hlbWEsIGdldE5hbWUoKX0sIAotCQkJCQkJdGhpcywgCi0JCQkJCQlnZXRTY2hlbWFUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJCQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7c2NoZW1hLCBnZXROYW1lKCl9LCAKLQkJCQkJCXRoaXMsIAotCQkJCQkJZ2V0U2NoZW1hVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCXRoaXMuZG9Db250aW51ZSA9IGZhbHNlOwotCQl9Ci0JCQotCQlpZiAodGhpcy5kb0NvbnRpbnVlICYmICEgaXNSZXNvbHZlZCgpKSB7Ci0JCQlpZiAobWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwcGluZy5nZXROYW1lKCksIGdldE5hbWUoKX0sIAotCQkJCQkJdGhpcywgCi0JCQkJCQlnZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCl9LCAKLQkJCQkJCXRoaXMsIAotCQkJCQkJZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICoganVzdCBhIGxpdHRsZSBjb21tb24gYmVoYXZpb3IKLQkgKi8KLQlhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lciBpbXBsZW1lbnRzIE9ybUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0JCUFic3RyYWN0Sm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCQkKLQkJcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRoZSBkZWZhdWx0IHRhYmxlIG5hbWUgaXMgYWx3YXlzIHZhbGlkIGFuZCBhIHNwZWNpZmllZCB0YWJsZSBuYW1lCi0JCSAqIGlzIHByb2hpYml0ZWQgKHdoaWNoIHdpbGwgYmUgaGFuZGxlZCBlbHNld2hlcmUpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRoZSBqb2luIGNvbHVtbiBjYW4gb25seSBiZSBvbiB0aGUgam9pbiB0YWJsZSBpdHNlbGYKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlSXNBbGxvd2VkKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCWlmIChHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiAoR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldE5hbWUoKS5lcXVhbHModGFibGVOYW1lKSkgPyBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0RGJUYWJsZSgpIDogbnVsbDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIGJ5IGRlZmF1bHQsIHRoZSBqb2luIGNvbHVtbiBpcywgb2J2aW91c2x5LCBpbiB0aGUgam9pbiB0YWJsZTsKLQkJICogbm90IHN1cmUgd2hldGhlciBpdCBjYW4gYmUgYW55d2hlcmUgZWxzZS4uLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogb3duZXIgZm9yICJmb3J3YXJkLXBvaW50ZXIiIEpvaW5Db2x1bW5zOwotCSAqIHRoZXNlIHBvaW50IGF0IHRoZSB0YXJnZXQvaW52ZXJzZSBlbnRpdHkKLQkgKi8KLQljbGFzcyBJbnZlcnNlSm9pbkNvbHVtbk93bmVyIGV4dGVuZHMgQWJzdHJhY3RKb2luQ29sdW1uT3duZXIKLQl7Ci0JCXB1YmxpYyBJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldE5hbWUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGRiVGFibGUgPSBzdXBlci5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCQlpZiAoZGJUYWJsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGRiVGFibGU7Ci0JCQl9Ci0JCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiB0YXJnZXRFbnRpdHkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRUYXJnZXRFbnRpdHkoKTsKLQkJCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0JCQotCX0KLQotCi0JLyoqCi0JICogb3duZXIgZm9yICJiYWNrLXBvaW50ZXIiIEpvaW5Db2x1bW5zOwotCSAqIHRoZXNlIHBvaW50IGF0IHRoZSBzb3VyY2Uvb3duaW5nIGVudGl0eQotCSAqLwotCWNsYXNzIEpvaW5Db2x1bW5Pd25lciBleHRlbmRzIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyCi0JewotCQlwdWJsaWMgSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0TmFtZSgpOwotCQkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSB0YXJnZXRFbnRpdHkuZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQkJaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBOb25Pd25pbmdNYXBwaW5nKSB7Ci0JCQkJCVN0cmluZyBtYXBwZWRCeSA9ICgoTm9uT3duaW5nTWFwcGluZykgbWFwcGluZykuZ2V0TWFwcGVkQnkoKTsKLQkJCQkJaWYgKChtYXBwZWRCeSAhPSBudWxsKSAmJiBtYXBwZWRCeS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpIHsKLQkJCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCW9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBkYlRhYmxlID0gc3VwZXIuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQkJcmV0dXJuIChkYlRhYmxlICE9IG51bGwpID8gZGJUYWJsZSA6IGdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzM0MWE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Ob25Pd25pbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPFhtbE1hbnlUb01hbnk+Ci0JaW1wbGVtZW50cyBPcm1NYW55VG9NYW55TWFwcGluZwotewotCi0JcHVibGljIEdlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1NYW55VG9NYW55TWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVhtbE5vbk93bmluZ01hcHBpbmcoTm9uT3duaW5nTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tWG1sTm9uT3duaW5nTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJc2V0TWFwcGVkQnkob2xkTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gNzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE5vbk93bmluZ01hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5SXNWYWxpZChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBlZEJ5TWFwcGluZykgewotCQlTdHJpbmcgbWFwcGVkQnlLZXkgPSBtYXBwZWRCeU1hcHBpbmcuZ2V0S2V5KCk7Ci0JCXJldHVybiAobWFwcGVkQnlLZXkgPT0gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JfQotCQotCXB1YmxpYyBYbWxNYW55VG9NYW55IGFkZFRvUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hbnlUb01hbnlJbXBsKCk7Ci0JCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pbml0aWFsaXplKG1hbnlUb01hbnkpOwotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5hZGQobWFueVRvTWFueSk7Ci0JCXJldHVybiBtYW55VG9NYW55OwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLnJlbW92ZSh0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCWlmICh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCXR5cGVNYXBwaW5nLnNldEF0dHJpYnV0ZXMobnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY5ODc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPFhtbE1hbnlUb09uZT4KLQlpbXBsZW1lbnRzIE9ybU1hbnlUb09uZU1hcHBpbmcKLXsKLQotCXB1YmxpYyBHZW5lcmljT3JtTWFueVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiA0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCS8vTWFueVRvT25lIG1hcHBpbmcgaXMgYWx3YXlzIHRoZSBvd25pbmcgc2lkZQotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1NYW55VG9PbmVNYXBwaW5nKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkJCi0JcHVibGljIFhtbE1hbnlUb09uZSBhZGRUb1Jlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFueVRvT25lSW1wbCgpOwotCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaW5pdGlhbGl6ZShtYW55VG9PbmUpOwotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmFkZChtYW55VG9PbmUpOwotCQlyZXR1cm4gbWFueVRvT25lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkucmVtb3ZlKHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpKTsKLQkJaWYgKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJdHlwZU1hcHBpbmcuc2V0QXR0cmlidXRlcyhudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFwcGVkU3VwZXJjbGFzcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBwZWRTdXBlcmNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDgxZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBwZWRTdXBlcmNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU1hcHBlZFN1cGVyY2xhc3MgZXh0ZW5kcyBBYnN0cmFjdE9ybVR5cGVNYXBwaW5nPFhtbE1hcHBlZFN1cGVyY2xhc3M+Ci0JaW1wbGVtZW50cyBPcm1NYXBwZWRTdXBlcmNsYXNzCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBpZENsYXNzOwotCQotCXB1YmxpYyBHZW5lcmljT3JtTWFwcGVkU3VwZXJjbGFzcyhPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmlkQ2xhc3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldElkQ2xhc3MoU3RyaW5nIG5ld0lkQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZElkQ2xhc3MgPSB0aGlzLmlkQ2xhc3M7Ci0JCXRoaXMuaWRDbGFzcyA9IG5ld0lkQ2xhc3M7Ci0JCWlmIChvbGRJZENsYXNzICE9IG5ld0lkQ2xhc3MpIHsKLQkJCWlmICh0aGlzLmlkQ2xhc3NSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmlkQ2xhc3NSZXNvdXJjZSgpLnNldENsYXNzTmFtZShuZXdJZENsYXNzKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5pZENsYXNzUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVJZENsYXNzUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdJZENsYXNzICE9IG51bGwpIHsKLQkJCQlhZGRJZENsYXNzUmVzb3VyY2UoKTsKLQkJCQlpZENsYXNzUmVzb3VyY2UoKS5zZXRDbGFzc05hbWUobmV3SWRDbGFzcyk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJZENsYXNzLklEX0NMQVNTX1BST1BFUlRZLCBvbGRJZENsYXNzLCBuZXdJZENsYXNzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SWRDbGFzc18oU3RyaW5nIG5ld0lkQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZElkQ2xhc3MgPSB0aGlzLmlkQ2xhc3M7Ci0JCXRoaXMuaWRDbGFzcyA9IG5ld0lkQ2xhc3M7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSWRDbGFzcy5JRF9DTEFTU19QUk9QRVJUWSwgb2xkSWRDbGFzcywgbmV3SWRDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbElkQ2xhc3MgaWRDbGFzc1Jlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldElkQ2xhc3MoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRDbGFzc1Jlc291cmNlKCkgewotCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0SWRDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxJZENsYXNzKCkpOwkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUlkQ2xhc3NSZXNvdXJjZSgpIHsKLQkJZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLnNldElkQ2xhc3MobnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzT2YodGhpcy5vdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG8pIHsKLQkJCQlyZXR1cm4gby5pc092ZXJyaWRhYmxlQXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc09mKHRoaXMub3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgewotCQkJCXJldHVybiBvLmlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBuYW1lc09mKEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZz4oYXR0cmlidXRlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIG1ldGFkYXRhQ29tcGxldGUoWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCXJldHVybiBtYXBwZWRTdXBlcmNsYXNzLmdldE1ldGFkYXRhQ29tcGxldGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJZW50aXR5TWFwcGluZ3MuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkucmVtb3ZlKHRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpKTsKLQl9Ci0JCi0JcHVibGljIFhtbE1hcHBlZFN1cGVyY2xhc3MgYWRkVG9SZXNvdXJjZU1vZGVsKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJZ2V0UGVyc2lzdGVudFR5cGUoKS5pbml0aWFsaXplKG1hcHBlZFN1cGVyY2xhc3MpOwotCQllbnRpdHlNYXBwaW5ncy5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5hZGQobWFwcGVkU3VwZXJjbGFzcyk7Ci0JCXJldHVybiBtYXBwZWRTdXBlcmNsYXNzOwotCX0KLQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUobWFwcGVkU3VwZXJjbGFzcyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUlkQ2xhc3ModGhpcy5pZENsYXNzUmVzb3VyY2UoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJZENsYXNzKFhtbElkQ2xhc3MgaWRDbGFzc1Jlc291cmNlKSB7Ci0JCXRoaXMuaWRDbGFzcyA9IHRoaXMuaWRDbGFzcyhpZENsYXNzUmVzb3VyY2UpOwkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcykgewotCQlzdXBlci51cGRhdGUobWFwcGVkU3VwZXJjbGFzcyk7Ci0JCXRoaXMudXBkYXRlSWRDbGFzcyh0aGlzLmlkQ2xhc3NSZXNvdXJjZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSWRDbGFzcyhYbWxJZENsYXNzIGlkQ2xhc3NSZXNvdXJjZSkgewotCQl0aGlzLnNldElkQ2xhc3NfKHRoaXMuaWRDbGFzcyhpZENsYXNzUmVzb3VyY2UpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkQ2xhc3MoWG1sSWRDbGFzcyBpZENsYXNzUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGlkQ2xhc3NSZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IGlkQ2xhc3NSZXNvdXJjZS5nZXRDbGFzc05hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTmFtZWROYXRpdmVRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTUxYjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnk7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1OYW1lZE5hdGl2ZVF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RPcm1RdWVyeTxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PgotCWltcGxlbWVudHMgT3JtTmFtZWROYXRpdmVRdWVyeQotewotCi0JcHJvdGVjdGVkIFN0cmluZyByZXN1bHRDbGFzczsKLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZzsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1OYW1lZE5hdGl2ZVF1ZXJ5KE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDbGFzcyhTdHJpbmcgbmV3UmVzdWx0Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZFJlc3VsdENsYXNzID0gdGhpcy5yZXN1bHRDbGFzczsKLQkJdGhpcy5yZXN1bHRDbGFzcyA9IG5ld1Jlc3VsdENsYXNzOwotCQlnZXRRdWVyeVJlc291cmNlKCkuc2V0UmVzdWx0Q2xhc3MobmV3UmVzdWx0Q2xhc3MpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5hbWVkTmF0aXZlUXVlcnkuUkVTVUxUX0NMQVNTX1BST1BFUlRZLCBvbGRSZXN1bHRDbGFzcywgbmV3UmVzdWx0Q2xhc3MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0U2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMucmVzdWx0U2V0TWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRTZXRNYXBwaW5nKFN0cmluZyBuZXdSZXN1bHRTZXRNYXBwaW5nKSB7Ci0JCVN0cmluZyBvbGRSZXN1bHRTZXRNYXBwaW5nID0gdGhpcy5yZXN1bHRTZXRNYXBwaW5nOwotCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSBuZXdSZXN1bHRTZXRNYXBwaW5nOwotCQlnZXRRdWVyeVJlc291cmNlKCkuc2V0UmVzdWx0U2V0TWFwcGluZyhuZXdSZXN1bHRTZXRNYXBwaW5nKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOYW1lZE5hdGl2ZVF1ZXJ5LlJFU1VMVF9TRVRfTUFQUElOR19QUk9QRVJUWSwgb2xkUmVzdWx0U2V0TWFwcGluZywgbmV3UmVzdWx0U2V0TWFwcGluZyk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbE5hbWVkTmF0aXZlUXVlcnkgcXVlcnlSZXNvdXJjZSkgewotCQlzdXBlci5pbml0aWFsaXplKHF1ZXJ5UmVzb3VyY2UpOwotCQl0aGlzLnJlc3VsdENsYXNzID0gcXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRDbGFzcygpOwotCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSBxdWVyeVJlc291cmNlLmdldFJlc3VsdFNldE1hcHBpbmcoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbE5hbWVkTmF0aXZlUXVlcnkgcXVlcnlSZXNvdXJjZSkgewotCQlzdXBlci51cGRhdGUocXVlcnlSZXNvdXJjZSk7Ci0JCXRoaXMuc2V0UmVzdWx0Q2xhc3MocXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJdGhpcy5zZXRSZXN1bHRTZXRNYXBwaW5nKHF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTmFtZWRRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OYW1lZFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDAwNDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OYW1lZFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU5hbWVkUXVlcnkgZXh0ZW5kcyBBYnN0cmFjdE9ybVF1ZXJ5PFhtbE5hbWVkUXVlcnk+IGltcGxlbWVudHMgT3JtTmFtZWRRdWVyeQotewotCi0JcHVibGljIEdlbmVyaWNPcm1OYW1lZFF1ZXJ5KE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWI3OTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc+Ci17Ci0KLQlwdWJsaWMgR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybUF0dHJpYnV0ZU1hcHBpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBhZGRUb1Jlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMGRkNzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTm9uT3duaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtT25lVG9NYW55TWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPFhtbE9uZVRvTWFueT4KLQlpbXBsZW1lbnRzIE9ybU9uZVRvTWFueU1hcHBpbmcKLXsKLQotCXB1YmxpYyBHZW5lcmljT3JtT25lVG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybU9uZVRvTWFueU1hcHBpbmcodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21YbWxOb25Pd25pbmdNYXBwaW5nKE5vbk93bmluZ01hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVhtbE5vbk93bmluZ01hcHBpbmcob2xkTWFwcGluZyk7Ci0JCXNldE1hcHBlZEJ5KG9sZE1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBOb25Pd25pbmdNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgYm9vbGVhbiBtYXBwZWRCeUlzVmFsaWQoQXR0cmlidXRlTWFwcGluZyBtYXBwZWRCeU1hcHBpbmcpIHsKLQkJU3RyaW5nIG1hcHBlZEJ5S2V5ID0gbWFwcGVkQnlNYXBwaW5nLmdldEtleSgpOwotCQlyZXR1cm4gKG1hcHBlZEJ5S2V5ID09IE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JfQotCQotCXB1YmxpYyBYbWxPbmVUb01hbnkgYWRkVG9SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9uZVRvTWFueUltcGwoKTsKLQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmluaXRpYWxpemUob25lVG9NYW55KTsKLQkJdHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5hZGQob25lVG9NYW55KTsKLQkJcmV0dXJuIG9uZVRvTWFueTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLnJlbW92ZSh0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCWlmICh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCXR5cGVNYXBwaW5nLnNldEF0dHJpYnV0ZXMobnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljZjQ3Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTm9uT3duaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc8WG1sT25lVG9PbmU+Ci0JaW1wbGVtZW50cyBPcm1PbmVUb09uZU1hcHBpbmcKLXsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZEJ5OwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1PbmVUb09uZU1hcHBpbmcodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21YbWxOb25Pd25pbmdNYXBwaW5nKE5vbk93bmluZ01hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVhtbE5vbk93bmluZ01hcHBpbmcob2xkTWFwcGluZyk7Ci0JCXNldE1hcHBlZEJ5KG9sZE1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7Ci0JCXJldHVybiBnZXRNYXBwZWRCeSgpID09IG51bGw7Ci0JfQotCi0JCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgcHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLCBuZXcgSm9pbkNvbHVtbk93bmVyKCkpOwotCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiB4bWxQa0pvaW5Db2x1bW4gPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoKTsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGluZGV4LCBwa0pvaW5Db2x1bW4pOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoaW5kZXgsIHhtbFBrSm9pbkNvbHVtbik7Ci0JCXBrSm9pbkNvbHVtbi5pbml0aWFsaXplKHhtbFBrSm9pbkNvbHVtbik7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChPbmVUb09uZU1hcHBpbmcuUFJJTUFZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHBrSm9pbkNvbHVtbik7Ci0JCXJldHVybiBwa0pvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4LCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGpvaW5Db2x1bW4sIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLCBPbmVUb09uZU1hcHBpbmcuUFJJTUFZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaW5kZXhPZihwa0pvaW5Db2x1bW4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHJlbW92ZWRQa0pvaW5Db2x1bW4gPSB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoT25lVG9PbmVNYXBwaW5nLlBSSU1BWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCByZW1vdmVkUGtKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbl8oT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIE9uZVRvT25lTWFwcGluZy5QUklNQVlfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoT25lVG9PbmVNYXBwaW5nLlBSSU1BWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAhdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBuZXdNYXBwZWRCeSkgewotCQlTdHJpbmcgb2xkTWFwcGVkQnkgPSB0aGlzLm1hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5ID0gbmV3TWFwcGVkQnk7Ci0JCWdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRNYXBwZWRCeShuZXdNYXBwZWRCeSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX1BST1BFUlRZLCBvbGRNYXBwZWRCeSwgbmV3TWFwcGVkQnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwZWRCeV8oU3RyaW5nIG5ld01hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGRNYXBwZWRCeSA9IHRoaXMubWFwcGVkQnk7Ci0JCXRoaXMubWFwcGVkQnkgPSBuZXdNYXBwZWRCeTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZE1hcHBlZEJ5LCBuZXdNYXBwZWRCeSk7Ci0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBtYXBwZWRCeUlzVmFsaWQoQXR0cmlidXRlTWFwcGluZyBtYXBwZWRCeU1hcHBpbmcpIHsKLQkJU3RyaW5nIG1hcHBlZEJ5S2V5ID0gbWFwcGVkQnlNYXBwaW5nLmdldEtleSgpOwotCQlyZXR1cm4gKG1hcHBlZEJ5S2V5ID09IE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgbWFwcGVkQnlUZXh0UmFuZ2UgPSBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKTsKLQkJcmV0dXJuIG1hcHBlZEJ5VGV4dFJhbmdlICE9IG51bGwgPyBtYXBwZWRCeVRleHRSYW5nZSA6IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiA2OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBYbWxPbmVUb09uZSBhZGRUb1Jlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9uZVRvT25lSW1wbCgpOwotCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaW5pdGlhbGl6ZShvbmVUb09uZSk7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5hZGQob25lVG9PbmUpOwotCQlyZXR1cm4gb25lVG9PbmU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJdHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLnJlbW92ZSh0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCWlmICh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCXR5cGVNYXBwaW5nLnNldEF0dHJpYnV0ZXMobnVsbCk7Ci0JCX0KLQl9CQotCi0JCi0JLy8qKioqKioqKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCi0JCWlmICh0aGlzLmdldE1hcHBlZEJ5KCkgIT0gbnVsbCkgewotCQkJYWRkTWFwcGVkQnlNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkSm9pbkNvbHVtbk1lc3NhZ2VzKCkgewotCQlpZiAoY29udGFpbnNQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSAmJiAhY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmFkZEpvaW5Db2x1bW5NZXNzYWdlcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXBwZWRCeU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCVN0cmluZyBtYXBwZWRCeSA9IHRoaXMuZ2V0TWFwcGVkQnkoKTsKLQkJRW50aXR5IHRhcmdldEVudGl0eSA9IHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJCi0JCWlmICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgewotCQkJLy8gYWxyZWFkeSBoYXZlIHZhbGlkYXRpb24gbWVzc2FnZXMgZm9yIHRoYXQKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSB0YXJnZXRFbnRpdHkuZ2V0UGVyc2lzdGVudFR5cGUoKS5yZXNvbHZlQXR0cmlidXRlKG1hcHBlZEJ5KTsKLQkJCi0JCWlmIChhdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19VTlJFU09MVkVEX01BUFBFRF9CWSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwcGVkQnl9LCAKLQkJCQkJCXRoaXMsIHRoaXMuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoISB0aGlzLm1hcHBlZEJ5SXNWYWxpZChhdHRyaWJ1dGUuZ2V0TWFwcGluZygpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19JTlZBTElEX01BUFBFRF9CWSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwcGVkQnl9LCAKLQkJCQkJCXRoaXMsIHRoaXMuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlOb25Pd25pbmdNYXBwaW5nIG1hcHBlZEJ5TWFwcGluZzsKLQkJdHJ5IHsKLQkJCW1hcHBlZEJ5TWFwcGluZyA9IChOb25Pd25pbmdNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKSB7Ci0JCQkvLyB0aGVyZSBpcyBubyBlcnJvciB0aGVuCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChtYXBwZWRCeU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX01BUFBFRF9CWV9PTl9CT1RIX1NJREVTLAotCQkJCQkJdGhpcywgdGhpcy5nZXRNYXBwZWRCeVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbE9uZVRvT25lIG9uZVRvT25lKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUob25lVG9PbmUpOwotCQl0aGlzLm1hcHBlZEJ5ID0gb25lVG9PbmUuZ2V0TWFwcGVkQnkoKTsKLQkJdGhpcy5pbml0aWFsaXplUHJpbWFyeUtleUpvaW5Db2x1bW5zKG9uZVRvT25lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByaW1hcnlLZXlKb2luQ29sdW1ucyhYbWxPbmVUb09uZSBvbmVUb09uZSkgewotCQlpZiAob25lVG9PbmUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogb25lVG9PbmUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpIHsKLQkJCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKHBrSm9pbkNvbHVtbikpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHhtbFBrSm9pbkNvbHVtbikgewotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBvcm1Qa0pvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLCBuZXcgSm9pbkNvbHVtbk93bmVyKCkpOwotCQlvcm1Qa0pvaW5Db2x1bW4uaW5pdGlhbGl6ZSh4bWxQa0pvaW5Db2x1bW4pOwotCQlyZXR1cm4gb3JtUGtKb2luQ29sdW1uOwotCX0JCi0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sT25lVG9PbmUgb25lVG9PbmUpIHsKLQkJc3VwZXIudXBkYXRlKG9uZVRvT25lKTsKLQkJdGhpcy5zZXRNYXBwZWRCeV8ob25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JCXRoaXMudXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zKG9uZVRvT25lKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zKFhtbE9uZVRvT25lIG9uZVRvT25lKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcGtKb2luQ29sdW1ucyA9IHByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IHJlc291cmNlUGtKb2luQ29sdW1ucyA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCWlmIChvbmVUb09uZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZVBrSm9pbkNvbHVtbnMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+KG9uZVRvT25lLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJfQotCQkKLQkJd2hpbGUgKHBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBwa0pvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJcGtKb2luQ29sdW1uLnVwZGF0ZShyZXNvdXJjZVBrSm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uXyhwa0pvaW5Db2x1bW4pOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VQa0pvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4ocHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpLCBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKHJlc291cmNlUGtKb2luQ29sdW1ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkMWE1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TdHJ1Y3R1cmVOb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlCi17Ci0KLQlwcm90ZWN0ZWQgTGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IGF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnM7Ci0KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nOwotCQotCXB1YmxpYyBHZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycyA9IGJ1aWxkQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycygpOwotCQl0aGlzLmF0dHJpYnV0ZU1hcHBpbmcgPSBidWlsZEF0dHJpYnV0ZU1hcHBpbmcobWFwcGluZ0tleSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBidWlsZEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMoKSB7Ci0JCUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+KCk7Ci0JCWxpc3QuYWRkKE9ybUVtYmVkZGVkTWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOyAvL2J1ZyAxOTAzNDQgbmVlZCB0byB0ZXN0IGRlZmF1bHQgZW1iZWRkZWQgYmVmb3JlIGJhc2ljCi0JCWxpc3QuYWRkKE9ybUJhc2ljTWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlsaXN0LmFkZChPcm1UcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCWxpc3QuYWRkKE9ybUlkTWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlsaXN0LmFkZChPcm1NYW55VG9NYW55TWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlsaXN0LmFkZChPcm1PbmVUb01hbnlNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCWxpc3QuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJbGlzdC5hZGQoT3JtT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCWxpc3QuYWRkKE9ybVZlcnNpb25NYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCWxpc3QuYWRkKE9ybUVtYmVkZGVkSWRNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcihTdHJpbmcga2V5KSB7Ci0JCWZvciAoT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIHByb3ZpZGVyIDogdGhpcy5hdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKSB7Ci0JCQlpZiAocHJvdmlkZXIuZ2V0S2V5KCkuZXF1YWxzKGtleSkpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE9ybU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZEF0dHJpYnV0ZU1hcHBpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIoa2V5KS5idWlsZEF0dHJpYnV0ZU1hcHBpbmcoZ2V0SnBhRmFjdG9yeSgpLCB0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIE9ybVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldE1hcHBpbmcoKS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmFtZUNoYW5nZWQoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgZ2V0U3BlY2lmaWVkTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwcGluZzsKLQl9Ci0JCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5nZXRLZXkoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRNYXBwaW5nS2V5KFN0cmluZyBuZXdNYXBwaW5nS2V5KSB7Ci0JCWlmICh0aGlzLmdldE1hcHBpbmdLZXkoKSA9PSBuZXdNYXBwaW5nS2V5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT3JtQXR0cmlidXRlTWFwcGluZyBvbGRNYXBwaW5nID0gZ2V0TWFwcGluZygpOwotCQl0aGlzLmF0dHJpYnV0ZU1hcHBpbmcgPSBidWlsZEF0dHJpYnV0ZU1hcHBpbmcobmV3TWFwcGluZ0tleSk7Ci0JCWdldFBlcnNpc3RlbnRUeXBlKCkuY2hhbmdlTWFwcGluZyh0aGlzLCBvbGRNYXBwaW5nLCB0aGlzLmF0dHJpYnV0ZU1hcHBpbmcpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9NQVBQSU5HX1BST1BFUlRZLCBvbGRNYXBwaW5nLCB0aGlzLmF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRNYXBwaW5nS2V5XyhTdHJpbmcgbmV3TWFwcGluZ0tleSkgewotCQlpZiAodGhpcy5nZXRNYXBwaW5nS2V5KCkgPT0gbmV3TWFwcGluZ0tleSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU9ybUF0dHJpYnV0ZU1hcHBpbmcgb2xkTWFwcGluZyA9IGdldE1hcHBpbmcoKTsKLQkJdGhpcy5hdHRyaWJ1dGVNYXBwaW5nID0gYnVpbGRBdHRyaWJ1dGVNYXBwaW5nKG5ld01hcHBpbmdLZXkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9NQVBQSU5HX1BST1BFUlRZLCBvbGRNYXBwaW5nLCB0aGlzLmF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gYXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycygpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyczsKLQl9Ci0KLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiAoT3JtUGVyc2lzdGVudFR5cGUpIGdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBPcm1UeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbnRUeXBlKCkuY29udGFpbnNWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlVmlydHVhbCgpIHsKLQkJaWYgKGlzVmlydHVhbCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBdHRyaWJ1dGUgaXMgYWxyZWFkeSB2aXJ0dWFsIik7Ci0JCX0KLQkJZ2V0T3JtUGVyc2lzdGVudFR5cGUoKS5tYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVZpcnR1YWwodGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1ha2VTcGVjaWZpZWQoKSB7Ci0JCWlmICghaXNWaXJ0dWFsKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dHJpYnV0ZSBpcyBhbHJlYWR5IHNwZWNpZmllZCIpOwotCQl9Ci0JCWlmIChnZXRNYXBwaW5nS2V5KCkgPT0gTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVzZSBtYWtlU3BlY2lmaWVkKFN0cmluZykgaW5zdGVhZCBhbmQgc3BlY2lmeSBhIG1hcHBpbmcgdHlwZSIpOwotCQl9Ci0JCWdldE9ybVBlcnNpc3RlbnRUeXBlKCkubWFrZVBlcnNpc3RlbnRBdHRyaWJ1dGVTcGVjaWZpZWQodGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1ha2VTcGVjaWZpZWQoU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJaWYgKCFpc1ZpcnR1YWwoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXR0cmlidXRlIGlzIGFscmVhZHkgc3BlY2lmaWVkIik7Ci0JCX0KLQkJZ2V0T3JtUGVyc2lzdGVudFR5cGUoKS5tYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVNwZWNpZmllZCh0aGlzLCBtYXBwaW5nS2V5KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIGdldE1hcHBpbmcoKS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5pc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuaXNJZE1hcHBpbmcoKTsKLQl9Ci0JCi0JLy9UT0RPIGlzIHRoZXJlIGEgd2F5IHRvIGF2b2lkIGEgbWV0aG9kIGZvciBldmVyeSBtYXBwaW5nIHR5cGU/Ci0JLy9JIGFtIHRyeWluZyB0byB0YWtlIGFkYXZhbnRhZ2Ugb2YgZ2VuZXJpY3MgaGVyZSwgYnV0IGl0IHN1cmUgaXMKLQkvL2xlYWRpbmcgdG8gYSBsb3Qgb2YgZHVwbGljYXRlZCBjb2RlLiAtIEtGTQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sQmFzaWMgYmFzaWMpIHsKLQkJKChPcm1CYXNpY01hcHBpbmcpIGdldE1hcHBpbmcoKSkuaW5pdGlhbGl6ZShiYXNpYyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sRW1iZWRkZWQgZW1iZWRkZWQpIHsKLQkJKChPcm1FbWJlZGRlZE1hcHBpbmcpIGdldE1hcHBpbmcoKSkuaW5pdGlhbGl6ZShlbWJlZGRlZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCSgoT3JtVmVyc2lvbk1hcHBpbmcpIGdldE1hcHBpbmcoKSkuaW5pdGlhbGl6ZSh2ZXJzaW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxNYW55VG9PbmUgbWFueVRvT25lKSB7Ci0JCSgoT3JtTWFueVRvT25lTWFwcGluZykgZ2V0TWFwcGluZygpKS5pbml0aWFsaXplKG1hbnlUb09uZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sT25lVG9NYW55IG9uZVRvTWFueSkgewotCQkoKE9ybU9uZVRvTWFueU1hcHBpbmcpIGdldE1hcHBpbmcoKSkuaW5pdGlhbGl6ZShvbmVUb01hbnkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbE9uZVRvT25lIG9uZVRvT25lKSB7Ci0JCSgoT3JtT25lVG9PbmVNYXBwaW5nKSBnZXRNYXBwaW5nKCkpLmluaXRpYWxpemUob25lVG9PbmUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbE1hbnlUb01hbnkgbWFueVRvTWFueSkgewotCQkoKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBnZXRNYXBwaW5nKCkpLmluaXRpYWxpemUobWFueVRvTWFueSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sSWQgaWQpIHsKLQkJKChPcm1JZE1hcHBpbmcpIGdldE1hcHBpbmcoKSkuaW5pdGlhbGl6ZShpZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkKSB7Ci0JCSgoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIGdldE1hcHBpbmcoKSkuaW5pdGlhbGl6ZShlbWJlZGRlZElkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UpIHsKLQkJKChPcm1UcmFuc2llbnRNYXBwaW5nKSBnZXRNYXBwaW5nKCkpLmluaXRpYWxpemUodHJhbnNpZW50UmVzb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIHhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKSB7Ci0JCSgoR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nKSBnZXRNYXBwaW5nKCkpLmluaXRpYWxpemUoeG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sSWQgaWQpIHsKLQkJaWYgKGdldE1hcHBpbmdLZXkoKSAhPSBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXNldFNwZWNpZmllZE1hcHBpbmdLZXlfKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCX0KLQkJKChPcm1JZE1hcHBpbmcpIGdldE1hcHBpbmcoKSkudXBkYXRlKGlkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZCkgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJc2V0U3BlY2lmaWVkTWFwcGluZ0tleV8oTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJfQotCQkoKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBnZXRNYXBwaW5nKCkpLnVwZGF0ZShlbWJlZGRlZElkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sQmFzaWMgYmFzaWMpIHsKLQkJaWYgKGdldE1hcHBpbmdLZXkoKSAhPSBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXNldFNwZWNpZmllZE1hcHBpbmdLZXlfKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCX0KLQkJKChPcm1CYXNpY01hcHBpbmcpIGdldE1hcHBpbmcoKSkudXBkYXRlKGJhc2ljKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbFZlcnNpb24gdmVyc2lvbikgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlzZXRTcGVjaWZpZWRNYXBwaW5nS2V5XyhNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCX0KLQkJKChPcm1WZXJzaW9uTWFwcGluZykgZ2V0TWFwcGluZygpKS51cGRhdGUodmVyc2lvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxNYW55VG9PbmUgbWFueVRvT25lKSB7Ci0JCWlmIChnZXRNYXBwaW5nS2V5KCkgIT0gTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlzZXRTcGVjaWZpZWRNYXBwaW5nS2V5XyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQl9Ci0JCSgoT3JtTWFueVRvT25lTWFwcGluZykgZ2V0TWFwcGluZygpKS51cGRhdGUobWFueVRvT25lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbE9uZVRvTWFueSBvbmVUb01hbnkpIHsKLQkJaWYgKGdldE1hcHBpbmdLZXkoKSAhPSBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXNldFNwZWNpZmllZE1hcHBpbmdLZXlfKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCX0KLQkJKChPcm1PbmVUb01hbnlNYXBwaW5nKSBnZXRNYXBwaW5nKCkpLnVwZGF0ZShvbmVUb01hbnkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sT25lVG9PbmUgb25lVG9PbmUpIHsKLQkJaWYgKGdldE1hcHBpbmdLZXkoKSAhPSBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJc2V0U3BlY2lmaWVkTWFwcGluZ0tleV8oTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQl9Ci0JCSgoT3JtT25lVG9PbmVNYXBwaW5nKSBnZXRNYXBwaW5nKCkpLnVwZGF0ZShvbmVUb09uZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxNYW55VG9NYW55IG1hbnlUb01hbnkpIHsKLQkJaWYgKGdldE1hcHBpbmdLZXkoKSAhPSBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlzZXRTcGVjaWZpZWRNYXBwaW5nS2V5XyhNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJfQotCQkoKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBnZXRNYXBwaW5nKCkpLnVwZGF0ZShtYW55VG9NYW55KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sRW1iZWRkZWQgZW1iZWRkZWQpIHsKLQkJaWYgKGdldE1hcHBpbmdLZXkoKSAhPSBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXNldFNwZWNpZmllZE1hcHBpbmdLZXlfKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCX0KLQkJKChPcm1FbWJlZGRlZE1hcHBpbmcpIGdldE1hcHBpbmcoKSkudXBkYXRlKGVtYmVkZGVkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSkgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXNldFNwZWNpZmllZE1hcHBpbmdLZXlfKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQl9Ci0JCSgoT3JtVHJhbnNpZW50TWFwcGluZykgZ2V0TWFwcGluZygpKS51cGRhdGUodHJhbnNpZW50UmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxOdWxsQXR0cmlidXRlTWFwcGluZyB4bWxOdWxsQXR0cmlidXRlTWFwcGluZykgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlzZXRTcGVjaWZpZWRNYXBwaW5nS2V5XyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCX0KLQkJKChHZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcpIGdldE1hcHBpbmcoKSkudXBkYXRlKHhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmcuY29udGFpbnModGV4dE9mZnNldCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlpZiAoaXNWaXJ0dWFsKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmcuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCWdldE1hcHBpbmcoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlpZiAoaXNWaXJ0dWFsKCkpIHsKLQkJCXJldHVybiBnZXRQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKS5nZXRBdHRyaWJ1dGVzVGV4dFJhbmdlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwcGluZy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZChnZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL25vdGhpbmcgdG8gZGlzcG9zZQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3MDU0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlIGV4dGVuZHMgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIE9ybVBlcnNpc3RlbnRUeXBlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbjxPcm1UeXBlTWFwcGluZ1Byb3ZpZGVyPiB0eXBlTWFwcGluZ1Byb3ZpZGVyczsKLQotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgcGFyZW50UGVyc2lzdGVudFR5cGU7Ci0JCi0JcHVibGljIEdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZShFbnRpdHlNYXBwaW5ncyBwYXJlbnQsIFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMudHlwZU1hcHBpbmdQcm92aWRlcnMgPSBidWlsZFR5cGVNYXBwaW5nUHJvdmlkZXJzKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBidWlsZE9ybVR5cGVNYXBwaW5nKG1hcHBpbmdLZXkpOwotCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQl0aGlzLnZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIE9ybVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfVFlQRV9JRDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0TWFwcGluZygpLmdldENsYXNzXygpOwotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoY2xhc3NOYW1lLmVxdWFscyhmdWxseVF1YWxpZmllZFR5cGVOYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSArICIuIiArICBjbGFzc05hbWUpLmVxdWFscyhmdWxseVF1YWxpZmllZFR5cGVOYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgYnVpbGRPcm1UeXBlTWFwcGluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRUeXBlTWFwcGluZ1Byb3ZpZGVyKGtleSkuYnVpbGRUeXBlTWFwcGluZyhnZXRKcGFGYWN0b3J5KCksIHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9ybVR5cGVNYXBwaW5nUHJvdmlkZXI+IGJ1aWxkVHlwZU1hcHBpbmdQcm92aWRlcnMoKSB7Ci0JCUNvbGxlY3Rpb248T3JtVHlwZU1hcHBpbmdQcm92aWRlcj4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8T3JtVHlwZU1hcHBpbmdQcm92aWRlcj4oKTsKLQkJY29sbGVjdGlvbi5hZGQobmV3IE9ybUVudGl0eVByb3ZpZGVyKCkpOwotCQljb2xsZWN0aW9uLmFkZChuZXcgT3JtTWFwcGVkU3VwZXJjbGFzc1Byb3ZpZGVyKCkpOwotCQljb2xsZWN0aW9uLmFkZChuZXcgT3JtRW1iZWRkYWJsZVByb3ZpZGVyKCkpOwotCQlyZXR1cm4gY29sbGVjdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmdQcm92aWRlciBnZXRUeXBlTWFwcGluZ1Byb3ZpZGVyKFN0cmluZyBrZXkpIHsKLQkJZm9yIChPcm1UeXBlTWFwcGluZ1Byb3ZpZGVyIHByb3ZpZGVyIDogdGhpcy50eXBlTWFwcGluZ1Byb3ZpZGVycykgewotCQkJaWYgKHByb3ZpZGVyLmdldEtleSgpLmVxdWFscyhrZXkpKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgT3JtVHlwZU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwcGluZ0tleShTdHJpbmcgbmV3TWFwcGluZ0tleSkgewotCQlpZiAodGhpcy5nZXRNYXBwaW5nS2V5KCkgPT0gbmV3TWFwcGluZ0tleSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU9ybVR5cGVNYXBwaW5nIG9sZE1hcHBpbmcgPSBnZXRNYXBwaW5nKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBidWlsZE9ybVR5cGVNYXBwaW5nKG5ld01hcHBpbmdLZXkpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmNoYW5nZU1hcHBpbmcodGhpcywgb2xkTWFwcGluZywgdGhpcy5vcm1UeXBlTWFwcGluZyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUElOR19QUk9QRVJUWSwgb2xkTWFwcGluZywgdGhpcy5vcm1UeXBlTWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE1hcHBpbmdLZXlfKFN0cmluZyBuZXdNYXBwaW5nS2V5KSB7Ci0JCWlmICh0aGlzLmdldE1hcHBpbmdLZXkoKSA9PSBuZXdNYXBwaW5nS2V5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT3JtVHlwZU1hcHBpbmcgb2xkTWFwcGluZyA9IGdldE1hcHBpbmcoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IGJ1aWxkT3JtVHlwZU1hcHBpbmcobmV3TWFwcGluZ0tleSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUElOR19QUk9QRVJUWSwgb2xkTWFwcGluZywgdGhpcy5vcm1UeXBlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBpbmhlcml0YW5jZUhpZXJhcmNoeSgpIHsKLQkJLy8gdXNpbmcgYSBjaGFpbiBpdGVyYXRvciB0byB0cmF2ZXJzZSB1cCB0aGUgaW5oZXJpdGFuY2UgdHJlZQotCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+KHRoaXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIG5leHRMaW5rKFBlcnNpc3RlbnRUeXBlIHB0KSB7Ci0JCQkJcmV0dXJuIHB0LmdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlIGdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGFyZW50UGVyc2lzdGVudFR5cGUoUGVyc2lzdGVudFR5cGUgbmV3UGFyZW50UGVyc2lzdGVudFR5cGUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlLCBuZXdQYXJlbnRQZXJzaXN0ZW50VHlwZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlQZXJzaXN0ZW50VHlwZSBvbGRQYXJlbnRQZXJzaXN0ZW50VHlwZSA9IHRoaXMucGFyZW50UGVyc2lzdGVudFR5cGU7Ci0JCXRoaXMucGFyZW50UGVyc2lzdGVudFR5cGUgPSBuZXdQYXJlbnRQZXJzaXN0ZW50VHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQZXJzaXN0ZW50VHlwZS5QQVJFTlRfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZLCBvbGRQYXJlbnRQZXJzaXN0ZW50VHlwZSwgbmV3UGFyZW50UGVyc2lzdGVudFR5cGUpOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuIGdldE1hcHBpbmcoKS5nZXRBY2Nlc3MoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2hhbmdlTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybUF0dHJpYnV0ZU1hcHBpbmcgb2xkTWFwcGluZywgT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCWludCBzb3VyY2VJbmRleCA9IHRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMuaW5kZXhPZihvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKHNvdXJjZUluZGV4ICE9IC0xKSB7Ci0JCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLnJlbW92ZShzb3VyY2VJbmRleCk7Ci0JCQlvbGRNYXBwaW5nLnJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKGdldE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkpOwotCQl9Ci0JCWlmIChnZXRNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldEF0dHJpYnV0ZXMoKSA9PSBudWxsKSB7Ci0JCQlnZXRNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLnNldEF0dHJpYnV0ZXMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlcygpKTsKLQkJfQotCQlpbnQgdGFyZ2V0SW5kZXggPSBpbnNlcnRpb25JbmRleChvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQodGFyZ2V0SW5kZXgsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQluZXdNYXBwaW5nLmFkZFRvUmVzb3VyY2VNb2RlbChnZXRNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpKTsKLQkJb2xkTWFwcGluZy5pbml0aWFsaXplT24obmV3TWFwcGluZyk7Ci0JCWlmIChzb3VyY2VJbmRleCAhPSAtMSkgewotCQkJLy9UT0RPIGFyZSB0aGUgc291cmNlIGFuZCB0YXJnZXQgY29ycmVjdCBpbiB0aGlzIGNhc2UsIG9yIGlzIHRhcmdldCBvZmYgYnkgb25lPz8/Ci0JCQlmaXJlSXRlbU1vdmVkKFNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVZpcnR1YWwoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCWlmIChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBdHRyaWJ1dGUgaXMgYWxyZWFkeSB2aXJ0dWFsIik7Ci0JCX0KLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gbnVsbDsKLQkJaWYgKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCXZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gY3JlYXRlVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkJdGhpcy52aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJfQotCQl0aGlzLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCWlmICh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlmaXJlSXRlbUFkZGVkKFZJUlRVQUxfQVRUUklCVVRFU19MSVNULCB2aXJ0dWFsQXR0cmlidXRlc1NpemUoKSAtIDEsIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBtYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVNwZWNpZmllZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJbWFrZVBlcnNpc3RlbnRBdHRyaWJ1dGVTcGVjaWZpZWQob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgbWFrZVBlcnNpc3RlbnRBdHRyaWJ1dGVTcGVjaWZpZWQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBTdHJpbmcgbWFwcGluZ0tleSkgewotCQlpZiAoIW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dHJpYnV0ZSBpcyBhbHJlYWR5IHNwZWNpZmllZCIpOwotCQl9Ci0JCWlmIChtYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVc2UgbWFrZVBlcnNpc3RlbnRBdHRyaWJ1dGVTcGVjaWZpZWQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nKSBpbnN0ZWFkIGFuZCBzcGVjaWZ5IGEgbWFwcGluZyB0eXBlIik7Ci0JCX0KLQkJCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG5ld1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIG1hcHBpbmdLZXkpOwotCQlpZiAoZ2V0TWFwcGluZygpLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXRBdHRyaWJ1dGVzKCkgPT0gbnVsbCkgewotCQkJZ2V0TWFwcGluZygpLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5zZXRBdHRyaWJ1dGVzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF0dHJpYnV0ZXMoKSk7Ci0JCX0KLQkJaW50IGluc2VydGlvbkluZGV4ID0gaW5zZXJ0aW9uSW5kZXgobmV3UGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKGluc2VydGlvbkluZGV4LCBuZXdQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJbmV3UGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuYWRkVG9SZXNvdXJjZU1vZGVsKGdldE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkpOwotCQkKLQkJaW50IHJlbW92YWxJbmRleCA9IHRoaXMudmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmluZGV4T2Yob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMudmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzLnJlbW92ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJbmV3UGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkuc2V0TmFtZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQotCQlmaXJlSXRlbUFkZGVkKFBlcnNpc3RlbnRUeXBlLlNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QsIGluc2VydGlvbkluZGV4LCBuZXdQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFZJUlRVQUxfQVRUUklCVVRFU19MSVNULCByZW1vdmFsSW5kZXgsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbEF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lcyh0aGlzLmFsbEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVudFR5cGUsIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IHRyYW5zZm9ybShQZXJzaXN0ZW50VHlwZSBwdCkgewotCQkJCXJldHVybiBwdC5hdHRyaWJ1dGVzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzTmFtZWQoZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlPihhdHRyaWJ1dGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgewotCQkJCWlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwgJiYgby5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCAmJiBhdHRyaWJ1dGVOYW1lLmVxdWFscyhvLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVOYW1lZChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBhdHRyaWJ1dGVzTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiAoc3RyZWFtLmhhc05leHQoKSkgPyBzdHJlYW0ubmV4dCgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTmFtZXModGhpcy5hdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyhJdGVyYXRvcjw/IGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cnMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZz4oYXR0cnMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRBdHRyaWJ1dGVOYW1lZChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBzcGVjaWZpZWRBdHRyaWJ1dGVzTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiAoc3RyZWFtLmhhc05leHQoKSkgPyBzdHJlYW0ubmV4dCgpIDogbnVsbDsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzTmFtZWQoZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlPihzcGVjaWZpZWRBdHRyaWJ1dGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGVOYW1lLmVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPihzcGVjaWZpZWRBdHRyaWJ1dGVzKCksIHZpcnR1YWxBdHRyaWJ1dGVzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgYXR0cmlidXRlc1NpemUoKSB7Ci0JCXJldHVybiBzcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpICsgdmlydHVhbEF0dHJpYnV0ZXNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBzcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMudmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzKTsJCQotCX0KLQkKLQlwdWJsaWMgaW50IHZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzLnNpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3Qob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgdGhpcy52aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMsIE9ybVBlcnNpc3RlbnRUeXBlLlZJUlRVQUxfQVRUUklCVVRFU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIHRoaXMudmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzLCBPcm1QZXJzaXN0ZW50VHlwZS5WSVJUVUFMX0FUVFJJQlVURVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcy5jb250YWlucyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0JCi0JcHVibGljIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShTdHJpbmcgbWFwcGluZ0tleSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBtYXBwaW5nS2V5KTsKLQkJaW50IGluZGV4ID0gaW5zZXJ0aW9uSW5kZXgocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCWlmIChnZXRNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldEF0dHJpYnV0ZXMoKSA9PSBudWxsKSB7Ci0JCQlnZXRNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLnNldEF0dHJpYnV0ZXMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlcygpKTsKLQkJfQotCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChpbmRleCwgcGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmFkZFRvUmVzb3VyY2VNb2RlbChnZXRNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpLnNldE5hbWUoYXR0cmlidXRlTmFtZSk7Ci0JCWZpcmVJdGVtQWRkZWQoUGVyc2lzdGVudFR5cGUuU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCwgaW5kZXgsIHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGluc2VydGlvbkluZGV4KE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YodGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcywgcGVyc2lzdGVudEF0dHJpYnV0ZSwgYnVpbGRNYXBwaW5nQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBidWlsZE1hcHBpbmdDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvMSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvMikgewotCQkJCWludCBvMVNlcXVlbmNlID0gbzEuZ2V0TWFwcGluZygpLmdldFhtbFNlcXVlbmNlKCk7Ci0JCQkJaW50IG8yU2VxdWVuY2UgPSBvMi5nZXRNYXBwaW5nKCkuZ2V0WG1sU2VxdWVuY2UoKTsKLQkJCQlpZiAobzFTZXF1ZW5jZSA8IG8yU2VxdWVuY2UpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlpZiAobzFTZXF1ZW5jZSA9PSBvMlNlcXVlbmNlKSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlXyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJYWRkSXRlbVRvTGlzdChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCB0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLCBQZXJzaXN0ZW50VHlwZS5TUEVDSUZJRURfQVRUUklCVVRFU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlXyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIHRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMsIFBlcnNpc3RlbnRUeXBlLlNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCWludCBpbmRleCA9IHRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMuaW5kZXhPZihvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5yZW1vdmUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLnJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKHRoaXMub3JtVHlwZU1hcHBpbmcuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpKTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFBlcnNpc3RlbnRUeXBlLlNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QsIGluZGV4LCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsJCQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldE1hcHBpbmcoKS5nZXRDbGFzc18oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGFzc0NoYW5nZWQoU3RyaW5nIG9sZENsYXNzLCBTdHJpbmcgbmV3Q2xhc3MpIHsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGRDbGFzcywgbmV3Q2xhc3MpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBnZXRNYXBwaW5nKCkuZ2V0S2V5KCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gZ2V0TWFwcGluZygpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQkKLQkKLQkvL1RPRE8gaXMgdGhlcmUgYSB3YXkgdG8gYXZvaWQgYSBtZXRob2QgZm9yIGV2ZXJ5IG1hcHBpbmcgdHlwZT8KLQkvL0kgYW0gdHJ5aW5nIHRvIHRha2UgYWRhdmFudGFnZSBvZiBnZW5lcmljcyBoZXJlLCBidXQgaXQgc3VyZSBpcwotCS8vbGVhZGluZyB0byBhIGxvdCBvZiBkdXBsaWNhdGVkIGNvZGUuIC0gS0ZNCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCSgoT3JtRW50aXR5KSBnZXRNYXBwaW5nKCkpLmluaXRpYWxpemUoZW50aXR5KTsKLQkJdGhpcy5pbml0aWFsaXplUGFyZW50UGVyc2lzdGVudFR5cGUoKTsJCi0JCXRoaXMuaW5pdGlhbGl6ZVBlcnNpc3RlbnRBdHRyaWJ1dGVzKGVudGl0eSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCSgoT3JtTWFwcGVkU3VwZXJjbGFzcykgZ2V0TWFwcGluZygpKS5pbml0aWFsaXplKG1hcHBlZFN1cGVyY2xhc3MpOwotCQl0aGlzLmluaXRpYWxpemVQYXJlbnRQZXJzaXN0ZW50VHlwZSgpOwotCQl0aGlzLmluaXRpYWxpemVQZXJzaXN0ZW50QXR0cmlidXRlcyhtYXBwZWRTdXBlcmNsYXNzKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlKSB7Ci0JCSgoT3JtRW1iZWRkYWJsZSkgZ2V0TWFwcGluZygpKS5pbml0aWFsaXplKGVtYmVkZGFibGUpOwotCQl0aGlzLmluaXRpYWxpemVQYXJlbnRQZXJzaXN0ZW50VHlwZSgpOwkJCi0JCXRoaXMuaW5pdGlhbGl6ZVBlcnNpc3RlbnRBdHRyaWJ1dGVzKGVtYmVkZGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUGVyc2lzdGVudEF0dHJpYnV0ZXMoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSB0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQl9Ci0JCXRoaXMuaW5pdGlhbGl6ZVZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWZvciAoWG1sSWQgaWQgOiBhdHRyaWJ1dGVzLmdldElkcygpKSB7Ci0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUoaWQpOwotCQkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCX0KLQkJZm9yIChYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWQgOiBhdHRyaWJ1dGVzLmdldEVtYmVkZGVkSWRzKCkpIHsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShlbWJlZGRlZElkKTsKLQkJCXRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl9Ci0JCWZvciAoWG1sQmFzaWMgYmFzaWMgOiBhdHRyaWJ1dGVzLmdldEJhc2ljcygpKSB7Ci0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUoYmFzaWMpOwotCQkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCX0KLQkJZm9yIChYbWxWZXJzaW9uIHZlcnNpb24gOiBhdHRyaWJ1dGVzLmdldFZlcnNpb25zKCkpIHsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKHZlcnNpb24pOwotCQkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCX0KLQkJZm9yIChYbWxNYW55VG9PbmUgbWFueVRvT25lIDogYXR0cmlidXRlcy5nZXRNYW55VG9PbmVzKCkpIHsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShtYW55VG9PbmUpOwotCQkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCX0KLQkJZm9yIChYbWxPbmVUb01hbnkgb25lVG9NYW55IDogYXR0cmlidXRlcy5nZXRPbmVUb01hbnlzKCkpIHsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShvbmVUb01hbnkpOwotCQkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCX0KLQkJZm9yIChYbWxPbmVUb09uZSBvbmVUb09uZSA6IGF0dHJpYnV0ZXMuZ2V0T25lVG9PbmVzKCkpIHsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG9uZVRvT25lKTsKLQkJCXRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl9Ci0JCWZvciAoWG1sTWFueVRvTWFueSBtYW55VG9NYW55IDogYXR0cmlidXRlcy5nZXRNYW55VG9NYW55cygpKSB7Ci0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG1hbnlUb01hbnkpOwotCQkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCX0KLQkJZm9yIChYbWxFbWJlZGRlZCBlbWJlZGRlZCA6IGF0dHJpYnV0ZXMuZ2V0RW1iZWRkZWRzKCkpIHsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShlbWJlZGRlZCk7Ci0JCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJfQotCQlmb3IgKFhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSA6IGF0dHJpYnV0ZXMuZ2V0VHJhbnNpZW50cygpKSB7Ci0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKHRyYW5zaWVudFJlc291cmNlKTsKLQkJCXRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gamF2YUF0dHJpYnV0ZXMgPSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQkJCi0JCXdoaWxlIChqYXZhQXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YUF0dHJpYnV0ZXMubmV4dCgpOwotCQkJaWYgKHNwZWNpZmllZEF0dHJpYnV0ZU5hbWVkKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSkgPT0gbnVsbCkgewotCQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGNyZWF0ZVZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCQl0aGlzLnZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWlmIChqYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGphdmFQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVBhcmVudFBlcnNpc3RlbnRUeXBlKCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWlmIChqYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJdGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRQYXJlbnRQZXJzaXN0ZW50VHlwZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEVudGl0eSBlbnRpdHkpIHsKLQkJaWYgKGdldE1hcHBpbmdLZXkoKSAhPSBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSkgewotCQkJc2V0TWFwcGluZ0tleV8oTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQl9Ci0JCSgoT3JtRW50aXR5KSBnZXRNYXBwaW5nKCkpLnVwZGF0ZShlbnRpdHkpOwotCQl0aGlzLnVwZGF0ZVBhcmVudFBlcnNpc3RlbnRUeXBlKCk7Ci0JCXRoaXMudXBkYXRlUGVyc2lzdGVudEF0dHJpYnV0ZXMoZW50aXR5KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcykgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpIHsKLQkJCXNldE1hcHBpbmdLZXlfKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOwotCQl9Ci0JCSgoT3JtTWFwcGVkU3VwZXJjbGFzcykgZ2V0TWFwcGluZygpKS51cGRhdGUobWFwcGVkU3VwZXJjbGFzcyk7Ci0JCXRoaXMudXBkYXRlUGFyZW50UGVyc2lzdGVudFR5cGUoKTsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW50QXR0cmlidXRlcyhtYXBwZWRTdXBlcmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSkgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSkgewotCQkJc2V0TWFwcGluZ0tleV8oTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJfQotCQkoKE9ybUVtYmVkZGFibGUpIGdldE1hcHBpbmcoKSkudXBkYXRlKGVtYmVkZGFibGUpOwotCQl0aGlzLnVwZGF0ZVBhcmVudFBlcnNpc3RlbnRUeXBlKCk7Ci0JCXRoaXMudXBkYXRlUGVyc2lzdGVudEF0dHJpYnV0ZXMoZW1iZWRkYWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBhcmVudFBlcnNpc3RlbnRUeXBlKCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCXNldFBhcmVudFBlcnNpc3RlbnRUeXBlKGphdmFQZXJzaXN0ZW50VHlwZSA9PSBudWxsID8gbnVsbCA6IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRQYXJlbnRQZXJzaXN0ZW50VHlwZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQZXJzaXN0ZW50QXR0cmlidXRlcyhBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBvcm1QZXJzaXN0ZW50QXR0cmlidXRlcyA9IHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlcygpOwotCQlpZiAodHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpICE9IG51bGwpIHsKLQkJCXRoaXMudXBkYXRlSWRzKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpOwotCQkJdGhpcy51cGRhdGVFbWJlZGRlZElkcyh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzKTsKLQkJCXRoaXMudXBkYXRlQmFzaWNzKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpOwotCQkJdGhpcy51cGRhdGVWZXJzaW9ucyh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzKTsKLQkJCXRoaXMudXBkYXRlTWFueVRvT25lcyh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzKTsKLQkJCXRoaXMudXBkYXRlT25lVG9NYW55cyh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzKTsKLQkJCXRoaXMudXBkYXRlT25lVG9PbmVzKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpOwotCQkJdGhpcy51cGRhdGVNYW55VG9NYW55cyh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzKTsKLQkJCXRoaXMudXBkYXRlRW1iZWRkZWRzKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpOwkJCi0JCQl0aGlzLnVwZGF0ZVRyYW5zaWVudHModHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlcyk7CQkKLQkJfQotCQl3aGlsZSAob3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCX0JCi0JCXRoaXMudXBkYXRlVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVZpcnR1YWxBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhQXR0cmlidXRlKSB7Ci0JCVN0cmluZyBqYXZhTWFwcGluZ0tleSA9IGphdmFBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpOwotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlpZiAoZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlqYXZhTWFwcGluZ0tleSA9IGphdmFBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKTsKLQkJCWphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZygpOwotCQl9Ci0JCQotCQlpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnVwZGF0ZShuZXcgVmlydHVhbFhtbEJhc2ljKGdldE1hcHBpbmcoKSwgKEphdmFCYXNpY01hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUudXBkYXRlKG5ldyBWaXJ0dWFsWG1sRW1iZWRkZWQoZ2V0TWFwcGluZygpLCAoSmF2YUVtYmVkZGVkTWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS51cGRhdGUobmV3IFZpcnR1YWxYbWxFbWJlZGRlZElkKGdldE1hcHBpbmcoKSwgKEphdmFFbWJlZGRlZElkTWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS51cGRhdGUobmV3IFZpcnR1YWxYbWxJZChnZXRNYXBwaW5nKCksIChKYXZhSWRNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS51cGRhdGUobmV3IFZpcnR1YWxYbWxNYW55VG9NYW55KG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUudXBkYXRlKG5ldyBWaXJ0dWFsWG1sTWFueVRvT25lKChKYXZhTWFueVRvT25lTWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS51cGRhdGUobmV3IFZpcnR1YWxYbWxPbmVUb01hbnkob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgKEphdmFPbmVUb01hbnlNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUudXBkYXRlKG5ldyBWaXJ0dWFsWG1sT25lVG9PbmUoKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnVwZGF0ZShuZXcgVmlydHVhbFhtbFRyYW5zaWVudCgoSmF2YVRyYW5zaWVudE1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS51cGRhdGUobmV3IFZpcnR1YWxYbWxWZXJzaW9uKGdldE1hcHBpbmcoKSwgKEphdmFWZXJzaW9uTWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnVwZGF0ZShuZXcgVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKGdldE1hcHBpbmcoKSwgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcygpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBqYXZhQXR0cmlidXRlcyA9IHRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiB4bWxWaXJ0dWFsQXR0cmlidXRlcyA9IHRoaXMudmlydHVhbEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhQXR0cmlidXRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGphdmFBdHRyaWJ1dGVzKSkgewotCQkJaWYgKHNwZWNpZmllZEF0dHJpYnV0ZU5hbWVkKGphdmFBdHRyaWJ1dGUuZ2V0TmFtZSgpKSA9PSBudWxsKSB7Ci0JCQkJaWYgKHhtbFZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotCQkJCQl1cGRhdGVWaXJ0dWFsQXR0cmlidXRlKHhtbFZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKSwgamF2YUF0dHJpYnV0ZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBjcmVhdGVWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZShqYXZhQXR0cmlidXRlKTsKLQkJCQkJYWRkVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAoeG1sVmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnJlbW92ZVZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKHhtbFZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCX0JCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhQXR0cmlidXRlKSB7Ci0JCWFkZFZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKGNyZWF0ZVZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKGphdmFBdHRyaWJ1dGUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY3JlYXRlVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YUF0dHJpYnV0ZSkgewotCQlTdHJpbmcgamF2YU1hcHBpbmdLZXkgPSBqYXZhQXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKTsKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJaWYgKGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJamF2YU1hcHBpbmdLZXkgPSBqYXZhQXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCk7Ci0JCQlqYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmcoKTsKLQkJfQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIGphdmFNYXBwaW5nS2V5KTsKLQkJCi0JCWlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShuZXcgVmlydHVhbFhtbEJhc2ljKGdldE1hcHBpbmcoKSwgKEphdmFCYXNpY01hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShuZXcgVmlydHVhbFhtbEVtYmVkZGVkSWQoZ2V0TWFwcGluZygpLCAoSmF2YUVtYmVkZGVkSWRNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUobmV3IFZpcnR1YWxYbWxFbWJlZGRlZChnZXRNYXBwaW5nKCksIChKYXZhRW1iZWRkZWRNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUobmV3IFZpcnR1YWxYbWxJZChnZXRNYXBwaW5nKCksIChKYXZhSWRNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG5ldyBWaXJ0dWFsWG1sTWFueVRvTWFueShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUobmV3IFZpcnR1YWxYbWxNYW55VG9PbmUoKEphdmFNYW55VG9PbmVNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUobmV3IFZpcnR1YWxYbWxPbmVUb01hbnkob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgKEphdmFPbmVUb01hbnlNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShuZXcgVmlydHVhbFhtbE9uZVRvT25lKChKYXZhT25lVG9PbmVNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG5ldyBWaXJ0dWFsWG1sVHJhbnNpZW50KChKYXZhVHJhbnNpZW50TWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUobmV3IFZpcnR1YWxYbWxWZXJzaW9uKGdldE1hcHBpbmcoKSwgKEphdmFWZXJzaW9uTWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUobmV3IFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZyhnZXRNYXBwaW5nKCksIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQlyZXR1cm4gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJZHMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpIHsKLQkJTGlzdEl0ZXJhdG9yPFhtbElkPiBpZHMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sSWQ+KGF0dHJpYnV0ZXMuZ2V0SWRzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQlmb3IgKFhtbElkIGlkIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGlkcykpIHsKLQkJCWlmIChvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkudXBkYXRlKGlkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUoaWQpOwotCQkJCWFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVtYmVkZGVkSWRzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzKSB7Ci0JCUxpc3RJdGVyYXRvcjxYbWxFbWJlZGRlZElkPiBlbWJlZGRlZElkcyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxFbWJlZGRlZElkPihhdHRyaWJ1dGVzLmdldEVtYmVkZGVkSWRzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQlmb3IgKFhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbWJlZGRlZElkcykpIHsKLQkJCWlmIChvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkudXBkYXRlKGVtYmVkZGVkSWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShlbWJlZGRlZElkKTsKLQkJCQlhZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlXyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCYXNpY3MoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpIHsKLQkJTGlzdEl0ZXJhdG9yPFhtbEJhc2ljPiBiYXNpY3MgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sQmFzaWM+KGF0dHJpYnV0ZXMuZ2V0QmFzaWNzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQlmb3IgKFhtbEJhc2ljIGJhc2ljIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGJhc2ljcykpIHsKLQkJCWlmIChvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkudXBkYXRlKGJhc2ljKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUoYmFzaWMpOwotCQkJCWFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVZlcnNpb25zKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzKSB7Ci0JCUxpc3RJdGVyYXRvcjxYbWxWZXJzaW9uPiB2ZXJzaW9ucyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxWZXJzaW9uPihhdHRyaWJ1dGVzLmdldFZlcnNpb25zKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQlmb3IgKFhtbFZlcnNpb24gdmVyc2lvbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh2ZXJzaW9ucykpIHsKLQkJCWlmIChvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkudXBkYXRlKHZlcnNpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKHZlcnNpb24pOwotCQkJCWFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hbnlUb09uZXMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpIHsKLQkJTGlzdEl0ZXJhdG9yPFhtbE1hbnlUb09uZT4gbWFueVRvT25lcyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxNYW55VG9PbmU+KGF0dHJpYnV0ZXMuZ2V0TWFueVRvT25lcygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJZm9yIChYbWxNYW55VG9PbmUgbWFueVRvT25lIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG1hbnlUb09uZXMpKSB7Ci0JCQlpZiAob3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMubmV4dCgpLnVwZGF0ZShtYW55VG9PbmUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShtYW55VG9PbmUpOwotCQkJCWFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9uZVRvTWFueXMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpIHsKLQkJTGlzdEl0ZXJhdG9yPFhtbE9uZVRvTWFueT4gb25lVG9NYW55cyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxPbmVUb01hbnk+KGF0dHJpYnV0ZXMuZ2V0T25lVG9NYW55cygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJZm9yIChYbWxPbmVUb01hbnkgb25lVG9NYW55IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9uZVRvTWFueXMpKSB7Ci0JCQlpZiAob3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMubmV4dCgpLnVwZGF0ZShvbmVUb01hbnkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShvbmVUb01hbnkpOwotCQkJCWFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9uZVRvT25lcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBvcm1QZXJzaXN0ZW50QXR0cmlidXRlcykgewotCQlMaXN0SXRlcmF0b3I8WG1sT25lVG9PbmU+IG9uZVRvT25lcyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxPbmVUb09uZT4oYXR0cmlidXRlcy5nZXRPbmVUb09uZXMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCWZvciAoWG1sT25lVG9PbmUgb25lVG9PbmUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob25lVG9PbmVzKSkgewotCQkJaWYgKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotCQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS51cGRhdGUob25lVG9PbmUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG9uZVRvT25lKTsKLQkJCQlhZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlXyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNYW55VG9NYW55cyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBvcm1QZXJzaXN0ZW50QXR0cmlidXRlcykgewotCQlMaXN0SXRlcmF0b3I8WG1sTWFueVRvTWFueT4gbWFueVRvTWFueXMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sTWFueVRvTWFueT4oYXR0cmlidXRlcy5nZXRNYW55VG9NYW55cygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJZm9yIChYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobWFueVRvTWFueXMpKSB7Ci0JCQlpZiAob3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMubmV4dCgpLnVwZGF0ZShtYW55VG9NYW55KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG1hbnlUb01hbnkpOwotCQkJCWFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW1iZWRkZWRzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzKSB7Ci0JCUxpc3RJdGVyYXRvcjxYbWxFbWJlZGRlZD4gZW1iZWRkZWRzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbEVtYmVkZGVkPihhdHRyaWJ1dGVzLmdldEVtYmVkZGVkcygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJZm9yIChYbWxFbWJlZGRlZCBlbWJlZGRlZCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbWJlZGRlZHMpKSB7Ci0JCQlpZiAob3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMubmV4dCgpLnVwZGF0ZShlbWJlZGRlZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKGVtYmVkZGVkKTsKLQkJCQlhZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlXyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUcmFuc2llbnRzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzKSB7Ci0JCUxpc3RJdGVyYXRvcjxYbWxUcmFuc2llbnQ+IHRyYW5zaWVudHMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sVHJhbnNpZW50PihhdHRyaWJ1dGVzLmdldFRyYW5zaWVudHMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCWZvciAoWG1sVHJhbnNpZW50IHRyYW5zaWVudFJlc291cmNlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRyYW5zaWVudHMpKSB7Ci0JCQlpZiAob3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMubmV4dCgpLnVwZGF0ZSh0cmFuc2llbnRSZXNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZSh0cmFuc2llbnRSZXNvdXJjZSk7Ci0JCQkJYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZV8ob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb2x2ZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gYXR0cmlidXRlc05hbWVkKGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAoYXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCQlyZXR1cm4gYXR0cmlidXRlcy5oYXNOZXh0KCkgPyBudWxsIC8qIG1vcmUgdGhhbiBvbmUgKi86IGF0dHJpYnV0ZTsKLQkJfQotCQllbHNlIGlmIChnZXRQYXJlbnRQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRQYXJlbnRQZXJzaXN0ZW50VHlwZSgpLnJlc29sdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGUgZ2V0T3JtUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoc3BlY2lmaWVkQXR0cmlidXRlcygpKSkgewotCQkJaWYgKGF0dHJpYnV0ZS5jb250YWlucyh0ZXh0T2Zmc2V0KSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQotCQl0cnkgewotCQkJZ2V0TWFwcGluZygpLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQl9IGNhdGNoKFRocm93YWJsZSB0KSB7Ci0JCQlKcHRDb3JlUGx1Z2luLmxvZyh0KTsKLQkJfQotCQkKLQkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5hdHRyaWJ1dGVzKCkpKSB7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCQl9IGNhdGNoKFRocm93YWJsZSB0KSB7Ci0JCQkJSnB0Q29yZVBsdWdpbi5sb2codCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7Ci0JCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNjY0YWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBleHRlbmRzIEFic3RyYWN0T3JtTmFtZWRDb2x1bW48WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+Ci0JaW1wbGVtZW50cyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbgotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQotCXByb3RlY3RlZCBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQkKLQlwdWJsaWMgR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3JtQmFzZUpvaW5Db2x1bW4uT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUHJpbWFyeUtleUpvaW5Db2x1bW4gb2xkUGtKb2luQ29sdW1uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZFBrSm9pbkNvbHVtbik7Ci0JCXNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG9sZFBrSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGdldENvbHVtblJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCS8vcHJpbWFyeUtleUpvaW5Db2x1bW5zIGFyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgdGhlIHBrLWpvaW4tY29sdW1uIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkL2FkZGVkCi0JCS8vd2hlbiB0aGUgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gaXMgcmVtb3ZlZC9hZGRlZCB0byB0aGUgWG1sRW50aXR5IGNvbGxlY3Rpb24KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCS8vcHJpbWFyeUtleUpvaW5Db2x1bW5zIGFyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgdGhlIHBrLWpvaW4tY29sdW1uIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkL2FkZGVkCi0JCS8vd2hlbiB0aGUgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gaXMgcmVtb3ZlZC9hZGRlZCB0byB0aGUgWG1sRW50aXR5IGNvbGxlY3Rpb24KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlnZXRDb2x1bW5SZXNvdXJjZSgpLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1CYXNlSm9pbkNvbHVtbi5Pd25lciBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChPcm1CYXNlSm9pbkNvbHVtbi5Pd25lcikgdGhpcy5vd25lcjsKLQl9Ci0KLQlwdWJsaWMgQ29sdW1uIGdldERiUmVmZXJlbmNlZENvbHVtbigpIHsKLQkJVGFibGUgdGFibGUgPSB0aGlzLmRiUmVmZXJlbmNlZENvbHVtblRhYmxlKCk7Ci0JCXJldHVybiAodGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGFibGUuZ2V0Q29sdW1uTmFtZWQodGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB0YWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5nZXRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZWRDb2x1bW5SZXNvbHZlZCgpIHsKLQkJcmV0dXJuIGdldERiUmVmZXJlbmNlZENvbHVtbigpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpIHsKLQkJaWYgKGdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldENvbHVtblJlc291cmNlKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKTsKLQkJCWlmICh0ZXh0UmFuZ2UgIT0gbnVsbCkgewotCQkJCXJldHVybiB0ZXh0UmFuZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmlzVmlydHVhbCh0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBjb2x1bW4pIHsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGNvbHVtbjsKLQkJc3VwZXIuaW5pdGlhbGl6ZShjb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoY29sdW1uKTsKLQkJdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGNvbHVtbikgewotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uID0gY29sdW1uOwotCQlzdXBlci51cGRhdGUoY29sdW1uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8oc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoY29sdW1uKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCX0KLQkKLQkvL1RPRE8gbm90IGNvcnJlY3Qgd2hlbiB3ZSBzdGFydCBzdXBwb3J0aW5nIHByaW1hcnlLZXlKb2luQ29sdW1ucyBpbiAxLTEgbWFwcGluZ3MKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHROYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1RdWVyeUhpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUXVlcnlIaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMTBiZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1RdWVyeUhpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVF1ZXJ5SGludCBleHRlbmRzIEFic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUgaW1wbGVtZW50cyBPcm1RdWVyeUhpbnQKLXsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLQlwcm90ZWN0ZWQgWG1sUXVlcnlIaW50IHF1ZXJ5SGludDsKLQkKLQlwdWJsaWMgR2VuZXJpY09ybVF1ZXJ5SGludChPcm1RdWVyeSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5xdWVyeUhpbnQuc2V0TmFtZShuZXdOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChRdWVyeUhpbnQuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5xdWVyeUhpbnQuc2V0VmFsdWUobmV3VmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFF1ZXJ5SGludC5WQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbFF1ZXJ5SGludCBxdWVyeUhpbnQpIHsKLQkJdGhpcy5xdWVyeUhpbnQgPSBxdWVyeUhpbnQ7Ci0JCXRoaXMubmFtZSA9IHF1ZXJ5SGludC5nZXROYW1lKCk7Ci0JCXRoaXMudmFsdWUgPSBxdWVyeUhpbnQuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbFF1ZXJ5SGludCBxdWVyeUhpbnQpIHsKLQkJdGhpcy5xdWVyeUhpbnQgPSBxdWVyeUhpbnQ7Ci0JCXRoaXMuc2V0TmFtZShxdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQkJdGhpcy5zZXRWYWx1ZShxdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlIaW50LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjY2Q5ZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZSBleHRlbmRzIEFic3RyYWN0T3JtVGFibGUKLQlpbXBsZW1lbnRzIE9ybVNlY29uZGFyeVRhYmxlCi17Ci0JcHJvdGVjdGVkIFhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0JCi0JcHJvdGVjdGVkIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQotCXB1YmxpYyBHZW5lcmljT3JtU2Vjb25kYXJ5VGFibGUoT3JtRW50aXR5IHBhcmVudCwgWG1sU2Vjb25kYXJ5VGFibGUgeG1sU2Vjb25kYXJ5VGFibGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPigpOwotCQlpbml0aWFsaXplKHhtbFNlY29uZGFyeVRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oU2Vjb25kYXJ5VGFibGUgb2xkU2Vjb25kYXJ5VGFibGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkU2Vjb25kYXJ5VGFibGUpOwotCQlmb3IgKFByaW1hcnlLZXlKb2luQ29sdW1uIG9sZFBrSm9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvbGRTZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkpIHsKLQkJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG5ld1BrSm9pbkNvbHVtbiA9IGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQluZXdQa0pvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb20ob2xkUGtKb2luQ29sdW1uKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtRW50aXR5IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1FbnRpdHkpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwdWJsaWMgT3JtRW50aXR5IGdldE9ybUVudGl0eSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpOwotCX0KLQkKLQlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBuZXdQa0pvaW5Db2x1bW4pIHsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb2xkUGtKb2luQ29sdW1uID0gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gbmV3UGtKb2luQ29sdW1uOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNlY29uZGFyeVRhYmxlLkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIG9sZFBrSm9pbkNvbHVtbiwgbmV3UGtKb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA6IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQkKLQlwdWJsaWMgaW50IHByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCWlmICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICF0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JfQkKLQotCXB1YmxpYyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb2xkRGVmYXVsdFBrSm9pbkNvbHVtbiA9IHRoaXMuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWlmIChvbGREZWZhdWx0UGtKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCS8vbnVsbCB0aGUgZGVmYXVsdCBqb2luIGNvbHVtbiBub3cgaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCQkJLy9pZiBvbmUgZG9lcyBub3QgZXhpc3QsIHRoZXJlIGlzIGFscmVhZHkgYSBzcGVjaWZpZWQgam9pbiBjb2x1bW4uCi0JCQkvL1JlbW92ZSBpdCBub3cgc28gdGhhdCBpdCBkb2Vzbid0IGdldCByZW1vdmVkIGR1cmluZyBhbiB1cGRhdGUgYW5kCi0JCQkvL2NhdXNlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIGJlIHNlbnQgdG8gdGhlIFVJIGluIHRoZSB3cm9uZyBvcmRlcgotCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBudWxsOwotCQl9Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHhtbFByaW1hcnlLZXlKb2luQ29sdW1uID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKCk7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uID0gY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oeG1sUHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoaW5kZXgsIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoaW5kZXgsIHhtbFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJCi0JCXRoaXMuZmlyZUl0ZW1BZGRlZChTZWNvbmRhcnlUYWJsZS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCWlmIChvbGREZWZhdWx0UGtKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTZWNvbmRhcnlUYWJsZS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBvbGREZWZhdWx0UGtKb2luQ29sdW1uLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCBPcm1CYXNlSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgsIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHByaW1hcnlLZXlKb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucywgU2Vjb25kYXJ5VGFibGUuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaW5kZXhPZihwa0pvaW5Db2x1bW4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHJlbW92ZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7Ci0JCWlmICghY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJLy9jcmVhdGUgdGhlIGRlZmF1bHRKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKLQkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKLQkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCi0JCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uKG51bGwpOwotCQl9Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFNlY29uZGFyeVRhYmxlLlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCWlmICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL2ZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbiBpZiBhIGRlZmF1bHRKb2luQ29sdW1uIHdhcyBjcmVhdGVkIGFib3ZlCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIG51bGwsIHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uXyhPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QocHJpbWFyeUtleUpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBTZWNvbmRhcnlUYWJsZS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKFNlY29uZGFyeVRhYmxlLlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQotCQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIGdldE9ybUVudGl0eSgpLmNvbnRhaW5zVmlydHVhbFNlY29uZGFyeVRhYmxlKHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWJsZVJlc291cmNlKCkgewotCQkvL3NlY29uZGFyeVRhYmxlcyBhcmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIHRoZSBzZWNvbmRhcnktdGFibGUgZWxlbWVudCB3aWxsIGJlIHJlbW92ZWQvYWRkZWQKLQkJLy93aGVuIHRoZSBYbWxTZWNvbmRhcnlUYWJsZSBpcyByZW1vdmVkL2FkZGVkIHRvIHRoZSBYbWxFbnRpdHkgY29sbGVjdGlvbgotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVUYWJsZVJlc291cmNlKCkgewotCQkvL3NlY29uZGFyeVRhYmxlcyBhcmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIHRoZSBzZWNvbmRhcnktdGFibGUgZWxlbWVudCB3aWxsIGJlIHJlbW92ZWQvYWRkZWQKLQkJLy93aGVuIHRoZSBYbWxTZWNvbmRhcnlUYWJsZSBpcyByZW1vdmVkL2FkZGVkIHRvIHRoZSBYbWxFbnRpdHkgY29sbGVjdGlvbgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxTZWNvbmRhcnlUYWJsZSBnZXRUYWJsZVJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZTsKLQkJc3VwZXIuaW5pdGlhbGl6ZShzZWNvbmRhcnlUYWJsZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyhzZWNvbmRhcnlUYWJsZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKFhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCWZvciAoWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gOiBzZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uKHByaW1hcnlLZXlKb2luQ29sdW1uKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQnVpbGREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uKG51bGwpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlOwotCQlzdXBlci51cGRhdGUoc2Vjb25kYXJ5VGFibGUpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyhzZWNvbmRhcnlUYWJsZSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiByZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oc2Vjb25kYXJ5VGFibGUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uID0gcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbi51cGRhdGUocmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uXyhwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSwgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpIHsKLQkJCXNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgPT0gbnVsbCkgewotCQkJdGhpcy5zZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4obnVsbCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4udXBkYXRlKG51bGwpOwotCQl9Ci0JfQkKLQotCXByb3RlY3RlZCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbihYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKSk7Ci0JCW9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmluaXRpYWxpemUoeG1sUHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQlyZXR1cm4gb3JtUHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQotCi0JQE92ZXJyaWRlCi0JLy9ubyBkZWZhdWx0IG5hbWUgZm9yIHNlY29uZGFyeVRhYmxlcwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQlhZGRUYWJsZU1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCi0JCWZvciAoT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlwa0pvaW5Db2x1bW4uYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFibGVNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlib29sZWFuIGRvQ29udGludWUgPSBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCVN0cmluZyBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmICEgaGFzUmVzb2x2ZWRTY2hlbWEoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5TRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsCi0JCQkJCQluZXcgU3RyaW5nW10ge3NjaGVtYSwgZ2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLAotCQkJCQkJZ2V0U2NoZW1hVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISBpc1Jlc29sdmVkKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCWdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQl9Ci0JfQotCQotCWNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgaW1wbGVtZW50cyBPcm1CYXNlSm9pbkNvbHVtbi5Pd25lcgotCXsKLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLnRoaXMuZ2V0T3JtRW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLnRoaXMuZ2V0RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCkgewotCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZS50aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBHZW5lcmljT3JtU2Vjb25kYXJ5VGFibGUudGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKLQkJCWlmIChqb2luQ29sdW1uc1NpemUoKSAhPSAxKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0T3JtRW50aXR5KCkuZ2V0UGFyZW50RW50aXR5KCkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQkJfQotCQkKLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MmNhYzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RPcm1HZW5lcmF0b3I8WG1sU2VxdWVuY2VHZW5lcmF0b3I+Ci0JaW1wbGVtZW50cyBPcm1TZXF1ZW5jZUdlbmVyYXRvcgotewotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTZXF1ZW5jZU5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTZXF1ZW5jZU5hbWU7Ci0KLQlwdWJsaWMgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0U2VxdWVuY2VOYW1lKCkgOiB0aGlzLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKFN0cmluZyBuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lOwotCQl0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IG5ld1NwZWNpZmllZFNlcXVlbmNlTmFtZTsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5zZXRTZXF1ZW5jZU5hbWUobmV3U3BlY2lmaWVkU2VxdWVuY2VOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2VxdWVuY2VOYW1lLCBuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lOwotCQl0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IG5ld1NwZWNpZmllZFNlcXVlbmNlTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2VxdWVuY2VOYW1lLCBuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlcXVlbmNlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNlcXVlbmNlTmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNlcXVlbmNlTmFtZShTdHJpbmcgbmV3RGVmYXVsdFNlcXVlbmNlTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkU2VxdWVuY2VOYW1lID0gdGhpcy5kZWZhdWx0U2VxdWVuY2VOYW1lOwotCQl0aGlzLmRlZmF1bHRTZXF1ZW5jZU5hbWUgPSBuZXdEZWZhdWx0U2VxdWVuY2VOYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2VxdWVuY2VOYW1lLCBuZXdEZWZhdWx0U2VxdWVuY2VOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoc2VxdWVuY2VHZW5lcmF0b3IpOwotCQl0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lKHNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJLy9UT0RPIGRlZmF1bHQgc2VxdWVuY2UgbmFtZQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJc3VwZXIudXBkYXRlKHNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWVfKHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lKHNlcXVlbmNlR2VuZXJhdG9yKSk7Ci0JCS8vVE9ETyBkZWZhdWx0IHNlcXVlbmNlIG5hbWUKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTZXF1ZW5jZU5hbWUoWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGdlbmVyYXRvclJlc291cmNlLmdldFNlcXVlbmNlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGMzNzMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtVGFibGUgZXh0ZW5kcyBBYnN0cmFjdE9ybVRhYmxlIGltcGxlbWVudHMgT3JtVGFibGUKLXsKLQotCXByb3RlY3RlZCBYbWxFbnRpdHkgZW50aXR5OwotCQotCXB1YmxpYyBHZW5lcmljT3JtVGFibGUoT3JtRW50aXR5IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBPcm1FbnRpdHkgZ2V0T3JtRW50aXR5KCkgewotCQlyZXR1cm4gKE9ybUVudGl0eSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxUYWJsZSBnZXRUYWJsZVJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHkuZ2V0VGFibGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVGFibGVSZXNvdXJjZSgpIHsKLQkJdGhpcy5lbnRpdHkuc2V0VGFibGUobnVsbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlUmVzb3VyY2UoKSB7Ci0JCXRoaXMuZW50aXR5LnNldFRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlKCkpOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFUYWJsZSBnZXRKYXZhVGFibGUoKSB7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IGdldE9ybUVudGl0eSgpLmdldEphdmFFbnRpdHkoKTsKLQkJaWYgKGphdmFFbnRpdHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGphdmFFbnRpdHkuZ2V0VGFibGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCXRoaXMuZW50aXR5ID0gZW50aXR5OwotCQl0aGlzLmluaXRpYWxpemUodGhpcy5nZXRUYWJsZVJlc291cmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sRW50aXR5IGVudGl0eSkgewotCQl0aGlzLmVudGl0eSA9IGVudGl0eTsKLQkJdGhpcy51cGRhdGUodGhpcy5nZXRUYWJsZVJlc291cmNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWUoKSB7Ci0JCUphdmFUYWJsZSBqYXZhVGFibGUgPSBnZXRKYXZhVGFibGUoKTsKLQkJaWYgKGphdmFUYWJsZSAhPSBudWxsKSB7Ci0JCQlpZiAoIWdldE9ybUVudGl0eSgpLmlzTWV0YWRhdGFDb21wbGV0ZSgpICYmIGdldFRhYmxlUmVzb3VyY2UoKSA9PSBudWxsICYmIGphdmFUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBqYXZhVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQkJfQotCQl9Ci0JCUVudGl0eSByb290RW50aXR5ID0gZ2V0T3JtRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpOwotCQlpZiAocm9vdEVudGl0eSAhPSBnZXRPcm1FbnRpdHkoKSkgewotCQkJaWYgKHJvb3RFbnRpdHkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUpIHsKLQkJCQlyZXR1cm4gcm9vdEVudGl0eS5nZXRUYWJsZSgpLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0T3JtRW50aXR5KCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWEoKSB7Ci0JCUphdmFUYWJsZSBqYXZhVGFibGUgPSBnZXRKYXZhVGFibGUoKTsKLQkJaWYgKGphdmFUYWJsZSAhPSBudWxsICkgewotCQkJaWYgKGdldE9ybUVudGl0eSgpLmlzTWV0YWRhdGFDb21wbGV0ZSgpIHx8IChnZXRUYWJsZVJlc291cmNlKCkgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gamF2YVRhYmxlLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJCX0KLQkJCXJldHVybiBqYXZhVGFibGUuZ2V0U2NoZW1hKCk7Ci0JCX0KLQkJRW50aXR5IHJvb3RFbnRpdHkgPSBnZXRPcm1FbnRpdHkoKS5nZXRSb290RW50aXR5KCk7Ci0JCWlmIChyb290RW50aXR5ICE9IGdldE9ybUVudGl0eSgpKSB7Ci0JCQlpZiAocm9vdEVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgPT0gSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSkgewotCQkJCXJldHVybiByb290RW50aXR5LmdldFRhYmxlKCkuZ2V0U2NoZW1hKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2coKSB7Ci0JCUphdmFUYWJsZSBqYXZhVGFibGUgPSBnZXRKYXZhVGFibGUoKTsKLQkJaWYgKGphdmFUYWJsZSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0T3JtRW50aXR5KCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkgfHwgKGdldFRhYmxlUmVzb3VyY2UoKSAhPSBudWxsKSkgewotCQkJCXJldHVybiBqYXZhVGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJCX0KLQkJCXJldHVybiBqYXZhVGFibGUuZ2V0Q2F0YWxvZygpOwotCQl9Ci0JCUVudGl0eSByb290RW50aXR5ID0gZ2V0T3JtRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpOwotCQlpZiAocm9vdEVudGl0eSAhPSBnZXRPcm1FbnRpdHkoKSkgewotCQkJaWYgKHJvb3RFbnRpdHkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUpIHsKLQkJCQlyZXR1cm4gcm9vdEVudGl0eS5nZXRUYWJsZSgpLmdldENhdGFsb2coKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCk7Ci0JfQotCQotCS8vKioqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJYm9vbGVhbiBkb0NvbnRpbnVlID0gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQlTdHJpbmcgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWEoKTsKLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmICEgdGhpcy5oYXNSZXNvbHZlZFNjaGVtYSgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7c2NoZW1hLCB0aGlzLmdldE5hbWUoKX0sIAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0U2NoZW1hVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISB0aGlzLmlzUmVzb2x2ZWQoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sIAotCQkJCQkJdGhpcywgCi0JCQkJCQl0aGlzLmdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UYWJsZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UYWJsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDhkZDAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVGFibGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0T3JtR2VuZXJhdG9yPFhtbFRhYmxlR2VuZXJhdG9yPiBpbXBsZW1lbnRzIE9ybVRhYmxlR2VuZXJhdG9yLCBVbmlxdWVDb25zdHJhaW50Lk93bmVyCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYWJsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYWJsZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZzsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTY2hlbWE7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtbk5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UGtDb2x1bW5OYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWVDb2x1bW5OYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtblZhbHVlOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFBrQ29sdW1uVmFsdWU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50czsKLQotCQotCXB1YmxpYyBHZW5lcmljT3JtVGFibGVHZW5lcmF0b3IoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludHMgPSBuZXcgQXJyYXlMaXN0PE9ybVVuaXF1ZUNvbnN0cmFpbnQ+KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFRhYmxlKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0VGFibGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUYWJsZShTdHJpbmcgbmV3U3BlY2lmaWVkVGFibGUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFRhYmxlID0gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IG5ld1NwZWNpZmllZFRhYmxlOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldFRhYmxlKG5ld1NwZWNpZmllZFRhYmxlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFRhYmxlLCBuZXdTcGVjaWZpZWRUYWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFRhYmxlXyhTdHJpbmcgbmV3U3BlY2lmaWVkVGFibGUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFRhYmxlID0gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IG5ld1NwZWNpZmllZFRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVGFibGUsIG5ld1NwZWNpZmllZFRhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VGFibGUoU3RyaW5nIG5ld0RlZmF1bHRUYWJsZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFRhYmxlID0gdGhpcy5kZWZhdWx0VGFibGU7Ci0JCXRoaXMuZGVmYXVsdFRhYmxlID0gbmV3RGVmYXVsdFRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVEFCTEVfUFJPUEVSVFksIG9sZERlZmF1bHRUYWJsZSwgbmV3RGVmYXVsdFRhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRDYXRhbG9nKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0Q2F0YWxvZygpIDogdGhpcy5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIG5ld1NwZWNpZmllZENhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZENhdGFsb2cgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IG5ld1NwZWNpZmllZENhdGFsb2c7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0Q2F0YWxvZyhuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ2F0YWxvZywgbmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhdGFsb2dfKFN0cmluZyBuZXdTcGVjaWZpZWRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBuZXdTcGVjaWZpZWRDYXRhbG9nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRDYXRhbG9nLCBuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENhdGFsb2coU3RyaW5nIG5ld0RlZmF1bHRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0Q2F0YWxvZyA9IHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBuZXdEZWZhdWx0Q2F0YWxvZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZERlZmF1bHRDYXRhbG9nLCBuZXdEZWZhdWx0Q2F0YWxvZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTY2hlbWEoKSA9PSBudWxsKSA/IGdldERlZmF1bHRTY2hlbWEoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIG5ld1NwZWNpZmllZFNjaGVtYSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkU2NoZW1hID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gbmV3U3BlY2lmaWVkU2NoZW1hOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldFNjaGVtYShuZXdTcGVjaWZpZWRTY2hlbWEpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNjaGVtYSwgbmV3U3BlY2lmaWVkU2NoZW1hKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWFfKFN0cmluZyBuZXdTcGVjaWZpZWRTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFNjaGVtYSA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IG5ld1NwZWNpZmllZFNjaGVtYTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTY2hlbWEsIG5ld1NwZWNpZmllZFNjaGVtYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBuZXdEZWZhdWx0U2NoZW1hKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0U2NoZW1hID0gdGhpcy5kZWZhdWx0U2NoZW1hOwotCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBuZXdEZWZhdWx0U2NoZW1hOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZLCBvbGREZWZhdWx0U2NoZW1hLCBuZXdEZWZhdWx0U2NoZW1hKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZFBrQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUGtDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUGtDb2x1bW5OYW1lOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldFBrQ29sdW1uTmFtZShuZXdTcGVjaWZpZWRQa0NvbHVtbk5hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUGtDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRQa0NvbHVtbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRQa0NvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFBrQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZSA9IG5ld1NwZWNpZmllZFBrQ29sdW1uTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUEtfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFBrQ29sdW1uTmFtZSwgbmV3U3BlY2lmaWVkUGtDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQa0NvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRQa0NvbHVtbk5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRQa0NvbHVtbk5hbWUoU3RyaW5nIG5ld0RlZmF1bHRQa0NvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRQa0NvbHVtbk5hbWUgPSB0aGlzLmRlZmF1bHRQa0NvbHVtbk5hbWU7Ci0JCXRoaXMuZGVmYXVsdFBrQ29sdW1uTmFtZSA9IG5ld0RlZmF1bHRQa0NvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFBrQ29sdW1uTmFtZSwgbmV3RGVmYXVsdFBrQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSA9PSBudWxsKSA/IGdldERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldFZhbHVlQ29sdW1uTmFtZShuZXdTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZV8oU3RyaW5nIG5ld1NwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlQ29sdW1uTmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZShTdHJpbmcgbmV3RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFZhbHVlQ29sdW1uTmFtZSA9IHRoaXMuZGVmYXVsdFZhbHVlQ29sdW1uTmFtZTsKLQkJdGhpcy5kZWZhdWx0VmFsdWVDb2x1bW5OYW1lID0gbmV3RGVmYXVsdFZhbHVlQ29sdW1uTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGREZWZhdWx0VmFsdWVDb2x1bW5OYW1lLCBuZXdEZWZhdWx0VmFsdWVDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uVmFsdWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoU3RyaW5nIG5ld1NwZWNpZmllZFBrQ29sdW1uVmFsdWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFBrQ29sdW1uVmFsdWUgPSB0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA9IG5ld1NwZWNpZmllZFBrQ29sdW1uVmFsdWU7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0UGtDb2x1bW5WYWx1ZShuZXdTcGVjaWZpZWRQa0NvbHVtblZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRQa0NvbHVtblZhbHVlLCBuZXdTcGVjaWZpZWRQa0NvbHVtblZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlXyhTdHJpbmcgbmV3U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKLQkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlID0gbmV3U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRQa0NvbHVtblZhbHVlLCBuZXdTcGVjaWZpZWRQa0NvbHVtblZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQa0NvbHVtblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UGtDb2x1bW5WYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoU3RyaW5nIG5ld0RlZmF1bHRQa0NvbHVtblZhbHVlKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0UGtDb2x1bW5WYWx1ZSA9IHRoaXMuZGVmYXVsdFBrQ29sdW1uVmFsdWU7Ci0JCXRoaXMuZGVmYXVsdFBrQ29sdW1uVmFsdWUgPSBuZXdEZWZhdWx0UGtDb2x1bW5WYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFBrQ29sdW1uVmFsdWUsIG5ld0RlZmF1bHRQa0NvbHVtblZhbHVlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludHMgKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4odGhpcy51bmlxdWVDb25zdHJhaW50cyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgdW5pcXVlQ29uc3RyYWludHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50cy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBPcm1VbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJT3JtVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gIGJ1aWxkVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZChpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCWZpcmVJdGVtQWRkZWQoVGFibGVHZW5lcmF0b3IuVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIGluZGV4LCB1bmlxdWVDb25zdHJhaW50KTsKLQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4LCBPcm1VbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgdW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVGFibGVHZW5lcmF0b3IuVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQl0aGlzLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQodGhpcy51bmlxdWVDb25zdHJhaW50cy5pbmRleE9mKHVuaXF1ZUNvbnN0cmFpbnQpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJT3JtVW5pcXVlQ29uc3RyYWludCByZW1vdmVkVW5pcXVlQ29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludHMucmVtb3ZlKGluZGV4KTsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChUYWJsZUdlbmVyYXRvci5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIHJlbW92ZWRVbmlxdWVDb25zdHJhaW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludF8oT3JtVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdCh1bmlxdWVDb25zdHJhaW50LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCBUYWJsZUdlbmVyYXRvci5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMudW5pcXVlQ29uc3RyYWludHMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChUYWJsZUdlbmVyYXRvci5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKiogVW5pcXVlQ29uc3RyYWludC5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZVVuaXF1ZUNvbnN0cmFpbnRDb2x1bW5OYW1lcygpIHsKLQkJb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGRiVGFibGUgPSBnZXREYlRhYmxlKCk7Ci0JCWlmIChkYlRhYmxlICE9IG51bGwpIHsKLQkJCXJldHVybiBkYlRhYmxlLmNvbHVtbk5hbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGJTY2hlbWEoKTsKLQkJcmV0dXJuIChzY2hlbWEgPT0gbnVsbCkgPyBudWxsIDogc2NoZW1hLmdldFRhYmxlTmFtZWQodGhpcy5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhU291cmNlKCkuZ2V0U2NoZW1hTmFtZWQodGhpcy5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogb3JtIHJlc291cmNlIG1vZGVsIC0+IGNvbnRleHQgbW9kZWwgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcikgewotCQlzdXBlci5pbml0aWFsaXplKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IHRoaXMuc3BlY2lmaWVkVGFibGUodGFibGVHZW5lcmF0b3IpOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSB0aGlzLnNwZWNpZmllZENhdGFsb2codGFibGVHZW5lcmF0b3IpOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gdGhpcy5kZWZhdWx0Q2F0YWxvZygpOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gdGhpcy5kZWZhdWx0U2NoZW1hKCk7Ci0JCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWUodGFibGVHZW5lcmF0b3IpOwotCQl0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5pbml0aWFsaXplVW5pcXVlQ29udHJhaW50cyh0YWJsZUdlbmVyYXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVVbmlxdWVDb250cmFpbnRzKFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCWlmICh0YWJsZUdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgOiB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpKSB7Ci0JCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZChidWlsZFVuaXF1ZUNvbnN0cmFpbnQodW5pcXVlQ29uc3RyYWludCkpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcikgewotCQlzdXBlci51cGRhdGUodGFibGVHZW5lcmF0b3IpOwotCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlXyh0aGlzLnNwZWNpZmllZFRhYmxlKHRhYmxlR2VuZXJhdG9yKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18odGhpcy5zcGVjaWZpZWRDYXRhbG9nKHRhYmxlR2VuZXJhdG9yKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdENhdGFsb2codGhpcy5kZWZhdWx0Q2F0YWxvZygpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2hlbWFfKHRoaXMuc3BlY2lmaWVkU2NoZW1hKHRhYmxlR2VuZXJhdG9yKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNjaGVtYSh0aGlzLmRlZmF1bHRTY2hlbWEoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lXyh0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZSh0YWJsZUdlbmVyYXRvcikpOwotCQl0aGlzLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZV8odGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUodGFibGVHZW5lcmF0b3IpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlXyh0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWUodGFibGVHZW5lcmF0b3IpKTsKLQkJLy9UT0RPIGRlZmF1bHRzCi0JCXRoaXMudXBkYXRlVW5pcXVlQ29uc3RyYWludHModGFibGVHZW5lcmF0b3IpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhYmxlKFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvci5nZXRUYWJsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENhdGFsb2coWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yLmdldENhdGFsb2coKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTY2hlbWEoWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yLmdldFNjaGVtYSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFBrQ29sdW1uTmFtZShYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcikgewotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5OYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtblZhbHVlKFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtblZhbHVlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVbmlxdWVDb25zdHJhaW50cyhYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcikgewotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB1bmlxdWVDb25zdHJhaW50cygpOwotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gcmVzb3VyY2VVbmlxdWVDb25zdHJhaW50czsKLQkJaWYgKHRhYmxlR2VuZXJhdG9yID09IG51bGwpIHsKLQkJCXJlc291cmNlVW5pcXVlQ29uc3RyYWludHMgPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50Pih0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJfQotCQkKLQkJd2hpbGUgKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSkgewotCQkJT3JtVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gdW5pcXVlQ29uc3RyYWludHMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlVW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKSB7Ci0JCQkJdW5pcXVlQ29uc3RyYWludC51cGRhdGUocmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlVW5pcXVlQ29uc3RyYWludF8odW5pcXVlQ29uc3RyYWludCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSkgewotCQkJYWRkVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50c1NpemUoKSwgYnVpbGRVbmlxdWVDb25zdHJhaW50KHJlc291cmNlVW5pcXVlQ29uc3RyYWludHMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVW5pcXVlQ29uc3RyYWludCBidWlsZFVuaXF1ZUNvbnN0cmFpbnQoWG1sVW5pcXVlQ29uc3RyYWludCB4bWxVbmlxdWVDb25zdHJhaW50KSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1VbmlxdWVDb25zdHJhaW50KHRoaXMsIHRoaXMsIHhtbFVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UcmFuc2llbnRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVRyYW5zaWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhYTAyMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVRyYW5zaWVudE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtVHJhbnNpZW50TWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYbWxUcmFuc2llbnQ+IGltcGxlbWVudHMgT3JtVHJhbnNpZW50TWFwcGluZwotewotCQotCXB1YmxpYyBHZW5lcmljT3JtVHJhbnNpZW50TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybVRyYW5zaWVudE1hcHBpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBYbWxUcmFuc2llbnQgYWRkVG9SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJWG1sVHJhbnNpZW50IHRyYW5zaWVudFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHJhbnNpZW50SW1wbCgpOwotCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaW5pdGlhbGl6ZSh0cmFuc2llbnRSZXNvdXJjZSk7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuYWRkKHRyYW5zaWVudFJlc291cmNlKTsKLQkJcmV0dXJuIHRyYW5zaWVudFJlc291cmNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkucmVtb3ZlKHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpKTsKLQkJaWYgKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJdHlwZU1hcHBpbmcuc2V0QXR0cmlidXRlcyhudWxsKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSkgewotCQlzdXBlci5pbml0aWFsaXplKHRyYW5zaWVudFJlc291cmNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSkgewotCQlzdXBlci51cGRhdGUodHJhbnNpZW50UmVzb3VyY2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1VbmlxdWVDb25zdHJhaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVVuaXF1ZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlZGE4MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVVuaXF1ZUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtVW5pcXVlQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybVVuaXF1ZUNvbnN0cmFpbnQKLXsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxTdHJpbmc+IGNvbHVtbk5hbWVzOwotCQotCXByb3RlY3RlZCBYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JCi0JcHJvdGVjdGVkIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIgb3duZXI7Ci0JCi0JcHVibGljIEdlbmVyaWNPcm1VbmlxdWVDb25zdHJhaW50KE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgVW5pcXVlQ29uc3RyYWludC5Pd25lciBvd25lciwgWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5jb2x1bW5OYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLmluaXRpYWxpemUodW5pcXVlQ29uc3RyYWludCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBjb2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuY29sdW1uTmFtZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgY29sdW1uTmFtZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5OYW1lcy5zaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uTmFtZShpbnQgaW5kZXgsIFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0JCXRoaXMuY29sdW1uTmFtZXMuYWRkKGluZGV4LCBjb2x1bW5OYW1lKTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50LmdldENvbHVtbk5hbWVzKCkuYWRkKGluZGV4LCBjb2x1bW5OYW1lKTsKLQkJZmlyZUl0ZW1BZGRlZChVbmlxdWVDb25zdHJhaW50LkNPTFVNTl9OQU1FU19MSVNULCBpbmRleCwgY29sdW1uTmFtZSk7CQkKLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbHVtbk5hbWVfKGludCBpbmRleCwgU3RyaW5nIGNvbHVtbk5hbWUpIHsKLQkJdGhpcy5jb2x1bW5OYW1lcy5hZGQoaW5kZXgsIGNvbHVtbk5hbWUpOwotCQlmaXJlSXRlbUFkZGVkKFVuaXF1ZUNvbnN0cmFpbnQuQ09MVU1OX05BTUVTX0xJU1QsIGluZGV4LCBjb2x1bW5OYW1lKTsJCQotCX0JCi0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5OYW1lKFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0JCXRoaXMucmVtb3ZlQ29sdW1uTmFtZSh0aGlzLmNvbHVtbk5hbWVzLmluZGV4T2YoY29sdW1uTmFtZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbk5hbWUoaW50IGluZGV4KSB7Ci0JCVN0cmluZyByZW1vdmVkQ29sdW1uTmFtZSA9IHRoaXMuY29sdW1uTmFtZXMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50LmdldENvbHVtbk5hbWVzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFVuaXF1ZUNvbnN0cmFpbnQuQ09MVU1OX05BTUVTX0xJU1QsIGluZGV4LCByZW1vdmVkQ29sdW1uTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbHVtbk5hbWVfKGludCBpbmRleCkgewotCQlTdHJpbmcgcmVtb3ZlZENvbHVtbk5hbWUgPSB0aGlzLmNvbHVtbk5hbWVzLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChVbmlxdWVDb25zdHJhaW50LkNPTFVNTl9OQU1FU19MSVNULCBpbmRleCwgcmVtb3ZlZENvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVDb2x1bW5OYW1lKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuY29sdW1uTmFtZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludC5nZXRDb2x1bW5OYW1lcygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChVbmlxdWVDb25zdHJhaW50LkNPTFVNTl9OQU1FU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50ID0gdW5pcXVlQ29uc3RyYWludDsKLQkJdGhpcy5pbml0aWFsaXplQ29sdW1uTmFtZXModW5pcXVlQ29uc3RyYWludCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb2x1bW5OYW1lcyhYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4geG1sQ29sdW1uTmFtZXMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih1bmlxdWVDb25zdHJhaW50LmdldENvbHVtbk5hbWVzKCkpOwotCQkKLQkJZm9yIChTdHJpbmcgYW5ub3RhdGlvbkNvbHVtbk5hbWUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoeG1sQ29sdW1uTmFtZXMpKSB7Ci0JCQl0aGlzLmNvbHVtbk5hbWVzLmFkZChhbm5vdGF0aW9uQ29sdW1uTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnQgPSB1bmlxdWVDb25zdHJhaW50OwotCQl0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzKHVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb2x1bW5OYW1lcyhYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4geG1sQ29sdW1uTmFtZXMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih1bmlxdWVDb25zdHJhaW50LmdldENvbHVtbk5hbWVzKCkpOwotCQkKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yIChTdHJpbmcgeG1sQ29sdW1uTmFtZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh4bWxDb2x1bW5OYW1lcykpIHsKLQkJCWlmIChjb2x1bW5OYW1lc1NpemUoKSA+IGluZGV4KSB7Ci0JCQkJaWYgKHRoaXMuY29sdW1uTmFtZXMuZ2V0KGluZGV4KSAhPSB4bWxDb2x1bW5OYW1lKSB7Ci0JCQkJCWFkZENvbHVtbk5hbWVfKGluZGV4LCB4bWxDb2x1bW5OYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRDb2x1bW5OYW1lXyhpbmRleCwgeG1sQ29sdW1uTmFtZSk7CQkJCi0JCQl9Ci0JCQlpbmRleCsrOwotCQl9Ci0JCQotCQlmb3IgKCA7IGluZGV4IDwgY29sdW1uTmFtZXNTaXplKCk7ICkgewotCQkJcmVtb3ZlQ29sdW1uTmFtZV8oaW5kZXgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WZXJzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODgzNDJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVmVyc2lvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVZlcnNpb25NYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFhtbFZlcnNpb24+Ci0JaW1wbGVtZW50cyBPcm1WZXJzaW9uTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBPcm1Db2x1bW4gY29sdW1uOwotCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbDsKLQkKLQlwdWJsaWMgR2VuZXJpY09ybVZlcnNpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtQ29sdW1uKHRoaXMsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybVZlcnNpb25NYXBwaW5nKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tWG1sQ29sdW1uTWFwcGluZyhPcm1Db2x1bW5NYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21YbWxDb2x1bW5NYXBwaW5nKG9sZE1hcHBpbmcpOwotCQlzZXRUZW1wb3JhbChvbGRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlnZXRDb2x1bW4oKS5pbml0aWFsaXplRnJvbShvbGRNYXBwaW5nLmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCX0KLQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7Ci0JCXJldHVybiB0aGlzLnRlbXBvcmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkgewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0aGlzLnRlbXBvcmFsOwotCQl0aGlzLnRlbXBvcmFsID0gbmV3VGVtcG9yYWw7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3VGVtcG9yYWwpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDb2x1bW5NYXBwaW5nLlRFTVBPUkFMX1BST1BFUlRZLCBvbGRUZW1wb3JhbCwgbmV3VGVtcG9yYWwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZW1wb3JhbF8oVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKSB7Ci0JCVRlbXBvcmFsVHlwZSBvbGRUZW1wb3JhbCA9IHRoaXMudGVtcG9yYWw7Ci0JCXRoaXMudGVtcG9yYWwgPSBuZXdUZW1wb3JhbDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDb2x1bW5NYXBwaW5nLlRFTVBPUkFMX1BST1BFUlRZLCBvbGRUZW1wb3JhbCwgbmV3VGVtcG9yYWwpOwotCX0KLQotCXB1YmxpYyBYbWxWZXJzaW9uIGFkZFRvUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCVhtbFZlcnNpb24gdmVyc2lvbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFZlcnNpb25JbXBsKCk7Ci0JCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pbml0aWFsaXplKHZlcnNpb24pOwotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5hZGQodmVyc2lvbik7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLnJlbW92ZSh0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCWlmICh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCXR5cGVNYXBwaW5nLnNldEF0dHJpYnV0ZXMobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewkJCi0JCXJldHVybiBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxWZXJzaW9uIHZlcnNpb24pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSh2ZXJzaW9uKTsKLQkJdGhpcy50ZW1wb3JhbCA9IHRoaXMuc3BlY2lmaWVkVGVtcG9yYWwodmVyc2lvbik7Ci0JCXRoaXMuY29sdW1uLmluaXRpYWxpemUodmVyc2lvbi5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxWZXJzaW9uIHZlcnNpb24pIHsKLQkJc3VwZXIudXBkYXRlKHZlcnNpb24pOwotCQl0aGlzLnNldFRlbXBvcmFsXyh0aGlzLnNwZWNpZmllZFRlbXBvcmFsKHZlcnNpb24pKTsKLQkJdGhpcy5jb2x1bW4udXBkYXRlKHZlcnNpb24uZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHNwZWNpZmllZFRlbXBvcmFsKFhtbFZlcnNpb24gdmVyc2lvbikgewotCQlyZXR1cm4gVGVtcG9yYWxUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKHZlcnNpb24uZ2V0VGVtcG9yYWwoKSk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKioqKiBJWG1sQ29sdW1uLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtblJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0Q29sdW1uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZENvbHVtblJlc291cmNlKCkgewotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uSW1wbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldENvbHVtbihudWxsKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCQotCQlpZiAoZW50aXR5T3duZWQoKSkgewotCQkJYWRkQ29sdW1uTWVzc2FnZXMobWVzc2FnZXMpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbHVtbk1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCU9ybUNvbHVtbiBjb2x1bW4gPSBnZXRDb2x1bW4oKTsKLQkJU3RyaW5nIHRhYmxlID0gY29sdW1uLmdldFRhYmxlKCk7Ci0JCWJvb2xlYW4gZG9Db250aW51ZSA9IGVudGl0eU93bmVkKCkgJiYgIHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGUpKSB7Ci0JCQlpZiAoZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2dldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCksIHRhYmxlLCBjb2x1bW4uZ2V0TmFtZSgpfSwKLQkJCQkJCWNvbHVtbiwKLQkJCQkJCWNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGFibGUsIGNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWNvbHVtbiwKLQkJCQkJCWNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCQlkb0NvbnRpbnVlID0gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmICEgY29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJaWYgKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2dldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCksIGNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWNvbHVtbiwKLQkJCQkJCWNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2NvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWNvbHVtbiwKLQkJCQkJCWNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxMGE0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGV4dGVuZHMgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNjaGVtYTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWE7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOwotCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYWNjZXNzOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVBlcnNpc3Q7Ci0KLQlwcm90ZWN0ZWQgWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3M7Ci0JCi0JcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwYXJlbnQsIFhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZSh4bWxFbnRpdHlNYXBwaW5ncyk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5hY2Nlc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgbmV3QWNjZXNzKSB7Ci0JCUFjY2Vzc1R5cGUgb2xkQWNjZXNzID0gdGhpcy5hY2Nlc3M7Ci0JCXRoaXMuYWNjZXNzID0gbmV3QWNjZXNzOwotCQlpZiAob2xkQWNjZXNzICE9IG5ld0FjY2VzcykgewotCQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLnRvWG1sUmVzb3VyY2VNb2RlbChuZXdBY2Nlc3MpKTsKLQkJCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhudWxsKTsKLQkJCQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpID09IG51bGwpIHsKLQkJCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCQl9Ci0JCQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLnRvWG1sUmVzb3VyY2VNb2RlbChuZXdBY2Nlc3MpKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLkFDQ0VTU19QUk9QRVJUWSwgb2xkQWNjZXNzLCBuZXdBY2Nlc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRBY2Nlc3NfKEFjY2Vzc1R5cGUgbmV3QWNjZXNzKSB7Ci0JCUFjY2Vzc1R5cGUgb2xkQWNjZXNzID0gdGhpcy5hY2Nlc3M7Ci0JCXRoaXMuYWNjZXNzID0gbmV3QWNjZXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLkFDQ0VTU19QUk9QRVJUWSwgb2xkQWNjZXNzLCBuZXdBY2Nlc3MpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRDYXRhbG9nKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkgOiB0aGlzLmdldFNwZWNpZmllZENhdGFsb2coKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgbmV3RGVmYXVsdENhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRDYXRhbG9nID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IG5ld0RlZmF1bHRDYXRhbG9nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSwgb2xkRGVmYXVsdENhdGFsb2csIG5ld0RlZmF1bHRDYXRhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgbmV3Q2F0YWxvZykgewotCQlTdHJpbmcgb2xkQ2F0YWxvZyA9IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gbmV3Q2F0YWxvZzsKLQkJaWYgKG9sZENhdGFsb2cgIT0gbmV3Q2F0YWxvZykgewotCQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2cobmV3Q2F0YWxvZyk7Ci0JCQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQl0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMobnVsbCk7Ci0JCQkJCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJCXRoaXMuZW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEobnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQkJfQotCQkJCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKG5ld0NhdGFsb2cpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZENhdGFsb2csIG5ld0NhdGFsb2cpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nXyhTdHJpbmcgbmV3Q2F0YWxvZykgewotCQlTdHJpbmcgb2xkQ2F0YWxvZyA9IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gbmV3Q2F0YWxvZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkQ2F0YWxvZywgbmV3Q2F0YWxvZyk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFNjaGVtYSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkgOiB0aGlzLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBuZXdEZWZhdWx0U2NoZW1hKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0U2NoZW1hID0gdGhpcy5kZWZhdWx0U2NoZW1hOwotCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBuZXdEZWZhdWx0U2NoZW1hOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0NIRU1BX1BST1BFUlRZLCBvbGREZWZhdWx0U2NoZW1hLCBuZXdEZWZhdWx0U2NoZW1hKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgbmV3U2NoZW1hKSB7Ci0JCVN0cmluZyBvbGRTY2hlbWEgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBuZXdTY2hlbWE7Ci0JCWlmIChvbGRTY2hlbWEgIT0gbmV3U2NoZW1hKSB7Ci0JCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpICE9IG51bGwpIHsKLQkJCQl0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U2NoZW1hKG5ld1NjaGVtYSk7Ci0JCQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQl0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMobnVsbCk7Ci0JCQkJCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJCXRoaXMuZW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEobnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQkJfQotCQkJCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEobmV3U2NoZW1hKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZFNjaGVtYSwgbmV3U2NoZW1hKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hXyhTdHJpbmcgbmV3U2NoZW1hKSB7Ci0JCVN0cmluZyBvbGRTY2hlbWEgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBuZXdTY2hlbWE7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkU2NoZW1hLCBuZXdTY2hlbWEpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVQZXJzaXN0KCkgewotCQlyZXR1cm4gdGhpcy5jYXNjYWRlUGVyc2lzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlUGVyc2lzdChib29sZWFuIG5ld0Nhc2NhZGVQZXJzaXN0KSB7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZVBlcnNpc3QgPSB0aGlzLmNhc2NhZGVQZXJzaXN0OwotCQl0aGlzLmNhc2NhZGVQZXJzaXN0ID0gbmV3Q2FzY2FkZVBlcnNpc3Q7Ci0JCWlmIChvbGRDYXNjYWRlUGVyc2lzdCAhPSBuZXdDYXNjYWRlUGVyc2lzdCkgewotCQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KG5ld0Nhc2NhZGVQZXJzaXN0KTsKLQkJCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhudWxsKTsKLQkJCQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld0Nhc2NhZGVQZXJzaXN0KSB7Ci0JCQkJaWYgKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgPT0gbnVsbCkgewotCQkJCQl0aGlzLmVudGl0eU1hcHBpbmdzLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkJCX0KLQkJCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQkJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QobmV3Q2FzY2FkZVBlcnNpc3QpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuQ0FTQ0FERV9QRVJTSVNUX1BST1BFUlRZLCBvbGRDYXNjYWRlUGVyc2lzdCwgbmV3Q2FzY2FkZVBlcnNpc3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENhc2NhZGVQZXJzaXN0Xyhib29sZWFuIG5ld0Nhc2NhZGVQZXJzaXN0KSB7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZVBlcnNpc3QgPSB0aGlzLmNhc2NhZGVQZXJzaXN0OwotCQl0aGlzLmNhc2NhZGVQZXJzaXN0ID0gbmV3Q2FzY2FkZVBlcnNpc3Q7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuQ0FTQ0FERV9QRVJTSVNUX1BST1BFUlRZLCBvbGRDYXNjYWRlUGVyc2lzdCwgbmV3Q2FzY2FkZVBlcnNpc3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCXRoaXMuZW50aXR5TWFwcGluZ3MgPSBlbnRpdHlNYXBwaW5nczsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFjY2VzcyA9IEFjY2Vzc1R5cGUuZnJvbVhtbFJlc291cmNlTW9kZWwodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkJCXRoaXMuY2FzY2FkZVBlcnNpc3QgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpOwotCQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKTsKLQkJCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gZW50aXR5TWFwcGluZ3M7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRBY2Nlc3NfKEFjY2Vzc1R5cGUuZnJvbVhtbFJlc291cmNlTW9kZWwodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKSk7Ci0JCQl0aGlzLnNldENhc2NhZGVQZXJzaXN0Xyh0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18odGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8odGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc2V0QWNjZXNzXyhudWxsKTsKLQkJCXRoaXMuc2V0Q2FzY2FkZVBlcnNpc3RfKGZhbHNlKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18obnVsbCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8obnVsbCk7Ci0JCX0KLQkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKHRoaXMucHJvamVjdERlZmF1bHRTY2hlbWFOYW1lKCkpOwotCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMucHJvamVjdERlZmF1bHRDYXRhbG9nTmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0RGVmYXVsdFNjaGVtYU5hbWUoKSB7Ci0JCVNjaGVtYSBwcm9qZWN0RGVmYXVsdFNjaGVtYSA9IGdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCXJldHVybiBwcm9qZWN0RGVmYXVsdFNjaGVtYSA9PSBudWxsID8gbnVsbCA6IHByb2plY3REZWZhdWx0U2NoZW1hLmdldE5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3REZWZhdWx0Q2F0YWxvZ05hbWUoKSB7Ci0JCUNhdGFsb2cgY2F0YWxvZyA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERhdGFTb3VyY2UoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCQlyZXR1cm4gKGNhdGFsb2cgPT0gbnVsbCkgPyBudWxsIDogY2F0YWxvZy5nZXROYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgewotCQlpZiAocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5TWFwcGluZ3MuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpICE9IG51bGwpIHsKLQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5lbnRpdHlNYXBwaW5ncy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTcwZWZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGV4dGVuZHMgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLXsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTsKLQotCXByb3RlY3RlZCBmaW5hbCBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQotCXByb3RlY3RlZCBYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5nczsKLQotCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRW50aXR5TWFwcGluZ3MgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncykgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHModGhpcywgeG1sRW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLmluaXRpYWxpemUoeG1sRW50aXR5TWFwcGluZ3MpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4gbmV3WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpIHsKLQkJYm9vbGVhbiBvbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSA9IHRoaXMueG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGU7Ci0JCXRoaXMueG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgPSBuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTsKLQkJaWYgKG9sZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlICE9IG5ld1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUobmV3WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpOwkJCQkJCQotCQkJCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSkgewotCQkJCXRoaXMuZW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKG5ld1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKTsJCQotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFksIG9sZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlLCBuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlXyhib29sZWFuIG5ld1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCWJvb2xlYW4gb2xkWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgPSB0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlOwotCQl0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlID0gbmV3WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFksIG9sZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlLCBuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSk7Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gZW50aXR5TWFwcGluZ3M7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgIT0gbnVsbCkgewotCQkJdGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSA9IHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCXRoaXMuZW50aXR5TWFwcGluZ3MgPSBlbnRpdHlNYXBwaW5nczsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSAhPSBudWxsKSB7Ci0JCQlzZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZV8odGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZV8oZmFsc2UpOwotCQl9Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMudXBkYXRlKGVudGl0eU1hcHBpbmdzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHlNYXBwaW5ncy5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5lbnRpdHlNYXBwaW5ncy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUJhc2ljTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQmFzaWNNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkZDE4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQmFzaWNNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotcHVibGljIGNsYXNzIE9ybUJhc2ljTWFwcGluZ1Byb3ZpZGVyIGltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtQmFzaWNNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtQmFzaWNNYXBwaW5nUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBPcm1CYXNpY01hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgT3JtQmFzaWNNYXBwaW5nIGJ1aWxkQXR0cmlidXRlTWFwcGluZyhKcGFGYWN0b3J5IGZhY3RvcnksIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtQmFzaWNNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUNhc2NhZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1DYXNjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYTNmMWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUNhc2NhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5DYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLXB1YmxpYyBjbGFzcyBPcm1DYXNjYWRlIGV4dGVuZHMgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIENhc2NhZGUsIE9ybUpwYUNvbnRleHROb2RlCi17Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwZXJzaXN0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWVyZ2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWZyZXNoOwotCi0JCi0JcHJvdGVjdGVkIFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgT3JtQ2FzY2FkZShPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShDYXNjYWRlIG9sZENhc2NhZGUpIHsKLQkJc2V0QWxsKG9sZENhc2NhZGUuaXNBbGwoKSk7Ci0JCXNldFBlcnNpc3Qob2xkQ2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCXNldE1lcmdlKG9sZENhc2NhZGUuaXNNZXJnZSgpKTsKLQkJc2V0UmVtb3ZlKG9sZENhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCXNldFJlZnJlc2gob2xkQ2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBbGwoKSB7Ci0JCXJldHVybiB0aGlzLmFsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGwoYm9vbGVhbiBuZXdBbGwpIHsKLQkJYm9vbGVhbiBvbGRBbGwgPSB0aGlzLmFsbDsKLQkJdGhpcy5hbGwgPSBuZXdBbGw7Ci0JCWlmIChvbGRBbGwgIT0gbmV3QWxsKSB7Ci0JCQlpZiAodGhpcy5nZXRDYXNjYWRlUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRDYXNjYWRlUmVzb3VyY2UoKS5zZXRDYXNjYWRlQWxsKG5ld0FsbCk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0Q2FzY2FkZVJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ2FzY2FkZVJlc291cmNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3QWxsICE9IGZhbHNlKSB7Ci0JCQkJYWRkQ2FzY2FkZVJlc291cmNlKCk7Ci0JCQkJZ2V0Q2FzY2FkZVJlc291cmNlKCkuc2V0Q2FzY2FkZUFsbChuZXdBbGwpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQUxMX1BST1BFUlRZLCBvbGRBbGwsIG5ld0FsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEFsbF8oYm9vbGVhbiBuZXdBbGwpIHsKLQkJYm9vbGVhbiBvbGRBbGwgPSB0aGlzLmFsbDsKLQkJdGhpcy5hbGwgPSBuZXdBbGw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQUxMX1BST1BFUlRZLCBvbGRBbGwsIG5ld0FsbCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdCgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0KGJvb2xlYW4gbmV3UGVyc2lzdCkgewotCQlib29sZWFuIG9sZFBlcnNpc3QgPSB0aGlzLnBlcnNpc3Q7Ci0JCXRoaXMucGVyc2lzdCA9IG5ld1BlcnNpc3Q7Ci0JCWlmIChvbGRQZXJzaXN0ICE9IG5ld1BlcnNpc3QpIHsKLQkJCWlmICh0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpLnNldENhc2NhZGVQZXJzaXN0KG5ld1BlcnNpc3QpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZUNhc2NhZGVSZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld1BlcnNpc3QgIT0gZmFsc2UpIHsKLQkJCQlhZGRDYXNjYWRlUmVzb3VyY2UoKTsKLQkJCQlnZXRDYXNjYWRlUmVzb3VyY2UoKS5zZXRDYXNjYWRlUGVyc2lzdChuZXdQZXJzaXN0KTsKLQkJCX0KLQkJfQkJCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEVSU0lTVF9QUk9QRVJUWSwgb2xkUGVyc2lzdCwgbmV3UGVyc2lzdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFBlcnNpc3RfKGJvb2xlYW4gbmV3UGVyc2lzdCkgewotCQlib29sZWFuIG9sZFBlcnNpc3QgPSB0aGlzLnBlcnNpc3Q7Ci0JCXRoaXMucGVyc2lzdCA9IG5ld1BlcnNpc3Q7CQkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQRVJTSVNUX1BST1BFUlRZLCBvbGRQZXJzaXN0LCBuZXdQZXJzaXN0KTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGlzTWVyZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm1lcmdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lcmdlKGJvb2xlYW4gbmV3TWVyZ2UpIHsKLQkJYm9vbGVhbiBvbGRNZXJnZSA9IHRoaXMubWVyZ2U7Ci0JCXRoaXMubWVyZ2UgPSBuZXdNZXJnZTsKLQkJaWYgKG9sZE1lcmdlICE9IG5ld01lcmdlKSB7Ci0JCQlpZiAodGhpcy5nZXRDYXNjYWRlUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRDYXNjYWRlUmVzb3VyY2UoKS5zZXRDYXNjYWRlTWVyZ2UobmV3TWVyZ2UpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZUNhc2NhZGVSZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld01lcmdlICE9IGZhbHNlKSB7Ci0JCQkJYWRkQ2FzY2FkZVJlc291cmNlKCk7Ci0JCQkJZ2V0Q2FzY2FkZVJlc291cmNlKCkuc2V0Q2FzY2FkZU1lcmdlKG5ld01lcmdlKTsKLQkJCX0KLQkJfQkJCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUVSR0VfUFJPUEVSVFksIG9sZE1lcmdlLCBuZXdNZXJnZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE1lcmdlXyhib29sZWFuIG5ld01lcmdlKSB7Ci0JCWJvb2xlYW4gb2xkTWVyZ2UgPSB0aGlzLm1lcmdlOwotCQl0aGlzLm1lcmdlID0gbmV3TWVyZ2U7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUVSR0VfUFJPUEVSVFksIG9sZE1lcmdlLCBuZXdNZXJnZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZW1vdmUoKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdmUoYm9vbGVhbiBuZXdSZW1vdmUpIHsKLQkJYm9vbGVhbiBvbGRSZW1vdmUgPSB0aGlzLnJlbW92ZTsKLQkJdGhpcy5yZW1vdmUgPSBuZXdSZW1vdmU7Ci0JCWlmIChvbGRSZW1vdmUgIT0gbmV3UmVtb3ZlKSB7Ci0JCQlpZiAodGhpcy5nZXRDYXNjYWRlUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRDYXNjYWRlUmVzb3VyY2UoKS5zZXRDYXNjYWRlUmVtb3ZlKG5ld1JlbW92ZSk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0Q2FzY2FkZVJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ2FzY2FkZVJlc291cmNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3UmVtb3ZlICE9IGZhbHNlKSB7Ci0JCQkJYWRkQ2FzY2FkZVJlc291cmNlKCk7Ci0JCQkJZ2V0Q2FzY2FkZVJlc291cmNlKCkuc2V0Q2FzY2FkZVJlbW92ZShuZXdSZW1vdmUpOwotCQkJfQotCQl9CQkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChSRU1PVkVfUFJPUEVSVFksIG9sZFJlbW92ZSwgbmV3UmVtb3ZlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVtb3ZlXyhib29sZWFuIG5ld1JlbW92ZSkgewotCQlib29sZWFuIG9sZFJlbW92ZSA9IHRoaXMucmVtb3ZlOwotCQl0aGlzLnJlbW92ZSA9IG5ld1JlbW92ZTsJCQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFJFTU9WRV9QUk9QRVJUWSwgb2xkUmVtb3ZlLCBuZXdSZW1vdmUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMucmVmcmVzaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoKGJvb2xlYW4gbmV3UmVmcmVzaCkgewotCQlib29sZWFuIG9sZFJlZnJlc2ggPSB0aGlzLnJlZnJlc2g7Ci0JCXRoaXMucmVmcmVzaCA9IG5ld1JlZnJlc2g7CQotCQlpZiAob2xkUmVmcmVzaCAhPSBuZXdSZWZyZXNoKSB7Ci0JCQlpZiAodGhpcy5nZXRDYXNjYWRlUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRDYXNjYWRlUmVzb3VyY2UoKS5zZXRDYXNjYWRlUmVmcmVzaChuZXdSZWZyZXNoKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5nZXRDYXNjYWRlUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVDYXNjYWRlUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdSZWZyZXNoICE9IGZhbHNlKSB7Ci0JCQkJYWRkQ2FzY2FkZVJlc291cmNlKCk7Ci0JCQkJZ2V0Q2FzY2FkZVJlc291cmNlKCkuc2V0Q2FzY2FkZVJlZnJlc2gobmV3UmVmcmVzaCk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChSRUZSRVNIX1BST1BFUlRZLCBvbGRSZWZyZXNoLCBuZXdSZWZyZXNoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVmcmVzaF8oYm9vbGVhbiBuZXdSZWZyZXNoKSB7Ci0JCWJvb2xlYW4gb2xkUmVmcmVzaCA9IHRoaXMucmVmcmVzaDsKLQkJdGhpcy5yZWZyZXNoID0gbmV3UmVmcmVzaDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChSRUZSRVNIX1BST1BFUlRZLCBvbGRSZWZyZXNoLCBuZXdSZWZyZXNoKTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZVJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLmdldENhc2NhZGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2FzY2FkZVJlc291cmNlKCkgewotCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuc2V0Q2FzY2FkZShudWxsKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDYXNjYWRlUmVzb3VyY2UoKSB7Ci0JCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlSW1wbCgpKTsJCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcgPSByZWxhdGlvbnNoaXBNYXBwaW5nOwotCQlDYXNjYWRlVHlwZSBjYXNjYWRlID0gZ2V0Q2FzY2FkZVJlc291cmNlKCk7Ci0JCXRoaXMuYWxsID0gdGhpcy5hbGwoY2FzY2FkZSk7Ci0JCXRoaXMucGVyc2lzdCA9IHRoaXMucGVyc2lzdChjYXNjYWRlKTsKLQkJdGhpcy5tZXJnZSA9IHRoaXMubWVyZ2UoY2FzY2FkZSk7Ci0JCXRoaXMucmVtb3ZlID0gdGhpcy5yZW1vdmUoY2FzY2FkZSk7Ci0JCXRoaXMucmVmcmVzaCA9IHRoaXMucmVmcmVzaChjYXNjYWRlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcgPSByZWxhdGlvbnNoaXBNYXBwaW5nOwotCQlDYXNjYWRlVHlwZSBjYXNjYWRlID0gZ2V0Q2FzY2FkZVJlc291cmNlKCk7Ci0JCXRoaXMuc2V0QWxsXyh0aGlzLmFsbChjYXNjYWRlKSk7Ci0JCXRoaXMuc2V0UGVyc2lzdF8odGhpcy5wZXJzaXN0KGNhc2NhZGUpKTsKLQkJdGhpcy5zZXRNZXJnZV8odGhpcy5tZXJnZShjYXNjYWRlKSk7Ci0JCXRoaXMuc2V0UmVtb3ZlXyh0aGlzLnJlbW92ZShjYXNjYWRlKSk7Ci0JCXRoaXMuc2V0UmVmcmVzaF8odGhpcy5yZWZyZXNoKGNhc2NhZGUpKTsJCQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFsbChDYXNjYWRlVHlwZSBjYXNjYWRlKSB7Ci0JCXJldHVybiBjYXNjYWRlID09IG51bGwgPyBmYWxzZSA6IGNhc2NhZGUuaXNDYXNjYWRlQWxsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGVyc2lzdChDYXNjYWRlVHlwZSBjYXNjYWRlKSB7Ci0JCXJldHVybiBjYXNjYWRlID09IG51bGwgPyBmYWxzZSA6IGNhc2NhZGUuaXNDYXNjYWRlUGVyc2lzdCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1lcmdlKENhc2NhZGVUeXBlIGNhc2NhZGUpIHsKLQkJcmV0dXJuIGNhc2NhZGUgPT0gbnVsbCA/IGZhbHNlIDogY2FzY2FkZS5pc0Nhc2NhZGVNZXJnZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZShDYXNjYWRlVHlwZSBjYXNjYWRlKSB7Ci0JCXJldHVybiBjYXNjYWRlID09IG51bGwgPyBmYWxzZSA6IGNhc2NhZGUuaXNDYXNjYWRlUmVtb3ZlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVmcmVzaChDYXNjYWRlVHlwZSBjYXNjYWRlKSB7Ci0JCXJldHVybiBjYXNjYWRlID09IG51bGwgPyBmYWxzZSA6IGNhc2NhZGUuaXNDYXNjYWRlUmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2FzY2FkZVJlc291cmNlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRhYmxlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRhYmxlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjM2NhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkYWJsZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nUHJvdmlkZXI7Ci0KLQotcHVibGljIGNsYXNzIE9ybUVtYmVkZGFibGVQcm92aWRlciBpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCXB1YmxpYyBPcm1FbWJlZGRhYmxlIGJ1aWxkVHlwZU1hcHBpbmcoSnBhRmFjdG9yeSBmYWN0b3J5LCBPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1FbWJlZGRhYmxlKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMzE2MmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlciBpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVtYmVkZGVkSWRNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE9ybUVtYmVkZGVkSWRNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE9ybUVtYmVkZGVkSWRNYXBwaW5nIGJ1aWxkQXR0cmlidXRlTWFwcGluZyhKcGFGYWN0b3J5IGZhY3RvcnksIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtRW1iZWRkZWRJZE1hcHBpbmcocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2YwNjkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FbWJlZGRlZE1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPcm1FbWJlZGRlZE1hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE9ybUVtYmVkZGVkTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPcm1FbWJlZGRlZE1hcHBpbmcgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1FbWJlZGRlZE1hcHBpbmcocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW50aXR5UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbnRpdHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGM2OWM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbnRpdHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nUHJvdmlkZXI7Ci0KLQotcHVibGljIGNsYXNzIE9ybUVudGl0eVByb3ZpZGVyIGltcGxlbWVudHMgT3JtVHlwZU1hcHBpbmdQcm92aWRlcgotewkKLQlwdWJsaWMgT3JtRW50aXR5IGJ1aWxkVHlwZU1hcHBpbmcoSnBhRmFjdG9yeSBmYWN0b3J5LCBPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1FbnRpdHkocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1JZE1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUlkTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMmM4MDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUlkTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1JZE1hcHBpbmdQcm92aWRlciBpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUlkTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9ybUlkTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgT3JtSWRNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgT3JtSWRNYXBwaW5nIGJ1aWxkQXR0cmlidXRlTWFwcGluZyhKcGFGYWN0b3J5IGZhY3RvcnksIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtSWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYmZkMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtTWFueVRvTWFueU1hcHBpbmdQcm92aWRlciBpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtTWFueVRvTWFueU1hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE9ybU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgT3JtTWFueVRvTWFueU1hcHBpbmcgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1NYW55VG9NYW55TWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1YWNiNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtTWFueVRvT25lTWFwcGluZ1Byb3ZpZGVyIGltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtTWFueVRvT25lTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9ybU1hbnlUb09uZU1hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE9ybU1hbnlUb09uZU1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIE9ybU1hbnlUb09uZU1hcHBpbmcgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1NYW55VG9PbmVNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGU5NzBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmdQcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgT3JtTWFwcGVkU3VwZXJjbGFzc1Byb3ZpZGVyIGltcGxlbWVudHMgT3JtVHlwZU1hcHBpbmdQcm92aWRlcgotewkKLQlwdWJsaWMgT3JtTWFwcGVkU3VwZXJjbGFzcyBidWlsZFR5cGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtTWFwcGVkU3VwZXJjbGFzcyhwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhNjE1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotcHVibGljIGNsYXNzIE9ybU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1OdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9ybU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBPcm1OdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1OdWxsQXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjNzgwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtT25lVG9NYW55TWFwcGluZ1Byb3ZpZGVyIGltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtT25lVG9NYW55TWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9ybU9uZVRvTWFueU1hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE9ybU9uZVRvTWFueU1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIE9ybU9uZVRvTWFueU1hcHBpbmcgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1PbmVUb01hbnlNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2MDBmYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotcHVibGljIGNsYXNzIE9ybU9uZVRvT25lTWFwcGluZ1Byb3ZpZGVyIGltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBPcm1PbmVUb09uZU1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgT3JtT25lVG9PbmVNYXBwaW5nIGJ1aWxkQXR0cmlidXRlTWFwcGluZyhKcGFGYWN0b3J5IGZhY3RvcnksIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtT25lVG9PbmVNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzE5N2IzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7Ci0KLXB1YmxpYyBjbGFzcyBPcm1UcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1UcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtVHJhbnNpZW50TWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgT3JtVHJhbnNpZW50TWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBPcm1UcmFuc2llbnRNYXBwaW5nIGJ1aWxkQXR0cmlidXRlTWFwcGluZyhKcGFGYWN0b3J5IGZhY3RvcnksIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtVHJhbnNpZW50TWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1WZXJzaW9uTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVmVyc2lvbk1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFjNmVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1WZXJzaW9uTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLQotcHVibGljIGNsYXNzIE9ybVZlcnNpb25NYXBwaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1WZXJzaW9uTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9ybVZlcnNpb25NYXBwaW5nUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBPcm1WZXJzaW9uTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBPcm1WZXJzaW9uTWFwcGluZyBidWlsZEF0dHJpYnV0ZU1hcHBpbmcoSnBhRmFjdG9yeSBmYWN0b3J5LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybVZlcnNpb25NYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVhtbEltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1YbWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNTNmMGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVhtbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgT3JtWG1sSW1wbCBleHRlbmRzIEFic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybVhtbAotewotCXByb3RlY3RlZCBPcm1SZXNvdXJjZSBvcm1SZXNvdXJjZTsKLQkKLQlwcm90ZWN0ZWQgRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3M7Ci0JCi0JCi0JcHVibGljIE9ybVhtbEltcGwoTWFwcGluZ0ZpbGVSZWYgcGFyZW50LCBPcm1SZXNvdXJjZSBvcm1SZXNvdXJjZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmluaXRpYWxpemUob3JtUmVzb3VyY2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWYgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE1hcHBpbmdGaWxlUmVmKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gaXNuJ3QgYWN0dWFsbHkgZGlzcGxheWVkLCBzbyBuZWVkcyBubyBkZXRhaWxzIHBhZ2UKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlpZiAoZ2V0RW50aXR5TWFwcGluZ3MoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIG9ybVJlc291cmNlLmdldEZpbGUoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBwZXJzaXN0ZW5jZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5TWFwcGluZ3M7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEVudGl0eU1hcHBpbmdzKEVudGl0eU1hcHBpbmdzIG5ld0VudGl0eU1hcHBpbmdzKSB7Ci0JCUVudGl0eU1hcHBpbmdzIG9sZEVudGl0eU1hcHBpbmdzID0gdGhpcy5lbnRpdHlNYXBwaW5nczsKLQkJdGhpcy5lbnRpdHlNYXBwaW5ncyA9IG5ld0VudGl0eU1hcHBpbmdzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVOVElUWV9NQVBQSU5HU19QUk9QRVJUWSwgb2xkRW50aXR5TWFwcGluZ3MsIG5ld0VudGl0eU1hcHBpbmdzKTsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5TWFwcGluZ3MgYWRkRW50aXR5TWFwcGluZ3MoKSB7Ci0JCWlmICh0aGlzLmVudGl0eU1hcHBpbmdzICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQkKLQkJWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOwotCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gYnVpbGRFbnRpdHlNYXBwaW5ncyh4bWxFbnRpdHlNYXBwaW5ncyk7Ci0JCXRoaXMub3JtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoeG1sRW50aXR5TWFwcGluZ3MpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVOVElUWV9NQVBQSU5HU19QUk9QRVJUWSwgbnVsbCwgdGhpcy5lbnRpdHlNYXBwaW5ncyk7Ci0JCXJldHVybiB0aGlzLmVudGl0eU1hcHBpbmdzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRpdHlNYXBwaW5ncygpIHsKLQkJaWYgKHRoaXMuZW50aXR5TWFwcGluZ3MgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuZW50aXR5TWFwcGluZ3MuZGlzcG9zZSgpOwotCQlFbnRpdHlNYXBwaW5ncyBvbGRFbnRpdHlNYXBwaW5ncyA9IHRoaXMuZW50aXR5TWFwcGluZ3M7Ci0JCQotCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gbnVsbDsKLQkJWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MgPSB0aGlzLm9ybVJlc291cmNlLmdldEVudGl0eU1hcHBpbmdzKCk7IC8vVE9ETyBoZWxwZXIgcmVtb3ZlRW50aXR5TWFwcGluZ3MgbWV0aG9kIG9uIG9ybVJlc291cmNlPz8KLQkJdGhpcy5vcm1SZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZSh4bWxFbnRpdHlNYXBwaW5ncyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRU5USVRZX01BUFBJTkdTX1BST1BFUlRZLCBvbGRFbnRpdHlNYXBwaW5ncywgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJaWYgKGdldEVudGl0eU1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLy8gKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoT3JtUmVzb3VyY2Ugb3JtUmVzb3VyY2UpIHsKLQkJdGhpcy5vcm1SZXNvdXJjZSA9IG9ybVJlc291cmNlOwotCQlpZiAob3JtUmVzb3VyY2UuZ2V0RW50aXR5TWFwcGluZ3MoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gYnVpbGRFbnRpdHlNYXBwaW5ncyhvcm1SZXNvdXJjZS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShPcm1SZXNvdXJjZSBvcm1SZXNvdXJjZSkgewotCQl0aGlzLm9ybVJlc291cmNlID0gb3JtUmVzb3VyY2U7Ci0JCWlmIChvcm1SZXNvdXJjZS5nZXRFbnRpdHlNYXBwaW5ncygpICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmVudGl0eU1hcHBpbmdzICE9IG51bGwpIHsKLQkJCQl0aGlzLmVudGl0eU1hcHBpbmdzLnVwZGF0ZShvcm1SZXNvdXJjZS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldEVudGl0eU1hcHBpbmdzKGJ1aWxkRW50aXR5TWFwcGluZ3Mob3JtUmVzb3VyY2UuZ2V0RW50aXR5TWFwcGluZ3MoKSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldEVudGl0eU1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJCWdldEVudGl0eU1hcHBpbmdzKCkuZGlzcG9zZSgpOwotCQkJfQotCQkJc2V0RW50aXR5TWFwcGluZ3MobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEVudGl0eU1hcHBpbmdzIGJ1aWxkRW50aXR5TWFwcGluZ3MoWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZEVudGl0eU1hcHBpbmdzKHRoaXMsIHhtbEVudGl0eU1hcHBpbmdzKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKLQkJaWYgKGVudGl0eU1hcHBpbmdzLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpKSB7Ci0JCQlyZXR1cm4gZW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0dXJlTm9kZSh0ZXh0T2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JLy8gbmV2ZXIgYWN0dWFsbHkgc2VsZWN0ZWQKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIFRleHRSYW5nZS5FbXB0eS5pbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBUZXh0UmFuZ2UuRW1wdHkuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJaWYgKGdldEVudGl0eU1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ2V0RW50aXR5TWFwcGluZ3MoKSAhPSBudWxsKSB7Ci0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsQ2FzY2FkZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsQ2FzY2FkZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmNWMxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbENhc2NhZGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5DYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwotCi1wdWJsaWMgY2xhc3MgVmlydHVhbENhc2NhZGVUeXBlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgQ2FzY2FkZVR5cGUKLXsKLQlDYXNjYWRlIGphdmFDYXNjYWRlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKLQkKLQlwdWJsaWMgVmlydHVhbENhc2NhZGVUeXBlKENhc2NhZGUgamF2YUNhc2NhZGUsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFDYXNjYWRlID0gamF2YUNhc2NhZGU7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKENhc2NhZGUgamF2YUNhc2NhZGUpIHsKLQkJdGhpcy5qYXZhQ2FzY2FkZSA9IGphdmFDYXNjYWRlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZUFsbCgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFDYXNjYWRlLmlzQWxsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZUFsbChib29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVNZXJnZSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFDYXNjYWRlLmlzTWVyZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlTWVyZ2UoYm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFDYXNjYWRlLmlzUGVyc2lzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZVJlZnJlc2goKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhQ2FzY2FkZS5pc1JlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlUmVmcmVzaChib29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVSZW1vdmUoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhQ2FzY2FkZS5pc1JlbW92ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVSZW1vdmUoYm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxNYXBLZXkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsTWFwS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNTRhZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxNYXBLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXk7Ci0KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsTWFwS2V5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgTWFwS2V5Ci17Ci0JSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBqYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKLQkKLQlwdWJsaWMgVmlydHVhbE1hcEtleShKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIGphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgPSBqYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotCQl0aGlzLm1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5nZXRNYXBLZXkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBqYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXRoaXMuamF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyA9IGphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE4ZDcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sQXR0cmlidXRlT3ZlcnJpZGUKLXsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgWG1sQ29sdW1uIGNvbHVtbjsKLQotCXByb3RlY3RlZCBWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGUoU3RyaW5nIG5hbWUsIFhtbENvbHVtbiB4bWxDb2x1bW4pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5jb2x1bW4gPSB4bWxDb2x1bW47Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0KLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sQmFzaWMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sQmFzaWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFjMGFlMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEJhc2ljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbEJhc2ljIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sQmFzaWMKLXsKLQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbENvbHVtbiBjb2x1bW47Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlOwotCQkKLQlwdWJsaWMgVmlydHVhbFhtbEJhc2ljKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFCYXNpY01hcHBpbmcgPSBqYXZhQmFzaWNNYXBwaW5nOwotCQl0aGlzLm1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwotCQl0aGlzLmNvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sQ29sdW1uKG9ybVR5cGVNYXBwaW5nLCBqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLCBtZXRhZGF0YUNvbXBsZXRlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFCYXNpY01hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUJhc2ljTWFwcGluZy5nZXREZWZhdWx0RmV0Y2goKSk7Ci0JCX0KLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFCYXNpY01hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuamF2YUJhc2ljTWFwcGluZy5nZXREZWZhdWx0T3B0aW9uYWwoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhQmFzaWNNYXBwaW5nLmdldE9wdGlvbmFsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhQmFzaWNNYXBwaW5nLmlzTG9iKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9iKGJvb2xlYW4gbmV3TG9iKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudW1UeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFCYXNpY01hcHBpbmcuZ2V0RGVmYXVsdEVudW1lcmF0ZWQoKSk7Ci0JCX0KLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW51bVR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUJhc2ljTWFwcGluZy5nZXRFbnVtZXJhdGVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgbmV3RW51bWVyYXRlZCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nKSB7Ci0JCXRoaXMuamF2YUJhc2ljTWFwcGluZyA9IGphdmFCYXNpY01hcHBpbmc7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZShqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4ZGJjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQSB2aXJ0dWFsIGNvbHVtbiBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgWG1sQ29sdW1uIHJlc291cmNlIG9iamVjdAotICogd2l0aGluIGEgdmlydHVhbCBtYXBwaW5nLiAgQSB2aXJ0dWFsIG1hcHBpbmcgaXMgb25lIHdoaWNoIGlzIG5vdCBzcGVjaWZpZWQKLSAqIGluIHRoZSBvcm0ueG1sIGZpbGUsIGJ1dCBpcyBpbXBsaWVkIGZyb20gdGhlIHVuZGVybHlpbmcgamF2YS4gIFZpcnR1YWwgY29sdW1uCi0gKiBpcyBub3QgdXNlZCB3aGVuIHRoZSBtYXBwaW5nIGlzIHNwZWNpZmllZCBpbiB0aGUgb3JtLnhtbCwgYnV0IHRoZSBjb2x1bW4gdGFnIGRvZXMgbm90IGV4aXN0LgotICogCi0gKiBBIHZpcnR1YWwgY29sdW1uIGRlbGVnYXRlcyB0byB0aGUgdW5kZXJseWluZyBqYXZhIGNvbHVtbiBmb3IgaXRzIHN0YXRlLiAgVGhlIG1ldGFkYXRhQ29tcGxldGUKLSAqIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIGl0IHdpbGwgZ2V0IHNwZWNpZmllZCBvciBkZWZhdWx0IGluZm9ybWF0aW9uIGZyb20gdGhlIGphdmEgY29sdW1uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbENvbHVtbiBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbENvbHVtbgotewotCQotCXByb3RlY3RlZCBDb2x1bW4gY29sdW1uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKLQotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKLQkKLQkKLQlwcm90ZWN0ZWQgVmlydHVhbFhtbENvbHVtbihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgQ29sdW1uIGNvbHVtbiwgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKLQkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldEluc2VydGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldERlZmF1bHRMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0TnVsbGFibGUoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0TnVsbGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROdWxsYWJsZShCb29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRQcmVjaXNpb24oKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFByZWNpc2lvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTY2FsZSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldERlZmF1bHRTY2FsZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNvbHVtbi5nZXRTY2FsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjYWxlKEludGVnZXIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCWlmICghdGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlpZiAodGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCk7Ci0JCQl9CQotCQl9Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmdldFRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNvbHVtbi5nZXRVbmlxdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0VXBkYXRhYmxlKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNvbHVtbi5nZXRVcGRhdGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb2x1bW4gY29sdW1uKSB7Ci0JCXRoaXMuY29sdW1uID0gY29sdW1uOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEVtYmVkZGVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEVtYmVkZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTQ0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxFbWJlZGRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi0vKioKLSAqIFZpcnR1YWxFbWJlZGRlZCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBFbWJlZGRlZCB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUVtYmVkZGVkTWFwcGluZyBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sRW1iZWRkZWQgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxFbWJlZGRlZAotewotCUphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUVtYmVkZGVkTWFwcGluZzsKLQotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGU7Ci0JCi0JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOwotCQotCXB1YmxpYyBWaXJ0dWFsWG1sRW1iZWRkZWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUVtYmVkZGVkTWFwcGluZywgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKLQkJdGhpcy5qYXZhRW1iZWRkZWRNYXBwaW5nID0gamF2YUVtYmVkZGVkTWFwcGluZzsKLQkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLQl9Ci0JCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUVtYmVkZGVkTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPihYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVMpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzOwotCQlpZiAoIXRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHRoaXMuamF2YUVtYmVkZGVkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJfQotCQllbHNlIHsKLQkJCWphdmFBdHRyaWJ1dGVPdmVycmlkZXMgPSB0aGlzLmphdmFFbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQl9Ci0JCWZvciAoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGphdmFBdHRyaWJ1dGVPdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShqYXZhQXR0cmlidXRlT3ZlcnJpZGVzKSkgewotCQkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sQ29sdW1uKHRoaXMub3JtVHlwZU1hcHBpbmcsIGphdmFBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKSwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKTsKLQkJCVhtbEF0dHJpYnV0ZU92ZXJyaWRlIHhtbEF0dHJpYnV0ZU92ZXJyaWRlID0gbmV3IFZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZShqYXZhQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpLCB4bWxDb2x1bW4pOwotCQkJYXR0cmlidXRlT3ZlcnJpZGVzLmFkZCh4bWxBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YUVtYmVkZGVkTWFwcGluZyBqYXZhRW1iZWRkZWRNYXBwaW5nKSB7Ci0JCXRoaXMuamF2YUVtYmVkZGVkTWFwcGluZyA9IGphdmFFbWJlZGRlZE1hcHBpbmc7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEVtYmVkZGVkSWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sRW1iZWRkZWRJZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjFhNmY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sRW1iZWRkZWRJZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBWaXJ0dWFsRW1iZWRkZWRJZCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBFbWJlZGRlZElkIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhRW1iZWRkZWRJZE1hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbEVtYmVkZGVkSWQgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxFbWJlZGRlZElkCi17Ci0JSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZzsKLQotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGU7Ci0JCi0JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOwotCQotCXB1YmxpYyBWaXJ0dWFsWG1sRW1iZWRkZWRJZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZywgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKLQkJdGhpcy5qYXZhRW1iZWRkZWRJZE1hcHBpbmcgPSBqYXZhRW1iZWRkZWRJZE1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUVtYmVkZGVkSWRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSB7Ci0JCUVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+KFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IGphdmFBdHRyaWJ1dGVPdmVycmlkZXM7Ci0JCWlmICghdGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdGhpcy5qYXZhRW1iZWRkZWRJZE1hcHBpbmcuYXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdGhpcy5qYXZhRW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQl9Ci0JCWZvciAoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGphdmFBdHRyaWJ1dGVPdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShqYXZhQXR0cmlidXRlT3ZlcnJpZGVzKSkgewotCQkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sQ29sdW1uKHRoaXMub3JtVHlwZU1hcHBpbmcsIGphdmFBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKSwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKTsKLQkJCVhtbEF0dHJpYnV0ZU92ZXJyaWRlIHhtbEF0dHJpYnV0ZU92ZXJyaWRlID0gbmV3IFZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZShqYXZhQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpLCB4bWxDb2x1bW4pOwotCQkJYXR0cmlidXRlT3ZlcnJpZGVzLmFkZCh4bWxBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZykgewotCQl0aGlzLmphdmFFbWJlZGRlZElkTWFwcGluZyA9IGphdmFFbWJlZGRlZElkTWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sR2VuZXJhdGVkVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sR2VuZXJhdGVkVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4MTRkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEdlbmVyYXRlZFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sR2VuZXJhdGVkVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxHZW5lcmF0ZWRWYWx1ZQotewotCUphdmFHZW5lcmF0ZWRWYWx1ZSBqYXZhR2VuZXJhdGVkVmFsdWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlOwotCQotCQkKLQlwdWJsaWMgVmlydHVhbFhtbEdlbmVyYXRlZFZhbHVlKEphdmFHZW5lcmF0ZWRWYWx1ZSBqYXZhR2VuZXJhdGVkVmFsdWUsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFHZW5lcmF0ZWRWYWx1ZSA9IGphdmFHZW5lcmF0ZWRWYWx1ZTsKLQkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJhdG9yKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhR2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIEdlbmVyYXRpb25UeXBlIGdldFN0cmF0ZWd5KCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0aW9uVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhR2VuZXJhdGVkVmFsdWUuZ2V0U3RyYXRlZ3koKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdG9yKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RyYXRlZ3koR2VuZXJhdGlvblR5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YUdlbmVyYXRlZFZhbHVlIGphdmFHZW5lcmF0ZWRWYWx1ZSkgewotCQl0aGlzLmphdmFHZW5lcmF0ZWRWYWx1ZSA9IGphdmFHZW5lcmF0ZWRWYWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbElkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbElkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOGNlOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxJZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogVmlydHVhbElkIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIElkIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhSWRNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxYbWxJZCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbElkCi17Ci0JSmF2YUlkTWFwcGluZyBqYXZhSWRNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKLQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQ29sdW1uIGNvbHVtbjsKLQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sR2VuZXJhdGVkVmFsdWUgdmlydHVhbEdlbmVyYXRlZFZhbHVlOwotCQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sVGFibGVHZW5lcmF0b3IgdmlydHVhbFRhYmxlR2VuZXJhdG9yOwotCQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IgdmlydHVhbFNlcXVlbmNlR2VuZXJhdG9yOwotCQotCi0JCQotCXB1YmxpYyBWaXJ0dWFsWG1sSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZywgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuamF2YUlkTWFwcGluZyA9IGphdmFJZE1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JCXRoaXMuY29sdW1uID0gbmV3IFZpcnR1YWxYbWxDb2x1bW4ob3JtVHlwZU1hcHBpbmcsIGphdmFJZE1hcHBpbmcuZ2V0Q29sdW1uKCksIG1ldGFkYXRhQ29tcGxldGUpOwotCQl0aGlzLnZpcnR1YWxHZW5lcmF0ZWRWYWx1ZSA9IG5ldyBWaXJ0dWFsWG1sR2VuZXJhdGVkVmFsdWUoamF2YUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLCBtZXRhZGF0YUNvbXBsZXRlKTsKLQkJdGhpcy52aXJ0dWFsVGFibGVHZW5lcmF0b3IgPSBuZXcgVmlydHVhbFhtbFRhYmxlR2VuZXJhdG9yKGphdmFJZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSwgbWV0YWRhdGFDb21wbGV0ZSk7Ci0JCXRoaXMudmlydHVhbFNlcXVlbmNlR2VuZXJhdG9yID0gbmV3IFZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvcihqYXZhSWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCksIG1ldGFkYXRhQ29tcGxldGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUlkTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFJZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKXsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCi0JcHVibGljIFhtbEdlbmVyYXRlZFZhbHVlIGdldEdlbmVyYXRlZFZhbHVlKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAodGhpcy5qYXZhSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMudmlydHVhbEdlbmVyYXRlZFZhbHVlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRWYWx1ZShYbWxHZW5lcmF0ZWRWYWx1ZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CQkKLQl9Ci0KLQlwdWJsaWMgWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmphdmFJZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy52aXJ0dWFsU2VxdWVuY2VHZW5lcmF0b3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwkJCi0JfQotCi0JcHVibGljIFhtbFRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAodGhpcy5qYXZhSWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMudmlydHVhbFRhYmxlR2VuZXJhdG9yOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsJCQotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcpIHsKLQkJdGhpcy5qYXZhSWRNYXBwaW5nID0gamF2YUlkTWFwcGluZzsKLQkJdGhpcy5jb2x1bW4udXBkYXRlKGphdmFJZE1hcHBpbmcuZ2V0Q29sdW1uKCkpOwotCQl0aGlzLnZpcnR1YWxHZW5lcmF0ZWRWYWx1ZS51cGRhdGUoamF2YUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJdGhpcy52aXJ0dWFsVGFibGVHZW5lcmF0b3IudXBkYXRlKGphdmFJZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCXRoaXMudmlydHVhbFNlcXVlbmNlR2VuZXJhdG9yLnVwZGF0ZShqYXZhSWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1MDViMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sSm9pbkNvbHVtbiBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEpvaW5Db2x1bW4KLXsJCi0JcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uIGphdmFKb2luQ29sdW1uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKLQotCXByb3RlY3RlZCBWaXJ0dWFsWG1sSm9pbkNvbHVtbihKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiwgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuamF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pbkNvbHVtbjsKLQkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldEluc2VydGFibGUoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFKb2luQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YUpvaW5Db2x1bW4uZ2V0SW5zZXJ0YWJsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc2VydGFibGUoQm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFKb2luQ29sdW1uLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuamF2YUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuamF2YUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE51bGxhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YUpvaW5Db2x1bW4uZ2V0TnVsbGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROdWxsYWJsZShCb29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhSm9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhSm9pbkNvbHVtbi5nZXRUYWJsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhSm9pbkNvbHVtbi5nZXREZWZhdWx0VW5pcXVlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YUpvaW5Db2x1bW4uZ2V0VW5pcXVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5pcXVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuamF2YUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFKb2luQ29sdW1uLmdldFVwZGF0YWJsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwZGF0YWJsZShCb29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFKb2luQ29sdW1uIGphdmFKb2luQ29sdW1uKSB7Ci0JCXRoaXMuamF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pbkNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxKb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sSm9pblRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNzVkMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxKb2luVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sSm9pblRhYmxlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sSm9pblRhYmxlCi17Ci0JCi0JcHJvdGVjdGVkIEphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZTsKLQotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGU7Ci0KLQlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCQotCi0JcHJvdGVjdGVkIFZpcnR1YWxYbWxKb2luVGFibGUoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhSm9pblRhYmxlIGphdmFKb2luVGFibGUsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLm9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCQl0aGlzLmphdmFKb2luVGFibGUgPSBqYXZhSm9pblRhYmxlOwotCQl0aGlzLm1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwotCX0KLQotCXByb3RlY3RlZCBPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIG9ybVJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCXJldHVybiAoT3JtUmVsYXRpb25zaGlwTWFwcGluZykgdGhpcy5vcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoIXRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJaWYgKHRoaXMuamF2YUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGlzLmphdmFKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQkJfQkKLQkJfQotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pblRhYmxlRGVmYXVsdE5hbWUob3JtUmVsYXRpb25zaGlwTWFwcGluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhSm9pblRhYmxlLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YUpvaW5UYWJsZS5nZXRDYXRhbG9nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhSm9pblRhYmxlLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhSm9pblRhYmxlLmdldFNjaGVtYSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQkvL1ZpcnR1YWxYbWxKb2luVGFibGUgaXMgcmVidWlsdCBldmVyeSB0aW1lLCBzbyBqdXN0IHJlYnVpbGRpbmcgdGhlIGpvaW5Db2x1bW5zIGxpc3QgYXMgd2VsbAotCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJRUxpc3Q8WG1sSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSm9pbkNvbHVtbj4oWG1sSm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TKTsKLQkJZm9yIChKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuamF2YUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpKSkgewotCQkJWG1sSm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uID0gbmV3IFZpcnR1YWxYbWxKb2luQ29sdW1uKGpvaW5Db2x1bW4sIHRoaXMubWV0YWRhdGFDb21wbGV0ZSk7Ci0JCQlqb2luQ29sdW1ucy5hZGQoeG1sSm9pbkNvbHVtbik7Ci0JCX0KLQkJcmV0dXJuIGpvaW5Db2x1bW5zOwotCX0KLQkKLQkvL1ZpcnR1YWxYbWxKb2luVGFibGUgaXMgcmVidWlsdCBldmVyeSB0aW1lLCBzbyBqdXN0IHJlYnVpbGRpbmcgdGhlIGpvaW5Db2x1bW5zIGxpc3QgYXMgd2VsbAotCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCUVMaXN0PFhtbEpvaW5Db2x1bW4+IGludmVyc2VKb2luQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxKb2luQ29sdW1uPihYbWxKb2luQ29sdW1uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUyk7Ci0JCWZvciAoSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFKb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSBuZXcgVmlydHVhbFhtbEpvaW5Db2x1bW4oam9pbkNvbHVtbiwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKTsKLQkJCWludmVyc2VKb2luQ29sdW1ucy5hZGQoeG1sSm9pbkNvbHVtbik7Ci0JCX0KLQotCQlyZXR1cm4gaW52ZXJzZUpvaW5Db2x1bW5zOwotCX0KLQotCXB1YmxpYyBFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpIHsKLQkJRUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4geG1sVW5pcXVlQ29uc3RyYWludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4oWG1sVW5pcXVlQ29uc3RyYWludC5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTKTsKLQotCQlmb3IgKEphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5qYXZhSm9pblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCkpKSB7Ci0JCQlYbWxVbmlxdWVDb25zdHJhaW50IHhtbFVuaXF1ZUNvbnN0cmFpbnQgPSBuZXcgVmlydHVhbFhtbFVuaXF1ZUNvbnN0cmFpbnQodW5pcXVlQ29uc3RyYWludCwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKTsKLQkJCXhtbFVuaXF1ZUNvbnN0cmFpbnRzLmFkZCh4bWxVbmlxdWVDb25zdHJhaW50KTsKLQkJfQotCi0JCXJldHVybiB4bWxVbmlxdWVDb25zdHJhaW50czsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZSkgewotCQl0aGlzLmphdmFKb2luVGFibGUgPSBqYXZhSm9pblRhYmxlOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFKb2luVGFibGUuaXNTcGVjaWZpZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE1hbnlUb01hbnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sTWFueVRvTWFueS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTgzZTI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sTWFueVRvTWFueS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIFZpcnR1YWxNYW55VG9NYW55IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIE1hbnlUb01hbnkgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFNYW55VG9NYW55TWFwcGluZyBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sTWFueVRvTWFueSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbE1hbnlUb01hbnkKLXsKLQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEpvaW5UYWJsZSB2aXJ0dWFsSm9pblRhYmxlOwotCQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsQ2FzY2FkZVR5cGUgdmlydHVhbENhc2NhZGVUeXBlOwotCQotCXByb3RlY3RlZCBmaW5hbCBNYXBLZXkgbWFwS2V5OwotCQotCS8vVE9ETyBqb2luQ29sdW1ucyBub3QgeWV0IHN1cHBvcnRlZCBpbiB0aGUgY29udGV4dCBtb2RlbAotLy8JcHJvdGVjdGVkIEVMaXN0PEpvaW5Db2x1bW4+IHZpcnR1YWxKb2luQ29sdW1uczsKLQotCXB1YmxpYyBWaXJ0dWFsWG1sTWFueVRvTWFueShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFNYW55VG9NYW55TWFwcGluZyA9IGphdmFNYW55VG9NYW55TWFwcGluZzsKLQkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLS8vCQl0aGlzLmluaXRpYWxpemVKb2luQ29sdW1ucyhqYXZhT25lVG9NYW55TWFwcGluZyk7Ci0JCXRoaXMudmlydHVhbENhc2NhZGVUeXBlID0gbmV3IFZpcnR1YWxDYXNjYWRlVHlwZShqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLCB0aGlzLm1ldGFkYXRhQ29tcGxldGUpOwotCQl0aGlzLnZpcnR1YWxKb2luVGFibGUgPSBuZXcgVmlydHVhbFhtbEpvaW5UYWJsZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCksIG1ldGFkYXRhQ29tcGxldGUpOwotCQl0aGlzLm1hcEtleSA9IG5ldyBWaXJ0dWFsTWFwS2V5KGphdmFNYW55VG9NYW55TWFwcGluZywgbWV0YWRhdGFDb21wbGV0ZSk7Ci0JfQotCQotLy8JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpvaW5Db2x1bW5zKElKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZykgewotLy8JCXRoaXMudmlydHVhbEpvaW5Db2x1bW5zID0gbmV3IEJhc2ljRUxpc3Q8Sm9pbkNvbHVtbj4oKTsKLS8vCQlMaXN0SXRlcmF0b3I8SUphdmFKb2luQ29sdW1uPiBqYXZhSm9pbkNvbHVtbnM7Ci0vLwkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotLy8JCQlqYXZhSm9pbkNvbHVtbnMgPSB0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nLmRlZmF1bHRKb2luQ29sdW1ucygpOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJamF2YUpvaW5Db2x1bW5zID0gdGhpcy5qYXZhT25lVG9NYW55TWFwcGluZy5qb2luQ29sdW1ucygpOwkJCQotLy8JCX0KLS8vCQkKLS8vCQl3aGlsZSAoamF2YUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotLy8JCQl0aGlzLnZpcnR1YWxKb2luQ29sdW1ucy5hZGQobmV3IFZpcnR1YWxKb2luQ29sdW1uKGphdmFKb2luQ29sdW1ucy5uZXh0KCksIHRoaXMubWV0YWRhdGFDb21wbGV0ZSkpOwotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFNYW55VG9NYW55TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKLQkJfQotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbENhc2NhZGVUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0JCi0JcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxKb2luVGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFNYW55VG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JCi0JcHVibGljIE1hcEtleSBnZXRNYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcEtleTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0T3JkZXJCeShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZykgewotCQl0aGlzLmphdmFNYW55VG9NYW55TWFwcGluZyA9IGphdmFNYW55VG9NYW55TWFwcGluZzsKLQkJdGhpcy52aXJ0dWFsQ2FzY2FkZVR5cGUudXBkYXRlKGphdmFNYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkpOwotCQl0aGlzLnZpcnR1YWxKb2luVGFibGUudXBkYXRlKGphdmFNYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0vLwkJdGhpcy51cGRhdGVKb2luQ29sdW1ucyhqYXZhT25lVG9NYW55TWFwcGluZyk7Ci0JfQotCQotLy8JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSm9pbkNvbHVtbnMoSUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nKSB7Ci0vLwkJTGlzdEl0ZXJhdG9yPElKYXZhSm9pbkNvbHVtbj4gamF2YUpvaW5Db2x1bW5zOwotLy8JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiB2aXJ0dWFsSm9pbkNvbHVtbnMgPSB0aGlzLnZpcnR1YWxKb2luQ29sdW1ucy5saXN0SXRlcmF0b3IoKTsKLS8vCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0vLwkJCWphdmFKb2luQ29sdW1ucyA9IHRoaXMuamF2YU9uZVRvTWFueU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCk7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlqYXZhSm9pbkNvbHVtbnMgPSB0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nLmpvaW5Db2x1bW5zKCk7CQkJCi0vLwkJfQotLy8JCQotLy8JCXdoaWxlIChqYXZhSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0vLwkJCUlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luQ29sdW1ucy5uZXh0KCk7Ci0vLwkJCWlmICh2aXJ0dWFsSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0vLwkJCQlWaXJ0dWFsSm9pbkNvbHVtbiB2aXJ0dWFsSm9pbkNvbHVtbiA9IChWaXJ0dWFsSm9pbkNvbHVtbikgdmlydHVhbEpvaW5Db2x1bW5zLm5leHQoKTsKLS8vCQkJCXZpcnR1YWxKb2luQ29sdW1uLnVwZGF0ZShqYXZhSm9pbkNvbHVtbik7Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQl0aGlzLnZpcnR1YWxKb2luQ29sdW1ucy5hZGQobmV3IFZpcnR1YWxKb2luQ29sdW1uKGphdmFKb2luQ29sdW1uLCB0aGlzLm1ldGFkYXRhQ29tcGxldGUpKTsKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQl3aGlsZSh2aXJ0dWFsSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0vLwkJCXRoaXMudmlydHVhbEpvaW5Db2x1bW5zLnJlbW92ZSh2aXJ0dWFsSm9pbkNvbHVtbnMubmV4dCgpKTsKLS8vCQl9Ci0vLwl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE1hbnlUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxNYW55VG9PbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5ZWM3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE1hbnlUb09uZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLS8qKgotICogVmlydHVhbE1hbnlUb09uZSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBNYW55VG9PbmUgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFNYW55VG9PbmVNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxYbWxNYW55VG9PbmUgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxNYW55VG9PbmUKLXsKLQlKYXZhTWFueVRvT25lTWFwcGluZyBqYXZhTWFueVRvT25lTWFwcGluZzsKLQotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGU7Ci0JCi0vLwlwcm90ZWN0ZWQgVmlydHVhbEpvaW5UYWJsZSB2aXJ0dWFsSm9pblRhYmxlOwotCQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsQ2FzY2FkZVR5cGUgdmlydHVhbENhc2NhZGVUeXBlOwotCi0JcHVibGljIFZpcnR1YWxYbWxNYW55VG9PbmUoSmF2YU1hbnlUb09uZU1hcHBpbmcgamF2YU1hbnlUb09uZU1hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFNYW55VG9PbmVNYXBwaW5nID0gamF2YU1hbnlUb09uZU1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JCXRoaXMudmlydHVhbENhc2NhZGVUeXBlID0gbmV3IFZpcnR1YWxDYXNjYWRlVHlwZShqYXZhTWFueVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCksIHRoaXMubWV0YWRhdGFDb21wbGV0ZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0JCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFNYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKLQkJfQotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdE9wdGlvbmFsKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0T3B0aW9uYWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7Ci0JCUVMaXN0PFhtbEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0pPSU5fQ09MVU1OUyk7Ci0JCS8vVE9ETyBoZXJlIGknbSB1c2luZyBqb2luQ29sdW1ucygpIHdoaWxlIFZpcnR1YWxYbWxKb2luVGFibGUgdXNlcyBzcGVjaWZpZWRKb2luQ29sdW1ucygpPz8/Ci0JCWZvciAoSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFNYW55VG9PbmVNYXBwaW5nLmpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSBuZXcgVmlydHVhbFhtbEpvaW5Db2x1bW4oam9pbkNvbHVtbiwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKTsKLQkJCWpvaW5Db2x1bW5zLmFkZCh4bWxKb2luQ29sdW1uKTsKLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbnM7Ci0JfQotCi0JcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCQotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQkvL1RPRE8gd2UgZG9uJ3QgeWV0IHN1cHBvcnQgSm9pblRhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsIGZvciBtYW55LXRvLW9uZSBtYXBwaW5ncwotCQlyZXR1cm4gbnVsbDsvL3RoaXMudmlydHVhbEpvaW5UYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFNYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhTWFueVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YU1hbnlUb09uZU1hcHBpbmcgamF2YU1hbnlUb09uZU1hcHBpbmcpIHsKLQkJdGhpcy5qYXZhTWFueVRvT25lTWFwcGluZyA9IGphdmFNYW55VG9PbmVNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZS51cGRhdGUoamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjM4MzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBWaXJ0dWFsVmVyc2lvbiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBWZXJzaW9uIHVzZWQgd2hlbiB0aGVyZSBpcyAKLSAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhVmVyc2lvbk1hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKLQotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGU7Ci0JCi0JcHVibGljIFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZykgewotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE9uZVRvTWFueS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxPbmVUb01hbnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0NjliNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE9uZVRvTWFueS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBWaXJ0dWFsT25lVG9NYW55IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIE9uZVRvTWFueSB1c2VkIHdoZW4gdGhlcmUgaXMgCi0gKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbE9uZVRvTWFueSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbE9uZVRvTWFueQotewotCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEpvaW5UYWJsZSB2aXJ0dWFsSm9pblRhYmxlOwotCQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsQ2FzY2FkZVR5cGUgdmlydHVhbENhc2NhZGVUeXBlOwotCQotCXByb3RlY3RlZCBmaW5hbCBNYXBLZXkgbWFwS2V5OwotCQotCS8vVE9ETyBqb2luQ29sdW1ucyBub3QgeWV0IHN1cHBvcnRlZCBpbiB0aGUgY29udGV4dCBtb2RlbAotLy8JcHJvdGVjdGVkIEVMaXN0PEpvaW5Db2x1bW4+IHZpcnR1YWxKb2luQ29sdW1uczsKLQotCXB1YmxpYyBWaXJ0dWFsWG1sT25lVG9NYW55KE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nID0gamF2YU9uZVRvTWFueU1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0vLwkJdGhpcy5pbml0aWFsaXplSm9pbkNvbHVtbnMoamF2YU9uZVRvTWFueU1hcHBpbmcpOwotCQl0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZSA9IG5ldyBWaXJ0dWFsQ2FzY2FkZVR5cGUoamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLCB0aGlzLm1ldGFkYXRhQ29tcGxldGUpOwotCQl0aGlzLnZpcnR1YWxKb2luVGFibGUgPSBuZXcgVmlydHVhbFhtbEpvaW5UYWJsZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKSwgbWV0YWRhdGFDb21wbGV0ZSk7Ci0JCXRoaXMubWFwS2V5ID0gbmV3IFZpcnR1YWxNYXBLZXkoamF2YU9uZVRvTWFueU1hcHBpbmcsIG1ldGFkYXRhQ29tcGxldGUpOwotCX0KLQkKLS8vCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luQ29sdW1ucyhJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcpIHsKLS8vCQl0aGlzLnZpcnR1YWxKb2luQ29sdW1ucyA9IG5ldyBCYXNpY0VMaXN0PEpvaW5Db2x1bW4+KCk7Ci0vLwkJTGlzdEl0ZXJhdG9yPElKYXZhSm9pbkNvbHVtbj4gamF2YUpvaW5Db2x1bW5zOwotLy8JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLS8vCQkJamF2YUpvaW5Db2x1bW5zID0gdGhpcy5qYXZhT25lVG9NYW55TWFwcGluZy5kZWZhdWx0Sm9pbkNvbHVtbnMoKTsKLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCWphdmFKb2luQ29sdW1ucyA9IHRoaXMuamF2YU9uZVRvTWFueU1hcHBpbmcuam9pbkNvbHVtbnMoKTsJCQkKLS8vCQl9Ci0vLwkJCi0vLwkJd2hpbGUgKGphdmFKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLS8vCQkJdGhpcy52aXJ0dWFsSm9pbkNvbHVtbnMuYWRkKG5ldyBWaXJ0dWFsSm9pbkNvbHVtbihqYXZhSm9pbkNvbHVtbnMubmV4dCgpLCB0aGlzLm1ldGFkYXRhQ29tcGxldGUpKTsKLS8vCQl9Ci0vLwl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhT25lVG9NYW55TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCQl9Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhT25lVG9NYW55TWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCQotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsSm9pblRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCQotCXB1YmxpYyBNYXBLZXkgZ2V0TWFwS2V5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBLZXk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1hcEtleShNYXBLZXkgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE9yZGVyQnkoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0T3JkZXJCeShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcpIHsKLQkJdGhpcy5qYXZhT25lVG9NYW55TWFwcGluZyA9IGphdmFPbmVUb01hbnlNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZS51cGRhdGUoamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpKTsKLQkJdGhpcy52aXJ0dWFsSm9pblRhYmxlLnVwZGF0ZShqYXZhT25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0vLwkJdGhpcy51cGRhdGVKb2luQ29sdW1ucyhqYXZhT25lVG9NYW55TWFwcGluZyk7Ci0JfQotCQotLy8JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSm9pbkNvbHVtbnMoSUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nKSB7Ci0vLwkJTGlzdEl0ZXJhdG9yPElKYXZhSm9pbkNvbHVtbj4gamF2YUpvaW5Db2x1bW5zOwotLy8JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiB2aXJ0dWFsSm9pbkNvbHVtbnMgPSB0aGlzLnZpcnR1YWxKb2luQ29sdW1ucy5saXN0SXRlcmF0b3IoKTsKLS8vCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0vLwkJCWphdmFKb2luQ29sdW1ucyA9IHRoaXMuamF2YU9uZVRvTWFueU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCk7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlqYXZhSm9pbkNvbHVtbnMgPSB0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nLmpvaW5Db2x1bW5zKCk7CQkJCi0vLwkJfQotLy8JCQotLy8JCXdoaWxlIChqYXZhSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0vLwkJCUlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luQ29sdW1ucy5uZXh0KCk7Ci0vLwkJCWlmICh2aXJ0dWFsSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0vLwkJCQlWaXJ0dWFsSm9pbkNvbHVtbiB2aXJ0dWFsSm9pbkNvbHVtbiA9IChWaXJ0dWFsSm9pbkNvbHVtbikgdmlydHVhbEpvaW5Db2x1bW5zLm5leHQoKTsKLS8vCQkJCXZpcnR1YWxKb2luQ29sdW1uLnVwZGF0ZShqYXZhSm9pbkNvbHVtbik7Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQl0aGlzLnZpcnR1YWxKb2luQ29sdW1ucy5hZGQobmV3IFZpcnR1YWxKb2luQ29sdW1uKGphdmFKb2luQ29sdW1uLCB0aGlzLm1ldGFkYXRhQ29tcGxldGUpKTsKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQl3aGlsZSh2aXJ0dWFsSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0vLwkJCXRoaXMudmlydHVhbEpvaW5Db2x1bW5zLnJlbW92ZSh2aXJ0dWFsSm9pbkNvbHVtbnMubmV4dCgpKTsKLS8vCQl9Ci0vLwl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxPbmVUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxPbmVUb09uZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzcxYjJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sT25lVG9PbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBWaXJ0dWFsT25lVG9PbmUgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgT25lVG9PbmUgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFPbmVUb09uZU1hcHBpbmcgZXhpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbE9uZVRvT25lIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sT25lVG9PbmUKLXsKLQlKYXZhT25lVG9PbmVNYXBwaW5nIGphdmFPbmVUb09uZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlOwotCQotLy8JcHJvdGVjdGVkIFZpcnR1YWxKb2luVGFibGUgdmlydHVhbEpvaW5UYWJsZTsKLQkJCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxDYXNjYWRlVHlwZSB2aXJ0dWFsQ2FzY2FkZVR5cGU7Ci0KLQlwdWJsaWMgVmlydHVhbFhtbE9uZVRvT25lKEphdmFPbmVUb09uZU1hcHBpbmcgamF2YU9uZVRvT25lTWFwcGluZywgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuamF2YU9uZVRvT25lTWFwcGluZyA9IGphdmFPbmVUb09uZU1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JCXRoaXMudmlydHVhbENhc2NhZGVUeXBlID0gbmV3IFZpcnR1YWxDYXNjYWRlVHlwZShqYXZhT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKSwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0JCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFPbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCQl9Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhT25lVG9PbmVNYXBwaW5nLmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFPbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdE9wdGlvbmFsKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YU9uZVRvT25lTWFwcGluZy5nZXRPcHRpb25hbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gbmV3T3B0aW9uYWwpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJLy9UT0RPIG5lZWQgdG8gY2hlY2sgbWV0YWRhdGFDb21wbGV0ZSBoZXJlCi0JCUVMaXN0PFhtbEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0pPSU5fQ09MVU1OUyk7Ci0JCS8vVE9ETyBoZXJlIGknbSB1c2luZyBqb2luQ29sdW1ucygpIHdoaWxlIFZpcnR1YWxYbWxKb2luVGFibGUgdXNlcyBzcGVjaWZpZWRKb2luQ29sdW1ucygpPz8/Ci0JCWZvciAoSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFPbmVUb09uZU1hcHBpbmcuam9pbkNvbHVtbnMoKSkpIHsKLQkJCVhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sSm9pbkNvbHVtbihqb2luQ29sdW1uLCB0aGlzLm1ldGFkYXRhQ29tcGxldGUpOwotCQkJam9pbkNvbHVtbnMuYWRkKHhtbEpvaW5Db2x1bW4pOwotCQl9Ci0JCXJldHVybiBqb2luQ29sdW1uczsKLQl9Ci0KLQlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbENhc2NhZGVUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0JCi0JcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7Ci0JCS8vVE9ETyB3ZSBkb24ndCB5ZXQgc3VwcG9ydCBKb2luVGFibGUgaW4gdGhlIGNvbnRleHQgbW9kZWwgZm9yIG1hbnktdG8tb25lIG1hcHBpbmdzCi0JCXJldHVybiBudWxsOy8vdGhpcy52aXJ0dWFsSm9pblRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuamF2YU9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YU9uZVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhT25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPihYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJaWYgKCF0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCWZvciAoSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5qYXZhT25lVG9PbmVNYXBwaW5nLnByaW1hcnlLZXlKb2luQ29sdW1ucygpKSkgewotCQkJCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSBuZXcgVmlydHVhbFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKGpvaW5Db2x1bW4vKiwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKi8pOwotCQkJCWpvaW5Db2x1bW5zLmFkZCh4bWxKb2luQ29sdW1uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhT25lVG9PbmVNYXBwaW5nIGphdmFPbmVUb09uZU1hcHBpbmcpIHsKLQkJdGhpcy5qYXZhT25lVG9PbmVNYXBwaW5nID0gamF2YU9uZVRvT25lTWFwcGluZzsKLQkJdGhpcy52aXJ0dWFsQ2FzY2FkZVR5cGUudXBkYXRlKGphdmFPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDY1YjJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIEEgdmlydHVhbCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVzb3VyY2Ugb2JqZWN0Ci0gKiB3aXRoaW4gYSB2aXJ0dWFsIHNlY29uZGFyeSB0YWJsZS4gIEEgdmlydHVhbCBzZWNvbmRhcnkgdGFibGUgaXMgb25lIHdoaWNoIGlzIG5vdCBzcGVjaWZpZWQKLSAqIGluIHRoZSBvcm0ueG1sIGZpbGUsIGJ1dCBpcyBpbXBsaWVkIGZyb20gdGhlIHVuZGVybHlpbmcgamF2YS4gIFZpcnR1YWwgcGsgam9pbiBjb2x1bW4KLSAqIGlzIG5vdCB1c2VkIHdoZW4gdGhlIHNlY29uZGFyeSB0YWJsZSBpcyBzcGVjaWZpZWQgaW4gdGhlIG9ybS54bWwuCi0gKiAKLSAqIEEgdmlydHVhbCBwayBqb2luIGNvbHVtbiBkZWxlZ2F0ZXMgdG8gdGhlIHVuZGVybHlpbmcgamF2YSBwayBqb2luIGNvbHVtbiBmb3IgaXRzIHN0YXRlLgotICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4KLXsKLQkKLQlwcm90ZWN0ZWQgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQotCQotCXByb3RlY3RlZCBWaXJ0dWFsWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByaW1hcnlLZXlKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQl0aGlzLmphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFNlY29uZGFyeVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFNlY29uZGFyeVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNWEwMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxTZWNvbmRhcnlUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi0vKioKLSAqIEEgdmlydHVhbCBzZWNvbmRhcnkgdGFibGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIFhtbFNlY29uZGFyeVRhYmxlIHJlc291cmNlIG9iamVjdC4KLSAqIEEgdmlydHVhbCBzZWNvbmRhcnkgdGFibGUgaXMgb25lIHdoaWNoIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIG9ybS54bWwgZmlsZSwgCi0gKiBidXQgaXMgaW1wbGllZCBmcm9tIHRoZSB1bmRlcmx5aW5nIGphdmEuICBWaXJ0dWFsIHNlY29uZGFyeSB0YWJsZQotICogaXMgbm90IHVzZWQgd2hlbiB0aGUgc2Vjb25kYXJ5IHRhYmxlIGlzIHNwZWNpZmllZCBpbiB0aGUgb3JtLnhtbC4KLSAqIAotICogQSB2aXJ0dWFsIHNlY29uZGFyeSB0YWJsZSBkZWxlZ2F0ZXMgdG8gdGhlIHVuZGVybHlpbmcgamF2YSBzZWNvbmRhcnkgdGFibGUgZm9yIGl0cyBzdGF0ZS4gCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sU2Vjb25kYXJ5VGFibGUgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxTZWNvbmRhcnlUYWJsZQotewotCQotCXByb3RlY3RlZCBKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlOwotCQotCXByb3RlY3RlZCBWaXJ0dWFsWG1sU2Vjb25kYXJ5VGFibGUoSmF2YVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFTZWNvbmRhcnlUYWJsZSA9IGphdmFTZWNvbmRhcnlUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFTZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0JCi0JLy9WaXJ0dWFsWG1sU2Vjb25kYXJ5VGFibGUgaXMgcmVidWlsdCBldmVyeXRpbWUsIHNvIHJlYnVpbGRpbmcgdGhlIGpvaW5Db2x1bW5zIGxpc3QgYXMgd2VsbAotCXB1YmxpYyBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPihYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCQotCQlmb3IgKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5qYXZhU2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiB4bWxQa0pvaW5Db2x1bW4gPSBuZXcgVmlydHVhbFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKHBrSm9pbkNvbHVtbik7Ci0JCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKHhtbFBrSm9pbkNvbHVtbik7Ci0JCX0KLQkJCi0JCXJldHVybiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0JfQotCQotCXB1YmxpYyBFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpIHsKLQkJRUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4geG1sVW5pcXVlQ29uc3RyYWludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4oWG1sVW5pcXVlQ29uc3RyYWludC5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMpOwotCi0JCWZvciAoSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFTZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpKSkgewotCQkJWG1sVW5pcXVlQ29uc3RyYWludCB4bWxVbmlxdWVDb25zdHJhaW50ID0gbmV3IFZpcnR1YWxYbWxVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQsIHRydWUpOwotCQkJeG1sVW5pcXVlQ29uc3RyYWludHMuYWRkKHhtbFVuaXF1ZUNvbnN0cmFpbnQpOwotCQl9Ci0KLQkJcmV0dXJuIHhtbFVuaXF1ZUNvbnN0cmFpbnRzOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSkgewotCQl0aGlzLmphdmFTZWNvbmRhcnlUYWJsZSA9IGphdmFTZWNvbmRhcnlUYWJsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhYjIzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFNlcXVlbmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotcHVibGljIGNsYXNzIFZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFNlcXVlbmNlR2VuZXJhdG9yCi17Ci0JSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLQotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGU7Ci0JCi0JCQotCXB1YmxpYyBWaXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IoSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGphdmFTZXF1ZW5jZUdlbmVyYXRvciwgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuamF2YVNlcXVlbmNlR2VuZXJhdG9yID0gamF2YVNlcXVlbmNlR2VuZXJhdG9yOwotCQl0aGlzLm1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhU2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2VxdWVuY2VOYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2VOYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldEFsbG9jYXRpb25TaXplKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhU2VxdWVuY2VHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRJbml0aWFsVmFsdWUoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFTZXF1ZW5jZUdlbmVyYXRvci5nZXRJbml0aWFsVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsVmFsdWUoSW50ZWdlciB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhU2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGphdmFTZXF1ZW5jZUdlbmVyYXRvcikgewotCQl0aGlzLmphdmFTZXF1ZW5jZUdlbmVyYXRvciA9IGphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sVGFibGVHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sVGFibGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMyZjZjYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFRhYmxlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sVGFibGVHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxUYWJsZUdlbmVyYXRvcgotewotCUphdmFUYWJsZUdlbmVyYXRvciBqYXZhVGFibGVHZW5lcmF0b3I7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlOwotCQotCQkKLQlwdWJsaWMgVmlydHVhbFhtbFRhYmxlR2VuZXJhdG9yKEphdmFUYWJsZUdlbmVyYXRvciBqYXZhVGFibGVHZW5lcmF0b3IsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFUYWJsZUdlbmVyYXRvciA9IGphdmFUYWJsZUdlbmVyYXRvcjsKLQkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFUYWJsZUdlbmVyYXRvci5nZXRDYXRhbG9nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGtDb2x1bW5OYW1lKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhVGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5OYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGtDb2x1bW5OYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhVGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBrQ29sdW1uVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YVRhYmxlR2VuZXJhdG9yLmdldFNjaGVtYSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFUYWJsZUdlbmVyYXRvci5nZXRUYWJsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUNvbHVtbk5hbWUoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFUYWJsZUdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YVRhYmxlR2VuZXJhdG9yLmdldEFsbG9jYXRpb25TaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlciB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0SW5pdGlhbFZhbHVlKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhVGFibGVHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFZhbHVlKEludGVnZXIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YVRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0KLQotCXB1YmxpYyBFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpIHsKLQkJRUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4geG1sVW5pcXVlQ29uc3RyYWludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4oWG1sVW5pcXVlQ29uc3RyYWludC5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFMpOwotCi0JCWZvciAoSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFUYWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpKSkgewotCQkJWG1sVW5pcXVlQ29uc3RyYWludCB4bWxVbmlxdWVDb25zdHJhaW50ID0gbmV3IFZpcnR1YWxYbWxVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQsIHRoaXMubWV0YWRhdGFDb21wbGV0ZSk7Ci0JCQl4bWxVbmlxdWVDb25zdHJhaW50cy5hZGQoeG1sVW5pcXVlQ29uc3RyYWludCk7Ci0JCX0KLQotCQlyZXR1cm4geG1sVW5pcXVlQ29uc3RyYWludHM7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFUYWJsZUdlbmVyYXRvciBqYXZhVGFibGVHZW5lcmF0b3IpIHsKLQkJdGhpcy5qYXZhVGFibGVHZW5lcmF0b3IgPSBqYXZhVGFibGVHZW5lcmF0b3I7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFRyYW5zaWVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxUcmFuc2llbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4MGNjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFRyYW5zaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogVmlydHVhbFRyYW5zaWVudCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBUcmFuc2llbnQgdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFUcmFuc2llbnRNYXBwaW5nIGV4aXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxYbWxUcmFuc2llbnQgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxUcmFuc2llbnQKLXsKLQlKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhVHJhbnNpZW50TWFwcGluZzsKLQotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGU7Ci0JCi0JcHVibGljIFZpcnR1YWxYbWxUcmFuc2llbnQoSmF2YVRyYW5zaWVudE1hcHBpbmcgamF2YVRyYW5zaWVudE1hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFUcmFuc2llbnRNYXBwaW5nID0gamF2YVRyYW5zaWVudE1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhVHJhbnNpZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhVHJhbnNpZW50TWFwcGluZykgewotCQl0aGlzLmphdmFUcmFuc2llbnRNYXBwaW5nID0gamF2YVRyYW5zaWVudE1hcHBpbmc7Ci0JfQotCQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFVuaXF1ZUNvbnN0cmFpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sVW5pcXVlQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjEwNmVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sVW5pcXVlQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFVuaXF1ZUNvbnN0cmFpbnQKLXsJCi0JcHJvdGVjdGVkIEphdmFVbmlxdWVDb25zdHJhaW50IGphdmFVbmlxdWVDb25zdHJhaW50OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKLQotCXByb3RlY3RlZCBWaXJ0dWFsWG1sVW5pcXVlQ29uc3RyYWludChKYXZhVW5pcXVlQ29uc3RyYWludCBqYXZhVW5pcXVlQ29uc3RyYWludCwgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuamF2YVVuaXF1ZUNvbnN0cmFpbnQgPSBqYXZhVW5pcXVlQ29uc3RyYWludDsKLQkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRDb2x1bW5OYW1lcygpIHsKLQkJRUxpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lcyA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfSU1QTF9fQ09MVU1OX05BTUVTKTsKLQotCQlmb3IgKFN0cmluZyBjb2x1bW5OYW1lIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuamF2YVVuaXF1ZUNvbnN0cmFpbnQuY29sdW1uTmFtZXMoKSkpIHsKLQkJCWNvbHVtbk5hbWVzLmFkZChjb2x1bW5OYW1lKTsKLQkJfQotCQlyZXR1cm4gY29sdW1uTmFtZXM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxWZXJzaW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwMmUzOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIFZpcnR1YWxWZXJzaW9uIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFZlcnNpb24gdXNlZCB3aGVuIHRoZXJlIGlzIAotICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFWZXJzaW9uTWFwcGluZyBleGlzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sVmVyc2lvbiBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFZlcnNpb24KLXsKLQlKYXZhVmVyc2lvbk1hcHBpbmcgamF2YVZlcnNpb25NYXBwaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxDb2x1bW4gY29sdW1uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKLQkKLQlwdWJsaWMgVmlydHVhbFhtbFZlcnNpb24oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFWZXJzaW9uTWFwcGluZyA9IGphdmFWZXJzaW9uTWFwcGluZzsKLQkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLQkJdGhpcy5jb2x1bW4gPSBuZXcgVmlydHVhbFhtbENvbHVtbihvcm1UeXBlTWFwcGluZywgamF2YVZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLCBtZXRhZGF0YUNvbXBsZXRlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFWZXJzaW9uTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFWZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcpIHsKLQkJdGhpcy5qYXZhVmVyc2lvbk1hcHBpbmcgPSBqYXZhVmVyc2lvbk1hcHBpbmc7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZShqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5NjQxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuQWJzdHJhY3RKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlIGV4dGVuZHMgQWJzdHJhY3RKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUoSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0JCi0JLyoqCi0JICogQWxsIHN1YmNsYXNzIGltcGxlbWVudGF0aW9ucyB7QGxpbmsgI2FkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4pfSAKLQkgKiBzaG91bGQgYmUgcHJlY2VkZWQgYnkgYSAic3VwZXIiIGNhbGwgdG8gdGhpcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY0NsYXNzUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljQ2xhc3NSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2OThmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljQ2xhc3NSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjb250ZXh0IG1vZGVsIG9iamVjdCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgCi0gKiBwZXJzaXN0ZW5jZSByZXNvdXJjZSBtb2RlbCBvYmplY3QgWG1sSmF2YUNsYXNzUmVmLgotICogWG1sSmF2YUNsYXNzUmVmIGNvcnJlc3BvbmRzIHRvIHRoZSBjbGFzcyB0YWcgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0NsYXNzUmVmIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlIAotCWltcGxlbWVudHMgQ2xhc3NSZWYKLXsKLQkvL3RoaXMgaXMgbnVsbCBmb3IgdGhlIGltcGxpZWQgY2xhc3NSZWYgY2FzZQotCXByb3RlY3RlZCBYbWxKYXZhQ2xhc3NSZWYgeG1sSmF2YUNsYXNzUmVmOwotCQotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOwotCQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlOwotCQotCQotCXB1YmxpYyBHZW5lcmljQ2xhc3NSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWluaXRpYWxpemUoY2xhc3NSZWYpOwotCX0KLQkKLQlwdWJsaWMgR2VuZXJpY0NsYXNzUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdGlhbGl6ZShjbGFzc05hbWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VTdHJ1Y3R1cmVOb2Rlcy5DTEFTU19SRUZfSUQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRm9yKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCWlmIChnZXRDbGFzc05hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGdldENsYXNzTmFtZSgpLmVxdWFscyhmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gdGhpcy54bWxKYXZhQ2xhc3NSZWYgPT0gbnVsbDsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBjbGFzcyBuYW1lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgbmV3Q2xhc3NOYW1lKSB7Ci0JCVN0cmluZyBvbGRDbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBuZXdDbGFzc05hbWU7Ci0JCXRoaXMueG1sSmF2YUNsYXNzUmVmLnNldEphdmFDbGFzcyhuZXdDbGFzc05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENMQVNTX05BTUVfUFJPUEVSVFksIG9sZENsYXNzTmFtZSwgbmV3Q2xhc3NOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lXyhTdHJpbmcgbmV3Q2xhc3NOYW1lKSB7Ci0JCVN0cmluZyBvbGRDbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBuZXdDbGFzc05hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkQ2xhc3NOYW1lLCBuZXdDbGFzc05hbWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgcGVyc2lzdGVudCB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFQZXJzaXN0ZW50VHlwZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SmF2YVBlcnNpc3RlbnRUeXBlKEphdmFQZXJzaXN0ZW50VHlwZSBuZXdKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG9sZEphdmFQZXJzaXN0ZW50VHlwZSA9IHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlOwotCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSA9IG5ld0phdmFQZXJzaXN0ZW50VHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDbGFzc1JlZi5KQVZBX1BFUlNJU1RFTlRfVFlQRV9QUk9QRVJUWSwgb2xkSmF2YVBlcnNpc3RlbnRUeXBlLCBuZXdKYXZhUGVyc2lzdGVudFR5cGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxKYXZhQ2xhc3NSZWYgY2xhc3NSZWYpIHsKLQkJdGhpcy54bWxKYXZhQ2xhc3NSZWYgPSBjbGFzc1JlZjsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc1JlZi5nZXRKYXZhQ2xhc3MoKTsKLQkJaW5pdGlhbGl6ZUphdmFQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCWluaXRpYWxpemVKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUphdmFQZXJzaXN0ZW50VHlwZSgpIHsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShnZXRDbGFzc05hbWUoKSk7Ci0JCWlmIChqcnB0ICE9IG51bGwpIHsKLQkJCXRoaXMuamF2YVBlcnNpc3RlbnRUeXBlID0gYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoanJwdCk7Ci0JCX0JCQkJCi0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEphdmFDbGFzc1JlZiBjbGFzc1JlZikgewotCQl0aGlzLnhtbEphdmFDbGFzc1JlZiA9IGNsYXNzUmVmOwotCQlzZXRDbGFzc05hbWVfKGNsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQkJdXBkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRoaXMueG1sSmF2YUNsYXNzUmVmID0gbnVsbDsKLQkJc2V0Q2xhc3NOYW1lXyhjbGFzc05hbWUpOwotCQl1cGRhdGVKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKCkgewotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKGdldENsYXNzTmFtZSgpKTsKLQkJaWYgKGpycHQgPT0gbnVsbCkgewotCQkJaWYgKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsKLQkJCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlzZXRKYXZhUGVyc2lzdGVudFR5cGUobnVsbCk7Ci0JCX0KLQkJZWxzZSB7IAotCQkJaWYgKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsKLQkJCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS51cGRhdGUoanJwdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRKYXZhUGVyc2lzdGVudFR5cGUoYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoanJwdCkpOwotCQkJfQotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFQZXJzaXN0ZW50VHlwZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUodGhpcywganJwdCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCWFkZFVuc3BlY2lmaWVkQ2xhc3NNZXNzYWdlKG1lc3NhZ2VzKTsKLQkJYWRkVW5yZXNvbHZlZENsYXNzTWVzc2FnZShtZXNzYWdlcyk7Ci0JCWFkZEphdmFQZXJzaXN0ZW50VHlwZU1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVW5zcGVjaWZpZWRDbGFzc01lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0Q2xhc3NOYW1lKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0NMQVNTLAotCQkJCQl0aGlzLCBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkpCi0JCQkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFVucmVzb2x2ZWRDbGFzc01lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRDbGFzc05hbWUoKSkgJiYgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9DTEFTUywKLQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRDbGFzc05hbWUoKX0sIAotCQkJCQl0aGlzLCAKLQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkpCi0JCQkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFQZXJzaXN0ZW50VHlwZU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmIChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7IC8vY2xhc3MgbWlnaHQgbm90IHJlc29sdmUgdG8gYSBqYXZhIHR5cGUKLQkJCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gZ2V0TWFwcGluZ0ZpbGVDb250YWluaW5nKGdldENsYXNzTmFtZSgpKTsKLQkJCWlmIChtYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5MT1dfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1JFRFVOREFOVF9DTEFTUywKLQkJCQkJbmV3IFN0cmluZ1tdIHsgdGhpcy5nZXRDbGFzc05hbWUoKSwgbWFwcGluZ0ZpbGVSZWYuZ2V0RmlsZU5hbWUoKX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0cnkgewotCQkJCQkvL2J1ZyAxOTAwNjIgLSBvbmx5IGFkZCBqYXZhIHZhbGlkYXRpb24gbWVzc2FnZXMgaWYgdGhpcyBjbGFzcyBpcyBub3QgbGlzdGVkIGluIGEgbWFwcGluZyBmaWxlCi0JCQkJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCUpwdENvcmVQbHVnaW4ubG9nKHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvL3Bvc3NpYmx5IG1vdmUgdGhpcyBhbmQgbWFrZSBpdCBBUEkgb24gUGVyc2lzdGVuY2VVbml0Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXBwaW5nIGZpbGUgdGhhdCBjb250YWlucyBhIHBlcnNpc3RlbnQgdHlwZSBmb3IgdGhlIGdpdmVuIAotCSAqIHR5cGUgbmFtZS4gIFJldHVybiBudWxsIGlmIG5vIG1hcHBpbmcgZmlsZSBjb250YWlucyB0aGUgcGVyc2lzdGVudCB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBnZXRNYXBwaW5nRmlsZUNvbnRhaW5pbmcoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJZm9yIChNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShnZXRQZXJzaXN0ZW5jZVVuaXQoKS5tYXBwaW5nRmlsZVJlZnMoKSkpIHsKLQkJCWlmIChtYXBwaW5nRmlsZVJlZi5nZXRQZXJzaXN0ZW50VHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLnhtbEphdmFDbGFzc1JlZi5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMueG1sSmF2YUNsYXNzUmVmLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMueG1sSmF2YUNsYXNzUmVmLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkgIT0gbnVsbCkgewotCQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY01hcHBpbmdGaWxlUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljTWFwcGluZ0ZpbGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzZGUzNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljTWFwcGluZ0ZpbGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY01hcHBpbmdGaWxlUmVmIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlIAotCWltcGxlbWVudHMgTWFwcGluZ0ZpbGVSZWYKLXsKLQkvL3RoaXMgaXMgbnVsbCBmb3IgdGhlIGltcGxpZWQgbWFwcGluZ0ZpbGVSZWYgY2FzZQotCXByb3RlY3RlZCBYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZjsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbGVOYW1lOwotCQotCXByb3RlY3RlZCBPcm1YbWwgb3JtWG1sOwotCQotCXB1YmxpYyBHZW5lcmljTWFwcGluZ0ZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplKG1hcHBpbmdGaWxlUmVmKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuTUFQUElOR19GSUxFX1JFRl9JRDsKLQl9Ci0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiB4bWxNYXBwaW5nRmlsZVJlZiA9PSBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGZpbGUgbmFtZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBuZXdGaWxlTmFtZSkgewotCQl0aGlzLnhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKG5ld0ZpbGVOYW1lKTsKLQkJc2V0RmlsZU5hbWVfKG5ld0ZpbGVOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmlsZU5hbWVfKFN0cmluZyBuZXdGaWxlTmFtZSkgewotCQlTdHJpbmcgb2xkRmlsZU5hbWUgPSB0aGlzLmZpbGVOYW1lOwotCQl0aGlzLmZpbGVOYW1lID0gbmV3RmlsZU5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRklMRV9OQU1FX1BST1BFUlRZLCBvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgT3JtWG1sIGdldE9ybVhtbCgpIHsKLQkJcmV0dXJuIHRoaXMub3JtWG1sOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRPcm1YbWwoT3JtWG1sIG5ld09ybVhtbCkgewotCQlPcm1YbWwgb2xkT3JtWG1sID0gdGhpcy5vcm1YbWw7Ci0JCXRoaXMub3JtWG1sID0gbmV3T3JtWG1sOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9STV9YTUxfUFJPUEVSVFksIG9sZE9ybVhtbCwgbmV3T3JtWG1sKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJdGhpcy54bWxNYXBwaW5nRmlsZVJlZiA9IG1hcHBpbmdGaWxlUmVmOwotCQlpbml0aWFsaXplRmlsZU5hbWUoKTsKLQkJaW5pdGlhbGl6ZU9ybVhtbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmlsZU5hbWUoKSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJZmlsZU5hbWUgPSBKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaWxlTmFtZSA9IHhtbE1hcHBpbmdGaWxlUmVmLmdldEZpbGVOYW1lKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9ybVhtbCgpIHsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCU9ybUFydGlmYWN0RWRpdCBvYWUgPSBPcm1BcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJCU9ybVJlc291cmNlIG9ybVJlc291cmNlID0gb2FlLmdldFJlc291cmNlKGZpbGVOYW1lKTsKLQkJCQotCQkJaWYgKG9ybVJlc291cmNlICE9IG51bGwgJiYgb3JtUmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCQlvcm1YbWwgPSBidWlsZE9ybVhtbChvcm1SZXNvdXJjZSk7Ci0JCQl9Ci0JCQlvYWUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmID0gbWFwcGluZ0ZpbGVSZWY7Ci0JCXVwZGF0ZUZpbGVOYW1lKCk7Ci0JCXVwZGF0ZU9ybVhtbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVGaWxlTmFtZSgpIHsKLQkJaWYgKGlzVmlydHVhbCgpKSB7Ci0JCQlzZXRGaWxlTmFtZV8oSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEZpbGVOYW1lXyh4bWxNYXBwaW5nRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPcm1YbWwoKSB7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJCU9ybUFydGlmYWN0RWRpdCBvYWUgPSBPcm1BcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCU9ybVJlc291cmNlIG9ybVJlc291cmNlID0gb2FlLmdldFJlc291cmNlKEpwdENvcmVQbHVnaW4uZ2V0T3JtWG1sRGVwbG95bWVudFVSSShwcm9qZWN0LCBmaWxlTmFtZSkpOwotCQkJaWYgKG9ybVJlc291cmNlICE9IG51bGwgJiYgb3JtUmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCQlpZiAob3JtWG1sICE9IG51bGwpIHsKLQkJCQkJb3JtWG1sLnVwZGF0ZShvcm1SZXNvdXJjZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZXRPcm1YbWwoYnVpbGRPcm1YbWwob3JtUmVzb3VyY2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZ2V0T3JtWG1sKCkgIT0gbnVsbCkgewotCQkJCQlnZXRPcm1YbWwoKS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCXNldE9ybVhtbChudWxsKTsKLQkJCX0KLQkJCW9hZS5kaXNwb3NlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0T3JtWG1sKCkgIT0gbnVsbCkgewotCQkJCWdldE9ybVhtbCgpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXNldE9ybVhtbChudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtWG1sIGJ1aWxkT3JtWG1sKE9ybVJlc291cmNlIG9ybVJlc291cmNlKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1YbWwodGhpcywgb3JtUmVzb3VyY2UpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgewotCQlpZiAoZ2V0T3JtWG1sKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE9ybVhtbCgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlpZiAoZ2V0T3JtWG1sKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE9ybVhtbCgpLmdldFBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCkgewotCQlpZiAodGhpcy54bWxNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMueG1sTWFwcGluZ0ZpbGVSZWYuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlpZiAoaXNWaXJ0dWFsKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLnhtbE1hcHBpbmdGaWxlUmVmLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy54bWxNYXBwaW5nRmlsZVJlZi5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQl0aGlzLmFkZFVuc3BlY2lmaWVkTWFwcGluZ0ZpbGVNZXNzYWdlKG1lc3NhZ2VzKTsKLQkJdGhpcy5hZGRVbnJlc29sdmVkTWFwcGluZ0ZpbGVNZXNzYWdlKG1lc3NhZ2VzKTsKLQkJdGhpcy5hZGRJbnZhbGlkTWFwcGluZ0ZpbGVDb250ZW50TWVzc2FnZShtZXNzYWdlcyk7Ci0JCWlmIChnZXRPcm1YbWwoKSAhPSBudWxsKSB7Ci0JCQlnZXRPcm1YbWwoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRVbnNwZWNpZmllZE1hcHBpbmdGaWxlTWVzc2FnZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRGaWxlTmFtZSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEUsCi0JCQkJCXRoaXMsIAotCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkpCi0JCQkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFVucmVzb2x2ZWRNYXBwaW5nRmlsZU1lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKCFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldEZpbGVOYW1lKCkpICYmIGdldE9ybVhtbCgpID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfTUFQUElOR19GSUxFLAotCQkJCQluZXcgU3RyaW5nW10ge2dldEZpbGVOYW1lKCl9LCAKLQkJCQkJdGhpcywgCi0JCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSkgCi0JCQkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEludmFsaWRNYXBwaW5nRmlsZUNvbnRlbnRNZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmIChnZXRPcm1YbWwoKSAhPSBudWxsIAotCQkJCSYmIGdldE9ybVhtbCgpLmdldEVudGl0eU1hcHBpbmdzKCkgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX01BUFBJTkdfRklMRSwKLQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRGaWxlTmFtZSgpfSwgCi0JCQkJCXRoaXMsCi0JCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKGdldEZpbGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ2V0T3JtWG1sKCkgIT0gbnVsbCkgewotCQkJZ2V0T3JtWG1sKCkuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1BlcnNpc3RlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhMWE4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2UgZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlCi17CQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZTsKLQkKLQkvLyB0aGUgaW1wbGVtZW50YXRpb24gaGVyZSBpcyBhIHNpbmdsZSBwZXJzaXN0ZW5jZSB1bml0LCBhbHRob3VnaCB0aGUgQVBJCi0JLy8gaXMgZm9yIGEgbGlzdC4gIHdlIHdpbGwgd2FudCB0byBzdXBwb3J0IG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzIHNvb24uCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQ7Ci0KLQlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlKFBlcnNpc3RlbmNlWG1sIHBhcmVudCwgWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplKHhtbFBlcnNpc3RlbmNlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOQ0VfSUQ7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBwZXJzaXN0ZW5jZSB1bml0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRzKCkgewotCQlpZiAocGVyc2lzdGVuY2VVbml0ID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4ocGVyc2lzdGVuY2VVbml0KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IHBlcnNpc3RlbmNlVW5pdHNTaXplKCkgewotCQlyZXR1cm4gKHBlcnNpc3RlbmNlVW5pdCA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGFkZFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIGFkZFBlcnNpc3RlbmNlVW5pdChwZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBhZGRQZXJzaXN0ZW5jZVVuaXQoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA+IDAgfHwgcGVyc2lzdGVuY2VVbml0ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cy4iKTsKLQkJfQotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0ID0gY3JlYXRlUGVyc2lzdGVuY2VVbml0KHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCXhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5hZGQoeG1sUGVyc2lzdGVuY2VVbml0KTsKLQkJZmlyZUl0ZW1BZGRlZChQRVJTSVNURU5DRV9VTklUU19MSVNULCBpbmRleCwgcGVyc2lzdGVuY2VVbml0KTsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUGVyc2lzdGVuY2VVbml0KFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmVtb3ZlUGVyc2lzdGVuY2VVbml0KDApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVQZXJzaXN0ZW5jZVVuaXQoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA+IDAgKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5ldyBJbnRlZ2VyKGluZGV4KS50b1N0cmluZygpKTsKLQkJfQotCQlQZXJzaXN0ZW5jZVVuaXQgb2xkUGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0OwotCQlwZXJzaXN0ZW5jZVVuaXQuZGlzcG9zZSgpOwotCQlwZXJzaXN0ZW5jZVVuaXQgPSBudWxsOwotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFBFUlNJU1RFTkNFX1VOSVRTX0xJU1QsIGluZGV4LCBvbGRQZXJzaXN0ZW5jZVVuaXQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQZXJzaXN0ZW5jZVVuaXRfKFBlcnNpc3RlbmNlVW5pdCBuZXdQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcGVyc2lzdGVuY2VVbml0ID0gbmV3UGVyc2lzdGVuY2VVbml0OwotCQlmaXJlSXRlbUFkZGVkKFBFUlNJU1RFTkNFX1VOSVRTX0xJU1QsIDAsIHBlcnNpc3RlbmNlVW5pdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVBlcnNpc3RlbmNlVW5pdF8oUGVyc2lzdGVuY2VVbml0IG9sZFBlcnNpc3RlbmNlVW5pdCkgewotCQlwZXJzaXN0ZW5jZVVuaXQuZGlzcG9zZSgpOwotCQlwZXJzaXN0ZW5jZVVuaXQgPSBudWxsOwotCQlmaXJlSXRlbVJlbW92ZWQoUEVSU0lTVEVOQ0VfVU5JVFNfTElTVCwgMCwgb2xkUGVyc2lzdGVuY2VVbml0KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UpIHsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZSA9IHhtbFBlcnNpc3RlbmNlOwotCQlpbml0aWFsaXplUGVyc2lzdGVuY2VVbml0cyh4bWxQZXJzaXN0ZW5jZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQZXJzaXN0ZW5jZVVuaXRzKFhtbFBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlKSB7Ci0JCS8vIG9ubHkgYWRkaW5nIG9uZSBoZXJlLCB1bnRpbCB3ZSBzdXBwb3J0IG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzCi0JCWlmICh4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuc2l6ZSgpID4gMCkgewotCQkJcGVyc2lzdGVuY2VVbml0ID0gY3JlYXRlUGVyc2lzdGVuY2VVbml0KHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSkgewotCQl0aGlzLnhtbFBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2U7Ci0JCWdldEpwYUZpbGUodGhpcy54bWxQZXJzaXN0ZW5jZS5nZXRSZXNvdXJjZSgpLmdldFJlc291cmNlTW9kZWwoKSkuYWRkUm9vdFN0cnVjdHVyZU5vZGUodGhpcywgdGhpcyk7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBudWxsOwotCQlpZiAocGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnNpemUoKSA+IDApIHsKLQkJCXhtbFBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCk7Ci0JCX0KLQkJCQkKLQkJaWYgKHBlcnNpc3RlbmNlVW5pdCAhPSBudWxsKSB7Ci0JCQlpZiAoeG1sUGVyc2lzdGVuY2VVbml0ICE9IG51bGwpIHsKLQkJCQlwZXJzaXN0ZW5jZVVuaXQudXBkYXRlKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVQZXJzaXN0ZW5jZVVuaXRfKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoeG1sUGVyc2lzdGVuY2VVbml0ICE9IG51bGwpIHsKLQkJCQlhZGRQZXJzaXN0ZW5jZVVuaXRfKGNyZWF0ZVBlcnNpc3RlbmNlVW5pdCh4bWxQZXJzaXN0ZW5jZVVuaXQpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdChYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRQZXJzaXN0ZW5jZVVuaXQodGhpcywgeG1sUGVyc2lzdGVuY2VVbml0KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vIFBlcnNpc3RlbmNlVW5pdCBpbiB0aGlzIGNvbnRleHQiKTsKLQl9Ci0JCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgewotCQlmb3IgKFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUocGVyc2lzdGVuY2VVbml0cygpKSkgewotCQkJaWYgKHBlcnNpc3RlbmNlVW5pdC5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KSkgewotCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3RydWN0dXJlTm9kZSh0ZXh0T2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpIHsKLQkJaWYgKHhtbFBlcnNpc3RlbmNlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2UuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2UuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCS8vcGVyc2lzdGVuY2Ugcm9vdCB2YWxpZGF0aW9uCi0JCWFkZE5vUGVyc2lzdGVuY2VVbml0TWVzc2FnZShtZXNzYWdlcyk7Ci0JCQotCQkvLyBub3RlIHRvIG5laWwgKG9yIHdob21ldmVyKTogZXh0cmFuZW91cyBwZXJzaXN0ZW5jZSB1bml0cyBjYW4gYmUKLQkJLy8gYWNjZXNzZWQgdGhyb3VnaCB0aGUgWG1sUGVyc2lzdGVuY2UgcmVzb3VyY2Ugb2JqZWN0Ci0JCWFkZE11bHRpcGxlUGVyc2lzdGVuY2VVbml0TWVzc2FnZShtZXNzYWdlcyk7Ci0JCQotCQkKLQkJLy9wZXJzaXN0ZW5jZSB1bml0IHZhbGlkYXRpb24KLQkJaWYgKHBlcnNpc3RlbmNlVW5pdCAhPSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW5jZVVuaXQuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9QZXJzaXN0ZW5jZVVuaXRNZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXQgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfTk9fUEVSU0lTVEVOQ0VfVU5JVCwKLQkJCQkJCXRoaXMsIAotCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNdWx0aXBsZVBlcnNpc3RlbmNlVW5pdE1lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5zaXplKCkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfTVVMVElQTEVfUEVSU0lTVEVOQ0VfVU5JVFMsCi0JCQkJCQl0aGlzLCAKLQkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZ2V0SnBhRmlsZSh0aGlzLnhtbFBlcnNpc3RlbmNlLmdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VNb2RlbCgpKS5yZW1vdmVSb290U3RydWN0dXJlTm9kZSh0aGlzKTsKLQkJZm9yIChQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHBlcnNpc3RlbmNlVW5pdHMoKSkpIHsKLQkJCXBlcnNpc3RlbmNlVW5pdC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VVbml0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VVbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNGIzOGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VVbml0IGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVVuaXQKLXsKLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBzcGVjaWZpZWRUcmFuc2FjdGlvblR5cGU7Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBkZWZhdWx0VHJhbnNhY3Rpb25UeXBlOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBwcm92aWRlcjsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGp0YURhdGFTb3VyY2U7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBub25KdGFEYXRhU291cmNlOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE1hcHBpbmdGaWxlUmVmPiBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnM7Ci0JCi0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIGltcGxpZWRNYXBwaW5nRmlsZVJlZjsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PENsYXNzUmVmPiBpbXBsaWVkQ2xhc3NSZWZzOwotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXM7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQkKLQkvKiBnbG9iYWwgZ2VuZXJhdG9yIGRlZmluaXRpb25zLCBkZWZpbmVkIGVsc2V3aGVyZSBpbiBtb2RlbCAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEdlbmVyYXRvcj4gZ2VuZXJhdG9yczsKLQkKLQkvKiBnbG9iYWwgcXVlcnkgZGVmaW5pdGlvbnMsIGRlZmluZWQgZWxzZXdoZXJlIGluIG1vZGVsICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8UXVlcnk+IHF1ZXJpZXM7Ci0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2c7Ci0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZGVmYXVsdEFjY2VzczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0Q2FzY2FkZVBlcnNpc3Q7Ci0JCi0JcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzID0gbmV3IEFycmF5TGlzdDxNYXBwaW5nRmlsZVJlZj4oKTsKLQkJdGhpcy5zcGVjaWZpZWRDbGFzc1JlZnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzUmVmPigpOwotCQl0aGlzLmltcGxpZWRDbGFzc1JlZnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzUmVmPigpOwotCQl0aGlzLnByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5PigpOwotCQl0aGlzLmdlbmVyYXRvcnMgPSBuZXcgQXJyYXlMaXN0PEdlbmVyYXRvcj4oKTsKLQkJdGhpcy5xdWVyaWVzID0gbmV3IEFycmF5TGlzdDxRdWVyeT4oKTsKLQkJdGhpcy5pbml0aWFsaXplKHBlcnNpc3RlbmNlVW5pdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE5vblVwZGF0ZUFzcGVjdE5hbWVzVG8oU2V0PFN0cmluZz4gbm9uVXBkYXRlQXNwZWN0TmFtZXMpIHsKLQkJc3VwZXIuYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhub25VcGRhdGVBc3BlY3ROYW1lcyk7Ci0JCW5vblVwZGF0ZUFzcGVjdE5hbWVzLmFkZChHRU5FUkFUT1JTX0xJU1QpOwotCQlub25VcGRhdGVBc3BlY3ROYW1lcy5hZGQoUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOQ0VfVU5JVF9JRDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogcGFyZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2UgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBuYW1lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZShuZXdOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB0cmFuc2FjdGlvbiB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gKGlzVHJhbnNhY3Rpb25UeXBlRGVmYXVsdCgpKSA/Ci0JCQlnZXREZWZhdWx0VHJhbnNhY3Rpb25UeXBlKCkgOiBnZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBuZXdUcmFuc2FjdGlvblR5cGUpIHsKLQkJUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRoaXMuc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlOwotCQl0aGlzLnNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSA9IG5ld1RyYW5zYWN0aW9uVHlwZTsJCQotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRUcmFuc2FjdGlvblR5cGUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLnRvWG1sUmVzb3VyY2VNb2RlbChuZXdUcmFuc2FjdGlvblR5cGUpKTsJCQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZLCBvbGRUcmFuc2FjdGlvblR5cGUsIG5ld1RyYW5zYWN0aW9uVHlwZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVHJhbnNhY3Rpb25UeXBlRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlID09IG51bGw7Ci0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRyYW5zYWN0aW9uVHlwZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgbmV3VHJhbnNhY3Rpb25UeXBlKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBvbGRUcmFuc2FjdGlvblR5cGUgPSB0aGlzLmRlZmF1bHRUcmFuc2FjdGlvblR5cGU7Ci0JCXRoaXMuZGVmYXVsdFRyYW5zYWN0aW9uVHlwZSA9IG5ld1RyYW5zYWN0aW9uVHlwZTsJCQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgb2xkVHJhbnNhY3Rpb25UeXBlLCBuZXdUcmFuc2FjdGlvblR5cGUpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIGRlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERVNDUklQVElPTl9QUk9QRVJUWSwgb2xkRGVzY3JpcHRpb24sIG5ld0Rlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBwcm92aWRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnByb3ZpZGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm92aWRlcihTdHJpbmcgbmV3UHJvdmlkZXIpIHsKLQkJU3RyaW5nIG9sZFByb3ZpZGVyID0gdGhpcy5wcm92aWRlcjsKLQkJdGhpcy5wcm92aWRlciA9IG5ld1Byb3ZpZGVyOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRQcm92aWRlcihuZXdQcm92aWRlcik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPVklERVJfUFJPUEVSVFksIG9sZFByb3ZpZGVyLCBuZXdQcm92aWRlcik7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKioganRhIGRhdGEgc291cmNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEp0YURhdGFTb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmp0YURhdGFTb3VyY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEp0YURhdGFTb3VyY2UoU3RyaW5nIG5ld0p0YURhdGFTb3VyY2UpIHsKLQkJU3RyaW5nIG9sZEp0YURhdGFTb3VyY2UgPSB0aGlzLmp0YURhdGFTb3VyY2U7Ci0JCXRoaXMuanRhRGF0YVNvdXJjZSA9IG5ld0p0YURhdGFTb3VyY2U7Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldEp0YURhdGFTb3VyY2UobmV3SnRhRGF0YVNvdXJjZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZLCBvbGRKdGFEYXRhU291cmNlLCBuZXdKdGFEYXRhU291cmNlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBub24tanRhIGRhdGEgc291cmNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMubm9uSnRhRGF0YVNvdXJjZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Tm9uSnRhRGF0YVNvdXJjZShTdHJpbmcgbmV3Tm9uSnRhRGF0YVNvdXJjZSkgewotCQlTdHJpbmcgb2xkTm9uSnRhRGF0YVNvdXJjZSA9IHRoaXMubm9uSnRhRGF0YVNvdXJjZTsKLQkJdGhpcy5ub25KdGFEYXRhU291cmNlID0gbmV3Tm9uSnRhRGF0YVNvdXJjZTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuc2V0Tm9uSnRhRGF0YVNvdXJjZShuZXdOb25KdGFEYXRhU291cmNlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZLCBvbGROb25KdGFEYXRhU291cmNlLCBuZXdOb25KdGFEYXRhU291cmNlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBtYXBwaW5nIGZpbGUgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IG1hcHBpbmdGaWxlUmVmcygpIHsKLQkJaWYgKGltcGxpZWRNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPigKLQkJCQlzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSwgaW1wbGllZE1hcHBpbmdGaWxlUmVmKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IG1hcHBpbmdGaWxlUmVmc1NpemUoKSB7Ci0JCWlmIChpbXBsaWVkTWFwcGluZ0ZpbGVSZWYgPT0gbnVsbCkgewotCQkJcmV0dXJuIHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKLQkJfQotCQlyZXR1cm4gMSArIHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqKioqKioqIHNwZWNpZmllZCBtYXBwaW5nIGZpbGUgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPihzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKSB7Ci0JCXJldHVybiBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWYgYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoKSB7Ci0JCXJldHVybiBhZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZihzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIE1hcHBpbmdGaWxlUmVmIGFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKGludCBpbmRleCkgewotCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBidWlsZE1hcHBpbmdGaWxlUmVmKHhtbE1hcHBpbmdGaWxlUmVmKTsKLQkJc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzLmFkZChpbmRleCwgbWFwcGluZ0ZpbGVSZWYpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoaW5kZXgsIHhtbE1hcHBpbmdGaWxlUmVmKTsKLQkJZmlyZUl0ZW1BZGRlZChTUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRl9MSVNULCBpbmRleCwgbWFwcGluZ0ZpbGVSZWYpOwotCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWY7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7Ci0JCXJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcy5pbmRleE9mKG1hcHBpbmdGaWxlUmVmKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKGludCBpbmRleCkgewotCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZlJlbW92ZWQgPSBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMucmVtb3ZlKGluZGV4KTsKLQkJbWFwcGluZ0ZpbGVSZWZSZW1vdmVkLmRpc3Bvc2UoKTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFNQRUNJRklFRF9NQVBQSU5HX0ZJTEVfUkVGX0xJU1QsIGluZGV4LCBtYXBwaW5nRmlsZVJlZlJlbW92ZWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZl8oTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZfKHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcy5zaXplKCksIG1hcHBpbmdGaWxlUmVmKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZfKGludCBpbmRleCwgTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgbWFwcGluZ0ZpbGVSZWYsIHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcywgU1BFQ0lGSUVEX01BUFBJTkdfRklMRV9SRUZfTElTVCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmXyhNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZikgewotCQlyZW1vdmVTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZl8oc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzLmluZGV4T2YobWFwcGluZ0ZpbGVSZWYpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZfKGludCBpbmRleCkgewotCQlzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMuZ2V0KGluZGV4KS5kaXNwb3NlKCk7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzLCBTUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRl9MSVNUKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBpbXBsaWVkIG1hcHBpbmcgZmlsZSByZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBNYXBwaW5nRmlsZVJlZiBnZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSB7Ci0JCXJldHVybiBpbXBsaWVkTWFwcGluZ0ZpbGVSZWY7Ci0JfQotCQotCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBzZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSB7Ci0JCWlmIChpbXBsaWVkTWFwcGluZ0ZpbGVSZWYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGltcGxpZWQgbWFwcGluZyBmaWxlIHJlZiBpcyBhbHJlYWR5IHNldC4iKTsKLQkJfQotCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IGJ1aWxkTWFwcGluZ0ZpbGVSZWYobnVsbCk7Ci0JCWltcGxpZWRNYXBwaW5nRmlsZVJlZiA9IG1hcHBpbmdGaWxlUmVmOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElNUExJRURfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSwgbnVsbCwgbWFwcGluZ0ZpbGVSZWYpOwotCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWY7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVuc2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkgewotCQlpZiAoaW1wbGllZE1hcHBpbmdGaWxlUmVmID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBpbXBsaWVkIG1hcHBpbmcgZmlsZSByZWYgaXMgYWxyZWFkeSB1bnNldC4iKTsKLQkJfQotCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IGltcGxpZWRNYXBwaW5nRmlsZVJlZjsKLQkJaW1wbGllZE1hcHBpbmdGaWxlUmVmLmRpc3Bvc2UoKTsKLQkJaW1wbGllZE1hcHBpbmdGaWxlUmVmID0gbnVsbDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJTVBMSUVEX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksIG1hcHBpbmdGaWxlUmVmLCBudWxsKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBjbGFzcyByZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcygpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4oCi0JCQlzcGVjaWZpZWRDbGFzc1JlZnMoKSwgaW1wbGllZENsYXNzUmVmcygpKTsKLQl9Ci0JCi0JcHVibGljIGludCBjbGFzc1JlZnNTaXplKCkgewotCQlyZXR1cm4gc3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpICsgaW1wbGllZENsYXNzUmVmc1NpemUoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBzcGVjaWZpZWQgY2xhc3MgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4odGhpcy5zcGVjaWZpZWRDbGFzc1JlZnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHNwZWNpZmllZENsYXNzUmVmc1NpemUoKSB7Ci0JCXJldHVybiBzcGVjaWZpZWRDbGFzc1JlZnMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NSZWYgYWRkU3BlY2lmaWVkQ2xhc3NSZWYoKSB7Ci0JCXJldHVybiBhZGRTcGVjaWZpZWRDbGFzc1JlZih0aGlzLnNwZWNpZmllZENsYXNzUmVmc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyBDbGFzc1JlZiBhZGRTcGVjaWZpZWRDbGFzc1JlZihpbnQgaW5kZXgpIHsKLQkJWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBidWlsZENsYXNzUmVmKHhtbENsYXNzUmVmKTsKLQkJdGhpcy5zcGVjaWZpZWRDbGFzc1JlZnMuYWRkKGluZGV4LCBjbGFzc1JlZik7Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoaW5kZXgsIHhtbENsYXNzUmVmKTsKLQkJZmlyZUl0ZW1BZGRlZChTUEVDSUZJRURfQ0xBU1NfUkVGX0xJU1QsIGluZGV4LCBjbGFzc1JlZik7Ci0JCXJldHVybiBjbGFzc1JlZjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRDbGFzc1JlZihDbGFzc1JlZiBjbGFzc1JlZikgewotCQlyZW1vdmVTcGVjaWZpZWRDbGFzc1JlZih0aGlzLnNwZWNpZmllZENsYXNzUmVmcy5pbmRleE9mKGNsYXNzUmVmKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZENsYXNzUmVmKGludCBpbmRleCkgewotCQlDbGFzc1JlZiBjbGFzc1JlZlJlbW92ZWQgPSB0aGlzLnNwZWNpZmllZENsYXNzUmVmcy5yZW1vdmUoaW5kZXgpOwotCQljbGFzc1JlZlJlbW92ZWQuZGlzcG9zZSgpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFNQRUNJRklFRF9DTEFTU19SRUZfTElTVCwgaW5kZXgsIGNsYXNzUmVmUmVtb3ZlZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZENsYXNzUmVmXyhDbGFzc1JlZiBjbGFzc1JlZikgewotCQlhZGRTcGVjaWZpZWRDbGFzc1JlZl8odGhpcy5zcGVjaWZpZWRDbGFzc1JlZnMuc2l6ZSgpLCBjbGFzc1JlZik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZENsYXNzUmVmXyhpbnQgaW5kZXgsIENsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNsYXNzUmVmLCB0aGlzLnNwZWNpZmllZENsYXNzUmVmcywgU1BFQ0lGSUVEX0NMQVNTX1JFRl9MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWZfKENsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCWNsYXNzUmVmLmRpc3Bvc2UoKTsKLQkJcmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWZfKHRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZzLmluZGV4T2YoY2xhc3NSZWYpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWZfKGludCBpbmRleCkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZzLCBTUEVDSUZJRURfQ0xBU1NfUkVGX0xJU1QpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGltcGxpZWQgY2xhc3MgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxDbGFzc1JlZj4gaW1wbGllZENsYXNzUmVmcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4oaW1wbGllZENsYXNzUmVmcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW1wbGllZENsYXNzUmVmc1NpemUoKSB7Ci0JCXJldHVybiBpbXBsaWVkQ2xhc3NSZWZzLnNpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENsYXNzUmVmIGFkZEltcGxpZWRDbGFzc1JlZihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBhZGRJbXBsaWVkQ2xhc3NSZWYoaW1wbGllZENsYXNzUmVmcy5zaXplKCksIGNsYXNzTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBDbGFzc1JlZiBhZGRJbXBsaWVkQ2xhc3NSZWYoaW50IGluZGV4LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gYnVpbGRDbGFzc1JlZihjbGFzc05hbWUpOwotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBjbGFzc1JlZiwgaW1wbGllZENsYXNzUmVmcywgSU1QTElFRF9DTEFTU19SRUZfTElTVCk7Ci0JCXJldHVybiBjbGFzc1JlZjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSW1wbGllZENsYXNzUmVmKENsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCWNsYXNzUmVmLmRpc3Bvc2UoKTsKLQkJcmVtb3ZlSW1wbGllZENsYXNzUmVmKGltcGxpZWRDbGFzc1JlZnMuaW5kZXhPZihjbGFzc1JlZikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJbXBsaWVkQ2xhc3NSZWYoaW50IGluZGV4KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgaW1wbGllZENsYXNzUmVmcywgSU1QTElFRF9DTEFTU19SRUZfTElTVCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogZXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSB7Ci0JCXJldHVybiBnZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkgPT0gbnVsbCA/IGdldERlZmF1bHRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkgOiBnZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoQm9vbGVhbiBuZXdFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKSB7Ci0JCUJvb2xlYW4gb2xkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyA9IHRoaXMuc3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlczsKLQkJdGhpcy5zcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzID0gbmV3RXhjbHVkZVVubGlzdGVkQ2xhc3NlczsKLQkJCi0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXModGhpcy5zcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKTsKLQkJCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFRF9QUk9QRVJUWSwgb2xkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcywgbmV3RXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSB7Ci0JCS8vIFRPRE8gLSBjYWxjdWxhdGUgZGVmYXVsdAotCQkvLyAgVGhpcyBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIHByb2plY3QKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIHByb3BlcnRpZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxQcm9wZXJ0eT4gcHJvcGVydGllcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxQcm9wZXJ0eT4odGhpcy5wcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByb3BlcnRpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBnZXRQcm9wZXJ0eToga2V5IGlzIG51bGwuIik7Ci0JCX0KLQkJZm9yKFByb3BlcnR5IHByb3BlcnR5IDogdGhpcy5wcm9wZXJ0aWVzKSB7Ci0JCQlpZihrZXkuZXF1YWxzKHByb3BlcnR5LmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gcHJvcGVydHk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxQcm9wZXJ0eT4gcHJvcGVydGllc1dpdGhQcmVmaXgoU3RyaW5nIGtleVByZWZpeCkgewotCQlpZiAoa2V5UHJlZml4ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHByb3BlcnRpZXNXaXRoUHJlZml4OiBrZXlQcmVmaXggaXMgbnVsbC4iKTsKLQkJfQotCQlMaXN0PFByb3BlcnR5PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eT4oKTsKLQkJCi0JCWZvcihQcm9wZXJ0eSBwcm9wZXJ0eSA6IHRoaXMucHJvcGVydGllcykgewotCQkJaWYocHJvcGVydHkuZ2V0TmFtZSgpICE9IG51bGwgJiYgcHJvcGVydHkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoa2V5UHJlZml4KSkgewotCQkJCXByb3BlcnRpZXMuYWRkKCBwcm9wZXJ0eSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCQotCXB1YmxpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGtleSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBnZXRQcm9wZXJ0eToga2V5IG9yIHZhbHVlIGlzIG51bGwuIik7Ci0JCX0KLQkJZm9yKFByb3BlcnR5IHByb3BlcnR5IDogdGhpcy5wcm9wZXJ0aWVzKSB7Ci0JCQlpZihrZXkuZXF1YWxzKHByb3BlcnR5LmdldE5hbWUoKSkpIHsKLQkJCQlpZih2YWx1ZS5lcXVhbHMocHJvcGVydHkuZ2V0VmFsdWUoKSkpIHsKLQkJCQkJCXJldHVybiBwcm9wZXJ0eTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eSBnZXRQcm9wZXJ0eShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxQcm9wZXJ0eSBnZXRYbWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkgewotCQkJWG1sUHJvcGVydGllcyB4bWxQcm9wZXJ0aWVzID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0aWVzKCk7Ci0JCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0aWVzKHhtbFByb3BlcnRpZXMpOwotCQl9Ci0JCWZvcihYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSA6IHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkpIHsKLQkJCWlmKG5hbWUuZXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSkgJiYgdmFsdWUuZXF1YWxzKHhtbFByb3BlcnR5LmdldFZhbHVlKCkpKSB7Ci0JCQkJcmV0dXJuIHhtbFByb3BlcnR5OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgb3IgQ2hhbmdlcyBQcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZXMpIHsKLQkJaWYoICEgYWxsb3dEdXBsaWNhdGVzICYmIHRoaXMuY29udGFpbnNQcm9wZXJ0eShrZXkpKSB7Ci0JCQl0aGlzLnB1dFhtbFByb3BlcnR5KGtleSwgdmFsdWUsIHRoaXMuZ2V0UHJvcGVydHkoa2V5KS5nZXRWYWx1ZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiggdmFsdWUgIT0gbnVsbCkgewotCQkJWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCk7Ci0JCQl4bWxQcm9wZXJ0eS5zZXROYW1lKGtleSk7Ci0JCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQkKLQkJCXRoaXMuYWRkWG1sUHJvcGVydHkoeG1sUHJvcGVydHksIHByb3BlcnRpZXNTaXplKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBvbGRWYWx1ZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCQotCQl0aGlzLnB1dFhtbFByb3BlcnR5KGtleSwgbmV3VmFsdWUsIG9sZFZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHV0WG1sUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgb2xkVmFsdWUpIHsKLQkJaWYoIHZhbHVlID09IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlUHJvcGVydHkoa2V5KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVhtbFByb3BlcnR5IHhtbFByb3BlcnR5ID0gdGhpcy5nZXRYbWxQcm9wZXJ0eShrZXksIG9sZFZhbHVlKTsKLQkJaWYoeG1sUHJvcGVydHkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIk1pc3NpbmcgUHJvcGVydHkgbmFtZTogIiArIGtleSArICIsIHZhbHVlOiAiICsgb2xkVmFsdWUpOwotCQl9Ci0JCXhtbFByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKLQl9CQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUHJvcGVydHkoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gKHRoaXMuZ2V0UHJvcGVydHkoa2V5KSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHkgYWRkUHJvcGVydHkoKSB7Ci0JCXJldHVybiBhZGRQcm9wZXJ0eShwcm9wZXJ0aWVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIFByb3BlcnR5IGFkZFByb3BlcnR5KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5hZGRYbWxQcm9wZXJ0eShQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCksIGluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5IGFkZFhtbFByb3BlcnR5KFhtbFByb3BlcnR5IHhtbFByb3BlcnR5LCBpbnQgaW5kZXgpIHsKLQotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IGJ1aWxkUHJvcGVydHkoeG1sUHJvcGVydHkpOwotCQkKLQkJaWYgKHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKSA9PSBudWxsKSB7Ci0JCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKLQkJCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnRpZXMoeG1sUHJvcGVydGllcyk7Ci0JCX0KLQkJCi0JCXRoaXMucHJvcGVydGllcy5hZGQoaW5kZXgsIHByb3BlcnR5KTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5hZGQoaW5kZXgsIHhtbFByb3BlcnR5KTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKFBST1BFUlRJRVNfTElTVCwgaW5kZXgsIHByb3BlcnR5KTsKLQkJcmV0dXJuIHByb3BlcnR5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCXRoaXMucmVtb3ZlUHJvcGVydHkodGhpcy5nZXRQcm9wZXJ0eShrZXkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMucmVtb3ZlUHJvcGVydHkodGhpcy5nZXRQcm9wZXJ0eShrZXksIHZhbHVlKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZVByb3BlcnR5KHRoaXMucHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5KSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJvcGVydHkoaW50IGluZGV4KSB7Ci0JCVByb3BlcnR5IHByb3BlcnR5UmVtb3ZlZCA9IHRoaXMucHJvcGVydGllcy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnJlbW92ZShpbmRleCk7Ci0JCQotCQlpZiAodGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpIHsKLQkJCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnRpZXMobnVsbCk7Ci0JCX0KLQkJCi0JCWZpcmVJdGVtUmVtb3ZlZChQUk9QRVJUSUVTX0xJU1QsIGluZGV4LCBwcm9wZXJ0eVJlbW92ZWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eV8oUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJYWRkUHJvcGVydHlfKHRoaXMucHJvcGVydGllcy5zaXplKCksIHByb3BlcnR5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlfKGludCBpbmRleCwgUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgcHJvcGVydHksIHRoaXMucHJvcGVydGllcywgUFJPUEVSVElFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJvcGVydHlfKFByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCXJlbW92ZVByb3BlcnR5Xyh0aGlzLnByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQcm9wZXJ0eV8oaW50IGluZGV4KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5wcm9wZXJ0aWVzLCBQUk9QRVJUSUVTX0xJU1QpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLy9UT0RPIHZhbGlkYXRpb24gZm9yIG11bHRpcGxlIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLgotCQotCS8vVGFrZSB0aGUgZmlyc3QgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZm91bmQgaW4gYW4gb3JtLnhtbCBmaWxlIGFuZCB1c2UKLQkvL3RoaXMgZm9yIHRoZSBkZWZhdWx0cyBvZiB0aGUgUGVyc2lzdGVuY2VVbml0LgotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJZm9yIChNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShtYXBwaW5nRmlsZVJlZnMoKSkpIHsKLQkJCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gbWFwcGluZ0ZpbGVSZWYuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJCWlmIChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNjaGVtYShTdHJpbmcgbmV3RGVmYXVsdFNjaGVtYSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFNjaGVtYSA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gbmV3RGVmYXVsdFNjaGVtYTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkRGVmYXVsdFNjaGVtYSwgbmV3RGVmYXVsdFNjaGVtYSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgbmV3RGVmYXVsdENhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRDYXRhbG9nID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IG5ld0RlZmF1bHRDYXRhbG9nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSwgb2xkRGVmYXVsdENhdGFsb2csIG5ld0RlZmF1bHRDYXRhbG9nKTsKLQl9Ci0JCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEFjY2VzczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEFjY2VzcyhBY2Nlc3NUeXBlIG5ld0RlZmF1bHRBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGREZWZhdWx0QWNjZXNzID0gdGhpcy5kZWZhdWx0QWNjZXNzOwotCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSBuZXdEZWZhdWx0QWNjZXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1BST1BFUlRZLCBvbGREZWZhdWx0QWNjZXNzLCBuZXdEZWZhdWx0QWNjZXNzKTsKLQl9CQotCQotCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRDYXNjYWRlUGVyc2lzdCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENhc2NhZGVQZXJzaXN0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbiBuZXdEZWZhdWx0Q2FzY2FkZVBlcnNpc3QpIHsKLQkJYm9vbGVhbiBvbGREZWZhdWx0Q2FzY2FkZVBlcnNpc3QgPSB0aGlzLmRlZmF1bHRDYXNjYWRlUGVyc2lzdDsKLQkJdGhpcy5kZWZhdWx0Q2FzY2FkZVBlcnNpc3QgPSBuZXdEZWZhdWx0Q2FzY2FkZVBlcnNpc3Q7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DQVNDQURFX1BFUlNJU1RfUFJPUEVSVFksIG9sZERlZmF1bHRDYXNjYWRlUGVyc2lzdCwgbmV3RGVmYXVsdENhc2NhZGVQZXJzaXN0KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBnbG9iYWwgZ2VuZXJhdG9yIGFuZCBxdWVyeSBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGFkZEdlbmVyYXRvcihHZW5lcmF0b3IgZ2VuZXJhdG9yKSB7Ci0JCXRoaXMuZ2VuZXJhdG9ycy5hZGQoZ2VuZXJhdG9yKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxHZW5lcmF0b3I+IGFsbEdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8R2VuZXJhdG9yPih0aGlzLmdlbmVyYXRvcnMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRRdWVyeShRdWVyeSBxdWVyeSkgewotCQl0aGlzLnF1ZXJpZXMuYWRkKHF1ZXJ5KTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxRdWVyeT4gYWxsUXVlcmllcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxRdWVyeT4odGhpcy5xdWVyaWVzKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0OwotCQl0aGlzLm5hbWUgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpOwotCQkKLQkJLy9pbml0aWFsaXplIHNwZWNpZmllZCBjbGFzc1JlZnMgYmVmb3JlIG1hcHBpbmdGaWxlUmVmcyBiZWNhdXNlIG9mIAotCQkvL0pwYUZpbGUgcm9vdFN0cnVjdHVyZU5vZGUsIHdlIHdhbnQgdGhlIG1hcHBpbmcgZmlsZSB0byAid2luIiwKLQkJLy9hcyBpdCB3b3VsZCBpbiBhIEpwYSBydW50aW1lIGltcGxlbWVudGF0aW9uCi0JCWluaXRpYWxpemVTcGVjaWZpZWRDbGFzc1JlZnMoeG1sUGVyc2lzdGVuY2VVbml0KTsKLQkJaW5pdGlhbGl6ZU1hcHBpbmdGaWxlUmVmcyh4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCQkvL2luaXRpYWxpemUgaW1wbGllZCBjbGFzc1JlZnMgbGFzdCBzaW5jZSB0aGV5IGRlcGVuZCBvbiBib3RoCi0JCS8vc3BlY2lmaWVkIGNsYXNzUmVmcyBhbmQgbWFwcGluZ0ZpbGVSZWZzCi0JCWluaXRpYWxpemVJbXBsaWVkQ2xhc3NSZWZzKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCWluaXRpYWxpemVQcm9wZXJ0aWVzKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCWluaXRpYWxpemVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQl0aGlzLnNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpOwotCQl0aGlzLnNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSA9IHNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSh4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCQl0aGlzLmRlZmF1bHRUcmFuc2FjdGlvblR5cGUgPSBkZWZhdWx0VHJhbnNhY2F0aW9uVHlwZSgpOwotCQl0aGlzLmRlc2NyaXB0aW9uID0geG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCk7Ci0JCXRoaXMucHJvdmlkZXIgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKTsKLQkJdGhpcy5qdGFEYXRhU291cmNlID0geG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKTsKLQkJdGhpcy5ub25KdGFEYXRhU291cmNlID0geG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKTsKLQkJdGhpcy5zcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzID0geG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcHBpbmdGaWxlUmVmcyhYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCWZvciAoWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgOiB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkpIHsKLQkJCXNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcy5hZGQoYnVpbGRNYXBwaW5nRmlsZVJlZih4bWxNYXBwaW5nRmlsZVJlZikpOwotCQl9Ci0JCWlmICghIGltcGxpZWRNYXBwaW5nRmlsZUlzU3BlY2lmaWVkKCkgJiYgaW1wbGllZE1hcHBpbmdGaWxlRXhpc3RzKCkpIHsKLQkJCWltcGxpZWRNYXBwaW5nRmlsZVJlZiA9IGJ1aWxkTWFwcGluZ0ZpbGVSZWYobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZENsYXNzUmVmcyhYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCWZvciAoWG1sSmF2YUNsYXNzUmVmIHhtbEphdmFDbGFzc1JlZiA6IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkpIHsKLQkJCXNwZWNpZmllZENsYXNzUmVmcy5hZGQoYnVpbGRDbGFzc1JlZih4bWxKYXZhQ2xhc3NSZWYpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSW1wbGllZENsYXNzUmVmcyhYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCWlmIChnZXRKcGFQcm9qZWN0KCkuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcygpICYmICEgaXNFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpIHsKLQkJCWZvciAoU3RyaW5nIHR5cGVOYW1lIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuZ2V0SnBhUHJvamVjdCgpLmFubm90YXRlZENsYXNzTmFtZXMoKSkpIHsKLQkJCQlpZiAoICEgY2xhc3NJc1NwZWNpZmllZCh0eXBlTmFtZSkpIHsKLQkJCQkJaW1wbGllZENsYXNzUmVmcy5hZGQoYnVpbGRDbGFzc1JlZih0eXBlTmFtZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcyhYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWlmICh4bWxQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKFhtbFByb3BlcnR5IHhtbFByb3BlcnR5IDogeG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkpIHsKLQkJCXRoaXMucHJvcGVydGllcy5hZGQoYnVpbGRQcm9wZXJ0eSh4bWxQcm9wZXJ0eSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlpZiAocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgIT0gbnVsbCkgewotCQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gdGhpcy5zY2hlbWEocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOwotCQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IHRoaXMuY2F0YWxvZyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyk7Ci0JCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSB0aGlzLmFjY2VzcyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyk7Ci0JCQl0aGlzLmRlZmF1bHRDYXNjYWRlUGVyc2lzdCA9IHRoaXMuY2FzY2FkZVBlcnNpc3QocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gbnVsbDsKLQkJCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBudWxsOwotCQkJdGhpcy5kZWZhdWx0QWNjZXNzID0gbnVsbDsKLQkJCXRoaXMuZGVmYXVsdENhc2NhZGVQZXJzaXN0ID0gZmFsc2U7CQkKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0OwotCQl0aGlzLmdlbmVyYXRvcnMuY2xlYXIoKTsKLQkJdGhpcy5xdWVyaWVzLmNsZWFyKCk7Ci0JCXVwZGF0ZU5hbWUocGVyc2lzdGVuY2VVbml0KTsKLQkJdXBkYXRlU3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCXVwZGF0ZURlZmF1bHRUcmFuc2FjdGlvblR5cGUoKTsKLQkJdXBkYXRlRGVzY3JpcHRpb24ocGVyc2lzdGVuY2VVbml0KTsKLQkJdXBkYXRlUHJvdmlkZXIocGVyc2lzdGVuY2VVbml0KTsKLQkJdXBkYXRlSnRhRGF0YVNvdXJjZShwZXJzaXN0ZW5jZVVuaXQpOwotCQl1cGRhdGVOb25KdGFEYXRhU291cmNlKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCS8vdXBkYXRlIHNwZWNpZmllZCBjbGFzc1JlZnMgYmVmb3JlIG1hcHBpbmdGaWxlUmVmcyBiZWNhdXNlIG9mIAotCQkvL0pwYUZpbGUgcm9vdFN0cnVjdHVyZU5vZGUsIHdlIHdhbnQgdGhlIG1hcHBpbmcgZmlsZSB0byAid2luIiwKLQkJLy9hcyBpdCB3b3VsZCBpbiBhIEpwYSBydW50aW1lIGltcGxlbWVudGF0aW9uCi0JCXVwZGF0ZVNwZWNpZmllZENsYXNzUmVmcyhwZXJzaXN0ZW5jZVVuaXQpOwotCQl1cGRhdGVNYXBwaW5nRmlsZVJlZnMocGVyc2lzdGVuY2VVbml0KTsKLQkJLy91cGRhdGUgaW1wbGllZCBjbGFzc1JlZnMgbGFzdCBzaW5jZSB0aGV5IGRlcGVuZCBvbiBib3RoCi0JCS8vc3BlY2lmaWVkIGNsYXNzUmVmcyBhbmQgbWFwcGluZ0ZpbGVSZWZzCi0JCXVwZGF0ZUltcGxpZWRDbGFzc1JlZnMocGVyc2lzdGVuY2VVbml0KTsKLQkJdXBkYXRlRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhwZXJzaXN0ZW5jZVVuaXQpOwotCQl1cGRhdGVQcm9wZXJ0aWVzKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCXVwZGF0ZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWdlbmVyYXRvclJlcG9zaXRvcnlVcGRhdGVkKCk7Ci0JCXF1ZXJ5UmVwb3NpdG9yeVVwZGF0ZWQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZShYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXNldE5hbWUocGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZShYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZShzcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUocGVyc2lzdGVuY2VVbml0KSk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKFhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5mcm9tWG1sUmVzb3VyY2VNb2RlbChwZXJzaXN0ZW5jZVVuaXQuZ2V0VHJhbnNhY3Rpb25UeXBlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlzZXREZWZhdWx0VHJhbnNhY3Rpb25UeXBlKGRlZmF1bHRUcmFuc2FjYXRpb25UeXBlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGRlZmF1bHRUcmFuc2FjYXRpb25UeXBlKCkgewotCQkvLyBUT0RPIC0gY2FsY3VsYXRlIGRlZmF1bHQKLQkJLy8gIEZyb20gdGhlIEpQQSBzcGVjOiAiSW4gYSBKYXZhIEVFIGVudmlyb25tZW50LCBpZiB0aGlzIGVsZW1lbnQgaXMgbm90IAotCQkvLyAgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyBKVEEuIEluIGEgSmF2YSBTRSBlbnZpcm9ubWVudCwgaWYgdGhpcyBlbGVtZW50IAotCQkvLyBpcyBub3Qgc3BlY2lmaWVkLCBhIGRlZmF1bHQgb2YgUkVTT1VSQ0VfTE9DQUwgbWF5IGJlIGFzc3VtZWQuIgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVzY3JpcHRpb24oWG1sUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgewotCQlzZXREZXNjcmlwdGlvbihwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb3ZpZGVyKFhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJc2V0UHJvdmlkZXIocGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKdGFEYXRhU291cmNlKFhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJc2V0SnRhRGF0YVNvdXJjZShwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTm9uSnRhRGF0YVNvdXJjZShYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXNldE5vbkp0YURhdGFTb3VyY2UocGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hcHBpbmdGaWxlUmVmcyhYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCUl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPiBzdHJlYW0gPSBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsKLQkJSXRlcmF0b3I8WG1sTWFwcGluZ0ZpbGVSZWY+IHN0cmVhbTIgPSBuZXcgQ2xvbmVJdGVyYXRvcjxYbWxNYXBwaW5nRmlsZVJlZj4ocGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoc3RyZWFtMi5oYXNOZXh0KCkpIHsKLQkJCQltYXBwaW5nRmlsZVJlZi51cGRhdGUoc3RyZWFtMi5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZfKG1hcHBpbmdGaWxlUmVmKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHN0cmVhbTIuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZl8oYnVpbGRNYXBwaW5nRmlsZVJlZihzdHJlYW0yLm5leHQoKSkpOwotCQl9Ci0JCQotCQlpZiAoaW1wbGllZE1hcHBpbmdGaWxlSXNTcGVjaWZpZWQoKSkgewotCQkJaWYgKGltcGxpZWRNYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7Ci0JCQkJdW5zZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChpbXBsaWVkTWFwcGluZ0ZpbGVFeGlzdHMoKSkgewotCQkJCWlmIChpbXBsaWVkTWFwcGluZ0ZpbGVSZWYgPT0gbnVsbCkgewotCQkJCQlzZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJCQl9Ci0JCQkJZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkudXBkYXRlKG51bGwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGltcGxpZWRNYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7Ci0JCQkJCXVuc2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGltcGxpZWRNYXBwaW5nRmlsZUlzU3BlY2lmaWVkKCkgewotCQlTdHJpbmcgaW1wbGllZE1hcHBpbmdGaWxlID0gSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIOwotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIGVhY2ggOiBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMpIHsKLQkJCWlmIChpbXBsaWVkTWFwcGluZ0ZpbGUuZXF1YWxzKGVhY2guZ2V0RmlsZU5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGltcGxpZWRNYXBwaW5nRmlsZUV4aXN0cygpIHsKLQkJT3JtQXJ0aWZhY3RFZGl0IG9hZSA9IE9ybUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQlPcm1SZXNvdXJjZSBvciA9IG9hZS5nZXRSZXNvdXJjZShKcHRDb3JlUGx1Z2luLmdldERlZmF1bHRPcm1YbWxEZXBsb3ltZW50VVJJKGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKTsKLQkJYm9vbGVhbiBleGlzdHMgPSAgb3IgIT0gbnVsbCAmJiBvci5leGlzdHMoKTsKLQkJb2FlLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIGV4aXN0czsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIGJ1aWxkTWFwcGluZ0ZpbGVSZWYoWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZE1hcHBpbmdGaWxlUmVmKHRoaXMsIHhtbE1hcHBpbmdGaWxlUmVmKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkQ2xhc3NSZWZzKFhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJSXRlcmF0b3I8Q2xhc3NSZWY+IHN0cmVhbSA9IHNwZWNpZmllZENsYXNzUmVmcygpOwotCQlJdGVyYXRvcjxYbWxKYXZhQ2xhc3NSZWY+IHN0cmVhbTIgPSBuZXcgQ2xvbmVJdGVyYXRvcjxYbWxKYXZhQ2xhc3NSZWY+KHBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCUNsYXNzUmVmIGNsYXNzUmVmID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJlYW0yLmhhc05leHQoKSkgewotCQkJCWNsYXNzUmVmLnVwZGF0ZShzdHJlYW0yLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVTcGVjaWZpZWRDbGFzc1JlZl8oY2xhc3NSZWYpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAoc3RyZWFtMi5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZENsYXNzUmVmXyhidWlsZENsYXNzUmVmKHN0cmVhbTIubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSW1wbGllZENsYXNzUmVmcyhYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCUl0ZXJhdG9yPENsYXNzUmVmPiBpbXBsaWVkUmVmcyA9IGltcGxpZWRDbGFzc1JlZnMoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBhbm5vdGF0ZWRDbGFzc05hbWVzID0gZ2V0SnBhUHJvamVjdCgpLmFubm90YXRlZENsYXNzTmFtZXMoKTsKLQkJCi0JCQotCQlpZiAoICEgaXNFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpIHsKLQkJCXdoaWxlIChpbXBsaWVkUmVmcy5oYXNOZXh0KCkpIHsKLQkJCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGltcGxpZWRSZWZzLm5leHQoKTsKLQkJCQlib29sZWFuIHVwZGF0ZWQgPSBmYWxzZTsKLQkJCQl3aGlsZSAoISB1cGRhdGVkICYmIGFubm90YXRlZENsYXNzTmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBhbm5vdGF0ZWRDbGFzc05hbWUgPSBhbm5vdGF0ZWRDbGFzc05hbWVzLm5leHQoKTsKLQkJCQkJaWYgKCAhIGNsYXNzSXNTcGVjaWZpZWQoYW5ub3RhdGVkQ2xhc3NOYW1lKSkgewotCQkJCQkJY2xhc3NSZWYudXBkYXRlKGFubm90YXRlZENsYXNzTmFtZSk7Ci0JCQkJCQl1cGRhdGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoISBhbm5vdGF0ZWRDbGFzc05hbWVzLmhhc05leHQoKSAmJiAhIHVwZGF0ZWQpIHsKLQkJCQkJcmVtb3ZlSW1wbGllZENsYXNzUmVmKGNsYXNzUmVmKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXdoaWxlIChhbm5vdGF0ZWRDbGFzc05hbWVzLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBhbm5vdGF0ZWRDbGFzc05hbWUgPSBhbm5vdGF0ZWRDbGFzc05hbWVzLm5leHQoKTsKLQkJCQlpZiAoICEgY2xhc3NJc1NwZWNpZmllZChhbm5vdGF0ZWRDbGFzc05hbWUpKSB7Ci0JCQkJCWFkZEltcGxpZWRDbGFzc1JlZihhbm5vdGF0ZWRDbGFzc05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWZvciAoQ2xhc3NSZWYgY2xhc3NSZWYgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoaW1wbGllZENsYXNzUmVmcygpKSkgewotCQkJCXJlbW92ZUltcGxpZWRDbGFzc1JlZihjbGFzc1JlZik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIENsYXNzUmVmIGJ1aWxkQ2xhc3NSZWYoWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRDbGFzc1JlZih0aGlzLCB4bWxDbGFzc1JlZik7Ci0JfQotCQotCXByb3RlY3RlZCBDbGFzc1JlZiBidWlsZENsYXNzUmVmKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZENsYXNzUmVmKHRoaXMsIGNsYXNzTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjbGFzcyBpcyBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgY2xhc3MKLQkgKiBvciBsaXN0ZWQgaW4gYSBtYXBwaW5nIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGFzc0lzU3BlY2lmaWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJZm9yIChDbGFzc1JlZiBzcGVjaWZpZWRDbGFzc1JlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzcGVjaWZpZWRDbGFzc1JlZnMoKSkpIHsKLQkJCWlmIChjbGFzc05hbWUuZXF1YWxzKHNwZWNpZmllZENsYXNzUmVmLmdldENsYXNzTmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWZvciAoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobWFwcGluZ0ZpbGVSZWZzKCkpKSB7Ci0JCQlpZiAobWFwcGluZ0ZpbGVSZWYuZ2V0UGVyc2lzdGVudFR5cGUoY2xhc3NOYW1lKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKFhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhwZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvcGVydGllcyhYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQotCQlJdGVyYXRvcjxQcm9wZXJ0eT4gc3RyZWFtID0gcHJvcGVydGllcygpOwotCQlJdGVyYXRvcjxYbWxQcm9wZXJ0eT4gc3RyZWFtMjsKLQkJCi0JCWlmICh4bWxQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCXN0cmVhbTIgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdHJlYW0yID0gbmV3IENsb25lSXRlcmF0b3I8WG1sUHJvcGVydHk+KHhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpKTsvL2F2b2lkIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkJfQotCQkKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCVByb3BlcnR5IHByb3BlcnR5ID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJlYW0yLmhhc05leHQoKSkgewotCQkJCXByb3BlcnR5LnVwZGF0ZShzdHJlYW0yLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVQcm9wZXJ0eV8ocHJvcGVydHkpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAoc3RyZWFtMi5oYXNOZXh0KCkpIHsKLQkJCWFkZFByb3BlcnR5XyhidWlsZFByb3BlcnR5KHN0cmVhbTIubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5IGJ1aWxkUHJvcGVydHkoWG1sUHJvcGVydHkgeG1sUHJvcGVydHkpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZFByb3BlcnR5KHRoaXMsIHhtbFByb3BlcnR5KTsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgewotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNjaGVtYSh0aGlzLnNjaGVtYShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykpOwotCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuY2F0YWxvZyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykpOwotCQl0aGlzLnNldERlZmF1bHRBY2Nlc3ModGhpcy5hY2Nlc3MocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpKTsKLQkJdGhpcy5zZXREZWZhdWx0Q2FzY2FkZVBlcnNpc3QodGhpcy5jYXNjYWRlUGVyc2lzdChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyAhPSBudWxsKSB7Ci0JCQlpZiAocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKTsKLQkJCX0KLQkJfQotCQlTY2hlbWEgcHJvamVjdERlZmF1bHRTY2hlbWEgPSBwcm9qZWN0RGVmYXVsdFNjaGVtYSgpOwotCQlyZXR1cm4gcHJvamVjdERlZmF1bHRTY2hlbWEgPT0gbnVsbCA/IG51bGwgOiBwcm9qZWN0RGVmYXVsdFNjaGVtYS5nZXROYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTY2hlbWEgcHJvamVjdERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY2F0YWxvZyhQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgewotCQlpZiAocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgIT0gbnVsbCkgewotCQkJaWYgKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdERlZmF1bHRDYXRhbG9nTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdERlZmF1bHRDYXRhbG9nTmFtZSgpIHsKLQkJQ2F0YWxvZyBjYXRhbG9nID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGF0YVNvdXJjZSgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyA9PSBudWxsKSA/IG51bGwgOiBjYXRhbG9nLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYWNjZXNzKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9PSBudWxsID8gbnVsbCA6IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlUGVyc2lzdChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPT0gbnVsbCA/IGZhbHNlIDogcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpOwotCX0KLQkKLQkvLyBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgcGVyc2lzdGVuY2UgdW5pdCBoYXMgYmVlbiB1cGRhdGVkIHRvIGVuc3VyZQotCS8vIHdlIGNhdGNoIGFsbCBhZGRlZCBnZW5lcmF0b3JzCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdG9yUmVwb3NpdG9yeVVwZGF0ZWQoKSB7Ci0JCWZpcmVMaXN0Q2hhbmdlZChHRU5FUkFUT1JTX0xJU1QpOwotCX0KLQkKLQkvLyBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgcGVyc2lzdGVuY2UgdW5pdCBoYXMgYmVlbiB1cGRhdGVkIHRvIGVuc3VyZQotCS8vIHdlIGNhdGNoIGFsbCBhZGRlZCBxdWVyaWVzCi0JcHJvdGVjdGVkIHZvaWQgcXVlcnlSZXBvc2l0b3J5VXBkYXRlZCgpIHsKLQkJZmlyZUxpc3RDaGFuZ2VkKFFVRVJJRVNfTElTVCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCWFkZE1hcHBpbmdGaWxlTWVzc2FnZXMobWVzc2FnZXMpOwkKLQkJYWRkQ2xhc3NNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1hcHBpbmdGaWxlTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJYWRkTXVsdGlwbGVNZXRhZGF0YU1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJYWRkRHVwbGljYXRlTWFwcGluZ0ZpbGVNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPiBzdHJlYW0gPSAgbWFwcGluZ0ZpbGVSZWZzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE11bHRpcGxlTWV0YWRhdGFNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlDb2xsZWN0aW9uPFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPiBwdURlZmF1bHRzQ29sbGVjdGlvbiA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRm9yVmFsaWRhdGlvbigpOwotCQlpZiAocHVEZWZhdWx0c0NvbGxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJZm9yIChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwdURlZmF1bHRzIDogcHVEZWZhdWx0c0NvbGxlY3Rpb24pIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTUFQUElOR1NfTVVMVElQTEVfTUVUQURBVEEsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXB1RGVmYXVsdHMpCi0JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGREdXBsaWNhdGVNYXBwaW5nRmlsZU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCUhhc2hCYWc8U3RyaW5nPiBmaWxlQmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigKLQkJCQlDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbigKLQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmLCBTdHJpbmc+KHRoaXMubWFwcGluZ0ZpbGVSZWZzKCkpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZikgewotCQkJCQkJCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWYuZ2V0RmlsZU5hbWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJKQotCQkpOwotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMubWFwcGluZ0ZpbGVSZWZzKCkpKSB7Ci0JCQlpZiAoZmlsZUJhZy5jb3VudChtYXBwaW5nRmlsZVJlZi5nZXRGaWxlTmFtZSgpKSA+IDEpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9NQVBQSU5HX0ZJTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge21hcHBpbmdGaWxlUmVmLmdldEZpbGVOYW1lKCl9LCAKLQkJCQkJCW1hcHBpbmdGaWxlUmVmLCAKLQkJCQkJCW1hcHBpbmdGaWxlUmVmLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDbGFzc01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWFkZER1cGxpY2F0ZUNsYXNzTWVzc2FnZXMobWVzc2FnZXMpOwotCQkKLQkJZm9yIChDbGFzc1JlZiBjbGFzc1JlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShjbGFzc1JlZnMoKSkpIHsKLQkJCWNsYXNzUmVmLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZER1cGxpY2F0ZUNsYXNzTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJSGFzaEJhZzxTdHJpbmc+IGNsYXNzTmFtZUJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oCi0JCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxDbGFzc1JlZiwgU3RyaW5nPih0aGlzLmNsYXNzUmVmcygpKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQ2xhc3NSZWYgY2xhc3NSZWYpIHsKLQkJCQkJCQkJcmV0dXJuIGNsYXNzUmVmLmdldENsYXNzTmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkpCi0JCSk7Ci0JCWZvciAoQ2xhc3NSZWYgamF2YUNsYXNzUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuY2xhc3NSZWZzKCkpKSB7Ci0JCQlpZiAoamF2YUNsYXNzUmVmLmdldENsYXNzTmFtZSgpICE9IG51bGwKLQkJCQkJJiYgY2xhc3NOYW1lQmFnLmNvdW50KGphdmFDbGFzc1JlZi5nZXRDbGFzc05hbWUoKSkgPiAxKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfQ0xBU1MsCi0JCQkJCQluZXcgU3RyaW5nW10ge2phdmFDbGFzc1JlZi5nZXRDbGFzc05hbWUoKX0sIAotCQkJCQkJamF2YUNsYXNzUmVmLCAKLQkJCQkJCWphdmFDbGFzc1JlZi5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248UGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRm9yVmFsaWRhdGlvbigpIHsKLQkJQXJyYXlMaXN0PFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPiBwdURlZmF1bHRzID0gbmV3IEFycmF5TGlzdDxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cz4oKTsKLQkJZm9yIChNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShtYXBwaW5nRmlsZVJlZnMoKSkpIHsKLQkJCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gbWFwcGluZ0ZpbGVSZWYuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJCWlmIChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyAhPSBudWxsKSB7Ci0JCQkJcHVEZWZhdWx0cy5hZGQocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwdURlZmF1bHRzOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJZm9yIChNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShtYXBwaW5nRmlsZVJlZnMoKSkpIHsKLQkJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gbWFwcGluZ0ZpbGVSZWYuZ2V0UGVyc2lzdGVudFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCQlpZiAob3JtUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBvcm1QZXJzaXN0ZW50VHlwZTsKLQkJCX0KLQkJfQotCQlmb3IgKENsYXNzUmVmIGNsYXNzUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGNsYXNzUmVmcygpKSkgewotCQkJaWYgKGNsYXNzUmVmLmlzRm9yKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCWZvciAoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobWFwcGluZ0ZpbGVSZWZzKCkpKSB7Ci0JCQlpZiAobWFwcGluZ0ZpbGVSZWYuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCkpIHsKLQkJCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWY7Ci0JCQl9Ci0JCX0KLQkJZm9yIChDbGFzc1JlZiBjbGFzc1JlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShjbGFzc1JlZnMoKSkpIHsKLQkJCWlmIChjbGFzc1JlZi5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KSkgewotCQkJCXJldHVybiBjbGFzc1JlZjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpIHsKLQkJaWYgKHhtbFBlcnNpc3RlbmNlVW5pdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdC5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZm9yIChDbGFzc1JlZiBjbGFzc1JlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShjbGFzc1JlZnMoKSkpIHsKLQkJCWNsYXNzUmVmLmRpc3Bvc2UoKTsKLQkJfQotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG1hcHBpbmdGaWxlUmVmcygpKSkgewotCQkJbWFwcGluZ0ZpbGVSZWYuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1BlcnNpc3RlbmNlWG1sLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VYbWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkNzY0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VYbWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VYbWwgZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sCi17Ci0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlUmVzb3VyY2UgcGVyc2lzdGVuY2VSZXNvdXJjZTsKLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2U7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVhtbChKcGFSb290Q29udGV4dE5vZGUgcGFyZW50LCBQZXJzaXN0ZW5jZVJlc291cmNlIHBlcnNpc3RlbmNlUmVzb3VyY2UpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplKHBlcnNpc3RlbmNlUmVzb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyBpc24ndCBhY3R1YWxseSBkaXNwbGF5ZWQsIHNvIG5lZWRzIG5vIGRldGFpbHMgcGFnZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYVJvb3RDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSnBhUm9vdENvbnRleHROb2RlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0RmlsZSgpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIHBlcnNpc3RlbmNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFBlcnNpc3RlbmNlIGdldFBlcnNpc3RlbmNlKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2U7Ci0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZSBhZGRQZXJzaXN0ZW5jZSgpIHsKLQkJaWYgKHBlcnNpc3RlbmNlICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQkKLQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlKCk7Ci0JCXBlcnNpc3RlbmNlID0gYnVpbGRQZXJzaXN0ZW5jZSh4bWxQZXJzaXN0ZW5jZSk7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoeG1sUGVyc2lzdGVuY2UpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBFUlNJU1RFTkNFX1BST1BFUlRZLCBudWxsLCBwZXJzaXN0ZW5jZSk7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUGVyc2lzdGVuY2UoKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5wZXJzaXN0ZW5jZS5kaXNwb3NlKCk7Ci0JCVBlcnNpc3RlbmNlIG9sZFBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2U7Ci0JCXBlcnNpc3RlbmNlID0gbnVsbDsKLQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVJlc291cmNlLmdldFBlcnNpc3RlbmNlKCk7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoeG1sUGVyc2lzdGVuY2UpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBFUlNJU1RFTkNFX1BST1BFUlRZLCBvbGRQZXJzaXN0ZW5jZSwgbnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFBlcnNpc3RlbmNlXyhQZXJzaXN0ZW5jZSBuZXdQZXJzaXN0ZW5jZSkgewotCQlQZXJzaXN0ZW5jZSBvbGRQZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlOwotCQlwZXJzaXN0ZW5jZSA9IG5ld1BlcnNpc3RlbmNlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBFUlNJU1RFTkNFX1BST1BFUlRZLCBvbGRQZXJzaXN0ZW5jZSwgbmV3UGVyc2lzdGVuY2UpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQZXJzaXN0ZW5jZVJlc291cmNlIHBlcnNpc3RlbmNlUmVzb3VyY2UpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVJlc291cmNlID0gcGVyc2lzdGVuY2VSZXNvdXJjZTsKLQkJaWYgKHBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0UGVyc2lzdGVuY2UoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlID0gYnVpbGRQZXJzaXN0ZW5jZShwZXJzaXN0ZW5jZVJlc291cmNlLmdldFBlcnNpc3RlbmNlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFBlcnNpc3RlbmNlUmVzb3VyY2UgcGVyc2lzdGVuY2VSZXNvdXJjZSkgewotCQl0aGlzLnBlcnNpc3RlbmNlUmVzb3VyY2UgPSBwZXJzaXN0ZW5jZVJlc291cmNlOwotCQlpZiAocGVyc2lzdGVuY2VSZXNvdXJjZS5nZXRQZXJzaXN0ZW5jZSgpICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnBlcnNpc3RlbmNlICE9IG51bGwpIHsKLQkJCQl0aGlzLnBlcnNpc3RlbmNlLnVwZGF0ZShwZXJzaXN0ZW5jZVJlc291cmNlLmdldFBlcnNpc3RlbmNlKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0UGVyc2lzdGVuY2VfKGJ1aWxkUGVyc2lzdGVuY2UocGVyc2lzdGVuY2VSZXNvdXJjZS5nZXRQZXJzaXN0ZW5jZSgpKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0UGVyc2lzdGVuY2UoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0UGVyc2lzdGVuY2UoKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlzZXRQZXJzaXN0ZW5jZV8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlIGJ1aWxkUGVyc2lzdGVuY2UoWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZFBlcnNpc3RlbmNlKHRoaXMsIHhtbFBlcnNpc3RlbmNlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vIFBlcnNpc3RlbmNlVW5pdCBpbiB0aGlzIGNvbnRleHQiKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgewotCQlpZiAocGVyc2lzdGVuY2UuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCkpIHsKLQkJCXJldHVybiBwZXJzaXN0ZW5jZS5nZXRTdHJ1Y3R1cmVOb2RlKHRleHRPZmZzZXQpOwotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkvLyBuZXZlciBhY3R1YWxseSBzZWxlY3RlZAotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gVGV4dFJhbmdlLkVtcHR5Lmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIFRleHRSYW5nZS5FbXB0eS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBib29sZWFuIG9rVG9Db250aW51ZVZhbGlkYXRpb24gPSB0cnVlOwotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJYWRkSW52YWxpZFBlcnNpc3RlbmNlWG1sQ29udGVudE1lc3NhZ2UobWVzc2FnZXMpOwotCQkKLQkJaWYgKG9rVG9Db250aW51ZVZhbGlkYXRpb24pewotCQkJZ2V0UGVyc2lzdGVuY2UoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbnZhbGlkUGVyc2lzdGVuY2VYbWxDb250ZW50TWVzc2FnZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZSA9PSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9YTUxfSU5WQUxJRF9DT05URU5ULAotCQkJCQkJdGhpcykKLQkJCQkpOwotCQkJb2tUb0NvbnRpbnVlVmFsaWRhdGlvbiA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1Byb3BlcnR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNkMTdkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUHJvcGVydHkgZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFByb3BlcnR5Ci17Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCQotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0JCi0JcHJvdGVjdGVkIFhtbFByb3BlcnR5IHByb3BlcnR5OwotCQotCXB1YmxpYyBHZW5lcmljUHJvcGVydHkoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplKHByb3BlcnR5KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBuYW1lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5wcm9wZXJ0eS5zZXROYW1lKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbHVlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7Ci0JCXRoaXMucHJvcGVydHkuc2V0VmFsdWUobmV3VmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxQcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQl0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0JCXRoaXMubmFtZSA9IHByb3BlcnR5LmdldE5hbWUoKTsKLQkJdGhpcy52YWx1ZSA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxQcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQl0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0JCXNldE5hbWUocHJvcGVydHkuZ2V0TmFtZSgpKTsKLQkJc2V0VmFsdWUocHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvcGVydHkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIHRvU3RyaW5nCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikKLQl7Ci0JCXNiLmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJc2IuYXBwZW5kKG5hbWUpOwotCQlzYi5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlzYi5hcHBlbmQodmFsdWUpOwotCQlzYi5hcHBlbmQoJyknKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkMjhhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcwotewotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyBKcGEgUGxhdGZvcm0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9JRCA9ICJKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk1fSUQiOwotCQotCS8qKgotCSAqIE5vdCByZXF1aXJlZCwgdHlwZSBTdHJpbmcsIGlkZW50aWZpZXMgZGF0YWJhc2UgY29ubmVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT04gPSAiSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTk5FQ1RJT04iOwotCQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIEJvb2xlYW4sIGlkZW50aWZpZXMgd2hldGhlciBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGFjdGl2ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fQUNUSVZFID0gIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5DT05ORUNUSU9OX0FDVElWRSI7Ci0JCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgQm9vbGVhbiwgaWRlbnRpZmllcyBpZiB0aGUgdXNlciB3aXNoZXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBzY2hlbWEgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEgPSAKLQkJIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5VU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BIjsKLQkKLQkvKioKLQkgKiBOb3QgcmVxdWlyZWQsIHR5cGUgU3RyaW5nLCBpZGVudGlmaWVzIHRoZSB1c2VyIG92ZXJyaWRkZW4gZGVmYXVsdCBzY2hlbWEgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEgPSAKLQkJCSJKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSI7Ci0JCi0JLyoqCi0JICogSW50ZXJuYWwsIHR5cGUgSVJ1bnRpbWUsIGlkZW50aWZpZXMgcnVudGltZSBhc3NvY2lhdGVkIHdpdGggcHJvamVjdAotCSAqIFVzZWQgb25seSBpbiBjb25qdW5jdGlvbiB3aXRoIHZhbGlkYXRpb24gb2Ygb3RoZXIgcHJvcGVydGllcywgYmVjYXVzZSB0aGlzIGluZm9ybWF0aW9uCi0JICogaXMgb3RoZXJ3aXNlIGluYWNjZXNzaWJsZSB0byB0aGlzIGRhdGEgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FID0gIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5SVU5USU1FIjsKLQkKLQkvKioKLQkgKiBSZXF1aXJlZCwgdHlwZSBib29sZWFuLCBvcHBvc2l0ZSBvZiBVU0VfVVNFUl9KUEFfTElCUkFSWSwgaWRlbnRpZmllcyB3aGV0aGVyIAotCSAqIHNlcnZlciBydW50aW1lIHByb3ZpZGVzIEpQQSBpbXBsZW1lbnRhdGlvbgotCSAqIElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiB0aGUgcHJvcGVydHkgSlBBX0xJQlJBUlkgaXMgbm90IHVzZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfU0VSVkVSX0pQQV9JTVBMRU1FTlRBVElPTiA9ICJKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04iOwotCQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIGJvb2xlYW4sIG9wcG9zaXRlIG9mIFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OLCBpZGVudGlmaWVzCi0JICogd2hldGhlciB0aGUgdXNlciBpcyBwcm92aWRpbmcgaGlzIG93biBKUEEgbGlicmFyeSAKLQkgKiAoVGhpcyBhZGRpdGlvbmFsIHNldHRpbmcgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHVzZSBzeW5jaEhlbHBlciB3aXRoaW4KLQkgKiB0aGUgd2l6YXJkIC0gdGhlcmUgbXVzdCBiZSBhIHVuaXF1ZSBwcm9wZXJ0eSBmb3IgZWFjaCByYWRpbyBidXR0b24uIFN0dXBpZAotCSAqIGJ1dCB0cnVlKQotCSAqIElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiB0aGUgcHJvcGVydHkgSlBBX0xJQlJBUlkgaXMgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9VU0VSX0pQQV9MSUJSQVJZID0gIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5VU0VfVVNFUl9KUEFfTElCUkFSWSI7Ci0JCi0JLyoqCi0JICogTm90IHJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeS4KLQkgKiBPbmx5IHVzZWQgaWYgdGhlIHByb3BlcnR5IFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OIGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9MSUJSQVJZID0gIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5KUEFfTElCUkFSWSI7Ci0JCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgYm9vbGVhbiwgb3Bwb3NpdGUgb2YgTElTVF9BTk5PVEFURURfQ0xBU1NFUywgaWRlbnRpZmllcyAKLQkgKiB3aGV0aGVyIGFsbCBhbm5vdGF0ZWQgY2xhc3NlcyBhcmUgdG8gYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCBhcyBwYXJ0IG9mIAotCSAqIGFsbCBwZXJzaXN0ZW5jZSB1bml0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTID0gIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5ESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUyI7Ci0JCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgYm9vbGVhbiwgb3Bwb3NpdGUgb2YgRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIGlkZW50aWZpZXMKLQkgKiBpZiBhbm5vdGF0ZWQgY2xhc3NlcyBzaG91bGQgYmUgbGlzdGVkIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwgaW4gb3JkZXIgdG8KLQkgKiBiZSBjb25zaWRlcmVkIHBhcnQgb2YgYSBwZXJzaXN0ZW5jZSB1bml0Ci0JICogKFRoaXMgYWRkaXRpb25hbCBzZXR0aW5nIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byB1c2Ugc3luY2hIZWxwZXIgd2l0aGluCi0JICogdGhlIHdpemFyZCAtIHRoZXJlIG11c3QgYmUgYSB1bmlxdWUgcHJvcGVydHkgZm9yIGVhY2ggcmFkaW8gYnV0dG9uLiBTdHVwaWQKLQkgKiBidXQgdHJ1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX0FOTk9UQVRFRF9DTEFTU0VTID0gIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5MSVNUX0FOTk9UQVRFRF9DTEFTU0VTIjsKLQkKLQkvKioKLQkgKiBSZXF1aXJlZCwgdHlwZSBib29sZWFuLCBkZXRhaWxzIHdoZXRoZXIgb3JtLnhtbCBzaG91bGQgYmUgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9PUk1fWE1MID0gIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3OTg2Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcHRDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotcHVibGljIGNsYXNzIEpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcgotCWltcGxlbWVudHMgSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9GQUNFVF9JRCA9IElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRV9OT05FID0gCi0JCQlXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuUlVOVElNRV9OT05FLCBudWxsKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RhdHVzIFBMQVRGT1JNX05PVF9TUEVDSUZJRURfU1RBVFVTID0gCi0JCQlidWlsZEVycm9yU3RhdHVzKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9QTEFURk9STV9OT1RfU1BFQ0lGSUVEKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RhdHVzIENPTk5FQ1RJT05fTk9UX0NPTk5FQ1RFRF9TVEFUVVMgPSAKLQkJCWJ1aWxkSW5mb1N0YXR1cyhKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfQ09OTkVDVElPTl9OT1RfQ09OTkVDVEVEKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RhdHVzIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUFfTk9UX1NQRUNJRklFRF9TVEFUVVMgPSAKLQkJCWJ1aWxkRXJyb3JTdGF0dXMoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0RFRkFVTFRfU0NIRU1BX05PVF9TUEVDSUZJRUQpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTdGF0dXMgUlVOVElNRV9OT1RfU1BFQ0lGSUVEX1NUQVRVUyA9IAotCQkJYnVpbGRXYXJuaW5nU3RhdHVzKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9SVU5USU1FX05PVF9TUEVDSUZJRUQpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTdGF0dXMgUlVOVElNRV9ET0VTX05PVF9TVVBQT1JUX0VKQl8zMF9TVEFUVVMgPSAKLQkJCWJ1aWxkV2FybmluZ1N0YXR1cyhKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfUlVOVElNRV9ET0VTX05PVF9TVVBQT1JUX0VKQl8zMCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVN0YXR1cyBMSUJSQVJZX05PVF9TUEVDSUZJRURfU1RBVFVTID0gCi0JCQlidWlsZFdhcm5pbmdTdGF0dXMoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0xJQlJBUllfTk9UX1NQRUNJRklFRCk7Ci0KLQkvKioKLQkgKiByZXF1aXJlZCBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCVNldDxTdHJpbmc+IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBMQVRGT1JNX0lEKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQ09OTkVDVElPTik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKENPTk5FQ1RJT05fQUNUSVZFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChSVU5USU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChVU0VfVVNFUl9KUEFfTElCUkFSWSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEpQQV9MSUJSQVJZKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChMSVNUX0FOTk9UQVRFRF9DTEFTU0VTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQ1JFQVRFX09STV9YTUwpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkgewotCQkJcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKUEFfTElCUkFSWSkpIHsKLQkJCXJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoVVNFX1VTRVJfSlBBX0xJQlJBUlkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZBQ0VUX0lEKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uRkFDRVRfSUQ7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUExBVEZPUk1fSUQpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXREZWZhdWx0SnBhUGxhdGZvcm1JZCgpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT04pKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05ORUNUSU9OX0FDVElWRSkpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoY29ubmVjdGlvbklzQWN0aXZlKCkpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkgewotCQkJcmV0dXJuIGdldERlZmF1bHRTY2hlbWFOYW1lKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUlVOVElNRSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OKSkgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnJ1bnRpbWVTdXBwb3J0c0VqYjMwKHRoaXMucnVudGltZSgpKSk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFX1VTRVJfSlBBX0xJQlJBUlkpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCAhIGdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfU0VSVkVSX0pQQV9JTVBMRU1FTlRBVElPTikpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpQQV9MSUJSQVJZKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0RGVmYXVsdEpwYUxpYnJhcnkoKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUykpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5ydW50aW1lU3VwcG9ydHNFamIzMCh0aGlzLnJ1bnRpbWUoKSkpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExJU1RfQU5OT1RBVEVEX0NMQVNTRVMpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCAhIGdldEJvb2xlYW5Qcm9wZXJ0eShESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUykpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENSRUFURV9PUk1fWE1MKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhSVU5USU1FKSkgewotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VfU0VSVkVSX0pQQV9JTVBMRU1FTlRBVElPTiwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRV9VU0VSX0pQQV9MSUJSQVJZLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCS8vIG5lZWQgdG8gZmlyZSB0aGF0IHRoZSBkZWZhdWx0IGNoYW5nZSBmb3IgdXNpbmcgdXNlciBsaWJyYXJ5IG1heSBoYXZlCi0JCQkvLyBhY3R1YWxseSBjaGFuZ2VkIGVuYWJsZW1lbnQgZm9yIGxpYnJhcnkKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoSlBBX0xJQlJBUlksIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoTElTVF9BTk5PVEFURURfQ0xBU1NFUywgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OTkVDVElPTikpIHsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQ09OTkVDVElPTiwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCXRoaXMubW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KENPTk5FQ1RJT05fQUNUSVZFLCBjb25uZWN0aW9uSXNBY3RpdmUoKSk7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT05fQUNUSVZFKSkgewotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkgewotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJaWYgKCEgKChCb29sZWFuKSBwcm9wZXJ0eVZhbHVlKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCXRoaXMubW9kZWwuc2V0UHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04pKSB7Ci0JCQl0aGlzLm1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShVU0VfVVNFUl9KUEFfTElCUkFSWSwgISAoKEJvb2xlYW4pIHByb3BlcnR5VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VfVVNFUl9KUEFfTElCUkFSWSkpIHsKLQkJCXRoaXMubW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OLCAhICgoQm9vbGVhbikgcHJvcGVydHlWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShKUEFfTElCUkFSWSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUykpIHsKLQkJCXRoaXMubW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KExJU1RfQU5OT1RBVEVEX0NMQVNTRVMsICEgKChCb29sZWFuKSBwcm9wZXJ0eVZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTElTVF9BTk5PVEFURURfQ0xBU1NFUykpIHsKLQkJCXRoaXMubW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLCAhICgoQm9vbGVhbikgcHJvcGVydHlWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBvazsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBFTVBUWV9ETVBEX0FSUkFZID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclswXTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQTEFURk9STV9JRCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuYXJyYXkoCi0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I+KAotCQkJCQkJSnBhUGxhdGZvcm1SZWdpc3RyeS5pbnN0YW5jZSgpLmpwYVBsYXRmb3JtSWRzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgdHJhbnNmb3JtKFN0cmluZyBwbGF0Zm9ybUlkKSB7Ci0JCQkJCQlyZXR1cm4gcGxhdGZvcm1JZFByb3BlcnR5RGVzY3JpcHRvcihwbGF0Zm9ybUlkKTsKLQkJCQkJfQotCQkJCX0sCi0JCQkJRU1QVFlfRE1QRF9BUlJBWSk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OTkVDVElPTikpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuYXJyYXkoCi0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I+KAotCQkJCQkJbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oCi0JCQkJCQkJbnVsbCwgCi0JCQkJCQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5jb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCQkJcmV0dXJuIGNvbm5lY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IobmV4dCk7Ci0JCQkJCX0KLQkJCQl9LAotCQkJCUVNUFRZX0RNUERfQVJSQVkpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmFycmF5KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yPihzY2hlbWFOYW1lcygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IobmV4dCk7Ci0JCQkJCX0KLQkJCQl9LAotCQkJCUVNUFRZX0RNUERfQVJSQVkpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpQQV9MSUJSQVJZKSkgewotCQkJU3RyaW5nW10gbGlicmFyaWVzID0gQ29sbGVjdGlvblRvb2xzLnNvcnQoSmF2YUNvcmUuZ2V0VXNlckxpYnJhcnlOYW1lcygpKTsKLQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltsaWJyYXJpZXMubGVuZ3RoICsgMV07Ci0JCQlkZXNjcmlwdG9yc1swXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoIiIsIFJVTlRJTUVfTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaW50IGkgPSAxOwotCQkJZm9yIChTdHJpbmcgbGlicmFyeSA6IGxpYnJhcmllcykgewotCQkJCWRlc2NyaXB0b3JzW2krK10gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKGxpYnJhcnksIGxpYnJhcnkpOwotCQkJfQotCQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBMQVRGT1JNX0lEKSkgewotCQkJcmV0dXJuIHBsYXRmb3JtSWRQcm9wZXJ0eURlc2NyaXB0b3IoZ2V0U3RyaW5nUHJvcGVydHkoUExBVEZPUk1fSUQpKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05ORUNUSU9OKSkgewotCQkJcmV0dXJuIGNvbm5lY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2V0U3RyaW5nUHJvcGVydHkoQ09OTkVDVElPTikpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHBsYXRmb3JtSWRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHBsYXRmb3JtSWQpIHsKLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQlwbGF0Zm9ybUlkLCBKcGFQbGF0Zm9ybVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1MYWJlbChwbGF0Zm9ybUlkKSk7Ci0JfQotCQotCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBjb25uZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBjb25uZWN0aW9uKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGNvbm5lY3Rpb24pID8KLQkJCQkJbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihudWxsLCBKcHRDb3JlTWVzc2FnZXMuTk9ORSkKLQkJCQk6Ci0JCQkJCW5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoY29ubmVjdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUuZXF1YWxzKFBMQVRGT1JNX0lEKSkgewotCQkJcmV0dXJuIHRoaXMudmFsaWRhdGVQbGF0Zm9ybUlkKHRoaXMuZ2V0U3RyaW5nUHJvcGVydHkobmFtZSkpOwotCQl9Ci0JCWlmIChuYW1lLmVxdWFscyhDT05ORUNUSU9OKSkgewotCQkJcmV0dXJuIHRoaXMudmFsaWRhdGVDb25uZWN0aW9uTmFtZSh0aGlzLmdldFN0cmluZ1Byb3BlcnR5KG5hbWUpKTsKLQkJfQotCQlpZiAobmFtZS5lcXVhbHMoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkKLQkJCQl8fCBuYW1lLmVxdWFscyhVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkgewotCQkJcmV0dXJuIHRoaXMudmFsaWRhdGVVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7Ci0JCX0KLQkJaWYgKG5hbWUuZXF1YWxzKFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OKSkgewotCQkJcmV0dXJuIHRoaXMudmFsaWRhdGVKcGFMaWJyYXJ5KHRoaXMuZ2V0Qm9vbGVhblByb3BlcnR5KG5hbWUpKTsKLQkJfQotCQlpZiAobmFtZS5lcXVhbHMoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMpKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWxpZGF0ZVBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnQodGhpcy5nZXRCb29sZWFuUHJvcGVydHkobmFtZSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci52YWxpZGF0ZShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElSdW50aW1lIHJ1bnRpbWUoKSB7Ci0JCXJldHVybiAoSVJ1bnRpbWUpIHRoaXMuZ2V0UHJvcGVydHkoUlVOVElNRSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJ1bnRpbWVTdXBwb3J0c0VqYjMwKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJSVByb2plY3RGYWNldFZlcnNpb24gZWpiMzAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRUpCX0ZBQ0VUX0lEKS5nZXRWZXJzaW9uKCIzLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gKHJ1bnRpbWUgPT0gbnVsbCkgPyBmYWxzZSA6IHJ1bnRpbWUuc3VwcG9ydHMoZWpiMzApOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdHJpbmdQcm9wZXJ0eShDT05ORUNUSU9OKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZSh0aGlzLmdldENvbm5lY3Rpb25OYW1lKCkpOwotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpIHsKLQkJLy8gd2UgZG9uJ3QgaGF2ZSBhIEpQQSBwcm9qZWN0IHlldCwgc28gZ28gdG8gdGhlIGRiIHBsdWctaW4gZGlyZWN0bHkgdG8gZ2V0IHRoZSBmYWN0b3J5Ci0JCXJldHVybiBKcHREYlBsdWdpbi5pbnN0YW5jZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOwotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb25uZWN0aW9uSXNBY3RpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Jc0FjdGl2ZSh0aGlzLmdldENvbm5lY3Rpb25OYW1lKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb25uZWN0aW9uSXNBY3RpdmUoU3RyaW5nIGNvbm5lY3Rpb25OYW1lKSB7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGNvbm5lY3Rpb25OYW1lKTsKLQkJcmV0dXJuIChjcCAhPSBudWxsKSAmJiBjcC5pc0FjdGl2ZSgpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hTmFtZSgpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCWlmIChjcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlEYXRhYmFzZSBkYiA9IGNwLmdldERhdGFiYXNlKCk7Ci0JCWlmIChkYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTY2hlbWEgc2NoZW1hID0gZGIuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlyZXR1cm4gKHNjaGVtYSA9PSBudWxsKSA/IG51bGwgOiBzY2hlbWEuZ2V0TmFtZSgpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU29ydGVkU2NoZW1hTmFtZXMoKSB7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCQlpZiAoY3AgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCURhdGFiYXNlIGRiID0gY3AuZ2V0RGF0YWJhc2UoKTsKLQkJaWYgKGRiID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNvcnQoQ29sbGVjdGlvblRvb2xzLmxpc3QoZGIuc2NoZW1hTmFtZXMoKSkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBzY2hlbWFOYW1lcygpIHsKLQkJU3RyaW5nIHNldFZhbHVlID0gZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSk7Ci0JCUxpc3Q8U3RyaW5nPiBzY2hlbWFOYW1lcyA9IHRoaXMuYnVpbGRTb3J0ZWRTY2hlbWFOYW1lcygpOwotCQkKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoc2V0VmFsdWUpIHx8IHNjaGVtYU5hbWVzLmNvbnRhaW5zKHNldFZhbHVlKSkgewotCQkJcmV0dXJuIHNjaGVtYU5hbWVzLml0ZXJhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KHNldFZhbHVlLCBzY2hlbWFOYW1lcy5pdGVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQbGF0Zm9ybUlkKFN0cmluZyBwbGF0Zm9ybUlkKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHBsYXRmb3JtSWQpID8KLQkJCQlQTEFURk9STV9OT1RfU1BFQ0lGSUVEX1NUQVRVUwotCQkJOgotCQkJCU9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVDb25uZWN0aW9uTmFtZShTdHJpbmcgY29ubmVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoY29ubmVjdGlvbk5hbWUpID8KLQkJCQlPS19TVEFUVVMKLQkJCToKLQkJCQl0aGlzLmdldENvbm5lY3Rpb25TdGF0dXMoY29ubmVjdGlvbk5hbWUpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBnZXRDb25uZWN0aW9uU3RhdHVzKFN0cmluZyBjb25uZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uSXNBY3RpdmUoY29ubmVjdGlvbk5hbWUpID8KLQkJCQlPS19TVEFUVVMKLQkJCToKLQkJCQlDT05ORUNUSU9OX05PVF9DT05ORUNURURfU1RBVFVTOwotCX0KLQkKLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCkgewotCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRTdHJpbmdQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkpIHsKLQkJCQlyZXR1cm4gVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQV9OT1RfU1BFQ0lGSUVEX1NUQVRVUzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUpwYUxpYnJhcnkoYm9vbGVhbiB1c2VTZXJ2ZXJKcGFJbXBsZW1lbnRhdGlvbikgewotCQlpZiAodXNlU2VydmVySnBhSW1wbGVtZW50YXRpb24pIHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSB0aGlzLnJ1bnRpbWUoKTsKLQkJCWlmIChydW50aW1lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gUlVOVElNRV9OT1RfU1BFQ0lGSUVEX1NUQVRVUzsKLQkJCX0KLQkJCWlmICggISB0aGlzLnJ1bnRpbWVTdXBwb3J0c0VqYjMwKHJ1bnRpbWUpKSB7Ci0JCQkJcmV0dXJuIFJVTlRJTUVfRE9FU19OT1RfU1VQUE9SVF9FSkJfMzBfU1RBVFVTOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5nZXRTdHJpbmdQcm9wZXJ0eShKUEFfTElCUkFSWSkpKSB7Ci0JCQkJcmV0dXJuIExJQlJBUllfTk9UX1NQRUNJRklFRF9TVEFUVVM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50KGJvb2xlYW4gZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKSB7Ci0JCS8vIFRPRE8gd2FybmluZyBpZiAiZGlzY292ZXJ5IiBpcyB1c2VkLCBidXQgbm8gcnVudGltZSBzcGVjaWZpZWQgPz8KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBidWlsZEluZm9TdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGJ1aWxkU3RhdHVzKElTdGF0dXMuSU5GTywgbWVzc2FnZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBidWlsZFdhcm5pbmdTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGJ1aWxkU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBidWlsZEVycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBidWlsZFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGJ1aWxkU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIEpwdENvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWMyOTVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkVhclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIFdlIGRvbid0IHJlYWxseSAiaW5zdGFsbCIgdGhlIEpQQSBmYWNldCBoZXJlLiBXZSBzaW1wbHkgc3RvcmUgYWxsIHRoZSB2YXJpb3VzCi0gKiBkYXRhIG1vZGVsIHByb3BlcnRpZXMgaW4gdGhlIGFwcHJvcHJpYXRlIHByZWZlcmVuY2VzLiBUaGVzZSBzZXR0aW5ncyB3aWxsCi0gKiB1c2VkIGluIHRoZSBQT1NUX0lOU1RBTEwgZXZlbnQgbGlzdGVuZXIgdG8gYnVpbGQgdGhlIEpQQSBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgSnBhRmFjZXRJbnN0YWxsRGVsZWdhdGUgCi0JaW1wbGVtZW50cyBJRGVsZWdhdGUsIEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcwotewotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0JCQkJT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1vbml0b3IgPSB0aGlzLm5vbk51bGxNb25pdG9yKG1vbml0b3IpOwotCQl0cnkgewotCQkJdGhpcy5leGVjdXRlXyhwcm9qZWN0LCBmdiwgY29uZmlnLCBtb25pdG9yKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVfKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLQkJCQlPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIE5COiBXVFAgTmF0dXJlcyAoaW5jbHVkaW5nIHRoZSBKYXZhRU1GTmF0dXJlKQotCQkvLyBzaG91bGQgYWxyZWFkeSBiZSBhZGRlZCwgYXMgdGhpcyBmYWNldCBzaG91bGQgCi0JCS8vIGFsd2F5cyBjb2V4aXN0IHdpdGggYSBtb2R1bGUgZmFjZXQuCi0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0JCXRoaXMuY29uZmlndXJlQ2xhc3NwYXRoKGphdmFQcm9qZWN0LCBkYXRhTW9kZWwsIG1vbml0b3IpOwotCQkKLQkJLy8gcHJvamVjdCBzZXR0aW5ncwotCQlKcHRDb3JlUGx1Z2luLnNldEpwYVBsYXRmb3JtSWQocHJvamVjdCwgZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBMQVRGT1JNX0lEKSk7Ci0JCUpwdENvcmVQbHVnaW4uc2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKHByb2plY3QsIGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDT05ORUNUSU9OKSk7Ci0JCWlmIChkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7Ci0JCQlKcHRDb3JlUGx1Z2luLnNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKHByb2plY3QsIGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSk7Ci0JCX0KLQkJSnB0Q29yZVBsdWdpbi5zZXREaXNjb3ZlckFubm90YXRlZENsYXNzZXMocHJvamVjdCwgZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUykpOwotCQkKLQkJLy8gZGVmYXVsdHMgc2V0dGluZ3MKLQkJSnB0Q29yZVBsdWdpbi5zZXREZWZhdWx0SnBhUGxhdGZvcm1JZChkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUExBVEZPUk1fSUQpKTsKLQkJCi0JCW1vbml0b3Iud29ya2VkKDEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb25maWd1cmVDbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJRGF0YU1vZGVsIGRhdGFNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gdXNlU2VydmVyTGlicmFyeSA9IGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04pOwotCQlpZiAodXNlU2VydmVyTGlicmFyeSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIGpwYUxpYnJhcnkgPSBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSlBBX0xJQlJBUlkpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShqcGFMaWJyYXJ5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gYnVpbGQgdGhlIEpQQSBsaWJyYXJ5IHRvIGJlIGFkZGVkIHRvIHRoZSBjbGFzc3BhdGgKLQkJSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMgPSB0aGlzLmJ1aWxkQ2xhc3NwYXRoQXR0cmlidXRlcyhqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlJQ2xhc3NwYXRoRW50cnkganBhTGlicmFyeUVudHJ5ID0gCi0JCQlKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeSgKLQkJCQluZXcgUGF0aChKYXZhQ29yZS5VU0VSX0xJQlJBUllfQ09OVEFJTkVSX0lEICsgIi8iICsganBhTGlicmFyeSksCi0JCQkJbnVsbCwgYXR0cmlidXRlcywgdHJ1ZQotCQkJKTsKLQotCQkvLyBpZiB0aGUgSlBBIGxpYnJhcnkgaXMgYWxyZWFkeSB0aGVyZSwgZG8gbm90aGluZwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjbGFzc3BhdGgsIGpwYUxpYnJhcnlFbnRyeSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGFkZCB0aGUgSlBBIGxpYnJhcnkgdG8gdGhlIGNsYXNzcGF0aAotCQlpbnQgbGVuID0gY2xhc3NwYXRoLmxlbmd0aDsKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtsZW4gKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShjbGFzc3BhdGgsIDAsIG5ld0NsYXNzcGF0aCwgMCwgbGVuKTsKLQkJbmV3Q2xhc3NwYXRoW2xlbl0gPSBqcGFMaWJyYXJ5RW50cnk7Ci0JCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIG1vbml0b3IpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBFTVBUWV9DTEFTU1BBVEhfQVRUUklCVVRFUyA9IG5ldyBJQ2xhc3NwYXRoQXR0cmlidXRlWzBdOwotCi0JcHJpdmF0ZSBJQ2xhc3NwYXRoQXR0cmlidXRlW10gYnVpbGRDbGFzc3BhdGhBdHRyaWJ1dGVzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiB3ZWJBcHAgPSBKcHRDb3JlUGx1Z2luLnByb2plY3RIYXNXZWJGYWNldChwcm9qZWN0KTsKLQkJaWYgKCAhIHdlYkFwcCAmJiB0aGlzLnByb2plY3RJc1N0YW5kYWxvbmUocHJvamVjdCkpIHsKLQkJCXJldHVybiBFTVBUWV9DTEFTU1BBVEhfQVRUUklCVVRFUzsKLQkJfQotCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbXSB7Ci0JCQkJSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKAotCQkJCQlJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1ksCi0JCQkJCUNsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldERlZmF1bHRSdW50aW1lUGF0aCh3ZWJBcHApLnRvU3RyaW5nKCkKLQkJCQkpCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByb2plY3RJc1N0YW5kYWxvbmUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gRWFyVXRpbGl0aWVzLmlzU3RhbmRhbG9uZVByb2plY3QocHJvamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG5vbk51bGxNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gKG1vbml0b3IgIT0gbnVsbCkgPyBtb25pdG9yIDogbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2RmYTJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgSnBhRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZSAKLQlpbXBsZW1lbnRzIElEZWxlZ2F0ZSAKLXsKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotCQkJT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQkvLyBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUuICBFdmVyeXRoaW5nIGlzIHRha2VuIGNhcmUgb2YgYnkgdGhlIAotCQkvLyBKcGFNb2RlbE1hbmFnZXIgKndoZW5ldmVyKiB0aGUgZmFjZXQgaXMgcmVtb3ZlZCAoZXZlbiB2aWEgbWV0YS1maWxlCi0JCS8vIGVkaXRpbmcgYW5kIENWUyB1cGRhdGluZyksIGJ1dCB0aGlzIGRlbGVnYXRlIG5lZWRzIHRvIGJlIGhlcmUgYmVjYXVzZQotCQkvLyBpdCBpcyByZXF1aXJlZCBieSB0aGUgZmFjZXQgZXh0ZW5zaW9uIHBvaW50IGFjdGlvbiBlbGVtZW50LCBhbmQgdGhhdCAKLQkJLy8gaXMgcmVxdWlyZWQgYnkgdGhlIGZhY2V0IFVJIHRvIGFsbG93IHVuaW5zdGFsbGF0aW9uIG9mIHRoaXMgZmFjZXQuCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOGEzYmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotcHVibGljIGludGVyZmFjZSBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgU3RyaW5nLCBpZGVudGlmaWVzIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSI7Ci0JCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgU3RyaW5nLCBpZGVudGlmaWVzIHRoZSBmdWxseSBwYXRoZWQgc291cmNlIGZvbGRlciBpbiB3aGljaCB0byBjcmVhdGUgdGhlIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRk9MREVSID0gIk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUiI7Ci0JCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgU3RyaW5nLCBpZGVudGlmaWVzIHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BBVEggPSAiT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX1BBVEgiOwotCQotCS8qKgotCSAqIE9wdGlvbmFsLCB0eXBlIEFjY2Vzc1R5cGUsIHNwZWNpZmllcyB0aGUgZGVmYXVsdCBhY2Nlc3MgdHlwZSAob3IgbnVsbCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FDQ0VTUyA9ICJPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkRFRkFVTFRfQUNDRVNTIjsKLQkKLQkvKioKLQkgKiBSZXF1aXJlZCwgdHlwZSBCb29sZWFuLCBzcGVjaWZpZXMgd2hldGhlciB0byBhZGQgYSByZWZlcmVuY2UgdG8gdGhlIGZpbGUKLQkgKiBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9UT19QRVJTSVNURU5DRV9VTklUID0gIk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQiOwotCQotCS8qKgotCSAqIE9wdGlvbmFsICh1bmxlc3MgQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQgcHJvcGVydHkgaXMgdHJ1ZSksIHR5cGUgU3RyaW5nLCAKLQkgKiBpZGVudGlmaWVzIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHRvIHdoaWNoIHRvIGFkZCBhIHJlZmVyZW5jZSB0byB0aGUgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVQgPSAiT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QRVJTSVNURU5DRV9VTklUIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTRkNTI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLQotcHVibGljIGNsYXNzIE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcgotCWltcGxlbWVudHMgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcwotewotCS8qKgotCSAqIHJlcXVpcmVkIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldDxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlTZXQ8U3RyaW5nPiBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChTT1VSQ0VfRk9MREVSKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRklMRV9QQVRIKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoREVGQVVMVF9BQ0NFU1MpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChBRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBFUlNJU1RFTkNFX1VOSVQpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9VTklUKSkgewotCQkJcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShBRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU09VUkNFX0ZPTERFUikpIHsKLQkJCUlGb2xkZXIgc291cmNlRm9sZGVyID0gZ2V0RGVmYXVsdFNvdXJjZUZvbGRlcigpOwotCQkJaWYgKHNvdXJjZUZvbGRlciAhPSBudWxsICYmIHNvdXJjZUZvbGRlci5leGlzdHMoKSkgewotCQkJCXJldHVybiBzb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGSUxFX1BBVEgpKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhERUZBVUxUX0FDQ0VTUykpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1VOSVQpKSB7Ci0JCQlQZXJzaXN0ZW5jZVVuaXQgcFVuaXQgPSBnZXREZWZhdWx0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQlpZiAocFVuaXQgIT0gbnVsbCkgewotCQkJCXJldHVybiBwVW5pdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlib29sZWFuIG9rID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShTT1VSQ0VfRk9MREVSLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUEVSU0lTVEVOQ0VfVU5JVCwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBFUlNJU1RFTkNFX1VOSVQsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhBRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCkpIHsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUEVSU0lTVEVOQ0VfVU5JVCwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJfQotCQlyZXR1cm4gb2s7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmFycmF5KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPElQcm9qZWN0LCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I+KGpwYUlQcm9qZWN0cygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHRyYW5zZm9ybShJUHJvamVjdCBuZXh0KSB7Ci0JCQkJCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihuZXh0LmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9LAotCQkJCW5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF0pOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoREVGQVVMVF9BQ0NFU1MpKSB7Ci0JCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBhY2Nlc3NUeXBlcyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbM107Ci0JCQlhY2Nlc3NUeXBlc1swXSA9IGFjY2Vzc1Byb3BlcnR5RGVzY3JpcHRvcihudWxsKTsKLQkJCWFjY2Vzc1R5cGVzWzFdID0gYWNjZXNzUHJvcGVydHlEZXNjcmlwdG9yKEFjY2Vzc1R5cGUuRklFTEQpOwotCQkJYWNjZXNzVHlwZXNbMl0gPSBhY2Nlc3NQcm9wZXJ0eURlc2NyaXB0b3IoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCQlyZXR1cm4gYWNjZXNzVHlwZXM7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9VTklUKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5hcnJheSgKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4obmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4obnVsbCwgcGVyc2lzdGVuY2VVbml0TmFtZXMoKSkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0UHJvcGVydHlEZXNjcmlwdG9yKG5leHQpOwotCQkJCQl9Ci0JCQkJfSwKLQkJCQluZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdKTsKLQkJCQkKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewotCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhERUZBVUxUX0FDQ0VTUykpIHsKLQkJCXJldHVybiBhY2Nlc3NQcm9wZXJ0eURlc2NyaXB0b3IoKEFjY2Vzc1R5cGUpIGdldFByb3BlcnR5KERFRkFVTFRfQUNDRVNTKSk7IAotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVU5JVCkpIHsKLQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eURlc2NyaXB0b3IoZ2V0U3RyaW5nUHJvcGVydHkoUEVSU0lTVEVOQ0VfVU5JVCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgYWNjZXNzUHJvcGVydHlEZXNjcmlwdG9yKEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSkgewotCQlpZiAoYWNjZXNzVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihudWxsLCBKcHRDb3JlTWVzc2FnZXMuTk9ORSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoYWNjZXNzVHlwZSwgYWNjZXNzVHlwZS5nZXROYW1lKCkpOwotCX0KLQkKLQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgcGVyc2lzdGVuY2VVbml0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwZXJzaXN0ZW5jZVVuaXROYW1lKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHBlcnNpc3RlbmNlVW5pdE5hbWUpKSB7Ci0JCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihudWxsLCBKcHRDb3JlTWVzc2FnZXMuTk9ORSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocGVyc2lzdGVuY2VVbml0TmFtZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTkFNRSkKLQkJCQl8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFNPVVJDRV9GT0xERVIpCi0JCQkJfHwgcHJvcGVydHlOYW1lLmVxdWFscyhGSUxFX1BBVEgpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVQcm9qZWN0U291cmNlRm9sZGVyQW5kRmlsZVBhdGgoKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEFERF9UT19QRVJTSVNURU5DRV9VTklUKQotCQkJCXx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVU5JVCkpIHsKLQkJCXJldHVybiB2YWxpZGF0ZVBlcnNpc3RlbmNlVW5pdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0U291cmNlRm9sZGVyQW5kRmlsZVBhdGgoKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpIGdldFByb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHByb2plY3ROYW1lKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCUpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9QUk9KRUNUX05PVF9TUEVDSUZJRUQpOwotCQl9Ci0JCVN0cmluZyBzb3VyY2VGb2xkZXJQYXRoID0gZ2V0U3RyaW5nUHJvcGVydHkoU09VUkNFX0ZPTERFUik7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHNvdXJjZUZvbGRlclBhdGgpKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfU09VUkNFX0ZPTERFUl9OT1RfU1BFQ0lGSUVEKTsKLQkJfQotCQlpZiAoc291cmNlRm9sZGVySXNJbGxlZ2FsKHNvdXJjZUZvbGRlclBhdGgpKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfU09VUkNFX0ZPTERFUl9JTExFR0FMKTsKLQkJfQotCQlpZiAoc291cmNlRm9sZGVyTm90SW5Qcm9qZWN0KHNvdXJjZUZvbGRlclBhdGgpKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlOTFMuYmluZCgKLQkJCQkJSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX1NPVVJDRV9GT0xERVJfTk9UX0lOX1BST0pFQ1QsIAotCQkJCQlzb3VyY2VGb2xkZXJQYXRoLCBwcm9qZWN0TmFtZSkpOwotCQl9Ci0JCWlmIChnZXRWZXJpZmllZFNvdXJjZUZvbGRlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCU5MUy5iaW5kKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9TT1VSQ0VfRk9MREVSX0RPRVNfTk9UX0VYSVNULCBzb3VyY2VGb2xkZXJQYXRoKSk7Ci0JCX0KLQkJaWYgKGdldFZlcmlmaWVkSmF2YVNvdXJjZUZvbGRlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCU5MUy5iaW5kKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9TT1VSQ0VfRk9MREVSX05PVF9TT1VSQ0VfRk9MREVSLCBzb3VyY2VGb2xkZXJQYXRoKSk7Ci0JCX0KLQkJaWYgKGdldEV4aXN0aW5nT3JtRmlsZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCUpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9PUk1fRklMRV9BTFJFQURZX0VYSVNUUyk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJYm9vbGVhbiBhZGRUb1BVbml0ID0gZ2V0Qm9vbGVhblByb3BlcnR5KEFERF9UT19QRVJTSVNURU5DRV9VTklUKTsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJU3RyaW5nIHBVbml0TmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KFBFUlNJU1RFTkNFX1VOSVQpOwotCQlpZiAoYWRkVG9QVW5pdCkgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocFVuaXROYW1lKSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJTkxTLmJpbmQoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX1BFUlNJU1RFTkNFX1VOSVRfRE9FU19OT1RfU1BFQ0lGSUVELCBwVW5pdE5hbWUpKTsKLQkJCX0KLQkJCWlmIChnZXRQZXJzaXN0ZW5jZVVuaXQoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQlOTFMuYmluZChKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfUEVSU0lTVEVOQ0VfVU5JVF9OT1RfSU5fUFJPSkVDVCwgcFVuaXROYW1lLCBwcm9qZWN0TmFtZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGhlbHBlciBtZXRob2RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLy8gQ29waWVkIGZyb20gQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHByb2plY3ROYW1lKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBiZXN0IGd1ZXNzIGphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0Ci0JICovCi0JLy8gQ29waWVkIGZyb20gTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIKLQlwcml2YXRlIElGb2xkZXIgZ2V0RGVmYXVsdFNvdXJjZUZvbGRlcigpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U291cmNlQ29udGFpbmVycyhwcm9qZWN0KTsKLQkJLy8gVHJ5IGFuZCByZXR1cm4gdGhlIGZpcnN0IHNvdXJjZSBmb2xkZXIKLQkJaWYgKHNvdXJjZXMubGVuZ3RoID4gMCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKElGb2xkZXIpIHNvdXJjZXNbMF0uZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGF0aCBwcm92aWRlZCBjYW4gbm90IGJlIGEgdmFsaWQgSUZvbGRlciBwYXRoCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNvdXJjZUZvbGRlcklzSWxsZWdhbChTdHJpbmcgZm9sZGVyUGF0aCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJQYXRoKSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwYXRoIHByb3ZpZGVkIGlzIGluIHRoZSBjdXJyZW50IHByb2plY3QKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc291cmNlRm9sZGVyTm90SW5Qcm9qZWN0KFN0cmluZyBmb2xkZXJQYXRoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlJRm9sZGVyIGZvbGRlcjsKLQkJdHJ5IHsKLQkJCWZvbGRlciA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJQYXRoKSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICEgcHJvamVjdC5lcXVhbHMoZm9sZGVyLmdldFByb2plY3QoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBJRm9sZGVyIHJlcHJlc2VudGVkIGJ5IHRoZSBTT1VSQ0VfRk9MREVSIHByb3BlcnR5LCB2ZXJpZmllZAotCSAqIHRvIGV4aXN0Ci0JICovCi0JcHJpdmF0ZSBJRm9sZGVyIGdldFZlcmlmaWVkU291cmNlRm9sZGVyKCkgewotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldFN0cmluZ1Byb3BlcnR5KFNPVVJDRV9GT0xERVIpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJRm9sZGVyIGZvbGRlcjsKLQkJdHJ5IHsKLQkJCWZvbGRlciA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJQYXRoKSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZm9sZGVyID09IG51bGwgfHwgISBmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBmb2xkZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc291cmNlIGZvbGRlciwgcHJvdmlkZWQgaXQgaXMgdmVyaWZpZWQgdG8gYmUgYW4gYWN0dWFsIGphdmEKLQkgKiBzb3VyY2UgZm9sZGVyCi0JICovCi0JcHJpdmF0ZSBJRm9sZGVyIGdldFZlcmlmaWVkSmF2YVNvdXJjZUZvbGRlcigpIHsKLQkJSUZvbGRlciBmb2xkZXIgPSBnZXRWZXJpZmllZFNvdXJjZUZvbGRlcigpOwotCQlpZiAoZm9sZGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlKYXZhUHJvamVjdCBqUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShnZXRQcm9qZWN0KCkpOwotCQlpZiAoalByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IGpQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZm9sZGVyKTsKLQkJaWYgKHBhY2thZ2VGcmFnbWVudFJvb3QgPT0gbnVsbCB8fCAhIHBhY2thZ2VGcmFnbWVudFJvb3QuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBmb2xkZXI7Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgZ2V0RXhpc3RpbmdPcm1GaWxlKCkgewotCQlJRm9sZGVyIGZvbGRlciA9IGdldFZlcmlmaWVkU291cmNlRm9sZGVyKCk7Ci0JCWlmIChmb2xkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGZpbGVQYXRoID0gZ2V0U3RyaW5nUHJvcGVydHkoRklMRV9QQVRIKTsKLQkJSUZpbGUgZXhpc3RpbmdGaWxlID0gZm9sZGVyLmdldEZpbGUobmV3IFBhdGgoZmlsZVBhdGgpKTsKLQkJaWYgKCEgZXhpc3RpbmdGaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZXhpc3RpbmdGaWxlOwotCX0KLQkKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBnZXREZWZhdWx0UGVyc2lzdGVuY2VVbml0KCkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBnZXRKcGFQcm9qZWN0KCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCWlmIChwZXJzaXN0ZW5jZVhtbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCk7Ci0JCWlmIChwZXJzaXN0ZW5jZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAocGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0c1NpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0cygpLm5leHQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlTdHJpbmcgcFVuaXROYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoUEVSU0lTVEVOQ0VfVU5JVCk7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IAotCQkJKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocFVuaXROYW1lKSkgPyBudWxsIDogZ2V0SnBhUHJvamVjdCgpOwotCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IAotCQkJKGpwYVByb2plY3QgPT0gbnVsbCkgPyBudWxsIDoganBhUHJvamVjdC5nZXRSb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gCi0JCQkocGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgPyBudWxsIDogcGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJaWYgKHBlcnNpc3RlbmNlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBzdHJlYW0gPSBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZVVuaXRzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVBlcnNpc3RlbmNlVW5pdCBuZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAocFVuaXROYW1lLmVxdWFscyhuZXh0LmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIG5leHQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIEl0ZXJhdG9yPElQcm9qZWN0PiBqcGFJUHJvamVjdHMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SVByb2plY3QsIElQcm9qZWN0PihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0cygpKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVByb2plY3QgcHJvamVjdCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQocHJvamVjdCwgSnB0Q29yZVBsdWdpbi5GQUNFVF9JRCk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgSXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxJUHJvamVjdCwgSXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0Pj4oanBhSVByb2plY3RzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiB0cmFuc2Zvcm0oSVByb2plY3QganBhSVByb2plY3QpIHsKLQkJCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KGpwYUlQcm9qZWN0KTsKLQkJCQkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwgPSAKLQkJCQkJCShqcGFQcm9qZWN0ID09IG51bGwpID8gbnVsbCA6IGpwYVByb2plY3QuZ2V0Um9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQkJCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IAotCQkJCQkJKHBlcnNpc3RlbmNlWG1sID09IG51bGwpID8gbnVsbCA6IHBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCk7Ci0JCQkJCXJldHVybiAocGVyc2lzdGVuY2UgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhdG9yLjxQZXJzaXN0ZW5jZVVuaXQ+aW5zdGFuY2UoKSA6IHBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlVW5pdHMoKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IHBlcnNpc3RlbmNlVW5pdE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KHBlcnNpc3RlbmNlVW5pdHMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXQgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmFjYWFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24KLQlpbXBsZW1lbnRzIE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQlwdWJsaWMgT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBDcmVhdGUgc291cmNlIGZvbGRlciBpZiBpdCBkb2VzIG5vdCBleGlzdAotCQlJRm9sZGVyIGZvbGRlciA9IGNyZWF0ZVNvdXJjZUZvbGRlcigpOwotCQkvLyBDcmVhdGUgb3JtIGZpbGUKLQkJY3JlYXRlT3JtWG1sKGZvbGRlcik7Ci0JCS8vIEFkZCBvcm0gZmlsZSB0byBwZXJzaXN0ZW5jZSB1bml0IGlmIHNwZWNpZmllZAotCQlhZGRPcm1YbWxUb1BlcnNpc3RlbmNlWG1sKCk7Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiTm8gcHJvamVjdCBuYW1lIHNwZWNpZmllZCIpOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQlwcml2YXRlIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIlByb2plY3QgZG9lcyBub3QgaGF2ZSBKUEEgY29udGVudCIpOwotCQl9Ci0JCXJldHVybiBqcGFQcm9qZWN0OwotCX0KLQkKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHBVbml0TmFtZSA9IGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KFBFUlNJU1RFTkNFX1VOSVQpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBnZXRKcGFQcm9qZWN0KCk7Ci0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCWlmIChwZXJzaXN0ZW5jZVhtbCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJQcm9qZWN0IGRvZXMgbm90IGhhdmUgYSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIpOwotCQl9Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJaWYgKHBlcnNpc3RlbmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oInBlcnNpc3RlbmNlLnhtbCBkb2VzIG5vdCBoYXZlIGEgcGVyc2lzdGVuY2Ugbm9kZS4iKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4gc3RyZWFtID0gcGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0cygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVBlcnNpc3RlbmNlVW5pdCBwVW5pdCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAocFVuaXROYW1lLmVxdWFscyhwVW5pdC5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHBVbml0OwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oInBlcnNpc3RlbmNlLnhtbCBkb2VzIG5vdCBoYXZlIHBlcnNpc3RlbmNlIHVuaXQgbmFtZWQgXCciICsgcFVuaXROYW1lICsgIlwnIik7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzb3VyY2UgZm9sZGVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGF0YSBtb2RlbC4gCi0JICogSXQgd2lsbCBjcmVhdGUgdGhlIHNvdXJjZSBmb2xkZXIgaWYgaXQgZG9lcyBub3QgZXhpc3QuIEl0IHdpbGwgbm90IGFkZAotCSAqIGl0IGFzIGEgc291cmNlIGZvbGRlciB0byB0aGUgcHJvamVjdCBidWlsZCBwYXRoIGlmIGl0IGlzIG5vdCBhbHJlYWR5LgotCSAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4KLQkgKi8KLQkvLyBjb3BpZWQgZnJvbSBOZXdKYXZhQ2xhc3NPcGVyYXRpb24KLQlwcml2YXRlIElGb2xkZXIgY3JlYXRlU291cmNlRm9sZGVyKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIEdldCB0aGUgc291cmNlIGZvbGRlciBuYW1lIGZyb20gdGhlIGRhdGEgbW9kZWwKLQkJU3RyaW5nIGZvbGRlclBhdGggPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShTT1VSQ0VfRk9MREVSKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIobmV3IFBhdGgoZm9sZGVyUGF0aCkpOwotCQkvLyBJZiBmb2xkZXIgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSB0aGUgZm9sZGVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXRoCi0JCWlmICghIGZvbGRlci5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBmb2xkZXIiLCBlKTsKLQkJCX0KLQkJfQotCQkvLyBSZXR1cm4gdGhlIHNvdXJjZSBmb2xkZXIKLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9ybVhtbChJRm9sZGVyIGZvbGRlcikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlUGF0aCA9IGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KEZJTEVfUEFUSCk7Ci0JCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChmaWxlUGF0aCkpOwotCQlPcm1BcnRpZmFjdEVkaXQgb2FlID0gT3JtQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCU9ybVJlc291cmNlIG9ybVJlc291cmNlID0gb2FlLmdldFJlc291cmNlKGZpbGUpOwotCQlYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCWVudGl0eU1hcHBpbmdzLnNldFZlcnNpb24oIjEuMCIpOwotCQlvcm1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChlbnRpdHlNYXBwaW5ncyk7Ci0JCQotCQlBY2Nlc3NUeXBlIGRlZmF1bHRBY2Nlc3MgPSAoQWNjZXNzVHlwZSkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoREVGQVVMVF9BQ0NFU1MpOyAKLQkJaWYgKGRlZmF1bHRBY2Nlc3MgIT0gbnVsbCkgewotCQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcHVNZXRhZGF0YSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCQllbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShwdU1ldGFkYXRhKTsKLQkJCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHB1RGVmYXVsdHMgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQkJcHVNZXRhZGF0YS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwdURlZmF1bHRzKTsKLQkJCXB1RGVmYXVsdHMuc2V0QWNjZXNzKGRlZmF1bHRBY2Nlc3MpOwotCQl9Ci0JCQotCQlvYWUuc2F2ZShudWxsKTsKLQkJb2FlLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE9ybVhtbFRvUGVyc2lzdGVuY2VYbWwoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKCEgZ2V0RGF0YU1vZGVsKCkuZ2V0Qm9vbGVhblByb3BlcnR5KEFERF9UT19QRVJTSVNURU5DRV9VTklUKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdHJpbmcgZmlsZVBhdGggPSBnZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShGSUxFX1BBVEgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcFVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJZm9yIChJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gc3RyZWFtID0gcFVuaXQuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGZpbGVQYXRoLmVxdWFscyhzdHJlYW0ubmV4dCgpLmdldEZpbGVOYW1lKCkpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCU1hcHBpbmdGaWxlUmVmIG1mUmVmID0gcFVuaXQuYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWZSZWYuc2V0RmlsZU5hbWUobmV3IFBhdGgoZmlsZVBhdGgpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQotCQlQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBwYWUgPSBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQlwYWUuZ2V0UmVzb3VyY2UoKElGaWxlKSBwVW5pdC5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCXBhZS5zYXZlKG51bGwpOwotCQlwYWUuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9HZW5lcmljRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9HZW5lcmljRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5OGE5OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vR2VuZXJpY0VudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci0KLS8qKgotICogU2luZ2xldG9uIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSBkYiBvYmplY3QgcGFzc2VkIGluLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR2VuZXJpY0VudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyCi0JaW1wbGVtZW50cyBFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgSU5TVEFOQ0UKLQkJCQk9IG5ldyBHZW5lcmljRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKTsKLQotCXB1YmxpYyBzdGF0aWMgRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JcHJpdmF0ZSBHZW5lcmljRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBidWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGVudGl0eU5hbWUsIFRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiB0YWJsZS5nZXRBbm5vdGF0aW9uSWRlbnRpZmllcihlbnRpdHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbi5nZXRBbm5vdGF0aW9uSWRlbnRpZmllcihhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJcmV0dXJuIGZvcmVpZ25LZXkuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gY29sdW1uLmdldEFubm90YXRpb25JZGVudGlmaWVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBidWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKFRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiB0YWJsZS5nZXRBbm5vdGF0aW9uSWRlbnRpZmllcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0dlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9HZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOTQ4NjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0dlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlc0ltcGwuQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlSW1wbC5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVzSW1wbC5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkJhc2ljSW1wbC5CYXNpY0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQ29sdW1uSW1wbC5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5JbXBsLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JWYWx1ZUltcGwuRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlSW1wbC5FbWJlZGRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkSW1wbC5FbWJlZGRlZElkQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbWJlZGRlZEltcGwuRW1iZWRkZWRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVudGl0eUltcGwuRW50aXR5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkSW1wbC5FbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUltcGwuR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLklkQ2xhc3NJbXBsLklkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLklkSW1wbC5JZEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VJbXBsLkluaGVyaXRhbmNlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uSW1wbC5Kb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uc0ltcGwuSm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUltcGwuSm9pblRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Mb2JJbXBsLkxvYkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTWFueVRvTWFueUltcGwuTWFueVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTWFueVRvT25lSW1wbC5NYW55VG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk1hcEtleUltcGwuTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzSW1wbC5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJpZXNJbXBsLk5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyeUltcGwuTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTmFtZWRRdWVyaWVzSW1wbC5OYW1lZFF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlJbXBsLk5hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUltcGwuT25lVG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5PbmVUb09uZUltcGwuT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk9yZGVyQnlJbXBsLk9yZGVyQnlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uSW1wbC5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5zSW1wbC5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlSW1wbC5TZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVzSW1wbC5TZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9ySW1wbC5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuVGFibGVHZW5lcmF0b3JJbXBsLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5UYWJsZUltcGwuVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsSW1wbC5UZW1wb3JhbEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuVHJhbnNpZW50SW1wbC5UcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlZlcnNpb25JbXBsLlZlcnNpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIEpwYUFubm90YXRpb25Qcm92aWRlcgotewotCS8qKgotCSAqIE9yZGVyZWQgbGlzdCBvZiBwb3NzaWJsZSB0eXBlIG1hcHBpbmcgYW5ub3RhdGlvbnMuICBPcmRlcmVkIGJlY2F1c2UgdGhpcwotCSAqIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtYXBwaW5nIGluIHRoZSBjYXNlIHdoZXJlIDIgbWFwcGluZyBhbm5vdGF0aW9ucyBleGlzdAotCSAqLwotCXByaXZhdGUgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gdHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEFubm90YXRpb25EZWZpbml0aW9uPiB0eXBlQW5ub3RhdGlvbkRlZmluaXRpb25zOwotCQotCS8qKgotCSAqIE9yZGVyZWQgbGlzdCBvZiBwb3NzaWJsZSBhdHRyaWJ1dGUgbWFwcGluZyBhbm5vdGF0aW9ucy4gIE9yZGVyZWQgYmVjYXVzZSB0aGlzCi0JICogaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG1hcHBpbmcgaW4gdGhlIGNhc2Ugd2hlcmUgMiBtYXBwaW5nIGFubm90YXRpb25zIGV4aXN0Ci0JICovCi0JcHJpdmF0ZSBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zOwotCQotCQotCXByb3RlY3RlZCBHZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiB0eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMudHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy50eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0JCQl0aGlzLmFkZFR5cGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zVG8odGhpcy50eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4odGhpcy50eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucyk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCB0eXBlIG1hcHBpbmcgZGVmaW5pdGlvbnMuCi0JICogVGhlIGRlZmF1bHQgaW5jbHVkZXMgdGhlIEpQQSBzcGVjLWRlZmluZWQgdHlwZSBtYXBwaW5ncyBvZiAKLQkgKiBFbWJlZGRhYmxlLCBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9uc1RvKExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChFbWJlZGRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFbnRpdHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiB0eXBlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy50eXBlQW5ub3RhdGlvbkRlZmluaXRpb25zID09IG51bGwpIHsKLQkJCXRoaXMudHlwZUFubm90YXRpb25EZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0JCQl0aGlzLmFkZFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyh0aGlzLnR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMpOwotCQl9Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4odGhpcy50eXBlQW5ub3RhdGlvbkRlZmluaXRpb25zKTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzcGVjaWZ5IG1vcmUgb3IgZGlmZmVyZW50IHR5cGUgYW5ub3RhdGlvbiBkZWZpbml0aW9ucy4KLQkgKiBUaGUgZGVmYXVsdCBpbmNsdWRlcyB0aGUgSlBBIHNwZWMtZGVmaW5lZCBhbm5vdGF0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oQ29sbGVjdGlvbjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChJZENsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChJbmhlcml0YW5jZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoTmFtZWRRdWVyeUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoTmFtZWRRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChUYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLmF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPigpOwotCQkJdGhpcy5hZGRBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zVG8odGhpcy5hdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zKTsKLQkJfQotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPih0aGlzLmF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMpOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbnMuCi0JICogVGhlIGRlZmF1bHQgaW5jbHVkZXMgdGhlIEpQQSBzcGVjLWRlZmluZWQgYXR0cmlidXRlIG1hcHBpbmdzIG9mIAotCSAqIEJhc2ljLCBJZCwgVHJhbnNpZW50IE9uZVRvT25lLCBPbmVUb01hbnksIE1hbnlUb09uZSwgTWFueVRvTWFueSwgRW1iZWRkZWQsIEVtYmVkZGVkSWQsIFZlcnNpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9uc1RvKExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChCYXNpY0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRW1iZWRkZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVtYmVkZGVkSWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKElkQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChNYW55VG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChNYW55VG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9uZVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoVmVyc2lvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+IGF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zID09IG51bGwpIHsKLQkJCXRoaXMuYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLQkJCXRoaXMuYWRkQXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zVG8odGhpcy5hdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMpOwotCQl9Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4odGhpcy5hdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMpOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgYXR0cmlidXRlIGFubm90YXRpb24gZGVmaW5pdGlvbnMuCi0JICogVGhlIGRlZmF1bHQgaW5jbHVkZXMgdGhlIEpQQSBzcGVjLWRlZmluZWQgYW5ub3RhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oQ29sbGVjdGlvbjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVudW1lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSm9pblRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChMb2JBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE1hcEtleUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChUZW1wb3JhbEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKioqKiBJSnBhUGxhdGZvcm0gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRUeXBlTWFwcGluZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUsIFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSB0eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9uKG1hcHBpbmdBbm5vdGF0aW9uTmFtZSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5idWlsZEFubm90YXRpb24ocGFyZW50LCB0eXBlKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsVHlwZU1hcHBpbmdBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlLCBTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uID0gdHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbihtYXBwaW5nQW5ub3RhdGlvbk5hbWUpOwotCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb24uYnVpbGROdWxsQW5ub3RhdGlvbihwYXJlbnQsIHR5cGUpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkVHlwZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IHR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5idWlsZEFubm90YXRpb24ocGFyZW50LCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxUeXBlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uID0gdHlwZUFubm90YXRpb25EZWZpbml0aW9uKGFubm90YXRpb25OYW1lKTsKLQkJcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uLmJ1aWxkTnVsbEFubm90YXRpb24ocGFyZW50LCB0eXBlKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHR5cGVNYXBwaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uLCBTdHJpbmc+KHR5cGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQW5ub3RhdGlvbkRlZmluaXRpb24gbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmdldEFubm90YXRpb25OYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IHR5cGVBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbiwgU3RyaW5nPih0eXBlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQW5ub3RhdGlvbkRlZmluaXRpb24gbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmdldEFubm90YXRpb25OYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSBhdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb24obWFwcGluZ0Fubm90YXRpb25OYW1lKTsKLQkJcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uLmJ1aWxkQW5ub3RhdGlvbihwYXJlbnQsIGF0dHJpYnV0ZSk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSBhdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb24uYnVpbGROdWxsQW5ub3RhdGlvbihwYXJlbnQsIGF0dHJpYnV0ZSk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQXR0cmlidXRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uID0gYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb24uYnVpbGRBbm5vdGF0aW9uKHBhcmVudCwgYXR0cmlidXRlKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQXR0cmlidXRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uID0gYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb24uYnVpbGROdWxsQW5ub3RhdGlvbihwYXJlbnQsIGF0dHJpYnV0ZSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uLCBTdHJpbmc+KGF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShBbm5vdGF0aW9uRGVmaW5pdGlvbiBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24sIFN0cmluZz4oYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQW5ub3RhdGlvbkRlZmluaXRpb24gbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmdldEFubm90YXRpb25OYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgQW5ub3RhdGlvbkRlZmluaXRpb24gdHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiBpID0gdHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJQW5ub3RhdGlvbkRlZmluaXRpb24gZGVmaW5pdGlvbiA9IGkubmV4dCgpOwotCQkJaWYgKGRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMobWFwcGluZ0Fubm90YXRpb25OYW1lKSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWFwcGluZ0Fubm90YXRpb25OYW1lICsgIiBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlIG1hcHBpbmcgYW5ub3RhdGlvbiIpOwotCX0KLQkKLQlwcml2YXRlIEFubm90YXRpb25EZWZpbml0aW9uIHR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJZm9yIChJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gaSA9IHR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJQW5ub3RhdGlvbkRlZmluaXRpb24gZGVmaW5pdGlvbiA9IGkubmV4dCgpOwotCQkJaWYgKGRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihhbm5vdGF0aW9uTmFtZSArICIgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSBhbm5vdGF0aW9uIik7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdBbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKExpc3RJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gaSA9IGF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJQW5ub3RhdGlvbkRlZmluaXRpb24gZGVmaW5pdGlvbiA9IGkubmV4dCgpOwotCQkJaWYgKGRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMobWFwcGluZ0Fubm90YXRpb25OYW1lKSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWFwcGluZ0Fubm90YXRpb25OYW1lICsgIiBpcyBhbiB1bnN1cHBvcnRlZCBhdHRyaWJ1dGUgbWFwcGluZyBhbm5vdGF0aW9uIik7CQotCX0KLQkKLQlwcml2YXRlIEFubm90YXRpb25EZWZpbml0aW9uIGF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiBpID0gYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCUFubm90YXRpb25EZWZpbml0aW9uIGRlZmluaXRpb24gPSBpLm5leHQoKTsKLQkJCWlmIChkZWZpbml0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oYW5ub3RhdGlvbk5hbWUgKyAiIGlzIGFuIHVuc3VwcG9ydGVkIGF0dHJpYnV0ZSBhbm5vdGF0aW9uIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0dlbmVyaWNKcGFGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vR2VuZXJpY0pwYUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1MDNkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vR2VuZXJpY0pwYUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTnVsbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1YbWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY0NsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY01hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY1BlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5EZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKcGFGYWN0b3J5IGltcGxlbWVudHMgSnBhRmFjdG9yeQotewotCXByb3RlY3RlZCBHZW5lcmljSnBhRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBDb3JlIG9iamVjdHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQcm9qZWN0KGNvbmZpZyk7Ci0JfQotCQotCXB1YmxpYyBKcGFEYXRhU291cmNlIGJ1aWxkSnBhRGF0YVNvdXJjZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIFN0cmluZyBjb25uZWN0aW9uUHJvZmlsZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhRGF0YVNvdXJjZShqcGFQcm9qZWN0LCBjb25uZWN0aW9uUHJvZmlsZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgSnBhRmlsZSBidWlsZEpwYUZpbGUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlLCBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhRmlsZShqcGFQcm9qZWN0LCBmaWxlLCByZXNvdXJjZU1vZGVsKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBSZXNvdXJjZSBvYmplY3RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gaGFzUmVsZXZhbnRDb250ZW50KElGaWxlIGZpbGUpIHsKLQkJaWYgKCEgSmF2YUNvcmUuY3JlYXRlKGZpbGUuZ2V0UHJvamVjdCgpKS5pc09uQ2xhc3NwYXRoKGZpbGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gdGhpcy5jb250ZW50VHlwZShmaWxlKTsKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IGNvbnRlbnRUeXBlLmdldElkKCk7Ci0JCXJldHVybiBzdXBwb3J0c0NvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCXJldHVybiBjb250ZW50VHlwZUlkLmVxdWFscyhKYXZhQ29yZS5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpCi0JCQkJfHwgY29udGVudFR5cGVJZC5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKQotCQkJCXx8IGNvbnRlbnRUeXBlSWQuZXF1YWxzKEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgUmVzb3VyY2VNb2RlbCBidWlsZFJlc291cmNlTW9kZWwoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlKSB7Ci0JCWlmICghIEphdmFDb3JlLmNyZWF0ZShqcGFQcm9qZWN0LmdldFByb2plY3QoKSkuaXNPbkNsYXNzcGF0aChmaWxlKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGZpbGUiICsgZmlsZSArICIgaXMgbm90IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aCIpOwotCQl9Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IHRoaXMuY29udGVudFR5cGUoZmlsZSk7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZmlsZSIgKyBmaWxlICsgIiBkb2VzIG5vdCBoYXZlIGEgc3VwcG9ydGVkIGNvbnRlbnQgdHlwZSIpOwotCQl9Ci0JCVN0cmluZyBjb250ZW50VHlwZUlkID0gY29udGVudFR5cGUuZ2V0SWQoKTsKLQkJcmV0dXJuIGJ1aWxkUmVzb3VyY2VNb2RlbChqcGFQcm9qZWN0LCBmaWxlLCBjb250ZW50VHlwZUlkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlTW9kZWwgYnVpbGRSZXNvdXJjZU1vZGVsKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJaWYgKEphdmFDb3JlLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRS5lcXVhbHMoY29udGVudFR5cGVJZCkpIHsKLQkJCXJldHVybiBidWlsZEphdmFSZXNvdXJjZU1vZGVsKGpwYVByb2plY3QsIGZpbGUpOwotCQl9Ci0JCWVsc2UgaWYgKEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRS5lcXVhbHMoY29udGVudFR5cGVJZCkpIHsKLQkJCXJldHVybiBidWlsZFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbChmaWxlKTsKLQkJfQotCQllbHNlIGlmIChKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLmVxdWFscyhjb250ZW50VHlwZUlkKSkgewotCQkJcmV0dXJuIGJ1aWxkT3JtUmVzb3VyY2VNb2RlbChmaWxlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBSZXNvdXJjZU1vZGVsIGJ1aWxkSmF2YVJlc291cmNlTW9kZWwoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBuZXcgSmF2YVJlc291cmNlTW9kZWxJbXBsKAotCQkJCWZpbGUsIGpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSwgCi0JCQkJanBhUHJvamVjdC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCksCi0JCQkJRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUmVzb3VyY2VNb2RlbCBidWlsZFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbChJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsKGZpbGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUmVzb3VyY2VNb2RlbCBidWlsZE9ybVJlc291cmNlTW9kZWwoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gbmV3IE9ybVJlc291cmNlTW9kZWwoZmlsZSk7Ci0JfQotCQotCS8vIGF0dGVtcHRpbmcgdG8gZ2V0IHRoZSBjb250ZW50VHlwZSBiYXNlZCBvbiB0aGUgZmlsZSBjb250ZW50cy4KLQkvLyBoYXZlIHRvIGNoZWNrIHRoZSBmaWxlIGNvbnRlbnRzIGluc3RlYWQgb2YganVzdCB0aGUgZmlsZSBuYW1lCi0JLy8gYmVjYXVzZSBmb3IgeG1sIHdlIGJhc2UgaXQgb24gdGhlIHJvb3RFbGVtZW50IG5hbWUKLQlwcml2YXRlIElDb250ZW50VHlwZSBjb250ZW50VHlwZShJRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGZpbGUuZ2V0Q29udGVudHMoKSwgZmlsZS5nZXROYW1lKCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogQ29udGV4dCBvYmplY3RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFSb290Q29udGV4dE5vZGUgYnVpbGRSb290Q29udGV4dChKcGFQcm9qZWN0IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNSb290Q29udGV4dE5vZGUocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sIGJ1aWxkUGVyc2lzdGVuY2VYbWwoSnBhUm9vdENvbnRleHROb2RlIHBhcmVudCwgUGVyc2lzdGVuY2VSZXNvdXJjZSBwZXJzaXN0ZW5jZVJlc291cmNlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY1BlcnNpc3RlbmNlWG1sKHBhcmVudCwgcGVyc2lzdGVuY2VSZXNvdXJjZSk7Ci0JfQotCQotCXB1YmxpYyBPcm1YbWwgYnVpbGRPcm1YbWwoTWFwcGluZ0ZpbGVSZWYgcGFyZW50LCBPcm1SZXNvdXJjZSBvcm1SZXNvdXJjZSkgewotCQlyZXR1cm4gbmV3IE9ybVhtbEltcGwocGFyZW50LCBvcm1SZXNvdXJjZSk7Ci0JfQotCQotCXB1YmxpYyBFbnRpdHlNYXBwaW5ncyBidWlsZEVudGl0eU1hcHBpbmdzKE9ybVhtbCBwYXJlbnQsIFhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0VudGl0eU1hcHBpbmdzKHBhcmVudCwgeG1sRW50aXR5TWFwcGluZ3MpOwotCX0KLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgYnVpbGRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFbnRpdHlNYXBwaW5ncyBwYXJlbnQsIFhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKHBhcmVudCwgeG1sRW50aXR5TWFwcGluZ3MpOwotCX0KLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwYXJlbnQsIFhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKHBhcmVudCwgeG1sRW50aXR5TWFwcGluZ3MpOwotCX0KLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2UgYnVpbGRQZXJzaXN0ZW5jZShQZXJzaXN0ZW5jZVhtbCBwYXJlbnQsIFhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY1BlcnNpc3RlbmNlKHBhcmVudCwgeG1sUGVyc2lzdGVuY2UpOwotCX0KLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGJ1aWxkUGVyc2lzdGVuY2VVbml0KFBlcnNpc3RlbmNlIHBhcmVudCwgWG1sUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQocGFyZW50LCBwZXJzaXN0ZW5jZVVuaXQpOwotCX0KLQkKLQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWYgYnVpbGRNYXBwaW5nRmlsZVJlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNNYXBwaW5nRmlsZVJlZihwYXJlbnQsIHhtbE1hcHBpbmdGaWxlUmVmKTsKLQl9Ci0JCi0JcHVibGljIENsYXNzUmVmIGJ1aWxkQ2xhc3NSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0NsYXNzUmVmKHBhcmVudCwgY2xhc3NSZWYpOwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NSZWYgYnVpbGRDbGFzc1JlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0NsYXNzUmVmKHBhcmVudCwgY2xhc3NOYW1lKTsKLQl9Ci0JCi0JcHVibGljIFByb3BlcnR5IGJ1aWxkUHJvcGVydHkoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sUHJvcGVydHkgeG1sUHJvcGVydHkpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljUHJvcGVydHkocGFyZW50LCB4bWxQcm9wZXJ0eSk7Ci0JfQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZShwYXJlbnQsIHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVHlwZU1hcHBpbmcgYnVpbGRKYXZhTnVsbFR5cGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhTnVsbFR5cGVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhRW50aXR5IGJ1aWxkSmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFFbnRpdHkocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YU1hcHBlZFN1cGVyY2xhc3MgYnVpbGRKYXZhTWFwcGVkU3VwZXJjbGFzcyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFNYXBwZWRTdXBlcmNsYXNzKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIEphdmFFbWJlZGRhYmxlIGJ1aWxkSmF2YUVtYmVkZGFibGUoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRW1iZWRkYWJsZShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVRhYmxlIGJ1aWxkSmF2YVRhYmxlKEphdmFFbnRpdHkgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFUYWJsZShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUNvbHVtbiBidWlsZEphdmFDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUNvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQ29sdW1uKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4gYnVpbGRKYXZhRGlzY3JpbWluYXRvckNvbHVtbihKYXZhRW50aXR5IHBhcmVudCwgSmF2YU5hbWVkQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFEaXNjcmltaW5hdG9yQ29sdW1uKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gYnVpbGRKYXZhSm9pbkNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhSm9pbkNvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhSm9pbkNvbHVtbihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIEphdmFKb2luVGFibGUgYnVpbGRKYXZhSm9pblRhYmxlKEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhSm9pblRhYmxlKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhU2Vjb25kYXJ5VGFibGUgYnVpbGRKYXZhU2Vjb25kYXJ5VGFibGUoSmF2YUVudGl0eSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVNlY29uZGFyeVRhYmxlKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhQmFzaWNNYXBwaW5nIGJ1aWxkSmF2YUJhc2ljTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUJhc2ljTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGJ1aWxkSmF2YUVtYmVkZGVkSWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFFbWJlZGRlZE1hcHBpbmcgYnVpbGRKYXZhRW1iZWRkZWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhSWRNYXBwaW5nIGJ1aWxkSmF2YUlkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUlkTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGJ1aWxkSmF2YU1hbnlUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFNYW55VG9PbmVNYXBwaW5nIGJ1aWxkSmF2YU1hbnlUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhT25lVG9NYW55TWFwcGluZyBidWlsZEphdmFPbmVUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YU9uZVRvT25lTWFwcGluZyBidWlsZEphdmFPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFUcmFuc2llbnRNYXBwaW5nIGJ1aWxkSmF2YVRyYW5zaWVudE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFUcmFuc2llbnRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVmVyc2lvbk1hcHBpbmcgYnVpbGRKYXZhVmVyc2lvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkSmF2YVNlcXVlbmNlR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGFibGVHZW5lcmF0b3IgYnVpbGRKYXZhVGFibGVHZW5lcmF0b3IoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhVGFibGVHZW5lcmF0b3IocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFHZW5lcmF0ZWRWYWx1ZSBidWlsZEphdmFHZW5lcmF0ZWRWYWx1ZShKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUJhc2VKb2luQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBidWlsZEphdmFBdHRyaWJ1dGVPdmVycmlkZShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBBdHRyaWJ1dGVPdmVycmlkZS5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGUocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBidWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhTmFtZWRRdWVyeSBidWlsZEphdmFOYW1lZFF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU5hbWVkUXVlcnkocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFOYW1lZE5hdGl2ZVF1ZXJ5IGJ1aWxkSmF2YU5hbWVkTmF0aXZlUXVlcnkoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTmFtZWROYXRpdmVRdWVyeShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVF1ZXJ5SGludCBidWlsZEphdmFRdWVyeUhpbnQoSmF2YVF1ZXJ5IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUXVlcnlIaW50KHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVW5pcXVlQ29uc3RyYWludCBidWlsZEphdmFVbmlxdWVDb25zdHJhaW50KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVVuaXF1ZUNvbnN0cmFpbnQocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBidWlsZE9ybVBlcnNpc3RlbnRUeXBlKEVudGl0eU1hcHBpbmdzIHBhcmVudCwgU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtUGVyc2lzdGVudFR5cGUocGFyZW50LCBtYXBwaW5nS2V5KTsKLQl9Ci0JCi0JcHVibGljIE9ybUVudGl0eSBidWlsZE9ybUVudGl0eShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtRW50aXR5KHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1NYXBwZWRTdXBlcmNsYXNzIGJ1aWxkT3JtTWFwcGVkU3VwZXJjbGFzcyhPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTWFwcGVkU3VwZXJjbGFzcyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgT3JtRW1iZWRkYWJsZSBidWlsZE9ybUVtYmVkZGFibGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUVtYmVkZGFibGUocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShwYXJlbnQsIG1hcHBpbmdLZXkpOwotCX0KLQkKLQlwdWJsaWMgT3JtVGFibGUgYnVpbGRPcm1UYWJsZShPcm1FbnRpdHkgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVRhYmxlKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1TZWNvbmRhcnlUYWJsZSBidWlsZE9ybVNlY29uZGFyeVRhYmxlKE9ybUVudGl0eSBwYXJlbnQsIFhtbFNlY29uZGFyeVRhYmxlIHhtbFNlY29uZGFyeVRhYmxlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlKHBhcmVudCwgeG1sU2Vjb25kYXJ5VGFibGUpOwotCX0KLQkKLQlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbihPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybUJhc2VKb2luQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgT3JtSm9pblRhYmxlIGJ1aWxkT3JtSm9pblRhYmxlKE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUpvaW5UYWJsZShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgT3JtSm9pbkNvbHVtbiBidWlsZE9ybUpvaW5Db2x1bW4oT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPcm1Kb2luQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUpvaW5Db2x1bW4ocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVPdmVycmlkZSBidWlsZE9ybUF0dHJpYnV0ZU92ZXJyaWRlKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgb3duZXIsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlIHhtbEF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlKHBhcmVudCwgb3duZXIsIHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQl9Ci0JCi0JcHVibGljIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lciBvd25lciwgWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUocGFyZW50LCBvd25lciwgeG1sQXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JfQotCQotCXB1YmxpYyBPcm1EaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkT3JtRGlzY3JpbWluYXRvckNvbHVtbihPcm1FbnRpdHkgcGFyZW50LCBPcm1OYW1lZENvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1EaXNjcmltaW5hdG9yQ29sdW1uKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgT3JtQ29sdW1uIGJ1aWxkT3JtQ29sdW1uKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3JtQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUNvbHVtbihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIE9ybUdlbmVyYXRlZFZhbHVlIGJ1aWxkT3JtR2VuZXJhdGVkVmFsdWUoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvciBidWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgT3JtVGFibGVHZW5lcmF0b3IgYnVpbGRPcm1UYWJsZUdlbmVyYXRvcihPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVGFibGVHZW5lcmF0b3IocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybU5hbWVkTmF0aXZlUXVlcnkgYnVpbGRPcm1OYW1lZE5hdGl2ZVF1ZXJ5KE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1OYW1lZE5hdGl2ZVF1ZXJ5KHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1OYW1lZFF1ZXJ5IGJ1aWxkT3JtTmFtZWRRdWVyeShPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTmFtZWRRdWVyeShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgT3JtUXVlcnlIaW50IGJ1aWxkT3JtUXVlcnlIaW50KE9ybVF1ZXJ5IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1RdWVyeUhpbnQocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybUJhc2ljTWFwcGluZyBidWlsZE9ybUJhc2ljTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1CYXNpY01hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybUVtYmVkZGVkTWFwcGluZyBidWlsZE9ybUVtYmVkZGVkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybUVtYmVkZGVkSWRNYXBwaW5nIGJ1aWxkT3JtRW1iZWRkZWRJZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtRW1iZWRkZWRJZE1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybUlkTWFwcGluZyBidWlsZE9ybUlkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1JZE1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybU1hbnlUb01hbnlNYXBwaW5nIGJ1aWxkT3JtTWFueVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybU1hbnlUb09uZU1hcHBpbmcgYnVpbGRPcm1NYW55VG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybU9uZVRvTWFueU1hcHBpbmcgYnVpbGRPcm1PbmVUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybU9uZVRvT25lTWFwcGluZyBidWlsZE9ybU9uZVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybVRyYW5zaWVudE1hcHBpbmcgYnVpbGRPcm1UcmFuc2llbnRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVRyYW5zaWVudE1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybVZlcnNpb25NYXBwaW5nIGJ1aWxkT3JtVmVyc2lvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVmVyc2lvbk1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRPcm1OdWxsQXR0cmlidXRlTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgT3JtVW5pcXVlQ29uc3RyYWludCBidWlsZE9ybVVuaXF1ZUNvbnN0cmFpbnQoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBVbmlxdWVDb25zdHJhaW50Lk93bmVyIG93bmVyLCBYbWxVbmlxdWVDb25zdHJhaW50IHhtbFVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVW5pcXVlQ29uc3RyYWludChwYXJlbnQsIG93bmVyLCB4bWxVbmlxdWVDb25zdHJhaW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vR2VuZXJpY0pwYVBsYXRmb3JtLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vR2VuZXJpY0pwYVBsYXRmb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNDM2NzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0dlbmVyaWNKcGFQbGF0Zm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW50aXR5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFOdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTnVsbFR5cGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYVBsYXRmb3JtCi0JaW1wbGVtZW50cyBKcGFQbGF0Zm9ybQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImdlbmVyaWMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBpZDsKLQotCXByb3RlY3RlZCBKcGFGYWN0b3J5IGpwYUZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBMaXN0PEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyPiBqYXZhVHlwZU1hcHBpbmdQcm92aWRlcnM7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBqYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyczsKLQotCXByb3RlY3RlZCBMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBkZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnM7Ci0KLQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY0pwYVBsYXRmb3JtKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQotCS8qKgotCSAqICoqKioqKioqKioqKioKLQkgKiAqIElNUE9SVEFOVCAqICAgRm9yIElOVEVSTkFMIHVzZSBvbmx5ICEhCi0JICogKioqKioqKioqKioqKgotCSAqIAotCSAqIEBzZWUgSnBhUGxhdGZvcm0jc2V0SWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyB0aGVJZCkgewotCQl0aGlzLmlkID0gdGhlSWQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIE1vZGVsIGNvbnN0cnVjdGlvbi91cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCBKcGFGYWN0b3J5IGdldEpwYUZhY3RvcnkoKSB7Ci0JCWlmICh0aGlzLmpwYUZhY3RvcnkgPT0gbnVsbCkgewotCQkJdGhpcy5qcGFGYWN0b3J5ID0gdGhpcy5idWlsZEpwYUZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5qcGFGYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCBKcGFGYWN0b3J5IGJ1aWxkSnBhRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBKcGFGaWxlIGJ1aWxkSnBhRmlsZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUpIHsKLQkJaWYgKHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmhhc1JlbGV2YW50Q29udGVudChmaWxlKSkgewotCQkJUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsID0gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRSZXNvdXJjZU1vZGVsKGpwYVByb2plY3QsIGZpbGUpOwotCQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSnBhRmlsZShqcGFQcm9qZWN0LCBmaWxlLCByZXNvdXJjZU1vZGVsKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogSmF2YSBhbm5vdGF0aW9uIHN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJaWYgKHRoaXMuYW5ub3RhdGlvblByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRoaXMuYW5ub3RhdGlvblByb3ZpZGVyID0gdGhpcy5idWlsZEFubm90YXRpb25Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25Qcm92aWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogVHlwZSBtYXBwaW5nIHByb3ZpZGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIEphdmFUeXBlTWFwcGluZyBidWlsZEphdmFUeXBlTWFwcGluZ0Zyb21NYXBwaW5nS2V5KFN0cmluZyB0eXBlTWFwcGluZ0tleSwgSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5qYXZhVHlwZU1hcHBpbmdQcm92aWRlckZyb21NYXBwaW5nS2V5KHR5cGVNYXBwaW5nS2V5KS5idWlsZE1hcHBpbmcocGFyZW50LCB0aGlzLmdldEpwYUZhY3RvcnkoKSk7Ci0JfQotCi0JcHVibGljIEphdmFUeXBlTWFwcGluZyBidWlsZEphdmFUeXBlTWFwcGluZ0Zyb21Bbm5vdGF0aW9uKFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUsIEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVR5cGVNYXBwaW5nUHJvdmlkZXJGcm9tQW5ub3RhdGlvbihtYXBwaW5nQW5ub3RhdGlvbk5hbWUpLmJ1aWxkTWFwcGluZyhwYXJlbnQsIHRoaXMuZ2V0SnBhRmFjdG9yeSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEl0ZXJhdG9yPEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyPiBqYXZhVHlwZU1hcHBpbmdQcm92aWRlcnMoKSB7Ci0JCWlmICh0aGlzLmphdmFUeXBlTWFwcGluZ1Byb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQl0aGlzLmphdmFUeXBlTWFwcGluZ1Byb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8SmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI+KCk7Ci0JCQl0aGlzLmFkZEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyc1RvKHRoaXMuamF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzKTsKLQkJfQotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8SmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI+KHRoaXMuamF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgdHlwZSBtYXBwaW5nIHByb3ZpZGVycy4KLQkgKiBUaGUgZGVmYXVsdCBpbmNsdWRlcyB0aGUgSlBBIHNwZWMtZGVmaW5lZCB0eXBlIG1hcHBpbmdzIG9mIAotCSAqIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcywgYW5kIEVtYmVkZGFibGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhVHlwZU1hcHBpbmdQcm92aWRlcnNUbyhMaXN0PEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJcHJvdmlkZXJzLmFkZChKYXZhRW50aXR5UHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhRW1iZWRkYWJsZVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFOdWxsVHlwZU1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIgamF2YVR5cGVNYXBwaW5nUHJvdmlkZXJGcm9tTWFwcGluZ0tleShTdHJpbmcgdHlwZU1hcHBpbmdLZXkpIHsKLQkJZm9yIChJdGVyYXRvcjxKYXZhVHlwZU1hcHBpbmdQcm92aWRlcj4gc3RyZWFtID0gdGhpcy5qYXZhVHlwZU1hcHBpbmdQcm92aWRlcnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlKYXZhVHlwZU1hcHBpbmdQcm92aWRlciBwcm92aWRlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAocHJvdmlkZXIuZ2V0S2V5KCkgPT0gdHlwZU1hcHBpbmdLZXkpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCB0eXBlIG1hcHBpbmcga2V5OiAiICsgdHlwZU1hcHBpbmdLZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyIGphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyRnJvbUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8SmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI+IHN0cmVhbSA9IHRoaXMuamF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIgcHJvdmlkZXIgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHByb3ZpZGVyLmdldEFubm90YXRpb25OYW1lKCkgPT0gYW5ub3RhdGlvbk5hbWUpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBhbm5vdGF0aW9uIG5hbWU6ICIgKyBhbm5vdGF0aW9uTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogQXR0cmlidXRlIG1hcHBpbmcgcHJvdmlkZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhQXR0cmlidXRlTWFwcGluZ0Zyb21NYXBwaW5nS2V5KFN0cmluZyBhdHRyaWJ1dGVNYXBwaW5nS2V5LCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlckZyb21NYXBwaW5nS2V5KGF0dHJpYnV0ZU1hcHBpbmdLZXkpLmJ1aWxkTWFwcGluZyhwYXJlbnQsIHRoaXMuZ2V0SnBhRmFjdG9yeSgpKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhQXR0cmlidXRlTWFwcGluZ0Zyb21Bbm5vdGF0aW9uKFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyRnJvbUFubm90YXRpb24obWFwcGluZ0Fubm90YXRpb25OYW1lKS5idWlsZE1hcHBpbmcocGFyZW50LCB0aGlzLmdldEpwYUZhY3RvcnkoKSk7Ci0JfQotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcihwYXJlbnQpLmJ1aWxkTWFwcGluZyhwYXJlbnQsIHRoaXMuZ2V0SnBhRmFjdG9yeSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IGphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCkgewotCQlpZiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPigpOwotCQkJdGhpcy5hZGRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyc1RvKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMpOwotCQl9Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPih0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgYXR0cmlidXRlIG1hcHBpbmcgcHJvdmlkZXJzLgotCSAqIFRoZSBkZWZhdWx0IGluY2x1ZGVzIHRoZSBKUEEgc3BlYy1kZWZpbmVkIGF0dHJpYnV0ZSBtYXBwaW5ncyBvZiAKLQkgKiBCYXNpYywgSWQsIFRyYW5zaWVudCBPbmVUb09uZSwgT25lVG9NYW55LCBNYW55VG9PbmUsIE1hbnlUb01hbnksIEVtYmVkZGFibGUsIEVtYmVkZGVkSWQsIFZlcnNpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnNUbyhMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEphdmFCYXNpY01hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YUVtYmVkZGVkSWRNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YUlkTWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFNYW55VG9NYW55TWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFNYW55VG9PbmVNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YU9uZVRvTWFueU1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVRyYW5zaWVudE1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhVmVyc2lvbk1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBqYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyRnJvbU1hcHBpbmdLZXkoU3RyaW5nIGF0dHJpYnV0ZU1hcHBpbmdLZXkpIHsKLQkJZm9yIChJdGVyYXRvcjxKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBzdHJlYW0gPSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBwcm92aWRlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAocHJvdmlkZXIuZ2V0S2V5KCkgPT0gYXR0cmlidXRlTWFwcGluZ0tleSkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGF0dHJpYnV0ZSBtYXBwaW5nIGtleTogIiArIGF0dHJpYnV0ZU1hcHBpbmdLZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlckZyb21Bbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IHN0cmVhbSA9IHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIHByb3ZpZGVyID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChwcm92aWRlci5nZXRBbm5vdGF0aW9uTmFtZSgpID09IGFubm90YXRpb25OYW1lKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgYW5ub3RhdGlvbiBuYW1lOiAiICsgYW5ub3RhdGlvbk5hbWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBMaXN0SXRlcmF0b3I8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IGRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXRoaXMuZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4oKTsKLQkJCXRoaXMuYWRkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzVG8odGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMpOwotCQl9Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+KHRoaXMuZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgZGVmYXVsdCBhdHRyaWJ1dGUgbWFwcGluZyBwcm92aWRlcnMuCi0JICogVGhlIGRlZmF1bHQgaW5jbHVkZXMgdGhlIEpQQSBzcGVjLWRlZmluZWQgYXR0cmlidXRlIG1hcHBpbmdzIG9mIAotCSAqIEVtYmVkZGVkIGFuZCBCYXNpYy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnNUbyhMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJcHJvdmlkZXJzLmFkZChKYXZhRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7ICAvLyBidWcgMTkwMzQ0IG5lZWQgdG8gdGVzdCBkZWZhdWx0IGVtYmVkZGVkIGJlZm9yZSBiYXNpYwotCQlwcm92aWRlcnMuYWRkKEphdmFCYXNpY01hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBkZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCWZvciAoSXRlcmF0b3I8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IHN0cmVhbSA9IHRoaXMuZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgcHJvdmlkZXIgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHByb3ZpZGVyLmRlZmF1bHRBcHBsaWVzKHBlcnNpc3RlbnRBdHRyaWJ1dGUpKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmdldE51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0tleShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKHBlcnNpc3RlbnRBdHRyaWJ1dGUpLmdldEtleSgpOwotCX0KLQotCS8qKgotCSAqIHRoZSAibnVsbCIgYXR0cmlidXRlIG1hcHBpbmcgaXMgdXNlZCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgbmVpdGhlcgotCSAqIG1vZGlmaWVkIHdpdGggYSBtYXBwaW5nIGFubm90YXRpb24gbm9yIG1hcHBlZCBieSBhICJkZWZhdWx0IiBtYXBwaW5nCi0JICovCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgZ2V0TnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcigpIHsKLQkJcmV0dXJuIEphdmFOdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKEpwYVByb2plY3QgcHJvamVjdCwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJcHJvamVjdC5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogRGF0YWJhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEpwdERiUGx1Z2luLmluc3RhbmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIEVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGdldEVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkgewotCQlyZXR1cm4gR2VuZXJpY0VudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIERhdGFiYXNlRmluZGVyIGdldERhdGFiYXNlRmluZGVyKCkgewotCQlyZXR1cm4gRGF0YWJhc2VGaW5kZXIuRGVmYXVsdC5pbnN0YW5jZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtUmVnaXN0cnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MjEzZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIFNpbmdsZXRvbiByZWdpc3RyeSBmb3Igc3RvcmluZyBhbGwgdGhlIHJlZ2lzdGVyZWQgSlBBIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24KLSAqIGVsZW1lbnRzIGFuZCBpbnN0YW50aWF0aW5nIEpQQSBwbGF0Zm9ybXMgZnJvbSB0aGVtLgotICovCi1wdWJsaWMgY2xhc3MgSnBhUGxhdGZvcm1SZWdpc3RyeSB7Ci0KLQlwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGpwYVBsYXRmb3JtQ29uZmlndXJhdGlvbkVsZW1lbnRzOwotCi0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IEpwYVBsYXRmb3JtUmVnaXN0cnkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1SZWdpc3RyeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fSUQgPSAianBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1BMQVRGT1JNID0gImpwYVBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVF9MQUJFTCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVF9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCSAqLwotCXByaXZhdGUgSnBhUGxhdGZvcm1SZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQbGF0Zm9ybUNvbmZpZ3VyYXRpb25FbGVtZW50cyA9IHRoaXMuYnVpbGRKcGFQbGF0Zm9ybUNvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCX0KLQkKLQkKLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGJ1aWxkSnBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHMoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGNvbmZpZ0VsZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0JCWZvciAoSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBzdHJlYW0gPSB0aGlzLmNvbmZpZ0VsZW1lbnRzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5hZGRDb25maWdFbGVtZW50VG8oc3RyZWFtLm5leHQoKSwgY29uZmlnRWxlbWVudHMpOwotCQl9Ci0JCXJldHVybiBjb25maWdFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgZnJvbSB0aGUgRWNsaXBzZSBwbGF0Zm9ybSBleHRlbnNpb24KLQkgKiByZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPElDb25maWd1cmF0aW9uRWxlbWVudD4gY29uZmlnRWxlbWVudHMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxJRXh0ZW5zaW9uLCBJdGVyYXRvcjxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+Pih0aGlzLmV4dGVuc2lvbnMoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPElDb25maWd1cmF0aW9uRWxlbWVudD4gdHJhbnNmb3JtKElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJRXh0ZW5zaW9uPiBleHRlbnNpb25zKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKHRoaXMuZXh0ZW5zaW9uUG9pbnQoKS5nZXRFeHRlbnNpb25zKCkpOwotCX0KLQotCXByaXZhdGUgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50KCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX0lEKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29uZmlnRWxlbWVudFRvKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50LCBIYXNoTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBjb25maWdFbGVtZW50cykgewotCQlpZiAoICEgY29uZmlnRWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMX1BMQVRGT1JNKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICggISB0aGlzLmNvbmZpZ0VsZW1lbnRJc1ZhbGlkKGNvbmZpZ0VsZW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9JRCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBwcmV2ID0gY29uZmlnRWxlbWVudHMuZ2V0KGlkKTsKLQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJY29uZmlnRWxlbWVudHMucHV0KGlkLCBjb25maWdFbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubG9nRHVwbGljYXRlUGxhdGZvcm0ocHJldiwgY29uZmlnRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayAqYWxsKiBhdHRyaWJ1dGVzIGJlZm9yZSByZXR1cm5pbmcKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29uZmlnRWxlbWVudElzVmFsaWQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0JCWlmIChjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9JRCkgPT0gbnVsbCkgewotCQkJdGhpcy5sb2dNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0lEKTsKLQkJCXZhbGlkID0gZmFsc2U7Ci0JCX0KLQkJaWYgKGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0xBQkVMKSA9PSBudWxsKSB7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0xBQkVMKTsKLQkJCXZhbGlkID0gZmFsc2U7Ci0JCX0KLQkJaWYgKGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0NMQVNTKSA9PSBudWxsKSB7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0NMQVNTKTsKLQkJCXZhbGlkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElEcyBmb3IgdGhlIHJlZ2lzdGVyZWQgSlBBIHBsYXRmb3Jtcy4KLQkgKiBUaGlzIGRvZXMgbm90IGFjdGl2YXRlIGFueSBvZiB0aGUgSlBBIHBsYXRmb3JtcycgcGx1Zy1pbnMuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4ganBhUGxhdGZvcm1JZHMoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxTdHJpbmc+KHRoaXMuanBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHMua2V5U2V0KCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGxhdGZvcm0gaWQgaXMgcmVnaXN0ZXJlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUGxhdGZvcm0oU3RyaW5nIHBsYXRmb3JtSWQpIHsKLQkJcmV0dXJuIHRoaXMuanBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHMuY29udGFpbnNLZXkocGxhdGZvcm1JZCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbGFiZWwgZm9yIHRoZSBKUEEgcGxhdGZvcm0gd2l0aCB0aGUgc3BlY2lmaWVkIElELgotCSAqIFRoaXMgZG9lcyBub3QgYWN0aXZhdGUgdGhlIEpQQSBwbGF0Zm9ybSdzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKcGFQbGF0Zm9ybUxhYmVsKFN0cmluZyBpZCkgewotCQlyZXR1cm4gdGhpcy5qcGFQbGF0Zm9ybUNvbmZpZ3VyYXRpb25FbGVtZW50cy5nZXQoaWQpLmdldEF0dHJpYnV0ZShBVF9MQUJFTCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSUQgZm9yIGEgSlBBIHBsYXRmb3JtIHJlZ2lzdGVyZWQgYXMgYSBkZWZhdWx0IHBsYXRmb3JtLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm8gc3VjaCByZWdpc3RlcmVkIHBsYXRmb3Jtcy4KLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBwbGF0Zm9ybSBJRCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3VjaCByZWdpc3RlcmVkIHBsYXRmb3Jtcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRKcGFQbGF0Zm9ybUlkKCkgewotCQlmb3IgKFN0cmluZyBwbGF0Zm9ybUlkIDoganBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHMua2V5U2V0KCkpIHsKLQkJCWlmICgidHJ1ZSIuZXF1YWxzKGpwYVBsYXRmb3JtQ29uZmlndXJhdGlvbkVsZW1lbnRzLmdldChwbGF0Zm9ybUlkKS5nZXRBdHRyaWJ1dGUoQVRfREVGQVVMVCkpKSB7Ci0JCQkJcmV0dXJuIHBsYXRmb3JtSWQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBKUEEgcGxhdGZvcm0gZm9yIHRoZSBzcGVjaWZpZWQgSUQuCi0JICogTkI6IFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5zdGFudGlhdGluZyBhIEpQQSBwbGF0Zm9ybQotCSAqIHdoZW4gYnVpbGRpbmcgYSBuZXcgSlBBIHByb2plY3QuCi0JICogVW5saWtlIG90aGVyIHJlZ2lzdHJ5IG1ldGhvZHMsIGludm9raW5nIHRoaXMgbWV0aG9kIG1heSBhY3RpdmF0ZSAKLQkgKiB0aGUgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgSnBhUGxhdGZvcm0gZ2V0SnBhUGxhdGZvcm0oU3RyaW5nIGlkKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gdGhpcy5qcGFQbGF0Zm9ybUNvbmZpZ3VyYXRpb25FbGVtZW50cy5nZXQoaWQpOwotCQlpZiAoY29uZmlnRWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGlkKTsKLQkJfQotCQlKcGFQbGF0Zm9ybSBwbGF0Zm9ybTsKLQkJdHJ5IHsKLQkJCXBsYXRmb3JtID0gKEpwYVBsYXRmb3JtKSBjb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRfQ0xBU1MpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aGlzLmxvZ0ZhaWxlZEluc3RhbnRpYXRpb24oY29uZmlnRWxlbWVudCwgZXgpOwotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihpZCk7Ci0JCX0KLQkJcGxhdGZvcm0uc2V0SWQoaWQpOwotCQlyZXR1cm4gcGxhdGZvcm07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVycm9ycyAqKioqKioqKioqCi0KLQkvLyBUT0RPIGV4dGVybmFsaXplIHN0cmluZ3MKLQlwcml2YXRlIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSAKLQkJCSJBbiBleHRlbnNpb24gZWxlbWVudCBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXROYW1lKCkKLQkJCSsgIlwiIGluIHBsdWdpbiBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKQotCQkJKyAiXCIgaXMgbWlzc2luZyBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBcIiIKLQkJCSsgYXR0cmlidXRlTmFtZQotCQkJKyAiXCIuIjsKLQkJSnB0Q29yZVBsdWdpbi5sb2cobWVzc2FnZSk7Ci0JfQotCi0JLy8gVE9ETyBleHRlcm5hbGl6ZSBzdHJpbmdzCi0JcHJpdmF0ZSB2b2lkIGxvZ0R1cGxpY2F0ZVBsYXRmb3JtKElDb25maWd1cmF0aW9uRWxlbWVudCBwcmV2Q29uZmlnRWxlbWVudCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IG5ld0NvbmZpZ0VsZW1lbnQpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPQotCQkJIlRoZSBwbHVnaW5zIFwiIgotCQkJKyBwcmV2Q29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKQotCQkJKyAiXCIgYW5kIFwiIgotCQkJKyBuZXdDb25maWdFbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpCi0JCQkrICJcIiBoYXZlIHJlZ2lzdGVyZWQgYSBkdXBsaWNhdGUgYXR0cmlidXRlIFwiaWRcIiAiCi0JCQkrICJmb3IgdGhlIGV4dGVuc2lvbiBlbGVtZW50IFwianBhUGxhdGZvcm1cIi4iOwotCQlKcHRDb3JlUGx1Z2luLmxvZyhtZXNzYWdlKTsKLQl9Ci0KLQkvLyBUT0RPIGV4dGVybmFsaXplIHN0cmluZ3MKLQlwcml2YXRlIHZvaWQgbG9nRmFpbGVkSW5zdGFudGlhdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgQ29yZUV4Y2VwdGlvbiBleCkgewotCQlTdHJpbmcgbWVzc2FnZSA9Ci0JCQkiQ291bGQgbm90IGluc3RhbnRpYXRlIHRoZSBjbGFzcyBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfQ0xBU1MpCi0JCQkrICJcIiBmb3IgdGhlIGV4dGVuc2lvbiBlbGVtZW50IFwiIgotCQkJKyBjb25maWdFbGVtZW50LmdldE5hbWUoKQotCQkJKyAiXCIgaW4gdGhlIHBsdWdpbiBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKQotCQkJKyAiXCIuIjsKLQkJSnB0Q29yZVBsdWdpbi5sb2cobWVzc2FnZSk7Ci0JCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wcmVmcy9KcGFQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcHJlZnMvSnBhUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTBmZGY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wcmVmcy9KcGFQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnByZWZzOwotCi0vKioKLSAqIENvbnN0YW50IGRlZmluaXRpb25zIGZvciBwbHVnLWluIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFQcmVmZXJlbmNlQ29uc3RhbnRzIAotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfREVGQVVMVF9KUEFfTElCID0gImRlZmF1bHRKcGFMaWIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfREVGQVVMVF9KUEFfUExBVEZPUk0gPSAiZGVmYXVsdEpwYVBsYXRmb3JtIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wcmVmcy9KcGFQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wcmVmcy9KcGFQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRlNGI4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcHJlZnMvSnBhUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnByZWZzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5HZW5lcmljSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBDbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLSAqLwotcHVibGljIGNsYXNzIEpwYVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIAotewotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKEpwdENvcmVQbHVnaW4uaW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQotCQkvLyBkZWZhdWx0IEpQQSBwbGF0Zm9ybQotCQlTdHJpbmcgZGVmYXVsdFBsYXRmb3JtSWQgPSBKcGFQbGF0Zm9ybVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0RGVmYXVsdEpwYVBsYXRmb3JtSWQoKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZGVmYXVsdFBsYXRmb3JtSWQpKSB7Ci0JCQlkZWZhdWx0UGxhdGZvcm1JZCA9IEdlbmVyaWNKcGFQbGF0Zm9ybS5JRDsKLQkJfQotCQlub2RlLnB1dChKcGFQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9KUEFfUExBVEZPUk0sIGRlZmF1bHRQbGF0Zm9ybUlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvY29tbW9uL3RyYW5zbGF0b3JzL0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvY29tbW9uL3RyYW5zbGF0b3JzL0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkY2MxNmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2NvbW1vbi90cmFuc2xhdG9ycy9Cb29sZWFuVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5jb21tb24udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCb29sZWFuVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLXsKLQlwdWJsaWMgQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBCT09MRUFOX0ZFQVRVUkUgfCBCT09MRUFOX0xPV0VSQ0FTRSk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgQk9PTEVBTl9GRUFUVVJFIHwgQk9PTEVBTl9MT1dFUkNBU0UgfCBzdHlsZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2Yoc3RyVmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlyZXR1cm4gKChCb29sZWFuKSB2YWx1ZSkudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0SmF2YVJlc291cmNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGZiOWU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0SmF2YVJlc291cmNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpwYUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNhbGxiYWNrQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotCi0vKioKLSAqIHJlc291cmNlIGNvbnRhaW5tZW50IGhpZXJhcmNoeQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VOb2RlLCBDYWxsYmFja0NoYW5nZVN1cHBvcnQuU291cmNlCi17Ci0JcHJpdmF0ZSBmaW5hbCBKYXZhUmVzb3VyY2VOb2RlIHBhcmVudDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jaGVja1BhcmVudChwYXJlbnQpOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChKYXZhUmVzb3VyY2VOb2RlIHApIHsKLQkJaWYgKHAgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMucmVxdWlyZXNQYXJlbnQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidwYXJlbnQnIGNhbm5vdCBiZSBudWxsIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5mb3JiaWRzUGFyZW50KCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIncGFyZW50JyBtdXN0IGJlIG51bGwiKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3JiaWRzUGFyZW50KCkgewotCQlyZXR1cm4gISB0aGlzLnJlcXVpcmVzUGFyZW50KCk7ICAvLyBhc3N1bWUgJ3BhcmVudCcgaXMgbm90IG9wdGlvbmFsCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IENhbGxiYWNrQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIEpwYUNvbXBpbGF0aW9uVW5pdCBnZXRKcGFDb21waWxhdGlvblVuaXQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudC5nZXRKcGFDb21waWxhdGlvblVuaXQoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpLmdldFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0LlNvdXJjZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQl0aGlzLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpLnJlc291cmNlQ2hhbmdlZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhQ29tcGlsYXRpb25Vbml0KCkuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCk7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFDb21waWxhdGlvblVuaXQoKS5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBnZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpICB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpLmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0SmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDM1NGZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0SmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVE5vZGVUZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29udGFpbmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI8RSBleHRlbmRzIE1lbWJlcj4KLQlleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZQotCWltcGxlbWVudHMgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcgotewkKLQlwcml2YXRlIGZpbmFsIEUgbWVtYmVyOwotCi0JLyoqCi0JICogc3RvcmVzIGFsbCBhbm5vdGF0aW9ucyhub24tbWFwcGluZykgZXhjZXB0IGR1cGxpY2F0ZXMsIGphdmEgY29tcGlsZXIgaGFzIGFuIGVycm9yIGZvciBkdXBsaWNhdGVzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPEFubm90YXRpb24+IGFubm90YXRpb25zOwotCQotCS8qKgotCSAqIHN0b3JlcyBhbGwgbWFwcGluZyBhbm5vdGF0aW9ucyBleGNlcHQgZHVwbGljYXRlcywgamF2YSBjb21waWxlciBoYXMgYW4gZXJyb3IgZm9yIGR1cGxpY2F0ZXMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248QW5ub3RhdGlvbj4gbWFwcGluZ0Fubm90YXRpb25zOwotCQotCXByaXZhdGUgYm9vbGVhbiBwZXJzaXN0YWJsZTsKLQotCUFic3RyYWN0SmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgRSBtZW1iZXIpewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm1lbWJlciA9IG1lbWJlcjsKLQkJdGhpcy5hbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbj4oKTsKLQkJdGhpcy5tYXBwaW5nQW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb24+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlnZXRNZW1iZXIoKS5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkuYWNjZXB0KHRoaXMuYnVpbGRJbml0aWFsQW5ub3RhdGlvblZpc2l0b3IoYXN0Um9vdCkpOwotCQl0aGlzLnBlcnNpc3RhYmxlID0gYnVpbGRQZXJzaXN0YWJsZShhc3RSb290KTsJCQotCX0KLQotCXByb3RlY3RlZCBBU1RWaXNpdG9yIGJ1aWxkSW5pdGlhbEFubm90YXRpb25WaXNpdG9yKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgTG9jYWxBU1RWaXNpdG9yKGFzdFJvb3QsIHRoaXMuZ2V0TWVtYmVyKCkuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHZpc2l0Q2hpbGRBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIG5vZGUpIHsKLQkJCQlBYnN0cmFjdEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIudGhpcy5hZGRJbml0aWFsQW5ub3RhdGlvbihub2RlLCB0aGlzLmFzdFJvb3QpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbml0aWFsQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBub2RlLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmcgcXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUgPSBKRFRUb29scy5yZXNvbHZlQW5ub3RhdGlvbihub2RlKTsKLQkJaWYgKHF1YWxpZmllZEFubm90YXRpb25OYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaXNQb3NzaWJsZUFubm90YXRpb24ocXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQlpZiAoZ2V0QW5ub3RhdGlvbihxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSkgPT0gbnVsbCkgeyAvL2Rvbid0IHdhbnQgZHVwbGljYXRlcwotCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGJ1aWxkQW5ub3RhdGlvbihxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSk7Ci0JCQkJYW5ub3RhdGlvbi5pbml0aWFsaXplKGFzdFJvb3QpOwotCQkJCXRoaXMuYW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb24pOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlzUG9zc2libGVNYXBwaW5nQW5ub3RhdGlvbihxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSkpIHsKLQkJCWlmIChnZXRNYXBwaW5nQW5ub3RhdGlvbihxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSkgPT0gbnVsbCkgeyAvL2Rvbid0IHdhbnQgZHVwbGljYXRlcwotCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGJ1aWxkTWFwcGluZ0Fubm90YXRpb24ocXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUpOwotCQkJCWFubm90YXRpb24uaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJCQl0aGlzLm1hcHBpbmdBbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRSBnZXRNZW1iZXIoKSB7Ci0JCXJldHVybiB0aGlzLm1lbWJlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFubm90YXRpb24gYnVpbGRNYXBwaW5nQW5ub3RhdGlvbihTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQW5ub3RhdGlvbiBidWlsZE51bGxNYXBwaW5nQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IExpc3RJdGVyYXRvcjxTdHJpbmc+IHBvc3NpYmxlTWFwcGluZ0Fubm90YXRpb25OYW1lcygpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNQb3NzaWJsZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc1Bvc3NpYmxlTWFwcGluZ0Fubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFBlcnNpc3RhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldE1lbWJlcigpLmlzUGVyc2lzdGFibGUoYXN0Um9vdCk7Ci0JfQotCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPEFubm90YXRpb24+IGkgPSBhbm5vdGF0aW9ucygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpLm5leHQoKTsKLQkJCWlmIChhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSkgewotCQkJCXJldHVybiBhbm5vdGF0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlTm9kZSBnZXROb25OdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBidWlsZE51bGxBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsJCi0JCX0KLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPEFubm90YXRpb24+IGkgPSBtYXBwaW5nQW5ub3RhdGlvbnMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJQW5ub3RhdGlvbiBtYXBwaW5nQW5ub3RhdGlvbiA9IGkubmV4dCgpOwotCQkJaWYgKG1hcHBpbmdBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSkgewotCQkJCXJldHVybiBtYXBwaW5nQW5ub3RhdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlTm9kZSBnZXROdWxsTWFwcGluZ0Fubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBidWlsZE51bGxNYXBwaW5nQW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7CQotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxBbm5vdGF0aW9uPih0aGlzLmFubm90YXRpb25zKTsKLQl9Ci0JCi0JcHVibGljIGludCBhbm5vdGF0aW9uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYWRkQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYnVpbGRBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsKLQkJdGhpcy5hbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24ubmV3QW5ub3RhdGlvbigpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoQU5OT1RBVElPTlNfQ09MTEVDVElPTiwgYW5ub3RhdGlvbik7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gYWRkQ29udGFpbmVyQW5ub3RhdGlvbihTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIChDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4pIGFkZEFubm90YXRpb24oY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZUFubm90YXRpb24+IGFkZENvbnRhaW5lckFubm90YXRpb25Ud29OZXN0YWJsZUFubm90YXRpb25zKFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gY29udGFpbmVyQW5ub3RhdGlvbiA9IGJ1aWxkQ29udGFpbmVyQW5ub3RhdGlvbihjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JCXRoaXMuYW5ub3RhdGlvbnMuYWRkKGNvbnRhaW5lckFubm90YXRpb24pOwotCQljb250YWluZXJBbm5vdGF0aW9uLm5ld0Fubm90YXRpb24oKTsKLQkJY29udGFpbmVyQW5ub3RhdGlvbi5hZGRJbnRlcm5hbCgwKS5uZXdBbm5vdGF0aW9uKCk7Ci0JCWNvbnRhaW5lckFubm90YXRpb24uYWRkSW50ZXJuYWwoMSkubmV3QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gY29udGFpbmVyQW5ub3RhdGlvbjsKLQl9Ci0JCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gIGJ1aWxkQ29udGFpbmVyQW5ub3RhdGlvbihTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIChDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4pIGJ1aWxkQW5ub3RhdGlvbihjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0Q29udGFpbmVyQW5ub3RhdGlvbihTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIChDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4pIGdldEFubm90YXRpb24oY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uIGdldE5lc3RhYmxlQW5ub3RhdGlvbihTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gKE5lc3RhYmxlQW5ub3RhdGlvbikgZ2V0QW5ub3RhdGlvbihuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE5lc3RhYmxlQW5ub3RhdGlvbiBhZGROZXN0YWJsZUFubm90YXRpb24oU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIChOZXN0YWJsZUFubm90YXRpb24pIGFkZEFubm90YXRpb24obmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JfQotCQotCS8vVE9ETyBpdCBzZWVtcyB3ZSBzaG91bGQgYmUgZmlyaW5nIG9uZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGhlcmUsIHRoYXQgYSBuZXcgbmVzdGFibGUgYW5ub3RhdGlvbiB3YXMgYWRkZWQuCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKGludCBpbmRleCwgU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlOZXN0YWJsZUFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbiA9IChOZXN0YWJsZUFubm90YXRpb24pIGdldEFubm90YXRpb24obmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCQotCQlDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gY29udGFpbmVyQW5ub3RhdGlvbiA9IGdldENvbnRhaW5lckFubm90YXRpb24oY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOwotCQkKLQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24gIT0gbnVsbCkgewotCQkJLy9pZ25vcmUgYW55IG5lc3RhYmxlQW5ub3RhdGlvbiBhbmQganVzdCBhZGQgdG8gdGhlIHBsdXJhbCBvbmUKLQkJCU5lc3RhYmxlQW5ub3RhdGlvbiBuZXdOZXN0ZWRBbm5vdGF0aW9uID0gQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgsIGNvbnRhaW5lckFubm90YXRpb24pOwotCQkJLy9UT0RPIGFueSBldmVudCBub3RpZmljYXRpb24gYmVpbmcgZmlyZWQgZm9yIHRoZSBhZGQ/Pz8KLQkJCXJldHVybiBuZXdOZXN0ZWRBbm5vdGF0aW9uOwotCQl9Ci0JCWlmIChuZXN0ZWRBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCS8vYWRkIHRoZSBuZXN0YWJsZSBzaW5jZSBuZWl0aGVyIG5lc3RhYmxlIG9yIGNvbnRhaW5lciBleGlzdHMKLQkJCXJldHVybiBhZGROZXN0YWJsZUFubm90YXRpb24obmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCX0KLQkJLy9tb3ZlIHRoZSBuZXN0YWJsZSB0byBhIG5ldyBjb250YWluZXIgYW5ub3RhdGlvbiBhbmQgYWRkIHRvIGl0Ci0JCUNvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiBuZXdDb250YWluZXJBbm5vdGF0aW9uID0gYWRkQ29udGFpbmVyQW5ub3RhdGlvblR3b05lc3RhYmxlQW5ub3RhdGlvbnMoY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJbmV3Q29udGFpbmVyQW5ub3RhdGlvbi5uZXN0ZWRBbm5vdGF0aW9uQXQoMSkuaW5pdGlhbGl6ZUZyb20obmVzdGVkQW5ub3RhdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdDb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25BdCgwKS5pbml0aWFsaXplRnJvbShuZXN0ZWRBbm5vdGF0aW9uKTsJCQotCQl9Ci0JCXJlbW92ZUFubm90YXRpb24obmVzdGVkQW5ub3RhdGlvbik7Ci0JCXJldHVybiBuZXdDb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25BdChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQltb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbihjb250YWluZXJBbm5vdGF0aW9uTmFtZSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gY29udGFpbmVyQW5ub3RhdGlvbikgewotCQljb250YWluZXJBbm5vdGF0aW9uLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnN5bmNoQW5ub3RhdGlvbnNBZnRlck1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBjb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJYWRkSXRlbVRvQ29sbGVjdGlvbihhbm5vdGF0aW9uLCB0aGlzLmFubm90YXRpb25zLCBBTk5PVEFUSU9OU19DT0xMRUNUSU9OKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmVtb3ZlQW5ub3RhdGlvbl8oYW5ub3RhdGlvbik7Ci0JCS8vVE9ETyBsb29rcyBvZGQgdGhhdCB3ZSByZW1vdmUgdGhlIGFubm90YXRpb24gaGVyZSwgYnV0IGluIGFkZEFubm90YXRpb24oQW5ub3RhdGlvbikgd2UgZG9uJ3QgZG8gdGhlIHNhbWUKLQkJYW5ub3RhdGlvbi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFubm90YXRpb25fKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oYW5ub3RhdGlvbiwgdGhpcy5hbm5vdGF0aW9ucywgQU5OT1RBVElPTlNfQ09MTEVDVElPTik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1hcHBpbmdBbm5vdGF0aW9uKFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpIHsKLQkJaWYgKGdldE1hcHBpbmdBbm5vdGF0aW9uKG1hcHBpbmdBbm5vdGF0aW9uTmFtZSkgIT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24gPSBidWlsZE1hcHBpbmdBbm5vdGF0aW9uKG1hcHBpbmdBbm5vdGF0aW9uTmFtZSk7Ci0JCWFkZE1hcHBpbmdBbm5vdGF0aW9uKG1hcHBpbmdBbm5vdGF0aW9uKTsKLQkJLy9UT0RPIHNob3VsZCB0aGlzIGJlIGRvbmUgaGVyZSBvciBzaG91bGQgY3JlYXRpbmcgdGhlIEFubm90YXRpb24gZG8gdGhpcz8/Ci0JCW1hcHBpbmdBbm5vdGF0aW9uLm5ld0Fubm90YXRpb24oKTsKLQl9CQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGluZ0Fubm90YXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWFkZEl0ZW1Ub0NvbGxlY3Rpb24oYW5ub3RhdGlvbiwgdGhpcy5tYXBwaW5nQW5ub3RhdGlvbnMsIE1BUFBJTkdfQU5OT1RBVElPTlNfQ09MTEVDVElPTik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1hcHBpbmdBbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZW1vdmVNYXBwaW5nQW5ub3RhdGlvbl8oYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24ucmVtb3ZlQW5ub3RhdGlvbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNYXBwaW5nQW5ub3RhdGlvbl8oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihhbm5vdGF0aW9uLCB0aGlzLm1hcHBpbmdBbm5vdGF0aW9ucywgTUFQUElOR19BTk5PVEFUSU9OU19DT0xMRUNUSU9OKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEFubm90YXRpb24+IG1hcHBpbmdBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPEFubm90YXRpb24+KHRoaXMubWFwcGluZ0Fubm90YXRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG1hcHBpbmdBbm5vdGF0aW9uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmdBbm5vdGF0aW9ucy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlyZW1vdmVBbm5vdGF0aW9uKGFubm90YXRpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiBjb250YWluZXJBbm5vdGF0aW9uID0gZ2V0Q29udGFpbmVyQW5ub3RhdGlvbihjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JCWlmIChjb250YWluZXJBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24obmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCQlyZW1vdmVBbm5vdGF0aW9uKGFubm90YXRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJcmVtb3ZlQW5ub3RhdGlvbihpbmRleCwgY29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihpbnQgaW5kZXgsIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiBjb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCU5lc3RhYmxlQW5ub3RhdGlvbiBuZXN0YWJsZUFubm90YXRpb24gPSBjb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25BdChpbmRleCk7Ci0JCWNvbnRhaW5lckFubm90YXRpb24ucmVtb3ZlKGluZGV4KTsKLQkJLy9UT0RPIG1vdmUgdGhlc2UgMiBsaW5lcyB0byB0aGUgQ29udGFpbmVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiwgaSB0aGluawotCQluZXN0YWJsZUFubm90YXRpb24ucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuc3luY2hBbm5vdGF0aW9uc0FmdGVyUmVtb3ZlKGluZGV4LCBjb250YWluZXJBbm5vdGF0aW9uKTsKLQkJCi0JCWlmIChjb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25zU2l6ZSgpID09IDApIHsKLQkJCXJlbW92ZUFubm90YXRpb24oY29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGFpbmVyQW5ub3RhdGlvbi5uZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSA9PSAxKSB7Ci0JCQlOZXN0YWJsZUFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbiA9IGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbkF0KDApOwotCQkJCi0JCQl0aGlzLmFubm90YXRpb25zLnJlbW92ZShjb250YWluZXJBbm5vdGF0aW9uKTsKLQkJCWNvbnRhaW5lckFubm90YXRpb24ucmVtb3ZlQW5ub3RhdGlvbigpOwotCi0KLQkJCU5lc3RhYmxlQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gKE5lc3RhYmxlQW5ub3RhdGlvbikgYnVpbGRBbm5vdGF0aW9uKGNvbnRhaW5lckFubm90YXRpb24uZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpKTsKLQkJCXRoaXMuYW5ub3RhdGlvbnMuYWRkKG5ld0Fubm90YXRpb24pOwotCQkJbmV3QW5ub3RhdGlvbi5uZXdBbm5vdGF0aW9uKCk7Ci0KLQkJCW5ld0Fubm90YXRpb24uaW5pdGlhbGl6ZUZyb20obmVzdGVkQW5ub3RhdGlvbik7Ci0JCQkKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChBTk5PVEFUSU9OU19DT0xMRUNUSU9OLCBuZXdBbm5vdGF0aW9uKTsKLQkJCWZpcmVJdGVtUmVtb3ZlZChBTk5PVEFUSU9OU19DT0xMRUNUSU9OLCBjb250YWluZXJBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkvLyByZW1vdmVzIGFsbCBvdGhlciAqbWFwcGluZyogYW5ub3RhdGlvbnMgdGhhdCBleGlzdCwgbm90IGp1c3QgdGhlIG9uZSByZXR1cm5lZCBieSBtYXBwaW5nQW5ub3RhdGlvbigpCi0JLy8gbWFwcGluZ0Fubm90YXRpb24oKSByZXR1cm5zIHRoZSBmaXJzdCBtYXBwaW5nIGFubm90YXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZS4gIGlmIHRoZXJlIGFyZSBtdWx0aXBsZQotCS8vIG1hcHBpbmcgYW5ub3RhdGlvbnMgKHdoaWNoIGlzIGEgdmFsaWRhdGlvbiBlcnJvciBjb25kaXRpb24pIHRoZW4gY2FsbGluZyB0aGlzIGFwaSB3b3VsZCBub3Qgd29yawotCS8vIGJlY2F1c2UgdGhlIG5ldyBtYXBwaW5nIGFubm90YXRpbyB3b3VsZCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGFubm90YXRpb25zLgotCXB1YmxpYyB2b2lkIHNldE1hcHBpbmdBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlpZiAoZ2V0TWFwcGluZ0Fubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtYXBwaW5nIGFubm90YXRpb24gbmFtZWQgIiArIGFubm90YXRpb25OYW1lICsgIiBhbHJlYWR5IGV4aXN0cy4iKTsKLQkJfQotCQlBbm5vdGF0aW9uIG9sZE1hcHBpbmcgPSBnZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlBbm5vdGF0aW9uIG5ld01hcHBpbmcgPSBudWxsOwotCQlpZiAob2xkTWFwcGluZyAhPSBudWxsKSB7Ci0JCQlyZW1vdmVVbm5lY2Vzc2FyeUFubm90YXRpb25zKGFubm90YXRpb25OYW1lKTsKLQkJfQotCQlpZiAoYW5ub3RhdGlvbk5hbWUgIT0gbnVsbCkgewotCQkJaWYgKGdldE1hcHBpbmdBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbmV3TWFwcGluZyA9IGJ1aWxkTWFwcGluZ0Fubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQkJdGhpcy5tYXBwaW5nQW5ub3RhdGlvbnMuYWRkKG5ld01hcHBpbmcpOwotCQkJbmV3TWFwcGluZy5uZXdBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJLy9oYXZlIHRvIGhvbGQgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbiB1bnRpbCB0aGUgZW5kIHNvIGEgcHJvamVjdCB1cGRhdGUgZG9lcyBub3Qgb2NjdXIKLQkJLy9iZWZvcmUgd2UgYXJlIGZpbmlzaGVkIHJlbW92aW5nIHRoZSBvbGQgbWFwcGluZyBhbmQgYWRkaW5nIHRoZSBuZXcgbWFwcGluZwotCQkvL2p1c3QgZmlyaW5nIGNvbGxlY3RpbyBjaGFuZ2VkIHNpbmNlIG9uZSBvciBtb3JlIHJlbW92ZXMgYW5kIG9uZSBhZGQgd2FzIGNvbXBsZXRlZC4KLQkJLy9pZiB3ZSBldmVyIGxpc3RlbiBmb3Igc3BlY2lmaWMgZXZlbnRzIGluc3RlYWQgb2YganVzdCBkb2luZyBhIG1hc3MgdXBkYXRlLCB3ZSBtaWdodCBuZWVkIHRvIG1ha2UgdGhpcyBtb3JlIHNwZWNpZmljCi0JCWZpcmVDb2xsZWN0aW9uQ2hhbmdlZChNQVBQSU5HX0FOTk9UQVRJT05TX0NPTExFQ1RJT04pOwotCX0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG1hcHBpbmcgYW5ub3RhdGlvbnMgdGhhdCBhbHJlYWR5IGV4aXN0LgotCSAqIE5vIGNoYW5nZSBub3RpZmljYXRpb24gZmlyZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVW5uZWNlc3NhcnlBbm5vdGF0aW9ucyhTdHJpbmcgbmV3TWFwcGluZ0Fubm90YXRpb25OYW1lKSB7CQotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGkgPSBwb3NzaWJsZU1hcHBpbmdBbm5vdGF0aW9uTmFtZXMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIG1hcHBpbmdBbm5vdGF0aW9uTmFtZSA9IGkubmV4dCgpOwotCQkJaWYgKG1hcHBpbmdBbm5vdGF0aW9uTmFtZSAhPSBuZXdNYXBwaW5nQW5ub3RhdGlvbk5hbWUpIHsKLQkJCQlBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uID0gZ2V0TWFwcGluZ0Fubm90YXRpb24obWFwcGluZ0Fubm90YXRpb25OYW1lKTsKLQkJCQlpZiAobWFwcGluZ0Fubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQl0aGlzLm1hcHBpbmdBbm5vdGF0aW9ucy5yZW1vdmUobWFwcGluZ0Fubm90YXRpb24pOwotCQkJCQltYXBwaW5nQW5ub3RhdGlvbi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8vVE9ETyBuZWVkIHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb24gb24gdGhpcyBtYXBwaW5nQW5ub3RhdGlvbiBjaGFuZ2luZwotCS8vZnJvbSB0aGUgY29udGV4dCBtb2RlbCB3ZSBkb24ndCByZWFsbHkgY2FyZSBpZiB0aGVpciBhcmUgbXVsdGlwbGUgbWFwcGluZyBhbm5vdGF0aW9ucywKLQkvL2p1c3Qgd2hpY2ggb25lIHdlIG5lZWQgdG8gdXNlCi0JcHVibGljIEFubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oKSB7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaSA9IHBvc3NpYmxlTWFwcGluZ0Fubm90YXRpb25OYW1lcygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lID0gaS5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPEFubm90YXRpb24+IGogPSBtYXBwaW5nQW5ub3RhdGlvbnMoKTsgai5oYXNOZXh0KCk7ICkgewotCQkJCUFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24gPSBqLm5leHQoKTsKLQkJCQlpZiAobWFwcGluZ0Fubm90YXRpb25OYW1lID09IG1hcHBpbmdBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpIHsKLQkJCQkJcmV0dXJuIG1hcHBpbmdBbm5vdGF0aW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFubm90YXRpb25zKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lLCBTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24gPSBnZXRDb250YWluZXJBbm5vdGF0aW9uKGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKLQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbnMoKTsKLQkJfQotCQlOZXN0YWJsZUFubm90YXRpb24gbmVzdGFibGVBbm5vdGF0aW9uID0gZ2V0TmVzdGFibGVBbm5vdGF0aW9uKG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQlpZiAobmVzdGFibGVBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+KG5lc3RhYmxlQW5ub3RhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnVwZGF0ZUFubm90YXRpb25zKGFzdFJvb3QpOwotCQl0aGlzLnNldFBlcnNpc3RhYmxlKHRoaXMuYnVpbGRQZXJzaXN0YWJsZShhc3RSb290KSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2V0UGVyc2lzdGFibGUodGhpcy5idWlsZFBlcnNpc3RhYmxlKGFzdFJvb3QpKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBbm5vdGF0aW9ucyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlnZXRNZW1iZXIoKS5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkuYWNjZXB0KHRoaXMuYnVpbGRVcGRhdGVBbm5vdGF0aW9uVmlzaXRvcihhc3RSb290KSk7Ci0JCXJlbW92ZU1hcHBpbmdBbm5vdGF0aW9uc05vdEluU291cmNlKGFzdFJvb3QpOwotCQlyZW1vdmVBbm5vdGF0aW9uc05vdEluU291cmNlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uc05vdEluU291cmNlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFubm90YXRpb25zKCkpKSB7Ci0JCQlpZiAoYW5ub3RhdGlvbi5nZXRKZHRBbm5vdGF0aW9uKGFzdFJvb3QpID09IG51bGwpIHsKLQkJCQlyZW1vdmVBbm5vdGF0aW9uXyhhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1hcHBpbmdBbm5vdGF0aW9uc05vdEluU291cmNlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWZvciAoQW5ub3RhdGlvbiBtYXBwaW5nQW5ub3RhdGlvbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShtYXBwaW5nQW5ub3RhdGlvbnMoKSkpIHsKLQkJCWlmIChtYXBwaW5nQW5ub3RhdGlvbi5nZXRKZHRBbm5vdGF0aW9uKGFzdFJvb3QpID09IG51bGwpIHsKLQkJCQlyZW1vdmVNYXBwaW5nQW5ub3RhdGlvbl8obWFwcGluZ0Fubm90YXRpb24pOwotCQkJfQotCQl9CQotCX0KLQkKLQlwcm90ZWN0ZWQgQVNUVmlzaXRvciBidWlsZFVwZGF0ZUFubm90YXRpb25WaXNpdG9yKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgTG9jYWxBU1RWaXNpdG9yKGFzdFJvb3QsIHRoaXMuZ2V0TWVtYmVyKCkuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHZpc2l0Q2hpbGRBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIG5vZGUpIHsKLQkJCQlBYnN0cmFjdEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIudGhpcy5hZGRPclVwZGF0ZUFubm90YXRpb24obm9kZSwgdGhpcy5hc3RSb290KTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JVcGRhdGVBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIG5vZGUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZyBxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSA9IEpEVFRvb2xzLnJlc29sdmVBbm5vdGF0aW9uKG5vZGUpOwotCQlpZiAocXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChpc1Bvc3NpYmxlQW5ub3RhdGlvbihxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSkpIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24ocXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUpOwotCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCWFubm90YXRpb24udXBkYXRlKGFzdFJvb3QpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYW5ub3RhdGlvbiA9IGJ1aWxkQW5ub3RhdGlvbihxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSk7Ci0JCQkJYW5ub3RhdGlvbi5pbml0aWFsaXplKGFzdFJvb3QpOwotCQkJCWFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7CQkJCQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlzUG9zc2libGVNYXBwaW5nQW5ub3RhdGlvbihxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSkpIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldE1hcHBpbmdBbm5vdGF0aW9uKHF1YWxpZmllZEFubm90YXRpb25OYW1lKTsKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlhbm5vdGF0aW9uLnVwZGF0ZShhc3RSb290KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFubm90YXRpb24gPSBidWlsZE1hcHBpbmdBbm5vdGF0aW9uKHF1YWxpZmllZEFubm90YXRpb25OYW1lKTsKLQkJCQlhbm5vdGF0aW9uLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCQkJYWRkTWFwcGluZ0Fubm90YXRpb24oYW5ub3RhdGlvbik7CQkJCQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoU3RyaW5nIG1lbWJlck5hbWUsIGludCBvY2N1cnJlbmNlKSB7Ci0JCXJldHVybiB0aGlzLm1lbWJlci5tYXRjaGVzKG1lbWJlck5hbWUsIG9jY3VycmVuY2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9yKE1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUsIGludCBvY2N1cnJlbmNlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0YWJsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGVyc2lzdGFibGUoYm9vbGVhbiBuZXdQZXJzaXN0YWJsZSkgewotCQlib29sZWFuIG9sZFBlcnNpc3RhYmxlID0gdGhpcy5wZXJzaXN0YWJsZTsKLQkJdGhpcy5wZXJzaXN0YWJsZSA9IG5ld1BlcnNpc3RhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBFUlNJU1RBQkxFX1BST1BFUlRZLCBvbGRQZXJzaXN0YWJsZSwgbmV3UGVyc2lzdGFibGUpOwotCQkvL1RPRE8gY2hhbmdlIG5vdGlmaWNhdGlvbiB0byBwYXJlbnQgc28gdGhhdCB0aGUgY29udGV4dCBtb2RlbCBnZXRzIG5vdGlmaWNhdGlvbiAKLQkJLy90aGF0IHRoZSBsaXN0IG9mIHBlcnNpc3RhYmxlIGZpZWxkcyBoYXMgYmVlbiB1cGRhdGVkCi0JCS8vCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGVkKCkgewotCQlyZXR1cm4gZ2V0TWFwcGluZ0Fubm90YXRpb24oKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZnVsbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRUZXh0UmFuZ2UodGhpcy5nZXRNZW1iZXIoKS5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmZ1bGxUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldE1lbWJlcigpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKEFTVE5vZGUgYXN0Tm9kZSkgewotCQlyZXR1cm4gKGFzdE5vZGUgPT0gbnVsbCkgPyBudWxsIDogbmV3IEFTVE5vZGVUZXh0UmFuZ2UoYXN0Tm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyA8VCBleHRlbmRzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI+IEl0ZXJhdG9yPFQ+IHBlcnNpc3RhYmxlTWVtYmVycyhJdGVyYXRvcjxUPiBhdHRyaWJ1dGVzKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8VCwgVD4oYXR0cmlidXRlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoVCBhdHRyaWJ1dGUpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlLmlzUGVyc2lzdGFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQVNUIHZpc2l0b3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIExvY2FsQVNUVmlzaXRvciBleHRlbmRzIEFTVFZpc2l0b3IgewotCQlwcm90ZWN0ZWQgZmluYWwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3Q7Ci0JCXByb3RlY3RlZCBmaW5hbCBCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uOwotCi0JCXByb3RlY3RlZCBMb2NhbEFTVFZpc2l0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QsIEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmFzdFJvb3QgPSBhc3RSb290OwotCQkJdGhpcy5ib2R5RGVjbGFyYXRpb24gPSBib2R5RGVjbGFyYXRpb247Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOb3JtYWxBbm5vdGF0aW9uIG5vZGUpIHsKLQkJCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KE1hcmtlckFubm90YXRpb24gbm9kZSkgewotCQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gdmlzaXRfKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIG5vZGUpIHsKLQkJCS8vIGlnbm9yZSBhbm5vdGF0aW9ucyBmb3IgY2hpbGQgbWVtYmVycywgb25seSB0aGlzIG1lbWJlcgotCQkJaWYgKG5vZGUuZ2V0UGFyZW50KCkgPT0gdGhpcy5ib2R5RGVjbGFyYXRpb24pIHsKLQkJCQl0aGlzLnZpc2l0Q2hpbGRBbm5vdGF0aW9uKG5vZGUpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlzaXRDaGlsZEFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSk7Ci0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdE5hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdE5hbWVkQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjgwMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3ROYW1lZENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZENvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROYW1lZENvbHVtbiBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPE1lbWJlcj4gaW1wbGVtZW50cyBOYW1lZENvbHVtbkFubm90YXRpb24KLXsKLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ25hbWUnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKLQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAnY29sdW1uRGVmaW5pdGlvbicgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjb2x1bW5EZWZpbml0aW9uRGVjbGFyYXRpb25BZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY29sdW1uRGVmaW5pdGlvbkFkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIGNvbHVtbkRlZmluaXRpb247Ci0JCi0JcHVibGljIEFic3RyYWN0TmFtZWRDb2x1bW4oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcih0aGlzLm5hbWVFbGVtZW50TmFtZSgpKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRFbGVtZW50QWRhcHRlcih0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmNvbHVtbkRlZmluaXRpb25EZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIodGhpcy5jb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKSk7CQkKLQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRFbGVtZW50QWRhcHRlcih0aGlzLmNvbHVtbkRlZmluaXRpb25EZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhnZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCksIGVsZW1lbnROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRCb29sZWFuRWxlbWVudEFkYXB0ZXIoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGdldERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSwgZWxlbWVudE5hbWUsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZEludGVnZXJFbGVtZW50QWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpLCBlbGVtZW50TmFtZSwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkU2hvcnRDaXJjdWl0RWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZ2V0TWVtYmVyKCksIGRhZWEpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZ2V0TWVtYmVyKCksIGRhZWEpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkU2hvcnRDaXJjdWl0SW50ZWdlckVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZ2V0TWVtYmVyKCksIGRhZWEpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFNob3J0Q2lyY3VpdFN0cmluZ0VsZW1lbnRBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEVsZW1lbnRBZGFwdGVyKHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcihlbGVtZW50TmFtZSkpOwotCX0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIG5hbWVFbGVtZW50TmFtZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBjb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKTsKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gdGhpcy5uYW1lKGFzdFJvb3QpOwotCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gPSB0aGlzLmNvbHVtbkRlZmluaXRpb24oYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7Ci0JCU5hbWVkQ29sdW1uQW5ub3RhdGlvbiBvbGRDb2x1bW4gPSAoTmFtZWRDb2x1bW5Bbm5vdGF0aW9uKSBvbGRBbm5vdGF0aW9uOwotCQlzZXROYW1lKG9sZENvbHVtbi5nZXROYW1lKCkpOwotCQlzZXRDb2x1bW5EZWZpbml0aW9uKG9sZENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCS8vKioqKioqKioqKioqKiBOYW1lZENvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5uYW1lLCBuZXdOYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbkRlZmluaXRpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIG5ld0NvbHVtbkRlZmluaXRpb24pIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmNvbHVtbkRlZmluaXRpb24sIG5ld0NvbHVtbkRlZmluaXRpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZENvbHVtbkRlZmluaXRpb24gPSB0aGlzLmNvbHVtbkRlZmluaXRpb247Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IG5ld0NvbHVtbkRlZmluaXRpb247Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbkFkYXB0ZXIuc2V0VmFsdWUobmV3Q29sdW1uRGVmaW5pdGlvbik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFksIG9sZENvbHVtbkRlZmluaXRpb24sIG5ld0NvbHVtbkRlZmluaXRpb24pOwotCX0JCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29sdW1uRGVmaW5pdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuY29sdW1uRGVmaW5pdGlvbkRlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zZXROYW1lKHRoaXMubmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0Q29sdW1uRGVmaW5pdGlvbih0aGlzLmNvbHVtbkRlZmluaXRpb24oYXN0Um9vdCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5EZWZpbml0aW9uQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0TmFtZWRRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3ROYW1lZFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2U4ZTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3ROYW1lZFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbnRhaW5lckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5hbWVkUXVlcnkgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxUeXBlPiAKLQlpbXBsZW1lbnRzIFF1ZXJ5QW5ub3RhdGlvbgotewotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAnbmFtZScgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdxdWVyeScgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBxdWVyeURlY2xhcmF0aW9uQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHF1ZXJ5QWRhcHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcXVlcnk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PE5lc3RhYmxlUXVlcnlIaW50PiBoaW50czsKLQlwcml2YXRlIGZpbmFsIEhpbnRzQ29udGFpbmVyQW5ub3RhdGlvbiBoaW50c0NvbnRhaW5lckFubm90YXRpb247Ci0JCi0JcHJvdGVjdGVkIEFic3RyYWN0TmFtZWRRdWVyeShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBuYW1lQWRhcHRlcihkYWEpOwotCQl0aGlzLnF1ZXJ5RGVjbGFyYXRpb25BZGFwdGVyID0gcXVlcnlBZGFwdGVyKGRhYSk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcih0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnF1ZXJ5QWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKHRoaXMucXVlcnlEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmhpbnRzID0gbmV3IEFycmF5TGlzdDxOZXN0YWJsZVF1ZXJ5SGludD4oKTsKLQkJdGhpcy5oaW50c0NvbnRhaW5lckFubm90YXRpb24gPSBuZXcgSGludHNDb250YWluZXJBbm5vdGF0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gdGhpcy5uYW1lKGFzdFJvb3QpOwotCQl0aGlzLnF1ZXJ5ID0gdGhpcy5xdWVyeShhc3RSb290KTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RSb290LCB0aGlzLmhpbnRzQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZ2V0TWVtYmVyKCksIGRhZWEpOwotCX0KLQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIG5hbWVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBxdWVyeUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgcXVlcnlFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIG5hbWVFbGVtZW50TmFtZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBxdWVyeUVsZW1lbnROYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm5hbWUsIG5ld05hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeSgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIG5ld1F1ZXJ5KSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5xdWVyeSwgbmV3UXVlcnkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZFF1ZXJ5ID0gdGhpcy5xdWVyeTsKLQkJdGhpcy5xdWVyeSA9IG5ld1F1ZXJ5OwotCQl0aGlzLnF1ZXJ5QWRhcHRlci5zZXRWYWx1ZShuZXdRdWVyeSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVFUllfUFJPUEVSVFksIG9sZFF1ZXJ5LCBuZXdRdWVyeSk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPiBoaW50cygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPih0aGlzLmhpbnRzKTsKLQl9Ci0JCi0JcHVibGljIGludCBoaW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmhpbnRzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlUXVlcnlIaW50IGhpbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuaGludHMuZ2V0KGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIGludCBpbmRleE9mSGludChRdWVyeUhpbnRBbm5vdGF0aW9uIHF1ZXJ5SGludCkgewotCQlyZXR1cm4gdGhpcy5oaW50cy5pbmRleE9mKHF1ZXJ5SGludCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZVF1ZXJ5SGludCBhZGRIaW50KGludCBpbmRleCkgewotCQlOZXN0YWJsZVF1ZXJ5SGludCBxdWVyeUhpbnQgPSAoTmVzdGFibGVRdWVyeUhpbnQpIENvbnRhaW5lckFubm90YXRpb25Ub29scy5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4LCB0aGlzLmhpbnRzQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCWZpcmVJdGVtQWRkZWQoUXVlcnlBbm5vdGF0aW9uLkhJTlRTX0xJU1QsIGluZGV4LCBxdWVyeUhpbnQpOwotCQlyZXR1cm4gcXVlcnlIaW50OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSGludChpbnQgaW5kZXgsIE5lc3RhYmxlUXVlcnlIaW50IHF1ZXJ5SGludCkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBxdWVyeUhpbnQsIHRoaXMuaGludHMsIEhJTlRTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVIaW50KGludCBpbmRleCkgewotCQlOZXN0YWJsZVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBoaW50QXQoaW5kZXgpOwotCQlyZW1vdmVIaW50KHF1ZXJ5SGludCk7Ci0JCXF1ZXJ5SGludC5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW5kZXgsIHRoaXMuaGludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUhpbnQoTmVzdGFibGVRdWVyeUhpbnQgcXVlcnlIaW50KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChxdWVyeUhpbnQsIHRoaXMuaGludHMsIEhJTlRTX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVIaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVIaW50SW50ZXJuYWwodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnN5bmNoQW5ub3RhdGlvbnNBZnRlck1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmhpbnRzQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCWZpcmVJdGVtTW92ZWQoUXVlcnlBbm5vdGF0aW9uLkhJTlRTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1vdmVIaW50SW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5oaW50cywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFF1ZXJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5xdWVyeURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldE5hbWUodGhpcy5uYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRRdWVyeSh0aGlzLnF1ZXJ5KGFzdFJvb3QpKTsKLQkJdGhpcy51cGRhdGVRdWVyeUhpbnRzRnJvbUphdmEoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVF1ZXJ5SGludHNGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMudXBkYXRlTmVzdGVkQW5ub3RhdGlvbnNGcm9tSmF2YShhc3RSb290LCB0aGlzLmhpbnRzQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBOZXN0YWJsZVF1ZXJ5SGludCBjcmVhdGVRdWVyeUhpbnQoaW50IGluZGV4KTsKLQkKLQkvLyAqKioqKioqKioqIHBlcnNpc3RlbmNlIG1vZGVsIC0+IGphdmEgYW5ub3RhdGlvbnMgKioqKioqKioqKgotCXB1YmxpYyBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgc3VwZXIuZ2V0QW5ub3RhdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7Ci0JCUFic3RyYWN0TmFtZWRRdWVyeSBvbGROYW1lZFF1ZXJ5ID0gKEFic3RyYWN0TmFtZWRRdWVyeSkgb2xkQW5ub3RhdGlvbjsKLQkJc2V0TmFtZShvbGROYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCXNldFF1ZXJ5KG9sZE5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWZvciAoUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob2xkTmFtZWRRdWVyeS5oaW50cygpKSkgewotCQkJTmVzdGFibGVRdWVyeUhpbnQgbmV3UXVlcnlIaW50ID0gYWRkSGludChvbGROYW1lZFF1ZXJ5LmluZGV4T2ZIaW50KHF1ZXJ5SGludCkpOwotCQkJbmV3UXVlcnlIaW50LmluaXRpYWxpemVGcm9tKChOZXN0YWJsZVF1ZXJ5SGludCkgcXVlcnlIaW50KTsKLQkJfQotCX0KLQotCQotCXByaXZhdGUgY2xhc3MgSGludHNDb250YWluZXJBbm5vdGF0aW9uIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudHMgQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZVF1ZXJ5SGludD4gewotCi0JCXB1YmxpYyBIaW50c0NvbnRhaW5lckFubm90YXRpb24oKSB7Ci0JCQlzdXBlcihBYnN0cmFjdE5hbWVkUXVlcnkudGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCQl9Ci0JCQotCQlwdWJsaWMgTmVzdGFibGVRdWVyeUhpbnQgYWRkKGludCBpbmRleCkgewotCQkJTmVzdGFibGVRdWVyeUhpbnQgcXVlcnlIaW50ID0gQWJzdHJhY3ROYW1lZFF1ZXJ5LnRoaXMuY3JlYXRlUXVlcnlIaW50KGluZGV4KTsKLQkJCUFic3RyYWN0TmFtZWRRdWVyeS50aGlzLmFkZEhpbnQoaW5kZXgsIHF1ZXJ5SGludCk7Ci0JCQlyZXR1cm4gcXVlcnlIaW50OwotCQl9Ci0JCQotCQlwdWJsaWMgTmVzdGFibGVRdWVyeUhpbnQgYWRkSW50ZXJuYWwoaW50IGluZGV4KSB7Ci0JCQlOZXN0YWJsZVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5jcmVhdGVRdWVyeUhpbnQoaW5kZXgpOwotCQkJQWJzdHJhY3ROYW1lZFF1ZXJ5LnRoaXMuaGludHMuYWRkKGluZGV4LCBxdWVyeUhpbnQpOwotCQkJcmV0dXJuIHF1ZXJ5SGludDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEpQQS5RVUVSWV9ISU5UOwotCQl9Ci0KLQkJcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlUXVlcnlIaW50IGhpbnQpIHsKLQkJCXJldHVybiBBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5pbmRleE9mSGludChoaW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCUFic3RyYWN0TmFtZWRRdWVyeS50aGlzLm1vdmVIaW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIG1vdmVJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJQWJzdHJhY3ROYW1lZFF1ZXJ5LnRoaXMubW92ZUhpbnRJbnRlcm5hbCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIE5lc3RhYmxlUXVlcnlIaW50IG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5oaW50QXQoaW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIE5lc3RhYmxlUXVlcnlIaW50IG5lc3RlZEFubm90YXRpb25Gb3IoQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCQlmb3IgKE5lc3RhYmxlUXVlcnlIaW50IHVuaXF1ZUNvbnN0cmFpbnQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobmVzdGVkQW5ub3RhdGlvbnMoKSkpIHsKLQkJCQlpZiAoamR0QW5ub3RhdGlvbiA9PSB1bmlxdWVDb25zdHJhaW50LmdldEpkdEFubm90YXRpb24oKENvbXBpbGF0aW9uVW5pdCkgamR0QW5ub3RhdGlvbi5nZXRSb290KCkpKSB7Ci0JCQkJCXJldHVybiB1bmlxdWVDb25zdHJhaW50OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZVF1ZXJ5SGludD4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlUXVlcnlIaW50PihBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5oaW50cyk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5oaW50c1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShOZXN0YWJsZVF1ZXJ5SGludCBxdWVyeUhpbnQpIHsKLQkJCUFic3RyYWN0TmFtZWRRdWVyeS50aGlzLnJlbW92ZUhpbnQocXVlcnlIaW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCUFic3RyYWN0TmFtZWRRdWVyeS50aGlzLnJlbW92ZUhpbnQobmVzdGVkQW5ub3RhdGlvbkF0KGluZGV4KSk7CQotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEFic3RyYWN0TmFtZWRRdWVyeS50aGlzLmdldEpkdEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQkJQWJzdHJhY3ROYW1lZFF1ZXJ5LnRoaXMubmV3QW5ub3RhdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJCUFic3RyYWN0TmFtZWRRdWVyeS50aGlzLnJlbW92ZUFubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJQWJzdHJhY3ROYW1lZFF1ZXJ5LnRoaXMudXBkYXRlKGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEFic3RyYWN0TmFtZWRRdWVyeS50aGlzLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiAiaGludHMiOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMTA2MGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5DYXNjYWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5SZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+IGltcGxlbWVudHMgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KLXsKLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ3RhcmdldEVudGl0eScgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0YXJnZXRFbnRpdHlEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdmZXRjaCcgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmZXRjaERlY2xhcmF0aW9uQWRhcHRlcjsKLQkKLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ2Nhc2NhZGUnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBjYXNjYWRlRGVjbGFyYXRpb25BZGFwdGVyOwotCQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdGFyZ2V0RW50aXR5QWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZmV0Y2hBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGNhc2NhZGVBZGFwdGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RW50aXR5OwotCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHk7Ci0KLQlwcml2YXRlIEZldGNoVHlwZSBmZXRjaDsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlQWxsOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVBlcnNpc3Q7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlTWVyZ2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlUmVtb3ZlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVJlZnJlc2g7Ci0KLQkKLQlwdWJsaWMgQWJzdHJhY3RSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIGRhYSk7Ci0JCXRoaXMudGFyZ2V0RW50aXR5RGVjbGFyYXRpb25BZGFwdGVyID0gdGFyZ2V0RW50aXR5QWRhcHRlcigpOwotCQl0aGlzLnRhcmdldEVudGl0eUFkYXB0ZXIgPSBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnRhcmdldEVudGl0eURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuZmV0Y2hEZWNsYXJhdGlvbkFkYXB0ZXIgPSBmZXRjaEFkYXB0ZXIoKTsKLQkJdGhpcy5mZXRjaEFkYXB0ZXIgPSBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLmZldGNoRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5jYXNjYWRlRGVjbGFyYXRpb25BZGFwdGVyID0gY2FzY2FkZUFkYXB0ZXIoKTsKLQkJdGhpcy5jYXNjYWRlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGF0dHJpYnV0ZSwgdGhpcy5jYXNjYWRlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQlyZXR1cm4gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuZ2V0TWVtYmVyKCksIGRhZWEpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuZ2V0TWVtYmVyKCksIGRhZWEpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgSmF2YSBhZGFwdGVyJ3MgJ3RhcmdldEVudGl0eScgZWxlbWVudCBhZGFwdGVyIGNvbmZpZwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRhcmdldEVudGl0eUFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIHJldHVybiB0aGUgSmF2YSBhZGFwdGVyJ3MgJ2Nhc2NhZGUnIGVsZW1lbnQgYWRhcHRlciBjb25maWcKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGNhc2NhZGVBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIEphdmEgYWRhcHRlcidzICdmZXRjaCcgZWxlbWVudCBhZGFwdGVyIGNvbmZpZwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZldGNoQWRhcHRlcigpOwotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnRhcmdldEVudGl0eSA9IHRoaXMudGFyZ2V0RW50aXR5KGFzdFJvb3QpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5ID0gdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eShhc3RSb290KTsKLQkJdGhpcy5mZXRjaCA9IHRoaXMuZmV0Y2goYXN0Um9vdCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhc2NhZGVUeXBlcyhhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhc2NhZGVUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmdbXSBqYXZhVmFsdWUgPSB0aGlzLmNhc2NhZGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCQlDYXNjYWRlVHlwZVtdIGNhc2NhZGVUeXBlcyA9IENhc2NhZGVUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKGphdmFWYWx1ZSk7Ci0JCQotCQl0aGlzLmNhc2NhZGVBbGwgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoY2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5BTEwpOwotCQl0aGlzLmNhc2NhZGVNZXJnZSA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLk1FUkdFKTsKLQkJdGhpcy5jYXNjYWRlUGVyc2lzdCA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlBFUlNJU1QpOwotCQl0aGlzLmNhc2NhZGVSZWZyZXNoID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuUkVGUkVTSCk7Ci0JCXRoaXMuY2FzY2FkZVJlbW92ZSA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlJFTU9WRSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRFbnRpdHk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgbmV3VGFyZ2V0RW50aXR5KSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy50YXJnZXRFbnRpdHksIG5ld1RhcmdldEVudGl0eSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkVGFyZ2V0RW50aXR5ID0gdGhpcy50YXJnZXRFbnRpdHk7Ci0JCXRoaXMudGFyZ2V0RW50aXR5ID0gbmV3VGFyZ2V0RW50aXR5OwotCQl0aGlzLnRhcmdldEVudGl0eUFkYXB0ZXIuc2V0VmFsdWUobmV3VGFyZ2V0RW50aXR5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGRUYXJnZXRFbnRpdHksIG5ld1RhcmdldEVudGl0eSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eShTdHJpbmcgbmV3VGFyZ2V0RW50aXR5KSB7Ci0JCVN0cmluZyBvbGRUYXJnZXRFbnRpdHkgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5OwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5ID0gbmV3VGFyZ2V0RW50aXR5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxGSUVJRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGRUYXJnZXRFbnRpdHksIG5ld1RhcmdldEVudGl0eSk7Ci0JfQotCQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmZldGNoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmZldGNoLCBuZXdGZXRjaCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSB0aGlzLmZldGNoOwotCQl0aGlzLmZldGNoID0gbmV3RmV0Y2g7Ci0JCXRoaXMuZmV0Y2hBZGFwdGVyLnNldFZhbHVlKEZldGNoVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUobmV3RmV0Y2gpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChGRVRDSF9QUk9QRVJUWSwgb2xkRmV0Y2gsIG5ld0ZldGNoKTsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZUFsbCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FzY2FkZUFsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZUFsbChib29sZWFuIG5ld0Nhc2NhZGVBbGwpIHsKLQkJaWYgKHRoaXMuY2FzY2FkZUFsbCA9PSBuZXdDYXNjYWRlQWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBvbGRDYXNjYWRlQWxsID0gdGhpcy5jYXNjYWRlQWxsOwotCQl0aGlzLmNhc2NhZGVBbGwgPSBuZXdDYXNjYWRlQWxsOwotCQlzZXRDYXNjYWRlKG5ld0Nhc2NhZGVBbGwsIENhc2NhZGVUeXBlLkFMTCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9BTExfUFJPUEVSVFksIG9sZENhc2NhZGVBbGwsIG5ld0Nhc2NhZGVBbGwpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVQZXJzaXN0KCkgewotCQlyZXR1cm4gdGhpcy5jYXNjYWRlUGVyc2lzdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbiBuZXdDYXNjYWRlUGVyc2lzdCkgewotCQlpZiAodGhpcy5jYXNjYWRlUGVyc2lzdCA9PSBuZXdDYXNjYWRlUGVyc2lzdCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZVBlcnNpc3QgPSB0aGlzLmNhc2NhZGVQZXJzaXN0OwotCQl0aGlzLmNhc2NhZGVQZXJzaXN0ID0gbmV3Q2FzY2FkZVBlcnNpc3Q7Ci0JCXNldENhc2NhZGUobmV3Q2FzY2FkZVBlcnNpc3QsIENhc2NhZGVUeXBlLlBFUlNJU1QpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfUEVSU0lTVF9QUk9QRVJUWSwgb2xkQ2FzY2FkZVBlcnNpc3QsIG5ld0Nhc2NhZGVQZXJzaXN0KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlTWVyZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmNhc2NhZGVNZXJnZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZU1lcmdlKGJvb2xlYW4gbmV3Q2FzY2FkZU1lcmdlKSB7Ci0JCWlmICh0aGlzLmNhc2NhZGVNZXJnZSA9PSBuZXdDYXNjYWRlTWVyZ2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQlib29sZWFuIG9sZENhc2NhZGVNZXJnZSA9IHRoaXMuY2FzY2FkZU1lcmdlOwotCQl0aGlzLmNhc2NhZGVNZXJnZSA9IG5ld0Nhc2NhZGVNZXJnZTsKLQkJc2V0Q2FzY2FkZShuZXdDYXNjYWRlTWVyZ2UsIENhc2NhZGVUeXBlLk1FUkdFKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDQVNDQURFX01FUkdFX1BST1BFUlRZLCBvbGRDYXNjYWRlTWVyZ2UsIG5ld0Nhc2NhZGVNZXJnZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZVJlbW92ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FzY2FkZVJlbW92ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlbW92ZShib29sZWFuIG5ld0Nhc2NhZGVSZW1vdmUpIHsKLQkJaWYgKHRoaXMuY2FzY2FkZVJlbW92ZSA9PSBuZXdDYXNjYWRlUmVtb3ZlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBvbGRDYXNjYWRlUmVtb3ZlID0gdGhpcy5jYXNjYWRlUmVtb3ZlOwotCQl0aGlzLmNhc2NhZGVSZW1vdmUgPSBuZXdDYXNjYWRlUmVtb3ZlOwotCQlzZXRDYXNjYWRlKG5ld0Nhc2NhZGVSZW1vdmUsIENhc2NhZGVUeXBlLlJFTU9WRSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9SRU1PVkVfUFJPUEVSVFksIG9sZENhc2NhZGVSZW1vdmUsIG5ld0Nhc2NhZGVSZW1vdmUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVSZWZyZXNoKCkgewotCQlyZXR1cm4gdGhpcy5jYXNjYWRlUmVmcmVzaDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlZnJlc2goYm9vbGVhbiBuZXdDYXNjYWRlUmVmcmVzaCkgewotCQlpZiAodGhpcy5jYXNjYWRlUmVmcmVzaCA9PSBuZXdDYXNjYWRlUmVmcmVzaCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZVJlZnJlc2ggPSB0aGlzLmNhc2NhZGVSZWZyZXNoOwotCQl0aGlzLmNhc2NhZGVSZWZyZXNoID0gbmV3Q2FzY2FkZVJlZnJlc2g7Ci0JCXNldENhc2NhZGUobmV3Q2FzY2FkZVJlZnJlc2gsIENhc2NhZGVUeXBlLlJFRlJFU0gpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfUkVGUkVTSF9QUk9QRVJUWSwgb2xkQ2FzY2FkZVJlZnJlc2gsIG5ld0Nhc2NhZGVSZWZyZXNoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldENhc2NhZGVUeXBlcyhDYXNjYWRlVHlwZVtdIGNhc2NhZGVUeXBlcykgewotCQlTdHJpbmdbXSBuZXdKYXZhVmFsdWUgPSBDYXNjYWRlVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUoY2FzY2FkZVR5cGVzKTsKLQkJdGhpcy5jYXNjYWRlQWRhcHRlci5zZXRWYWx1ZShuZXdKYXZhVmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0Q2FzY2FkZShib29sZWFuIGlzU2V0LCBDYXNjYWRlVHlwZSBjYXNjYWRlVHlwZSkgewotCQlTdHJpbmdbXSBqYXZhVmFsdWUgPSB0aGlzLmNhc2NhZGVBZGFwdGVyLmdldFZhbHVlKCk7Ci0JCUNhc2NhZGVUeXBlW10gY2FzY2FkZVR5cGVzID0gQ2FzY2FkZVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoamF2YVZhbHVlKTsJCi0JCUxpc3Q8Q2FzY2FkZVR5cGU+IGNhc2NhZGVDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoY2FzY2FkZVR5cGVzKTsKLQotCQlpZiAoY2FzY2FkZUNvbGxlY3Rpb24uY29udGFpbnMoY2FzY2FkZVR5cGUpKSB7Ci0JCQlpZiAoIWlzU2V0KSB7Ci0JCQkJY2FzY2FkZUNvbGxlY3Rpb24ucmVtb3ZlKGNhc2NhZGVUeXBlKTsKLQkJCQlzZXRDYXNjYWRlVHlwZXMoY2FzY2FkZUNvbGxlY3Rpb24udG9BcnJheShuZXcgQ2FzY2FkZVR5cGVbY2FzY2FkZUNvbGxlY3Rpb24uc2l6ZSgpXSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGlzU2V0KSB7Ci0JCQkJY2FzY2FkZUNvbGxlY3Rpb24uYWRkKGNhc2NhZGVUeXBlKTsKLQkJCQlzZXRDYXNjYWRlVHlwZXMoY2FzY2FkZUNvbGxlY3Rpb24udG9BcnJheShuZXcgQ2FzY2FkZVR5cGVbY2FzY2FkZUNvbGxlY3Rpb24uc2l6ZSgpXSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudGFyZ2V0RW50aXR5RGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmZldGNoRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRDYXNjYWRlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuY2FzY2FkZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldEZldGNoKHRoaXMuZmV0Y2goYXN0Um9vdCkpOwotCQl0aGlzLnNldFRhcmdldEVudGl0eSh0aGlzLnRhcmdldEVudGl0eShhc3RSb290KSk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkodGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eShhc3RSb290KSk7Ci0JCXRoaXMudXBkYXRlQ2FzY2FkZUZyb21KYXZhKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGZldGNoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBGZXRjaFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5mZXRjaEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldEVudGl0eShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRFbnRpdHlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2FzY2FkZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZ1tdIGphdmFWYWx1ZSA9IHRoaXMuY2FzY2FkZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JCUNhc2NhZGVUeXBlW10gY2FzY2FkZVR5cGVzID0gQ2FzY2FkZVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoamF2YVZhbHVlKTsKLQkJc2V0Q2FzY2FkZUFsbChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoY2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5BTEwpKTsKLQkJc2V0Q2FzY2FkZU1lcmdlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLk1FUkdFKSk7Ci0JCXNldENhc2NhZGVQZXJzaXN0KENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlBFUlNJU1QpKTsKLQkJc2V0Q2FzY2FkZVJlZnJlc2goQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuUkVGUkVTSCkpOwotCQlzZXRDYXNjYWRlUmVtb3ZlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlJFTU9WRSkpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFRhcmdldEVudGl0eShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAoZ2V0VGFyZ2V0RW50aXR5KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIEpEVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy50YXJnZXRFbnRpdHlBZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCkpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCS8vIFRPRE8gd2hhdCBhYm91dCBRdWFsaWZpZWRUeXBlPwotCQlyZXR1cm4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGNvbnZlcnRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgZmFsc2UsIGNvbnZlcnRlcik7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkRW51bUFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzYyMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVE5vZGVUZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPEUgZXh0ZW5kcyBNZW1iZXI+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUKLQlpbXBsZW1lbnRzIEFubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIEUgbWVtYmVyOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXI7Ci0JCQotCXByb3RlY3RlZCBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgRSBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm1lbWJlciA9IG1lbWJlcjsKLQkJdGhpcy5kYWEgPSBkYWE7Ci0JCXRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIgPSBhbm5vdGF0aW9uQWRhcHRlcjsKLQl9Ci0JCi0JcHVibGljIEUgZ2V0TWVtYmVyKCkgewotCQlyZXR1cm4gdGhpcy5tZW1iZXI7Ci0JfQotCQotCXByb3RlY3RlZCBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgRSBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBtZW1iZXIsIGRhYSwgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgZGFhKSk7Ci0JfQotCi0JCi0JcHVibGljIEFubm90YXRpb25BZGFwdGVyIGdldEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uQWRhcHRlcjsKLQl9Ci0JCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25BZGFwdGVyKCkuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZGFhOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCWdldEFubm90YXRpb25BZGFwdGVyKCkucmVtb3ZlQW5ub3RhdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQlnZXRBbm5vdGF0aW9uQWRhcHRlcigpLm5ld01hcmtlckFubm90YXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKEFTVE5vZGUgYXN0Tm9kZSkgewotCQlyZXR1cm4gKGFzdE5vZGUgPT0gbnVsbCkgPyBudWxsIDogbmV3IEFTVE5vZGVUZXh0UmFuZ2UoYXN0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uLgotCSAqIElmIHRoZSBhbm5vdGF0aW9uIGlzIG1pc3NpbmcsIHJldHVybiBudWxsLgotCSAqLwotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QW5ub3RhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRUZXh0UmFuZ2UoZ2V0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRhYS5nZXRBbm5vdGF0aW9uKGdldE1lbWJlcigpLmdldE1vZGlmaWVkRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRBbm5vdGF0aW9uRWxlbWVudEV4cHJlc3Npb24oRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Pz4gYWRhcHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihnZXRNZW1iZXIoKS5nZXRNb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25FbGVtZW50VGV4dFJhbmdlKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPD8+IGFkYXB0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFRleHRSYW5nZShnZXRBbm5vdGF0aW9uRWxlbWVudEV4cHJlc3Npb24oYWRhcHRlciwgYXN0Um9vdCkpOwotCi0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLiBJZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgbWlzc2luZwotCSAqIHJldHVybiB0aGUgbWVtYmVyJ3MgdGV4dCByYW5nZSBpbnN0ZWFkLgotCSAqLwotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0RWxlbWVudFRleHRSYW5nZShEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjw/PiBlbGVtZW50QWRhcHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShnZXRBbm5vdGF0aW9uRWxlbWVudFRleHRSYW5nZShlbGVtZW50QWRhcHRlciwgYXN0Um9vdCksIGFzdFJvb3QpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuIElmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0ZXh0IHJhbmdlIGlzIG51bGwKLQkgKiByZXR1cm4gdGhlIG1lbWJlcidzIHRleHQgcmFuZ2UgaW5zdGVhZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEVsZW1lbnRUZXh0UmFuZ2UoVGV4dFJhbmdlIGVsZW1lbnRUZXh0UmFuZ2UsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAoZWxlbWVudFRleHRSYW5nZSAhPSBudWxsKSA/IGVsZW1lbnRUZXh0UmFuZ2UgOiB0aGlzLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlIGVsZW1lbnQuCi0JICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVsZW1lbnRUb3VjaGVzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPD8+IGVsZW1lbnRBZGFwdGVyLCBpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhnZXRBbm5vdGF0aW9uRWxlbWVudFRleHRSYW5nZShlbGVtZW50QWRhcHRlciwgYXN0Um9vdCksIHBvcyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4gUmV0dXJuIHdoZXRoZXIgZWxlbWVudCdzIHRleHQgcmFuZ2UgaXMgbm90Ci0JICogbnVsbCAobWVhbmluZyB0aGUgZWxlbWVudCBleGlzdHMpIGFuZCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgaXQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWxlbWVudFRvdWNoZXMoVGV4dFJhbmdlIGVsZW1lbnRUZXh0UmFuZ2UsIGludCBwb3MpIHsKLQkJcmV0dXJuIChlbGVtZW50VGV4dFJhbmdlICE9IG51bGwpICYmIGVsZW1lbnRUZXh0UmFuZ2UudG91Y2hlcyhwb3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RSZXNvdXJjZVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdFJlc291cmNlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYzODExMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdFJlc291cmNlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db250YWluZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXNvdXJjZVRhYmxlIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248TWVtYmVyPiBpbXBsZW1lbnRzIFRhYmxlQW5ub3RhdGlvbgotewotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAnbmFtZScgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdzY2hlbWEnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NoZW1hRGVjbGFyYXRpb25BZGFwdGVyOwotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdjYXRhbG9nJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGNhdGFsb2dEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBzY2hlbWFBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjYXRhbG9nQWRhcHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY2F0YWxvZzsKLQkKLQlwcml2YXRlIFN0cmluZyBzY2hlbWE7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHM7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBVbmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uOwotCQotCXByb3RlY3RlZCBBYnN0cmFjdFJlc291cmNlVGFibGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMubmFtZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5zY2hlbWFEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLnNjaGVtYUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5jYXRhbG9nRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5jYXRhbG9nQWRhcHRlcihkYWEpOwotCQl0aGlzLm5hbWVBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5zY2hlbWFBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5zY2hlbWFEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmNhdGFsb2dBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5jYXRhbG9nRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50cyA9IG5ldyBBcnJheUxpc3Q8TmVzdGFibGVVbmlxdWVDb25zdHJhaW50PigpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyQW5ub3RhdGlvbiA9IG5ldyBVbmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMuY2F0YWxvZyA9IHRoaXMuY2F0YWxvZyhhc3RSb290KTsKLQkJdGhpcy5zY2hlbWEgPSB0aGlzLnNjaGVtYShhc3RSb290KTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RSb290LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmdldE1lbWJlcigpLCBkYWVhKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZGVjbGFyYXRpb24gZWxlbWVudCBhZGFwdGVyIGZvciB0aGUgdGFibGUncyAnbmFtZScgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcik7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZGVjbGFyYXRpb24gZWxlbWVudCBhZGFwdGVyIGZvciB0aGUgdGFibGUncyAnc2NoZW1hJyBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NoZW1hQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIGRlY2xhcmF0aW9uIGVsZW1lbnQgYWRhcHRlciBmb3IgdGhlIHRhYmxlJ3MgJ2NhdGFsb2cnIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjYXRhbG9nQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpOwotCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm5hbWUsIG5ld05hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIG5ld0NhdGFsb2cpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmNhdGFsb2csIG5ld0NhdGFsb2cpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZENhdGFsb2cgPSB0aGlzLmNhdGFsb2c7Ci0JCXRoaXMuY2F0YWxvZyA9IG5ld0NhdGFsb2c7Ci0JCXRoaXMuY2F0YWxvZ0FkYXB0ZXIuc2V0VmFsdWUobmV3Q2F0YWxvZyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FUQUxPR19QUk9QRVJUWSwgb2xkQ2F0YWxvZywgbmV3Q2F0YWxvZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIG5ld1NjaGVtYSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuc2NoZW1hLCBuZXdTY2hlbWEpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZFNjaGVtYSA9IHRoaXMuc2NoZW1hOwotCQl0aGlzLnNjaGVtYSA9IG5ld1NjaGVtYTsKLQkJdGhpcy5zY2hlbWFBZGFwdGVyLnNldFZhbHVlKG5ld1NjaGVtYSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NIRU1BX1BST1BFUlRZLCBvbGRTY2hlbWEsIG5ld1NjaGVtYSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPih0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKLQl9Ci0JCi0JcHVibGljIGludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50cy5pbmRleE9mKHVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gKE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCkgQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1BZGRlZChUYWJsZUFubm90YXRpb24uVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIGluZGV4LCB1bmlxdWVDb25zdHJhaW50KTsKLQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCwgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgdW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludEF0KGluZGV4KTsKLQkJcmVtb3ZlVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KTsKLQkJdW5pcXVlQ29uc3RyYWludC5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW5kZXgsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QodW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQltb3ZlVW5pcXVlQ29uc3RyYWludEludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJNb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb24pOwotCQlmaXJlSXRlbU1vdmVkKFRhYmxlQW5ub3RhdGlvbi5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnRJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnNjaGVtYURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmNhdGFsb2dEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2F0YWxvZ1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXModGhpcy5jYXRhbG9nRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzY2hlbWFUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMuc2NoZW1hRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zZXROYW1lKHRoaXMubmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0U2NoZW1hKHRoaXMuc2NoZW1hKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRDYXRhbG9nKHRoaXMuY2F0YWxvZyhhc3RSb290KSk7Ci0JCXRoaXMudXBkYXRlVW5pcXVlQ29uc3RyYWludHNGcm9tSmF2YShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNjaGVtYShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGNhdGFsb2coQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuY2F0YWxvZ0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCS8qKgotCSAqIGhlcmUgd2UganVzdCB3b3JyeSBhYm91dCBnZXR0aW5nIHRoZSB1bmlxdWUgY29uc3RyYWludHMgbGlzdHMgdGhlIHNhbWUgc2l6ZTsKLQkgKiB0aGVuIHdlIGRlbGVnYXRlIHRvIHRoZSB1bmlxdWUgY29uc3RyYWludHMgdG8gc3luY2ggdGhlbXNlbHZlcyB1cAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVVbmlxdWVDb25zdHJhaW50c0Zyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQkKLQlwcml2YXRlIGNsYXNzIFVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyQW5ub3RhdGlvbiBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSAKLQkJaW1wbGVtZW50cyBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludD4gCi0JewotCQlwdWJsaWMgVW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKCkgewotCQkJc3VwZXIoQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkvL25vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCQl9Ci0KLQkJcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBhZGRJbnRlcm5hbChpbnQgaW5kZXgpIHsKLQkJCU5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMuY3JlYXRlVW5pcXVlQ29uc3RyYWludChpbmRleCk7Ci0JCQlBYnN0cmFjdFJlc291cmNlVGFibGUudGhpcy51bmlxdWVDb25zdHJhaW50cy5hZGQoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQpOwkJCQotCQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgYWRkKGludCBpbmRleCkgewotCQkJTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgPSBBYnN0cmFjdFJlc291cmNlVGFibGUudGhpcy5jcmVhdGVVbmlxdWVDb25zdHJhaW50KGluZGV4KTsKLQkJCUFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLmFkZFVuaXF1ZUNvbnN0cmFpbnQoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQpOwotCQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBKUEEuVU5JUVVFX0NPTlNUUkFJTlQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGluZGV4T2YoTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJCXJldHVybiBBYnN0cmFjdFJlc291cmNlVGFibGUudGhpcy5pbmRleE9mVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCUFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLm1vdmVVbmlxdWVDb25zdHJhaW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIG1vdmVJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMubW92ZVVuaXF1ZUNvbnN0cmFpbnRJbnRlcm5hbCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBuZXN0ZWRBbm5vdGF0aW9uQXQoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMudW5pcXVlQ29uc3RyYWludEF0KGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgbmVzdGVkQW5ub3RhdGlvbkZvcihBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJCWZvciAoTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobmVzdGVkQW5ub3RhdGlvbnMoKSkpIHsKLQkJCQlpZiAoamR0QW5ub3RhdGlvbiA9PSB1bmlxdWVDb25zdHJhaW50LmdldEpkdEFubm90YXRpb24oKENvbXBpbGF0aW9uVW5pdCkgamR0QW5ub3RhdGlvbi5nZXRSb290KCkpKSB7Ci0JCQkJCXJldHVybiB1bmlxdWVDb25zdHJhaW50OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQ+IG5lc3RlZEFubm90YXRpb25zKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQ+KEFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgewotCQkJcmV0dXJuIEFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCQlBYnN0cmFjdFJlc291cmNlVGFibGUudGhpcy5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQpOwkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCXRoaXMucmVtb3ZlKG5lc3RlZEFubm90YXRpb25BdChpbmRleCkpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLmdldEpkdEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQkJQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMubmV3QW5ub3RhdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJCUFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLnJlbW92ZUFubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMudXBkYXRlKGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiAidW5pcXVlQ29uc3RyYWludHMiOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhMWU3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db250YWluZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsIAotCWV4dGVuZHMgT3ZlcnJpZGVJbXBsICAKLQlpbXBsZW1lbnRzIE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZQotewkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCXByaXZhdGUgZmluYWwgTGlzdDxOZXN0YWJsZUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zOwotCQotCXByaXZhdGUgZmluYWwgSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uIGpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbjsKLQkKLQlwcm90ZWN0ZWQgQXNzb2NpYXRpb25PdmVycmlkZUltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuam9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE5lc3RhYmxlSm9pbkNvbHVtbj4oKTsKLQkJdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24gPSBuZXcgSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewkJCi0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5pbml0aWFsaXplTmVzdGVkQW5ub3RhdGlvbnMoYXN0Um9vdCwgdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOZXN0YWJsZUFubm90YXRpb24gb2xkQW5ub3RhdGlvbikgewotCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRBbm5vdGF0aW9uKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gb2xkQXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKLQkJZm9yIChKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKSkpIHsKLQkJCU5lc3RhYmxlSm9pbkNvbHVtbiBuZXdKb2luQ29sdW1uID0gYWRkSm9pbkNvbHVtbihvbGRBc3NvY2lhdGlvbk92ZXJyaWRlLmluZGV4T2ZKb2luQ29sdW1uKGpvaW5Db2x1bW4pKTsKLQkJCW5ld0pvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb20oKE5lc3RhYmxlQW5ub3RhdGlvbikgam9pbkNvbHVtbik7Ci0JCX0KLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqKioqIEFzc29jaWF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5qb2luQ29sdW1ucyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5nZXQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGluZGV4T2ZKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBhZGRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChOZXN0YWJsZUpvaW5Db2x1bW4pIENvbnRhaW5lckFubm90YXRpb25Ub29scy5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4LCB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCWZpcmVJdGVtQWRkZWQoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uKGludCBpbmRleCwgTmVzdGFibGVKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5qb2luQ29sdW1ucywgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbnMuZ2V0KGluZGV4KTsKLQkJcmVtb3ZlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJam9pbkNvbHVtbi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW5kZXgsIHRoaXMuam9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlSm9pbkNvbHVtbihOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5qb2luQ29sdW1ucywgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVKb2luQ29sdW1uSW50ZXJuYWwodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnN5bmNoQW5ub3RhdGlvbnNBZnRlck1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCWZpcmVJdGVtTW92ZWQoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1vdmVKb2luQ29sdW1uSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5qb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTmVzdGFibGVKb2luQ29sdW1uIGNyZWF0ZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiBKb2luQ29sdW1uSW1wbC5jcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtbihnZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCksIHRoaXMsIGdldE1lbWJlcigpLCBpbmRleCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKLQkJdGhpcy51cGRhdGVKb2luQ29sdW1uc0Zyb21KYXZhKGFzdFJvb3QpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbHVtbnNGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMudXBkYXRlTmVzdGVkQW5ub3RhdGlvbnNGcm9tSmF2YShhc3RSb290LCB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlzdGF0aWMgQXNzb2NpYXRpb25PdmVycmlkZUltcGwgY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUikpOwotCX0KLQotCXN0YXRpYyBBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCBjcmVhdGVOZXN0ZWRBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlcikgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGlkYWEpOwotCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKHBhcmVudCwgbWVtYmVyLCBpZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlciwgaW5kZXgsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIAotCQlpbXBsZW1lbnRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVKb2luQ29sdW1uPiAKLQl7Ci0JCXB1YmxpYyBKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24oKSB7Ci0JCQlzdXBlcihBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vbm90aGluZyB0byBpbml0aWFsaXplCi0JCX0KLQkJCi0JCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW4gYWRkSW50ZXJuYWwoaW50IGluZGV4KSB7Ci0JCQlOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLnRoaXMuY3JlYXRlSm9pbkNvbHVtbihpbmRleCk7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLmpvaW5Db2x1bW5zLmFkZChpbmRleCwgam9pbkNvbHVtbik7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBhZGQoaW50IGluZGV4KSB7Ci0JCQlOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLnRoaXMuY3JlYXRlSm9pbkNvbHVtbihpbmRleCk7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLmFkZEpvaW5Db2x1bW4oaW5kZXgsIGpvaW5Db2x1bW4pOwotCQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaW5kZXhPZihOZXN0YWJsZUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZUltcGwudGhpcy5pbmRleE9mSm9pbkNvbHVtbihwa0pvaW5Db2x1bW4pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJQXNzb2NpYXRpb25PdmVycmlkZUltcGwudGhpcy5tb3ZlSm9pbkNvbHVtbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW92ZUludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLm1vdmVKb2luQ29sdW1uSW50ZXJuYWwodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQkKLQkJfQotCQkKLQkJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBuZXN0ZWRBbm5vdGF0aW9uQXQoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZUltcGwudGhpcy5qb2luQ29sdW1uQXQoaW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZUpvaW5Db2x1bW4+IG5lc3RlZEFubm90YXRpb25zKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZUpvaW5Db2x1bW4+KEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLnRoaXMuam9pbkNvbHVtbnMpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQl0aGlzLnJlbW92ZShuZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpKTsKLQkJfQkJCi0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLnJlbW92ZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLnRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBKUEEuSk9JTl9DT0xVTU47Ci0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb25Gb3Iob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQkJZm9yIChOZXN0YWJsZUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5lc3RlZEFubm90YXRpb25zKCkpKSB7Ci0JCQkJaWYgKGpkdEFubm90YXRpb24gPT0gcGtKb2luQ29sdW1uLmdldEpkdEFubm90YXRpb24oKENvbXBpbGF0aW9uVW5pdCkgamR0QW5ub3RhdGlvbi5nZXRSb290KCkpKSB7Ci0JCQkJCXJldHVybiBwa0pvaW5Db2x1bW47Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLnRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLm5ld0Fubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLnJlbW92ZUFubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJQXNzb2NpYXRpb25PdmVycmlkZUltcGwudGhpcy51cGRhdGUoYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZUltcGwudGhpcy5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gImpvaW5Db2x1bW5zIjsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZUltcGwuY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZShwYXJlbnQsIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlc0ltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTNlNDk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVzSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPE1lbWJlcj4gaW1wbGVtZW50cyBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24KLXsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCQotCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlc0ltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJc3VwZXIocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgQXJyYXlMaXN0PE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZT4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5pbml0aWFsaXplTmVzdGVkQW5ub3RhdGlvbnMoYXN0Um9vdCwgdGhpcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkJCi0JcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGU+IG5lc3RlZEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZT4odGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlcy5zaXplKCk7Ci0JfQkKLQotCXB1YmxpYyBOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGUgYWRkSW50ZXJuYWwoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZShpbmRleCk7Ci0JCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMuYWRkKGluZGV4LCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJcmV0dXJuIGFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGUgYWRkKGludCBpbmRleCkgewotCQlOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IGNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGUoaW5kZXgpOwotCQlhZGQoaW5kZXgsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlyZXR1cm4gYXNzb2NpYXRpb25PdmVycmlkZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZChpbnQgaW5kZXgsIE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMsIEFTU09DSUFUSU9OX09WRVJSSURFU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMsIEFTU09DSUFUSU9OX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMsIEFTU09DSUFUSU9OX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzLmluZGV4T2YoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGUgbmVzdGVkQW5ub3RhdGlvbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlcy5nZXQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlIG5lc3RlZEFubm90YXRpb25Gb3IoQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCWZvciAoTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgOiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzKSB7Ci0JCQlpZiAoamR0QW5ub3RhdGlvbiA9PSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpkdEFubm90YXRpb24oKENvbXBpbGF0aW9uVW5pdCkgamR0QW5ub3RhdGlvbi5nZXRSb290KCkpKSB7Ci0JCQkJcmV0dXJuIGFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJbW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzLCBBU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuICJ2YWx1ZSI7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsIGNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGUoaW50IGluZGV4KSB7Ci0JCXJldHVybiBBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC5jcmVhdGVOZXN0ZWRBc3NvY2lhdGlvbk92ZXJyaWRlKHRoaXMsIGdldE1lbWJlcigpLCBpbmRleCwgZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZXNJbXBsKHBhcmVudCwgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3ODM2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZUltcGwgCi0JZXh0ZW5kcyBPdmVycmlkZUltcGwKLQlpbXBsZW1lbnRzIE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUKLXsJCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBmaW5hbCBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlciBjb2x1bW5BZGFwdGVyOwotCQkKLQlwcml2YXRlIENvbHVtbkltcGwgY29sdW1uOwotCQotCQotCXByb3RlY3RlZCBBdHRyaWJ1dGVPdmVycmlkZUltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuY29sdW1uQWRhcHRlciA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcihnZXRNZW1iZXIoKSwgQ29sdW1uSW1wbC5idWlsZEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIoZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlpZiAodGhpcy5jb2x1bW5BZGFwdGVyLmdldEFubm90YXRpb24oYXN0Um9vdCkgIT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW4gPSBDb2x1bW5JbXBsLmNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uKHRoaXMsIGdldE1lbWJlcigpLCBnZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCkpOwotCQkJdGhpcy5jb2x1bW4uaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQW5ub3RhdGlvbik7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBvbGRBdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG9sZEFubm90YXRpb247Ci0JCWlmIChvbGRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKSAhPSBudWxsKSB7Ci0JCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IGFkZENvbHVtbigpOwotCQkJKChOZXN0YWJsZUFubm90YXRpb24pIGNvbHVtbikuaW5pdGlhbGl6ZUZyb20oKE5lc3RhYmxlQW5ub3RhdGlvbikgb2xkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOwotCQl9Ci0JfQotCQotCS8vKioqKioqKioqKioqIEF0dHJpYnV0ZU92ZXJyaWRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXROb25OdWxsQ29sdW1uKCkgewotCQlyZXR1cm4gKGdldENvbHVtbigpICE9IG51bGwpID8gZ2V0Q29sdW1uKCkgOiBuZXcgTnVsbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0JCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gYWRkQ29sdW1uKCkgewotCQlDb2x1bW5JbXBsIGNvbHVtbiA9IENvbHVtbkltcGwuY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4odGhpcywgZ2V0TWVtYmVyKCksIGdldERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSk7Ci0JCWNvbHVtbi5uZXdBbm5vdGF0aW9uKCk7Ci0JCXNldENvbHVtbihjb2x1bW4pOwotCQlyZXR1cm4gY29sdW1uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW4oKSB7Ci0JCXRoaXMuY29sdW1uLnJlbW92ZUFubm90YXRpb24oKTsKLQkJc2V0Q29sdW1uKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb2x1bW4oQ29sdW1uSW1wbCBuZXdDb2x1bW4pIHsKLQkJQ29sdW1uSW1wbCBvbGRDb2x1bW4gPSB0aGlzLmNvbHVtbjsKLQkJdGhpcy5jb2x1bW4gPSBuZXdDb2x1bW47Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkNPTFVNTl9QUk9QRVJUWSwgb2xkQ29sdW1uLCBuZXdDb2x1bW4pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOwotCQlpZiAodGhpcy5jb2x1bW5BZGFwdGVyLmdldEFubm90YXRpb24oYXN0Um9vdCkgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRDb2x1bW4obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0Q29sdW1uKCkgIT0gbnVsbCkgewotCQkJCWdldENvbHVtbigpLnVwZGF0ZShhc3RSb290KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUNvbHVtbkltcGwgY29sdW1uID0gQ29sdW1uSW1wbC5jcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbih0aGlzLCBnZXRNZW1iZXIoKSwgZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpKTsKLQkJCQljb2x1bW4uaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJCQl0aGlzLnNldENvbHVtbihjb2x1bW4pOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0Jc3RhdGljIEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlSW1wbChwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKLQl9Ci0KLQlzdGF0aWMgQXR0cmlidXRlT3ZlcnJpZGVJbXBsIGNyZWF0ZU5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlcikgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGlkYWEpOwotCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlSW1wbChwYXJlbnQsIG1lbWJlciwgaWRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGF0dHJpYnV0ZU92ZXJyaWRlc0FkYXB0ZXIsIGluZGV4LCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIEF0dHJpYnV0ZU92ZXJyaWRlSW1wbC5jcmVhdGVBdHRyaWJ1dGVPdmVycmlkZShwYXJlbnQsIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVzSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzRkZTdhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZXNJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248TWVtYmVyPiBpbXBsZW1lbnRzIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24KLXsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIGZpbmFsIExpc3Q8TmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlc092ZXJyaWRlczsKLQkKLQlwcm90ZWN0ZWQgQXR0cmlidXRlT3ZlcnJpZGVzSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5hdHRyaWJ1dGVzT3ZlcnJpZGVzID0gbmV3IEFycmF5TGlzdDxOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlPigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RSb290LCB0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkJCi0JcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLmF0dHJpYnV0ZXNPdmVycmlkZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlc092ZXJyaWRlcy5zaXplKCk7Ci0JfQkKLQotCXB1YmxpYyBOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlIGFkZEludGVybmFsKGludCBpbmRleCkgewotCQlOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGUoaW5kZXgpOwotCQl0aGlzLmF0dHJpYnV0ZXNPdmVycmlkZXMuYWRkKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSk7CQotCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGU7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlIGFkZChpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlKGluZGV4KTsKLQkJYWRkKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZChpbnQgaW5kZXgsIE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMuYXR0cmlidXRlc092ZXJyaWRlcywgQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMuYXR0cmlidXRlc092ZXJyaWRlcywgQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMuYXR0cmlidXRlc092ZXJyaWRlcywgQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlc092ZXJyaWRlcy5pbmRleE9mKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUgbmVzdGVkQW5ub3RhdGlvbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzT3ZlcnJpZGVzLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlIG5lc3RlZEFubm90YXRpb25Gb3IoQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCWZvciAoTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA6IHRoaXMuYXR0cmlidXRlc092ZXJyaWRlcykgewotCQkJaWYgKGpkdEFubm90YXRpb24gPT0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0SmR0QW5ub3RhdGlvbigoQ29tcGlsYXRpb25Vbml0KSBqZHRBbm5vdGF0aW9uLmdldFJvb3QoKSkpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJbW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmF0dHJpYnV0ZXNPdmVycmlkZXMsIEFUVFJJQlVURV9PVkVSUklERVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmF0dHJpYnV0ZXNPdmVycmlkZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuICJ2YWx1ZSI7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIEF0dHJpYnV0ZU92ZXJyaWRlSW1wbC5jcmVhdGVOZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCBnZXRNZW1iZXIoKSwgaW5kZXgsIGdldERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSk7Ci0JfQotCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVzSW1wbChwYXJlbnQsIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNlQ29sdW1uSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQmFzZUNvbHVtbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1NThjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNlQ29sdW1uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNlQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbHVtbkltcGwgZXh0ZW5kcyBBYnN0cmFjdE5hbWVkQ29sdW1uIGltcGxlbWVudHMgQmFzZUNvbHVtbkFubm90YXRpb24KLXsKLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ3RhYmxlJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRhYmxlRGVjbGFyYXRpb25BZGFwdGVyOwotCQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAndW5pcXVlJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiB1bmlxdWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdudWxsYWJsZScgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gbnVsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdpbnNlcnRhYmxlJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBpbnNlcnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyOwotCQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAndXBkYXRhYmxlJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiB1cGRhdGFibGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRhYmxlQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHVuaXF1ZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBudWxsYWJsZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBpbnNlcnRhYmxlQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHVwZGF0YWJsZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gdW5pcXVlOwotCXByaXZhdGUgQm9vbGVhbiBudWxsYWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gaW5zZXJ0YWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gdXBkYXRhYmxlOwotCQotCi0JcHVibGljIEJhc2VDb2x1bW5JbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQl0aGlzKHBhcmVudCwgbWVtYmVyLCBkYWEsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGRhYSkpOwotCX0KLQkKLQlwdWJsaWMgQmFzZUNvbHVtbkltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIodGhpcy50YWJsZUVsZW1lbnROYW1lKCkpOwotCQl0aGlzLnRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRFbGVtZW50QWRhcHRlcih0aGlzLnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy51bmlxdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMudW5pcXVlRWxlbWVudE5hbWUoKSk7Ci0JCXRoaXMudW5pcXVlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy51bmlxdWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm51bGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLm51bGxhYmxlRWxlbWVudE5hbWUoKSk7Ci0JCXRoaXMubnVsbGFibGVBZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLm51bGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5pbnNlcnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLmluc2VydGFibGVFbGVtZW50TmFtZSgpKTsKLQkJdGhpcy5pbnNlcnRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy5pbnNlcnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy51cGRhdGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMudXBkYXRhYmxlRWxlbWVudE5hbWUoKSk7Ci0JCXRoaXMudXBkYXRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy51cGRhdGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMudGFibGUgPSB0aGlzLnRhYmxlKGFzdFJvb3QpOwotCQl0aGlzLnVuaXF1ZSA9IHRoaXMudW5pcXVlKGFzdFJvb3QpOwotCQl0aGlzLm51bGxhYmxlID0gdGhpcy5udWxsYWJsZShhc3RSb290KTsKLQkJdGhpcy5pbnNlcnRhYmxlID0gdGhpcy5pbnNlcnRhYmxlKGFzdFJvb3QpOwotCQl0aGlzLnVwZGF0YWJsZSA9IHRoaXMudXBkYXRhYmxlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIHRhYmxlRWxlbWVudE5hbWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgdW5pcXVlRWxlbWVudE5hbWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgbnVsbGFibGVFbGVtZW50TmFtZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBpbnNlcnRhYmxlRWxlbWVudE5hbWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgdXBkYXRhYmxlRWxlbWVudE5hbWUoKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZEFubm90YXRpb24pOwotCQlCYXNlQ29sdW1uQW5ub3RhdGlvbiBvbGRDb2x1bW4gPSAoQmFzZUNvbHVtbkFubm90YXRpb24pIG9sZEFubm90YXRpb247Ci0JCXNldFRhYmxlKG9sZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJc2V0VW5pcXVlKG9sZENvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCXNldE51bGxhYmxlKG9sZENvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkJc2V0SW5zZXJ0YWJsZShvbGRDb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJc2V0VXBkYXRhYmxlKG9sZENvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqIEFic3RyYWN0Q29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgbmV3VGFibGUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnRhYmxlLCBuZXdUYWJsZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkVGFibGUgPSB0aGlzLnRhYmxlOwotCQl0aGlzLnRhYmxlID0gbmV3VGFibGU7Ci0JCXRoaXMudGFibGVBZGFwdGVyLnNldFZhbHVlKG5ld1RhYmxlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9QUk9QRVJUWSwgb2xkVGFibGUsIG5ld1RhYmxlKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5pcXVlKEJvb2xlYW4gbmV3VW5pcXVlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy51bmlxdWUsIG5ld1VuaXF1ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlCb29sZWFuIG9sZFVuaXF1ZSA9IHRoaXMudW5pcXVlOwotCQl0aGlzLnVuaXF1ZSA9IG5ld1VuaXF1ZTsKLQkJdGhpcy51bmlxdWVBZGFwdGVyLnNldFZhbHVlKG5ld1VuaXF1ZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVU5JUVVFX1BST1BFUlRZLCBvbGRVbmlxdWUsIG5ld1VuaXF1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0TnVsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm51bGxhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gbmV3TnVsbGFibGUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm51bGxhYmxlLCBuZXdOdWxsYWJsZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlCb29sZWFuIG9sZE51bGxhYmxlID0gdGhpcy5udWxsYWJsZTsKLQkJdGhpcy5udWxsYWJsZSA9IG5ld051bGxhYmxlOwotCQl0aGlzLm51bGxhYmxlQWRhcHRlci5zZXRWYWx1ZShuZXdOdWxsYWJsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTlVMTEFCTEVfUFJPUEVSVFksIG9sZE51bGxhYmxlLCBuZXdOdWxsYWJsZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuaW5zZXJ0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gbmV3SW5zZXJ0YWJsZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuaW5zZXJ0YWJsZSwgbmV3SW5zZXJ0YWJsZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlCb29sZWFuIG9sZEluc2VydGFibGUgPSB0aGlzLmluc2VydGFibGU7Ci0JCXRoaXMuaW5zZXJ0YWJsZSA9IG5ld0luc2VydGFibGU7Ci0JCXRoaXMuaW5zZXJ0YWJsZUFkYXB0ZXIuc2V0VmFsdWUobmV3SW5zZXJ0YWJsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSU5TRVJUQUJMRV9QUk9QRVJUWSwgb2xkSW5zZXJ0YWJsZSwgbmV3SW5zZXJ0YWJsZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0VXBkYXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy51cGRhdGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gbmV3VXBkYXRhYmxlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy51cGRhdGFibGUsIG5ld1VwZGF0YWJsZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlCb29sZWFuIG9sZFVwZGF0YWJsZSA9IHRoaXMudXBkYXRhYmxlOwotCQl0aGlzLnVwZGF0YWJsZSA9IG5ld1VwZGF0YWJsZTsKLQkJdGhpcy51cGRhdGFibGVBZGFwdGVyLnNldFZhbHVlKG5ld1VwZGF0YWJsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVVBEQVRBQkxFX1BST1BFUlRZLCBvbGRVcGRhdGFibGUsIG5ld1VwZGF0YWJsZSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROdWxsYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubnVsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEluc2VydGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmluc2VydGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFVuaXF1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudW5pcXVlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRVcGRhdGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnVwZGF0YWJsZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMudGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOwotCQl0aGlzLnNldFRhYmxlKHRoaXMudGFibGUoYXN0Um9vdCkpOwotCQl0aGlzLnNldFVuaXF1ZSh0aGlzLnVuaXF1ZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0TnVsbGFibGUodGhpcy5udWxsYWJsZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0SW5zZXJ0YWJsZSh0aGlzLmluc2VydGFibGUoYXN0Um9vdCkpOwotCQl0aGlzLnNldFVwZGF0YWJsZSh0aGlzLnVwZGF0YWJsZShhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiB1bmlxdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gbnVsbGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubnVsbGFibGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBpbnNlcnRhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmluc2VydGFibGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiB1cGRhdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudXBkYXRhYmxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Jhc2ljSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQmFzaWNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMTg3YTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQmFzaWNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotCi1wdWJsaWMgY2xhc3MgQmFzaWNJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPiBpbXBsZW1lbnRzIEJhc2ljQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG9wdGlvbmFsQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZmV0Y2hBZGFwdGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gT1BUSU9OQUxfQURBUFRFUiA9IGJ1aWxkT3B0aW9uYWxBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IEZFVENIX0FEQVBURVIgPSBidWlsZEZldGNoQWRhcHRlcigpOwotCQotCXByaXZhdGUgQm9vbGVhbiBvcHRpb25hbDsKLQkKLQlwcml2YXRlIEZldGNoVHlwZSBmZXRjaDsKLQkKLQlwcm90ZWN0ZWQgQmFzaWNJbXBsKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLm9wdGlvbmFsQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oYXR0cmlidXRlLCBPUFRJT05BTF9BREFQVEVSKTsKLQkJdGhpcy5mZXRjaEFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYXR0cmlidXRlLCBGRVRDSF9BREFQVEVSKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm9wdGlvbmFsID0gdGhpcy5vcHRpb25hbChhc3RSb290KTsKLQkJdGhpcy5mZXRjaCA9IHRoaXMuZmV0Y2goYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqIEJhc2ljIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gbmV3T3B0aW9uYWwpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm9wdGlvbmFsLCBuZXdPcHRpb25hbCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlCb29sZWFuIG9sZE9wdGlvbmFsID0gdGhpcy5vcHRpb25hbDsKLQkJdGhpcy5vcHRpb25hbCA9IG5ld09wdGlvbmFsOwotCQl0aGlzLm9wdGlvbmFsQWRhcHRlci5zZXRWYWx1ZShuZXdPcHRpb25hbCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT1BUSU9OQUxfUFJPUEVSVFksIG9sZE9wdGlvbmFsLCBuZXdPcHRpb25hbCk7Ci0JfQotCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuZmV0Y2g7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuZmV0Y2gsIG5ld0ZldGNoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUZldGNoVHlwZSBvbGRGZXRjaCA9IHRoaXMuZmV0Y2g7Ci0JCXRoaXMuZmV0Y2ggPSBuZXdGZXRjaDsKLQkJdGhpcy5mZXRjaEFkYXB0ZXIuc2V0VmFsdWUoRmV0Y2hUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShuZXdGZXRjaCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEZFVENIX1BST1BFUlRZLCBvbGRGZXRjaCwgbmV3RmV0Y2gpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoRkVUQ0hfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3B0aW9uYWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShPUFRJT05BTF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zZXRPcHRpb25hbCh0aGlzLm9wdGlvbmFsKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRGZXRjaCh0aGlzLmZldGNoKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBmZXRjaChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gRmV0Y2hUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZmV0Y2hBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gb3B0aW9uYWwoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWxBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9wdGlvbmFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuQkFTSUNfX09QVElPTkFMLCBmYWxzZSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuQkFTSUNfX0ZFVENILCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQmFzaWNBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmFzaWNBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBCYXNpY0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBCYXNpY0Fubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBCYXNpY0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBCYXNpY0ltcGwoKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBOdWxsQmFzaWMocGFyZW50KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db2x1bW5JbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db2x1bW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjU2ZWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29sdW1uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGNsYXNzIENvbHVtbkltcGwgZXh0ZW5kcyBCYXNlQ29sdW1uSW1wbCBpbXBsZW1lbnRzIENvbHVtbkFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbgotewotCS8vIHRoaXMgYWRhcHRlciBpcyBvbmx5IHVzZWQgYnkgYSBDb2x1bW4gYW5ub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBtYXBwaW5nIGFubm90YXRpb24gKGUuZy4gQmFzaWMpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIE1BUFBJTkdfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAnbGVuZ3RoJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBsZW5ndGhEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdwcmVjaXNpb24nIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IHByZWNpc2lvbkRlY2xhcmF0aW9uQWRhcHRlcjsKLQkKLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ3NjYWxlJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBzY2FsZURlY2xhcmF0aW9uQWRhcHRlcjsKLQkKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBsZW5ndGhBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gcHJlY2lzaW9uQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IHNjYWxlQWRhcHRlcjsKLQotCXByaXZhdGUgSW50ZWdlciBsZW5ndGg7Ci0JCi0JcHJpdmF0ZSBJbnRlZ2VyIHByZWNpc2lvbjsKLQkKLQlwcml2YXRlIEludGVnZXIgc2NhbGU7Ci0JCi0JcHJvdGVjdGVkIENvbHVtbkltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEpOwotCQl0aGlzLmxlbmd0aERlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIoSlBBLkNPTFVNTl9fTEVOR1RIKTsKLQkJdGhpcy5sZW5ndGhBZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEludGVnZXJFbGVtZW50QWRhcHRlcih0aGlzLmxlbmd0aERlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMucHJlY2lzaW9uRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZEludGVnZXJFbGVtZW50QWRhcHRlcihKUEEuQ09MVU1OX19QUkVDSVNJT04pOwotCQl0aGlzLnByZWNpc2lvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0SW50ZWdlckVsZW1lbnRBZGFwdGVyKHRoaXMucHJlY2lzaW9uRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5zY2FsZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIoSlBBLkNPTFVNTl9fU0NBTEUpOwotCQl0aGlzLnNjYWxlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIodGhpcy5zY2FsZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5sZW5ndGggPSB0aGlzLmxlbmd0aChhc3RSb290KTsKLQkJdGhpcy5wcmVjaXNpb24gPSB0aGlzLnByZWNpc2lvbihhc3RSb290KTsKLQkJdGhpcy5zY2FsZSA9IHRoaXMuc2NhbGUoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB0YWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fVEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB1bmlxdWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5DT0xVTU5fX1VOSVFVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIG51bGxhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQ09MVU1OX19OVUxMQUJMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGluc2VydGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5DT0xVTU5fX0lOU0VSVEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB1cGRhdGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5DT0xVTU5fX1VQREFUQUJMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJLy9UT0RPIG1vdmUgbWFrZXMgbm8gc2Vuc2UgZm9yIENvbHVtbi4gIG1heWJlIE5lc3RhYmxlQW5ub3RhdGlvbgotCQkvL25lZWRzIHRvIGJlIHNwbGl0IHVwIGFuZCB3ZSBjb3VsZCBoYXZlIEluZGV4YWJsZUFubm90YXRpb24KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQW5ub3RhdGlvbik7Ci0JCUNvbHVtbkFubm90YXRpb24gb2xkQ29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIG9sZEFubm90YXRpb247Ci0JCXNldExlbmd0aChvbGRDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlzZXRQcmVjaXNpb24ob2xkQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJc2V0U2NhbGUob2xkQ29sdW1uLmdldFNjYWxlKCkpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqIENvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIG5ld0xlbmd0aCkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubGVuZ3RoLCBuZXdMZW5ndGgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW50ZWdlciBvbGRMZW5ndGggPSB0aGlzLmxlbmd0aDsKLQkJdGhpcy5sZW5ndGggPSBuZXdMZW5ndGg7Ci0JCXRoaXMubGVuZ3RoQWRhcHRlci5zZXRWYWx1ZShuZXdMZW5ndGgpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKExFTkdUSF9QUk9QRVJUWSwgb2xkTGVuZ3RoLCBuZXdMZW5ndGgpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMucHJlY2lzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIG5ld1ByZWNpc2lvbikgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMucHJlY2lzaW9uLCBuZXdQcmVjaXNpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW50ZWdlciBvbGRQcmVjaXNpb24gPSB0aGlzLnByZWNpc2lvbjsKLQkJdGhpcy5wcmVjaXNpb24gPSBuZXdQcmVjaXNpb247Ci0JCXRoaXMucHJlY2lzaW9uQWRhcHRlci5zZXRWYWx1ZShuZXdQcmVjaXNpb24pOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBSRUNJU0lPTl9QUk9QRVJUWSwgb2xkUHJlY2lzaW9uLCBuZXdQcmVjaXNpb24pOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNjYWxlKCkgewotCQlyZXR1cm4gdGhpcy5zY2FsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY2FsZShJbnRlZ2VyIG5ld1NjYWxlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5zY2FsZSwgbmV3U2NhbGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW50ZWdlciBvbGRTY2FsZSA9IHRoaXMuc2NhbGU7Ci0JCXRoaXMuc2NhbGUgPSBuZXdTY2FsZTsKLQkJdGhpcy5zY2FsZUFkYXB0ZXIuc2V0VmFsdWUobmV3U2NhbGUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNDQUxFX1BST1BFUlRZLCBvbGRTY2FsZSwgbmV3U2NhbGUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldExlbmd0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubGVuZ3RoRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcmVjaXNpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnByZWNpc2lvbkRlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NhbGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnNjYWxlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOwotCQl0aGlzLnNldExlbmd0aCh0aGlzLmxlbmd0aChhc3RSb290KSk7Ci0JCXRoaXMuc2V0UHJlY2lzaW9uKHRoaXMucHJlY2lzaW9uKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRTY2FsZSh0aGlzLnNjYWxlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBsZW5ndGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9CQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIHByZWNpc2lvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5wcmVjaXNpb25BZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0JCi0JCi0JcHJvdGVjdGVkIEludGVnZXIgc2NhbGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuc2NhbGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXN0YXRpYyBDb2x1bW5JbXBsIGNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb2x1bW5JbXBsKHBhcmVudCwgbWVtYmVyLCBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIoYXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcikpOwotCX0KLQotCXN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTiwgSlBBLkNPTFVNTik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbHVtbkFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IENvbHVtbkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgQ29sdW1uSW1wbChwYXJlbnQsIG1lbWJlciwgQ29sdW1uSW1wbC5NQVBQSU5HX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTnVsbENvbHVtbihwYXJlbnQpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnRhaW5lckFubm90YXRpb25Ub29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2E1ZDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbnRhaW5lckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzCi17Ci0JCi0JcHVibGljIHN0YXRpYyBOZXN0YWJsZUFubm90YXRpb24gYWRkTmVzdGVkQW5ub3RhdGlvbihpbnQgaW5kZXgsIENvbnRhaW5lckFubm90YXRpb248PyBleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbj4gY29udGFpbmVyQW5ub3RhdGlvbikgewotCQlpbnQgc2l6ZSA9IGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbnNTaXplKCk7Ci0JCU5lc3RhYmxlQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uID0gY29udGFpbmVyQW5ub3RhdGlvbi5hZGRJbnRlcm5hbChzaXplKTsKLQkJbmVzdGVkQW5ub3RhdGlvbi5uZXdBbm5vdGF0aW9uKCk7Ci0JCWNvbnRhaW5lckFubm90YXRpb24ubW92ZUludGVybmFsKGluZGV4LCBzaXplKTsKLQkJc3luY2hBbm5vdGF0aW9uc0FmdGVyTW92ZShpbmRleCwgc2l6ZSwgY29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCXJldHVybiBuZXN0ZWRBbm5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIHN5bmNocm9uaXplIHRoZSBzb3VyY2UgYW5ub3RhdGlvbnMgd2l0aCB0aGUgbW9kZWwgbmVzdGFibGVBbm5vdGF0aW9ucywKLQkgKiBzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IHRvIHByZXZlbnQgb3ZlcmxhcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzeW5jaEFubm90YXRpb25zQWZ0ZXJBZGQoaW50IGluZGV4LCBDb250YWluZXJBbm5vdGF0aW9uPD8gZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24pIHsKLQkJTGlzdDxOZXN0YWJsZUFubm90YXRpb24+IG5lc3RhYmxlQW5ub3RhdGlvbnMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChjb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25zKCkpOwotCQlmb3IgKGludCBpID0gbmVzdGFibGVBbm5vdGF0aW9ucy5zaXplKCk7IGktLSA+IGluZGV4OykgewotCQkJc3luY2gobmVzdGFibGVBbm5vdGF0aW9ucy5nZXQoaSksIGkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIHN5bmNocm9uaXplIHRoZSBzb3VyY2UgYW5ub3RhdGlvbnMgd2l0aCB0aGUgbW9kZWwgbmVzdGFibGVBbm5vdGF0aW9ucywKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHByZXZlbnQgb3ZlcmxhcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzeW5jaEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW50IGluZGV4LCBDb250YWluZXJBbm5vdGF0aW9uPD8gZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IHBsdXJhbEFubm90YXRpb24pIHsKLQkJTGlzdDxOZXN0YWJsZUFubm90YXRpb24+IG5lc3RhYmxlQW5ub3RhdGlvbnMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChwbHVyYWxBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25zKCkpOwotCQlmb3IgKGludCBpID0gaW5kZXg7IGkgPCBuZXN0YWJsZUFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlzeW5jaChuZXN0YWJsZUFubm90YXRpb25zLmdldChpKSwgaSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzeW5jaChOZXN0YWJsZUFubm90YXRpb24gbmVzdGFibGVBbm5vdGF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJbmVzdGFibGVBbm5vdGF0aW9uLm1vdmVBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0JCi0JLyoqCi0JICogc3luY2hyb25pemUgdGhlIGFubm90YXRpb25zIHdpdGggdGhlIG1vZGVsIG5lc3RhYmxlQW5ub3RhdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3luY2hBbm5vdGF0aW9uc0FmdGVyTW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgQ29udGFpbmVyQW5ub3RhdGlvbjw/IGV4dGVuZHMgTmVzdGFibGVBbm5vdGF0aW9uPiBjb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCU5lc3RhYmxlQW5ub3RhdGlvbiBuZXN0YWJsZUFubm90YXRpb24gPSBjb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25BdCh0YXJnZXRJbmRleCk7Ci0JCQotCQlzeW5jaChuZXN0YWJsZUFubm90YXRpb24sIGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbnNTaXplKCkpOwotCQkKLQkJTGlzdDxOZXN0YWJsZUFubm90YXRpb24+IG5lc3RhYmxlQW5ub3RhdGlvbnMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChjb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25zKCkpOwotCQlpZiAoc291cmNlSW5kZXggPCB0YXJnZXRJbmRleCkgewotCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpIDwgdGFyZ2V0SW5kZXg7IGkrKykgewotCQkJCXN5bmNoKG5lc3RhYmxlQW5ub3RhdGlvbnMuZ2V0KGkpLCBpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaSA+IHRhcmdldEluZGV4OyBpLS0gKSB7Ci0JCQkJc3luY2gobmVzdGFibGVBbm5vdGF0aW9ucy5nZXQoaSksIGkpOwkJCQotCQkJfQotCQl9Ci0JCXN5bmNoKG5lc3RhYmxlQW5ub3RhdGlvbiwgdGFyZ2V0SW5kZXgpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBDb250YWluZXJBbm5vdGF0aW9uPD8+IGNvbnRhaW5lckFubm90YXRpb24pIHsKLQkJYWRkQW5ub3RhdGlvbnNGcm9tU291cmNlKGFzdFJvb3QsIGNvbnRhaW5lckFubm90YXRpb24pOwotCX0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRBbm5vdGF0aW9uc0Zyb21Tb3VyY2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QsIENvbnRhaW5lckFubm90YXRpb248PyBleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbj4gY29udGFpbmVyQW5ub3RhdGlvbikgewotCQljb250YWluZXJBbm5vdGF0aW9uLmdldEpkdEFubm90YXRpb24oYXN0Um9vdCkuYWNjZXB0KGluaXRpYWxKYXZhTWVtYmVyQW5ub3RhdGlvbkFzdFZpc2l0b3IoYXN0Um9vdCwgY29udGFpbmVyQW5ub3RhdGlvbikpOwotCX0KLQkKLQkvKioKLQkgKiBPbmx5IHZpc2l0IHRoZSBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBlbGVtZW50IG5hbWUuICAKLQkgKiBJZiB0aGVyZSBpcyBubyBlbGVtZW50IG5hbWUgKGxpa2UgaW4gdGhlIGNhc2Ugb2YgdmFsdWUgZWxlbWVudHMpCi0JICogdGhlbiB3ZSB3aWxsIHZpc2l0IGFsbCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBhbm5vdGF0aW9uIG5hbWUgaW5zaWRlCi0JICogdGhlIGdpdmVuIGNvbnRhaW5lciBhbm5vdGF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQVNUVmlzaXRvciBpbml0aWFsSmF2YU1lbWJlckFubm90YXRpb25Bc3RWaXNpdG9yKGZpbmFsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBmaW5hbCBDb250YWluZXJBbm5vdGF0aW9uPD8gZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBBU1RWaXNpdG9yKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZW1iZXJWYWx1ZVBhaXIgbm9kZSkgewotCQkJCXJldHVybiBub2RlLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoY29udGFpbmVyQW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQkJcmV0dXJuIHZpc2l0KChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikgbm9kZSk7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOb3JtYWxBbm5vdGF0aW9uIG5vZGUpIHsKLQkJCQlyZXR1cm4gdmlzaXQoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uKSBub2RlKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KE1hcmtlckFubm90YXRpb24gbm9kZSkgewotCQkJCXJldHVybiB2aXNpdCgob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24pIG5vZGUpOwotCQkJfQotCQkJCi0JCQlwcml2YXRlIGJvb2xlYW4gdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSkgewotCQkJCWlmIChjb250YWluZXJBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKEpEVFRvb2xzLnJlc29sdmVBbm5vdGF0aW9uKG5vZGUpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24uZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpLmVxdWFscyhKRFRUb29scy5yZXNvbHZlQW5ub3RhdGlvbihub2RlKSkpIHsKLQkJCQkJQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uID0gY29udGFpbmVyQW5ub3RhdGlvbi5hZGRJbnRlcm5hbChjb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25zU2l6ZSgpKTsKLQkJCQkJbmVzdGVkQW5ub3RhdGlvbi5pbml0aWFsaXplKGFzdFJvb3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBDb250YWluZXJBbm5vdGF0aW9uPD8+IGNvbnRhaW5lckFubm90YXRpb24pIHsKLQkJYWRkT3JVcGRhdGVBbm5vdGF0aW9uSW5Tb3VyY2UoYXN0Um9vdCwgY29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCS8vVE9ETyBub3Qgc3VyZSBob3cgdG8gaGFuZGxlIGdlbmVyaWNzIGhlcmUgYW5kIGdldCByaWQgb2YgdGhpcyB3YXJuaW5nCi0JCXJlbW92ZUFubm90YXRpb25zTm90SW5Tb3VyY2UoYXN0Um9vdCwgKENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPikgY29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRPclVwZGF0ZUFubm90YXRpb25JblNvdXJjZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCwgQ29udGFpbmVyQW5ub3RhdGlvbjw/IGV4dGVuZHMgTmVzdGFibGVBbm5vdGF0aW9uPiBjb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCWNvbnRhaW5lckFubm90YXRpb24uZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KS5hY2NlcHQoamF2YU1lbWJlckFubm90YXRpb25Bc3RWaXNpdG9yKGFzdFJvb3QsIGNvbnRhaW5lckFubm90YXRpb24pKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uc05vdEluU291cmNlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gY29udGFpbmVyQW5ub3RhdGlvbikgewotCQlmb3IgKE5lc3RhYmxlQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbnMoKSkpIHsKLQkJCWlmIChhbm5vdGF0aW9uLmdldEpkdEFubm90YXRpb24oYXN0Um9vdCkgPT0gbnVsbCkgewotCQkJCWNvbnRhaW5lckFubm90YXRpb24ucmVtb3ZlKGFubm90YXRpb24pOwotCQkJfQotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogT25seSB2aXNpdCB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCBuYW1lLiAgCi0JICogSWYgdGhlcmUgaXMgbm8gZWxlbWVudCBuYW1lIChsaWtlIGluIHRoZSBjYXNlIG9mIHZhbHVlIGVsZW1lbnRzKQotCSAqIHRoZW4gd2Ugd2lsbCB2aXNpdCBhbGwgYW5ub3RhdGlvbnMgd2l0aCB0aGUgYW5ub3RhdGlvbiBuYW1lIGluc2lkZQotCSAqIHRoZSBnaXZlbiBjb250YWluZXIgYW5ub3RhdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIEFTVFZpc2l0b3IgamF2YU1lbWJlckFubm90YXRpb25Bc3RWaXNpdG9yKGZpbmFsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBmaW5hbCBDb250YWluZXJBbm5vdGF0aW9uPD8gZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBBU1RWaXNpdG9yKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZW1iZXJWYWx1ZVBhaXIgbm9kZSkgewotCQkJCXJldHVybiBub2RlLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoY29udGFpbmVyQW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5vZGUpIHsKLQkJCQlyZXR1cm4gdmlzaXQoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uKSBub2RlKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KE5vcm1hbEFubm90YXRpb24gbm9kZSkgewotCQkJCXJldHVybiB2aXNpdCgob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24pIG5vZGUpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoTWFya2VyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQkJcmV0dXJuIHZpc2l0KChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikgbm9kZSk7Ci0JCQl9Ci0JCQkKLQkJCXByaXZhdGUgYm9vbGVhbiB2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoSkRUVG9vbHMucmVzb2x2ZUFubm90YXRpb24obm9kZSkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlpZiAoY29udGFpbmVyQW5ub3RhdGlvbi5nZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkuZXF1YWxzKEpEVFRvb2xzLnJlc29sdmVBbm5vdGF0aW9uKG5vZGUpKSkgewotCQkJCQlOZXN0YWJsZUFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbiA9IGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbkZvcihub2RlKTsKLQkJCQkJaWYgKG5lc3RlZEFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQkJbmVzdGVkQW5ub3RhdGlvbi51cGRhdGUoYXN0Um9vdCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQluZXN0ZWRBbm5vdGF0aW9uID0gY29udGFpbmVyQW5ub3RhdGlvbi5hZGQoY29udGFpbmVyQW5ub3RhdGlvbi5uZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCQkJCQluZXN0ZWRBbm5vdGF0aW9uLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JDb2x1bW5JbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTM1OTE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JDb2x1bW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgY2xhc3MgRGlzY3JpbWluYXRvckNvbHVtbkltcGwgZXh0ZW5kcyBBYnN0cmFjdE5hbWVkQ29sdW1uIGltcGxlbWVudHMgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IERJU0NSSU1JTkFUT1JfVFlQRV9BREFQVEVSID0gYnVpbGREaXNjcmltaW5hdG9yVHlwZUFkYXB0ZXIoKTsKLQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAnbGVuZ3RoJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBsZW5ndGhEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRpc2NyaW1pbmF0b3JUeXBlQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGxlbmd0aEFkYXB0ZXI7Ci0KLQlwcml2YXRlIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlOwotCi0JcHJpdmF0ZSBJbnRlZ2VyIGxlbmd0aDsJCi0JCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JDb2x1bW5JbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhLCAgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgZGFhKSk7Ci0JCXRoaXMuZGlzY3JpbWluYXRvclR5cGVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KG1lbWJlciwgRElTQ1JJTUlOQVRPUl9UWVBFX0FEQVBURVIpOwotCQl0aGlzLmxlbmd0aERlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIoSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEgpOwotCQl0aGlzLmxlbmd0aEFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0SW50ZWdlckVsZW1lbnRBZGFwdGVyKHRoaXMubGVuZ3RoRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JUeXBlID0gdGhpcy5kaXNjcmltaW5hdG9yVHlwZShhc3RSb290KTsKLQkJdGhpcy5sZW5ndGggPSB0aGlzLmxlbmd0aChhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU5fX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJLy9UT0RPIG1vdmUgbWFrZXMgbm8gc2Vuc2UgZm9yIERpc2NyaW1pbmF0b3JDb2x1bW4uICBtYXliZSBOZXN0YWJsZUFubm90YXRpb24KLQkJLy9uZWVkcyB0byBiZSBzcGxpdCB1cCBhbmQgd2UgY291bGQgaGF2ZSBJbmRleGFibGVBbm5vdGF0aW9uCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZEFubm90YXRpb24pOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBvbGRDb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIG9sZEFubm90YXRpb247Ci0JCXNldExlbmd0aChvbGRDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlzZXREaXNjcmltaW5hdG9yVHlwZShvbGRDb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGlzY3JpbWluYXRvclR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIG5ld0Rpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5kaXNjcmltaW5hdG9yVHlwZSwgbmV3RGlzY3JpbWluYXRvclR5cGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRGlzY3JpbWluYXRvclR5cGUgb2xkRGlzY3JpbWluYXRvclR5cGUgPSB0aGlzLmRpc2NyaW1pbmF0b3JUeXBlOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JUeXBlID0gbmV3RGlzY3JpbWluYXRvclR5cGU7Ci0JCXRoaXMuZGlzY3JpbWluYXRvclR5cGVBZGFwdGVyLnNldFZhbHVlKERpc2NyaW1pbmF0b3JUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShuZXdEaXNjcmltaW5hdG9yVHlwZSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkRGlzY3JpbWluYXRvclR5cGUsIG5ld0Rpc2NyaW1pbmF0b3JUeXBlKTsKLQl9Ci0JCi0JcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbmV3TGVuZ3RoKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5sZW5ndGgsIG5ld0xlbmd0aCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJbnRlZ2VyIG9sZExlbmd0aCA9IHRoaXMubGVuZ3RoOwotCQl0aGlzLmxlbmd0aCA9IG5ld0xlbmd0aDsKLQkJdGhpcy5sZW5ndGhBZGFwdGVyLnNldFZhbHVlKG5ld0xlbmd0aCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTEVOR1RIX1BST1BFUlRZLCBvbGRMZW5ndGgsIG5ld0xlbmd0aCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci51cGRhdGUoYXN0Um9vdCk7Ci0JCXRoaXMuc2V0TGVuZ3RoKHRoaXMubGVuZ3RoKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXREaXNjcmltaW5hdG9yVHlwZSh0aGlzLmRpc2NyaW1pbmF0b3JUeXBlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBsZW5ndGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmRpc2NyaW1pbmF0b3JUeXBlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGREaXNjcmltaW5hdG9yVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBEaXNjcmltaW5hdG9yQ29sdW1uSW1wbChwYXJlbnQsIG1lbWJlciwgRGlzY3JpbWluYXRvckNvbHVtbkltcGwuREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBOdWxsRGlzY3JpbWluYXRvckNvbHVtbihwYXJlbnQpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVmFsdWVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOTg0ZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotCi1wdWJsaWMgY2xhc3MgRGlzY3JpbWluYXRvclZhbHVlSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPFR5cGU+IGltcGxlbWVudHMgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCi0JCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQkKLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclZhbHVlSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odHlwZSwgVkFMVUVfQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7Ci0JCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5ESVNDUklNSU5BVE9SX1ZBTFVFX19WQUxVRSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBEaXNjcmltaW5hdG9yVmFsdWVJbXBsKHBhcmVudCwgKFR5cGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTnVsbERpc2NyaW1pbmF0b3JWYWx1ZShwYXJlbnQpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRhYmxlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3ZDkyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgRW1iZWRkYWJsZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxUeXBlPiBpbXBsZW1lbnRzIEVtYmVkZGFibGVBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcm90ZWN0ZWQgRW1iZWRkYWJsZUltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm90aGluZyB0byBpbml0aWFsaXplCQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vIGFubm90YXRpb24gbWVtYmVycwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbWJlZGRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBFbWJlZGRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIEVtYmVkZGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgRW1iZWRkYWJsZUltcGwoKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIChUeXBlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZElkSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmZWE5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZElkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZElkSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4gaW1wbGVtZW50cyBFbWJlZGRlZElkQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByb3RlY3RlZCBFbWJlZGRlZElkSW1wbChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vIGFubm90YXRpb24gbWVtYmVycwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbWJlZGRlZElkQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBFbWJlZGRlZElkQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIEVtYmVkZGVkSWRBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgRW1iZWRkZWRJZEltcGwoKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3OTlkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPiBpbXBsZW1lbnRzIEVtYmVkZGVkQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByb3RlY3RlZCBFbWJlZGRlZEltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vIGFubm90YXRpb24gbWVtYmVycwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVtYmVkZGVkQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEVtYmVkZGVkQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRW1iZWRkZWRBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgRW1iZWRkZWRBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgRW1iZWRkZWRBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgRW1iZWRkZWRJbXBsKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTnVsbEVtYmVkZGVkKHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyNTRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnRpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBFbnRpdHlJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248VHlwZT4gaW1wbGVtZW50cyBFbnRpdHlBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRV9BREFQVEVSID0gYnVpbGROYW1lQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBFbnRpdHlJbXBsKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihnZXRNZW1iZXIoKSwgTkFNRV9BREFQVEVSKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUoYXN0Um9vdCk7Ci0JfQotCQotCS8vKioqKioqKioqKiogQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQkvLyoqKioqKioqKioqIEVudGl0eSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm5hbWUsIG5ld05hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5QW5ub3RhdGlvbi5OQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShOQU1FX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQkvLyoqKioqKioqKioqIEphdmFSZXNvdXJjZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2V0TmFtZSh0aGlzLm5hbWUoYXN0Um9vdCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQkvLyoqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5FTlRJVFlfX05BTUUsIGZhbHNlKTsgLy8gZmFsc2UgPSBkbyBub3QgcmVtb3ZlIGFubm90YXRpb24gd2hlbiBlbXB0eQotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRW50aXR5QW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEVudGl0eUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVudGl0eUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBFbnRpdHlBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgRW50aXR5QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEVudGl0eUltcGwoKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIChUeXBlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnVtZXJhdGVkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FmMGMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGNsYXNzIEVudW1lcmF0ZWRJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPiBpbXBsZW1lbnRzIEVudW1lcmF0ZWRBbm5vdGF0aW9uCi17Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBFbnVtVHlwZSB2YWx1ZTsKLQkKLQlwcm90ZWN0ZWQgRW51bWVyYXRlZEltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGF0dHJpYnV0ZSwgVkFMVUVfQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIEVudW1UeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRW51bVR5cGUgbmV3VmFsdWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbnVtVHlwZSBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoRW51bVR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKG5ld1ZhbHVlKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2V0VmFsdWUodGhpcy52YWx1ZShhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBFbnVtVHlwZSB2YWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gRW51bVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5FTlVNRVJBVEVEX19WQUxVRSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRW51bWVyYXRlZEFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRW51bWVyYXRlZEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgRW51bWVyYXRlZEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBFbnVtZXJhdGVkSW1wbChwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTnVsbEVudW1lcmF0ZWQocGFyZW50KTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0dlbmVyYXRlZFZhbHVlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NDM4YzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZWRWYWx1ZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxNZW1iZXI+IGltcGxlbWVudHMgR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBzdHJhdGVneUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdlbmVyYXRvckFkYXB0ZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFNUUkFURUdZX0FEQVBURVIgPSBidWlsZFN0cmF0ZWd5QWRhcHRlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBHRU5FUkFUT1JfQURBUFRFUiA9IGJ1aWxkR2VuZXJhdG9yQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneTsKLQotCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRvcjsKLQkKLQkJCi0JcHJvdGVjdGVkIEdlbmVyYXRlZFZhbHVlSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5zdHJhdGVneUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4obWVtYmVyLCBTVFJBVEVHWV9BREFQVEVSKTsKLQkJdGhpcy5nZW5lcmF0b3JBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KG1lbWJlciwgR0VORVJBVE9SX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWd5KGFzdFJvb3QpOwotCQl0aGlzLmdlbmVyYXRvciA9IHRoaXMuZ2VuZXJhdG9yKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBHZW5lcmF0aW9uVHlwZSBnZXRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3k7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlIG5ld1N0cmF0ZWd5KSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5zdHJhdGVneSwgbmV3U3RyYXRlZ3kpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJR2VuZXJhdGlvblR5cGUgb2xkU3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWd5OwotCQl0aGlzLnN0cmF0ZWd5ID0gbmV3U3RyYXRlZ3k7Ci0JCXRoaXMuc3RyYXRlZ3lBZGFwdGVyLnNldFZhbHVlKEdlbmVyYXRpb25UeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShuZXdTdHJhdGVneSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNUUkFURUdZX1BST1BFUlRZLCBvbGRTdHJhdGVneSwgbmV3U3RyYXRlZ3kpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0b3IoU3RyaW5nIG5ld0dlbmVyYXRvcikgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuZ2VuZXJhdG9yLCBuZXdHZW5lcmF0b3IpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZEdlbmVyYXRvciA9IHRoaXMuZ2VuZXJhdG9yOwotCQl0aGlzLmdlbmVyYXRvciA9IG5ld0dlbmVyYXRvcjsKLQkJdGhpcy5nZW5lcmF0b3JBZGFwdGVyLnNldFZhbHVlKG5ld0dlbmVyYXRvcik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVE9SX1BST1BFUlRZLCBvbGRHZW5lcmF0b3IsIG5ld0dlbmVyYXRvcik7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTdHJhdGVneVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFNUUkFURUdZX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEdlbmVyYXRvclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEdFTkVSQVRPUl9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGphdmEgYW5ub3RhdGlvbnMgLT4gcGVyc2lzdGVuY2UgbW9kZWwgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldFN0cmF0ZWd5KHRoaXMuc3RyYXRlZ3koYXN0Um9vdCkpOwotCQl0aGlzLnNldEdlbmVyYXRvcih0aGlzLmdlbmVyYXRvcihhc3RSb290KSk7Ci0JfQotCi0JcHJvdGVjdGVkIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBHZW5lcmF0aW9uVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnN0cmF0ZWd5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdG9yKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvckFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRTdHJhdGVneUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkdFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1ksIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkR2VuZXJhdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkdFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgR2VuZXJhdGVkVmFsdWVJbXBsKHBhcmVudCwgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvR2VuZXJhdG9ySW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvR2VuZXJhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmJiZmE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0dlbmVyYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmF0b3JJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248TWVtYmVyPiBpbXBsZW1lbnRzIEdlbmVyYXRvckFubm90YXRpb24KLXsKLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ25hbWUnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKLQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAnaW5pdGlhbFZhbHVlJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBpbml0aWFsVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0KLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ2FsbG9jYXRpb25TaXplJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBhbGxvY2F0aW9uU2l6ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBpbml0aWFsVmFsdWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYWxsb2NhdGlvblNpemVBZGFwdGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKLQlwcml2YXRlIEludGVnZXIgaW5pdGlhbFZhbHVlOwotCQotCXByaXZhdGUgSW50ZWdlciBhbGxvY2F0aW9uU2l6ZTsKLQkJCi0JcHVibGljIEdlbmVyYXRvckltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLm5hbWVBZGFwdGVyKCk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcih0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmluaXRpYWxWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuaW5pdGlhbFZhbHVlQWRhcHRlcigpOwotCQl0aGlzLmluaXRpYWxWYWx1ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkSW50ZWdlckFkYXB0ZXIodGhpcy5pbml0aWFsVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmFsbG9jYXRpb25TaXplRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5hbGxvY2F0aW9uU2l6ZUFkYXB0ZXIoKTsKLQkJdGhpcy5hbGxvY2F0aW9uU2l6ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkSW50ZWdlckFkYXB0ZXIodGhpcy5hbGxvY2F0aW9uU2l6ZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gdGhpcy5uYW1lKGFzdFJvb3QpOwotCQl0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMuaW5pdGlhbFZhbHVlKGFzdFJvb3QpOwotCQl0aGlzLmFsbG9jYXRpb25TaXplID0gdGhpcy5hbGxvY2F0aW9uU2l6ZShhc3RSb290KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihnZXRNZW1iZXIoKSwgZGFlYSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZEludGVnZXJBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZ2V0TWVtYmVyKCksIGRhZWEpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGluaXRpYWxWYWx1ZUFkYXB0ZXIoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBhbGxvY2F0aW9uU2l6ZUFkYXB0ZXIoKTsKLQotCQotCi0JcHVibGljIEludGVnZXIgZ2V0QWxsb2NhdGlvblNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmFsbG9jYXRpb25TaXplOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyIG5ld0FsbG9jYXRpb25TaXplKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5hbGxvY2F0aW9uU2l6ZSwgbmV3QWxsb2NhdGlvblNpemUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW50ZWdlciBvbGRBbGxvY2F0aW9uU2l6ZSA9IHRoaXMuYWxsb2NhdGlvblNpemU7Ci0JCXRoaXMuYWxsb2NhdGlvblNpemUgPSBuZXdBbGxvY2F0aW9uU2l6ZTsKLQkJdGhpcy5hbGxvY2F0aW9uU2l6ZUFkYXB0ZXIuc2V0VmFsdWUobmV3QWxsb2NhdGlvblNpemUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEFMTE9DQVRJT05fU0laRV9QUk9QRVJUWSwgb2xkQWxsb2NhdGlvblNpemUsIG5ld0FsbG9jYXRpb25TaXplKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRJbml0aWFsVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmluaXRpYWxWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsVmFsdWUoSW50ZWdlciBuZXdJbml0aWFsVmFsdWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmluaXRpYWxWYWx1ZSwgbmV3SW5pdGlhbFZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUludGVnZXIgb2xkSW5pdGlhbFZhbHVlID0gdGhpcy5pbml0aWFsVmFsdWU7Ci0JCXRoaXMuaW5pdGlhbFZhbHVlID0gbmV3SW5pdGlhbFZhbHVlOwotCQl0aGlzLmluaXRpYWxWYWx1ZUFkYXB0ZXIuc2V0VmFsdWUobmV3SW5pdGlhbFZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJTklUSUFMX1ZBTFVFX1BST1BFUlRZLCBvbGRJbml0aWFsVmFsdWUsIG5ld0luaXRpYWxWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm5hbWUsIG5ld05hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SW5pdGlhbFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5pbml0aWFsVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEFsbG9jYXRpb25TaXplVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5hbGxvY2F0aW9uU2l6ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBqYXZhIGFubm90YXRpb25zIC0+IHBlcnNpc3RlbmNlIG1vZGVsICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zZXROYW1lKHRoaXMubmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0QWxsb2NhdGlvblNpemUodGhpcy5hbGxvY2F0aW9uU2l6ZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0SW5pdGlhbFZhbHVlKHRoaXMuaW5pdGlhbFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIGFsbG9jYXRpb25TaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmFsbG9jYXRpb25TaXplQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEludGVnZXIgaW5pdGlhbFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmluaXRpYWxWYWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRJbnRlZ2VyQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZENsYXNzSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRDbGFzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxYThlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZENsYXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRDbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLQotcHVibGljIGNsYXNzIElkQ2xhc3NJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248VHlwZT4gaW1wbGVtZW50cyBJZENsYXNzQW5ub3RhdGlvbgotewotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRWYWx1ZTsKLQotCXB1YmxpYyBJZENsYXNzSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odHlwZSwgVkFMVUVfQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUoYXN0Um9vdCk7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRWYWx1ZSA9IGZ1bGx5UXVhbGlmaWVkQ2xhc3MoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7Ci0JCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJZENsYXNzQW5ub3RhdGlvbi5WQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkVmFsdWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRGdWxseVF1YWxpZmllZENsYXNzKFN0cmluZyBuZXdRdWFsaWZpZWRDbGFzcykgewotCQlTdHJpbmcgb2xkUXVhbGlmaWVkQ2xhc3MgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkVmFsdWU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRWYWx1ZSA9IG5ld1F1YWxpZmllZENsYXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElkQ2xhc3NBbm5vdGF0aW9uLkZVTExZX1FVQUxJRklFRF9DTEFTU19QUk9QRVJUWSwgb2xkUXVhbGlmaWVkQ2xhc3MsIG5ld1F1YWxpZmllZENsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2V0VmFsdWUodGhpcy52YWx1ZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRDbGFzcyh0aGlzLmZ1bGx5UXVhbGlmaWVkQ2xhc3MoYXN0Um9vdCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmIChnZXRWYWx1ZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBKRFRUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudmFsdWVBZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlwcm90ZWN0ZWQgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuSURfQ0xBU1NfX1ZBTFVFLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIElkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSWRDbGFzc0Fubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IElkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIElkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgSWRDbGFzc0ltcGwocGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZEltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGQ3YzliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi0KLXB1YmxpYyBjbGFzcyBJZEltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+IGltcGxlbWVudHMgSWRBbm5vdGF0aW9uCi17CQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByb3RlY3RlZCBJZEltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ubyBhbm5vdGF0aW9uIG1lbWJlcnMKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJZEFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJZEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IElkQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIElkQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIElkQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IElkSW1wbCgoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0OGFmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotCi1wdWJsaWMgY2xhc3MgSW5oZXJpdGFuY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248VHlwZT4gaW1wbGVtZW50cyBJbmhlcml0YW5jZUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBTVFJBVEVHWV9BREFQVEVSID0gYnVpbGRTdHJhdGVneUFkYXB0ZXIoKTsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc3RyYXRlZ3lBZGFwdGVyOwotCi0JcHJpdmF0ZSBJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3k7Ci0JCi0JcHJvdGVjdGVkIEluaGVyaXRhbmNlSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5zdHJhdGVneUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odHlwZSwgU1RSQVRFR1lfQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zdHJhdGVneSA9IHRoaXMuc3RyYXRlZ3koYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3k7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZSBuZXdTdHJhdGVneSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuc3RyYXRlZ3ksIG5ld1N0cmF0ZWd5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUluaGVyaXRhbmNlVHlwZSBvbGRTdHJhdGVneSA9IHRoaXMuc3RyYXRlZ3k7Ci0JCXRoaXMuc3RyYXRlZ3kgPSBuZXdTdHJhdGVneTsKLQkJdGhpcy5zdHJhdGVneUFkYXB0ZXIuc2V0VmFsdWUoSW5oZXJpdGFuY2VUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShuZXdTdHJhdGVneSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNUUkFURUdZX1BST1BFUlRZLCBvbGRTdHJhdGVneSwgbmV3U3RyYXRlZ3kpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U3RyYXRlZ3lUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShTVFJBVEVHWV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2V0U3RyYXRlZ3kodGhpcy5zdHJhdGVneShhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3koQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEluaGVyaXRhbmNlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnN0cmF0ZWd5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRTdHJhdGVneUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLklOSEVSSVRBTkNFX19TVFJBVEVHWSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBJbmhlcml0YW5jZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgSW5oZXJpdGFuY2VJbXBsKHBhcmVudCwgKFR5cGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTnVsbEluaGVyaXRhbmNlKHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTW9kZWxJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhNTM1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KcGFDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7Ci0KLS8vIFRPRE8gd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIEpQQSBwbGF0Zm9ybQotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZU1vZGVsSW1wbAotCWV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZU1vZGVsCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VNb2RlbAotewotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxSZXNvdXJjZU1vZGVsTGlzdGVuZXI+IHJlc291cmNlTW9kZWxMaXN0ZW5lcnM7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBKcGFDb21waWxhdGlvblVuaXQganBhQ29tcGlsYXRpb25Vbml0OwotCQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VNb2RlbEltcGwoCi0JCQlJRmlsZSBmaWxlLCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyLCAKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihmaWxlKTsKLQkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZU1vZGVsTGlzdGVuZXI+KCk7Ci0JCS8vIFRPRE8gdXNlIEpQQSBmYWN0b3J5LCB2aWEgdGhlIHBsYXRmb3JtCi0JCXRoaXMuanBhQ29tcGlsYXRpb25Vbml0ID0gCi0JCQluZXcgSnBhQ29tcGlsYXRpb25Vbml0SW1wbChmaWxlLCBhbm5vdGF0aW9uUHJvdmlkZXIsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyLCB0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKQVZBX1JFU09VUkNFX1RZUEU7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21waWxhdGlvblVuaXQgZ2V0SnBhQ29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gdGhpcy5qcGFDb21waWxhdGlvblVuaXQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlTW9kZWxDaGFuZ2VMaXN0ZW5lcihSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCX0KLQkJaWYgKHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgYWxyZWFkeSBhZGRlZCIpOwkJCi0JCX0KLQkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTW9kZWxDaGFuZ2VMaXN0ZW5lcihSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCF0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHdhcyBuZXZlciBhZGRlZCIpOwkJCi0JCX0KLQkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKCkgewotCQlpZiAodGhpcy5qcGFDb21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2hhbmdlIGV2ZW50cyBzaG91bGQgbm90IGJlIGZpcmVkIGR1cmluZyBjb25zdHJ1Y3Rpb24iKTsKLQkJfQotCQlmb3IgKFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVycykgewotCQkJbGlzdGVuZXIucmVzb3VyY2VNb2RlbENoYW5nZWQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQlzeW5jaFdpdGhKYXZhRGVsdGEoZXZlbnQuZ2V0RGVsdGEoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jaFdpdGhKYXZhRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJc3dpdGNoIChkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKLQkJCQlpZiAodGhpcy51cGRhdGVPbkNsYXNzcGF0aENoYW5nZXMoZGVsdGEpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUwgOgotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJCXRoaXMuc3luY2hDaGlsZHJlbldpdGhKYXZhRGVsdGEoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCA6Ci0JCQkJdGhpcy5zeW5jaENvbXBpbGF0aW9uVW5pdFdpdGhKYXZhRGVsdGEoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7IC8vIHRoZSBldmVudCBpcyBzb21laG93IGxvd2VyIHRoYW4gYSBjb21waWxhdGlvbiB1bml0Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY2hDaGlsZHJlbldpdGhKYXZhRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZCA6IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkgewotCQkJdGhpcy5zeW5jaFdpdGhKYXZhRGVsdGEoY2hpbGQpOyAvLyByZWN1cnNlCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY2hDb21waWxhdGlvblVuaXRXaXRoSmF2YURlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCS8vIGlnbm9yZSBjaGFuZ2VzIHRvL2Zyb20gcHJpbWFyeSB3b3JraW5nIGNvcHkgLSBubyBjb250ZW50IGhhcyBjaGFuZ2VkOwotCQkvLyBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBvdGhlciBmbGFncyBzZXQgdGhhdCBpbmRpY2F0ZSBib3RoIGEgY2hhbmdlIHRvL2Zyb20KLQkJLy8gcHJpbWFyeSB3b3JraW5nIGNvcHkgQU5EIGNvbnRlbnQgaGFzIGNoYW5nZWQKLQkJaWYgKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1dPUktJTkdfQ09QWSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQpIHsKLQkJCS8vd2UgZ2V0IHRoZSBqYXZhIG5vdGlmaWNhdGlvbiBmb3IgcmVtb3ZhbCBiZWZvcmUgd2UgZ2V0IHRoZSByZXNvdXJjZSBub3RpZmljYXRpb24uCi0JCQkvL3dlIGRvIG5vdCBuZWVkIHRvIGhhbmRsZSB0aGlzIGV2ZW50IGFuZCB3aWxsIGdldCBleGNlcHRpb25zIGJ1aWxkaW5nIGFuIGFzdFJvb3QgaWYgd2UgdHJ5LgotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChkZWx0YS5nZXRFbGVtZW50KCkuZXF1YWxzKHRoaXMuanBhQ29tcGlsYXRpb25Vbml0LmdldENvbXBpbGF0aW9uVW5pdCgpKSkgewotCQkJLy9UT0RPIHBvc3NpYmx5IGhvcCBvbiB0aGUgVUkgdGhyZWFkIGhlcmUgc28gdGhhdCB3ZSBrbm93IG9ubHkgMSB0aHJlYWQgaXMgY2hhbmdpbmcgb3VyIG1vZGVsCi0JCQl0aGlzLmpwYUNvbXBpbGF0aW9uVW5pdC51cGRhdGVGcm9tSmF2YSgpOwotCQl9Ci0JfQotCi0JLy9idWcgMjM1Mzg0IC0gd2UgbmVlZCB0byB1cGRhdGUgYWxsIGNvbXBpbGF0aW9uIHVuaXRzIHdoZW4gYSBjbGFzc3BhdGggY2hhbmdlIG9jY3Vycy4KLQkvL1RoZSBwZXJzaXN0ZW5jZS5qYXIgY291bGQgaGF2ZSBiZWVuIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgY2xhc3NwYXRoIHdoaWNoIGFmZmVjdHMKLQkvL3doZXRoZXIgd2Uga25vdyBhYm91dCB0aGUganBhIGFubm90YXRpb25zIG9yIG5vdC4KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlT25DbGFzc3BhdGhDaGFuZ2VzKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChCaXRUb29scy5mbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgSUphdmFFbGVtZW50RGVsdGEuRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCkgfHwKLQkJCUJpdFRvb2xzLmZsYWdJc1NldChkZWx0YS5nZXRGbGFncygpLCBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSkgewotCQkJCXRoaXMuanBhQ29tcGlsYXRpb25Vbml0LnVwZGF0ZUZyb21KYXZhKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21SZXNvdXJjZSgpIHsKLQkJdGhpcy5qcGFDb21waWxhdGlvblVuaXQudXBkYXRlRnJvbUphdmEoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoKSB7Ci0JCXRoaXMuanBhQ29tcGlsYXRpb25Vbml0LnJlc29sdmVUeXBlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ODZhY2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRURmllbGRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUTWV0aG9kQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpwYUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWV0aG9kQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGVJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI8QXR0cmlidXRlPgotCWltcGxlbWVudHMgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZQotewotCi0JcHJpdmF0ZSBib29sZWFuIHR5cGVJc0Jhc2ljOwotCQotCXByaXZhdGUgU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lOwotCQotCXByaXZhdGUgYm9vbGVhbiB0eXBlSXNDb250YWluZXI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lOwotCQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaWNfOyAgLy8gJ3B1YmxpYycgaXMgYSByZXNlcnZlZCB3b3JkCi0JCi0JcHJpdmF0ZSBib29sZWFuIGZpbmFsXzsgIC8vICdmaW5hbCcgaXMgYSByZXNlcnZlZCB3b3JkCi0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgZmllbGQgYXR0cmlidXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0luc3RhbmNlKAotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUpwYUNvbXBpbGF0aW9uVW5pdCBqcGFDb21waWxhdGlvblVuaXQsCi0JCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gbmV3IEpEVEZpZWxkQXR0cmlidXRlKAotCQkJCWRlY2xhcmluZ1R5cGUsCi0JCQkJbmFtZSwKLQkJCQlvY2N1cnJlbmNlLAotCQkJCWpwYUNvbXBpbGF0aW9uVW5pdC5nZXRDb21waWxhdGlvblVuaXQoKSwKLQkJCQlqcGFDb21waWxhdGlvblVuaXQuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpLAotCQkJCWpwYUNvbXBpbGF0aW9uVW5pdC5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBmaWVsZCA9IG5ldyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlSW1wbChwYXJlbnQsIGF0dHJpYnV0ZSk7Ci0JCWZpZWxkLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0JCi0JLyoqCi0JICogY29uc3RydWN0IHByb3BlcnR5IGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdJbnN0YW5jZSgKLQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCU1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUpwYUNvbXBpbGF0aW9uVW5pdCBqcGFDb21waWxhdGlvblVuaXQsCi0JCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gSkRUTWV0aG9kQXR0cmlidXRlLm5ld0luc3RhbmNlKAotCQkJCWRlY2xhcmluZ1R5cGUsCi0JCQkJc2lnbmF0dXJlLAotCQkJCW9jY3VycmVuY2UsCi0JCQkJanBhQ29tcGlsYXRpb25Vbml0LmdldENvbXBpbGF0aW9uVW5pdCgpLAotCQkJCWpwYUNvbXBpbGF0aW9uVW5pdC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCksCi0JCQkJanBhQ29tcGlsYXRpb25Vbml0LmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGZpZWxkID0gbmV3IEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGVJbXBsKHBhcmVudCwgYXR0cmlidXRlKTsKLQkJZmllbGQuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJcmV0dXJuIGZpZWxkOwotCX0KLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZUltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKXsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRNZW1iZXIoKS5nZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JLy8gKioqKioqKiogQWJzdHJhY3RKYXZhUGVyc2lzdGVudFJlc291cmNlIGltcGxlbWVudGF0aW9uICoqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gYnVpbGRNYXBwaW5nQW5ub3RhdGlvbihTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZEF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uKHRoaXMsIGdldE1lbWJlcigpLCBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkQXR0cmlidXRlQW5ub3RhdGlvbih0aGlzLCBnZXRNZW1iZXIoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkTnVsbEF0dHJpYnV0ZUFubm90YXRpb24odGhpcywgZ2V0TWVtYmVyKCksIGFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gYnVpbGROdWxsTWFwcGluZ0Fubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZE51bGxBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbih0aGlzLCBnZXRNZW1iZXIoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gcG9zc2libGVNYXBwaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuYXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25OYW1lcygpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQb3NzaWJsZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuYXR0cmlidXRlQW5ub3RhdGlvbk5hbWVzKCksIGFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQb3NzaWJsZU1hcHBpbmdBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGdldEFubm90YXRpb25Qcm92aWRlcigpLmF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uTmFtZXMoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCS8vb3ZlcnJpZGluZyBwdXJlbHkgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcgeW91IGdldCBhdCB0aGUgY2xhc3MgbGV2ZWwKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gc3VwZXIuYW5ub3RhdGlvbnMobmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkvL292ZXJyaWRpbmcgcHVyZWx5IHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIHlvdSBnZXQgYXQgdGhlIGNsYXNzIGxldmVsCi0JcHVibGljIEl0ZXJhdG9yPEFubm90YXRpb24+IG1hcHBpbmdBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIHN1cGVyLm1hcHBpbmdBbm5vdGF0aW9ucygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkvL292ZXJyaWRpbmcgcHVyZWx5IHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIHlvdSBnZXQgYXQgdGhlIGNsYXNzIGxldmVsCi0JcHVibGljIEl0ZXJhdG9yPEFubm90YXRpb24+IGFubm90YXRpb25zKCkgewotCQlyZXR1cm4gc3VwZXIuYW5ub3RhdGlvbnMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJcmV0dXJuICgoTWV0aG9kQXR0cmlidXRlKSB0aGlzLmdldE1lbWJlcigpKS5tYXRjaGVzKHNpZ25hdHVyZSwgb2NjdXJyZW5jZSk7Ci0JfQotCi0JLy8gKioqKioqKiogSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvckZpZWxkKCkgewotCQlyZXR1cm4gZ2V0TWVtYmVyKCkuaXNGaWVsZCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvclByb3BlcnR5KCkgewotCQlyZXR1cm4gIWlzRm9yRmllbGQoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQW55QW5ub3RhdGlvbigpIHsKLQkJaWYgKG1hcHBpbmdBbm5vdGF0aW9uc1NpemUoKSA+IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhbm5vdGF0aW9uc1NpemUoKSA+IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljXzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHVibGljKGJvb2xlYW4gbmV3UHVibGljKSB7Ci0JCWJvb2xlYW4gb2xkUHVibGljID0gdGhpcy5wdWJsaWNfOwotCQl0aGlzLnB1YmxpY18gPSBuZXdQdWJsaWM7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUFVCTElDX1BST1BFUlRZLCBvbGRQdWJsaWMsIG5ld1B1YmxpYyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRmluYWwoKSB7Ci0JCXJldHVybiB0aGlzLmZpbmFsXzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmluYWwoYm9vbGVhbiBuZXdGaW5hbCkgewotCQlib29sZWFuIG9sZEZpbmFsID0gdGhpcy5maW5hbF87Ci0JCXRoaXMuZmluYWxfID0gbmV3RmluYWw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRklOQUxfUFJPUEVSVFksIG9sZEZpbmFsLCBuZXdGaW5hbCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHR5cGVJc0Jhc2ljKCkgewotCQlyZXR1cm4gdGhpcy50eXBlSXNCYXNpYzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHlwZUlzQmFzaWMoYm9vbGVhbiBuZXdUeXBlSXNCYXNpYykgewotCQlib29sZWFuIG9sZFR5cGVJc0Jhc2ljID0gdGhpcy50eXBlSXNCYXNpYzsKLQkJdGhpcy50eXBlSXNCYXNpYyA9IG5ld1R5cGVJc0Jhc2ljOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfSVNfQkFTSUNfUFJPUEVSVFksIG9sZFR5cGVJc0Jhc2ljLCBuZXdUeXBlSXNCYXNpYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucXVhbGlmaWVkVHlwZU5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFF1YWxpZmllZFR5cGVOYW1lKFN0cmluZyBuZXdRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlTdHJpbmcgb2xkUXVhbGlmaWVkVHlwZU5hbWUgPSB0aGlzLnF1YWxpZmllZFR5cGVOYW1lOwotCQl0aGlzLnF1YWxpZmllZFR5cGVOYW1lID0gbmV3UXVhbGlmaWVkVHlwZU5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVBTElGSUVEX1RZUEVfTkFNRV9QUk9QRVJUWSwgb2xkUXVhbGlmaWVkVHlwZU5hbWUsIG5ld1F1YWxpZmllZFR5cGVOYW1lKTsJCQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoU3RyaW5nIG5ld1F1YWxpZmllZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKSB7Ci0JCVN0cmluZyBvbGRRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSA9IHRoaXMucXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWU7Ci0JCXRoaXMucXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUgPSBuZXdRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChRVUFMSUZJRURfUkVGRVJFTkNFX0VOVElUWV9UWVBFX05BTUVfUFJPUEVSVFksIG9sZFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lLCBuZXdRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZShTdHJpbmcgbmV3UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lKSB7Ci0JCVN0cmluZyBvbGRRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWUgPSB0aGlzLnF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZTsKLQkJdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWUgPSBuZXdRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVBTElGSUVEX1JFRkVSRU5DRV9FTlRJVFlfRUxFTUVOVF9UWVBFX05BTUVfUFJPUEVSVFksIG9sZFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZSwgbmV3UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy50eXBlSXNDb250YWluZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFR5cGVJc0NvbnRhaW5lcihib29sZWFuIG5ld1R5cGVJc0NvbnRhaW5lcikgewotCQlib29sZWFuIG9sZFR5cGVJc0NvbnRhaW5lciA9IHRoaXMudHlwZUlzQ29udGFpbmVyOwotCQl0aGlzLnR5cGVJc0NvbnRhaW5lciA9IG5ld1R5cGVJc0NvbnRhaW5lcjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX0lTX0NPTlRBSU5FUl9QUk9QRVJUWSwgb2xkVHlwZUlzQ29udGFpbmVyLCBuZXdUeXBlSXNDb250YWluZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMudHlwZUlzQmFzaWMgPSB0aGlzLnR5cGVJc0Jhc2ljKGFzdFJvb3QpOwotCQl0aGlzLnF1YWxpZmllZFR5cGVOYW1lID0gdGhpcy5xdWFsaWZpZWRUeXBlTmFtZShhc3RSb290KTsKLQkJdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSA9IHRoaXMucXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMucXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lID0gdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMudHlwZUlzQ29udGFpbmVyID0gdGhpcy50eXBlSXNDb250YWluZXIoYXN0Um9vdCk7Ci0JCXRoaXMuZmluYWxfID0gdGhpcy5pc0ZpbmFsKGFzdFJvb3QpOwotCQl0aGlzLnB1YmxpY18gPSB0aGlzLmlzUHVibGljKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci51cGRhdGUoYXN0Um9vdCk7Ci0JCXRoaXMuc2V0VHlwZUlzQmFzaWModGhpcy50eXBlSXNCYXNpYyhhc3RSb290KSk7Ci0JCXRoaXMuc2V0UXVhbGlmaWVkVHlwZU5hbWUodGhpcy5xdWFsaWZpZWRUeXBlTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUodGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lKHRoaXMucXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRUeXBlSXNDb250YWluZXIodGhpcy50eXBlSXNDb250YWluZXIoYXN0Um9vdCkpOwotCQl0aGlzLnNldEZpbmFsKHRoaXMuaXNGaW5hbChhc3RSb290KSk7Ci0JCXRoaXMuc2V0UHVibGljKHRoaXMuaXNQdWJsaWMoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlc29sdmVUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5yZXNvbHZlVHlwZXMoYXN0Um9vdCk7Ci0JCXRoaXMuc2V0VHlwZUlzQmFzaWModGhpcy50eXBlSXNCYXNpYyhhc3RSb290KSk7Ci0JCXRoaXMuc2V0UXVhbGlmaWVkVHlwZU5hbWUodGhpcy5xdWFsaWZpZWRUeXBlTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUodGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lKHRoaXMucXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRUeXBlSXNDb250YWluZXIodGhpcy50eXBlSXNDb250YWluZXIoYXN0Um9vdCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHR5cGVJc0Jhc2ljKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0eXBlSXNCYXNpYyh0aGlzLmdldE1lbWJlcigpLmdldFR5cGVCaW5kaW5nKGFzdFJvb3QpLCBhc3RSb290LmdldEFTVCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGaW5hbChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJQmluZGluZyBiaW5kaW5nID0gZ2V0TWVtYmVyKCkuZ2V0QmluZGluZyhhc3RSb290KTsKLQkJcmV0dXJuIChiaW5kaW5nID09IG51bGwpID8gZmFsc2UgOiBNb2RpZmllci5pc0ZpbmFsKGJpbmRpbmcuZ2V0TW9kaWZpZXJzKCkpOwotCX0KLQkJCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQdWJsaWMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSUJpbmRpbmcgYmluZGluZyA9IGdldE1lbWJlcigpLmdldEJpbmRpbmcoYXN0Um9vdCk7CQotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IE1vZGlmaWVyLmlzUHVibGljKGJpbmRpbmcuZ2V0TW9kaWZpZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHF1YWxpZmllZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuZ2V0TWVtYmVyKCkuZ2V0VHlwZUJpbmRpbmcoYXN0Um9vdCk7Ci0JCXJldHVybiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgPyBudWxsIDogYnVpbGRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSh0eXBlQmluZGluZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKLQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0eXBlQmluZGluZy5pc0FycmF5KCkpIHsKLQkJCXJldHVybiBudWxsOyAgLy8gYXJyYXlzIGNhbm5vdCBiZSBlbnRpdGllcwotCQl9Ci0JCXJldHVybiB0eXBlQmluZGluZy5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgcXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuZ2V0TWVtYmVyKCkuZ2V0VHlwZUJpbmRpbmcoYXN0Um9vdCk7Ci0JCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUeXBlQmluZGluZ1tdIHR5cGVBcmd1bWVudHMgPSB0eXBlQmluZGluZy5nZXRUeXBlQXJndW1lbnRzKCk7Ci0JCWlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAhPSAxKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVHlwZUJpbmRpbmcgZWxlbWVudFR5cGVCaW5kaW5nID0gdHlwZUFyZ3VtZW50c1swXTsKLQkJU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSA9IGJ1aWxkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoZWxlbWVudFR5cGVCaW5kaW5nKTsKLQkJcmV0dXJuIHR5cGVOYW1lZElzQ29udGFpbmVyKGVsZW1lbnRUeXBlTmFtZSkgPyBudWxsIDogZWxlbWVudFR5cGVOYW1lOwotCX0KLQotCQotCXByb3RlY3RlZCBib29sZWFuIHR5cGVJc0NvbnRhaW5lcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBidWlsZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKHRoaXMuZ2V0TWVtYmVyKCkuZ2V0VHlwZUJpbmRpbmcoYXN0Um9vdCkpOwotCQlyZXR1cm4gKHR5cGVOYW1lID09IG51bGwpID8gZmFsc2UgOiB0eXBlTmFtZWRJc0NvbnRhaW5lcih0eXBlTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbm9uLWFycmF5IHR5cGUgaXMgb25lIG9mIHRoZSBjb250YWluZXIKLQkgKiB0eXBlcyBhbGxvd2VkIGJ5IHRoZSBKUEEgc3BlYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0eXBlTmFtZWRJc0NvbnRhaW5lcihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDT05UQUlORVJfVFlQRV9OQU1FUywgdHlwZU5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRBSU5FUl9UWVBFX05BTUVTID0gewotCQlqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEudXRpbC5TZXQuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLnV0aWwuTGlzdC5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEudXRpbC5NYXAuY2xhc3MuZ2V0TmFtZSgpCi0JfTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuZ2V0TWVtYmVyKCkuZ2V0VHlwZUJpbmRpbmcoYXN0Um9vdCk7Ci0JCXJldHVybiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgPyBudWxsIDogdHlwZUJpbmRpbmcuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotCQotCS8qKgotCSAqIEZyb20gdGhlIEpQQSBzcGVjLCB3aGVuIHRoZSBiYXNpYyBtYXBwaW5nIGFwcGxpZXM6Ci0JICogSWYgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nCi0JICogaXQgbXVzdCBiZSBtYXBwZWQgYXMgQEJhc2ljOgotCSAqICAgICBwcmltaXRpdmUgdHlwZXMKLQkgKiAgICAgYnl0ZVtdCi0JICogICAgIEJ5dGVbXQotCSAqICAgICBjaGFyW10KLQkgKiAgICAgQ2hhcmFjdGVyW10KLQkgKiAgICAgcHJpbWl0aXZlIHdyYXBwZXJzCi0JICogICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiAgICAgamF2YS5tYXRoLkJpZ0RlY2ltYWwKLQkgKiAgICAgamF2YS51dGlsLkRhdGUKLQkgKiAgICAgamF2YS51dGlsLkNhbGVuZGFyCi0JICogICAgIGphdmEuc3FsLkRhdGUKLQkgKiAgICAgamF2YS5zcWwuVGltZQotCSAqICAgICBqYXZhLnNxbC5UaW1lc3RhbXAKLQkgKiAgICAgZW51bXMKLQkgKiAgICAgYW55IG90aGVyIHR5cGUgdGhhdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHR5cGVJc0Jhc2ljKElUeXBlQmluZGluZyB0eXBlQmluZGluZywgQVNUIGFzdCkgewotCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOyAvLyB0eXBlIG5vdCBmb3VuZAotCQl9Ci0JCWlmICh0eXBlQmluZGluZy5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAodHlwZUJpbmRpbmcuaXNBcnJheSgpKSB7Ci0JCQlpZiAodHlwZUJpbmRpbmcuZ2V0RGltZW5zaW9ucygpID4gMSkgewotCQkJCXJldHVybiBmYWxzZTsgLy8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkCi0JCQl9Ci0JCQlJVHlwZUJpbmRpbmcgZWxlbWVudFR5cGVCaW5kaW5nID0gdHlwZUJpbmRpbmcuZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWlmIChlbGVtZW50VHlwZUJpbmRpbmcgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsvLyB1bmFibGUgdG8gcmVzb2x2ZSB0aGUgdHlwZQotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnRUeXBlSXNWYWxpZChlbGVtZW50VHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQlTdHJpbmcgdHlwZU5hbWUgPSB0eXBlQmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCWlmICh0eXBlSXNQcmltaXRpdmVXcmFwcGVyKHR5cGVOYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHR5cGVJc090aGVyU3VwcG9ydGVkVHlwZSh0eXBlTmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlQmluZGluZy5pc0VudW0oKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHR5cGVJbXBsZW1lbnRzU2VyaWFsaXphYmxlKHR5cGVCaW5kaW5nLCBhc3QpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0eXBlIGlzIGEgdmFsaWQgZWxlbWVudCB0eXBlIGZvcgotCSAqIGEgb25lLWRpbWVuc2lvbmFsIGFycmF5OgotCSAqICAgICBieXRlCi0JICogICAgIGNoYXIKLQkgKiAgICAgamF2YS5sYW5nLkJ5dGUKLQkgKiAgICAgamF2YS5sYW5nLkNoYXJhY3RlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZWxlbWVudFR5cGVJc1ZhbGlkKFN0cmluZyBlbGVtZW50VHlwZU5hbWUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhWQUxJRF9FTEVNRU5UX1RZUEVfTkFNRVMsIGVsZW1lbnRUeXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMSURfRUxFTUVOVF9UWVBFX05BTUVTID0gewotCQlieXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJY2hhci5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubGFuZy5CeXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzcy5nZXROYW1lKCkKLQl9OwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0eXBlIGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0eXBlSXNQcmltaXRpdmVXcmFwcGVyKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKFBSSU1JVElWRV9XUkFQUEVSX1RZUEVfTkFNRVMsIHR5cGVOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJJTUlUSVZFX1dSQVBQRVJfVFlQRV9OQU1FUyA9IHsKLQkJamF2YS5sYW5nLkJ5dGUuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLmxhbmcuQ2hhcmFjdGVyLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLkRvdWJsZS5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubGFuZy5GbG9hdC5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLkxvbmcuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLmxhbmcuU2hvcnQuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCksCi0JfTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyBhbW9uZyB0aGUgdmFyaW91cyBvdGhlciB0eXBlcwotCSAqIHRoYXQgZGVmYXVsdCB0byBhIEJhc2ljIG1hcHBpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0eXBlSXNPdGhlclN1cHBvcnRlZFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoT1RIRVJfU1VQUE9SVEVEX1RZUEVfTkFNRVMsIHR5cGVOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT1RIRVJfU1VQUE9SVEVEX1RZUEVfTkFNRVMgPSB7Ci0JCWphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS51dGlsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLnV0aWwuQ2FsZW5kYXIuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLnNxbC5EYXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5zcWwuVGltZS5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEuc3FsLlRpbWVzdGFtcC5jbGFzcy5nZXROYW1lKCksCi0JfTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHR5cGVJbXBsZW1lbnRzU2VyaWFsaXphYmxlKElUeXBlQmluZGluZyB0eXBlQmluZGluZywgQVNUIGFzdCkgewotCQlJVHlwZUJpbmRpbmcgc2VyaWFsaXphYmxlVHlwZUJpbmRpbmcgPSBhc3QucmVzb2x2ZVdlbGxLbm93blR5cGUoU0VSSUFMSVpBQkxFX1RZUEVfTkFNRSk7Ci0JCXJldHVybiB0eXBlQmluZGluZy5pc0Fzc2lnbm1lbnRDb21wYXRpYmxlKHNlcmlhbGl6YWJsZVR5cGVCaW5kaW5nKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSSUFMSVpBQkxFX1RZUEVfTkFNRSA9IGphdmEuaW8uU2VyaWFsaXphYmxlLmNsYXNzLmdldE5hbWUoKTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChnZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMDcwOTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KcGFDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvdW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlSW1wbAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyPFR5cGU+Ci0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZQotewotCXByaXZhdGUgU3RyaW5nIHF1YWxpZmllZE5hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgc3VwZXJDbGFzc1F1YWxpZmllZE5hbWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWJzdHJhY3RfOyAgLy8gJ2Fic3RyYWN0JyBpcyBhIHJlc2VydmVkIHdvcmQKLQotCS8qKgotCSAqIHN0b3JlIGFsbCBtZW1iZXIgdHlwZXMgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlbid0IHBlcnNpc3RhYmxlIHNvIHdlIGNhbgotCSAqIGdlbmVyYXRlIHZhbGlkYXRpb24gZXJyb3JzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IG5lc3RlZFR5cGVzOwotCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gZmllbGRzOwotCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gbWV0aG9kczsKLQotCXByaXZhdGUgQWNjZXNzVHlwZSBhY2Nlc3NUeXBlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBidWlsZCB0b3AtbGV2ZWwgcGVyc2lzdGVudCB0eXBlCi0JICovCi0JLy8gVE9ETyB1c2UgSlBBIGZhY3RvcnkKLQlwdWJsaWMgc3RhdGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIG5ld0luc3RhbmNlKAotCQkJSnBhQ29tcGlsYXRpb25Vbml0IGpwYUNvbXBpbGF0aW9uVW5pdCwKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sCi0JCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUeXBlIHR5cGUgPSBuZXcgSkRUVHlwZSgKLQkJCQl0eXBlRGVjbGFyYXRpb24sCi0JCQkJanBhQ29tcGlsYXRpb25Vbml0LmdldENvbXBpbGF0aW9uVW5pdCgpLAotCQkJCWpwYUNvbXBpbGF0aW9uVW5pdC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCksCi0JCQkJanBhQ29tcGlsYXRpb25Vbml0LmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0gbmV3IEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlSW1wbChqcGFDb21waWxhdGlvblVuaXQsIHR5cGUpOwotCQlqcnB0LmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXJldHVybiBqcnB0OwkKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBuZXN0ZWQgcGVyc2lzdGVudCB0eXBlCi0JICovCi0JLy8gVE9ETyB1c2UgSlBBIGZhY3RvcnkKLQlwcm90ZWN0ZWQgc3RhdGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIG5ld0luc3RhbmNlKAotCQkJSnBhQ29tcGlsYXRpb25Vbml0IGpwYUNvbXBpbGF0aW9uVW5pdCwKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVR5cGUgdHlwZSA9IG5ldyBKRFRUeXBlKAotCQkJCWRlY2xhcmluZ1R5cGUsCi0JCQkJdHlwZURlY2xhcmF0aW9uLAotCQkJCW9jY3VycmVuY2UsCi0JCQkJanBhQ29tcGlsYXRpb25Vbml0LmdldENvbXBpbGF0aW9uVW5pdCgpLAotCQkJCWpwYUNvbXBpbGF0aW9uVW5pdC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCksCi0JCQkJanBhQ29tcGlsYXRpb25Vbml0LmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0gbmV3IEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlSW1wbChqcGFDb21waWxhdGlvblVuaXQsIHR5cGUpOwotCQlqcnB0LmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXJldHVybiBqcnB0OwkKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVJbXBsKEpwYUNvbXBpbGF0aW9uVW5pdCBqcGFDb21waWxhdGlvblVuaXQsIFR5cGUgdHlwZSkgewotCQlzdXBlcihqcGFDb21waWxhdGlvblVuaXQsIHR5cGUpOwotCQl0aGlzLm5lc3RlZFR5cGVzID0gbmV3IFZlY3RvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4oKTsgCi0JCXRoaXMuZmllbGRzID0gbmV3IFZlY3RvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQl0aGlzLm1ldGhvZHMgPSBuZXcgVmVjdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLnF1YWxpZmllZE5hbWUgPSB0aGlzLmJ1aWxkUXVhbGlmaWVkTmFtZShhc3RSb290KTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMuc3VwZXJDbGFzc1F1YWxpZmllZE5hbWUgPSB0aGlzLmJ1aWxkU3VwZXJDbGFzc1F1YWxpZmllZE5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMuYWJzdHJhY3RfID0gdGhpcy5idWlsZEFic3RyYWN0KGFzdFJvb3QpOwotCQl0aGlzLmluaXRpYWxpemVOZXN0ZWRUeXBlcyhhc3RSb290KTsKLQkJdGhpcy5pbml0aWFsaXplRmllbGRzKGFzdFJvb3QpOwotCQl0aGlzLmluaXRpYWxpemVNZXRob2RzKGFzdFJvb3QpOwotCQl0aGlzLmFjY2Vzc1R5cGUgPSB0aGlzLmJ1aWxkQWNjZXNzVHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVOZXN0ZWRUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAoKTsKLQkJZm9yIChUeXBlRGVjbGFyYXRpb24gdGQgOiB0aGlzLmdldE1lbWJlcigpLmdldFR5cGVzKGFzdFJvb3QpKSB7Ci0JCQlTdHJpbmcgdGROYW1lID0gdGQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJaW50IG9jY3VycmVuY2UgPSBjb3VudGVycy5pbmNyZW1lbnQodGROYW1lKTsKLQkJCXRoaXMubmVzdGVkVHlwZXMuYWRkKHRoaXMuYnVpbGROZXN0ZWRUeXBlKHRkLCBvY2N1cnJlbmNlLCBhc3RSb290KSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmllbGRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvdW50ZXJNYXAgY291bnRlcnMgPSBuZXcgQ291bnRlck1hcCgpOwotCQlmb3IgKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA6IHRoaXMuZ2V0TWVtYmVyKCkuZ2V0RmllbGRzKGFzdFJvb3QpKSB7Ci0JCQlmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA6IGZyYWdtZW50cyhmaWVsZERlY2xhcmF0aW9uKSkgewotCQkJCVN0cmluZyBmaWVsZE5hbWUgPSBmcmFnbWVudC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJaW50IG9jY3VycmVuY2UgPSBjb3VudGVycy5pbmNyZW1lbnQoZmllbGROYW1lKTsKLQkJCQl0aGlzLmZpZWxkcy5hZGQodGhpcy5idWlsZEZpZWxkKGZpZWxkTmFtZSwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1ldGhvZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKCk7Ci0JCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiB0aGlzLmdldE1lbWJlcigpLmdldE1ldGhvZHMoYXN0Um9vdCkpIHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUgPSBKRFRUb29scy5idWlsZE1ldGhvZFNpZ25hdHVyZShtZXRob2REZWNsYXJhdGlvbik7Ci0JCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudChzaWduYXR1cmUpOwotCQkJdGhpcy5tZXRob2RzLmFkZCh0aGlzLmJ1aWxkTWV0aG9kKHNpZ25hdHVyZSwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0SmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBidWlsZE1hcHBpbmdBbm5vdGF0aW9uKFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkVHlwZU1hcHBpbmdBbm5vdGF0aW9uKHRoaXMsIGdldE1lbWJlcigpLCBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBidWlsZE51bGxNYXBwaW5nQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkTnVsbFR5cGVNYXBwaW5nQW5ub3RhdGlvbih0aGlzLCBnZXRNZW1iZXIoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkVHlwZUFubm90YXRpb24odGhpcywgZ2V0TWVtYmVyKCksIGFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkTnVsbFR5cGVBbm5vdGF0aW9uKHRoaXMsIGdldE1lbWJlcigpLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBwb3NzaWJsZU1hcHBpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS50eXBlTWFwcGluZ0Fubm90YXRpb25OYW1lcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bvc3NpYmxlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS50eXBlQW5ub3RhdGlvbk5hbWVzKCksIGFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQb3NzaWJsZU1hcHBpbmdBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGdldEFubm90YXRpb25Qcm92aWRlcigpLnR5cGVNYXBwaW5nQW5ub3RhdGlvbk5hbWVzKCksIGFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JLy9vdmVycmlkaW5nIHB1cmVseSB0byBzdXBwcmVzcyB0aGUgd2FybmluZyB5b3UgZ2V0IGF0IHRoZSBjbGFzcyBsZXZlbAotCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyhTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBzdXBlci5hbm5vdGF0aW9ucyhuZXN0YWJsZUFubm90YXRpb25OYW1lLCBjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCS8vb3ZlcnJpZGluZyBwdXJlbHkgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcgeW91IGdldCBhdCB0aGUgY2xhc3MgbGV2ZWwKLQlwdWJsaWMgSXRlcmF0b3I8QW5ub3RhdGlvbj4gbWFwcGluZ0Fubm90YXRpb25zKCkgewotCQlyZXR1cm4gc3VwZXIubWFwcGluZ0Fubm90YXRpb25zKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCS8vb3ZlcnJpZGluZyBwdXJlbHkgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcgeW91IGdldCBhdCB0aGUgY2xhc3MgbGV2ZWwKLQlwdWJsaWMgSXRlcmF0b3I8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBzdXBlci5hbm5vdGF0aW9ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlc29sdmVUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5yZXNvbHZlVHlwZXMoYXN0Um9vdCk7Ci0KLQkJdGhpcy5zZXRTdXBlckNsYXNzUXVhbGlmaWVkTmFtZSh0aGlzLmJ1aWxkU3VwZXJDbGFzc1F1YWxpZmllZE5hbWUoYXN0Um9vdCkpOwotCi0JCWZvciAoSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gdGhpcy5maWVsZHNfKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKS5yZXNvbHZlVHlwZXMoYXN0Um9vdCk7Ci0JCX0KLQotCQkvLyBhIG5ldyB0eXBlIGNhbiB0cmlnZ2VyIGEgbWV0aG9kIHBhcmFtZXRlciB0eXBlIHRvIGJlIGEgcmVzb2x2ZWQsCi0JCS8vIGZ1bGx5LXF1YWxpZmllZCBuYW1lLCBzbyB3ZSBuZWVkIHRvIHJlYnVpbGQgb3VyIGxpc3Qgb2YgbWV0aG9kczoKLQkJLy8gICAgICJzZXRGb28oRm9vKSIgaXMgbm90IHRoZSBzYW1lIGFzICJzZXRGb28oY29tLmJhci5Gb28pIgotCQkvLyBhbmQsIHZpY2UtdmVyc2EsIGEgcmVtb3ZlZCB0eXBlIGNhbiAidW5yZXNvbHZlIiBhIHBhcmFtZXRlciB0eXBlCi0JCXRoaXMudXBkYXRlTWV0aG9kcyhhc3RSb290KTsKLQotCQlmb3IgKEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHRoaXMubWV0aG9kc18oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLnJlc29sdmVUeXBlcyhhc3RSb290KTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBzdHJlYW0gPSB0aGlzLm5lc3RlZFR5cGVzXygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCkucmVzb2x2ZVR5cGVzKGFzdFJvb3QpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGltcGxlbWVudGF0aW9uICoqKioqKioqCi0KLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJLy8gVE9ETyBub3Qgc3VyZSB3aHkgYSBudWxsIG5hbWUgaXMgY29taW5nIHRocm91Z2ggaGVyZS4uLiAgfmJqdgotLy8JCWlmIChmdWxseVF1YWxpZmllZFR5cGVOYW1lLmVxdWFscyh0aGlzLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLQkJaWYgKHRoaXMuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhmdWxseVF1YWxpZmllZFR5cGVOYW1lKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gc3RyZWFtID0gdGhpcy5uZXN0ZWRUeXBlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJLy8gcmVjdXJzZQotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgbmVzdGVkSlJQVCA9IGpycHQuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCQlpZiAobmVzdGVkSlJQVCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5lc3RlZEpSUFQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgb25seSBwZXJzaXN0YWJsZSBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55QXR0cmlidXRlQW5ub3RhdGlvbnMoKSB7Ci0JCWZvciAoSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gdGhpcy5hdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaGFzQW55QW5ub3RhdGlvbigpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogbmVzdGVkIHR5cGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIHJldHVybiBvbmx5IHBlcnNpc3RhYmxlIG5lc3RlZCB0eXBlcwotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gbmVzdGVkVHlwZXMoKSB7Ci0JCS8vVE9ETyBzaW5jZSB3ZSBhcmUgZmlsdGVyaW5nIGhvdyBkbyB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSB0eXBlIGJlY29tZXMgcGVyc2lzdGFibGU/Ci0JCS8vd2hhdCBraW5kIG9mIGNoYW5nZSBub3RpZmljaWF0aW9uIGZvciB0aGF0IGNhc2U/Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPih0aGlzLm5lc3RlZFR5cGVzXygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCQkJcmV0dXJuIGpycHQuaXNQZXJzaXN0YWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqICphbGwqIG5lc3RlZCB0eXBlcwotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gbmVzdGVkVHlwZXNfKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+KHRoaXMubmVzdGVkVHlwZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5lc3RlZFR5cGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgbmVzdGVkVHlwZSkgewotCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24obmVzdGVkVHlwZSwgdGhpcy5uZXN0ZWRUeXBlcywgTkVTVEVEX1RZUEVTX0NPTExFQ1RJT04pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5lc3RlZFR5cGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgbmVzdGVkVHlwZSkgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihuZXN0ZWRUeXBlLCB0aGlzLm5lc3RlZFR5cGVzLCBORVNURURfVFlQRVNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTmVzdGVkVHlwZXMoQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gcmVtb3ZlKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMubmVzdGVkVHlwZXMsIE5FU1RFRF9UWVBFU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0TmVzdGVkVHlwZShTdHJpbmcgdHlwZU5hbWUsIGludCBvY2N1cnJlbmNlKSB7Ci0JCWZvciAoSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHN0cmVhbSA9IHRoaXMubmVzdGVkVHlwZXNfKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgbmVzdGVkVHlwZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobmVzdGVkVHlwZS5pc0Zvcih0eXBlTmFtZSwgb2NjdXJyZW5jZSkpIHsKLQkJCQlyZXR1cm4gbmVzdGVkVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiByZXR1cm4gb25seSBwZXJzaXN0YWJsZSBhdHRyaWJ1dGVzCi0JICovCi0JLy8gVE9ETyBzaW5jZSB3ZSBhcmUgZmlsdGVyaW5nLCBob3cgZG8gd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIGF0dHJpYnV0ZSBiZWNvbWVzIHBlcnNpc3RhYmxlPwotCS8vIHdoYXQga2luZCBvZiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZvciB0aGF0IGNhc2U/Ci0JcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBwZXJzaXN0YWJsZU1lbWJlcnModGhpcy5hdHRyaWJ1dGVzXygpKTsKLQl9Ci0KLQkvKioKLQkgKiAqYWxsKiBmaWVsZHMgYW5kIG1ldGhvZHMKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlc18oKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5maWVsZHNfKCksIHRoaXMubWV0aG9kc18oKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZpZWxkcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiByZXR1cm4gb25seSBwZXJzaXN0YWJsZSBmaWVsZHMKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gZmllbGRzKCkgewotCQlyZXR1cm4gcGVyc2lzdGFibGVNZW1iZXJzKHRoaXMuZmllbGRzXygpKTsKLQl9Ci0JCi0JLyoqCi0JICogKmFsbCogZmllbGRzCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGZpZWxkc18oKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLmZpZWxkcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmllbGQoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKGF0dHJpYnV0ZSwgdGhpcy5maWVsZHMsIEFUVFJJQlVURVNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRmllbGQoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oYXR0cmlidXRlLCB0aGlzLmZpZWxkcywgQVRUUklCVVRFU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGaWVsZHMoQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiByZW1vdmUpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHJlbW92ZSwgdGhpcy5maWVsZHMsIEFUVFJJQlVURVNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0RmllbGQoU3RyaW5nIGZpZWxkTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJZm9yIChJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSB0aGlzLmZpZWxkc18oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGZpZWxkID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChmaWVsZC5pc0ZvcihmaWVsZE5hbWUsIG9jY3VycmVuY2UpKSB7Ci0JCQkJcmV0dXJuIGZpZWxkOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIHJldHVybiBvbmx5IHBlcnNpc3RhYmxlIHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHBlcnNpc3RhYmxlTWVtYmVycyh0aGlzLm1ldGhvZHNfKCkpOwotCX0KLQotCS8qKgotCSAqICphbGwqIG1ldGhvZHMKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gbWV0aG9kc18oKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLm1ldGhvZHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGhvZChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oYXR0cmlidXRlLCB0aGlzLm1ldGhvZHMsIEFUVFJJQlVURVNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWV0aG9kKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKGF0dHJpYnV0ZSwgdGhpcy5tZXRob2RzLCBBVFRSSUJVVEVTX0NPTExFQ1RJT04pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1ldGhvZHMoQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiByZW1vdmUpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHJlbW92ZSwgdGhpcy5tZXRob2RzLCBBVFRSSUJVVEVTX0NPTExFQ1RJT04pOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGdldE1ldGhvZChNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlLCBpbnQgb2NjdXJyZW5jZSkgewotCQlmb3IgKEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHRoaXMubWV0aG9kc18oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIG1ldGhvZCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobWV0aG9kLmlzRm9yKHNpZ25hdHVyZSwgb2NjdXJyZW5jZSkpIHsKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaW1wbGUgaW5zdGFuY2UgdmFyaWFibGVzICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucXVhbGlmaWVkTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRRdWFsaWZpZWROYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnF1YWxpZmllZE5hbWU7Ci0JCXRoaXMucXVhbGlmaWVkTmFtZSA9IHF1YWxpZmllZE5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChRVUFMSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkLCBxdWFsaWZpZWROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zdXBlckNsYXNzUXVhbGlmaWVkTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdXBlckNsYXNzUXVhbGlmaWVkTmFtZShTdHJpbmcgc3VwZXJDbGFzc1F1YWxpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3VwZXJDbGFzc1F1YWxpZmllZE5hbWU7Ci0JCXRoaXMuc3VwZXJDbGFzc1F1YWxpZmllZE5hbWUgPSBzdXBlckNsYXNzUXVhbGlmaWVkTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNVUEVSX0NMQVNTX1FVQUxJRklFRF9OQU1FX1BST1BFUlRZLCBvbGQsIHN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkgewotCQlyZXR1cm4gdGhpcy5hYnN0cmFjdF87Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWJzdHJhY3QoYm9vbGVhbiBhYnN0cmFjdF8pIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmFic3RyYWN0XzsKLQkJdGhpcy5hYnN0cmFjdF8gPSBhYnN0cmFjdF87Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBQlNUUkFDVF9QUk9QRVJUWSwgb2xkLCBhYnN0cmFjdF8pOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuYWNjZXNzVHlwZTsKLQl9Ci0KLQkvLyBUT0RPCi0JLy9zZWVtcyB3ZSBjb3VsZCBoYXZlIGEgcHVibGljIGNoYW5nZUFjY2VzcygpIGFwaSB3aGljaCB3b3VsZAotCS8vbW92ZSBhbGwgYW5ub3RhdGlvbnMgZnJvbSBmaWVsZHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBtZXRob2RzIG9yIHZpY2UgdmVyc2EKLQkvL3Rob3VnaCBvZiBjb3Vyc2UgaXQncyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gdGhhdCBzaW5jZSB3aGF0IGlmIHRoZQotCS8vY29ycmVzcG9uZGluZyBmaWVsZC9tZXRob2QgZG9lcyBub3QgZXhpc3Q/Ci0JLy9tYWtpbmcgdGhpcyBpbnRlcm5hbCBzaW5jZSBpdCBzaG91bGQgb25seSBiZSBzZXQgYmFzZWQgb24gY2hhbmdlcyBpbiB0aGUgc291cmNlLCB0aGUKLQkvL2NvbnRleHQgbW9kZWwgc2hvdWxkIG5vdCBuZWVkIHRvIHNldCB0aGlzCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSkgewotCQlBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuYWNjZXNzVHlwZTsKLQkJdGhpcy5hY2Nlc3NUeXBlID0gYWNjZXNzVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFDQ0VTU19QUk9QRVJUWSwgb2xkLCBhY2Nlc3NUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdXBkYXRlIGZyb20gSmF2YSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOwotCQl0aGlzLnNldFF1YWxpZmllZE5hbWUodGhpcy5idWlsZFF1YWxpZmllZE5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnNldE5hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnNldFN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lKHRoaXMuYnVpbGRTdXBlckNsYXNzUXVhbGlmaWVkTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0QWJzdHJhY3QodGhpcy5idWlsZEFic3RyYWN0KGFzdFJvb3QpKTsKLQkJdGhpcy51cGRhdGVOZXN0ZWRUeXBlcyhhc3RSb290KTsKLQkJdGhpcy51cGRhdGVGaWVsZHMoYXN0Um9vdCk7Ci0JCXRoaXMudXBkYXRlTWV0aG9kcyhhc3RSb290KTsKLQkJdGhpcy5zZXRBY2Nlc3ModGhpcy5idWlsZEFjY2Vzc1R5cGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmVzdGVkVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IG5lc3RlZFR5cGVzVG9SZW1vdmUgPSAoVmVjdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPikgdGhpcy5uZXN0ZWRUeXBlcy5jbG9uZSgpOwotCQlmb3IgKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gOiB0aGlzLmdldE1lbWJlcigpLmdldFR5cGVzKGFzdFJvb3QpKSB7Ci0JCQlTdHJpbmcgdGROYW1lID0gdHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCWludCBvY2N1cnJlbmNlID0gY291bnRlcnMuaW5jcmVtZW50KHRkTmFtZSk7Ci0KLQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIG5lc3RlZFR5cGUgPSB0aGlzLmdldE5lc3RlZFR5cGUodGROYW1lLCBvY2N1cnJlbmNlKTsKLQkJCWlmIChuZXN0ZWRUeXBlID09IG51bGwpIHsKLQkJCQl0aGlzLmFkZE5lc3RlZFR5cGUodGhpcy5idWlsZE5lc3RlZFR5cGUodHlwZURlY2xhcmF0aW9uLCBvY2N1cnJlbmNlLCBhc3RSb290KSk7Ci0JCQl9IGVsc2UgewotCQkJCW5lc3RlZFR5cGVzVG9SZW1vdmUucmVtb3ZlKG5lc3RlZFR5cGUpOwotCQkJCW5lc3RlZFR5cGUudXBkYXRlKGFzdFJvb3QpOwotCQkJfQotCQl9Ci0JCXRoaXMucmVtb3ZlTmVzdGVkVHlwZXMobmVzdGVkVHlwZXNUb1JlbW92ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRmllbGRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvdW50ZXJNYXAgY291bnRlcnMgPSBuZXcgQ291bnRlck1hcCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJVmVjdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGZpZWxkc1RvUmVtb3ZlID0gKFZlY3RvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPikgdGhpcy5maWVsZHMuY2xvbmUoKTsKLQkJZm9yIChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gOiB0aGlzLmdldE1lbWJlcigpLmdldEZpZWxkcyhhc3RSb290KSkgewotCQkJZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgOiBmcmFnbWVudHMoZmllbGREZWNsYXJhdGlvbikpIHsKLQkJCQlTdHJpbmcgZmllbGROYW1lID0gZnJhZ21lbnQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCWludCBvY2N1cnJlbmNlID0gY291bnRlcnMuaW5jcmVtZW50KGZpZWxkTmFtZSk7Ci0KLQkJCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGZpZWxkID0gdGhpcy5nZXRGaWVsZChmaWVsZE5hbWUsIG9jY3VycmVuY2UpOwotCQkJCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuYWRkRmllbGQodGhpcy5idWlsZEZpZWxkKGZpZWxkTmFtZSwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpZWxkc1RvUmVtb3ZlLnJlbW92ZShmaWVsZCk7Ci0JCQkJCWZpZWxkLnVwZGF0ZShhc3RSb290KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhpcy5yZW1vdmVGaWVsZHMoZmllbGRzVG9SZW1vdmUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1ldGhvZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gbWV0aG9kc1RvUmVtb3ZlID0gKFZlY3RvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPikgdGhpcy5tZXRob2RzLmNsb25lKCk7Ci0JCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiB0aGlzLmdldE1lbWJlcigpLmdldE1ldGhvZHMoYXN0Um9vdCkpIHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUgPSBKRFRUb29scy5idWlsZE1ldGhvZFNpZ25hdHVyZShtZXRob2REZWNsYXJhdGlvbik7Ci0JCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudChzaWduYXR1cmUpOwotCi0JCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIG1ldGhvZCA9IHRoaXMuZ2V0TWV0aG9kKHNpZ25hdHVyZSwgb2NjdXJyZW5jZSk7Ci0JCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCQl0aGlzLmFkZE1ldGhvZCh0aGlzLmJ1aWxkTWV0aG9kKHNpZ25hdHVyZSwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOwotCQkJfSBlbHNlIHsKLQkJCQltZXRob2RzVG9SZW1vdmUucmVtb3ZlKG1ldGhvZCk7Ci0JCQkJbWV0aG9kLnVwZGF0ZShhc3RSb290KTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlbW92ZU1ldGhvZHMobWV0aG9kc1RvUmVtb3ZlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYnVpbGRpbmcgc3RhdGUgZnJvbSBBU1QgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFF1YWxpZmllZE5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWVtYmVyKCkuZ2V0QmluZGluZyhhc3RSb290KS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZE5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWVtYmVyKCkuZ2V0QmluZGluZyhhc3RSb290KS5nZXROYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuZ2V0TWVtYmVyKCkuZ2V0QmluZGluZyhhc3RSb290KTsKLQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUeXBlQmluZGluZyBzdXBlckNsYXNzVHlwZUJpbmRpbmcgPSB0eXBlQmluZGluZy5nZXRTdXBlcmNsYXNzKCk7Ci0JCWlmIChzdXBlckNsYXNzVHlwZUJpbmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyQ2xhc3NUeXBlQmluZGluZy5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRBYnN0cmFjdChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gTW9kaWZpZXIuaXNBYnN0cmFjdCh0aGlzLmdldE1lbWJlcigpLmdldEJpbmRpbmcoYXN0Um9vdCkuZ2V0TW9kaWZpZXJzKCkpOwkKLQl9Ci0KLQkvLyBUT0RPIHVzZSBKUEEgZmFjdG9yeQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZE5lc3RlZFR5cGUoVHlwZURlY2xhcmF0aW9uIG5lc3RlZFR5cGVEZWNsYXJhdGlvbiwgaW50IG9jY3VycmVuY2UsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZSh0aGlzLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpLCB0aGlzLmdldE1lbWJlcigpLCBuZXN0ZWRUeXBlRGVjbGFyYXRpb24sIG9jY3VycmVuY2UsIGFzdFJvb3QpOwotCX0KLQotCS8vIFRPRE8gdXNlIEpQQSBmYWN0b3J5Ci0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRGaWVsZChTdHJpbmcgZmllbGROYW1lLCBpbnQgb2NjdXJyZW5jZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGVJbXBsLm5ld0luc3RhbmNlKHRoaXMsIHRoaXMuZ2V0TWVtYmVyKCksIGZpZWxkTmFtZSwgb2NjdXJyZW5jZSwgdGhpcy5nZXRKcGFDb21waWxhdGlvblVuaXQoKSwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gVE9ETyB1c2UgSlBBIGZhY3RvcnkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZE1ldGhvZChNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlLCBpbnQgb2NjdXJyZW5jZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGVJbXBsLm5ld0luc3RhbmNlKHRoaXMsIHRoaXMuZ2V0TWVtYmVyKCksIHNpZ25hdHVyZSwgb2NjdXJyZW5jZSwgdGhpcy5nZXRKcGFDb21waWxhdGlvblVuaXQoKSwgYXN0Um9vdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBBY2Nlc3NUeXBlIGN1cnJlbnRseSBpbXBsaWVkIGJ5IHRoZSBKYXZhIHNvdXJjZSBjb2RlOgotCSAqICAgICAtIGlmIG9ubHkgRmllbGRzIGFyZSBhbm5vdGF0ZWQgPT4gRklFTEQKLQkgKiAgICAgLSBpZiBvbmx5IFByb3BlcnRpZXMgYXJlIGFubm90YXRlZCA9PiBQUk9QRVJUWQotCSAqICAgICAtIGlmIGJvdGggRmllbGRzIGFuZCBQcm9wZXJ0aWVzIGFyZSBhbm5vdGF0ZWQgPT4gRklFTEQKLQkgKiAgICAgLSBpZiBub3RoaW5nIGlzIGFubm90YXRlZAotCSAqICAgICAJCS0gYW5kIGZpZWxkcyBleGlzdCA9PiBGSUVMRAotCSAqICAgICAJCS0gYW5kIHByb3BlcnRpZXMgZXhpc3QsIGJ1dCBubyBmaWVsZHMgZXhpc3QgPT4gUFJPUEVSVFkKLQkgKiAgICAgCQktIGFuZCBuZWl0aGVyIGZpZWxkcyBub3IgcHJvcGVydGllcyBleGlzdCA9PiBudWxsIGF0IHRoaXMgbGV2ZWwgKEZJRUxEIGluIHRoZSBjb250ZXh0IG1vZGVsKQotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGJ1aWxkQWNjZXNzVHlwZSgpIHsKLQkJYm9vbGVhbiBoYXNQZXJzaXN0YWJsZUZpZWxkcyA9IGZhbHNlOwotCQlib29sZWFuIGhhc1BlcnNpc3RhYmxlUHJvcGVydGllcyA9IGZhbHNlOwotCQlmb3IgKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZmllbGQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoZmllbGRzKCkpKSB7Ci0JCQloYXNQZXJzaXN0YWJsZUZpZWxkcyA9IHRydWU7Ci0JCQlpZiAoZmllbGQuaGFzQW55QW5ub3RhdGlvbigpKSB7Ci0JCQkJLy8gYW55IGZpZWxkIGlzIGFubm90YXRlZCA9PiBGSUVMRAotCQkJCXJldHVybiBBY2Nlc3NUeXBlLkZJRUxEOwotCQkJfQotCQl9Ci0JCWZvciAoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwcm9wZXJ0eSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShwcm9wZXJ0aWVzKCkpKSB7Ci0JCQloYXNQZXJzaXN0YWJsZVByb3BlcnRpZXMgPSB0cnVlOwotCQkJaWYgKHByb3BlcnR5Lmhhc0FueUFubm90YXRpb24oKSkgewotCQkJCS8vIG5vbmUgb2YgdGhlIGZpZWxkcyBhcmUgYW5ub3RhdGVkIGFuZCBhIGdldHRlciBpcyBhbm5vdGF0ZWQgPT4gUFJPUEVSVFkKLQkJCQlyZXR1cm4gQWNjZXNzVHlwZS5QUk9QRVJUWTsKLQkJCX0KLQkJfQotCi0JCWlmIChoYXNQZXJzaXN0YWJsZVByb3BlcnRpZXMgJiYgIWhhc1BlcnNpc3RhYmxlRmllbGRzKSB7Ci0JCQlyZXR1cm4gQWNjZXNzVHlwZS5QUk9QRVJUWTsKLQkJfQotCQkvL25vIGFubm90YXRpb25zIGV4aXN0LCBhY2Nlc3MgaXMgbnVsbCBhdCB0aGUgcmVzb3VyY2UgbW9kZWwgbGV2ZWwKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50PiBmcmFnbWVudHMoRmllbGREZWNsYXJhdGlvbiBmZCkgewotCQlyZXR1cm4gZmQuZnJhZ21lbnRzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0cmluZ0NvdW50ZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDb3VudGVyTWFwIHsKLQkJSGFzaE1hcDxPYmplY3QsIENvdW50ZXI+IGNvdW50ZXJzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBDb3VudGVyPigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGluY3JlbWVudGVkIGNvdW50IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkJICovCi0JCWludCBpbmNyZW1lbnQoT2JqZWN0IG8pIHsKLQkJCUNvdW50ZXIgY291bnRlciA9IHRoaXMuY291bnRlcnMuZ2V0KG8pOwotCQkJaWYgKGNvdW50ZXIgPT0gbnVsbCkgewotCQkJCWNvdW50ZXIgPSBuZXcgQ291bnRlcigpOwotCQkJCXRoaXMuY291bnRlcnMucHV0KG8sIGNvdW50ZXIpOwotCQkJfQotCQkJY291bnRlci5pbmNyZW1lbnQoKTsKLQkJCXJldHVybiBjb3VudGVyLmNvdW50KCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5JbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDk3NjVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGNsYXNzIEpvaW5Db2x1bW5JbXBsIGV4dGVuZHMgQmFzZUNvbHVtbkltcGwgaW1wbGVtZW50cyBOZXN0YWJsZUpvaW5Db2x1bW4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ3JlZmVyZW5jZWQgY29sdW1uIG5hbWUnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlZmVyZW5jZWRDb2x1bW5OYW1lQWRhcHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQotCXB1YmxpYyBKb2luQ29sdW1uSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcihKUEEuSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOwotCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRFbGVtZW50QWRhcHRlcih0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JcHVibGljIEpvaW5Db2x1bW5JbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQl0aGlzKHBhcmVudCwgbWVtYmVyLCBkYWEsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGRhYSkpOwotCX0KLQkKLQlwdWJsaWMgSm9pbkNvbHVtbkltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJdGhpcyhwYXJlbnQsIG1lbWJlciwgaWRhYSwgbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGlkYWEpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB0YWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19UQUJMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHVuaXF1ZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19VTklRVUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBudWxsYWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19OVUxMQUJMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGluc2VydGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHVwZGF0YWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19VUERBVEFCTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgc3VwZXIuZ2V0QW5ub3RhdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOZXN0YWJsZUFubm90YXRpb24gb2xkQW5ub3RhdGlvbikgewotCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRBbm5vdGF0aW9uKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gb2xkQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBvbGRBbm5vdGF0aW9uOwotCQlzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShvbGRDb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCS8vKioqKioqKioqKioqIEpvaW5Db2x1bW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuZXdSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld1JlZmVyZW5jZWRDb2x1bW5OYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXIuc2V0VmFsdWUobmV3UmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXModGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKLQkJdGhpcy5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSh0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0Jc3RhdGljIEpvaW5Db2x1bW5JbXBsIGNyZWF0ZUpvaW5Db2x1bW4oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uSW1wbChwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0JCi0Jc3RhdGljIEpvaW5Db2x1bW5JbXBsIGNyZWF0ZU5lc3RlZEpvaW5Db2x1bW4oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIGludCBpbmRleCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBqb2luQ29sdW1uc0FkYXB0ZXIpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCwgam9pbkNvbHVtbnNBZGFwdGVyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGlkYWEpOwotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5JbXBsKHBhcmVudCwgbWVtYmVyLCBpZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBqb2luQ29sdW1uc0FkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihqb2luQ29sdW1uc0FkYXB0ZXIsIGluZGV4LCBKUEEuSk9JTl9DT0xVTU4pOwotCX0KLQlzdGF0aWMgTmVzdGFibGVKb2luQ29sdW1uIGNyZWF0ZUpvaW5UYWJsZUpvaW5Db2x1bW4oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5JbXBsKHBhcmVudCwgbWVtYmVyLCBidWlsZEpvaW5UYWJsZUFubm90YXRpb25BZGFwdGVyKGluZGV4KSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKb2luVGFibGVJbXBsLkRFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkpPSU5fVEFCTEVfX0pPSU5fQ09MVU1OUywgaW5kZXgsIEpQQS5KT0lOX0NPTFVNTik7Ci0JfQotCi0Jc3RhdGljIE5lc3RhYmxlSm9pbkNvbHVtbiBjcmVhdGVKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkltcGwocGFyZW50LCBtZW1iZXIsIGJ1aWxkSm9pblRhYmxlSW52ZXJzZUFubm90YXRpb25BZGFwdGVyKGluZGV4KSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRKb2luVGFibGVJbnZlcnNlQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSm9pblRhYmxlSW1wbC5ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5KT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUywgaW5kZXgsIEpQQS5KT0lOX0NPTFVNTik7Ci0JfQotCQotCQotCXN0YXRpYyBOZXN0YWJsZUpvaW5Db2x1bW4gY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZUpvaW5Db2x1bW4oRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhc3NvY2lhdGlvbk92ZXJyaWRlQWRhcHRlciwgSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5JbXBsKHBhcmVudCwgbWVtYmVyLCBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcihhc3NvY2lhdGlvbk92ZXJyaWRlQWRhcHRlciwgaW5kZXgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFzc29jaWF0aW9uT3ZlcnJpZGVBZGFwdGVyLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihhc3NvY2lhdGlvbk92ZXJyaWRlQWRhcHRlciwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlMsIGluZGV4LCBKUEEuSk9JTl9DT0xVTU4pOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIEpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBKb2luQ29sdW1uSW1wbC5jcmVhdGVKb2luQ29sdW1uKHBhcmVudCwgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5zSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDIwNjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5zQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbnNJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248TWVtYmVyPiBpbXBsZW1lbnRzIEpvaW5Db2x1bW5zQW5ub3RhdGlvbgotewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBMaXN0PE5lc3RhYmxlSm9pbkNvbHVtbj4gam9pbkNvbHVtbnM7Ci0JCi0JcHJvdGVjdGVkIEpvaW5Db2x1bW5zSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5qb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8TmVzdGFibGVKb2luQ29sdW1uPigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RSb290LCB0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlSm9pbkNvbHVtbj4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVKb2luQ29sdW1uPih0aGlzLmpvaW5Db2x1bW5zKTsKLQl9Ci0JCi0JcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnNpemUoKTsKLQl9CQotCi0JcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBhZGRJbnRlcm5hbChpbnQgaW5kZXgpIHsKLQkJSm9pbkNvbHVtbkltcGwgam9pbkNvbHVtbiA9IGNyZWF0ZUpvaW5Db2x1bW4oaW5kZXgpOwotCQl0aGlzLmpvaW5Db2x1bW5zLmFkZChpbmRleCwgam9pbkNvbHVtbik7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uIGFkZChpbnQgaW5kZXgpIHsKLQkJSm9pbkNvbHVtbkltcGwgam9pbkNvbHVtbiA9IGNyZWF0ZUpvaW5Db2x1bW4oaW5kZXgpOwotCQlhZGQoaW5kZXgsIGpvaW5Db2x1bW4pOwotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkKGludCBpbmRleCwgTmVzdGFibGVKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5qb2luQ29sdW1ucywgSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5qb2luQ29sdW1ucywgSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5qb2luQ29sdW1ucywgSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgaW50IGluZGV4T2YoTmVzdGFibGVKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBuZXN0ZWRBbm5vdGF0aW9uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW4gbmVzdGVkQW5ub3RhdGlvbkZvcihBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJZm9yIChOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IHRoaXMuam9pbkNvbHVtbnMpIHsKLQkJCWlmIChqZHRBbm5vdGF0aW9uID09IGpvaW5Db2x1bW4uZ2V0SmR0QW5ub3RhdGlvbigoQ29tcGlsYXRpb25Vbml0KSBqZHRBbm5vdGF0aW9uLmdldFJvb3QoKSkpIHsKLQkJCQlyZXR1cm4gam9pbkNvbHVtbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQltb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuam9pbkNvbHVtbnMsIEpPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZUludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuam9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuICJ2YWx1ZSI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMudXBkYXRlTmVzdGVkQW5ub3RhdGlvbnNGcm9tSmF2YShhc3RSb290LCB0aGlzKTsKLQl9Ci0JCQotCXByaXZhdGUgSm9pbkNvbHVtbkltcGwgY3JlYXRlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIEpvaW5Db2x1bW5JbXBsLmNyZWF0ZU5lc3RlZEpvaW5Db2x1bW4odGhpcywgZ2V0TWVtYmVyKCksIGluZGV4LCBnZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCkpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBKb2luQ29sdW1uc0Fubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5zSW1wbChwYXJlbnQsIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBKb2luQ29sdW1uc0Fubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pblRhYmxlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pblRhYmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDQ4MzRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbnRhaW5lckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSm9pblRhYmxlSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VUYWJsZSBpbXBsZW1lbnRzIEpvaW5UYWJsZUFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRV9BREFQVEVSID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuSk9JTl9UQUJMRV9fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFNDSEVNQV9BREFQVEVSID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuSk9JTl9UQUJMRV9fU0NIRU1BKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gQ0FUQUxPR19BREFQVEVSID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuSk9JTl9UQUJMRV9fQ0FUQUxPRyk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PE5lc3RhYmxlSm9pbkNvbHVtbj4gam9pbkNvbHVtbnM7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PE5lc3RhYmxlSm9pbkNvbHVtbj4gaW52ZXJzZUpvaW5Db2x1bW5zOwotCQotCXByaXZhdGUgZmluYWwgSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uIGpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbjsKLQkKLQlwcml2YXRlIGZpbmFsIEludmVyc2VKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24gaW52ZXJzZUpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbjsKLQotCXByb3RlY3RlZCBKb2luVGFibGVJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUikpOwotCQl0aGlzLmpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxOZXN0YWJsZUpvaW5Db2x1bW4+KCk7Ci0JCXRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxOZXN0YWJsZUpvaW5Db2x1bW4+KCk7Ci0JCXRoaXMuam9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uID0gbmV3IEpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbigpOwotCQl0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24gPSBuZXcgSW52ZXJzZUpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5pbml0aWFsaXplTmVzdGVkQW5ub3RhdGlvbnMoYXN0Um9vdCwgdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24pOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKGFzdFJvb3QsIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJLy8gaWdub3JlIHRoZSBkYWEgcGFzc2VkIGluLCBASm9pblRhYmxlIGlzIG5ldmVyIG5lc3RlZAotCQlyZXR1cm4gTkFNRV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHNjaGVtYUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKSB7Ci0JCS8vIGlnbm9yZSB0aGUgZGFhIHBhc3NlZCBpbiwgQEpvaW5UYWJsZSBpcyBuZXZlciBuZXN0ZWQKLQkJcmV0dXJuIFNDSEVNQV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGNhdGFsb2dBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcikgewotCQkvLyBpZ25vcmUgdGhlIGRhYSBwYXNzZWQgaW4sIEBKb2luVGFibGUgaXMgbmV2ZXIgbmVzdGVkCi0JCXJldHVybiBDQVRBTE9HX0FEQVBURVI7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgY3JlYXRlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFVuaXF1ZUNvbnN0cmFpbnRJbXBsLmNyZWF0ZUpvaW5UYWJsZVVuaXF1ZUNvbnN0cmFpbnQodGhpcywgdGhpcy5nZXRNZW1iZXIoKSwgaW5kZXgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOwotCQl0aGlzLnVwZGF0ZUpvaW5Db2x1bW5zRnJvbUphdmEoYXN0Um9vdCk7Ci0JCXRoaXMudXBkYXRlSW52ZXJzZUpvaW5Db2x1bW5zRnJvbUphdmEoYXN0Um9vdCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1uc0Zyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMuam9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUludmVyc2VKb2luQ29sdW1uc0Zyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPih0aGlzLmpvaW5Db2x1bW5zKTsKLQl9Ci0JCi0JcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZkpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pOwotCX0KLQkKLQlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoTmVzdGFibGVKb2luQ29sdW1uKSBDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24pOwotCQlmaXJlSXRlbUFkZGVkKEpvaW5UYWJsZUFubm90YXRpb24uSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4LCBOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBqb2luQ29sdW1uLCB0aGlzLmpvaW5Db2x1bW5zLCBKT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5qb2luQ29sdW1ucy5nZXQoaW5kZXgpOwotCQlyZW1vdmVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQlqb2luQ29sdW1uLnJlbW92ZUFubm90YXRpb24oKTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnN5bmNoQW5ub3RhdGlvbnNBZnRlclJlbW92ZShpbmRleCwgdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVKb2luQ29sdW1uKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLmpvaW5Db2x1bW5zLCBKT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVKb2luQ29sdW1uSW50ZXJuYWwodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnN5bmNoQW5ub3RhdGlvbnNBZnRlck1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCWZpcmVJdGVtTW92ZWQoSm9pblRhYmxlQW5ub3RhdGlvbi5KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbW92ZUpvaW5Db2x1bW5JbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmludmVyc2VKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW5BdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZkludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLmluZGV4T2Yoam9pbkNvbHVtbik7Ci0JfQotCQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gKE5lc3RhYmxlSm9pbkNvbHVtbikgQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgsIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCWZpcmVJdGVtQWRkZWQoSm9pblRhYmxlQW5ub3RhdGlvbi5JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgaW52ZXJzZUpvaW5Db2x1bW4pOwotCQlyZXR1cm4gaW52ZXJzZUpvaW5Db2x1bW47Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgsIE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGpvaW5Db2x1bW4sIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLCBJTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMuZ2V0KGluZGV4KTsKLQkJdGhpcy5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJam9pbkNvbHVtbi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW5kZXgsIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oTmVzdGFibGVKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGpvaW5Db2x1bW4sIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLCBJTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZUludmVyc2VKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVJbnZlcnNlSm9pbkNvbHVtbkludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJNb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1Nb3ZlZChKb2luVGFibGVBbm5vdGF0aW9uLklOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1vdmVJbnZlcnNlSm9pbkNvbHVtbkludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBOZXN0YWJsZUpvaW5Db2x1bW4gY3JlYXRlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIEpvaW5Db2x1bW5JbXBsLmNyZWF0ZUpvaW5UYWJsZUpvaW5Db2x1bW4odGhpcywgZ2V0TWVtYmVyKCksIGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTmVzdGFibGVKb2luQ29sdW1uIGNyZWF0ZUludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlyZXR1cm4gSm9pbkNvbHVtbkltcGwuY3JlYXRlSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW4odGhpcywgZ2V0TWVtYmVyKCksIGluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbiBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyQW5ub3RhdGlvbiB7Ci0KLQkJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBhZGRJbnRlcm5hbChpbnQgaW5kZXgpIHsKLQkJCU5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gSm9pblRhYmxlSW1wbC50aGlzLmNyZWF0ZUpvaW5Db2x1bW4oaW5kZXgpOwotCQkJSm9pblRhYmxlSW1wbC50aGlzLmpvaW5Db2x1bW5zLmFkZChpbmRleCwgam9pbkNvbHVtbik7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBhZGQoaW50IGluZGV4KSB7Ci0JCQlOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IEpvaW5UYWJsZUltcGwudGhpcy5jcmVhdGVKb2luQ29sdW1uKGluZGV4KTsKLQkJCUpvaW5UYWJsZUltcGwudGhpcy5hZGRKb2luQ29sdW1uKGluZGV4LCBqb2luQ29sdW1uKTsKLQkJCXJldHVybiBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gSm9pblRhYmxlSW1wbC50aGlzLmluZGV4T2ZKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJSm9pblRhYmxlSW1wbC50aGlzLm1vdmVKb2luQ29sdW1uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3ZlSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCUpvaW5UYWJsZUltcGwudGhpcy5tb3ZlSm9pbkNvbHVtbkludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkJCi0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBKb2luVGFibGVJbXBsLnRoaXMuam9pbkNvbHVtbkF0KGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVKb2luQ29sdW1uPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVKb2luQ29sdW1uPihKb2luVGFibGVJbXBsLnRoaXMuam9pbkNvbHVtbnMpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoTmVzdGFibGVKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb24pIHsKLQkJCUpvaW5UYWJsZUltcGwudGhpcy5yZW1vdmVKb2luQ29sdW1uKG5lc3RlZEFubm90YXRpb24pOwkKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQkJcmV0dXJuICJqb2luQ29sdW1ucyI7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBJbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJBbm5vdGF0aW9uIHsKLQotCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uIGFkZEludGVybmFsKGludCBpbmRleCkgewotCQkJTmVzdGFibGVKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBKb2luVGFibGVJbXBsLnRoaXMuY3JlYXRlSW52ZXJzZUpvaW5Db2x1bW4oaW5kZXgpOwotCQkJSm9pblRhYmxlSW1wbC50aGlzLmludmVyc2VKb2luQ29sdW1ucy5hZGQoaW5kZXgsIGpvaW5Db2x1bW4pOwotCQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW4gYWRkKGludCBpbmRleCkgewotCQkJTmVzdGFibGVKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBKb2luVGFibGVJbXBsLnRoaXMuY3JlYXRlSW52ZXJzZUpvaW5Db2x1bW4oaW5kZXgpOwotCQkJSm9pblRhYmxlSW1wbC50aGlzLmFkZEludmVyc2VKb2luQ29sdW1uKGluZGV4LCBqb2luQ29sdW1uKTsKLQkJCXJldHVybiBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gSm9pblRhYmxlSW1wbC50aGlzLmluZGV4T2ZJbnZlcnNlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCUpvaW5UYWJsZUltcGwudGhpcy5tb3ZlSW52ZXJzZUpvaW5Db2x1bW4odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdmVJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJSm9pblRhYmxlSW1wbC50aGlzLm1vdmVJbnZlcnNlSm9pbkNvbHVtbkludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkJCi0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBKb2luVGFibGVJbXBsLnRoaXMuaW52ZXJzZUpvaW5Db2x1bW5BdChpbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlSm9pbkNvbHVtbj4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlSm9pbkNvbHVtbj4oSm9pblRhYmxlSW1wbC50aGlzLmludmVyc2VKb2luQ29sdW1ucyk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJCXJldHVybiBpbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoTmVzdGFibGVKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb24pIHsKLQkJCUpvaW5UYWJsZUltcGwudGhpcy5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbihuZXN0ZWRBbm5vdGF0aW9uKTsJCi0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gImludmVyc2VKb2luQ29sdW1ucyI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udGFpbmVyQW5ub3RhdGlvbiBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVKb2luQ29sdW1uPiB7Ci0KLQkJcHVibGljIEFic3RyYWN0Q29udGFpbmVyQW5ub3RhdGlvbigpIHsKLQkJCXN1cGVyKEpvaW5UYWJsZUltcGwudGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vbm90aGluZyB0byBpbml0aWFsaXplCi0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gSm9pblRhYmxlSW1wbC50aGlzLmdldEFubm90YXRpb25OYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQl0aGlzLnJlbW92ZShuZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpKTsJCi0JCX0JCQotCi0JCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW4gbmVzdGVkQW5ub3RhdGlvbkZvcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCQlmb3IgKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5lc3RlZEFubm90YXRpb25zKCkpKSB7Ci0JCQkJaWYgKGpkdEFubm90YXRpb24gPT0gam9pbkNvbHVtbi5nZXRKZHRBbm5vdGF0aW9uKChDb21waWxhdGlvblVuaXQpIGpkdEFubm90YXRpb24uZ2V0Um9vdCgpKSkgewotCQkJCQlyZXR1cm4gam9pbkNvbHVtbjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gSm9pblRhYmxlSW1wbC50aGlzLmdldEpkdEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQkJSm9pblRhYmxlSW1wbC50aGlzLm5ld0Fubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCQlKb2luVGFibGVJbXBsLnRoaXMucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlKb2luVGFibGVJbXBsLnRoaXMudXBkYXRlKGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEpvaW5UYWJsZUltcGwudGhpcy5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBKb2luVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSm9pblRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSm9pblRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBKb2luVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgSm9pblRhYmxlSW1wbChwYXJlbnQsIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTnVsbEpvaW5UYWJsZShwYXJlbnQpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcGFDb21waWxhdGlvblVuaXRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcGFDb21waWxhdGlvblVuaXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNDU3Y2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnBhQ29tcGlsYXRpb25Vbml0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSnBhQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgSnBhQ29tcGlsYXRpb25Vbml0SW1wbAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlCi0JaW1wbGVtZW50cyBKcGFDb21waWxhdGlvblVuaXQKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBmaW5hbCBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFSZXNvdXJjZU1vZGVsIGphdmFSZXNvdXJjZU1vZGVsOwotCi0JcHJvdGVjdGVkIGZpbmFsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0OwotCi0JLyoqCi0JICogVGhlIHByaW1hcnkgdHlwZSBvZiB0aGUgQVNUIGNvbXBpbGF0aW9uIHVuaXQuIFdlIGFyZSBub3QgZ29pbmcgdG8gaGFuZGxlCi0JICogbXVsdGlwbGUgdHlwZXMgZGVmaW5lZCBpbiBhIHNpbmdsZSBjb21waWxhdGlvbiB1bml0LiBFbnRpdGllcyBtdXN0IGhhdmUKLQkgKiBhIHB1YmxpYy9wcm90ZWN0ZWQgbm8tYXJnIGNvbnN0cnVjdG9yLCBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGFjY2VzcwotCSAqIHRoZSBjb25zdHJ1Y3RvciBpbiBhIHBhY2thZ2UgY2xhc3MgKHdoaWNoIGlzIHdoYXQgYWxsIHRvcC1sZXZlbCwKLQkgKiBub24tcHJpbWFyeSBjbGFzc2VzIG11c3QgYmUpLgotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTsJCi0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKcGFDb21waWxhdGlvblVuaXRJbXBsKAotCQkJSUZpbGUgZmlsZSwgCi0JCQlKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyLCAKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlciwKLQkJCUphdmFSZXNvdXJjZU1vZGVsIGphdmFSZXNvdXJjZU1vZGVsKSB7Ci0JCXN1cGVyKG51bGwpOyAgLy8gdGhlIEpQQSBjb21waWxhdGlvbiB1bml0IGlzIHRoZSByb290IG9mIGl0cyBzdWItdHJlZQotCQl0aGlzLmFubm90YXRpb25Qcm92aWRlciA9IGFubm90YXRpb25Qcm92aWRlcjsKLQkJdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyID0gbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcjsKLQkJdGhpcy5hbm5vdGF0aW9uRWRpdEZvcm1hdHRlciA9IGFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotCQl0aGlzLmphdmFSZXNvdXJjZU1vZGVsID0gamF2YVJlc291cmNlTW9kZWw7Ci0JCXRoaXMuY29tcGlsYXRpb25Vbml0ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlKTsKLQkJdGhpcy5vcGVuQ29tcGlsYXRpb25Vbml0KCk7Ci0JCXRoaXMucGVyc2lzdGVudFR5cGUgPSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQ29tcGlsYXRpb25Vbml0KCkgewotCQl0cnkgewotCQkJdGhpcy5jb21waWxhdGlvblVuaXQub3BlbihudWxsKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBkbyBub3RoaW5nIC0gd2UganVzdCB3b24ndCBoYXZlIGEgcHJpbWFyeSB0eXBlIGluIHRoaXMgY2FzZQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGJ1aWxkSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUodGhpcy5idWlsZEFTVFJvb3QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGJ1aWxkSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gdGhpcy5nZXRQcmltYXJ5VHlwZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoYXN0Um9vdCwgdGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbmV2ZXIgY2FsbGVkPwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcGlsYXRpb25Vbml0IGdldEpwYUNvbXBpbGF0aW9uVW5pdCgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUFubm90YXRpb25Qcm92aWRlciBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25Qcm92aWRlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbW1hbmRFeGVjdXRvclByb3ZpZGVyIGdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBnZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpICB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVJlc291cmNlTW9kZWw7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBKcGFDb21waWxhdGlvblVuaXQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gdGhpcy5jb21waWxhdGlvblVuaXQ7Ci0JfQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlyZXR1cm4gKHRoaXMucGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5wZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGVyc2lzdGVudFR5cGUgcmVzb3VyY2UgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0J3MgcHJpbWFyeSB0eXBlLgotCSAqIFdpbGwgYmUgbnVsbCBpZiB0aGUgcHJpbWFyeSB0eXBlIGlzIG51bGwuCi0JICovCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCkgewkKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVudFR5cGU7Ci0JCS8vVE9ETyBzaG91bGQgaSBvbmx5IGJlIHJldHVybmluZyB0aGlzIGlmIGl0IHJldHVybnMgdHJ1ZSB0byBpc1BlcnNpc3RhYmxlPwotCQkvL3RoYXQncyBob3cgd2UgaGFuZGxlIG5lc3RlZFR5cGVzIG9uIEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlCi0JCS8vcmV0dXJuIHRoaXMucGVyc2lzdGVudFR5cGUuaXNQZXJzaXN0YWJsZSgpID8gdGhpcy5wZXJzaXN0ZW50VHlwZSA6IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFBlcnNpc3RlbnRUeXBlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKSB7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIG9sZCA9IHRoaXMucGVyc2lzdGVudFR5cGU7Ci0JCXRoaXMucGVyc2lzdGVudFR5cGUgPSBwZXJzaXN0ZW50VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBFUlNJU1RFTlRfVFlQRV9QUk9QRVJUWSwgb2xkLCBwZXJzaXN0ZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoKSB7Ci0JCXRoaXMudXBkYXRlKHRoaXMuYnVpbGRBU1RSb290KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUeXBlRGVjbGFyYXRpb24gdGQgPSB0aGlzLmdldFByaW1hcnlUeXBlKGFzdFJvb3QpOwotCQlpZiAodGQgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRQZXJzaXN0ZW50VHlwZShudWxsKTsKLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLnBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKLQkJCQl0aGlzLnNldFBlcnNpc3RlbnRUeXBlKHRoaXMuYnVpbGRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShhc3RSb290LCB0ZCkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnBlcnNpc3RlbnRUeXBlLnVwZGF0ZShhc3RSb290KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZCgpIHsKLQkJdGhpcy5qYXZhUmVzb3VyY2VNb2RlbC5yZXNvdXJjZUNoYW5nZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoKSB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCXRoaXMucGVyc2lzdGVudFR5cGUucmVzb2x2ZVR5cGVzKHRoaXMuYnVpbGRBU1RSb290KCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDb21waWxhdGlvblVuaXQgYnVpbGRBU1RSb290KCkgewotCQlyZXR1cm4gSkRUVG9vbHMuYnVpbGRBU1RSb290KHRoaXMuY29tcGlsYXRpb25Vbml0KTsKLQl9Ci0KLQkvLyBUT0RPIHVzZSBKUEEgZmFjdG9yeQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUltcGwubmV3SW5zdGFuY2UodGhpcywgdHlwZURlY2xhcmF0aW9uLCBhc3RSb290KTsKLQl9Ci0KLQkvKioKLQkgKiBpLmUuIHRoZSB0eXBlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgY29tcGlsYXRpb24gdW5pdDsKLQkgKiByZXR1cm4gdGhlIGZpcnN0IGNsYXNzIG9yIGludGVyZmFjZSAoaWdub3JlIGFubm90YXRpb25zIGFuZCBlbnVtcykgd2l0aAotCSAqIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgKGZpbGUpOwotCSAqIE5COiB0aGlzIHR5cGUgY291bGQgYmUgaW4gZXJyb3IgaWYgdGhlcmUgaXMgYW4gYW5ub3RhdGlvbiBvciBlbnVtCi0JICogd2l0aCB0aGUgc2FtZSBuYW1lIHByZWNlZGluZyBpdCBpbiB0aGUgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXByb3RlY3RlZCBUeXBlRGVjbGFyYXRpb24gZ2V0UHJpbWFyeVR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nIHByaW1hcnlUeXBlTmFtZSA9IHRoaXMuZ2V0UHJpbWFyeVR5cGVOYW1lKCk7Ci0JCWZvciAoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYXRkIDogdHlwZXMoYXN0Um9vdCkpIHsKLQkJCWlmICgoYXRkLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OKQotCQkJCQkmJiBhdGQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhwcmltYXJ5VHlwZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIChUeXBlRGVjbGFyYXRpb24pIGF0ZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0PEFic3RyYWN0VHlwZURlY2xhcmF0aW9uPiB0eXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gYXN0Um9vdC50eXBlcygpOwotCX0KLQotCS8qKgotCSAqIGkuZS4gdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByaW1hcnlUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHJlbW92ZUphdmFFeHRlbnNpb24odGhpcy5jb21waWxhdGlvblVuaXQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcmVtb3ZlSmF2YUV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi5qYXZhIik7Ci0JCXJldHVybiAoaW5kZXggPT0gLTEpID8gZmlsZU5hbWUgOiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMucGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0xvYkltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0xvYkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlM2Q3OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Mb2JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgY2xhc3MgTG9iSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4gaW1wbGVtZW50cyBMb2JBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcm90ZWN0ZWQgTG9iSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ub3RoaW5nIHRvIHVwZGF0ZQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTG9iQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIExvYkFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IExvYkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgTG9iQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IExvYkltcGwocGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvTWFueUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMTQ1NDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvTWFueUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi0KLXB1YmxpYyBjbGFzcyBNYW55VG9NYW55SW1wbCBleHRlbmRzIEFic3RyYWN0UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50cyBNYW55VG9NYW55QW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVEFSR0VUX0VOVElUWV9BREFQVEVSID0gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCk7CQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IENBU0NBREVfQURBUFRFUiA9IGJ1aWxkQ2FzY2FkZUFkYXB0ZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gRkVUQ0hfQURBUFRFUiA9IGJ1aWxkRmV0Y2hBZGFwdGVyKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBNQVBQRURfQllfQURBUFRFUiA9IGJ1aWxkTWFwcGVkQnlBZGFwdGVyKCk7CQotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBtYXBwZWRCeUFkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBtYXBwZWRCeTsKLQkKLQlwcm90ZWN0ZWQgTWFueVRvTWFueUltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMubWFwcGVkQnlBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoTUFQUEVEX0JZX0FEQVBURVIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5tYXBwZWRCeSA9IHRoaXMubWFwcGVkQnkoYXN0Um9vdCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKiBBYnN0cmFjdFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0YXJnZXRFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gVEFSR0VUX0VOVElUWV9BREFQVEVSOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGNhc2NhZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gQ0FTQ0FERV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIEZFVENIX0FEQVBURVI7Ci0JfQotCQotCQotCS8vKioqKioqKioqKioqKioqKiBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG5ld01hcHBlZEJ5KSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5tYXBwZWRCeSwgbmV3TWFwcGVkQnkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5QWRhcHRlci5zZXRWYWx1ZShuZXdNYXBwZWRCeSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX1BST1BFUlRZLCBvbGRNYXBwZWRCeSwgbmV3TWFwcGVkQnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOwotCQl0aGlzLnNldE1hcHBlZEJ5KHRoaXMubWFwcGVkQnkoYXN0Um9vdCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZEJ5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKE1BUFBFRF9CWV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoTUFQUEVEX0JZX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5NQU5ZX1RPX01BTllfX1RBUkdFVF9FTlRJVFkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZENhc2NhZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRFbnVtQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuTUFOWV9UT19NQU5ZX19DQVNDQURFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRmV0Y2hBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk1BTllfVE9fTUFOWV9fRkVUQ0gpOwotCX0KLQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRNYXBwZWRCeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5NQU5ZX1RPX01BTllfX01BUFBFRF9CWSwgZmFsc2UpOyAvLyBmYWxzZSA9IGRvIG5vdCByZW1vdmUgYW5ub3RhdGlvbiB3aGVuIGVtcHR5Ci0JfQotCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNYW55VG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBNYW55VG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIE1hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgTWFueVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBNYW55VG9NYW55SW1wbCgoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwY2JlNzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvT25lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lSW1wbCBleHRlbmRzIEFic3RyYWN0UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50cyBNYW55VG9PbmVBbm5vdGF0aW9uCi17CQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFRBUkdFVF9FTlRJVFlfQURBUFRFUiA9IGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcigpOwkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBDQVNDQURFX0FEQVBURVIgPSBidWlsZENhc2NhZGVBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IEZFVENIX0FEQVBURVIgPSBidWlsZEZldGNoQWRhcHRlcigpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IE9QVElPTkFMX0FEQVBURVIgPSBidWlsZE9wdGlvbmFsQWRhcHRlcigpOwotCQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG9wdGlvbmFsQWRhcHRlcjsKLQotCXByaXZhdGUgQm9vbGVhbiBvcHRpb25hbDsKLQotCXByb3RlY3RlZCBNYW55VG9PbmVJbXBsKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLm9wdGlvbmFsQWRhcHRlciA9IHRoaXMuYnVpbGRCb29sZWFuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE9QVElPTkFMX0FEQVBURVIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5vcHRpb25hbCA9IHRoaXMub3B0aW9uYWwoYXN0Um9vdCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKiBBYnN0cmFjdFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdGFyZ2V0RW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIFRBUkdFVF9FTlRJVFlfQURBUFRFUjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBjYXNjYWRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIENBU0NBREVfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmZXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBGRVRDSF9BREFQVEVSOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKiogQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbmFsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5vcHRpb25hbCwgbmV3T3B0aW9uYWwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQm9vbGVhbiBvbGRPcHRpb25hbCA9IHRoaXMub3B0aW9uYWw7Ci0JCXRoaXMub3B0aW9uYWwgPSBuZXdPcHRpb25hbDsKLQkJdGhpcy5vcHRpb25hbEFkYXB0ZXIuc2V0VmFsdWUobmV3T3B0aW9uYWwpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9QVElPTkFMX1BST1BFUlRZLCBvbGRPcHRpb25hbCwgbmV3T3B0aW9uYWwpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3B0aW9uYWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoT1BUSU9OQUxfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKLQkJdGhpcy5zZXRPcHRpb25hbCh0aGlzLm9wdGlvbmFsKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gb3B0aW9uYWwoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWxBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk1BTllfVE9fT05FX19UQVJHRVRfRU5USVRZKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRDYXNjYWRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRW51bUFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk1BTllfVE9fT05FX19DQVNDQURFKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRmV0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRGZXRjaEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuTUFOWV9UT19PTkVfX0ZFVENIKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRPcHRpb25hbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZE9wdGlvbmFsQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5NQU5ZX1RPX09ORV9fT1BUSU9OQUwpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9wdGlvbmFsQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNYW55VG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFueVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTWFueVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIE1hbnlUb09uZUFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBNYW55VG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTWFueVRvT25lSW1wbCgoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBLZXlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBLZXlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOWY2NGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYXBLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBNYXBLZXlJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPiBpbXBsZW1lbnRzIE1hcEtleUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBOQU1FX0FEQVBURVIgPSBidWlsZE5hbWVBZGFwdGVyKCk7Ci0KLQkKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKLQlwcm90ZWN0ZWQgTWFwS2V5SW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhdHRyaWJ1dGUsIE5BTUVfQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gbmFtZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubmFtZSwgbmV3TmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZShuZXdOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoTkFNRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhOQU1FX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldE5hbWUodGhpcy5uYW1lKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5NQVBfS0VZX19OQU1FLCBmYWxzZSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE1hcEtleUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXBLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBNYXBLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIE1hcEtleUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBNYXBLZXlJbXBsKHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwcGVkU3VwZXJjbGFzc0ltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcHBlZFN1cGVyY2xhc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzJkZGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwcGVkU3VwZXJjbGFzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci0KLQotcHVibGljIGNsYXNzIE1hcHBlZFN1cGVyY2xhc3NJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248VHlwZT4gaW1wbGVtZW50cyBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByb3RlY3RlZCBNYXBwZWRTdXBlcmNsYXNzSW1wbChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ubyBhbm5vdGF0aW9uIG1lbWJlcnMKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBNYXBwZWRTdXBlcmNsYXNzSW1wbCgoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgKFR5cGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YWRjODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyaWVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lZE5hdGl2ZVF1ZXJpZXNJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248VHlwZT4gaW1wbGVtZW50cyBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uCi17Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIExpc3Q8TmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXM7Ci0JCi0JcHJvdGVjdGVkIE5hbWVkTmF0aXZlUXVlcmllc0ltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIFR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMubmFtZWROYXRpdmVRdWVyaWVzID0gbmV3IEFycmF5TGlzdDxOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnk+KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RSb290LCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiAidmFsdWUiOwotCX0KLQkJCi0JcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnk+IG5lc3RlZEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeT4odGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLnNpemUoKTsKLQl9CQotCi0JcHVibGljIE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeSBhZGRJbnRlcm5hbChpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBjcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5KGluZGV4KTsKLQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuYWRkKGluZGV4LCBuYW1lZE5hdGl2ZVF1ZXJ5KTsKLQkJcmV0dXJuIG5hbWVkTmF0aXZlUXVlcnk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkgYWRkKGludCBpbmRleCkgewotCQlOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGNyZWF0ZU5hbWVkTmF0aXZlUXVlcnkoaW5kZXgpOwotCQlhZGQoaW5kZXgsIG5hbWVkTmF0aXZlUXVlcnkpOwotCQlyZXR1cm4gbmFtZWROYXRpdmVRdWVyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkKGludCBpbmRleCwgTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5IHF1ZXJ5KSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHF1ZXJ5LCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5IHF1ZXJ5KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChxdWVyeSwgdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeSBxdWVyeSkgewotCQlyZXR1cm4gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuaW5kZXhPZihxdWVyeSk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkgbmVzdGVkQW5ub3RhdGlvbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuZ2V0KGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeSBuZXN0ZWRBbm5vdGF0aW9uRm9yKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJZm9yIChOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkgbmFtZWRRdWVyeSA6IHRoaXMubmFtZWROYXRpdmVRdWVyaWVzKSB7Ci0JCQlpZiAoamR0QW5ub3RhdGlvbiA9PSBuYW1lZFF1ZXJ5LmdldEpkdEFubm90YXRpb24oKENvbXBpbGF0aW9uVW5pdCkgamR0QW5ub3RhdGlvbi5nZXRSb290KCkpKSB7Ci0JCQkJcmV0dXJuIG5hbWVkUXVlcnk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJbW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIE5hbWVkTmF0aXZlUXVlcnlJbXBsIGNyZWF0ZU5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KSB7Ci0JCXJldHVybiBOYW1lZE5hdGl2ZVF1ZXJ5SW1wbC5jcmVhdGVOZXN0ZWROYW1lZE5hdGl2ZVF1ZXJ5KHRoaXMsIGdldE1lbWJlcigpLCBpbmRleCwgZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBOYW1lZE5hdGl2ZVF1ZXJpZXNJbXBsKHBhcmVudCwgKFR5cGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcnlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGEwNTUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotCi1wdWJsaWMgY2xhc3MgTmFtZWROYXRpdmVRdWVyeUltcGwgZXh0ZW5kcyBBYnN0cmFjdE5hbWVkUXVlcnkKLQlpbXBsZW1lbnRzIE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeQotewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ3Jlc3VsdENsYXNzJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlc3VsdENsYXNzRGVjbGFyYXRpb25BZGFwdGVyOwotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdyZXN1bHRTZXRNYXBwaW5nJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlc3VsdFNldE1hcHBpbmdEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0KLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVzdWx0Q2xhc3NBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiByZXN1bHRTZXRNYXBwaW5nQWRhcHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIHJlc3VsdENsYXNzOwotCQotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3M7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZzsKLQkKLQlwcm90ZWN0ZWQgTmFtZWROYXRpdmVRdWVyeUltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIFR5cGUgdHlwZSwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMucmVzdWx0Q2xhc3NEZWNsYXJhdGlvbkFkYXB0ZXIgPSByZXN1bHRDbGFzc0FkYXB0ZXIoZGFhKTsKLQkJdGhpcy5yZXN1bHRDbGFzc0FkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcih0aGlzLnJlc3VsdENsYXNzRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nRGVjbGFyYXRpb25BZGFwdGVyID0gcmVzdWx0U2V0TWFwcGluZ0FkYXB0ZXIoZGFhKTsKLQkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKHRoaXMucmVzdWx0U2V0TWFwcGluZ0RlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLnJlc3VsdENsYXNzID0gdGhpcy5yZXN1bHRDbGFzcyhhc3RSb290KTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFJlc3VsdENsYXNzID0gdGhpcy5mdWxseVF1YWxpZmllZFJlc3VsdENsYXNzKGFzdFJvb3QpOwotCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSB0aGlzLnJlc3VsdFNldE1hcHBpbmcoYXN0Um9vdCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVzdWx0Q2xhc3NBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZX19SRVNVTFRfQ0xBU1MsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlc3VsdFNldE1hcHBpbmdBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCS8vKioqKioqKioqKioqKiBBYnN0cmFjdE5hbWVkUXVlcnkgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuTkFNRURfTkFUSVZFX1FVRVJZX19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgcXVlcnlFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX1FVRVJZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOZXN0YWJsZUFubm90YXRpb24gb2xkQW5ub3RhdGlvbikgewotCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRBbm5vdGF0aW9uKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gb2xkTmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKLQkJc2V0UmVzdWx0Q2xhc3Mob2xkTmFtZWRRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJc2V0UmVzdWx0U2V0TWFwcGluZyhvbGROYW1lZFF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnJlc3VsdENsYXNzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDbGFzcyhTdHJpbmcgbmV3UmVzdWx0Q2xhc3MpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnJlc3VsdENsYXNzLCBuZXdSZXN1bHRDbGFzcykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkUmVzdWx0Q2xhc3MgPSB0aGlzLnJlc3VsdENsYXNzOwotCQl0aGlzLnJlc3VsdENsYXNzID0gbmV3UmVzdWx0Q2xhc3M7Ci0JCXRoaXMucmVzdWx0Q2xhc3NBZGFwdGVyLnNldFZhbHVlKG5ld1Jlc3VsdENsYXNzKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChSRVNVTFRfQ0xBU1NfUFJPUEVSVFksIG9sZFJlc3VsdENsYXNzLCBuZXdSZXN1bHRDbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcygpICB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3M7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3MoU3RyaW5nIG5ld1F1YWxpZmllZFJlc3VsdENsYXNzKSB7Ci0JCVN0cmluZyBvbGRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzID0gdGhpcy5mdWxseVF1YWxpZmllZFJlc3VsdENsYXNzOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3MgPSBuZXdRdWFsaWZpZWRSZXN1bHRDbGFzczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfUkVTVUxUX0NMQVNTX1BST1BFUlRZLCBvbGRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzLCBuZXdRdWFsaWZpZWRSZXN1bHRDbGFzcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXN1bHRTZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRTZXRNYXBwaW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRTZXRNYXBwaW5nKFN0cmluZyBuZXdSZXN1bHRTZXRNYXBwaW5nKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5yZXN1bHRTZXRNYXBwaW5nLCBuZXdSZXN1bHRTZXRNYXBwaW5nKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGRSZXN1bHRTZXRNYXBwaW5nID0gdGhpcy5yZXN1bHRTZXRNYXBwaW5nOwotCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSBuZXdSZXN1bHRTZXRNYXBwaW5nOwotCQl0aGlzLnJlc3VsdFNldE1hcHBpbmdBZGFwdGVyLnNldFZhbHVlKG5ld1Jlc3VsdFNldE1hcHBpbmcpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFJFU1VMVF9TRVRfTUFQUElOR19QUk9QRVJUWSwgb2xkUmVzdWx0U2V0TWFwcGluZywgbmV3UmVzdWx0U2V0TWFwcGluZyk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZXN1bHRDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMucmVzdWx0Q2xhc3NEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlc3VsdFNldE1hcHBpbmdUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnJlc3VsdFNldE1hcHBpbmdEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOwotCQl0aGlzLnNldFJlc3VsdENsYXNzKHRoaXMucmVzdWx0Q2xhc3MoYXN0Um9vdCkpOwotCQl0aGlzLnNldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3ModGhpcy5mdWxseVF1YWxpZmllZFJlc3VsdENsYXNzKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRSZXN1bHRTZXRNYXBwaW5nKHRoaXMucmVzdWx0U2V0TWFwcGluZyhhc3RSb290KSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXN1bHRDbGFzcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzc0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRTZXRNYXBwaW5nQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBmdWxseVF1YWxpZmllZFJlc3VsdENsYXNzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmIChnZXRSZXN1bHRDbGFzcygpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBKRFRUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMucmVzdWx0Q2xhc3NBZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOZXN0YWJsZVF1ZXJ5SGludCBjcmVhdGVRdWVyeUhpbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBRdWVyeUhpbnRJbXBsLmNyZWF0ZU5hbWVkTmF0aXZlUXVlcnlRdWVyeUhpbnQodGhpcywgdGhpcy5nZXRNZW1iZXIoKSwgdGhpcy5nZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCksIGluZGV4KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlzdGF0aWMgTmFtZWROYXRpdmVRdWVyeUltcGwgY3JlYXRlTmFtZWROYXRpdmVRdWVyeShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXJldHVybiBuZXcgTmFtZWROYXRpdmVRdWVyeUltcGwocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKLQl9Ci0KLQlzdGF0aWMgTmFtZWROYXRpdmVRdWVyeUltcGwgY3JlYXRlTmVzdGVkTmFtZWROYXRpdmVRdWVyeShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLCBpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlcikgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0eXBlLCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBOYW1lZE5hdGl2ZVF1ZXJ5SW1wbChwYXJlbnQsIHR5cGUsIGlkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG5hbWVkUXVlcmllc0FkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihuYW1lZFF1ZXJpZXNBZGFwdGVyLCBpbmRleCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIE5hbWVkTmF0aXZlUXVlcnlJbXBsLmNyZWF0ZU5hbWVkTmF0aXZlUXVlcnkocGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyaWVzSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyaWVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDIyMGEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcmllc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJpZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgTmFtZWRRdWVyaWVzSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPFR5cGU+IGltcGxlbWVudHMgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbgotewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIExpc3Q8TmVzdGFibGVOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXM7Ci0JCi0JcHJvdGVjdGVkIE5hbWVkUXVlcmllc0ltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIFR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMubmFtZWRRdWVyaWVzID0gbmV3IEFycmF5TGlzdDxOZXN0YWJsZU5hbWVkUXVlcnk+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKGFzdFJvb3QsIHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiAidmFsdWUiOwotCX0KLQkJCi0JcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZU5hbWVkUXVlcnk+IG5lc3RlZEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlTmFtZWRRdWVyeT4odGhpcy5uYW1lZFF1ZXJpZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZWRRdWVyaWVzLnNpemUoKTsKLQl9CQotCi0JcHVibGljIE5lc3RhYmxlTmFtZWRRdWVyeSBhZGRJbnRlcm5hbChpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBjcmVhdGVOYW1lZFF1ZXJ5KGluZGV4KTsKLQkJdGhpcy5uYW1lZFF1ZXJpZXMuYWRkKGluZGV4LCBuYW1lZFF1ZXJ5KTsKLQkJcmV0dXJuIG5hbWVkUXVlcnk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZU5hbWVkUXVlcnkgYWRkKGludCBpbmRleCkgewotCQlOZXN0YWJsZU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGNyZWF0ZU5hbWVkUXVlcnkoaW5kZXgpOwotCQlhZGQoaW5kZXgsIG5hbWVkUXVlcnkpOwotCQlyZXR1cm4gbmFtZWRRdWVyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkKGludCBpbmRleCwgTmVzdGFibGVOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgbmFtZWRRdWVyeSwgdGhpcy5uYW1lZFF1ZXJpZXMsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uTkFNRURfUVVFUklFU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoTmVzdGFibGVOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KG5hbWVkUXVlcnksIHRoaXMubmFtZWRRdWVyaWVzLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLk5BTUVEX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLm5hbWVkUXVlcmllcywgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5OQU1FRF9RVUVSSUVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgaW50IGluZGV4T2YoTmVzdGFibGVOYW1lZFF1ZXJ5IGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVkUXVlcmllcy5pbmRleE9mKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlTmFtZWRRdWVyeSBuZXN0ZWRBbm5vdGF0aW9uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVkUXVlcmllcy5nZXQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVOYW1lZFF1ZXJ5IG5lc3RlZEFubm90YXRpb25Gb3Iob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlmb3IgKE5lc3RhYmxlTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5IDogdGhpcy5uYW1lZFF1ZXJpZXMpIHsKLQkJCWlmIChqZHRBbm5vdGF0aW9uID09IG5hbWVkUXVlcnkuZ2V0SmR0QW5ub3RhdGlvbigoQ29tcGlsYXRpb25Vbml0KSBqZHRBbm5vdGF0aW9uLmdldFJvb3QoKSkpIHsKLQkJCQlyZXR1cm4gbmFtZWRRdWVyeTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQltb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMubmFtZWRRdWVyaWVzLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLk5BTUVEX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLm5hbWVkUXVlcmllcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnVwZGF0ZU5lc3RlZEFubm90YXRpb25zRnJvbUphdmEoYXN0Um9vdCwgdGhpcyk7Ci0JfQotCQotCXByaXZhdGUgTmFtZWRRdWVyeUltcGwgY3JlYXRlTmFtZWRRdWVyeShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIE5hbWVkUXVlcnlJbXBsLmNyZWF0ZU5lc3RlZE5hbWVkUXVlcnkodGhpcywgZ2V0TWVtYmVyKCksIGluZGV4LCBnZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIE5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE5hbWVkUXVlcmllc0ltcGwocGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMWM0ZjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lZFF1ZXJ5SW1wbCBleHRlbmRzIEFic3RyYWN0TmFtZWRRdWVyeQotCWltcGxlbWVudHMgTmVzdGFibGVOYW1lZFF1ZXJ5Ci17Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByb3RlY3RlZCBOYW1lZFF1ZXJ5SW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQkvLyoqKioqKioqKioqKiogQWJzdHJhY3ROYW1lZFF1ZXJ5IGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9RVUVSWV9fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBxdWVyeUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLk5BTUVEX1FVRVJZX19RVUVSWTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5lc3RhYmxlUXVlcnlIaW50IGNyZWF0ZVF1ZXJ5SGludChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFF1ZXJ5SGludEltcGwuY3JlYXRlTmFtZWRRdWVyeVF1ZXJ5SGludCh0aGlzLCBnZXRNZW1iZXIoKSwgdGhpcy5nZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCksIGluZGV4KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlzdGF0aWMgTmFtZWRRdWVyeUltcGwgY3JlYXRlTmFtZWRRdWVyeShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXJldHVybiBuZXcgTmFtZWRRdWVyeUltcGwocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKLQl9Ci0KLQlzdGF0aWMgTmFtZWRRdWVyeUltcGwgY3JlYXRlTmVzdGVkTmFtZWRRdWVyeShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLCBpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlcikgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0eXBlLCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBOYW1lZFF1ZXJ5SW1wbChwYXJlbnQsIHR5cGUsIGlkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG5hbWVkUXVlcmllc0FkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihuYW1lZFF1ZXJpZXNBZGFwdGVyLCBpbmRleCwgSlBBLk5BTUVEX1FVRVJZKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmFtZWRRdWVyeUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE5hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIE5hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBOYW1lZFF1ZXJ5SW1wbC5jcmVhdGVOYW1lZFF1ZXJ5KHBhcmVudCwgKFR5cGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDBmYjk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci0KLQotcHVibGljIGNsYXNzIE51bGxBc3NvY2lhdGlvbk92ZXJyaWRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudHMgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24sIEFubm90YXRpb24KLXsJCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXB1YmxpYyBOdWxsQXNzb2NpYXRpb25PdmVycmlkZShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbnVsbCwgbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UoKS5zZXROYW1lKG5hbWUpOwotCQl9CQkKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgaW50IGluZGV4T2ZKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgZ2V0UGFyZW50KCkuYWRkQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCi0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzMyNjJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLXB1YmxpYyBjbGFzcyBOdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4gZXh0ZW5kcyBOdWxsQmFzZUNvbHVtbiBpbXBsZW1lbnRzIENvbHVtbkFubm90YXRpb24sIEFubm90YXRpb24KLXsJCi0JcHVibGljIE51bGxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2x1bW5Bbm5vdGF0aW9uIGNyZWF0ZUNvbHVtblJlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuYWRkQ29sdW1uKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbGVuZ3RoKSB7Ci0JCWlmIChsZW5ndGggIT0gbnVsbCkgewotCQkJY3JlYXRlQ29sdW1uUmVzb3VyY2UoKS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRTY2FsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNjYWxlKEludGVnZXIgc2NhbGUpIHsKLQkJaWYgKHNjYWxlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0U2NhbGUoc2NhbGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIHByZWNpc2lvbikgewotCQlpZiAocHJlY2lzaW9uICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0UHJlY2lzaW9uKHByZWNpc2lvbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2FsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRMZW5ndGhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJlY2lzaW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxCYXNlQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjM5YjY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxCYXNlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE51bGxCYXNlQ29sdW1uIGV4dGVuZHMgTnVsbE5hbWVkQ29sdW1uIGltcGxlbWVudHMgQmFzZUNvbHVtbkFubm90YXRpb24sIEFubm90YXRpb24KLXsJCi0JcHJvdGVjdGVkIE51bGxCYXNlQ29sdW1uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGFic3RyYWN0IEJhc2VDb2x1bW5Bbm5vdGF0aW9uIGNyZWF0ZUNvbHVtblJlc291cmNlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIHRhYmxlKSB7Ci0JCWlmICh0YWJsZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVDb2x1bW5SZXNvdXJjZSgpLnNldFRhYmxlKHRhYmxlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB1bmlxdWUpIHsKLQkJaWYgKHVuaXF1ZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVDb2x1bW5SZXNvdXJjZSgpLnNldFVuaXF1ZSh1bmlxdWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVwZGF0YWJsZShCb29sZWFuIHVwZGF0YWJsZSkgewotCQlpZiAodXBkYXRhYmxlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0VXBkYXRhYmxlKHVwZGF0YWJsZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEluc2VydGFibGUoQm9vbGVhbiBpbnNlcnRhYmxlKSB7Ci0JCWlmIChpbnNlcnRhYmxlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0SW5zZXJ0YWJsZShpbnNlcnRhYmxlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gbnVsbGFibGUpIHsKLQkJaWYgKG51bGxhYmxlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0TnVsbGFibGUobnVsbGFibGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VW5pcXVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFVwZGF0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRJbnNlcnRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE51bGxhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB0YWJsZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxCYXNlVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxCYXNlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NjNlMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOdWxsQmFzZVRhYmxlIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudHMgQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBOdWxsQmFzZVRhYmxlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL251bGwsIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQkKLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGFibGVBbm5vdGF0aW9uIGNyZWF0ZVRhYmxlUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoVGFibGVBbm5vdGF0aW9uKSBnZXRQYXJlbnQoKS5hZGRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCWNyZWF0ZVRhYmxlUmVzb3VyY2UoKS5zZXROYW1lKG5hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQljcmVhdGVUYWJsZVJlc291cmNlKCkuc2V0Q2F0YWxvZyhjYXRhbG9nKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQljcmVhdGVUYWJsZVJlc291cmNlKCkuc2V0U2NoZW1hKHNjaGVtYSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGNyZWF0ZVRhYmxlUmVzb3VyY2UoKS5hZGRVbmlxdWVDb25zdHJhaW50KGluZGV4KTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JcHVibGljIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBdChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgdW5pcXVlQ29uc3RyYWludHNTaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYXRhbG9nVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEJhc2ljLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzaWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNjViMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbEJhc2ljIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudHMgQmFzaWNBbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXByb3RlY3RlZCBOdWxsQmFzaWMoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbnVsbCwgbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQmFzaWNBbm5vdGF0aW9uIGNyZWF0ZUJhc2ljUmVzb3VyY2UoKSB7Ci0JCWdldFBhcmVudCgpLnNldE1hcHBpbmdBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCQlyZXR1cm4gKEJhc2ljQW5ub3RhdGlvbikgZ2V0UGFyZW50KCkuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCWlmIChmZXRjaCAhPSBudWxsKSB7Ci0JCQljcmVhdGVCYXNpY1Jlc291cmNlKCkuc2V0RmV0Y2goZmV0Y2gpOwotCQl9CQkJCQotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgewotCQlpZiAob3B0aW9uYWwgIT0gbnVsbCkgewotCQkJY3JlYXRlQmFzaWNSZXNvdXJjZSgpLnNldE9wdGlvbmFsKG9wdGlvbmFsKTsKLQkJfQkJCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OTExNDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbENvbHVtbiBleHRlbmRzIE51bGxCYXNlQ29sdW1uIGltcGxlbWVudHMgQ29sdW1uQW5ub3RhdGlvbiwgQW5ub3RhdGlvbgotewkKLQlwdWJsaWMgTnVsbENvbHVtbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2x1bW5Bbm5vdGF0aW9uIGNyZWF0ZUNvbHVtblJlc291cmNlKCkgewotCQlyZXR1cm4gKENvbHVtbkFubm90YXRpb24pIGdldFBhcmVudCgpLmFkZEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbGVuZ3RoKSB7Ci0JCWlmIChsZW5ndGggIT0gbnVsbCkgewotCQkJY3JlYXRlQ29sdW1uUmVzb3VyY2UoKS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRTY2FsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNjYWxlKEludGVnZXIgc2NhbGUpIHsKLQkJaWYgKHNjYWxlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0U2NhbGUoc2NhbGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIHByZWNpc2lvbikgewotCQlpZiAocHJlY2lzaW9uICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0UHJlY2lzaW9uKHByZWNpc2lvbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2FsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRMZW5ndGhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJlY2lzaW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjAwYTkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBOdWxsRGlzY3JpbWluYXRvckNvbHVtbiBleHRlbmRzIE51bGxOYW1lZENvbHVtbiBpbXBsZW1lbnRzIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXB1YmxpYyBOdWxsRGlzY3JpbWluYXRvckNvbHVtbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcikgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY3JlYXRlQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIGdldFBhcmVudCgpLmFkZEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIERpc2NyaW1pbmF0b3JUeXBlIGdldERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSkgewotCQlpZiAoZGlzY3JpbWluYXRvclR5cGUgIT0gbnVsbCkgewotCQkJY3JlYXRlQ29sdW1uUmVzb3VyY2UoKS5zZXREaXNjcmltaW5hdG9yVHlwZShkaXNjcmltaW5hdG9yVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQlpZiAobGVuZ3RoICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvclZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvclZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDNiOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbERpc2NyaW1pbmF0b3JWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbERpc2NyaW1pbmF0b3JWYWx1ZSBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRzIERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24sIEFubm90YXRpb24KLXsJCi0JcHJvdGVjdGVkIE51bGxEaXNjcmltaW5hdG9yVmFsdWUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9udWxsLCBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVEaXNjcmltaW5hdG9yVmFsdWVSZXNvdXJjZSgpLnNldFZhbHVlKHZhbHVlKTsKLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGNyZWF0ZURpc2NyaW1pbmF0b3JWYWx1ZVJlc291cmNlKCkgewotCQlyZXR1cm4gKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24pIGdldFBhcmVudCgpLmFkZEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRW1iZWRkZWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFbWJlZGRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE1ZTBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFbWJlZGRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLXB1YmxpYyBjbGFzcyBOdWxsRW1iZWRkZWQgZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUgaW1wbGVtZW50cyBFbWJlZGRlZEFubm90YXRpb24sIEFubm90YXRpb24KLXsJCi0JcHJvdGVjdGVkIE51bGxFbWJlZGRlZChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9udWxsLCBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcikgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFbnVtZXJhdGVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRW51bWVyYXRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjAzOWQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFbnVtZXJhdGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bWVyYXRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLXB1YmxpYyBjbGFzcyBOdWxsRW51bWVyYXRlZCBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRzIEVudW1lcmF0ZWRBbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXByb3RlY3RlZCBOdWxsRW51bWVyYXRlZChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbnVsbCwgbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkJCi0JcHJvdGVjdGVkIEVudW1lcmF0ZWRBbm5vdGF0aW9uIGNyZWF0ZUVudW1lcmF0ZWRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChFbnVtZXJhdGVkQW5ub3RhdGlvbikgZ2V0UGFyZW50KCkuYWRkQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQotCXB1YmxpYyBFbnVtVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVudW1UeXBlIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVFbnVtZXJhdGVkUmVzb3VyY2UoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxJbmhlcml0YW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEluaGVyaXRhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNTQzNDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEluaGVyaXRhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotcHVibGljIGNsYXNzIE51bGxJbmhlcml0YW5jZSBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRzIEluaGVyaXRhbmNlQW5ub3RhdGlvbiwgQW5ub3RhdGlvbgotewkKLQlwcm90ZWN0ZWQgTnVsbEluaGVyaXRhbmNlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbnVsbCwgbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSW5oZXJpdGFuY2VUeXBlIGdldFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3kpIHsKLQkJaWYgKHN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCWNyZWF0ZUluaGVyaXRhbmNlUmVzb3VyY2UoKS5zZXRTdHJhdGVneShzdHJhdGVneSk7Ci0JCX0KLQkJCi0JfQotCQotCXByb3RlY3RlZCBJbmhlcml0YW5jZUFubm90YXRpb24gY3JlYXRlSW5oZXJpdGFuY2VSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChJbmhlcml0YW5jZUFubm90YXRpb24pIGdldFBhcmVudCgpLmFkZEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U3RyYXRlZ3lUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjNzk4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTnVsbEpvaW5Db2x1bW4gZXh0ZW5kcyBOdWxsQmFzZUNvbHVtbiBpbXBsZW1lbnRzIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXB1YmxpYyBOdWxsSm9pbkNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNyZWF0ZUNvbHVtblJlc291cmNlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSm9pblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSm9pblRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNjA5OGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEpvaW5UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBOdWxsSm9pblRhYmxlIGV4dGVuZHMgTnVsbEJhc2VUYWJsZSBpbXBsZW1lbnRzIEpvaW5UYWJsZUFubm90YXRpb24KLXsJCi0JcHJvdGVjdGVkIE51bGxKb2luVGFibGUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZkludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mSm9pbkNvbHVtbihKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBpbnZlcnNlSm9pbkNvbHVtbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5BdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxOYW1lZENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbE5hbWVkQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMmM5NWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbE5hbWVkQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZENvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE51bGxOYW1lZENvbHVtbiBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRzIE5hbWVkQ29sdW1uQW5ub3RhdGlvbiwgQW5ub3RhdGlvbgotewkKLQlwcm90ZWN0ZWQgTnVsbE5hbWVkQ29sdW1uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL251bGwsIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBOYW1lZENvbHVtbkFubm90YXRpb24gY3JlYXRlQ29sdW1uUmVzb3VyY2UoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJY3JlYXRlQ29sdW1uUmVzb3VyY2UoKS5zZXROYW1lKG5hbWUpOwotCQl9CQkKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKSB7Ci0JCWlmIChjb2x1bW5EZWZpbml0aW9uICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihjb2x1bW5EZWZpbml0aW9uKTsKLQkJfQkJCi0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29sdW1uRGVmaW5pdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDkxZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uIGV4dGVuZHMgTnVsbE5hbWVkQ29sdW1uIGltcGxlbWVudHMgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXB1YmxpYyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW4oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNyZWF0ZUNvbHVtblJlc291cmNlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDVmOWY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBOdWxsVGFibGUgZXh0ZW5kcyBOdWxsQmFzZVRhYmxlIGltcGxlbWVudHMgVGFibGVBbm5vdGF0aW9uCi17CQotCXByb3RlY3RlZCBOdWxsVGFibGUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxUZW1wb3JhbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFRlbXBvcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZmVkMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFRlbXBvcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotcHVibGljIGNsYXNzIE51bGxUZW1wb3JhbCBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRzIFRlbXBvcmFsQW5ub3RhdGlvbiwgQW5ub3RhdGlvbgotewkKLQlwcm90ZWN0ZWQgTnVsbFRlbXBvcmFsKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL251bGwsIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlbXBvcmFsQW5ub3RhdGlvbiBjcmVhdGVUZW1wb3JhbFJlc291cmNlKCkgewotCQlyZXR1cm4gKFRlbXBvcmFsQW5ub3RhdGlvbikgZ2V0UGFyZW50KCkuYWRkQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUZW1wb3JhbFR5cGUgdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWNyZWF0ZVRlbXBvcmFsUmVzb3VyY2UoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvTWFueUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvTWFueUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhNzVhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb01hbnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgY2xhc3MgT25lVG9NYW55SW1wbCBleHRlbmRzIEFic3RyYWN0UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50cyBPbmVUb01hbnlBbm5vdGF0aW9uCi17CQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVEFSR0VUX0VOVElUWV9BREFQVEVSID0gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCk7CQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IENBU0NBREVfQURBUFRFUiA9IGJ1aWxkQ2FzY2FkZUFkYXB0ZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gRkVUQ0hfQURBUFRFUiA9IGJ1aWxkRmV0Y2hBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IE1BUFBFRF9CWV9BREFQVEVSID0gYnVpbGRNYXBwZWRCeUFkYXB0ZXIoKTsJCi0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG1hcHBlZEJ5QWRhcHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OwotCi0JcHJvdGVjdGVkIE9uZVRvTWFueUltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMubWFwcGVkQnlBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoTUFQUEVEX0JZX0FEQVBURVIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMubWFwcGVkQnkgPSB0aGlzLm1hcHBlZEJ5KGFzdFJvb3QpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKiogQWJzdHJhY3RSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdGFyZ2V0RW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIFRBUkdFVF9FTlRJVFlfQURBUFRFUjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBjYXNjYWRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIENBU0NBREVfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmZXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBGRVRDSF9BREFQVEVSOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKiogQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG5ld01hcHBlZEJ5KSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5tYXBwZWRCeSwgbmV3TWFwcGVkQnkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5QWRhcHRlci5zZXRWYWx1ZShuZXdNYXBwZWRCeSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX1BST1BFUlRZLCBvbGRNYXBwZWRCeSwgbmV3TWFwcGVkQnkpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKE1BUFBFRF9CWV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoTUFQUEVEX0JZX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKLQkJdGhpcy5zZXRNYXBwZWRCeSh0aGlzLm1hcHBlZEJ5KGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZEJ5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PTkVfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQ2FzY2FkZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZEVudW1BcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PTkVfVE9fTUFOWV9fQ0FTQ0FERSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRmV0Y2hBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19NQU5ZX19GRVRDSCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRNYXBwZWRCeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PTkVfVE9fTUFOWV9fTUFQUEVEX0JZLCBmYWxzZSk7IC8vIGZhbHNlID0gZG8gbm90IHJlbW92ZSBhbm5vdGF0aW9uIHdoZW4gZW1wdHkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE9uZVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPbmVUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPbmVUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgT25lVG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIE9uZVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBPbmVUb01hbnlJbXBsKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvT25lSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9PbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMmRlNmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9PbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBPbmVUb09uZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudHMgT25lVG9PbmVBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBUQVJHRVRfRU5USVRZX0FEQVBURVIgPSBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoKTsJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gQ0FTQ0FERV9BREFQVEVSID0gYnVpbGRDYXNjYWRlQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBGRVRDSF9BREFQVEVSID0gYnVpbGRGZXRjaEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IE9QVElPTkFMX0FEQVBURVIgPSBidWlsZE9wdGlvbmFsQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBNQVBQRURfQllfQURBUFRFUiA9IGJ1aWxkTWFwcGVkQnlBZGFwdGVyKCk7CQotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gb3B0aW9uYWxBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBtYXBwZWRCeUFkYXB0ZXI7Ci0KLQotCXByaXZhdGUgQm9vbGVhbiBvcHRpb25hbDsKLQkKLQlwcml2YXRlIFN0cmluZyBtYXBwZWRCeTsKLQotCXB1YmxpYyBPbmVUb09uZUltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMubWFwcGVkQnlBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoTUFQUEVEX0JZX0FEQVBURVIpOwotCQl0aGlzLm9wdGlvbmFsQWRhcHRlciA9IHRoaXMuYnVpbGRCb29sZWFuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE9QVElPTkFMX0FEQVBURVIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMubWFwcGVkQnkgPSB0aGlzLm1hcHBlZEJ5KGFzdFJvb3QpOwotCQl0aGlzLm9wdGlvbmFsID0gdGhpcy5vcHRpb25hbChhc3RSb290KTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKioqIEFic3RyYWN0UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRhcmdldEVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBUQVJHRVRfRU5USVRZX0FEQVBURVI7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gY2FzY2FkZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDQVNDQURFX0FEQVBURVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZmV0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gRkVUQ0hfQURBUFRFUjsKLQl9CQotCi0JLy8qKioqKioqKioqKioqKioqIEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCQotCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25hbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMub3B0aW9uYWwsIG5ld09wdGlvbmFsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUJvb2xlYW4gb2xkT3B0aW9uYWwgPSB0aGlzLm9wdGlvbmFsOwotCQl0aGlzLm9wdGlvbmFsID0gbmV3T3B0aW9uYWw7Ci0JCXRoaXMub3B0aW9uYWxBZGFwdGVyLnNldFZhbHVlKG5ld09wdGlvbmFsKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkT3B0aW9uYWwsIG5ld09wdGlvbmFsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG5ld01hcHBlZEJ5KSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5tYXBwZWRCeSwgbmV3TWFwcGVkQnkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5QWRhcHRlci5zZXRWYWx1ZShuZXdNYXBwZWRCeSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX1BST1BFUlRZLCBvbGRNYXBwZWRCeSwgbmV3TWFwcGVkQnkpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKE1BUFBFRF9CWV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShPUFRJT05BTF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbWFwcGVkQnlUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKE1BUFBFRF9CWV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci51cGRhdGUoYXN0Um9vdCk7Ci0JCXRoaXMuc2V0T3B0aW9uYWwodGhpcy5vcHRpb25hbChhc3RSb290KSk7Ci0JCXRoaXMuc2V0TWFwcGVkQnkodGhpcy5tYXBwZWRCeUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkQnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkQnlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBvcHRpb25hbChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25hbEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX1RBUkdFVF9FTlRJVFkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZENhc2NhZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRFbnVtQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuT05FX1RPX09ORV9fQ0FTQ0FERSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRmV0Y2hBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX0ZFVENIKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRPcHRpb25hbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZE9wdGlvbmFsQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PTkVfVE9fT05FX19PUFRJT05BTCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkT3B0aW9uYWxBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGZhbHNlLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE1hcHBlZEJ5QWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX01BUFBFRF9CWSwgZmFsc2UpOyAvLyBmYWxzZSA9IGRvIG5vdCByZW1vdmUgYW5ub3RhdGlvbiB3aGVuIGVtcHR5Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCi0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIE9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIE9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE9uZVRvT25lSW1wbCgoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PcmRlckJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjM2NGViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9yZGVyQnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcmRlckJ5SW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4gaW1wbGVtZW50cyBPcmRlckJ5QW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCi0JCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQkKLQlwcm90ZWN0ZWQgT3JkZXJCeUltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGF0dHJpYnV0ZSwgVkFMVUVfQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7Ci0JCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldFZhbHVlKHRoaXMudmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9SREVSX0JZX19WQUxVRSwgZmFsc2UpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBPcmRlckJ5QW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIE9yZGVyQnlBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPcmRlckJ5QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBPcmRlckJ5QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE9yZGVyQnlJbXBsKHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT3ZlcnJpZGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PdmVycmlkZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIzZDI0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PdmVycmlkZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE92ZXJyaWRlSW1wbCAKLQlleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPE1lbWJlcj4gIAotCWltcGxlbWVudHMgT3ZlcnJpZGVBbm5vdGF0aW9uCi17CQkKLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ25hbWUnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCi0JCi0JcHJvdGVjdGVkIE92ZXJyaWRlSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCBKUEEuQVRUUklCVVRFX09WRVJSSURFX19OQU1FLCBmYWxzZSk7IC8vIGZhbHNlID0gZG8gbm90IHJlbW92ZSBhbm5vdGF0aW9uIHdoZW4gZW1wdHkKLQkJdGhpcy5uYW1lQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihnZXRNZW1iZXIoKSx0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gdGhpcy5uYW1lKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIChJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIpIHN1cGVyLmdldEFubm90YXRpb25BZGFwdGVyKCk7Ci0JfQotCQkJCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCWdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKLQkJT3ZlcnJpZGVBbm5vdGF0aW9uIG9sZE92ZXJyaWRlID0gKE92ZXJyaWRlQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKLQkJc2V0TmFtZShvbGRPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKiBBdHRyaXVidGVPdmVycmlkZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm5hbWUsIG5ld05hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT3ZlcnJpZGVBbm5vdGF0aW9uLk5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXModGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldE5hbWUodGhpcy5uYW1lKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDc0ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsIGV4dGVuZHMgQWJzdHJhY3ROYW1lZENvbHVtbiBpbXBsZW1lbnRzIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4KLXsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAncmVmZXJlbmNlZCBjb2x1bW4gbmFtZScgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiByZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVmZXJlbmNlZENvbHVtbk5hbWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCi0JcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOwotCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRFbGVtZW50QWRhcHRlcih0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJdGhpcyhwYXJlbnQsIG1lbWJlciwgZGFhLCBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBkYWEpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQl0aGlzKHBhcmVudCwgbWVtYmVyLCBpZGFhLCBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgaWRhYSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lKGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXByaXZhdGUgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIChJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIpIHN1cGVyLmdldEFubm90YXRpb25BZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCWdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQW5ub3RhdGlvbik7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBvbGRDb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBvbGRBbm5vdGF0aW9uOwotCQlzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShvbGRDb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3UmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdSZWZlcmVuY2VkQ29sdW1uTmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVBZGFwdGVyLnNldFZhbHVlKG5ld1JlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgbmV3UmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOwotCQl0aGlzLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUoYXN0Um9vdCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXN0YXRpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXN0YXRpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwgY3JlYXRlTmVzdGVkUHJpbWFyeUtleUpvaW5Db2x1bW4oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIGludCBpbmRleCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBwa0pvaW5Db2x1bW5zQWRhcHRlcikgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4LCBwa0pvaW5Db2x1bW5zQWRhcHRlcik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwocGFyZW50LCBtZW1iZXIsIGlkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHBrSm9pbkNvbHVtbnNBZGFwdGVyKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIocGtKb2luQ29sdW1uc0FkYXB0ZXIsIGluZGV4LCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCX0KLQotCi0Jc3RhdGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gY3JlYXRlU2Vjb25kYXJ5VGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHNlY29uZGFyeVRhYmxlQWRhcHRlciwgSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbChwYXJlbnQsIG1lbWJlciwgYnVpbGRTZWNvbmRhcnlUYWJsZUFubm90YXRpb25BZGFwdGVyKHNlY29uZGFyeVRhYmxlQWRhcHRlciwgaW5kZXgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBzZWNvbmRhcnlUYWJsZUFkYXB0ZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKHNlY29uZGFyeVRhYmxlQWRhcHRlciwgSlBBLlNFQ09OREFSWV9UQUJMRV9fUEtfSk9JTl9DT0xVTU5TLCBpbmRleCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwuY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4ocGFyZW50LCBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5zSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5zSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmJjZWU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248TWVtYmVyPiBpbXBsZW1lbnRzIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24KLXsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgTGlzdDxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uPiBwa0pvaW5Db2x1bW5zOwotCQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKGFzdFJvb3QsIHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuICJ2YWx1ZSI7Ci0JfQotCQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4+IG5lc3RlZEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMucGtKb2luQ29sdW1ucyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zLnNpemUoKTsKLQl9CQotCi0JcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkSW50ZXJuYWwoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnMuYWRkKGluZGV4LCBwa0pvaW5Db2x1bW4pOwotCQlyZXR1cm4gcGtKb2luQ29sdW1uOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGQoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQlhZGQoaW5kZXgsIHBrSm9pbkNvbHVtbik7Ci0JCXJldHVybiBwa0pvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgaW5kZXgsIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHBrSm9pbkNvbHVtbiwgdGhpcy5wa0pvaW5Db2x1bW5zLCBQS19KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChwa0pvaW5Db2x1bW4sIHRoaXMucGtKb2luQ29sdW1ucywgUEtfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5wa0pvaW5Db2x1bW5zLCBQS19KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZihOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zLmluZGV4T2YocGtKb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gbmVzdGVkQW5ub3RhdGlvbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb25Gb3IoQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCWZvciAoTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gOiB0aGlzLnBrSm9pbkNvbHVtbnMpIHsKLQkJCWlmIChqZHRBbm5vdGF0aW9uID09IHBrSm9pbkNvbHVtbi5nZXRKZHRBbm5vdGF0aW9uKChDb21waWxhdGlvblVuaXQpIGpkdEFubm90YXRpb24uZ2V0Um9vdCgpKSkgewotCQkJCXJldHVybiBwa0pvaW5Db2x1bW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJbW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLnBrSm9pbkNvbHVtbnMsIFBLX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZUludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMucGtKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnVwZGF0ZU5lc3RlZEFubm90YXRpb25zRnJvbUphdmEoYXN0Um9vdCwgdGhpcyk7Ci0JfQotCQotCXByaXZhdGUgUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlyZXR1cm4gUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsLmNyZWF0ZU5lc3RlZFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIGdldE1lbWJlcigpLCBpbmRleCwgZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uc0ltcGwocGFyZW50LCBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOGFmYmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUXVlcnlIaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlIaW50SW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPFR5cGU+Ci0JaW1wbGVtZW50cyBOZXN0YWJsZVF1ZXJ5SGludAotewotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICduYW1lJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICd2YWx1ZScgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQkKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCQotCXB1YmxpYyBRdWVyeUhpbnRJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBpZGFhLCBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHR5cGUsIGlkYWEpKTsKLQkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5uYW1lQWRhcHRlcihpZGFhKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLnZhbHVlQWRhcHRlcihpZGFhKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcih0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLnZhbHVlKGFzdFJvb3QpOwkJCi0JfQotCQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZ2V0TWVtYmVyKCksIGRhZWEpOwotCX0KLQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpQQS5RVUVSWV9ISU5UX19OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgSlBBLlFVRVJZX0hJTlRfX1ZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgc3VwZXIuZ2V0QW5ub3RhdGlvbkFkYXB0ZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5uYW1lLCBuZXdOYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudmFsdWUsIG5ld1ZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUobmV3VmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zZXROYW1lKHRoaXMubmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0VmFsdWUodGhpcy52YWx1ZShhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwZXJzaXN0ZW5jZSBtb2RlbCAtPiBqYXZhIGFubm90YXRpb25zICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJZ2V0QW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKLQkJUXVlcnlIaW50QW5ub3RhdGlvbiBvbGRRdWVyeUhpbnQgPSAoUXVlcnlIaW50QW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKLQkJc2V0TmFtZShvbGRRdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQkJc2V0VmFsdWUob2xkUXVlcnlIaW50LmdldFZhbHVlKCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlzdGF0aWMgUXVlcnlIaW50SW1wbCBjcmVhdGVOYW1lZFF1ZXJ5UXVlcnlIaW50KEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUsICBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG5hbWVkUXVlcnlBZGFwdGVyLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBRdWVyeUhpbnRJbXBsKHBhcmVudCwgdHlwZSwgYnVpbGROYW1lZFF1ZXJ5UXVlcnlIaW50QW5ub3RhdGlvbkFkYXB0ZXIobmFtZWRRdWVyeUFkYXB0ZXIsIGluZGV4KSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGROYW1lZFF1ZXJ5UXVlcnlIaW50QW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBuYW1lZFF1ZXJ5QWRhcHRlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIobmFtZWRRdWVyeUFkYXB0ZXIsIEpQQS5OQU1FRF9RVUVSWV9fSElOVFMsIGluZGV4LCBKUEEuUVVFUllfSElOVCk7Ci0JfQotCi0Jc3RhdGljIFF1ZXJ5SGludEltcGwgY3JlYXRlTmFtZWROYXRpdmVRdWVyeVF1ZXJ5SGludChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG5hbWVkTmF0aXZlUXVlcnlBZGFwdGVyLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBRdWVyeUhpbnRJbXBsKHBhcmVudCwgdHlwZSwgYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5UXVlcnlIaW50QW5ub3RhdGlvbkFkYXB0ZXIobmFtZWROYXRpdmVRdWVyeUFkYXB0ZXIsIGluZGV4KSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5UXVlcnlIaW50QW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBuYW1lZE5hdGl2ZVF1ZXJ5QWRhcHRlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIobmFtZWROYXRpdmVRdWVyeUFkYXB0ZXIsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX0hJTlRTLCBpbmRleCwgSlBBLlFVRVJZX0hJTlQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjN2RhNDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29udGFpbmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNlY29uZGFyeVRhYmxlSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VUYWJsZSBpbXBsZW1lbnRzIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGUKLXsJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQlwcml2YXRlIGZpbmFsIExpc3Q8TmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcGtKb2luQ29sdW1uczsKLQkKLQlwcml2YXRlIGZpbmFsIFBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uIHBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uOwotCQotCi0JcHJvdGVjdGVkIFNlY29uZGFyeVRhYmxlSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uPigpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uID0gbmV3IFBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RSb290LCB0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjYXRhbG9nQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIsIEpQQS5TRUNPTkRBUllfVEFCTEVfX0NBVEFMT0cpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciwgSlBBLlNFQ09OREFSWV9UQUJMRV9fTkFNRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NoZW1hQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIsIEpQQS5TRUNPTkRBUllfVEFCTEVfX1NDSEVNQSk7Ci0JfQotCi0JcHVibGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSBzdXBlci5nZXRBbm5vdGF0aW9uQWRhcHRlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCWdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIG9sZFNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKLQkJc2V0TmFtZShvbGRTZWNvbmRhcnlUYWJsZS5nZXROYW1lKCkpOwotCQlzZXRDYXRhbG9nKG9sZFNlY29uZGFyeVRhYmxlLmdldENhdGFsb2coKSk7Ci0JCXNldFNjaGVtYShvbGRTZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCWZvciAoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvbGRTZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpKSkgewotCQkJTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IG5ld1VuaXF1ZUNvbnN0cmFpbnQgPSBhZGRVbmlxdWVDb25zdHJhaW50KG9sZFNlY29uZGFyeVRhYmxlLmluZGV4T2ZVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQpKTsKLQkJCW5ld1VuaXF1ZUNvbnN0cmFpbnQuaW5pdGlhbGl6ZUZyb20oKE5lc3RhYmxlQW5ub3RhdGlvbikgdW5pcXVlQ29uc3RyYWludCk7Ci0JCX0KLQkJZm9yIChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9sZFNlY29uZGFyeVRhYmxlLnBrSm9pbkNvbHVtbnMoKSkpIHsKLQkJCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gbmV3UGtKb2luQ29sdW1uID0gYWRkUGtKb2luQ29sdW1uKG9sZFNlY29uZGFyeVRhYmxlLmluZGV4T2ZQa0pvaW5Db2x1bW4ocGtKb2luQ29sdW1uKSk7Ci0JCQluZXdQa0pvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb20oKE5lc3RhYmxlQW5ub3RhdGlvbikgcGtKb2luQ29sdW1uKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBVbmlxdWVDb25zdHJhaW50SW1wbC5jcmVhdGVTZWNvbmRhcnlUYWJsZVVuaXF1ZUNvbnN0cmFpbnQodGhpcywgdGhpcy5nZXRNZW1iZXIoKSwgdGhpcy5nZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCksIGluZGV4KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKiBTZWNvbmRhcnlUYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqCi0JCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHBrSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPih0aGlzLnBrSm9pbkNvbHVtbnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHBrSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnBrSm9pbkNvbHVtbnMuZ2V0KGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIGludCBpbmRleE9mUGtKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLnBrSm9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRQa0pvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gKE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4pIENvbnRhaW5lckFubm90YXRpb25Ub29scy5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4LCB0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1BZGRlZChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uUEtfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBwa0pvaW5Db2x1bW4pOwotCQlyZXR1cm4gcGtKb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQa0pvaW5Db2x1bW4oaW50IGluZGV4LCBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBwa0pvaW5Db2x1bW4sIHRoaXMucGtKb2luQ29sdW1ucywgUEtfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVQa0pvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gdGhpcy5wa0pvaW5Db2x1bW5zLmdldChpbmRleCk7Ci0JCXJlbW92ZVBrSm9pbkNvbHVtbihwa0pvaW5Db2x1bW4pOwotCQlwa0pvaW5Db2x1bW4ucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuc3luY2hBbm5vdGF0aW9uc0FmdGVyUmVtb3ZlKGluZGV4LCB0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUGtKb2luQ29sdW1uKE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChwa0pvaW5Db2x1bW4sIHRoaXMucGtKb2luQ29sdW1ucywgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLlBLX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlUGtKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVQa0pvaW5Db2x1bW5JbnRlcm5hbCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuc3luY2hBbm5vdGF0aW9uc0FmdGVyTW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMucGtKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24pOwotCQlmaXJlSXRlbU1vdmVkKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5QS19KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVBrSm9pbkNvbHVtbkludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMucGtKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlyZXR1cm4gUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsLmNyZWF0ZVNlY29uZGFyeVRhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4oZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpLCB0aGlzLCBnZXRNZW1iZXIoKSwgaW5kZXgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci51cGRhdGUoYXN0Um9vdCk7Ci0JCXRoaXMudXBkYXRlUGtKb2luQ29sdW1uc0Zyb21KYXZhKGFzdFJvb3QpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlUGtKb2luQ29sdW1uc0Zyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMucGtKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24pOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXN0YXRpYyBTZWNvbmRhcnlUYWJsZUltcGwgY3JlYXRlU2Vjb25kYXJ5VGFibGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJcmV0dXJuIG5ldyBTZWNvbmRhcnlUYWJsZUltcGwocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKSk7Ci0JfQotCi0Jc3RhdGljIFNlY29uZGFyeVRhYmxlSW1wbCBjcmVhdGVOZXN0ZWRTZWNvbmRhcnlUYWJsZShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHNlY29uZGFyeVRhYmxlc0FkYXB0ZXIpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCwgc2Vjb25kYXJ5VGFibGVzQWRhcHRlcik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBTZWNvbmRhcnlUYWJsZUltcGwocGFyZW50LCBtZW1iZXIsIGlkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHNlY29uZGFyeVRhYmxlc0FkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihzZWNvbmRhcnlUYWJsZXNBZGFwdGVyLCBpbmRleCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JfQotCQotCQotCXByaXZhdGUgY2xhc3MgUGtKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24gZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUgCi0JCWltcGxlbWVudHMgQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uPiAKLQl7Ci0JCXB1YmxpYyBQa0pvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbigpIHsKLQkJCXN1cGVyKFNlY29uZGFyeVRhYmxlSW1wbC50aGlzKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJLy9ub3RoaW5nIHRvIGluaXRpYWxpemUKLQkJfQotCQkKLQkJcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkSW50ZXJuYWwoaW50IGluZGV4KSB7Ci0JCQlOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIHBLSm9pbkNvbHVtbiA9IFNlY29uZGFyeVRhYmxlSW1wbC50aGlzLmNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uKGluZGV4KTsKLQkJCVNlY29uZGFyeVRhYmxlSW1wbC50aGlzLnBrSm9pbkNvbHVtbnMuYWRkKGluZGV4LCBwS0pvaW5Db2x1bW4pOwotCQkJcmV0dXJuIHBLSm9pbkNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkKGludCBpbmRleCkgewotCQkJTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwS0pvaW5Db2x1bW4gPSBTZWNvbmRhcnlUYWJsZUltcGwudGhpcy5jcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbmRleCk7Ci0JCQlTZWNvbmRhcnlUYWJsZUltcGwudGhpcy5hZGRQa0pvaW5Db2x1bW4oaW5kZXgsIHBLSm9pbkNvbHVtbik7Ci0JCQlyZXR1cm4gcEtKb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gU2Vjb25kYXJ5VGFibGVJbXBsLnRoaXMuaW5kZXhPZlBrSm9pbkNvbHVtbihwa0pvaW5Db2x1bW4pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJU2Vjb25kYXJ5VGFibGVJbXBsLnRoaXMubW92ZVBrSm9pbkNvbHVtbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBtb3ZlSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCVNlY29uZGFyeVRhYmxlSW1wbC50aGlzLm1vdmVQa0pvaW5Db2x1bW5JbnRlcm5hbCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gbmVzdGVkQW5ub3RhdGlvbkF0KGludCBpbmRleCkgewotCQkJcmV0dXJuIFNlY29uZGFyeVRhYmxlSW1wbC50aGlzLnBrSm9pbkNvbHVtbkF0KGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4+KFNlY29uZGFyeVRhYmxlSW1wbC50aGlzLnBrSm9pbkNvbHVtbnMpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7Ci0JCQlyZXR1cm4gcGtKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gU2Vjb25kYXJ5VGFibGVJbXBsLnRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU47Ci0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbiBuZXN0ZWRBbm5vdGF0aW9uRm9yKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJCWZvciAoTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobmVzdGVkQW5ub3RhdGlvbnMoKSkpIHsKLQkJCQlpZiAoamR0QW5ub3RhdGlvbiA9PSBwa0pvaW5Db2x1bW4uZ2V0SmR0QW5ub3RhdGlvbigoQ29tcGlsYXRpb25Vbml0KSBqZHRBbm5vdGF0aW9uLmdldFJvb3QoKSkpIHsKLQkJCQkJcmV0dXJuIHBrSm9pbkNvbHVtbjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCXRoaXMucmVtb3ZlKG5lc3RlZEFubm90YXRpb25BdChpbmRleCkpOwkKLQkJfQkJCi0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCQlTZWNvbmRhcnlUYWJsZUltcGwudGhpcy5yZW1vdmVQa0pvaW5Db2x1bW4ocGtKb2luQ29sdW1uKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gU2Vjb25kYXJ5VGFibGVJbXBsLnRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCQlTZWNvbmRhcnlUYWJsZUltcGwudGhpcy5uZXdBbm5vdGF0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQkJU2Vjb25kYXJ5VGFibGVJbXBsLnRoaXMucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlTZWNvbmRhcnlUYWJsZUltcGwudGhpcy51cGRhdGUoYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gU2Vjb25kYXJ5VGFibGVJbXBsLnRoaXMuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQkJcmV0dXJuICJwa0pvaW5Db2x1bW5zIjsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBTZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBTZWNvbmRhcnlUYWJsZUltcGwuY3JlYXRlU2Vjb25kYXJ5VGFibGUocGFyZW50LCBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZXNJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYjMwYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU2Vjb25kYXJ5VGFibGVzSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPE1lbWJlcj4gaW1wbGVtZW50cyBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIGZpbmFsIExpc3Q8TmVzdGFibGVTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzOwotCQotCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZXNJbXBsKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZXMgPSBuZXcgQXJyYXlMaXN0PE5lc3RhYmxlU2Vjb25kYXJ5VGFibGU+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKGFzdFJvb3QsIHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuICJ2YWx1ZSI7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVTZWNvbmRhcnlUYWJsZT4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVTZWNvbmRhcnlUYWJsZT4odGhpcy5zZWNvbmRhcnlUYWJsZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2Vjb25kYXJ5VGFibGVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGUgYWRkSW50ZXJuYWwoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBjcmVhdGVTZWNvbmRhcnlUYWJsZShpbmRleCk7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGVzLmFkZChpbmRleCwgc2Vjb25kYXJ5VGFibGUpOwotCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGU7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGUgYWRkKGludCBpbmRleCkgewotCQlOZXN0YWJsZVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gY3JlYXRlU2Vjb25kYXJ5VGFibGUoaW5kZXgpOwotCQl0aGlzLmFkZChpbmRleCwgc2Vjb25kYXJ5VGFibGUpOwotCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgaW5kZXgsIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgc2Vjb25kYXJ5VGFibGUsIHRoaXMuc2Vjb25kYXJ5VGFibGVzLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLlNFQ09OREFSWV9UQUJMRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZShOZXN0YWJsZVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChzZWNvbmRhcnlUYWJsZSwgdGhpcy5zZWNvbmRhcnlUYWJsZXMsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uU0VDT05EQVJZX1RBQkxFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMuc2Vjb25kYXJ5VGFibGVzLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLlNFQ09OREFSWV9UQUJMRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZihOZXN0YWJsZVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZGFyeVRhYmxlcy5pbmRleE9mKHNlY29uZGFyeVRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGUgbmVzdGVkQW5ub3RhdGlvbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZXMuZ2V0KGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGUgbmVzdGVkQW5ub3RhdGlvbkZvcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCWZvciAoTmVzdGFibGVTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA6IHRoaXMuc2Vjb25kYXJ5VGFibGVzKSB7Ci0JCQlpZiAoamR0QW5ub3RhdGlvbiA9PSBzZWNvbmRhcnlUYWJsZS5nZXRKZHRBbm5vdGF0aW9uKChDb21waWxhdGlvblVuaXQpIGpkdEFubm90YXRpb24uZ2V0Um9vdCgpKSkgewotCQkJCXJldHVybiBzZWNvbmRhcnlUYWJsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgIHRoaXMuc2Vjb25kYXJ5VGFibGVzLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLlNFQ09OREFSWV9UQUJMRVNfTElTVCk7Ci0JfQotCS8vVE9ETyB0aGlzIG1vdmUgaXMgZGlmZmVyZW50IHRoYW4gaG93IHdlIGhhbmRsZSBTZWNvbmRhclRhYmxlLnBrSm9pbkNvbHVtbnMKLS8vCXB1YmxpYyB2b2lkIG1vdmVQa0pvaW5Db2x1bW4oaW50IG9sZEluZGV4LCBpbnQgbmV3SW5kZXgpIHsKLS8vCQltb3ZlUGtKb2luQ29sdW1uSW50ZXJuYWwob2xkSW5kZXgsIG5ld0luZGV4KTsKLS8vCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuc3luY2hBbm5vdGF0aW9uc0FmdGVyTW92ZShuZXdJbmRleCwgb2xkSW5kZXgsIHRoaXMucGtKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24pOwotLy8JCWZpcmVJdGVtTW92ZWQoU2Vjb25kYXJ5VGFibGUuUEtfSk9JTl9DT0xVTU5TX0xJU1QsIG5ld0luZGV4LCBvbGRJbmRleCk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZUludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc2Vjb25kYXJ5VGFibGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnVwZGF0ZU5lc3RlZEFubm90YXRpb25zRnJvbUphdmEoYXN0Um9vdCwgdGhpcyk7Ci0JfQotCQotCXByaXZhdGUgU2Vjb25kYXJ5VGFibGVJbXBsIGNyZWF0ZVNlY29uZGFyeVRhYmxlKGludCBpbmRleCkgewotCQlyZXR1cm4gU2Vjb25kYXJ5VGFibGVJbXBsLmNyZWF0ZU5lc3RlZFNlY29uZGFyeVRhYmxlKHRoaXMsIGdldE1lbWJlcigpLCBpbmRleCwgZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgU2Vjb25kYXJ5VGFibGVzSW1wbCgoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvckltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGUwODA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGNsYXNzIFNlcXVlbmNlR2VuZXJhdG9ySW1wbCBleHRlbmRzIEdlbmVyYXRvckltcGwgaW1wbGVtZW50cyBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHNlcXVlbmNlTmFtZUFkYXB0ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRV9BREFQVEVSID0gYnVpbGRBZGFwdGVyKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1JfX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gSU5JVElBTF9WQUxVRV9BREFQVEVSID0gYnVpbGRJbnRlZ2VyQWRhcHRlcihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IEFMTE9DQVRJT05fU0laRV9BREFQVEVSID0gYnVpbGRJbnRlZ2VyQWRhcHRlcihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBTRVFVRU5DRV9OQU1FX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBLlNFUVVFTkNFX0dFTkVSQVRPUl9fU0VRVUVOQ0VfTkFNRSk7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgc2VxdWVuY2VOYW1lOwotCi0JcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9ySW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5zZXF1ZW5jZU5hbWVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIoU0VRVUVOQ0VfTkFNRV9BREFQVEVSKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMuc2VxdWVuY2VOYW1lID0gdGhpcy5zZXF1ZW5jZU5hbWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JLy8qKioqKioqKioqKiogR2VuZXJhdG9ySW1wbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFsbG9jYXRpb25TaXplQWRhcHRlcigpIHsKLQkJcmV0dXJuIEFMTE9DQVRJT05fU0laRV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBpbml0aWFsVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gSU5JVElBTF9WQUxVRV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gTkFNRV9BREFQVEVSOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZU5hbWUoU3RyaW5nIG5ld1NlcXVlbmNlTmFtZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuc2VxdWVuY2VOYW1lLCBuZXdTZXF1ZW5jZU5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZFNlcXVlbmNlTmFtZSA9IHRoaXMuc2VxdWVuY2VOYW1lOwotCQl0aGlzLnNlcXVlbmNlTmFtZSA9IG5ld1NlcXVlbmNlTmFtZTsKLQkJdGhpcy5zZXF1ZW5jZU5hbWVBZGFwdGVyLnNldFZhbHVlKG5ld1NlcXVlbmNlTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkU2VxdWVuY2VOYW1lLCBuZXdTZXF1ZW5jZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlcXVlbmNlTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFNFUVVFTkNFX05BTUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBqYXZhIGFubm90YXRpb25zIC0+IHBlcnNpc3RlbmNlIG1vZGVsICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOwotCQl0aGlzLnNldFNlcXVlbmNlTmFtZSh0aGlzLnNlcXVlbmNlTmFtZShhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc2VxdWVuY2VOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlTmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFkYXB0ZXIoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBidWlsZEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBlbGVtZW50TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRJbnRlZ2VyQWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkSW50ZWdlckFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBlbGVtZW50TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBTZXF1ZW5jZUdlbmVyYXRvckltcGwocGFyZW50LCBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZUdlbmVyYXRvckltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmFhNDBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db250YWluZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFRhYmxlR2VuZXJhdG9ySW1wbCBleHRlbmRzIEdlbmVyYXRvckltcGwgaW1wbGVtZW50cyBUYWJsZUdlbmVyYXRvckFubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRhYmxlQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY2F0YWxvZ0FkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHNjaGVtYUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHBrQ29sdW1uTmFtZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQ29sdW1uTmFtZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHBrQ29sdW1uVmFsdWVBZGFwdGVyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IE5BTUVfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IElOSVRJQUxfVkFMVUVfQURBUFRFUiA9IGJ1aWxkSW50ZWdlckFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBBTExPQ0FUSU9OX1NJWkVfQURBUFRFUiA9IGJ1aWxkSW50ZWdlckFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVEFCTEVfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19UQUJMRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IENBVEFMT0dfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19DQVRBTE9HKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gU0NIRU1BX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fU0NIRU1BKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gUEtfQ09MVU1OX05BTUVfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0NPTFVNTl9OQU1FX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fVkFMVUVfQ09MVU1OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBQS19DT0xVTU5fVkFMVUVfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUUpOwotCQotCXByaXZhdGUgU3RyaW5nIHRhYmxlOwotCQotCXByaXZhdGUgU3RyaW5nIGNhdGFsb2c7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgc2NoZW1hOwotCQotCXByaXZhdGUgU3RyaW5nIHBrQ29sdW1uTmFtZTsKLQkKLQlwcml2YXRlIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcGtDb2x1bW5WYWx1ZTsKLQkKLQlwcml2YXRlIGZpbmFsIExpc3Q8TmVzdGFibGVVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50czsKLQkKLQlwcml2YXRlIGZpbmFsIFVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyQW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb247Ci0JCi0KLQlwcm90ZWN0ZWQgVGFibGVHZW5lcmF0b3JJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKFRBQkxFX0FEQVBURVIpOwotCQl0aGlzLmNhdGFsb2dBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIoQ0FUQUxPR19BREFQVEVSKTsKLQkJdGhpcy5zY2hlbWFBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIoU0NIRU1BX0FEQVBURVIpOwotCQl0aGlzLnBrQ29sdW1uTmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcihQS19DT0xVTU5fTkFNRV9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUNvbHVtbk5hbWVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIoVkFMVUVfQ09MVU1OX05BTUVfQURBUFRFUik7Ci0JCXRoaXMucGtDb2x1bW5WYWx1ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcihQS19DT0xVTU5fVkFMVUVfQURBUFRFUik7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludHMgPSBuZXcgQXJyYXlMaXN0PE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludD4oKTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb24gPSBuZXcgVW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy50YWJsZSA9IHRoaXMudGFibGUoYXN0Um9vdCk7Ci0JCXRoaXMuY2F0YWxvZyA9IHRoaXMuY2F0YWxvZyhhc3RSb290KTsKLQkJdGhpcy5zY2hlbWEgPSB0aGlzLnNjaGVtYShhc3RSb290KTsKLQkJdGhpcy5wa0NvbHVtbk5hbWUgPSB0aGlzLnBrQ29sdW1uTmFtZShhc3RSb290KTsKLQkJdGhpcy52YWx1ZUNvbHVtbk5hbWUgPSB0aGlzLnZhbHVlQ29sdW1uTmFtZShhc3RSb290KTsKLQkJdGhpcy5wa0NvbHVtblZhbHVlID0gdGhpcy5wa0NvbHVtblZhbHVlKGFzdFJvb3QpOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKGFzdFJvb3QsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCQotCS8vKioqKioqKioqKioqIEdlbmVyYXRvckltcGwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBhbGxvY2F0aW9uU2l6ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBBTExPQ0FUSU9OX1NJWkVfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gaW5pdGlhbFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIElOSVRJQUxfVkFMVUVfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIE5BTUVfQURBUFRFUjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIG5ld1RhYmxlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy50YWJsZSwgbmV3VGFibGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZFRhYmxlID0gdGhpcy50YWJsZTsKLQkJdGhpcy50YWJsZSA9IG5ld1RhYmxlOwotCQl0aGlzLnRhYmxlQWRhcHRlci5zZXRWYWx1ZShuZXdUYWJsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfUFJPUEVSVFksIG9sZFRhYmxlLCBuZXdUYWJsZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nKFN0cmluZyBuZXdDYXRhbG9nKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5jYXRhbG9nLCBuZXdDYXRhbG9nKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGRDYXRhbG9nID0gdGhpcy5jYXRhbG9nOwotCQl0aGlzLmNhdGFsb2cgPSBuZXdDYXRhbG9nOwotCQl0aGlzLmNhdGFsb2dBZGFwdGVyLnNldFZhbHVlKG5ld0NhdGFsb2cpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENBVEFMT0dfUFJPUEVSVFksIG9sZENhdGFsb2csIG5ld0NhdGFsb2cpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIG5ld1NjaGVtYSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuc2NoZW1hLCBuZXdTY2hlbWEpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZFNjaGVtYSA9IHRoaXMuc2NoZW1hOwotCQl0aGlzLnNjaGVtYSA9IG5ld1NjaGVtYTsKLQkJdGhpcy5zY2hlbWFBZGFwdGVyLnNldFZhbHVlKG5ld1NjaGVtYSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NIRU1BX1BST1BFUlRZLCBvbGRTY2hlbWEsIG5ld1NjaGVtYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQa0NvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnBrQ29sdW1uTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGtDb2x1bW5OYW1lKFN0cmluZyBuZXdQa0NvbHVtbk5hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnBrQ29sdW1uTmFtZSwgbmV3UGtDb2x1bW5OYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGRQa0NvbHVtbk5hbWUgPSB0aGlzLnBrQ29sdW1uTmFtZTsKLQkJdGhpcy5wa0NvbHVtbk5hbWUgPSBuZXdQa0NvbHVtbk5hbWU7Ci0JCXRoaXMucGtDb2x1bW5OYW1lQWRhcHRlci5zZXRWYWx1ZShuZXdQa0NvbHVtbk5hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBLX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRQa0NvbHVtbk5hbWUsIG5ld1BrQ29sdW1uTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUNvbHVtbk5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlQ29sdW1uTmFtZShTdHJpbmcgbmV3VmFsdWVDb2x1bW5OYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy52YWx1ZUNvbHVtbk5hbWUsIG5ld1ZhbHVlQ29sdW1uTmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkVmFsdWVDb2x1bW5OYW1lID0gdGhpcy52YWx1ZUNvbHVtbk5hbWU7Ci0JCXRoaXMudmFsdWVDb2x1bW5OYW1lID0gbmV3VmFsdWVDb2x1bW5OYW1lOwotCQl0aGlzLnZhbHVlQ29sdW1uTmFtZUFkYXB0ZXIuc2V0VmFsdWUobmV3VmFsdWVDb2x1bW5OYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkVmFsdWVDb2x1bW5OYW1lLCBuZXdWYWx1ZUNvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGtDb2x1bW5WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMucGtDb2x1bW5WYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGtDb2x1bW5WYWx1ZShTdHJpbmcgbmV3UGtDb2x1bW5WYWx1ZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMucGtDb2x1bW5WYWx1ZSwgbmV3UGtDb2x1bW5WYWx1ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkUGtDb2x1bW5WYWx1ZSA9IHRoaXMucGtDb2x1bW5WYWx1ZTsKLQkJdGhpcy5wa0NvbHVtblZhbHVlID0gbmV3UGtDb2x1bW5WYWx1ZTsKLQkJdGhpcy5wa0NvbHVtblZhbHVlQWRhcHRlci5zZXRWYWx1ZShuZXdQa0NvbHVtblZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQS19DT0xVTU5fVkFMVUVfUFJPUEVSVFksIG9sZFBrQ29sdW1uVmFsdWUsIG5ld1BrQ29sdW1uVmFsdWUpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPih0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKLQl9Ci0JCi0JcHVibGljIGludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50cy5pbmRleE9mKHVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gKE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCkgQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1BZGRlZChUYWJsZUdlbmVyYXRvckFubm90YXRpb24uVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIGluZGV4LCB1bmlxdWVDb25zdHJhaW50KTsKLQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCwgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgdW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludHMuZ2V0KGluZGV4KTsKLQkJcmVtb3ZlVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KTsKLQkJdW5pcXVlQ29uc3RyYWludC5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXN5bmNoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdCh1bmlxdWVDb25zdHJhaW50LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCBVTklRVUVfQ09OU1RSQUlOVFNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJbW92ZVVuaXF1ZUNvbnN0cmFpbnRJbnRlcm5hbCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuc3luY2hBbm5vdGF0aW9uc0FmdGVyTW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1Nb3ZlZChUYWJsZUFubm90YXRpb24uVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50SW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy51bmlxdWVDb25zdHJhaW50cywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBzeW5jaHJvbml6ZSB0aGUgYW5ub3RhdGlvbnMgd2l0aCB0aGUgbW9kZWwgam9pbiBjb2x1bW5zLAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gcHJldmVudCBvdmVybGFwCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW50IGluZGV4KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW5kZXgsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBjcmVhdGVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlyZXR1cm4gVW5pcXVlQ29uc3RyYWludEltcGwuY3JlYXRlVGFibGVHZW5lcmF0b3JVbmlxdWVDb25zdHJhaW50KHRoaXMsIHRoaXMuZ2V0TWVtYmVyKCksIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVEFCTEVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKENBVEFMT0dfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoU0NIRU1BX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFBrQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFBLX0NPTFVNTl9OQU1FX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFBrQ29sdW1uVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShQS19DT0xVTU5fVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQ09MVU1OX05BTUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBqYXZhIGFubm90YXRpb25zIC0+IHBlcnNpc3RlbmNlIG1vZGVsICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOwotCQl0aGlzLnNldFRhYmxlKHRoaXMudGFibGUoYXN0Um9vdCkpOwotCQl0aGlzLnNldENhdGFsb2codGhpcy5jYXRhbG9nKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRTY2hlbWEodGhpcy5zY2hlbWEoYXN0Um9vdCkpOwotCQl0aGlzLnNldFBrQ29sdW1uTmFtZSh0aGlzLnBrQ29sdW1uTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0VmFsdWVDb2x1bW5OYW1lKHRoaXMudmFsdWVDb2x1bW5OYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRQa0NvbHVtblZhbHVlKHRoaXMucGtDb2x1bW5WYWx1ZShhc3RSb290KSk7Ci0JCXRoaXMudXBkYXRlVW5pcXVlQ29uc3RyYWludHNGcm9tSmF2YShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmNhdGFsb2dBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjaGVtYShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBrQ29sdW1uTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5wa0NvbHVtbk5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlQ29sdW1uTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUNvbHVtbk5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBrQ29sdW1uVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucGtDb2x1bW5WYWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCS8qKgotCSAqIGhlcmUgd2UganVzdCB3b3JyeSBhYm91dCBnZXR0aW5nIHRoZSB1bmlxdWUgY29uc3RyYWludHMgbGlzdHMgdGhlIHNhbWUgc2l6ZTsKLQkgKiB0aGVuIHdlIGRlbGVnYXRlIHRvIHRoZSB1bmlxdWUgY29uc3RyYWludHMgdG8gc3luY2ggdGhlbXNlbHZlcyB1cAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVVbmlxdWVDb25zdHJhaW50c0Zyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIGVsZW1lbnROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZEludGVnZXJBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gYnVpbGRJbnRlZ2VyQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIGVsZW1lbnROYW1lKTsKLQl9Ci0KLQkKLQlwcml2YXRlIGNsYXNzIFVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyQW5ub3RhdGlvbiBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSAKLQkJaW1wbGVtZW50cyBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludD4gCi0JewotCQlwdWJsaWMgVW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKCkgewotCQkJc3VwZXIoVGFibGVHZW5lcmF0b3JJbXBsLnRoaXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkvL25vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCQl9Ci0JCQotCQlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGFkZEludGVybmFsKGludCBpbmRleCkgewotCQkJTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgPSBUYWJsZUdlbmVyYXRvckltcGwudGhpcy5jcmVhdGVVbmlxdWVDb25zdHJhaW50KGluZGV4KTsKLQkJCVRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZChpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7Ci0JCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludDsKLQkJfQotCQkKLQkJcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBhZGQoaW50IGluZGV4KSB7Ci0JCQlOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IFRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQoaW5kZXgpOwotCQkJVGFibGVHZW5lcmF0b3JJbXBsLnRoaXMuYWRkVW5pcXVlQ29uc3RyYWludChpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7Ci0JCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JJbXBsLnRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBKUEEuVU5JUVVFX0NPTlNUUkFJTlQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGluZGV4T2YoTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckltcGwudGhpcy5pbmRleE9mVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCVRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLm1vdmVVbmlxdWVDb25zdHJhaW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3ZlSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCVRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLm1vdmVVbmlxdWVDb25zdHJhaW50SW50ZXJuYWwodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgbmVzdGVkQW5ub3RhdGlvbkF0KGludCBpbmRleCkgewotCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLnVuaXF1ZUNvbnN0cmFpbnRBdChpbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IG5lc3RlZEFubm90YXRpb25Gb3Iob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQkJZm9yIChOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShuZXN0ZWRBbm5vdGF0aW9ucygpKSkgewotCQkJCWlmIChqZHRBbm5vdGF0aW9uID09IHVuaXF1ZUNvbnN0cmFpbnQuZ2V0SmR0QW5ub3RhdGlvbigoQ29tcGlsYXRpb25Vbml0KSBqZHRBbm5vdGF0aW9uLmdldFJvb3QoKSkpIHsKLQkJCQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludD4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludD4oVGFibGVHZW5lcmF0b3JJbXBsLnRoaXMudW5pcXVlQ29uc3RyYWludHMpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7Ci0JCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JJbXBsLnRoaXMudW5pcXVlQ29uc3RyYWludHMuc2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCQlUYWJsZUdlbmVyYXRvckltcGwudGhpcy5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQpOwkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCXRoaXMucmVtb3ZlKG5lc3RlZEFubm90YXRpb25BdChpbmRleCkpOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckltcGwudGhpcy5nZXRKZHRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJCVRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLm5ld0Fubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCQlUYWJsZUdlbmVyYXRvckltcGwudGhpcy5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCVRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLnVwZGF0ZShhc3RSb290KTsKLQkJfQotCQkKLQkJcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckltcGwudGhpcy5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gInVuaXF1ZUNvbnN0cmFpbnRzIjsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgVGFibGVHZW5lcmF0b3JJbXBsKHBhcmVudCwgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhN2Q1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBUYWJsZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlVGFibGUKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRV9BREFQVEVSID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuVEFCTEVfX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBTQ0hFTUFfQURBUFRFUiA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLlRBQkxFX19TQ0hFTUEpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBDQVRBTE9HX0FEQVBURVIgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5UQUJMRV9fQ0FUQUxPRyk7Ci0JCi0JcHJvdGVjdGVkIFRhYmxlSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKSB7Ci0JCS8vIGlnbm9yZSB0aGUgZGFhIHBhc3NlZCBpbiwgQFRhYmxlIGlzIG5ldmVyIG5lc3RlZAotCQlyZXR1cm4gTkFNRV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHNjaGVtYUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKSB7Ci0JCS8vIGlnbm9yZSB0aGUgZGFhIHBhc3NlZCBpbiwgQFRhYmxlIGlzIG5ldmVyIG5lc3RlZAotCQlyZXR1cm4gU0NIRU1BX0FEQVBURVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY2F0YWxvZ0FkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKSB7Ci0JCS8vIGlnbm9yZSB0aGUgZGFhIHBhc3NlZCBpbiwgQFRhYmxlIGlzIG5ldmVyIG5lc3RlZAotCQlyZXR1cm4gQ0FUQUxPR19BREFQVEVSOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBVbmlxdWVDb25zdHJhaW50SW1wbC5jcmVhdGVUYWJsZVVuaXF1ZUNvbnN0cmFpbnQodGhpcywgdGhpcy5nZXRNZW1iZXIoKSwgaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIFRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IFRhYmxlSW1wbChwYXJlbnQsIG1lbWJlcik7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE51bGxUYWJsZShwYXJlbnQpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGVtcG9yYWxJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5ZGI5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZW1wb3JhbEltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+IGltcGxlbWVudHMgVGVtcG9yYWxBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQotCXByaXZhdGUgVGVtcG9yYWxUeXBlIHZhbHVlOwotCQotCXByb3RlY3RlZCBUZW1wb3JhbEltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGF0dHJpYnV0ZSwgVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy52YWx1ZShhc3RSb290KTsJCQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUZW1wb3JhbFR5cGUgbmV3VmFsdWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlUZW1wb3JhbFR5cGUgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7Ci0JCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKFRlbXBvcmFsVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUobmV3VmFsdWUpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldFZhbHVlKHRoaXMudmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBUZW1wb3JhbFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5URU1QT1JBTF9fVkFMVUUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgVGVtcG9yYWxBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIFRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IFRlbXBvcmFsSW1wbChwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTnVsbFRlbXBvcmFsKHBhcmVudCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UcmFuc2llbnRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UcmFuc2llbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYTU2YjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNpZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGNsYXNzIFRyYW5zaWVudEltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+IGltcGxlbWVudHMgVHJhbnNpZW50QW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQkKLQlwcm90ZWN0ZWQgVHJhbnNpZW50SW1wbChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8gYW5ub3RhdGlvbiBtZW1iZXJzCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBUcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zaWVudEltcGwoKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9VbmlxdWVDb25zdHJhaW50SW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVW5pcXVlQ29uc3RyYWludEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1YjYwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9VbmlxdWVDb25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgVW5pcXVlQ29uc3RyYWludEltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxNZW1iZXI+IGltcGxlbWVudHMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50Ci17Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7Ci0KLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBjb2x1bW5OYW1lc0RlY2xhcmF0aW9uQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBjb2x1bW5OYW1lc0FkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lczsKLQotCi0JcHVibGljIFVuaXF1ZUNvbnN0cmFpbnRJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBpZGFhLCBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgaWRhYSkpOwotCQl0aGlzLmNvbHVtbk5hbWVzRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihpZGFhLCBKUEEuVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUyk7Ci0JCXRoaXMuY29sdW1uTmFtZXNBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLmNvbHVtbk5hbWVzRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5jb2x1bW5OYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nW10gamF2YUNvbHVtbk5hbWVzID0gdGhpcy5jb2x1bW5OYW1lc0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YUNvbHVtbk5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0aGlzLmNvbHVtbk5hbWVzLmFkZChqYXZhQ29sdW1uTmFtZXNbaV0pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgU2hvcnRDaXJjdWl0QXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihnZXRNZW1iZXIoKSwgZGFlYSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nW10+IGNvbnZlcnRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSwgY29udmVydGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgc3VwZXIuZ2V0QW5ub3RhdGlvbkFkYXB0ZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKLQkJVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gb2xkVW5pcXVlQ29uc3RyYWludCA9IChVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKLQkJZm9yIChTdHJpbmcgY29sdW1uTmFtZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvbGRVbmlxdWVDb25zdHJhaW50LmNvbHVtbk5hbWVzKCkpKSB7Ci0JCQlhZGRDb2x1bW5OYW1lKGNvbHVtbk5hbWVzU2l6ZSgpLCBjb2x1bW5OYW1lKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmNvbHVtbk5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbHVtbk5hbWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uTmFtZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW5OYW1lKFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0JCWFkZENvbHVtbk5hbWUoY29sdW1uTmFtZXNTaXplKCksIGNvbHVtbk5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW5OYW1lKGludCBpbmRleCwgU3RyaW5nIGNvbHVtbk5hbWUpIHsKLQkJYWRkQ29sdW1uTmFtZV8oaW5kZXgsIGNvbHVtbk5hbWUpOwotCQl0aGlzLmNvbHVtbk5hbWVzQWRhcHRlci5zZXRWYWx1ZSh0aGlzLmNvbHVtbk5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1t0aGlzLmNvbHVtbk5hbWVzLnNpemUoKV0pKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29sdW1uTmFtZV8oaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBjb2x1bW5OYW1lLCB0aGlzLmNvbHVtbk5hbWVzLCBDT0xVTU5fTkFNRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbk5hbWUoU3RyaW5nIGNvbHVtbk5hbWUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGNvbHVtbk5hbWUsIHRoaXMuY29sdW1uTmFtZXMsIENPTFVNTl9OQU1FU19MSVNUKTsKLQkJdGhpcy5jb2x1bW5OYW1lc0FkYXB0ZXIuc2V0VmFsdWUodGhpcy5jb2x1bW5OYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy5jb2x1bW5OYW1lcy5zaXplKCldKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uTmFtZShpbnQgaW5kZXgpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLmNvbHVtbk5hbWVzLCBDT0xVTU5fTkFNRVNfTElTVCk7Ci0JCXRoaXMuY29sdW1uTmFtZXNBZGFwdGVyLnNldFZhbHVlKHRoaXMuY29sdW1uTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3RoaXMuY29sdW1uTmFtZXMuc2l6ZSgpXSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlQ29sdW1uTmFtZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQltb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuY29sdW1uTmFtZXMsIENPTFVNTl9OQU1FU19MSVNUKTsKLQkJdGhpcy5jb2x1bW5OYW1lc0FkYXB0ZXIuc2V0VmFsdWUodGhpcy5jb2x1bW5OYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy5jb2x1bW5OYW1lcy5zaXplKCldKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbHVtbk5hbWVzVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyh0aGlzLmNvbHVtbk5hbWVzRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzRnJvbUphdmEoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29sdW1uTmFtZXNGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmdbXSBqYXZhQ29sdW1uTmFtZXMgPSB0aGlzLmNvbHVtbk5hbWVzQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQkJLy9UT0RPIGhtbSwgc2VlbXMgd2UgbmVlZCBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZvciB0aGlzCi0JCUNvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwodGhpcy5jb2x1bW5OYW1lcywgamF2YUNvbHVtbk5hbWVzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhQ29sdW1uTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBjb2x1bW5OYW1lID0gamF2YUNvbHVtbk5hbWVzW2ldOwotCQkJaWYgKCF0aGlzLmNvbHVtbk5hbWVzLmNvbnRhaW5zKGNvbHVtbk5hbWUpKSB7Ci0JCQkJYWRkQ29sdW1uTmFtZV8oY29sdW1uTmFtZXNTaXplKCksIGNvbHVtbk5hbWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBwZXJzaXN0ZW5jZSBtb2RlbCAtPiBqYXZhIGFubm90YXRpb25zICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJZ2V0QW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0Jc3RhdGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBjcmVhdGVTZWNvbmRhcnlUYWJsZVVuaXF1ZUNvbnN0cmFpbnQoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludEltcGwocGFyZW50LCBtZW1iZXIsIGJ1aWxkU2Vjb25kYXJ5VGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbkFkYXB0ZXIoZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciwgaW5kZXgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZFNlY29uZGFyeVRhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciwgSlBBLlNFQ09OREFSWV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTLCBpbmRleCwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQl9Ci0KLQlzdGF0aWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGNyZWF0ZUpvaW5UYWJsZVVuaXF1ZUNvbnN0cmFpbnQoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRJbXBsKHBhcmVudCwgbWVtYmVyLCBidWlsZEpvaW5UYWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uQWRhcHRlcihpbmRleCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkSm9pblRhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpvaW5UYWJsZUltcGwuREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuSk9JTl9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTLCBpbmRleCwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQl9Ci0KLQlzdGF0aWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGNyZWF0ZVRhYmxlVW5pcXVlQ29uc3RyYWludChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludEltcGwocGFyZW50LCBtZW1iZXIsIGJ1aWxkVGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZFRhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKFRhYmxlSW1wbC5ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTLCBpbmRleCwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQl9Ci0KLQlzdGF0aWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGNyZWF0ZVRhYmxlR2VuZXJhdG9yVW5pcXVlQ29uc3RyYWludChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludEltcGwocGFyZW50LCBtZW1iZXIsIGJ1aWxkVGFibGVHZW5lcmF0b3JVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZFRhYmxlR2VuZXJhdG9yVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKFRhYmxlR2VuZXJhdG9ySW1wbC5ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5UQUJMRV9HRU5FUkFUT1JfX1VOSVFVRV9DT05TVFJBSU5UUywgaW5kZXgsIEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVmVyc2lvbkltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ZlcnNpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZDExMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVmVyc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgY2xhc3MgVmVyc2lvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+IGltcGxlbWVudHMgVmVyc2lvbkFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwdWJsaWMgVmVyc2lvbkltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ubyBhbm5vdGF0aW9uIG1lbWJlcnMKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBWZXJzaW9uQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlcnNpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBWZXJzaW9uQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIFZlcnNpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgVmVyc2lvbkFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25JbXBsKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmZDA2MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Fzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSm9pbkNvbHVtblRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUpvaW5Db2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5UcmFuc2xhdG9yKEpPSU5fQ09MVU1OLCBPUk1fUEtHLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfSm9pbkNvbHVtbnMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9BdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZGZjMzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9BdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIAotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDb2x1bW5UcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb2x1bW5UcmFuc2xhdG9yKENPTFVNTiwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9Db2x1bW4oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9BdHRyaWJ1dGVzVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9BdHRyaWJ1dGVzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjc4ODMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQXR0cmlidXRlc1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlc1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIAotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBBdHRyaWJ1dGVzVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVJZFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUVtYmVkZGVkSWRUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVCYXNpY1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVZlcnNpb25UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVNYW55VG9PbmVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVPbmVUb01hbnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVPbmVUb09uZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU1hbnlUb01hbnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVFbWJlZGRlZFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVRyYW5zaWVudFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IElkVHJhbnNsYXRvcihJRCwgT1JNX1BLRy5nZXRBdHRyaWJ1dGVzX0lkcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUVtYmVkZGVkSWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtYmVkZGVkSWRUcmFuc2xhdG9yKEVNQkVEREVEX0lELCBPUk1fUEtHLmdldEF0dHJpYnV0ZXNfRW1iZWRkZWRJZHMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVCYXNpY1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQmFzaWNUcmFuc2xhdG9yKEJBU0lDLCBPUk1fUEtHLmdldEF0dHJpYnV0ZXNfQmFzaWNzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlVmVyc2lvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVmVyc2lvblRyYW5zbGF0b3IoVkVSU0lPTiwgT1JNX1BLRy5nZXRBdHRyaWJ1dGVzX1ZlcnNpb25zKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTWFueVRvT25lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBNYW55VG9PbmVUcmFuc2xhdG9yKE1BTllfVE9fT05FLCBPUk1fUEtHLmdldEF0dHJpYnV0ZXNfTWFueVRvT25lcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU9uZVRvTWFueVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgT25lVG9NYW55VHJhbnNsYXRvcihPTkVfVE9fTUFOWSwgT1JNX1BLRy5nZXRBdHRyaWJ1dGVzX09uZVRvTWFueXMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVPbmVUb09uZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgT25lVG9PbmVUcmFuc2xhdG9yKE9ORV9UT19PTkUsIE9STV9QS0cuZ2V0QXR0cmlidXRlc19PbmVUb09uZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVNYW55VG9NYW55VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBNYW55VG9NYW55VHJhbnNsYXRvcihNQU5ZX1RPX01BTlksIE9STV9QS0cuZ2V0QXR0cmlidXRlc19NYW55VG9NYW55cygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUVtYmVkZGVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbWJlZGRlZFRyYW5zbGF0b3IoRU1CRURERUQsIE9STV9QS0cuZ2V0QXR0cmlidXRlc19FbWJlZGRlZHMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUcmFuc2llbnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zaWVudFRyYW5zbGF0b3IoVFJBTlNJRU5ULCBPUk1fUEtHLmdldEF0dHJpYnV0ZXNfVHJhbnNpZW50cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Jhc2ljVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9CYXNpY1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2YzVjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Jhc2ljVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuY29tbW9uLnRyYW5zbGF0b3JzLkJvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIAotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBCYXNpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEJhc2ljSW1wbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU9wdGlvbmFsVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ29sdW1uVHJhbnNsYXRvcigpLCAKLQkJCWNyZWF0ZUxvYlRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRW51bWVyYXRlZFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEZFVENILCBPUk1fUEtHLmdldFhtbEJhc2ljX0ZldGNoKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlT3B0aW9uYWxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKE9QVElPTkFMLCBPUk1fUEtHLmdldFhtbEJhc2ljX09wdGlvbmFsKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb2x1bW5UcmFuc2xhdG9yKENPTFVNTiwgT1JNX1BLRy5nZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUxvYlRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihMT0IsIE9STV9QS0cuZ2V0WG1sQmFzaWNfTG9iKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlVGVtcG9yYWxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVEVNUE9SQUwsIE9STV9QS0cuZ2V0WG1sQmFzaWNfVGVtcG9yYWwoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFbnVtZXJhdGVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVOVU1FUkFURUQsIE9STV9QS0cuZ2V0WG1sQmFzaWNfRW51bWVyYXRlZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Nhc2NhZGVUeXBlVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9DYXNjYWRlVHlwZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2ZjRhNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Nhc2NhZGVUeXBlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIENhc2NhZGVUeXBlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIENhc2NhZGVUeXBlVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZUltcGwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlQ2FzY2FkZUFsbFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNhc2NhZGVQZXJzaXN0VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2FzY2FkZU1lcmdlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2FzY2FkZVJlbW92ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNhc2NhZGVSZWZyZXNoVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXNjYWRlQWxsVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKENBU0NBREVfQUxMLCBPUk1fUEtHLmdldENhc2NhZGVUeXBlX0Nhc2NhZGVBbGwoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXNjYWRlUGVyc2lzdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihDQVNDQURFX1BFUlNJU1QsIE9STV9QS0cuZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXNjYWRlTWVyZ2VUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoQ0FTQ0FERV9NRVJHRSwgT1JNX1BLRy5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlTWVyZ2UoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXNjYWRlUmVtb3ZlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKENBU0NBREVfUkVNT1ZFLCBPUk1fUEtHLmdldENhc2NhZGVUeXBlX0Nhc2NhZGVSZW1vdmUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNhc2NhZGVSZWZyZXNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKENBU0NBREVfUkVGUkVTSCwgT1JNX1BLRy5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0NvbHVtblJlc3VsdFRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQ29sdW1uUmVzdWx0VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTljNDA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQ29sdW1uUmVzdWx0VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb2x1bW5SZXN1bHRUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgQ29sdW1uUmVzdWx0VHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIEVORF9UQUdfTk9fSU5ERU5UKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldENvbHVtblJlc3VsdF9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQ29sdW1uVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9Db2x1bW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOTQxOTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9Db2x1bW5UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuY29tbW9uLnRyYW5zbGF0b3JzLkJvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb2x1bW5UcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17CQkKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIENvbHVtblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW5JbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVVuaXF1ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU51bGxhYmxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSW5zZXJ0YWJsZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVVwZGF0YWJsZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUxlbmd0aFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVByZWNpc2lvblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNjYWxlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbE5hbWVkQ29sdW1uX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVVbmlxdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKFVOSVFVRSwgT1JNX1BLRy5nZXRYbWxBYnN0cmFjdENvbHVtbl9VbmlxdWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOdWxsYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoTlVMTEFCTEUsIE9STV9QS0cuZ2V0WG1sQWJzdHJhY3RDb2x1bW5fTnVsbGFibGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVJbnNlcnRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihJTlNFUlRBQkxFLCBPUk1fUEtHLmdldFhtbEFic3RyYWN0Q29sdW1uX0luc2VydGFibGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVVcGRhdGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKFVQREFUQUJMRSwgT1JNX1BLRy5nZXRYbWxBYnN0cmFjdENvbHVtbl9VcGRhdGFibGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDb2x1bW5EZWZpbml0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKENPTFVNTl9ERUZJTklUSU9OLCBPUk1fUEtHLmdldFhtbE5hbWVkQ29sdW1uX0NvbHVtbkRlZmluaXRpb24oKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihUQUJMRSwgT1JNX1BLRy5nZXRYbWxBYnN0cmFjdENvbHVtbl9UYWJsZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUxlbmd0aFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihMRU5HVEgsIE9STV9QS0cuZ2V0WG1sQ29sdW1uX0xlbmd0aCgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVByZWNpc2lvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihQUkVDSVNJT04sIE9STV9QS0cuZ2V0WG1sQ29sdW1uX1ByZWNpc2lvbigpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNjYWxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFNDQUxFLCBPUk1fUEtHLmdldFhtbENvbHVtbl9TY2FsZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Rpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Rpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NjYyOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9EaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIERpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17CQotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgRGlzY3JpbWluYXRvckNvbHVtblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVEaXNjcm1pbmlhdG9yVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVMZW5ndGhUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxOYW1lZENvbHVtbl9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBjcmVhdGVEaXNjcm1pbmlhdG9yVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihESVNDUklNSU5BVE9SX1RZUEUsIE9STV9QS0cuZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbl9EaXNjcmltaW5hdG9yVHlwZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQ09MVU1OX0RFRklOSVRJT04sIE9STV9QS0cuZ2V0WG1sTmFtZWRDb2x1bW5fQ29sdW1uRGVmaW5pdGlvbigpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgY3JlYXRlTGVuZ3RoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKExFTkdUSCwgT1JNX1BLRy5nZXRYbWxEaXNjcmltaW5hdG9yQ29sdW1uX0xlbmd0aCgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VtYmVkZGFibGVUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VtYmVkZGFibGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MTM1OWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbWJlZGRhYmxlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEVtYmVkZGFibGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17CQotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgRW1iZWRkYWJsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZUNsYXNzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWV0YWRhdGFDb21wbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQXR0cmlidXRlc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQ0xBU1MsIE9STV9QS0cuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19DbGFzc05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBY2Nlc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQUNDRVNTLCBPUk1fUEtHLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfQWNjZXNzKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTWV0YWRhdGFDb21wbGV0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihNRVRBREFUQV9DT01QTEVURSwgT1JNX1BLRy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX01ldGFkYXRhQ29tcGxldGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgT1JNX1BLRy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0Rlc2NyaXB0aW9uKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQXR0cmlidXRlc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlc1RyYW5zbGF0b3IoQVRUUklCVVRFUywgT1JNX1BLRy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbWJlZGRlZElkVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbWJlZGRlZElkVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGMxZTJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW1iZWRkZWRJZFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRJZFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIEVtYmVkZGVkSWRUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbWJlZGRlZElkSW1wbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKEFUVFJJQlVURV9PVkVSUklERSwgT1JNX1BLRy5nZXRCYXNlWG1sRW1iZWRkZWRfQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VtYmVkZGVkVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbWJlZGRlZFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0YjhiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VtYmVkZGVkVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIEVtYmVkZGVkVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW1iZWRkZWRJbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIE9STV9QS0cuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcihBVFRSSUJVVEVfT1ZFUlJJREUsIE9STV9QS0cuZ2V0QmFzZVhtbEVtYmVkZGVkX0F0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmJkZWUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogVGhpcyB0cmFuc2xhdG9yIGlzIHRvIGJlIHVzZWQgZm9yIGVtcHR5IHhtbCB0YWdzIHRoYXQgY29ycmVzcG9uZAotICogdG8gYSBib29sZWFuIGF0dHJpYnV0ZSBpbiB0aGUgZW1mIG1vZGVsLiAgCi0gKiBjYXNjYWRlLXBlcnNpc3QgaXMgYW4gZXhhbXBsZSBmcm9tIHRoZSBvcm0ueHNkOgotICogCi0gKiAJPHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+Ci0gKiAJCTxjYXNjYWRlLXBlcnNpc3QvPiAgICAgICAgCi0gKiAJPC9wZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzPiAgPT0+ICBjYXNjYWRlUGVyc2lzdCA9PSB0cnVlCi0gKiAKLSAqIHZzLgotICogCi0gKiAJPHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+ICAKLSAqIAk8L3BlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+ICA9PT4gIGNhc2NhZGVQZXJzaXN0ID09IGZhbHNlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi17Ci0JcHVibGljIEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgZmVhdHVyZSwgRU1QVFlfVEFHIHwgQk9PTEVBTl9GRUFUVVJFKTsKLQl9Ci0KLQlwdWJsaWMgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgc3R5bGUgfCBFTVBUWV9UQUcgfCBCT09MRUFOX0ZFQVRVUkUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCS8vIEkgYW0gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC4gIFRoaXMgaXMgc28gdGhlIHRhZyB3aWxsIGJlIHJlbW92ZWQgd2hlbiAKLQkJLy8gdGhlIHZhbHVlIGlzIGZhbHNlLgotCQkvLyBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBhIGJ1ZyBpbiB0aGUgZWNvcmUgb3IgbWF5YmUgaW4gdGhlIHRyYW5zbGF0b3JzLCAKLQkJLy8gYnV0IEkgcmVhbGx5IGRvbid0IHRoaW5rIHRoYXQgd2Ugc2hvdWxkIGhhdmUgdG8gZGVwZW5kIG9uIHRoZSBib29sZWFuCi0JCS8vIGJlaW5nICJ1bnNldCIgdG8gcmVtb3ZlIHRoZSB0YWcuCi0JCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgc3VwZXIuZ2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJcmV0dXJuICh2YWx1ZSA9PSBCb29sZWFuLlRSVUUpID8gdmFsdWUgOiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbnRpdHlMaXN0ZW5lclRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5TGlzdGVuZXJUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjgwMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbnRpdHlMaXN0ZW5lclRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5TGlzdGVuZXJUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBFbnRpdHlMaXN0ZW5lclRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcmVQZXJzaXN0VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUG9zdFBlcnNpc3RUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcmVSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQb3N0UmVtb3ZlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUHJlVXBkYXRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUG9zdFVwZGF0ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVBvc3RMb2FkVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDTEFTUywgT1JNX1BLRy5nZXRFbnRpdHlMaXN0ZW5lcl9DbGFzc05hbWUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcmVQZXJzaXN0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUFJFX1BFUlNJU1QsIE9STV9QS0cuZ2V0RW50aXR5TGlzdGVuZXJfUHJlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVBvc3RQZXJzaXN0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUE9TVF9QRVJTSVNULCBPUk1fUEtHLmdldEVudGl0eUxpc3RlbmVyX1Bvc3RQZXJzaXN0KCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUHJlUmVtb3ZlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUFJFX1JFTU9WRSwgT1JNX1BLRy5nZXRFbnRpdHlMaXN0ZW5lcl9QcmVSZW1vdmUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0UmVtb3ZlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUE9TVF9SRU1PVkUsIE9STV9QS0cuZ2V0RW50aXR5TGlzdGVuZXJfUG9zdFJlbW92ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVByZVVwZGF0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBSRV9VUERBVEUsIE9STV9QS0cuZ2V0RW50aXR5TGlzdGVuZXJfUHJlVXBkYXRlKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUG9zdFVwZGF0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBPU1RfVVBEQVRFLCBPUk1fUEtHLmdldEVudGl0eUxpc3RlbmVyX1Bvc3RVcGRhdGUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0TG9hZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBPU1RfTE9BRCwgT1JNX1BLRy5nZXRFbnRpdHlMaXN0ZW5lcl9Qb3N0TG9hZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTlhNjYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZUVudGl0eUxpc3RlbmVyVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFbnRpdHlMaXN0ZW5lclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW50aXR5TGlzdGVuZXJUcmFuc2xhdG9yKEVOVElUWV9MSVNURU5FUiwgT1JNX1BLRy5nZXRFbnRpdHlMaXN0ZW5lcnNfRW50aXR5TGlzdGVuZXJzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5TWFwcGluZ3NUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VudGl0eU1hcHBpbmdzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTU5Nzc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5TWFwcGluZ3NUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NUcmFuc2xhdG9yIGV4dGVuZHMgUm9vdFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXB1YmxpYyBzdGF0aWMgRW50aXR5TWFwcGluZ3NUcmFuc2xhdG9yIElOU1RBTkNFID0gbmV3IEVudGl0eU1hcHBpbmdzVHJhbnNsYXRvcigpOwotCQotCQotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwotCQotCQotCXB1YmxpYyBFbnRpdHlNYXBwaW5nc1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKEVOVElUWV9NQVBQSU5HUywgT1JNX1BLRy5nZXRYbWxFbnRpdHlNYXBwaW5ncygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIFBFUlNJU1RFTkNFX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OU19YU0ksIFhTSV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYU0lfU0NIRU1BX0xPQ0FUSU9OLCBQRVJTSVNURU5DRV9OU19VUkwgKyAnICcgKyBPUk1fU0NIRU1BX0xPQ18xXzApLAotCQkJY3JlYXRlVmVyc2lvblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQYWNrYWdlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVOYW1lZFF1ZXJ5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTmFtZWROYXRpdmVRdWVyeVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVNYXBwZWRTdXBlcmNsYXNzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRW50aXR5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRW1iZWRkYWJsZVRyYW5zbGF0b3IoKQotCQl9OwotCX0JCi0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVZlcnNpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVkVSU0lPTiwgT1JNX1BLRy5nZXRYbWxFbnRpdHlNYXBwaW5nc19WZXJzaW9uKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIE9STV9QS0cuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUcmFuc2xhdG9yKFBFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEsIE9STV9QS0cuZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQYWNrYWdlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFBBQ0tBR0UsIE9STV9QS0cuZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGFja2FnZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNjaGVtYVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihTQ0hFTUEsIE9STV9QS0cuZ2V0WG1sRW50aXR5TWFwcGluZ3NfU2NoZW1hKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDQVRBTE9HLCBPUk1fUEtHLmdldFhtbEVudGl0eU1hcHBpbmdzX0NhdGFsb2coKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBY2Nlc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQUNDRVNTLCBPUk1fUEtHLmdldFhtbEVudGl0eU1hcHBpbmdzX0FjY2VzcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoU0VRVUVOQ0VfR0VORVJBVE9SLCBPUk1fUEtHLmdldFhtbEVudGl0eU1hcHBpbmdzX1NlcXVlbmNlR2VuZXJhdG9ycygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoVEFCTEVfR0VORVJBVE9SLCBPUk1fUEtHLmdldFhtbEVudGl0eU1hcHBpbmdzX1RhYmxlR2VuZXJhdG9ycygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVkUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IE5hbWVkUXVlcnlUcmFuc2xhdG9yKE5BTUVEX1FVRVJZLCBPUk1fUEtHLmdldFhtbEVudGl0eU1hcHBpbmdzX05hbWVkUXVlcmllcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IE5hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yKE5BTUVEX05BVElWRV9RVUVSWSwgT1JNX1BLRy5nZXRYbWxFbnRpdHlNYXBwaW5nc19OYW1lZE5hdGl2ZVF1ZXJpZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVTcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcihTUUxfUkVTVUxUX1NFVF9NQVBQSU5HLCBPUk1fUEtHLmdldFhtbEVudGl0eU1hcHBpbmdzX1NxbFJlc3VsdFNldE1hcHBpbmdzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTWFwcGVkU3VwZXJjbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGVkU3VwZXJjbGFzc1RyYW5zbGF0b3IoTUFQUEVEX1NVUEVSQ0xBU1MsIE9STV9QS0cuZ2V0WG1sRW50aXR5TWFwcGluZ3NfTWFwcGVkU3VwZXJjbGFzc2VzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRW50aXR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbnRpdHlUcmFuc2xhdG9yKEVOVElUWSwgT1JNX1BLRy5nZXRYbWxFbnRpdHlNYXBwaW5nc19FbnRpdGllcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUVtYmVkZGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtYmVkZGFibGVUcmFuc2xhdG9yKEVNQkVEREFCTEUsIE9STV9QS0cuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRW1iZWRkYWJsZXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbnRpdHlSZXN1bHRUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VudGl0eVJlc3VsdFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxOGQ0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VudGl0eVJlc3VsdFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5UmVzdWx0VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIEVudGl0eVJlc3VsdFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlRW50aXR5Q2xhc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVEaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRmllbGRSZXN1bHRUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUVudGl0eUNsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVOVElUWV9DTEFTUywgT1JNX1BLRy5nZXRFbnRpdHlSZXN1bHRfRW50aXR5Q2xhc3MoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVEaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKERJU0NSSU1JTkFUT1JfQ09MVU1OLCBPUk1fUEtHLmdldEVudGl0eVJlc3VsdF9EaXNjcmltaW5hdG9yQ29sdW1uKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRmllbGRSZXN1bHRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEZpZWxkUmVzdWx0VHJhbnNsYXRvcihGSUVMRF9SRVNVTFQsIE9STV9QS0cuZ2V0RW50aXR5UmVzdWx0X0ZpZWxkUmVzdWx0cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VudGl0eVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDRlYWFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17CQotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgRW50aXR5VHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNlY29uZGFyeVRhYmxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVJZENsYXNzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSW5oZXJpdGFuY2VUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVEaXNjcmltaW5hdG9yVmFsdWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVEaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU5hbWVkUXVlcnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU3FsUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcmVQZXJzaXN0VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUG9zdFBlcnNpc3RUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcmVSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQb3N0UmVtb3ZlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUHJlVXBkYXRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUG9zdFVwZGF0ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVBvc3RMb2FkVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQXR0cmlidXRlc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIE9STV9QS0cuZ2V0WG1sRW50aXR5X05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDTEFTUywgT1JNX1BLRy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0NsYXNzTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUFjY2Vzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihBQ0NFU1MsIE9STV9QS0cuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19BY2Nlc3MoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE1FVEFEQVRBX0NPTVBMRVRFLCBPUk1fUEtHLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfTWV0YWRhdGFDb21wbGV0ZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBPUk1fUEtHLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfRGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVUcmFuc2xhdG9yKFRBQkxFLCBPUk1fUEtHLmdldFhtbEVudGl0eV9UYWJsZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNlY29uZGFyeVRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTZWNvbmRhcnlUYWJsZVRyYW5zbGF0b3IoU0VDT05EQVJZX1RBQkxFLCBPUk1fUEtHLmdldFhtbEVudGl0eV9TZWNvbmRhcnlUYWJsZXMoKSk7Ci0JfQkKLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uVHJhbnNsYXRvcihQUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgT1JNX1BLRy5nZXRYbWxFbnRpdHlfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSWRDbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSWRDbGFzc1RyYW5zbGF0b3IoSURfQ0xBU1MsIE9STV9QS0cuZ2V0WG1sRW50aXR5X0lkQ2xhc3MoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVJbmhlcml0YW5jZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSW5oZXJpdGFuY2VUcmFuc2xhdG9yKElOSEVSSVRBTkNFLCBPUk1fUEtHLmdldFhtbEVudGl0eV9Jbmhlcml0YW5jZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZURpc2NyaW1pbmF0b3JWYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihESVNDUklNSU5BVE9SX1ZBTFVFLCBPUk1fUEtHLmdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVEaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvcihESVNDUklNSU5BVE9SX0NPTFVNTiwgT1JNX1BLRy5nZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoU0VRVUVOQ0VfR0VORVJBVE9SLCBPUk1fUEtHLmdldFhtbEVudGl0eV9TZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoVEFCTEVfR0VORVJBVE9SLCBPUk1fUEtHLmdldFhtbEVudGl0eV9UYWJsZUdlbmVyYXRvcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVkUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IE5hbWVkUXVlcnlUcmFuc2xhdG9yKE5BTUVEX1FVRVJZLCBPUk1fUEtHLmdldFhtbEVudGl0eV9OYW1lZFF1ZXJpZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvcihOQU1FRF9OQVRJVkVfUVVFUlksIE9STV9QS0cuZ2V0WG1sRW50aXR5X05hbWVkTmF0aXZlUXVlcmllcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKFNRTF9SRVNVTFRfU0VUX01BUFBJTkcsIE9STV9QS0cuZ2V0WG1sRW50aXR5X1NxbFJlc3VsdFNldE1hcHBpbmdzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUywgT1JNX1BLRy5nZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVyc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTLCBPUk1fUEtHLmdldFhtbEVudGl0eV9FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvcihFTlRJVFlfTElTVEVORVJTLCBPUk1fUEtHLmdldFhtbEVudGl0eV9FbnRpdHlMaXN0ZW5lcnMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcmVQZXJzaXN0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUFJFX1BFUlNJU1QsIE9STV9QS0cuZ2V0WG1sRW50aXR5X1ByZVBlcnNpc3QoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0UGVyc2lzdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBPU1RfUEVSU0lTVCwgT1JNX1BLRy5nZXRYbWxFbnRpdHlfUG9zdFBlcnNpc3QoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcmVSZW1vdmVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEV2ZW50TWV0aG9kVHJhbnNsYXRvcihQUkVfUkVNT1ZFLCBPUk1fUEtHLmdldFhtbEVudGl0eV9QcmVSZW1vdmUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0UmVtb3ZlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUE9TVF9SRU1PVkUsIE9STV9QS0cuZ2V0WG1sRW50aXR5X1Bvc3RSZW1vdmUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcmVVcGRhdGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEV2ZW50TWV0aG9kVHJhbnNsYXRvcihQUkVfVVBEQVRFLCBPUk1fUEtHLmdldFhtbEVudGl0eV9QcmVVcGRhdGUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0VXBkYXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUE9TVF9VUERBVEUsIE9STV9QS0cuZ2V0WG1sRW50aXR5X1Bvc3RVcGRhdGUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0TG9hZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBPU1RfTE9BRCwgT1JNX1BLRy5nZXRYbWxFbnRpdHlfUG9zdExvYWQoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKEFUVFJJQlVURV9PVkVSUklERSwgT1JNX1BLRy5nZXRYbWxFbnRpdHlfQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoQVNTT0NJQVRJT05fT1ZFUlJJREUsIE9STV9QS0cuZ2V0WG1sRW50aXR5X0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQXR0cmlidXRlc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlc1RyYW5zbGF0b3IoQVRUUklCVVRFUywgT1JNX1BLRy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FdmVudE1ldGhvZFRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRXZlbnRNZXRob2RUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjUyOGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FdmVudE1ldGhvZFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRXZlbnRNZXRob2RUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgRU5EX1RBR19OT19JTkRFTlQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVNZXRob2ROYW1lVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVNZXRob2ROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE1FVEhPRF9OQU1FLCBPUk1fUEtHLmdldEV2ZW50TWV0aG9kX01ldGhvZE5hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9GaWVsZFJlc3VsdFRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRmllbGRSZXN1bHRUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Njc1MjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9GaWVsZFJlc3VsdFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRmllbGRSZXN1bHRUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgRmllbGRSZXN1bHRUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgRU5EX1RBR19OT19JTkRFTlQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ29sdW1uVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIE9STV9QS0cuZ2V0RmllbGRSZXN1bHRfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDT0xVTU4sIE9STV9QS0cuZ2V0RmllbGRSZXN1bHRfQ29sdW1uKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0dlbmVyYXRlZFZhbHVlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGZkZTNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgRU5EX1RBR19OT19JTkRFTlQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sR2VuZXJhdGVkVmFsdWVJbXBsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZVN0cmF0ZWd5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlR2VuZXJhdG9yVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGNyZWF0ZVN0cmF0ZWd5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFNUUkFURUdZLCBPUk1fUEtHLmdldFhtbEdlbmVyYXRlZFZhbHVlX1N0cmF0ZWd5KCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBjcmVhdGVHZW5lcmF0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoR0VORVJBVE9SLCBPUk1fUEtHLmdldFhtbEdlbmVyYXRlZFZhbHVlX0dlbmVyYXRvcigpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0lkQ2xhc3NUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0lkQ2xhc3NUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMGE2ZWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9JZENsYXNzVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIElkQ2xhc3NUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgSWRDbGFzc1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZUNsYXNzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGNyZWF0ZUNsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKENMQVNTLCBPUk1fUEtHLmdldFhtbElkQ2xhc3NfQ2xhc3NOYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvSWRUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0lkVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjdlM2JiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvSWRUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgSWRUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgSWRUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxJZEltcGwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDb2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbHVtblRyYW5zbGF0b3IoQ09MVU1OLCBPUk1fUEtHLmdldENvbHVtbk1hcHBpbmdfQ29sdW1uKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyYXRlZFZhbHVlVHJhbnNsYXRvcihHRU5FUkFURURfVkFMVUUsIE9STV9QS0cuZ2V0WG1sSWRfR2VuZXJhdGVkVmFsdWUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUZW1wb3JhbFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihURU1QT1JBTCwgT1JNX1BLRy5nZXRYbWxJZF9UZW1wb3JhbCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoVEFCTEVfR0VORVJBVE9SLCBPUk1fUEtHLmdldFhtbElkX1RhYmxlR2VuZXJhdG9yKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcihTRVFVRU5DRV9HRU5FUkFUT1IsIE9STV9QS0cuZ2V0WG1sSWRfU2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9Jbmhlcml0YW5jZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvSW5oZXJpdGFuY2VUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzODdmYjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9Jbmhlcml0YW5jZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBJbmhlcml0YW5jZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIEluaGVyaXRhbmNlVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIEVORF9UQUdfTk9fSU5ERU5UKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlU3RyYXRlZ3lUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVTdHJhdGVneVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihTVFJBVEVHWSwgT1JNX1BLRy5nZXRJbmhlcml0YW5jZV9TdHJhdGVneSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0pvaW5Db2x1bW5UcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0pvaW5Db2x1bW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NDdjNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9Kb2luQ29sdW1uVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmNvbW1vbi50cmFuc2xhdG9ycy5Cb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtblRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsJCi0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBKb2luQ29sdW1uVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIEVORF9UQUdfTk9fSU5ERU5UKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW5JbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVW5pcXVlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTnVsbGFibGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVJbnNlcnRhYmxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVXBkYXRhYmxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ29sdW1uRGVmaW5pdGlvblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVRhYmxlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbE5hbWVkQ29sdW1uX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCBPUk1fUEtHLmdldFhtbEpvaW5Db2x1bW5fUmVmZXJlbmNlZENvbHVtbk5hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVVbmlxdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKFVOSVFVRSwgT1JNX1BLRy5nZXRYbWxBYnN0cmFjdENvbHVtbl9VbmlxdWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOdWxsYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoTlVMTEFCTEUsIE9STV9QS0cuZ2V0WG1sQWJzdHJhY3RDb2x1bW5fTnVsbGFibGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVJbnNlcnRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihJTlNFUlRBQkxFLCBPUk1fUEtHLmdldFhtbEFic3RyYWN0Q29sdW1uX0luc2VydGFibGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVVcGRhdGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKFVQREFUQUJMRSwgT1JNX1BLRy5nZXRYbWxBYnN0cmFjdENvbHVtbl9VcGRhdGFibGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDb2x1bW5EZWZpbml0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKENPTFVNTl9ERUZJTklUSU9OLCBPUk1fUEtHLmdldFhtbE5hbWVkQ29sdW1uX0NvbHVtbkRlZmluaXRpb24oKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihUQUJMRSwgT1JNX1BLRy5nZXRYbWxBYnN0cmFjdENvbHVtbl9UYWJsZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0pvaW5UYWJsZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvSm9pblRhYmxlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDBiYmNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvSm9pblRhYmxlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEpvaW5UYWJsZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIEpvaW5UYWJsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNjaGVtYVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVJbnZlcnNlSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxCYXNlVGFibGVfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNhdGFsb2dUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQ0FUQUxPRywgT1JNX1BLRy5nZXRYbWxCYXNlVGFibGVfQ2F0YWxvZygpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNjaGVtYVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihTQ0hFTUEsIE9STV9QS0cuZ2V0WG1sQmFzZVRhYmxlX1NjaGVtYSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUpvaW5Db2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5UcmFuc2xhdG9yKEpPSU5fQ09MVU1OLCBPUk1fUEtHLmdldFhtbEpvaW5UYWJsZV9Kb2luQ29sdW1ucygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUludmVyc2VKb2luQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uVHJhbnNsYXRvcihJTlZFUlNFX0pPSU5fQ09MVU1OLCBPUk1fUEtHLmdldFhtbEpvaW5UYWJsZV9JbnZlcnNlSm9pbkNvbHVtbnMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcihVTklRVUVfQ09OU1RSQUlOVCwgT1JNX1BLRy5nZXRYbWxCYXNlVGFibGVfVW5pcXVlQ29uc3RyYWludHMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9NYW55VG9NYW55VHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9NYW55VG9NYW55VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDU2ZTgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvTWFueVRvTWFueVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNYW55VG9NYW55VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgTWFueVRvTWFueVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hbnlUb01hbnlJbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUZldGNoVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWFwcGVkQnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVPcmRlckJ5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWFwS2V5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSm9pblRhYmxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2FzY2FkZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihUQVJHRVRfRU5USVRZLCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRkVUQ0gsIE9STV9QS0cuZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19GZXRjaCgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU1hcHBlZEJ5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE1BUFBFRF9CWSwgT1JNX1BLRy5nZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfTWFwcGVkQnkoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVPcmRlckJ5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE9SREVSX0JZLCBPUk1fUEtHLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19PcmRlckJ5KCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTWFwS2V5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBLZXlUcmFuc2xhdG9yKE1BUF9LRVksIE9STV9QS0cuZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX01hcEtleSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUpvaW5UYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pblRhYmxlVHJhbnNsYXRvcihKT0lOX1RBQkxFLCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ2FzY2FkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ2FzY2FkZVR5cGVUcmFuc2xhdG9yKENBU0NBREUsIE9STV9QS0cuZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19DYXNjYWRlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvTWFueVRvT25lVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9NYW55VG9PbmVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYmM4NmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9NYW55VG9PbmVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgTWFueVRvT25lVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFueVRvT25lSW1wbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU9wdGlvbmFsVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUpvaW5UYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNhc2NhZGVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVEFSR0VUX0VOVElUWSwgT1JNX1BLRy5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX1RhcmdldEVudGl0eSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEZFVENILCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfRmV0Y2goKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVPcHRpb25hbFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihPUFRJT05BTCwgT1JNX1BLRy5nZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nX09wdGlvbmFsKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSm9pbkNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtblRyYW5zbGF0b3IoSk9JTl9DT0xVTU4sIE9STV9QS0cuZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luQ29sdW1ucygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUpvaW5UYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pblRhYmxlVHJhbnNsYXRvcihKT0lOX1RBQkxFLCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCkpOwotCX0KLQkJCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNhc2NhZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IENhc2NhZGVUeXBlVHJhbnNsYXRvcihDQVNDQURFLCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfQ2FzY2FkZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL01hcEtleVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvTWFwS2V5VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzA1MTcyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvTWFwS2V5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgTWFwS2V5VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIE1hcEtleVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldE1hcEtleV9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvTWFwcGVkU3VwZXJjbGFzc1RyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvTWFwcGVkU3VwZXJjbGFzc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNmYTRjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL01hcHBlZFN1cGVyY2xhc3NUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIE1hcHBlZFN1cGVyY2xhc3NUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17CQotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgTWFwcGVkU3VwZXJjbGFzc1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVJZENsYXNzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVyc1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVByZVBlcnNpc3RUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQb3N0UGVyc2lzdFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVByZVJlbW92ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVBvc3RSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcmVVcGRhdGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQb3N0VXBkYXRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUG9zdExvYWRUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVBdHRyaWJ1dGVzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDTEFTUywgT1JNX1BLRy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0NsYXNzTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUFjY2Vzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihBQ0NFU1MsIE9STV9QS0cuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19BY2Nlc3MoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE1FVEFEQVRBX0NPTVBMRVRFLCBPUk1fUEtHLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfTWV0YWRhdGFDb21wbGV0ZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBPUk1fUEtHLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfRGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVJZENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJZENsYXNzVHJhbnNsYXRvcihJRF9DTEFTUywgT1JNX1BLRy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0lkQ2xhc3MoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFeGNsdWRlRGVmYXVsdExpc3RlbmVyc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihFWENMVURFX0RFRkFVTFRfTElTVEVORVJTLCBPUk1fUEtHLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVyc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTLCBPUk1fUEtHLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoRU5USVRZX0xJU1RFTkVSUywgT1JNX1BLRy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0VudGl0eUxpc3RlbmVycygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVByZVBlcnNpc3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEV2ZW50TWV0aG9kVHJhbnNsYXRvcihQUkVfUEVSU0lTVCwgT1JNX1BLRy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1ByZVBlcnNpc3QoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0UGVyc2lzdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBPU1RfUEVSU0lTVCwgT1JNX1BLRy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RQZXJzaXN0KCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUHJlUmVtb3ZlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUFJFX1JFTU9WRSwgT1JNX1BLRy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1ByZVJlbW92ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVBvc3RSZW1vdmVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEV2ZW50TWV0aG9kVHJhbnNsYXRvcihQT1NUX1JFTU9WRSwgT1JNX1BLRy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RSZW1vdmUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcmVVcGRhdGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEV2ZW50TWV0aG9kVHJhbnNsYXRvcihQUkVfVVBEQVRFLCBPUk1fUEtHLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUHJlVXBkYXRlKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUG9zdFVwZGF0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBPU1RfVVBEQVRFLCBPUk1fUEtHLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFVwZGF0ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVBvc3RMb2FkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUE9TVF9MT0FELCBPUk1fUEtHLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdExvYWQoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBdHRyaWJ1dGVzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVzVHJhbnNsYXRvcihBVFRSSUJVVEVTLCBPUk1fUEtHLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfQXR0cmlidXRlcygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL05hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL05hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzU4YjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9OYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIE5hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgTmFtZWROYXRpdmVRdWVyeVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUmVzdWx0Q2xhc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUXVlcnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVIaW50VHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxRdWVyeV9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUmVzdWx0Q2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoUkVTVUxUX0NMQVNTLCBPUk1fUEtHLmdldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0Q2xhc3MoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFJFU1VMVF9TRVRfTUFQUElORywgT1JNX1BLRy5nZXRYbWxOYW1lZE5hdGl2ZVF1ZXJ5X1Jlc3VsdFNldE1hcHBpbmcoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVRdWVyeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihRVUVSWSwgT1JNX1BLRy5nZXRYbWxRdWVyeV9RdWVyeSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUhpbnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFF1ZXJ5SGludFRyYW5zbGF0b3IoSElOVCwgT1JNX1BLRy5nZXRYbWxRdWVyeV9IaW50cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL05hbWVkUXVlcnlUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL05hbWVkUXVlcnlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNzY0NWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9OYW1lZFF1ZXJ5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIE5hbWVkUXVlcnlUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgTmFtZWRRdWVyeVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUXVlcnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVIaW50VHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxRdWVyeV9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoUVVFUlksIE9STV9QS0cuZ2V0WG1sUXVlcnlfUXVlcnkoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVIaW50VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBRdWVyeUhpbnRUcmFuc2xhdG9yKEhJTlQsIE9STV9QS0cuZ2V0WG1sUXVlcnlfSGludHMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9PbmVUb01hbnlUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL09uZVRvTWFueVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxODRkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL09uZVRvTWFueVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBPbmVUb01hbnlUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBPbmVUb01hbnlUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPbmVUb01hbnlJbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUZldGNoVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWFwcGVkQnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVPcmRlckJ5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWFwS2V5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSm9pblRhYmxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNhc2NhZGVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVEFSR0VUX0VOVElUWSwgT1JNX1BLRy5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX1RhcmdldEVudGl0eSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEZFVENILCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfRmV0Y2goKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVNYXBwZWRCeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihNQVBQRURfQlksIE9STV9QS0cuZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX01hcHBlZEJ5KCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlT3JkZXJCeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihPUkRFUl9CWSwgT1JNX1BLRy5nZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfT3JkZXJCeSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU1hcEtleVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTWFwS2V5VHJhbnNsYXRvcihNQVBfS0VZLCBPUk1fUEtHLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBLZXkoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVKb2luVGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEpvaW5UYWJsZVRyYW5zbGF0b3IoSk9JTl9UQUJMRSwgT1JNX1BLRy5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0pvaW5UYWJsZSgpKTsKLQl9Ci0JCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVKb2luQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uVHJhbnNsYXRvcihKT0lOX0NPTFVNTiwgT1JNX1BLRy5nZXRYbWxPbmVUb01hbnlfSm9pbkNvbHVtbnMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXNjYWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDYXNjYWRlVHlwZVRyYW5zbGF0b3IoQ0FTQ0FERSwgT1JNX1BLRy5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9PbmVUb09uZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvT25lVG9PbmVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMDZjM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9PbmVUb09uZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgT25lVG9PbmVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBPbmVUb09uZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9uZVRvT25lSW1wbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU9wdGlvbmFsVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWFwcGVkQnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVKb2luVGFibGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDYXNjYWRlVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIE9STV9QS0cuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlVGFyZ2V0RW50aXR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFRBUkdFVF9FTlRJVFksIE9STV9QS0cuZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19UYXJnZXRFbnRpdHkoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVGZXRjaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihGRVRDSCwgT1JNX1BLRy5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0ZldGNoKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlT3B0aW9uYWxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoT1BUSU9OQUwsIE9STV9QS0cuZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19PcHRpb25hbCgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU1hcHBlZEJ5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE1BUFBFRF9CWSwgT1JNX1BLRy5nZXRYbWxPbmVUb09uZV9NYXBwZWRCeSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIE9STV9QS0cuZ2V0WG1sT25lVG9PbmVfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSm9pbkNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtblRyYW5zbGF0b3IoSk9JTl9DT0xVTU4sIE9STV9QS0cuZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luQ29sdW1ucygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUpvaW5UYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pblRhYmxlVHJhbnNsYXRvcihKT0lOX1RBQkxFLCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCkpOwotCX0KLQkJCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNhc2NhZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IENhc2NhZGVUeXBlVHJhbnNsYXRvcihDQVNDQURFLCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfQ2FzY2FkZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvT3JtWG1sTWFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL09ybVhtbE1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjdhNThjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvT3JtWG1sTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVhtbE1hcHBlcgotewotCU9ybVBhY2thZ2UgT1JNX1BLRyA9IE9ybVBhY2thZ2UuZUlOU1RBTkNFOwotCQotCVN0cmluZyBYTUxfTlMgPSAieG1sbnMiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfTlNfWFNJID0gInhtbG5zOnhzaSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhTSV9TQ0hFTUFfTE9DQVRJT04gPSAieHNpOnNjaGVtYUxvY2F0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWFNJX05TX1VSTCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBFUlNJU1RFTkNFX05TX1VSTCA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBPUk1fU0NIRU1BX0xPQ18xXzAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtXzFfMC54c2QiOyAgLy8kTk9OLU5MUy0xJAotCQotCQotCVN0cmluZyBBQ0NFU1MgPSAiYWNjZXNzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQUxMT0NBVElPTl9TSVpFID0gImFsbG9jYXRpb24tc2l6ZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFID0gImFzc29jaWF0aW9uLW92ZXJyaWRlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFID0gImF0dHJpYnV0ZS1vdmVycmlkZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJJQlVURVMgPSAiYXR0cmlidXRlcyI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEJBU0lDID0gImJhc2ljIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0FTQ0FERSA9ICJjYXNjYWRlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0FTQ0FERV9BTEwgPSAiY2FzY2FkZS1hbGwiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQVNDQURFX01FUkdFID0gImNhc2NhZGUtbWVyZ2UiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQVNDQURFX1BFUlNJU1QgPSAiY2FzY2FkZS1wZXJzaXN0IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0FTQ0FERV9SRUZSRVNIID0gImNhc2NhZGUtcmVmcmVzaCI7ICAvLyROT04tTkxTLTEkCQotCVN0cmluZyBDQVNDQURFX1JFTU9WRSA9ICJjYXNjYWRlLXJlbW92ZSI7ICAvLyROT04tTkxTLTEkCQotCVN0cmluZyBDQVRBTE9HID0gImNhdGFsb2ciOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEFTUyA9ICJjbGFzcyI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTFVNTiA9ICJjb2x1bW4iOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT0xVTU5fREVGSU5JVElPTj0gImNvbHVtbi1kZWZpbml0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09MVU1OX05BTUUgPSAiY29sdW1uLW5hbWUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT0xVTU5fUkVTVUxUID0gImNvbHVtbi1yZXN1bHQiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OID0gImRpc2NyaW1pbmF0b3ItY29sdW1uIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9UWVBFID0gImRpc2NyaW1pbmF0b3ItdHlwZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERJU0NSSU1JTkFUT1JfVkFMVUUgPSAiZGlzY3JpbWluYXRvci12YWx1ZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVNQkVEREFCTEUgPSAiZW1iZWRkYWJsZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVNQkVEREVEID0gImVtYmVkZGVkIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU1CRURERURfSUQgPSAiZW1iZWRkZWQtaWQiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFTlRJVFkgPSAiZW50aXR5IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5USVRZX0NMQVNTID0gImVudGl0eS1jbGFzcyI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVOVElUWV9MSVNURU5FUiA9ICJlbnRpdHktbGlzdGVuZXIiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFTlRJVFlfTElTVEVORVJTID0gImVudGl0eS1saXN0ZW5lcnMiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFTlRJVFlfTUFQUElOR1MgPSAiZW50aXR5LW1hcHBpbmdzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5USVRZX1JFU1VMVCA9ICJlbnRpdHktcmVzdWx0IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5VTUVSQVRFRCA9ICJlbnVtZXJhdGVkIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyA9ICJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUyA9ICJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRkVUQ0ggPSAiZmV0Y2giOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGSUVMRF9SRVNVTFQgPSAiZmllbGQtcmVzdWx0IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgR0VORVJBVEVEX1ZBTFVFID0gImdlbmVyYXRlZC12YWx1ZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEdFTkVSQVRPUiA9ICJnZW5lcmF0b3IiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBISU5UID0gImhpbnQiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJRCA9ICJpZCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIElEX0NMQVNTID0gImlkLWNsYXNzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSU5IRVJJVEFOQ0UgPSAiaW5oZXJpdGFuY2UiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJTklUSUFMX1ZBTFVFID0gImluaXRpYWwtdmFsdWUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJTlNFUlRBQkxFID0gImluc2VydGFibGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJTlZFUlNFX0pPSU5fQ09MVU1OID0gImludmVyc2Utam9pbi1jb2x1bW4iOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKT0lOX0NPTFVNTiA9ICJqb2luLWNvbHVtbiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpPSU5fVEFCTEUgPSAiam9pbi10YWJsZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIExFTkdUSCA9ICJsZW5ndGgiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBMT0IgPSAibG9iIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUFOWV9UT19NQU5ZID0gIm1hbnktdG8tbWFueSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1BTllfVE9fT05FID0gIm1hbnktdG8tb25lIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUFQX0tFWSA9ICJtYXAta2V5IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUFQUEVEX0JZID0gIm1hcHBlZC1ieSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1BUFBFRF9TVVBFUkNMQVNTID0gIm1hcHBlZC1zdXBlcmNsYXNzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUVUQURBVEFfQ09NUExFVEUgPSAibWV0YWRhdGEtY29tcGxldGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNRVRIT0RfTkFNRSA9ICJtZXRob2QtbmFtZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5BTUUgPSAibmFtZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWSA9ICJuYW1lZC1uYXRpdmUtcXVlcnkiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBOQU1FRF9RVUVSWSA9ICJuYW1lZC1xdWVyeSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5VTExBQkxFID0gIm51bGxhYmxlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgT05FX1RPX01BTlkgPSAib25lLXRvLW1hbnkiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBPTkVfVE9fT05FID0gIm9uZS10by1vbmUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBPUFRJT05BTCA9ICJvcHRpb25hbCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE9SREVSX0JZID0gIm9yZGVyLWJ5IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEFDS0FHRSA9ICJwYWNrYWdlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9ICJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9ICJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEtfQ09MVU1OX05BTUUgPSAicGstY29sdW1uLW5hbWUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQS19DT0xVTU5fVkFMVUUgPSAicGstY29sdW1uLXZhbHVlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUE9TVF9MT0FEID0gInBvc3QtbG9hZCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBPU1RfUEVSU0lTVCA9ICJwb3N0LXBlcnNpc3QiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQT1NUX1JFTU9WRSA9ICJwb3N0LXJlbW92ZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBPU1RfVVBEQVRFID0gInBvc3QtdXBkYXRlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJFX1BFUlNJU1QgPSAicHJlLXBlcnNpc3QiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUkVfUkVNT1ZFID0gInByZS1yZW1vdmUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUkVfVVBEQVRFID0gInByZS11cGRhdGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUkVDSVNJT049ICJwcmVjaXNpb24iOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTiA9ICJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFFVRVJZID0gInF1ZXJ5IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVTVUxUX0NMQVNTID0gInJlc3VsdC1jbGFzcyI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFU1VMVF9TRVRfTUFQUElORyA9ICJyZXN1bHQtc2V0LW1hcHBpbmciOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTQ0FMRT0gInNjYWxlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0NIRU1BID0gInNjaGVtYSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNFQ09OREFSWV9UQUJMRSA9ICJzZWNvbmRhcnktdGFibGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1IgPSAic2VxdWVuY2UtZ2VuZXJhdG9yIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0VRVUVOQ0VfTkFNRSA9ICJzZXF1ZW5jZS1uYW1lIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU1FMX1JFU1VMVF9TRVRfTUFQUElORyA9ICJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU1RSQVRFR1kgPSAic3RyYXRlZ3kiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQUJMRSA9ICJ0YWJsZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBQkxFX0dFTkVSQVRPUiA9ICJ0YWJsZS1nZW5lcmF0b3IiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQVJHRVRfRU5USVRZID0gInRhcmdldC1lbnRpdHkiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBURU1QT1JBTCA9ICJ0ZW1wb3JhbCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRSQU5TSUVOVCA9ICJ0cmFuc2llbnQiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVTklRVUUgPSAidW5pcXVlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlQgPSAidW5pcXVlLWNvbnN0cmFpbnQiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUERBVEFCTEUgPSAidXBkYXRhYmxlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQUxVRV9DT0xVTU5fTkFNRSA9ICJ2YWx1ZS1jb2x1bW4tbmFtZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZFUlNJT04gPSAidmVyc2lvbiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFID0gInhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIjsgIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmNjZjA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZVNjaGVtYVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNhdGFsb2dUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDYXNjYWRlUGVyc2lzdFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlU2NoZW1hVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFNDSEVNQSwgT1JNX1BLRy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19TY2hlbWEoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXRhbG9nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKENBVEFMT0csIE9STV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQ2F0YWxvZygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUFjY2Vzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihBQ0NFU1MsIE9STV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQWNjZXNzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ2FzY2FkZVBlcnNpc3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoQ0FTQ0FERV9QRVJTSVNULCBPUk1fUEtHLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKEVOVElUWV9MSVNURU5FUlMsIE9STV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfRW50aXR5TGlzdGVuZXJzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGM5NDcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKFhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFLCBPUk1fUEtHLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzVHJhbnNsYXRvcihQRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTLCBPUk1fUEtHLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1ByaW1hcnlLZXlKb2luQ29sdW1uVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzE0N2I1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewkKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIEVORF9UQUdfTk9fSU5ERU5UKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDb2x1bW5EZWZpbml0aW9uVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbE5hbWVkQ29sdW1uX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCBPUk1fUEtHLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uX1JlZmVyZW5jZWRDb2x1bW5OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ29sdW1uRGVmaW5pdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDT0xVTU5fREVGSU5JVElPTiwgT1JNX1BLRy5nZXRYbWxOYW1lZENvbHVtbl9Db2x1bW5EZWZpbml0aW9uKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUXVlcnlIaW50VHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9RdWVyeUhpbnRUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDg0OTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9RdWVyeUhpbnRUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlIaW50VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIFF1ZXJ5SGludFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVZhbHVlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbFF1ZXJ5SGludF9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVkFMVUUsIE9STV9QS0cuZ2V0WG1sUXVlcnlIaW50X1ZhbHVlKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvU2Vjb25kYXJ5VGFibGVUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1NlY29uZGFyeVRhYmxlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU3MzNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvU2Vjb25kYXJ5VGFibGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgU2Vjb25kYXJ5VGFibGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBTZWNvbmRhcnlUYWJsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlSW1wbCgpOwotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIE9STV9QS0cuZ2V0WG1sQmFzZVRhYmxlX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXRhbG9nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKENBVEFMT0csIE9STV9QS0cuZ2V0WG1sQmFzZVRhYmxlX0NhdGFsb2coKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVTY2hlbWFUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoU0NIRU1BLCBPUk1fUEtHLmdldFhtbEJhc2VUYWJsZV9TY2hlbWEoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBPUk1fUEtHLmdldFhtbFNlY29uZGFyeVRhYmxlX1ByaW1hcnlLZXlKb2luQ29sdW1ucygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKFVOSVFVRV9DT05TVFJBSU5ULCBPUk1fUEtHLmdldFhtbEJhc2VUYWJsZV9VbmlxdWVDb25zdHJhaW50cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1NlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9TZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwYzA0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1NlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgRU5EX1RBR19OT19JTkRFTlQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2VxdWVuY2VOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSW5pdGlhbFZhbHVlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQWxsb2NhdGlvblNpemVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIE9STV9QS0cuZ2V0WG1sR2VuZXJhdG9yX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVTZXF1ZW5jZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoU0VRVUVOQ0VfTkFNRSwgT1JNX1BLRy5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl9TZXF1ZW5jZU5hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVJbml0aWFsVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSU5JVElBTF9WQUxVRSwgT1JNX1BLRy5nZXRYbWxHZW5lcmF0b3JfSW5pdGlhbFZhbHVlKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQWxsb2NhdGlvblNpemVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQUxMT0NBVElPTl9TSVpFLCBPUk1fUEtHLmdldFhtbEdlbmVyYXRvcl9BbGxvY2F0aW9uU2l6ZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1NxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1NxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNTNiMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9TcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgU3FsUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUVudGl0eVJlc3VsdFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNvbHVtblJlc3VsdFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFNxbFJlc3VsdFNldE1hcHBpbmdfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUVudGl0eVJlc3VsdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW50aXR5UmVzdWx0VHJhbnNsYXRvcihFTlRJVFlfUkVTVUxULCBPUk1fUEtHLmdldFNxbFJlc3VsdFNldE1hcHBpbmdfRW50aXR5UmVzdWx0cygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNvbHVtblJlc3VsdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29sdW1uUmVzdWx0VHJhbnNsYXRvcihDT0xVTU5fUkVTVUxULCBPUk1fUEtHLmdldFNxbFJlc3VsdFNldE1hcHBpbmdfQ29sdW1uUmVzdWx0cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1RhYmxlR2VuZXJhdG9yVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9UYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5N2IzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1RhYmxlR2VuZXJhdG9yVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvckltcGwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVGFibGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUGtDb2x1bW5OYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVmFsdWVDb2x1bW5OYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUGtDb2x1bW5WYWx1ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUluaXRpYWxWYWx1ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUFsbG9jYXRpb25TaXplVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxHZW5lcmF0b3JfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFRBQkxFLCBPUk1fUEtHLmdldFhtbFRhYmxlR2VuZXJhdG9yX1RhYmxlKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDQVRBTE9HLCBPUk1fUEtHLmdldFhtbFRhYmxlR2VuZXJhdG9yX0NhdGFsb2coKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVTY2hlbWFUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoU0NIRU1BLCBPUk1fUEtHLmdldFhtbFRhYmxlR2VuZXJhdG9yX1NjaGVtYSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVBrQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihQS19DT0xVTU5fTkFNRSwgT1JNX1BLRy5nZXRYbWxUYWJsZUdlbmVyYXRvcl9Qa0NvbHVtbk5hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVWYWx1ZUNvbHVtbk5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVkFMVUVfQ09MVU1OX05BTUUsIE9STV9QS0cuZ2V0WG1sVGFibGVHZW5lcmF0b3JfVmFsdWVDb2x1bW5OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUGtDb2x1bW5WYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihQS19DT0xVTU5fVkFMVUUsIE9STV9QS0cuZ2V0WG1sVGFibGVHZW5lcmF0b3JfUGtDb2x1bW5WYWx1ZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUluaXRpYWxWYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihJTklUSUFMX1ZBTFVFLCBPUk1fUEtHLmdldFhtbEdlbmVyYXRvcl9Jbml0aWFsVmFsdWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBbGxvY2F0aW9uU2l6ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihBTExPQ0FUSU9OX1NJWkUsIE9STV9QS0cuZ2V0WG1sR2VuZXJhdG9yX0FsbG9jYXRpb25TaXplKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IoVU5JUVVFX0NPTlNUUkFJTlQsIE9STV9QS0cuZ2V0WG1sVGFibGVHZW5lcmF0b3JfVW5pcXVlQ29uc3RyYWludHMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9UYWJsZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvVGFibGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODNmY2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9UYWJsZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUYWJsZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsJCi0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBUYWJsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNhdGFsb2dUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVTY2hlbWFUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxCYXNlVGFibGVfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNhdGFsb2dUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQ0FUQUxPRywgT1JNX1BLRy5nZXRYbWxCYXNlVGFibGVfQ2F0YWxvZygpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNjaGVtYVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihTQ0hFTUEsIE9STV9QS0cuZ2V0WG1sQmFzZVRhYmxlX1NjaGVtYSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKFVOSVFVRV9DT05TVFJBSU5ULCBPUk1fUEtHLmdldFhtbEJhc2VUYWJsZV9VbmlxdWVDb25zdHJhaW50cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1RyYW5zaWVudFRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvVHJhbnNpZW50VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODMwZDJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvVHJhbnNpZW50VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBUcmFuc2llbnRUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgRU5EX1RBR19OT19JTkRFTlQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHJhbnNpZW50SW1wbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9VbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9VbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGQ4ZDM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZUNvbHVtbk5hbWVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDb2x1bW5OYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKENPTFVNTl9OQU1FLCBPUk1fUEtHLmdldFhtbFVuaXF1ZUNvbnN0cmFpbnRfQ29sdW1uTmFtZXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9WZXJzaW9uVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9WZXJzaW9uVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjU3ZmFjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1ZlcnNpb25UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIFZlcnNpb25UcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgVmVyc2lvblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFZlcnNpb25JbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNvbHVtblRyYW5zbGF0b3IoKSwgCi0JCQljcmVhdGVUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29sdW1uVHJhbnNsYXRvcihDT0xVTU4sIE9STV9QS0cuZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUZW1wb3JhbFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihURU1QT1JBTCwgT1JNX1BLRy5nZXRYbWxWZXJzaW9uX1RlbXBvcmFsKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9KYXZhQ2xhc3NSZWZUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvSmF2YUNsYXNzUmVmVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTY2MjZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9KYXZhQ2xhc3NSZWZUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFDbGFzc1JlZlRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi17Ci0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwotCQotCQotCXB1YmxpYyBKYXZhQ2xhc3NSZWZUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBzdHlsZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgZmVhdHVyZSwgc3R5bGUpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUNsYXNzUmVmVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBmZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEphdmFDbGFzc1JlZl9KYXZhQ2xhc3MoKSkKLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvTWFwcGluZ0ZpbGVUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvTWFwcGluZ0ZpbGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTQ0ZTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL01hcHBpbmdGaWxlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNYXBwaW5nRmlsZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0JCi0JCi0JcHVibGljIE1hcHBpbmdGaWxlVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBpbmdGaWxlUmVmX0ZpbGVOYW1lKCkpCi0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL1BlcnNpc3RlbmNlVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL1BlcnNpc3RlbmNlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzUwYTFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9QZXJzaXN0ZW5jZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVRyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvcgotCWltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWxNYXBwZXIKLXsKLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBQZXJzaXN0ZW5jZVRyYW5zbGF0b3IoKTsKLQkKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsKLQkKLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VUcmFuc2xhdG9yKCkgewotCQlzdXBlcihQRVJTSVNURU5DRSwgUEVSU0lTVEVOQ0VfUEtHLmdldFhtbFBlcnNpc3RlbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZVZlcnNpb25UcmFuc2xhdG9yKCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OUywgUEVSU0lTVEVOQ0VfTlNfVVJMKSwKLQkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TX1hTSSwgWFNJX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhTSV9TQ0hFTUFfTE9DQVRJT04sIFBFUlNJU1RFTkNFX05TX1VSTCArICcgJyArIFBFUlNJU1RFTkNFX1NDSEVNQV9MT0NfMV8wKSwKLQkJCWNyZWF0ZVBlcnNpc3RlbmNlVW5pdFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlVmVyc2lvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihWRVJTSU9OLCBQRVJTSVNURU5DRV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VfVmVyc2lvbigpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VVbml0VHJhbnNsYXRvcihQRVJTSVNURU5DRV9VTklULCBQRVJTSVNURU5DRV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VfUGVyc2lzdGVuY2VVbml0cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VVbml0VHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL1BlcnNpc3RlbmNlVW5pdFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkYWFlOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VVbml0VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuY29tbW9uLnRyYW5zbGF0b3JzLkJvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsKLQkKLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0VHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUcmFuc2FjdGlvblR5cGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVByb3ZpZGVyVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSnRhRGF0YVNvdXJjZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU5vbkp0YURhdGFTb3VyY2VUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVNYXBwaW5nRmlsZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUphckZpbGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUV4Y2x1ZGVVbmxpc3RlZENsYXNzZXNUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcm9wZXJ0aWVzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIFBFUlNJU1RFTkNFX1BLRy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVRyYW5zYWN0aW9uVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihUUkFOU0FDVElPTl9UWVBFLCBQRVJTSVNURU5DRV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1RyYW5zYWN0aW9uVHlwZSgpLCBET01fQVRUUklCVVRFIHwgVU5TRVRfSUZfTlVMTCk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgUEVSU0lTVEVOQ0VfUEtHLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9EZXNjcmlwdGlvbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVByb3ZpZGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFBST1ZJREVSLCBQRVJTSVNURU5DRV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1Byb3ZpZGVyKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSnRhRGF0YVNvdXJjZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKVEFfREFUQV9TT1VSQ0UsIFBFUlNJU1RFTkNFX1BLRy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfSnRhRGF0YVNvdXJjZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5vbkp0YURhdGFTb3VyY2VUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTk9OX0pUQV9EQVRBX1NPVVJDRSwgUEVSU0lTVEVOQ0VfUEtHLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9Ob25KdGFEYXRhU291cmNlKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTWFwcGluZ0ZpbGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IE1hcHBpbmdGaWxlVHJhbnNsYXRvcihNQVBQSU5HX0ZJTEUsIFBFUlNJU1RFTkNFX1BLRy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfTWFwcGluZ0ZpbGVzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSmFyRmlsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKQVJfRklMRSwgUEVSU0lTVEVOQ0VfUEtHLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9KYXJGaWxlcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhQ2xhc3NSZWZUcmFuc2xhdG9yKENMQVNTLCBQRVJTSVNURU5DRV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0NsYXNzZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFeGNsdWRlVW5saXN0ZWRDbGFzc2VzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihFWENMVURFX1VOTElTVEVEX0NMQVNTRVMsIFBFUlNJU1RFTkNFX1BLRy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVByb3BlcnRpZXNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnRpZXNUcmFuc2xhdG9yKFBST1BFUlRJRVMsIFBFUlNJU1RFTkNFX1BLRy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfUHJvcGVydGllcygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VYbWxNYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9QZXJzaXN0ZW5jZVhtbE1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM0MTg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9QZXJzaXN0ZW5jZVhtbE1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UudHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VYbWxNYXBwZXIKLXsKLQlQZXJzaXN0ZW5jZVBhY2thZ2UgUEVSU0lTVEVOQ0VfUEtHID0gUGVyc2lzdGVuY2VQYWNrYWdlLmVJTlNUQU5DRTsKLQkKLQlTdHJpbmcgWE1MX05TID0gInhtbG5zIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX05TX1hTSSA9ICJ4bWxuczp4c2kiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYU0lfU0NIRU1BX0xPQ0FUSU9OID0gInhzaTpzY2hlbWFMb2NhdGlvbiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhTSV9OU19VUkwgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQRVJTSVNURU5DRV9OU19VUkwgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQRVJTSVNURU5DRV9TQ0hFTUFfTE9DXzFfMCA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8xXzAueHNkIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYQ0xVREVfVU5MSVNURURfQ0xBU1NFUyA9ICJleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVJfRklMRSA9ICJqYXItZmlsZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpUQV9EQVRBX1NPVVJDRSA9ICJqdGEtZGF0YS1zb3VyY2UiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNQVBQSU5HX0ZJTEUgPSAibWFwcGluZy1maWxlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTkFNRSA9ICJuYW1lIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTk9OX0pUQV9EQVRBX1NPVVJDRSA9ICJub24tanRhLWRhdGEtc291cmNlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEVSU0lTVEVOQ0UgPSAicGVyc2lzdGVuY2UiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQRVJTSVNURU5DRV9VTklUID0gInBlcnNpc3RlbmNlLXVuaXQiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUk9QRVJUSUVTID0gInByb3BlcnRpZXMiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBST1ZJREVSID0gInByb3ZpZGVyIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVFJBTlNBQ1RJT05fVFlQRSA9ICJ0cmFuc2FjdGlvbi10eXBlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWRVJTSU9OID0gInZlcnNpb24iOyAgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL1Byb3BlcnRpZXNUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUHJvcGVydGllc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4OTM1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUHJvcGVydGllc1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UudHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0JCi0JCi0JcHVibGljIFByb3BlcnRpZXNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQkKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZVByb3BlcnR5VHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlUcmFuc2xhdG9yKFBST1BFUlRZLCBQRVJTSVNURU5DRV9QS0cuZ2V0WG1sUHJvcGVydGllc19Qcm9wZXJ0aWVzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9Qcm9wZXJ0eVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9Qcm9wZXJ0eVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3NTViMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUHJvcGVydHlUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsKLQkKLQkKLQlwdWJsaWMgUHJvcGVydHlUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgRU5EX1RBR19OT19JTkRFTlQpOwotCX0KLQkKLQlAT3ZlcnJpZGUJCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVmFsdWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgUEVSU0lTVEVOQ0VfUEtHLmdldFhtbFByb3BlcnR5X05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVWYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihWQUxVRSwgUEVSU0lTVEVOQ0VfUEtHLmdldFhtbFByb3BlcnR5X1ZhbHVlKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9zeW5jaC9TeW5jaHJvbml6ZUNsYXNzZXNKb2IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9zeW5jaC9TeW5jaHJvbml6ZUNsYXNzZXNKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmODhjMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvc3luY2gvU3luY2hyb25pemVDbGFzc2VzSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnN5bmNoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi0vKioKLSAqIFN5bmNocm9uaXplcyB0aGUgbGlzdHMgb2YgcGVyc2lzdGVudCBjbGFzc2VzIGluIGEgcGVyc2lzdGVuY2UgdW5pdCBhbmQgYSAKLSAqIHBlcnNpc3RlbmNlIHByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZUNsYXNzZXNKb2IgZXh0ZW5kcyBXb3Jrc3BhY2VKb2IKLXsKLQlwcml2YXRlIElGaWxlIHBlcnNpc3RlbmNlWG1sRmlsZTsKLQkKLQkKLQlwdWJsaWMgU3luY2hyb25pemVDbGFzc2VzSm9iKElGaWxlIGZpbGUpIHsKLQkJc3VwZXIoSnB0Q29yZU1lc3NhZ2VzLlNZTkNIUk9OSVpFX0NMQVNTRVNfSk9CKTsKLQkJc2V0UnVsZShmaWxlLmdldFByb2plY3QoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VYbWxGaWxlID0gZmlsZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKEpwdENvcmVNZXNzYWdlcy5TWU5DSFJPTklaSU5HX0NMQVNTRVNfVEFTSywgMjAwKTsKLQkJCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9Ci0JCQotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGhpcy5wZXJzaXN0ZW5jZVhtbEZpbGUuZ2V0UHJvamVjdCgpKTsKLQotCQlQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBwZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCA9IFBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvcldyaXRlKHRoaXMucGVyc2lzdGVuY2VYbWxGaWxlLmdldFByb2plY3QoKSk7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcGVyc2lzdGVuY2VSZXNvdXJjZSA9IHBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmdldFJlc291cmNlKHRoaXMucGVyc2lzdGVuY2VYbWxGaWxlKTsKLQkJCi0JCW1vbml0b3Iud29ya2VkKDI1KTsKLQotCQlYbWxQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJCi0JCWlmIChwZXJzaXN0ZW5jZSA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW5jZSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2UoKTsKLQkJCXBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocGVyc2lzdGVuY2UpOwotCQl9Ci0JCQotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0UmVzb3VyY2U7Ci0JCQotCQlpZiAocGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnNpemUoKSA+IDApIHsKLQkJCXBlcnNpc3RlbmNlVW5pdFJlc291cmNlID0gcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLmdldCgwKTsKLQkJfQotCQllbHNlIHsKLQkJCXBlcnNpc3RlbmNlVW5pdFJlc291cmNlID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCXBlcnNpc3RlbmNlVW5pdFJlc291cmNlLnNldE5hbWUodGhpcy5wZXJzaXN0ZW5jZVhtbEZpbGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCQlwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuYWRkKHBlcnNpc3RlbmNlVW5pdFJlc291cmNlKTsKLQkJfQotCQkKLQkJcGVyc2lzdGVuY2VVbml0UmVzb3VyY2UuZ2V0Q2xhc3NlcygpLmNsZWFyKCk7Ci0JCQotCQltb25pdG9yLndvcmtlZCgyNSk7Ci0KLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGpwYVByb2plY3QuYW5ub3RhdGVkQ2xhc3NOYW1lcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmICggISBtYXBwaW5nRmlsZUNvbnRhaW5zKGpwYVByb2plY3QsIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpKSB7Ci0JCQkJWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJCQljbGFzc1JlZi5zZXRKYXZhQ2xhc3MoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCQkJcGVyc2lzdGVuY2VVbml0UmVzb3VyY2UuZ2V0Q2xhc3NlcygpLmFkZChjbGFzc1JlZik7Ci0JCQl9Ci0JCX0KLQkJCi0JCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQotCQl0cnkgewotCQkJcGVyc2lzdGVuY2VSZXNvdXJjZS5zYXZlKG51bGwpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdENvcmVQbHVnaW4uUExVR0lOX0lELCBKcHRDb3JlTWVzc2FnZXMuRVJST1JfV1JJVElOR19GSUxFLCBpb2UpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJcGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwkJCQotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG1hcHBpbmdGaWxlQ29udGFpbnMoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IGpwYVByb2plY3QuZ2V0Um9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQlpZiAocGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJaWYgKHBlcnNpc3RlbmNlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0c1NpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlVW5pdHMoKS5uZXh0KCk7Ci0JCWZvciAoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUocGVyc2lzdGVuY2VVbml0Lm1hcHBpbmdGaWxlUmVmcygpKSkgewotCQkJaWYgKG1hcHBpbmdGaWxlUmVmLmdldFBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVNjaGVkdWxpbmdSdWxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9TaW1wbGVTY2hlZHVsaW5nUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzdiMGMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVNjaGVkdWxpbmdSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci0KLS8qKgotICogQSBqb2Igc2NoZWR1bGluZyBydWxlIHRoYXQgY29uZmxpY3RzIG9ubHkgd2l0aCBpdHNlbGYuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVTY2hlZHVsaW5nUnVsZQotCWltcGxlbWVudHMgSVNjaGVkdWxpbmdSdWxlCi17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVTY2hlZHVsaW5nUnVsZSBJTlNUQU5DRSA9IG5ldyBTaW1wbGVTY2hlZHVsaW5nUnVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2NoZWR1bGluZ1J1bGUgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgU2ltcGxlU2NoZWR1bGluZ1J1bGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJcmV0dXJuIHJ1bGUgPT0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCXJldHVybiBydWxlID09IHRoaXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9TaW1wbGVUZXh0UmFuZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVRleHRSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmIzOThmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVRleHRSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5BYnN0cmFjdFRleHRSYW5nZTsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgVGV4dFJhbmdlLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGV4dFJhbmdlIGV4dGVuZHMgQWJzdHJhY3RUZXh0UmFuZ2UgewotCXByaXZhdGUgZmluYWwgaW50IG9mZnNldDsKLQlwcml2YXRlIGZpbmFsIGludCBsZW5ndGg7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgbGluZU51bWJlcjsKLQotCXB1YmxpYyBTaW1wbGVUZXh0UmFuZ2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGxpbmVOdW1iZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCXJldHVybiB0aGlzLmxpbmVOdW1iZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9lbWYvQ29tcG9uZW50VXRpbGl0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9lbWYvQ29tcG9uZW50VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDI2ZDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvZW1mL0NvbXBvbmVudFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRVdGlsaXRpZXMKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlcGxveW1lbnQgcGF0aCBmb3IgdGhlIGdpdmVuIHNvdXJjZSBmaWxlLiAgSWYgdGhlcmUgaXMgbm8KLQkgKiBjb3JyZXNwb25kaW5nIGRlcGxveW1lbnQgZmlsZSwgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggY29tcHV0ZURlcGxveVBhdGgoSUZpbGUgc291cmNlRmlsZSkgewotCQkvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgb25seSBjdXJyZW50IHdheSB0byBkbyB0aGlzIGlzIHRvIGV4aGF1c3RpdmVseSAKLQkJLy8gc2VhcmNoIGFsbCBkZXBsb3ltZW50IGZpbGVzIGFuZCBhdHRlbXB0IHRvIG1hdGNoIHRvIHRoaXMgZmlsZS4KLQkJLy8gQnVnIDIwMjk0MyBoYXMgYmVlbiBsb2dnZWQgdG8gdHJhY2sgdGhpcyBpc3N1ZS4KLQkJZm9yIChJVmlydHVhbEZpbGUgdmlydHVhbEZpbGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoYWxsVmlydHVhbEZpbGVzKHNvdXJjZUZpbGUuZ2V0UHJvamVjdCgpKSkpIHsKLQkJCWZvciAoSUZpbGUgdW5kZXJseWluZ0ZpbGUgOiB2aXJ0dWFsRmlsZS5nZXRVbmRlcmx5aW5nRmlsZXMoKSkgewotCQkJCWlmIChzb3VyY2VGaWxlLmVxdWFscyh1bmRlcmx5aW5nRmlsZSkpIHsKLQkJCQkJcmV0dXJuIHZpcnR1YWxGaWxlLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJdGVyYXRvcjxJVmlydHVhbEZpbGU+IGFsbFZpcnR1YWxGaWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SVZpcnR1YWxSZXNvdXJjZSwgSVZpcnR1YWxGaWxlPihhbGxWaXJ0dWFsUmVzb3VyY2VzKHByb2plY3QpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJVmlydHVhbFJlc291cmNlIG8pIHsKLQkJCQlyZXR1cm4gby5nZXRUeXBlKCkgPT0gSVZpcnR1YWxSZXNvdXJjZS5GSUxFOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJdGVyYXRvcjxJVmlydHVhbFJlc291cmNlPiBhbGxWaXJ0dWFsUmVzb3VyY2VzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkKLQkJaWYgKHZpcnR1YWxDb21wb25lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3I8SVZpcnR1YWxSZXNvdXJjZT4odmlydHVhbENvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBJVmlydHVhbFJlc291cmNlPiBjaGlsZHJlbihJVmlydHVhbFJlc291cmNlIG5leHQpIHsKLQkJCQlpZiAobmV4dC5nZXRUeXBlKCkgPT0gSVZpcnR1YWxSZXNvdXJjZS5GT0xERVIpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoKChJVmlydHVhbEZvbGRlcikgbmV4dCkubWVtYmVycygpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeyAvKiBmYWxsIHRocm91Z2gsIHJldHVybiBkZWZhdWx0IGNhc2UgKi8gfQotCQkJCX0KLQkJCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2VtZi9ET01VdGlsaXRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2VtZi9ET01VdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzYTBmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9lbWYvRE9NVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIERPTVV0aWxpdGllcwotCWV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRPTVV0aWxpdGllcwotewotCS8qKgotCSAqIEdldCB0aGUgYXR0cmlidXRlIE5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgCi0JICovCi0Jc3RhdGljIHB1YmxpYyBOb2RlIGNoaWxkQXR0cmlidXRlTm9kZShOb2RlIG5vZGUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0FTVE5vZGVUZXh0UmFuZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BU1ROb2RlVGV4dFJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjQwNDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0FTVE5vZGVUZXh0UmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuQWJzdHJhY3RUZXh0UmFuZ2U7Ci0KLS8qKgotICogQWRhcHQgYW4gQVNUTm9kZSB0byB0aGUgVGV4dFJhbmdlIGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIEFTVE5vZGVUZXh0UmFuZ2UgZXh0ZW5kcyBBYnN0cmFjdFRleHRSYW5nZSB7Ci0JcHJpdmF0ZSBmaW5hbCBBU1ROb2RlIGFzdE5vZGU7Ci0KLQlwdWJsaWMgQVNUTm9kZVRleHRSYW5nZShBU1ROb2RlIGFzdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hc3ROb2RlID0gYXN0Tm9kZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHRoaXMuYXN0Tm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmFzdE5vZGUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gKChDb21waWxhdGlvblVuaXQpIHRoaXMuYXN0Tm9kZS5nZXRSb290KCkpLmdldExpbmVOdW1iZXIodGhpcy5nZXRPZmZzZXQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0QW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2MzFkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RBbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQWRhcHQgYSBtZW1iZXIgYW5kIGEgZGVjbGFyYXRpb24gYW5ub3RhdGlvbiBhZGFwdGVyLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIEFubm90YXRpb25BZGFwdGVyIHsKLQlwcml2YXRlIGZpbmFsIE1lbWJlciBtZW1iZXI7Ci0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgQWJzdHJhY3RBbm5vdGF0aW9uQWRhcHRlcihNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcigpOwotCQl0aGlzLm1lbWJlciA9IG1lbWJlcjsKLQkJdGhpcy5kYWEgPSBkYWE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZGFhLmdldEFubm90YXRpb24odGhpcy5tZW1iZXIuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TWFya2VyQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5lZGl0KHRoaXMuYnVpbGROZXdNYXJrZXJBbm5vdGF0aW9uRWRpdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKSB7Ci0JCXRoaXMuZWRpdCh0aGlzLmJ1aWxkTmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbkVkaXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdOb3JtYWxBbm5vdGF0aW9uKCkgewotCQl0aGlzLmVkaXQodGhpcy5idWlsZE5ld05vcm1hbEFubm90YXRpb25FZGl0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5lZGl0KHRoaXMuYnVpbGRSZW1vdmVBbm5vdGF0aW9uRWRpdG9yKCkpOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZGFhLmdldEFzdE5vZGUodGhpcy5tZW1iZXIuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kYWEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGVkaXQoTWVtYmVyLkVkaXRvciBlZGl0b3IpIHsKLQkJdGhpcy5tZW1iZXIuZWRpdChlZGl0b3IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE1lbWJlci5FZGl0b3IgYnVpbGROZXdNYXJrZXJBbm5vdGF0aW9uRWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IE5ld01hcmtlckFubm90YXRpb25FZGl0b3IodGhpcy5kYWEpOwotCX0KLQotCXByb3RlY3RlZCBNZW1iZXIuRWRpdG9yIGJ1aWxkTmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbkVkaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRWRpdG9yKHRoaXMuZGFhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVtYmVyLkVkaXRvciBidWlsZE5ld05vcm1hbEFubm90YXRpb25FZGl0b3IoKSB7Ci0JCXJldHVybiBuZXcgTmV3Tm9ybWFsQW5ub3RhdGlvbkVkaXRvcih0aGlzLmRhYSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1lbWJlci5FZGl0b3IgYnVpbGRSZW1vdmVBbm5vdGF0aW9uRWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlbW92ZUFubm90YXRpb25FZGl0b3IodGhpcy5kYWEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5ld01hcmtlckFubm90YXRpb25FZGl0b3IgaW1wbGVtZW50cyBNZW1iZXIuRWRpdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKLQotCQlOZXdNYXJrZXJBbm5vdGF0aW9uRWRpdG9yKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kYWEgPSBkYWE7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLmRhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5ld1NpbmdsZU1lbWJlckFubm90YXRpb25FZGl0b3IgaW1wbGVtZW50cyBNZW1iZXIuRWRpdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKLQotCQlOZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRWRpdG9yKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kYWEgPSBkYWE7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLmRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5ld05vcm1hbEFubm90YXRpb25FZGl0b3IgaW1wbGVtZW50cyBNZW1iZXIuRWRpdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKLQotCQlOZXdOb3JtYWxBbm5vdGF0aW9uRWRpdG9yKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kYWEgPSBkYWE7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLmRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25FZGl0b3IgaW1wbGVtZW50cyBNZW1iZXIuRWRpdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKLQotCQlSZW1vdmVBbm5vdGF0aW9uRWRpdG9yKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kYWEgPSBkYWE7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLmRhYS5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDg2NmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvbk5hbWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgTWFya2VyQW5ub3RhdGlvbiBuZXdNYXJrZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldEFzdCgpKTsKLQkJdGhpcy5hZGRBbm5vdGF0aW9uQW5kSW1wb3J0KGRlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXRBc3QoKSk7Ci0JCXRoaXMuYWRkQW5ub3RhdGlvbkFuZEltcG9ydChkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbik7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCXB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uIG5ld05vcm1hbEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0QXN0KCkpOwotCQl0aGlzLmFkZEFubm90YXRpb25BbmRJbXBvcnQoZGVjbGFyYXRpb24sIGFubm90YXRpb24pOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGFwcHJvcHJpYXRlIGltcG9ydCBzdGF0ZW1lbnQsIHRoZW4gc2hvcnRlbiB0aGUgYW5ub3RhdGlvbidzCi0JICogbmFtZSBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uQW5kSW1wb3J0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlkZWNsYXJhdGlvbi5hZGRJbXBvcnQodGhpcy5hbm5vdGF0aW9uTmFtZSk7Ci0JCWFubm90YXRpb24uc2V0VHlwZU5hbWUoZGVjbGFyYXRpb24uZ2V0QXN0KCkubmV3TmFtZSh0aGlzLnNob3J0QW5ub3RhdGlvbk5hbWUoKSkpOwotCQl0aGlzLmFkZEFubm90YXRpb24oZGVjbGFyYXRpb24sIGFubm90YXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gdG8gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwKLQkgKiByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFubm90YXRpb24gaWYgcHJlc2VudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbik7Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbk5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGhlbHBlciBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBib29sZWFuIG5hbWVNYXRjaGVzKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5uYW1lTWF0Y2hlcyhkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbiwgdGhpcy5hbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmFtZU1hdGNoZXMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uYW5ub3RhdGlvbklzTmFtZWQoYW5ub3RhdGlvbiwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcmtlckFubm90YXRpb24gbmV3TWFya2VyQW5ub3RhdGlvbihBU1QgYXN0KSB7Ci0JCXJldHVybiB0aGlzLm5ld01hcmtlckFubm90YXRpb24oYXN0LCB0aGlzLmFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFya2VyQW5ub3RhdGlvbiBuZXdNYXJrZXJBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBuYW1lKSB7Ci0JCU1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzdC5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCWFubm90YXRpb24uc2V0VHlwZU5hbWUoYXN0Lm5ld05hbWUobmFtZSkpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBuZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKEFTVCBhc3QpIHsKLQkJcmV0dXJuIHRoaXMubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihhc3QsIHRoaXMuYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIG5hbWUpIHsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXN0Lm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJYW5ub3RhdGlvbi5zZXRUeXBlTmFtZShhc3QubmV3TmFtZShuYW1lKSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIG5ld05vcm1hbEFubm90YXRpb24oQVNUIGFzdCkgewotCQlyZXR1cm4gdGhpcy5uZXdOb3JtYWxBbm5vdGF0aW9uKGFzdCwgdGhpcy5hbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gbmV3Tm9ybWFsQW5ub3RhdGlvbihBU1QgYXN0LCBTdHJpbmcgbmFtZSkgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhc3QubmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotCQlhbm5vdGF0aW9uLnNldFR5cGVOYW1lKGFzdC5uZXdOYW1lKG5hbWUpKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzaG9ydEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zaG9ydE5hbWUodGhpcy5hbm5vdGF0aW9uTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc2hvcnROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMoTm9ybWFsQW5ub3RhdGlvbiBuYSkgewotCQlyZXR1cm4gbmEudmFsdWVzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNjllNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBHYXRoZXIgdG9nZXRoZXIgdGhlIGNvbW1vbiBpbXBsZW1lbnRhdGlvbiBiZWhhdmlvci4KLSAqIFQgaXMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQgdG8gYW5kIGZyb20gYW4gZXhwcmVzc2lvbi4KLSAqIAotICogV2UncmUgc3RpbGwgZmlndXJpbmcgb3V0IEphdmEgR2VuZXJpY3MgaGVyZS4uLi4gVGhlIG1ldGhvZHMgaW4gdGhpcyBhYnN0cmFjdAotICogY2xhc3Mgd29yayBmaW5lIHdpdGggYW55IHN1YmNsYXNzIG9mIEV4cHJlc3Npb24gRTsgYnV0IGEgQ2xhc3NDYXN0RXhjZXB0aW9uCi0gKiB3aWxsIG9jY3VyIGFzIHNvb24gYXMgd2UgY2FsbCBhbnkgbWV0aG9kIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MKLSAqIChlLmcuIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIpIHRoYXQgZXhwZWN0cyBhIHBhcnRpY3VsYXIgc3ViY2xhc3Mgb2YKLSAqIEV4cHJlc3Npb24gKGUuZy4gU3RyaW5nTGl0ZXJhbCkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4KLQlpbXBsZW1lbnRzIEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4KLXsKLQotCXByb3RlY3RlZCBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9iamVjdCAtPiBleHByZXNzaW9uICoqKioqKioqKioKLQotCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQoVCBvYmplY3QsIEFTVCBhc3QpIHsKLQkJcmV0dXJuIChvYmplY3QgPT0gbnVsbCkgPyB0aGlzLmNvbnZlcnROdWxsKGFzdCkgOiB0aGlzLmNvbnZlcnRPYmplY3Qob2JqZWN0LCBhc3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiBmb3IgYSBudWxsIG9iamVjdC4gQnkgZGVmYXVsdCwgYSBudWxsIG9iamVjdCB3aWxsCi0JICogYmUgY29udmVydGVkIGludG8gYSBudWxsIGV4cHJlc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gY29udmVydE51bGwoQVNUIGFzdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIG9iamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNjb252ZXJ0KFQsIEFTVCkKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRXhwcmVzc2lvbiBjb252ZXJ0T2JqZWN0KFQgb2JqZWN0LCBBU1QgYXN0KTsKLQotCi0JLy8gKioqKioqKioqKiBleHByZXNzaW9uIC0+IG9iamVjdCAqKioqKioqKioqCi0KLQlwdWJsaWMgVCBjb252ZXJ0KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gKGV4cHJlc3Npb24gPT0gbnVsbCkgPyB0aGlzLmNvbnZlcnROdWxsKCkgOiB0aGlzLmNvbnZlcnRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IGZvciBhIG51bGwgZXhwcmVzc2lvbi4gQnkgZGVmYXVsdCwgYSBudWxsIGV4cHJlc3Npb24gd2lsbAotCSAqIGJlIGNvbnZlcnRlZCBpbnRvIGEgbnVsbCBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIFQgY29udmVydE51bGwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNjb252ZXJ0KEV4cHJlc3Npb24pCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFQgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0TmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0TmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjg1NTZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci0KLS8qKgotICogUHVsbCB0b2dldGhlciBzb21lIG9mIHRoZSBiZWhhdmlvciBjb21tb24gdG8gTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotICogYW5kIEluZGV4ZWROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgewotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBvdXRlckFubm90YXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiByZW1vdmVPdXRlckFubm90YXRpb25XaGVuRW1wdHk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSI7Ci0JICogZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW1vdmUgdGhlIG91dGVyIGFubm90YXRpb24gd2hlbiBpdCBpcyBlbXB0eQotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBvdXRlckFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJdGhpcyhvdXRlckFubm90YXRpb25BZGFwdGVyLCAidmFsdWUiLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW1vdmUgdGhlIG91dGVyIGFubm90YXRpb24gd2hlbiBpdCBpcyBlbXB0eQotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBvdXRlckFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQl0aGlzKG91dGVyQW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBhbm5vdGF0aW9uTmFtZSwgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFic3RyYWN0TmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG91dGVyQW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGFubm90YXRpb25OYW1lLCBib29sZWFuIHJlbW92ZU91dGVyQW5ub3RhdGlvbldoZW5FbXB0eSkgewotCQlzdXBlcihhbm5vdGF0aW9uTmFtZSk7Ci0JCXRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlciA9IG91dGVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci0JCXRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLQkJdGhpcy5yZW1vdmVPdXRlckFubm90YXRpb25XaGVuRW1wdHkgPSByZW1vdmVPdXRlckFubm90YXRpb25XaGVuRW1wdHk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUFubm90YXRpb24gb3V0ZXIgPSB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChvdXRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFeHByZXNzaW9uIHZhbHVlID0gdGhpcy5lbGVtZW50VmFsdWUob3V0ZXIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQW5ub3RhdGlvbiBpbm5lciA9IHRoaXMuZ2V0QW5ub3RhdGlvbih2YWx1ZSk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyByZXR1cm4gdGhlIGFubm90YXRpb24gb25seSBpZiBpdCBoYXMgYSBtYXRjaGluZyBuYW1lKD8pCi0JCXJldHVybiB0aGlzLm5hbWVNYXRjaGVzKGRlY2xhcmF0aW9uLCBpbm5lcikgPyBpbm5lciA6IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUFubm90YXRpb24gb3V0ZXIgPSB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChvdXRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRXhwcmVzc2lvbiB2YWx1ZSA9IHRoaXMuZWxlbWVudFZhbHVlKG91dGVyKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBoYWNrIHRvIGFsbG93IHNob3J0LWNpcmN1aXQgd2hlbiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgaW5pdGlhbGl6ZXIKLQkJaWYgKHRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgb3V0ZXIsIHZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFubm90YXRpb24gaW5uZXIgPSB0aGlzLmFubm90YXRpb25WYWx1ZSh2YWx1ZSk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIG9ubHkgaWYgaXQgaGFzIGEgbWF0Y2hpbmcgbmFtZSg/KQotCQlpZiAodGhpcy5uYW1lTWF0Y2hlcyhkZWNsYXJhdGlvbiwgaW5uZXIpKSB7Ci0JCQl0aGlzLnJlbW92ZUVsZW1lbnRBbmROb3JtYWxpemUoZGVjbGFyYXRpb24sIG91dGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nLCByZXR1cm4gdGhlIG91dGVyIGFubm90YXRpb24ncyBub2RlCi0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiAhPSBudWxsKSA/IGFubm90YXRpb24gOiB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QXN0Tm9kZShkZWNsYXJhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCUFubm90YXRpb24gb3V0ZXIgPSB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChvdXRlciA9PSBudWxsKSB7Ci0JCQl0aGlzLmJ1aWxkTmV3T3V0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBpbm5lcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMubW9kaWZ5QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgKE1hcmtlckFubm90YXRpb24pIG91dGVyLCBpbm5lcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMubW9kaWZ5QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgKFNpbmdsZU1lbWJlckFubm90YXRpb24pIG91dGVyLCBpbm5lcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMubW9kaWZ5QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgKE5vcm1hbEFubm90YXRpb24pIG91dGVyLCBpbm5lcik7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIG91dGVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhYnN0cmFjdCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBhbm5vdGF0aW9uIGV4dHJhY3RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiwKLQkgKiB3aGljaCBpcyB0aGUgdmFsdWUgb2YgdGhlIGFkYXB0ZXIncyBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oRXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGFubm90YXRpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24sCi0JICogd2hpY2ggaXMgdGhlIHZhbHVlIG9mIHRoZSBhZGFwdGVyJ3MgZWxlbWVudC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcmVtb3ZhbCB3YXMgc3VjY2Vzc2Z1bC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gb3V0ZXIsIEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIG91dGVyIGFubm90YXRpb24gdG8gdGhlCi0JICogc3BlY2lmaWVkIGlubmVyIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbW9kaWZ5QW5ub3RhdGlvblZhbHVlKFNpbmdsZU1lbWJlckFubm90YXRpb24gb3V0ZXIsIEFubm90YXRpb24gaW5uZXIpOwotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHRoZQotCSAqIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG1vZGlmeU1lbWJlclZhbHVlUGFpcihNZW1iZXJWYWx1ZVBhaXIgcGFpciwgQW5ub3RhdGlvbiBpbm5lcik7Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0T3V0ZXJBbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50TmFtZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaXMgYW4gYW5ub3RhdGlvbiwgY2FzdCBpdCB0byBhbiBhbm5vdGF0aW9uOwotCSAqIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBhbm5vdGF0aW9uVmFsdWUoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCXN3aXRjaCAoZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIEFTVE5vZGUuTk9STUFMX0FOTk9UQVRJT046Ci0JCQljYXNlIEFTVE5vZGUuU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OOgotCQkJY2FzZSBBU1ROb2RlLk1BUktFUl9BTk5PVEFUSU9OOgotCQkJCXJldHVybiAoQW5ub3RhdGlvbikgZXhwcmVzc2lvbjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24sIGNvbnZlcnRpbmcgdGhlIGFubm90YXRpb24gYXMgYXBwcm9wcmlhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIG91dGVyKSB7Ci0JCWlmIChvdXRlci5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKGRlY2xhcmF0aW9uLCAoTm9ybWFsQW5ub3RhdGlvbikgb3V0ZXIpOwotCQl9IGVsc2UgaWYgKG91dGVyLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnJlbW92ZUVsZW1lbnRBbmROb3JtYWxpemUoZGVjbGFyYXRpb24sIChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBvdXRlcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMucmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShkZWNsYXJhdGlvbiwgKE1hcmtlckFubm90YXRpb24pIG91dGVyKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgb3V0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSAqZmlyc3QqIGFubm90YXRpb24gZWxlbWVudCB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24uIENvbnZlcnQgdGhlIGFubm90YXRpb24gdG8KLQkgKiBhIG1hcmtlciBhbm5vdGF0aW9uIG9yIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiBpZiBhcHByb3ByaWF0ZS4KLQkgKiA8cHJlPgotCSAqICYjNjQ7T3V0ZXIobmFtZT0iRnJlZCIsIGZvbz0mIzY0O0lubmVyKSA9PiAmIzY0O091dGVyKG5hbWU9IkZyZWQiKQotCSAqICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIpID0+ICYjNjQ7T3V0ZXIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIE5vcm1hbEFubm90YXRpb24gb3V0ZXIpIHsKLQkJdGhpcy5yZW1vdmVFbGVtZW50KG91dGVyKTsKLQkJdGhpcy5ub3JtYWxpemVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBvdXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIHRoZSBlbGVtZW50IHdpdGgKLQkgKiB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50KE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yPE1lbWJlclZhbHVlUGFpcj4gc3RyZWFtID0gdGhpcy52YWx1ZXMoYW5ub3RhdGlvbikuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHRoaXMuZWxlbWVudE5hbWUpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIG5vcm1hbCBhbm5vdGF0aW9uIHRvIGEgbWFya2VyIGFubm90YXRpb24gb3IKLQkgKiBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm9ybWFsaXplQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBOb3JtYWxBbm5vdGF0aW9uIG91dGVyKSB7Ci0JCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMgPSB0aGlzLnZhbHVlcyhvdXRlcik7Ci0JCXN3aXRjaCAodmFsdWVzLnNpemUoKSkgewotCQkJY2FzZSAwOgotCQkJCS8vIGlmIHRoZSBlbGVtZW50cyBhcmUgYWxsIGdvbmUsIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiBvciBjb252ZXJ0IGl0IHRvIGEgbWFya2VyIGFubm90YXRpb24KLQkJCQlpZiAodGhpcy5yZW1vdmVPdXRlckFubm90YXRpb25XaGVuRW1wdHkpIHsKLQkJCQkJdGhpcy5vdXRlckFubm90YXRpb25BZGFwdGVyLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGNvbnZlcnQgdGhlIGFubm90YXRpb24gdG8gYSBtYXJrZXIgYW5ub3RhdGlvbgotCQkJCQl0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdmFsdWVzLmdldCgwKTsKLQkJCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKCJ2YWx1ZSIpKSB7Ci0JCQkJCS8vIGlmIHRoZSBsYXN0IHJlbWFpbmluZyBlbGVtZW50IGlzICd2YWx1ZScsIGNvbnZlcnQgdGhlIGFubm90YXRpb24gdG8gYSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24KLQkJCQkJRXhwcmVzc2lvbiB2diA9IHBhaXIuZ2V0VmFsdWUoKTsKLQkJCQkJdnYgPSAoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh2di5nZXRBU1QoKSwgdnYpOwotCQkJCQl0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbikuc2V0VmFsdWUodnYpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiB0byBhIG1hcmtlciBhbm5vdGF0aW9uCi0JICogaWYgdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUgaXMgInZhbHVlIi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFNpbmdsZU1lbWJlckFubm90YXRpb24gb3V0ZXIpIHsKLQkJaWYgKHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKCJ2YWx1ZSIpKSB7Ci0JCQlpZiAodGhpcy5yZW1vdmVPdXRlckFubm90YXRpb25XaGVuRW1wdHkpIHsKLQkJCQl0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGNvbnZlcnQgdGhlIGFubm90YXRpb24gdG8gYSBtYXJrZXIgYW5ub3RhdGlvbgotCQkJCXRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnRBbmROb3JtYWxpemUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgTWFya2VyQW5ub3RhdGlvbiBvdXRlcikgewotCQlpZiAodGhpcy5yZW1vdmVPdXRlckFubm90YXRpb25XaGVuRW1wdHkpIHsKLQkJCXRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqIChBbiBlbGVtZW50IG5hbWUgb2YgInZhbHVlIiB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgYSBzaW5nbGUKLQkgKiBtZW1iZXIgYW5ub3RhdGlvbi4pCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZWxlbWVudFZhbHVlKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlpZiAoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIHRoaXMuZWxlbWVudFZhbHVlKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKTsKLQkJfQotCQlpZiAoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIHRoaXMuZWxlbWVudFZhbHVlKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBlbGVtZW50VmFsdWUoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbik7Ci0JCXJldHVybiAocGFpciA9PSBudWxsKSA/IG51bGwgOiBwYWlyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUgaXMgInZhbHVlIiwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUKLQkgKiBhbm5vdGF0aW9uLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZWxlbWVudFZhbHVlKFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoInZhbHVlIikgPyBhbm5vdGF0aW9uLmdldFZhbHVlKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgKmZpcnN0KiBtZW1iZXIgdmFsdWUgcGFpciBmb3IgdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWZvciAoTWVtYmVyVmFsdWVQYWlyIHBhaXIgOiB0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKSkgewotCQkJaWYgKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0aGlzLmVsZW1lbnROYW1lKSkgewotCQkJCXJldHVybiBwYWlyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbmV3IG91dGVyIGFubm90YXRpb24gYW5kIGFkZCB0aGUgc3BlY2lmaWVkCi0JICogaW5uZXIgYW5ub3RhdGlvbiB0byBpdDoKLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O091dGVyKCYjNjQ7SW5uZXIpCi0JICogPC9wcmU+Ci0JICogb3IKLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKQotCSAqIDwvcHJlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1aWxkTmV3T3V0ZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gaW5uZXIpIHsKLQkJaWYgKHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKCJ2YWx1ZSIpKSB7Ci0JCQl0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbikuc2V0VmFsdWUodGhpcy5idWlsZE5ld0lubmVyRXhwcmVzc2lvbihpbm5lcikpOwotCQl9IGVsc2UgewotCQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyA9IHRoaXMudmFsdWVzKHRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSk7Ci0JCQl2YWx1ZXMuYWRkKHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKHRoaXMuYnVpbGROZXdJbm5lckV4cHJlc3Npb24oaW5uZXIpKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhbiBleHByZXNzaW9uIHRvIGJlIGFkZGVkIHRvIGEgbmV3IG91dGVyIGFubm90YXRpb24KLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBFeHByZXNzaW9uIGJ1aWxkTmV3SW5uZXJFeHByZXNzaW9uKEFubm90YXRpb24gaW5uZXIpOwotCi0JLyoqCi0JICogQnVpbGQgYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKFN0cmluZyBuYW1lLCBFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCUFTVCBhc3QgPSB2YWx1ZS5nZXRBU1QoKTsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSBhc3QubmV3TWVtYmVyVmFsdWVQYWlyKCk7Ci0JCXBhaXIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZShuYW1lKSk7Ci0JCXBhaXIuc2V0VmFsdWUodmFsdWUpOwotCQlyZXR1cm4gcGFpcjsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lCi0JICogYW5kIHRoZSBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG5ld01lbWJlclZhbHVlUGFpcihFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLm5ld01lbWJlclZhbHVlUGFpcih0aGlzLmVsZW1lbnROYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbiB0byB0aGUgbWFya2VyIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBNYXJrZXJBbm5vdGF0aW9uIG91dGVyLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCXRoaXMuYnVpbGROZXdPdXRlckFubm90YXRpb24oZGVjbGFyYXRpb24sIGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uIHRvIHRoZSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG91dGVyLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnROYW1lLmVxdWFscygidmFsdWUiKSkgewotCQkJdGhpcy5tb2RpZnlBbm5vdGF0aW9uVmFsdWUob3V0ZXIsIGlubmVyKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubW9kaWZ5QW5ub3RhdGlvbk5vblZhbHVlKGRlY2xhcmF0aW9uLCBvdXRlciwgaW5uZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbiB0byB0aGUgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uLAotCSAqIGNvbnZlcnRpbmcgaXQgdG8gYSBub3JtYWwgYW5ub3RhdGlvbjoKLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O091dGVyKCJsb3JlbSBpcHN1bSIpID0+ICYjNjQ7T3V0ZXIodmFsdWU9ImxvcmVtIGlwc3VtIiwgZm9vPSYjNjQ7SW5uZXIpCi0JICogPC9wcmU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvbk5vblZhbHVlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFNpbmdsZU1lbWJlckFubm90YXRpb24gb3V0ZXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJRXhwcmVzc2lvbiB2diA9IG91dGVyLmdldFZhbHVlKCk7Ci0JCXZ2ID0gKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodnYuZ2V0QVNUKCksIHZ2KTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBuZXdPdXRlciA9IHRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyA9IHRoaXMudmFsdWVzKG5ld091dGVyKTsKLQkJdmFsdWVzLmFkZCh0aGlzLm5ld01lbWJlclZhbHVlUGFpcigidmFsdWUiLCB2dikpOwotCQl2YWx1ZXMuYWRkKHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKHRoaXMuYnVpbGROZXdJbm5lckV4cHJlc3Npb24oaW5uZXIpKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbiB0byB0aGUgbm9ybWFsIGFubm90YXRpb246Ci0JICogPHByZT4KLQkgKiAgICAgJiM2NDtPdXRlcihiYXI9ImxvcmVtIGlwc3VtIikgPT4gJiM2NDtPdXRlcihiYXI9ImxvcmVtIGlwc3VtIiwgZm9vPSYjNjQ7SW5uZXIpCi0JICogPC9wcmU+Ci0JICogb3IKLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKCJsb3JlbSBpcHN1bSIpKSA9PiAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKQotCSAqIDwvcHJlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vZGlmeUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgTm9ybWFsQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHRoaXMubWVtYmVyVmFsdWVQYWlyKG91dGVyKTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkgewotCQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyA9IHRoaXMudmFsdWVzKG91dGVyKTsKLQkJCXZhbHVlcy5hZGQodGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoaW5uZXIpKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubW9kaWZ5TWVtYmVyVmFsdWVQYWlyKHBhaXIsIGlubmVyKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OWI1OWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhbiBhcnJheSBpbml0aWFsaXplciBvciBzaW5nbGUgZXhwcmVzc2lvbiB0by9mcm9tIGFuIGFycmF5IG9mCi0gKiBzdHJpbmdzIChlLmcuIHsidGV4dDAiLCAidGV4dDEifSkuCi0gKiBFIGlzIHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9ucyB0byBiZSBmb3VuZCBlaXRoZXIgc3RhbmRhbG9uZSBvcgotICogYXMgZWxlbWVudHMgaW4gdGhlIGFycmF5IGluaXRpYWxpemVyLgotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdPgotewotCXByaXZhdGUgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGVsZW1lbnRDb252ZXJ0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIgYXJyYXlDb252ZXJ0ZXI7Ci0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgaWYgaXQgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGVsZW1lbnRDb252ZXJ0ZXIpIHsKLQkJdGhpcyhlbGVtZW50Q29udmVydGVyLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gZWxlbWVudENvbnZlcnRlciwgYm9vbGVhbiByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudENvbnZlcnRlciA9IGVsZW1lbnRDb252ZXJ0ZXI7Ci0JCXRoaXMuYXJyYXlDb252ZXJ0ZXIgPSBuZXcgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKGVsZW1lbnRDb252ZXJ0ZXIsIHJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHkpOwotCX0KLQotCS8qKgotCSAqIGlmIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBzdHJpbmcgaW4gdGhlIGFycmF5IHJldHVybiB0aGUgc2luZ2xlIGV4cHJlc3Npb24sCi0JICogd2l0aG91dCBicmFjZXMsIGluc3RlYWQgb2YgYW4gYXJyYXkgaW5pdGlhbGl6ZXIKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBjb252ZXJ0T2JqZWN0KFN0cmluZ1tdIHN0cmluZ3MsIEFTVCBhc3QpIHsKLQkJcmV0dXJuIChzdHJpbmdzLmxlbmd0aCA9PSAxKSA/Ci0JCQkJdGhpcy5lbGVtZW50Q29udmVydGVyLmNvbnZlcnQoc3RyaW5nc1swXSwgYXN0KQotCQkJOgotCQkJCXRoaXMuYXJyYXlDb252ZXJ0ZXIuY29udmVydE9iamVjdChzdHJpbmdzLCBhc3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBjb252ZXJ0TnVsbCgpIHsKLQkJcmV0dXJuIHRoaXMuYXJyYXlDb252ZXJ0ZXIuY29udmVydE51bGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBmb3IgYSBzaW5nbGUgZXhwcmVzc2lvbiB3aXRoIG5vIHN1cnJvdW5kaW5nIGJyYWNlcywgaW1wbHlpbmcgYQotCSAqIHNpbmdsZS1lbnRyeSBhcnJheQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgPwotCQkJCXRoaXMuYXJyYXlDb252ZXJ0ZXIuY29udmVydEFycmF5SW5pdGlhbGl6ZXIoKEFycmF5SW5pdGlhbGl6ZXIpIGV4cHJlc3Npb24pCi0JCQk6Ci0JCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmVsZW1lbnRDb252ZXJ0ZXIuY29udmVydChleHByZXNzaW9uKX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhbiBleHByZXNzaW9uIGNvbnZlcnRlciBmb3IgYW4gYW5ub3RhdGlvbiBlbGVtZW50IG9mIHR5cGUgU3RyaW5nW10uCi0JICogICAgIEBGb28oYmFyPXsidGV4dDAiLCAidGV4dDEifSkKLQkgKiBvcgotCSAqICAgICBARm9vKGJhcj0idGV4dDAiKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlciBmb3JTdHJpbmdzKCkgewotCQlyZXR1cm4gbmV3IEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhbiBleHByZXNzaW9uIGNvbnZlcnRlciBmb3IgYW4gYW5ub3RhdGlvbiBlbGVtZW50IG9mIHR5cGUgPGVudW0+W10uCi0JICogICAgIEBGb28oYmFyPXtCQVosIEJBVH0pCi0JICogb3IKLQkgKiAgICAgQEZvbyhiYXI9QkFaKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlciBmb3JOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKE5hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Jvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmYzQwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgYSBib29sZWFuIGxpdGVyYWwgdG8vZnJvbSBhIEJvb2xlYW4KLSAqIChlLmcuIEJvb2xlYW4uVFJVRSkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPEJvb2xlYW4+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxCb29sZWFuPiBJTlNUQU5DRSA9IG5ldyBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPEJvb2xlYW4+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCb29sZWFuTGl0ZXJhbCBjb252ZXJ0T2JqZWN0KEJvb2xlYW4gYm9vbGVhbk9iamVjdCwgQVNUIGFzdCkgewotCQlyZXR1cm4gYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKGJvb2xlYW5PYmplY3QuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCb29sZWFuIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlPYmplY3QgdmFsdWUgPSBleHByZXNzaW9uLnJlc29sdmVDb25zdGFudEV4cHJlc3Npb25WYWx1ZSgpOwotCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgPyAoKEJvb2xlYW4pIHZhbHVlKSA6IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRhMjA2Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoYXJhY3RlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLQotLyoqCi0gKiBDb252ZXJ0IGEgY2hhcmFjdGVyIGxpdGVyYWwgdG8vZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGNoYXJhY3RlcgotICogKGUuZy4gIkEiKS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFID0gbmV3IENoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIENoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFyYWN0ZXJMaXRlcmFsIGNvbnZlcnRPYmplY3QoU3RyaW5nIHN0cmluZywgQVNUIGFzdCkgewotCQlDaGFyYWN0ZXJMaXRlcmFsIGNoYXJhY3RlckxpdGVyYWwgPSBhc3QubmV3Q2hhcmFjdGVyTGl0ZXJhbCgpOwotCQljaGFyYWN0ZXJMaXRlcmFsLnNldENoYXJWYWx1ZShzdHJpbmcuY2hhckF0KDApKTsKLQkJcmV0dXJuIGNoYXJhY3RlckxpdGVyYWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJT2JqZWN0IHZhbHVlID0gZXhwcmVzc2lvbi5yZXNvbHZlQ29uc3RhbnRFeHByZXNzaW9uVmFsdWUoKTsKLQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikgPyAoKENoYXJhY3RlcikgdmFsdWUpLnRvU3RyaW5nKCkgOiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYmM4YTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogTWFuaXB1bGF0ZSBhbiBhbm5vdGF0aW9uIHRoYXQgZWl0aGVyIG9jY3VycyBzdGFuZC1hbG9uZSwgZS5nLgotICogPHByZT4KLSAqICAgICAmIzY0O0lubmVyKCJ6ZXJvIikKLSAqICAgICBwcml2YXRlIGludCBpZDsKLSAqIDwvcHJlPgotICogICAgIAotICogb3IgaXMgZW1iZWRkZWQgaW4gYW4gZWxlbWVudCBhcnJheSB3aXRoaW4gYW5vdGhlciBhbm5vdGF0aW9uLCBlLmcuCi0gKiA8cHJlPgotICogICAgICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyKCJ6ZXJvIiksICYjNjQ7SW5uZXIoIm9uZSIpLCAmIzY0O0lubmVyKCJ0d28iKX0pCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiAgICAgCi0gKiAgICAgICAgIGFubm90YXRpb25OYW1lID0gIklubmVyIgotICogICAgICAgICBjb250YWluZXJBbm5vdGF0aW9uTmFtZSA9ICJPdXRlciIKLSAqICAgICAgICAgZWxlbWVudE5hbWUgPSAiZm9vIgotICogICAgICAgICBpbmRleCA9IDAtMgotICogPC9wcmU+Ci0gKiAKLSAqIFRoaXMgaXMgYSB1c2VmdWwgcGF0dGVybiBiZWNhdXNlIGEgZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgbW9yZQotICogdGhhbiBvbmUgYW5ub3RhdGlvbiBvZiB0aGUgc2FtZSB0eXBlLCBhbmQgYWxsb3dpbmcgdGhlIHN0YW5kLWFsb25lCi0gKiBjb25maWd1cmF0aW9uIHJlZHVjZXMgY2x1dHRlci4KLSAqIDxicj4KLSAqIE5COiBUaGlzIGNvbmZpZ3VyYXRpb24gb25seSBtYWtlcyBzZW5zZSBmb3IgInRvcC1sZXZlbCIgYW5ub3RhdGlvbnMsIGFzCi0gKiBvcHBvc2VkIHRvICJuZXN0ZWQiIGFubm90YXRpb25zLiBUaGlzIGlzIGJlY2F1c2UgYW5ub3RhdGlvbiBlbGVtZW50cwotICogY2FuIG9ubHkgYmUgZGVjbGFyZWQgd2l0aCBhIHR5cGUgb2YgYSBzaW5nbGUgYW5ub3RhdGlvbiBhbmQgYW5ub3RhdGlvbnMKLSAqIGNhbm5vdCBiZSBwYXJ0IG9mIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb25zIGNhbm5vdCAqYm90aCogYmUgc3VwcG9ydGVkOgotICogPHByZT4KLSAqICAgICAmIzY0O0ZvbyhiYXI9JiM2NDtPdXRlciguLi4pKQotICogICAgIHByaXZhdGUgaW50IGlkOwotICogCi0gKiAgICAgJiM2NDtGb28oYmFyPSYjNjQ7SW5uZXIoLi4uKSkgIC8vIG5vdCBhbGxvd2VkCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiA8L3ByZT4KLSAqIAotICogTkI6IEJlaGF2aW9yIGlzIHVuZGVmaW5lZCB3aGVuIGJvdGggdGhlIHN0YW5kLWFsb25lIGFuZCB0aGUgbmVzdGVkCi0gKiBjb25maWd1cmF0aW9ucyBhbm5vdGF0ZSB0aGUgc2FtZSBkZWNsYXJhdGlvbiwgZS5nLgotICogPHByZT4KLSAqICAgICAvLyB1bmRlZmluZWQgYmVoYXZpb3IKLSAqICAgICAmIzY0O0lubmVyKCJ6ZXJvIikKLSAqICAgICAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lcigiemVybyIpLCAmIzY0O0lubmVyKCJvbmUiKSwgJiM2NDtJbm5lcigidHdvIil9KQotICogICAgIHByaXZhdGUgaW50IGlkOwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi0JaW1wbGVtZW50cyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotewotCi0JLyoqCi0JICogdGhpcyBhZGFwdGVyIGlzIHVzZWQgd2hlbiB0aGUgYW5ub3RhdGlvbiBpcyAic3RhbmQtYWxvbmUiOgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7SW5uZXIoInplcm8iKQotCSAqIDwvcHJlPgotCSAqIGFuZCBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgaW5kZXggaXMgMCBvciAxCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlcjsKLQotCS8qKgotCSAqIHRoaXMgYWRhcHRlciBpcyB1c2VkIHdoZW4gdGhlIGFubm90YXRpb24gaXMgIm5lc3RlZCI6Ci0JICogPHByZT4KLQkgKiAgICAgJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIoInplcm8iKSwgJiM2NDtJbm5lcigib25lIil9KQotCSAqIDwvcHJlPgotCSAqLwotCXByaXZhdGUgZmluYWwgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgbmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci0KLQkvKioKLQkgKiB0aGlzIGFkYXB0ZXIgaXMgZm9yIHRoZSAibmVzdGVkIiBhbm5vdGF0aW9uIGF0IHRoZSB6ZXJvIGluZGV4OwotCSAqIGFuZCBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgaW5kZXggaXMgMQotCSAqLwotCXByaXZhdGUgZmluYWwgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyAidmFsdWUiCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtJbm5lcigiemVybyIpCi0JICogICAgICYjNjQ7T3V0ZXIoeyYjNjQ7SW5uZXIoInplcm8iKSwgJiM2NDtJbm5lcigib25lIil9KQotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lLCBpbnQgaW5kZXgpIHsKLQkJdGhpcyhhbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUsICJ2YWx1ZSIsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBpbnQgaW5kZXgpIHsKLQkJdGhpcyhuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0aW9uTmFtZSksIG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGNvbnRhaW5lckFubm90YXRpb25OYW1lKSwgZWxlbWVudE5hbWUsIGluZGV4LCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZGVmYXVsdCBlbGVtZW50IG5hbWUgaXMgInZhbHVlIgotCSAqLwotCXB1YmxpYyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBzdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIsIAotCQkJU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjb250YWluZXJBbm5vdGF0aW9uQWRhcHRlciwgCi0JCQlpbnQgaW5kZXgsIAotCQkJU3RyaW5nIG5lc3RlZEFubm90YXRpb25OYW1lCi0JKSB7Ci0JCXRoaXMoc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLCBjb250YWluZXJBbm5vdGF0aW9uQWRhcHRlciwgInZhbHVlIiwgaW5kZXgsIG5lc3RlZEFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCVNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLCAKLQkJCVNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY29udGFpbmVyQW5ub3RhdGlvbkFkYXB0ZXIsIAotCQkJU3RyaW5nIGVsZW1lbnROYW1lLCAKLQkJCWludCBpbmRleCwgCi0JCQlTdHJpbmcgbmVzdGVkQW5ub3RhdGlvbk5hbWUKLQkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIgPSBzdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXI7Ci0JCXRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoY29udGFpbmVyQW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBpbmRleCwgbmVzdGVkQW5ub3RhdGlvbk5hbWUpOwotCQl0aGlzLnplcm9OZXN0ZWRBbm5vdGF0aW9uQWRhcHRlciA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihjb250YWluZXJBbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIDAsIG5lc3RlZEFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZ2V0SW5kZXgoKSA9PSAwKSB7Ci0JCQkvLyBjaGVjayBmb3IgdGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24KLQkJCUFubm90YXRpb24gc3RhbmRBbG9uZUFubm90YXRpb24gPSB0aGlzLmdldFN0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCWlmIChzdGFuZEFsb25lQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN0YW5kQWxvbmVBbm5vdGF0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmdldE5lc3RlZEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIDxwcmU+Ci0JICogW25vbmVdID0+ICYjNjQ7SW5uZXIKLQkgKiAgICAgb3IKLQkgKiAmIzY0O0lubmVyKCJsb3JlbSBpcHN1bSIpID0+ICYjNjQ7SW5uZXIKLQkgKiAgICAgb3IKLQkgKiAmIzY0O0lubmVyKHRleHQ9ImxvcmVtIGlwc3VtIikgPT4gJiM2NDtJbm5lcgotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyLCAmIzY0O0lubmVyfSkgPT4gJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIsICYjNjQ7SW5uZXIsICYjNjQ7SW5uZXJ9KQotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIpID0+ICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyLCAmIzY0O0lubmVyfSkKLQkgKiAgICAgb3IKLQkgKiAmIzY0O0lubmVyID0+ICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyLCAmIzY0O0lubmVyfSkKLQkgKiAgICAgZXRjLgotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBNYXJrZXJBbm5vdGF0aW9uIG5ld01hcmtlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gKE1hcmtlckFubm90YXRpb24pIHRoaXMubmV3QW5ub3RhdGlvbihNQVJLRVJfQU5OT1RBVElPTl9GQUNUT1JZLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgdGhpcy5uZXdBbm5vdGF0aW9uKFNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTl9GQUNUT1JZLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIE5vcm1hbEFubm90YXRpb24gbmV3Tm9ybWFsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiAoTm9ybWFsQW5ub3RhdGlvbikgdGhpcy5uZXdBbm5vdGF0aW9uKE5PUk1BTF9BTk5PVEFUSU9OX0ZBQ1RPUlksIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZ2V0SW5kZXgoKSA9PSAwKSB7Ci0JCQkvLyBjaGVjayBmb3IgdGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24KLQkJCWlmICh0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uSXNQcmVzZW50KGRlY2xhcmF0aW9uKSkgewotCQkJCXRoaXMucmVtb3ZlU3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQl0aGlzLnJlbW92ZU5lc3RlZEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlpZiAodGhpcy5uZXN0ZWRFbGVtZW50Q2FuQmVDb252ZXJ0ZWRUb1N0YW5kQWxvbmUoZGVjbGFyYXRpb24pKSB7Ci0JCQl0aGlzLmNvbnZlcnRMYXN0RWxlbWVudEFubm90YXRpb25Ub1N0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nLCBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGFubm90YXRpb24gYWRhcHRlcgotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlyZXR1cm4gKGFubm90YXRpb24gIT0gbnVsbCkgPyBhbm5vdGF0aW9uIDogdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRBc3ROb2RlKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpbnQgb2xkSW5kZXggPSB0aGlzLmdldEluZGV4KCk7Ci0JCWlmIChuZXdJbmRleCA9PSBvbGRJbmRleCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQW5ub3RhdGlvbiBzdGFuZEFsb25lQW5ub3RhdGlvbiA9IHRoaXMuZ2V0U3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlpZiAoc3RhbmRBbG9uZUFubm90YXRpb24gPT0gbnVsbCkgewotCQkJdGhpcy5tb3ZlTmVzdGVkQW5ub3RhdGlvbihuZXdJbmRleCwgZGVjbGFyYXRpb24pOwotCQkJaWYgKHRoaXMubmVzdGVkRWxlbWVudENhbkJlQ29udmVydGVkVG9TdGFuZEFsb25lKGRlY2xhcmF0aW9uKSkgewotCQkJCXRoaXMuY29udmVydExhc3RFbGVtZW50QW5ub3RhdGlvblRvU3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChvbGRJbmRleCA9PSAwKSAmJiAobmV3SW5kZXggPT0gMSkpIHsKLQkJCQkvLyB0aGlzIGlzIG9uZSBvZiB0d28gc2l0dWF0aW9ucyB3aGVyZSB3ZSB0cmFuc2l0aW9uIGZyb20gc3RhbmRhbG9uZSB0byBjb250YWluZXIKLQkJCQl0aGlzLm1vdmVTdGFuZEFsb25lQW5ub3RhdGlvblRvQ29udGFpbmVyQW5ub3RhdGlvbihzdGFuZEFsb25lQW5ub3RhdGlvbiwgZGVjbGFyYXRpb24pOwotCQkJCXRoaXMubW92ZU5lc3RlZEFubm90YXRpb24obmV3SW5kZXgsIGRlY2xhcmF0aW9uKTsKLQkJCX0gZWxzZSBpZiAobmV3SW5kZXggPT0gMCkgewotCQkJCS8vIHdlIGFyZSBtb3ZpbmcgYSAnbnVsbCcgZW50cnkgb24gdG9wIG9mIHRoZSBzdGFuZGFsb25lLCBzbyByZW1vdmUgaXQKLQkJCQl0aGlzLnJlbW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigib2xkIGluZGV4ID0gIiArIG9sZEluZGV4ICsgIjsgbmV3IGluZGV4ID0gIiArIG5ld0luZGV4KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIGJ1aWxkIHRoZSBhcHByb3ByaWF0ZSBuZXcgYW5ub3RhdGlvbiwKLQkgKiB3aGljaCBtYXkgcmVxdWlyZSBtb3ZpbmcgdGhlIDB0aCBhbm5vdGF0aW9uIGZyb20gInN0YW5kLWFsb25lIiB0byAibmVzdGVkIgotCSAqLwotCXByaXZhdGUgQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uKEFubm90YXRpb25GYWN0b3J5IGFubm90YXRpb25GYWN0b3J5LCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmICh0aGlzLmdldEluZGV4KCkgPT0gIDApIHsKLQkJCXJldHVybiB0aGlzLm5ld1plcm9Bbm5vdGF0aW9uKGFubm90YXRpb25GYWN0b3J5LCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJaWYgKHRoaXMuemVyb05lc3RlZEFubm90YXRpb25Jc1ByZXNlbnQoZGVjbGFyYXRpb24pKSB7Ci0JCQkvLyBtYW5pcHVsYXRlIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiAtIGlnbm9yZSB0aGUgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbig/KQotCQkJLy8gQE91dGVyKGZvbz1ASW5uZXIoInplcm8iKSkgPT4gQE91dGVyKGZvbz17QElubmVyKCJ6ZXJvIiksIEBJbm5lcn0pCi0JCQkvLyAgICAgb3IKLQkJCS8vIEBPdXRlcihmb289e0BJbm5lcigiemVybyIpLCBASW5uZXIoIm9uZSIpfSkgPT4gQE91dGVyKGZvbz17QElubmVyKCJ6ZXJvIiksIEBJbm5lcn0pCi0JCQlyZXR1cm4gYW5ub3RhdGlvbkZhY3RvcnkubmV3QW5ub3RhdGlvbih0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQotCQkvLyB0aGlzIGlzIG9uZSBvZiB0d28gc2l0dWF0aW9ucyB3aGVyZSB3ZSB0cmFuc2l0aW9uIGZyb20gc3RhbmRhbG9uZSB0byBjb250YWluZXIKLQkJdGhpcy5tb3ZlU3RhbmRBbG9uZUFubm90YXRpb25Ub0NvbnRhaW5lckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkvLyBvbmNlIHRoZSBzdGFuZC1hbG9uZSBhbm5vdGF0aW9uIGlzIG1vdmVkIHRvIGluZGV4PTAsIGJ1aWxkIHRoZSBuZXcgYW5ub3RhdGlvbiBhdCBpbmRleD0xCi0JCXJldHVybiBhbm5vdGF0aW9uRmFjdG9yeS5uZXdBbm5vdGF0aW9uKHRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIsIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgaW5kZXggaXMgMCAtIGJ1aWxkIHRoZSBhcHByb3ByaWF0ZSBuZXcgYW5ub3RhdGlvbiwKLQkgKiB3aGljaCBtYXkgYmUgZWl0aGVyICJzdGFuZC1hbG9uZSIgb3IgIm5lc3RlZCIKLQkgKi8KLQlwcml2YXRlIEFubm90YXRpb24gbmV3WmVyb0Fubm90YXRpb24oQW5ub3RhdGlvbkZhY3RvcnkgYW5ub3RhdGlvbkZhY3RvcnksIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuc3RhbmRBbG9uZUFubm90YXRpb25Jc1ByZXNlbnQoZGVjbGFyYXRpb24pKSB7Ci0JCQkvLyByZXBsYWNlIHRoZSBzdGFuZC1hbG9uZSBhbm5vdGF0aW9uIC0gaWdub3JlIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbig/KQotCQkJLy8gQElubmVyKHRleHQ9ImxvcmVtIGlwc3VtIikgPT4gQElubmVyCi0JCQlyZXR1cm4gYW5ub3RhdGlvbkZhY3RvcnkubmV3QW5ub3RhdGlvbih0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlciwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCWlmICh0aGlzLmNvbnRhaW5lckFubm90YXRpb25Jc1ByZXNlbnQoZGVjbGFyYXRpb24pKSB7Ci0JCQkvLyBtYW5pcHVsYXRlIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbgotCQkJLy8gQE91dGVyKGZvbz1ASW5uZXIodGV4dD0ibG9yZW0gaXBzdW0iKSkgPT4gQE91dGVyKGZvbz1ASW5uZXIpCi0JCQlyZXR1cm4gYW5ub3RhdGlvbkZhY3RvcnkubmV3QW5ub3RhdGlvbih0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJLy8gbmVpdGhlciBhbm5vdGF0aW9uIGlzIHByZXNlbnQgLSBhZGQgYSBuZXcgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbgotCQlyZXR1cm4gYW5ub3RhdGlvbkZhY3RvcnkubmV3QW5ub3RhdGlvbih0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlciwgZGVjbGFyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIG1vdmUgdGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24gdG8gdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uIGF0IGluZGV4PTAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uVG9Db250YWluZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJQW5ub3RhdGlvbiBzdGFuZEFsb25lQW5ub3RhdGlvbiA9IHRoaXMuZ2V0U3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlpZiAoc3RhbmRBbG9uZUFubm90YXRpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24gaXMgbWlzc2luZyIpOwotCQl9Ci0JCXRoaXMubW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uVG9Db250YWluZXJBbm5vdGF0aW9uKHN0YW5kQWxvbmVBbm5vdGF0aW9uLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogbW92ZSB0aGUgc3BlY2lmaWVkLCBub24tbnVsbCwgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbiB0bwotCSAqIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiBhdCBpbmRleD0wCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vdmVTdGFuZEFsb25lQW5ub3RhdGlvblRvQ29udGFpbmVyQW5ub3RhdGlvbihBbm5vdGF0aW9uIHN0YW5kQWxvbmVBbm5vdGF0aW9uLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChzdGFuZEFsb25lQW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSkgewotCQkJdGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0gZWxzZSBpZiAoc3RhbmRBbG9uZUFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCUV4cHJlc3Npb24gdnYgPSAoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIHN0YW5kQWxvbmVBbm5vdGF0aW9uKS5nZXRWYWx1ZSgpOwotCQkJdnYgPSAoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh2di5nZXRBU1QoKSwgdnYpOwotCQkJdGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbikuc2V0VmFsdWUodnYpOwotCQl9IGVsc2UgaWYgKHN0YW5kQWxvbmVBbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQlOb3JtYWxBbm5vdGF0aW9uIG5ld05BID0gdGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzID0gdGhpcy52YWx1ZXMobmV3TkEpOwotCQkJZm9yIChNZW1iZXJWYWx1ZVBhaXIgcGFpciA6IHRoaXMudmFsdWVzKChOb3JtYWxBbm5vdGF0aW9uKSBzdGFuZEFsb25lQW5ub3RhdGlvbikpIHsKLQkJCQl2YWx1ZXMuYWRkKChNZW1iZXJWYWx1ZVBhaXIpIEFTVE5vZGUuY29weVN1YnRyZWUocGFpci5nZXRBU1QoKSwgcGFpcikpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBzdGFuZEFsb25lQW5ub3RhdGlvbik7Ci0JCX0KLQkJdGhpcy5yZW1vdmVTdGFuZEFsb25lQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHdoZXRoZXIgdGhlICJuZXN0ZWQiIGFubm90YXRpb24gY29udGFpbmVyIGhhcyBiZWVuIHJlZHVjZWQgdG8KLQkgKiBhIHNpbmdsZSBlbGVtZW50IChhbmQgdGhlIGFycmF5IGluaXRpYWxpemVyIGlzIGNvbnZlcnRlZCB0byBqdXN0Ci0JICogdGhlIHNpbmdsZSByZW1haW5pbmcgZWxlbWVudCkgYW5kIGNhbiBiZSBmdXJ0aGVyIGNvbnZlcnRlZCB0byB0aGUKLQkgKiAic3RhbmQtYWxvbmUiIGFubm90YXRpb246Ci0JICogPHByZT4KLQkgKiAgICAgJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIoInplcm8iKSwgJiM2NDtJbm5lcigib25lIil9KSA9PgotCSAqICAgICAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKCJ6ZXJvIikpID0+Ci0JICogICAgICYjNjQ7SW5uZXIoInplcm8iKQotCSAqIDwvcHJlPgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBuZXN0ZWRFbGVtZW50Q2FuQmVDb252ZXJ0ZWRUb1N0YW5kQWxvbmUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlBbm5vdGF0aW9uIGNvbnRhaW5lckFubm90YXRpb24gPSB0aGlzLmdldENvbnRhaW5lckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlpZiAoY29udGFpbmVyQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoY29udGFpbmVyQW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJaWYgKHRoaXMuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoInZhbHVlIikpIHsKLQkJCQlyZXR1cm4gKCgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgY29udGFpbmVyQW5ub3RhdGlvbikuZ2V0VmFsdWUoKS5nZXROb2RlVHlwZSgpICE9IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpCi0JCQkJCQkmJiAodGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbikgIT0gbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCU5vcm1hbEFubm90YXRpb24gbmEgPSAoTm9ybWFsQW5ub3RhdGlvbikgY29udGFpbmVyQW5ub3RhdGlvbjsKLQkJCWlmIChuYS52YWx1ZXMoKS5zaXplKCkgPT0gMCkgewotCQkJCXJldHVybiBmYWxzZTsgIC8vIHRoZXJlIGFyZSBubyBlbGVtZW50cyBwcmVzZW50Ci0JCQl9Ci0JCQlpZiAobmEudmFsdWVzKCkuc2l6ZSgpICE9IDEpIHsKLQkJCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMgcHJlc2VudCAtIGxlYXZlIHRoZW0gYWxsIGFsb25lCi0JCQl9Ci0JCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IChNZW1iZXJWYWx1ZVBhaXIpIG5hLnZhbHVlcygpLmdldCgwKTsKLQkJCWlmICh0aGlzLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgewotCQkJCXJldHVybiAocGFpci5nZXRWYWx1ZSgpLmdldE5vZGVUeXBlKCkgIT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikKLQkJCQkJCSYmICh0aGlzLnplcm9OZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSAhPSBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIGNvbnRhaW5lckFubm90YXRpb24pOwotCX0KLQotCS8qKgotCSAqIG1vdmUgdGhlIGFubm90YXRpb24gaW4gdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uIGF0IGluZGV4PTAKLQkgKiB0byB0aGUgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb252ZXJ0TGFzdEVsZW1lbnRBbm5vdGF0aW9uVG9TdGFuZEFsb25lQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUFubm90YXRpb24gbGFzdCA9IHRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlpZiAobGFzdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0aGUgbGFzdCBuZXN0ZWQgYW5ub3RhdGlvbiBpcyBtaXNzaW5nIik7Ci0JCX0gZWxzZSBpZiAobGFzdC5pc01hcmtlckFubm90YXRpb24oKSkgewotCQkJdGhpcy5uZXdTdGFuZEFsb25lTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0gZWxzZSBpZiAobGFzdC5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJRXhwcmVzc2lvbiB2diA9ICgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgbGFzdCkuZ2V0VmFsdWUoKTsKLQkJCXZ2ID0gKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodnYuZ2V0QVNUKCksIHZ2KTsKLQkJCXRoaXMubmV3U3RhbmRBbG9uZVNpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pLnNldFZhbHVlKHZ2KTsKLQkJfSBlbHNlIGlmIChsYXN0LmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQlOb3JtYWxBbm5vdGF0aW9uIG5ld05BID0gdGhpcy5uZXdTdGFuZEFsb25lTm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzID0gdGhpcy52YWx1ZXMobmV3TkEpOwotCQkJZm9yIChNZW1iZXJWYWx1ZVBhaXIgcGFpciA6IHRoaXMudmFsdWVzKChOb3JtYWxBbm5vdGF0aW9uKSBsYXN0KSkgewotCQkJCXZhbHVlcy5hZGQoKE1lbWJlclZhbHVlUGFpcikgQVNUTm9kZS5jb3B5U3VidHJlZShwYWlyLmdldEFTVCgpLCBwYWlyKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIGxhc3QpOwotCQl9Ci0JCXRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzdGFuZEFsb25lQW5ub3RhdGlvbklzUHJlc2VudChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldFN0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSAhPSBudWxsOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbiBnZXRTdGFuZEFsb25lQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIE1hcmtlckFubm90YXRpb24gbmV3U3RhbmRBbG9uZU1hcmtlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5zdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5ld1N0YW5kQWxvbmVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgTm9ybWFsQW5ub3RhdGlvbiBuZXdTdGFuZEFsb25lTm9ybWFsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlci5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RhbmRBbG9uZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlci5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb24gZ2V0TmVzdGVkQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCwgZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbmVyQW5ub3RhdGlvbklzUHJlc2VudChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lckFubm90YXRpb24oZGVjbGFyYXRpb24pICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGdldENvbnRhaW5lckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRPdXRlckFubm90YXRpb25BZGFwdGVyKCkuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHplcm9OZXN0ZWRBbm5vdGF0aW9uSXNQcmVzZW50KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WmVyb05lc3RlZEFubm90YXRpb24oZGVjbGFyYXRpb24pICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGdldFplcm9OZXN0ZWRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uTmFtZSgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzKE5vcm1hbEFubm90YXRpb24gbmEpIHsKLQkJcmV0dXJuIG5hLnZhbHVlcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhbm5vdGF0aW9uIGZhY3RvcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBkZWZpbmUgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHVzIHRvICJyZS11c2UiIHRoZSBuYXN0eSBjb2RlIGluCi0JICogI25ld0Fubm90YXRpb24oQW5ub3RhdGlvbkZhY3RvcnksIE1vZGlmaWVkRGVjbGFyYXRpb24pCi0JICovCi0JcHJpdmF0ZSBpbnRlcmZhY2UgQW5ub3RhdGlvbkZhY3RvcnkgewotCQlBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24oRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRmFjdG9yeSBNQVJLRVJfQU5OT1RBVElPTl9GQUNUT1JZID0gbmV3IEFubm90YXRpb25GYWN0b3J5KCkgewotCQlwdWJsaWMgQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYWRhcHRlciwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJcmV0dXJuIGFkYXB0ZXIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk1hcmtlckFubm90YXRpb25GYWN0b3J5IjsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRmFjdG9yeSBTSU5HTEVfTUVNQkVSX0FOTk9UQVRJT05fRkFDVE9SWSA9IG5ldyBBbm5vdGF0aW9uRmFjdG9yeSgpIHsKLQkJcHVibGljIEFubm90YXRpb24gbmV3QW5ub3RhdGlvbihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXJldHVybiBhZGFwdGVyLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRmFjdG9yeSI7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkZhY3RvcnkgTk9STUFMX0FOTk9UQVRJT05fRkFDVE9SWSA9IG5ldyBBbm5vdGF0aW9uRmFjdG9yeSgpIHsKLQkJcHVibGljIEFubm90YXRpb24gbmV3QW5ub3RhdGlvbihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXJldHVybiBhZGFwdGVyLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJOb3JtYWxBbm5vdGF0aW9uRmFjdG9yeSI7Ci0JCX0KLQl9OwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNzBjMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGEgZGVjbGFyYXRpb24gYW5ub3RhdGlvbiBlbGVtZW50IGFkYXB0ZXIgdGhhdCBkZWFscyB3aXRoIEFTVAotICogZXhwcmVzc2lvbnMsIGNvbnZlcnRpbmcgdGhlbSB0by9mcm9tIHZhcmlvdXMgb3RoZXIgb2JqZWN0cy4KLSAqIFQgaXMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byBiZSBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGJ5IHRoZSBhZGFwdGVyLgotICovCi1wdWJsaWMgY2xhc3MgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+Ci0JaW1wbGVtZW50cyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotewotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGFkYXB0ZXIgdGhhdCByZXR1cm5zIGFuZCB0YWtlcyBBU1QgZXhwcmVzc2lvbnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxFeHByZXNzaW9uPiBhZGFwdGVyOwotCi0JLyoqCi0JICogVGhlIGNvbnZlcnRlciB0aGF0IGNvbnZlcnRzIEFTVCBleHByZXNzaW9ucyB0byBvdGhlciBvYmplY3RzCi0JICogKGUuZy4gU3RyaW5ncykuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFQ+IGNvbnZlcnRlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSI7IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvCi0JICogcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBpcyByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiBjb252ZXJ0ZXIpIHsKLQkJdGhpcyhuZXcgRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEV4cHJlc3Npb24+KGFubm90YXRpb25BZGFwdGVyKSwgY29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW1vdmUgdGhlIGFubm90YXRpb24gd2hlbiB0aGUgbGFzdAotCSAqIGVsZW1lbnQgaXMgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiBjb252ZXJ0ZXIpIHsKLQkJdGhpcyhuZXcgRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEV4cHJlc3Npb24+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSksIGNvbnZlcnRlcik7Ci0JfQotCi0JcHVibGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiBjb252ZXJ0ZXIpIHsKLQkJdGhpcyhuZXcgRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEV4cHJlc3Npb24+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSksIGNvbnZlcnRlcik7Ci0JfQotCi0JcHVibGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxFeHByZXNzaW9uPiBhZGFwdGVyLCBFeHByZXNzaW9uQ29udmVydGVyPFQ+IGNvbnZlcnRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB0aGlzLmFkYXB0ZXIuZ2V0VmFsdWUoZGVjbGFyYXRpb24pOwotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXIuY29udmVydChleHByZXNzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjsKLQkJdHJ5IHsKLQkJCWV4cHJlc3Npb24gPSB0aGlzLmNvbnZlcnRlci5jb252ZXJ0KHZhbHVlLCBkZWNsYXJhdGlvbi5nZXRBc3QoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGNvbnZlcnRpbmcgdGhlICd2YWx1ZScgdG8gYW4gRXhwcmVzc2lvbiB3ZSBnZXQgdGhpcyBleGNlcHRpb24KLQkJCXJldHVybjsgIC8vIGRvbid0IHNldCB0aGUgdmFsdWUgaWYgaXQgaXMgImlsbGVnYWwiCi0JCX0KLQkJdGhpcy5hZGFwdGVyLnNldFZhbHVlKGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRFeHByZXNzaW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRBc3ROb2RlKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmFkYXB0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyAidmFsdWUiOyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwotCSAqIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgaXMgcmVtb3ZlZDsKLQkgKiB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIHN0cmluZyBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZvclN0cmluZ3MoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0Ci0JICogZWxlbWVudCBpcyByZW1vdmVkOyB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzCi0JICogc3RyaW5nIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZm9yU3RyaW5ncyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZXhwZWN0cyBzdHJpbmcgY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmb3JTdHJpbmdzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgYm9vbGVhbiByZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5KSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCByZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5LCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyAidmFsdWUiOyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwotCSAqIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgaXMgcmVtb3ZlZDsKLQkgKiB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIG51bWJlciBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBmb3JOdW1iZXJzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oYW5ub3RhdGlvbkFkYXB0ZXIsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0Ci0JICogZWxlbWVudCBpcyByZW1vdmVkOyB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzCi0JICogbnVtYmVyIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGZvck51bWJlcnMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZXhwZWN0cyBudW1iZXIgY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZm9yTnVtYmVycyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHksIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyAidmFsdWUiOyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwotCSAqIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgaXMgcmVtb3ZlZDsKLQkgKiB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIGJvb2xlYW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZm9yQm9vbGVhbnMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhbm5vdGF0aW9uQWRhcHRlciwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QKLQkgKiBlbGVtZW50IGlzIHJlbW92ZWQ7IHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMKLQkgKiBib29sZWFuIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGZvckJvb2xlYW5zKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMgYm9vbGVhbiBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBmb3JCb29sZWFucyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHksIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyAidmFsdWUiOyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwotCSAqIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgaXMgcmVtb3ZlZDsKLQkgKiB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIGNoYXJhY3RlciBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZvckNoYXJhY3RlcnMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBDaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0Ci0JICogZWxlbWVudCBpcyByZW1vdmVkOyB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzCi0JICogY2hhcmFjdGVyIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZm9yQ2hhcmFjdGVycyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIENoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZXhwZWN0cyBjaGFyYWN0ZXIgY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmb3JDaGFyYWN0ZXJzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgYm9vbGVhbiByZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5KSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCByZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5LCBDaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjZjZmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9EZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGNsZWFuIHVwIHNvbWUgb2YgdGhlIG5hc3R5IEVjbGlwc2UgYW5ub3RhdGlvbgotICogZm9ybWF0dGluZyAob3IgbGFjayB0aGVyZW9mKTsgZS5nLiBhcnJheXMgb2YgYW5ub3RhdGlvbnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIKLQlpbXBsZW1lbnRzIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRPRE8KLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoSURvY3VtZW50IGRvYywgVGV4dEVkaXQgZWRpdFRyZWUpIHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVRleHRFZGl0W10gZWRpdHMgPSBlZGl0VHJlZS5nZXRDaGlsZHJlbigpOwotCQlpbnQgbGVuID0gZWRpdHMubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCU11bHRpVGV4dEVkaXQgZXh0cmFFZGl0cyA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCVRleHRFZGl0IGVkaXQxID0gZWRpdHNbaV07Ci0JCQlpZiAoICEgKGVkaXQxIGluc3RhbmNlb2YgSW5zZXJ0RWRpdCkpIHsKLQkJCQljb250aW51ZTsgIC8vIGlmIHRoZSBlZGl0IGlzIG5vdCBhbiBpbnNlcnQsIHNraXAgdG8gdGhlIG5leHQgZWRpdAotCQkJfQotCQkJSW5zZXJ0RWRpdCBpbnNlcnQxID0gKEluc2VydEVkaXQpIGVkaXQxOwotCQkJaW50IGogPSBpICsgMTsKLQkJCWlmIChqIDwgbGVuKSB7Ci0JCQkJVGV4dEVkaXQgZWRpdDIgPSBlZGl0c1tqXTsKLQkJCQlpZiAoZWRpdDIgaW5zdGFuY2VvZiBJbnNlcnRFZGl0KSB7Ci0JCQkJCUluc2VydEVkaXQgaW5zZXJ0MiA9IChJbnNlcnRFZGl0KSBlZGl0MjsKLQkJCQkJU3RyaW5nIHRleHQxID0gaW5zZXJ0MS5nZXRUZXh0KCk7Ci0JCQkJCVN0cmluZyB0ZXh0MiA9IGluc2VydDIuZ2V0VGV4dCgpOwotCQkJCQlpbnQgb2Zmc2V0MSA9IGluc2VydDEuZ2V0T2Zmc2V0KCk7Ci0JCQkJCWludCBvZmZzZXQyID0gaW5zZXJ0Mi5nZXRPZmZzZXQoKTsKLQkJCQkJaWYgKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKHRleHQxKSAmJiB0ZXh0Mi5lcXVhbHMoIiAiKSkgewotCQkJCQkJLy8gYW4gYW5ub3RhdGlvbiB3YXMgaW5zZXJ0ZWQgYmVmb3JlIHNvbWV0aGluZyBvbiB0aGUgc2FtZSBsaW5lOwotCQkJCQkJLy8gcmVwbGFjZSB0aGUgdHJhaWxpbmcgc3BhY2Ugd2l0aCBhIG5ld2xpbmUgYW5kIGFwcHJvcHJpYXRlIGluZGVudAotCQkJCQkJZXh0cmFFZGl0cy5hZGRDaGlsZChuZXcgUmVwbGFjZUVkaXQob2Zmc2V0MiwgMSwgdGhpcy5idWlsZENSKGRvYywgb2Zmc2V0MikpKTsKLQkJCQkJCWkrKzsgIC8vIGp1bXAgdGhlIGluZGV4IHBhc3QgJ2VkaXQyJwotCQkJCQkJY29udGludWU7ICAvLyBnbyB0byB0aGUgbmV4dCBlZGl0Ci0JCQkJCX0KLQkJCQkJaW50IGNvbW1hMUxlbmd0aCA9IHRoaXMuY29tbWFMZW5ndGgodGV4dDEpOwotCQkJCQlpZiAoKGNvbW1hMUxlbmd0aCAhPSAwKSAmJiB0aGlzLnN0cmluZ0lzQW5ub3RhdGlvbih0ZXh0MikpIHsKLQkJCQkJCS8vIGFuIGFubm90YXRpb24gd2FzIGluc2VydGVkIGluIGFuIGFycmF5IGluaXRpYWxpemVyIG9uIHRoZQotCQkJCQkJLy8gc2FtZSBsaW5lIGFzIHRoZSBwcmV2aW91cyBhcnJheSBlbGVtZW50OwotCQkJCQkJLy8gcmVwbGFjZSB0aGUgcHJlY2VkaW5nIHNwYWNlIHdpdGggYSBuZXdsaW5lIGFuZCBhcHByb3ByaWF0ZSBpbmRlbnQKLQkJCQkJCWV4dHJhRWRpdHMuYWRkQ2hpbGQobmV3IFJlcGxhY2VFZGl0KG9mZnNldDEgKyBjb21tYTFMZW5ndGgsIHRleHQxLmxlbmd0aCgpIC0gY29tbWExTGVuZ3RoLCB0aGlzLmJ1aWxkQ1IoZG9jLCBvZmZzZXQxKSkpOwotCQkJCQkJaSsrOyAgLy8ganVtcCB0aGUgaW5kZXggcGFzdCAnZWRpdDInCi0JCQkJCQljb250aW51ZTsgIC8vIGdvIHRvIHRoZSBuZXh0IGVkaXQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXRoaXMuZm9ybWF0QXJyYXlJbml0aWFsaXplcihkb2MsIGluc2VydDEsIGV4dHJhRWRpdHMpOwotCQl9Ci0JCWV4dHJhRWRpdHMuYXBwbHkoZG9jLCBUZXh0RWRpdC5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgaW5zZXJ0IGVkaXQgaXMgaW5zZXJ0aW5nIGFuIGFubm90YXRpb24gY29udGFpbmluZyBhbiBhcnJheSBvZiBhbm5vdGF0aW9ucyBhcwotCSAqIGl0cyB2YWx1ZSB0aGVuIGZvcm1hdCB0aGVtIG5pY2VseS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZm9ybWF0QXJyYXlJbml0aWFsaXplcihJRG9jdW1lbnQgZG9jLCBJbnNlcnRFZGl0IGluc2VydEVkaXQsIE11bHRpVGV4dEVkaXQgZXh0cmFFZGl0cykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHMgPSBpbnNlcnRFZGl0LmdldFRleHQoKTsKLQkJaWYgKCAhIHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKHMpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCWludCBwb3MgPSAxOyAgLy8gc2tpcCAnQCcKLQkJd2hpbGUgKHBvcyA8IGxlbikgewotCQkJY2hhciBjID0gcy5jaGFyQXQocG9zKTsKLQkJCXBvcysrOyAgLy8gYnVtcCB0byBqdXN0IHBhc3QgZmlyc3QgJygnCi0JCQlpZiAoYyA9PSAnKCcpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocG9zID09IGxlbikgewotCQkJcmV0dXJuOyAgLy8gcmVhY2hlZCBlbmQgb2Ygc3RyaW5nCi0JCX0KLQkJd2hpbGUgKHBvcyA8IGxlbikgewotCQkJY2hhciBjID0gcy5jaGFyQXQocG9zKTsKLQkJCXBvcysrOyAgLy8gYnVtcCB0byBqdXN0IHBhc3QgZmlyc3QgJ3snCi0JCQlpZiAoYyA9PSAneycpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjICE9ICcgJykgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAocG9zID09IGxlbikgewotCQkJcmV0dXJuOyAgLy8gcmVhY2hlZCBlbmQgb2Ygc3RyaW5nCi0JCX0KLQkJLy8gbm93IGxvb2sgZm9yICdAJyBub3QgaW5zaWRlIHBhcmVudGhlc2VzIGFuZCBwdXQgaW4gCi0JCS8vIGxpbmUgZGVsaW1ldGVyIGFuZCBpbmRlbnQgc3RyaW5nIGJlZm9yZSBlYWNoCi0JCWludCBvZmZzZXQgPSBpbnNlcnRFZGl0LmdldE9mZnNldCgpOwotCQlTdHJpbmcgaW5kZW50ID0gbnVsbDsKLQkJaW50IHBhcmVuRGVwdGggPSAwOwotCQl3aGlsZSAocG9zIDwgbGVuKSB7Ci0JCQlzd2l0Y2ggKHMuY2hhckF0KHBvcykpIHsKLQkJCQljYXNlICcoJyA6Ci0JCQkJCXBhcmVuRGVwdGgrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnKScgOgotCQkJCQlwYXJlbkRlcHRoLS07Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ0AnIDoKLQkJCQkJaWYgKHBhcmVuRGVwdGggPT0gMCkgewotCQkJCQkJaWYgKGluZGVudCA9PSBudWxsKSB7Ci0JCQkJCQkJaW5kZW50ID0gdGhpcy5idWlsZENSKGRvYywgb2Zmc2V0LCAiXHQiKTsgIC8vIFRPRE8gdXNlIHRhYiBwcmVmZXJlbmNlPwotCQkJCQkJfQotCQkJCQkJZXh0cmFFZGl0cy5hZGRDaGlsZChuZXcgSW5zZXJ0RWRpdChvZmZzZXQgKyBwb3MsIGluZGVudCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ30nIDoKLQkJCQkJaWYgKHBhcmVuRGVwdGggPT0gMCkgewotCQkJCQkJZXh0cmFFZGl0cy5hZGRDaGlsZChuZXcgSW5zZXJ0RWRpdChvZmZzZXQgKyBwb3MsIHRoaXMuYnVpbGRDUihkb2MsIG9mZnNldCkpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXBvcysrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBzdHJpbmcgY29udGFpbmluZyBhIGxpbmUgZGVsaW1ldGVyIGFuZCBpbmRlbnRpbmcgY2hhcmFjdGVycyAKLQkgKiBtYXRjaGluZyB0aGUgaW5kZW50IGxldmVsIG9mIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlciBvZmZzZXQKLQkgKiAoaS5lLiB0aGUgbmV3IGxpbmUncyBpbmRlbnQgbWF0Y2hlcyB0aGUgY3VycmVudCBsaW5lKS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBidWlsZENSKElEb2N1bWVudCBkb2MsIGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ1IoZG9jLCBvZmZzZXQsICIiKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZENSKElEb2N1bWVudCBkb2MsIGludCBvZmZzZXQsIFN0cmluZyBzdWZmaXgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChvZmZzZXQpOwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKGRvYy5nZXRMaW5lRGVsaW1pdGVyKGxpbmUpKTsgIC8vIHVzZSBzYW1lIENSIGFzIGN1cnJlbnQgbGluZQotCi0JCWludCBvID0gZG9jLmdldExpbmVPZmZzZXQobGluZSk7ICAvLyBtYXRjaCB0aGUgd2hpdGVzcGFjZSBvZiB0aGUgY3VycmVudCBsaW5lCi0JCWNoYXIgYyA9IGRvYy5nZXRDaGFyKG8rKyk7Ci0JCXdoaWxlICgoYyA9PSAnICcpIHx8IChjID09ICdcdCcpKSB7Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCQljID0gZG9jLmdldENoYXIobysrKTsKLQkJfQotCQlzYi5hcHBlbmQoc3VmZml4KTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYW4gYW5ub3RhdGlvbi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc3RyaW5nSXNBbm5vdGF0aW9uKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIChzdHJpbmcubGVuZ3RoKCkgPiAxKSAmJiBzdHJpbmcuY2hhckF0KDApID09ICdAJzsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBhIHNpbmdsZSBjb21tYSwgcG9zc2libHkgc3Vycm91bmRlZCBieQotCSAqIHNwYWNlcywgcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHN1YnN0cmluZyBjb250YWluaW5nIHRoZQotCSAqIGluaXRpYWwgc3BhY2VzIGFuZCB0aGUgY29tbWEuCi0JICovCi0JcHJpdmF0ZSBpbnQgY29tbWFMZW5ndGgoU3RyaW5nIHN0cmluZykgewotCQlib29sZWFuIGNvbW1hID0gZmFsc2U7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWludCByZXN1bHQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlzd2l0Y2ggKHN0cmluZy5jaGFyQXQoaSkpIHsKLQkJCQljYXNlICcgJyA6Ci0JCQkJCWlmICggISBjb21tYSkgewotCQkJCQkJcmVzdWx0Kys7ICAvLyBzcGFjZSBwcmVjZWRpbmcgY29tbWEKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlICcsJyA6Ci0JCQkJCWlmIChjb21tYSkgewotCQkJCQkJcmV0dXJuIDA7ICAvLyBzZWNvbmQgY29tbWEhCi0JCQkJCX0KLQkJCQkJY29tbWEgPSB0cnVlOwotCQkJCQlyZXN1bHQrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIDA7ICAvLyBub24tY29tbWEsIG5vbi1zcGFjZSBjaGFyCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzlkZWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi0vKioKLSAqIFdyYXAgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlciBhbmQgc2ltcGx5Ci0gKiBhZGQgYW4gaW1wb3J0IGZvciB0aGUgZW51bXMgd2hlbiBuZWNlc3NhcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcgotCWltcGxlbWVudHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+Ci17Ci0JLyoqCi0JICogVGhlIHdyYXBwZWQgYWRhcHRlciB0aGF0IHJldHVybnMgYW5kIHRha2VzIG5hbWUgc3RyaW5ncyAoZW51bXMpLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZGFwdGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSI7IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvCi0JICogcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBpcyByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXRoaXMoYW5ub3RhdGlvbkFkYXB0ZXIsICJ2YWx1ZSIpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0Ci0JICogZWxlbWVudCBpcyByZW1vdmVkIGFuZCByZW1vdmUgdGhlIGFycmF5IGluaXRpYWxpemVyIGlmIGl0IGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgaWYgaXQgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgYm9vbGVhbiByZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5KSB7Ci0JCXRoaXMoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCByZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBib29sZWFuIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHksIGJvb2xlYW4gcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSkgewotCQl0aGlzKG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSwgYnVpbGRFeHByZXNzaW9uQ29udmVydGVyKHJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHkpKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmdbXT4gYnVpbGRFeHByZXNzaW9uQ29udmVydGVyKGJvb2xlYW4gcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSwgcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWRhcHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBpZ25vcmUgdGhlIGFkYXB0ZXIncyBnZXRWYWx1ZSgpIC0gd2Ugd2FudCB0aGUgZXhwcmVzc2lvbgotCQlyZXR1cm4gdGhpcy5yZXNvbHZlKHRoaXMuYWRhcHRlci5nZXRFeHByZXNzaW9uKGRlY2xhcmF0aW9uKSwgZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZ1tdIHZhbHVlLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuYWRhcHRlci5zZXRWYWx1ZSh0aGlzLmNvbnZlcnRUb1Nob3J0TmFtZXModmFsdWUsIGRlY2xhcmF0aW9uKSwgZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEV4cHJlc3Npb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEFzdE5vZGUoZGVjbGFyYXRpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIHJlc29sdmUgdGhlIGVudW1zLCB3aGljaCBjYW4gYmUKLQkgKiAgICAgbnVsbAotCSAqIG9yCi0JICogICAgIHtGT08sIEJBUiwgQkFafQotCSAqIG9yCi0JICogICAgIEZPTwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSByZXNvbHZlKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HX0FSUkFZOwotCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZXNvbHZlQXJyYXkoKEFycmF5SW5pdGlhbGl6ZXIpIGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0aGlzLnJlc29sdmVTaW5nbGVFbGVtZW50KGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSByZXNvbHZlQXJyYXkoQXJyYXlJbml0aWFsaXplciBhaSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucyhhaSk7Ci0JCWludCBsZW4gPSBleHByZXNzaW9ucy5zaXplKCk7Ci0JCVN0cmluZ1tdIGVudW1zID0gbmV3IFN0cmluZ1tsZW5dOwotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCWVudW1zW2ldID0gdGhpcy5yZXNvbHZlRW51bShleHByZXNzaW9ucy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiBlbnVtczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gcmVzb2x2ZVNpbmdsZUVsZW1lbnQoRXhwcmVzc2lvbiBlbnVtRXhwcmVzc2lvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHt0aGlzLnJlc29sdmVFbnVtKGVudW1FeHByZXNzaW9uKX07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlRW51bShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIEpEVFRvb2xzLnJlc29sdmVFbnVtKGV4cHJlc3Npb24pOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyhBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIpIHsKLQkJcmV0dXJuIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZXJ0IHRoZSBmdWxseS1xdWFsaWZpZWQgZW51bXMgdG8gc3RhdGljIGltcG9ydHMgYW5kIHNob3J0IG5hbWVzOwotCSAqIE5COiB0aGUgaW1wb3J0cyBhcmUgYWRkZWQgYXMgYSBzaWRlLWVmZmVjdCA6LSgKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gY29udmVydFRvU2hvcnROYW1lcyhTdHJpbmdbXSBlbnVtcywgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAoZW51bXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IGxlbiA9IGVudW1zLmxlbmd0aDsKLQkJU3RyaW5nW10gc2hvcnROYW1lcyA9IG5ldyBTdHJpbmdbbGVuXTsKLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlkZWNsYXJhdGlvbi5hZGRTdGF0aWNJbXBvcnQoZW51bXNbaV0pOyAgLy8gZS5nLiAiamF2YXgucGVyc2lzdGVuY2UuQ2FzY2FkZVR5cGUuUkVGUkVTSCIKLQkJCXNob3J0TmFtZXNbaV0gPSB0aGlzLnNob3J0TmFtZShlbnVtc1tpXSk7ICAvLyBlLmcuICJFQUdFUiIKLQkJfQotCQlyZXR1cm4gc2hvcnROYW1lczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNob3J0VHlwZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzaG9ydE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWZiOTZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi0vKioKLSAqIFdyYXAgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlciBhbmQgc2ltcGx5Ci0gKiBhZGQgYW4gaW1wb3J0IGZvciB0aGUgZW51bSB3aGVuIG5lY2Vzc2FyeS4KLSAqLwotcHVibGljIGNsYXNzIEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcgotCWltcGxlbWVudHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPgotewotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGFkYXB0ZXIgdGhhdCByZXR1cm5zIGFuZCB0YWtlcyBuYW1lIHN0cmluZ3MgKGVudW1zKS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyAidmFsdWUiOyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwotCSAqIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgaXMgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgInZhbHVlIik7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QKLQkgKiBlbGVtZW50IGlzIHJlbW92ZWQuCi0JICovCi0JcHVibGljIEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBib29sZWFuIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHkpIHsKLQkJdGhpcyhuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCByZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5LCBOYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5yZXNvbHZlKHRoaXMuYWRhcHRlci5nZXRFeHByZXNzaW9uKGRlY2xhcmF0aW9uKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuYWRhcHRlci5zZXRWYWx1ZSh0aGlzLmNvbnZlcnRUb1Nob3J0TmFtZSh2YWx1ZSwgZGVjbGFyYXRpb24pLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIEFTVE5vZGUgZ2V0QXN0Tm9kZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0QXN0Tm9kZShkZWNsYXJhdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogcmVzb2x2ZSB0aGUgZW51bQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIEpEVFRvb2xzLnJlc29sdmVFbnVtKGV4cHJlc3Npb24pOwotCX0KLQotCS8qKgotCSAqIGNvbnZlcnQgdGhlIGZ1bGx5LXF1YWxpZmllZCBlbnVtIHRvIGEgc3RhdGljIGltcG9ydCBhbmQgaXRzIHNob3J0IG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1Nob3J0TmFtZShTdHJpbmcgc3RyaW5nLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZGVjbGFyYXRpb24uYWRkU3RhdGljSW1wb3J0KHN0cmluZyk7ICAvLyBlLmcuICJqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGUuRUFHRVIiCi0JCXJldHVybiB0aGlzLnNob3J0TmFtZShzdHJpbmcpOyAgLy8gZS5nLiAiRUFHRVIiCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzaG9ydFR5cGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcuJykpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgc2hvcnROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmYmQzMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIE1vc3Qgb2J2aW91cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlLgotICogQXNzdW1lIHRoZSBlbGVtZW50J3MgdmFsdWUgaXMgYW4gRXhwcmVzc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxFIGV4dGVuZHMgRXhwcmVzc2lvbj4KLQlpbXBsZW1lbnRzIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEU+Ci17Ci0JLyoqCi0JICogQWRhcHRlciB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGVsZW1lbnQncyBhbm5vdGF0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcjsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSByZWxldmFudCBhbm5vdGF0aW9uIGVsZW1lbnQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWU7Ci0KLQkvKioKLQkgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGVsZW1lbnQncyBhbm5vdGF0aW9uIGlzIHRvIGJlCi0JICogY29tcGxldGVseSByZW1vdmVkIGlmLCB3aGVuIHRoZSBlbGVtZW50IGl0c2VsZiBpcyByZW1vdmVkLAotCSAqIHRoZSBhbm5vdGF0aW9uIGhhcyBubyByZW1haW5pbmcgZWxlbWVudHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyAidmFsdWUiOyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwotCSAqIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgaXMgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgInZhbHVlIik7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSIuCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBib29sZWFuIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHkpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgInZhbHVlIiwgcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QKLQkgKiBlbGVtZW50IGlzIHJlbW92ZWQuCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBib29sZWFuIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlciA9IGFubm90YXRpb25BZGFwdGVyOwotCQl0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0JCXRoaXMucmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSA9IHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBFIGdldFZhbHVlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gcmV0dXJuIHRoZSBleHByZXNzaW9uIHVubW9kaWZpZWQKLQkJcmV0dXJuIHRoaXMuZ2V0RXhwcmVzc2lvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRSB2YWx1ZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLnNldFZhbHVlKHZhbHVlLCB0aGlzLmFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIEUgZ2V0RXhwcmVzc2lvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmV4cHJlc3Npb24odGhpcy5hbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSk7Ci0JfQotCi0JcHVibGljIEFTVE5vZGUgZ2V0QXN0Tm9kZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUV4cHJlc3Npb24gZXhwID0gdGhpcy5nZXRFeHByZXNzaW9uKGRlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIChleHAgIT0gbnVsbCkgPyBleHAgOiB0aGlzLmFubm90YXRpb25BZGFwdGVyLmdldEFzdE5vZGUoZGVjbGFyYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZWxlbWVudE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHByZXNzaW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICogKEFuIGVsZW1lbnQgbmFtZSBvZiAidmFsdWUiIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZQotCSAqIG1lbWJlciBhbm5vdGF0aW9uLikKLQkgKi8KLQlwcm90ZWN0ZWQgRSBleHByZXNzaW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5leHByZXNzaW9uTm9Bbm5vdGF0aW9uKCk7Ci0JCX0KLQkJaWYgKGFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiB0aGlzLmV4cHJlc3Npb25NYXJrZXJBbm5vdGF0aW9uKChNYXJrZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKTsKLQkJfQotCQlpZiAoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvblNpbmdsZU1lbWJlckFubm90YXRpb24oKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb24pOwotCQl9Ci0JCWlmIChhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQlyZXR1cm4gdGhpcy5leHByZXNzaW9uTm9ybWFsQW5ub3RhdGlvbigoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRSBleHByZXNzaW9uTm9Bbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBFIGV4cHJlc3Npb25NYXJrZXJBbm5vdGF0aW9uKE1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBFIGV4cHJlc3Npb25TaW5nbGVNZW1iZXJBbm5vdGF0aW9uKFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5kb3duY2FzdCh0aGlzLmVsZW1lbnROYW1lLmVxdWFscygidmFsdWUiKSA/IGFubm90YXRpb24uZ2V0VmFsdWUoKSA6IG51bGwpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRSBkb3duY2FzdChFeHByZXNzaW9uIGUpIHsKLQkJcmV0dXJuIChFKSBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEUgZXhwcmVzc2lvbk5vcm1hbEFubm90YXRpb24oTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbik7Ci0JCXJldHVybiB0aGlzLmRvd25jYXN0KChwYWlyID09IG51bGwpID8gbnVsbCA6IHBhaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNldCB2YWx1ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzZXQgbm9uLW51bGwsIG5vbi1lbXB0eSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEV4cHJlc3Npb24gdmFsdWUsIEFubm90YXRpb24gYW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50KGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXRoaXMuc2V0VmFsdWVOb0Fubm90YXRpb24odmFsdWUsIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnNldFZhbHVlTWFya2VyQW5ub3RhdGlvbih2YWx1ZSwgKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnNldFZhbHVlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbih2YWx1ZSwgKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnNldFZhbHVlTm9ybWFsQW5ub3RhdGlvbih2YWx1ZSwgKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgYW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhZGQgbm9uLW51bGwsIG5vbi1lbXB0eSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlTm9Bbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKCJ2YWx1ZSIpKSB7Ci0JCQkvLyBARm9vKCJ4eHgiKQotCQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlci5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBARm9vKGJhcj0ieHh4IikKLQkJCXRoaXMuYWRkVmFsdWUodmFsdWUsIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWUoRXhwcmVzc2lvbiB2YWx1ZSwgTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXRoaXMuYWRkVmFsdWUodmFsdWUsIGFubm90YXRpb24sIHRoaXMuZWxlbWVudE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKEV4cHJlc3Npb24gdmFsdWUsIE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGFubm90YXRpb25FbGVtZW50TmFtZSkgewotCQlBU1QgYXN0ID0gYW5ub3RhdGlvbi5nZXRBU1QoKTsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSBhc3QubmV3TWVtYmVyVmFsdWVQYWlyKCk7Ci0JCXBhaXIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZShhbm5vdGF0aW9uRWxlbWVudE5hbWUpKTsKLQkJcGFpci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMgPSB0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKTsKLQkJdmFsdWVzLmFkZChwYWlyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVNYXJrZXJBbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUsIE1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBARm9vID0+IEBGb28oInh4eCIpCi0JCS8vICAgICBvcgotCQkvLyBARm9vID0+IEBGb28oYmFyPSJ4eHgiKQotCQl0aGlzLnNldFZhbHVlTm9Bbm5vdGF0aW9uKHZhbHVlLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUsIFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAodGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoInZhbHVlIikpIHsKLQkJCS8vIEBGb28oInl5eSIpID0+IEBGb28oInh4eCIpCi0JCQlhbm5vdGF0aW9uLnNldFZhbHVlKHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCS8vIEBGb28oInl5eSIpID0+IEBGb28odmFsdWU9Inl5eSIsIGJhcj0ieHh4IikKLQkJCUV4cHJlc3Npb24gdnYgPSBhbm5vdGF0aW9uLmdldFZhbHVlKCk7Ci0JCQl2diA9IChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZ2LmdldEFTVCgpLCB2dik7Ci0JCQlOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSB0aGlzLmFubm90YXRpb25BZGFwdGVyLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJdGhpcy5hZGRWYWx1ZSh2diwgbm9ybWFsQW5ub3RhdGlvbiwgInZhbHVlIik7Ci0JCQl0aGlzLmFkZFZhbHVlKHZhbHVlLCBub3JtYWxBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlTm9ybWFsQW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlLCBOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSB0aGlzLm1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uKTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkgewotCQkJdGhpcy5hZGRWYWx1ZSh2YWx1ZSwgYW5ub3RhdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWlyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZWxlbWVudCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50KEFubm90YXRpb24gYW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZUVsZW1lbnROb0Fubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9Ci0JCWVsc2UgaWYgKGFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMucmVtb3ZlRWxlbWVudE1hcmtlckFubm90YXRpb24oKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnJlbW92ZUVsZW1lbnRTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50Tm9ybWFsQW5ub3RhdGlvbigoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnROb0Fubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGdvbmUgKD8pCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudE1hcmtlckFubm90YXRpb24oTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgZ29uZSAoPykKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKCJ2YWx1ZSIpKSB7Ci0JCQlpZiAodGhpcy5yZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5KSB7Ci0JCQkJLy8gQEZvbygieHh4IikgPT4gCi0JCQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlci5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQEZvbygieHh4IikgPT4gQEZvbwotCQkJCXRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGUgW25vbi0ndmFsdWUnXSBlbGVtZW50IGlzIGFscmVhZHkgZ29uZSAoPykKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnROb3JtYWxBbm5vdGF0aW9uKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzID0gdGhpcy52YWx1ZXMoYW5ub3RhdGlvbik7Ci0JCWlmICgodmFsdWVzLnNpemUoKSA9PSAxKSAmJiB2YWx1ZXMuZ2V0KDApLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHModGhpcy5lbGVtZW50TmFtZSkpIHsKLQkJCWlmICh0aGlzLnJlbW92ZUFubm90YXRpb25XaGVuRW1wdHkpIHsKLQkJCQkvLyBARm9vKGJhcj0ieHh4IikgPT4gCi0JCQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlci5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQEZvbyhiYXI9Inh4eCIpID0+IEBGb28KLQkJCQl0aGlzLmFubm90YXRpb25BZGFwdGVyLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50KGFubm90YXRpb24pOwotCQkJaWYgKHZhbHVlcy5zaXplKCkgPT0gMSkgewotCQkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdmFsdWVzLmdldCgwKTsKLQkJCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKCJ2YWx1ZSIpKSB7Ci0JCQkJCS8vIEBGb28oYmFyPSJ4eHgiLCB2YWx1ZT0ieXl5IikgPT4gQEZvbygieXl5IikKLQkJCQkJRXhwcmVzc2lvbiB2diA9IHBhaXIuZ2V0VmFsdWUoKTsKLQkJCQkJdnYgPSAoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh2di5nZXRBU1QoKSwgdnYpOwotCQkJCQl0aGlzLmFubm90YXRpb25BZGFwdGVyLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pLnNldFZhbHVlKHZ2KTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBARm9vKGJhcj0ieHh4IiwgYmF6PSJ5eXkiKSA9PiBARm9vKGJhej0ieXl5IikKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIEBGb28oYmFyPSJ4eHgiLCBiYXo9Inl5eSIsIGpvbz0ieHh4IikgPT4gQEZvbyhiYXo9Inl5eSIsIGpvbz0ieHh4IikKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgKmZpcnN0KiBtZW1iZXIgdmFsdWUgcGFpciBmcm9tIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50KE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yPE1lbWJlclZhbHVlUGFpcj4gc3RyZWFtID0gdGhpcy52YWx1ZXMoYW5ub3RhdGlvbikuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHRoaXMuZWxlbWVudE5hbWUpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAqZmlyc3QqIG1lbWJlciB2YWx1ZSBwYWlyIGZvciB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJZm9yIChNZW1iZXJWYWx1ZVBhaXIgcGFpciA6IHRoaXMudmFsdWVzKGFubm90YXRpb24pKSB7Ci0JCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHRoaXMuZWxlbWVudE5hbWUpKSB7Ci0JCQkJcmV0dXJuIHBhaXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMoTm9ybWFsQW5ub3RhdGlvbiBuYSkgewotCQlyZXR1cm4gbmEudmFsdWVzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvR2VuZXJpY1Zpc2l0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9HZW5lcmljVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzc1M2QxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9HZW5lcmljVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlDcmVhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bc3NlcnRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFzc2lnbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5CbG9ja0NvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5CcmVha1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2FzdEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNhdGNoQ2xhdXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DaGFyYWN0ZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DbGFzc0luc3RhbmNlQ3JlYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29uZGl0aW9uYWxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db25zdHJ1Y3Rvckludm9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbnRpbnVlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Eb1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW1wdHlTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVuaGFuY2VkRm9yU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZEFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRm9yU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JZlN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW1wb3J0RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkluZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkluc3RhbmNlb2ZFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5KYXZhZG9jOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5MYWJlbGVkU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5MaW5lQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2RJbnZvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2RSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZFJlZlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bGxMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhcmFtZXRlcml6ZWRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUG9zdGZpeEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlByZWZpeEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlByaW1pdGl2ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlJldHVyblN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN1cGVyRmllbGRBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN1cGVyTWV0aG9kSW52b2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3dpdGNoQ2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3dpdGNoU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TeW5jaHJvbml6ZWRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRhZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UaGlzRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGhyb3dTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRyeVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5XaGlsZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uV2lsZGNhcmRUeXBlOwotCi0vL2NvcGllZCBmcm9tICBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LmRvbS5HZW5lcmljVmlzaXRvcgotLy9kZWxldGVkIGNvZGUgdG8gbGltaXQgdGhlIG51bWJlciBvZiBjbGFzc2VzIEkgaGFkIHRvIGNvcHkKLXB1YmxpYyBjbGFzcyBHZW5lcmljVmlzaXRvciBleHRlbmRzIEFTVFZpc2l0b3IgewotCQotCXB1YmxpYyBHZW5lcmljVmlzaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlzaXRKYXZhZG9jVGFncyA8Y29kZT50cnVlPC9jb2RlPiBpZiBkb2MgY29tbWVudCB0YWdzIGFyZQotCSAqIHRvIGJlIHZpc2l0ZWQgYnkgZGVmYXVsdCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2VlIEphdmFkb2MjdGFncygpCi0JICogQHNlZSAjdmlzaXQoSmF2YWRvYykKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIEdlbmVyaWNWaXNpdG9yKGJvb2xlYW4gdmlzaXRKYXZhZG9jVGFncykgewotCQlzdXBlcih2aXNpdEphdmFkb2NUYWdzKTsKLQl9Ci0JCi0JLy8tLS0tIEhvb2tzIGZvciBzdWJjbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCXByb3RlY3RlZCBib29sZWFuIHZpc2l0Tm9kZShBU1ROb2RlIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZFZpc2l0Tm9kZShBU1ROb2RlIG5vZGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUFjY2VzcyBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlUeXBlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXNzaWdubWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEJsb2NrIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChCcmVha1N0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2F0Y2hDbGF1c2Ugbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ29udGludWVTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChEb1N0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEVtcHR5U3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRmllbGREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEZvclN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KElmU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSW1wb3J0RGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbnN0YW5jZW9mRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEluaXRpYWxpemVyIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSmF2YWRvYyBub2RlKSB7Ci0JCXJldHVybiAoc3VwZXIudmlzaXQobm9kZSkpID8gdmlzaXROb2RlKG5vZGUpIDogZmFsc2U7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE51bWJlckxpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYWNrYWdlRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBvc3RmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFByaW1pdGl2ZVR5cGUgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChRdWFsaWZpZWROYW1lIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU2ltcGxlTmFtZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbXBsZVR5cGUgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlckZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3dpdGNoQ2FzZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN3aXRjaFN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN5bmNocm9uaXplZFN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFRoaXNFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVGhyb3dTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUcnlTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChXaGlsZVN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQmxvY2tDb21tZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRW5oYW5jZWRGb3JTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEVudW1EZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KExpbmVDb21tZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTWFya2VyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE1lbWJlclJlZiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE1lbWJlclZhbHVlUGFpciBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZFJlZiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZFJlZlBhcmFtZXRlciBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE1vZGlmaWVyIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTm9ybWFsQW5ub3RhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBhcmFtZXRlcml6ZWRUeXBlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkVHlwZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbmdsZU1lbWJlckFubm90YXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUYWdFbGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVGV4dEVsZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlUGFyYW1ldGVyIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoV2lsZGNhcmRUeXBlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheUFjY2VzcyBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlUeXBlIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBc3NlcnRTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFzc2lnbm1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJsb2NrIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDYXRjaENsYXVzZSBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDb21waWxhdGlvblVuaXQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDb250aW51ZVN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRG9TdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEVtcHR5U3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRmllbGREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRm9yU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJZlN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSW1wb3J0RGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEluZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEluaXRpYWxpemVyIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChKYXZhZG9jIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChMYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTnVsbExpdGVyYWwgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE51bWJlckxpdGVyYWwgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhY2thZ2VEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBvc3RmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQcmVmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQcmltaXRpdmVUeXBlIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChRdWFsaWZpZWROYW1lIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbXBsZU5hbWUgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbXBsZVR5cGUgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN0cmluZ0xpdGVyYWwgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdXBlckZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN3aXRjaENhc2Ugbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN3aXRjaFN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3luY2hyb25pemVkU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUaGlzRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVGhyb3dTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRyeVN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChXaGlsZVN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQmxvY2tDb21tZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbmhhbmNlZEZvclN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEVudW1EZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTGluZUNvbW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1hcmtlckFubm90YXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1lbWJlclJlZiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTWVtYmVyVmFsdWVQYWlyIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2RSZWYgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1ldGhvZFJlZlBhcmFtZXRlciBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTW9kaWZpZXIgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE5vcm1hbEFubm90YXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhcmFtZXRlcml6ZWRUeXBlIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChRdWFsaWZpZWRUeXBlIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUYWdFbGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUZXh0RWxlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZVBhcmFtZXRlciBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoV2lsZGNhcmRUeXBlIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUQXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTU5MDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotCi0vKioKLSAqIENvbWJpbmUgYmVoYXZpb3IgY29tbW9uIHRvIEpEVEZpZWxkQXR0cmlidXRlIGFuZCBKRFRNZXRob2RBdHRyaWJ1dGUuCi0gKiBOb3Qgc28gc3VyZSB0aGlzIGlzIHVzZWZ1bC4uLi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpEVEF0dHJpYnV0ZQotCWV4dGVuZHMgSkRUTWVtYmVyCi0JaW1wbGVtZW50cyBBdHRyaWJ1dGUKLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBKRFRBdHRyaWJ1dGUoCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlTdHJpbmcgbmFtZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKSB7Ci0JCXN1cGVyKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVEF0dHJpYnV0ZSgKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCVN0cmluZyBuYW1lLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTWVtYmVyL0F0dHJpYnV0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNZXRob2QoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFR5cGVEZWNsYXJhdGlvbiBnZXREZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gYXNzdW1lIHRoZSBkZWNsYXJpbmcgdHlwZSBpcyBub3QgYW4gZW51bSBvciBhbm5vdGF0aW9uCi0JCS8vIHNpbmNlIHRoZXkgZG8gbm90IGhhdmUgZmllbGQgb3IgbWV0aG9kIGRlY2xhcmF0aW9ucwotCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEZpZWxkQXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRURmllbGRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjYmVjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRURmllbGRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVZhcmlhYmxlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkZpZWxkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXI7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCBmaWVsZC4KLSAqIEF0dHJpYnV0ZSBiYXNlZCBvbiBhIEphdmEgZmllbGQsIGUuZy4KLSAqICAgICBwcml2YXRlIGludCBmb287Ci0gKi8KLXB1YmxpYyBjbGFzcyBKRFRGaWVsZEF0dHJpYnV0ZQotCWV4dGVuZHMgSkRUQXR0cmlidXRlCi0JaW1wbGVtZW50cyBGaWVsZEF0dHJpYnV0ZQotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHVibGljIEpEVEZpZWxkQXR0cmlidXRlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcikgewotCQl0aGlzKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgSkRURmllbGRBdHRyaWJ1dGUoCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlTdHJpbmcgbmFtZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRlc3RpbmcKLQkgKi8KLQlwdWJsaWMgSkRURmllbGRBdHRyaWJ1dGUoVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBDb21tYW5kRXhlY3V0b3JQcm92aWRlci5EZWZhdWx0Lmluc3RhbmNlKCksIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTWVtYmVyL0F0dHJpYnV0ZS9GaWVsZEF0dHJpYnV0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSVZhcmlhYmxlQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEZyYWdtZW50KGFzdFJvb3QpLnJlc29sdmVCaW5kaW5nKCk7Ci0JfQotCi0JcHVibGljIEZpZWxkRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFNlbGVjdGVkRGVjbGFyYXRpb24oYXN0Um9vdCwgRklFTERfREVDTEFSQVRJT05fU0VMRUNUT1IpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEFTVE5vZGVUZXh0UmFuZ2UodGhpcy5nZXRGcmFnbWVudChhc3RSb290KS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TmFtZV8oKTsKLQl9Ci0KLQlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldFR5cGVCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5nZXRUeXBlKCkucmVzb2x2ZUJpbmRpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgYmluZGluZyA9IHRoaXMuZ2V0QmluZGluZyhhc3RSb290KTsKLQkJcmV0dXJuIChiaW5kaW5nID09IG51bGwpID8gZmFsc2UgOiBKUFRUb29scy5maWVsZElzUGVyc2lzdGFibGUoYmluZGluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsICoqKioqKioqKioKLQotCXByb3RlY3RlZCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZ2V0RnJhZ21lbnQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWREZWNsYXJhdGlvbihhc3RSb290LCBWQVJJQUJMRV9ERUNMQVJBVElPTl9GUkFHTUVOVF9TRUxFQ1RPUik7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIGVpdGhlciBhIEZpZWxkRGVjbGFyYXRpb24gb3IgYSBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQsCi0JICogZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3I7Ci0JICogCi0JICogaGFuZGxlIG11bHRpcGxlIGZpZWxkcyBkZWNsYXJlZCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQ6Ci0JICogICAgIHByaXZhdGUgaW50IGZvbywgYmFyOwotCSAqLwotCXByb3RlY3RlZCA8VCBleHRlbmRzIEFTVE5vZGU+IFQgZ2V0U2VsZWN0ZWREZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCwgU2VsZWN0b3I8VD4gc2VsZWN0b3IpIHsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWVfKCk7Ci0JCWludCBvY2N1cnJlbmNlID0gdGhpcy5nZXRPY2N1cnJlbmNlKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uIDogdGhpcy5nZXREZWNsYXJpbmdUeXBlRmllbGREZWNsYXJhdGlvbnMoYXN0Um9vdCkpIHsKLQkJCWZvciAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50IDogZnJhZ21lbnRzKGZpZWxkRGVjbGFyYXRpb24pKSB7Ci0JCQkJaWYgKGZyYWdtZW50LmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJY291bnQrKzsKLQkJCQkJaWYgKGNvdW50ID09IG9jY3VycmVuY2UpIHsKLQkJCQkJCXJldHVybiBzZWxlY3Rvci5zZWxlY3QoZmllbGREZWNsYXJhdGlvbiwgZnJhZ21lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHJldHVybiBudWxsIGlmIHRoZSBmaWVsZCBpcyBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBjb2RlOwotCQkvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgY29udGV4dCBtb2RlbCBoYXMgbm90IHlldAotCQkvLyBiZWVuIHN5bmNocm9uaXplZCB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbCBidXQgaXMgc3RpbGwKLQkJLy8gYXNraW5nIGZvciBhbiBBU1ROb2RlIChlLmcuIGR1cmluZyBhIHNlbGVjdGlvbiBldmVudCkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEZpZWxkRGVjbGFyYXRpb25bXSBnZXREZWNsYXJpbmdUeXBlRmllbGREZWNsYXJhdGlvbnMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGVjbGFyaW5nVHlwZURlY2xhcmF0aW9uKGFzdFJvb3QpLmdldEZpZWxkcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50PiBmcmFnbWVudHMoRmllbGREZWNsYXJhdGlvbiBmZCkgewotCQlyZXR1cm4gZmQuZnJhZ21lbnRzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNlbGVjdG9yICoqKioqKioqKioKLQotCS8vIEknbSBub3QgcXVpdGUgc3VyZSB0aGlzIGludGVyZmFjZSBpcyB3b3J0aCB0aGUgcmVzdWx0aW5nIG9iZnVzY2F0aW9uLAotCS8vIGJ1dCwgdGhlbiwgSSBrZXB0IGNoYW5naW5nIGJvdGggbWV0aG9kcywgc28uLi4gIH5ianYKLQlwcm90ZWN0ZWQgaW50ZXJmYWNlIFNlbGVjdG9yPFQgZXh0ZW5kcyBBU1ROb2RlPiB7Ci0JCVQgc2VsZWN0KEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU2VsZWN0b3I8RmllbGREZWNsYXJhdGlvbj4gRklFTERfREVDTEFSQVRJT05fU0VMRUNUT1IgPQotCQluZXcgU2VsZWN0b3I8RmllbGREZWNsYXJhdGlvbj4oKSB7Ci0JCQlwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBzZWxlY3QoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSB7Ci0JCQkJcmV0dXJuIGZpZWxkRGVjbGFyYXRpb247Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJCXJldHVybiAiZmllbGQgZGVjbGFyYXRpb24iOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiRklFTERfREVDTEFSQVRJT05fU0VMRUNUT1IiOwotCQkJfQotCQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZWxlY3RvcjxWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ+IFZBUklBQkxFX0RFQ0xBUkFUSU9OX0ZSQUdNRU5UX1NFTEVDVE9SID0KLQkJbmV3IFNlbGVjdG9yPFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudD4oKSB7Ci0JCQlwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHNlbGVjdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIHsKLQkJCQlyZXR1cm4gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCQlyZXR1cm4gInZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IjsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlZBUklBQkxFX0RFQ0xBUkFUSU9OX0ZSQUdNRU5UX1NFTEVDVE9SIjsKLQkJCX0KLQkJfTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1lbWJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1lbWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM4MmQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRNZW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkxvY2F0aW9uS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi0vKioKLSAqIEFkYXB0IGFuZCBleHRlbmQgYSBKRFQgbWVtYmVyIHdpdGggc2ltcGxpZmllZCBhbm5vdGF0aW9uIGhhbmRsaW5nLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSkRUTWVtYmVyCi0JaW1wbGVtZW50cyBNZW1iZXIKLXsKLQkvKiogdGhpcyB3aWxsIGJlIG51bGwgZm9yIHRoZSBwcmltYXJ5IHR5cGUgKi8KLQlwcml2YXRlIGZpbmFsIFR5cGUgZGVjbGFyaW5nVHlwZTsKLQotCS8qKiB0aGUgbWVtYmVyJ3MgbmFtZSAoZHVoKSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBtZW1iZXJzIGNhbiBvY2N1ciBtb3JlIHRoYW4gb25jZSBpbiBub24tY29tcGlsaW5nIHNvdXJjZTsKLQkgKiBjb3VudCBzdGFydHMgYXQgMTsgdGhlIHByaW1hcnkgdHlwZSB3aWxsIGhhdmUgb2NjdXJyZW5jZSAxCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgb2NjdXJyZW5jZTsKLQotCS8qKgotCSAqIHRoZSBjb21waWxhdGlvbiB1bml0IChmaWxlKSBjb250YWluaW5nIHRoZSBtZW1iZXI7Ci0JICogdXNlZCBmb3IgYnVpbGRpbmcgYW4gQVNUIHdoZW4gd2UgbW9kaWZ5IHRoZSBtZW1iZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0OwotCi0JLyoqCi0JICogdGhpcyBhbGxvd3MgY2xpZW50cyB0byBwcm92aWRlIGEgd2F5IHRvIG1vZGlmeSB0aGUgY29tcGlsYXRpb24gdW5pdAotCSAqIChmaWxlKSB3aGVuIGl0IGlzIG9wZW4gaW4gYW4gZWRpdG9yIGFuZCBzaG91bGQgYmUgbW9kaWZpZWQgb24gdGhlIFVJCi0JICogdGhyZWFkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotCi0JLyoqIHRoaXMgd2lsbCBmb3JtYXQgdGhlIG1lbWJlcidzIGFubm90YXRpb25zIGEgYml0ICovCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBKRFRNZW1iZXIoCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlTdHJpbmcgbmFtZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVE1lbWJlcigKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCVN0cmluZyBuYW1lLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmRlY2xhcmluZ1R5cGUgPSBkZWNsYXJpbmdUeXBlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLm9jY3VycmVuY2UgPSBvY2N1cnJlbmNlOwotCQl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9IGNvbXBpbGF0aW9uVW5pdDsKLQkJdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyID0gbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcjsKLQkJdGhpcy5hbm5vdGF0aW9uRWRpdEZvcm1hdHRlciA9IGFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBNZW1iZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE1vZGlmaWVkRGVjbGFyYXRpb24gZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEpEVE1vZGlmaWVkRGVjbGFyYXRpb24odGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBNb2RpZmllZERlY2xhcmF0aW9uIGdldE1vZGlmaWVkRGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldE1vZGlmaWVkRGVjbGFyYXRpb24odGhpcy5idWlsZEFTVFJvb3QoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VyKSB7Ci0JCXJldHVybiBtZW1iZXJOYW1lLmVxdWFscyh0aGlzLm5hbWUpICYmIChvY2N1ciA9PSB0aGlzLm9jY3VycmVuY2UpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZV8oKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRPY2N1cnJlbmNlKCkgewotCQlyZXR1cm4gdGhpcy5vY2N1cnJlbmNlOwotCX0KLQotCS8qKgotCSAqIHRoaXMgd2lsbCByZXR1cm4gbnVsbCBmb3IgYSB0b3AtbGV2ZWwgdHlwZQotCSAqLwotCXByb3RlY3RlZCBUeXBlIGdldERlY2xhcmluZ1R5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlY2xhcmluZ1R5cGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVkaXRpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogRWRpdCB0aGUgbWVtYmVyIHdpdGggdGhlIHNwZWNpZmllZCBlZGl0b3IuCi0JICogVGhlIGVkaXRvciB3aWxsIGJlIGludm9rZWQgb25jZSB0aGUgbWVtYmVyJ3MgY29tcGlsYXRpb24gdW5pdAotCSAqIGlzIGluIGFuIGVkaXRhYmxlIHN0YXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIGVkaXQoRWRpdG9yIGVkaXRvcikgewotCQl0cnkgewotCQkJdGhpcy5lZGl0XyhlZGl0b3IpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5COiBCZSBjYXJlZnVsIGNoYW5naW5nIHRoaXMgbWV0aG9kLgotCSAqIFRoaW5ncyB0byBsb29rIG91dCBmb3I6Ci0JICogICAgIC0gd2hlbiBlZGl0aW5nIHZpYSB0aGUgSmF2YUVkaXRvciB0aGVyZSBpcyBubyBuZWVkIHRvIGNyZWF0ZSBhIHdvcmtpbmcgY29weQotCSAqICAgICAtIHdoZW4gZWRpdGluZyBoZWFkbGVzc2x5LCBhICJ3b3JraW5nIGNvcHkiIG11c3QgYmUgY3JlYXRlZAotCSAqICAgICAgICAoYXQgbGVhc3QgYXMgZmFyIGFzIEkgY2FuIHRlbGwgIH5rZm0pCi0JICogICAgIC0gd2hlbiBlZGl0aW5nIHZpYSBhIHBsYWluIHRleHQgZWRpdG9yLCBtYWtlIGEgd29ya2luZyBjb3B5IG9yIGVsc2UgdGhpbmdzIGFyZSBzY3Jld2VkCi0JICogICAgICAgIHVwIHRoZSBzZWNvbmQgdGltZSB5b3UgZWRpdCB0aHJvdWdoIHRoZSBYbWxQZXJzaXN0ZW5jZSBYbWxQcm9wZXJ0aWVzIFZpZXcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0XyhFZGl0b3IgZWRpdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICggISB0aGlzLmNvbXBpbGF0aW9uVW5pdC5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmJlY29tZVdvcmtpbmdDb3B5KG51bGwpOwotCQl9Ci0KLQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLmdldFRleHRGaWxlQnVmZmVyKHRoaXMuY29tcGlsYXRpb25Vbml0LmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKSwgTG9jYXRpb25LaW5kLk5PUk1BTElaRSk7Ci0JCWJvb2xlYW4gc2hhcmVkRG9jdW1lbnQgPSAoYnVmZmVyICE9IG51bGwpOyAgLy8gZG9jdW1lbnRzIGFyZSB0eXBpY2FsbHkgc2hhcmVkIHdoZW4gdGhleSBhcmUgYWxyZWFkeSBvcGVuIGluIGFuIGVkaXRvcgotCQlJRG9jdW1lbnQgZG9jID0gc2hhcmVkRG9jdW1lbnQgPwotCQkJCWJ1ZmZlci5nZXREb2N1bWVudCgpCi0JCQk6Ci0JCQkJbmV3IERvY3VtZW50KHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCkpOwotCi0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoKTsKLQkJYXN0Um9vdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7Ci0KLQkJZWRpdG9yLmVkaXQodGhpcy5nZXRNb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQotCQlUZXh0RWRpdCBlZGl0cyA9IGFzdFJvb3QucmV3cml0ZShkb2MsIHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9ucyh0cnVlKSk7Ci0JCWlmIChzaGFyZWREb2N1bWVudCkgewotCQkJdGhpcy5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpLmV4ZWN1dGUobmV3IE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZChlZGl0cywgZG9jKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmFwcGx5RWRpdHMoZWRpdHMsIGRvYyk7Ci0JCX0KLQotCQlpZiAoICEgc2hhcmVkRG9jdW1lbnQpIHsKLQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKGRvYy5nZXQoKSk7Ci0JCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21taXRXb3JraW5nQ29weSh0cnVlLCBudWxsKTsgIC8vIHRydWU9ImZvcmNlIgotCQkJdGhpcy5jb21waWxhdGlvblVuaXQuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhcHBseSB0aGUgc3BlY2lmaWVkIGVkaXRzIHRvIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQsCi0JICogcmVmb3JtYXR0aW5nIHRoZSBkb2N1bWVudCBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBseUVkaXRzKFRleHRFZGl0IGVkaXRzLCBJRG9jdW1lbnQgZG9jKSB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQllZGl0cy5hcHBseShkb2MsIFRleHRFZGl0LlVQREFURV9SRUdJT05TKTsKLQkJdGhpcy5hbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5mb3JtYXQoZG9jLCBlZGl0cyk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoKSB7Ci0JCXJldHVybiBKRFRUb29scy5idWlsZEFTVFJvb3QodGhpcy5jb21waWxhdGlvblVuaXQpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kRXhlY3V0b3IgZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIuZ2V0Q29tbWFuZEV4ZWN1dG9yKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vZGlmeSBzaGFyZWQgZG9jdW1lbnQgY29tbWFuZCBjbGFzcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzaW1wbGUgY29tbWFuZCB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIG1lbWJlciB0byBhcHBseSB0aGUgZWRpdHMKLQkgKiBpbiB0aGUgc2FtZSB3YXkgYXMgaWYgdGhlIGRvY3VtZW50IHdlcmUgbm90IHNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJcHJpdmF0ZSBmaW5hbCBUZXh0RWRpdCBlZGl0czsKLQkJcHJpdmF0ZSBmaW5hbCBJRG9jdW1lbnQgZG9jOwotCi0JCXByb3RlY3RlZCBNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmQoVGV4dEVkaXQgZWRpdHMsIElEb2N1bWVudCBkb2MpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmVkaXRzID0gZWRpdHM7Ci0JCQl0aGlzLmRvYyA9IGRvYzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0cnkgewotCQkJCUpEVE1lbWJlci50aGlzLmFwcGx5RWRpdHModGhpcy5lZGl0cywgdGhpcy5kb2MpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRNZXRob2RBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRNZXRob2RBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA4NDRkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTWV0aG9kQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklNZXRob2RCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1ldGhvZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVNZXRob2RTaWduYXR1cmU7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCBtZXRob2QuCi0gKiBBdHRyaWJ1dGUgYmFzZWQgb24gYSBKYXZhIHByb3BlcnR5LCBlLmcuCi0gKiAgICAgcHJpdmF0ZSBpbnQgZ2V0Rm9vKCkgewotICogICAgICAgICByZXR1cm4gZm9vOwotICogICAgIH0KLSAqICAgICBwcml2YXRlIHZvaWQgc2V0Rm9vKGludCBmb28pIHsKLSAqICAgICAgICAgdGhpcy5mb28gPSBmb287Ci0gKiAgICAgfQotICovCi1wdWJsaWMgY2xhc3MgSkRUTWV0aG9kQXR0cmlidXRlCi0JZXh0ZW5kcyBKRFRBdHRyaWJ1dGUKLQlpbXBsZW1lbnRzIE1ldGhvZEF0dHJpYnV0ZQotewotCS8qKiB3ZSBuZWVkIHRoZSBwYXJhbWV0ZXIgdHlwZXMgdG8gYnVpbGQgdGhlIG1ldGhvZCBzaWduYXR1cmUgKi8KLQlwcml2YXRlIGZpbmFsIEphdmFUeXBlW10gcGFyYW1ldGVyVHlwZXM7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgSkRUTWV0aG9kQXR0cmlidXRlIG5ld0luc3RhbmNlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShkZWNsYXJpbmdUeXBlLCBzaWduYXR1cmUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSkRUTWV0aG9kQXR0cmlidXRlIG5ld0luc3RhbmNlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJcmV0dXJuIG5ldyBKRFRNZXRob2RBdHRyaWJ1dGUoZGVjbGFyaW5nVHlwZSwgc2lnbmF0dXJlLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQl9Ci0KLQlwdWJsaWMgSkRUTWV0aG9kQXR0cmlidXRlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbWV0aG9kU2lnbmF0dXJlLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSkRUTWV0aG9kQXR0cmlidXRlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgbWV0aG9kU2lnbmF0dXJlLmdldE5hbWUoKSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JCXRoaXMucGFyYW1ldGVyVHlwZXMgPSBtZXRob2RTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgdGVzdGluZwotCSAqLwotCXB1YmxpYyBKRFRNZXRob2RBdHRyaWJ1dGUoVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJdGhpcyhkZWNsYXJpbmdUeXBlLCBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKG5hbWUsIHBhcmFtZXRlclR5cGVOYW1lcyksIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIuRGVmYXVsdC5pbnN0YW5jZSgpLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE1lbWJlci9BdHRyaWJ1dGUvTWV0aG9kQXR0cmlidXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJTWV0aG9kQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5yZXNvbHZlQmluZGluZygpOwotCX0KLQotCXB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IHRoaXMuZ2V0RGVjbGFyaW5nVHlwZU1ldGhvZERlY2xhcmF0aW9ucyhhc3RSb290KSkgewotCQkJaWYgKHRoaXMubWF0Y2hlcyhtZXRob2REZWNsYXJhdGlvbikpIHsKLQkJCQljb3VudCsrOwotCQkJCWlmIChjb3VudCA9PSB0aGlzLmdldE9jY3VycmVuY2UoKSkgewotCQkJCQlyZXR1cm4gbWV0aG9kRGVjbGFyYXRpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHJldHVybiBudWxsIGlmIHRoZSBtZXRob2QgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgY29kZTsKLQkJLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIGNvbnRleHQgbW9kZWwgaGFzIG5vdCB5ZXQKLQkJLy8gYmVlbiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwgYnV0IGlzIHN0aWxsCi0JCS8vIGFza2luZyBmb3IgYW4gQVNUTm9kZSAoZS5nLiBkdXJpbmcgYSBzZWxlY3Rpb24gZXZlbnQpCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJcmV0dXJuIHRoaXMubWF0Y2hlcyhzaWduYXR1cmUpICYmIChvY2N1cnJlbmNlID09IHRoaXMuZ2V0T2NjdXJyZW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzKE1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUpIHsKLQkJcmV0dXJuIHNpZ25hdHVyZS5nZXROYW1lKCkuZXF1YWxzKHRoaXMuZ2V0TmFtZV8oKSkKLQkJCQkJJiYgQXJyYXlzLmVxdWFscyh0aGlzLnBhcmFtZXRlclR5cGVzLCBzaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5tYXRjaGVzKEpEVFRvb2xzLmJ1aWxkTWV0aG9kU2lnbmF0dXJlKG1ldGhvZERlY2xhcmF0aW9uKSk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVc2UgI21hdGNoZXMob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uLCBpbnQpLiIpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEFTVE5vZGVUZXh0UmFuZ2UodGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gImZvbyIgZm9yIGEgbWV0aG9kIG5hbWVkICJnZXRGb28iIG9yICJpc0ZvbyIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lXygpOwotCQlpbnQgYmVnaW5JbmRleCA9IDA7Ci0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoImdldCIpKSB7Ci0JCQliZWdpbkluZGV4ID0gMzsKLQkJfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoImlzIikpIHsKLQkJCWJlZ2luSW5kZXggPSAyOwotCQl9Ci0JCXJldHVybiBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG5hbWUuc3Vic3RyaW5nKGJlZ2luSW5kZXgpKTsKLQl9Ci0KLQlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldFR5cGVCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBnZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkucmVzb2x2ZUJpbmRpbmcoKTsKLQkJaWYgKG1ldGhvZEJpbmRpbmcgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1ldGhvZEJpbmRpbmcuZ2V0UmV0dXJuVHlwZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUlNZXRob2RCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKGJpbmRpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTWV0aG9kRGVjbGFyYXRpb25bXSBnZXREZWNsYXJpbmdUeXBlTWV0aG9kRGVjbGFyYXRpb25zKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldERlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbihhc3RSb290KS5nZXRNZXRob2RzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTW9kaWZpZWREZWNsYXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1vZGlmaWVkRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2ZmE3Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTW9kaWZpZWREZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbXBvcnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKRFRNb2RpZmllZERlY2xhcmF0aW9uCi0JaW1wbGVtZW50cyBNb2RpZmllZERlY2xhcmF0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyIGFkYXB0ZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKEFkYXB0ZXIgYWRhcHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCX0KLQotCXB1YmxpYyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKEJvZHlEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzKG5ldyBCb2R5RGVjbGFyYXRpb25BZGFwdGVyKGRlY2xhcmF0aW9uKSk7Ci0JfQotCi0JcHVibGljIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24oU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzKG5ldyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uQWRhcHRlcihkZWNsYXJhdGlvbikpOwotCX0KLQotCXB1YmxpYyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMobmV3IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uQWRhcHRlcihkZWNsYXJhdGlvbikpOwotCX0KLQotCXB1YmxpYyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgZGVjbGFyYXRpb24pIHsKLQkJdGhpcyhuZXcgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudEFkYXB0ZXIoZGVjbGFyYXRpb24pKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uJ3MgbGlzdCBvZiBtb2RpZmllcnMuCi0JICogRWxlbWVudCB0eXBlOiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXIKLQkgKi8KLQlwdWJsaWMgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzKCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLm1vZGlmaWVycygpOwotCX0KLQotCXB1YmxpYyBBU1QgZ2V0QXN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJhdGlvbigpLmdldEFTVCgpOwotCX0KLQotCXB1YmxpYyBDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgdGhpcy5nZXREZWNsYXJhdGlvbigpLmdldFJvb3QoKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRJQ29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gKElDb21waWxhdGlvblVuaXQpIHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0SmF2YUVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uJ3MgYW5ub3RhdGlvbnMuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEFubm90YXRpb24+IGFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPElFeHRlbmRlZE1vZGlmaWVyLCBBbm5vdGF0aW9uPih0aGlzLm1vZGlmaWVycygpLml0ZXJhdG9yKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElFeHRlbmRlZE1vZGlmaWVyIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pc0Fubm90YXRpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8QW5ub3RhdGlvbj4gc3RyZWFtID0gdGhpcy5hbm5vdGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAodGhpcy5hbm5vdGF0aW9uSXNOYW1lZChhbm5vdGF0aW9uLCBhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGVjbGFyYXRpb24gaGFzIGFuIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25OYW1lZChhbm5vdGF0aW9uTmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIHRvIHRoZSBkZWNsYXJhdGlvbi4KLQkgKiBCeSBjb252ZW50aW9uIGFubm90YXRpb25zIHByZWNlZGUgdGhlICJzdGFuZGFyZCIgKEpMUzIpIG1vZGlmaWVyczsKLQkgKiB0aG91Z2gsIHRlY2huaWNhbGx5LCB0aGV5IGNhbiBiZSBpbnRlcnNwZXJzZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzID0gdGhpcy5tb2RpZmllcnMoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IG1vZGlmaWVycy5saXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5pc01vZGlmaWVyKCkpIHsKLQkJCQlzdHJlYW0ucHJldmlvdXMoKTsgIC8vIHB1dCB0aGUgYW5ub3RhdGlvbiAqYmVmb3JlKiB0aGUgZmlyc3QgInN0YW5kYXJkIiAoSkxTMikgbW9kaWZpZXIKLQkJCQlzdHJlYW0uYWRkKGFubm90YXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQltb2RpZmllcnMuYWRkKGFubm90YXRpb24pOyAgLy8ganVzdCB0YWNrIGl0IG9uIHRvIHRoZSBlbmQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IHRoaXMubW9kaWZpZXJzKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlJRXh0ZW5kZWRNb2RpZmllciBtb2RpZmllciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsKLQkJCQlpZiAodGhpcy5hbm5vdGF0aW9uSXNOYW1lZCgoQW5ub3RhdGlvbikgbW9kaWZpZXIsIGFubm90YXRpb25OYW1lKSkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gZnJvbSB0aGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJaWYgKCAhIHRoaXMubW9kaWZpZXJzKCkucmVtb3ZlKGFubm90YXRpb24pKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGFubm90YXRpb246ICIgKyBhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgdGhlIHNwZWNpZmllZCBvbGQgYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IGFubm90YXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZUFubm90YXRpb24oQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uLCBBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24pIHsKLQkJZm9yIChMaXN0SXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IHRoaXMubW9kaWZpZXJzKCkubGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKG9sZEFubm90YXRpb24pKSB7Ci0JCQkJc3RyZWFtLnNldChuZXdBbm5vdGF0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBvbGQgYW5ub3RhdGlvbjogIiArIG9sZEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIG9sZEFubm90YXRpb25OYW1lLCBBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24pIHsKLQkJTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzID0gdGhpcy5tb2RpZmllcnMoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IG1vZGlmaWVycy5saXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlJRXh0ZW5kZWRNb2RpZmllciBtb2RpZmllciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsKLQkJCQlpZiAodGhpcy5hbm5vdGF0aW9uSXNOYW1lZCgoQW5ub3RhdGlvbikgbW9kaWZpZXIsIG9sZEFubm90YXRpb25OYW1lKSkgewotCQkJCQlzdHJlYW0uc2V0KG5ld0Fubm90YXRpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRoaXMuYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRJbXBvcnQoU3RyaW5nIGltcG9ydE5hbWUpIHsKLQkJdGhpcy5hZGRJbXBvcnQoaW1wb3J0TmFtZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFN0YXRpY0ltcG9ydChTdHJpbmcgaW1wb3J0TmFtZSkgewotCQl0aGlzLmFkZEltcG9ydChpbXBvcnROYW1lLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRJbXBvcnQoU3RyaW5nIGltcG9ydE5hbWUsIGJvb2xlYW4gc3RhdGljXykgewotCQlpZiAoaW1wb3J0TmFtZS5pbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCXRoaXMuYWRkSW1wb3J0VG8odGhpcy5nZXRDb21waWxhdGlvblVuaXQoKSwgaW1wb3J0TmFtZSwgc3RhdGljXyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEltcG9ydEZvcihTdHJpbmcgc2hvcnROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEltcG9ydEZvcihzaG9ydE5hbWUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXRpY0ltcG9ydEZvcihTdHJpbmcgc2hvcnROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEltcG9ydEZvcihzaG9ydE5hbWUsIHRydWUpOwotCX0KLQotCS8vIFRPRE8gaGFuZGxlIHdpbGRjYXJkcwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0Rm9yKFN0cmluZyBzaG9ydE5hbWUsIGJvb2xlYW4gc3RhdGljXykgewotCQlpZiAoc2hvcnROYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJcmV0dXJuIHNob3J0TmFtZTsKLQkJfQotCQlMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzID0gdGhpcy5pbXBvcnRzKHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOwotCQlmb3IgKEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uIDogaW1wb3J0cykgewotCQkJaWYgKHRoaXMuaW1wb3J0SXNGb3IoaW1wb3J0RGVjbGFyYXRpb24sIHNob3J0TmFtZSwgc3RhdGljXykpIHsKLQkJCQlyZXR1cm4gaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGltcG9ydElzRm9yKEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uLCBTdHJpbmcgc2hvcnROYW1lLCBib29sZWFuIHN0YXRpY18pIHsKLQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkgIT0gc3RhdGljXykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBpbXBvcnREZWNsYXJhdGlvbk5hbWUgPSBpbXBvcnREZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCXJldHVybiBpbXBvcnREZWNsYXJhdGlvbk5hbWUuZW5kc1dpdGgoc2hvcnROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmFkYXB0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYW5ub3RhdGlvbklzTmFtZWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IHRoaXMucXVhbGlmaWVkTmFtZShhbm5vdGF0aW9uKTsKLQkJcmV0dXJuIChxdWFsaWZpZWROYW1lICE9IG51bGwpICYmIHF1YWxpZmllZE5hbWUuZXF1YWxzKG5hbWUpOwotCX0KLQotCS8vIFRPRE8KLQlwcml2YXRlIFN0cmluZyBxdWFsaWZpZWROYW1lKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBhbm5vdGF0aW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlpZiAodHlwZUJpbmRpbmcgIT0gbnVsbCkgewotCQkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCWlmIChyZXNvbHZlZE5hbWUgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXNvbHZlZE5hbWU7Ci0JCQl9Ci0JCX0KLQkJLy8gaGFjayg/KTogY2hlY2sgZm9yIGEgbWF0Y2hpbmcgaW1wb3J0IGJlY2F1c2Ugd2hlbiBtb3ZpbmcgYSBzdGFuZC1hbG9uZQotCQkvLyBhbm5vdGF0aW9uIHRvIGl0cyBjb250YWluZXIgaW4gQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotCQkvLyB0aGUgY29udGFpbmVyJ3MgaW1wb3J0IGlzIGFkZGVkIGJ1dCB0aGVuIGl0IHdvbid0ICJyZXNvbHZlIiB1cG9uCi0JCS8vIHN1YnNlcXVlbnQgbG9va3Vwcy4uLiA6LSgKLQkJcmV0dXJuIHRoaXMuZ2V0SW1wb3J0Rm9yKGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7ICAvLyBsb29rIGZvciBhIG1hdGNoaW5nIGltcG9ydAotCi0JCS8vIE9MRCBNRVRIT0QgU09VUkNFOgotLy8JCVN0cmluZyBuYW1lID0gYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotLy8JCWlmIChuYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgewotLy8JCQlyZXR1cm4gbmFtZTsgIC8vIG5hbWUgaXMgYWxyZWFkeSBxdWFsaWZpZWQKLS8vCQl9Ci0vLwkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IEpEVFRvb2xzLnJlc29sdmUobmFtZSwgdGhpcy50eXBlKCkpOwotLy8JCS8vIGhhY2soPyk6IGNoZWNrIGZvciBhIG1hdGNoaW5nIGltcG9ydCBiZWNhdXNlIHdoZW4gbW92aW5nIGEgc3RhbmQtYWxvbmUKLS8vCQkvLyBhbm5vdGF0aW9uIHRvIGl0cyBjb250YWluZXIgaW4gQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotLy8JCS8vIHRoZSBjb250YWluZXIncyBpbXBvcnQgaXMgYWRkZWQgYnV0IHRoZW4gaXQgd29uJ3QgInJlc29sdmUiIHVwb24KLS8vCQkvLyBzdWJzZXF1ZW50IGxvb2t1cHMuLi4gOi0oCi0vLwkJcmV0dXJuIHRoaXMuaW1wb3J0Rm9yKG5hbWUpOyAgLy8gbG9vayBmb3IgYSBtYXRjaGluZyBpbXBvcnQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGltcG9ydCB3YXMgYWRkZWQgd2l0aG91dCBhIGNvbGxpc2lvbi4KLQkgKi8KLQkvLyBUT0RPIGhhbmRsZSBjb2xsaXNpb25zIChlLmcuIGphdmEudXRpbC5EYXRlIHZzLiBqYXZhLnNxbC5EYXRlKQotCXByb3RlY3RlZCB2b2lkIGFkZEltcG9ydFRvKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBTdHJpbmcgaW1wb3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNfKSB7Ci0JCUxpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHMgPSB0aGlzLmltcG9ydHMoYXN0Um9vdCk7Ci0JCWlmICh0aGlzLmltcG9ydHNJbmNsdWRlKGltcG9ydHMsIGltcG9ydE5hbWUsIHN0YXRpY18pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQVNUIGFzdCA9IGFzdFJvb3QuZ2V0QVNUKCk7Ci0JCUltcG9ydERlY2xhcmF0aW9uIGltcG9ydF8gPSBhc3QubmV3SW1wb3J0RGVjbGFyYXRpb24oKTsKLQkJaW1wb3J0Xy5zZXROYW1lKGFzdC5uZXdOYW1lKGltcG9ydE5hbWUpKTsKLQkJaW1wb3J0Xy5zZXRTdGF0aWMoc3RhdGljXyk7Ci0JCWltcG9ydHMuYWRkKGltcG9ydF8pOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBhc3RSb290LmltcG9ydHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBvcnRzSW5jbHVkZShMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzLCBTdHJpbmcgaW1wb3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNfKSB7Ci0JCWZvciAoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gOiBpbXBvcnRzKSB7Ci0JCQlpZiAodGhpcy5pbXBvcnRJbmNsdWRlcyhpbXBvcnREZWNsYXJhdGlvbiwgaW1wb3J0TmFtZSwgc3RhdGljXykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0SW5jbHVkZXMoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24sIFN0cmluZyBpbXBvcnROYW1lLCBib29sZWFuIHN0YXRpY18pIHsKLQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkgIT0gc3RhdGljXykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBpbXBvcnREZWNsYXJhdGlvbk5hbWUgPSBpbXBvcnREZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCWlmIChpbXBvcnROYW1lLmVxdWFscyhpbXBvcnREZWNsYXJhdGlvbk5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoaW1wb3J0RGVjbGFyYXRpb24uaXNPbkRlbWFuZCgpCi0JCQkJJiYgdGhpcy5vbkRlbWFuZE5hbWVGb3IoaW1wb3J0TmFtZSkuZXF1YWxzKGltcG9ydERlY2xhcmF0aW9uTmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG9uRGVtYW5kTmFtZUZvcihTdHJpbmcgaW1wb3J0TmFtZSkgewotCQlpbnQgbGFzdFBlcmlvZCA9IGltcG9ydE5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJcmV0dXJuIChsYXN0UGVyaW9kID09IC0xKSA/ICIiIDogaW1wb3J0TmFtZS5zdWJzdHJpbmcoMCwgbGFzdFBlcmlvZCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBkZWNsYXJhdGlvbiBhZGFwdGVyIGludGVyZmFjZSBhbmQgaW1wbGVtZW50YXRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIERlZmluZSBjb21tb24gcHJvdG9jb2wgYW1vbmcgdGhlIHZhcmlvdXMgImRlY2xhcmF0aW9ucyIuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBBZGFwdGVyIHsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBhZGFwdGVkICJkZWNsYXJhdGlvbiIuCi0JCSAqLwotCQlBU1ROb2RlIGRlY2xhcmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgImRlY2xhcmF0aW9uIidzIGxpc3Qgb2YgbW9kaWZpZXJzLgotCQkgKiBFbGVtZW50IHR5cGU6IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcgotCQkgKi8KLQkJTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEJvZHlEZWNsYXJhdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBCb2R5RGVjbGFyYXRpb24gZGVjbGFyYXRpb247Ci0JCXB1YmxpYyBCb2R5RGVjbGFyYXRpb25BZGFwdGVyKEJvZHlEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKLQkJfQotCQlwdWJsaWMgQVNUTm9kZSBkZWNsYXJhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb24ubW9kaWZpZXJzKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRlY2xhcmF0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCQlwcml2YXRlIGZpbmFsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb247Ci0JCXB1YmxpYyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uQWRhcHRlcihTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwotCQl9Ci0JCXB1YmxpYyBBU1ROb2RlIGRlY2xhcmF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZGVjbGFyYXRpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCQlwcml2YXRlIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIGRlY2xhcmF0aW9uOwotCQlwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb25BZGFwdGVyKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwotCQl9Ci0JCXB1YmxpYyBBU1ROb2RlIGRlY2xhcmF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZGVjbGFyYXRpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRBZGFwdGVyIGltcGxlbWVudHMgQWRhcHRlciB7Ci0JCXByaXZhdGUgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBkZWNsYXJhdGlvbjsKLQkJcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRBZGFwdGVyKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgZGVjbGFyYXRpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Ci0JCX0KLQkJcHVibGljIEFTVE5vZGUgZGVjbGFyYXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uLm1vZGlmaWVycygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kZWNsYXJhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1MDAxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQW5ub3RhdGlvbkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklWYXJpYWJsZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5KYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlTWV0aG9kU2lnbmF0dXJlOwotCi1wdWJsaWMgY2xhc3MgSkRUVG9vbHMgewotCi0JLyoqCi0JICogQnVpbGQgYW4gQVNUIGZvciB0aGUgc3BlY2lmaWVkIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCBpdHMgYmluZGluZ3MKLQkgKiByZXNvbHZlZCAoYW5kIHRoZSByZXN1bHRhbnQgcGVyZm9ybWFuY2UgaGl0KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwotCQlwYXJzZXIuc2V0U291cmNlKGNvbXBpbGF0aW9uVW5pdCk7Ci0JCXBhcnNlci5zZXRSZXNvbHZlQmluZGluZ3ModHJ1ZSk7Ci0JCXBhcnNlci5zZXRCaW5kaW5nc1JlY292ZXJ5KHRydWUpOyAgLy8gc2VlIGJ1Z3MgMTk2MjAwLCAyMjI3MzUKLQkJcmV0dXJuIChDb21waWxhdGlvblVuaXQpIHBhcnNlci5jcmVhdGVBU1QobnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZUVudW0oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIEFTVE5vZGUuUVVBTElGSUVEX05BTUU6Ci0JCQljYXNlIEFTVE5vZGUuU0lNUExFX05BTUU6Ci0JCQkJcmV0dXJuIHJlc29sdmVFbnVtKChOYW1lKSBleHByZXNzaW9uKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRW51bShOYW1lIGVudW1FeHByZXNzaW9uKSB7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBlbnVtRXhwcmVzc2lvbi5yZXNvbHZlQmluZGluZygpOwotCQlpZiAoYmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsgIC8vIFRPRE8gZmlndXJlIHdoeSB0aGlzIGlzIG51bGwgc29tZXRpbWVzCi0JCX0KLQkJaWYgKGJpbmRpbmcuZ2V0S2luZCgpICE9IElCaW5kaW5nLlZBUklBQkxFKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IChJVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOwotCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nLmdldFR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkgKyAiLiIgKyB2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlQW5ub3RhdGlvbihBbm5vdGF0aW9uIG5vZGUpIHsKLQkJSUFubm90YXRpb25CaW5kaW5nIGFubm90YXRpb25CaW5kaW5nID0gbm9kZS5yZXNvbHZlQW5ub3RhdGlvbkJpbmRpbmcoKTsKLQkJaWYgKGFubm90YXRpb25CaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUeXBlQmluZGluZyBhbm5vdGF0aW9uVHlwZUJpbmRpbmcgPSBhbm5vdGF0aW9uQmluZGluZy5nZXRBbm5vdGF0aW9uVHlwZSgpOwotCQlpZiAoYW5ub3RhdGlvblR5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBhbm5vdGF0aW9uVHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlpZiAoZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9MSVRFUkFMKSB7Ci0JCQlJVHlwZUJpbmRpbmcgcmVzb2x2ZWRUeXBlQmluZGluZyA9ICgoVHlwZUxpdGVyYWwpIGV4cHJlc3Npb24pLmdldFR5cGUoKS5yZXNvbHZlQmluZGluZygpOwotCQkJaWYgKHJlc29sdmVkVHlwZUJpbmRpbmcgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXNvbHZlZFR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFNpZ25hdHVyZSBidWlsZE1ldGhvZFNpZ25hdHVyZShNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgKLQkJCQltZXRob2REZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksCi0JCQkJYnVpbGRQYXJhbWV0ZXJUeXBlcyhtZXRob2REZWNsYXJhdGlvbikKLQkJCSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZVtdIGJ1aWxkUGFyYW1ldGVyVHlwZXMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyhtZXRob2REZWNsYXJhdGlvbik7Ci0JCWludCBsZW4gPSBwYXJhbWV0ZXJzLnNpemUoKTsKLQkJSmF2YVR5cGVbXSBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBKYXZhVHlwZVtsZW5dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlJVHlwZUJpbmRpbmcgdHlwZSA9IHBhcmFtZXRlcnMuZ2V0KGkpLmdldFR5cGUoKS5yZXNvbHZlQmluZGluZygpOwotCQkJcGFyYW1ldGVyVHlwZXNbaV0gPSBuZXcgU2ltcGxlSmF2YVR5cGUodHlwZS5nZXRRdWFsaWZpZWROYW1lKCksIHR5cGUuZ2V0RGltZW5zaW9ucygpKTsKLQkJfQotCQlyZXR1cm4gcGFyYW1ldGVyVHlwZXM7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2E2YzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotCi0vKioKLSAqIEFkYXB0IGFuZCBleHRlbmQgYSBKRFQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIEpEVFR5cGUKLQlleHRlbmRzIEpEVE1lbWJlcgotCWltcGxlbWVudHMgVHlwZQotewotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0J3MgcHJpbWFyeSB0eXBlCi0JICovCi0JcHVibGljIEpEVFR5cGUoCi0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCAgLy8gZXhjbHVkZSBhbm5vdGF0aW9ucyBhbmQgZW51bXMKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcikgewotCQl0aGlzKHR5cGVEZWNsYXJhdGlvbiwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0J3MgcHJpbWFyeSB0eXBlCi0JICovCi0JcHVibGljIEpEVFR5cGUoCi0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCAgLy8gZXhjbHVkZSBhbm5vdGF0aW9ucyBhbmQgZW51bXMKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXRoaXMobnVsbCwgdHlwZURlY2xhcmF0aW9uLCAxLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgbmVzdGVkIHR5cGVzCi0JICovCi0JcHVibGljIEpEVFR5cGUoCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCAgLy8gZXhjbHVkZSBhbm5vdGF0aW9ucyBhbmQgZW51bXMKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgdHlwZURlY2xhcmF0aW9uLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgbmVzdGVkIHR5cGVzCi0JICovCi0JcHVibGljIEpEVFR5cGUoCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCAgLy8gZXhjbHVkZSBhbm5vdGF0aW9ucyBhbmQgZW51bXMKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgdHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRlc3RpbmcKLQkgKi8KLQlwdWJsaWMgSkRUVHlwZShUeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBuYW1lLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBDb21tYW5kRXhlY3V0b3JQcm92aWRlci5EZWZhdWx0Lmluc3RhbmNlKCksIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTWVtYmVyL1R5cGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIElUeXBlQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5yZXNvbHZlQmluZGluZygpOwotCX0KLQotCS8qKgotCSAqIGZpbmQgdGhlIHR5cGUncyBib2R5IGRlY2xhcmF0aW9uIGluIHRoZSBzcGVjaWZpZWQgQVNUCi0JICovCi0JcHVibGljIFR5cGVEZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVHlwZSBkZWNsYXJpbmdUeXBlID0gdGhpcy5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JCXJldHVybiAoZGVjbGFyaW5nVHlwZSA9PSBudWxsKSA/Ci0JCQkJdGhpcy5nZXRUb3BMZXZlbFR5cGVEZWNsYXJhdGlvbihhc3RSb290KQotCQkJOgotCQkJCXRoaXMuZ2V0TmVzdGVkVHlwZURlY2xhcmF0aW9uKGRlY2xhcmluZ1R5cGUuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gdGhpcy5nZXRCaW5kaW5nKGFzdFJvb3QpOwotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IEpQVFRvb2xzLnR5cGVJc1BlcnNpc3RhYmxlKGJpbmRpbmcpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEFTVE5vZGVUZXh0UmFuZ2UodGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVHlwZURlY2xhcmF0aW9uW10gZ2V0VHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpLmdldFR5cGVzKCk7Ci0JfQotCi0JcHVibGljIEZpZWxkRGVjbGFyYXRpb25bXSBnZXRGaWVsZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpLmdldEZpZWxkcygpOwotCX0KLQotCXB1YmxpYyBNZXRob2REZWNsYXJhdGlvbltdIGdldE1ldGhvZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpLmdldE1ldGhvZHMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBmaXJzdCB0b3AtbGV2ZWwgdHlwZSBpbiB0aGUgc3BlY2lmaWVkIEFTVCB3aXRoIGEgbWF0Y2hpbmcgbmFtZQotCSAqLwotCXByb3RlY3RlZCBUeXBlRGVjbGFyYXRpb24gZ2V0VG9wTGV2ZWxUeXBlRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGVzKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbihMaXN0PFR5cGVEZWNsYXJhdGlvbj4gdHlwZURlY2xhcmF0aW9ucykgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9ucy50b0FycmF5KG5ldyBUeXBlRGVjbGFyYXRpb25bdHlwZURlY2xhcmF0aW9ucy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBuZXN0ZWQgdHlwZSB3aXRoIGEgbWF0Y2hpbmcgbmFtZSBhbmQgb2NjdXJyZW5jZQotCSAqLwotCXByb3RlY3RlZCBUeXBlRGVjbGFyYXRpb24gZ2V0TmVzdGVkVHlwZURlY2xhcmF0aW9uKFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZURlY2xhcmF0aW9uKGRlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbi5nZXRUeXBlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHR5cGUgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBmcm9tIHRoZSBzcGVjaWZpZWQKLQkgKiBzZXQgb2YgdHlwZSBkZWNsYXJhdGlvbnMgKG1hdGNoIG5hbWUgYW5kIG9jY3VycmVuY2UpCi0JICovCi0JcHJvdGVjdGVkIFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oVHlwZURlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9ucykgewotCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0TmFtZV8oKTsKLQkJaW50IG9jY3VycmVuY2UgPSB0aGlzLmdldE9jY3VycmVuY2UoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uIDogdHlwZURlY2xhcmF0aW9ucykgewotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJY291bnQrKzsKLQkJCQlpZiAoY291bnQgPT0gb2NjdXJyZW5jZSkgewotCQkJCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyByZXR1cm4gbnVsbCBpZiB0aGUgdHlwZSBpcyBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBjb2RlOwotCQkvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgY29udGV4dCBtb2RlbCBoYXMgbm90IHlldAotCQkvLyBiZWVuIHN5bmNocm9uaXplZCB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbCBidXQgaXMgc3RpbGwKLQkJLy8gYXNraW5nIGZvciBhbiBBU1ROb2RlIChlLmcuIGR1cmluZyBhIHNlbGVjdGlvbiBldmVudCkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxUeXBlRGVjbGFyYXRpb24+IHR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBhc3RSb290LnR5cGVzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSlBUVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KUFRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2FlZDA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KUFRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSU1ldGhvZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVZhcmlhYmxlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7Ci0KLXB1YmxpYyBjbGFzcyBKUFRUb29scyB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpZWxkIG1heSBiZSAicGVyc2lzdGVkIi4KLQkgKiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsICJBbGwgbm9uLXRyYW5zaWVudCBpbnN0YW5jZSB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IAotCSAqIGFubm90YXRlZCB3aXRoIHRoZSBUcmFuc2llbnQgYW5ub3RhdGlvbiBhcmUgcGVyc2lzdGVudC4iCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpZWxkSXNQZXJzaXN0YWJsZShJVmFyaWFibGVCaW5kaW5nIGZpZWxkKSB7Ci0JCWludCBtb2RpZmllcnMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1vZGlmaWVycykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoTW9kaWZpZXIuaXNUcmFuc2llbnQobW9kaWZpZXJzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGlzIGEgImdldHRlciIgbWV0aG9kIHRoYXQKLQkgKiByZXByZXNlbnRzIGEgcHJvcGVydHkgdGhhdCBtYXkgYmUgInBlcnNpc3RlZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7Ci0JCWlmIChtZXRob2RIYXNCYWRNb2RpZmllcnMobWV0aG9kQmluZGluZykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUlUeXBlQmluZGluZyByZXR1cm5UeXBlID0gbWV0aG9kQmluZGluZy5nZXRSZXR1cm5UeXBlKCk7Ci0JCWlmIChyZXR1cm5UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSByZXR1cm5UeXBlLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJaWYgKHJldHVyblR5cGVOYW1lLmVxdWFscygidm9pZCIpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG1ldGhvZEJpbmRpbmcuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggIT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2RCaW5kaW5nLmdldE5hbWUoKTsKLQkJaW50IGJlZ2luSW5kZXggPSAwOwotCQlib29sZWFuIGJvb2xlYW5HZXR0ZXIgPSBmYWxzZTsKLQkJaWYgKG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgiaXMiKSkgewotCQkJaWYgKHJldHVyblR5cGVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7Ci0JCQkJYmVnaW5JbmRleCA9IDI7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImdldCIpKSB7Ci0JCQkJYmVnaW5JbmRleCA9IDM7Ci0JCQkJaWYgKHJldHVyblR5cGVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7Ci0JCQkJCWJvb2xlYW5HZXR0ZXIgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKGJlZ2luSW5kZXgpOwotCQkvLyBpZiB0aGUgdHlwZSBoYXMgYm90aCBtZXRob2RzOgotCQkvLyAgICAgYm9vbGVhbiBpc1Byb3BlcnR5KCkKLQkJLy8gICAgIGJvb2xlYW4gZ2V0UHJvcGVydHkoKQotCQkvLyB0aGVuICNpc1Byb3BlcnR5KCkgdGFrZXMgcHJlY2VkZW5jZSBhbmQgd2UgaWdub3JlICNnZXRQcm9wZXJ0eSgpCi0JCS8vIChzZWUgdGhlIEphdmFCZWFucyBzcGVjIDEuMDEpCi0JCWlmIChib29sZWFuR2V0dGVyKSB7Ci0JCQlJTWV0aG9kQmluZGluZyBpc01ldGhvZCA9IG1ldGhvZEJpbmRpbmdOb1BhcmFtZXRlcnMobWV0aG9kQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpLCAiaXMiICsgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChpc01ldGhvZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKGlzTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJib29sZWFuIikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJSU1ldGhvZEJpbmRpbmcgc2V0TWV0aG9kID0gbWV0aG9kQmluZGluZ09uZVBhcmFtZXRlcihtZXRob2RCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCksICJzZXQiICsgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lLCByZXR1cm5UeXBlTmFtZSk7Ci0JCWlmIChzZXRNZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChtZXRob2RIYXNCYWRNb2RpZmllcnMoc2V0TWV0aG9kKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISBzZXRNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nTm9QYXJhbWV0ZXJzKElUeXBlQmluZGluZyB0eXBlQmluZGluZywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJZm9yIChJTWV0aG9kQmluZGluZyBtZXRob2QgOiB0eXBlQmluZGluZy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgewotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0JCQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCXJldHVybiBtZXRob2Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nT25lUGFyYW1ldGVyKElUeXBlQmluZGluZyB0eXBlQmluZGluZywgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBwYXJhbWV0ZXJUeXBlTmFtZSkgewotCQlmb3IgKElNZXRob2RCaW5kaW5nIG1ldGhvZCA6IHR5cGVCaW5kaW5nLmdldERlY2xhcmVkTWV0aG9kcygpKSB7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsKLQkJCQlpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDEpIHsKLQkJCQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMocGFyYW1ldGVyVHlwZU5hbWUpKSB7Ci0JCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWV0aG9kJ3MgbW9kaWZpZXJzIHByZXZlbnQgaXQKLQkgKiBmcm9tIGJlaW5nIGEgZ2V0dGVyIG9yIHNldHRlciBmb3IgYSAicGVyc2lzdGVudCIgcHJvcGVydHkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RIYXNCYWRNb2RpZmllcnMoSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotCQlpZiAobWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWludCBtb2RpZmllcnMgPSBtZXRob2RCaW5kaW5nLmdldE1vZGlmaWVycygpOwotCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKE1vZGlmaWVyLmlzRmluYWwobW9kaWZpZXJzKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCAhIChNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpIHx8IE1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIG1heSBiZSAicGVyc2lzdGVkIiwgaWUgbWFya2VkIGFzIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcywgRW1iZWRkYWJsZQotCSAqLwotCS8vVE9ETyBzaG91bGQgcGVyc2lzdGFiaWxpdHkgYmUgZGVwZW5kZW50IG9uIGhhdmluZyBhIG5vLWFyZyBjb25zdHJ1Y3RvciBvciBzaG91bGQgdGhhdCBqdXN0IGJlIHZhbGlkYXRpb24/Ci0JLy9zZWVtcyBsaWtlIGZpbmFsLCBvciBhIG1lbWJlciB0eXBlIGJlaW5nIHN0YXRpYyBjb3VsZCBiZSBkZWFsdCB3aXRoIHRocm91Z2ggdmFsaWRhdGlvbiBpbnN0ZWFkIG9mIGZpbHRlcmluZyB0aGVtIG91dC4KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUlzUGVyc2lzdGFibGUoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0JCWlmICh0eXBlQmluZGluZy5pc0ludGVyZmFjZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHR5cGVCaW5kaW5nLmlzQW5ub3RhdGlvbigpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHR5cGVCaW5kaW5nLmlzRW51bSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHR5cGVCaW5kaW5nLmlzTG9jYWwoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICh0eXBlQmluZGluZy5pc0Fub255bW91cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IG1vZGlmaWVycyA9IHR5cGVCaW5kaW5nLmdldE1vZGlmaWVycygpOwotCQlpZiAoTW9kaWZpZXIuaXNGaW5hbChtb2RpZmllcnMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHR5cGVCaW5kaW5nLmlzTWVtYmVyKCkpIHsKLQkJCWlmICghTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9NZW1iZXJBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L01lbWJlckFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTJmYTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L01lbWJlckFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLS8qKgotICogQWRhcHQgYSBtZW1iZXIgYW5kIGEgZGVjbGFyYXRpb24gYW5ub3RhdGlvbiBhZGFwdGVyLgotICovCi1wdWJsaWMgY2xhc3MgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25BZGFwdGVyIHsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIoTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIobWVtYmVyLCBkYWEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L01lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L01lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWY4NTRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9NZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotIC8qKgotICogQWRhcHQgYSBtZW1iZXIgYW5kIGEgZGVjbGFyYXRpb24gYW5ub3RhdGlvbiBlbGVtZW50IGFkYXB0ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLQlpbXBsZW1lbnRzIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotewotCXByaXZhdGUgZmluYWwgTWVtYmVyIG1lbWJlcjsKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+IGRhZWE7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcihNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiBkYWVhKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubWVtYmVyID0gbWVtYmVyOwotCQl0aGlzLmRhZWEgPSBkYWVhOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRhZWEuZ2V0VmFsdWUodGhpcy5tZW1iZXIuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgVCBnZXRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kYWVhLmdldFZhbHVlKHRoaXMubWVtYmVyLmdldE1vZGlmaWVkRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJdGhpcy5lZGl0KHRoaXMuYnVpbGRTZXRWYWx1ZUVkaXRvcih2YWx1ZSkpOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZGFlYS5nZXRFeHByZXNzaW9uKHRoaXMubWVtYmVyLmdldE1vZGlmaWVkRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZGFlYS5nZXRBc3ROb2RlKHRoaXMubWVtYmVyLmdldE1vZGlmaWVkRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZGFlYSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdChNZW1iZXIuRWRpdG9yIGVkaXRvcikgewotCQl0aGlzLm1lbWJlci5lZGl0KGVkaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIE1lbWJlci5FZGl0b3IgYnVpbGRTZXRWYWx1ZUVkaXRvcihUIHZhbHVlKSB7Ci0JCXJldHVybiBuZXcgU2V0VmFsdWVFZGl0b3I8VD4odmFsdWUsIHRoaXMuZGFlYSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgU2V0VmFsdWVFZGl0b3I8VD4gaW1wbGVtZW50cyBNZW1iZXIuRWRpdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiBkYWVhOwotCQlwcml2YXRlIGZpbmFsIFQgdmFsdWU7Ci0KLQkJU2V0VmFsdWVFZGl0b3IoVCB2YWx1ZSwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gZGFlYSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMuZGFlYSA9IGRhZWE7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLmRhZWEuc2V0VmFsdWUodGhpcy52YWx1ZSwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9NZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9NZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlZWI0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFkYXB0IGEgbWVtYmVyIGFuZCBhbiBpbmRleGVkIGRlY2xhcmF0aW9uIGFubm90YXRpb24gYWRhcHRlci4KLSAqLwotcHVibGljIGNsYXNzIE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uQWRhcHRlcgotCWltcGxlbWVudHMgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoTWVtYmVyIG1lbWJlciwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQlzdXBlcihtZW1iZXIsIGlkYWEpOwotCQl0aGlzLmlkYWEgPSBpZGFhOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaWRhYS5nZXRJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgewotCQl0aGlzLmVkaXQodGhpcy5idWlsZE1vdmVBbm5vdGF0aW9uRWRpdG9yKG5ld0luZGV4KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTWVtYmVyLkVkaXRvciBidWlsZE1vdmVBbm5vdGF0aW9uRWRpdG9yKGludCBuZXdJbmRleCkgewotCQlyZXR1cm4gbmV3IE1vdmVBbm5vdGF0aW9uRWRpdG9yKHRoaXMuaWRhYSwgbmV3SW5kZXgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE1vdmVBbm5vdGF0aW9uRWRpdG9yIGltcGxlbWVudHMgTWVtYmVyLkVkaXRvciB7Ci0JCXByaXZhdGUgZmluYWwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYTsKLQkJcHJpdmF0ZSBpbnQgaW5kZXg7Ci0KLQkJTW92ZUFubm90YXRpb25FZGl0b3IoSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSwgaW50IGluZGV4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pZGFhID0gaWRhYTsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJfQotCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXRoaXMuaWRhYS5tb3ZlQW5ub3RhdGlvbih0aGlzLmluZGV4LCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmZDY1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhIG5hbWUgdG8vZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG5hbWUvaWRlbnRpZmllcgotICogKGUuZy4gImNvbS54eHguRm9vLlZBTFVFMSIgb3IgInZhbHVlIikuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gSU5TVEFOQ0UgPSBuZXcgTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE5hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOYW1lIGNvbnZlcnRPYmplY3QoU3RyaW5nIHN0cmluZywgQVNUIGFzdCkgewotCQlyZXR1cm4gYXN0Lm5ld05hbWUoc3RyaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlzd2l0Y2ggKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBBU1ROb2RlLlFVQUxJRklFRF9OQU1FOgotCQkJY2FzZSBBU1ROb2RlLlNJTVBMRV9OQU1FOgotCQkJCXJldHVybiAoKE5hbWUpIGV4cHJlc3Npb24pLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOTkxYTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBNYW5pcHVsYXRlIGFuIGFubm90YXRpb24gdGhhdCBpcyBlbWJlZGRlZCBhcyBhbiBlbGVtZW50IHdpdGhpbgotICogYW5vdGhlciBhbm5vdGF0aW9uLCBlLmcuCi0gKiA8cHJlPgotICogICAgICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIpCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiAgICAgICAgIG91dGVyQW5ub3RhdGlvbkFkYXB0ZXIgPSBBbm5vdGF0aW9uQWRhcHRlcjwmIzY0O091dGVyPgotICogICAgICAgICBlbGVtZW50TmFtZSA9ICJmb28iCi0gKiAgICAgICAgIGFubm90YXRpb25OYW1lID0gIklubmVyIgotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogZGVmYXVsdCBlbGVtZW50IG5hbWUgaXMgInZhbHVlIjsKLQkgKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgb3V0ZXIgYW5ub3RhdGlvbiB3aGVuIGl0IGlzIGVtcHR5Ci0JICovCi0JcHVibGljIE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBvdXRlckFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJc3VwZXIob3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBvdXRlciBhbm5vdGF0aW9uIHdoZW4gaXQgaXMgZW1wdHkKLQkgKi8KLQlwdWJsaWMgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG91dGVyQW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN1cGVyKG91dGVyQW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHVibGljIE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBvdXRlckFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgYm9vbGVhbiByZW1vdmVPdXRlckFubm90YXRpb25XaGVuRW1wdHkpIHsKLQkJc3VwZXIob3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGFubm90YXRpb25OYW1lLCByZW1vdmVPdXRlckFubm90YXRpb25XaGVuRW1wdHkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25WYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gYnVpbGROZXdJbm5lckV4cHJlc3Npb24oQW5ub3RhdGlvbiBpbm5lcikgewotCQlyZXR1cm4gaW5uZXI7Ci0JfQotCi0JLyoqCi0JICogdGhlIGFubm90YXRpb24gaXMgdGhlIGV4cHJlc3Npb24gaXRzZWxmLCBzbyB0aGUgYW5ub3RhdGlvbiBjYW5ub3QgYmUKLQkgKiAicmVtb3ZlZCIgZnJvbSBpdHNlbGYgLSByZXR1cm4gJ2ZhbHNlJwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBvdXRlciwgRXhwcmVzc2lvbiB2YWx1ZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHByZT4KLQkgKiAmIzY0O091dGVyKCJsb3JlbSBpcHN1bSIpID0+ICYjNjQ7T3V0ZXIoJiM2NDtJbm5lcikKLQkgKiA8L3ByZT4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlBbm5vdGF0aW9uVmFsdWUoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQkvLyByZXBsYWNlKD8pIHRoZSBjdXJyZW50IGVsZW1lbnQgdmFsdWUKLQkJb3V0ZXIuc2V0VmFsdWUoaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIFNpbXBseSBzZXQgdGhlIHBhaXIncyB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlNZW1iZXJWYWx1ZVBhaXIoTWVtYmVyVmFsdWVQYWlyIHBhaXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJcGFpci5zZXRWYWx1ZShpbm5lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTAzNTkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBNYW5pcHVsYXRlIGFuIGFubm90YXRpb24gdGhhdCBpcyBlbWJlZGRlZCBpbiBhbiBlbGVtZW50IGFycmF5IHdpdGhpbgotICogYW5vdGhlciBhbm5vdGF0aW9uLCBlLmcuCi0gKiA8cHJlPgotICogICAgICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyKCJ6ZXJvIiksICYjNjQ7SW5uZXIoIm9uZSIpLCAmIzY0O0lubmVyKCJ0d28iKX0pCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiAgICAgICAgIG91dGVyQW5ub3RhdGlvbkFkYXB0ZXIgPSBBbm5vdGF0aW9uQWRhcHRlcjwmIzY0O091dGVyPgotICogICAgICAgICBlbGVtZW50TmFtZSA9ICJmb28iCi0gKiAgICAgICAgIGluZGV4ID0gMC0yCi0gKiAgICAgICAgIGFubm90YXRpb25OYW1lID0gIklubmVyIgotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi0JaW1wbGVtZW50cyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotewotCXByaXZhdGUgaW50IGluZGV4OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyAidmFsdWUiOwotCSAqIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBvdXRlciBhbm5vdGF0aW9uIHdoZW4gaXQgaXMgZW1wdHkKLQkgKi8KLQlwdWJsaWMgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgaW50IGluZGV4LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJc3VwZXIoYW5ub3RhdGlvbkFkYXB0ZXIsIGFubm90YXRpb25OYW1lKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCS8qKgotCSAqIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBvdXRlciBhbm5vdGF0aW9uIHdoZW4gaXQgaXMgZW1wdHkKLQkgKi8KLQlwdWJsaWMgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBpbnQgaW5kZXgsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlzdXBlcihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGFubm90YXRpb25OYW1lKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCXB1YmxpYyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIGludCBpbmRleCwgU3RyaW5nIGFubm90YXRpb25OYW1lLCBib29sZWFuIHJlbW92ZU91dGVyQW5ub3RhdGlvbldoZW5FbXB0eSkgewotCQlzdXBlcihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGFubm90YXRpb25OYW1lLCByZW1vdmVPdXRlckFubm90YXRpb25XaGVuRW1wdHkpOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0TmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJaWYgKHZhbHVlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgewotCQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbigoQXJyYXlJbml0aWFsaXplcikgdmFsdWUpOwotCQl9Ci0JCXJldHVybiAodGhpcy5pbmRleCA9PSAwKSA/IHRoaXMuYW5ub3RhdGlvblZhbHVlKHZhbHVlKSA6IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gYnVpbGROZXdJbm5lckV4cHJlc3Npb24oQW5ub3RhdGlvbiBpbm5lcikgewotCQlyZXR1cm4gKHRoaXMuaW5kZXggPT0gMCkgPyBpbm5lciA6IChFeHByZXNzaW9uKSB0aGlzLmJ1aWxkTmV3SW5uZXJBcnJheUluaXRpYWxpemVyKGlubmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gb3V0ZXIsIEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJaWYgKHZhbHVlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgewotCQkJdGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBvdXRlciwgKEFycmF5SW5pdGlhbGl6ZXIpIHZhbHVlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGlmIG91ciBpbmRleCBpcyBncmVhdGVyIHRoYW4gemVybywgYnV0IHdlIGRvbid0IGhhdmUgYW4gYXJyYXksCi0JCS8vIHRoZW4gdGhlIGFubm90YXRpb24gbXVzdCBhbHJlYWR5IGJlIGdvbmUKLQkJcmV0dXJuICh0aGlzLmluZGV4ICE9IDApOwotCX0KLQotCS8qKgotCSAqIDxwcmU+Ci0JICogJiM2NDtPdXRlcih7JiM2NDtJbm5lcigwKSwgJiM2NDtJbm5lcigxKX0pID0+ICYjNjQ7T3V0ZXIoeyYjNjQ7SW5uZXIoMCksICYjNjQ7SW5uZXIoMSksICYjNjQ7SW5uZXIoMil9KQotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoImxvcmVtIGlwc3VtIikgPT4gJiM2NDtPdXRlcigmIzY0O0lubmVyKDApKQotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoJiM2NDtJbm5lcigwKSkgPT4gJiM2NDtPdXRlcih7JiM2NDtJbm5lcigwKSwgJiM2NDtJbm5lcigxKX0pCi0JICogPC9wcmU+Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvblZhbHVlKFNpbmdsZU1lbWJlckFubm90YXRpb24gb3V0ZXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJdGhpcy5tb2RpZnlFeHByZXNzaW9uKG91dGVyLCBTSU5HTEVfTUVNQkVSX0FOTk9UQVRJT05fRVhQUkVTU0lPTl9QUk9WSURFUiwgaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIDxwcmU+Ci0JICogJiM2NDtPdXRlcih0ZXh0PSJsb3JlbSBpcHN1bSIpID0+ICYjNjQ7T3V0ZXIodGV4dD0ibG9yZW0gaXBzdW0iLCBmb289JiM2NDtJbm5lcigwKSkKLQkgKiAgICAgb3IKLQkgKiAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lcigwKSwgJiM2NDtJbm5lcigxKX0pID0+ICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyKDApLCAmIzY0O0lubmVyKDEpLCAmIzY0O0lubmVyKDIpfSkKLQkgKiAgICAgb3IKLQkgKiAmIzY0O091dGVyKGZvbz0ibG9yZW0gaXBzdW0iKSA9PiAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKDApKQotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7Tm90SW5uZXIpID0+ICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIoMCkpCi0JICogICAgIG9yCi0JICogJiM2NDtPdXRlcihmb289JiM2NDtJbm5lcigwKSkgPT4gJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIoMCksICYjNjQ7SW5uZXIoMSl9KQotCSAqIDwvcHJlPgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG1vZGlmeU1lbWJlclZhbHVlUGFpcihNZW1iZXJWYWx1ZVBhaXIgcGFpciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQl0aGlzLm1vZGlmeUV4cHJlc3Npb24ocGFpciwgTUVNQkVSX1ZBTFVFX1BBSVJfRVhQUkVTU0lPTl9QUk9WSURFUiwgaW5uZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5pbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBhbm5vdGF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXgsIGxlYXZpbmcgaXRzIG9yaWdpbmFsCi0JICogcG9zaXRpb24gY2xlYXJlZCBvdXQuCi0JICovCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4LCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWludCBvbGRJbmRleCA9IHRoaXMuaW5kZXg7Ci0JCWlmIChuZXdJbmRleCA9PSBvbGRJbmRleCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQW5ub3RhdGlvbiBvcmlnaW5hbCA9IHRoaXMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChvcmlnaW5hbCA9PSBudWxsKSB7Ci0JCQl0aGlzLmluZGV4ID0gbmV3SW5kZXg7Ci0JCQl0aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOyAgLy8gY2xlYXIgb3V0IHRoZSBuZXcgbG9jYXRpb24gKD8pCi0JCX0gZWxzZSB7Ci0JCQlBbm5vdGF0aW9uIGNvcHkgPSAoQW5ub3RhdGlvbikgQVNUTm9kZS5jb3B5U3VidHJlZShvcmlnaW5hbC5nZXRBU1QoKSwgb3JpZ2luYWwpOwotCQkJdGhpcy5pbmRleCA9IG5ld0luZGV4OwotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBjb3B5KTsgIC8vIGluc3RhbGwgdGhlIGNvcHkgaW4gdGhlIG5ldyBsb2NhdGlvbgotCQkJdGhpcy5pbmRleCA9IG9sZEluZGV4OwotCQkJdGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsgIC8vIGdvIGJhY2sgYW5kIGNsZWFyIG91dCB0aGUgb3JpZ2luYWwgbG9jYXRpb24gKEFGVEVSIHRoZSBtb3ZlKQotCQkJdGhpcy5pbmRleCA9IG5ld0luZGV4OwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhZGFwdGVyJ3MgYW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgaW5pdGlhbGl6ZXIuCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGFubm90YXRpb24oQXJyYXlJbml0aWFsaXplciB2YWx1ZSkgewotCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucyh2YWx1ZSk7Ci0JCXJldHVybiAodGhpcy5pbmRleCA+PSBleHByZXNzaW9ucy5zaXplKCkpID8gbnVsbCA6IHRoaXMuYW5ub3RhdGlvblZhbHVlKGV4cHJlc3Npb25zLmdldCh0aGlzLmluZGV4KSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBuZXcgYXJyYXkgaW5pdGlhbGl6ZXIgdG8gaG9sZCB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24sCi0JICogcGFkZGluZyBpdCB3aXRoICdudWxsJyBsaXRlcmFscyBhcyBuZWNlc3NhcnkKLQkgKi8KLQlwcml2YXRlIEFycmF5SW5pdGlhbGl6ZXIgYnVpbGROZXdJbm5lckFycmF5SW5pdGlhbGl6ZXIoQW5ub3RhdGlvbiBpbm5lcikgewotCQlBcnJheUluaXRpYWxpemVyIGFpID0gaW5uZXIuZ2V0QVNUKCkubmV3QXJyYXlJbml0aWFsaXplcigpOwotCQl0aGlzLmFkZElubmVyVG9FeHByZXNzaW9ucyhpbm5lciwgdGhpcy5leHByZXNzaW9ucyhhaSkpOwotCQlyZXR1cm4gYWk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGFycmF5IGluaXRpYWxpemVyLAotCSAqIHBhZGRpbmcgaXQgd2l0aCAnbnVsbCcgbGl0ZXJhbHMgYXMgbmVjZXNzYXJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZElubmVyVG9FeHByZXNzaW9ucyhBbm5vdGF0aW9uIGlubmVyLCBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zKSB7Ci0JCWlmIChleHByZXNzaW9ucy5zaXplKCkgPiB0aGlzLmluZGV4KSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHByZXNzaW9ucyBzaXplIGlzIGdyZWF0ZXIgdGhhbiBpbmRleCAtIHNpemU6ICIgKyBleHByZXNzaW9ucy5zaXplKCkgKyAiIC0gaW5kZXg6ICIgKyB0aGlzLmluZGV4KTsKLQkJfQotCQl3aGlsZSAoZXhwcmVzc2lvbnMuc2l6ZSgpIDwgdGhpcy5pbmRleCkgewotCQkJZXhwcmVzc2lvbnMuYWRkKGlubmVyLmdldEFTVCgpLm5ld051bGxMaXRlcmFsKCkpOwotCQl9Ci0JCWV4cHJlc3Npb25zLmFkZChpbm5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBhZGFwdGVyJ3MgYW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgaW5pdGlhbGl6ZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBvdXRlciwgQXJyYXlJbml0aWFsaXplciB2YWx1ZSkgewotCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucyh2YWx1ZSk7Ci0JCWlmICh0aGlzLmluZGV4ID49IGV4cHJlc3Npb25zLnNpemUoKSkgewotCQkJcmV0dXJuOyAgLy8gYXZvaWQgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbig/KQotCQl9Ci0JCUFubm90YXRpb24gaW5uZXIgPSB0aGlzLmFubm90YXRpb25WYWx1ZShleHByZXNzaW9ucy5nZXQodGhpcy5pbmRleCkpOwotCQlpZiAoaW5uZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICggISB0aGlzLm5hbWVNYXRjaGVzKGRlY2xhcmF0aW9uLCBpbm5lcikpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5pbmRleCA9PSAoZXhwcmVzc2lvbnMuc2l6ZSgpIC0gMSkpIHsKLQkJCWV4cHJlc3Npb25zLnJlbW92ZSh0aGlzLmluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCWV4cHJlc3Npb25zLnNldCh0aGlzLmluZGV4LCB2YWx1ZS5nZXRBU1QoKS5uZXdOdWxsTGl0ZXJhbCgpKTsKLQkJfQotCQl0aGlzLnRyaW1FeHByZXNzaW9ucyhkZWNsYXJhdGlvbiwgb3V0ZXIsIGV4cHJlc3Npb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJpcCBhbGwgdGhlIG51bGwgbGl0ZXJhbHMgb2ZmIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBsaXN0IG9mIGV4cHJlc3Npb25zCi0JICogYW5kIG5vcm1hbGl6ZSB0aGUgc3BlY2lmaWVkIG91dGVyIGFubm90YXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyaW1FeHByZXNzaW9ucyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIG91dGVyLCBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zKSB7Ci0JCS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QKLQkJZm9yIChpbnQgaSA9IGV4cHJlc3Npb25zLnNpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoZXhwcmVzc2lvbnMuZ2V0KGkpLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5OVUxMX0xJVEVSQUwpIHsKLQkJCQlleHByZXNzaW9ucy5yZW1vdmUoaSk7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOyAgLy8gc3RvcCB3aXRoIHRoZSBmaXJzdCBub24tbnVsbCBsaXRlcmFsIGVuY291bnRlcmVkCi0JCQl9Ci0JCX0KLQkJc3dpdGNoIChleHByZXNzaW9ucy5zaXplKCkpIHsKLQkJCWNhc2UgMDoKLQkJCQl0aGlzLnJlbW92ZUVsZW1lbnRBbmROb3JtYWxpemUoZGVjbGFyYXRpb24sIG91dGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQl0aGlzLmNvbnZlcnRBcnJheVRvTGFzdFJlbWFpbmluZ0V4cHJlc3Npb24ob3V0ZXIsIGV4cHJlc3Npb25zLmdldCgwKSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2hlbiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIGVsZW1lbnQgaW4gYW4gYXJyYXkgaW5pdGlhbGl6ZXIsIGNvbnZlcnQgdGhlCi0JICogZXhwcmVzc2lvbiB0byBiZSBqdXN0IHRoZSBzaW5nbGUgZWxlbWVudDsgZS5nLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7Rm9vKHh4eD17ImFiYyJ9KSA9PiAmIzY0O0Zvbyh4eHg9ImFiYyIpCi0JICogb3IKLQkgKiAgICAgJiM2NDtGb28oeyJhYmMifSkgPT4gJiM2NDtGb28oImFiYyIpCi0JICogPC9wcmU+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbnZlcnRBcnJheVRvTGFzdFJlbWFpbmluZ0V4cHJlc3Npb24oQW5ub3RhdGlvbiBvdXRlciwgRXhwcmVzc2lvbiBsYXN0VmFsdWUpIHsKLQkJbGFzdFZhbHVlID0gKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUobGFzdFZhbHVlLmdldEFTVCgpLCBsYXN0VmFsdWUpOwotCQlpZiAob3V0ZXIuaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMubWVtYmVyVmFsdWVQYWlyKChOb3JtYWxBbm5vdGF0aW9uKSBvdXRlcikuc2V0VmFsdWUobGFzdFZhbHVlKTsKLQkJfSBlbHNlIGlmIChvdXRlci5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBvdXRlcikuc2V0VmFsdWUobGFzdFZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVuZXhwZWN0ZWQgYW5ub3RhdGlvbiB0eXBlOiAiICsgb3V0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFuaXB1bGF0ZSB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gYXBwcm9wcmlhdGVseS4KLQkgKiBJZiBpdCBpcyBhbiBhcnJheSBpbml0aWFsaXplciwgYWRkIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiB0byBpdC4KLQkgKiBJZiBpdCBpcyBub3QsIHJlcGxhY2UgdGhlIGV4cHJlc3Npb24gb3IgY29udmVydCBpdCBpbnRvIGFuIGFycmF5Ci0JICogaW5pdGlhbGl6ZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vZGlmeUV4cHJlc3Npb24oQVNUTm9kZSBub2RlLCBFeHByZXNzaW9uUHJvdmlkZXIgZXhwUHJvdmlkZXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJRXhwcmVzc2lvbiB2YWx1ZSA9IGV4cFByb3ZpZGVyLmdldEV4cHJlc3Npb24obm9kZSk7Ci0JCWlmICh2YWx1ZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpIHsKLQkJCS8vIGlnbm9yZSB0aGUgb3RoZXIgZW50cmllcyBpbiB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIoPykgLSB0aGV5IG1heSBub3QgYmUgbWF0Y2hpbmcgQW5ub3RhdGlvbnMuLi4KLQkJCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSB0aGlzLmV4cHJlc3Npb25zKChBcnJheUluaXRpYWxpemVyKSB2YWx1ZSk7Ci0JCQlpZiAodGhpcy5pbmRleCA+PSBleHByZXNzaW9ucy5zaXplKCkpIHsKLQkJCQl0aGlzLmFkZElubmVyVG9FeHByZXNzaW9ucyhpbm5lciwgZXhwcmVzc2lvbnMpOwotCQkJfSBlbHNlIHsKLQkJCQlleHByZXNzaW9ucy5zZXQodGhpcy5pbmRleCwgaW5uZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuaW5kZXggPT0gMCkgewotCQkJCS8vIHJlcGxhY2Ugd2hhdGV2ZXIgd2FzIHRoZXJlIGJlZm9yZQotCQkJCWV4cFByb3ZpZGVyLnNldEV4cHJlc3Npb24obm9kZSwgaW5uZXIpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBjb252ZXJ0IHRvIGFuIGFycmF5Ci0JCQkJQXJyYXlJbml0aWFsaXplciBhaSA9IGlubmVyLmdldEFTVCgpLm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucyhhaSk7Ci0JCQkJZXhwcmVzc2lvbnMuYWRkKChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZhbHVlLmdldEFTVCgpLCB2YWx1ZSkpOwotCQkJCXRoaXMuYWRkSW5uZXJUb0V4cHJlc3Npb25zKGlubmVyLCBleHByZXNzaW9ucyk7Ci0JCQkJZXhwUHJvdmlkZXIuc2V0RXhwcmVzc2lvbihub2RlLCBhaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyhBcnJheUluaXRpYWxpemVyIGFpKSB7Ci0JCXJldHVybiBhaS5leHByZXNzaW9ucygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHByZXNzaW9uIHByb3ZpZGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBkZWZpbmUgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHVzIHRvICJyZS11c2UiIHRoZSBjb2RlIGluCi0JICogI21vZGlmeUV4cHJlc3Npb24oQVNUTm9kZSwgRXhwcmVzc2lvblByb3ZpZGVyLCBBbm5vdGF0aW9uKQotCSAqLwotCXByaXZhdGUgaW50ZXJmYWNlIEV4cHJlc3Npb25Qcm92aWRlciB7Ci0JCUV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihBU1ROb2RlIG5vZGUpOwotCQl2b2lkIHNldEV4cHJlc3Npb24oQVNUTm9kZSBub2RlLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25Qcm92aWRlciBNRU1CRVJfVkFMVUVfUEFJUl9FWFBSRVNTSU9OX1BST1ZJREVSID0gbmV3IEV4cHJlc3Npb25Qcm92aWRlcigpIHsKLQkJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihBU1ROb2RlIG5vZGUpIHsKLQkJCXJldHVybiAoKE1lbWJlclZhbHVlUGFpcikgbm9kZSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEFTVE5vZGUgbm9kZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQkoKE1lbWJlclZhbHVlUGFpcikgbm9kZSkuc2V0VmFsdWUoZXhwcmVzc2lvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk1lbWJlclZhbHVlUGFpckV4cHJlc3Npb25Qcm92aWRlciI7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvblByb3ZpZGVyIFNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTl9FWFBSRVNTSU9OX1BST1ZJREVSID0gbmV3IEV4cHJlc3Npb25Qcm92aWRlcigpIHsKLQkJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihBU1ROb2RlIG5vZGUpIHsKLQkJCXJldHVybiAoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIG5vZGUpLmdldFZhbHVlKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihBU1ROb2RlIG5vZGUsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBub2RlKS5zZXRWYWx1ZShleHByZXNzaW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHJlc3Npb25Qcm92aWRlciI7Ci0JCX0KLQl9OwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjMyZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIKLQlpbXBsZW1lbnRzIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyCi17Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXQoSURvY3VtZW50IGRvYywgVGV4dEVkaXQgZWRpdFRyZWUpIHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIG5vIGZvcm1hdHRpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YWQ4NGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCZWhhdmlvcmxlc3MgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotCWltcGxlbWVudHMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIElOU1RBTkNFID0gbmV3IE51bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBOdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE1hcmtlckFubm90YXRpb24gbmV3TWFya2VyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9ybWFsQW5ub3RhdGlvbiBuZXdOb3JtYWxBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTNhNjk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi0vKioKLSAqIEJlaGF2aW9ybGVzcyBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE51bGxEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotCWltcGxlbWVudHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLXsKLQotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyIElOU1RBTkNFCi0JCQk9IG5ldyBOdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFM+IERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFM+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVCBnZXRWYWx1ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDNiOTgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBObyBjb252ZXJzaW9uLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIKLQlpbXBsZW1lbnRzIEV4cHJlc3Npb25Db252ZXJ0ZXI8RXhwcmVzc2lvbj4KLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8RXhwcmVzc2lvbj4gSU5TVEFOQ0UgPSBuZXcgTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxFeHByZXNzaW9uPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOdWxsRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbiBjb252ZXJ0KEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgQVNUIGFzdCkgewotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbiBjb252ZXJ0KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNmUxZmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgYSBudW1iZXIgbGl0ZXJhbCB0by9mcm9tIGFuIEludGVnZXIKLSAqIChlLmcuIDUpLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxJbnRlZ2VyPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8SW50ZWdlcj4gSU5TVEFOQ0UgPSBuZXcgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxJbnRlZ2VyPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE51bWJlckxpdGVyYWwgY29udmVydE9iamVjdChJbnRlZ2VyIGludGVnZXIsIEFTVCBhc3QpIHsKLQkJcmV0dXJuIGFzdC5uZXdOdW1iZXJMaXRlcmFsKGludGVnZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEludGVnZXIgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGV4cHJlc3Npb24ucmVzb2x2ZUNvbnN0YW50RXhwcmVzc2lvblZhbHVlKCk7Ci0JCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSA/ICgoSW50ZWdlcikgdmFsdWUpIDogbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9QcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1ByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOTk5MDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1ByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUHJpbWl0aXZlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLQotLyoqCi0gKiBDb252ZXJ0IGEgdHlwZSBsaXRlcmFsIHRvL2Zyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBwcmltaXRpdmUgdHlwZQotICogKGUuZy4gImludCIpLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFID0gbmV3IFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHlwZUxpdGVyYWwgY29udmVydE9iamVjdChTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7Ci0JCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlIHR5cGUgPSBhc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLnRvQ29kZShzdHJpbmcpKTsKLQkJVHlwZUxpdGVyYWwgdHlwZUxpdGVyYWwgPSBhc3QubmV3VHlwZUxpdGVyYWwoKTsKLQkJdHlwZUxpdGVyYWwuc2V0VHlwZSh0eXBlKTsKLQkJcmV0dXJuIHR5cGVMaXRlcmFsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCWlmIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0xJVEVSQUwpIHsKLQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlIHR5cGUgPSAoKFR5cGVMaXRlcmFsKSBleHByZXNzaW9uKS5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUFJJTUlUSVZFX1RZUEUpIHsKLQkJCQlyZXR1cm4gKChQcmltaXRpdmVUeXBlKSB0eXBlKS5nZXRQcmltaXRpdmVUeXBlQ29kZSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ODY1OGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1Nob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGFubm90YXRpb24gZWxlbWVudCBhZGFwdGVyIGFuZCBzaG9ydC1jaXJjdWl0IHRoZQotICogI3NldFZhbHVlIG1ldGhvZCBpZiB0aGUgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkLgotICovCi1wdWJsaWMgY2xhc3MgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+Ci0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLXsKLQkvKiogdGhlIHdyYXBwZWQgYWRhcHRlciAqLwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+IGFkYXB0ZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcihNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiBkYWVhKSB7Ci0JCXRoaXMobmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPihtZW1iZXIsIGRhZWEpKTsKLQl9Ci0KLQlwdWJsaWMgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFubm90YXRpb25FbGVtZW50QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBUIGdldFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQl0aGlzLnNldFZhbHVlKHRoaXMuYWRhcHRlci5nZXRWYWx1ZSgpLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIEFTVE5vZGUgZ2V0QXN0Tm9kZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEFzdE5vZGUoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5hZGFwdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzZXQgdGhlIGFkYXB0ZXIncyB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBpZiBpdAotCSAqIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoVCBvbGRWYWx1ZSwgVCBuZXdWYWx1ZSkgewotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsgIC8vIG51bGwgPT4gbnVsbAotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0gZWxzZSB7ICAvLyBudWxsID0+IG9iamVjdAotCQkJCXRoaXMuYWRhcHRlci5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgeyAgLy8gb2JqZWN0ID0+IG51bGwKLQkJCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUobmV3VmFsdWUpOwotCQkJfSBlbHNlIHsgIC8vIG9iamVjdCA9PiBvYmplY3QKLQkJCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7Ci0JCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQl9IGVsc2UgewotCQkJCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUobmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGJvdGggdmFsdWVzIGFyZSBub24tbnVsbCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbHVlc0FyZUVxdWFsKFQgb2xkVmFsdWUsIFQgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIG5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2hvcnRDaXJjdWl0QXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjZjYzM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlciBhbmQgc2hvcnQtY2lyY3VpdCB0aGUKLSAqICNzZXRWYWx1ZSBtZXRob2QgaWYgdGhlIHZhbHVlIGhhcyBub3QgY2hhbmdlZC4gT3ZlcnJpZGVzICN2YWx1ZXNBcmVFcXVhbCgpCi0gKiB0byBjaGVjayBlcXVhbGl0eSBvbiBhcnJheXMKLSAqLwotcHVibGljIGNsYXNzIFNob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+Ci0JZXh0ZW5kcyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VFtdPgotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIFNob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFRbXT4gZGFlYSkgewotCQlzdXBlcihtZW1iZXIsIGRhZWEpOwotCX0KLQotCXB1YmxpYyBTaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VFtdPiBhZGFwdGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoVFtdIG9sZFZhbHVlLCBUW10gbmV3VmFsdWUpIHsKLQkJcmV0dXJuIEFycmF5cy5lcXVhbHMobmV3VmFsdWUsIG9sZFZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmE2NTc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBNYW5pcHVsYXRlIGFuIGFubm90YXRpb24gd2l0aCBhIHNwZWNpZmljIG5hbWUsIGUuZy4KLSAqIDxwcmU+Ci0gKiAgICAgJiM2NDtGb28KLSAqICAgICBwcml2YXRlIGludCBpZDsKLSAqIDwvcHJlPgotICogCi0gKiBOQjoKLSAqIElmIHRoZSBkZWNsYXJhdGlvbiBjb250YWlucyBtb3JlIHRoYW4gb25lIGFubm90YXRpb24gd2l0aCB0aGUgc2FtZQotICogbmFtZSwgdGhlIGFkYXB0ZXIgd2lsbCBjb3JyZXNwb25kIHRvIHRoZSBmaXJzdCBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZAotICogbmFtZS4gKEFsc28gbm90ZSB0aGF0IHRoZSBjb21waWxlciB3aWxsIG5vdCBhbGxvdyBhIGRlY2xhcmF0aW9uIHRvIGJlCi0gKiBtb2RpZmllZCBieSBtdWx0aXBsZSBhbm5vdGF0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUsIGkuZS4gb2YgdGhlIHNhbWUgdHlwZTsKLSAqIHNvIGlmIHRoZXJlICphcmUqIG11bHRpcGxlIGFubm90YXRpb25zIG9mIHRoZSBzYW1lIHR5cGUsIHRoZXJlIGFyZSBiaWdnZXIKLSAqIHByb2JsZW1zIHRvIHdvcnJ5IGFib3V0IHRoYW4gd2hpY2ggYW5ub3RhdGlvbiB0aGUgYWRhcHRlciBtYW5pcHVsYXRlcy4pCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHVibGljIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN1cGVyKGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZCh0aGlzLmdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlkZWNsYXJhdGlvbi5yZW1vdmVBbm5vdGF0aW9uTmFtZWQodGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlkZWNsYXJhdGlvbi5yZXBsYWNlQW5ub3RhdGlvbk5hbWVkKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSwgYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIEFTVE5vZGUgZ2V0QXN0Tm9kZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG1pc3NpbmcsIHJldHVybiB0aGUgZGVjbGFyYXRpb24KLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uICE9IG51bGwpID8gYW5ub3RhdGlvbiA6IGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjIyNTYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhIHR5cGUgbGl0ZXJhbCB0by9mcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2ltcGxlIHR5cGUKLSAqIChlLmcuICJqYXZhLmxhbmcuT2JqZWN0IikuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gSU5TVEFOQ0UgPSBuZXcgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUeXBlTGl0ZXJhbCBjb252ZXJ0T2JqZWN0KFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKLQkJTmFtZSBuYW1lID0gYXN0Lm5ld05hbWUoc3RyaW5nKTsKLQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUgdHlwZSA9IGFzdC5uZXdTaW1wbGVUeXBlKG5hbWUpOwotCQlUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCQl0eXBlTGl0ZXJhbC5zZXRUeXBlKHR5cGUpOwotCQlyZXR1cm4gdHlwZUxpdGVyYWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfTElURVJBTCkgewotCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUgdHlwZSA9ICgoVHlwZUxpdGVyYWwpIGV4cHJlc3Npb24pLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5TSU1QTEVfVFlQRSkgewotCQkJCXJldHVybiAoKFNpbXBsZVR5cGUpIHR5cGUpLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3NTFmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLQotLyoqCi0gKiBDb252ZXJ0IGFuIGFycmF5IGluaXRpYWxpemVyIHRvL2Zyb20gYW4gYXJyYXkgb2Ygc3RyaW5ncyAoZS5nLiB7InRleHQwIiwgInRleHQxIn0pLgotICogCi0gKiBEbyBOT1QgdXNlIHRoaXMgY2xhc3MgZm9yIGNvbnZlcnRpbmcgYXJyYXkgaW5pdGlhbGl6ZXJzIGluIGFubm90YXRpb24gZWxlbWVudHMuCi0gKiBKYXZhNSBoYXMgYSBiaXQgb2Ygc3ludGFjdGljIHN1Z2FyIHRoYXQgYWxsb3dzIGEgc2luZ2xlLWVsZW1lbnQgYXJyYXkKLSAqIGluaXRpYWxpemVyIHRvIG5vdCBoYXZlIGN1cmx5IGJyYWNlcy4gVGhpcyBjb252ZXJ0ZXIgd2lsbCByZXR1cm4gbnVsbCBpZiBpdCBlbmNvdW50ZXJzCi0gKiBhbnl0aGluZyBvdGhlciB0aGFuIGFuIGFycmF5IGluaXRpYWxpemVyLgotICogCi0gKiBJbnZhbGlkIGVudHJpZXMgaW4gdGhlIGFycmF5IGluaXRpYWxpemVyIHdpbGwgcmVzdWx0IGluIG51bGwgZWxlbWVudHMgaW4gdGhlCi0gKiByZXN1bHRpbmcgc3RyaW5nIGFycmF5LiBUaGlzIGFsbG93cyBjbGllbnRzIHRvIG1hbmlwdWxhdGUgZWxlbWVudHMgYXQKLSAqIHRoZSBhcHByb3ByaWF0ZSBpbmRleC4KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdPgotewotCXByaXZhdGUgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGVsZW1lbnRDb252ZXJ0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOwotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW1vdmUgdGhlIGFycmF5IGluaXRpYWxpemVyIGlmIGl0IGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBTdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGVsZW1lbnRDb252ZXJ0ZXIpIHsKLQkJdGhpcyhlbGVtZW50Q29udmVydGVyLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBlbGVtZW50Q29udmVydGVyLCBib29sZWFuIHJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50Q29udmVydGVyID0gZWxlbWVudENvbnZlcnRlcjsKLQkJdGhpcy5yZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5ID0gcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQkvKgotCSAqIHRoaXMgbWV0aG9kIGlzICdwdWJsaWMnIHNvIGl0IGNhbiBiZSBjYWxsZWQgYnkKLQkgKiBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyCi0JICovCi0JcHVibGljIEFycmF5SW5pdGlhbGl6ZXIgY29udmVydE9iamVjdChTdHJpbmdbXSBzdHJpbmdzLCBBU1QgYXN0KSB7Ci0JCWlmICgoc3RyaW5ncy5sZW5ndGggPT0gMCkgJiYgdGhpcy5yZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIgPSBhc3QubmV3QXJyYXlJbml0aWFsaXplcigpOwotCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucyhhcnJheUluaXRpYWxpemVyKTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogc3RyaW5ncykgewotCQkJZXhwcmVzc2lvbnMuYWRkKHRoaXMuZWxlbWVudENvbnZlcnRlci5jb252ZXJ0KHN0cmluZywgYXN0KSk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5SW5pdGlhbGl6ZXI7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zKEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplcikgewotCQlyZXR1cm4gYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpOwotCX0KLQotCS8qCi0JICogdGhpcyBtZXRob2QgaXMgJ3B1YmxpYycgc28gaXQgY2FuIGJlIGNhbGxlZCBieQotCSAqIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gY29udmVydE51bGwoKSB7Ci0JCXJldHVybiBFTVBUWV9TVFJJTkdfQVJSQVk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSA/Ci0JCQkJdGhpcy5jb252ZXJ0QXJyYXlJbml0aWFsaXplcigoQXJyYXlJbml0aWFsaXplcikgZXhwcmVzc2lvbikKLQkJCToKLQkJCQlFTVBUWV9TVFJJTkdfQVJSQVk7Ci0JfQotCi0JLyoKLQkgKiB0aGlzIG1ldGhvZCBpcyAncHVibGljJyBzbyBpdCBjYW4gYmUgY2FsbGVkIGJ5Ci0JICogQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBjb252ZXJ0QXJyYXlJbml0aWFsaXplcihBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIpIHsKLQkJTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IHRoaXMuZG93bmNhc3RFeHByZXNzaW9ucyhhcnJheUluaXRpYWxpemVyKTsKLQkJaW50IGxlbiA9IGV4cHJlc3Npb25zLnNpemUoKTsKLQkJU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbbGVuXTsKLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlzdHJpbmdzW2ldID0gdGhpcy5lbGVtZW50Q29udmVydGVyLmNvbnZlcnQoZXhwcmVzc2lvbnMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nczsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8RXhwcmVzc2lvbj4gZG93bmNhc3RFeHByZXNzaW9ucyhBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIpIHsKLQkJcmV0dXJuIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWZlZTFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgYSBzdHJpbmcgbGl0ZXJhbCB0by9mcm9tIGEgc3RyaW5nIChlLmcuICJ0ZXh0IikuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBJTlNUQU5DRSA9IG5ldyBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdMaXRlcmFsIGNvbnZlcnRPYmplY3QoU3RyaW5nIHN0cmluZywgQVNUIGFzdCkgewotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhc3QubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZShzdHJpbmcpOwotCQlyZXR1cm4gc3RyaW5nTGl0ZXJhbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlPYmplY3QgdmFsdWUgPSBleHByZXNzaW9uLnJlc29sdmVDb25zdGFudEV4cHJlc3Npb25WYWx1ZSgpOwotCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSA/IChTdHJpbmcpIHZhbHVlIDogbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzMGI2OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBERUZBVUxUX1BBUk1TID0gbmV3IFN0cmluZ1swXTsKLQlwcml2YXRlIHN0YXRpYyBUZXh0UmFuZ2UgREVGQVVMVF9URVhUX1JBTkdFID0gVGV4dFJhbmdlLkVtcHR5Lmluc3RhbmNlKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShzZXZlcml0eSwgbWVzc2FnZUlkLCBERUZBVUxUX1BBUk1TLCB0YXJnZXRPYmplY3QpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZSgKLQkJCWludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShzZXZlcml0eSwgbWVzc2FnZUlkLCBwYXJtcywgdGFyZ2V0T2JqZWN0LCBERUZBVUxUX1RFWFRfUkFOR0UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZSgKLQkJCWludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgT2JqZWN0IHRhcmdldE9iamVjdCwgVGV4dFJhbmdlIHRleHRSYW5nZSkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlSWQsIERFRkFVTFRfUEFSTVMsIHRhcmdldE9iamVjdCwgdGV4dFJhbmdlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQlVORExFX05BTUUsIHNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QpOwotCQlpZiAodGV4dFJhbmdlID09IG51bGwpIHsKLQkJCS8vbG9nIGFuIGV4Y2VwdGlvbiBhbmQgdGhlbiBjb250aW51ZSB3aXRob3V0IHNldHRpbmcgbG9jYXRpb24gaW5mb3JtYXRpb24KLQkJCS8vQXQgbGVhc3QgdGhlIHVzZXIgd2lsbCBzdGlsbCBnZXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBhbmQgd2lsbAotCQkJLy9iZSBhYmxlIHRvIHNlZSBvdGhlciB2YWxpZGF0aW9uIG1lc3NhZ2VzIHdpdGggdmFsaWQgdGV4dFJhbmdlcwotCQkJSnB0Q29yZVBsdWdpbi5sb2cobmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCB0ZXh0IHJhbmdlIGZvciBtZXNzYWdlIElEOiAiICsgbWVzc2FnZUlkKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCW1lc3NhZ2Uuc2V0TGluZU5vKHRleHRSYW5nZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQodGV4dFJhbmdlLmdldE9mZnNldCgpKTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCQotCQotCXByaXZhdGUgRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFIZWxwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzg5MjM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBKcGFIZWxwZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQgewotCi0JQE92ZXJyaWRlCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAoKEpwYU5vZGUpIG9iaikuZ2V0UmVzb3VyY2UoKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIG5vIGxpbmUgbnVtYmVyIGlzIHNldC4gIFdlIGdlbmVyYWxseSB1c2UgbGluZSBudW1iZXJzLgotCSAqIFRoZXJlZm9yZSwgd2hlbiB0aGlzIGlzIGNhbGxlZCwgd2Ugd2lsbCB1c2UgdGhlIGRlZmF1bHQgbG9jYXRpb24sIGkuZS4KLQkgKiBudWxsLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYVZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDQ1NDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBKcGFWYWxpZGF0aW9uTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianBhX3ZhbGlkYXRpb24iOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTk9fQ09OTkVDVElPTiA9ICJQUk9KRUNUX05PX0NPTk5FQ1RJT04iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfSU5BQ1RJVkVfQ09OTkVDVElPTiA9ICJQUk9KRUNUX0lOQUNUSVZFX0NPTk5FQ1RJT04iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTk9fUEVSU0lTVEVOQ0VfWE1MID0gIlBST0pFQ1RfTk9fUEVSU0lTVEVOQ0VfWE1MIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX01VTFRJUExFX1BFUlNJU1RFTkNFX1hNTCA9ICJQUk9KRUNUX01VTFRJUExFX1BFUlNJU1RFTkNFX1hNTCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX0lOVkFMSURfQ09OVEVOVCA9ICJQRVJTSVNURU5DRV9YTUxfSU5WQUxJRF9DT05URU5UIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUID0gIlBFUlNJU1RFTkNFX05PX1BFUlNJU1RFTkNFX1VOSVQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX01VTFRJUExFX1BFUlNJU1RFTkNFX1VOSVRTID0gIlBFUlNJU1RFTkNFX01VTFRJUExFX1BFUlNJU1RFTkNFX1VOSVRTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX01BUFBJTkdfRklMRSA9ICJQRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX01BUFBJTkdfRklMRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9NQVBQSU5HX0ZJTEUgPSAiUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9NQVBQSU5HX0ZJTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9NQVBQSU5HX0ZJTEUgPSAiUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX01BUFBJTkdfRklMRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfTUFQUElOR19GSUxFID0gIlBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX01BUFBJTkdfRklMRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9DTEFTUyA9ICJQRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0NMQVNTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX0NMQVNTID0gIlBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfQ0xBU1MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9DTEFTUyA9ICJQRVJTSVNURU5DRV9VTklUX0lOVkFMSURfQ0xBU1MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0NMQVNTID0gIlBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0NMQVNTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX1JFRFVOREFOVF9DTEFTUyA9ICJQRVJTSVNURU5DRV9VTklUX1JFRFVOREFOVF9DTEFTUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FID0gIkdFTkVSQVRPUl9EVVBMSUNBVEVfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfRFVQTElDQVRFX05BTUUgPSAiUVVFUllfRFVQTElDQVRFX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9NQVBQSU5HU19NVUxUSVBMRV9NRVRBREFUQSA9ICJFTlRJVFlfTUFQUElOR1NfTVVMVElQTEVfTUVUQURBVEEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DT05URVhUID0gIlBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DT05URVhUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX1RZUEVfVU5TUEVDSUZJRURfQ0xBU1MgPSAiUEVSU0lTVEVOVF9UWVBFX1VOU1BFQ0lGSUVEX0NMQVNTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX1RZUEVfVU5SRVNPTFZFRF9DTEFTUyA9ICJQRVJTSVNURU5UX1RZUEVfVU5SRVNPTFZFRF9DTEFTUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05PX0lEID0gIkVOVElUWV9OT19JRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5TUEVDSUZJRURfTkFNRSA9ICJQRVJTSVNURU5UX0FUVFJJQlVURV9VTlNQRUNJRklFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9VTlJFU09MVkVEX05BTUUgPSAiUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9GSUVMRCA9ICJQRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9GSUVMRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfUFVCTElDX0ZJRUxEID0gIlBFUlNJU1RFTlRfQVRUUklCVVRFX1BVQkxJQ19GSUVMRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9NQVBQSU5HID0gIlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfTUFQUElORyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19VTlJFU09MVkVEX01BUFBFRF9CWSA9ICJNQVBQSU5HX1VOUkVTT0xWRURfTUFQUEVEX0JZIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0lOVkFMSURfTUFQUEVEX0JZID0gIk1BUFBJTkdfSU5WQUxJRF9NQVBQRURfQlkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfTUFQUEVEX0JZX1dJVEhfSk9JTl9UQUJMRSA9ICJNQVBQSU5HX01BUFBFRF9CWV9XSVRIX0pPSU5fVEFCTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfTUFQUEVEX0JZX09OX0JPVEhfU0lERVMgPSAiTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTUFQUElOR19VTlJFU09MVkVEX0dFTkVSQVRPUl9OQU1FID0gIklEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEgPSAiVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX1VOUkVTT0xWRURfTkFNRSA9ICJUQUJMRV9VTlJFU09MVkVEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSA9ICJTRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX05BTUUgPSAiU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSA9ICJKT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BID0gIlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FID0gIkpPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSA9ICJWSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUgPSAiQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFID0gIlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSA9ICJWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJDT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSA9ICJKT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFID0gIlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSA9ICJWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJKT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVEX1ZBTFVFX1VOUkVTT0xWRURfR0VORVJBVE9SID0gIkdFTkVSQVRFRF9WQUxVRV9VTlJFU09MVkVEX0dFTkVSQVRPUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSI7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDhjMWQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlIEpQQSBleHRlbnNpb24gZm9yIHRoZQotICogV1RQIHZhbGlkYXRvciBleHRlbnNpb24gcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9ySm9iIHsKLQotCi0JLy8gKioqKioqKioqKiBJVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7Ci0KLQkJZm9yIChJdGVyYXRvcjxJTWVzc2FnZT4gc3RyZWFtID0gdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMoY29udGV4dCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SU1lc3NhZ2U+IHZhbGlkYXRpb25NZXNzYWdlcyhJVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKChJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0KSBjb250ZXh0KS5nZXRQcm9qZWN0KCk7Ci0JCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCkudmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJVmFsaWRhdG9ySm9iIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJLy8gZG9uJ3Qga25vdyB3aGF0IHRvIHJldHVybiBoZXJlLiAgbXkgZ3Vlc3MgaXMgdGhhdCB3ZSB3YW50IHRvIHJldHVybgotCQkvLyB0aGUgcmVzb3VyY2UgdGhhdCBpcyBwb3NzaWJseSBiZWluZyBjaGFuZ2VkIGR1cmluZyBvdXIgdmFsaWRhdGlvbiwKLQkJLy8gYW5kIHNpbmNlIG1hbnkgcmVzb3VyY2VzIGluIHRoZSBwcm9qZWN0IG1heSBiZSBjaGFuZ2VkIGR1cmluZyB0aGlzCi0JCS8vIHZhbGlkYXRpb24sIHJldHVybmluZyB0aGUgcHJvamVjdCBtYWtlcyB0aGUgbW9zdCBzZW5zZS4KLQkJcmV0dXJuICgoSVdvcmtiZW5jaENvbnRleHQpIGNvbnRleHQpLmdldFByb2plY3QoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJfQotCQl0aGlzLnZhbGlkYXRlKGNvbnRleHQsIHJlcG9ydGVyKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFya2VyIGNsZWFuLXVwICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBKUEFfTU9ERUxfTElTVEVORVIgPSBuZXcgTG9jYWxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQotCXN0YXRpYyB7Ci0JCUpwdENvcmVQbHVnaW4uZ2V0SnBhTW9kZWwoKS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhTW9kZWwuSlBBX1BST0pFQ1RTX0NPTExFQ1RJT04sIEpQQV9NT0RFTF9MSVNURU5FUik7Ci0JfQotCi0JLyoqCi0JICogV2hlbiBhIEpQQSBwcm9qZWN0IGlzIHJlbW92ZWQgdGhpcyBsaXN0ZW5lciB3aWxsIHNjaGVkdWxlIGEgam9iIHRvCi0JICogcmVtb3ZlIGFsbCB0aGUgbWFya2VycyBhc3NvY2lhdGVkIHdpdGggdGhlIEpQQSBwcm9qZWN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsKLQotCQlMb2NhbENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJLy8gaWdub3JlCi0JCX0KLQotCQkvKioKLQkJICogRm9yIG5vdywgd2UgZXhwZWN0IEpQQSBwcm9qZWN0cyB0byBiZSByZW1vdmVkIG9uZSBhdCBhIHRpbWUuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUl0ZXJhdG9yPEpwYVByb2plY3Q+IGl0ZW1zID0gKEl0ZXJhdG9yPEpwYVByb2plY3Q+KSBldmVudC5pdGVtcygpOwotCQkJSm9iIGogPSBuZXcgRGVsZXRlTWFya2Vyc0pvYihpdGVtcy5uZXh0KCkpOwotCQkJai5zY2hlZHVsZSgpOwotCQkJaWYgKGl0ZW1zLmhhc05leHQoKSkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5leHBlY3RlZCBldmVudCIpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIERlbGV0ZSBhbGwgdGhlIG1hcmtlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgSlBBIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVsZXRlTWFya2Vyc0pvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCi0JCURlbGV0ZU1hcmtlcnNKb2IoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCQlzdXBlcigiRGVsZXRlIE1hcmtlcnMiKTsKLQkJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdC5pc09wZW4oKSkgey8vbm8gbmVlZCB0byByZW1vdmUgbWFya2VycyBpZiBwcm9qZWN0IGhhcyBiZWVuIGNsb3NlZAotCQkJCXRyeSB7Ci0JCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcHJvamVjdC5maW5kTWFya2VycyhKcHRDb3JlUGx1Z2luLlZBTElEQVRJT05fTUFSS0VSX0lELCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZGVsZXRlTWFya2VycyhtYXJrZXJzKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsgIC8vIG5vdCBtdWNoIGVsc2Ugd2UgY2FuIGRvCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2NvbW1vbi9BYnN0cmFjdEpwYUVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vQWJzdHJhY3RKcGFFT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMzZhODguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2NvbW1vbi9BYnN0cmFjdEpwYUVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LkFic3RyYWN0VGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRU9iamVjdDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0WG1sRU9iamVjdCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFFT2JqZWN0IGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JcHJvdGVjdGVkIElET01Ob2RlIG5vZGU7Ci0JCi0JLyoqCi0JICogU2V0cyBvZiAiaW5zaWduaWZpY2FudCIgZmVhdHVyZSBpZHMsIGtleWVkIGJ5IGNsYXNzLgotCSAqIFRoaXMgaXMgYnVpbHQgdXAgbGF6aWx5LCBhcyB0aGUgb2JqZWN0cyBhcmUgbW9kaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3Q+LCBTZXQ8SW50ZWdlcj4+IGluc2lnbmlmaWNhbnRGZWF0dXJlSWRTZXRzID0gbmV3IEhhc2h0YWJsZTxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0PiwgU2V0PEludGVnZXI+PigpOwotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEpwYUVPYmplY3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSUpwYUVPYmplY3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCi0JcHVibGljIElSZXNvdXJjZSBnZXRQbGF0Zm9ybVJlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JfQotCQotCXB1YmxpYyBKcGFYbWxSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChKcGFYbWxSZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JfQotCQotCS8qCi0JICogTXVzdCBiZSBvdmVycmlkZGVuIGJ5IGFjdHVhbCByb290IG9iamVjdCB0byByZXR1cm4gaXRzZWxmCi0JICovCi0JcHVibGljIEpwYUVPYmplY3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuICgoSnBhRU9iamVjdCkgZUNvbnRhaW5lcigpKS5nZXRSb290KCk7Ci0JCQotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNoYW5nZSBub3RpZmljYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogb3ZlcnJpZGUgdG8gcHJldmVudCBub3RpZmljYXRpb24gd2hlbiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgdW5jaGFuZ2VkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmICghbm90aWZpY2F0aW9uLmlzVG91Y2goKSkgewotCQkJc3VwZXIuZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJdGhpcy5mZWF0dXJlQ2hhbmdlZChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKHRoaXMuZ2V0Q2xhc3MoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZlYXR1cmVDaGFuZ2VkKGludCBmZWF0dXJlSWQpIHsKLQkJaWYgKHRoaXMuZmVhdHVyZUlzU2lnbmlmaWNhbnQoZmVhdHVyZUlkKSkgeyAKLQkJCWdldFJlc291cmNlKCkucmVzb3VyY2VDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmVhdHVyZUlzU2lnbmlmaWNhbnQoaW50IGZlYXR1cmVJZCkgewotCQlyZXR1cm4gISB0aGlzLmZlYXR1cmVJc0luc2lnbmlmaWNhbnQoZmVhdHVyZUlkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmVhdHVyZUlzSW5zaWduaWZpY2FudChpbnQgZmVhdHVyZUlkKSB7Ci0JCXJldHVybiB0aGlzLmluc2lnbmlmaWNhbnRGZWF0dXJlSWRzKCkuY29udGFpbnMobmV3IEludGVnZXIoZmVhdHVyZUlkKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHNldCBvZiB0aGUgb2JqZWN0J3MgImluc2lnbmlmaWNhbnQiIGZlYXR1cmUgaWRzLgotCSAqIFRoZXNlIGFyZSB0aGUgRU1GIGZlYXR1cmVzIHRoYXQgd2lsbCBub3QgYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYWxsCi0JICogdGhlIGZlYXR1cmVzIGFyZSB1bnNldC4gIFdlIHVzZSB0aGlzIHRvIGRldGVybWluZSB3aGVuIHRvIHJlbW92ZSAKLQkgKiBhbiBlbGVtZW50IGZyb20gdGhlIHhtbC4KLQkgKiAKLQkgKiBJZiB5b3UgbmVlZCBpbnN0YW5jZS1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyIHhtbCAiaW5zaWduaWZpY2FudCIgYXNwZWN0cywKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSWYgY2xhc3MtYmFzZWQgY2FsY3VsYXRpb24gaXMgc3VmZmljaWVudCwKLQkgKiBvdmVycmlkZSAjYWRkSW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHNUbyhTZXQpLgotCSAqIAotCSAqIEBzZWUgaXNBbGxGZWF0dXJlc1Vuc2V0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU2V0PEludGVnZXI+IGluc2lnbmlmaWNhbnRGZWF0dXJlSWRzKCkgewotCQlzeW5jaHJvbml6ZWQgKGluc2lnbmlmaWNhbnRGZWF0dXJlSWRTZXRzKSB7Ci0JCQlTZXQ8SW50ZWdlcj4gaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMgPSBpbnNpZ25pZmljYW50RmVhdHVyZUlkU2V0cy5nZXQodGhpcy5nZXRDbGFzcygpKTsKLQkJCWlmIChpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcyA9PSBudWxsKSB7Ci0JCQkJaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOwotCQkJCXRoaXMuYWRkSW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHNUbyhpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcyk7Ci0JCQkJaW5zaWduaWZpY2FudEZlYXR1cmVJZFNldHMucHV0KHRoaXMuZ2V0Q2xhc3MoKSwgaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMpOwotCQkJfQotCQkJcmV0dXJuIGluc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFkZCB0aGUgb2JqZWN0J3MgImluc2lnbmlmaWNhbnQiIGZlYXR1cmUgaWRzIHRvIHRoZSBzcGVjaWZpZWQgc2V0LgotCSAqIFRoZXNlIGFyZSB0aGUgRU1GIGZlYXR1cmVzIHRoYXQsIHdoZW4gdGhleSBjaGFuZ2UsIHdpbGwgTk9UIGNhdXNlIHRoZQotCSAqIG9iamVjdCAob3IgaXRzIGNvbnRhaW5pbmcgdHJlZSkgdG8gYmUgcmVzeW5jaGVkLCBpLmUuIGRlZmF1bHRzIGNhbGN1bGF0ZWQuCi0JICogSWYgY2xhc3MtYmFzZWQgY2FsY3VsYXRpb24gb2YgeW91ciAiaW5zaWduaWZpY2FudCIgZmVhdHVyZXMgaXMgc3VmZmljaWVudCwKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSWYgeW91IG5lZWQgaW5zdGFuY2UtYmFzZWQgY2FsY3VsYXRpb24sCi0JICogb3ZlcnJpZGUgI2luc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzKCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHNUbyhTZXQ8SW50ZWdlcj4gaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMpIHsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkSW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHNUbyhpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcyk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FsbEZlYXR1cmVzVW5zZXQoKSB7Ci0JCWZvciAoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgOiBlQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkpIHsKLQkJCWlmIChlSXNTZXQoZmVhdHVyZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PEFkYXB0ZXI+IGVBZGFwdGVycygpIHsKLQkJaWYgKHRoaXMuZUFkYXB0ZXJzID09IG51bGwpIHsKLQkJCXRoaXMuZUFkYXB0ZXJzID0gbmV3IFhtbEVBZGFwdGVyTGlzdDxBZGFwdGVyPih0aGlzKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5lQWRhcHRlcnM7Ci0JfQotCi0JcHVibGljIElET01Ob2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLm5vZGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgWG1sRUFkYXB0ZXJMaXN0PEUgZXh0ZW5kcyBPYmplY3QgJiBBZGFwdGVyPiBleHRlbmRzIEVBZGFwdGVyTGlzdDxFPgotCXsKLQkJcHVibGljIFhtbEVBZGFwdGVyTGlzdChOb3RpZmllciBub3RpZmllcikgewotCQkJc3VwZXIobm90aWZpZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpZEFkZChpbnQgaW5kZXgsIEUgbmV3T2JqZWN0KSB7Ci0JCQlzdXBlci5kaWRBZGQoaW5kZXgsIG5ld09iamVjdCk7Ci0JCQl0cnkgewotCQkJCW5vZGUgPSAoSURPTU5vZGUpIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChuZXdPYmplY3QsICJnZXROb2RlIik7Ci0JCQl9Ci0JCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaWRSZW1vdmUoaW50IGluZGV4LCBFIG9sZE9iamVjdCkgewotCQkJc3VwZXIuZGlkUmVtb3ZlKGluZGV4LCBvbGRPYmplY3QpOwotCQkJaWYgKChvbGRPYmplY3QgaW5zdGFuY2VvZiBFTUYyRE9NQWRhcHRlcikgJiYgKCgoRU1GMkRPTUFkYXB0ZXIpIG9sZE9iamVjdCkuZ2V0Tm9kZSgpID09IEFic3RyYWN0SnBhRU9iamVjdC50aGlzLm5vZGUpKSB7Ci0JCQkJQWJzdHJhY3RKcGFFT2JqZWN0LnRoaXMubm9kZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0RnVsbFRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEZ1bGxUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRGdWxsVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gYnVpbGRUZXh0UmFuZ2UodGhpcy5ub2RlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBidWlsZFRleHRSYW5nZShJRE9NTm9kZSBkb21Ob2RlKSB7Ci0JCWlmIChkb21Ob2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBuZXcgRE9NTm9kZVRleHRSYW5nZShkb21Ob2RlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBub2RlLmNvbnRhaW5zKHRleHRPZmZzZXQpOwotCX0KLQkKLQkvKioKLQkgKiBBZGFwdCBhbiBJRE9NTm9kZSB0byB0aGUgVGV4dFJhbmdlIGludGVyZmFjZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBET01Ob2RlVGV4dFJhbmdlIGV4dGVuZHMgQWJzdHJhY3RUZXh0UmFuZ2UKLQl7Ci0JCXByaXZhdGUgZmluYWwgSURPTU5vZGUgbm9kZTsKLQotCQlET01Ob2RlVGV4dFJhbmdlKElET01Ob2RlIG5vZGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5vZGUgPSBub2RlOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCWlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXJldHVybiAoKElET01FbGVtZW50KSB0aGlzLm5vZGUpLmdldFN0YXJ0RW5kT2Zmc2V0KCkgLSB0aGlzLm5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLm5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVPZk9mZnNldChnZXRPZmZzZXQoKSkgKyAxOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvY29tbW9uL0pwYUFydGlmYWN0RWRpdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2NvbW1vbi9KcGFBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAyMWQ5OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvY29tbW9uL0pwYUFydGlmYWN0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpwYUFydGlmYWN0RWRpdCBleHRlbmRzIEFydGlmYWN0RWRpdAotewotCXB1YmxpYyBKcGFBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSAKLQkJCXRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlcihhUHJvamVjdCwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHJldHVybiBhIHJlc291cmNlIGZvciB0aGUgZ2l2ZW4gZmlsZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBKcGFYbWxSZXNvdXJjZSBnZXRSZXNvdXJjZShJRmlsZSBmaWxlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZGVwbG95VVJJIC0gdGhpcyBtdXN0IGJlIGluIGEgZGVwbG95bWVudCByZWxldmFudCBmb3JtIAotCSAqIAkoZS5nICJNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiIGluc3RlYWQgb2YgInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiKQotCSAqIEByZXR1cm4gYSByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIGRlcGxveW1lbnQgZmlsZSBVUkkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSnBhWG1sUmVzb3VyY2UgZ2V0UmVzb3VyY2UoU3RyaW5nIGRlcGxveVVSSSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvY29tbW9uL0pwYUVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vSnBhRU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjU1MjNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vSnBhRU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYUVPYmplY3QgZXh0ZW5kcyBFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSB0aGF0IG1vc3QgZGlyZWN0bHkgY29udGFpbnMgdGhpcyBvYmplY3QKLQkgKi8KLQlJUmVzb3VyY2UgZ2V0UGxhdGZvcm1SZXNvdXJjZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSnBhWG1sUmVzb3VyY2UgY29udGFpbmluZyB0aGlzIG9iamVjdC4KLQkgKi8KLQlKcGFYbWxSZXNvdXJjZSBnZXRSZXNvdXJjZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcm9vdCBvYmplY3Qgb2YgdGhlIG1vZGVsCi0JICovCi0JSnBhRU9iamVjdCBnZXRSb290KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QncyB0ZXh0IHJlcHJlc2VudGF0aW9uIGNvbnRhaW5zIHRoZSB0ZXh0IG9mZnNldAotCSAqLwotCWJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSB0byBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLiAgVGhpcyBpcyB0aGUgc291cmNlCi0JICogcmFuZ2UgdGhhdCB3aWxsIGJlIGhpZ2hsaWdodGVkIGZvciBhIHZhbGlkYXRpb24gZXJyb3IuCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2UgdG8gYmUgdXNlZCBmb3Igc2VsZWN0aW9uLiAgVGhpcyBpcyB0aGUgc291cmNlCi0JICogcmFuZ2UgdGhhdCB3aWxsIGJlIGhpZ2hsaWdodGVkIHdoZW4gc2VsZWN0aW5nIGluIHRoZSBzdHJ1Y3R1cmUgdmlldy4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JCi0JCi0JYm9vbGVhbiBpc0FsbEZlYXR1cmVzVW5zZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vSnBhWG1sUmVzb3VyY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vSnBhWG1sUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlZTk0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvY29tbW9uL0pwYVhtbFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnBhWG1sUmVzb3VyY2UgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsCi17Ci0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbjxSZXNvdXJjZU1vZGVsTGlzdGVuZXI+IHJlc291cmNlTW9kZWxMaXN0ZW5lcnM7Ci0JCi0JCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlKFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcihhUmVuZGVyZXIpOwotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlTW9kZWxMaXN0ZW5lcj4oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VNb2RlbExpc3RlbmVyPigpOwotCX0KLQkKLQkvKioKLQkgKiBvdmVycmlkZSB0byBwcmV2ZW50IG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBvYmplY3QncyBzdGF0ZSBpcyB1bmNoYW5nZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKCFub3RpZmljYXRpb24uaXNUb3VjaCgpICYmIGlzTG9hZGVkKCkpIHsKLQkJCXN1cGVyLmVOb3RpZnkobm90aWZpY2F0aW9uKTsKLQkJCXJlc291cmNlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRQdWJsaWNJZCgpIAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFB1YmxpY0lkKCkgewotCQlyZXR1cm4gbnVsbDsKLQkJLy8gb25seSBhcHBsaWNhYmxlIGZvciBEVEQtYmFzZWQgZmlsZXMKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRTeXN0ZW1JZCgpIAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFN5c3RlbUlkKCkgewotCQlyZXR1cm4gbnVsbDsKLQkJLy8gb25seSBhcHBsaWNhYmxlIGZvciBEVEQtYmFzZWQgZmlsZXMKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRWZXJzaW9uSWQoKSAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiAxMDsKLQkJLy8gdGhpcyBzZWVtcyB0byBiZSB0aGUgZGVmYXVsdCB2ZXJzaW9uIG9mIHRoZSBzcGVjIGZvciB0aGlzIGRvYwotCQkvLyBhbmQgdGhlIGlkIDEwIG1hcHMgdG8gdGhlIHZlcnNpb24gMS4wCi0JfQotCQotCS8qKgotCSAqIEBzZWUgVHJhbnNsYXRvclJlc291cmNlI2dldERvY3R5cGUoKSAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY3R5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCQkvLyBvbmx5IGFwcGxpY2FibGUgZm9yIERURC1iYXNlZCBmaWxlcwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZpbGUgPSBnZXRGaWxlKGdldFVSSSgpKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKGdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBnZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOwotCQkJCVVSSSBjb252ZXJ0ZWRVcmkgPSBjb252ZXJ0ZXIubm9ybWFsaXplKGdldFVSSSgpKTsKLQkJCQlpZiAoISBnZXRVUkkoKS5lcXVhbHMoY29udmVydGVkVXJpKSkgewotCQkJCQlmaWxlID0gZ2V0RmlsZShjb252ZXJ0ZWRVcmkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRmlsZSBmb3IgdGhlIDxjb2RlPnVyaTwvY29kZT4gd2l0aGluIHRoZSBXb3Jrc3BhY2UuIFRoaXMgVVJJIGlzIGFzc3VtZWQgdG8gYmUKLQkgKiBhYnNvbHV0ZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogcGxhdGZvcm06L3Jlc291cmNlLy4uLi4KLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoVVJJIHVyaSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKSB7Ci0JCQlTdHJpbmcgZmlsZVN0cmluZyA9IFVSSS5kZWNvZGUodXJpLnBhdGgoKSk7Ci0JCQlmaWxlU3RyaW5nID0gZmlsZVN0cmluZy5zdWJzdHJpbmcoSkVNVXRpbFBsdWdpbi5QTEFURk9STV9SRVNPVVJDRS5sZW5ndGgoKSArIDEpOwotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGdldEZpbGUoKS5leGlzdHMoKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpOwotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUZyb21SZXNvdXJjZSgpOwotCQotCXB1YmxpYyBKcGFYbWxSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlTW9kZWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTW9kZWwoSnBhWG1sUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbCA9IHJlc291cmNlTW9kZWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZCgpIHsKLQkJZm9yIChSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcnMpIHsKLQkJCWxpc3RlbmVyLnJlc291cmNlTW9kZWxDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VNb2RlbENoYW5nZUxpc3RlbmVyKFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJfQotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VNb2RlbENoYW5nZUxpc3RlbmVyKFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgd2FzIG5ldmVyIGFkZGVkIik7CQkKLQkJfQotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvY29tbW9uL0pwYVhtbFJlc291cmNlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vSnBhWG1sUmVzb3VyY2VNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmZhYmJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vSnBhWG1sUmVzb3VyY2VNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKcGFYbWxSZXNvdXJjZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZU1vZGVsCi17Ci0JcHJvdGVjdGVkIEpwYUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQ7Ci0JCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIHJlc291cmNlOwotCQotCQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZU1vZGVsKElGaWxlIGZpbGUpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JCXRoaXMuYXJ0aWZhY3RFZGl0ID0gYnVpbGRBcnRpZmFjdEVkaXQoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQl0aGlzLnJlc291cmNlID0gdGhpcy5hcnRpZmFjdEVkaXQuZ2V0UmVzb3VyY2UoZmlsZSk7Ci0JCXRoaXMucmVzb3VyY2Uuc2V0UmVzb3VyY2VNb2RlbCh0aGlzKTsKLQkJdGhpcy5hcnRpZmFjdEVkaXQuYWRkTGlzdGVuZXIoYnVpbGRSZWxvYWRMaXN0ZW5lcih0aGlzLnJlc291cmNlKSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBKcGFBcnRpZmFjdEVkaXQgYnVpbGRBcnRpZmFjdEVkaXQoSVByb2plY3QgcHJvamVjdCk7Ci0JCi0JcHJpdmF0ZSBFZGl0TW9kZWxMaXN0ZW5lciBidWlsZFJlbG9hZExpc3RlbmVyKEpwYVhtbFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBuZXcgUmVsb2FkTGlzdGVuZXIocmVzb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgSnBhWG1sUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQl0aGlzLnJlc291cmNlLmphdmFFbGVtZW50Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbVJlc291cmNlKCkgewotCQl0aGlzLnJlc291cmNlLnVwZGF0ZUZyb21SZXNvdXJjZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZU1vZGVsQ2hhbmdlTGlzdGVuZXIoUmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVzb3VyY2UuYWRkUmVzb3VyY2VNb2RlbENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VNb2RlbENoYW5nZUxpc3RlbmVyKFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlc291cmNlLnJlbW92ZVJlc291cmNlTW9kZWxDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJdGhpcy5hcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoKSB7Ci0JCS8vbm90aGluZyB0byBkbyBoZXJlLCBKYXZhUmVzb3VyY2VNb2RlbCBuZWVkcyB0aGlzCi0JfQotCQotCXByaXZhdGUgY2xhc3MgUmVsb2FkTGlzdGVuZXIgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lcgotCXsKLQkJZmluYWwgSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCQotCQkKLQkJUmVsb2FkTGlzdGVuZXIoSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJCXN3aXRjaCAoYW5FdmVudC5nZXRFdmVudENvZGUoKSkgewotCQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0UgOgotCQkJCQlpZiAoYW5FdmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkuY29udGFpbnMocmVzb3VyY2UpCi0JCQkJCQkJJiYgISByZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXJlc291cmNlLmxvYWQocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRMb2FkT3B0aW9ucygpKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJCQlKcHRDb3JlUGx1Z2luLmxvZyhpb2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRSA6Ci0JCQkJCWlmIChhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKS5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCWFuRXZlbnQuZ2V0RWRpdE1vZGVsKCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlIEVkaXRNb2RlbEV2ZW50LlNBVkUgOgotLy8JCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSA6CQkJCQotCQkJfQotCQkJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9BY2Nlc3NUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9BY2Nlc3NUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzE0NjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQWNjZXNzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGVudW0gQWNjZXNzVHlwZSB7Ci0KLQlQUk9QRVJUWSwKLQlGSUVMRDsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTExNWU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCi17CQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24gbmFtZS4KLQkgKiBAc2VlIEpQQQotCSAqLwotCVN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCQotCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJlbW92aW5nIHRoZSB1bmRlcnlsaW5nIEphdmEgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuZCBhZGQgSmF2YSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBuZXdBbm5vdGF0aW9uKCk7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhYjM4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi0vKioKLSAqIFVzZWQgZm9yIGJ1aWxkaW5nIG5ldyBBbm5vdGF0aW9ucy4gCi0gKiBUaGVzZSBzaG91bGQgYmUgdXNlZCB0byBkZWZpbmUgbm9uLW1hcHBpbmcgYW5ub3RhdGlvbnMuICBJZiB5b3UKLSAqIHdhbnQgdG8gcHJvdmlkZSBuZXcgQW5ub3RhdGlvbkRlZmluaXRpb25zIHlvdSB3aWxsIG5lZWQKLSAqIHRvIGNyZWF0ZSBhIG5ldyBKcGFQbGF0Zm9ybSBieSBleHRlbmRpbmcgR2VuZXJpY0pwYVBsYXRmb3JtLgotICogCi0gKiBAc2VlIE1hcHBpbmdBbm5vdGF0aW9uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkdlbmVyaWNKcGFQbGF0Zm9ybQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24gbmFtZQotCSAqLwotCVN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYW4gQW5ub3RhdGlvbiBnaXZlbiB0aGUgTWVtYmVyCi0JICovCi0JQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpOwotCQotCUFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcik7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5NzhjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZSBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGV4dGVuZHMgT3ZlcnJpZGVBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERTsKLQotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqb2luQ29sdW1ucyBlbGVtZW50IG9mIHRoZSBBc3NvY2lhdGlvbk92ZXJyaWRlIGFubm90YXRpb24uCi0JICogUmV0dXJucyBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgam9pbkNvbHVtbnMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqLwotCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMoKTsKLQkKLQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KTsKLQkKLQlpbnQgaW5kZXhPZkpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbik7Ci0JCi0JaW50IGpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCXZvaWQgbW92ZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQotCQlTdHJpbmcgSk9JTl9DT0xVTU5TX0xJU1QgPSAiam9pbkNvbHVtbnNMaXN0IjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDk4N2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBleHRlbmRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlPgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCi0JU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFU19MSVNUID0gImFzc29jaWF0aW9uT3ZlcmlkZXNMaXN0IjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWFhNWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLkF0dHJpYnV0ZU92ZXJyaWRlIGFubm90YXRpb24KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGV4dGVuZHMgT3ZlcnJpZGVBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5BVFRSSUJVVEVfT1ZFUlJJREU7Ci0JCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBjb2x1bW4gZWxlbWVudCBvZiB0aGUgQXR0cmlidXRlT3ZlcnJpZGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGNvbHVtbiBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCi0JICovCi0JQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW4oKTsKLQkKLQkvKioKLQkgKiBBZGQgdGhlIGNvbHVtbiBlbGVtZW50IHRvIHRoZSBBdHRyaWJ1dGVPdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqLwotCUNvbHVtbkFubm90YXRpb24gYWRkQ29sdW1uKCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBjb2x1bW4gZWxlbWVudCBmcm9tIHRoZSBBdHRyaWJ1dGVPdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sdW1uKCk7Ci0JCi0JQ29sdW1uQW5ub3RhdGlvbiBnZXROb25OdWxsQ29sdW1uKCk7Ci0JCi0JU3RyaW5nIENPTFVNTl9QUk9QRVJUWSA9ICJjb2x1bW5Qcm9wZXJ0eSI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5MDM2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24gZXh0ZW5kcyBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGU+Ci17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTOwotCi0JU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERVNfTElTVCA9ICJhdHRyaWJ1dGVPdmVycmlkZXNMaXN0IjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9CYXNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0NjZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmFzZUNvbHVtbkFubm90YXRpb24gZXh0ZW5kcyBOYW1lZENvbHVtbkFubm90YXRpb24KLXsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB1bmlxdWUgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgdW5pcXVlIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgotCSAqLwotCUJvb2xlYW4gZ2V0VW5pcXVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHVuaXF1ZSBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSB1bmlxdWUgdmFsdWVQYWlyIGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldFVuaXF1ZShCb29sZWFuIHVuaXF1ZSk7CQotCQlTdHJpbmcgVU5JUVVFX1BST1BFUlRZID0gInVuaXF1ZVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbnVsbGFibGUgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbnVsbGFibGUgdmFsdWVQYWlyIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCi0JICovCi0JQm9vbGVhbiBnZXROdWxsYWJsZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBudWxsYWJsZSBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBudWxsYWJsZSB2YWx1ZVBhaXIgZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBudWxsYWJsZSk7Ci0JCVN0cmluZyBOVUxMQUJMRV9QUk9QRVJUWSA9ICJudWxsYWJsZVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgaW5zZXJ0YWJsZSBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBpbnNlcnRhYmxlIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgotCSAqLwotCUJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBpbnNlcnRhYmxlIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGluc2VydGFibGUgdmFsdWVQYWlyIGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldEluc2VydGFibGUoQm9vbGVhbiBpbnNlcnRhYmxlKTsKLQkJU3RyaW5nIElOU0VSVEFCTEVfUFJPUEVSVFkgPSAiaW5zZXJ0YWJsZVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdXBkYXRhYmxlIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHVwZGF0YWJsZSB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KLQkgKi8KLQlCb29sZWFuIGdldFVwZGF0YWJsZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB1cGRhdGFibGUgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgdXBkYXRhYmxlIHZhbHVlUGFpciBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiB1cGRhdGFibGUpOwotCQlTdHJpbmcgVVBEQVRBQkxFX1BST1BFUlRZID0gInVwZGF0YWJsZVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdGFibGUgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgdGFibGUgdmFsdWVQYWlyIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCi0JICovCi0JU3RyaW5nIGdldFRhYmxlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHRhYmxlIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIHRhYmxlIHZhbHVlUGFpciBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXRUYWJsZShTdHJpbmcgdGFibGUpOwotCQlTdHJpbmcgVEFCTEVfUFJPUEVSVFkgPSAidGFibGVQcm9wZXJ0eSI7Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgdW5pcXVlIGVsZW1lbnQuIElmIHRoZSB1bmlxdWUgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFVuaXF1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbnVsbGFibGUgZWxlbWVudC4gSWYgdGhlIG51bGxhYmxlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXROdWxsYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgaW5zZXJ0YWJsZSBlbGVtZW50LiBJZiB0aGUgaW5zZXJ0YWJsZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0SW5zZXJ0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgdXBkYXRhYmxlIGVsZW1lbnQuIElmIHRoZSB1cGRhdGFibGUgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFVwZGF0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgdGFibGUgZWxlbWVudC4gSWYgdGhlIHRhYmxlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc3RpdGlvbiB0b3VjaGVzIHRoZSB0YWJsZSBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgdGFibGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIHRhYmxlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2ljQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQmFzaWNBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NTI5YjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQmFzaWNBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNpY0Fubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCi17Ci0JCi0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5CQVNJQzsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgZmV0Y2ggZWxlbWVudCBvZiB0aGUgQmFzaWMgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGZldGNoIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlGZXRjaFR5cGUgZ2V0RmV0Y2goKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgZmV0Y2ggZWxlbWVudCBvZiB0aGUgQmFzaWMgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGZldGNoIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpOwotCQlTdHJpbmcgRkVUQ0hfUFJPUEVSVFkgPSAiZmV0Y2hQcm9wZXJ0eSI7Ci0JCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBvcHRpb25hbCBlbGVtZW50IG9mIHRoZSBCYXNpYyBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgb3B0aW9uYWwgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0T3B0aW9uYWwoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgb3B0aW9uYWwgZWxlbWVudCBvZiB0aGUgQmFzaWMgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIG9wdGlvbmFsIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKTsKLQkJU3RyaW5nIE9QVElPTkFMX1BST1BFUlRZID0gIm9wdGlvbmFsUHJvcGVydHkiOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBmZXRjaCBlbGVtZW50LiAgSWYgdGhlIGZldGNoIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEJhc2ljIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgb3B0aW9uYWwgZWxlbWVudC4gIElmIHRoZSBvcHRpb25hbCBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBCYXNpYyBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Nhc2NhZGVUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9DYXNjYWRlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTRhYTIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Nhc2NhZGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZW51bSBDYXNjYWRlVHlwZSB7Ci0JCi0JQUxMKEpQQS5DQVNDQURFX1RZUEVfX0FMTCksCi0JUEVSU0lTVChKUEEuQ0FTQ0FERV9UWVBFX19QRVJTSVNUKSwKLQlNRVJHRShKUEEuQ0FTQ0FERV9UWVBFX19NRVJHRSksCi0JUkVNT1ZFKEpQQS5DQVNDQURFX1RZUEVfX1JFTU9WRSksCi0JUkVGUkVTSChKUEEuQ0FTQ0FERV9UWVBFX19SRUZSRVNIKTsKLQkKLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCQotCUNhc2NhZGVUeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDYXNjYWRlVHlwZVtdIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKFN0cmluZ1tdIGphdmFBbm5vdGF0aW9uVmFsdWVzKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IENhc2NhZGVUeXBlWzBdOwotCQl9Ci0JCUNhc2NhZGVUeXBlW10gY2FzY2FkZVR5cGVzID0gbmV3IENhc2NhZGVUeXBlW2phdmFBbm5vdGF0aW9uVmFsdWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YUFubm90YXRpb25WYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZXNbaV07Ci0JCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSAhPSBudWxsKSB7Ci0JCQkJY2FzY2FkZVR5cGVzW2ldID0gY2FzY2FkZVR5cGUoamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhc2NhZGVUeXBlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDYXNjYWRlVHlwZSBjYXNjYWRlVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoQUxMLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSkpIHsKLQkJCXJldHVybiBBTEw7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoUEVSU0lTVC5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkpKSB7Ci0JCQlyZXR1cm4gUEVSU0lTVDsKLQkJfQotCQllbHNlIGlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhNRVJHRS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkpKSB7Ci0JCQlyZXR1cm4gTUVSR0U7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoUkVNT1ZFLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSkpIHsKLQkJCXJldHVybiBSRU1PVkU7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoUkVGUkVTSC5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkpKSB7Ci0JCQlyZXR1cm4gUkVGUkVTSDsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNhc2NhZGUgdHlwZTogIiArIGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRvSmF2YUFubm90YXRpb25WYWx1ZShDYXNjYWRlVHlwZVtdIGNhc2NhZGVUeXBlcykgewotCQlTdHJpbmdbXSBqYXZhQW5ub3RhdGlvblZhbHVlcyA9IG5ldyBTdHJpbmdbY2FzY2FkZVR5cGVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzY2FkZVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDYXNjYWRlVHlwZSBjYXNjYWRlVHlwZSA9IGNhc2NhZGVUeXBlc1tpXTsKLQkJCWphdmFBbm5vdGF0aW9uVmFsdWVzW2ldID0gY2FzY2FkZVR5cGUuamF2YUFubm90YXRpb25WYWx1ZTsKLQkJfQotCQlyZXR1cm4gamF2YUFubm90YXRpb25WYWx1ZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Db2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Db2x1bW5Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMTdiZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sdW1uQW5ub3RhdGlvbiBleHRlbmRzIEJhc2VDb2x1bW5Bbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5DT0xVTU47Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbGVuZ3RoIGVsZW1lbnQgb2YgdGhlIGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbGVuZ3RoIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgotCSAqLwotCUludGVnZXIgZ2V0TGVuZ3RoKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGxlbmd0aCBlbGVtZW50IG9mIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGxlbmd0aCB2YWx1ZVBhaXIgZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbGVuZ3RoKTsKLQkJU3RyaW5nIExFTkdUSF9QUk9QRVJUWSA9ICJsZW5ndGhQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHByZWNpc2lvbiBlbGVtZW50IG9mIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHByZWNpc2lvbiB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KLQkgKi8KLQlJbnRlZ2VyIGdldFByZWNpc2lvbigpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBwcmVjaXNpb24gZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBwcmVjaXNpb24gdmFsdWVQYWlyIGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIHByZWNpc2lvbik7Ci0JCVN0cmluZyBQUkVDSVNJT05fUFJPUEVSVFkgPSAicHJlY2lzaW9uUHJvcGVydHkiOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBzY2FsZSBlbGVtZW50IG9mIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHNjYWxlIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgotCSAqLwotCUludGVnZXIgZ2V0U2NhbGUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgc2NhbGUgZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBzY2FsZSB2YWx1ZVBhaXIgZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgc2V0U2NhbGUoSW50ZWdlciBzY2FsZSk7Ci0JCVN0cmluZyBTQ0FMRV9QUk9QRVJUWSA9ICJzY2FsZVByb3BlcnR5IjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBsZW5ndGggZWxlbWVudC4gSWYgbGVuZ3RoIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ29sdW1uIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldExlbmd0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgcHJlY2lzaW9uIGVsZW1lbnQuIElmIHByZWNpc2lvbiBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRQcmVjaXNpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBzY2FsZSBlbGVtZW50LiBJZiBzY2FsZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTY2FsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0NvbnRhaW5lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0NvbnRhaW5lckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5MWVmYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Db250YWluZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250YWluZXJBbm5vdGF0aW9uPFQgZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IGV4dGVuZHMgQW5ub3RhdGlvbgotewotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5lc3RhYmxlIGFubm90YXRpb24gbmFtZS4gIAotCSAqLwotCVN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgbmFtZSBvZiB0aGUgbmVzdGFibGUgYW5ub3RhdGlvbiB3aGVuCi0JICogaXQgaXMgbmVzdGVkIHdpdGhpbmcgdGhlIGNvbnRhaW5lciBhbm5vdGF0aW8gYXMgYSBtZW1iZXIgdmFsdWUgcGFpICAKLQkgKi8KLQlTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKTsKLQotCUxpc3RJdGVyYXRvcjxUPiBuZXN0ZWRBbm5vdGF0aW9ucygpOwotCQotCWludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKTsKLQotCVQgbmVzdGVkQW5ub3RhdGlvbkF0KGludCBpbmRleCk7Ci0JCi0JVCBuZXN0ZWRBbm5vdGF0aW9uRm9yKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGpkdEFubm90YXRpb24pOwotCQotCWludCBpbmRleE9mKFQgbmVzdGVkQW5ub3RhdGlvbik7Ci0JCQotCVQgYWRkKGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogQWRkIGRpcmVjdGx5IHRvIHRoZSBMaXN0IHdpdGhvdXQgZmlyaW5nIGNoYW5nZSBub3RpZmljYXRpb24uCi0JICovCi0JVCBhZGRJbnRlcm5hbChpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlKFQgbmVzdGVkQW5ub3RhdGlvbik7Ci0JCi0Jdm9pZCByZW1vdmUoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBNb3ZlIGluIHRoZSBMaXN0IHdpdGhvdXQgZmlyaW5nIGNoYW5nZSBub3RpZmljYXRpb24uCi0JICovCi0Jdm9pZCBtb3ZlSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQotCXZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg2YWJmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yQ29sdW1uIGFubm90YXRpb24KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZXh0ZW5kcyBOYW1lZENvbHVtbkFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGRpc2NyaW1pbmF0b3JUeXBlIGVsZW1lbnQgb2YgdGhlIGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGRpc2NyaW1pbmF0b3JUeXBlIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgotCSAqLwotCURpc2NyaW1pbmF0b3JUeXBlIGdldERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGRpc2NyaW1pbmF0b3JUeXBlIGVsZW1lbnQgb2YgdGhlIGphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQnkgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdGhlIGRpc2NyaW1pbmF0b3JUeXBlIHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBkaXNjcmltaW5hdG9yVHlwZSB2YWx1ZVBhaXIKLQkgKi8KLQl2b2lkIHNldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKTsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSA9ICJkaXNjcmltaW5hdG9yVHlwZVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbGVuZ3RoIGVsZW1lbnQgb2YgdGhlIGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGxlbmd0aCB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KLQkgKi8KLQlJbnRlZ2VyIGdldExlbmd0aCgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBsZW5ndGggZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuT3JkZXJCeSBhbm5vdGF0aW9uLgotCSAqIFNldCB0aGUgbGVuZ3RoIHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBsZW5ndGggdmFsdWVQYWlyCi0JICovCi0Jdm9pZCBzZXRMZW5ndGgoSW50ZWdlciBsZW5ndGgpOwotCQlTdHJpbmcgTEVOR1RIX1BST1BFUlRZID0gImxlbmd0aFByb3BlcnR5IjsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTVlNWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsKLQkKLQlTVFJJTkcsCi0JQ0hBUiwKLQlJTlRFR0VSOwotCQotCQotCXB1YmxpYyBzdGF0aWMgRGlzY3JpbWluYXRvclR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEpQQS5ESVNDUklNSU5BVE9SX1RZUEVfX1NUUklORykpIHsKLQkJCXJldHVybiBTVFJJTkc7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEpQQS5ESVNDUklNSU5BVE9SX1RZUEVfX0NIQVIpKSB7Ci0JCQlyZXR1cm4gQ0hBUjsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLkRJU0NSSU1JTkFUT1JfVFlQRV9fSU5URUdFUikpIHsKLQkJCXJldHVybiBJTlRFR0VSOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSkgewotCQlpZiAoZGlzY3JpbWluYXRvclR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChkaXNjcmltaW5hdG9yVHlwZSkgewotCQkJY2FzZSBTVFJJTkcgOgotCQkJCXJldHVybiBKUEEuRElTQ1JJTUlOQVRPUl9UWVBFX19TVFJJTkc7Ci0JCQljYXNlIENIQVIgOgotCQkJCXJldHVybiBKUEEuRElTQ1JJTUlOQVRPUl9UWVBFX19DSEFSOwotCQkJY2FzZSBJTlRFR0VSIDoKLQkJCQlyZXR1cm4gSlBBLkRJU0NSSU1JTkFUT1JfVFlQRV9fSU5URUdFUjsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZGlzY3JpbWluYXRvciB0eXBlOiAiICsgZGlzY3JpbWluYXRvclR5cGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjU4ZjZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQnkgYW5ub3RhdGlvbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBlbGVtZW50IG9mIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5PcmRlckJ5IGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSB2YWx1ZSB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuT3JkZXJCeSBhbm5vdGF0aW9uLgotCSAqIFNldHRpbmcgdGhlIHZhbHVlIHRvIG51bGwgd2lsbCBub3QgcmVtb3ZlIHRoZSBPcmRlckJ5IGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZVByb3BlcnR5IjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB2YWx1ZSBlbGVtZW50LiBJZiB2YWx1ZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIERpc3JpbWluYXRvclZhbHVlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VtYmVkZGFibGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OGUzZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkYWJsZSBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGFibGVBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuRU1CRUREQUJMRTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkZWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9FbWJlZGRlZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2ODM0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9FbWJlZGRlZEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW1iZWRkZWRBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuRU1CRURERUQ7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkSWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9FbWJlZGRlZElkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2VjYTg0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkSWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGVkSWRBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuRU1CRURERURfSUQ7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VudGl0eUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VudGl0eUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjZWJiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9FbnRpdHlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHkgYW5ub3RhdGlvbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFbnRpdHlBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuRU5USVRZOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgZWxlbWVudCBvZiB0aGUgRW50aXR5IGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBuYW1lIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIGVsZW1lbnQgb2YgdGhlIEVudGl0eSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgbmFtZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0JCi0JU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbmFtZSBlbGVtZW50LiAgSWYgdGhlIG5hbWUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgRW50aXR5IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9FbnVtVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW51bVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwOWU1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9FbnVtVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGVudW0gRW51bVR5cGUgewotCQotCU9SRElOQUwsCi0JU1RSSU5HOwotCQotCQotCXB1YmxpYyBzdGF0aWMgRW51bVR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEpQQS5FTlVNX1RZUEVfX09SRElOQUwpKSB7Ci0JCQlyZXR1cm4gT1JESU5BTDsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLkVOVU1fVFlQRV9fU1RSSU5HKSkgewotCQkJcmV0dXJuIFNUUklORzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoRW51bVR5cGUgZW51bVR5cGUpIHsKLQkJaWYgKGVudW1UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoZW51bVR5cGUpIHsKLQkJCWNhc2UgT1JESU5BTCA6Ci0JCQkJcmV0dXJuIEpQQS5FTlVNX1RZUEVfX09SRElOQUw7Ci0JCQljYXNlIFNUUklORyA6Ci0JCQkJcmV0dXJuIEpQQS5FTlVNX1RZUEVfX1NUUklORzsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZW51bSB0eXBlOiAiICsgZW51bVR5cGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW51bWVyYXRlZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4M2RkZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW51bWVyYXRlZEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLkVudW1lcmF0ZWQgYW5ub3RhdGlvbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFbnVtZXJhdGVkQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLkVOVU1FUkFURUQ7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgZWxlbWVudCBvZiB0aGUgRW51bWVyYXRlZCBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgdmFsdWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqLwotCUVudW1UeXBlIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGVsZW1lbnQgb2YgdGhlIEVudW1lcmF0ZWQgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIHZhbHVlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShFbnVtVHlwZSB2YWx1ZSk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZVByb3BlcnR5IjsKLQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHZhbHVlIGVsZW1lbnQuICBJZiB0aGUgdmFsdWUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgRW51bWVyYXRlZCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0ZldGNoVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRmV0Y2hUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNGY3ZTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRmV0Y2hUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZW51bSBGZXRjaFR5cGUgewotCQotCUVBR0VSLAotCUxBWlk7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBGZXRjaFR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEpQQS5GRVRDSF9UWVBFX19FQUdFUikpIHsKLQkJCXJldHVybiBFQUdFUjsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLkZFVENIX1RZUEVfX0xBWlkpKSB7Ci0JCQlyZXR1cm4gTEFaWTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoRmV0Y2hUeXBlIGZldGNoVHlwZSkgewotCQlpZiAoZmV0Y2hUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoZmV0Y2hUeXBlKSB7Ci0JCQljYXNlIEVBR0VSIDoKLQkJCQlyZXR1cm4gSlBBLkZFVENIX1RZUEVfX0VBR0VSOwotCQkJY2FzZSBMQVpZIDoKLQkJCQlyZXR1cm4gSlBBLkZFVENIX1RZUEVfX0xBWlk7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGZldGNoIHR5cGU6ICIgKyBmZXRjaFR5cGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5M2ZlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewkKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLkdFTkVSQVRFRF9WQUxVRTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBzdHJhdGVneSBlbGVtZW50IG9mIHRoZSBHZW5lcmF0ZWRWYWx1ZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgc3RyYXRlZ3kgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqLwotCUdlbmVyYXRpb25UeXBlIGdldFN0cmF0ZWd5KCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHN0cmF0ZWd5IGVsZW1lbnQgb2YgdGhlIEdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBzdHJhdGVneSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0U3RyYXRlZ3koR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3kpOwotCQlTdHJpbmcgU1RSQVRFR1lfUFJPUEVSVFkgPSAic3RyYXRlZ3lQcm9wZXJ0eSI7Ci0JCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBnZW5lcmF0b3IgZWxlbWVudCBvZiB0aGUgR2VuZXJhdGVkVmFsdWUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGdlbmVyYXRvciBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCi0JICovCi0JU3RyaW5nIGdldEdlbmVyYXRvcigpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBnZW5lcmF0b3IgZWxlbWVudCBvZiB0aGUgR2VuZXJhdGVkVmFsdWUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGdlbmVyYXRvciBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0R2VuZXJhdG9yKFN0cmluZyBnZW5lcmF0b3IpOwotCQlTdHJpbmcgR0VORVJBVE9SX1BST1BFUlRZID0gImdlbmVyYXRvclByb3BlcnR5IjsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgZ2VuZXJhdG9yIGVsZW1lbnQuICBJZiB0aGUgZ2VuZXJhdG9yIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldEdlbmVyYXRvclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgc3RyYXRlZ3kgZWxlbWVudC4gIElmIHRoZSBzdHJhdGVneSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBHZW5lcmF0ZWRWYWx1ZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTdHJhdGVneVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0dlbmVyYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTU3NjE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0dlbmVyYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7Ci0JCi0JVEFCTEUsCi0JU0VRVUVOQ0UsCi0JSURFTlRJVFksCi0JQVVUTzsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIEdlbmVyYXRpb25UeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhKUEEuR0VORVJBVElPTl9UWVBFX19UQUJMRSkpIHsKLQkJCXJldHVybiBUQUJMRTsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLkdFTkVSQVRJT05fVFlQRV9fU0VRVUVOQ0UpKSB7Ci0JCQlyZXR1cm4gU0VRVUVOQ0U7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEpQQS5HRU5FUkFUSU9OX1RZUEVfX0lERU5USVRZKSkgewotCQkJcmV0dXJuIElERU5USVRZOwotCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhKUEEuR0VORVJBVElPTl9UWVBFX19BVVRPKSkgewotCQkJcmV0dXJuIEFVVE87Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKEdlbmVyYXRpb25UeXBlIGdlbmVyYXRpb25UeXBlKSB7Ci0JCWlmIChnZW5lcmF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGdlbmVyYXRpb25UeXBlKSB7Ci0JCQljYXNlIFRBQkxFIDoKLQkJCQlyZXR1cm4gSlBBLkdFTkVSQVRJT05fVFlQRV9fVEFCTEU7Ci0JCQljYXNlIFNFUVVFTkNFIDoKLQkJCQlyZXR1cm4gSlBBLkdFTkVSQVRJT05fVFlQRV9fU0VRVUVOQ0U7Ci0JCQljYXNlIElERU5USVRZIDoKLQkJCQlyZXR1cm4gSlBBLkdFTkVSQVRJT05fVFlQRV9fSURFTlRJVFk7Ci0JCQljYXNlIEFVVE8gOgotCQkJCXJldHVybiBKUEEuR0VORVJBVElPTl9UWVBFX19BVVRPOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBnZW5lcmF0aW9uIHR5cGU6ICIgKyBnZW5lcmF0aW9uVHlwZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOGU5MjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJhdG9yQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbmFtZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBvciBTZXF1ZW5jZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbmFtZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0Ci0JICogdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIG9yIFNlcXVlbmNlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBuYW1lIGVsZW1lbnQuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0Ci0JICogdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBpbml0aWFsVmFsdWUgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3Igb3IgU2VxdWVuY2VHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGluaXRpYWxWYWx1ZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0Ci0JICogdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQlJbnRlZ2VyIGdldEluaXRpYWxWYWx1ZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBpbml0aWFsVmFsdWUgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3Igb3IgU2VxdWVuY2VHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGluaXRpYWxWYWx1ZSBlbGVtZW50LiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCi0JICovCi0Jdm9pZCBzZXRJbml0aWFsVmFsdWUoSW50ZWdlciBpbml0aWFsVmFsdWUpOwotCQlTdHJpbmcgSU5JVElBTF9WQUxVRV9QUk9QRVJUWSA9ICJpbml0aWFsVmFsdWVQcm9wZXJ0eSI7Ci0JCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBhbGxvY2F0aW9uU2l6ZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBvciBTZXF1ZW5jZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgYWxsb2NhdGlvblNpemUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCi0JICovCi0JSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBhbGxvY2F0aW9uU2l6ZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBvciBTZXF1ZW5jZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgYWxsb2NhdGlvblNpemUgZWxlbWVudC4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKLQkgKiB0aGUgKkdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgotCSAqLwotCXZvaWQgc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlciBhbGxvY2F0aW9uU2l6ZSk7Ci0JCVN0cmluZyBBTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFkgPSAiYWxsb2NhdGlvblNpemVQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG5hbWUgZWxlbWVudC4gIElmIHRoZSBuYW1lIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgaW5pdGlhbFZhbHVlIGVsZW1lbnQuICBJZiB0aGUgaW5pdGlhbFZhbHVlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0SW5pdGlhbFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBhbGxvY2F0aW9uU2l6ZSBlbGVtZW50LiAgSWYgdGhlIGFsbG9jYXRpb25TaXplIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0QWxsb2NhdGlvblNpemVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0lkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZTVlNzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElkQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLklEOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9JZENsYXNzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSWRDbGFzc0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzYWVmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9JZENsYXNzQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBjb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuSWRDbGFzcyBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElkQ2xhc3NBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCWZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuSURfQ0xBU1M7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgZWxlbWVudCBvZiB0aGUgSWRDbGFzcyBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgdmFsdWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqIFJldHVybnMgdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyB0aGUgLmNsYXNzLgotCSAqIDxwPgotCSAqICAgICAmIzY0O0lkQ2xhc3ModmFsdWU9RW1wbG95ZWUuY2xhc3MpCi0JICogPC9wPgotCSAqIHdpbGwgcmV0dXJuICJFbXBsb3llZSIKLQkgKiovCi0JU3RyaW5nIGdldFZhbHVlKCk7CQotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBlbGVtZW50IG9mIHRoZSBJZENsYXNzIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSB2YWx1ZSBlbGVtZW50LiAgVGhpcyB3aWxsIGFsc28gcmVtb3ZlIHRoZSBJZENsYXNzIAotCSAqIGFubm90YXRpb24gaXRzZWxmLgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlUHJvcGVydHkiOwotCQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZWQgdmFsdWUgbmFtZSBhcyBpdCBpcyByZXNvbHZlZCBpbiB0aGUgQVNUCi0JICogPHA+Ci0JICogICAgICYjNjQ7SWRDbGFzcyhFbXBsb3llZS5jbGFzcykKLQkgKiA8L3A+Ci0JICogd2lsbCByZXR1cm4gIm1vZGVsLkVtcGxveWVlIiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yIG1vZGVsLkVtcGxveWVlCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZENsYXNzKCk7Ci0JCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfQ0xBU1NfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRDbGFzc1Byb3BlcnR5IjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB2YWx1ZSBlbGVtZW50LiAgSWYgdGhlIHZhbHVlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIElkQ2xhc3MgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0luaGVyaXRhbmNlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTQzNWQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0luaGVyaXRhbmNlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuSW5oZXJpdGFuY2UgYW5ub3RhdGlvbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbmhlcml0YW5jZUFubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5JTkhFUklUQU5DRTsKLQotCUluaGVyaXRhbmNlVHlwZSBnZXRTdHJhdGVneSgpOwotCQotCXZvaWQgc2V0U3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KTsKLQkJU3RyaW5nIFNUUkFURUdZX1BST1BFUlRZID0gInN0cmF0ZWd5UHJvcGVydHkiOwotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgc3RyYXRlZ3kgZWxlbWVudC4gIElmIHRoZSBzdHJhdGVneSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBJbmhlcml0YW5jZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTdHJhdGVneVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0luaGVyaXRhbmNlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNWVhYTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUgewotCQotCVNJTkdMRV9UQUJMRSwKLQlKT0lORUQsCi0JVEFCTEVfUEVSX0NMQVNTOwotCQotCQotCXB1YmxpYyBzdGF0aWMgSW5oZXJpdGFuY2VUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhKUEEuSU5IRVJJVEFOQ0VfVFlQRV9fU0lOR0xFX1RBQkxFKSkgewotCQkJcmV0dXJuIFNJTkdMRV9UQUJMRTsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLklOSEVSSVRBTkNFX1RZUEVfX0pPSU5FRCkpIHsKLQkJCXJldHVybiBKT0lORUQ7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEpQQS5JTkhFUklUQU5DRV9UWVBFX19UQUJMRV9QRVJfQ0xBU1MpKSB7Ci0JCQlyZXR1cm4gVEFCTEVfUEVSX0NMQVNTOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShJbmhlcml0YW5jZVR5cGUgaW5oZXJpdGFuY2VUeXBlKSB7Ci0JCWlmIChpbmhlcml0YW5jZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChpbmhlcml0YW5jZVR5cGUpIHsKLQkJCWNhc2UgU0lOR0xFX1RBQkxFIDoKLQkJCQlyZXR1cm4gSlBBLklOSEVSSVRBTkNFX1RZUEVfX1NJTkdMRV9UQUJMRTsKLQkJCWNhc2UgSk9JTkVEIDoKLQkJCQlyZXR1cm4gSlBBLklOSEVSSVRBTkNFX1RZUEVfX0pPSU5FRDsKLQkJCWNhc2UgVEFCTEVfUEVSX0NMQVNTIDoKLQkJCQlyZXR1cm4gSlBBLklOSEVSSVRBTkNFX1RZUEVfX1RBQkxFX1BFUl9DTEFTUzsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gaW5oZXJpdGFuY2UgdHlwZTogIiArIGluaGVyaXRhbmNlVHlwZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KUEEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pQQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTMyODg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pQQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotCi0vKioKLSAqIEpQQSBKYXZhLXJlbGF0ZWQgc3R1ZmYgKGFubm90YXRpb25zIGV0Yy4pCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi0vLyBUT0RPIG1vdmUgdG8gdXRpbGl0eT8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBKUEEgewotCi0JLy8gSlBBIHBhY2thZ2UKLQlTdHJpbmcgUEFDS0FHRSA9ICJqYXZheC5wZXJzaXN0ZW5jZSI7Ci0JU3RyaW5nIFBBQ0tBR0VfID0gUEFDS0FHRSArICcuJzsKLQotCi0JLy8gKioqKioqKioqKiBBUEkgKioqKioqKioqKgotCi0JLy8gSlBBIGFubm90YXRpb25zCi0JU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFID0gUEFDS0FHRV8gKyAiQXNzb2NpYXRpb25PdmVycmlkZSI7Ci0JCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlMgPSAiam9pbkNvbHVtbnMiOwotCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERVMgPSBQQUNLQUdFXyArICJBc3NvY2lhdGlvbk92ZXJyaWRlcyI7Ci0JCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERVNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFID0gUEFDS0FHRV8gKyAiQXR0cmlidXRlT3ZlcnJpZGUiOwotCQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU4gPSAiY29sdW1uIjsKLQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFUyA9IFBBQ0tBR0VfICsgIkF0dHJpYnV0ZU92ZXJyaWRlcyI7Ci0JCVN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEJBU0lDID0gUEFDS0FHRV8gKyAiQmFzaWMiOwotCQlTdHJpbmcgQkFTSUNfX0ZFVENIID0gImZldGNoIjsKLQkJU3RyaW5nIEJBU0lDX19PUFRJT05BTCA9ICJvcHRpb25hbCI7Ci0JU3RyaW5nIENPTFVNTiA9IFBBQ0tBR0VfICsgIkNvbHVtbiI7Ci0JCVN0cmluZyBDT0xVTU5fX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBDT0xVTU5fX1VOSVFVRSA9ICJ1bmlxdWUiOwotCQlTdHJpbmcgQ09MVU1OX19OVUxMQUJMRSA9ICJudWxsYWJsZSI7Ci0JCVN0cmluZyBDT0xVTU5fX0lOU0VSVEFCTEUgPSAiaW5zZXJ0YWJsZSI7Ci0JCVN0cmluZyBDT0xVTU5fX1VQREFUQUJMRSA9ICJ1cGRhdGFibGUiOwotCQlTdHJpbmcgQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9ICJjb2x1bW5EZWZpbml0aW9uIjsKLQkJU3RyaW5nIENPTFVNTl9fVEFCTEUgPSAidGFibGUiOwotCQlTdHJpbmcgQ09MVU1OX19MRU5HVEggPSAibGVuZ3RoIjsKLQkJU3RyaW5nIENPTFVNTl9fUFJFQ0lTSU9OID0gInByZWNpc2lvbiI7Ci0JCVN0cmluZyBDT0xVTU5fX1NDQUxFID0gInNjYWxlIjsKLQlTdHJpbmcgQ09MVU1OX1JFU1VMVCA9IFBBQ0tBR0VfICsgIkNvbHVtblJlc3VsdCI7Ci0JCVN0cmluZyBDT0xVTU5fUkVTVUxUX19OQU1FID0gIm5hbWUiOwotCVN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTiA9IFBBQ0tBR0VfICsgIkRpc2NyaW1pbmF0b3JDb2x1bW4iOwotCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9DT0xVTU5fX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFID0gImRpc2NyaW1pbmF0b3JUeXBlIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9ICJjb2x1bW5EZWZpbml0aW9uIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEggPSAibGVuZ3RoIjsKLQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9WQUxVRSA9IFBBQ0tBR0VfICsgIkRpc2NyaW1pbmF0b3JWYWx1ZSI7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX1ZBTFVFX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEVNQkVEREFCTEUgPSBQQUNLQUdFXyArICJFbWJlZGRhYmxlIjsKLQlTdHJpbmcgRU1CRURERUQgPSBQQUNLQUdFXyArICJFbWJlZGRlZCI7Ci0JU3RyaW5nIEVNQkVEREVEX0lEID0gUEFDS0FHRV8gKyAiRW1iZWRkZWRJZCI7Ci0JU3RyaW5nIEVOVElUWSA9IFBBQ0tBR0VfICsgIkVudGl0eSI7Ci0JCVN0cmluZyBFTlRJVFlfX05BTUUgPSAibmFtZSI7Ci0JU3RyaW5nIEVOVElUWV9MSVNURU5FUlMgPSBQQUNLQUdFXyArICJFbnRpdHlMaXN0ZW5lcnMiOwotCQlTdHJpbmcgRU5USVRZX0xJU1RFTkVSU19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBFTlRJVFlfUkVTVUxUID0gUEFDS0FHRV8gKyAiRW50aXR5UmVzdWx0IjsKLQkJU3RyaW5nIEVOVElUWV9SRVNVTFRfX0VOVElUWV9DTEFTUyA9ICJlbnRpdHlDbGFzcyI7Ci0JCVN0cmluZyBFTlRJVFlfUkVTVUxUX19GSUVMRFMgPSAiZmllbGRzIjsKLQkJU3RyaW5nIEVOVElUWV9SRVNVTFRfX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gImRpc2NyaW1pbmF0b3JDb2x1bW4iOwotCVN0cmluZyBFTlVNRVJBVEVEID0gUEFDS0FHRV8gKyAiRW51bWVyYXRlZCI7Ci0JCVN0cmluZyBFTlVNRVJBVEVEX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBQQUNLQUdFXyArICJFeGNsdWRlRGVmYXVsdExpc3RlbmVycyI7Ci0JU3RyaW5nIEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSBQQUNLQUdFXyArICJFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyI7Ci0JU3RyaW5nIEZJRUxEX1JFU1VMVCA9IFBBQ0tBR0VfICsgIkZpZWxkUmVzdWx0IjsKLQkJU3RyaW5nIEZJRUxEX1JFU1VMVF9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIEZJRUxEX1JFU1VMVF9fQ09MVU1OID0gImNvbHVtbiI7Ci0JU3RyaW5nIEZMVVNIX01PREUgPSBQQUNLQUdFXyArICJGbHVzaE1vZGUiOwotCQlTdHJpbmcgRkxVU0hfTU9ERV9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBHRU5FUkFURURfVkFMVUUgPSBQQUNLQUdFXyArICJHZW5lcmF0ZWRWYWx1ZSI7Ci0JCVN0cmluZyBHRU5FUkFURURfVkFMVUVfX1NUUkFURUdZID0gInN0cmF0ZWd5IjsKLQkJU3RyaW5nIEdFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SID0gImdlbmVyYXRvciI7Ci0JU3RyaW5nIElEID0gUEFDS0FHRV8gKyAiSWQiOwotCVN0cmluZyBJRF9DTEFTUyA9IFBBQ0tBR0VfICsgIklkQ2xhc3MiOwotCQlTdHJpbmcgSURfQ0xBU1NfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgSU5IRVJJVEFOQ0UgPSBQQUNLQUdFXyArICJJbmhlcml0YW5jZSI7Ci0JCVN0cmluZyBJTkhFUklUQU5DRV9fU1RSQVRFR1kgPSAic3RyYXRlZ3kiOwotCVN0cmluZyBKT0lOX0NPTFVNTiA9IFBBQ0tBR0VfICsgIkpvaW5Db2x1bW4iOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5fX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJyZWZlcmVuY2VkQ29sdW1uTmFtZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fVU5JUVVFID0gInVuaXF1ZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fTlVMTEFCTEUgPSAibnVsbGFibGUiOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5fX0lOU0VSVEFCTEUgPSAiaW5zZXJ0YWJsZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fVVBEQVRBQkxFID0gInVwZGF0YWJsZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSAiY29sdW1uRGVmaW5pdGlvbiI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fVEFCTEUgPSAidGFibGUiOwotCVN0cmluZyBKT0lOX0NPTFVNTlMgPSBQQUNLQUdFXyArICJKb2luQ29sdW1ucyI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTlNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgSk9JTl9UQUJMRSA9IFBBQ0tBR0VfICsgIkpvaW5UYWJsZSI7Ci0JCVN0cmluZyBKT0lOX1RBQkxFX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgSk9JTl9UQUJMRV9fQ0FUQUxPRyA9ICJjYXRhbG9nIjsKLQkJU3RyaW5nIEpPSU5fVEFCTEVfX1NDSEVNQSA9ICJzY2hlbWEiOwotCQlTdHJpbmcgSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TID0gImpvaW5Db2x1bW5zIjsKLQkJU3RyaW5nIEpPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gImludmVyc2VKb2luQ29sdW1ucyI7Ci0JCVN0cmluZyBKT0lOX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSAidW5pcXVlQ29uc3RyYWludHMiOwotCVN0cmluZyBMT0IgPSBQQUNLQUdFXyArICJMb2IiOwotCVN0cmluZyBNQU5ZX1RPX01BTlkgPSBQQUNLQUdFXyArICJNYW55VG9NYW55IjsKLQkJU3RyaW5nIE1BTllfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSA9ICJ0YXJnZXRFbnRpdHkiOwotCQlTdHJpbmcgTUFOWV9UT19NQU5ZX19DQVNDQURFID0gImNhc2NhZGUiOwotCQlTdHJpbmcgTUFOWV9UT19NQU5ZX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBNQU5ZX1RPX01BTllfX01BUFBFRF9CWSA9ICJtYXBwZWRCeSI7Ci0JU3RyaW5nIE1BTllfVE9fT05FID0gUEFDS0FHRV8gKyAiTWFueVRvT25lIjsKLQkJU3RyaW5nIE1BTllfVE9fT05FX19UQVJHRVRfRU5USVRZID0gInRhcmdldEVudGl0eSI7Ci0JCVN0cmluZyBNQU5ZX1RPX09ORV9fQ0FTQ0FERSA9ICJjYXNjYWRlIjsKLQkJU3RyaW5nIE1BTllfVE9fT05FX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBNQU5ZX1RPX09ORV9fT1BUSU9OQUwgPSAib3B0aW9uYWwiOwotCVN0cmluZyBNQVBfS0VZID0gUEFDS0FHRV8gKyAiTWFwS2V5IjsKLQkJU3RyaW5nIE1BUF9LRVlfX05BTUUgPSAibmFtZSI7Ci0JU3RyaW5nIE1BUFBFRF9TVVBFUkNMQVNTID0gUEFDS0FHRV8gKyAiTWFwcGVkU3VwZXJjbGFzcyI7Ci0JU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSSUVTID0gUEFDS0FHRV8gKyAiTmFtZWROYXRpdmVRdWVyaWVzIjsKLQkJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSSUVTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWSA9IFBBQ0tBR0VfICsgIk5hbWVkTmF0aXZlUXVlcnkiOwotCQlTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJZX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJZX19RVUVSWSA9ICJxdWVyeSI7Ci0JCVN0cmluZyBOQU1FRF9OQVRJVkVfUVVFUllfX0hJTlRTID0gImhpbnRzIjsKLQkJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTID0gInJlc3VsdENsYXNzIjsKLQkJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HID0gInJlc3VsdFNldE1hcHBpbmciOwotCVN0cmluZyBOQU1FRF9RVUVSSUVTID0gUEFDS0FHRV8gKyAiTmFtZWRRdWVyaWVzIjsKLQkJU3RyaW5nIE5BTUVEX1FVRVJJRVNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgTkFNRURfUVVFUlkgPSBQQUNLQUdFXyArICJOYW1lZFF1ZXJ5IjsKLQkJU3RyaW5nIE5BTUVEX1FVRVJZX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgTkFNRURfUVVFUllfX1FVRVJZID0gInF1ZXJ5IjsKLQkJU3RyaW5nIE5BTUVEX1FVRVJZX19ISU5UUyA9ICJoaW50cyI7Ci0JU3RyaW5nIE9ORV9UT19NQU5ZID0gUEFDS0FHRV8gKyAiT25lVG9NYW55IjsKLQkJU3RyaW5nIE9ORV9UT19NQU5ZX19UQVJHRVRfRU5USVRZID0gInRhcmdldEVudGl0eSI7Ci0JCVN0cmluZyBPTkVfVE9fTUFOWV9fQ0FTQ0FERSA9ICJjYXNjYWRlIjsKLQkJU3RyaW5nIE9ORV9UT19NQU5ZX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBPTkVfVE9fTUFOWV9fTUFQUEVEX0JZID0gIm1hcHBlZEJ5IjsKLQlTdHJpbmcgT05FX1RPX09ORSA9IFBBQ0tBR0VfICsgIk9uZVRvT25lIjsKLQkJU3RyaW5nIE9ORV9UT19PTkVfX1RBUkdFVF9FTlRJVFkgPSAidGFyZ2V0RW50aXR5IjsKLQkJU3RyaW5nIE9ORV9UT19PTkVfX0NBU0NBREUgPSAiY2FzY2FkZSI7Ci0JCVN0cmluZyBPTkVfVE9fT05FX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBPTkVfVE9fT05FX19PUFRJT05BTCA9ICJvcHRpb25hbCI7Ci0JCVN0cmluZyBPTkVfVE9fT05FX19NQVBQRURfQlkgPSAibWFwcGVkQnkiOwotCVN0cmluZyBPUkRFUl9CWSA9IFBBQ0tBR0VfICsgIk9yZGVyQnkiOwotCQlTdHJpbmcgT1JERVJfQllfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVCA9IFBBQ0tBR0VfICsgIlBlcnNpc3RlbmNlQ29udGV4dCI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9fVU5JVF9OQU1FID0gInVuaXROYW1lIjsKLQkJU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFRfX1RZUEUgPSAidHlwZSI7Ci0JU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFRTID0gUEFDS0FHRV8gKyAiUGVyc2lzdGVuY2VDb250ZXh0cyI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUU19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBQRVJTSVNURU5DRV9VTklUID0gUEFDS0FHRV8gKyAiWG1sUGVyc2lzdGVuY2VVbml0IjsKLQkJU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9VTklUX19VTklUX05BTUUgPSAidW5pdE5hbWUiOwotCVN0cmluZyBQRVJTSVNURU5DRV9VTklUUyA9IFBBQ0tBR0VfICsgIlBlcnNpc3RlbmNlVW5pdHMiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVFNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgUE9TVF9MT0FEID0gUEFDS0FHRV8gKyAiUG9zdExvYWQiOwotCVN0cmluZyBQT1NUX1BFUlNJU1QgPSBQQUNLQUdFXyArICJQb3N0UGVyc2lzdCI7Ci0JU3RyaW5nIFBPU1RfUkVNT1ZFID0gUEFDS0FHRV8gKyAiUG9zdFJlbW92ZSI7Ci0JU3RyaW5nIFBPU1RfVVBEQVRFID0gUEFDS0FHRV8gKyAiUG9zdFVwZGF0ZSI7Ci0JU3RyaW5nIFBSRV9QRVJTSVNUID0gUEFDS0FHRV8gKyAiUHJlUGVyc2lzdCI7Ci0JU3RyaW5nIFBSRV9SRU1PVkUgPSBQQUNLQUdFXyArICJQcmVSZW1vdmUiOwotCVN0cmluZyBQUkVfVVBEQVRFID0gUEFDS0FHRV8gKyAiUHJlVXBkYXRlIjsKLQlTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4gPSBQQUNLQUdFXyArICJQcmltYXJ5S2V5Sm9pbkNvbHVtbiI7Ci0JCVN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gInJlZmVyZW5jZWRDb2x1bW5OYW1lIjsKLQkJU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9ICJjb2x1bW5EZWZpbml0aW9uIjsKLQlTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TID0gUEFDS0FHRV8gKyAiUHJpbWFyeUtleUpvaW5Db2x1bW5zIjsKLQkJU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBRVUVSWV9ISU5UID0gUEFDS0FHRV8gKyAiUXVlcnlIaW50IjsKLQkJU3RyaW5nIFFVRVJZX0hJTlRfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBRVUVSWV9ISU5UX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIFNFQ09OREFSWV9UQUJMRSA9IFBBQ0tBR0VfICsgIlNlY29uZGFyeVRhYmxlIjsKLQkJU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9fQ0FUQUxPRyA9ICJjYXRhbG9nIjsKLQkJU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9fU0NIRU1BID0gInNjaGVtYSI7Ci0JCVN0cmluZyBTRUNPTkRBUllfVEFCTEVfX1BLX0pPSU5fQ09MVU1OUyA9ICJwa0pvaW5Db2x1bW5zIjsKLQkJU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsKLQlTdHJpbmcgU0VDT05EQVJZX1RBQkxFUyA9IFBBQ0tBR0VfICsgIlNlY29uZGFyeVRhYmxlcyI7Ci0JCVN0cmluZyBTRUNPTkRBUllfVEFCTEVTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUiA9IFBBQ0tBR0VfICsgIlNlcXVlbmNlR2VuZXJhdG9yIjsKLQkJU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9fU0VRVUVOQ0VfTkFNRSA9ICJzZXF1ZW5jZU5hbWUiOwotCQlTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFID0gImluaXRpYWxWYWx1ZSI7Ci0JCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRSA9ICJhbGxvY2F0aW9uU2l6ZSI7Ci0JU3RyaW5nIFNRTF9SRVNVTFRfU0VUX01BUFBJTkcgPSBQQUNLQUdFXyArICJTcWxSZXN1bHRTZXRNYXBwaW5nIjsKLQkJU3RyaW5nIFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19FTlRJVElFUyA9ICJlbnRpdGllcyI7Ci0JCVN0cmluZyBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19DT0xVTU5TID0gImNvbHVtbnMiOwotCVN0cmluZyBUQUJMRSA9IFBBQ0tBR0VfICsgIlRhYmxlIjsKLQkJU3RyaW5nIFRBQkxFX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgVEFCTEVfX0NBVEFMT0cgPSAiY2F0YWxvZyI7Ci0JCVN0cmluZyBUQUJMRV9fU0NIRU1BID0gInNjaGVtYSI7Ci0JCVN0cmluZyBUQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsKLQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SID0gUEFDS0FHRV8gKyAiVGFibGVHZW5lcmF0b3IiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19UQUJMRSA9ICJ0YWJsZSI7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0cgPSAiY2F0YWxvZyI7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfX1NDSEVNQSA9ICJzY2hlbWEiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fTkFNRSA9ICJwa0NvbHVtbk5hbWUiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRSA9ICJ2YWx1ZUNvbHVtbk5hbWUiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUUgPSAicGtDb2x1bW5WYWx1ZSI7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUgPSAiaW5pdGlhbFZhbHVlIjsKLQkJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFID0gImFsbG9jYXRpb25TaXplIjsKLQkJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsKLQlTdHJpbmcgVEVNUE9SQUwgPSBQQUNLQUdFXyArICJUZW1wb3JhbCI7Ci0JCVN0cmluZyBURU1QT1JBTF9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBUUkFOU0lFTlQgPSBQQUNLQUdFXyArICJUcmFuc2llbnQiOwotCVN0cmluZyBVTklRVUVfQ09OU1RSQUlOVCA9IFBBQ0tBR0VfICsgIlVuaXF1ZUNvbnN0cmFpbnQiOwotCQlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUyA9ICJjb2x1bW5OYW1lcyI7Ci0JU3RyaW5nIFZFUlNJT04gPSBQQUNLQUdFXyArICJWZXJzaW9uIjsKLQotCS8vIEpQQSBlbnVtcwotCVN0cmluZyBHRU5FUkFUSU9OX1RZUEUgPSBQQUNLQUdFXyArICJHZW5lcmF0aW9uVHlwZSI7Ci0JCVN0cmluZyBHRU5FUkFUSU9OX1RZUEVfID0gR0VORVJBVElPTl9UWVBFICsgJy4nOwotCQlTdHJpbmcgR0VORVJBVElPTl9UWVBFX19BVVRPID0gR0VORVJBVElPTl9UWVBFXyArICJBVVRPIjsKLQkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fSURFTlRJVFkgPSBHRU5FUkFUSU9OX1RZUEVfICsgIklERU5USVRZIjsKLQkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fU0VRVUVOQ0UgPSBHRU5FUkFUSU9OX1RZUEVfICsgIlNFUVVFTkNFIjsKLQkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fVEFCTEUgPSBHRU5FUkFUSU9OX1RZUEVfICsgIlRBQkxFIjsKLQotCVN0cmluZyBDQVNDQURFX1RZUEUgPSBQQUNLQUdFXyArICJDYXNjYWRlVHlwZSI7Ci0JCVN0cmluZyBDQVNDQURFX1RZUEVfID0gQ0FTQ0FERV9UWVBFICsgJy4nOwotCQlTdHJpbmcgQ0FTQ0FERV9UWVBFX19BTEwgPSBDQVNDQURFX1RZUEVfICsgIkFMTCI7Ci0JCVN0cmluZyBDQVNDQURFX1RZUEVfX01FUkdFID0gQ0FTQ0FERV9UWVBFXyArICJNRVJHRSI7Ci0JCVN0cmluZyBDQVNDQURFX1RZUEVfX1BFUlNJU1QgPSBDQVNDQURFX1RZUEVfICsgIlBFUlNJU1QiOwotCQlTdHJpbmcgQ0FTQ0FERV9UWVBFX19SRUZSRVNIID0gQ0FTQ0FERV9UWVBFXyArICJSRUZSRVNIIjsKLQkJU3RyaW5nIENBU0NBREVfVFlQRV9fUkVNT1ZFID0gQ0FTQ0FERV9UWVBFXyArICJSRU1PVkUiOwotCi0JU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRSA9IFBBQ0tBR0VfICsgIkRpc2NyaW1pbmF0b3JUeXBlIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRV8gPSBESVNDUklNSU5BVE9SX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX1RZUEVfX0NIQVIgPSBESVNDUklNSU5BVE9SX1RZUEVfICsgIkNIQVIiOwotCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9UWVBFX19JTlRFR0VSID0gRElTQ1JJTUlOQVRPUl9UWVBFXyArICJJTlRFR0VSIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRV9fU1RSSU5HID0gRElTQ1JJTUlOQVRPUl9UWVBFXyArICJTVFJJTkciOwotCi0JU3RyaW5nIEVOVU1fVFlQRSA9IFBBQ0tBR0VfICsgIkVudW1UeXBlIjsKLQkJU3RyaW5nIEVOVU1fVFlQRV8gPSBFTlVNX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBFTlVNX1RZUEVfX09SRElOQUwgPSBFTlVNX1RZUEVfICsgIk9SRElOQUwiOwotCQlTdHJpbmcgRU5VTV9UWVBFX19TVFJJTkcgPSBFTlVNX1RZUEVfICsgIlNUUklORyI7Ci0KLQlTdHJpbmcgRkVUQ0hfVFlQRSA9IFBBQ0tBR0VfICsgIkZldGNoVHlwZSI7Ci0JCVN0cmluZyBGRVRDSF9UWVBFXyA9IEZFVENIX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBGRVRDSF9UWVBFX19FQUdFUiA9IEZFVENIX1RZUEVfICsgIkVBR0VSIjsKLQkJU3RyaW5nIEZFVENIX1RZUEVfX0xBWlkgPSBGRVRDSF9UWVBFXyArICJMQVpZIjsKLQotCVN0cmluZyBGTFVTSF9NT0RFX1RZUEUgPSBQQUNLQUdFXyArICJGbHVzaE1vZGVUeXBlIjsKLQkJU3RyaW5nIEZMVVNIX01PREVfVFlQRV8gPSBGTFVTSF9NT0RFX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBGTFVTSF9NT0RFX1RZUEVfX0FVVE8gPSBGTFVTSF9NT0RFX1RZUEVfICsgIkFVVE8iOwotCQlTdHJpbmcgRkxVU0hfTU9ERV9UWVBFX19DT01NSVQgPSBGTFVTSF9NT0RFX1RZUEVfICsgIkNPTU1JVCI7Ci0KLQlTdHJpbmcgSU5IRVJJVEFOQ0VfVFlQRSA9IFBBQ0tBR0VfICsgIkluaGVyaXRhbmNlVHlwZSI7Ci0JCVN0cmluZyBJTkhFUklUQU5DRV9UWVBFXyA9IElOSEVSSVRBTkNFX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBJTkhFUklUQU5DRV9UWVBFX19KT0lORUQgPSBJTkhFUklUQU5DRV9UWVBFXyArICJKT0lORUQiOwotCQlTdHJpbmcgSU5IRVJJVEFOQ0VfVFlQRV9fU0lOR0xFX1RBQkxFID0gSU5IRVJJVEFOQ0VfVFlQRV8gKyAiU0lOR0xFX1RBQkxFIjsKLQkJU3RyaW5nIElOSEVSSVRBTkNFX1RZUEVfX1RBQkxFX1BFUl9DTEFTUyA9IElOSEVSSVRBTkNFX1RZUEVfICsgIlRBQkxFX1BFUl9DTEFTUyI7Ci0KLQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFID0gUEFDS0FHRV8gKyAiUGVyc2lzdGVuY2VDb250ZXh0VHlwZSI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUX1RZUEVfID0gUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFICsgJy4nOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX19FWFRFTkRFRCA9IFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV8gKyAiRVhURU5ERUQiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX19UUkFOU0FDVElPTiA9IFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV8gKyAiVFJBTlNBQ1RJT04iOwotCi0JU3RyaW5nIFRFTVBPUkFMX1RZUEUgPSBQQUNLQUdFXyArICJUZW1wb3JhbFR5cGUiOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV8gPSBURU1QT1JBTF9UWVBFICsgJy4nOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV9fREFURSA9IFRFTVBPUkFMX1RZUEVfICsgIkRBVEUiOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV9fVElNRSA9IFRFTVBPUkFMX1RZUEVfICsgIlRJTUUiOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV9fVElNRVNUQU1QID0gVEVNUE9SQUxfVFlQRV8gKyAiVElNRVNUQU1QIjsKLQotCS8vIEpQQSBpbnRlcmZhY2VzCi0JU3RyaW5nIEVOVElUWV9NQU5BR0VSID0gUEFDS0FHRV8gKyAiRW50aXR5TWFuYWdlciI7Ci0JU3RyaW5nIEVOVElUWV9NQU5BR0VSX0ZBQ1RPUlkgPSBQQUNLQUdFXyArICJFbnRpdHlNYW5hZ2VyRmFjdG9yeSI7Ci0JU3RyaW5nIEVOVElUWV9UUkFOU0FDVElPTiA9IFBBQ0tBR0VfICsgIkVudGl0eVRyYW5zYWN0aW9uIjsKLQlTdHJpbmcgSU5TVFJVTUVOVEFCTEVfQ0xBU1NfTE9BREVSID0gUEFDS0FHRV8gKyAiSW5zdHJ1bWVudGFibGVDbGFzc0xvYWRlciI7Ci0JU3RyaW5nIFFVRVJZID0gUEFDS0FHRV8gKyAiUXVlcnkiOwotCi0JLy8gSlBBIGNsYXNzZXMKLQlTdHJpbmcgUEVSU0lTVEVOQ0UgPSBQQUNLQUdFXyArICJYbWxQZXJzaXN0ZW5jZSI7Ci0KLQkvLyBKUEEgZXhjZXB0aW9ucwotCVN0cmluZyBOT05fVU5JUVVFX1JFU1VMVF9FWENFUFRJT04gPSBQQUNLQUdFXyArICJOb25VbmlxdWVSZXN1bHRFeGNlcHRpb24iOwotCVN0cmluZyBPQkpFQ1RfTk9UX0ZPVU5EX0VYQ0VQVElPTiA9IFBBQ0tBR0VfICsgIk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIjsKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfRVhDRVBUSU9OID0gUEFDS0FHRV8gKyAiUGVyc2lzdGVuY2VFeGNlcHRpb24iOwotCi0KLQkvLyAqKioqKioqKioqIFNQSSAqKioqKioqKioqCi0KLQkvLyBKUEEgU1BJIHBhY2thZ2UKLQlTdHJpbmcgU1BJX1BBQ0tBR0UgPSBQQUNLQUdFXyArICJzcGkiOwotCVN0cmluZyBTUElfUEFDS0FHRV8gPSBTUElfUEFDS0FHRSArICcuJzsKLQotCS8vIEpQQSBTUEkgaW50ZXJmYWNlcwotCVN0cmluZyBFTlRJVFlfTUFOQUdFUl9GQUNUT1JZX1BST1ZJREVSID0gU1BJX1BBQ0tBR0VfICsgIkVudGl0eU1hbmFnZXJGYWN0b3J5UHJvdmlkZXIiOwotCVN0cmluZyBQRVJTSVNURU5DRV9JTkZPID0gU1BJX1BBQ0tBR0VfICsgIlBlcnNpc3RlbmNlSW5mbyI7Ci0JU3RyaW5nIFBFUlNJU1RFTkNFX1BST1ZJREVSID0gU1BJX1BBQ0tBR0VfICsgIlBlcnNpc3RlbmNlUHJvdmlkZXIiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiYzdkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbDsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlTW9kZWwgZXh0ZW5kcyBSZXNvdXJjZU1vZGVsIHsKLQotCUpwYUNvbXBpbGF0aW9uVW5pdCBnZXRKcGFDb21waWxhdGlvblVuaXQoKTsKLQotCXZvaWQgcmVzb3VyY2VDaGFuZ2VkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzMTM5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VOb2RlIGV4dGVuZHMgTW9kZWwgewotCi0Jdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCUphdmFSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoKTsKLQotCUpwYUNvbXBpbGF0aW9uVW5pdCBnZXRKcGFDb21waWxhdGlvblVuaXQoKTsKLQotCXZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCVRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTYxZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotLy9UT0RPIGhvdyBkbyB3ZSBoYW5kbGU6Ci0vLyAgQEJhc2ljCi0vLyAgcHJpdmF0ZSBTdHJpbmcgZm9vLCBiYXI7Ci1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZXh0ZW5kcyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyCi17Ci0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQlNZW1iZXIgZ2V0TWVtYmVyKCk7Ci0JCi0JYm9vbGVhbiBpc0ZvckZpZWxkKCk7Ci0JCi0JYm9vbGVhbiBpc0ZvclByb3BlcnR5KCk7Ci0JCi0JYm9vbGVhbiB0eXBlSXNCYXNpYygpOwotCQlTdHJpbmcgVFlQRV9JU19CQVNJQ19QUk9QRVJUWSA9ICJ0eXBlSXNCYXNpY1Byb3BlcnR5IjsKLQkKLQlib29sZWFuIGlzRmluYWwoKTsKLQkJU3RyaW5nIEZJTkFMX1BST1BFUlRZID0gImZpbmFsUHJvcGVydHkiOwotCQotCWJvb2xlYW4gaXNQdWJsaWMoKTsKLQkJU3RyaW5nIFBVQkxJQ19QUk9QRVJUWSA9ICJwdWJsaWNQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIGEgY29udGFpbmVyOgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uCi0JICogamF2YS51dGlsLlNldAotCSAqIGphdmEudXRpbC5MaXN0Ci0JICogamF2YS51dGlsLk1hcAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIHR5cGVJc0NvbnRhaW5lcigpOwotCQlTdHJpbmcgVFlQRV9JU19DT05UQUlORVJfUFJPUEVSVFkgPSAidHlwZUlzQ29udGFpbmVyUHJvcGVydHkiOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgcXVhbGZpZWQgdHlwZSBuYW1lIGZvciB0aGUgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldFF1YWxpZmllZFR5cGVOYW1lKCk7Ci0JCVN0cmluZyBRVUFMSUZJRURfVFlQRV9OQU1FX1BST1BFUlRZID0gInF1YWxmaWVkVHlwZU5hbWVQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgcXVhbGZpZWQgdHlwZSBuYW1lIGZvciB0aGUgYXR0cmlidXRlCi0JICogaWYgaXQgYXMgdmFsaWQgYXMgYSB0YXJnZXQgZW50aXR5IHR5cGUuICBpLmUuIG5vdCBhbiBhcnJheS4KLQkgKiBzZWUgdHlwZUlzQ29udGFpbmVyKCkgdG8gYmUgdXNlZCB3aXRoIHRoaXMKLQkgKi8KLQlTdHJpbmcgZ2V0UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoKTsKLQkJU3RyaW5nIFFVQUxJRklFRF9SRUZFUkVOQ0VfRU5USVRZX1RZUEVfTkFNRV9QUk9QRVJUWSA9ICJxdWFsZmllZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lUHJvcGVydHkiOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgcGFyYW1ldGVyIGZvciB1c2UgYXMgYSB0YXJnZXQgZW50aXR5Ci0JICovCi0JU3RyaW5nIGdldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZSgpOwotCQlTdHJpbmcgUVVBTElGSUVEX1JFRkVSRU5DRV9FTlRJVFlfRUxFTUVOVF9UWVBFX05BTUVfUFJPUEVSVFkgPSAicXVhbGZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWVQcm9wZXJ0eSI7Ci0JCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgYXR0cmlidXRlIGhhcyBhbnkgbWFwcGluZyBvciBub24tbWFwcGluZyBhbm5vdGF0aW9ucwotCSAqIChvZiBjb3Vyc2Ugb25seSBwZXJzaXN0ZW5jZSByZWxhdGVkIGFubm90YXRpb25zKQotCSAqLwotCWJvb2xlYW4gaGFzQW55QW5ub3RhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzRjYmQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQotCS8qKgotCSAqIFJldHVybiBhbGwgPGNvZGU+SmF2YVJlc291cmNlPC9jb2RlPnMgdGhhdCBjb3JyZXNwb25kIHRvIHR5cGUKLQkgKiBtYXBwaW5nIGFubm90YXRpb25zIHNwZWNpZmllZCBpbiB0aGUgc291cmNlIGNvZGUuICBJbiBKUEEgdGhlc2UgY291bGQgYmUgCi0JICogRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzLCBFbWJlZGRhYmxlLgotCSAqIDxwPkRvZXMgbm90IHJldHVybiBkdXBsaWNhdGUgYW5ub3RhdGlvbnMgYXMgdGhpcyBlcnJvciBpcyBoYW5kbGVkIGJ5IHRoZSBqYXZhIGNvbXBpbGVyLgotCSAqLwotCTxUIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZT4gSXRlcmF0b3I8VD4gbWFwcGluZ0Fubm90YXRpb25zKCk7Ci0JCVN0cmluZyBNQVBQSU5HX0FOTk9UQVRJT05TX0NPTExFQ1RJT04gPSAibWFwcGluZ0Fubm90YXRpb25zIjsKLQkKLQlpbnQgbWFwcGluZ0Fubm90YXRpb25zU2l6ZSgpOwotCS8qKgotCSAqIFJldHVybiB0aGUgPGNvZGU+SmF2YVJlc291cmNlPC9jb2RlPiBzcGVjaWZpZWQgb24gdGhpcyBKYXZhUGVyc2lzdGVudFJlc291cmNlCi0JICogSW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGVzIHRoZSBmaXJzdCBvbmUgd2lsbCBiZSByZXR1cm5lZCBhcyBkZWZpbmVkIGJ5IHRoZSBvcmRlciBvZgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5HZW5lcmljSnBhUGxhdGZvcm0jdHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKX0gb3IgCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkdlbmVyaWNKcGFQbGF0Zm9ybSNhdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zKCl9Ci0JICovCi0JSmF2YVJlc291cmNlTm9kZSBnZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+SmF2YVJlc291cmNlPC9jb2RlPiB3aXRoIHRoaXMgZnVsbHkgcXVhbGlmZWQgYW5ub3RhdGlvbiBuYW1lLiAKLQkgKiBJbiBKUEEgdGhlIHZhbGlkIGFubm90YXRpb25zIGFyZSAiamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkZGFibGUiLCAiamF2YXgucGVyc2lzdGVuY2UuRW50aXR5IiwgCi0JICogYW5kICJqYXZheC5wZXJzaXN0ZW5jZS5NYXBwZWRTdXBlcmNsYXNzIgotCSAqIFJldHVybiB0aGUgZmlyc3QgaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgaW4gdGhlIHNvdXJjZSBjb2RlCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lIC0gZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24gbmFtZQotCSAqLwotCS8vVE9ETyBub3Qgc3VyZSB3ZSBuZWVkIHRoaXMgQVBJLCBmaXJzdCAyIHNlZW0gc3VmZmljaWVudAotCUphdmFSZXNvdXJjZU5vZGUgZ2V0TWFwcGluZ0Fubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQotCS8qKgotCSAqIFVzZSB0aGlzIHRvIGNoYW5nZSB0aGUgdHlwZSBtYXBwaW5nIGFubm90YXRpb24uICBUaGlzIHdpbGwgb25seSByZW1vdmUKLQkgKiBvdGhlciBtYXBwaW5nIGFubm90YXRpb25zIGluIGNhc2UgdGhlcmUgd2VyZSBtdWx0aXBsZSBiZWZvcmUuICBJdAotCSAqIHdpbGwgbm90IHJlbW92ZSBhbnkgbm9uLW1hcHBpbmcgYW5ub3RhdGlvbnMKLQkgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgLSBmdWxseSBxdWFsaWZpZWQgYW5ub3RhdGlvbiBuYW1lCi0JICovCi0Jdm9pZCBzZXRNYXBwaW5nQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCA8Y29kZT5KYXZhUmVzb3VyY2U8L2NvZGU+cyB0aGF0IGNvcnJlc3BvbmQgdG8gYW5ub3RhdGlvbnMgaW4gdGhlIHNvdXJjZSBjb2RlLgotCSAqIERvZXMgbm90IHJldHVybiBkdXBsaWNhdGUgYW5ub3RhdGlvbnMgYXMgdGhpcyBlcnJvciBpcyBoYW5kbGVkIGJ5IHRoZSBqYXZhIGNvbXBpbGVyLgotCSAqIE5vIDxjb2RlPk1hcHBpbmdBbm5vdGF0aW9uPC9jb2RlPnMgc2hvdWxkIGJlIGluY2x1ZGVkLgotCSAqIEBzZWUgI21hcHBpbmdBbm5vdGF0aW9ucygpCi0JICovCi0JPFQgZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlPiBJdGVyYXRvcjxUPiAgYW5ub3RhdGlvbnMoKTsKLQkKLQkJU3RyaW5nIEFOTk9UQVRJT05TX0NPTExFQ1RJT04gPSAiYW5ub3RhdGlvbnMiOwotCi0JaW50IGFubm90YXRpb25zU2l6ZSgpOwotCi0JLy9UT0RPIHRpZSB0aGUgc2luZ3VsYXIgYW5kIHBsdXJhbCBhbm5vdGF0aW9ucyB0b2dldGhlciBzb21laG93IGluIHRoZSByZXNvdXJjZSBtb2RlbCBzbyB3ZSBjYW4gZ2l2ZQotCS8vYSB2YWxpZGF0aW9uIGVycm9yIGZvciB0aGUgY2FzZSBvZiBib3RoIGJlaW5nIHNwZWNpZmllZAotCS8qKgotCSAqIEdpdmVuIGEgbmVzdGFibGUgYW5kIGNvbnRhaW5lciBhbm5vdGF0aW9uIG5hbWUgcmV0dXJuIHRoZSBzcGVjaWZpZWQgPGNvZGU+SmF2YVJlc291cmNlPC9jb2RlPnMuCi0JICogSWYgYm90aCB0aGUgbmVzdGFibGUgYW5kIGNvbnRhaW5lciBhbm5vdGF0aW9ucyBhcmUgc3BlY2lmaWVkIG9uIHRoZSBUeXBlLCB0aGVuIG9ubHkKLQkgKiByZXR1cm4gdGhlIG5lc3RhYmxlIGFubm90YXRpb25zIHNwZWNpZmllZCB3aXRoaW4gdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uLiBUaGlzIGlzCi0JICogb25seSBnb2luZyB0byByZXR1cm4gSmF2YVJlc291cmNlcyB0aGF0IG1hdGNoIHRoZSBuZXN0YWJsZUFubm90YXRpb25OYW1lCi0JICovCi0JPFQgZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlPiBMaXN0SXRlcmF0b3I8VD4gYW5ub3RhdGlvbnMoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+SmF2YVJlc291cmNlPC9jb2RlPiB3aXRoIHRoaXMgZnVsbHkgcXVhbGlmZWQgYW5ub3RhdGlvbiBuYW1lLiAKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGlmIHRoZXJlIGFyZSBkdXBsaWNhdGVzIGluIHRoZSBzb3VyY2UgY29kZS4KLQkgKi8KLQlKYXZhUmVzb3VyY2VOb2RlIGdldEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5KYXZhUmVzb3VyY2U8L2NvZGU+IHdpdGggdGhpcyBmdWxseSBxdWFsaWZlZCBhbm5vdGF0aW9uIG5hbWUuIAotCSAqIFJldHVybiB0aGUgZmlyc3QgaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgaW4gdGhlIHNvdXJjZSBjb2RlLiAgV2lsbCBub3QgcmV0dXJuIG51bGwsCi0JICogYnV0IGEgbnVsbCBPYmplY3QgaW5zdGVhZCBpZiBubyBhbm5vdGF0aW9uIHdpdGggdGhpcyBuYW1lIGV4aXN0cyBpbiB0aGUgamF2YSBzb3VyY2UuCi0JICovCi0JSmF2YVJlc291cmNlTm9kZSBnZXROb25OdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbnVsbCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5KYXZhUmVzb3VyY2VOb2RlPC9jb2RlPiB3aXRoIHRoaXMgZnVsbHkgcXVhbGlmZWQgYW5ub3RhdGlvbiBuYW1lLgotCSAqIFRoZSBjb3JyZXNwb25kaW5nIEFubm90YXRpb25EZWZpbml0aW9uIG5lZWRzIHRvIGltcGxlbWVudCBidWlsZE51bGxBbm5vdGF0aW9uKCkKLQkgKiB7QGxpbmsgQW5ub3RhdGlvbkRlZmluaXRpb24jYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5Lk1lbWJlcil9Ci0JICovCi0JSmF2YVJlc291cmNlTm9kZSBnZXROdWxsTWFwcGluZ0Fubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQotCS8qKgotCSAqIEFkZCBhbiBhbm5vdGF0aW9uIGZvciB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24gbmFtZQotCSAqLwotCUphdmFSZXNvdXJjZU5vZGUgYWRkQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCQotCXZvaWQgcmVtb3ZlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCi0JLyoqCi0JICogQWRkIGEgbmV3IE5lc3RhYmxlQW5ub3RhdGlvbiBuYW1lZCBuZXN0YWJsZUFubm90YXRpb25OYW1lLiAgQ3JlYXRlIGEgbmV3IGNvbnRhaW5lciBhbm5vdGF0aW9uCi0JICogaWYgbmVjZXNzYXJ5IGFuZCBhZGQgdGhlIG5lc3RhYmxlIGFubm90YXRpb24gdG8gaXQuICBJZiBib3RoIG5lc3RhYmxlIGFuZCBjb250YWluZXIgYWxyZWFkeQotCSAqIGV4aXN0IHRoZW4gYWRkIHRvIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiBsZWF2aW5nIHRoZSBleGlzdGluZyBuZXN0YWJsZSBhbm5vdGFpb24gYWxvbmUuCi0JICogSWYgb25seSBuZXN0YWJsZSBleGlzdHMsIHRoZW4gY3JlYXRlIHRoZSBuZXcgY29udGFpbmVyIGFubm90YXRpb24gYW5kIG1vdmUgdGhlIG5lc3RhYmxlIHRvIGl0Ci0JICogYWxzbyBhZGRpbmcgdGhlIG5ldyBvbmUuICBJZiBuZWl0aGVyIGV4aXN0cywgY3JlYXRlIGEgbmV3IG5lc3RhYmxlIGFubm90YXRpb24uCi0JICogQHJldHVybiB0aGUgbmV3IEphdmFSZXNvdXJjZSB3aXRoIHRoZSBuYW1lIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUKLQkgKi8KLQlKYXZhUmVzb3VyY2VOb2RlIGFkZEFubm90YXRpb24oaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKLQkKLQl2b2lkIHJlbW92ZUFubm90YXRpb24oaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKLQkKLQkvKioKLQkgKiBNb3ZlIG5lc3RhYmxlQW5ub3RhdGlvbiBmb3VuZCBpbiB0aGUgY29udGFpbmVyQW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIAotCSAqIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4LiAgICAKLQkgKi8KLQl2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgSkRUIG1lbWJlciBpcyBwZXJzaXN0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIEpQQSBzcGVjCi0JICovCi0JYm9vbGVhbiBpc1BlcnNpc3RhYmxlKCk7Ci0JCVN0cmluZyBQRVJTSVNUQUJMRV9QUk9QRVJUWSA9ICJwZXJzaXN0YWJsZSI7Ci0JCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIEpEVCBtZW1iZXIgaXMgY3VycmVudGx5IGFubm90YXRlZCBhcyBiZWluZyBwZXJzaXN0ZW50Ci0JICogKGVxdWl2YWxlbnQgdG8gImlzIG1hcHBlZCIpCi0JICovCi0JYm9vbGVhbiBpc1BlcnNpc3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCBtZW1iZXIgaXMgZm9yIHRoZSBzcGVjaWZpZWQKLQkgKiBtZW1iZXIuCi0JICovCi0JYm9vbGVhbiBpc0ZvcihTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCBtZW1iZXIgaXMgZm9yIHRoZSBzcGVjaWZpZWQKLQkgKiBtZXRob2QuCi0JICovCi0JYm9vbGVhbiBpc0ZvcihNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlLCBpbnQgb2NjdXJyZW5jZSk7Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHRleHQgcmFuZ2UgZm9yIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW50IHJlc291cmNlCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJlc29sdmUgdHlwZSBpbmZvcm1hdGlvbiB0aGF0IGNvdWxkIGJlIGRlcGVuZGVudCBvbiBvdGhlciBmaWxlcyBiZWluZyBhZGRlZC9yZW1vdmVkCi0JICovCi0Jdm9pZCByZXNvbHZlVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzFhM2YzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBleHRlbmRzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIKLXsJCi0JLyoqCi0JICogUmV0dXJuIG9ubHkgdGhlIGltbWVkaWF0ZWx5IG5lc3RlZCBwZXJzaXN0YWJsZSBuZXN0ZWRUeXBlcwotCSAqLwotCUl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBuZXN0ZWRUeXBlcygpOwotCQlTdHJpbmcgTkVTVEVEX1RZUEVTX0NPTExFQ1RJT04gPSAibmVzdGVkVHlwZXMiOwotCi0JLyoqCi0JICogUmV0dXJuIG9ubHkgdGhlIHBlcnNpc3RhYmxlIGF0dHJpYnV0ZXMsIHRob3NlIHRoYXQgcmVzcG9uZCB0cnVlIHRvCi0JICoge0BsaW5rIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUjaXNQZXJzaXN0YWJsZSgpfQotCSAqIFRoaXMgcmV0dXJucyBmaWVsZHMgYW5kIHByb3BlcnRpZXMKLQkgKi8KLQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzKCk7Ci0JCVN0cmluZyBBVFRSSUJVVEVTX0NPTExFQ1RJT04gPSAiYXR0cmlidXRlcyI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIG9ubHkgdGhlIHBlcnNpc3RhYmxlIGZpZWxkcywgdGhvc2UgdGhhdCByZXNwb25kIHRydWUgdG8KLQkgKiB7QGxpbmsgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSNpc1BlcnNpc3RhYmxlKCl9Ci0JICogVGhpcyByZXR1cm5zIGZpbHRlcnMgb3V0IGFsbCBwcm9wZXJ0aWVzIGFuZCBvbmx5IHJldHVybnMgZmllbGRzCi0JICovCi0JSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gZmllbGRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gb25seSB0aGUgcGVyc2lzdGFibGUgZmllbGRzLCB0aG9zZSB0aGF0IHJlc3BvbmQgdHJ1ZSB0bwotCSAqIHtAbGluayBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlI2lzUGVyc2lzdGFibGUoKX0KLQkgKiBUaGlzIHJldHVybnMgZmlsdGVycyBvdXQgYWxsIGZpZWxkcyBhbmQgb25seSByZXR1cm5zIHByb3BlcnRpZXMKLQkgKi8KLQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBwcm9wZXJ0aWVzKCk7Ci0JCi0JLy8gVE9ETyByZW5hbWUgdG8gZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoU3RyaW5nKQotCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZQotCSAqLwotCVN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCk7Ci0JCVN0cmluZyBRVUFMSUZJRURfTkFNRV9QUk9QRVJUWSA9ICJxdWFsaWZpZWROYW1lIjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHkgdW5xdWFsaWZpZWQgdHlwZSBuYW1lCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQlTdHJpbmcgZ2V0U3VwZXJDbGFzc1F1YWxpZmllZE5hbWUoKTsKLQkJU3RyaW5nIFNVUEVSX0NMQVNTX1FVQUxJRklFRF9OQU1FX1BST1BFUlRZID0gInN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lIjsKLQkKLQlBY2Nlc3NUeXBlIGdldEFjY2VzcygpOwotCQlTdHJpbmcgQUNDRVNTX1BST1BFUlRZID0gImFjY2VzcyI7Ci0JCQotCWJvb2xlYW4gaXNBYnN0cmFjdCgpOwotCQlTdHJpbmcgQUJTVFJBQ1RfUFJPUEVSVFkgPSAiYWJzdHJhY3QiOwkKLQkJCi0JTWVtYmVyIGdldE1lbWJlcigpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBhdHRyaWJ1dGVzIGluIHRoaXMgcGVyc2lzdGVudFR5cGUgaGF2ZQotCSAqIEpQQSBhbm5vdGF0aW9ucyBvbiB0aGVtLgotCSAqLwotCWJvb2xlYW4gaGFzQW55QXR0cmlidXRlQW5ub3RhdGlvbnMoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTVhNTRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKb2luQ29sdW1uQW5ub3RhdGlvbiBleHRlbmRzIEJhc2VDb2x1bW5Bbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5KT0lOX0NPTFVNTjsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSByZWZlcmVuY2VkQ29sdW1uTmFtZSBlbGVtZW50IG9mIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSByZWZlcmVuY2VkQ29sdW1uTmFtZSB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgcmVmZXJlbmNlZENvbHVtbk5hbWUgZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgcmVmZXJlbmNlZENvbHVtbk5hbWUgdmFsdWVQYWl0IGZyb20gdGhlIEFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCVN0cmluZyBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gInJlZmVyZW5jZWRDb2x1bW5OYW1lUHJvcGVydHkiOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSByZWZlcmVuY2VkQ29sdW1uTmFtZSBlbGVtZW50LiBJZiB0aGUgCi0JICogcmVmZXJlbmNlZENvbHVtbk5hbWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IAotCSAqIGZvciB0aGUgSm9pbkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc3RpdGlvbiB0b3VjaGVzIHRoZSAgcmVmZXJlbmNlZENvbHVtbk5hbWUgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlICByZWZlcmVuY2VkQ29sdW1uTmFtZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbnNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uc0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlNmJjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uc0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSm9pbkNvbHVtbnNBbm5vdGF0aW9uIGV4dGVuZHMgQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZUpvaW5Db2x1bW4+Ci17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5KT0lOX0NPTFVNTlM7Ci0JCi0JU3RyaW5nIEpPSU5fQ09MVU1OU19MSVNUID0gImpvaW5Db2x1bW5zTGlzdCI7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZDhkZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSm9pblRhYmxlQW5ub3RhdGlvbiBleHRlbmRzIFRhYmxlQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuSk9JTl9UQUJMRTsKLQotCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMoKTsKLQkKLQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KTsKLQkKLQlpbnQgaW5kZXhPZkpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbik7Ci0JCi0JaW50IGpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCXZvaWQgbW92ZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5TX0xJU1QgPSAiam9pbkNvbHVtbnNMaXN0IjsKLQkKLQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucygpOwotCQotCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGludmVyc2VKb2luQ29sdW1uQXQoaW50IGluZGV4KTsKLQkKLQlpbnQgaW5kZXhPZkludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pOwotCQotCWludCBpbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0KLQlKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQkKLQl2b2lkIG1vdmVJbnZlcnNlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCVN0cmluZyBJTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUID0gImludmVyc2VKb2luQ29sdW1uc0xpc3QiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KcGFDb21waWxhdGlvblVuaXQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pwYUNvbXBpbGF0aW9uVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmU4OGY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pwYUNvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXI7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYUNvbXBpbGF0aW9uVW5pdCBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUgewotCi0JSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKTsKLQotCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCVN0cmluZyBQRVJTSVNURU5UX1RZUEVfUFJPUEVSVFkgPSAicGVyc2lzdGVudFR5cGUiOwotCi0JLy8gVE9ETyByZW5hbWUgZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoU3RyaW5nKQotCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKFN0cmluZyB0eXBlTmFtZSk7Ci0KLQlKcGFBbm5vdGF0aW9uUHJvdmlkZXIgZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCk7Ci0KLQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCk7Ci0JCi0JQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKTsKLQotCXZvaWQgcmVzb3VyY2VDaGFuZ2VkKCk7Ci0JCi0JLyoqCi0JICogUmVzb2x2ZSB0eXBlIGluZm9ybWF0aW9uIHRoYXQgY291bGQgYmUgZGVwZW5kZW50IG9uIG90aGVyIGZpbGVzIGJlaW5nIGFkZGVkL3JlbW92ZWQKLQkgKi8KLQl2b2lkIHJlc29sdmVUeXBlcygpOwotCi0Jdm9pZCB1cGRhdGVGcm9tSmF2YSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Mb2JBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Mb2JBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWVkZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTG9iQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5Mb2IgYW5ub3RhdGlvbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBMb2JBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuTE9COwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTWFueVRvTWFueUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNWI4NjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTWFueVRvTWFueUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hbnlUb01hbnlBbm5vdGF0aW9uIGV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLk1BTllfVE9fTUFOWTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBtYXBwZWRCeSBlbGVtZW50IG9mIHRoZSBNYW55VG9NYW55IGFubm90YXRpb24uIAotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbWFwcGVkQnkgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqLwotCVN0cmluZyBnZXRNYXBwZWRCeSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBtYXBwZWRCeSBlbGVtZW50IG9mIHRoZSBNYW55VG9NYW55IGFubm90YXRpb24uIAotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgbWFwcGVkQnkgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSk7Ci0JCVN0cmluZyBNQVBQRURfQllfUFJPUEVSVFkgPSAibWFwcGVkQnlQcm9wZXJ0eSI7Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBtYXBwZWRCeSBlbGVtZW50LiAgSWYgdGhlIG1hcHBlZEJ5IGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE1hbnlUb01hbnkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3N0aXRpb24gdG91Y2hlcyB0aGUgbWFwcGVkQnkgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIG1hcHBlZEJ5IGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMGQ2ODkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTWFueVRvT25lQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFueVRvT25lQW5ub3RhdGlvbiBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5NQU5ZX1RPX09ORTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgb3B0aW9uYWwgZWxlbWVudCBvZiB0aGUgTWFueVRvT25lIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBvcHRpb25hbCBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCi0JICovCi0JQm9vbGVhbiBnZXRPcHRpb25hbCgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBvcHRpb25hbCBlbGVtZW50IG9mIHRoZSBNYW55VG9PbmUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIG9wdGlvbmFsIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKTsKLQkJU3RyaW5nIE9QVElPTkFMX1BST1BFUlRZID0gIm9wdGlvbmFsUHJvcGVydHkiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG9wdGlvbmFsIGVsZW1lbnQuICBJZiB0aGUgb3B0aW9uYWwgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgTWFueVRvT25lIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTWFwS2V5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTWFwS2V5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDAyZDM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL01hcEtleUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleSBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcEtleUFubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5NQVBfS0VZOwotCi0JU3RyaW5nIGdldE5hbWUoKTsJCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsKLQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG5hbWUgZWxlbWVudC4gIElmIHRoZSBuYW1lIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE1hcEtleSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zdGl0aW9uIHRvdWNoZXMgdGhlIG5hbWUgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIG5hbWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxYWNhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLk1BUFBFRF9TVVBFUkNMQVNTOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZENvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTlkNTZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG5hbWUgdmFsdWVQYWlyIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbmFtZSBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBuYW1lIHZhbHVlUGFpciBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsKLQkJCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGNvbHVtbkRlZmluaXRpb24gZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgY29sdW1uRGVmaW5pdGlvbiB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBjb2x1bW5EZWZpbml0aW9uIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGNvbHVtbkRlZmluaXRpb24gdmFsdWVQYWlyIGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIGNvbHVtbkRlZmluaXRpb24pOwotCQlTdHJpbmcgQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFkgPSAiY29sdW1uRGVmaW5pdGlvblByb3BldHkiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG5hbWUgZWxlbWVudC4gSWYgdGhlIG5hbWUgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGNvbHVtbkRlZmluaXRpb24gZWxlbWVudC4gSWYgdGhlIGNvbHVtbkRlZmluaXRpb24gCi0JICogZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRDb2x1bW5EZWZpbml0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zdGl0aW9uIHRvdWNoZXMgdGhlIG5hbWUgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIG5hbWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjkxNmJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbiBleHRlbmRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5PgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVM7Ci0KLQlTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCA9ICJuYW1lZE5hdGl2ZVF1ZXJpZXNMaXN0IjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTViZDk0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkTmF0aXZlUXVlcnkgYW5ub3RhdGlvbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBleHRlbmRzIFF1ZXJ5QW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuTkFNRURfTkFUSVZFX1FVRVJZOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHJlc3VsdENsYXNzIGVsZW1lbnQgb2YgdGhlIE5hbWVkTmF0aXZlUXVlcnkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHJlc3VsdENsYXNzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0UmVzdWx0Q2xhc3MoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgcmVzdWx0Q2xhc3MgZWxlbWVudCBvZiB0aGUgTmFtZWROYXRpdmVRdWVyeSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgcmVzdWx0Q2xhc3MgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFJlc3VsdENsYXNzKFN0cmluZyByZXN1bHRDbGFzcyk7Ci0JCVN0cmluZyBSRVNVTFRfQ0xBU1NfUFJPUEVSVFkgPSAicmVzdWx0Q2xhc3NQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHJlc3VsdFNldE1hcHBpbmcgZWxlbWVudCBvZiB0aGUgTmFtZWROYXRpdmVRdWVyeSBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgcmVzdWx0U2V0TWFwcGluZyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCi0JICovCi0JU3RyaW5nIGdldFJlc3VsdFNldE1hcHBpbmcoKTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSByZXN1bHRTZXRNYXBwaW5nIGVsZW1lbnQgb2YgdGhlIE5hbWVkTmF0aXZlUXVlcnkgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIHJlc3VsdFNldE1hcHBpbmcgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFJlc3VsdFNldE1hcHBpbmcoU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcpOwotCQlTdHJpbmcgUkVTVUxUX1NFVF9NQVBQSU5HX1BST1BFUlRZID0gInJlc3VsdFNldE1hcHBpbmdQcm9wZXJ0eSI7Ci0JCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3MoKTsKLQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1JFU1VMVF9DTEFTU19QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZFJlc3VsdENsYXNzUHJvcGVydHkiOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSByZXN1bHRDbGFzcyBlbGVtZW50LiBJZiByZXN1bHRDbGFzcyBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE5hbWVkTmF0aXZlUXVlcnkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UmVzdWx0Q2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHJlc3VsdFNldE1hcHBpbmcgZWxlbWVudC4gSWYgcmVzdWx0U2V0TWFwcGluZyBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE5hbWVkTmF0aXZlUXVlcnkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UmVzdWx0U2V0TWFwcGluZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcmllc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcmllc0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkZGNiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkUXVlcmllc0Fubm90YXRpb24gZXh0ZW5kcyBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlTmFtZWRRdWVyeT4KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLk5BTUVEX1FVRVJJRVM7Ci0KLQlTdHJpbmcgTkFNRURfUVVFUklFU19MSVNUID0gIm5hbWVkUXVlcmllc0xpc3QiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYTdhYWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyeSBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkUXVlcnlBbm5vdGF0aW9uIGV4dGVuZHMgUXVlcnlBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5OQU1FRF9RVUVSWTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1MDJkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbgotewotCS8vY3VycmVudGx5IHVzaW5nIHRoaXMgd2hlbiB0aGUgTmVzdGFibGVBbm5vdGF0aW9uIGlzIG1vdmVkIGZyb20KLQkvL3N0YW5kYWxvbmUgdG8gbmVzdGVkIG9yIGZyb20gbmVzdGVkIHRvIHN0YW5kYWxvbmUuCi0JLy9ub3QgdGhlIGdyZWF0ZXN0IHNpbmNlIHlvdSBoYXZlIHRvIG1ha2Ugc3VyZSB0byBjYWxsIGFsbCBzZXR0ZXIgbWV0aG9kcwotCXZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pOwotCQotCS8qKgotCSAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBOZXN0YWJsZUFubm90YXRpb24gaXMgYWN0dWFsbHkgbmVzdGVkCi0JICogQHBhcmFtIG5ld0luZGV4Ci0JICovCi0Jdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjNTExNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlCi0JZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2YzIwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUKLQlleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZGQ0YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5lc3RhYmxlSm9pbkNvbHVtbiBleHRlbmRzIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLCBOZXN0YWJsZUFubm90YXRpb24KLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkOGQwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5Ci0JZXh0ZW5kcyBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlTmFtZWRRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVOYW1lZFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NTRmZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVOYW1lZFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5lc3RhYmxlTmFtZWRRdWVyeQotCWV4dGVuZHMgTmFtZWRRdWVyeUFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbgotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZGJlOTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uCi0JZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbgotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVF1ZXJ5SGludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVRdWVyeUhpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMjczNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVF1ZXJ5SGludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBOZXN0YWJsZVF1ZXJ5SGludAotCWV4dGVuZHMgUXVlcnlIaW50QW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlU2Vjb25kYXJ5VGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlU2Vjb25kYXJ5VGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzNjUzYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVNlY29uZGFyeVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGUKLQlleHRlbmRzIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVVbmlxdWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZWNjYmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVVbmlxdWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludAotCWV4dGVuZHMgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbgotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9PbmVUb01hbnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9PbmVUb01hbnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZGVhM2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvT25lVG9NYW55QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT25lVG9NYW55QW5ub3RhdGlvbiBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5PTkVfVE9fTUFOWTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBtYXBwZWRCeSBlbGVtZW50IG9mIHRoZSBPbmVUb01hbnkgYW5ub3RhdGlvbi4gCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBtYXBwZWRCeSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCi0JICovCi0JU3RyaW5nIGdldE1hcHBlZEJ5KCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG1hcHBlZEJ5IGVsZW1lbnQgb2YgdGhlIE9uZVRvTWFueSBhbm5vdGF0aW9uLiAKLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIG1hcHBlZEJ5IGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbWFwcGVkQnkpOwotCQlTdHJpbmcgTUFQUEVEX0JZX1BST1BFUlRZID0gIm1hcHBlZEJ5UHJvcGVydHkiOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBtYXBwZWRCeSBlbGVtZW50LiAgSWYgdGhlIG1hcHBlZEJ5IGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE9uZVRvTWFueSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc3RpdGlvbiB0b3VjaGVzIHRoZSBtYXBwZWRCeSBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgbWFwcGVkQnkgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9PbmVUb09uZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL09uZVRvT25lQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWYzMzIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL09uZVRvT25lQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT25lVG9PbmVBbm5vdGF0aW9uIGV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLk9ORV9UT19PTkU7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgb3B0aW9uYWwgZWxlbWVudCBvZiB0aGUgT25lVG9PbmUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG9wdGlvbmFsIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlCb29sZWFuIGdldE9wdGlvbmFsKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG9wdGlvbmFsIGVsZW1lbnQgb2YgdGhlIE9uZVRvT25lIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBvcHRpb25hbCBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCk7Ci0JCVN0cmluZyBPUFRJT05BTF9QUk9QRVJUWSA9ICJvcHRpb25hbFByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbWFwcGVkQnkgZWxlbWVudCBvZiB0aGUgT25lVG9PbmUgYW5ub3RhdGlvbi4gCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBtYXBwZWRCeSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCi0JICovCi0JU3RyaW5nIGdldE1hcHBlZEJ5KCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG1hcHBlZEJ5IGVsZW1lbnQgb2YgdGhlIE9uZVRvT25lIGFubm90YXRpb24uIAotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgbWFwcGVkQnkgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSk7Ci0JCVN0cmluZyBNQVBQRURfQllfUFJPUEVSVFkgPSAibWFwcGVkQnlQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG1hcHBlZEJ5IGVsZW1lbnQuICBJZiB0aGUgbWFwcGVkQnkgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgT25lVG9PbmUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG9wdGlvbmFsIGVsZW1lbnQuICBJZiB0aGUgb3B0aW9uYWwgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgT25lVG9PbmUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0T3B0aW9uYWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3N0aXRpb24gdG91Y2hlcyB0aGUgbWFwcGVkQnkgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIG1hcHBlZEJ5IGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9PcmRlckJ5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvT3JkZXJCeUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyYWQ2ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9PcmRlckJ5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuT3JkZXJCeSBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9yZGVyQnlBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuT1JERVJfQlk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuT3JkZXJCeSBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgdmFsdWUgdmFsdWVQYWlyIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGVsZW1lbnQgb2YgdGhlIGphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQnkgYW5ub3RhdGlvbi4KLQkgKiBTZXR0aW5nIHRoZSB2YWx1ZSB0byBudWxsIHdpbGwgbm90IHJlbW92ZSB0aGUgT3JkZXJCeSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWVQcm9wZXJ0eSI7Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB2YWx1ZSBlbGVtZW50LiAgSWYgdGhlIHZhbHVlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE9yZGVyQnkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9PdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL092ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjk1NDgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL092ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuQXR0cmlidXRlT3ZlcnJpZGUgYW5ub3RhdGlvbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPdmVycmlkZUFubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCi17Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbmFtZSBlbGVtZW50IG9mIHRoZSBBdHRyaWJ1dGVPdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbmFtZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbmFtZSBlbGVtZW50IG9mIHRoZSBBdHRyaWJ1dGVPdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgbmFtZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0JCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWVQcm9wZXJ0eSI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbmFtZSBlbGVtZW50LiBJZiBuYW1lIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQXR0cmlidXRlT3ZlcnJpZGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc3RpdGlvbiB0b3VjaGVzIHRoZSB0YWJsZSBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgdGFibGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhNzRhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBleHRlbmRzIE5hbWVkQ29sdW1uQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU47Ci0KLQlTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkKLQl2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCVN0cmluZyBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gInJlZmVyZW5jZWRDb2x1bW5OYW1lUHJvcGVydHkiOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3N0aXRpb24gdG91Y2hlcyB0aGUgcmVmZXJlbmNlZENvbHVtbk5hbWUgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIHJlZmVyZW5jZWRDb2x1bW5OYW1lIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHJlZmVyZW5jZWRDb2x1bW5OYW1lIGVsZW1lbnQuIElmIHRoZSByZWZlcmVuY2VkQ29sdW1uTmFtZSAKLQkgKiBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxNjY1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24gZXh0ZW5kcyBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4+Ci17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM7Ci0KLQlTdHJpbmcgUEtfSk9JTl9DT0xVTU5TX0xJU1QgPSAicGtKb2luQ29sdW1uc0xpc3QiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvUXVlcnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9RdWVyeUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ZGVmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9RdWVyeUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVlcnlBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCVN0cmluZyBnZXROYW1lKCk7CQotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0JCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWVQcm9wZXJ0eSI7Ci0JCi0JU3RyaW5nIGdldFF1ZXJ5KCk7CQotCXZvaWQgc2V0UXVlcnkoU3RyaW5nIHF1ZXJ5KTsKLQkJU3RyaW5nIFFVRVJZX1BST1BFUlRZID0gInF1ZXJ5UHJvcGVydHkiOwotCQotCUxpc3RJdGVyYXRvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPiBoaW50cygpOwotCQotCVF1ZXJ5SGludEFubm90YXRpb24gaGludEF0KGludCBpbmRleCk7Ci0JCi0JaW50IGluZGV4T2ZIaW50KFF1ZXJ5SGludEFubm90YXRpb24gaGludCk7Ci0JCi0JaW50IGhpbnRzU2l6ZSgpOwotCi0JUXVlcnlIaW50QW5ub3RhdGlvbiBhZGRIaW50KGludCBpbmRleCk7Ci0JCi0Jdm9pZCByZW1vdmVIaW50KGludCBpbmRleCk7Ci0JCi0Jdm9pZCBtb3ZlSGludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCVN0cmluZyBISU5UU19MSVNUID0gImhpbnRzTGlzdCI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbmFtZSBlbGVtZW50LiBJZiBuYW1lIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHF1ZXJ5IGVsZW1lbnQuIElmIHF1ZXJ5IGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFF1ZXJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvUXVlcnlIaW50QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvUXVlcnlIaW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQ4Y2YxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1F1ZXJ5SGludEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLlF1ZXJ5SGludCBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5SGludEFubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5RVUVSWV9ISU5UOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgZWxlbWVudCBvZiB0aGUgUXVlcnlIaW50IGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBuYW1lIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgZWxlbWVudCBvZiB0aGUgUXVlcnlIaW50IGFubm90YXRpb24uCi0JICogU2V0dGluZyB0byBudWxsIHdpbGwgcmVtb3ZlIHRoZSBuYW1lIHZhbHVlUGFpcgotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0JCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWVQcm9wZXJ0eSI7Ci0JCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBlbGVtZW50IG9mIHRoZSBRdWVyeUhpbnQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHZhbHVlIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBlbGVtZW50IG9mIHRoZSBRdWVyeUhpbnQgYW5ub3RhdGlvbi4KLQkgKiBTZXR0aW5nIHRvIG51bGwgd2lsbCByZW1vdmUgdGhlIHZhbHVlIHZhbHVlUGFpcgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlUHJvcGVydHkiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG5hbWUgZWxlbWVudC4gIElmIHRoZSBuYW1lIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFF1ZXJ5SGludCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB2YWx1ZSBlbGVtZW50LiAgSWYgdGhlIHZhbHVlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFF1ZXJ5SGludCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1JlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9SZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGIzYWVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1JlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCi17Ci0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHRhcmdldEVudGl0eSBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgCi0JICogYW5ub3RhdGlvbnMgKE1hbnlUb01hbnksIE9uZVRvTWFueSwgTWFueVRvT25lLCBPbmVUb09uZSkuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSB0YXJnZXRFbnRpdHkgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqIFJldHVybnMgdGhlIHBvcnRpb24gb2YgdGhlIHRhcmdldEVudGl0eSBwcmVjZWRpbmcgdGhlIC5jbGFzcy4KLQkgKiA8cD4KLQkgKiAgICAgJiM2NDtNYW55VG9NYW55KHRhcmdldEVudGl0eT1FbXBsb3llZS5jbGFzcykKLQkgKiA8L3A+Ci0JICogd2lsbCByZXR1cm4gIkVtcGxveWVlIgotCSAqKi8KLQlTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCk7CQotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB0YXJnZXRFbnRpdHkgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLQkgKiBhbm5vdGF0aW9ucyAoTWFueVRvTWFueSwgT25lVG9NYW55LCBNYW55VG9PbmUsIE9uZVRvT25lKS4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIHRhcmdldEVudGl0eSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB0YXJnZXRFbnRpdHkpOwotCQlTdHJpbmcgVEFSR0VUX0VOVElUWV9QUk9QRVJUWSA9ICJ0YXJnZXRFbnRpdHlQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcXVhbGlmaWVkIHRhcmdldEVudGl0eSBuYW1lIGFzIGl0IGlzIHJlc29sdmVkIGluIHRoZSBBU1QKLQkgKiA8cD4KLQkgKiAgICAgJiM2NDtNYW55VG9NYW55KHRhcmdldEVudGl0eT1FbXBsb3llZS5jbGFzcykKLQkgKiA8L3A+Ci0JICogd2lsbCByZXR1cm4gIm1vZGVsLkVtcGxveWVlIiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yIG1vZGVsLkVtcGxveWVlCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpOwotCQlTdHJpbmcgRlVMTFlfUVVBTEZJRUlEX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGZldGNoIGVsZW1lbnQgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLQkgKiBhbm5vdGF0aW9ucyAoTWFueVRvTWFueSwgT25lVG9NYW55LCBNYW55VG9PbmUsIE9uZVRvT25lKS4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGZldGNoIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlGZXRjaFR5cGUgZ2V0RmV0Y2goKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgZmV0Y2ggZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIAotCSAqIGFubm90YXRpb25zIChNYW55VG9NYW55LCBPbmVUb01hbnksIE1hbnlUb09uZSwgT25lVG9PbmUpLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZmV0Y2ggZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCk7Ci0JCVN0cmluZyBGRVRDSF9QUk9QRVJUWSA9ICJmZXRjaFByb3BlcnR5IjsKLQkKLQlib29sZWFuIGlzQ2FzY2FkZUFsbCgpOwkKLQl2b2lkIHNldENhc2NhZGVBbGwoYm9vbGVhbiBhbGwpOwotCQlTdHJpbmcgQ0FTQ0FERV9BTExfUFJPUEVSVFkgPSAiY2FzY2FkZUFsbFByb3BlcnR5IjsKLQkKLQlib29sZWFuIGlzQ2FzY2FkZU1lcmdlKCk7CQotCXZvaWQgc2V0Q2FzY2FkZU1lcmdlKGJvb2xlYW4gbWVyZ2UpOwotCVN0cmluZyBDQVNDQURFX01FUkdFX1BST1BFUlRZID0gImNhc2NhZGVNZXJnZVByb3BlcnR5IjsKLQotCWJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpOwkKLQl2b2lkIHNldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gcGVyc2lzdCk7Ci0JCVN0cmluZyBDQVNDQURFX1BFUlNJU1RfUFJPUEVSVFkgPSAiY2FzY2FkZVBlcnNpc3RQcm9wZXJ0eSI7Ci0KLQlib29sZWFuIGlzQ2FzY2FkZVJlZnJlc2goKTsJCi0Jdm9pZCBzZXRDYXNjYWRlUmVmcmVzaChib29sZWFuIHJlZnJlc2gpOwotCQlTdHJpbmcgQ0FTQ0FERV9SRUZSRVNIX1BST1BFUlRZID0gImNhc2NhZGVSZWZyZXNoUHJvcGVydHkiOwotCi0JYm9vbGVhbiBpc0Nhc2NhZGVSZW1vdmUoKTsJCi0Jdm9pZCBzZXRDYXNjYWRlUmVtb3ZlKGJvb2xlYW4gcmVtb3ZlKTsKLQkJU3RyaW5nIENBU0NBREVfUkVNT1ZFX1BST1BFUlRZID0gImNhc2NhZGVSZW1vdmVQcm9wZXJ0eSI7Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgdGFyZ2V0RW50aXR5IGVsZW1lbnQuICBJZiB0aGUgdGFyZ2V0RW50aXR5IGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG1hcHBpbmcgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBmZXRjaCBlbGVtZW50LiAgSWYgdGhlIGZldGNoIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG1hcHBpbmcgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGNhc2NhZGUgZWxlbWVudC4gIElmIHRoZSBjYXNjYWRlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG1hcHBpbmcgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0Q2FzY2FkZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZmY5NWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gZXh0ZW5kcyBUYWJsZUFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlNFQ09OREFSWV9UQUJMRTsKLQotCUxpc3RJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHBrSm9pbkNvbHVtbnMoKTsKLQkKLQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uQXQoaW50IGluZGV4KTsKLQkKLQlpbnQgaW5kZXhPZlBrSm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uKTsKLQkKLQlpbnQgcGtKb2luQ29sdW1uc1NpemUoKTsKLQotCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRQa0pvaW5Db2x1bW4oaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZVBrSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCXZvaWQgbW92ZVBrSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQlTdHJpbmcgUEtfSk9JTl9DT0xVTU5TX0xJU1QgPSAicGtKb2luQ29sdW1uc0xpc3QiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWY5YzEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbiBleHRlbmRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVTZWNvbmRhcnlUYWJsZT4KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlNFQ09OREFSWV9UQUJMRVM7Ci0KLQlTdHJpbmcgU0VDT05EQVJZX1RBQkxFU19MSVNUID0gInNlY29uZGFyeVRhYmxlc0xpc3QiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFjNjMwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLlNlcXVlbmNlR2VuZXJhdG9yIGFubm90YXRpb24KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGV4dGVuZHMgR2VuZXJhdG9yQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuU0VRVUVOQ0VfR0VORVJBVE9SOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHNlcXVlbmNlTmFtZSBlbGVtZW50IG9mIHRoZSBTZXF1ZW5jZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgc2VxdWVuY2VOYW1lIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKLQkgKiB0aGUgU2VxdWVuY2VHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQlTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHNlcXVlbmNlTmFtZSBlbGVtZW50IG9mIHRoZSBTZXF1ZW5jZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgc2VxdWVuY2VOYW1lIGVsZW1lbnQuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0Ci0JICogdGhlIFNlcXVlbmNlR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCi0JICovCi0Jdm9pZCBzZXRTZXF1ZW5jZU5hbWUoU3RyaW5nIHNlcXVlbmNlTmFtZSk7Ci0JCVN0cmluZyBTRVFVRU5DRV9OQU1FX1BST1BFUlRZID0gInNlcXVlbmNlTmFtZVByb3BlcnR5IjsKLQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHNlcXVlbmNlTmFtZSBlbGVtZW50LiAgSWYgdGhlIHNlcXVlbmNlTmFtZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBTZXF1ZW5jZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTZXF1ZW5jZU5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1RhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVGFibGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NzFlOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlRBQkxFOwotCi0JU3RyaW5nIGdldE5hbWUoKTsKLQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOwotCQkKLQlTdHJpbmcgZ2V0Q2F0YWxvZygpOwotCXZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZyk7Ci0JCVN0cmluZyBDQVRBTE9HX1BST1BFUlRZID0gImNhdGFsb2dQcm9wZXJ0eSI7Ci0KLQlTdHJpbmcgZ2V0U2NoZW1hKCk7Ci0Jdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHNjaGVtYSk7Ci0JCVN0cmluZyBTQ0hFTUFfUFJPUEVSVFkgPSAic2NoZW1hUHJvcGVydHkiOwotCQotCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMoKTsKLQkKLQlVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QXQoaW50IGluZGV4KTsKLQkKLQlpbnQgaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCk7Ci0JCi0JaW50IHVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpOwotCi0JVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotCQotCXZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QgPSAidW5pcXVlQ29uc3RyYWludHNMaXN0IjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBuYW1lIGVsZW1lbnQuICBJZiB0aGUgbmFtZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgY2F0YWxvZyBlbGVtZW50LiAgSWYgdGhlIGNhdGFsb2cgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlRhYmxlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHNjaGVtYSBlbGVtZW50LiAgSWYgdGhlIHNjaGVtYSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc3RpdGlvbiB0b3VjaGVzIHRoZSBuYW1lIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBuYW1lIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3N0aXRpb24gdG91Y2hlcyB0aGUgc2NoZW1hIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBuYW1lIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBzY2hlbWFUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc3RpdGlvbiB0b3VjaGVzIHRoZSBjYXRhbG9nIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBuYW1lIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBjYXRhbG9nVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NThkMDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBleHRlbmRzIEdlbmVyYXRvckFubm90YXRpb24KLXsKLQkKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlRBQkxFX0dFTkVSQVRPUjsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB0YWJsZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgdGFibGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgotCSAqLwotCVN0cmluZyBnZXRUYWJsZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB0YWJsZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgdGFibGUgZWxlbWVudC4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKLQkgKiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQl2b2lkIHNldFRhYmxlKFN0cmluZyB0YWJsZSk7Ci0JCVN0cmluZyBUQUJMRV9QUk9QRVJUWSA9ICJ0YWJsZVByb3BlcnR5IjsKLQkJCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGNhdGFsb2cgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGNhdGFsb2cgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgotCSAqLwotCVN0cmluZyBnZXRDYXRhbG9nKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGNhdGFsb2cgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGNhdGFsb2cgZWxlbWVudC4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKLQkgKiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQl2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpOwotCQlTdHJpbmcgQ0FUQUxPR19QUk9QRVJUWSA9ICJjYXRhbG9nUHJvcGVydHkiOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBzY2hlbWEgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHNjaGVtYSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0Ci0JICogdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCi0JICovCi0JU3RyaW5nIGdldFNjaGVtYSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBzY2hlbWEgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIHNjaGVtYSBlbGVtZW50LiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgotCSAqLwotCXZvaWQgc2V0U2NoZW1hKFN0cmluZyBzY2hlbWEpOwotCQlTdHJpbmcgU0NIRU1BX1BST1BFUlRZID0gInNjaGVtYVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgcGtDb2x1bW5OYW1lIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBwa0NvbHVtbk5hbWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgotCSAqLwotCVN0cmluZyBnZXRQa0NvbHVtbk5hbWUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgcGtDb2x1bW5OYW1lIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBwa0NvbHVtbk5hbWUgZWxlbWVudC4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKLQkgKiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQl2b2lkIHNldFBrQ29sdW1uTmFtZShTdHJpbmcgcGtDb2x1bW5OYW1lKTsKLQkJU3RyaW5nIFBLX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gInBrQ29sdW1uTmFtZVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdmFsdWVDb2x1bW5OYW1lIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSB2YWx1ZUNvbHVtbk5hbWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZUNvbHVtbk5hbWUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdmFsdWVDb2x1bW5OYW1lIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSB2YWx1ZUNvbHVtbk5hbWUgZWxlbWVudC4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKLQkgKiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlQ29sdW1uTmFtZShTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKTsKLQkJU3RyaW5nIFZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gInZhbHVlQ29sdW1uTmFtZVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgcGtDb2x1bW5WYWx1ZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgcGtDb2x1bW5WYWx1ZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0Ci0JICogdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCi0JICovCi0JU3RyaW5nIGdldFBrQ29sdW1uVmFsdWUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgcGtDb2x1bW5WYWx1ZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgcGtDb2x1bW5WYWx1ZSBlbGVtZW50LiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgotCSAqLwotCXZvaWQgc2V0UGtDb2x1bW5WYWx1ZShTdHJpbmcgcGtDb2x1bW5WYWx1ZSk7Ci0JCVN0cmluZyBQS19DT0xVTU5fVkFMVUVfUFJPUEVSVFkgPSAicGtDb2x1bW5WYWx1ZVByb3BlcnR5IjsKLQkKLQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCi0JVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEF0KGludCBpbmRleCk7Ci0JCi0JaW50IGluZGV4T2ZVbmlxdWVDb25zdHJhaW50KFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnQpOwotCQotCWludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKTsKLQotCVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQkKLQl2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJU3RyaW5nIFVOSVFVRV9DT05TVFJBSU5UU19MSVNUID0gInVuaXF1ZUNvbnN0cmFpbnRzTGlzdCI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgdGFibGUgZWxlbWVudC4gIElmIHRoZSB0YWJsZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgY2F0YWxvZyBlbGVtZW50LiAgSWYgdGhlIGNhdGFsb2cgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgc2NoZW1hIGVsZW1lbnQuICBJZiB0aGUgc2NoZW1hIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgcGtDb2x1bW5OYW1lIGVsZW1lbnQuICBJZiB0aGUgcGtDb2x1bW5OYW1lIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFBrQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgdmFsdWVDb2x1bW5OYW1lIGVsZW1lbnQuICBJZiB0aGUgdmFsdWVDb2x1bW5OYW1lIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgcGtDb2x1bW5WYWx1ZSBlbGVtZW50LiAgSWYgdGhlIHBrQ29sdW1uVmFsdWUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UGtDb2x1bW5WYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1RlbXBvcmFsQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVGVtcG9yYWxBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOWVkYmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVGVtcG9yYWxBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbCBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlbXBvcmFsQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlRFTVBPUkFMOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGVsZW1lbnQgb2YgdGhlIFRlbXBvcmFsIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSB2YWx1ZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCi0JICovCi0JVGVtcG9yYWxUeXBlIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGVsZW1lbnQgb2YgdGhlIFRlbXBvcmFsIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSB2YWx1ZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoVGVtcG9yYWxUeXBlIHZhbHVlKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlUHJvcGVydHkiOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB2YWx1ZSBlbGVtZW50LiAgSWYgdGhlIHZhbHVlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRlbXBvcmFsIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVGVtcG9yYWxUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9UZW1wb3JhbFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY1OGY0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9UZW1wb3JhbFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBlbnVtIFRlbXBvcmFsVHlwZSB7Ci0JCi0JREFURSwKLQlUSU1FLAotCVRJTUVTVEFNUDsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIFRlbXBvcmFsVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLlRFTVBPUkFMX1RZUEVfX0RBVEUpKSB7Ci0JCQlyZXR1cm4gREFURTsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLlRFTVBPUkFMX1RZUEVfX1RJTUUpKSB7Ci0JCQlyZXR1cm4gVElNRTsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLlRFTVBPUkFMX1RZUEVfX1RJTUVTVEFNUCkpIHsKLQkJCXJldHVybiBUSU1FU1RBTVA7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUpIHsKLQkJaWYgKHRlbXBvcmFsVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKHRlbXBvcmFsVHlwZSkgewotCQkJY2FzZSBEQVRFIDoKLQkJCQlyZXR1cm4gSlBBLlRFTVBPUkFMX1RZUEVfX0RBVEU7Ci0JCQljYXNlIFRJTUUgOgotCQkJCXJldHVybiBKUEEuVEVNUE9SQUxfVFlQRV9fVElNRTsKLQkJCWNhc2UgVElNRVNUQU1QIDoKLQkJCQlyZXR1cm4gSlBBLlRFTVBPUkFMX1RZUEVfX1RJTUVTVEFNUDsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gdGVtcG9yYWwgdHlwZTogIiArIHRlbXBvcmFsVHlwZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9UcmFuc2llbnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9UcmFuc2llbnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViODNhNGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVHJhbnNpZW50QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5UcmFuc2llbnQgYW5ub3RhdGlvbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUcmFuc2llbnRBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuVFJBTlNJRU5UOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2MjkyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5VbmlxdWVDb25zdHJhaW50IGFubm90YXRpb24KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5VTklRVUVfQ09OU1RSQUlOVDsKLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGNvbHVtbk5hbWVzKCk7Ci0KLQlpbnQgY29sdW1uTmFtZXNTaXplKCk7Ci0JCi0Jdm9pZCBhZGRDb2x1bW5OYW1lKFN0cmluZyBjb2x1bW5OYW1lKTsKLQotCXZvaWQgYWRkQ29sdW1uTmFtZShpbnQgaW5kZXgsIFN0cmluZyBjb2x1bW5OYW1lKTsKLQkKLQl2b2lkIHJlbW92ZUNvbHVtbk5hbWUoU3RyaW5nIGNvbHVtbk5hbWUpOwotCQotCXZvaWQgcmVtb3ZlQ29sdW1uTmFtZShpbnQgaW5kZXgpOwotCQotCXZvaWQgbW92ZUNvbHVtbk5hbWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQlTdHJpbmcgQ09MVU1OX05BTUVTX0xJU1QgPSAiY29sdW1uTmFtZXNMaXN0IjsKLQkJCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3N0aXRpb24gdG91Y2hlcyB0aGUgY29sdW1uTmFtZXMgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGNvbHVtbk5hbWVzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBjb2x1bW5OYW1lc1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9WZXJzaW9uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVmVyc2lvbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1ODNhNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9WZXJzaW9uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5WZXJzaW9uIGFubm90YXRpb24KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmVyc2lvbkFubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5WRVJTSU9OOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzRmYWY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzLk9ybVhtbE1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmVtZi5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BYnN0cmFjdCBYbWwgQWJzdHJhY3QgQ29sdW1uPC9iPjwvZW0+Jy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdFhtbE5hbWVkQ29sdW1uIGltcGxlbWVudHMgWG1sQWJzdHJhY3RDb2x1bW4KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zZXJ0YWJsZSgpIDxlbT5JbnNlcnRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnNlcnRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSU5TRVJUQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnNlcnRhYmxlKCkgPGVtPkluc2VydGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluc2VydGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGluc2VydGFibGUgPSBJTlNFUlRBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bGxhYmxlKCkgPGVtPk51bGxhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdWxsYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIE5VTExBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bGxhYmxlKCkgPGVtPk51bGxhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdWxsYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gbnVsbGFibGUgPSBOVUxMQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZSgpIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhYmxlKCkgPGVtPlRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YWJsZSA9IFRBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXF1ZSgpIDxlbT5VbmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFVOSVFVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlxdWUoKSA8ZW0+VW5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIHVuaXF1ZSA9IFVOSVFVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcGRhdGFibGUoKSA8ZW0+VXBkYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcGRhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBVUERBVEFCTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXBkYXRhYmxlKCkgPGVtPlVwZGF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXBkYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiB1cGRhdGFibGUgPSBVUERBVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbnNlcnRhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBYnN0cmFjdENvbHVtbl9JbnNlcnRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkKLQl7Ci0JCXJldHVybiBpbnNlcnRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uI2dldEluc2VydGFibGUgPGVtPkluc2VydGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluc2VydGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gbmV3SW5zZXJ0YWJsZSkKLQl7Ci0JCUJvb2xlYW4gb2xkSW5zZXJ0YWJsZSA9IGluc2VydGFibGU7Ci0JCWluc2VydGFibGUgPSBuZXdJbnNlcnRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0lOU0VSVEFCTEUsIG9sZEluc2VydGFibGUsIGluc2VydGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TnVsbGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TnVsbGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE51bGxhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBYnN0cmFjdENvbHVtbl9OdWxsYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0TnVsbGFibGUoKQotCXsKLQkJcmV0dXJuIG51bGxhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uI2dldE51bGxhYmxlIDxlbT5OdWxsYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVsbGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE51bGxhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBuZXdOdWxsYWJsZSkKLQl7Ci0JCUJvb2xlYW4gb2xkTnVsbGFibGUgPSBudWxsYWJsZTsKLQkJbnVsbGFibGUgPSBuZXdOdWxsYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19OVUxMQUJMRSwgb2xkTnVsbGFibGUsIG51bGxhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWJsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBYnN0cmFjdENvbHVtbl9UYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkKLQl7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyBuZXdUYWJsZSkKLQl7Ci0JCVN0cmluZyBvbGRUYWJsZSA9IHRhYmxlOwotCQl0YWJsZSA9IG5ld1RhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1RBQkxFLCBvbGRUYWJsZSwgdGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaXF1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVuaXF1ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWJzdHJhY3RDb2x1bW5fVW5pcXVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKQotCXsKLQkJcmV0dXJuIHVuaXF1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiNnZXRVbmlxdWUgPGVtPlVuaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVbmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiBuZXdVbmlxdWUpCi0JewotCQlCb29sZWFuIG9sZFVuaXF1ZSA9IHVuaXF1ZTsKLQkJdW5pcXVlID0gbmV3VW5pcXVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRSwgb2xkVW5pcXVlLCB1bmlxdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVwZGF0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWJzdHJhY3RDb2x1bW5fVXBkYXRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKQotCXsKLQkJcmV0dXJuIHVwZGF0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiNnZXRVcGRhdGFibGUgPGVtPlVwZGF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcGRhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiBuZXdVcGRhdGFibGUpCi0JewotCQlCb29sZWFuIG9sZFVwZGF0YWJsZSA9IHVwZGF0YWJsZTsKLQkJdXBkYXRhYmxlID0gbmV3VXBkYXRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VQREFUQUJMRSwgb2xkVXBkYXRhYmxlLCB1cGRhdGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19JTlNFUlRBQkxFOgotCQkJCXJldHVybiBnZXRJbnNlcnRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fTlVMTEFCTEU6Ci0JCQkJcmV0dXJuIGdldE51bGxhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEU6Ci0JCQkJcmV0dXJuIGdldFRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVU5JUVVFOgotCQkJCXJldHVybiBnZXRVbmlxdWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19VUERBVEFCTEU6Ci0JCQkJcmV0dXJuIGdldFVwZGF0YWJsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19JTlNFUlRBQkxFOgotCQkJCXNldEluc2VydGFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19OVUxMQUJMRToKLQkJCQlzZXROdWxsYWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1RBQkxFOgotCQkJCXNldFRhYmxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19VTklRVUU6Ci0JCQkJc2V0VW5pcXVlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOgotCQkJCXNldFVwZGF0YWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0lOU0VSVEFCTEU6Ci0JCQkJc2V0SW5zZXJ0YWJsZShJTlNFUlRBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fTlVMTEFCTEU6Ci0JCQkJc2V0TnVsbGFibGUoTlVMTEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19UQUJMRToKLQkJCQlzZXRUYWJsZShUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoVU5JUVVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOgotCQkJCXNldFVwZGF0YWJsZShVUERBVEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRToKLQkJCQlyZXR1cm4gSU5TRVJUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gaW5zZXJ0YWJsZSAhPSBudWxsIDogIUlOU0VSVEFCTEVfRURFRkFVTFQuZXF1YWxzKGluc2VydGFibGUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFOgotCQkJCXJldHVybiBOVUxMQUJMRV9FREVGQVVMVCA9PSBudWxsID8gbnVsbGFibGUgIT0gbnVsbCA6ICFOVUxMQUJMRV9FREVGQVVMVC5lcXVhbHMobnVsbGFibGUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1RBQkxFOgotCQkJCXJldHVybiBUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gdGFibGUgIT0gbnVsbCA6ICFUQUJMRV9FREVGQVVMVC5lcXVhbHModGFibGUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRToKLQkJCQlyZXR1cm4gVU5JUVVFX0VERUZBVUxUID09IG51bGwgPyB1bmlxdWUgIT0gbnVsbCA6ICFVTklRVUVfRURFRkFVTFQuZXF1YWxzKHVuaXF1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOgotCQkJCXJldHVybiBVUERBVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHVwZGF0YWJsZSAhPSBudWxsIDogIVVQREFUQUJMRV9FREVGQVVMVC5lcXVhbHModXBkYXRhYmxlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWJzdHJhY3RDb2x1bW4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fTlVMTEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19UQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FCU1RSQUNUX0NPTFVNTl9fVU5JUVVFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19VUERBVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BQlNUUkFDVF9DT0xVTU5fX1VQREFUQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFic3RyYWN0Q29sdW1uLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BQlNUUkFDVF9DT0xVTU5fX0lOU0VSVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0lOU0VSVEFCTEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19OVUxMQUJMRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1RBQkxFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQUJTVFJBQ1RfQ09MVU1OX19VTklRVUU6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19VUERBVEFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpbnNlcnRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbnNlcnRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBudWxsYWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobnVsbGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdW5pcXVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1bmlxdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVwZGF0YWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXBkYXRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgdGFibGVOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKHRoaXMubm9kZSwgT3JtWG1sTWFwcGVyLlRBQkxFKTsKLQkJcmV0dXJuICh0YWJsZU5vZGUgPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOiBidWlsZFRleHRSYW5nZSh0YWJsZU5vZGUpOwotCX0KLX0gLy8gQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZWZiOWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9ycy5Pcm1YbWxNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5lbWYuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgbmFtZU5vZGUgPSAoSURPTU5vZGUpIERPTVV0aWxpdGllcy5jaGlsZEF0dHJpYnV0ZU5vZGUodGhpcy5ub2RlLCBPcm1YbWxNYXBwZXIuTkFNRSk7Ci0JCXJldHVybiAobmFtZU5vZGUgIT0gbnVsbCkgPyB0aGlzLmJ1aWxkVGV4dFJhbmdlKG5hbWVOb2RlKSA6IHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotfSAvLyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxCYXNlVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxCYXNlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3OGQyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sQmFzZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9ycy5Pcm1YbWxNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5lbWYuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BYnN0cmFjdCBYbWwgQmFzZSBUYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxCYXNlVGFibGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0WG1sQmFzZVRhYmxlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sQmFzZVRhYmxlCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2coKSA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nID0gQ0FUQUxPR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hID0gU0NIRU1BX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pcXVlQ29uc3RyYWludHMoKSA8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXF1ZUNvbnN0cmFpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxCYXNlVGFibGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZVRhYmxlX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VUYWJsZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhdGFsb2coU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZVRhYmxlX0NhdGFsb2coKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkKLQl7Ci0JCXJldHVybiBjYXRhbG9nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VUYWJsZSNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgbmV3Q2F0YWxvZykKLQl7Ci0JCVN0cmluZyBvbGRDYXRhbG9nID0gY2F0YWxvZzsKLQkJY2F0YWxvZyA9IG5ld0NhdGFsb2c7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX0NBVEFMT0csIG9sZENhdGFsb2csIGNhdGFsb2cpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNjaGVtYShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlVGFibGVfU2NoZW1hKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkKLQl7Ci0JCXJldHVybiBzY2hlbWE7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQmFzZVRhYmxlI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgbmV3U2NoZW1hKQotCXsKLQkJU3RyaW5nIG9sZFNjaGVtYSA9IHNjaGVtYTsKLQkJc2NoZW1hID0gbmV3U2NoZW1hOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19TQ0hFTUEsIG9sZFNjaGVtYSwgc2NoZW1hKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZVRhYmxlX1VuaXF1ZUNvbnN0cmFpbnRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpCi0JewotCQlpZiAodW5pcXVlQ29uc3RyYWludHMgPT0gbnVsbCkKLQkJewotCQkJdW5pcXVlQ29uc3RyYWludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4oWG1sVW5pcXVlQ29uc3RyYWludC5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTKTsKLQkJfQotCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fQ0FUQUxPRzoKLQkJCQlyZXR1cm4gZ2V0Q2F0YWxvZygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19TQ0hFTUE6Ci0JCQkJcmV0dXJuIGdldFNjaGVtYSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuIGdldFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19DQVRBTE9HOgotCQkJCXNldENhdGFsb2coKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19TQ0hFTUE6Ci0JCQkJc2V0U2NoZW1hKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVW5pcXVlQ29uc3RyYWludD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fQ0FUQUxPRzoKLQkJCQlzZXRDYXRhbG9nKENBVEFMT0dfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fU0NIRU1BOgotCQkJCXNldFNjaGVtYShTQ0hFTUFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX0NBVEFMT0c6Ci0JCQkJcmV0dXJuIENBVEFMT0dfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGFsb2cgIT0gbnVsbCA6ICFDQVRBTE9HX0VERUZBVUxULmVxdWFscyhjYXRhbG9nKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fU0NIRU1BOgotCQkJCXJldHVybiBTQ0hFTUFfRURFRkFVTFQgPT0gbnVsbCA/IHNjaGVtYSAhPSBudWxsIDogIVNDSEVNQV9FREVGQVVMVC5lcXVhbHMoc2NoZW1hKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiB1bmlxdWVDb25zdHJhaW50cyAhPSBudWxsICYmICF1bmlxdWVDb25zdHJhaW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhdGFsb2c6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhdGFsb2cpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjaGVtYTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2NoZW1hKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIG5hbWVOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKHRoaXMubm9kZSwgT3JtWG1sTWFwcGVyLk5BTUUpOwotCQlyZXR1cm4gKG5hbWVOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UobmFtZU5vZGUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIGNhdGFsb2dOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKHRoaXMubm9kZSwgT3JtWG1sTWFwcGVyLkNBVEFMT0cpOwotCQlyZXR1cm4gKGNhdGFsb2dOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UoY2F0YWxvZ05vZGUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgc2NoZW1hTm9kZSA9IChJRE9NTm9kZSkgRE9NVXRpbGl0aWVzLmNoaWxkQXR0cmlidXRlTm9kZSh0aGlzLm5vZGUsIE9ybVhtbE1hcHBlci5TQ0hFTUEpOwotCQlyZXR1cm4gKHNjaGVtYU5vZGUgPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOiBidWlsZFRleHRSYW5nZShzY2hlbWFOb2RlKTsKLQl9Ci0KLX0gLy8gQWJzdHJhY3RYbWxCYXNlVGFibGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxOYW1lZENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbE5hbWVkQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWU4YzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbE5hbWVkQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWJzdHJhY3QgWG1sIE5hbWVkIENvbHVtbjwvYj48L2VtPicuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbE5hbWVkQ29sdW1uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhtbE5hbWVkQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sTmFtZWRDb2x1bW4KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uRGVmaW5pdGlvbigpIDxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29sdW1uRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0RFRklOSVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uRGVmaW5pdGlvbigpIDxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29sdW1uRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uID0gQ09MVU1OX0RFRklOSVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFhtbE5hbWVkQ29sdW1uKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbHVtbkRlZmluaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWRDb2x1bW5fQ29sdW1uRGVmaW5pdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKQotCXsKLQkJcmV0dXJuIGNvbHVtbkRlZmluaXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW4jZ2V0Q29sdW1uRGVmaW5pdGlvbiA8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbiBEZWZpbml0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb2x1bW5EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgbmV3Q29sdW1uRGVmaW5pdGlvbikKLQl7Ci0JCVN0cmluZyBvbGRDb2x1bW5EZWZpbml0aW9uID0gY29sdW1uRGVmaW5pdGlvbjsKLQkJY29sdW1uRGVmaW5pdGlvbiA9IG5ld0NvbHVtbkRlZmluaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04sIG9sZENvbHVtbkRlZmluaXRpb24sIGNvbHVtbkRlZmluaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWRDb2x1bW5fTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW4jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT046Ci0JCQkJc2V0Q29sdW1uRGVmaW5pdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjoKLQkJCQlzZXRDb2x1bW5EZWZpbml0aW9uKENPTFVNTl9ERUZJTklUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT046Ci0JCQkJcmV0dXJuIENPTFVNTl9ERUZJTklUSU9OX0VERUZBVUxUID09IG51bGwgPyBjb2x1bW5EZWZpbml0aW9uICE9IG51bGwgOiAhQ09MVU1OX0RFRklOSVRJT05fRURFRkFVTFQuZXF1YWxzKGNvbHVtbkRlZmluaXRpb24pOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29sdW1uRGVmaW5pdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29sdW1uRGVmaW5pdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIG5hbWVOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKHRoaXMubm9kZSwgT3JtWG1sTWFwcGVyLk5BTUUpOwotCQlyZXR1cm4gKG5hbWVOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UobmFtZU5vZGUpOwotCX0KLQotfSAvLyBBYnN0cmFjdFhtbE5hbWVkQ29sdW1uCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzYzM2U5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHlwZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldEFjY2VzcyA8ZW0+QWNjZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXRNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXRBdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc05hbWUoKSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzTmFtZSgpIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFjY2Vzc1R5cGUgQUNDRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2VzcygpIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYWNjZXNzID0gQUNDRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGFkYXRhQ29tcGxldGUoKSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRhZGF0YUNvbXBsZXRlKCkgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlID0gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZXMoKSA8ZW0+QXR0cmlidXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZXMgYXR0cmlidXRlczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsYXNzTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0NsYXNzTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQotCXsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgbmV3Q2xhc3NOYW1lKQotCXsKLQkJU3RyaW5nIG9sZENsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJY2xhc3NOYW1lID0gbmV3Q2xhc3NOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUUsIG9sZENsYXNzTmFtZSwgY2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IlBST1BFUlRZIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZQotCSAqIEBzZWUgI3NldEFjY2VzcyhBY2Nlc3NUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19BY2Nlc3MoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJQUk9QRVJUWSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcjZ2V0QWNjZXNzIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZQotCSAqIEBzZWUgI2dldEFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIG5ld0FjY2VzcykKLQl7Ci0JCUFjY2Vzc1R5cGUgb2xkQWNjZXNzID0gYWNjZXNzOwotCQlhY2Nlc3MgPSBuZXdBY2Nlc3MgPT0gbnVsbCA/IEFDQ0VTU19FREVGQVVMVCA6IG5ld0FjY2VzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BQ0NFU1MsIG9sZEFjY2VzcywgYWNjZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldE1ldGFkYXRhQ29tcGxldGUoKQotCXsKLQkJcmV0dXJuIG1ldGFkYXRhQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcjZ2V0TWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0YWRhdGFDb21wbGV0ZShCb29sZWFuIG5ld01ldGFkYXRhQ29tcGxldGUpCi0JewotCQlCb29sZWFuIG9sZE1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwotCQltZXRhZGF0YUNvbXBsZXRlID0gbmV3TWV0YWRhdGFDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURSwgb2xkTWV0YWRhdGFDb21wbGV0ZSwgbWV0YWRhdGFDb21wbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKLQl7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZXMoQXR0cmlidXRlcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfQXR0cmlidXRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBuZXdBdHRyaWJ1dGVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJQXR0cmlidXRlcyBvbGRBdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLQkJYXR0cmlidXRlcyA9IG5ld0F0dHJpYnV0ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUywgb2xkQXR0cmlidXRlcywgbmV3QXR0cmlidXRlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcjZ2V0QXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBuZXdBdHRyaWJ1dGVzKQotCXsKLQkJaWYgKG5ld0F0dHJpYnV0ZXMgIT0gYXR0cmlidXRlcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhdHRyaWJ1dGVzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BVFRSSUJVVEVTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBdHRyaWJ1dGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0F0dHJpYnV0ZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXR0cmlidXRlcyhuZXdBdHRyaWJ1dGVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUywgbmV3QXR0cmlidXRlcywgbmV3QXR0cmlidXRlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QXR0cmlidXRlcyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTOgotCQkJCXJldHVybiBnZXRBY2Nlc3MoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRToKLQkJCQlzZXRDbGFzc05hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUzoKLQkJCQlzZXRBY2Nlc3MoKEFjY2Vzc1R5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlzZXRNZXRhZGF0YUNvbXBsZXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVM6Ci0JCQkJc2V0QXR0cmlidXRlcygoQXR0cmlidXRlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUU6Ci0JCQkJc2V0Q2xhc3NOYW1lKENMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BQ0NFU1M6Ci0JCQkJc2V0QWNjZXNzKEFDQ0VTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXNldE1ldGFkYXRhQ29tcGxldGUoTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVM6Ci0JCQkJc2V0QXR0cmlidXRlcygoQXR0cmlidXRlcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIENMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzTmFtZSAhPSBudWxsIDogIUNMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGNsYXNzTmFtZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTOgotCQkJCXJldHVybiBhY2Nlc3MgIT0gQUNDRVNTX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXJldHVybiBNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVCA9PSBudWxsID8gbWV0YWRhdGFDb21wbGV0ZSAhPSBudWxsIDogIU1FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhtZXRhZGF0YUNvbXBsZXRlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNsYXNzTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2xhc3NOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY2Nlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjY2Vzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0YWRhdGFDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWV0YWRhdGFDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDbGFzc1RleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgY2xhc3NOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKG5vZGUsIE9ybVhtbE1hcHBlci5DTEFTUyk7Ci0JCWlmIChjbGFzc05vZGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1aWxkVGV4dFJhbmdlKGNsYXNzTm9kZSk7Ci0JCX0KLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZXNUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIGF0dHJpYnV0ZXNOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkKG5vZGUsIE9ybVhtbE1hcHBlci5BVFRSSUJVVEVTKTsKLQkJaWYgKGF0dHJpYnV0ZXNOb2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBidWlsZFRleHRSYW5nZShhdHRyaWJ1dGVzTm9kZSk7Ci0JCX0KLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLX0gLy8gVHlwZU1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWNjZXNzVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BY2Nlc3NUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZTQ4MDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BY2Nlc3NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+QWNjZXNzIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFjY2Vzc1R5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIEFjY2Vzc1R5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFJPUEVSVFk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJPUEVSVFlfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlQUk9QRVJUWSgwLCAiUFJPUEVSVFkiLCAiUFJPUEVSVFkiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZJRUxEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJRUxEX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRklFTEQoMSwgIkZJRUxEIiwgIkZJRUxEIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QUk9QRVJUWTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UFJPUEVSVFk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJPUEVSVFkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GSUVMRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RklFTEQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklFTEQKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+QWNjZXNzIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFjY2Vzc1R5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgQWNjZXNzVHlwZVtdCi0JCXsKLQkJCVBST1BFUlRZLAotCQkJRklFTEQsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+QWNjZXNzIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxBY2Nlc3NUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkFjY2VzcyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWNjZXNzVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJQWNjZXNzVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BY2Nlc3MgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjY2Vzc1R5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUFjY2Vzc1R5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5BY2Nlc3MgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjY2Vzc1R5cGUgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgUFJPUEVSVFlfVkFMVUU6IHJldHVybiBQUk9QRVJUWTsKLQkJCWNhc2UgRklFTERfVkFMVUU6IHJldHVybiBGSUVMRDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQWNjZXNzVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BdHRyaWJ1dGVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0F0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4NDVjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0F0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRJZHMgPGVtPklkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0RW1iZWRkZWRJZHMgPGVtPkVtYmVkZGVkIElkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0QmFzaWNzIDxlbT5CYXNpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFZlcnNpb25zIDxlbT5WZXJzaW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0TWFueVRvT25lcyA8ZW0+TWFueSBUbyBPbmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRPbmVUb01hbnlzIDxlbT5PbmUgVG8gTWFueXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldE9uZVRvT25lcyA8ZW0+T25lIFRvIE9uZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldE1hbnlUb01hbnlzIDxlbT5NYW55IFRvIE1hbnlzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRFbWJlZGRlZHMgPGVtPkVtYmVkZGVkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0VHJhbnNpZW50cyA8ZW0+VHJhbnNpZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QXR0cmlidXRlcygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVzIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkcygpIDxlbT5JZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sSWQ+IGlkczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVtYmVkZGVkSWRzKCkgPGVtPkVtYmVkZGVkIElkczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbWJlZGRlZElkcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEVtYmVkZGVkSWQ+IGVtYmVkZGVkSWRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzaWNzKCkgPGVtPkJhc2ljczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxCYXNpYz4gYmFzaWNzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbnMoKSA8ZW0+VmVyc2lvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxWZXJzaW9uPiB2ZXJzaW9uczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbnlUb09uZXMoKSA8ZW0+TWFueSBUbyBPbmVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbnlUb09uZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxNYW55VG9PbmU+IG1hbnlUb09uZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPbmVUb01hbnlzKCkgPGVtPk9uZSBUbyBNYW55czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPbmVUb01hbnlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sT25lVG9NYW55PiBvbmVUb01hbnlzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T25lVG9PbmVzKCkgPGVtPk9uZSBUbyBPbmVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9uZVRvT25lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE9uZVRvT25lPiBvbmVUb09uZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYW55VG9NYW55cygpIDxlbT5NYW55IFRvIE1hbnlzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbnlUb01hbnlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sTWFueVRvTWFueT4gbWFueVRvTWFueXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbWJlZGRlZHMoKSA8ZW0+RW1iZWRkZWRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVtYmVkZGVkcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEVtYmVkZGVkPiBlbWJlZGRlZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2llbnRzKCkgPGVtPlRyYW5zaWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNpZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFRyYW5zaWVudD4gdHJhbnNpZW50czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBdHRyaWJ1dGVzKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuQVRUUklCVVRFUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19JZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbElkPiBnZXRJZHMoKQotCXsKLQkJaWYgKGlkcyA9PSBudWxsKQotCQl7Ci0JCQlpZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSWQ+KFhtbElkLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0lEUyk7Ci0JCX0KLQkJcmV0dXJuIGlkczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbWJlZGRlZCBJZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbWJlZGRlZCBJZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbWJlZGRlZCBJZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzX0VtYmVkZGVkSWRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxFbWJlZGRlZElkPiBnZXRFbWJlZGRlZElkcygpCi0JewotCQlpZiAoZW1iZWRkZWRJZHMgPT0gbnVsbCkKLQkJewotCQkJZW1iZWRkZWRJZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sRW1iZWRkZWRJZD4oWG1sRW1iZWRkZWRJZC5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTUJFRERFRF9JRFMpOwotCQl9Ci0JCXJldHVybiBlbWJlZGRlZElkczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNpY3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzaWNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzaWNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19CYXNpY3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEJhc2ljPiBnZXRCYXNpY3MoKQotCXsKLQkJaWYgKGJhc2ljcyA9PSBudWxsKQotCQl7Ci0JCQliYXNpY3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQmFzaWM+KFhtbEJhc2ljLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDUyk7Ci0JCX0KLQkJcmV0dXJuIGJhc2ljczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcnNpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzX1ZlcnNpb25zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxWZXJzaW9uPiBnZXRWZXJzaW9ucygpCi0JewotCQlpZiAodmVyc2lvbnMgPT0gbnVsbCkKLQkJewotCQkJdmVyc2lvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVmVyc2lvbj4oWG1sVmVyc2lvbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WRVJTSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbnkgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFueSBUbyBPbmVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFueSBUbyBPbmVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19NYW55VG9PbmVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxNYW55VG9PbmU+IGdldE1hbnlUb09uZXMoKQotCXsKLQkJaWYgKG1hbnlUb09uZXMgPT0gbnVsbCkKLQkJewotCQkJbWFueVRvT25lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxNYW55VG9PbmU+KFhtbE1hbnlUb09uZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX09ORVMpOwotCQl9Ci0JCXJldHVybiBtYW55VG9PbmVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9uZSBUbyBNYW55czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T25lIFRvIE1hbnlzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T25lIFRvIE1hbnlzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19PbmVUb01hbnlzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxPbmVUb01hbnk+IGdldE9uZVRvTWFueXMoKQotCXsKLQkJaWYgKG9uZVRvTWFueXMgPT0gbnVsbCkKLQkJewotCQkJb25lVG9NYW55cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxPbmVUb01hbnk+KFhtbE9uZVRvTWFueS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19PTkVfVE9fTUFOWVMpOwotCQl9Ci0JCXJldHVybiBvbmVUb01hbnlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9uZSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9uZSBUbyBPbmVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T25lIFRvIE9uZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzX09uZVRvT25lcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT25lVG9PbmU+IGdldE9uZVRvT25lcygpCi0JewotCQlpZiAob25lVG9PbmVzID09IG51bGwpCi0JCXsKLQkJCW9uZVRvT25lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxPbmVUb09uZT4oWG1sT25lVG9PbmUuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fT05FX1RPX09ORVMpOwotCQl9Ci0JCXJldHVybiBvbmVUb09uZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFueSBUbyBNYW55czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbnkgVG8gTWFueXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYW55IFRvIE1hbnlzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19NYW55VG9NYW55cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTWFueVRvTWFueT4gZ2V0TWFueVRvTWFueXMoKQotCXsKLQkJaWYgKG1hbnlUb01hbnlzID09IG51bGwpCi0JCXsKLQkJCW1hbnlUb01hbnlzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE1hbnlUb01hbnk+KFhtbE1hbnlUb01hbnkuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fTUFOWV9UT19NQU5ZUyk7Ci0JCX0KLQkJcmV0dXJuIG1hbnlUb01hbnlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVtYmVkZGVkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbWJlZGRlZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbWJlZGRlZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzX0VtYmVkZGVkcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sRW1iZWRkZWQ+IGdldEVtYmVkZGVkcygpCi0JewotCQlpZiAoZW1iZWRkZWRzID09IG51bGwpCi0JCXsKLQkJCWVtYmVkZGVkcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxFbWJlZGRlZD4oWG1sRW1iZWRkZWQuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fRU1CRURERURTKTsKLQkJfQotCQlyZXR1cm4gZW1iZWRkZWRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyYW5zaWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zaWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2llbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19UcmFuc2llbnRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUcmFuc2llbnQ+IGdldFRyYW5zaWVudHMoKQotCXsKLQkJaWYgKHRyYW5zaWVudHMgPT0gbnVsbCkKLQkJewotCQkJdHJhbnNpZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUcmFuc2llbnQ+KFhtbFRyYW5zaWVudC5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19UUkFOU0lFTlRTKTsKLQkJfQotCQlyZXR1cm4gdHJhbnNpZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEX0lEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVtYmVkZGVkSWRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRCYXNpY3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1ZFUlNJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VmVyc2lvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX01BTllfVE9fT05FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hbnlUb09uZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19NQU5ZUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE9uZVRvTWFueXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19PTkVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T25lVG9PbmVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX01BTllTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWFueVRvTWFueXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVtYmVkZGVkcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNJRU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFRyYW5zaWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFM6Ci0JCQkJcmV0dXJuIGdldElkcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEX0lEUzoKLQkJCQlyZXR1cm4gZ2V0RW1iZWRkZWRJZHMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ1M6Ci0JCQkJcmV0dXJuIGdldEJhc2ljcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1ZFUlNJT05TOgotCQkJCXJldHVybiBnZXRWZXJzaW9ucygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX01BTllfVE9fT05FUzoKLQkJCQlyZXR1cm4gZ2V0TWFueVRvT25lcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19NQU5ZUzoKLQkJCQlyZXR1cm4gZ2V0T25lVG9NYW55cygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19PTkVTOgotCQkJCXJldHVybiBnZXRPbmVUb09uZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX01BTllTOgotCQkJCXJldHVybiBnZXRNYW55VG9NYW55cygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEUzoKLQkJCQlyZXR1cm4gZ2V0RW1iZWRkZWRzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNJRU5UUzoKLQkJCQlyZXR1cm4gZ2V0VHJhbnNpZW50cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFM6Ci0JCQkJZ2V0SWRzKCkuY2xlYXIoKTsKLQkJCQlnZXRJZHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbElkPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEX0lEUzoKLQkJCQlnZXRFbWJlZGRlZElkcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RW1iZWRkZWRJZHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEVtYmVkZGVkSWQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNTOgotCQkJCWdldEJhc2ljcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzaWNzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxCYXNpYz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WRVJTSU9OUzoKLQkJCQlnZXRWZXJzaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0VmVyc2lvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFZlcnNpb24+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fTUFOWV9UT19PTkVTOgotCQkJCWdldE1hbnlUb09uZXMoKS5jbGVhcigpOwotCQkJCWdldE1hbnlUb09uZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE1hbnlUb09uZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19PTkVfVE9fTUFOWVM6Ci0JCQkJZ2V0T25lVG9NYW55cygpLmNsZWFyKCk7Ci0JCQkJZ2V0T25lVG9NYW55cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT25lVG9NYW55PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19PTkVTOgotCQkJCWdldE9uZVRvT25lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0T25lVG9PbmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxPbmVUb09uZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX01BTllTOgotCQkJCWdldE1hbnlUb01hbnlzKCkuY2xlYXIoKTsKLQkJCQlnZXRNYW55VG9NYW55cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTWFueVRvTWFueT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTUJFRERFRFM6Ci0JCQkJZ2V0RW1iZWRkZWRzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbWJlZGRlZHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEVtYmVkZGVkPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TSUVOVFM6Ci0JCQkJZ2V0VHJhbnNpZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHJhbnNpZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHJhbnNpZW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0lEUzoKLQkJCQlnZXRJZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTUJFRERFRF9JRFM6Ci0JCQkJZ2V0RW1iZWRkZWRJZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ1M6Ci0JCQkJZ2V0QmFzaWNzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fVkVSU0lPTlM6Ci0JCQkJZ2V0VmVyc2lvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX09ORVM6Ci0JCQkJZ2V0TWFueVRvT25lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19NQU5ZUzoKLQkJCQlnZXRPbmVUb01hbnlzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fT05FX1RPX09ORVM6Ci0JCQkJZ2V0T25lVG9PbmVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fTUFOWV9UT19NQU5ZUzoKLQkJCQlnZXRNYW55VG9NYW55cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEUzoKLQkJCQlnZXRFbWJlZGRlZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19UUkFOU0lFTlRTOgotCQkJCWdldFRyYW5zaWVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fSURTOgotCQkJCXJldHVybiBpZHMgIT0gbnVsbCAmJiAhaWRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTUJFRERFRF9JRFM6Ci0JCQkJcmV0dXJuIGVtYmVkZGVkSWRzICE9IG51bGwgJiYgIWVtYmVkZGVkSWRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ1M6Ci0JCQkJcmV0dXJuIGJhc2ljcyAhPSBudWxsICYmICFiYXNpY3MuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1ZFUlNJT05TOgotCQkJCXJldHVybiB2ZXJzaW9ucyAhPSBudWxsICYmICF2ZXJzaW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fTUFOWV9UT19PTkVTOgotCQkJCXJldHVybiBtYW55VG9PbmVzICE9IG51bGwgJiYgIW1hbnlUb09uZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19NQU5ZUzoKLQkJCQlyZXR1cm4gb25lVG9NYW55cyAhPSBudWxsICYmICFvbmVUb01hbnlzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19PTkVfVE9fT05FUzoKLQkJCQlyZXR1cm4gb25lVG9PbmVzICE9IG51bGwgJiYgIW9uZVRvT25lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fTUFOWV9UT19NQU5ZUzoKLQkJCQlyZXR1cm4gbWFueVRvTWFueXMgIT0gbnVsbCAmJiAhbWFueVRvTWFueXMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEUzoKLQkJCQlyZXR1cm4gZW1iZWRkZWRzICE9IG51bGwgJiYgIWVtYmVkZGVkcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNJRU5UUzoKLQkJCQlyZXR1cm4gdHJhbnNpZW50cyAhPSBudWxsICYmICF0cmFuc2llbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vIEF0dHJpYnV0ZXMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQmFzZVhtbEVtYmVkZGVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Jhc2VYbWxFbWJlZGRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGJlYmE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQmFzZVhtbEVtYmVkZGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZSBYbWwgRW1iZWRkZWQ8L2I+PC9lbT4nLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkJhc2VYbWxFbWJlZGRlZCNnZXRBdHRyaWJ1dGVPdmVycmlkZXMgPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEJhc2VYbWxFbWJlZGRlZCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmFzZVhtbEVtYmVkZGVkIGV4dGVuZHMgWG1sQXR0cmlidXRlTWFwcGluZwotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRCYXNlWG1sRW1iZWRkZWRfQXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQotfSAvLyBCYXNlWG1sRW1iZWRkZWQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQ2FzY2FkZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQ2FzY2FkZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlNTNmNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Nhc2NhZGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FzY2FkZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGUjaXNDYXNjYWRlQWxsIDxlbT5DYXNjYWRlIEFsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVBlcnNpc3QgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZU1lcmdlIDxlbT5DYXNjYWRlIE1lcmdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGUjaXNDYXNjYWRlUmVtb3ZlIDxlbT5DYXNjYWRlIFJlbW92ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVJlZnJlc2ggPGVtPkNhc2NhZGUgUmVmcmVzaDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhc2NhZGVUeXBlIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIEFsbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIEFsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZUFsbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZUFsbCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0Nhc2NhZGVBbGwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVBbGwgPGVtPkNhc2NhZGUgQWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIEFsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNDYXNjYWRlQWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlQWxsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBQZXJzaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlUGVyc2lzdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVBlcnNpc3QoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVBlcnNpc3QgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlUGVyc2lzdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgTWVyZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgTWVyZ2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBNZXJnZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU1lcmdlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDYXNjYWRlVHlwZV9DYXNjYWRlTWVyZ2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNDYXNjYWRlTWVyZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVNZXJnZSA8ZW0+Q2FzY2FkZSBNZXJnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBNZXJnZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNDYXNjYWRlTWVyZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhc2NhZGVNZXJnZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgUmVtb3ZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIFJlbW92ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIFJlbW92ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZVJlbW92ZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVJlbW92ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0Nhc2NhZGVSZW1vdmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVSZW1vdmUgPGVtPkNhc2NhZGUgUmVtb3ZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIFJlbW92ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNDYXNjYWRlUmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlUmVtb3ZlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZWZyZXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIFJlZnJlc2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBSZWZyZXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlUmVmcmVzaChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVJlZnJlc2goKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNDYXNjYWRlUmVmcmVzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVJlZnJlc2ggPGVtPkNhc2NhZGUgUmVmcmVzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBSZWZyZXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Nhc2NhZGVSZWZyZXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlUmVmcmVzaChib29sZWFuIHZhbHVlKTsKLQotfSAvLyBDYXNjYWRlVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9DYXNjYWRlVHlwZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQ2FzY2FkZVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTYyODcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9DYXNjYWRlVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhc2NhZGUgVHlwZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGVJbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENhc2NhZGVUeXBlSW1wbCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIENhc2NhZGVUeXBlCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZUFsbCgpIDxlbT5DYXNjYWRlIEFsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYXNjYWRlQWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0FTQ0FERV9BTExfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZUFsbCgpIDxlbT5DYXNjYWRlIEFsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYXNjYWRlQWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlQWxsID0gQ0FTQ0FERV9BTExfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYXNjYWRlUGVyc2lzdCgpIDxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZVBlcnNpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDQVNDQURFX1BFUlNJU1RfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZVBlcnNpc3QoKSA8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlUGVyc2lzdCA9IENBU0NBREVfUEVSU0lTVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVNZXJnZSgpIDxlbT5DYXNjYWRlIE1lcmdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVNZXJnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBU0NBREVfTUVSR0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZU1lcmdlKCkgPGVtPkNhc2NhZGUgTWVyZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZU1lcmdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlTWVyZ2UgPSBDQVNDQURFX01FUkdFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZVJlbW92ZSgpIDxlbT5DYXNjYWRlIFJlbW92ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYXNjYWRlUmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0FTQ0FERV9SRU1PVkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZVJlbW92ZSgpIDxlbT5DYXNjYWRlIFJlbW92ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYXNjYWRlUmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlUmVtb3ZlID0gQ0FTQ0FERV9SRU1PVkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYXNjYWRlUmVmcmVzaCgpIDxlbT5DYXNjYWRlIFJlZnJlc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZVJlZnJlc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDQVNDQURFX1JFRlJFU0hfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZVJlZnJlc2goKSA8ZW0+Q2FzY2FkZSBSZWZyZXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVSZWZyZXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlUmVmcmVzaCA9IENBU0NBREVfUkVGUkVTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDYXNjYWRlVHlwZUltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5DQVNDQURFX1RZUEVfSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIEFsbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBBbGw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBBbGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVBbGwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENhc2NhZGVUeXBlX0Nhc2NhZGVBbGwoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZUFsbCgpCi0JewotCQlyZXR1cm4gY2FzY2FkZUFsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGVJbXBsI2lzQ2FzY2FkZUFsbCA8ZW0+Q2FzY2FkZSBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgQWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Nhc2NhZGVBbGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlQWxsKGJvb2xlYW4gbmV3Q2FzY2FkZUFsbCkKLQl7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZUFsbCA9IGNhc2NhZGVBbGw7Ci0JCWNhc2NhZGVBbGwgPSBuZXdDYXNjYWRlQWxsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX0FMTCwgb2xkQ2FzY2FkZUFsbCwgY2FzY2FkZUFsbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgUGVyc2lzdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENhc2NhZGVUeXBlX0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlUGVyc2lzdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGVJbXBsI2lzQ2FzY2FkZVBlcnNpc3QgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbiBuZXdDYXNjYWRlUGVyc2lzdCkKLQl7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZVBlcnNpc3QgPSBjYXNjYWRlUGVyc2lzdDsKLQkJY2FzY2FkZVBlcnNpc3QgPSBuZXdDYXNjYWRlUGVyc2lzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9QRVJTSVNULCBvbGRDYXNjYWRlUGVyc2lzdCwgY2FzY2FkZVBlcnNpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIE1lcmdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE1lcmdlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgTWVyZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVNZXJnZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZU1lcmdlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVNZXJnZSgpCi0JewotCQlyZXR1cm4gY2FzY2FkZU1lcmdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZUltcGwjaXNDYXNjYWRlTWVyZ2UgPGVtPkNhc2NhZGUgTWVyZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgTWVyZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzQ2FzY2FkZU1lcmdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZU1lcmdlKGJvb2xlYW4gbmV3Q2FzY2FkZU1lcmdlKQotCXsKLQkJYm9vbGVhbiBvbGRDYXNjYWRlTWVyZ2UgPSBjYXNjYWRlTWVyZ2U7Ci0JCWNhc2NhZGVNZXJnZSA9IG5ld0Nhc2NhZGVNZXJnZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9NRVJHRSwgb2xkQ2FzY2FkZU1lcmdlLCBjYXNjYWRlTWVyZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIFJlbW92ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVSZW1vdmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENhc2NhZGVUeXBlX0Nhc2NhZGVSZW1vdmUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZVJlbW92ZSgpCi0JewotCQlyZXR1cm4gY2FzY2FkZVJlbW92ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGVJbXBsI2lzQ2FzY2FkZVJlbW92ZSA8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgUmVtb3ZlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Nhc2NhZGVSZW1vdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlUmVtb3ZlKGJvb2xlYW4gbmV3Q2FzY2FkZVJlbW92ZSkKLQl7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZVJlbW92ZSA9IGNhc2NhZGVSZW1vdmU7Ci0JCWNhc2NhZGVSZW1vdmUgPSBuZXdDYXNjYWRlUmVtb3ZlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX1JFTU9WRSwgb2xkQ2FzY2FkZVJlbW92ZSwgY2FzY2FkZVJlbW92ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgUmVmcmVzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBSZWZyZXNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgUmVmcmVzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZVJlZnJlc2goYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENhc2NhZGVUeXBlX0Nhc2NhZGVSZWZyZXNoKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVSZWZyZXNoKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlUmVmcmVzaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGVJbXBsI2lzQ2FzY2FkZVJlZnJlc2ggPGVtPkNhc2NhZGUgUmVmcmVzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBSZWZyZXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Nhc2NhZGVSZWZyZXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlZnJlc2goYm9vbGVhbiBuZXdDYXNjYWRlUmVmcmVzaCkKLQl7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZVJlZnJlc2ggPSBjYXNjYWRlUmVmcmVzaDsKLQkJY2FzY2FkZVJlZnJlc2ggPSBuZXdDYXNjYWRlUmVmcmVzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9SRUZSRVNILCBvbGRDYXNjYWRlUmVmcmVzaCwgY2FzY2FkZVJlZnJlc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9BTEw6Ci0JCQkJcmV0dXJuIGlzQ2FzY2FkZUFsbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9QRVJTSVNUOgotCQkJCXJldHVybiBpc0Nhc2NhZGVQZXJzaXN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX01FUkdFOgotCQkJCXJldHVybiBpc0Nhc2NhZGVNZXJnZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9SRU1PVkU6Ci0JCQkJcmV0dXJuIGlzQ2FzY2FkZVJlbW92ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9SRUZSRVNIOgotCQkJCXJldHVybiBpc0Nhc2NhZGVSZWZyZXNoKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9BTEw6Ci0JCQkJc2V0Q2FzY2FkZUFsbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUEVSU0lTVDoKLQkJCQlzZXRDYXNjYWRlUGVyc2lzdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfTUVSR0U6Ci0JCQkJc2V0Q2FzY2FkZU1lcmdlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9SRU1PVkU6Ci0JCQkJc2V0Q2FzY2FkZVJlbW92ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUkVGUkVTSDoKLQkJCQlzZXRDYXNjYWRlUmVmcmVzaCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfQUxMOgotCQkJCXNldENhc2NhZGVBbGwoQ0FTQ0FERV9BTExfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9QRVJTSVNUOgotCQkJCXNldENhc2NhZGVQZXJzaXN0KENBU0NBREVfUEVSU0lTVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX01FUkdFOgotCQkJCXNldENhc2NhZGVNZXJnZShDQVNDQURFX01FUkdFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUkVNT1ZFOgotCQkJCXNldENhc2NhZGVSZW1vdmUoQ0FTQ0FERV9SRU1PVkVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9SRUZSRVNIOgotCQkJCXNldENhc2NhZGVSZWZyZXNoKENBU0NBREVfUkVGUkVTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9BTEw6Ci0JCQkJcmV0dXJuIGNhc2NhZGVBbGwgIT0gQ0FTQ0FERV9BTExfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUEVSU0lTVDoKLQkJCQlyZXR1cm4gY2FzY2FkZVBlcnNpc3QgIT0gQ0FTQ0FERV9QRVJTSVNUX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX01FUkdFOgotCQkJCXJldHVybiBjYXNjYWRlTWVyZ2UgIT0gQ0FTQ0FERV9NRVJHRV9FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9SRU1PVkU6Ci0JCQkJcmV0dXJuIGNhc2NhZGVSZW1vdmUgIT0gQ0FTQ0FERV9SRU1PVkVfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUkVGUkVTSDoKLQkJCQlyZXR1cm4gY2FzY2FkZVJlZnJlc2ggIT0gQ0FTQ0FERV9SRUZSRVNIX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjYXNjYWRlQWxsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlQWxsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXNjYWRlUGVyc2lzdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FzY2FkZVBlcnNpc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVNZXJnZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FzY2FkZU1lcmdlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXNjYWRlUmVtb3ZlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlUmVtb3ZlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXNjYWRlUmVmcmVzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FzY2FkZVJlZnJlc2gpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gQ2FzY2FkZVR5cGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQ29sdW1uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Db2x1bW5NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNGZlYmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Db2x1bW5NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db2x1bW4gTWFwcGluZzwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENvbHVtbk1hcHBpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbHVtbk1hcHBpbmcgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb2x1bW4oWG1sQ29sdW1uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQ29sdW1uIGdldENvbHVtbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIHZhbHVlKTsKLQotfSAvLyBDb2x1bW5NYXBwaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0NvbHVtblJlc3VsdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Db2x1bW5SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1MDQxMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0NvbHVtblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29sdW1uIFJlc3VsdDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtblJlc3VsdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5SZXN1bHQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29sdW1uUmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbHVtblJlc3VsdCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkNPTFVNTl9SRVNVTFQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENvbHVtblJlc3VsdF9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtblJlc3VsdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQ09MVU1OX1JFU1VMVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkNPTFVNTl9SRVNVTFRfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ09MVU1OX1JFU1VMVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5DT0xVTU5fUkVTVUxUX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5DT0xVTU5fUkVTVUxUX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gQ29sdW1uUmVzdWx0CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Rpc2NyaW1pbmF0b3JUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Rpc2NyaW1pbmF0b3JUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNGE5YTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9EaXNjcmltaW5hdG9yVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RGlzY3JpbWluYXRvclR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNUUklORzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVFJJTkdfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTVFJJTkcoMCwgIlNUUklORyIsICJTVFJJTkciKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNIQVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0hBUl9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUNIQVIoMSwgIkNIQVIiLCAiQ0hBUiIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5URUdFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTlRFR0VSX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JSU5URUdFUigyLCAiSU5URUdFUiIsICJJTlRFR0VSIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TVFJJTkc8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNUUklORzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVFJJTkcKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJJTkdfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0hBUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0hBUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSEFSCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFR0VSPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTlRFR0VSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOVEVHRVIKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR0VSX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERpc2NyaW1pbmF0b3JUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IERpc2NyaW1pbmF0b3JUeXBlW10KLQkJewotCQkJU1RSSU5HLAotCQkJQ0hBUiwKLQkJCUlOVEVHRVIsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8RGlzY3JpbWluYXRvclR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCURpc2NyaW1pbmF0b3JUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc2NyaW1pbmF0b3JUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlEaXNjcmltaW5hdG9yVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc2NyaW1pbmF0b3JUeXBlIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIFNUUklOR19WQUxVRTogcmV0dXJuIFNUUklORzsKLQkJCWNhc2UgQ0hBUl9WQUxVRTogcmV0dXJuIENIQVI7Ci0JCQljYXNlIElOVEVHRVJfVkFMVUU6IHJldHVybiBJTlRFR0VSOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXNjcmltaW5hdG9yVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vRGlzY3JpbWluYXRvclR5cGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5TGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjNThmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0VudGl0eUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFByZVBlcnNpc3QgPGVtPlByZSBQZXJzaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UG9zdFBlcnNpc3QgPGVtPlBvc3QgUGVyc2lzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UHJlVXBkYXRlIDxlbT5QcmUgVXBkYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc05hbWUoKSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSA9IENMQVNTX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVQZXJzaXN0KCkgPGVtPlByZSBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlUGVyc2lzdCBwcmVQZXJzaXN0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdFBlcnNpc3QoKSA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0UGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RQZXJzaXN0IHBvc3RQZXJzaXN0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlUmVtb3ZlKCkgPGVtPlByZSBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByZVJlbW92ZSBwcmVSZW1vdmU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0UmVtb3ZlKCkgPGVtPlBvc3QgUmVtb3ZlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0UmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFJlbW92ZSBwb3N0UmVtb3ZlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlVXBkYXRlKCkgPGVtPlByZSBVcGRhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByZVVwZGF0ZSBwcmVVcGRhdGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0VXBkYXRlKCkgPGVtPlBvc3QgVXBkYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0VXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFVwZGF0ZSBwb3N0VXBkYXRlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdExvYWQoKSA8ZW0+UG9zdCBMb2FkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RMb2FkIHBvc3RMb2FkOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eUxpc3RlbmVyKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuRU5USVRZX0xJU1RFTkVSOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2xhc3NOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVyX0NsYXNzTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQotCXsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIG5ld0NsYXNzTmFtZSkKLQl7Ci0JCVN0cmluZyBvbGRDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCWNsYXNzTmFtZSA9IG5ld0NsYXNzTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX0NMQVNTX05BTUUsIG9sZENsYXNzTmFtZSwgY2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVQZXJzaXN0KFByZVBlcnNpc3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcl9QcmVQZXJzaXN0KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmVQZXJzaXN0IGdldFByZVBlcnNpc3QoKQotCXsKLQkJcmV0dXJuIHByZVBlcnNpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlUGVyc2lzdChQcmVQZXJzaXN0IG5ld1ByZVBlcnNpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQcmVQZXJzaXN0IG9sZFByZVBlcnNpc3QgPSBwcmVQZXJzaXN0OwotCQlwcmVQZXJzaXN0ID0gbmV3UHJlUGVyc2lzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9QRVJTSVNULCBvbGRQcmVQZXJzaXN0LCBuZXdQcmVQZXJzaXN0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UHJlUGVyc2lzdCA8ZW0+UHJlIFBlcnNpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlUGVyc2lzdChQcmVQZXJzaXN0IG5ld1ByZVBlcnNpc3QpCi0JewotCQlpZiAobmV3UHJlUGVyc2lzdCAhPSBwcmVQZXJzaXN0KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVQZXJzaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByZVBlcnNpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1BFUlNJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZVBlcnNpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJlUGVyc2lzdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfUEVSU0lTVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVQZXJzaXN0KG5ld1ByZVBlcnNpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9QRVJTSVNULCBuZXdQcmVQZXJzaXN0LCBuZXdQcmVQZXJzaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3N0UGVyc2lzdChQb3N0UGVyc2lzdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVyX1Bvc3RQZXJzaXN0KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3N0UGVyc2lzdCBnZXRQb3N0UGVyc2lzdCgpCi0JewotCQlyZXR1cm4gcG9zdFBlcnNpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdFBlcnNpc3QoUG9zdFBlcnNpc3QgbmV3UG9zdFBlcnNpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQb3N0UGVyc2lzdCBvbGRQb3N0UGVyc2lzdCA9IHBvc3RQZXJzaXN0OwotCQlwb3N0UGVyc2lzdCA9IG5ld1Bvc3RQZXJzaXN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9QRVJTSVNULCBvbGRQb3N0UGVyc2lzdCwgbmV3UG9zdFBlcnNpc3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQb3N0UGVyc2lzdCA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc3RQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFBlcnNpc3QoUG9zdFBlcnNpc3QgbmV3UG9zdFBlcnNpc3QpCi0JewotCQlpZiAobmV3UG9zdFBlcnNpc3QgIT0gcG9zdFBlcnNpc3QpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3RQZXJzaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBvc3RQZXJzaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UG9zdFBlcnNpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UG9zdFBlcnNpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9QRVJTSVNULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3RQZXJzaXN0KG5ld1Bvc3RQZXJzaXN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1BFUlNJU1QsIG5ld1Bvc3RQZXJzaXN0LCBuZXdQb3N0UGVyc2lzdCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlUmVtb3ZlKFByZVJlbW92ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVyX1ByZVJlbW92ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlUmVtb3ZlIGdldFByZVJlbW92ZSgpCi0JewotCQlyZXR1cm4gcHJlUmVtb3ZlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZVJlbW92ZShQcmVSZW1vdmUgbmV3UHJlUmVtb3ZlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUHJlUmVtb3ZlIG9sZFByZVJlbW92ZSA9IHByZVJlbW92ZTsKLQkJcHJlUmVtb3ZlID0gbmV3UHJlUmVtb3ZlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1JFTU9WRSwgb2xkUHJlUmVtb3ZlLCBuZXdQcmVSZW1vdmUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQcmVSZW1vdmUgPGVtPlByZSBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZVJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZVJlbW92ZShQcmVSZW1vdmUgbmV3UHJlUmVtb3ZlKQotCXsKLQkJaWYgKG5ld1ByZVJlbW92ZSAhPSBwcmVSZW1vdmUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByZVJlbW92ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcmVSZW1vdmUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1JFTU9WRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlUmVtb3ZlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ByZVJlbW92ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfUkVNT1ZFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZVJlbW92ZShuZXdQcmVSZW1vdmUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9SRU1PVkUsIG5ld1ByZVJlbW92ZSwgbmV3UHJlUmVtb3ZlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3N0UmVtb3ZlKFBvc3RSZW1vdmUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcl9Qb3N0UmVtb3ZlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3N0UmVtb3ZlIGdldFBvc3RSZW1vdmUoKQotCXsKLQkJcmV0dXJuIHBvc3RSZW1vdmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdFJlbW92ZShQb3N0UmVtb3ZlIG5ld1Bvc3RSZW1vdmUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQb3N0UmVtb3ZlIG9sZFBvc3RSZW1vdmUgPSBwb3N0UmVtb3ZlOwotCQlwb3N0UmVtb3ZlID0gbmV3UG9zdFJlbW92ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUkVNT1ZFLCBvbGRQb3N0UmVtb3ZlLCBuZXdQb3N0UmVtb3ZlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UG9zdFJlbW92ZSA8ZW0+UG9zdCBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0UmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFJlbW92ZShQb3N0UmVtb3ZlIG5ld1Bvc3RSZW1vdmUpCi0JewotCQlpZiAobmV3UG9zdFJlbW92ZSAhPSBwb3N0UmVtb3ZlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0UmVtb3ZlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBvc3RSZW1vdmUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9SRU1PVkUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3RSZW1vdmUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UG9zdFJlbW92ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1JFTU9WRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0UmVtb3ZlKG5ld1Bvc3RSZW1vdmUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUkVNT1ZFLCBuZXdQb3N0UmVtb3ZlLCBuZXdQb3N0UmVtb3ZlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVVcGRhdGUoUHJlVXBkYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5TGlzdGVuZXJfUHJlVXBkYXRlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmVVcGRhdGUgZ2V0UHJlVXBkYXRlKCkKLQl7Ci0JCXJldHVybiBwcmVVcGRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlVXBkYXRlKFByZVVwZGF0ZSBuZXdQcmVVcGRhdGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQcmVVcGRhdGUgb2xkUHJlVXBkYXRlID0gcHJlVXBkYXRlOwotCQlwcmVVcGRhdGUgPSBuZXdQcmVVcGRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfVVBEQVRFLCBvbGRQcmVVcGRhdGUsIG5ld1ByZVVwZGF0ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlVXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlVXBkYXRlKFByZVVwZGF0ZSBuZXdQcmVVcGRhdGUpCi0JewotCQlpZiAobmV3UHJlVXBkYXRlICE9IHByZVVwZGF0ZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlVXBkYXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByZVVwZGF0ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfVVBEQVRFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVVcGRhdGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJlVXBkYXRlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9VUERBVEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlVXBkYXRlKG5ld1ByZVVwZGF0ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1VQREFURSwgbmV3UHJlVXBkYXRlLCBuZXdQcmVVcGRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3RVcGRhdGUoUG9zdFVwZGF0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVyX1Bvc3RVcGRhdGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvc3RVcGRhdGUgZ2V0UG9zdFVwZGF0ZSgpCi0JewotCQlyZXR1cm4gcG9zdFVwZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0VXBkYXRlKFBvc3RVcGRhdGUgbmV3UG9zdFVwZGF0ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVBvc3RVcGRhdGUgb2xkUG9zdFVwZGF0ZSA9IHBvc3RVcGRhdGU7Ci0JCXBvc3RVcGRhdGUgPSBuZXdQb3N0VXBkYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9VUERBVEUsIG9sZFBvc3RVcGRhdGUsIG5ld1Bvc3RVcGRhdGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc3RVcGRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0VXBkYXRlKFBvc3RVcGRhdGUgbmV3UG9zdFVwZGF0ZSkKLQl7Ci0JCWlmIChuZXdQb3N0VXBkYXRlICE9IHBvc3RVcGRhdGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3RVcGRhdGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcG9zdFVwZGF0ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1VQREFURSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UG9zdFVwZGF0ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQb3N0VXBkYXRlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfVVBEQVRFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3RVcGRhdGUobmV3UG9zdFVwZGF0ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9VUERBVEUsIG5ld1Bvc3RVcGRhdGUsIG5ld1Bvc3RVcGRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IExvYWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgTG9hZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IExvYWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3RMb2FkKFBvc3RMb2FkKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5TGlzdGVuZXJfUG9zdExvYWQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvc3RMb2FkIGdldFBvc3RMb2FkKCkKLQl7Ci0JCXJldHVybiBwb3N0TG9hZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0TG9hZChQb3N0TG9hZCBuZXdQb3N0TG9hZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVBvc3RMb2FkIG9sZFBvc3RMb2FkID0gcG9zdExvYWQ7Ci0JCXBvc3RMb2FkID0gbmV3UG9zdExvYWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX0xPQUQsIG9sZFBvc3RMb2FkLCBuZXdQb3N0TG9hZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFBvc3RMb2FkIDxlbT5Qb3N0IExvYWQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgTG9hZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UG9zdExvYWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0TG9hZChQb3N0TG9hZCBuZXdQb3N0TG9hZCkKLQl7Ci0JCWlmIChuZXdQb3N0TG9hZCAhPSBwb3N0TG9hZCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdExvYWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcG9zdExvYWQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9MT0FELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0TG9hZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQb3N0TG9hZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX0xPQUQsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdExvYWQobmV3UG9zdExvYWQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfTE9BRCwgbmV3UG9zdExvYWQsIG5ld1Bvc3RMb2FkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfUEVSU0lTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVQZXJzaXN0KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9QRVJTSVNUOgotCQkJCXJldHVybiBiYXNpY1NldFBvc3RQZXJzaXN0KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1JFTU9WRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVSZW1vdmUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1JFTU9WRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQb3N0UmVtb3ZlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1VQREFURToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVVcGRhdGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1VQREFURToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQb3N0VXBkYXRlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9MT0FEOgotCQkJCXJldHVybiBiYXNpY1NldFBvc3RMb2FkKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIGdldENsYXNzTmFtZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIGdldFByZVBlcnNpc3QoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVDoKLQkJCQlyZXR1cm4gZ2V0UG9zdFBlcnNpc3QoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9SRU1PVkU6Ci0JCQkJcmV0dXJuIGdldFByZVJlbW92ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9SRU1PVkU6Ci0JCQkJcmV0dXJuIGdldFBvc3RSZW1vdmUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9VUERBVEU6Ci0JCQkJcmV0dXJuIGdldFByZVVwZGF0ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9VUERBVEU6Ci0JCQkJcmV0dXJuIGdldFBvc3RVcGRhdGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfTE9BRDoKLQkJCQlyZXR1cm4gZ2V0UG9zdExvYWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfUEVSU0lTVDoKLQkJCQlzZXRQcmVQZXJzaXN0KChQcmVQZXJzaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1BFUlNJU1Q6Ci0JCQkJc2V0UG9zdFBlcnNpc3QoKFBvc3RQZXJzaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfUkVNT1ZFOgotCQkJCXNldFByZVJlbW92ZSgoUHJlUmVtb3ZlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1JFTU9WRToKLQkJCQlzZXRQb3N0UmVtb3ZlKChQb3N0UmVtb3ZlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfVVBEQVRFOgotCQkJCXNldFByZVVwZGF0ZSgoUHJlVXBkYXRlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1VQREFURToKLQkJCQlzZXRQb3N0VXBkYXRlKChQb3N0VXBkYXRlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX0xPQUQ6Ci0JCQkJc2V0UG9zdExvYWQoKFBvc3RMb2FkKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZShDTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfUEVSU0lTVDoKLQkJCQlzZXRQcmVQZXJzaXN0KChQcmVQZXJzaXN0KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVDoKLQkJCQlzZXRQb3N0UGVyc2lzdCgoUG9zdFBlcnNpc3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1JFTU9WRToKLQkJCQlzZXRQcmVSZW1vdmUoKFByZVJlbW92ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1JFTU9WRToKLQkJCQlzZXRQb3N0UmVtb3ZlKChQb3N0UmVtb3ZlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9VUERBVEU6Ci0JCQkJc2V0UHJlVXBkYXRlKChQcmVVcGRhdGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9VUERBVEU6Ci0JCQkJc2V0UG9zdFVwZGF0ZSgoUG9zdFVwZGF0ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX0xPQUQ6Ci0JCQkJc2V0UG9zdExvYWQoKFBvc3RMb2FkKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FOgotCQkJCXJldHVybiBDTEFTU19OQU1FX0VERUZBVUxUID09IG51bGwgPyBjbGFzc05hbWUgIT0gbnVsbCA6ICFDTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhjbGFzc05hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIHByZVBlcnNpc3QgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVDoKLQkJCQlyZXR1cm4gcG9zdFBlcnNpc3QgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9SRU1PVkU6Ci0JCQkJcmV0dXJuIHByZVJlbW92ZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9SRU1PVkU6Ci0JCQkJcmV0dXJuIHBvc3RSZW1vdmUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9VUERBVEU6Ci0JCQkJcmV0dXJuIHByZVVwZGF0ZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9VUERBVEU6Ci0JCQkJcmV0dXJuIHBvc3RVcGRhdGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfTE9BRDoKLQkJCQlyZXR1cm4gcG9zdExvYWQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2xhc3NOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjbGFzc05hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gRW50aXR5TGlzdGVuZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5TGlzdGVuZXJzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0VudGl0eUxpc3RlbmVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQ5NmY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5TGlzdGVuZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVycyNnZXRFbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVycygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlMaXN0ZW5lcnMgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5TGlzdGVuZXJzKCkgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW50aXR5TGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RW50aXR5TGlzdGVuZXI+IGVudGl0eUxpc3RlbmVyczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlMaXN0ZW5lcnMoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5FTlRJVFlfTElTVEVORVJTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcnNfRW50aXR5TGlzdGVuZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxFbnRpdHlMaXN0ZW5lcj4gZ2V0RW50aXR5TGlzdGVuZXJzKCkKLQl7Ci0JCWlmIChlbnRpdHlMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJewotCQkJZW50aXR5TGlzdGVuZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEVudGl0eUxpc3RlbmVyPihFbnRpdHlMaXN0ZW5lci5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJTX19FTlRJVFlfTElTVEVORVJTKTsKLQkJfQotCQlyZXR1cm4gZW50aXR5TGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUlNfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRFbnRpdHlMaXN0ZW5lcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJTX19FTlRJVFlfTElTVEVORVJTOgotCQkJCXJldHVybiBnZXRFbnRpdHlMaXN0ZW5lcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSU19fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlnZXRFbnRpdHlMaXN0ZW5lcnMoKS5jbGVhcigpOwotCQkJCWdldEVudGl0eUxpc3RlbmVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRW50aXR5TGlzdGVuZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSU19fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlnZXRFbnRpdHlMaXN0ZW5lcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSU19fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gZW50aXR5TGlzdGVuZXJzICE9IG51bGwgJiYgIWVudGl0eUxpc3RlbmVycy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvLyBFbnRpdHlMaXN0ZW5lcnMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5UmVzdWx0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0VudGl0eVJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjdlMmNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5UmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGl0eSBSZXN1bHQ8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlSZXN1bHQjZ2V0RGlzY3JpbWluYXRvckNvbHVtbiA8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlSZXN1bHQjZ2V0RW50aXR5Q2xhc3MgPGVtPkVudGl0eSBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdCNnZXRGaWVsZFJlc3VsdHMgPGVtPkZpZWxkIFJlc3VsdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eVJlc3VsdCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlSZXN1bHQgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2NyaW1pbmF0b3JDb2x1bW4oKSA8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc2NyaW1pbmF0b3JDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2NyaW1pbmF0b3JDb2x1bW4oKSA8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc2NyaW1pbmF0b3JDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbiA9IERJU0NSSU1JTkFUT1JfQ09MVU1OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGl0eUNsYXNzKCkgPGVtPkVudGl0eSBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW50aXR5Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRpdHlDbGFzcygpIDxlbT5FbnRpdHkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudGl0eUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVudGl0eUNsYXNzID0gRU5USVRZX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRSZXN1bHRzKCkgPGVtPkZpZWxkIFJlc3VsdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRSZXN1bHRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RmllbGRSZXN1bHQ+IGZpZWxkUmVzdWx0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlSZXN1bHQoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5FTlRJVFlfUkVTVUxUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGlzY3JpbWluYXRvckNvbHVtbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlSZXN1bHRfRGlzY3JpbWluYXRvckNvbHVtbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc2NyaW1pbmF0b3JDb2x1bW4oKQotCXsKLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3JDb2x1bW47Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdCNnZXREaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5EaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERpc2NyaW1pbmF0b3JDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdG9yQ29sdW1uKFN0cmluZyBuZXdEaXNjcmltaW5hdG9yQ29sdW1uKQotCXsKLQkJU3RyaW5nIG9sZERpc2NyaW1pbmF0b3JDb2x1bW4gPSBkaXNjcmltaW5hdG9yQ29sdW1uOwotCQlkaXNjcmltaW5hdG9yQ29sdW1uID0gbmV3RGlzY3JpbWluYXRvckNvbHVtbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19ESVNDUklNSU5BVE9SX0NPTFVNTiwgb2xkRGlzY3JpbWluYXRvckNvbHVtbiwgZGlzY3JpbWluYXRvckNvbHVtbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RW50aXR5Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5UmVzdWx0X0VudGl0eUNsYXNzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVudGl0eUNsYXNzKCkKLQl7Ci0JCXJldHVybiBlbnRpdHlDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0I2dldEVudGl0eUNsYXNzIDxlbT5FbnRpdHkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RW50aXR5Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHlDbGFzcyhTdHJpbmcgbmV3RW50aXR5Q2xhc3MpCi0JewotCQlTdHJpbmcgb2xkRW50aXR5Q2xhc3MgPSBlbnRpdHlDbGFzczsKLQkJZW50aXR5Q2xhc3MgPSBuZXdFbnRpdHlDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19FTlRJVFlfQ0xBU1MsIG9sZEVudGl0eUNsYXNzLCBlbnRpdHlDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIFJlc3VsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmllbGRSZXN1bHR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmllbGQgUmVzdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIFJlc3VsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlSZXN1bHRfRmllbGRSZXN1bHRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxGaWVsZFJlc3VsdD4gZ2V0RmllbGRSZXN1bHRzKCkKLQl7Ci0JCWlmIChmaWVsZFJlc3VsdHMgPT0gbnVsbCkKLQkJewotCQkJZmllbGRSZXN1bHRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEZpZWxkUmVzdWx0PihGaWVsZFJlc3VsdC5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19GSUVMRF9SRVNVTFRTKTsKLQkJfQotCQlyZXR1cm4gZmllbGRSZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9SRVNVTFRfX0ZJRUxEX1JFU1VMVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRGaWVsZFJlc3VsdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19ESVNDUklNSU5BVE9SX0NPTFVNTjoKLQkJCQlyZXR1cm4gZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9SRVNVTFRfX0VOVElUWV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0RW50aXR5Q2xhc3MoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19GSUVMRF9SRVNVTFRTOgotCQkJCXJldHVybiBnZXRGaWVsZFJlc3VsdHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX1JFU1VMVF9fRElTQ1JJTUlOQVRPUl9DT0xVTU46Ci0JCQkJc2V0RGlzY3JpbWluYXRvckNvbHVtbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX1JFU1VMVF9fRU5USVRZX0NMQVNTOgotCQkJCXNldEVudGl0eUNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19GSUVMRF9SRVNVTFRTOgotCQkJCWdldEZpZWxkUmVzdWx0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmllbGRSZXN1bHRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBGaWVsZFJlc3VsdD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19ESVNDUklNSU5BVE9SX0NPTFVNTjoKLQkJCQlzZXREaXNjcmltaW5hdG9yQ29sdW1uKERJU0NSSU1JTkFUT1JfQ09MVU1OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX1JFU1VMVF9fRU5USVRZX0NMQVNTOgotCQkJCXNldEVudGl0eUNsYXNzKEVOVElUWV9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9SRVNVTFRfX0ZJRUxEX1JFU1VMVFM6Ci0JCQkJZ2V0RmllbGRSZXN1bHRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9SRVNVTFRfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOgotCQkJCXJldHVybiBESVNDUklNSU5BVE9SX0NPTFVNTl9FREVGQVVMVCA9PSBudWxsID8gZGlzY3JpbWluYXRvckNvbHVtbiAhPSBudWxsIDogIURJU0NSSU1JTkFUT1JfQ09MVU1OX0VERUZBVUxULmVxdWFscyhkaXNjcmltaW5hdG9yQ29sdW1uKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19FTlRJVFlfQ0xBU1M6Ci0JCQkJcmV0dXJuIEVOVElUWV9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gZW50aXR5Q2xhc3MgIT0gbnVsbCA6ICFFTlRJVFlfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGVudGl0eUNsYXNzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19GSUVMRF9SRVNVTFRTOgotCQkJCXJldHVybiBmaWVsZFJlc3VsdHMgIT0gbnVsbCAmJiAhZmllbGRSZXN1bHRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGlzY3JpbWluYXRvckNvbHVtbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGlzY3JpbWluYXRvckNvbHVtbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZW50aXR5Q2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVudGl0eUNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIEVudGl0eVJlc3VsdApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9FbnVtVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9FbnVtVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTFiMmZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRW51bVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5FbnVtIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudW1UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBFbnVtVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PUkRJTkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09SRElOQUxfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlPUkRJTkFMKDAsICJPUkRJTkFMIiwgIk9SRElOQUwiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNUUklORzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVFJJTkdfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTVFJJTkcoMSwgIlNUUklORyIsICJTVFJJTkciKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9SRElOQUw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9SRElOQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT1JESU5BTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SRElOQUxfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U1RSSU5HPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TVFJJTkc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RSSU5HCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5FbnVtIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVudW1UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEVudW1UeXBlW10KLQkJewotCQkJT1JESU5BTCwKLQkJCVNUUklORywKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5FbnVtIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxFbnVtVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FbnVtIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJRW51bVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RW51bSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUVudW1UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RW51bSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bVR5cGUgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgT1JESU5BTF9WQUxVRTogcmV0dXJuIE9SRElOQUw7Ci0JCQljYXNlIFNUUklOR19WQUxVRTogcmV0dXJuIFNUUklORzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRW51bVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0VudW1UeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0V2ZW50TWV0aG9kLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0V2ZW50TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjY0YTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9FdmVudE1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXZlbnQgTWV0aG9kPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEV2ZW50TWV0aG9kKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV2ZW50TWV0aG9kIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2ROYW1lKCkgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2ROYW1lKCkgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGhvZE5hbWUgPSBNRVRIT0RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFdmVudE1ldGhvZCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkVWRU5UX01FVEhPRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1ldGhvZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RXZlbnRNZXRob2RfTWV0aG9kTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkKLQl7Ci0JCXJldHVybiBtZXRob2ROYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZCNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2ROYW1lKFN0cmluZyBuZXdNZXRob2ROYW1lKQotCXsKLQkJU3RyaW5nIG9sZE1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwotCQltZXRob2ROYW1lID0gbmV3TWV0aG9kTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FLCBvbGRNZXRob2ROYW1lLCBtZXRob2ROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRVZFTlRfTUVUSE9EX19NRVRIT0RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kTmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FOgotCQkJCXNldE1ldGhvZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU6Ci0JCQkJc2V0TWV0aG9kTmFtZShNRVRIT0RfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FOgotCQkJCXJldHVybiBNRVRIT0RfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWV0aG9kTmFtZSAhPSBudWxsIDogIU1FVEhPRF9OQU1FX0VERUZBVUxULmVxdWFscyhtZXRob2ROYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWV0aG9kTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWV0aG9kTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBFdmVudE1ldGhvZApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9GZXRjaFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRmV0Y2hUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTdlN2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9GZXRjaFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5GZXRjaCBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRGZXRjaFR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIEZldGNoVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5MQVpZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xBWllfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlMQVpZKDAsICJMQVpZIiwgIkxBWlkiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVBR0VSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VBR0VSX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRUFHRVIoMSwgIkVBR0VSIiwgIkVBR0VSIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5MQVpZPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5MQVpZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xBWlkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVpZX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVBR0VSPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FQUdFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFQUdFUgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVBR0VSX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5GZXRjaCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGZXRjaFR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgRmV0Y2hUeXBlW10KLQkJewotCQkJTEFaWSwKLQkJCUVBR0VSLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkZldGNoIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxGZXRjaFR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RmV0Y2ggVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZldGNoVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJRmV0Y2hUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkZldGNoIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBGZXRjaFR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUZldGNoVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkZldGNoIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBGZXRjaFR5cGUgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgTEFaWV9WQUxVRTogcmV0dXJuIExBWlk7Ci0JCQljYXNlIEVBR0VSX1ZBTFVFOiByZXR1cm4gRUFHRVI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEZldGNoVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vRmV0Y2hUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0ZpZWxkUmVzdWx0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0ZpZWxkUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljY2E3MWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9GaWVsZFJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmllbGQgUmVzdWx0PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmllbGRSZXN1bHQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0I2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRGaWVsZFJlc3VsdCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWVsZFJlc3VsdCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW4oKSA8ZW0+Q29sdW1uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW4oKSA8ZW0+Q29sdW1uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29sdW1uID0gQ09MVU1OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEZpZWxkUmVzdWx0KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuRklFTERfUkVTVUxUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRGaWVsZFJlc3VsdF9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5GSUVMRF9SRVNVTFRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbHVtbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRGaWVsZFJlc3VsdF9Db2x1bW4oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uKCkKLQl7Ci0JCXJldHVybiBjb2x1bW47Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0I2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbihTdHJpbmcgbmV3Q29sdW1uKQotCXsKLQkJU3RyaW5nIG9sZENvbHVtbiA9IGNvbHVtbjsKLQkJY29sdW1uID0gbmV3Q29sdW1uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkZJRUxEX1JFU1VMVF9fQ09MVU1OLCBvbGRDb2x1bW4sIGNvbHVtbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkZJRUxEX1JFU1VMVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkZJRUxEX1JFU1VMVF9fQ09MVU1OOgotCQkJCXJldHVybiBnZXRDb2x1bW4oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRklFTERfUkVTVUxUX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkZJRUxEX1JFU1VMVF9fQ09MVU1OOgotCQkJCXNldENvbHVtbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRklFTERfUkVTVUxUX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkZJRUxEX1JFU1VMVF9fQ09MVU1OOgotCQkJCXNldENvbHVtbihDT0xVTU5fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRklFTERfUkVTVUxUX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRklFTERfUkVTVUxUX19DT0xVTU46Ci0JCQkJcmV0dXJuIENPTFVNTl9FREVGQVVMVCA9PSBudWxsID8gY29sdW1uICE9IG51bGwgOiAhQ09MVU1OX0VERUZBVUxULmVxdWFscyhjb2x1bW4pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb2x1bW46ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbHVtbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBGaWVsZFJlc3VsdApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9HZW5lcmF0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9HZW5lcmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDk0MWQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vR2VuZXJhdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5HZW5lcmF0aW9uIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEdlbmVyYXRpb25UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5UQUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUQUJMRV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVRBQkxFKDAsICJUQUJMRSIsICJUQUJMRSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VRVUVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VRVUVOQ0VfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTRVFVRU5DRSgxLCAiU0VRVUVOQ0UiLCAiU0VRVUVOQ0UiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklERU5USVRZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lERU5USVRZX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JSURFTlRJVFkoMiwgIklERU5USVRZIiwgIklERU5USVRZIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BVVRPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FVVE9fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlBVVRPKDMsICJBVVRPIiwgIkFVVE8iKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRBQkxFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5UQUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUQUJMRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFUVVFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TRVFVRU5DRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVFVRU5DRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUVVFTkNFX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklERU5USVRZPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JREVOVElUWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJREVOVElUWQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElERU5USVRZX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVVUTwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fVkFMVUUgPSAzOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkdlbmVyYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgR2VuZXJhdGlvblR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgR2VuZXJhdGlvblR5cGVbXQotCQl7Ci0JCQlUQUJMRSwKLQkJCVNFUVVFTkNFLAotCQkJSURFTlRJVFksCi0JCQlBVVRPLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkdlbmVyYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEdlbmVyYXRpb25UeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkdlbmVyYXRpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEdlbmVyYXRpb25UeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlHZW5lcmF0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5HZW5lcmF0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBHZW5lcmF0aW9uVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJR2VuZXJhdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5HZW5lcmF0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBHZW5lcmF0aW9uVHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBUQUJMRV9WQUxVRTogcmV0dXJuIFRBQkxFOwotCQkJY2FzZSBTRVFVRU5DRV9WQUxVRTogcmV0dXJuIFNFUVVFTkNFOwotCQkJY2FzZSBJREVOVElUWV9WQUxVRTogcmV0dXJuIElERU5USVRZOwotCQkJY2FzZSBBVVRPX1ZBTFVFOiByZXR1cm4gQVVUTzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgR2VuZXJhdGlvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0dlbmVyYXRpb25UeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0luaGVyaXRhbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0luaGVyaXRhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1N2U0M2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Jbmhlcml0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5oZXJpdGFuY2U8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZSNnZXRTdHJhdGVneSA8ZW0+U3RyYXRlZ3k8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEluaGVyaXRhbmNlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaGVyaXRhbmNlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEluaGVyaXRhbmNlVHlwZSBTVFJBVEVHWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJhdGVneSgpIDxlbT5TdHJhdGVneTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RyYXRlZ3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3kgPSBTVFJBVEVHWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbmhlcml0YW5jZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLklOSEVSSVRBTkNFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cmF0ZWd5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IlNJTkdMRV9UQUJMRSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RyYXRlZ3k8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RyYXRlZ3k8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZQotCSAqIEBzZWUgI3NldFN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEluaGVyaXRhbmNlX1N0cmF0ZWd5KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iU0lOR0xFX1RBQkxFIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5oZXJpdGFuY2VUeXBlIGdldFN0cmF0ZWd5KCkKLQl7Ci0JCXJldHVybiBzdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2UjZ2V0U3RyYXRlZ3kgPGVtPlN0cmF0ZWd5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJhdGVneTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlCi0JICogQHNlZSAjZ2V0U3RyYXRlZ3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgbmV3U3RyYXRlZ3kpCi0JewotCQlJbmhlcml0YW5jZVR5cGUgb2xkU3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJc3RyYXRlZ3kgPSBuZXdTdHJhdGVneSA9PSBudWxsID8gU1RSQVRFR1lfRURFRkFVTFQgOiBuZXdTdHJhdGVneTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5JTkhFUklUQU5DRV9fU1RSQVRFR1ksIG9sZFN0cmF0ZWd5LCBzdHJhdGVneSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLklOSEVSSVRBTkNFX19TVFJBVEVHWToKLQkJCQlyZXR1cm4gZ2V0U3RyYXRlZ3koKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuSU5IRVJJVEFOQ0VfX1NUUkFURUdZOgotCQkJCXNldFN0cmF0ZWd5KChJbmhlcml0YW5jZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5JTkhFUklUQU5DRV9fU1RSQVRFR1k6Ci0JCQkJc2V0U3RyYXRlZ3koU1RSQVRFR1lfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuSU5IRVJJVEFOQ0VfX1NUUkFURUdZOgotCQkJCXJldHVybiBzdHJhdGVneSAhPSBTVFJBVEVHWV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc3RyYXRlZ3k6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0cmF0ZWd5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIEluaGVyaXRhbmNlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0luaGVyaXRhbmNlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Jbmhlcml0YW5jZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0ZjI1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0luaGVyaXRhbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkluaGVyaXRhbmNlIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEluaGVyaXRhbmNlVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNJTkdMRSBUQUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTSU5HTEVfVEFCTEVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTSU5HTEVfVEFCTEUoMCwgIlNJTkdMRV9UQUJMRSIsICJTSU5HTEVfVEFCTEUiKSwgLyoqCi0JICogVGhlICc8ZW0+PGI+Sk9JTkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pPSU5FRF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUpPSU5FRCgxLCAiSk9JTkVEIiwgIkpPSU5FRCIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VEFCTEUgUEVSIENMQVNTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1RBQkxFX1BFUl9DTEFTU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVRBQkxFX1BFUl9DTEFTUygyLCAiVEFCTEVfUEVSX0NMQVNTIiwgIlRBQkxFX1BFUl9DTEFTUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0lOR0xFIFRBQkxFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TSU5HTEUgVEFCTEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0lOR0xFX1RBQkxFCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lOR0xFX1RBQkxFX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkpPSU5FRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Sk9JTkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pPSU5FRAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpPSU5FRF9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5UQUJMRSBQRVIgQ0xBU1M8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRBQkxFIFBFUiBDTEFTUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUQUJMRV9QRVJfQ0xBU1MKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUJMRV9QRVJfQ0xBU1NfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkluaGVyaXRhbmNlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEluaGVyaXRhbmNlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBJbmhlcml0YW5jZVR5cGVbXQotCQl7Ci0JCQlTSU5HTEVfVEFCTEUsCi0JCQlKT0lORUQsCi0JCQlUQUJMRV9QRVJfQ0xBU1MsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+SW5oZXJpdGFuY2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEluaGVyaXRhbmNlVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Jbmhlcml0YW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5oZXJpdGFuY2VUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlJbmhlcml0YW5jZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SW5oZXJpdGFuY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluaGVyaXRhbmNlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJSW5oZXJpdGFuY2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SW5oZXJpdGFuY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluaGVyaXRhbmNlVHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBTSU5HTEVfVEFCTEVfVkFMVUU6IHJldHVybiBTSU5HTEVfVEFCTEU7Ci0JCQljYXNlIEpPSU5FRF9WQUxVRTogcmV0dXJuIEpPSU5FRDsKLQkJCWNhc2UgVEFCTEVfUEVSX0NMQVNTX1ZBTFVFOiByZXR1cm4gVEFCTEVfUEVSX0NMQVNTOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJbmhlcml0YW5jZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0luaGVyaXRhbmNlVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Mb2IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vTG9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MjYwMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Mb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldExvYigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2IgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExvYigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkxPQjsKLQl9Ci0KLX0gLy8gTG9iCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL01hcEtleS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9NYXBLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0NWM5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL01hcEtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRNYXBLZXkoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcEtleSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0TWFwS2V5X05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1hcEtleQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9NYXBLZXlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL01hcEtleUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0YWIyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL01hcEtleUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldE1hcEtleUltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWFwS2V5SW1wbCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIE1hcEtleQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1hcEtleUltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5NQVBfS0VZX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldE1hcEtleV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuTUFQX0tFWV9JTVBMX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuTUFQX0tFWV9JTVBMX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLk1BUF9LRVlfSU1QTF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5NQVBfS0VZX0lNUExfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLk1BUF9LRVlfSU1QTF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIE1hcEtleQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1BcnRpZmFjdEVkaXQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vT3JtQXJ0aWZhY3RFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNTY0OTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1BcnRpZmFjdEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFBcnRpZmFjdEVkaXQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgT3JtQXJ0aWZhY3RFZGl0IGV4dGVuZHMgSnBhQXJ0aWZhY3RFZGl0Ci17Ci0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHJldHVybiBhbiBvcm0gYXJ0aWZhY3QgZm9yIHRoZSBwcm9qZWN0IGFQcm9qZWN0LgotCSAqIE9wZW5lZCBvbmx5IGZvciByZWFkIGFjY2VzcyAobm8gd3JpdGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChJUHJvamVjdCBhUHJvamVjdCkgewotCQlPcm1BcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFydGlmYWN0RWRpdCA9IG5ldyBPcm1BcnRpZmFjdEVkaXQoYVByb2plY3QsIHRydWUpOwotCQl9IAotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgLy8gc3VwcHJlc3MgaWxsZWdhbCBhcmd1bWVudCBleGNlcHRpb24KLSAgICAgICAgICAgIEpwdENvcmVQbHVnaW4ubG9nKGlhZSk7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0JCi0gICAgLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHJldHVybiBhbiBvcm0gYXJ0aWZhY3QgZm9yIHRoZSBwcm9qZWN0IGFQcm9qZWN0LgotICAgICAqIE9wZW5lZCBmb3IgYm90aCB3cml0ZSBhbmQgcmVhZCBhY2Nlc3MKLSAgICAgKi8JCi0JcHVibGljIHN0YXRpYyBPcm1BcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJT3JtQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgT3JtQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAvLyBzdXBwcmVzcyBpbGxlZ2FsIGFyZ3VtZW50IGV4Y2VwdGlvbgotICAgICAgICAgICAgSnB0Q29yZVBsdWdpbi5sb2coaWFlKTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkKLSAgICAKLQlwdWJsaWMgT3JtQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgCi0JCQl0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1SZXNvdXJjZSBnZXRSZXNvdXJjZShJRmlsZSBmaWxlKSB7Ci0JCS8vIFRoaXMgKnNlZW1zKiB0byBkbyB0aGUgc2FtZSBiYXNpYyB0aGluZyBhcyBiZWxvdywgYnV0IGNpcmN1bXZlbnRzIHRoZQotCQkvLyBVUkkgbXVuZ2luZyB0aGF0IEFydGlmYWN0RWRpdE1vZGVsIGRvZXMgKHNlZSBidWcgMjA5MDkzKQotCQl0cnkgewotCQkJT3JtUmVzb3VyY2UgcmVzb3VyY2UgPSAKLQkJCQkJKE9ybVJlc291cmNlKSBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7Ci0JCQlpZiAoISByZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJcmVzb3VyY2UubG9hZChnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFJlc291cmNlU2V0KCkuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCUpwdENvcmVQbHVnaW4ubG9nKGlvZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtUmVzb3VyY2UgZ2V0UmVzb3VyY2UoU3RyaW5nIGZpbGVVUkkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoT3JtUmVzb3VyY2UpIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShmaWxlVVJJKSk7Ci0JCX0KLQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzNTk3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3JtRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5SW1wbAotewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcm1GYWN0b3J5IGVJTlNUQU5DRSA9IGluaXQoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUZhY3RvcnkgaW5pdCgpCi0JewotCQl0cnkKLQkJewotCQkJT3JtRmFjdG9yeSB0aGVPcm1GYWN0b3J5ID0gKE9ybUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpwdC5vcm0ueG1pIik7IAotCQkJaWYgKHRoZU9ybUZhY3RvcnkgIT0gbnVsbCkKLQkJCXsKLQkJCQlyZXR1cm4gdGhlT3JtRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLQkJewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPcm1GYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3JtRmFjdG9yeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQotCXsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW50aXR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbWJlZGRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbElkSW1wbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW1iZWRkZWRJZEltcGwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVtYmVkZGVkSW1wbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQmFzaWNJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFZlcnNpb25JbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUEw6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxNYW55VG9PbmVJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUEw6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxPbmVUb01hbnlJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE9uZVRvT25lSW1wbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hbnlUb01hbnlJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVHJhbnNpZW50SW1wbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUEw6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNhc2NhZGVUeXBlSW1wbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbENvbHVtbkltcGwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5DT0xVTU5fUkVTVUxUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29sdW1uUmVzdWx0KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUlM6IHJldHVybiAoRU9iamVjdCljcmVhdGVFbnRpdHlMaXN0ZW5lcnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVFbnRpdHlMaXN0ZW5lcigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9SRVNVTFQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVFbnRpdHlSZXN1bHQoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVFdmVudE1ldGhvZCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkZJRUxEX1JFU1VMVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUZpZWxkUmVzdWx0KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sR2VuZXJhdGVkVmFsdWVJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0NMQVNTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sSWRDbGFzcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLklOSEVSSVRBTkNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlSW5oZXJpdGFuY2UoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEpvaW5Db2x1bW5JbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5MT0I6IHJldHVybiAoRU9iamVjdCljcmVhdGVMb2IoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5NQVBfS0VZX0lNUEw6IHJldHVybiAoRU9iamVjdCljcmVhdGVNYXBLZXlJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxOYW1lZFF1ZXJ5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuUE9TVF9MT0FEOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUG9zdExvYWQoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5QT1NUX1BFUlNJU1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVQb3N0UGVyc2lzdCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlBPU1RfUkVNT1ZFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUG9zdFJlbW92ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlBPU1RfVVBEQVRFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUG9zdFVwZGF0ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlBSRV9QRVJTSVNUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJlUGVyc2lzdCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlBSRV9SRU1PVkU6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcmVSZW1vdmUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5QUkVfVVBEQVRFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJlVXBkYXRlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0lNUEw6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUVVFUllfSElOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFF1ZXJ5SGludCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sU2Vjb25kYXJ5VGFibGVJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNxbFJlc3VsdFNldE1hcHBpbmcoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUEw6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxUYWJsZUdlbmVyYXRvckltcGwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUNDRVNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjY2Vzc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5ESVNDUklNSU5BVE9SX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc2NyaW1pbmF0b3JUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5VTV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFbnVtVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkZFVENIX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUZldGNoVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkdFTkVSQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlR2VuZXJhdGlvblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5JTkhFUklUQU5DRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVJbmhlcml0YW5jZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5URU1QT1JBTF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVUZW1wb3JhbFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5ESVNDUklNSU5BVE9SX1ZBTFVFOgotCQkJCXJldHVybiBjcmVhdGVEaXNjcmltaW5hdG9yVmFsdWVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlVNRVJBVEVEOgotCQkJCXJldHVybiBjcmVhdGVFbnVtZXJhdGVkRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuT1JERVJfQlk6Ci0JCQkJcmV0dXJuIGNyZWF0ZU9yZGVyQnlGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5WRVJTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVZlcnNpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUNDRVNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRBY2Nlc3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5ESVNDUklNSU5BVE9SX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREaXNjcmltaW5hdG9yVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5VTV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RW51bVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkZFVENIX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRGZXRjaFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkdFTkVSQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEdlbmVyYXRpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5JTkhFUklUQU5DRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0SW5oZXJpdGFuY2VUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5URU1QT1JBTF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VGVtcG9yYWxUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5ESVNDUklNSU5BVE9SX1ZBTFVFOgotCQkJCXJldHVybiBjb252ZXJ0RGlzY3JpbWluYXRvclZhbHVlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlVNRVJBVEVEOgotCQkJCXJldHVybiBjb252ZXJ0RW51bWVyYXRlZFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuT1JERVJfQlk6Ci0JCQkJcmV0dXJuIGNvbnZlcnRPcmRlckJ5VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5WRVJTSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRWZXJzaW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRW50aXR5TWFwcGluZ3MgY3JlYXRlWG1sRW50aXR5TWFwcGluZ3MoKQotCXsKLQkJWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MgPSBuZXcgWG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJcmV0dXJuIHhtbEVudGl0eU1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JewotCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IG5ldyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQl7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gbmV3IFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sTWFwcGVkU3VwZXJjbGFzcyBjcmVhdGVYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQl7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzcyA9IG5ldyBYbWxNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxFbnRpdHkgY3JlYXRlWG1sRW50aXR5KCkKLQl7Ci0JCVhtbEVudGl0eSB4bWxFbnRpdHkgPSBuZXcgWG1sRW50aXR5KCk7Ci0JCXJldHVybiB4bWxFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVtYmVkZGFibGUgY3JlYXRlWG1sRW1iZWRkYWJsZSgpCi0JewotCQlYbWxFbWJlZGRhYmxlIHhtbEVtYmVkZGFibGUgPSBuZXcgWG1sRW1iZWRkYWJsZSgpOwotCQlyZXR1cm4geG1sRW1iZWRkYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlcyBjcmVhdGVBdHRyaWJ1dGVzKCkKLQl7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzKCk7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxJZEltcGwgY3JlYXRlWG1sSWRJbXBsKCkKLQl7Ci0JCVhtbElkSW1wbCB4bWxJZEltcGwgPSBuZXcgWG1sSWRJbXBsKCk7Ci0JCXJldHVybiB4bWxJZEltcGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVtYmVkZGVkSWRJbXBsIGNyZWF0ZVhtbEVtYmVkZGVkSWRJbXBsKCkKLQl7Ci0JCVhtbEVtYmVkZGVkSWRJbXBsIHhtbEVtYmVkZGVkSWRJbXBsID0gbmV3IFhtbEVtYmVkZGVkSWRJbXBsKCk7Ci0JCXJldHVybiB4bWxFbWJlZGRlZElkSW1wbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQmFzaWNJbXBsIGNyZWF0ZVhtbEJhc2ljSW1wbCgpCi0JewotCQlYbWxCYXNpY0ltcGwgeG1sQmFzaWNJbXBsID0gbmV3IFhtbEJhc2ljSW1wbCgpOwotCQlyZXR1cm4geG1sQmFzaWNJbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxWZXJzaW9uSW1wbCBjcmVhdGVYbWxWZXJzaW9uSW1wbCgpCi0JewotCQlYbWxWZXJzaW9uSW1wbCB4bWxWZXJzaW9uSW1wbCA9IG5ldyBYbWxWZXJzaW9uSW1wbCgpOwotCQlyZXR1cm4geG1sVmVyc2lvbkltcGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE1hbnlUb09uZUltcGwgY3JlYXRlWG1sTWFueVRvT25lSW1wbCgpCi0JewotCQlYbWxNYW55VG9PbmVJbXBsIHhtbE1hbnlUb09uZUltcGwgPSBuZXcgWG1sTWFueVRvT25lSW1wbCgpOwotCQlyZXR1cm4geG1sTWFueVRvT25lSW1wbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT25lVG9NYW55SW1wbCBjcmVhdGVYbWxPbmVUb01hbnlJbXBsKCkKLQl7Ci0JCVhtbE9uZVRvTWFueUltcGwgeG1sT25lVG9NYW55SW1wbCA9IG5ldyBYbWxPbmVUb01hbnlJbXBsKCk7Ci0JCXJldHVybiB4bWxPbmVUb01hbnlJbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPbmVUb09uZUltcGwgY3JlYXRlWG1sT25lVG9PbmVJbXBsKCkKLQl7Ci0JCVhtbE9uZVRvT25lSW1wbCB4bWxPbmVUb09uZUltcGwgPSBuZXcgWG1sT25lVG9PbmVJbXBsKCk7Ci0JCXJldHVybiB4bWxPbmVUb09uZUltcGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE1hbnlUb01hbnlJbXBsIGNyZWF0ZVhtbE1hbnlUb01hbnlJbXBsKCkKLQl7Ci0JCVhtbE1hbnlUb01hbnlJbXBsIHhtbE1hbnlUb01hbnlJbXBsID0gbmV3IFhtbE1hbnlUb01hbnlJbXBsKCk7Ci0JCXJldHVybiB4bWxNYW55VG9NYW55SW1wbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRW1iZWRkZWRJbXBsIGNyZWF0ZVhtbEVtYmVkZGVkSW1wbCgpCi0JewotCQlYbWxFbWJlZGRlZEltcGwgeG1sRW1iZWRkZWRJbXBsID0gbmV3IFhtbEVtYmVkZGVkSW1wbCgpOwotCQlyZXR1cm4geG1sRW1iZWRkZWRJbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUcmFuc2llbnRJbXBsIGNyZWF0ZVhtbFRyYW5zaWVudEltcGwoKQotCXsKLQkJWG1sVHJhbnNpZW50SW1wbCB4bWxUcmFuc2llbnRJbXBsID0gbmV3IFhtbFRyYW5zaWVudEltcGwoKTsKLQkJcmV0dXJuIHhtbFRyYW5zaWVudEltcGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsIGNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKCkKLQl7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsID0gbmV3IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKCk7Ci0JCXJldHVybiB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsIGNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpCi0JewotCQlYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwgeG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsID0gbmV3IFhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpOwotCQlyZXR1cm4geG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXNjYWRlVHlwZUltcGwgY3JlYXRlQ2FzY2FkZVR5cGVJbXBsKCkKLQl7Ci0JCUNhc2NhZGVUeXBlSW1wbCBjYXNjYWRlVHlwZUltcGwgPSBuZXcgQ2FzY2FkZVR5cGVJbXBsKCk7Ci0JCXJldHVybiBjYXNjYWRlVHlwZUltcGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbHVtbkltcGwgY3JlYXRlWG1sQ29sdW1uSW1wbCgpCi0JewotCQlYbWxDb2x1bW5JbXBsIHhtbENvbHVtbkltcGwgPSBuZXcgWG1sQ29sdW1uSW1wbCgpOwotCQlyZXR1cm4geG1sQ29sdW1uSW1wbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sdW1uUmVzdWx0IGNyZWF0ZUNvbHVtblJlc3VsdCgpCi0JewotCQlDb2x1bW5SZXN1bHQgY29sdW1uUmVzdWx0ID0gbmV3IENvbHVtblJlc3VsdCgpOwotCQlyZXR1cm4gY29sdW1uUmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxEaXNjcmltaW5hdG9yQ29sdW1uIGNyZWF0ZVhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKQotCXsKLQkJWG1sRGlzY3JpbWluYXRvckNvbHVtbiB4bWxEaXNjcmltaW5hdG9yQ29sdW1uID0gbmV3IFhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJcmV0dXJuIHhtbERpc2NyaW1pbmF0b3JDb2x1bW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudGl0eUxpc3RlbmVycyBjcmVhdGVFbnRpdHlMaXN0ZW5lcnMoKQotCXsKLQkJRW50aXR5TGlzdGVuZXJzIGVudGl0eUxpc3RlbmVycyA9IG5ldyBFbnRpdHlMaXN0ZW5lcnMoKTsKLQkJcmV0dXJuIGVudGl0eUxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW50aXR5TGlzdGVuZXIgY3JlYXRlRW50aXR5TGlzdGVuZXIoKQotCXsKLQkJRW50aXR5TGlzdGVuZXIgZW50aXR5TGlzdGVuZXIgPSBuZXcgRW50aXR5TGlzdGVuZXIoKTsKLQkJcmV0dXJuIGVudGl0eUxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnRpdHlSZXN1bHQgY3JlYXRlRW50aXR5UmVzdWx0KCkKLQl7Ci0JCUVudGl0eVJlc3VsdCBlbnRpdHlSZXN1bHQgPSBuZXcgRW50aXR5UmVzdWx0KCk7Ci0JCXJldHVybiBlbnRpdHlSZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZpZWxkUmVzdWx0IGNyZWF0ZUZpZWxkUmVzdWx0KCkKLQl7Ci0JCUZpZWxkUmVzdWx0IGZpZWxkUmVzdWx0ID0gbmV3IEZpZWxkUmVzdWx0KCk7Ci0JCXJldHVybiBmaWVsZFJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sR2VuZXJhdGVkVmFsdWVJbXBsIGNyZWF0ZVhtbEdlbmVyYXRlZFZhbHVlSW1wbCgpCi0JewotCQlYbWxHZW5lcmF0ZWRWYWx1ZUltcGwgeG1sR2VuZXJhdGVkVmFsdWVJbXBsID0gbmV3IFhtbEdlbmVyYXRlZFZhbHVlSW1wbCgpOwotCQlyZXR1cm4geG1sR2VuZXJhdGVkVmFsdWVJbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxJZENsYXNzIGNyZWF0ZVhtbElkQ2xhc3MoKQotCXsKLQkJWG1sSWRDbGFzcyB4bWxJZENsYXNzID0gbmV3IFhtbElkQ2xhc3MoKTsKLQkJcmV0dXJuIHhtbElkQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaGVyaXRhbmNlIGNyZWF0ZUluaGVyaXRhbmNlKCkKLQl7Ci0JCUluaGVyaXRhbmNlIGluaGVyaXRhbmNlID0gbmV3IEluaGVyaXRhbmNlKCk7Ci0JCXJldHVybiBpbmhlcml0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSm9pbkNvbHVtbkltcGwgY3JlYXRlWG1sSm9pbkNvbHVtbkltcGwoKQotCXsKLQkJWG1sSm9pbkNvbHVtbkltcGwgeG1sSm9pbkNvbHVtbkltcGwgPSBuZXcgWG1sSm9pbkNvbHVtbkltcGwoKTsKLQkJcmV0dXJuIHhtbEpvaW5Db2x1bW5JbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luVGFibGVJbXBsIGNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKQotCXsKLQkJWG1sSm9pblRhYmxlSW1wbCB4bWxKb2luVGFibGVJbXBsID0gbmV3IFhtbEpvaW5UYWJsZUltcGwoKTsKLQkJcmV0dXJuIHhtbEpvaW5UYWJsZUltcGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExvYiBjcmVhdGVMb2IoKQotCXsKLQkJTG9iIGxvYiA9IG5ldyBMb2IoKTsKLQkJcmV0dXJuIGxvYjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFwS2V5SW1wbCBjcmVhdGVNYXBLZXlJbXBsKCkKLQl7Ci0JCU1hcEtleUltcGwgbWFwS2V5SW1wbCA9IG5ldyBNYXBLZXlJbXBsKCk7Ci0JCXJldHVybiBtYXBLZXlJbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxOYW1lZE5hdGl2ZVF1ZXJ5IGNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKQotCXsKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSB4bWxOYW1lZE5hdGl2ZVF1ZXJ5ID0gbmV3IFhtbE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJcmV0dXJuIHhtbE5hbWVkTmF0aXZlUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE5hbWVkUXVlcnkgY3JlYXRlWG1sTmFtZWRRdWVyeSgpCi0JewotCQlYbWxOYW1lZFF1ZXJ5IHhtbE5hbWVkUXVlcnkgPSBuZXcgWG1sTmFtZWRRdWVyeSgpOwotCQlyZXR1cm4geG1sTmFtZWRRdWVyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXZlbnRNZXRob2QgY3JlYXRlRXZlbnRNZXRob2QoKQotCXsKLQkJRXZlbnRNZXRob2QgZXZlbnRNZXRob2QgPSBuZXcgRXZlbnRNZXRob2QoKTsKLQkJcmV0dXJuIGV2ZW50TWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3N0TG9hZCBjcmVhdGVQb3N0TG9hZCgpCi0JewotCQlQb3N0TG9hZCBwb3N0TG9hZCA9IG5ldyBQb3N0TG9hZCgpOwotCQlyZXR1cm4gcG9zdExvYWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvc3RQZXJzaXN0IGNyZWF0ZVBvc3RQZXJzaXN0KCkKLQl7Ci0JCVBvc3RQZXJzaXN0IHBvc3RQZXJzaXN0ID0gbmV3IFBvc3RQZXJzaXN0KCk7Ci0JCXJldHVybiBwb3N0UGVyc2lzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9zdFJlbW92ZSBjcmVhdGVQb3N0UmVtb3ZlKCkKLQl7Ci0JCVBvc3RSZW1vdmUgcG9zdFJlbW92ZSA9IG5ldyBQb3N0UmVtb3ZlKCk7Ci0JCXJldHVybiBwb3N0UmVtb3ZlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3N0VXBkYXRlIGNyZWF0ZVBvc3RVcGRhdGUoKQotCXsKLQkJUG9zdFVwZGF0ZSBwb3N0VXBkYXRlID0gbmV3IFBvc3RVcGRhdGUoKTsKLQkJcmV0dXJuIHBvc3RVcGRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByZVBlcnNpc3QgY3JlYXRlUHJlUGVyc2lzdCgpCi0JewotCQlQcmVQZXJzaXN0IHByZVBlcnNpc3QgPSBuZXcgUHJlUGVyc2lzdCgpOwotCQlyZXR1cm4gcHJlUGVyc2lzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlUmVtb3ZlIGNyZWF0ZVByZVJlbW92ZSgpCi0JewotCQlQcmVSZW1vdmUgcHJlUmVtb3ZlID0gbmV3IFByZVJlbW92ZSgpOwotCQlyZXR1cm4gcHJlUmVtb3ZlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmVVcGRhdGUgY3JlYXRlUHJlVXBkYXRlKCkKLQl7Ci0JCVByZVVwZGF0ZSBwcmVVcGRhdGUgPSBuZXcgUHJlVXBkYXRlKCk7Ci0JCXJldHVybiBwcmVVcGRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCBjcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoKQotCXsKLQkJWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsIHhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCA9IG5ldyBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoKTsKLQkJcmV0dXJuIHhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUXVlcnlIaW50IGNyZWF0ZVhtbFF1ZXJ5SGludCgpCi0JewotCQlYbWxRdWVyeUhpbnQgeG1sUXVlcnlIaW50ID0gbmV3IFhtbFF1ZXJ5SGludCgpOwotCQlyZXR1cm4geG1sUXVlcnlIaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUYWJsZSBjcmVhdGVYbWxUYWJsZSgpCi0JewotCQlYbWxUYWJsZSB4bWxUYWJsZSA9IG5ldyBYbWxUYWJsZSgpOwotCQlyZXR1cm4geG1sVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFNlY29uZGFyeVRhYmxlSW1wbCBjcmVhdGVYbWxTZWNvbmRhcnlUYWJsZUltcGwoKQotCXsKLQkJWG1sU2Vjb25kYXJ5VGFibGVJbXBsIHhtbFNlY29uZGFyeVRhYmxlSW1wbCA9IG5ldyBYbWxTZWNvbmRhcnlUYWJsZUltcGwoKTsKLQkJcmV0dXJuIHhtbFNlY29uZGFyeVRhYmxlSW1wbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsIGNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpCi0JewotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwgeG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsID0gbmV3IFhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpOwotCQlyZXR1cm4geG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTcWxSZXN1bHRTZXRNYXBwaW5nIGNyZWF0ZVNxbFJlc3VsdFNldE1hcHBpbmcoKQotCXsKLQkJU3FsUmVzdWx0U2V0TWFwcGluZyBzcWxSZXN1bHRTZXRNYXBwaW5nID0gbmV3IFNxbFJlc3VsdFNldE1hcHBpbmcoKTsKLQkJcmV0dXJuIHNxbFJlc3VsdFNldE1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRhYmxlR2VuZXJhdG9ySW1wbCBjcmVhdGVYbWxUYWJsZUdlbmVyYXRvckltcGwoKQotCXsKLQkJWG1sVGFibGVHZW5lcmF0b3JJbXBsIHhtbFRhYmxlR2VuZXJhdG9ySW1wbCA9IG5ldyBYbWxUYWJsZUdlbmVyYXRvckltcGwoKTsKLQkJcmV0dXJuIHhtbFRhYmxlR2VuZXJhdG9ySW1wbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVW5pcXVlQ29uc3RyYWludEltcGwgY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKQotCXsKLQkJWG1sVW5pcXVlQ29uc3RyYWludEltcGwgeG1sVW5pcXVlQ29uc3RyYWludEltcGwgPSBuZXcgWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJcmV0dXJuIHhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY2Nlc3NUeXBlIGNyZWF0ZUFjY2Vzc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlBY2Nlc3NUeXBlIHJlc3VsdCA9IEFjY2Vzc1R5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEFjY2Vzc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBjcmVhdGVEaXNjcmltaW5hdG9yVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCURpc2NyaW1pbmF0b3JUeXBlIHJlc3VsdCA9IERpc2NyaW1pbmF0b3JUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREaXNjcmltaW5hdG9yVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudW1UeXBlIGNyZWF0ZUVudW1UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJRW51bVR5cGUgcmVzdWx0ID0gRW51bVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVudW1UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmV0Y2hUeXBlIGNyZWF0ZUZldGNoVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCUZldGNoVHlwZSByZXN1bHQgPSBGZXRjaFR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEZldGNoVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdlbmVyYXRpb25UeXBlIGNyZWF0ZUdlbmVyYXRpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJR2VuZXJhdGlvblR5cGUgcmVzdWx0ID0gR2VuZXJhdGlvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEdlbmVyYXRpb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5oZXJpdGFuY2VUeXBlIGNyZWF0ZUluaGVyaXRhbmNlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCUluaGVyaXRhbmNlVHlwZSByZXN1bHQgPSBJbmhlcml0YW5jZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEluaGVyaXRhbmNlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBvcmFsVHlwZSBjcmVhdGVUZW1wb3JhbFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlUZW1wb3JhbFR5cGUgcmVzdWx0ID0gVGVtcG9yYWxUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUZW1wb3JhbFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlRGlzY3JpbWluYXRvclZhbHVlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RGlzY3JpbWluYXRvclZhbHVlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudW1lcmF0b3IgY3JlYXRlRW51bWVyYXRlZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCXJldHVybiAoRW51bWVyYXRvcilzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFbnVtZXJhdGVkVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVPcmRlckJ5RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0T3JkZXJCeVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlVmVyc2lvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlyZXR1cm4gKFN0cmluZylzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWZXJzaW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcm1QYWNrYWdlIGdldE9ybVBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIChPcm1QYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgT3JtUGFja2FnZSBnZXRQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9Pcm1GYWN0b3J5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybVBhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vT3JtUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQ1Yzc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vT3JtUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsCi17Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTkFNRSA9ICJvcm0iOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfVVJJID0gImpwdC5vcm0ueG1pIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcm1QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1MgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1ZFUlNJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19ERVNDUklQVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fUEFDS0FHRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUEgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0NBVEFMT0cgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1NFUVVFTkNFX0dFTkVSQVRPUlMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUyA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIFN1cGVyY2xhc3NlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fRU5USVRJRVMgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbWJlZGRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19FTUJFRERBQkxFUyA9IDE0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1NDSEVNQSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0cgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBQZXJzaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNUID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fRU5USVRZX0xJU1RFTkVSUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBUeXBlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkcgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgWG1sIFR5cGUgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTEFTU19OQU1FID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01FVEFEQVRBX0NPTVBMRVRFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURVMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkIENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FTlRJVFlfTElTVEVORVJTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUEVSU0lTVCA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUEVSU0lTVCA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUkVNT1ZFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1JFTU9WRSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfVVBEQVRFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1VQREFURSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfTE9BRCA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgPGVtPlhtbCBFbnRpdHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DTEFTU19OQU1FID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTUVUQURBVEFfQ09NUExFVEUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BVFRSSUJVVEVTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19OQU1FID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fVEFCTEUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY29uZGFyeSBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0lEX0NMQVNTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbmhlcml0YW5jZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0UgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19OQU1FRF9OQVRJVkVfUVVFUklFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QT1NUX1BFUlNJU1QgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QUkVfUkVNT1ZFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJFX1VQREFURSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QT1NUX1VQREFURSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgTG9hZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUE9TVF9MT0FEID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0NMQVNTX05BTUUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX01FVEFEQVRBX0NPTVBMRVRFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19BVFRSSUJVVEVTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW1iZWRkYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFUyA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0lEUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkZWQgSWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0VNQkVEREVEX0lEUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzaWNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0JBU0lDUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fVkVSU0lPTlMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnkgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19NQU5ZX1RPX09ORVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9uZSBUbyBNYW55czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19PTkVfVE9fTUFOWVMgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9uZSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX09ORV9UT19PTkVTID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55IFRvIE1hbnlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX01BTllfVE9fTUFOWVMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVtYmVkZGVkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19FTUJFRERFRFMgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fVFJBTlNJRU5UUyA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXR0cmlidXRlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCA9IDEwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyA8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkcgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkcgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRSA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgTnVsbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTlVMTF9BVFRSSUJVVEVfTUFQUElORyA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OVUxMX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBOdWxsIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05VTExfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcgPGVtPkNvbHVtbiBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENvbHVtbk1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTUFQUElORyA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX01BUFBJTkdfX0NPTFVNTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29sdW1uIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTUFQUElOR19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPlhtbCBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19OQU1FID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWSA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIDxlbT5YbWwgTXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkcgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUUgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZID0gWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIID0gWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFID0gWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlkgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlkgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZID0gWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNdWx0aSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyA8ZW0+WG1sIFNpbmdsZSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElORyA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUUgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWSA9IFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0ggPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERSA9IFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUwgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fQ09MVU1OUyA9IFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU2luZ2xlIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgPGVtPlhtbCBJZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSUQgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX05BTUUgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0NPTFVNTiA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1RFTVBPUkFMID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19UQUJMRV9HRU5FUkFUT1IgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfRkVBVFVSRV9DT1VOVCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkSW1wbCA8ZW0+WG1sIElkIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxJZEltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfSU1QTCA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX0lNUExfX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9JTVBMX19HRU5FUkFURURfVkFMVUUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9JTVBMX19URU1QT1JBTCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9JTVBMX19UQUJMRV9HRU5FUkFUT1IgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfSU1QTF9fU0VRVUVOQ0VfR0VORVJBVE9SID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBJZCBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkJhc2VYbWxFbWJlZGRlZCA8ZW0+QmFzZSBYbWwgRW1iZWRkZWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQmFzZVhtbEVtYmVkZGVkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRCYXNlWG1sRW1iZWRkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVNFX1hNTF9FTUJFRERFRCA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBU0VfWE1MX0VNQkVEREVEX19OQU1FID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVMgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QmFzZSBYbWwgRW1iZWRkZWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVNFX1hNTF9FTUJFRERFRF9GRUFUVVJFX0NPVU5UID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZCA8ZW0+WG1sIEVtYmVkZGVkIElkPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSUQgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfX05BTUUgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfX0FUVFJJQlVURV9PVkVSUklERVMgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVtYmVkZGVkIElkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkSW1wbCA8ZW0+WG1sIEVtYmVkZGVkIElkIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWRJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX0lNUEwgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRlZCBJZCBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljIDxlbT5YbWwgQmFzaWM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2ljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0ltcGwgPGVtPlhtbCBCYXNpYyBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzaWNJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0lNUEwgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24gPGVtPlhtbCBWZXJzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTiA9IDI0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbkltcGwgPGVtPlhtbCBWZXJzaW9uIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFZlcnNpb25JbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fSU1QTCA9IDI1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIDxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9PbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkUgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZUltcGwgPGVtPlhtbCBNYW55IFRvIE9uZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hbnlUb09uZUltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfSU1QTCA9IDI3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IDxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb01hbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTlkgPSAyODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueUltcGwgPGVtPlhtbCBPbmUgVG8gTWFueSBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueUltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfSU1QTCA9IDI5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUgPGVtPlhtbCBPbmUgVG8gT25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZUltcGwgPGVtPlhtbCBPbmUgVG8gT25lIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZUltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9JTVBMID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55IDxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hbnlUb01hbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55SW1wbCA8ZW0+WG1sIE1hbnkgVG8gTWFueSBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55SW1wbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfSU1QTCA9IDMzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQgPGVtPlhtbCBFbWJlZGRlZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERUQgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfX05BTUUgPSBCQVNFX1hNTF9FTUJFRERFRF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUyA9IEJBU0VfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRlZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9GRUFUVVJFX0NPVU5UID0gQkFTRV9YTUxfRU1CRURERURfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZEltcGwgPGVtPlhtbCBFbWJlZGRlZCBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lNUEwgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRlZCBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX05BTUUgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0NPTFVNTiA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19GRVRDSCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19PUFRJT05BTCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fTE9CID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX1RFTVBPUkFMID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fRU5VTUVSQVRFRCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzaWM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19JTVBMX19DT0xVTU4gPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19JTVBMX19GRVRDSCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0lNUExfX09QVElPTkFMID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0lNUExfX0xPQiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0lNUExfX1RFTVBPUkFMID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19JTVBMX19FTlVNRVJBVEVEID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBCYXNpYyBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fTkFNRSA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19DT0xVTU4gPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19URU1QT1JBTCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVmVyc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX0lNUExfX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fSU1QTF9fVEVNUE9SQUwgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFZlcnNpb24gSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX05BTUUgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fVEFSR0VUX0VOVElUWSA9IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fRkVUQ0ggPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0pPSU5fVEFCTEUgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fQ0FTQ0FERSA9IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fT1BUSU9OQUwgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19KT0lOX0NPTFVNTlMgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfSU1QTF9fRkVUQ0ggPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fVEFCTEUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX0lNUExfX0NBU0NBREUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9JTVBMX19PUFRJT05BTCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFueSBUbyBPbmUgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19OQU1FID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19GRVRDSCA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX1RBQkxFID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERSA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQUEVEX0JZID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fT1JERVJfQlkgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0JZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWSA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX0NPTFVNTlMgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBNYW55PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX0lNUExfX05BTUUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFkgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9JTVBMX19GRVRDSCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfSU1QTF9fQ0FTQ0FERSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9JTVBMX19NQVBQRURfQlkgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9JTVBMX19PUkRFUl9CWSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfSU1QTF9fTUFQX0tFWSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE1hbnkgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX05BTUUgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19UQVJHRVRfRU5USVRZID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0ZFVENIID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0pPSU5fVEFCTEUgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19DQVNDQURFID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX09QVElPTkFMID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19KT0lOX0NPTFVNTlMgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fTUFQUEVEX0JZID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX0lNUExfX1RBUkdFVF9FTlRJVFkgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX0lNUExfX0ZFVENIID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fVEFCTEUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfSU1QTF9fQ0FTQ0FERSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfSU1QTF9fT1BUSU9OQUwgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX0lNUExfX01BUFBFRF9CWSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPbmUgVG8gT25lIEltcGw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTkFNRSA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19UQVJHRVRfRU5USVRZID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19GRVRDSCA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fSk9JTl9UQUJMRSA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19DQVNDQURFID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQUEVEX0JZID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX09SREVSX0JZID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfSU1QTF9fVEFSR0VUX0VOVElUWSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9JTVBMX19GRVRDSCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9JTVBMX19DQVNDQURFID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBQRURfQlkgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfSU1QTF9fT1JERVJfQlkgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBfS0VZID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE1hbnkgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfSU1QTF9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IDxlbT5YbWwgVHJhbnNpZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHJhbnNpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfX05BTUUgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRyYW5zaWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfRkVBVFVSRV9DT1VOVCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudEltcGwgPGVtPlhtbCBUcmFuc2llbnQgSW1wbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUcmFuc2llbnRJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVF9JTVBMID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVF9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUcmFuc2llbnQgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfSU1QTF9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREUgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwgPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMX19KT0lOX0NPTFVNTlMgPSBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fQ09MVU1OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTF9fTkFNRSA9IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSA8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU4gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUEwgPSAzOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fQ09MVU1OID0gWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fTkFNRSA9IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQVRUUklCVVRFX09WRVJSSURFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGUgPGVtPkNhc2NhZGUgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEUgPSA0MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIEFsbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX19DQVNDQURFX0FMTCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBQZXJzaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfX0NBU0NBREVfUEVSU0lTVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBNZXJnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX19DQVNDQURFX01FUkdFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIFJlbW92ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX19DQVNDQURFX1JFTU9WRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZWZyZXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfX0NBU0NBREVfUkVGUkVTSCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2FzY2FkZSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGVJbXBsIDxlbT5DYXNjYWRlIFR5cGUgSW1wbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENhc2NhZGVUeXBlSW1wbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0NBREVfVFlQRV9JTVBMID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX0FMTCA9IENBU0NBREVfVFlQRV9fQ0FTQ0FERV9BTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBQZXJzaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9QRVJTSVNUID0gQ0FTQ0FERV9UWVBFX19DQVNDQURFX1BFUlNJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBNZXJnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfTUVSR0UgPSBDQVNDQURFX1RZUEVfX0NBU0NBREVfTUVSR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZW1vdmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX1JFTU9WRSA9IENBU0NBREVfVFlQRV9fQ0FTQ0FERV9SRU1PVkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZWZyZXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9SRUZSRVNIID0gQ0FTQ0FERV9UWVBFX19DQVNDQURFX1JFRlJFU0g7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2FzY2FkZSBUeXBlIEltcGw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfSU1QTF9GRUFUVVJFX0NPVU5UID0gQ0FTQ0FERV9UWVBFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4gPGVtPlhtbCBOYW1lZCBDb2x1bW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX0NPTFVNTiA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX0NPTFVNTl9fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE5hbWVkIENvbHVtbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE5hbWVkQ29sdW1uIDxlbT5BYnN0cmFjdCBYbWwgTmFtZWQgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRSA9IFhNTF9OQU1FRF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgWG1sIE5hbWVkIENvbHVtbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiA8ZW0+WG1sIEFic3RyYWN0IENvbHVtbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWJzdHJhY3RDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUJTVFJBQ1RfQ09MVU1OID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BQlNUUkFDVF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FCU1RSQUNUX0NPTFVNTl9fTkFNRSA9IFhNTF9OQU1FRF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRSA9IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFID0gWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEUgPSBYTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FCU1RSQUNUX0NPTFVNTl9fVU5JUVVFID0gWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BQlNUUkFDVF9DT0xVTU5fX1VQREFUQUJMRSA9IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEFic3RyYWN0IENvbHVtbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BQlNUUkFDVF9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uIDxlbT5BYnN0cmFjdCBYbWwgQWJzdHJhY3QgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fTkFNRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEUgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVU5JUVVFID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VQREFUQUJMRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgWG1sIEFic3RyYWN0IENvbHVtbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4gPGVtPlhtbCBDb2x1bW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fTkFNRSA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fSU5TRVJUQUJMRSA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fX0lOU0VSVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX05VTExBQkxFID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9fTlVMTEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX1RBQkxFID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19VTklRVUUgPSBYTUxfQUJTVFJBQ1RfQ09MVU1OX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19VUERBVEFCTEUgPSBYTUxfQUJTVFJBQ1RfQ09MVU1OX19VUERBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19MRU5HVEggPSBYTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fUFJFQ0lTSU9OID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fU0NBTEUgPSBYTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDb2x1bW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uSW1wbCA8ZW0+WG1sIENvbHVtbiBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbHVtbkltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0lNUEwgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9JTVBMX19DT0xVTU5fREVGSU5JVElPTiA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9JTVBMX19JTlNFUlRBQkxFID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9JTVBMX19OVUxMQUJMRSA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0lNUExfX1RBQkxFID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0lNUExfX1VOSVFVRSA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fSU1QTF9fVVBEQVRBQkxFID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9JTVBMX19MRU5HVEggPSBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9JTVBMX19QUkVDSVNJT04gPSBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0lNUExfX1NDQUxFID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29sdW1uIEltcGw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5SZXN1bHQgPGVtPkNvbHVtbiBSZXN1bHQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uUmVzdWx0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5SZXN1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fUkVTVUxUID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX1JFU1VMVF9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29sdW1uIFJlc3VsdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9SRVNVTFRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5YbWwgRGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlzY3JpbWluYXRvckNvbHVtbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTiA9IDQ5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19OQU1FID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fTEVOR1RIID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXJzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJTID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJTX19FTlRJVFlfTElTVEVORVJTID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyIDxlbT5FbnRpdHkgTGlzdGVuZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QUkVfUEVSU0lTVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QUkVfUkVNT1ZFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QT1NUX1JFTU9WRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QUkVfVVBEQVRFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QT1NUX1VQREFURSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJfX1BPU1RfTE9BRCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RW50aXR5IExpc3RlbmVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX0ZFQVRVUkVfQ09VTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0IDxlbT5FbnRpdHkgUmVzdWx0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5UmVzdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFU1VMVCA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfUkVTVUxUX19ESVNDUklNSU5BVE9SX0NPTFVNTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfUkVTVUxUX19FTlRJVFlfQ0xBU1MgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIFJlc3VsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFU1VMVF9fRklFTERfUkVTVUxUUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RW50aXR5IFJlc3VsdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9SRVNVTFRfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GaWVsZFJlc3VsdCA8ZW0+RmllbGQgUmVzdWx0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRGaWVsZFJlc3VsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1JFU1VMVCA9IDU0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2UgPGVtPkluaGVyaXRhbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRJbmhlcml0YW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSEVSSVRBTkNFID0gNTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Mb2IgPGVtPkxvYjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Mb2IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldExvYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQiA9IDYzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0TWFwS2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFQX0tFWSA9IDY0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QgPGVtPkV2ZW50IE1ldGhvZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RXZlbnRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9NRVRIT0QgPSA1MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUVUSE9EX19NRVRIT0RfTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXZlbnQgTWV0aG9kPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1JFU1VMVF9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9SRVNVTFRfX0NPTFVNTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RmllbGQgUmVzdWx0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfUkVTVUxUX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUgPGVtPlhtbCBHZW5lcmF0ZWQgVmFsdWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRSA9IDU1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJhdGVneTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1kgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBHZW5lcmF0ZWQgVmFsdWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVEVEX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWVJbXBsIDxlbT5YbWwgR2VuZXJhdGVkIFZhbHVlIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0ZWRWYWx1ZUltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVEVEX1ZBTFVFX0lNUEwgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFURURfVkFMVUVfSU1QTF9fR0VORVJBVE9SID0gWE1MX0dFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cmF0ZWd5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVEVEX1ZBTFVFX0lNUExfX1NUUkFURUdZID0gWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1k7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEdlbmVyYXRlZCBWYWx1ZSBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBYTUxfR0VORVJBVEVEX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzcyA8ZW0+WG1sIElkIENsYXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkQ2xhc3MKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfQ0xBU1MgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfQ0xBU1NfX0NMQVNTX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBJZCBDbGFzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9DTEFTU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJhdGVneTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5IRVJJVEFOQ0VfX1NUUkFURUdZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Jbmhlcml0YW5jZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSEVSSVRBTkNFX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbiA8ZW0+WG1sIEpvaW4gQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU4gPSA1OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9fTkFNRSA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX19JTlNFUlRBQkxFID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX19OVUxMQUJMRSA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fX1RBQkxFID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fX1VOSVFVRSA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9fVVBEQVRBQkxFID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gQ29sdW1uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbkltcGwgPGVtPlhtbCBKb2luIENvbHVtbiBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luQ29sdW1uSW1wbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMX19DT0xVTU5fREVGSU5JVElPTiA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fSU1QTF9fSU5TRVJUQUJMRSA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0lOU0VSVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMX19OVUxMQUJMRSA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fSU1QTF9fVEFCTEUgPSBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19UQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMX19VTklRVUUgPSBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fSU1QTF9fVVBEQVRBQkxFID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSm9pbiBDb2x1bW4gSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlIDxlbT5YbWwgQmFzZSBUYWJsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX1RBQkxFID0gODA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0VfVEFCTEVfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX1RBQkxFX19DQVRBTE9HID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX1RBQkxFX19TQ0hFTUEgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzZSBUYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX1RBQkxFX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlIDxlbT5YbWwgSm9pbiBUYWJsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFID0gNjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX05BTUUgPSBYTUxfQkFTRV9UQUJMRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fQ0FUQUxPRyA9IFhNTF9CQVNFX1RBQkxFX19DQVRBTE9HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX1NDSEVNQSA9IFhNTF9CQVNFX1RBQkxFX19TQ0hFTUE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBYTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TID0gWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW52ZXJzZSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9GRUFUVVJFX0NPVU5UID0gWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VUYWJsZSA8ZW0+QWJzdHJhY3QgWG1sIEJhc2UgVGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlVGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQmFzZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEUgPSA3OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fTkFNRSA9IFhNTF9CQVNFX1RBQkxFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19DQVRBTE9HID0gWE1MX0JBU0VfVEFCTEVfX0NBVEFMT0c7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fU0NIRU1BID0gWE1MX0JBU0VfVEFCTEVfX1NDSEVNQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyA9IFhNTF9CQVNFX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgWG1sIEJhc2UgVGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9GRUFUVVJFX0NPVU5UID0gWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVJbXBsIDxlbT5YbWwgSm9pbiBUYWJsZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZUltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9JTVBMID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0lNUExfX0NBVEFMT0cgPSBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fQ0FUQUxPRzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0lNUExfX1NDSEVNQSA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19TQ0hFTUE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0lNUExfX1VOSVFVRV9DT05TVFJBSU5UUyA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0lNUExfX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludmVyc2UgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0lNUExfX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gVGFibGUgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQl9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVBfS0VZX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NYXAgS2V5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFQX0tFWV9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleUltcGwgPGVtPk1hcCBLZXkgSW1wbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRNYXBLZXlJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFQX0tFWV9JTVBMID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFQX0tFWV9JTVBMX19OQU1FID0gTUFQX0tFWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NYXAgS2V5IEltcGw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVBfS0VZX0lNUExfRkVBVFVSRV9DT1VOVCA9IE1BUF9LRVlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSA8ZW0+WG1sIFF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWSA9IDY2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UXVlcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9fUVVFUlkgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9fSElOVFMgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBRdWVyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnkgPGVtPlhtbCBOYW1lZCBOYXRpdmUgUXVlcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWROYXRpdmVRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9OQVRJVkVfUVVFUlkgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfTkFUSVZFX1FVRVJZX19OQU1FID0gWE1MX1FVRVJZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfTkFUSVZFX1FVRVJZX19RVUVSWSA9IFhNTF9RVUVSWV9fUVVFUlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX05BVElWRV9RVUVSWV9fSElOVFMgPSBYTUxfUVVFUllfX0hJTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTID0gWE1MX1FVRVJZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBTZXQgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HID0gWE1MX1FVRVJZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBOYW1lZCBOYXRpdmUgUXVlcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfTkFUSVZFX1FVRVJZX0ZFQVRVUkVfQ09VTlQgPSBYTUxfUVVFUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5IDxlbT5YbWwgTmFtZWQgUXVlcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWRRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9RVUVSWSA9IDY4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9RVUVSWV9fTkFNRSA9IFhNTF9RVUVSWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RdWVyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1FVRVJZX19RVUVSWSA9IFhNTF9RVUVSWV9fUVVFUlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1FVRVJZX19ISU5UUyA9IFhNTF9RVUVSWV9fSElOVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE5hbWVkIFF1ZXJ5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1FVRVJZX0ZFQVRVUkVfQ09VTlQgPSBYTUxfUVVFUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlBvc3RMb2FkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQb3N0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfTE9BRCA9IDY5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX0xPQURfX01FVEhPRF9OQU1FID0gRVZFTlRfTUVUSE9EX19NRVRIT0RfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb3N0IExvYWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX0xPQURfRkVBVFVSRV9DT1VOVCA9IEVWRU5UX01FVEhPRF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlBvc3RQZXJzaXN0IDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFBlcnNpc3QKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFBvc3RQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9QRVJTSVNUID0gNzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfUEVSU0lTVF9fTUVUSE9EX05BTUUgPSBFVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvc3QgUGVyc2lzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfUEVSU0lTVF9GRUFUVVJFX0NPVU5UID0gRVZFTlRfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFJlbW92ZSA8ZW0+UG9zdCBSZW1vdmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFJlbW92ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UG9zdFJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfUkVNT1ZFID0gNzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfUkVNT1ZFX19NRVRIT0RfTkFNRSA9IEVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1JFTU9WRV9GRUFUVVJFX0NPVU5UID0gRVZFTlRfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFVwZGF0ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UG9zdFVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfVVBEQVRFID0gNzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfVVBEQVRFX19NRVRIT0RfTkFNRSA9IEVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1VQREFURV9GRUFUVVJFX0NPVU5UID0gRVZFTlRfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUHJlUGVyc2lzdCA8ZW0+UHJlIFBlcnNpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUHJlUGVyc2lzdAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UHJlUGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9QRVJTSVNUID0gNzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9QRVJTSVNUX19NRVRIT0RfTkFNRSA9IEVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJlIFBlcnNpc3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfUEVSU0lTVF9GRUFUVVJFX0NPVU5UID0gRVZFTlRfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUHJlUmVtb3ZlIDxlbT5QcmUgUmVtb3ZlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlByZVJlbW92ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UHJlUmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1JFTU9WRSA9IDc0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfUkVNT1ZFX19NRVRIT0RfTkFNRSA9IEVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJlIFJlbW92ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9SRU1PVkVfRkVBVFVSRV9DT1VOVCA9IEVWRU5UX01FVEhPRF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5QcmVVcGRhdGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9VUERBVEUgPSA3NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1VQREFURV9fTUVUSE9EX05BTUUgPSBFVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByZSBVcGRhdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfVVBEQVRFX0ZFQVRVUkVfQ09VTlQgPSBFVkVOVF9NRVRIT0RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiA8ZW0+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiA9IDc2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19OQU1FID0gWE1MX05BTUVEX0NPTFVNTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSBYTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQcmltYXJ5IEtleSBKb2luIENvbHVtbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9GRUFUVVJFX0NPVU5UID0gWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCA8ZW0+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTCA9IDc3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTF9fQ09MVU1OX0RFRklOSVRJT04gPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0lNUExfX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQcmltYXJ5IEtleSBKb2luIENvbHVtbiBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQgPGVtPlhtbCBRdWVyeSBIaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlIaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0hJTlQgPSA3ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfSElOVF9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9ISU5UX19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFF1ZXJ5IEhpbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfSElOVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlIDxlbT5YbWwgVGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFID0gODE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX19OQU1FID0gQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX19DQVRBTE9HID0gQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX0NBVEFMT0c7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfX1NDSEVNQSA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19TQ0hFTUE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUgPGVtPlhtbCBTZWNvbmRhcnkgVGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlY29uZGFyeVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRSA9IDgyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfX05BTUUgPSBYTUxfQkFTRV9UQUJMRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19DQVRBTE9HID0gWE1MX0JBU0VfVEFCTEVfX0NBVEFMT0c7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19TQ0hFTUEgPSBYTUxfQkFTRV9UQUJMRV9fU0NIRU1BOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBYTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBYTUxfQkFTRV9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9GRUFUVVJFX0NPVU5UID0gWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZUltcGwgPGVtPlhtbCBTZWNvbmRhcnkgVGFibGUgSW1wbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlY29uZGFyeVRhYmxlSW1wbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTCA9IDgzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fQ0FUQUxPRyA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19DQVRBTE9HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9JTVBMX19TQ0hFTUEgPSBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fU0NIRU1BOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX0lNUExfX1VOSVFVRV9DT05TVFJBSU5UUyA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZSBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvciA8ZW0+WG1sIEdlbmVyYXRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1IgPSA4NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVE9SX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbGxvY2F0aW9uIFNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEdlbmVyYXRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SID0gODU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fTkFNRSA9IFhNTF9HRU5FUkFUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRSA9IFhNTF9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsb2NhdGlvbiBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUgPSBYTUxfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0VRVUVOQ0VfTkFNRSA9IFhNTF9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCA9IFhNTF9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwgPGVtPlhtbCBTZXF1ZW5jZSBHZW5lcmF0b3IgSW1wbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTCA9IDg2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fTkFNRSA9IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19JTklUSUFMX1ZBTFVFID0gWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbGxvY2F0aW9uIFNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fQUxMT0NBVElPTl9TSVpFID0gWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fU0VRVUVOQ0VfTkFNRSA9IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX1NFUVVFTkNFX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvciBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZyA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMX1JFU1VMVF9TRVRfTUFQUElORyA9IDg3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBSZXN1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0VOVElUWV9SRVNVTFRTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gUmVzdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19DT0xVTU5fUkVTVUxUUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciA8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SID0gODg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fTkFNRSA9IFhNTF9HRU5FUkFUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRSA9IFhNTF9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsb2NhdGlvbiBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUgPSBYTUxfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1RBQkxFID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19DQVRBTE9HID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1NDSEVNQSA9IFhNTF9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGsgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9OQU1FID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fVkFMVUVfQ09MVU1OX05BTUUgPSBYTUxfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBrIENvbHVtbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX1ZBTFVFID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVGFibGUgR2VuZXJhdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9ySW1wbCA8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvciBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMID0gODk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19OQU1FID0gWE1MX1RBQkxFX0dFTkVSQVRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0lOSVRJQUxfVkFMVUUgPSBYTUxfVEFCTEVfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19BTExPQ0FUSU9OX1NJWkUgPSBYTUxfVEFCTEVfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fVEFCTEUgPSBYTUxfVEFCTEVfR0VORVJBVE9SX19UQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0NBVEFMT0cgPSBYTUxfVEFCTEVfR0VORVJBVE9SX19DQVRBTE9HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19TQ0hFTUEgPSBYTUxfVEFCTEVfR0VORVJBVE9SX19TQ0hFTUE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGsgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fUEtfQ09MVU1OX05BTUUgPSBYTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19WQUxVRV9DT0xVTU5fTkFNRSA9IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1ZBTFVFX0NPTFVNTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBrIENvbHVtbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19QS19DT0xVTU5fVkFMVUUgPSBYTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fVU5JUVVFX0NPTlNUUkFJTlRTID0gWE1MX1RBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3IgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9GRUFUVVJFX0NPVU5UID0gWE1MX1RBQkxFX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQgPGVtPlhtbCBVbmlxdWUgQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxVbmlxdWVDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSVFVRV9DT05TVFJBSU5UID0gOTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklRVUVfQ09OU1RSQUlOVF9fQ09MVU1OX05BTUVTID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVU5JUVVFX0NPTlNUUkFJTlRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50SW1wbCA8ZW0+WG1sIFVuaXF1ZSBDb25zdHJhaW50IEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSVFVRV9DT05TVFJBSU5UX0lNUEwgPSA5MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSVFVRV9DT05TVFJBSU5UX0lNUExfX0NPTFVNTl9OQU1FUyA9IFhNTF9VTklRVUVfQ09OU1RSQUlOVF9fQ09MVU1OX05BTUVTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBVbmlxdWUgQ29uc3RyYWludCBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSVFVRV9DT05TVFJBSU5UX0lNUExfRkVBVFVSRV9DT1VOVCA9IFhNTF9VTklRVUVfQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUgPGVtPkFjY2VzcyBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWNjZXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VTU19UWVBFID0gOTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZSA8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldERpc2NyaW1pbmF0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ1JJTUlOQVRPUl9UWVBFID0gOTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZSA8ZW0+RW51bSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudW1UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5VTV9UWVBFID0gOTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUgPGVtPkZldGNoIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEZldGNoVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFVENIX1RZUEUgPSA5NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlIDxlbT5HZW5lcmF0aW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0R2VuZXJhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUkFUSU9OX1RZUEUgPSA5NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZSA8ZW0+SW5oZXJpdGFuY2UgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0SW5oZXJpdGFuY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5IRVJJVEFOQ0VfVFlQRSA9IDk3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlIDxlbT5UZW1wb3JhbCBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRUZW1wb3JhbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURU1QT1JBTF9UWVBFID0gOTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXREaXNjcmltaW5hdG9yVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDUklNSU5BVE9SX1ZBTFVFID0gOTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW51bWVyYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVU1FUkFURUQgPSAxMDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk9yZGVyIEJ5PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0T3JkZXJCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SREVSX0JZID0gMTAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5WZXJzaW9uIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRWZXJzaW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fVFlQRSA9IDEwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0WG1sVHlwZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW1iZWRkYWJsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhdHRyaWJ1dGVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbHVtbk1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxJZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxJZEltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYmFzZVhtbEVtYmVkZGVkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGVkSWRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW1iZWRkZWRJZEltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNJbXBsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFZlcnNpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVmVyc2lvbkltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvT25lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hbnlUb09uZUltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE9uZVRvTWFueUltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9PbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9PbmVJbXBsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hbnlUb01hbnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvTWFueUltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW1iZWRkZWRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW1iZWRkZWRJbXBsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRyYW5zaWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxUcmFuc2llbnRJbXBsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQXR0cmlidXRlT3ZlcnJpZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhc2NhZGVUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhc2NhZGVUeXBlSW1wbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxOYW1lZENvbHVtbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFhtbE5hbWVkQ29sdW1uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEFic3RyYWN0Q29sdW1uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ29sdW1uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENvbHVtbkltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29sdW1uUmVzdWx0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZW50aXR5TGlzdGVuZXJzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVudGl0eUxpc3RlbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVudGl0eVJlc3VsdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmaWVsZFJlc3VsdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxHZW5lcmF0ZWRWYWx1ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxHZW5lcmF0ZWRWYWx1ZUltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSWRDbGFzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbmhlcml0YW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxKb2luQ29sdW1uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEpvaW5Db2x1bW5JbXBsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEpvaW5UYWJsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxKb2luVGFibGVJbXBsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvYkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtYXBLZXlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWFwS2V5SW1wbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxRdWVyeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxOYW1lZE5hdGl2ZVF1ZXJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE5hbWVkUXVlcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXZlbnRNZXRob2RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcG9zdExvYWRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcG9zdFBlcnNpc3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcG9zdFJlbW92ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwb3N0VXBkYXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByZVBlcnNpc3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJlUmVtb3ZlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByZVVwZGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUXVlcnlIaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0WG1sQmFzZVRhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhc2VUYWJsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxUYWJsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxTZWNvbmRhcnlUYWJsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxTZWNvbmRhcnlUYWJsZUltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sR2VuZXJhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFNlcXVlbmNlR2VuZXJhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzcWxSZXN1bHRTZXRNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRhYmxlR2VuZXJhdG9ySW1wbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxVbmlxdWVDb25zdHJhaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gYWNjZXNzVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZGlzY3JpbWluYXRvclR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGVudW1UeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBmZXRjaFR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGdlbmVyYXRpb25UeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBpbmhlcml0YW5jZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHRlbXBvcmFsVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGRpc2NyaW1pbmF0b3JWYWx1ZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlbnVtZXJhdGVkRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG9yZGVyQnlFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdmVyc2lvblR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE9ybVBhY2thZ2UoKQotCXsKLQkJc3VwZXIoZU5TX1VSSSwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1QYWNrYWdlIGluaXQoKQotCXsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKE9ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCU9ybVBhY2thZ2UgdGhlT3JtUGFja2FnZSA9IChPcm1QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIE9ybVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBPcm1QYWNrYWdlKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVBlcnNpc3RlbmNlUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVBhY2thZ2UgPSAoUGVyc2lzdGVuY2VQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgOiBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVQZXJzaXN0ZW5jZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVPcm1QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlUGVyc2lzdGVuY2VQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZU9ybVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZU9ybVBhY2thZ2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eU1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiB4bWxFbnRpdHlNYXBwaW5nc0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5TWFwcGluZ3NfVmVyc2lvbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVudGl0eU1hcHBpbmdzX0Rlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPGVtPlBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0UGFja2FnZSA8ZW0+UGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0UGFja2FnZSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19QYWNrYWdlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY2hlbWE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U2NoZW1hKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVudGl0eU1hcHBpbmdzX1NjaGVtYSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXRhbG9nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldENhdGFsb2coKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5TWFwcGluZ3NfQ2F0YWxvZygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEFjY2VzcyA8ZW0+QWNjZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWNjZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEFjY2VzcygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19BY2Nlc3MoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFNlcXVlbmNlR2VuZXJhdG9ycyA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfU2VxdWVuY2VHZW5lcmF0b3JzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRUYWJsZUdlbmVyYXRvcnMgPGVtPlRhYmxlIEdlbmVyYXRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRhYmxlIEdlbmVyYXRvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0VGFibGVHZW5lcmF0b3JzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX1RhYmxlR2VuZXJhdG9ycygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0TmFtZWRRdWVyaWVzIDxlbT5OYW1lZCBRdWVyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5OYW1lZCBRdWVyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldE5hbWVkUXVlcmllcygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19OYW1lZFF1ZXJpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldE5hbWVkTmF0aXZlUXVlcmllcyA8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldE5hbWVkTmF0aXZlUXVlcmllcygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19OYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncyA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX1NxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0TWFwcGVkU3VwZXJjbGFzc2VzIDxlbT5NYXBwZWQgU3VwZXJjbGFzc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXBwZWQgU3VwZXJjbGFzc2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldE1hcHBlZFN1cGVyY2xhc3NlcygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19NYXBwZWRTdXBlcmNsYXNzZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRFbnRpdGllcyA8ZW0+RW50aXRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVudGl0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEVudGl0aWVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX0VudGl0aWVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0RW1iZWRkYWJsZXMgPGVtPkVtYmVkZGFibGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbWJlZGRhYmxlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRFbWJlZGRhYmxlcygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19FbWJlZGRhYmxlcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCXsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSA8ZW0+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YbWwgTWFwcGluZyBNZXRhZGF0YSBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSNpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI2dldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQl7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NoZW1hPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldFNjaGVtYSgpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19TY2hlbWEoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2F0YWxvZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRDYXRhbG9nKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0NhdGFsb2coKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRBY2Nlc3MgPGVtPkFjY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRBY2Nlc3MoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQWNjZXNzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjaXNDYXNjYWRlUGVyc2lzdCA8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2lzQ2FzY2FkZVBlcnNpc3QoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQ2FzY2FkZVBlcnNpc3QoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRFbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldEVudGl0eUxpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19FbnRpdHlMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyA8ZW0+QWJzdHJhY3QgWG1sIFR5cGUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBYbWwgVHlwZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiBhYnN0cmFjdFhtbFR5cGVNYXBwaW5nRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19DbGFzc05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFic3RyYWN0WG1sVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcjZ2V0QWNjZXNzIDxlbT5BY2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXRBY2Nlc3MoKQotCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0FjY2VzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWJzdHJhY3RYbWxUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXRNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcjZ2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfTWV0YWRhdGFDb21wbGV0ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWJzdHJhY3RYbWxUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19EZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWJzdHJhY3RYbWxUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXRBdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFic3RyYWN0WG1sVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRJZENsYXNzIDxlbT5JZCBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPklkIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0SWRDbGFzcygpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfSWRDbGFzcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIDxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEVudGl0eUxpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRW50aXR5TGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByZVBlcnNpc3QgPGVtPlByZSBQZXJzaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlIFBlcnNpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19QcmVQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFBvc3RQZXJzaXN0IDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQb3N0UGVyc2lzdCgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFBlcnNpc3QoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UHJlUmVtb3ZlIDxlbT5QcmUgUmVtb3ZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlIFJlbW92ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByZVJlbW92ZSgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUHJlUmVtb3ZlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQb3N0UmVtb3ZlKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Qb3N0UmVtb3ZlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZSBVcGRhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQcmVVcGRhdGUoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1ByZVVwZGF0ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3QgVXBkYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UG9zdFVwZGF0ZSgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFVwZGF0ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBMb2FkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UG9zdExvYWQoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RMb2FkKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSA8ZW0+WG1sIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eSgpCi0JewotCQlyZXR1cm4geG1sRW50aXR5RUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0VGFibGUgPGVtPlRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFRhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfVGFibGUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0U2Vjb25kYXJ5VGFibGVzIDxlbT5TZWNvbmRhcnkgVGFibGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWNvbmRhcnkgVGFibGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTZWNvbmRhcnlUYWJsZXMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9TZWNvbmRhcnlUYWJsZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zIDxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJZENsYXNzIDxlbT5JZCBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPklkIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJZENsYXNzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfSWRDbGFzcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0SW5oZXJpdGFuY2UgPGVtPkluaGVyaXRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5oZXJpdGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEluaGVyaXRhbmNlKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfSW5oZXJpdGFuY2UoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldERpc2NyaW1pbmF0b3JWYWx1ZSA8ZW0+RGlzY3JpbWluYXRvciBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldERpc2NyaW1pbmF0b3JWYWx1ZSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5X0Rpc2NyaW1pbmF0b3JWYWx1ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0RGlzY3JpbWluYXRvckNvbHVtbiA8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5EaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X0Rpc2NyaW1pbmF0b3JDb2x1bW4oKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFNlcXVlbmNlR2VuZXJhdG9yIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfU2VxdWVuY2VHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFRhYmxlR2VuZXJhdG9yIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfVGFibGVHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0TmFtZWRRdWVyaWVzIDxlbT5OYW1lZCBRdWVyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5OYW1lZCBRdWVyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXROYW1lZFF1ZXJpZXMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9OYW1lZFF1ZXJpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE5hbWVkTmF0aXZlUXVlcmllcyA8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9OYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFNxbFJlc3VsdFNldE1hcHBpbmdzIDxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIDxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5X0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyA8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVudGl0eV9FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEVudGl0eUxpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X0VudGl0eUxpc3RlbmVycygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByZVBlcnNpc3QgPGVtPlByZSBQZXJzaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlIFBlcnNpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByZVBlcnNpc3QoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9QcmVQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UG9zdFBlcnNpc3QgPGVtPlBvc3QgUGVyc2lzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3QgUGVyc2lzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UG9zdFBlcnNpc3QoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9Qb3N0UGVyc2lzdCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZSBSZW1vdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByZVJlbW92ZSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X1ByZVJlbW92ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFBvc3RSZW1vdmUoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9Qb3N0UmVtb3ZlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UHJlVXBkYXRlIDxlbT5QcmUgVXBkYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UHJlVXBkYXRlKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfUHJlVXBkYXRlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qb3N0IFVwZGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UG9zdFVwZGF0ZSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X1Bvc3RVcGRhdGUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBMb2FkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQb3N0TG9hZCgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X1Bvc3RMb2FkKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRBdHRyaWJ1dGVPdmVycmlkZXMgPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X0F0dHJpYnV0ZU92ZXJyaWRlcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMgPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSA8ZW0+WG1sIEVtYmVkZGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGFibGUoKQotCXsKLQkJcmV0dXJuIHhtbEVtYmVkZGFibGVFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBdHRyaWJ1dGVzKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRJZHMgPGVtPklkczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0SWRzKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19JZHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0RW1iZWRkZWRJZHMgPGVtPkVtYmVkZGVkIElkczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW1iZWRkZWQgSWRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0RW1iZWRkZWRJZHMoKQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdHRyaWJ1dGVzX0VtYmVkZGVkSWRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0QmFzaWNzIDxlbT5CYXNpY3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2ljczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldEJhc2ljcygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfQmFzaWNzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFZlcnNpb25zIDxlbT5WZXJzaW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VmVyc2lvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRWZXJzaW9ucygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfVmVyc2lvbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0TWFueVRvT25lcyA8ZW0+TWFueSBUbyBPbmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYW55IFRvIE9uZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRNYW55VG9PbmVzKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19NYW55VG9PbmVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldE9uZVRvTWFueXMgPGVtPk9uZSBUbyBNYW55czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T25lIFRvIE1hbnlzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0T25lVG9NYW55cygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfT25lVG9NYW55cygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXR0cmlidXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldE9uZVRvT25lcyA8ZW0+T25lIFRvIE9uZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk9uZSBUbyBPbmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0T25lVG9PbmVzKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19PbmVUb09uZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0TWFueVRvTWFueXMgPGVtPk1hbnkgVG8gTWFueXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1hbnkgVG8gTWFueXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRNYW55VG9NYW55cygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfTWFueVRvTWFueXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRFbWJlZGRlZHMgPGVtPkVtYmVkZGVkczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW1iZWRkZWRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0RW1iZWRkZWRzKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19FbWJlZGRlZHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0VHJhbnNpZW50cyA8ZW0+VHJhbnNpZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VHJhbnNpZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFRyYW5zaWVudHMoKQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdHRyaWJ1dGVzX1RyYW5zaWVudHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyA8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpCi0JewotCQlyZXR1cm4geG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWJzdHJhY3QgWG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpCi0JewotCQlyZXR1cm4gYWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgTnVsbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTnVsbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxOdWxsQXR0cmlidXRlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nIDxlbT5Db2x1bW4gTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db2x1bW4gTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29sdW1uTWFwcGluZygpCi0JewotCQlyZXR1cm4gY29sdW1uTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uTWFwcGluZyNnZXRDb2x1bW4oKQotCSAqIEBzZWUgI2dldENvbHVtbk1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29sdW1uTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPlhtbCBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIHhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldFRhcmdldEVudGl0eSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBzZWUgI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX1RhcmdldEVudGl0eSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRGZXRjaCA8ZW0+RmV0Y2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GZXRjaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldEZldGNoKCkKLQkgKiBAc2VlICNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19GZXRjaCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRKb2luVGFibGUgPGVtPkpvaW4gVGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Kb2luIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0Sm9pblRhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luVGFibGUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0Q2FzY2FkZSA8ZW0+Q2FzY2FkZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNhc2NhZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRDYXNjYWRlKCkKLQkgKiBAc2VlICNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19DYXNjYWRlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIDxlbT5YbWwgTXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE11bHRpIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpCi0JewotCQlyZXR1cm4geG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE1hcHBlZEJ5IDxlbT5NYXBwZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBwZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE1hcHBlZEJ5KCkKLQkgKiBAc2VlICNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfTWFwcGVkQnkoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE9yZGVyQnkgPGVtPk9yZGVyIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3JkZXIgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE9yZGVyQnkoKQotCSAqIEBzZWUgI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19PcmRlckJ5KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBLZXkgPGVtPk1hcCBLZXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXAgS2V5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBLZXkoKQotCSAqIEBzZWUgI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBLZXkoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPlhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFNpbmdsZSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCi0JewotCQlyZXR1cm4geG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3B0aW9uYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRPcHRpb25hbCgpCi0JICogQHNlZSAjZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfT3B0aW9uYWwoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRKb2luQ29sdW1ucyA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRKb2luQ29sdW1ucygpCi0JICogQHNlZSAjZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pbkNvbHVtbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCA8ZW0+WG1sIElkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBJZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbElkKCkKLQl7Ci0JCXJldHVybiB4bWxJZEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldEdlbmVyYXRlZFZhbHVlIDxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0R2VuZXJhdGVkVmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sSWRfR2VuZXJhdGVkVmFsdWUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbElkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UZW1wb3JhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRUZW1wb3JhbCgpCi0JICogQHNlZSAjZ2V0WG1sSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxJZF9UZW1wb3JhbCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sSWRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldFRhYmxlR2VuZXJhdG9yIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0VGFibGVHZW5lcmF0b3IoKQotCSAqIEBzZWUgI2dldFhtbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sSWRfVGFibGVHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbElkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAc2VlICNnZXRYbWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbElkX1NlcXVlbmNlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxJZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkSW1wbCA8ZW0+WG1sIElkIEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIElkIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRJbXBsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSWRJbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxJZEltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQmFzZVhtbEVtYmVkZGVkIDxlbT5CYXNlIFhtbCBFbWJlZGRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CYXNlIFhtbCBFbWJlZGRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5CYXNlWG1sRW1iZWRkZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCYXNlWG1sRW1iZWRkZWQoKQotCXsKLQkJcmV0dXJuIGJhc2VYbWxFbWJlZGRlZEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQmFzZVhtbEVtYmVkZGVkI2dldEF0dHJpYnV0ZU92ZXJyaWRlcyA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5CYXNlWG1sRW1iZWRkZWQjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAc2VlICNnZXRCYXNlWG1sRW1iZWRkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlWG1sRW1iZWRkZWRfQXR0cmlidXRlT3ZlcnJpZGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSliYXNlWG1sRW1iZWRkZWRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkIDxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGVkIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbWJlZGRlZElkKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZElkRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWRJbXBsIDxlbT5YbWwgRW1iZWRkZWQgSWQgSW1wbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW1iZWRkZWQgSWQgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkSW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGVkSWRJbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZElkSW1wbEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyA8ZW0+WG1sIEJhc2ljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEJhc2ljKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNpY0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZldGNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEZldGNoKCkKLQkgKiBAc2VlICNnZXRYbWxCYXNpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhc2ljX0ZldGNoKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNpY0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3B0aW9uYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0T3B0aW9uYWwoKQotCSAqIEBzZWUgI2dldFhtbEJhc2ljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQmFzaWNfT3B0aW9uYWwoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhc2ljRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNpc0xvYiA8ZW0+TG9iPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9iPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2lzTG9iKCkKLQkgKiBAc2VlICNnZXRYbWxCYXNpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhc2ljX0xvYigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmFzaWNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFRlbXBvcmFsIDxlbT5UZW1wb3JhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRlbXBvcmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFRlbXBvcmFsKCkKLQkgKiBAc2VlICNnZXRYbWxCYXNpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhc2ljX1RlbXBvcmFsKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNpY0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0RW51bWVyYXRlZCA8ZW0+RW51bWVyYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0RW51bWVyYXRlZCgpCi0JICogQHNlZSAjZ2V0WG1sQmFzaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNpY19FbnVtZXJhdGVkKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNpY0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljSW1wbCA8ZW0+WG1sIEJhc2ljIEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEJhc2ljIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNJbXBsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmFzaWNJbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNpY0ltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiA8ZW0+WG1sIFZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFZlcnNpb24oKQotCXsKLQkJcmV0dXJuIHhtbFZlcnNpb25FQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldFRlbXBvcmFsIDxlbT5UZW1wb3JhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRlbXBvcmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0VGVtcG9yYWwoKQotCSAqIEBzZWUgI2dldFhtbFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxWZXJzaW9uX1RlbXBvcmFsKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxWZXJzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbkltcGwgPGVtPlhtbCBWZXJzaW9uIEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFZlcnNpb24gSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uSW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFZlcnNpb25JbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxWZXJzaW9uSW1wbEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUgPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvT25lKCkKLQl7Ci0JCXJldHVybiB4bWxNYW55VG9PbmVFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lSW1wbCA8ZW0+WG1sIE1hbnkgVG8gT25lIEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gT25lIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lSW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hbnlUb09uZUltcGwoKQotCXsKLQkJcmV0dXJuIHhtbE1hbnlUb09uZUltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IDxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9uZSBUbyBNYW55PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvTWFueSgpCi0JewotCQlyZXR1cm4geG1sT25lVG9NYW55RUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0Sm9pbkNvbHVtbnMgPGVtPkpvaW4gQ29sdW1uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRKb2luQ29sdW1ucygpCi0JICogQHNlZSAjZ2V0WG1sT25lVG9NYW55KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sT25lVG9NYW55X0pvaW5Db2x1bW5zKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxPbmVUb01hbnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnlJbXBsIDxlbT5YbWwgT25lIFRvIE1hbnkgSW1wbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE1hbnkgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnlJbXBsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9NYW55SW1wbCgpCi0JewotCQlyZXR1cm4geG1sT25lVG9NYW55SW1wbEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSA8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb09uZSgpCi0JewotCQlyZXR1cm4geG1sT25lVG9PbmVFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRNYXBwZWRCeSA8ZW0+TWFwcGVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldE1hcHBlZEJ5KCkKLQkgKiBAc2VlICNnZXRYbWxPbmVUb09uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9uZVRvT25lX01hcHBlZEJ5KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPbmVUb09uZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldFByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JICogQHNlZSAjZ2V0WG1sT25lVG9PbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxPbmVUb09uZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE9uZVRvT25lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmVJbXBsIDxlbT5YbWwgT25lIFRvIE9uZSBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPbmUgVG8gT25lIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmVJbXBsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9PbmVJbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxPbmVUb09uZUltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSA8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9NYW55KCkKLQl7Ci0JCXJldHVybiB4bWxNYW55VG9NYW55RUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnlJbXBsIDxlbT5YbWwgTWFueSBUbyBNYW55IEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gTWFueSBJbXBsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnlJbXBsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvTWFueUltcGwoKQotCXsKLQkJcmV0dXJuIHhtbE1hbnlUb01hbnlJbXBsRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIDxlbT5YbWwgRW1iZWRkZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkZWQoKQotCXsKLQkJcmV0dXJuIHhtbEVtYmVkZGVkRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSW1wbCA8ZW0+WG1sIEVtYmVkZGVkIEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGVkIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJbXBsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkZWRJbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZEltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IDxlbT5YbWwgVHJhbnNpZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUcmFuc2llbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVHJhbnNpZW50KCkKLQl7Ci0JCXJldHVybiB4bWxUcmFuc2llbnRFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50SW1wbCA8ZW0+WG1sIFRyYW5zaWVudCBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUcmFuc2llbnQgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnRJbXBsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVHJhbnNpZW50SW1wbCgpCi0JewotCQlyZXR1cm4geG1sVHJhbnNpZW50SW1wbEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlIDxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkKLQl7Ci0JCXJldHVybiB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlI2dldEpvaW5Db2x1bW5zIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkpvaW4gQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlI2dldEpvaW5Db2x1bW5zKCkKLQkgKiBAc2VlICNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV9Kb2luQ29sdW1ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEFzc29jaWF0aW9uT3ZlcnJpZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlIEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpCi0JewotCQlyZXR1cm4geG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUgPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkKLQl7Ci0JCXJldHVybiB4bWxBdHRyaWJ1dGVPdmVycmlkZUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29sdW1uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlI2dldENvbHVtbigpCi0JICogQHNlZSAjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9Db2x1bW4oKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlIEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSBJbXBsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpCi0JewotCQlyZXR1cm4geG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlIDxlbT5DYXNjYWRlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2FzY2FkZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2FzY2FkZVR5cGUoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGVUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZUFsbCA8ZW0+Q2FzY2FkZSBBbGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXNjYWRlIEFsbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVBbGwoKQotCSAqIEBzZWUgI2dldENhc2NhZGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZUFsbCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2FzY2FkZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVQZXJzaXN0IDxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGUjaXNDYXNjYWRlUGVyc2lzdCgpCi0JICogQHNlZSAjZ2V0Q2FzY2FkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYXNjYWRlVHlwZV9DYXNjYWRlUGVyc2lzdCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2FzY2FkZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVNZXJnZSA8ZW0+Q2FzY2FkZSBNZXJnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGUgTWVyZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGUjaXNDYXNjYWRlTWVyZ2UoKQotCSAqIEBzZWUgI2dldENhc2NhZGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZU1lcmdlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljYXNjYWRlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVJlbW92ZSA8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXNjYWRlIFJlbW92ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVSZW1vdmUoKQotCSAqIEBzZWUgI2dldENhc2NhZGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVJlbW92ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2FzY2FkZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVSZWZyZXNoIDxlbT5DYXNjYWRlIFJlZnJlc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXNjYWRlIFJlZnJlc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGUjaXNDYXNjYWRlUmVmcmVzaCgpCi0JICogQHNlZSAjZ2V0Q2FzY2FkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYXNjYWRlVHlwZV9DYXNjYWRlUmVmcmVzaCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2FzY2FkZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGVJbXBsIDxlbT5DYXNjYWRlIFR5cGUgSW1wbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DYXNjYWRlIFR5cGUgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZUltcGwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYXNjYWRlVHlwZUltcGwoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGVUeXBlSW1wbEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbiA8ZW0+WG1sIE5hbWVkIENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTmFtZWQgQ29sdW1uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTmFtZWRDb2x1bW4oKQotCXsKLQkJcmV0dXJuIHhtbE5hbWVkQ29sdW1uRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4jZ2V0Q29sdW1uRGVmaW5pdGlvbiA8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbiNnZXRDb2x1bW5EZWZpbml0aW9uKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE5hbWVkQ29sdW1uX0NvbHVtbkRlZmluaXRpb24oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE5hbWVkQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbiNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE5hbWVkQ29sdW1uX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE5hbWVkQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbiA8ZW0+QWJzdHJhY3QgWG1sIE5hbWVkIENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBYbWwgTmFtZWQgQ29sdW1uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbE5hbWVkQ29sdW1uKCkKLQl7Ci0JCXJldHVybiBhYnN0cmFjdFhtbE5hbWVkQ29sdW1uRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uIDxlbT5YbWwgQWJzdHJhY3QgQ29sdW1uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBYnN0cmFjdCBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBYnN0cmFjdENvbHVtbigpCi0JewotCQlyZXR1cm4geG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXRJbnNlcnRhYmxlIDxlbT5JbnNlcnRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXRJbnNlcnRhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxBYnN0cmFjdENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEFic3RyYWN0Q29sdW1uX0luc2VydGFibGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEFic3RyYWN0Q29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXROdWxsYWJsZSA8ZW0+TnVsbGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdWxsYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXROdWxsYWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sQWJzdHJhY3RDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBYnN0cmFjdENvbHVtbl9OdWxsYWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldFRhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxBYnN0cmFjdENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEFic3RyYWN0Q29sdW1uX1RhYmxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBYnN0cmFjdENvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4jZ2V0VW5pcXVlIDxlbT5VbmlxdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VbmlxdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4jZ2V0VW5pcXVlKCkKLQkgKiBAc2VlICNnZXRYbWxBYnN0cmFjdENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEFic3RyYWN0Q29sdW1uX1VuaXF1ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldFVwZGF0YWJsZSA8ZW0+VXBkYXRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXBkYXRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldFVwZGF0YWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sQWJzdHJhY3RDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBYnN0cmFjdENvbHVtbl9VcGRhdGFibGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEFic3RyYWN0Q29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiA8ZW0+QWJzdHJhY3QgWG1sIEFic3RyYWN0IENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBYbWwgQWJzdHJhY3QgQ29sdW1uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uKCkKLQl7Ci0JCXJldHVybiBhYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiA8ZW0+WG1sIENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ29sdW1uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENvbHVtbigpCi0JewotCQlyZXR1cm4geG1sQ29sdW1uRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGVuZ3RoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiNnZXRMZW5ndGgoKQotCSAqIEBzZWUgI2dldFhtbENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbHVtbl9MZW5ndGgoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uI2dldFByZWNpc2lvbiA8ZW0+UHJlY2lzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlY2lzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiNnZXRQcmVjaXNpb24oKQotCSAqIEBzZWUgI2dldFhtbENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbHVtbl9QcmVjaXNpb24oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjYWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiNnZXRTY2FsZSgpCi0JICogQHNlZSAjZ2V0WG1sQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29sdW1uX1NjYWxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW5JbXBsIDxlbT5YbWwgQ29sdW1uIEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvbHVtbiBJbXBsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbkltcGwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb2x1bW5JbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxDb2x1bW5JbXBsRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtblJlc3VsdCA8ZW0+Q29sdW1uIFJlc3VsdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db2x1bW4gUmVzdWx0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtblJlc3VsdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbHVtblJlc3VsdCgpCi0JewotCQlyZXR1cm4gY29sdW1uUmVzdWx0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtblJlc3VsdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5SZXN1bHQjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0Q29sdW1uUmVzdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29sdW1uUmVzdWx0X05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbHVtblJlc3VsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5YbWwgRGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIERpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxEaXNjcmltaW5hdG9yQ29sdW1uKCkKLQl7Ci0JCXJldHVybiB4bWxEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlzY3JpbWluYXRvckNvbHVtbiNnZXREaXNjcmltaW5hdG9yVHlwZSA8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0RGlzY3JpbWluYXRvclR5cGUoKQotCSAqIEBzZWUgI2dldFhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxEaXNjcmltaW5hdG9yQ29sdW1uX0Rpc2NyaW1pbmF0b3JUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXNjcmltaW5hdG9yQ29sdW1uI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGVuZ3RoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0TGVuZ3RoKCkKLQkgKiBAc2VlICNnZXRYbWxEaXNjcmltaW5hdG9yQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbl9MZW5ndGgoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIGVudGl0eUxpc3RlbmVyc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVycyNnZXRFbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXJzI2dldEVudGl0eUxpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0RW50aXR5TGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5TGlzdGVuZXJzX0VudGl0eUxpc3RlbmVycygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5TGlzdGVuZXJzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyIDxlbT5FbnRpdHkgTGlzdGVuZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW50aXR5IExpc3RlbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RW50aXR5TGlzdGVuZXIoKQotCXsKLQkJcmV0dXJuIGVudGl0eUxpc3RlbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUxpc3RlbmVyX0NsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5TGlzdGVuZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQcmVQZXJzaXN0IDxlbT5QcmUgUGVyc2lzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZSBQZXJzaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFByZVBlcnNpc3QoKQotCSAqIEBzZWUgI2dldEVudGl0eUxpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5TGlzdGVuZXJfUHJlUGVyc2lzdCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5TGlzdGVuZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQb3N0UGVyc2lzdCA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBQZXJzaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFBvc3RQZXJzaXN0KCkKLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUxpc3RlbmVyX1Bvc3RQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlMaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZSBSZW1vdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UHJlUmVtb3ZlKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUxpc3RlbmVyX1ByZVJlbW92ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5TGlzdGVuZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQb3N0UmVtb3ZlIDxlbT5Qb3N0IFJlbW92ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3QgUmVtb3ZlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFBvc3RSZW1vdmUoKQotCSAqIEBzZWUgI2dldEVudGl0eUxpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5TGlzdGVuZXJfUG9zdFJlbW92ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5TGlzdGVuZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQcmVVcGRhdGUgPGVtPlByZSBVcGRhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QcmUgVXBkYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFByZVVwZGF0ZSgpCi0JICogQHNlZSAjZ2V0RW50aXR5TGlzdGVuZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlMaXN0ZW5lcl9QcmVVcGRhdGUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUxpc3RlbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qb3N0IFVwZGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQb3N0VXBkYXRlKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUxpc3RlbmVyX1Bvc3RVcGRhdGUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUxpc3RlbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UG9zdExvYWQgPGVtPlBvc3QgTG9hZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3QgTG9hZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQb3N0TG9hZCgpCi0JICogQHNlZSAjZ2V0RW50aXR5TGlzdGVuZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlMaXN0ZW5lcl9Qb3N0TG9hZCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5TGlzdGVuZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0IDxlbT5FbnRpdHkgUmVzdWx0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVudGl0eSBSZXN1bHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RW50aXR5UmVzdWx0KCkKLQl7Ci0JCXJldHVybiBlbnRpdHlSZXN1bHRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0I2dldERpc2NyaW1pbmF0b3JDb2x1bW4gPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0I2dldERpc2NyaW1pbmF0b3JDb2x1bW4oKQotCSAqIEBzZWUgI2dldEVudGl0eVJlc3VsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eVJlc3VsdF9EaXNjcmltaW5hdG9yQ29sdW1uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRpdHlSZXN1bHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlSZXN1bHQjZ2V0RW50aXR5Q2xhc3MgPGVtPkVudGl0eSBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVudGl0eSBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlSZXN1bHQjZ2V0RW50aXR5Q2xhc3MoKQotCSAqIEBzZWUgI2dldEVudGl0eVJlc3VsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eVJlc3VsdF9FbnRpdHlDbGFzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5UmVzdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlSZXN1bHQjZ2V0RmllbGRSZXN1bHRzIDxlbT5GaWVsZCBSZXN1bHRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5GaWVsZCBSZXN1bHRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdCNnZXRGaWVsZFJlc3VsdHMoKQotCSAqIEBzZWUgI2dldEVudGl0eVJlc3VsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eVJlc3VsdF9GaWVsZFJlc3VsdHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eVJlc3VsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GaWVsZFJlc3VsdCA8ZW0+RmllbGQgUmVzdWx0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZpZWxkIFJlc3VsdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GaWVsZFJlc3VsdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZpZWxkUmVzdWx0KCkKLQl7Ci0JCXJldHVybiBmaWVsZFJlc3VsdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GaWVsZFJlc3VsdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GaWVsZFJlc3VsdCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRGaWVsZFJlc3VsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkUmVzdWx0X05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpZWxkUmVzdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmllbGRSZXN1bHQjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmllbGRSZXN1bHQjZ2V0Q29sdW1uKCkKLQkgKiBAc2VlICNnZXRGaWVsZFJlc3VsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkUmVzdWx0X0NvbHVtbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRSZXN1bHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUgPGVtPlhtbCBHZW5lcmF0ZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEdlbmVyYXRlZCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEdlbmVyYXRlZFZhbHVlKCkKLQl7Ci0JCXJldHVybiB4bWxHZW5lcmF0ZWRWYWx1ZUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlI2dldEdlbmVyYXRvciA8ZW0+R2VuZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlI2dldEdlbmVyYXRvcigpCi0JICogQHNlZSAjZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxHZW5lcmF0ZWRWYWx1ZV9HZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEdlbmVyYXRlZFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZSNnZXRTdHJhdGVneSA8ZW0+U3RyYXRlZ3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdHJhdGVneTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZSNnZXRTdHJhdGVneSgpCi0JICogQHNlZSAjZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxHZW5lcmF0ZWRWYWx1ZV9TdHJhdGVneSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sR2VuZXJhdGVkVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZUltcGwgPGVtPlhtbCBHZW5lcmF0ZWQgVmFsdWUgSW1wbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgR2VuZXJhdGVkIFZhbHVlIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWVJbXBsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sR2VuZXJhdGVkVmFsdWVJbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxHZW5lcmF0ZWRWYWx1ZUltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzcyA8ZW0+WG1sIElkIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBJZCBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSWRDbGFzcygpCi0JewotCQlyZXR1cm4geG1sSWRDbGFzc0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkQ2xhc3MjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzI2dldENsYXNzTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sSWRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbElkQ2xhc3NfQ2xhc3NOYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxJZENsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2UgPGVtPkluaGVyaXRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkluaGVyaXRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW5oZXJpdGFuY2UoKQotCXsKLQkJcmV0dXJuIGluaGVyaXRhbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlI2dldFN0cmF0ZWd5IDxlbT5TdHJhdGVneTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0cmF0ZWd5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlI2dldFN0cmF0ZWd5KCkKLQkgKiBAc2VlICNnZXRJbmhlcml0YW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEluaGVyaXRhbmNlX1N0cmF0ZWd5KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbmhlcml0YW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uIDxlbT5YbWwgSm9pbiBDb2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEpvaW4gQ29sdW1uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxKb2luQ29sdW1uKCkKLQl7Ci0JCXJldHVybiB4bWxKb2luQ29sdW1uRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbiNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbiNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sSm9pbkNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEpvaW5Db2x1bW5fUmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEpvaW5Db2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uSW1wbCA8ZW0+WG1sIEpvaW4gQ29sdW1uIEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEpvaW4gQ29sdW1uIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbkltcGwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxKb2luQ29sdW1uSW1wbCgpCi0JewotCQlyZXR1cm4geG1sSm9pbkNvbHVtbkltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlIDxlbT5YbWwgSm9pbiBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSm9pbiBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxKb2luVGFibGUoKQotCXsKLQkJcmV0dXJuIHhtbEpvaW5UYWJsZUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlI2dldEpvaW5Db2x1bW5zIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkpvaW4gQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUjZ2V0Sm9pbkNvbHVtbnMoKQotCSAqIEBzZWUgI2dldFhtbEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEpvaW5UYWJsZV9Kb2luQ29sdW1ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sSm9pblRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZSNnZXRJbnZlcnNlSm9pbkNvbHVtbnMgPGVtPkludmVyc2UgSm9pbiBDb2x1bW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnZlcnNlIEpvaW4gQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUjZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkKLQkgKiBAc2VlICNnZXRYbWxKb2luVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxKb2luVGFibGVfSW52ZXJzZUpvaW5Db2x1bW5zKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxKb2luVGFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVJbXBsIDxlbT5YbWwgSm9pbiBUYWJsZSBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBKb2luIFRhYmxlIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlSW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEpvaW5UYWJsZUltcGwoKQotCXsKLQkJcmV0dXJuIHhtbEpvaW5UYWJsZUltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTG9iIDxlbT5Mb2I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TG9iPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkxvYgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExvYigpCi0JewotCQlyZXR1cm4gbG9iRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXkgPGVtPk1hcCBLZXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWFwIEtleTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNYXBLZXkoKQotCXsKLQkJcmV0dXJuIG1hcEtleUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldE1hcEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1hcEtleV9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltYXBLZXlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5SW1wbCA8ZW0+TWFwIEtleSBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1hcCBLZXkgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXlJbXBsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWFwS2V5SW1wbCgpCi0JewotCQlyZXR1cm4gbWFwS2V5SW1wbEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSA8ZW0+WG1sIFF1ZXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBRdWVyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFF1ZXJ5KCkKLQl7Ci0JCXJldHVybiB4bWxRdWVyeUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUXVlcnlfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldFF1ZXJ5IDxlbT5RdWVyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlF1ZXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldFF1ZXJ5KCkKLQkgKiBAc2VlICNnZXRYbWxRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFF1ZXJ5X1F1ZXJ5KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSNnZXRIaW50cyA8ZW0+SGludHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhpbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldEhpbnRzKCkKLQkgKiBAc2VlICNnZXRYbWxRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFF1ZXJ5X0hpbnRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxRdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnkgPGVtPlhtbCBOYW1lZCBOYXRpdmUgUXVlcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE5hbWVkIE5hdGl2ZSBRdWVyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTmFtZWROYXRpdmVRdWVyeSgpCi0JewotCQlyZXR1cm4geG1sTmFtZWROYXRpdmVRdWVyeUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnkjZ2V0UmVzdWx0Q2xhc3MgPGVtPlJlc3VsdCBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3VsdCBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5I2dldFJlc3VsdENsYXNzKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWROYXRpdmVRdWVyeV9SZXN1bHRDbGFzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTmFtZWROYXRpdmVRdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSNnZXRSZXN1bHRTZXRNYXBwaW5nIDxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSNnZXRSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWROYXRpdmVRdWVyeV9SZXN1bHRTZXRNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZE5hdGl2ZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeSA8ZW0+WG1sIE5hbWVkIFF1ZXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBOYW1lZCBRdWVyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTmFtZWRRdWVyeSgpCi0JewotCQlyZXR1cm4geG1sTmFtZWRRdWVyeUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZCA8ZW0+RXZlbnQgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV2ZW50IE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV2ZW50TWV0aG9kKCkKLQl7Ci0JCXJldHVybiBldmVudE1ldGhvZEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkV2ZW50TWV0aG9kI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QjZ2V0TWV0aG9kTmFtZSgpCi0JICogQHNlZSAjZ2V0RXZlbnRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFdmVudE1ldGhvZF9NZXRob2ROYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlldmVudE1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlBvc3RMb2FkIDxlbT5Qb3N0IExvYWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9zdCBMb2FkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlBvc3RMb2FkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UG9zdExvYWQoKQotCXsKLQkJcmV0dXJuIHBvc3RMb2FkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0UGVyc2lzdCA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvc3QgUGVyc2lzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0UGVyc2lzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvc3RQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiBwb3N0UGVyc2lzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFJlbW92ZSA8ZW0+UG9zdCBSZW1vdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFJlbW92ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvc3RSZW1vdmUoKQotCXsKLQkJcmV0dXJuIHBvc3RSZW1vdmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlBvc3RVcGRhdGUgPGVtPlBvc3QgVXBkYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvc3QgVXBkYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlBvc3RVcGRhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQb3N0VXBkYXRlKCkKLQl7Ci0JCXJldHVybiBwb3N0VXBkYXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5QcmVQZXJzaXN0IDxlbT5QcmUgUGVyc2lzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmUgUGVyc2lzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5QcmVQZXJzaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJlUGVyc2lzdCgpCi0JewotCQlyZXR1cm4gcHJlUGVyc2lzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUHJlUmVtb3ZlIDxlbT5QcmUgUmVtb3ZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByZSBSZW1vdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUHJlUmVtb3ZlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJlUmVtb3ZlKCkKLQl7Ci0JCXJldHVybiBwcmVSZW1vdmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmUgVXBkYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlByZVVwZGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByZVVwZGF0ZSgpCi0JewotCQlyZXR1cm4gcHJlVXBkYXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiA8ZW0+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQcmltYXJ5IEtleSBKb2luIENvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkKLQl7Ci0JCXJldHVybiB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lIDxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbl9SZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUHJpbWFyeUtleUpvaW5Db2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwgPGVtPlhtbCBQcmltYXJ5IEtleSBKb2luIENvbHVtbiBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQcmltYXJ5IEtleSBKb2luIENvbHVtbiBJbXBsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpCi0JewotCQlyZXR1cm4geG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludCA8ZW0+WG1sIFF1ZXJ5IEhpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFF1ZXJ5IEhpbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUXVlcnlIaW50KCkKLQl7Ci0JCXJldHVybiB4bWxRdWVyeUhpbnRFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFF1ZXJ5SGludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFF1ZXJ5SGludF9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeUhpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbFF1ZXJ5SGludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFF1ZXJ5SGludF9WYWx1ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUXVlcnlIaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlVGFibGUgPGVtPkFic3RyYWN0IFhtbCBCYXNlIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFhtbCBCYXNlIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQmFzZVRhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RYbWxCYXNlVGFibGUoKQotCXsKLQkJcmV0dXJuIGFic3RyYWN0WG1sQmFzZVRhYmxlRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZSA8ZW0+WG1sIEJhc2UgVGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEJhc2UgVGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmFzZVRhYmxlKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNlVGFibGVFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbEJhc2VUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhc2VUYWJsZV9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNlVGFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZSNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2F0YWxvZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUjZ2V0Q2F0YWxvZygpCi0JICogQHNlZSAjZ2V0WG1sQmFzZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQmFzZVRhYmxlX0NhdGFsb2coKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhc2VUYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NoZW1hPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZSNnZXRTY2hlbWEoKQotCSAqIEBzZWUgI2dldFhtbEJhc2VUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhc2VUYWJsZV9TY2hlbWEoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhc2VUYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUjZ2V0VW5pcXVlQ29uc3RyYWludHMgPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZSNnZXRVbmlxdWVDb25zdHJhaW50cygpCi0JICogQHNlZSAjZ2V0WG1sQmFzZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQmFzZVRhYmxlX1VuaXF1ZUNvbnN0cmFpbnRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxCYXNlVGFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZSA8ZW0+WG1sIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRhYmxlKCkKLQl7Ci0JCXJldHVybiB4bWxUYWJsZUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZSA8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKQotCXsKLQkJcmV0dXJuIHhtbFNlY29uZGFyeVRhYmxlRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZSNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlI2dldFByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JICogQHNlZSAjZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxTZWNvbmRhcnlUYWJsZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFNlY29uZGFyeVRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGVJbXBsIDxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlIEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZSBJbXBsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlSW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFNlY29uZGFyeVRhYmxlSW1wbCgpCi0JewotCQlyZXR1cm4geG1sU2Vjb25kYXJ5VGFibGVJbXBsRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvciA8ZW0+WG1sIEdlbmVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgR2VuZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEdlbmVyYXRvcigpCi0JewotCQlyZXR1cm4geG1sR2VuZXJhdG9yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvciNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxHZW5lcmF0b3JfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0SW5pdGlhbFZhbHVlIDxlbT5Jbml0aWFsIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0SW5pdGlhbFZhbHVlKCkKLQkgKiBAc2VlICNnZXRYbWxHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxHZW5lcmF0b3JfSW5pdGlhbFZhbHVlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvciNnZXRBbGxvY2F0aW9uU2l6ZSA8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvciNnZXRBbGxvY2F0aW9uU2l6ZSgpCi0JICogQHNlZSAjZ2V0WG1sR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sR2VuZXJhdG9yX0FsbG9jYXRpb25TaXplKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgU2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIHhtbFNlcXVlbmNlR2VuZXJhdG9yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3IjZ2V0U2VxdWVuY2VOYW1lIDxlbT5TZXF1ZW5jZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VxdWVuY2UgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvciNnZXRTZXF1ZW5jZU5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfU2VxdWVuY2VOYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxTZXF1ZW5jZUdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCA8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvciBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBTZXF1ZW5jZSBHZW5lcmF0b3IgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwoKQotCXsKLQkJcmV0dXJuIHhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nIDxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNxbFJlc3VsdFNldE1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIHNxbFJlc3VsdFNldE1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFNxbFJlc3VsdFNldE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTcWxSZXN1bHRTZXRNYXBwaW5nX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNxbFJlc3VsdFNldE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcjZ2V0RW50aXR5UmVzdWx0cyA8ZW0+RW50aXR5IFJlc3VsdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVudGl0eSBSZXN1bHRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcjZ2V0RW50aXR5UmVzdWx0cygpCi0JICogQHNlZSAjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNxbFJlc3VsdFNldE1hcHBpbmdfRW50aXR5UmVzdWx0cygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc3FsUmVzdWx0U2V0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZyNnZXRDb2x1bW5SZXN1bHRzIDxlbT5Db2x1bW4gUmVzdWx0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29sdW1uIFJlc3VsdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZyNnZXRDb2x1bW5SZXN1bHRzKCkKLQkgKiBAc2VlICNnZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ19Db2x1bW5SZXN1bHRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzcWxSZXN1bHRTZXRNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yIDxlbT5YbWwgVGFibGUgR2VuZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxUYWJsZUdlbmVyYXRvcigpCi0JewotCQlyZXR1cm4geG1sVGFibGVHZW5lcmF0b3JFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRUYWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sVGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUYWJsZUdlbmVyYXRvcl9UYWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXRhbG9nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldENhdGFsb2coKQotCSAqIEBzZWUgI2dldFhtbFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVGFibGVHZW5lcmF0b3JfQ2F0YWxvZygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NoZW1hPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFNjaGVtYSgpCi0JICogQHNlZSAjZ2V0WG1sVGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUYWJsZUdlbmVyYXRvcl9TY2hlbWEoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRQa0NvbHVtbk5hbWUgPGVtPlBrIENvbHVtbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGsgQ29sdW1uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0UGtDb2x1bW5OYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFRhYmxlR2VuZXJhdG9yX1BrQ29sdW1uTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFZhbHVlQ29sdW1uTmFtZSA8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZSBDb2x1bW4gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRWYWx1ZUNvbHVtbk5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVGFibGVHZW5lcmF0b3JfVmFsdWVDb2x1bW5OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0UGtDb2x1bW5WYWx1ZSA8ZW0+UGsgQ29sdW1uIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGsgQ29sdW1uIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFBrQ29sdW1uVmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVGFibGVHZW5lcmF0b3JfUGtDb2x1bW5WYWx1ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0VW5pcXVlQ29uc3RyYWludHMgPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFVuaXF1ZUNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNnZXRYbWxUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFRhYmxlR2VuZXJhdG9yX1VuaXF1ZUNvbnN0cmFpbnRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9ySW1wbCA8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvciBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3IgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvckltcGwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxUYWJsZUdlbmVyYXRvckltcGwoKQotCXsKLQkJcmV0dXJuIHhtbFRhYmxlR2VuZXJhdG9ySW1wbEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50IDxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFVuaXF1ZSBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxVbmlxdWVDb25zdHJhaW50KCkKLQl7Ci0JCXJldHVybiB4bWxVbmlxdWVDb25zdHJhaW50RUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50I2dldENvbHVtbk5hbWVzIDxlbT5Db2x1bW4gTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkNvbHVtbiBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50I2dldENvbHVtbk5hbWVzKCkKLQkgKiBAc2VlICNnZXRYbWxVbmlxdWVDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVW5pcXVlQ29uc3RyYWludF9Db2x1bW5OYW1lcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVW5pcXVlQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsIDxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQgSW1wbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50SW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxVbmlxdWVDb25zdHJhaW50SW1wbEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUgPGVtPkFjY2VzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+QWNjZXNzIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0QWNjZXNzVHlwZSgpCi0JewotCQlyZXR1cm4gYWNjZXNzVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlIDxlbT5EaXNjcmltaW5hdG9yIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5EaXNjcmltaW5hdG9yIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERpc2NyaW1pbmF0b3JUeXBlKCkKLQl7Ci0JCXJldHVybiBkaXNjcmltaW5hdG9yVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlIDxlbT5FbnVtIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5FbnVtIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldEVudW1UeXBlKCkKLQl7Ci0JCXJldHVybiBlbnVtVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZSA8ZW0+RmV0Y2ggVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkZldGNoIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRGZXRjaFR5cGUoKQotCXsKLQkJcmV0dXJuIGZldGNoVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlIDxlbT5HZW5lcmF0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5HZW5lcmF0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldEdlbmVyYXRpb25UeXBlKCkKLQl7Ci0JCXJldHVybiBnZW5lcmF0aW9uVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZSA8ZW0+SW5oZXJpdGFuY2UgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkluaGVyaXRhbmNlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRJbmhlcml0YW5jZVR5cGUoKQotCXsKLQkJcmV0dXJuIGluaGVyaXRhbmNlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZSA8ZW0+VGVtcG9yYWwgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlRlbXBvcmFsIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRUZW1wb3JhbFR5cGUoKQotCXsKLQkJcmV0dXJuIHRlbXBvcmFsVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5EaXNjcmltaW5hdG9yIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EaXNjcmltaW5hdG9yIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERpc2NyaW1pbmF0b3JWYWx1ZSgpCi0JewotCQlyZXR1cm4gZGlzY3JpbWluYXRvclZhbHVlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvciA8ZW0+RW51bWVyYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RW51bWVyYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVudW1lcmF0ZWQoKQotCXsKLQkJcmV0dXJuIGVudW1lcmF0ZWRFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk9yZGVyIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5PcmRlciBCeTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRPcmRlckJ5KCkKLQl7Ci0JCXJldHVybiBvcmRlckJ5RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5WZXJzaW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlZlcnNpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRWZXJzaW9uVHlwZSgpCi0JewotCQlyZXR1cm4gdmVyc2lvblR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9ybUZhY3RvcnkgZ2V0T3JtRmFjdG9yeSgpCi0JewotCQlyZXR1cm4gKE9ybUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZX01BUFBJTkdTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fVkVSU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX1BBQ0tBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fU0VRVUVOQ0VfR0VORVJBVE9SUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX1RBQkxFX0dFTkVSQVRPUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX01BUFBFRF9TVVBFUkNMQVNTRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19FTlRJVElFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX0VNQkVEREFCTEVTKTsKLQotCQl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTKTsKLQotCQl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19TQ0hFTUEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FUQUxPRyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlMpOwotCi0JCWFic3RyYWN0WG1sVHlwZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWJzdHJhY3RYbWxUeXBlTWFwcGluZ0VDbGFzcywgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWJzdHJhY3RYbWxUeXBlTWFwcGluZ0VDbGFzcywgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhYnN0cmFjdFhtbFR5cGVNYXBwaW5nRUNsYXNzLCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWJzdHJhY3RYbWxUeXBlTWFwcGluZ0VDbGFzcywgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGFic3RyYWN0WG1sVHlwZU1hcHBpbmdFQ2xhc3MsIEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVMpOwotCi0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BUFBFRF9TVVBFUkNMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FTlRJVFlfTElTVEVORVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9QRVJTSVNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUEVSU0lTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUkVNT1ZFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUkVNT1ZFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9VUERBVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9VUERBVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9MT0FEKTsKLQotCQl4bWxFbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1RBQkxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0lEX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19OQU1FRF9RVUVSSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1BPU1RfUEVSU0lTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19QUkVfUkVNT1ZFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1BSRV9VUERBVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fUE9TVF9VUERBVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fUE9TVF9MT0FEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0FUVFJJQlVURV9PVkVSUklERVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQotCQl4bWxFbWJlZGRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERBQkxFKTsKLQotCQlhdHRyaWJ1dGVzRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFUVFJJQlVURVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX0lEUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fRU1CRURERURfSURTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdHRyaWJ1dGVzRUNsYXNzLCBBVFRSSUJVVEVTX19CQVNJQ1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX1ZFUlNJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdHRyaWJ1dGVzRUNsYXNzLCBBVFRSSUJVVEVTX19NQU5ZX1RPX09ORVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX09ORV9UT19NQU5ZUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fT05FX1RPX09ORVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX01BTllfVE9fTUFOWVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX0VNQkVEREVEUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fVFJBTlNJRU5UUyk7Ci0KLQkJeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MsIFhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRSk7Ci0KLQkJYWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElORyk7Ci0KLQkJeG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX05VTExfQVRUUklCVVRFX01BUFBJTkcpOwotCi0JCWNvbHVtbk1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09MVU1OX01BUFBJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbHVtbk1hcHBpbmdFQ2xhc3MsIENPTFVNTl9NQVBQSU5HX19DT0xVTU4pOwotCi0JCXhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0gpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFKTsKLQotCQl4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQUEVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZKTsKLQotCQl4bWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX09QVElPTkFMKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlMpOwotCi0JCXhtbElkRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9JRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sSWRFQ2xhc3MsIFhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxJZEVDbGFzcywgWE1MX0lEX19URU1QT1JBTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sSWRFQ2xhc3MsIFhNTF9JRF9fVEFCTEVfR0VORVJBVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxJZEVDbGFzcywgWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1IpOwotCi0JCXhtbElkSW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSURfSU1QTCk7Ci0KLQkJYmFzZVhtbEVtYmVkZGVkRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJBU0VfWE1MX0VNQkVEREVEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShiYXNlWG1sRW1iZWRkZWRFQ2xhc3MsIEJBU0VfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQotCQl4bWxFbWJlZGRlZElkRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERFRF9JRCk7Ci0KLQkJeG1sRW1iZWRkZWRJZEltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VNQkVEREVEX0lEX0lNUEwpOwotCi0JCXhtbEVtYmVkZGVkRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERFRCk7Ci0KLQkJeG1sRW1iZWRkZWRJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERFRF9JTVBMKTsKLQotCQl4bWxCYXNpY0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTSUMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEJhc2ljRUNsYXNzLCBYTUxfQkFTSUNfX0ZFVENIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxCYXNpY0VDbGFzcywgWE1MX0JBU0lDX19PUFRJT05BTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzaWNFQ2xhc3MsIFhNTF9CQVNJQ19fTE9CKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxCYXNpY0VDbGFzcywgWE1MX0JBU0lDX19URU1QT1JBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzaWNFQ2xhc3MsIFhNTF9CQVNJQ19fRU5VTUVSQVRFRCk7Ci0KLQkJeG1sQmFzaWNJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVNJQ19JTVBMKTsKLQotCQl4bWxWZXJzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9WRVJTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxWZXJzaW9uRUNsYXNzLCBYTUxfVkVSU0lPTl9fVEVNUE9SQUwpOwotCi0JCXhtbFZlcnNpb25JbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9WRVJTSU9OX0lNUEwpOwotCi0JCXhtbE1hbnlUb09uZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFOWV9UT19PTkUpOwotCi0JCXhtbE1hbnlUb09uZUltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BTllfVE9fT05FX0lNUEwpOwotCi0JCXhtbE9uZVRvTWFueUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX01BTlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE9uZVRvTWFueUVDbGFzcywgWE1MX09ORV9UT19NQU5ZX19KT0lOX0NPTFVNTlMpOwotCi0JCXhtbE9uZVRvTWFueUltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09ORV9UT19NQU5ZX0lNUEwpOwotCi0JCXhtbE9uZVRvT25lRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PTkVfVE9fT05FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPbmVUb09uZUVDbGFzcywgWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sT25lVG9PbmVFQ2xhc3MsIFhNTF9PTkVfVE9fT05FX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCi0JCXhtbE9uZVRvT25lSW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX09ORV9JTVBMKTsKLQotCQl4bWxNYW55VG9NYW55RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX01BTlkpOwotCi0JCXhtbE1hbnlUb01hbnlJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX01BTllfSU1QTCk7Ci0KLQkJeG1sVHJhbnNpZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UUkFOU0lFTlQpOwotCi0JCXhtbFRyYW5zaWVudEltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RSQU5TSUVOVF9JTVBMKTsKLQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcywgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVFQ2xhc3MsIFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0lNUEwpOwotCi0JCXhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLCBYTUxfQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU4pOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLCBYTUxfQVRUUklCVVRFX09WRVJSSURFX19OQU1FKTsKLQotCQl4bWxBdHRyaWJ1dGVPdmVycmlkZUltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMKTsKLQotCQljYXNjYWRlVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDQVNDQURFX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNhc2NhZGVUeXBlRUNsYXNzLCBDQVNDQURFX1RZUEVfX0NBU0NBREVfQUxMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjYXNjYWRlVHlwZUVDbGFzcywgQ0FTQ0FERV9UWVBFX19DQVNDQURFX1BFUlNJU1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGNhc2NhZGVUeXBlRUNsYXNzLCBDQVNDQURFX1RZUEVfX0NBU0NBREVfTUVSR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGNhc2NhZGVUeXBlRUNsYXNzLCBDQVNDQURFX1RZUEVfX0NBU0NBREVfUkVNT1ZFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjYXNjYWRlVHlwZUVDbGFzcywgQ0FTQ0FERV9UWVBFX19DQVNDQURFX1JFRlJFU0gpOwotCi0JCWNhc2NhZGVUeXBlSW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDQVNDQURFX1RZUEVfSU1QTCk7Ci0KLQkJeG1sTmFtZWRDb2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX05BTUVEX0NPTFVNTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRDb2x1bW5FQ2xhc3MsIFhNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZENvbHVtbkVDbGFzcywgWE1MX05BTUVEX0NPTFVNTl9fTkFNRSk7Ci0KLQkJYWJzdHJhY3RYbWxOYW1lZENvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OKTsKLQotCQl4bWxBYnN0cmFjdENvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQUJTVFJBQ1RfQ09MVU1OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBYnN0cmFjdENvbHVtbkVDbGFzcywgWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3MsIFhNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBYnN0cmFjdENvbHVtbkVDbGFzcywgWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEFic3RyYWN0Q29sdW1uRUNsYXNzLCBYTUxfQUJTVFJBQ1RfQ09MVU1OX19VTklRVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEFic3RyYWN0Q29sdW1uRUNsYXNzLCBYTUxfQUJTVFJBQ1RfQ09MVU1OX19VUERBVEFCTEUpOwotCi0JCWFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTik7Ci0KLQkJeG1sQ29sdW1uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT0xVTU4pOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENvbHVtbkVDbGFzcywgWE1MX0NPTFVNTl9fTEVOR1RIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb2x1bW5FQ2xhc3MsIFhNTF9DT0xVTU5fX1BSRUNJU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29sdW1uRUNsYXNzLCBYTUxfQ09MVU1OX19TQ0FMRSk7Ci0KLQkJeG1sQ29sdW1uSW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09MVU1OX0lNUEwpOwotCi0JCWNvbHVtblJlc3VsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT0xVTU5fUkVTVUxUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb2x1bW5SZXN1bHRFQ2xhc3MsIENPTFVNTl9SRVNVTFRfX05BTUUpOwotCi0JCXhtbERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzLCBYTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRGlzY3JpbWluYXRvckNvbHVtbkVDbGFzcywgWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEgpOwotCi0JCWVudGl0eUxpc3RlbmVyc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTlRJVFlfTElTVEVORVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlMaXN0ZW5lcnNFQ2xhc3MsIEVOVElUWV9MSVNURU5FUlNfX0VOVElUWV9MSVNURU5FUlMpOwotCi0JCWVudGl0eUxpc3RlbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVOVElUWV9MSVNURU5FUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5TGlzdGVuZXJFQ2xhc3MsIEVOVElUWV9MSVNURU5FUl9fQ0xBU1NfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5TGlzdGVuZXJFQ2xhc3MsIEVOVElUWV9MSVNURU5FUl9fUFJFX1BFUlNJU1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUxpc3RlbmVyRUNsYXNzLCBFTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5TGlzdGVuZXJFQ2xhc3MsIEVOVElUWV9MSVNURU5FUl9fUFJFX1JFTU9WRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5TGlzdGVuZXJFQ2xhc3MsIEVOVElUWV9MSVNURU5FUl9fUE9TVF9SRU1PVkUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUxpc3RlbmVyRUNsYXNzLCBFTlRJVFlfTElTVEVORVJfX1BSRV9VUERBVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUxpc3RlbmVyRUNsYXNzLCBFTlRJVFlfTElTVEVORVJfX1BPU1RfVVBEQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlMaXN0ZW5lckVDbGFzcywgRU5USVRZX0xJU1RFTkVSX19QT1NUX0xPQUQpOwotCi0JCWVudGl0eVJlc3VsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTlRJVFlfUkVTVUxUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlSZXN1bHRFQ2xhc3MsIEVOVElUWV9SRVNVTFRfX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbnRpdHlSZXN1bHRFQ2xhc3MsIEVOVElUWV9SRVNVTFRfX0VOVElUWV9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5UmVzdWx0RUNsYXNzLCBFTlRJVFlfUkVTVUxUX19GSUVMRF9SRVNVTFRTKTsKLQotCQlldmVudE1ldGhvZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFVkVOVF9NRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKGV2ZW50TWV0aG9kRUNsYXNzLCBFVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FKTsKLQotCQlmaWVsZFJlc3VsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGSUVMRF9SRVNVTFQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkUmVzdWx0RUNsYXNzLCBGSUVMRF9SRVNVTFRfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkUmVzdWx0RUNsYXNzLCBGSUVMRF9SRVNVTFRfX0NPTFVNTik7Ci0KLQkJeG1sR2VuZXJhdGVkVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0dFTkVSQVRFRF9WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sR2VuZXJhdGVkVmFsdWVFQ2xhc3MsIFhNTF9HRU5FUkFURURfVkFMVUVfX0dFTkVSQVRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sR2VuZXJhdGVkVmFsdWVFQ2xhc3MsIFhNTF9HRU5FUkFURURfVkFMVUVfX1NUUkFURUdZKTsKLQotCQl4bWxHZW5lcmF0ZWRWYWx1ZUltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMKTsKLQotCQl4bWxJZENsYXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9JRF9DTEFTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sSWRDbGFzc0VDbGFzcywgWE1MX0lEX0NMQVNTX19DTEFTU19OQU1FKTsKLQotCQlpbmhlcml0YW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTkhFUklUQU5DRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW5oZXJpdGFuY2VFQ2xhc3MsIElOSEVSSVRBTkNFX19TVFJBVEVHWSk7Ci0KLQkJeG1sSm9pbkNvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSk9JTl9DT0xVTU4pOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEpvaW5Db2x1bW5FQ2xhc3MsIFhNTF9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSk7Ci0KLQkJeG1sSm9pbkNvbHVtbkltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0pPSU5fQ09MVU1OX0lNUEwpOwotCi0JCXhtbEpvaW5UYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSk9JTl9UQUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sSm9pblRhYmxlRUNsYXNzLCBYTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxKb2luVGFibGVFQ2xhc3MsIFhNTF9KT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUyk7Ci0KLQkJeG1sSm9pblRhYmxlSW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSk9JTl9UQUJMRV9JTVBMKTsKLQotCQlsb2JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTE9CKTsKLQotCQltYXBLZXlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUFQX0tFWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWFwS2V5RUNsYXNzLCBNQVBfS0VZX19OQU1FKTsKLQotCQltYXBLZXlJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1BUF9LRVlfSU1QTCk7Ci0KLQkJeG1sUXVlcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1FVRVJZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeUVDbGFzcywgWE1MX1FVRVJZX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeUVDbGFzcywgWE1MX1FVRVJZX19RVUVSWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUXVlcnlFQ2xhc3MsIFhNTF9RVUVSWV9fSElOVFMpOwotCi0JCXhtbE5hbWVkTmF0aXZlUXVlcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX05BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWROYXRpdmVRdWVyeUVDbGFzcywgWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZE5hdGl2ZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfTkFUSVZFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkcpOwotCi0JCXhtbE5hbWVkUXVlcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX05BTUVEX1FVRVJZKTsKLQotCQlwb3N0TG9hZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1NUX0xPQUQpOwotCi0JCXBvc3RQZXJzaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBPU1RfUEVSU0lTVCk7Ci0KLQkJcG9zdFJlbW92ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1NUX1JFTU9WRSk7Ci0KLQkJcG9zdFVwZGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1NUX1VQREFURSk7Ci0KLQkJcHJlUGVyc2lzdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUkVfUEVSU0lTVCk7Ci0KLQkJcHJlUmVtb3ZlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSRV9SRU1PVkUpOwotCi0JCXByZVVwZGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUkVfVVBEQVRFKTsKLQotCQl4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByaW1hcnlLZXlKb2luQ29sdW1uRUNsYXNzLCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOwotCi0JCXhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTCk7Ci0KLQkJeG1sUXVlcnlIaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9RVUVSWV9ISU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeUhpbnRFQ2xhc3MsIFhNTF9RVUVSWV9ISU5UX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeUhpbnRFQ2xhc3MsIFhNTF9RVUVSWV9ISU5UX19WQUxVRSk7Ci0KLQkJYWJzdHJhY3RYbWxCYXNlVGFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEUpOwotCi0JCXhtbEJhc2VUYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTRV9UQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzZVRhYmxlRUNsYXNzLCBYTUxfQkFTRV9UQUJMRV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzZVRhYmxlRUNsYXNzLCBYTUxfQkFTRV9UQUJMRV9fQ0FUQUxPRyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzZVRhYmxlRUNsYXNzLCBYTUxfQkFTRV9UQUJMRV9fU0NIRU1BKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxCYXNlVGFibGVFQ2xhc3MsIFhNTF9CQVNFX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMpOwotCi0JCXhtbFRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UQUJMRSk7Ci0KLQkJeG1sU2Vjb25kYXJ5VGFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1NFQ09OREFSWV9UQUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sU2Vjb25kYXJ5VGFibGVFQ2xhc3MsIFhNTF9TRUNPTkRBUllfVEFCTEVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0KLQkJeG1sU2Vjb25kYXJ5VGFibGVJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTCk7Ci0KLQkJeG1sR2VuZXJhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9HRU5FUkFUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEdlbmVyYXRvckVDbGFzcywgWE1MX0dFTkVSQVRPUl9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sR2VuZXJhdG9yRUNsYXNzLCBYTUxfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxHZW5lcmF0b3JFQ2xhc3MsIFhNTF9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRSk7Ci0KLQkJeG1sU2VxdWVuY2VHZW5lcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1NFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU2VxdWVuY2VHZW5lcmF0b3JFQ2xhc3MsIFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX1NFUVVFTkNFX05BTUUpOwotCi0JCXhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUEwpOwotCi0JCXNxbFJlc3VsdFNldE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1FMX1JFU1VMVF9TRVRfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc3FsUmVzdWx0U2V0TWFwcGluZ0VDbGFzcywgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc3FsUmVzdWx0U2V0TWFwcGluZ0VDbGFzcywgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fRU5USVRZX1JFU1VMVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNxbFJlc3VsdFNldE1hcHBpbmdFQ2xhc3MsIFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0NPTFVNTl9SRVNVTFRTKTsKLQotCQl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVEFCTEVfR0VORVJBVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUYWJsZUdlbmVyYXRvckVDbGFzcywgWE1MX1RBQkxFX0dFTkVSQVRPUl9fVEFCTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLCBYTUxfVEFCTEVfR0VORVJBVE9SX19DQVRBTE9HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUYWJsZUdlbmVyYXRvckVDbGFzcywgWE1MX1RBQkxFX0dFTkVSQVRPUl9fU0NIRU1BKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUYWJsZUdlbmVyYXRvckVDbGFzcywgWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLCBYTUxfVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MsIFhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9WQUxVRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MsIFhNTF9UQUJMRV9HRU5FUkFUT1JfX1VOSVFVRV9DT05TVFJBSU5UUyk7Ci0KLQkJeG1sVGFibGVHZW5lcmF0b3JJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTCk7Ci0KLQkJeG1sVW5pcXVlQ29uc3RyYWludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVU5JUVVFX0NPTlNUUkFJTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFVuaXF1ZUNvbnN0cmFpbnRFQ2xhc3MsIFhNTF9VTklRVUVfQ09OU1RSQUlOVF9fQ09MVU1OX05BTUVTKTsKLQotCQl4bWxVbmlxdWVDb25zdHJhaW50SW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVU5JUVVFX0NPTlNUUkFJTlRfSU1QTCk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWFjY2Vzc1R5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEFDQ0VTU19UWVBFKTsKLQkJZGlzY3JpbWluYXRvclR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKERJU0NSSU1JTkFUT1JfVFlQRSk7Ci0JCWVudW1UeXBlRUVudW0gPSBjcmVhdGVFRW51bShFTlVNX1RZUEUpOwotCQlmZXRjaFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEZFVENIX1RZUEUpOwotCQlnZW5lcmF0aW9uVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oR0VORVJBVElPTl9UWVBFKTsKLQkJaW5oZXJpdGFuY2VUeXBlRUVudW0gPSBjcmVhdGVFRW51bShJTkhFUklUQU5DRV9UWVBFKTsKLQkJdGVtcG9yYWxUeXBlRUVudW0gPSBjcmVhdGVFRW51bShURU1QT1JBTF9UWVBFKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlkaXNjcmltaW5hdG9yVmFsdWVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCWVudW1lcmF0ZWRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRU5VTUVSQVRFRCk7Ci0JCW9yZGVyQnlFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoT1JERVJfQlkpOwotCQl2ZXJzaW9uVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShWRVJTSU9OX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkpOwotCQl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZygpKTsKLQkJYWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZygpKTsKLQkJeG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7Ci0JCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb2x1bW5NYXBwaW5nKCkpOwotCQl4bWxJZEltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbElkSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbElkKCkpOwotCQliYXNlWG1sRW1iZWRkZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxFbWJlZGRlZElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sRW1iZWRkZWRJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJhc2VYbWxFbWJlZGRlZCgpKTsKLQkJeG1sRW1iZWRkZWRJZEltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbEVtYmVkZGVkSWRJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sRW1iZWRkZWRJZCgpKTsKLQkJeG1sRW1iZWRkZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCYXNlWG1sRW1iZWRkZWQoKSk7Ci0JCXhtbEVtYmVkZGVkSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sRW1iZWRkZWRJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sRW1iZWRkZWQoKSk7Ci0JCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sQmFzaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb2x1bW5NYXBwaW5nKCkpOwotCQl4bWxCYXNpY0ltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbEJhc2ljSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEJhc2ljKCkpOwotCQl4bWxWZXJzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbHVtbk1hcHBpbmcoKSk7Ci0JCXhtbFZlcnNpb25JbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxWZXJzaW9uSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFZlcnNpb24oKSk7Ci0JCXhtbE1hbnlUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7Ci0JCXhtbE1hbnlUb09uZUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbE1hbnlUb09uZUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxNYW55VG9PbmUoKSk7Ci0JCXhtbE9uZVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpKTsKLQkJeG1sT25lVG9NYW55SW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sT25lVG9NYW55SW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE9uZVRvTWFueSgpKTsKLQkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKCkpOwotCQl4bWxPbmVUb09uZUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbE9uZVRvT25lSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE9uZVRvT25lKCkpOwotCQl4bWxNYW55VG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKCkpOwotCQl4bWxNYW55VG9NYW55SW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sTWFueVRvTWFueUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxNYW55VG9NYW55KCkpOwotCQl4bWxUcmFuc2llbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxUcmFuc2llbnRJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxUcmFuc2llbnRJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sVHJhbnNpZW50KCkpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCXhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQljYXNjYWRlVHlwZUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDYXNjYWRlVHlwZSgpKTsKLQkJYWJzdHJhY3RYbWxOYW1lZENvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE5hbWVkQ29sdW1uKCkpOwotCQl4bWxBYnN0cmFjdENvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE5hbWVkQ29sdW1uKCkpOwotCQlhYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpKTsKLQkJYWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEFic3RyYWN0Q29sdW1uKCkpOwotCQl4bWxDb2x1bW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBYnN0cmFjdENvbHVtbigpKTsKLQkJeG1sQ29sdW1uSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4oKSk7Ci0JCXhtbENvbHVtbkltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb2x1bW4oKSk7Ci0JCXhtbERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbE5hbWVkQ29sdW1uKCkpOwotCQl4bWxHZW5lcmF0ZWRWYWx1ZUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJeG1sSm9pbkNvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEFic3RyYWN0Q29sdW1uKCkpOwotCQl4bWxKb2luQ29sdW1uSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4oKSk7Ci0JCXhtbEpvaW5Db2x1bW5JbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sSm9pbkNvbHVtbigpKTsKLQkJeG1sSm9pblRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQmFzZVRhYmxlKCkpOwotCQl4bWxKb2luVGFibGVJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxCYXNlVGFibGUoKSk7Ci0JCXhtbEpvaW5UYWJsZUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxKb2luVGFibGUoKSk7Ci0JCW1hcEtleUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNYXBLZXkoKSk7Ci0JCXhtbE5hbWVkTmF0aXZlUXVlcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxRdWVyeSgpKTsKLQkJeG1sTmFtZWRRdWVyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFF1ZXJ5KCkpOwotCQlwb3N0TG9hZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV2ZW50TWV0aG9kKCkpOwotCQlwb3N0UGVyc2lzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV2ZW50TWV0aG9kKCkpOwotCQlwb3N0UmVtb3ZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXZlbnRNZXRob2QoKSk7Ci0JCXBvc3RVcGRhdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFdmVudE1ldGhvZCgpKTsKLQkJcHJlUGVyc2lzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV2ZW50TWV0aG9kKCkpOwotCQlwcmVSZW1vdmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFdmVudE1ldGhvZCgpKTsKLQkJcHJlVXBkYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXZlbnRNZXRob2QoKSk7Ci0JCXhtbFByaW1hcnlLZXlKb2luQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTmFtZWRDb2x1bW4oKSk7Ci0JCXhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKSk7Ci0JCXhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhYnN0cmFjdFhtbEJhc2VUYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEJhc2VUYWJsZSgpKTsKLQkJeG1sVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEJhc2VUYWJsZSgpKTsKLQkJeG1sU2Vjb25kYXJ5VGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxCYXNlVGFibGUoKSk7Ci0JCXhtbFNlY29uZGFyeVRhYmxlSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQmFzZVRhYmxlKCkpOwotCQl4bWxTZWNvbmRhcnlUYWJsZUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxTZWNvbmRhcnlUYWJsZSgpKTsKLQkJeG1sU2VxdWVuY2VHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxHZW5lcmF0b3IoKSk7Ci0JCXhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEdlbmVyYXRvcigpKTsKLQkJeG1sVGFibGVHZW5lcmF0b3JJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sVGFibGVHZW5lcmF0b3IoKSk7Ci0JCXhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sVW5pcXVlQ29uc3RyYWludCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIlhtbEVudGl0eU1hcHBpbmdzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlNYXBwaW5nc19WZXJzaW9uKCksIHRoaXMuZ2V0VmVyc2lvblR5cGUoKSwgInZlcnNpb24iLCAiMS4wIiwgMSwgMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5TWFwcGluZ3NfRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLCB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlNYXBwaW5nc19QYWNrYWdlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGFja2FnZSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlNYXBwaW5nc19TY2hlbWEoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzY2hlbWEiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5TWFwcGluZ3NfQ2F0YWxvZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNhdGFsb2ciLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5TWFwcGluZ3NfQWNjZXNzKCksIHRoaXMuZ2V0QWNjZXNzVHlwZSgpLCAiYWNjZXNzIiwgIlBST1BFUlRZIiwgMCwgMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzX1NlcXVlbmNlR2VuZXJhdG9ycygpLCB0aGlzLmdldFhtbFNlcXVlbmNlR2VuZXJhdG9yKCksIG51bGwsICJzZXF1ZW5jZUdlbmVyYXRvcnMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzX1RhYmxlR2VuZXJhdG9ycygpLCB0aGlzLmdldFhtbFRhYmxlR2VuZXJhdG9yKCksIG51bGwsICJ0YWJsZUdlbmVyYXRvcnMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzX05hbWVkUXVlcmllcygpLCB0aGlzLmdldFhtbE5hbWVkUXVlcnkoKSwgbnVsbCwgIm5hbWVkUXVlcmllcyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfTmFtZWROYXRpdmVRdWVyaWVzKCksIHRoaXMuZ2V0WG1sTmFtZWROYXRpdmVRdWVyeSgpLCBudWxsLCAibmFtZWROYXRpdmVRdWVyaWVzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19TcWxSZXN1bHRTZXRNYXBwaW5ncygpLCB0aGlzLmdldFNxbFJlc3VsdFNldE1hcHBpbmcoKSwgbnVsbCwgInNxbFJlc3VsdFNldE1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19NYXBwZWRTdXBlcmNsYXNzZXMoKSwgdGhpcy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCksIG51bGwsICJtYXBwZWRTdXBlcmNsYXNzZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzX0VudGl0aWVzKCksIHRoaXMuZ2V0WG1sRW50aXR5KCksIG51bGwsICJlbnRpdGllcyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfRW1iZWRkYWJsZXMoKSwgdGhpcy5nZXRYbWxFbWJlZGRhYmxlKCksIG51bGwsICJlbWJlZGRhYmxlcyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5jbGFzcywgIlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9YbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJ4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLCB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MsIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmNsYXNzLCAiWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX1NjaGVtYSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNjaGVtYSIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19DYXRhbG9nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2F0YWxvZyIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19BY2Nlc3MoKSwgdGhpcy5nZXRBY2Nlc3NUeXBlKCksICJhY2Nlc3MiLCAiUFJPUEVSVFkiLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQ2FzY2FkZVBlcnNpc3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiY2FzY2FkZVBlcnNpc3QiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfRW50aXR5TGlzdGVuZXJzKCksIHRoaXMuZ2V0RW50aXR5TGlzdGVuZXJzKCksIG51bGwsICJlbnRpdHlMaXN0ZW5lcnMiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sVHlwZU1hcHBpbmdFQ2xhc3MsIEFic3RyYWN0WG1sVHlwZU1hcHBpbmcuY2xhc3MsICJBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfQ2xhc3NOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2xhc3NOYW1lIiwgbnVsbCwgMSwgMSwgQWJzdHJhY3RYbWxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19BY2Nlc3MoKSwgdGhpcy5nZXRBY2Nlc3NUeXBlKCksICJhY2Nlc3MiLCAiUFJPUEVSVFkiLCAwLCAxLCBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX01ldGFkYXRhQ29tcGxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAibWV0YWRhdGFDb21wbGV0ZSIsIG51bGwsIDAsIDEsIEFic3RyYWN0WG1sVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEFic3RyYWN0WG1sVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfQXR0cmlidXRlcygpLCB0aGlzLmdldEF0dHJpYnV0ZXMoKSwgbnVsbCwgImF0dHJpYnV0ZXMiLCBudWxsLCAwLCAxLCBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIlhtbE1hcHBlZFN1cGVyY2xhc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfSWRDbGFzcygpLCB0aGlzLmdldFhtbElkQ2xhc3MoKSwgbnVsbCwgImlkQ2xhc3MiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRW50aXR5TGlzdGVuZXJzKCksIHRoaXMuZ2V0RW50aXR5TGlzdGVuZXJzKCksIG51bGwsICJlbnRpdHlMaXN0ZW5lcnMiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1ByZVBlcnNpc3QoKSwgdGhpcy5nZXRQcmVQZXJzaXN0KCksIG51bGwsICJwcmVQZXJzaXN0IiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Qb3N0UGVyc2lzdCgpLCB0aGlzLmdldFBvc3RQZXJzaXN0KCksIG51bGwsICJwb3N0UGVyc2lzdCIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUHJlUmVtb3ZlKCksIHRoaXMuZ2V0UHJlUmVtb3ZlKCksIG51bGwsICJwcmVSZW1vdmUiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RSZW1vdmUoKSwgdGhpcy5nZXRQb3N0UmVtb3ZlKCksIG51bGwsICJwb3N0UmVtb3ZlIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19QcmVVcGRhdGUoKSwgdGhpcy5nZXRQcmVVcGRhdGUoKSwgbnVsbCwgInByZVVwZGF0ZSIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFVwZGF0ZSgpLCB0aGlzLmdldFBvc3RVcGRhdGUoKSwgbnVsbCwgInBvc3RVcGRhdGUiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RMb2FkKCksIHRoaXMuZ2V0UG9zdExvYWQoKSwgbnVsbCwgInBvc3RMb2FkIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVudGl0eUVDbGFzcywgWG1sRW50aXR5LmNsYXNzLCAiWG1sRW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9UYWJsZSgpLCB0aGlzLmdldFhtbFRhYmxlKCksIG51bGwsICJ0YWJsZSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1NlY29uZGFyeVRhYmxlcygpLCB0aGlzLmdldFhtbFNlY29uZGFyeVRhYmxlKCksIG51bGwsICJzZWNvbmRhcnlUYWJsZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCksIHRoaXMuZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKSwgbnVsbCwgInByaW1hcnlLZXlKb2luQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9JZENsYXNzKCksIHRoaXMuZ2V0WG1sSWRDbGFzcygpLCBudWxsLCAiaWRDbGFzcyIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X0luaGVyaXRhbmNlKCksIHRoaXMuZ2V0SW5oZXJpdGFuY2UoKSwgbnVsbCwgImluaGVyaXRhbmNlIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvclZhbHVlKCksIHRoaXMuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCksICJkaXNjcmltaW5hdG9yVmFsdWUiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yQ29sdW1uKCksIHRoaXMuZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbigpLCBudWxsLCAiZGlzY3JpbWluYXRvckNvbHVtbiIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1NlcXVlbmNlR2VuZXJhdG9yKCksIHRoaXMuZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3IoKSwgbnVsbCwgInNlcXVlbmNlR2VuZXJhdG9yIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfVGFibGVHZW5lcmF0b3IoKSwgdGhpcy5nZXRYbWxUYWJsZUdlbmVyYXRvcigpLCBudWxsLCAidGFibGVHZW5lcmF0b3IiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9OYW1lZFF1ZXJpZXMoKSwgdGhpcy5nZXRYbWxOYW1lZFF1ZXJ5KCksIG51bGwsICJuYW1lZFF1ZXJpZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfTmFtZWROYXRpdmVRdWVyaWVzKCksIHRoaXMuZ2V0WG1sTmFtZWROYXRpdmVRdWVyeSgpLCBudWxsLCAibmFtZWROYXRpdmVRdWVyaWVzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1NxbFJlc3VsdFNldE1hcHBpbmdzKCksIHRoaXMuZ2V0U3FsUmVzdWx0U2V0TWFwcGluZygpLCBudWxsLCAic3FsUmVzdWx0U2V0TWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVudGl0eV9FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X0VudGl0eUxpc3RlbmVycygpLCB0aGlzLmdldEVudGl0eUxpc3RlbmVycygpLCBudWxsLCAiZW50aXR5TGlzdGVuZXJzIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfUHJlUGVyc2lzdCgpLCB0aGlzLmdldFByZVBlcnNpc3QoKSwgbnVsbCwgInByZVBlcnNpc3QiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9Qb3N0UGVyc2lzdCgpLCB0aGlzLmdldFBvc3RQZXJzaXN0KCksIG51bGwsICJwb3N0UGVyc2lzdCIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1ByZVJlbW92ZSgpLCB0aGlzLmdldFByZVJlbW92ZSgpLCBudWxsLCAicHJlUmVtb3ZlIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfUG9zdFJlbW92ZSgpLCB0aGlzLmdldFBvc3RSZW1vdmUoKSwgbnVsbCwgInBvc3RSZW1vdmUiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9QcmVVcGRhdGUoKSwgdGhpcy5nZXRQcmVVcGRhdGUoKSwgbnVsbCwgInByZVVwZGF0ZSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1Bvc3RVcGRhdGUoKSwgdGhpcy5nZXRQb3N0VXBkYXRlKCksIG51bGwsICJwb3N0VXBkYXRlIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfUG9zdExvYWQoKSwgdGhpcy5nZXRQb3N0TG9hZCgpLCBudWxsLCAicG9zdExvYWQiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9BdHRyaWJ1dGVPdmVycmlkZXMoKSwgdGhpcy5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZSgpLCBudWxsLCAiYXR0cmlidXRlT3ZlcnJpZGVzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCksIHRoaXMuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZSgpLCBudWxsLCAiYXNzb2NpYXRpb25PdmVycmlkZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW1iZWRkYWJsZUVDbGFzcywgWG1sRW1iZWRkYWJsZS5jbGFzcywgIlhtbEVtYmVkZGFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhhdHRyaWJ1dGVzRUNsYXNzLCBBdHRyaWJ1dGVzLmNsYXNzLCAiQXR0cmlidXRlcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19JZHMoKSwgdGhpcy5nZXRYbWxJZCgpLCBudWxsLCAiaWRzIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfRW1iZWRkZWRJZHMoKSwgdGhpcy5nZXRYbWxFbWJlZGRlZElkKCksIG51bGwsICJlbWJlZGRlZElkcyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBdHRyaWJ1dGVzX0Jhc2ljcygpLCB0aGlzLmdldFhtbEJhc2ljKCksIG51bGwsICJiYXNpY3MiLCBudWxsLCAwLCAtMSwgQXR0cmlidXRlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19WZXJzaW9ucygpLCB0aGlzLmdldFhtbFZlcnNpb24oKSwgbnVsbCwgInZlcnNpb25zIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfTWFueVRvT25lcygpLCB0aGlzLmdldFhtbE1hbnlUb09uZSgpLCBudWxsLCAibWFueVRvT25lcyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBdHRyaWJ1dGVzX09uZVRvTWFueXMoKSwgdGhpcy5nZXRYbWxPbmVUb01hbnkoKSwgbnVsbCwgIm9uZVRvTWFueXMiLCBudWxsLCAwLCAtMSwgQXR0cmlidXRlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19PbmVUb09uZXMoKSwgdGhpcy5nZXRYbWxPbmVUb09uZSgpLCBudWxsLCAib25lVG9PbmVzIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfTWFueVRvTWFueXMoKSwgdGhpcy5nZXRYbWxNYW55VG9NYW55KCksIG51bGwsICJtYW55VG9NYW55cyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBdHRyaWJ1dGVzX0VtYmVkZGVkcygpLCB0aGlzLmdldFhtbEVtYmVkZGVkKCksIG51bGwsICJlbWJlZGRlZHMiLCBudWxsLCAwLCAtMSwgQXR0cmlidXRlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19UcmFuc2llbnRzKCksIHRoaXMuZ2V0WG1sVHJhbnNpZW50KCksIG51bGwsICJ0cmFuc2llbnRzIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzLCAiWG1sQXR0cmlidXRlTWFwcGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MsICJBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmciLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5jbGFzcywgIlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbHVtbk1hcHBpbmdFQ2xhc3MsIENvbHVtbk1hcHBpbmcuY2xhc3MsICJDb2x1bW5NYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKSwgdGhpcy5nZXRYbWxDb2x1bW4oKSwgbnVsbCwgImNvbHVtbiIsIG51bGwsIDAsIDEsIENvbHVtbk1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAiWG1sUmVsYXRpb25zaGlwTWFwcGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFyZ2V0RW50aXR5IiwgbnVsbCwgMCwgMSwgWG1sUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19GZXRjaCgpLCB0aGlzLmdldEZldGNoVHlwZSgpLCAiZmV0Y2giLCAiTEFaWSIsIDAsIDEsIFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCksIHRoaXMuZ2V0WG1sSm9pblRhYmxlKCksIG51bGwsICJqb2luVGFibGUiLCBudWxsLCAwLCAxLCBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKSwgdGhpcy5nZXRDYXNjYWRlVHlwZSgpLCBudWxsLCAiY2FzY2FkZSIsIG51bGwsIDAsIDEsIFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBwZWRCeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZEJ5IiwgbnVsbCwgMCwgMSwgWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfT3JkZXJCeSgpLCB0aGlzLmdldE9yZGVyQnkoKSwgIm9yZGVyQnkiLCBudWxsLCAwLCAxLCBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBLZXkoKSwgdGhpcy5nZXRNYXBLZXkoKSwgbnVsbCwgIm1hcEtleSIsIG51bGwsIDAsIDEsIFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICJYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19PcHRpb25hbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJvcHRpb25hbCIsIG51bGwsIDAsIDEsIFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxKb2luQ29sdW1uKCksIG51bGwsICJqb2luQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sSWRFQ2xhc3MsIFhtbElkLmNsYXNzLCAiWG1sSWQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxJZF9HZW5lcmF0ZWRWYWx1ZSgpLCB0aGlzLmdldFhtbEdlbmVyYXRlZFZhbHVlKCksIG51bGwsICJnZW5lcmF0ZWRWYWx1ZSIsIG51bGwsIDAsIDEsIFhtbElkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxJZF9UZW1wb3JhbCgpLCB0aGlzLmdldFRlbXBvcmFsVHlwZSgpLCAidGVtcG9yYWwiLCBudWxsLCAwLCAxLCBYbWxJZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sSWRfVGFibGVHZW5lcmF0b3IoKSwgdGhpcy5nZXRYbWxUYWJsZUdlbmVyYXRvcigpLCBudWxsLCAidGFibGVHZW5lcmF0b3IiLCBudWxsLCAwLCAxLCBYbWxJZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sSWRfU2VxdWVuY2VHZW5lcmF0b3IoKSwgdGhpcy5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpLCBudWxsLCAic2VxdWVuY2VHZW5lcmF0b3IiLCBudWxsLCAwLCAxLCBYbWxJZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbElkSW1wbEVDbGFzcywgWG1sSWRJbXBsLmNsYXNzLCAiWG1sSWRJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoYmFzZVhtbEVtYmVkZGVkRUNsYXNzLCBCYXNlWG1sRW1iZWRkZWQuY2xhc3MsICJCYXNlWG1sRW1iZWRkZWQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRCYXNlWG1sRW1iZWRkZWRfQXR0cmlidXRlT3ZlcnJpZGVzKCksIHRoaXMuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKSwgbnVsbCwgImF0dHJpYnV0ZU92ZXJyaWRlcyIsIG51bGwsIDAsIC0xLCBCYXNlWG1sRW1iZWRkZWQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbWJlZGRlZElkRUNsYXNzLCBYbWxFbWJlZGRlZElkLmNsYXNzLCAiWG1sRW1iZWRkZWRJZCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbWJlZGRlZElkSW1wbEVDbGFzcywgWG1sRW1iZWRkZWRJZEltcGwuY2xhc3MsICJYbWxFbWJlZGRlZElkSW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGVkRUNsYXNzLCBYbWxFbWJlZGRlZC5jbGFzcywgIlhtbEVtYmVkZGVkIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGVkSW1wbEVDbGFzcywgWG1sRW1iZWRkZWRJbXBsLmNsYXNzLCAiWG1sRW1iZWRkZWRJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQmFzaWNFQ2xhc3MsIFhtbEJhc2ljLmNsYXNzLCAiWG1sQmFzaWMiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNpY19GZXRjaCgpLCB0aGlzLmdldEZldGNoVHlwZSgpLCAiZmV0Y2giLCAiTEFaWSIsIDAsIDEsIFhtbEJhc2ljLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNpY19PcHRpb25hbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJvcHRpb25hbCIsIG51bGwsIDAsIDEsIFhtbEJhc2ljLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNpY19Mb2IoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAibG9iIiwgbnVsbCwgMCwgMSwgWG1sQmFzaWMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhc2ljX1RlbXBvcmFsKCksIHRoaXMuZ2V0VGVtcG9yYWxUeXBlKCksICJ0ZW1wb3JhbCIsIG51bGwsIDAsIDEsIFhtbEJhc2ljLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNpY19FbnVtZXJhdGVkKCksIHRoaXMuZ2V0RW51bVR5cGUoKSwgImVudW1lcmF0ZWQiLCBudWxsLCAwLCAxLCBYbWxCYXNpYy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEJhc2ljSW1wbEVDbGFzcywgWG1sQmFzaWNJbXBsLmNsYXNzLCAiWG1sQmFzaWNJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVmVyc2lvbkVDbGFzcywgWG1sVmVyc2lvbi5jbGFzcywgIlhtbFZlcnNpb24iLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxWZXJzaW9uX1RlbXBvcmFsKCksIHRoaXMuZ2V0VGVtcG9yYWxUeXBlKCksICJ0ZW1wb3JhbCIsIG51bGwsIDAsIDEsIFhtbFZlcnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxWZXJzaW9uSW1wbEVDbGFzcywgWG1sVmVyc2lvbkltcGwuY2xhc3MsICJYbWxWZXJzaW9uSW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb09uZUVDbGFzcywgWG1sTWFueVRvT25lLmNsYXNzLCAiWG1sTWFueVRvT25lIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb09uZUltcGxFQ2xhc3MsIFhtbE1hbnlUb09uZUltcGwuY2xhc3MsICJYbWxNYW55VG9PbmVJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sT25lVG9NYW55RUNsYXNzLCBYbWxPbmVUb01hbnkuY2xhc3MsICJYbWxPbmVUb01hbnkiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxPbmVUb01hbnlfSm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxKb2luQ29sdW1uKCksIG51bGwsICJqb2luQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxPbmVUb01hbnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPbmVUb01hbnlJbXBsRUNsYXNzLCBYbWxPbmVUb01hbnlJbXBsLmNsYXNzLCAiWG1sT25lVG9NYW55SW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE9uZVRvT25lRUNsYXNzLCBYbWxPbmVUb09uZS5jbGFzcywgIlhtbE9uZVRvT25lIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT25lVG9PbmVfTWFwcGVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWRCeSIsIG51bGwsIDAsIDEsIFhtbE9uZVRvT25lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxPbmVUb09uZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpLCBudWxsLCAicHJpbWFyeUtleUpvaW5Db2x1bW5zIiwgbnVsbCwgMCwgLTEsIFhtbE9uZVRvT25lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT25lVG9PbmVJbXBsRUNsYXNzLCBYbWxPbmVUb09uZUltcGwuY2xhc3MsICJYbWxPbmVUb09uZUltcGwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYW55VG9NYW55RUNsYXNzLCBYbWxNYW55VG9NYW55LmNsYXNzLCAiWG1sTWFueVRvTWFueSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYW55VG9NYW55SW1wbEVDbGFzcywgWG1sTWFueVRvTWFueUltcGwuY2xhc3MsICJYbWxNYW55VG9NYW55SW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFRyYW5zaWVudEVDbGFzcywgWG1sVHJhbnNpZW50LmNsYXNzLCAiWG1sVHJhbnNpZW50IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFRyYW5zaWVudEltcGxFQ2xhc3MsIFhtbFRyYW5zaWVudEltcGwuY2xhc3MsICJYbWxUcmFuc2llbnRJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcywgWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgIlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlX0pvaW5Db2x1bW5zKCksIHRoaXMuZ2V0WG1sSm9pbkNvbHVtbigpLCBudWxsLCAiam9pbkNvbHVtbnMiLCBudWxsLCAxLCAtMSwgWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbEVDbGFzcywgWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwuY2xhc3MsICJYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLCBYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgIlhtbEF0dHJpYnV0ZU92ZXJyaWRlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfQ29sdW1uKCksIHRoaXMuZ2V0WG1sQ29sdW1uKCksIG51bGwsICJjb2x1bW4iLCBudWxsLCAxLCAxLCBYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbEVDbGFzcywgWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsLmNsYXNzLCAiWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY2FzY2FkZVR5cGVFQ2xhc3MsIENhc2NhZGVUeXBlLmNsYXNzLCAiQ2FzY2FkZVR5cGUiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDYXNjYWRlVHlwZV9DYXNjYWRlQWxsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImNhc2NhZGVBbGwiLCBudWxsLCAwLCAxLCBDYXNjYWRlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVBlcnNpc3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiY2FzY2FkZVBlcnNpc3QiLCBudWxsLCAwLCAxLCBDYXNjYWRlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZU1lcmdlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImNhc2NhZGVNZXJnZSIsIG51bGwsIDAsIDEsIENhc2NhZGVUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDYXNjYWRlVHlwZV9DYXNjYWRlUmVtb3ZlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImNhc2NhZGVSZW1vdmUiLCBudWxsLCAwLCAxLCBDYXNjYWRlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVJlZnJlc2goKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiY2FzY2FkZVJlZnJlc2giLCBudWxsLCAwLCAxLCBDYXNjYWRlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNhc2NhZGVUeXBlSW1wbEVDbGFzcywgQ2FzY2FkZVR5cGVJbXBsLmNsYXNzLCAiQ2FzY2FkZVR5cGVJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sTmFtZWRDb2x1bW5FQ2xhc3MsIFhtbE5hbWVkQ29sdW1uLmNsYXNzLCAiWG1sTmFtZWRDb2x1bW4iLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZENvbHVtbl9Db2x1bW5EZWZpbml0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29sdW1uRGVmaW5pdGlvbiIsIG51bGwsIDAsIDEsIFhtbE5hbWVkQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZENvbHVtbl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbE5hbWVkQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWJzdHJhY3RYbWxOYW1lZENvbHVtbkVDbGFzcywgQWJzdHJhY3RYbWxOYW1lZENvbHVtbi5jbGFzcywgIkFic3RyYWN0WG1sTmFtZWRDb2x1bW4iLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEFic3RyYWN0Q29sdW1uRUNsYXNzLCBYbWxBYnN0cmFjdENvbHVtbi5jbGFzcywgIlhtbEFic3RyYWN0Q29sdW1uIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQWJzdHJhY3RDb2x1bW5fSW5zZXJ0YWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJpbnNlcnRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sQWJzdHJhY3RDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEFic3RyYWN0Q29sdW1uX051bGxhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgIm51bGxhYmxlIiwgbnVsbCwgMCwgMSwgWG1sQWJzdHJhY3RDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEFic3RyYWN0Q29sdW1uX1RhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFibGUiLCBudWxsLCAwLCAxLCBYbWxBYnN0cmFjdENvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQWJzdHJhY3RDb2x1bW5fVW5pcXVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInVuaXF1ZSIsIG51bGwsIDAsIDEsIFhtbEFic3RyYWN0Q29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxBYnN0cmFjdENvbHVtbl9VcGRhdGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAidXBkYXRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sQWJzdHJhY3RDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uRUNsYXNzLCBBYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uLmNsYXNzLCAiQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ29sdW1uRUNsYXNzLCBYbWxDb2x1bW4uY2xhc3MsICJYbWxDb2x1bW4iLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb2x1bW5fTGVuZ3RoKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAibGVuZ3RoIiwgbnVsbCwgMCwgMSwgWG1sQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb2x1bW5fUHJlY2lzaW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAicHJlY2lzaW9uIiwgbnVsbCwgMCwgMSwgWG1sQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb2x1bW5fU2NhbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50T2JqZWN0KCksICJzY2FsZSIsIG51bGwsIDAsIDEsIFhtbENvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENvbHVtbkltcGxFQ2xhc3MsIFhtbENvbHVtbkltcGwuY2xhc3MsICJYbWxDb2x1bW5JbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29sdW1uUmVzdWx0RUNsYXNzLCBDb2x1bW5SZXN1bHQuY2xhc3MsICJDb2x1bW5SZXN1bHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbHVtblJlc3VsdF9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIENvbHVtblJlc3VsdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MsIFhtbERpc2NyaW1pbmF0b3JDb2x1bW4uY2xhc3MsICJYbWxEaXNjcmltaW5hdG9yQ29sdW1uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxEaXNjcmltaW5hdG9yQ29sdW1uX0Rpc2NyaW1pbmF0b3JUeXBlKCksIHRoaXMuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSwgImRpc2NyaW1pbmF0b3JUeXBlIiwgIlNUUklORyIsIDAsIDEsIFhtbERpc2NyaW1pbmF0b3JDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbERpc2NyaW1pbmF0b3JDb2x1bW5fTGVuZ3RoKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAibGVuZ3RoIiwgbnVsbCwgMCwgMSwgWG1sRGlzY3JpbWluYXRvckNvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVudGl0eUxpc3RlbmVyc0VDbGFzcywgRW50aXR5TGlzdGVuZXJzLmNsYXNzLCAiRW50aXR5TGlzdGVuZXJzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlMaXN0ZW5lcnNfRW50aXR5TGlzdGVuZXJzKCksIHRoaXMuZ2V0RW50aXR5TGlzdGVuZXIoKSwgbnVsbCwgImVudGl0eUxpc3RlbmVycyIsIG51bGwsIDAsIC0xLCBFbnRpdHlMaXN0ZW5lcnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlbnRpdHlMaXN0ZW5lckVDbGFzcywgRW50aXR5TGlzdGVuZXIuY2xhc3MsICJFbnRpdHlMaXN0ZW5lciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5TGlzdGVuZXJfQ2xhc3NOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2xhc3NOYW1lIiwgbnVsbCwgMSwgMSwgRW50aXR5TGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUxpc3RlbmVyX1ByZVBlcnNpc3QoKSwgdGhpcy5nZXRQcmVQZXJzaXN0KCksIG51bGwsICJwcmVQZXJzaXN0IiwgbnVsbCwgMCwgMSwgRW50aXR5TGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUxpc3RlbmVyX1Bvc3RQZXJzaXN0KCksIHRoaXMuZ2V0UG9zdFBlcnNpc3QoKSwgbnVsbCwgInBvc3RQZXJzaXN0IiwgbnVsbCwgMCwgMSwgRW50aXR5TGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUxpc3RlbmVyX1ByZVJlbW92ZSgpLCB0aGlzLmdldFByZVJlbW92ZSgpLCBudWxsLCAicHJlUmVtb3ZlIiwgbnVsbCwgMCwgMSwgRW50aXR5TGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUxpc3RlbmVyX1Bvc3RSZW1vdmUoKSwgdGhpcy5nZXRQb3N0UmVtb3ZlKCksIG51bGwsICJwb3N0UmVtb3ZlIiwgbnVsbCwgMCwgMSwgRW50aXR5TGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUxpc3RlbmVyX1ByZVVwZGF0ZSgpLCB0aGlzLmdldFByZVVwZGF0ZSgpLCBudWxsLCAicHJlVXBkYXRlIiwgbnVsbCwgMCwgMSwgRW50aXR5TGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUxpc3RlbmVyX1Bvc3RVcGRhdGUoKSwgdGhpcy5nZXRQb3N0VXBkYXRlKCksIG51bGwsICJwb3N0VXBkYXRlIiwgbnVsbCwgMCwgMSwgRW50aXR5TGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUxpc3RlbmVyX1Bvc3RMb2FkKCksIHRoaXMuZ2V0UG9zdExvYWQoKSwgbnVsbCwgInBvc3RMb2FkIiwgbnVsbCwgMCwgMSwgRW50aXR5TGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlbnRpdHlSZXN1bHRFQ2xhc3MsIEVudGl0eVJlc3VsdC5jbGFzcywgIkVudGl0eVJlc3VsdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5UmVzdWx0X0Rpc2NyaW1pbmF0b3JDb2x1bW4oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkaXNjcmltaW5hdG9yQ29sdW1uIiwgbnVsbCwgMCwgMSwgRW50aXR5UmVzdWx0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlSZXN1bHRfRW50aXR5Q2xhc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlbnRpdHlDbGFzcyIsIG51bGwsIDEsIDEsIEVudGl0eVJlc3VsdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5UmVzdWx0X0ZpZWxkUmVzdWx0cygpLCB0aGlzLmdldEZpZWxkUmVzdWx0KCksIG51bGwsICJmaWVsZFJlc3VsdHMiLCBudWxsLCAwLCAtMSwgRW50aXR5UmVzdWx0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXZlbnRNZXRob2RFQ2xhc3MsIEV2ZW50TWV0aG9kLmNsYXNzLCAiRXZlbnRNZXRob2QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEV2ZW50TWV0aG9kX01ldGhvZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtZXRob2ROYW1lIiwgbnVsbCwgMSwgMSwgRXZlbnRNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhmaWVsZFJlc3VsdEVDbGFzcywgRmllbGRSZXN1bHQuY2xhc3MsICJGaWVsZFJlc3VsdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmllbGRSZXN1bHRfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBGaWVsZFJlc3VsdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmllbGRSZXN1bHRfQ29sdW1uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29sdW1uIiwgbnVsbCwgMSwgMSwgRmllbGRSZXN1bHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxHZW5lcmF0ZWRWYWx1ZUVDbGFzcywgWG1sR2VuZXJhdGVkVmFsdWUuY2xhc3MsICJYbWxHZW5lcmF0ZWRWYWx1ZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEdlbmVyYXRlZFZhbHVlX0dlbmVyYXRvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImdlbmVyYXRvciIsIG51bGwsIDAsIDEsIFhtbEdlbmVyYXRlZFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxHZW5lcmF0ZWRWYWx1ZV9TdHJhdGVneSgpLCB0aGlzLmdldEdlbmVyYXRpb25UeXBlKCksICJzdHJhdGVneSIsICJUQUJMRSIsIDAsIDEsIFhtbEdlbmVyYXRlZFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sR2VuZXJhdGVkVmFsdWVJbXBsRUNsYXNzLCBYbWxHZW5lcmF0ZWRWYWx1ZUltcGwuY2xhc3MsICJYbWxHZW5lcmF0ZWRWYWx1ZUltcGwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxJZENsYXNzRUNsYXNzLCBYbWxJZENsYXNzLmNsYXNzLCAiWG1sSWRDbGFzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSWRDbGFzc19DbGFzc05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjbGFzc05hbWUiLCBudWxsLCAxLCAxLCBYbWxJZENsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaW5oZXJpdGFuY2VFQ2xhc3MsIEluaGVyaXRhbmNlLmNsYXNzLCAiSW5oZXJpdGFuY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaGVyaXRhbmNlX1N0cmF0ZWd5KCksIHRoaXMuZ2V0SW5oZXJpdGFuY2VUeXBlKCksICJzdHJhdGVneSIsICJTSU5HTEVfVEFCTEUiLCAwLCAxLCBJbmhlcml0YW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEpvaW5Db2x1bW5FQ2xhc3MsIFhtbEpvaW5Db2x1bW4uY2xhc3MsICJYbWxKb2luQ29sdW1uIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSm9pbkNvbHVtbl9SZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlZmVyZW5jZWRDb2x1bW5OYW1lIiwgbnVsbCwgMCwgMSwgWG1sSm9pbkNvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEpvaW5Db2x1bW5JbXBsRUNsYXNzLCBYbWxKb2luQ29sdW1uSW1wbC5jbGFzcywgIlhtbEpvaW5Db2x1bW5JbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sSm9pblRhYmxlRUNsYXNzLCBYbWxKb2luVGFibGUuY2xhc3MsICJYbWxKb2luVGFibGUiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxKb2luVGFibGVfSm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxKb2luQ29sdW1uKCksIG51bGwsICJqb2luQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxKb2luVGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEpvaW5UYWJsZV9JbnZlcnNlSm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxKb2luQ29sdW1uKCksIG51bGwsICJpbnZlcnNlSm9pbkNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sSm9pblRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sSm9pblRhYmxlSW1wbEVDbGFzcywgWG1sSm9pblRhYmxlSW1wbC5jbGFzcywgIlhtbEpvaW5UYWJsZUltcGwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhsb2JFQ2xhc3MsIExvYi5jbGFzcywgIkxvYiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKG1hcEtleUVDbGFzcywgTWFwS2V5LmNsYXNzLCAiTWFwS2V5IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWFwS2V5X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTWFwS2V5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWFwS2V5SW1wbEVDbGFzcywgTWFwS2V5SW1wbC5jbGFzcywgIk1hcEtleUltcGwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxRdWVyeUVDbGFzcywgWG1sUXVlcnkuY2xhc3MsICJYbWxRdWVyeSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgWG1sUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5X1F1ZXJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicXVlcnkiLCBudWxsLCAxLCAxLCBYbWxRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUXVlcnlfSGludHMoKSwgdGhpcy5nZXRYbWxRdWVyeUhpbnQoKSwgbnVsbCwgImhpbnRzIiwgbnVsbCwgMCwgLTEsIFhtbFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTmFtZWROYXRpdmVRdWVyeUVDbGFzcywgWG1sTmFtZWROYXRpdmVRdWVyeS5jbGFzcywgIlhtbE5hbWVkTmF0aXZlUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0Q2xhc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXN1bHRDbGFzcyIsIG51bGwsIDAsIDEsIFhtbE5hbWVkTmF0aXZlUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3VsdFNldE1hcHBpbmciLCBudWxsLCAwLCAxLCBYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTmFtZWRRdWVyeUVDbGFzcywgWG1sTmFtZWRRdWVyeS5jbGFzcywgIlhtbE5hbWVkUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwb3N0TG9hZEVDbGFzcywgUG9zdExvYWQuY2xhc3MsICJQb3N0TG9hZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHBvc3RQZXJzaXN0RUNsYXNzLCBQb3N0UGVyc2lzdC5jbGFzcywgIlBvc3RQZXJzaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocG9zdFJlbW92ZUVDbGFzcywgUG9zdFJlbW92ZS5jbGFzcywgIlBvc3RSZW1vdmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwb3N0VXBkYXRlRUNsYXNzLCBQb3N0VXBkYXRlLmNsYXNzLCAiUG9zdFVwZGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHByZVBlcnNpc3RFQ2xhc3MsIFByZVBlcnNpc3QuY2xhc3MsICJQcmVQZXJzaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocHJlUmVtb3ZlRUNsYXNzLCBQcmVSZW1vdmUuY2xhc3MsICJQcmVSZW1vdmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwcmVVcGRhdGVFQ2xhc3MsIFByZVVwZGF0ZS5jbGFzcywgIlByZVVwZGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFByaW1hcnlLZXlKb2luQ29sdW1uRUNsYXNzLCBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5jbGFzcywgIlhtbFByaW1hcnlLZXlKb2luQ29sdW1uIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5fUmVmZXJlbmNlZENvbHVtbk5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZWZlcmVuY2VkQ29sdW1uTmFtZSIsIG51bGwsIDAsIDEsIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsRUNsYXNzLCBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwuY2xhc3MsICJYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxRdWVyeUhpbnRFQ2xhc3MsIFhtbFF1ZXJ5SGludC5jbGFzcywgIlhtbFF1ZXJ5SGludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUXVlcnlIaW50X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgWG1sUXVlcnlIaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxRdWVyeUhpbnRfVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDEsIDEsIFhtbFF1ZXJ5SGludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sQmFzZVRhYmxlRUNsYXNzLCBBYnN0cmFjdFhtbEJhc2VUYWJsZS5jbGFzcywgIkFic3RyYWN0WG1sQmFzZVRhYmxlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxCYXNlVGFibGVFQ2xhc3MsIFhtbEJhc2VUYWJsZS5jbGFzcywgIlhtbEJhc2VUYWJsZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhc2VUYWJsZV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbEJhc2VUYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQmFzZVRhYmxlX0NhdGFsb2coKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjYXRhbG9nIiwgbnVsbCwgMCwgMSwgWG1sQmFzZVRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNlVGFibGVfU2NoZW1hKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NoZW1hIiwgbnVsbCwgMCwgMSwgWG1sQmFzZVRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxCYXNlVGFibGVfVW5pcXVlQ29uc3RyYWludHMoKSwgdGhpcy5nZXRYbWxVbmlxdWVDb25zdHJhaW50KCksIG51bGwsICJ1bmlxdWVDb25zdHJhaW50cyIsIG51bGwsIDAsIC0xLCBYbWxCYXNlVGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxUYWJsZUVDbGFzcywgWG1sVGFibGUuY2xhc3MsICJYbWxUYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFNlY29uZGFyeVRhYmxlRUNsYXNzLCBYbWxTZWNvbmRhcnlUYWJsZS5jbGFzcywgIlhtbFNlY29uZGFyeVRhYmxlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sU2Vjb25kYXJ5VGFibGVfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCksIHRoaXMuZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKSwgbnVsbCwgInByaW1hcnlLZXlKb2luQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxTZWNvbmRhcnlUYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFNlY29uZGFyeVRhYmxlSW1wbEVDbGFzcywgWG1sU2Vjb25kYXJ5VGFibGVJbXBsLmNsYXNzLCAiWG1sU2Vjb25kYXJ5VGFibGVJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sR2VuZXJhdG9yRUNsYXNzLCBYbWxHZW5lcmF0b3IuY2xhc3MsICJYbWxHZW5lcmF0b3IiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxHZW5lcmF0b3JfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBYbWxHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEdlbmVyYXRvcl9Jbml0aWFsVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50T2JqZWN0KCksICJpbml0aWFsVmFsdWUiLCBudWxsLCAwLCAxLCBYbWxHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEdlbmVyYXRvcl9BbGxvY2F0aW9uU2l6ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgImFsbG9jYXRpb25TaXplIiwgbnVsbCwgMCwgMSwgWG1sR2VuZXJhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sU2VxdWVuY2VHZW5lcmF0b3JFQ2xhc3MsIFhtbFNlcXVlbmNlR2VuZXJhdG9yLmNsYXNzLCAiWG1sU2VxdWVuY2VHZW5lcmF0b3IiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl9TZXF1ZW5jZU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzZXF1ZW5jZU5hbWUiLCBudWxsLCAwLCAxLCBYbWxTZXF1ZW5jZUdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbEVDbGFzcywgWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsLmNsYXNzLCAiWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Moc3FsUmVzdWx0U2V0TWFwcGluZ0VDbGFzcywgU3FsUmVzdWx0U2V0TWFwcGluZy5jbGFzcywgIlNxbFJlc3VsdFNldE1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNxbFJlc3VsdFNldE1hcHBpbmdfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBTcWxSZXN1bHRTZXRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTcWxSZXN1bHRTZXRNYXBwaW5nX0VudGl0eVJlc3VsdHMoKSwgdGhpcy5nZXRFbnRpdHlSZXN1bHQoKSwgbnVsbCwgImVudGl0eVJlc3VsdHMiLCBudWxsLCAwLCAtMSwgU3FsUmVzdWx0U2V0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ19Db2x1bW5SZXN1bHRzKCksIHRoaXMuZ2V0Q29sdW1uUmVzdWx0KCksIG51bGwsICJjb2x1bW5SZXN1bHRzIiwgbnVsbCwgMCwgLTEsIFNxbFJlc3VsdFNldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxUYWJsZUdlbmVyYXRvckVDbGFzcywgWG1sVGFibGVHZW5lcmF0b3IuY2xhc3MsICJYbWxUYWJsZUdlbmVyYXRvciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFRhYmxlR2VuZXJhdG9yX1RhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFibGUiLCBudWxsLCAwLCAxLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGFibGVHZW5lcmF0b3JfQ2F0YWxvZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNhdGFsb2ciLCBudWxsLCAwLCAxLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGFibGVHZW5lcmF0b3JfU2NoZW1hKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NoZW1hIiwgbnVsbCwgMCwgMSwgWG1sVGFibGVHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFRhYmxlR2VuZXJhdG9yX1BrQ29sdW1uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBrQ29sdW1uTmFtZSIsIG51bGwsIDAsIDEsIFhtbFRhYmxlR2VuZXJhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUYWJsZUdlbmVyYXRvcl9WYWx1ZUNvbHVtbk5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZUNvbHVtbk5hbWUiLCBudWxsLCAwLCAxLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGFibGVHZW5lcmF0b3JfUGtDb2x1bW5WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBrQ29sdW1uVmFsdWUiLCBudWxsLCAwLCAxLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sVGFibGVHZW5lcmF0b3JfVW5pcXVlQ29uc3RyYWludHMoKSwgdGhpcy5nZXRYbWxVbmlxdWVDb25zdHJhaW50KCksIG51bGwsICJ1bmlxdWVDb25zdHJhaW50cyIsIG51bGwsIDAsIC0xLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFRhYmxlR2VuZXJhdG9ySW1wbEVDbGFzcywgWG1sVGFibGVHZW5lcmF0b3JJbXBsLmNsYXNzLCAiWG1sVGFibGVHZW5lcmF0b3JJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVW5pcXVlQ29uc3RyYWludEVDbGFzcywgWG1sVW5pcXVlQ29uc3RyYWludC5jbGFzcywgIlhtbFVuaXF1ZUNvbnN0cmFpbnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxVbmlxdWVDb25zdHJhaW50X0NvbHVtbk5hbWVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29sdW1uTmFtZXMiLCBudWxsLCAxLCAtMSwgWG1sVW5pcXVlQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxVbmlxdWVDb25zdHJhaW50SW1wbEVDbGFzcywgWG1sVW5pcXVlQ29uc3RyYWludEltcGwuY2xhc3MsICJYbWxVbmlxdWVDb25zdHJhaW50SW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oYWNjZXNzVHlwZUVFbnVtLCBBY2Nlc3NUeXBlLmNsYXNzLCAiQWNjZXNzVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoYWNjZXNzVHlwZUVFbnVtLCBBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYWRkRUVudW1MaXRlcmFsKGFjY2Vzc1R5cGVFRW51bSwgQWNjZXNzVHlwZS5GSUVMRCk7Ci0KLQkJaW5pdEVFbnVtKGRpc2NyaW1pbmF0b3JUeXBlRUVudW0sIERpc2NyaW1pbmF0b3JUeXBlLmNsYXNzLCAiRGlzY3JpbWluYXRvclR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRpc2NyaW1pbmF0b3JUeXBlRUVudW0sIERpc2NyaW1pbmF0b3JUeXBlLlNUUklORyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkaXNjcmltaW5hdG9yVHlwZUVFbnVtLCBEaXNjcmltaW5hdG9yVHlwZS5DSEFSKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRpc2NyaW1pbmF0b3JUeXBlRUVudW0sIERpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIpOwotCi0JCWluaXRFRW51bShlbnVtVHlwZUVFbnVtLCBFbnVtVHlwZS5jbGFzcywgIkVudW1UeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnVtVHlwZUVFbnVtLCBFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudW1UeXBlRUVudW0sIEVudW1UeXBlLlNUUklORyk7Ci0KLQkJaW5pdEVFbnVtKGZldGNoVHlwZUVFbnVtLCBGZXRjaFR5cGUuY2xhc3MsICJGZXRjaFR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGZldGNoVHlwZUVFbnVtLCBGZXRjaFR5cGUuTEFaWSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChmZXRjaFR5cGVFRW51bSwgRmV0Y2hUeXBlLkVBR0VSKTsKLQotCQlpbml0RUVudW0oZ2VuZXJhdGlvblR5cGVFRW51bSwgR2VuZXJhdGlvblR5cGUuY2xhc3MsICJHZW5lcmF0aW9uVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoZ2VuZXJhdGlvblR5cGVFRW51bSwgR2VuZXJhdGlvblR5cGUuVEFCTEUpOwotCQlhZGRFRW51bUxpdGVyYWwoZ2VuZXJhdGlvblR5cGVFRW51bSwgR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UpOwotCQlhZGRFRW51bUxpdGVyYWwoZ2VuZXJhdGlvblR5cGVFRW51bSwgR2VuZXJhdGlvblR5cGUuSURFTlRJVFkpOwotCQlhZGRFRW51bUxpdGVyYWwoZ2VuZXJhdGlvblR5cGVFRW51bSwgR2VuZXJhdGlvblR5cGUuQVVUTyk7Ci0KLQkJaW5pdEVFbnVtKGluaGVyaXRhbmNlVHlwZUVFbnVtLCBJbmhlcml0YW5jZVR5cGUuY2xhc3MsICJJbmhlcml0YW5jZVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGluaGVyaXRhbmNlVHlwZUVFbnVtLCBJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKTsKLQkJYWRkRUVudW1MaXRlcmFsKGluaGVyaXRhbmNlVHlwZUVFbnVtLCBJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJYWRkRUVudW1MaXRlcmFsKGluaGVyaXRhbmNlVHlwZUVFbnVtLCBJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQotCQlpbml0RUVudW0odGVtcG9yYWxUeXBlRUVudW0sIFRlbXBvcmFsVHlwZS5jbGFzcywgIlRlbXBvcmFsVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwodGVtcG9yYWxUeXBlRUVudW0sIFRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRlbXBvcmFsVHlwZUVFbnVtLCBUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0ZW1wb3JhbFR5cGVFRW51bSwgVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoZGlzY3JpbWluYXRvclZhbHVlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJEaXNjcmltaW5hdG9yVmFsdWUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RURhdGFUeXBlKGVudW1lcmF0ZWRFRGF0YVR5cGUsIEVudW1lcmF0b3IuY2xhc3MsICJFbnVtZXJhdGVkIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVEYXRhVHlwZShvcmRlckJ5RURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJPcmRlckJ5IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVEYXRhVHlwZSh2ZXJzaW9uVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiVmVyc2lvblR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpdGVyYWxzCi0JewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VOVElUWV9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9NQVBQSU5HU19fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfTUFQUElOR1NfX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUEgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfU2NoZW1hKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0NhdGFsb2coKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0FjY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1NlcXVlbmNlR2VuZXJhdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1RhYmxlR2VuZXJhdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX05hbWVkUXVlcmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfTmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19TcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIFN1cGVyY2xhc3NlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX01hcHBlZFN1cGVyY2xhc3NlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50aXRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU19fRU5USVRJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRW50aXRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVtYmVkZGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfTUFQUElOR1NfX0VNQkVEREFCTEVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0VtYmVkZGFibGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURSA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9YbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19TQ0hFTUEgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfU2NoZW1hKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FUQUxPRyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19DYXRhbG9nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQWNjZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIFBlcnNpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVNDQURFX1BFUlNJU1QgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQ2FzY2FkZVBlcnNpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19FTlRJVFlfTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0VudGl0eUxpc3RlbmVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBUeXBlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sVHlwZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUUgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19DbGFzc05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfQWNjZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEUgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19NZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUyA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQUEVEX1NVUEVSQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19JZENsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlRGVmYXVsdExpc3RlbmVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0VudGl0eUxpc3RlbmVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1BFUlNJU1QgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19QcmVQZXJzaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9QRVJTSVNUID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFBlcnNpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZSBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1JFTU9WRSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1ByZVJlbW92ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9SRU1PVkUgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Qb3N0UmVtb3ZlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9VUERBVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19QcmVVcGRhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfVVBEQVRFID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFVwZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfTE9BRCA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RMb2FkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5IDxlbT5YbWwgRW50aXR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFkgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1RhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWNvbmRhcnkgVGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1NlY29uZGFyeVRhYmxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZCBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fSURfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0lkQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaGVyaXRhbmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19JTkhFUklUQU5DRSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfSW5oZXJpdGFuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0Rpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9UYWJsZUdlbmVyYXRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19OQU1FRF9RVUVSSUVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9OYW1lZFF1ZXJpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9OYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9FbnRpdHlMaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZSBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19QUkVfUEVSU0lTVCA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfUHJlUGVyc2lzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19QT1NUX1BFUlNJU1QgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1Bvc3RQZXJzaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19QUkVfUkVNT1ZFID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9QcmVSZW1vdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19QT1NUX1JFTU9WRSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfUG9zdFJlbW92ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fUFJFX1VQREFURSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfUHJlVXBkYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fUE9TVF9VUERBVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1Bvc3RVcGRhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgTG9hZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fUE9TVF9MT0FEID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9Qb3N0TG9hZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9BdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSA8ZW0+WG1sIEVtYmVkZGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRUREQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QXR0cmlidXRlcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEFUVFJJQlVURVMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX0lEUyA9IGVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0lkcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkZWQgSWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX0VNQkVEREVEX0lEUyA9IGVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0VtYmVkZGVkSWRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNpY3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQVRUUklCVVRFU19fQkFTSUNTID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfQmFzaWNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19WRVJTSU9OUyA9IGVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX1ZlcnNpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW55IFRvIE9uZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQVRUUklCVVRFU19fTUFOWV9UT19PTkVTID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfTWFueVRvT25lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T25lIFRvIE1hbnlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX09ORV9UT19NQU5ZUyA9IGVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX09uZVRvTWFueXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9uZSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX09ORV9UT19PTkVTID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfT25lVG9PbmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW55IFRvIE1hbnlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX01BTllfVE9fTUFOWVMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19NYW55VG9NYW55cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkZWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX0VNQkVEREVEUyA9IGVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0VtYmVkZGVkcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19UUkFOU0lFTlRTID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfVHJhbnNpZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcgPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BVFRSSUJVVEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgTnVsbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX05VTExfQVRUUklCVVRFX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nIDxlbT5Db2x1bW4gTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIENPTFVNTl9NQVBQSU5HID0gZUlOU1RBTkNFLmdldENvbHVtbk1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQ09MVU1OX01BUFBJTkdfX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPlhtbCBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9SRUxBVElPTlNISVBfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFkgPSBlSU5TVEFOQ0UuZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19UYXJnZXRFbnRpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIID0gZUlOU1RBTkNFLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfRmV0Y2goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0pvaW5UYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFID0gZUlOU1RBTkNFLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfQ2FzY2FkZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyA8ZW0+WG1sIE11bHRpIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlkgPSBlSU5TVEFOQ0UuZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX01hcHBlZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWSA9IGVJTlNUQU5DRS5nZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfT3JkZXJCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZID0gZUlOU1RBTkNFLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBLZXkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIDxlbT5YbWwgU2luZ2xlIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUwgPSBlSU5TVEFOQ0UuZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19PcHRpb25hbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nX0pvaW5Db2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgPGVtPlhtbCBJZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lEID0gZUlOU1RBTkNFLmdldFhtbElkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFID0gZUlOU1RBTkNFLmdldFhtbElkX0dlbmVyYXRlZFZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0lEX19URU1QT1JBTCA9IGVJTlNUQU5DRS5nZXRYbWxJZF9UZW1wb3JhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfSURfX1RBQkxFX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxJZF9UYWJsZUdlbmVyYXRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxJZF9TZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkSW1wbCA8ZW0+WG1sIElkIEltcGw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWRJbXBsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lEX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sSWRJbXBsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQmFzZVhtbEVtYmVkZGVkIDxlbT5CYXNlIFhtbCBFbWJlZGRlZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5CYXNlWG1sRW1iZWRkZWQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRCYXNlWG1sRW1iZWRkZWQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBCQVNFX1hNTF9FTUJFRERFRCA9IGVJTlNUQU5DRS5nZXRCYXNlWG1sRW1iZWRkZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQkFTRV9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVMgPSBlSU5TVEFOQ0UuZ2V0QmFzZVhtbEVtYmVkZGVkX0F0dHJpYnV0ZU92ZXJyaWRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRJZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTUJFRERFRF9JRCA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZElkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZEltcGwgPGVtPlhtbCBFbWJlZGRlZCBJZCBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRJZEltcGwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRURERURfSURfSU1QTCA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZElkSW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljIDxlbT5YbWwgQmFzaWM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpYygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNJQyA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpYygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNJQ19fRkVUQ0ggPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfRmV0Y2goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFTSUNfX09QVElPTkFMID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljX09wdGlvbmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNJQ19fTE9CID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljX0xvYigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNJQ19fVEVNUE9SQUwgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfVGVtcG9yYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNJQ19fRU5VTUVSQVRFRCA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY19FbnVtZXJhdGVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNJbXBsIDxlbT5YbWwgQmFzaWMgSW1wbDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpY0ltcGwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTSUNfSU1QTCA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY0ltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uIDxlbT5YbWwgVmVyc2lvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9WRVJTSU9OID0gZUlOU1RBTkNFLmdldFhtbFZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVkVSU0lPTl9fVEVNUE9SQUwgPSBlSU5TVEFOQ0UuZ2V0WG1sVmVyc2lvbl9UZW1wb3JhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb25JbXBsIDxlbT5YbWwgVmVyc2lvbiBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbkltcGwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVkVSU0lPTl9JTVBMID0gZUlOU1RBTkNFLmdldFhtbFZlcnNpb25JbXBsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIDxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvT25lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BTllfVE9fT05FID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb09uZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZUltcGwgPGVtPlhtbCBNYW55IFRvIE9uZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9PbmVJbXBsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BTllfVE9fT05FX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvT25lSW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSA8ZW0+WG1sIE9uZSBUbyBNYW55PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fTUFOWSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfT05FX1RPX01BTllfX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfSm9pbkNvbHVtbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnlJbXBsIDxlbT5YbWwgT25lIFRvIE1hbnkgSW1wbDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55SW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fTUFOWV9JTVBMID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueUltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSA8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fT05FID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvT25lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PTkVfVE9fT05FX19NQVBQRURfQlkgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9PbmVfTWFwcGVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvT25lX1ByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lSW1wbCA8ZW0+WG1sIE9uZSBUbyBPbmUgSW1wbDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZUltcGwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT05FX1RPX09ORV9JTVBMID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvT25lSW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkgPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hbnlUb01hbnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19NQU5ZID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb01hbnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55SW1wbCA8ZW0+WG1sIE1hbnkgVG8gTWFueSBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueUltcGwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19NQU5ZX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueUltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZCA8ZW0+WG1sIEVtYmVkZGVkPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRURERUQgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZEltcGwgPGVtPlhtbCBFbWJlZGRlZCBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTUJFRERFRF9JTVBMID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkSW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudCA8ZW0+WG1sIFRyYW5zaWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUcmFuc2llbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVFJBTlNJRU5UID0gZUlOU1RBTkNFLmdldFhtbFRyYW5zaWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudEltcGwgPGVtPlhtbCBUcmFuc2llbnQgSW1wbDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHJhbnNpZW50SW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UUkFOU0lFTlRfSU1QTCA9IGVJTlNUQU5DRS5nZXRYbWxUcmFuc2llbnRJbXBsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFID0gZUlOU1RBTkNFLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlX0pvaW5Db2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwgPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTCA9IGVJTlNUQU5DRS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVRUUklCVVRFX09WRVJSSURFID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9Db2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCA8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTCA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSA8ZW0+Q2FzY2FkZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBDQVNDQURFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q2FzY2FkZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBDQVNDQURFX1RZUEVfX0NBU0NBREVfQUxMID0gZUlOU1RBTkNFLmdldENhc2NhZGVUeXBlX0Nhc2NhZGVBbGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgUGVyc2lzdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQ0FTQ0FERV9UWVBFX19DQVNDQURFX1BFUlNJU1QgPSBlSU5TVEFOQ0UuZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVBlcnNpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgTWVyZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIENBU0NBREVfVFlQRV9fQ0FTQ0FERV9NRVJHRSA9IGVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlTWVyZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgUmVtb3ZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBDQVNDQURFX1RZUEVfX0NBU0NBREVfUkVNT1ZFID0gZUlOU1RBTkNFLmdldENhc2NhZGVUeXBlX0Nhc2NhZGVSZW1vdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgUmVmcmVzaDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQ0FTQ0FERV9UWVBFX19DQVNDQURFX1JFRlJFU0ggPSBlSU5TVEFOQ0UuZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVJlZnJlc2goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZUltcGwgPGVtPkNhc2NhZGUgVHlwZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENhc2NhZGVUeXBlSW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIENBU0NBREVfVFlQRV9JTVBMID0gZUlOU1RBTkNFLmdldENhc2NhZGVUeXBlSW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uIDxlbT5YbWwgTmFtZWQgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWRDb2x1bW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTkFNRURfQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRDb2x1bW5fQ29sdW1uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX0NPTFVNTl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZENvbHVtbl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbiA8ZW0+QWJzdHJhY3QgWG1sIE5hbWVkIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE5hbWVkQ29sdW1uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uIDxlbT5YbWwgQWJzdHJhY3QgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWJzdHJhY3RDb2x1bW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQUJTVFJBQ1RfQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbEFic3RyYWN0Q29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQUJTVFJBQ1RfQ09MVU1OX19JTlNFUlRBQkxFID0gZUlOU1RBTkNFLmdldFhtbEFic3RyYWN0Q29sdW1uX0luc2VydGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk51bGxhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQUJTVFJBQ1RfQ09MVU1OX19OVUxMQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxBYnN0cmFjdENvbHVtbl9OdWxsYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BQlNUUkFDVF9DT0xVTU5fX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbEFic3RyYWN0Q29sdW1uX1RhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRSA9IGVJTlNUQU5DRS5nZXRYbWxBYnN0cmFjdENvbHVtbl9VbmlxdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFID0gZUlOU1RBTkNFLmdldFhtbEFic3RyYWN0Q29sdW1uX1VwZGF0YWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4gPGVtPkFic3RyYWN0IFhtbCBBYnN0cmFjdCBDb2x1bW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4gPGVtPlhtbCBDb2x1bW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29sdW1uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxDb2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPTFVNTl9fTEVOR1RIID0gZUlOU1RBTkNFLmdldFhtbENvbHVtbl9MZW5ndGgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPTFVNTl9fUFJFQ0lTSU9OID0gZUlOU1RBTkNFLmdldFhtbENvbHVtbl9QcmVjaXNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ09MVU1OX19TQ0FMRSA9IGVJTlNUQU5DRS5nZXRYbWxDb2x1bW5fU2NhbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW5JbXBsIDxlbT5YbWwgQ29sdW1uIEltcGw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbHVtbkltcGwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09MVU1OX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29sdW1uSW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtblJlc3VsdCA8ZW0+Q29sdW1uIFJlc3VsdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5SZXN1bHQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5SZXN1bHQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBDT0xVTU5fUkVTVUxUID0gZUlOU1RBTkNFLmdldENvbHVtblJlc3VsdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQ09MVU1OX1JFU1VMVF9fTkFNRSA9IGVJTlNUQU5DRS5nZXRDb2x1bW5SZXN1bHRfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW4gPGVtPlhtbCBEaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXNjcmltaW5hdG9yQ29sdW1uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFID0gZUlOU1RBTkNFLmdldFhtbERpc2NyaW1pbmF0b3JDb2x1bW5fRGlzY3JpbWluYXRvclR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEggPSBlSU5TVEFOQ0UuZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbl9MZW5ndGgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXJzCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5TGlzdGVuZXJzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgRU5USVRZX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgRU5USVRZX0xJU1RFTkVSU19fRU5USVRZX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcnNfRW50aXR5TGlzdGVuZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIgPGVtPkVudGl0eSBMaXN0ZW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgRU5USVRZX0xJU1RFTkVSID0gZUlOU1RBTkNFLmdldEVudGl0eUxpc3RlbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBFTlRJVFlfTElTVEVORVJfX0NMQVNTX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5TGlzdGVuZXJfQ2xhc3NOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgRU5USVRZX0xJU1RFTkVSX19QUkVfUEVSU0lTVCA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcl9QcmVQZXJzaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEVOVElUWV9MSVNURU5FUl9fUE9TVF9QRVJTSVNUID0gZUlOU1RBTkNFLmdldEVudGl0eUxpc3RlbmVyX1Bvc3RQZXJzaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBFTlRJVFlfTElTVEVORVJfX1BSRV9SRU1PVkUgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5TGlzdGVuZXJfUHJlUmVtb3ZlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgRU5USVRZX0xJU1RFTkVSX19QT1NUX1JFTU9WRSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcl9Qb3N0UmVtb3ZlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBFTlRJVFlfTElTVEVORVJfX1BSRV9VUERBVEUgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5TGlzdGVuZXJfUHJlVXBkYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgRU5USVRZX0xJU1RFTkVSX19QT1NUX1VQREFURSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcl9Qb3N0VXBkYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IExvYWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEVOVElUWV9MSVNURU5FUl9fUE9TVF9MT0FEID0gZUlOU1RBTkNFLmdldEVudGl0eUxpc3RlbmVyX1Bvc3RMb2FkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0IDxlbT5FbnRpdHkgUmVzdWx0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eVJlc3VsdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEVOVElUWV9SRVNVTFQgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5UmVzdWx0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIENvbHVtbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgRU5USVRZX1JFU1VMVF9fRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0RW50aXR5UmVzdWx0X0Rpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgRU5USVRZX1JFU1VMVF9fRU5USVRZX0NMQVNTID0gZUlOU1RBTkNFLmdldEVudGl0eVJlc3VsdF9FbnRpdHlDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgUmVzdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBFTlRJVFlfUkVTVUxUX19GSUVMRF9SRVNVTFRTID0gZUlOU1RBTkNFLmdldEVudGl0eVJlc3VsdF9GaWVsZFJlc3VsdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GaWVsZFJlc3VsdCA8ZW0+RmllbGQgUmVzdWx0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RmllbGRSZXN1bHQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBGSUVMRF9SRVNVTFQgPSBlSU5TVEFOQ0UuZ2V0RmllbGRSZXN1bHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEZJRUxEX1JFU1VMVF9fTkFNRSA9IGVJTlNUQU5DRS5nZXRGaWVsZFJlc3VsdF9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEZJRUxEX1JFU1VMVF9fQ09MVU1OID0gZUlOU1RBTkNFLmdldEZpZWxkUmVzdWx0X0NvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlIDxlbT5YbWwgR2VuZXJhdGVkIFZhbHVlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfR0VORVJBVEVEX1ZBTFVFID0gZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRlZFZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9HRU5FUkFURURfVkFMVUVfX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0ZWRWYWx1ZV9HZW5lcmF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0cmF0ZWd5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfR0VORVJBVEVEX1ZBTFVFX19TVFJBVEVHWSA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0ZWRWYWx1ZV9TdHJhdGVneSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlSW1wbCA8ZW0+WG1sIEdlbmVyYXRlZCBWYWx1ZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRlZFZhbHVlSW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9HRU5FUkFURURfVkFMVUVfSU1QTCA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0ZWRWYWx1ZUltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzIDxlbT5YbWwgSWQgQ2xhc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzcwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkQ2xhc3MoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSURfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sSWRDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0lEX0NMQVNTX19DTEFTU19OQU1FID0gZUlOU1RBTkNFLmdldFhtbElkQ2xhc3NfQ2xhc3NOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2UgPGVtPkluaGVyaXRhbmNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0SW5oZXJpdGFuY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBJTkhFUklUQU5DRSA9IGVJTlNUQU5DRS5nZXRJbmhlcml0YW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RyYXRlZ3k8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIElOSEVSSVRBTkNFX19TVFJBVEVHWSA9IGVJTlNUQU5DRS5nZXRJbmhlcml0YW5jZV9TdHJhdGVneSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW4gPGVtPlhtbCBKb2luIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pbkNvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9KT0lOX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxKb2luQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sSm9pbkNvbHVtbl9SZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW5JbXBsIDxlbT5YbWwgSm9pbiBDb2x1bW4gSW1wbDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW5JbXBsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0pPSU5fQ09MVU1OX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sSm9pbkNvbHVtbkltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUgPGVtPlhtbCBKb2luIFRhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9KT0lOX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9KT0lOX1RBQkxFX19KT0lOX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sSm9pblRhYmxlX0pvaW5Db2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnZlcnNlIEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfSk9JTl9UQUJMRV9fSU5WRVJTRV9KT0lOX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sSm9pblRhYmxlX0ludmVyc2VKb2luQ29sdW1ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZUltcGwgPGVtPlhtbCBKb2luIFRhYmxlIEltcGw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZUltcGwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSk9JTl9UQUJMRV9JTVBMID0gZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZUltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Mb2IgPGVtPkxvYjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Mb2IKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRMb2IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBMT0IgPSBlSU5TVEFOQ0UuZ2V0TG9iKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldE1hcEtleSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIE1BUF9LRVkgPSBlSU5TVEFOQ0UuZ2V0TWFwS2V5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBNQVBfS0VZX19OQU1FID0gZUlOU1RBTkNFLmdldE1hcEtleV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5SW1wbCA8ZW0+TWFwIEtleSBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRNYXBLZXlJbXBsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgTUFQX0tFWV9JTVBMID0gZUlOU1RBTkNFLmdldE1hcEtleUltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSA8ZW0+WG1sIFF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUVVFUlkgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9RVUVSWV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5RdWVyeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX19RVUVSWSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeV9RdWVyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1FVRVJZX19ISU5UUyA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeV9IaW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnkgPGVtPlhtbCBOYW1lZCBOYXRpdmUgUXVlcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkTmF0aXZlUXVlcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTkFNRURfTkFUSVZFX1FVRVJZID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkTmF0aXZlUXVlcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0Q2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBTZXQgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnkgPGVtPlhtbCBOYW1lZCBRdWVyeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWRRdWVyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9OQU1FRF9RVUVSWSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFF1ZXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QgPGVtPkV2ZW50IE1ldGhvZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEV2ZW50TWV0aG9kKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgRVZFTlRfTUVUSE9EID0gZUlOU1RBTkNFLmdldEV2ZW50TWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgRVZFTlRfTUVUSE9EX19NRVRIT0RfTkFNRSA9IGVJTlNUQU5DRS5nZXRFdmVudE1ldGhvZF9NZXRob2ROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdExvYWQgPGVtPlBvc3QgTG9hZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0TG9hZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFBvc3RMb2FkKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgUE9TVF9MT0FEID0gZUlOU1RBTkNFLmdldFBvc3RMb2FkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFBlcnNpc3QgPGVtPlBvc3QgUGVyc2lzdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0UGVyc2lzdAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFBvc3RQZXJzaXN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgUE9TVF9QRVJTSVNUID0gZUlOU1RBTkNFLmdldFBvc3RQZXJzaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFJlbW92ZSA8ZW0+UG9zdCBSZW1vdmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFJlbW92ZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFBvc3RSZW1vdmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBQT1NUX1JFTU9WRSA9IGVJTlNUQU5DRS5nZXRQb3N0UmVtb3ZlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFVwZGF0ZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFBvc3RVcGRhdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBQT1NUX1VQREFURSA9IGVJTlNUQU5DRS5nZXRQb3N0VXBkYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUHJlUGVyc2lzdCA8ZW0+UHJlIFBlcnNpc3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUHJlUGVyc2lzdAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVBlcnNpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBQUkVfUEVSU0lTVCA9IGVJTlNUQU5DRS5nZXRQcmVQZXJzaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUHJlUmVtb3ZlIDxlbT5QcmUgUmVtb3ZlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlByZVJlbW92ZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVJlbW92ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFBSRV9SRU1PVkUgPSBlSU5TVEFOQ0UuZ2V0UHJlUmVtb3ZlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUHJlVXBkYXRlIDxlbT5QcmUgVXBkYXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlByZVVwZGF0ZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVVwZGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFBSRV9VUERBVEUgPSBlSU5TVEFOQ0UuZ2V0UHJlVXBkYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gPGVtPlhtbCBQcmltYXJ5IEtleSBKb2luIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5fUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwgPGVtPlhtbCBQcmltYXJ5IEtleSBKb2luIENvbHVtbiBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9JTVBMID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludCA8ZW0+WG1sIFF1ZXJ5IEhpbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlIaW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1FVRVJZX0hJTlQgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlIaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUVVFUllfSElOVF9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeUhpbnRfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9RVUVSWV9ISU5UX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeUhpbnRfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VUYWJsZSA8ZW0+QWJzdHJhY3QgWG1sIEJhc2UgVGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlVGFibGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbEJhc2VUYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sQmFzZVRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlIDxlbT5YbWwgQmFzZSBUYWJsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlVGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTRV9UQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNlVGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNFX1RBQkxFX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbEJhc2VUYWJsZV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFTRV9UQUJMRV9fQ0FUQUxPRyA9IGVJTlNUQU5DRS5nZXRYbWxCYXNlVGFibGVfQ2F0YWxvZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFTRV9UQUJMRV9fU0NIRU1BID0gZUlOU1RBTkNFLmdldFhtbEJhc2VUYWJsZV9TY2hlbWEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gZUlOU1RBTkNFLmdldFhtbEJhc2VUYWJsZV9VbmlxdWVDb25zdHJhaW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlIDxlbT5YbWwgVGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxUYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlIDxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfU0VDT05EQVJZX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbFNlY29uZGFyeVRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1NFQ09OREFSWV9UQUJMRV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbFNlY29uZGFyeVRhYmxlX1ByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlSW1wbCA8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlY29uZGFyeVRhYmxlSW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTCA9IGVJTlNUQU5DRS5nZXRYbWxTZWNvbmRhcnlUYWJsZUltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IgPGVtPlhtbCBHZW5lcmF0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9HRU5FUkFUT1JfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX0luaXRpYWxWYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWxsb2NhdGlvbiBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX0FsbG9jYXRpb25TaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3IgPGVtPlhtbCBTZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3IKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TRVFVRU5DRV9HRU5FUkFUT1IgPSBlSU5TVEFOQ0UuZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX1NFUVVFTkNFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfU2VxdWVuY2VOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsIDxlbT5YbWwgU2VxdWVuY2UgR2VuZXJhdG9yIEltcGw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMID0gZUlOU1RBTkNFLmdldFhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcgPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFNxbFJlc3VsdFNldE1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFNxbFJlc3VsdFNldE1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ19OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgUmVzdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19FTlRJVFlfUkVTVUxUUyA9IGVJTlNUQU5DRS5nZXRTcWxSZXN1bHRTZXRNYXBwaW5nX0VudGl0eVJlc3VsdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBSZXN1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0NPTFVNTl9SRVNVTFRTID0gZUlOU1RBTkNFLmdldFNxbFJlc3VsdFNldE1hcHBpbmdfQ29sdW1uUmVzdWx0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yIDxlbT5YbWwgVGFibGUgR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVEFCTEVfR0VORVJBVE9SID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RBQkxFX0dFTkVSQVRPUl9fVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfVGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9UQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0cgPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfQ2F0YWxvZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVEFCTEVfR0VORVJBVE9SX19TQ0hFTUEgPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfU2NoZW1hKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QayBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfUGtDb2x1bW5OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RBQkxFX0dFTkVSQVRPUl9fVkFMVUVfQ09MVU1OX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfVmFsdWVDb2x1bW5OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QayBDb2x1bW4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxUYWJsZUdlbmVyYXRvcl9Qa0NvbHVtblZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1RBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yX1VuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3JJbXBsIDxlbT5YbWwgVGFibGUgR2VuZXJhdG9yIEltcGw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JJbXBsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9ySW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQgPGVtPlhtbCBVbmlxdWUgQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVW5pcXVlQ29uc3RyYWludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9VTklRVUVfQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1VOSVFVRV9DT05TVFJBSU5UX19DT0xVTU5fTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sVW5pcXVlQ29uc3RyYWludF9Db2x1bW5OYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsIDxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQgSW1wbDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1VOSVFVRV9DT05TVFJBSU5UX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlIDxlbT5BY2Nlc3MgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBY2Nlc3NUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBBQ0NFU1NfVFlQRSA9IGVJTlNUQU5DRS5nZXRBY2Nlc3NUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUgPGVtPkRpc2NyaW1pbmF0b3IgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RGlzY3JpbWluYXRvclR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIERJU0NSSU1JTkFUT1JfVFlQRSA9IGVJTlNUQU5DRS5nZXREaXNjcmltaW5hdG9yVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlIDxlbT5FbnVtIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudW1UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBFTlVNX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RW51bVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUgPGVtPkZldGNoIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRGZXRjaFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIEZFVENIX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RmV0Y2hUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUgPGVtPkdlbmVyYXRpb24gVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0R2VuZXJhdGlvblR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIEdFTkVSQVRJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRHZW5lcmF0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZSA8ZW0+SW5oZXJpdGFuY2UgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEluaGVyaXRhbmNlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gSU5IRVJJVEFOQ0VfVFlQRSA9IGVJTlNUQU5DRS5nZXRJbmhlcml0YW5jZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUgPGVtPlRlbXBvcmFsIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRUZW1wb3JhbFR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIFRFTVBPUkFMX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VGVtcG9yYWxUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5EaXNjcmltaW5hdG9yIFZhbHVlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldERpc2NyaW1pbmF0b3JWYWx1ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRURhdGFUeXBlIERJU0NSSU1JTkFUT1JfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnVtZXJhdGVkKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRGF0YVR5cGUgRU5VTUVSQVRFRCA9IGVJTlNUQU5DRS5nZXRFbnVtZXJhdGVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5PcmRlciBCeTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRPcmRlckJ5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRGF0YVR5cGUgT1JERVJfQlkgPSBlSU5TVEFOQ0UuZ2V0T3JkZXJCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VmVyc2lvbiBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFZlcnNpb25UeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRGF0YVR5cGUgVkVSU0lPTl9UWVBFID0gZUlOU1RBTkNFLmdldFZlcnNpb25UeXBlKCk7Ci0KLQl9Ci0KLX0gLy9Pcm1QYWNrYWdlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybVJlc291cmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDE5OWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1SZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzLkVudGl0eU1hcHBpbmdzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1SZXNvdXJjZSBleHRlbmRzIEpwYVhtbFJlc291cmNlIAotewotCXB1YmxpYyBPcm1SZXNvdXJjZShSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIoYVJlbmRlcmVyKTsKLQl9Ci0KLQlwdWJsaWMgT3JtUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKHVyaSwgYVJlbmRlcmVyKTsKLQl9Ci0JCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBFbnRpdHlNYXBwaW5nc1RyYW5zbGF0b3IuSU5TVEFOQ0U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIFRPRE8KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbVJlc291cmNlKCkgewotCQkvLyBUT0RPCi0JfQotCQotCXB1YmxpYyBYbWxFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChYbWxFbnRpdHlNYXBwaW5ncykgZ2V0Um9vdE9iamVjdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vT3JtUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybVJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjdlOTUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vT3JtUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIE9ybVJlc291cmNlRmFjdG9yeSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkKLXsKLQlwdWJsaWMgT3JtUmVzb3VyY2VGYWN0b3J5KCkgewotCQl0aGlzKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOwotCX0KLQkKLQlwdWJsaWMgT3JtUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgT3JtUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5LCBib29sZWFuIGxpc3RlbmluZ0ZvclVwZGF0ZXMpIHsKLQkJc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSwgbGlzdGVuaW5nRm9yVXBkYXRlcyk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShVUkksIFJlbmRlcmVyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgcmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBPcm1SZXNvdXJjZSh1cmksIHJlbmRlcmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybVJlc291cmNlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vT3JtUmVzb3VyY2VNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjJjOWZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vT3JtUmVzb3VyY2VNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFYbWxSZXNvdXJjZU1vZGVsOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIE9ybVJlc291cmNlTW9kZWwgZXh0ZW5kcyBKcGFYbWxSZXNvdXJjZU1vZGVsCi17Ci0JcHVibGljIE9ybVJlc291cmNlTW9kZWwoSUZpbGUgZmlsZSkgewotCQlzdXBlcihmaWxlKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZU1vZGVsI2dldFJlc291cmNlVHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZU1vZGVsLk9STV9SRVNPVVJDRV9UWVBFOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtQXJ0aWZhY3RFZGl0IGJ1aWxkQXJ0aWZhY3RFZGl0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIE9ybUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoT3JtUmVzb3VyY2UpIHN1cGVyLmdldFJlc291cmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Qb3N0TG9hZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Qb3N0TG9hZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODQxOWEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vUG9zdExvYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQb3N0TG9hZCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3N0TG9hZCBleHRlbmRzIEV2ZW50TWV0aG9kCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RMb2FkKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuUE9TVF9MT0FEOwotCX0KLQotfSAvLyBQb3N0TG9hZApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Qb3N0UGVyc2lzdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Qb3N0UGVyc2lzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWFjOGYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vUG9zdFBlcnNpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQb3N0UGVyc2lzdCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3N0UGVyc2lzdCBleHRlbmRzIEV2ZW50TWV0aG9kCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RQZXJzaXN0KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuUE9TVF9QRVJTSVNUOwotCX0KLQotfSAvLyBQb3N0UGVyc2lzdApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Qb3N0UmVtb3ZlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RSZW1vdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlhNjhhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RSZW1vdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFBvc3RSZW1vdmUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9zdFJlbW92ZSBleHRlbmRzIEV2ZW50TWV0aG9kCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RSZW1vdmUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5QT1NUX1JFTU9WRTsKLQl9Ci0KLX0gLy8gUG9zdFJlbW92ZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Qb3N0VXBkYXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RVcGRhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkNjE3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RVcGRhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9zdCBVcGRhdGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFBvc3RVcGRhdGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9zdFVwZGF0ZSBleHRlbmRzIEV2ZW50TWV0aG9kCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RVcGRhdGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5QT1NUX1VQREFURTsKLQl9Ci0KLX0gLy8gUG9zdFVwZGF0ZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9QcmVQZXJzaXN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1ByZVBlcnNpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxY2FlYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1ByZVBlcnNpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVBlcnNpc3QoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJlUGVyc2lzdCBleHRlbmRzIEV2ZW50TWV0aG9kCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByZVBlcnNpc3QoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5QUkVfUEVSU0lTVDsKLQl9Ci0KLX0gLy8gUHJlUGVyc2lzdApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9QcmVSZW1vdmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vUHJlUmVtb3ZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMDM1ODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9QcmVSZW1vdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlIFJlbW92ZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UHJlUmVtb3ZlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByZVJlbW92ZSBleHRlbmRzIEV2ZW50TWV0aG9kCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByZVJlbW92ZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlBSRV9SRU1PVkU7Ci0JfQotCi19IC8vIFByZVJlbW92ZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9QcmVVcGRhdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vUHJlVXBkYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxY2RmZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9QcmVVcGRhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UHJlVXBkYXRlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByZVVwZGF0ZSBleHRlbmRzIEV2ZW50TWV0aG9kCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByZVVwZGF0ZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlBSRV9VUERBVEU7Ci0JfQotCi19IC8vIFByZVVwZGF0ZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9TcWxSZXN1bHRTZXRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1NxbFJlc3VsdFNldE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiYzE2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1NxbFJlc3VsdFNldE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZzwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcjZ2V0RW50aXR5UmVzdWx0cyA8ZW0+RW50aXR5IFJlc3VsdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nI2dldENvbHVtblJlc3VsdHMgPGVtPkNvbHVtbiBSZXN1bHRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNxbFJlc3VsdFNldE1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRpdHlSZXN1bHRzKCkgPGVtPkVudGl0eSBSZXN1bHRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudGl0eVJlc3VsdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxFbnRpdHlSZXN1bHQ+IGVudGl0eVJlc3VsdHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW5SZXN1bHRzKCkgPGVtPkNvbHVtbiBSZXN1bHRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbHVtblJlc3VsdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDb2x1bW5SZXN1bHQ+IGNvbHVtblJlc3VsdHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3FsUmVzdWx0U2V0TWFwcGluZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlNRTF9SRVNVTFRfU0VUX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFNxbFJlc3VsdFNldE1hcHBpbmdfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5IFJlc3VsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eSBSZXN1bHRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5IFJlc3VsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5nX0VudGl0eVJlc3VsdHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PEVudGl0eVJlc3VsdD4gZ2V0RW50aXR5UmVzdWx0cygpCi0JewotCQlpZiAoZW50aXR5UmVzdWx0cyA9PSBudWxsKQotCQl7Ci0JCQllbnRpdHlSZXN1bHRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEVudGl0eVJlc3VsdD4oRW50aXR5UmVzdWx0LmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0VOVElUWV9SRVNVTFRTKTsKLQkJfQotCQlyZXR1cm4gZW50aXR5UmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW4gUmVzdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5SZXN1bHR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uIFJlc3VsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW4gUmVzdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFNxbFJlc3VsdFNldE1hcHBpbmdfQ29sdW1uUmVzdWx0cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8Q29sdW1uUmVzdWx0PiBnZXRDb2x1bW5SZXN1bHRzKCkKLQl7Ci0JCWlmIChjb2x1bW5SZXN1bHRzID09IG51bGwpCi0JCXsKLQkJCWNvbHVtblJlc3VsdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8Q29sdW1uUmVzdWx0PihDb2x1bW5SZXN1bHQuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fQ09MVU1OX1JFU1VMVFMpOwotCQl9Ci0JCXJldHVybiBjb2x1bW5SZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0VOVElUWV9SRVNVTFRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RW50aXR5UmVzdWx0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fQ09MVU1OX1JFU1VMVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb2x1bW5SZXN1bHRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0VOVElUWV9SRVNVTFRTOgotCQkJCXJldHVybiBnZXRFbnRpdHlSZXN1bHRzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fQ09MVU1OX1JFU1VMVFM6Ci0JCQkJcmV0dXJuIGdldENvbHVtblJlc3VsdHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19FTlRJVFlfUkVTVUxUUzoKLQkJCQlnZXRFbnRpdHlSZXN1bHRzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnRpdHlSZXN1bHRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFbnRpdHlSZXN1bHQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fQ09MVU1OX1JFU1VMVFM6Ci0JCQkJZ2V0Q29sdW1uUmVzdWx0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29sdW1uUmVzdWx0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29sdW1uUmVzdWx0PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fRU5USVRZX1JFU1VMVFM6Ci0JCQkJZ2V0RW50aXR5UmVzdWx0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0NPTFVNTl9SRVNVTFRTOgotCQkJCWdldENvbHVtblJlc3VsdHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0VOVElUWV9SRVNVTFRTOgotCQkJCXJldHVybiBlbnRpdHlSZXN1bHRzICE9IG51bGwgJiYgIWVudGl0eVJlc3VsdHMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0NPTFVNTl9SRVNVTFRTOgotCQkJCXJldHVybiBjb2x1bW5SZXN1bHRzICE9IG51bGwgJiYgIWNvbHVtblJlc3VsdHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIFNxbFJlc3VsdFNldE1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vVGVtcG9yYWxUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1RlbXBvcmFsVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjliOGRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vVGVtcG9yYWxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VGVtcG9yYWwgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0VGVtcG9yYWxUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+REFURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNEQVRFX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JREFURSgwLCAiREFURSIsICJEQVRFIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1RJTUVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlUSU1FKDEsICJUSU1FIiwgIlRJTUUiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUVTVEFNUDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUSU1FU1RBTVBfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlUSU1FU1RBTVAoMiwgIlRJTUVTVEFNUCIsICJUSU1FU1RBTVAiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRBVEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRBVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjREFURQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEVfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VElNRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUSU1FCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FU1RBTVA8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRJTUVTVEFNUDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUSU1FU1RBTVAKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FU1RBTVBfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlRlbXBvcmFsIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRlbXBvcmFsVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBUZW1wb3JhbFR5cGVbXQotCQl7Ci0JCQlEQVRFLAotCQkJVElNRSwKLQkJCVRJTUVTVEFNUCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5UZW1wb3JhbCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VGVtcG9yYWxUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRlbXBvcmFsIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUZW1wb3JhbFR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCVRlbXBvcmFsVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UZW1wb3JhbCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVtcG9yYWxUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlUZW1wb3JhbFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UZW1wb3JhbCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVtcG9yYWxUeXBlIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIERBVEVfVkFMVUU6IHJldHVybiBEQVRFOwotCQkJY2FzZSBUSU1FX1ZBTFVFOiByZXR1cm4gVElNRTsKLQkJCWNhc2UgVElNRVNUQU1QX1ZBTFVFOiByZXR1cm4gVElNRVNUQU1QOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUZW1wb3JhbFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL1RlbXBvcmFsVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBYnN0cmFjdENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBYnN0cmFjdENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGIyNjllLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQWJzdHJhY3RDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFic3RyYWN0IENvbHVtbjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldEluc2VydGFibGUgPGVtPkluc2VydGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXROdWxsYWJsZSA8ZW0+TnVsbGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXRVbmlxdWUgPGVtPlVuaXF1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldFVwZGF0YWJsZSA8ZW0+VXBkYXRhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBYnN0cmFjdENvbHVtbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQWJzdHJhY3RDb2x1bW4gZXh0ZW5kcyBYbWxOYW1lZENvbHVtbgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluc2VydGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluc2VydGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5zZXJ0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWJzdHJhY3RDb2x1bW5fSW5zZXJ0YWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4jZ2V0SW5zZXJ0YWJsZSA8ZW0+SW5zZXJ0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5zZXJ0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk51bGxhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OdWxsYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OdWxsYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TnVsbGFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFic3RyYWN0Q29sdW1uX051bGxhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldE51bGxhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4jZ2V0TnVsbGFibGUgPGVtPk51bGxhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OdWxsYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TnVsbGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWJsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBYnN0cmFjdENvbHVtbl9UYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFibGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VW5pcXVlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBYnN0cmFjdENvbHVtbl9VbmlxdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0VW5pcXVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4jZ2V0VW5pcXVlIDxlbT5VbmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VW5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVwZGF0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWJzdHJhY3RDb2x1bW5fVXBkYXRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldFVwZGF0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldFVwZGF0YWJsZSA8ZW0+VXBkYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVwZGF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB0YWJsZSBhdHRpYnV0ZS4gIElmIHRoZSB0YWJsZSBhdHRpYnV0ZSAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKnRhYmxlIGVsZW1lbnQuCi0JICovCi0JVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKCk7Ci0KLX0gLy8gQWJzdHJhY3RDb2x1bW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MmU1NTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlI2dldEpvaW5Db2x1bW5zIDxlbT5Kb2luIENvbHVtbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlX0pvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLX0gLy8gQXNzb2NpYXRpb25PdmVycmlkZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzNkMDBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlIEltcGw8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZQotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5Db2x1bW5zKCkgPGVtPkpvaW4gQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luQ29sdW1ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlX0pvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKQotCXsKLQkJaWYgKGpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCWpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0lNUExfX0pPSU5fQ09MVU1OUyk7Ci0JCX0KLQkJcmV0dXJuIGpvaW5Db2x1bW5zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0lNUExfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0lNUExfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSm9pbkNvbHVtbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0lNUExfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGpvaW5Db2x1bW5zICE9IG51bGwgJiYgIWpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzVmNGIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXR0cmlidXRlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEF0dHJpYnV0ZU1hcHBpbmcgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCk7Ci0JCi19IC8vIEF0dHJpYnV0ZU1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzYTg4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSNnZXRDb2x1bW4gPGVtPkNvbHVtbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBdHRyaWJ1dGVPdmVycmlkZSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbHVtbihYbWxDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9Db2x1bW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbENvbHVtbiBnZXRDb2x1bW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSNnZXRDb2x1bW4gPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEF0dHJpYnV0ZU92ZXJyaWRlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhODM1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxBdHRyaWJ1dGVPdmVycmlkZQotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbigpIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbHVtbiBjb2x1bW47Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb2x1bW4oWG1sQ29sdW1uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfQ29sdW1uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpCi0JewotCQlyZXR1cm4gY29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29sdW1uIG9sZENvbHVtbiA9IGNvbHVtbjsKLQkJY29sdW1uID0gbmV3Q29sdW1uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fQ09MVU1OLCBvbGRDb2x1bW4sIG5ld0NvbHVtbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCNnZXRDb2x1bW4gPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbikKLQl7Ci0JCWlmIChuZXdDb2x1bW4gIT0gY29sdW1uKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb2x1bW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29sdW1uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUExfX0NPTFVNTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMX19DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29sdW1uKG5ld0NvbHVtbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fQ09MVU1OLCBuZXdDb2x1bW4sIG5ld0NvbHVtbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMX19DT0xVTU46Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q29sdW1uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUExfX0NPTFVNTjoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fQ09MVU1OOgotCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fQ09MVU1OOgotCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUExfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fQ09MVU1OOgotCQkJCXJldHVybiBjb2x1bW4gIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUExfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBBdHRyaWJ1dGVPdmVycmlkZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNlVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjdhNjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhc2UgVGFibGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZSNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlI2dldFVuaXF1ZUNvbnN0cmFpbnRzIDxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VUYWJsZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQmFzZVRhYmxlIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlVGFibGVfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhdGFsb2coU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZVRhYmxlX0NhdGFsb2coKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENhdGFsb2coKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2hlbWEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZVRhYmxlX1NjaGVtYSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2NoZW1hKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NoZW1hKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlVGFibGVfVW5pcXVlQ29uc3RyYWludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4gZ2V0VW5pcXVlQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBuYW1lIGF0dGlidXRlLiAgSWYgdGhlIG5hbWUgYXR0aWJ1dGUgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICp0YWJsZSBlbGVtZW50LgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHNjaGVtYSBhdHRpYnV0ZS4gIElmIHRoZSBzY2hlbWEgYXR0aWJ1dGUgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICp0YWJsZSBlbGVtZW50LgotCSAqLwotCVRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgY2F0YWxvZyBhdHRpYnV0ZS4gIElmIHRoZSBjYXRhbG9nIGF0dGlidXRlIAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqdGFibGUgZWxlbWVudC4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZSgpOwotfSAvLyBYbWxCYXNlVGFibGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxMzhlMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzaWM8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRGZXRjaCA8ZW0+RmV0Y2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRPcHRpb25hbCA8ZW0+T3B0aW9uYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNpc0xvYiA8ZW0+TG9iPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0VGVtcG9yYWwgPGVtPlRlbXBvcmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0RW51bWVyYXRlZCA8ZW0+RW51bWVyYXRlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzaWMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEJhc2ljIGV4dGVuZHMgWG1sQXR0cmlidXRlTWFwcGluZywgQ29sdW1uTWFwcGluZwotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkxBWlkiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRGZXRjaChGZXRjaFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpY19GZXRjaCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IkxBWlkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZldGNoVHlwZSBnZXRGZXRjaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcHRpb25hbChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzaWNfT3B0aW9uYWwoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0T3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRPcHRpb25hbCA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcHRpb25hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvYihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzaWNfTG9iKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTG9iKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjaXNMb2IgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9iPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0xvYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9iKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKLQkgKiBAc2VlICNzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpY19UZW1wb3JhbCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFRlbXBvcmFsIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCi0JICogQHNlZSAjc2V0RW51bWVyYXRlZChFbnVtVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2ljX0VudW1lcmF0ZWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0RW51bWVyYXRlZCA8ZW0+RW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKLQkgKiBAc2VlICNnZXRFbnVtZXJhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnVtZXJhdGVkKEVudW1UeXBlIHZhbHVlKTsKLQotfSAvLyBCYXNpYwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpY0ltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDUwMTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2ljIEltcGw8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2ljSW1wbCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxCYXNpY0ltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxCYXNpYwotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbigpIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbHVtbiBjb2x1bW47Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBGZXRjaFR5cGUgRkVUQ0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmV0Y2goKSA8ZW0+RmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGZldGNoID0gRkVUQ0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWwoKSA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gT1BUSU9OQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWwoKSA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBvcHRpb25hbCA9IE9QVElPTkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9iKCkgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMb2IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0JfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9iKCkgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMb2IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxvYiA9IExPQl9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRlbXBvcmFsVHlwZSBURU1QT1JBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW1wb3JhbCgpIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWwgPSBURU1QT1JBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVudW1UeXBlIEVOVU1FUkFURURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW51bWVyYXRlZCgpIDxlbT5FbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnVtZXJhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW51bVR5cGUgZW51bWVyYXRlZCA9IEVOVU1FUkFURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQmFzaWNJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0JBU0lDX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb2x1bW4oWG1sQ29sdW1uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKQotCXsKLQkJcmV0dXJuIGNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENvbHVtbiBvbGRDb2x1bW4gPSBjb2x1bW47Ci0JCWNvbHVtbiA9IG5ld0NvbHVtbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fQ09MVU1OLCBvbGRDb2x1bW4sIG5ld0NvbHVtbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljSW1wbCNnZXRDb2x1bW4gPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbikKLQl7Ci0JCWlmIChuZXdDb2x1bW4gIT0gY29sdW1uKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb2x1bW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29sdW1uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fQ09MVU1OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb2x1bW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29sdW1uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fQ09MVU1OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbHVtbihuZXdDb2x1bW4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fQ09MVU1OLCBuZXdDb2x1bW4sIG5ld0NvbHVtbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkxBWlkiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRGZXRjaChGZXRjaFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpY19GZXRjaCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IkxBWlkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKQotCXsKLQkJcmV0dXJuIGZldGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0ltcGwjZ2V0RmV0Y2ggPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0RmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpCi0JewotCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSBmZXRjaDsKLQkJZmV0Y2ggPSBuZXdGZXRjaCA9PSBudWxsID8gRkVUQ0hfRURFRkFVTFQgOiBuZXdGZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fRkVUQ0gsIG9sZEZldGNoLCBmZXRjaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3B0aW9uYWwoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2ljX09wdGlvbmFsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpCi0JewotCQlyZXR1cm4gb3B0aW9uYWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljSW1wbCNnZXRPcHRpb25hbCA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcHRpb25hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gbmV3T3B0aW9uYWwpCi0JewotCQlCb29sZWFuIG9sZE9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCW9wdGlvbmFsID0gbmV3T3B0aW9uYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX09QVElPTkFMLCBvbGRPcHRpb25hbCwgb3B0aW9uYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvYihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzaWNfTG9iKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYigpCi0JewotCQlyZXR1cm4gbG9iOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0ltcGwjaXNMb2IgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9iPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0xvYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvYihib29sZWFuIG5ld0xvYikKLQl7Ci0JCWJvb2xlYW4gb2xkTG9iID0gbG9iOwotCQlsb2IgPSBuZXdMb2I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0xPQiwgb2xkTG9iLCBsb2IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI3NldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2ljX1RlbXBvcmFsKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpCi0JewotCQlyZXR1cm4gdGVtcG9yYWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljSW1wbCNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKLQkgKiBAc2VlICNnZXRUZW1wb3JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkKLQl7Ci0JCVRlbXBvcmFsVHlwZSBvbGRUZW1wb3JhbCA9IHRlbXBvcmFsOwotCQl0ZW1wb3JhbCA9IG5ld1RlbXBvcmFsID09IG51bGwgPyBURU1QT1JBTF9FREVGQVVMVCA6IG5ld1RlbXBvcmFsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19URU1QT1JBTCwgb2xkVGVtcG9yYWwsIHRlbXBvcmFsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCi0JICogQHNlZSAjc2V0RW51bWVyYXRlZChFbnVtVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2ljX0VudW1lcmF0ZWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpCi0JewotCQlyZXR1cm4gZW51bWVyYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNJbXBsI2dldEVudW1lcmF0ZWQgPGVtPkVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCi0JICogQHNlZSAjZ2V0RW51bWVyYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgbmV3RW51bWVyYXRlZCkKLQl7Ci0JCUVudW1UeXBlIG9sZEVudW1lcmF0ZWQgPSBlbnVtZXJhdGVkOwotCQllbnVtZXJhdGVkID0gbmV3RW51bWVyYXRlZCA9PSBudWxsID8gRU5VTUVSQVRFRF9FREVGQVVMVCA6IG5ld0VudW1lcmF0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0VOVU1FUkFURUQsIG9sZEVudW1lcmF0ZWQsIGVudW1lcmF0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fQ09MVU1OOgotCQkJCXJldHVybiBiYXNpY1NldENvbHVtbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0NPTFVNTjoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0ZFVENIOgotCQkJCXJldHVybiBnZXRGZXRjaCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19PUFRJT05BTDoKLQkJCQlyZXR1cm4gZ2V0T3B0aW9uYWwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fTE9COgotCQkJCXJldHVybiBpc0xvYigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fVEVNUE9SQUw6Ci0JCQkJcmV0dXJuIGdldFRlbXBvcmFsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0VOVU1FUkFURUQ6Ci0JCQkJcmV0dXJuIGdldEVudW1lcmF0ZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0NPTFVNTjoKLQkJCQlzZXRDb2x1bW4oKFhtbENvbHVtbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19GRVRDSDoKLQkJCQlzZXRGZXRjaCgoRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX09QVElPTkFMOgotCQkJCXNldE9wdGlvbmFsKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0xPQjoKLQkJCQlzZXRMb2IoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19URU1QT1JBTDoKLQkJCQlzZXRUZW1wb3JhbCgoVGVtcG9yYWxUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0VOVU1FUkFURUQ6Ci0JCQkJc2V0RW51bWVyYXRlZCgoRW51bVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fQ09MVU1OOgotCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fRkVUQ0g6Ci0JCQkJc2V0RmV0Y2goRkVUQ0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fT1BUSU9OQUw6Ci0JCQkJc2V0T3B0aW9uYWwoT1BUSU9OQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fTE9COgotCQkJCXNldExvYihMT0JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fVEVNUE9SQUw6Ci0JCQkJc2V0VGVtcG9yYWwoVEVNUE9SQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fRU5VTUVSQVRFRDoKLQkJCQlzZXRFbnVtZXJhdGVkKEVOVU1FUkFURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0NPTFVNTjoKLQkJCQlyZXR1cm4gY29sdW1uICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0ZFVENIOgotCQkJCXJldHVybiBmZXRjaCAhPSBGRVRDSF9FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fT1BUSU9OQUw6Ci0JCQkJcmV0dXJuIE9QVElPTkFMX0VERUZBVUxUID09IG51bGwgPyBvcHRpb25hbCAhPSBudWxsIDogIU9QVElPTkFMX0VERUZBVUxULmVxdWFscyhvcHRpb25hbCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0xPQjoKLQkJCQlyZXR1cm4gbG9iICE9IExPQl9FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fVEVNUE9SQUw6Ci0JCQkJcmV0dXJuIHRlbXBvcmFsICE9IFRFTVBPUkFMX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19FTlVNRVJBVEVEOgotCQkJCXJldHVybiBlbnVtZXJhdGVkICE9IEVOVU1FUkFURURfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IENvbHVtbk1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuQ09MVU1OX01BUFBJTkdfX0NPTFVNTjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXNpYy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fRkVUQ0g6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fRkVUQ0g7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19PUFRJT05BTDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19PUFRJT05BTDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0xPQjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19MT0I7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19URU1QT1JBTDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19URU1QT1JBTDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0VOVU1FUkFURUQ6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fRU5VTUVSQVRFRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IENvbHVtbk1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQ09MVU1OX01BUFBJTkdfX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0NPTFVNTjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXNpYy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0ZFVENIOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fRkVUQ0g7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT1BUSU9OQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19PUFRJT05BTDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19MT0I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19MT0I7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19URU1QT1JBTDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19FTlVNRVJBVEVEOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fRU5VTUVSQVRFRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmZXRjaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3B0aW9uYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG9wdGlvbmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvYik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGVtcG9yYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRlbXBvcmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnVtZXJhdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlbnVtZXJhdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIEJhc2ljSW1wbApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MmYzODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4jZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4jZ2V0UHJlY2lzaW9uIDxlbT5QcmVjaXNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENvbHVtbiBleHRlbmRzIFhtbEFic3RyYWN0Q29sdW1uCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZW5ndGgoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbHVtbl9MZW5ndGgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW50ZWdlciBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4jZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZW5ndGgoSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVjaXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjaXNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWNpc2lvbihJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29sdW1uX1ByZWNpc2lvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnRlZ2VyIGdldFByZWNpc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiNnZXRQcmVjaXNpb24gPGVtPlByZWNpc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY2lzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVjaXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NhbGUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbHVtbl9TY2FsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnRlZ2VyIGdldFNjYWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NhbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTY2FsZShJbnRlZ2VyIHZhbHVlKTsKLQotfSAvLyBDb2x1bW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29sdW1uSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxDb2x1bW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDk2YmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxDb2x1bW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29sdW1uIEltcGw8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbHVtbkltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQ29sdW1uSW1wbCBleHRlbmRzIEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4gaW1wbGVtZW50cyBYbWxDb2x1bW4KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVuZ3RoKCkgPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgTEVOR1RIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlbmd0aCgpIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgbGVuZ3RoID0gTEVOR1RIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNpc2lvbigpIDxlbT5QcmVjaXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNpc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFBSRUNJU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjaXNpb24oKSA8ZW0+UHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjaXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIHByZWNpc2lvbiA9IFBSRUNJU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2FsZSgpIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBTQ0FMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2FsZSgpIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIHNjYWxlID0gU0NBTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29sdW1uSW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9DT0xVTU5fSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExlbmd0aChJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29sdW1uX0xlbmd0aCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKQotCXsKLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uSW1wbCNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoSW50ZWdlciBuZXdMZW5ndGgpCi0JewotCQlJbnRlZ2VyIG9sZExlbmd0aCA9IGxlbmd0aDsKLQkJbGVuZ3RoID0gbmV3TGVuZ3RoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fTEVOR1RILCBvbGRMZW5ndGgsIGxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlY2lzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlY2lzaW9uKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb2x1bW5fUHJlY2lzaW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldFByZWNpc2lvbigpCi0JewotCQlyZXR1cm4gcHJlY2lzaW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW5JbXBsI2dldFByZWNpc2lvbiA8ZW0+UHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjaXNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWNpc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIG5ld1ByZWNpc2lvbikKLQl7Ci0JCUludGVnZXIgb2xkUHJlY2lzaW9uID0gcHJlY2lzaW9uOwotCQlwcmVjaXNpb24gPSBuZXdQcmVjaXNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19QUkVDSVNJT04sIG9sZFByZWNpc2lvbiwgcHJlY2lzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2FsZShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29sdW1uX1NjYWxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldFNjYWxlKCkKLQl7Ci0JCXJldHVybiBzY2FsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uSW1wbCNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjYWxlKEludGVnZXIgbmV3U2NhbGUpCi0JewotCQlJbnRlZ2VyIG9sZFNjYWxlID0gc2NhbGU7Ci0JCXNjYWxlID0gbmV3U2NhbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19TQ0FMRSwgb2xkU2NhbGUsIHNjYWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19MRU5HVEg6Ci0JCQkJcmV0dXJuIGdldExlbmd0aCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fUFJFQ0lTSU9OOgotCQkJCXJldHVybiBnZXRQcmVjaXNpb24oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX1NDQUxFOgotCQkJCXJldHVybiBnZXRTY2FsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX1BSRUNJU0lPTjoKLQkJCQlzZXRQcmVjaXNpb24oKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX1NDQUxFOgotCQkJCXNldFNjYWxlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19MRU5HVEg6Ci0JCQkJc2V0TGVuZ3RoKExFTkdUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fUFJFQ0lTSU9OOgotCQkJCXNldFByZWNpc2lvbihQUkVDSVNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX1NDQUxFOgotCQkJCXNldFNjYWxlKFNDQUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fTEVOR1RIOgotCQkJCXJldHVybiBMRU5HVEhfRURFRkFVTFQgPT0gbnVsbCA/IGxlbmd0aCAhPSBudWxsIDogIUxFTkdUSF9FREVGQVVMVC5lcXVhbHMobGVuZ3RoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX1BSRUNJU0lPTjoKLQkJCQlyZXR1cm4gUFJFQ0lTSU9OX0VERUZBVUxUID09IG51bGwgPyBwcmVjaXNpb24gIT0gbnVsbCA6ICFQUkVDSVNJT05fRURFRkFVTFQuZXF1YWxzKHByZWNpc2lvbik7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19TQ0FMRToKLQkJCQlyZXR1cm4gU0NBTEVfRURFRkFVTFQgPT0gbnVsbCA/IHNjYWxlICE9IG51bGwgOiAhU0NBTEVfRURFRkFVTFQuZXF1YWxzKHNjYWxlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sdW1uLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fTEVOR1RIOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09MVU1OX19MRU5HVEg7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fUFJFQ0lTSU9OOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09MVU1OX19QUkVDSVNJT047Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fU0NBTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NDQUxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sdW1uLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX0xFTkdUSDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19MRU5HVEg7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1BSRUNJU0lPTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19QUkVDSVNJT047Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NDQUxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX1NDQUxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGVuZ3RoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZW5ndGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZWNpc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlY2lzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzY2FsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2NhbGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gQ29sdW1uSW1wbApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0Y2QwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjcmltaW5hdG9yIENvbHVtbjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0RGlzY3JpbWluYXRvclR5cGUgPGVtPkRpc2NyaW1pbmF0b3IgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRGlzY3JpbWluYXRvckNvbHVtbiBleHRlbmRzIEFic3RyYWN0WG1sTmFtZWRDb2x1bW4KLXsKLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEaXNjcmltaW5hdG9yVHlwZSBESVNDUklNSU5BVE9SX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzY3JpbWluYXRvclR5cGUoKSA8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNjcmltaW5hdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlID0gRElTQ1JJTUlOQVRPUl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlbmd0aCgpIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIExFTkdUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGxlbmd0aCA9IExFTkdUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxEaXNjcmltaW5hdG9yQ29sdW1uKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJTVFJJTkciPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NyaW1pbmF0b3IgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUKLQkgKiBAc2VlICNzZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbERpc2NyaW1pbmF0b3JDb2x1bW5fRGlzY3JpbWluYXRvclR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJTVFJJTkciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREaXNjcmltaW5hdG9yVHlwZSgpCi0JewotCQlyZXR1cm4gZGlzY3JpbWluYXRvclR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0RGlzY3JpbWluYXRvclR5cGUgPGVtPkRpc2NyaW1pbmF0b3IgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZQotCSAqIEBzZWUgI2dldERpc2NyaW1pbmF0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUgbmV3RGlzY3JpbWluYXRvclR5cGUpCi0JewotCQlEaXNjcmltaW5hdG9yVHlwZSBvbGREaXNjcmltaW5hdG9yVHlwZSA9IGRpc2NyaW1pbmF0b3JUeXBlOwotCQlkaXNjcmltaW5hdG9yVHlwZSA9IG5ld0Rpc2NyaW1pbmF0b3JUeXBlID09IG51bGwgPyBESVNDUklNSU5BVE9SX1RZUEVfRURFRkFVTFQgOiBuZXdEaXNjcmltaW5hdG9yVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRSwgb2xkRGlzY3JpbWluYXRvclR5cGUsIGRpc2NyaW1pbmF0b3JUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZW5ndGgoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbERpc2NyaW1pbmF0b3JDb2x1bW5fTGVuZ3RoKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpCi0JewotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXNjcmltaW5hdG9yQ29sdW1uI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIG5ld0xlbmd0aCkKLQl7Ci0JCUludGVnZXIgb2xkTGVuZ3RoID0gbGVuZ3RoOwotCQlsZW5ndGggPSBuZXdMZW5ndGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEgsIG9sZExlbmd0aCwgbGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEg6Ci0JCQkJcmV0dXJuIGdldExlbmd0aCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRToKLQkJCQlzZXREaXNjcmltaW5hdG9yVHlwZSgoRGlzY3JpbWluYXRvclR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRToKLQkJCQlzZXREaXNjcmltaW5hdG9yVHlwZShESVNDUklNSU5BVE9SX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoTEVOR1RIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFOgotCQkJCXJldHVybiBkaXNjcmltaW5hdG9yVHlwZSAhPSBESVNDUklNSU5BVE9SX1RZUEVfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEg6Ci0JCQkJcmV0dXJuIExFTkdUSF9FREVGQVVMVCA9PSBudWxsID8gbGVuZ3RoICE9IG51bGwgOiAhTEVOR1RIX0VERUZBVUxULmVxdWFscyhsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkaXNjcmltaW5hdG9yVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGlzY3JpbWluYXRvclR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxlbmd0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGVuZ3RoKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIERpc2NyaW1pbmF0b3JDb2x1bW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzNlMjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVtYmVkZGFibGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRW1iZWRkYWJsZSBleHRlbmRzIEFic3RyYWN0WG1sVHlwZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBY2Nlc3NUeXBlIEFDQ0VTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRW1iZWRkYWJsZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgWG1sRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoWG1sRW50aXR5TWFwcGluZ3MpIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRU1CRUREQUJMRTsKLQl9Ci0KLX0gLy8gRW1iZWRkYWJsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTE1ODRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVtYmVkZGVkPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW1iZWRkZWQgZXh0ZW5kcyBCYXNlWG1sRW1iZWRkZWQKLXsKLQotfSAvLyBFbWJlZGRlZApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkSWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmNjcyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkSWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVtYmVkZGVkIElkPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZElkKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbWJlZGRlZElkIGV4dGVuZHMgWG1sQXR0cmlidXRlTWFwcGluZywgQmFzZVhtbEVtYmVkZGVkCi17Ci0KLX0gLy8gRW1iZWRkZWRJZApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDY2YWMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWRJZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW1iZWRkZWQgSWQ8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWRJbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEVtYmVkZGVkSWRJbXBsIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgWG1sRW1iZWRkZWRJZAotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZU92ZXJyaWRlcygpIDxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRW1iZWRkZWRJZEltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRU1CRURERURfSURfSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QmFzZVhtbEVtYmVkZGVkX0F0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JewotCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGVzID09IG51bGwpCi0JCXsKLQkJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4oWG1sQXR0cmlidXRlT3ZlcnJpZGUuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0lNUExfX0FUVFJJQlVURV9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0lNUExfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBdHRyaWJ1dGVPdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0lNUExfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVPdmVycmlkZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBCYXNlWG1sRW1iZWRkZWQuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0lNUExfX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLkJBU0VfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVtYmVkZGVkSWQuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IEJhc2VYbWxFbWJlZGRlZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5CQVNFX1hNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0lNUExfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW1iZWRkZWRJZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi19IC8vIEVtYmVkZGVkSWQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTA0ZmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVtYmVkZGVkPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZEltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRW1iZWRkZWRJbXBsIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgWG1sRW1iZWRkZWQKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEVtYmVkZGVkSW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTUJFRERFRF9JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRCYXNlWG1sRW1iZWRkZWRfQXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKLQl7Ci0JCWlmIChhdHRyaWJ1dGVPdmVycmlkZXMgPT0gbnVsbCkKLQkJewotCQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPihYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lNUExfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZU92ZXJyaWRlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IEJhc2VYbWxFbWJlZGRlZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuQkFTRV9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW1iZWRkZWQuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IEJhc2VYbWxFbWJlZGRlZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5CQVNFX1hNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lNUExfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW1iZWRkZWQuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotfSAvLyBFbWJlZGRlZApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMThjYjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0U2Vjb25kYXJ5VGFibGVzIDxlbT5TZWNvbmRhcnkgVGFibGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByaW1hcnlLZXlKb2luQ29sdW1ucyA8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldElkQ2xhc3MgPGVtPklkIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEluaGVyaXRhbmNlIDxlbT5Jbmhlcml0YW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yVmFsdWUgPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0RGlzY3JpbWluYXRvckNvbHVtbiA8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0U2VxdWVuY2VHZW5lcmF0b3IgPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRUYWJsZUdlbmVyYXRvciA8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE5hbWVkUXVlcmllcyA8ZW0+TmFtZWQgUXVlcmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMgPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFNxbFJlc3VsdFNldE1hcHBpbmdzIDxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIDxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByZVBlcnNpc3QgPGVtPlByZSBQZXJzaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFBvc3RQZXJzaXN0IDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UHJlUmVtb3ZlIDxlbT5QcmUgUmVtb3ZlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEF0dHJpYnV0ZU92ZXJyaWRlcyA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcyA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHkoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RYbWxUeXBlTWFwcGluZwotewotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFjY2Vzc1R5cGUgQUNDRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGUoKSA8ZW0+VGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVGFibGUgdGFibGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWNvbmRhcnlUYWJsZXMoKSA8ZW0+U2Vjb25kYXJ5IFRhYmxlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWNvbmRhcnlUYWJsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWRDbGFzcygpIDxlbT5JZCBDbGFzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbElkQ2xhc3MgaWRDbGFzczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaGVyaXRhbmNlKCkgPGVtPkluaGVyaXRhbmNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmhlcml0YW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEluaGVyaXRhbmNlIGluaGVyaXRhbmNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2NyaW1pbmF0b3JWYWx1ZSgpIDxlbT5EaXNjcmltaW5hdG9yIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNjcmltaW5hdG9yVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NSSU1JTkFUT1JfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkgPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc2NyaW1pbmF0b3JWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkaXNjcmltaW5hdG9yVmFsdWUgPSBESVNDUklNSU5BVE9SX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpIDxlbT5EaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbERpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkgPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhYmxlR2VuZXJhdG9yKCkgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVkUXVlcmllcygpIDxlbT5OYW1lZCBRdWVyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVkUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkUXVlcnk+IG5hbWVkUXVlcmllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVkTmF0aXZlUXVlcmllcygpIDxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpIDxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFNxbFJlc3VsdFNldE1hcHBpbmc+IHNxbFJlc3VsdFNldE1hcHBpbmdzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMgPSBFWENMVURFX0RFRkFVTFRfTElTVEVORVJTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKSA8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKSA8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgPSBFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5TGlzdGVuZXJzKCkgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudGl0eUxpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eUxpc3RlbmVycyBlbnRpdHlMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVQZXJzaXN0KCkgPGVtPlByZSBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlUGVyc2lzdCBwcmVQZXJzaXN0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdFBlcnNpc3QoKSA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0UGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RQZXJzaXN0IHBvc3RQZXJzaXN0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlUmVtb3ZlKCkgPGVtPlByZSBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByZVJlbW92ZSBwcmVSZW1vdmU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0UmVtb3ZlKCkgPGVtPlBvc3QgUmVtb3ZlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0UmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFJlbW92ZSBwb3N0UmVtb3ZlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlVXBkYXRlKCkgPGVtPlByZSBVcGRhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByZVVwZGF0ZSBwcmVVcGRhdGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0VXBkYXRlKCkgPGVtPlBvc3QgVXBkYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0VXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFVwZGF0ZSBwb3N0VXBkYXRlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdExvYWQoKSA8ZW0+UG9zdCBMb2FkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RMb2FkIHBvc3RMb2FkOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEVudGl0eSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChYbWxFbnRpdHlNYXBwaW5ncykgZUNvbnRhaW5lcigpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRU5USVRZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGFibGUoWG1sVGFibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfVGFibGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRhYmxlIGdldFRhYmxlKCkKLQl7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUYWJsZShYbWxUYWJsZSBuZXdUYWJsZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFRhYmxlIG9sZFRhYmxlID0gdGFibGU7Ci0JCXRhYmxlID0gbmV3VGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEUsIG9sZFRhYmxlLCBuZXdUYWJsZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFhtbFRhYmxlIG5ld1RhYmxlKQotCXsKLQkJaWYgKG5ld1RhYmxlICE9IHRhYmxlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YWJsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YWJsZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1RhYmxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RhYmxlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUYWJsZShuZXdUYWJsZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFLCBuZXdUYWJsZSwgbmV3VGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWNvbmRhcnkgVGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY29uZGFyeSBUYWJsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWNvbmRhcnkgVGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X1NlY29uZGFyeVRhYmxlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sU2Vjb25kYXJ5VGFibGU+IGdldFNlY29uZGFyeVRhYmxlcygpCi0JewotCQlpZiAoc2Vjb25kYXJ5VGFibGVzID09IG51bGwpCi0JCXsKLQkJCXNlY29uZGFyeVRhYmxlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxTZWNvbmRhcnlUYWJsZT4oWG1sU2Vjb25kYXJ5VGFibGUuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUyk7Ci0JCX0KLQkJcmV0dXJuIHNlY29uZGFyeVRhYmxlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X1ByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JewotCQlpZiAocHJpbWFyeUtleUpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW5zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkIENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZCBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZCBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SWRDbGFzcyhYbWxJZENsYXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X0lkQ2xhc3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbElkQ2xhc3MgZ2V0SWRDbGFzcygpCi0JewotCQlyZXR1cm4gaWRDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJZENsYXNzKFhtbElkQ2xhc3MgbmV3SWRDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbElkQ2xhc3Mgb2xkSWRDbGFzcyA9IGlkQ2xhc3M7Ci0JCWlkQ2xhc3MgPSBuZXdJZENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTLCBvbGRJZENsYXNzLCBuZXdJZENsYXNzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldElkQ2xhc3MgPGVtPklkIENsYXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZCBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SWRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkQ2xhc3MoWG1sSWRDbGFzcyBuZXdJZENsYXNzKQotCXsKLQkJaWYgKG5ld0lkQ2xhc3MgIT0gaWRDbGFzcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaWRDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpZENsYXNzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SWRDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJZENsYXNzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJZENsYXNzKG5ld0lkQ2xhc3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUywgbmV3SWRDbGFzcywgbmV3SWRDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaGVyaXRhbmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbmhlcml0YW5jZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbmhlcml0YW5jZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW5oZXJpdGFuY2UoSW5oZXJpdGFuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfSW5oZXJpdGFuY2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaGVyaXRhbmNlIGdldEluaGVyaXRhbmNlKCkKLQl7Ci0JCXJldHVybiBpbmhlcml0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbmhlcml0YW5jZShJbmhlcml0YW5jZSBuZXdJbmhlcml0YW5jZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCUluaGVyaXRhbmNlIG9sZEluaGVyaXRhbmNlID0gaW5oZXJpdGFuY2U7Ci0JCWluaGVyaXRhbmNlID0gbmV3SW5oZXJpdGFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0UsIG9sZEluaGVyaXRhbmNlLCBuZXdJbmhlcml0YW5jZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJbmhlcml0YW5jZSA8ZW0+SW5oZXJpdGFuY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaGVyaXRhbmNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbmhlcml0YW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaGVyaXRhbmNlKEluaGVyaXRhbmNlIG5ld0luaGVyaXRhbmNlKQotCXsKLQkJaWYgKG5ld0luaGVyaXRhbmNlICE9IGluaGVyaXRhbmNlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbmhlcml0YW5jZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbmhlcml0YW5jZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0UsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luaGVyaXRhbmNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luaGVyaXRhbmNlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkhFUklUQU5DRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbmhlcml0YW5jZShuZXdJbmhlcml0YW5jZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFLCBuZXdJbmhlcml0YW5jZSwgbmV3SW5oZXJpdGFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNjcmltaW5hdG9yIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERpc2NyaW1pbmF0b3JWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvclZhbHVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVmFsdWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkKLQl7Ci0JCXJldHVybiBkaXNjcmltaW5hdG9yVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yVmFsdWUgPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERpc2NyaW1pbmF0b3JWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2NyaW1pbmF0b3JWYWx1ZShTdHJpbmcgbmV3RGlzY3JpbWluYXRvclZhbHVlKQotCXsKLQkJU3RyaW5nIG9sZERpc2NyaW1pbmF0b3JWYWx1ZSA9IGRpc2NyaW1pbmF0b3JWYWx1ZTsKLQkJZGlzY3JpbWluYXRvclZhbHVlID0gbmV3RGlzY3JpbWluYXRvclZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUUsIG9sZERpc2NyaW1pbmF0b3JWYWx1ZSwgZGlzY3JpbWluYXRvclZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREaXNjcmltaW5hdG9yQ29sdW1uKFhtbERpc2NyaW1pbmF0b3JDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvckNvbHVtbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRGlzY3JpbWluYXRvckNvbHVtbiBnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkKLQl7Ci0JCXJldHVybiBkaXNjcmltaW5hdG9yQ29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERpc2NyaW1pbmF0b3JDb2x1bW4oWG1sRGlzY3JpbWluYXRvckNvbHVtbiBuZXdEaXNjcmltaW5hdG9yQ29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sRGlzY3JpbWluYXRvckNvbHVtbiBvbGREaXNjcmltaW5hdG9yQ29sdW1uID0gZGlzY3JpbWluYXRvckNvbHVtbjsKLQkJZGlzY3JpbWluYXRvckNvbHVtbiA9IG5ld0Rpc2NyaW1pbmF0b3JDb2x1bW47Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU4sIG9sZERpc2NyaW1pbmF0b3JDb2x1bW4sIG5ld0Rpc2NyaW1pbmF0b3JDb2x1bW4pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0RGlzY3JpbWluYXRvckNvbHVtbiA8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzY3JpbWluYXRvckNvbHVtbihYbWxEaXNjcmltaW5hdG9yQ29sdW1uIG5ld0Rpc2NyaW1pbmF0b3JDb2x1bW4pCi0JewotCQlpZiAobmV3RGlzY3JpbWluYXRvckNvbHVtbiAhPSBkaXNjcmltaW5hdG9yQ29sdW1uKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChkaXNjcmltaW5hdG9yQ29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRpc2NyaW1pbmF0b3JDb2x1bW4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdEaXNjcmltaW5hdG9yQ29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Rpc2NyaW1pbmF0b3JDb2x1bW4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldERpc2NyaW1pbmF0b3JDb2x1bW4obmV3RGlzY3JpbWluYXRvckNvbHVtbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OLCBuZXdEaXNjcmltaW5hdG9yQ29sdW1uLCBuZXdEaXNjcmltaW5hdG9yQ29sdW1uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9TZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igb2xkU2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcjsKLQkJc2VxdWVuY2VHZW5lcmF0b3IgPSBuZXdTZXF1ZW5jZUdlbmVyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1IsIG9sZFNlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpCi0JewotCQlpZiAobmV3U2VxdWVuY2VHZW5lcmF0b3IgIT0gc2VxdWVuY2VHZW5lcmF0b3IpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlcXVlbmNlR2VuZXJhdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1NlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlcXVlbmNlR2VuZXJhdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2VxdWVuY2VHZW5lcmF0b3IobmV3U2VxdWVuY2VHZW5lcmF0b3IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfVGFibGVHZW5lcmF0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciBuZXdUYWJsZUdlbmVyYXRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGFibGVHZW5lcmF0b3I7Ci0JCXRhYmxlR2VuZXJhdG9yID0gbmV3VGFibGVHZW5lcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SLCBvbGRUYWJsZUdlbmVyYXRvciwgbmV3VGFibGVHZW5lcmF0b3IpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0VGFibGVHZW5lcmF0b3IgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yKQotCXsKLQkJaWYgKG5ld1RhYmxlR2VuZXJhdG9yICE9IHRhYmxlR2VuZXJhdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YWJsZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YWJsZUdlbmVyYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUYWJsZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUYWJsZUdlbmVyYXRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRhYmxlR2VuZXJhdG9yKG5ld1RhYmxlR2VuZXJhdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SLCBuZXdUYWJsZUdlbmVyYXRvciwgbmV3VGFibGVHZW5lcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfTmFtZWRRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZFF1ZXJ5PiBnZXROYW1lZFF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkUXVlcmllcyA9PSBudWxsKQotCQl7Ci0JCQluYW1lZFF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTmFtZWRRdWVyeT4oWG1sTmFtZWRRdWVyeS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWRRdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9OYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE5hbWVkTmF0aXZlUXVlcnk+IGdldE5hbWVkTmF0aXZlUXVlcmllcygpCi0JewotCQlpZiAobmFtZWROYXRpdmVRdWVyaWVzID09IG51bGwpCi0JCXsKLQkJCW5hbWVkTmF0aXZlUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PihYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWROYXRpdmVRdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3FsUmVzdWx0U2V0TWFwcGluZz4gZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCXsKLQkJaWYgKHNxbFJlc3VsdFNldE1hcHBpbmdzID09IG51bGwpCi0JCXsKLQkJCXNxbFJlc3VsdFNldE1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFNxbFJlc3VsdFNldE1hcHBpbmc+KFNxbFJlc3VsdFNldE1hcHBpbmcuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBzcWxSZXN1bHRTZXRNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycyA8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKGJvb2xlYW4gbmV3RXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMpCi0JewotCQlib29sZWFuIG9sZEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzID0gZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnM7Ci0JCWV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzID0gbmV3RXhjbHVkZURlZmF1bHRMaXN0ZW5lcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUywgb2xkRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMsIGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiBleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyhib29sZWFuIG5ld0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKQotCXsKLQkJYm9vbGVhbiBvbGRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyA9IGV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzOwotCQlleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyA9IG5ld0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMsIG9sZEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzLCBleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RW50aXR5TGlzdGVuZXJzKEVudGl0eUxpc3RlbmVycykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9FbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudGl0eUxpc3RlbmVycyBnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIGVudGl0eUxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbnRpdHlMaXN0ZW5lcnMoRW50aXR5TGlzdGVuZXJzIG5ld0VudGl0eUxpc3RlbmVycywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCUVudGl0eUxpc3RlbmVycyBvbGRFbnRpdHlMaXN0ZW5lcnMgPSBlbnRpdHlMaXN0ZW5lcnM7Ci0JCWVudGl0eUxpc3RlbmVycyA9IG5ld0VudGl0eUxpc3RlbmVyczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTLCBvbGRFbnRpdHlMaXN0ZW5lcnMsIG5ld0VudGl0eUxpc3RlbmVycyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVudGl0eUxpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eUxpc3RlbmVycyhFbnRpdHlMaXN0ZW5lcnMgbmV3RW50aXR5TGlzdGVuZXJzKQotCXsKLQkJaWYgKG5ld0VudGl0eUxpc3RlbmVycyAhPSBlbnRpdHlMaXN0ZW5lcnMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVudGl0eUxpc3RlbmVycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllbnRpdHlMaXN0ZW5lcnMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0VudGl0eUxpc3RlbmVycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFbnRpdHlMaXN0ZW5lcnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RW50aXR5TGlzdGVuZXJzKG5ld0VudGl0eUxpc3RlbmVycywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlMsIG5ld0VudGl0eUxpc3RlbmVycywgbmV3RW50aXR5TGlzdGVuZXJzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVQZXJzaXN0KFByZVBlcnNpc3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfUHJlUGVyc2lzdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlUGVyc2lzdCBnZXRQcmVQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiBwcmVQZXJzaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZVBlcnNpc3QoUHJlUGVyc2lzdCBuZXdQcmVQZXJzaXN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUHJlUGVyc2lzdCBvbGRQcmVQZXJzaXN0ID0gcHJlUGVyc2lzdDsKLQkJcHJlUGVyc2lzdCA9IG5ld1ByZVBlcnNpc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1BFUlNJU1QsIG9sZFByZVBlcnNpc3QsIG5ld1ByZVBlcnNpc3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UHJlUGVyc2lzdCA8ZW0+UHJlIFBlcnNpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlUGVyc2lzdChQcmVQZXJzaXN0IG5ld1ByZVBlcnNpc3QpCi0JewotCQlpZiAobmV3UHJlUGVyc2lzdCAhPSBwcmVQZXJzaXN0KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVQZXJzaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByZVBlcnNpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVQZXJzaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ByZVBlcnNpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZVBlcnNpc3QobmV3UHJlUGVyc2lzdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNULCBuZXdQcmVQZXJzaXN0LCBuZXdQcmVQZXJzaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3N0UGVyc2lzdChQb3N0UGVyc2lzdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9Qb3N0UGVyc2lzdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9zdFBlcnNpc3QgZ2V0UG9zdFBlcnNpc3QoKQotCXsKLQkJcmV0dXJuIHBvc3RQZXJzaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3RQZXJzaXN0KFBvc3RQZXJzaXN0IG5ld1Bvc3RQZXJzaXN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUG9zdFBlcnNpc3Qgb2xkUG9zdFBlcnNpc3QgPSBwb3N0UGVyc2lzdDsKLQkJcG9zdFBlcnNpc3QgPSBuZXdQb3N0UGVyc2lzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1QsIG9sZFBvc3RQZXJzaXN0LCBuZXdQb3N0UGVyc2lzdCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQb3N0UGVyc2lzdCA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc3RQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFBlcnNpc3QoUG9zdFBlcnNpc3QgbmV3UG9zdFBlcnNpc3QpCi0JewotCQlpZiAobmV3UG9zdFBlcnNpc3QgIT0gcG9zdFBlcnNpc3QpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3RQZXJzaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBvc3RQZXJzaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3RQZXJzaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bvc3RQZXJzaXN0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdFBlcnNpc3QobmV3UG9zdFBlcnNpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1QsIG5ld1Bvc3RQZXJzaXN0LCBuZXdQb3N0UGVyc2lzdCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlUmVtb3ZlKFByZVJlbW92ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9QcmVSZW1vdmUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByZVJlbW92ZSBnZXRQcmVSZW1vdmUoKQotCXsKLQkJcmV0dXJuIHByZVJlbW92ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVSZW1vdmUoUHJlUmVtb3ZlIG5ld1ByZVJlbW92ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVByZVJlbW92ZSBvbGRQcmVSZW1vdmUgPSBwcmVSZW1vdmU7Ci0JCXByZVJlbW92ZSA9IG5ld1ByZVJlbW92ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUkVNT1ZFLCBvbGRQcmVSZW1vdmUsIG5ld1ByZVJlbW92ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQcmVSZW1vdmUgPGVtPlByZSBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZVJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZVJlbW92ZShQcmVSZW1vdmUgbmV3UHJlUmVtb3ZlKQotCXsKLQkJaWYgKG5ld1ByZVJlbW92ZSAhPSBwcmVSZW1vdmUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByZVJlbW92ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcmVSZW1vdmUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9SRU1PVkUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZVJlbW92ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQcmVSZW1vdmUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9SRU1PVkUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlUmVtb3ZlKG5ld1ByZVJlbW92ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9SRU1PVkUsIG5ld1ByZVJlbW92ZSwgbmV3UHJlUmVtb3ZlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3N0UmVtb3ZlKFBvc3RSZW1vdmUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfUG9zdFJlbW92ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9zdFJlbW92ZSBnZXRQb3N0UmVtb3ZlKCkKLQl7Ci0JCXJldHVybiBwb3N0UmVtb3ZlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3RSZW1vdmUoUG9zdFJlbW92ZSBuZXdQb3N0UmVtb3ZlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUG9zdFJlbW92ZSBvbGRQb3N0UmVtb3ZlID0gcG9zdFJlbW92ZTsKLQkJcG9zdFJlbW92ZSA9IG5ld1Bvc3RSZW1vdmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9SRU1PVkUsIG9sZFBvc3RSZW1vdmUsIG5ld1Bvc3RSZW1vdmUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UG9zdFJlbW92ZSA8ZW0+UG9zdCBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0UmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFJlbW92ZShQb3N0UmVtb3ZlIG5ld1Bvc3RSZW1vdmUpCi0JewotCQlpZiAobmV3UG9zdFJlbW92ZSAhPSBwb3N0UmVtb3ZlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0UmVtb3ZlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBvc3RSZW1vdmUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0UmVtb3ZlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bvc3RSZW1vdmUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3RSZW1vdmUobmV3UG9zdFJlbW92ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFLCBuZXdQb3N0UmVtb3ZlLCBuZXdQb3N0UmVtb3ZlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVVcGRhdGUoUHJlVXBkYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X1ByZVVwZGF0ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlVXBkYXRlIGdldFByZVVwZGF0ZSgpCi0JewotCQlyZXR1cm4gcHJlVXBkYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZVVwZGF0ZShQcmVVcGRhdGUgbmV3UHJlVXBkYXRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUHJlVXBkYXRlIG9sZFByZVVwZGF0ZSA9IHByZVVwZGF0ZTsKLQkJcHJlVXBkYXRlID0gbmV3UHJlVXBkYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9VUERBVEUsIG9sZFByZVVwZGF0ZSwgbmV3UHJlVXBkYXRlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlVXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlVXBkYXRlKFByZVVwZGF0ZSBuZXdQcmVVcGRhdGUpCi0JewotCQlpZiAobmV3UHJlVXBkYXRlICE9IHByZVVwZGF0ZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlVXBkYXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByZVVwZGF0ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlVXBkYXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ByZVVwZGF0ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVVcGRhdGUobmV3UHJlVXBkYXRlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURSwgbmV3UHJlVXBkYXRlLCBuZXdQcmVVcGRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3RVcGRhdGUoUG9zdFVwZGF0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9Qb3N0VXBkYXRlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3N0VXBkYXRlIGdldFBvc3RVcGRhdGUoKQotCXsKLQkJcmV0dXJuIHBvc3RVcGRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdFVwZGF0ZShQb3N0VXBkYXRlIG5ld1Bvc3RVcGRhdGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQb3N0VXBkYXRlIG9sZFBvc3RVcGRhdGUgPSBwb3N0VXBkYXRlOwotCQlwb3N0VXBkYXRlID0gbmV3UG9zdFVwZGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1VQREFURSwgb2xkUG9zdFVwZGF0ZSwgbmV3UG9zdFVwZGF0ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc3RVcGRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0VXBkYXRlKFBvc3RVcGRhdGUgbmV3UG9zdFVwZGF0ZSkKLQl7Ci0JCWlmIChuZXdQb3N0VXBkYXRlICE9IHBvc3RVcGRhdGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3RVcGRhdGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcG9zdFVwZGF0ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9VUERBVEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3RVcGRhdGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UG9zdFVwZGF0ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9VUERBVEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdFVwZGF0ZShuZXdQb3N0VXBkYXRlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9VUERBVEUsIG5ld1Bvc3RVcGRhdGUsIG5ld1Bvc3RVcGRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IExvYWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgTG9hZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IExvYWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3RMb2FkKFBvc3RMb2FkKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X1Bvc3RMb2FkKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3N0TG9hZCBnZXRQb3N0TG9hZCgpCi0JewotCQlyZXR1cm4gcG9zdExvYWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdExvYWQoUG9zdExvYWQgbmV3UG9zdExvYWQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQb3N0TG9hZCBvbGRQb3N0TG9hZCA9IHBvc3RMb2FkOwotCQlwb3N0TG9hZCA9IG5ld1Bvc3RMb2FkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRCwgb2xkUG9zdExvYWQsIG5ld1Bvc3RMb2FkKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFBvc3RMb2FkIDxlbT5Qb3N0IExvYWQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgTG9hZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UG9zdExvYWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0TG9hZChQb3N0TG9hZCBuZXdQb3N0TG9hZCkKLQl7Ci0JCWlmIChuZXdQb3N0TG9hZCAhPSBwb3N0TG9hZCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdExvYWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcG9zdExvYWQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UG9zdExvYWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UG9zdExvYWQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0TG9hZChuZXdQb3N0TG9hZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRCwgbmV3UG9zdExvYWQsIG5ld1Bvc3RMb2FkKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9BdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQotCXsKLQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+KFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FUVFJJQlVURV9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JewotCQlpZiAoYXNzb2NpYXRpb25PdmVycmlkZXMgPT0gbnVsbCkKLQkJewotCQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4oWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRUYWJsZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2Vjb25kYXJ5VGFibGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTOgotCQkJCXJldHVybiBiYXNpY1NldElkQ2xhc3MobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0U6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SW5oZXJpdGFuY2UobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU46Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RGlzY3JpbWluYXRvckNvbHVtbihudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U2VxdWVuY2VHZW5lcmF0b3IobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SOgotCQkJCXJldHVybiBiYXNpY1NldFRhYmxlR2VuZXJhdG9yKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROYW1lZFF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTOgotCQkJCXJldHVybiBiYXNpY1NldEVudGl0eUxpc3RlbmVycyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUEVSU0lTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVQZXJzaXN0KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUEVSU0lTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQb3N0UGVyc2lzdChudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUkVNT1ZFOgotCQkJCXJldHVybiBiYXNpY1NldFByZVJlbW92ZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1JFTU9WRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQb3N0UmVtb3ZlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9VUERBVEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UHJlVXBkYXRlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFOgotCQkJCXJldHVybiBiYXNpY1NldFBvc3RVcGRhdGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9MT0FEOgotCQkJCXJldHVybiBiYXNpY1NldFBvc3RMb2FkKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFOgotCQkJCXJldHVybiBnZXRUYWJsZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVM6Ci0JCQkJcmV0dXJuIGdldFNlY29uZGFyeVRhYmxlcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSURfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldElkQ2xhc3MoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkhFUklUQU5DRToKLQkJCQlyZXR1cm4gZ2V0SW5oZXJpdGFuY2UoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFOgotCQkJCXJldHVybiBnZXREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX0NPTFVNTjoKLQkJCQlyZXR1cm4gZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWRRdWVyaWVzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfTkFUSVZFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIGdldE5hbWVkTmF0aXZlUXVlcmllcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGlzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTOgotCQkJCXJldHVybiBnZXRFbnRpdHlMaXN0ZW5lcnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUEVSU0lTVDoKLQkJCQlyZXR1cm4gZ2V0UHJlUGVyc2lzdCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUEVSU0lTVDoKLQkJCQlyZXR1cm4gZ2V0UG9zdFBlcnNpc3QoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUkVNT1ZFOgotCQkJCXJldHVybiBnZXRQcmVSZW1vdmUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1JFTU9WRToKLQkJCQlyZXR1cm4gZ2V0UG9zdFJlbW92ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9VUERBVEU6Ci0JCQkJcmV0dXJuIGdldFByZVVwZGF0ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFOgotCQkJCXJldHVybiBnZXRQb3N0VXBkYXRlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9MT0FEOgotCQkJCXJldHVybiBnZXRQb3N0TG9hZCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRToKLQkJCQlzZXRUYWJsZSgoWG1sVGFibGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTOgotCQkJCWdldFNlY29uZGFyeVRhYmxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTZWNvbmRhcnlUYWJsZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTOgotCQkJCXNldElkQ2xhc3MoKFhtbElkQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkhFUklUQU5DRToKLQkJCQlzZXRJbmhlcml0YW5jZSgoSW5oZXJpdGFuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFOgotCQkJCXNldERpc2NyaW1pbmF0b3JWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU46Ci0JCQkJc2V0RGlzY3JpbWluYXRvckNvbHVtbigoWG1sRGlzY3JpbWluYXRvckNvbHVtbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcigoWG1sU2VxdWVuY2VHZW5lcmF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUzoKLQkJCQlnZXROYW1lZFF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWRRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWROYXRpdmVRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNxbFJlc3VsdFNldE1hcHBpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdExpc3RlbmVycygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKLQkJCQlzZXRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlzZXRFbnRpdHlMaXN0ZW5lcnMoKEVudGl0eUxpc3RlbmVycyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUOgotCQkJCXNldFByZVBlcnNpc3QoKFByZVBlcnNpc3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1Q6Ci0JCQkJc2V0UG9zdFBlcnNpc3QoKFBvc3RQZXJzaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1JFTU9WRToKLQkJCQlzZXRQcmVSZW1vdmUoKFByZVJlbW92ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFOgotCQkJCXNldFBvc3RSZW1vdmUoKFBvc3RSZW1vdmUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfVVBEQVRFOgotCQkJCXNldFByZVVwZGF0ZSgoUHJlVXBkYXRlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9VUERBVEU6Ci0JCQkJc2V0UG9zdFVwZGF0ZSgoUG9zdFVwZGF0ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRDoKLQkJCQlzZXRQb3N0TG9hZCgoUG9zdExvYWQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBdHRyaWJ1dGVPdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEU6Ci0JCQkJc2V0VGFibGUoKFhtbFRhYmxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTOgotCQkJCWdldFNlY29uZGFyeVRhYmxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUzoKLQkJCQlzZXRJZENsYXNzKChYbWxJZENsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkhFUklUQU5DRToKLQkJCQlzZXRJbmhlcml0YW5jZSgoSW5oZXJpdGFuY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUU6Ci0JCQkJc2V0RGlzY3JpbWluYXRvclZhbHVlKERJU0NSSU1JTkFUT1JfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX0NPTFVNTjoKLQkJCQlzZXREaXNjcmltaW5hdG9yQ29sdW1uKChYbWxEaXNjcmltaW5hdG9yQ29sdW1uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoKFhtbFNlcXVlbmNlR2VuZXJhdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9RVUVSSUVTOgotCQkJCWdldE5hbWVkUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCWdldE5hbWVkTmF0aXZlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdExpc3RlbmVycyhFWENMVURFX0RFRkFVTFRfTElTVEVORVJTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKLQkJCQlzZXRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyhFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlzZXRFbnRpdHlMaXN0ZW5lcnMoKEVudGl0eUxpc3RlbmVycyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1BFUlNJU1Q6Ci0JCQkJc2V0UHJlUGVyc2lzdCgoUHJlUGVyc2lzdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9QRVJTSVNUOgotCQkJCXNldFBvc3RQZXJzaXN0KChQb3N0UGVyc2lzdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1JFTU9WRToKLQkJCQlzZXRQcmVSZW1vdmUoKFByZVJlbW92ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9SRU1PVkU6Ci0JCQkJc2V0UG9zdFJlbW92ZSgoUG9zdFJlbW92ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURToKLQkJCQlzZXRQcmVVcGRhdGUoKFByZVVwZGF0ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9VUERBVEU6Ci0JCQkJc2V0UG9zdFVwZGF0ZSgoUG9zdFVwZGF0ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9MT0FEOgotCQkJCXNldFBvc3RMb2FkKChQb3N0TG9hZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFOgotCQkJCXJldHVybiB0YWJsZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVM6Ci0JCQkJcmV0dXJuIHNlY29uZGFyeVRhYmxlcyAhPSBudWxsICYmICFzZWNvbmRhcnlUYWJsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW5zICE9IG51bGwgJiYgIXByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSURfQ0xBU1M6Ci0JCQkJcmV0dXJuIGlkQ2xhc3MgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkhFUklUQU5DRToKLQkJCQlyZXR1cm4gaW5oZXJpdGFuY2UgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFOgotCQkJCXJldHVybiBESVNDUklNSU5BVE9SX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBkaXNjcmltaW5hdG9yVmFsdWUgIT0gbnVsbCA6ICFESVNDUklNSU5BVE9SX1ZBTFVFX0VERUZBVUxULmVxdWFscyhkaXNjcmltaW5hdG9yVmFsdWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOgotCQkJCXJldHVybiBkaXNjcmltaW5hdG9yQ29sdW1uICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBzZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gdGFibGVHZW5lcmF0b3IgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9RVUVSSUVTOgotCQkJCXJldHVybiBuYW1lZFF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWRRdWVyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWROYXRpdmVRdWVyaWVzICE9IG51bGwgJiYgIW5hbWVkTmF0aXZlUXVlcmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIHNxbFJlc3VsdFNldE1hcHBpbmdzICE9IG51bGwgJiYgIXNxbFJlc3VsdFNldE1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTOgotCQkJCXJldHVybiBleGNsdWRlRGVmYXVsdExpc3RlbmVycyAhPSBFWENMVURFX0RFRkFVTFRfTElTVEVORVJTX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzICE9IEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlNfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gZW50aXR5TGlzdGVuZXJzICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIHByZVBlcnNpc3QgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIHBvc3RQZXJzaXN0ICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1JFTU9WRToKLQkJCQlyZXR1cm4gcHJlUmVtb3ZlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9SRU1PVkU6Ci0JCQkJcmV0dXJuIHBvc3RSZW1vdmUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfVVBEQVRFOgotCQkJCXJldHVybiBwcmVVcGRhdGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1VQREFURToKLQkJCQlyZXR1cm4gcG9zdFVwZGF0ZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRDoKLQkJCQlyZXR1cm4gcG9zdExvYWQgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGFzc29jaWF0aW9uT3ZlcnJpZGVzICE9IG51bGwgJiYgIWFzc29jaWF0aW9uT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGlzY3JpbWluYXRvclZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkaXNjcmltaW5hdG9yVmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGNsdWRlRGVmYXVsdExpc3RlbmVycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIEVudGl0eQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHlNYXBwaW5ncy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHlNYXBwaW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzIyYmY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5TWFwcGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGl0eSBNYXBwaW5nczwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFBhY2thZ2UgPGVtPlBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRBY2Nlc3MgPGVtPkFjY2VzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFNlcXVlbmNlR2VuZXJhdG9ycyA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFRhYmxlR2VuZXJhdG9ycyA8ZW0+VGFibGUgR2VuZXJhdG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldE5hbWVkUXVlcmllcyA8ZW0+TmFtZWQgUXVlcmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldE5hbWVkTmF0aXZlUXVlcmllcyA8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncyA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRNYXBwZWRTdXBlcmNsYXNzZXMgPGVtPk1hcHBlZCBTdXBlcmNsYXNzZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRFbnRpdGllcyA8ZW0+RW50aXRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRFbWJlZGRhYmxlcyA8ZW0+RW1iZWRkYWJsZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEVudGl0eU1hcHBpbmdzIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiMS4wIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmVyc2lvbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyc2lvbkVTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgPGVtPlBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnZSgpIDxlbT5QYWNrYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2UoKSA8ZW0+UGFja2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlXyA9IFBBQ0tBR0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NoZW1hKCkgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NoZW1hKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NoZW1hKCkgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NoZW1hKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjaGVtYSA9IFNDSEVNQV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRhbG9nKCkgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGFsb2coKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNhdGFsb2cgPSBDQVRBTE9HX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQWNjZXNzVHlwZSBBQ0NFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzKCkgPGVtPkFjY2VzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBhY2Nlc3MgPSBBQ0NFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKSA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxTZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGVHZW5lcmF0b3JzKCkgPGVtPlRhYmxlIEdlbmVyYXRvcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFibGVHZW5lcmF0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVGFibGVHZW5lcmF0b3I+IHRhYmxlR2VuZXJhdG9yczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVkUXVlcmllcygpIDxlbT5OYW1lZCBRdWVyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVkUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkUXVlcnk+IG5hbWVkUXVlcmllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVkTmF0aXZlUXVlcmllcygpIDxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpIDxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFNxbFJlc3VsdFNldE1hcHBpbmc+IHNxbFJlc3VsdFNldE1hcHBpbmdzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkgPGVtPk1hcHBlZCBTdXBlcmNsYXNzZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sTWFwcGVkU3VwZXJjbGFzcz4gbWFwcGVkU3VwZXJjbGFzc2VzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXRpZXMoKSA8ZW0+RW50aXRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW50aXRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxFbnRpdHk+IGVudGl0aWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW1iZWRkYWJsZXMoKSA8ZW0+RW1iZWRkYWJsZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW1iZWRkYWJsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxFbWJlZGRhYmxlPiBlbWJlZGRhYmxlczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxFbnRpdHlNYXBwaW5ncygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTlRJVFlfTUFQUElOR1M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIxLjAiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICN1bnNldFZlcnNpb24oKQotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfVmVyc2lvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IjEuMCIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5WZXJzaW9uVHlwZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpCi0JewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICN1bnNldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKQotCXsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJYm9vbGVhbiBvbGRWZXJzaW9uRVNldCA9IHZlcnNpb25FU2V0OwotCQl2ZXJzaW9uRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbiwgIW9sZFZlcnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRWZXJzaW9uKCkKLQl7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJYm9vbGVhbiBvbGRWZXJzaW9uRVNldCA9IHZlcnNpb25FU2V0OwotCQl2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQkJdmVyc2lvbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1ZFUlNJT04sIG9sZFZlcnNpb24sIFZFUlNJT05fRURFRkFVTFQsIG9sZFZlcnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VmVyc2lvbigpCi0JewotCQlyZXR1cm4gdmVyc2lvbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc19EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pCi0JewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WG1sUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JewotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgbmV3UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBvbGRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IG5ld1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEsIG9sZFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLCBuZXdQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIG5ld1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKQotCXsKLQkJaWYgKG5ld1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhICE9IHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEobmV3UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBLCBuZXdQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSwgbmV3UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYWNrYWdlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhY2thZ2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGFja2FnZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIHBhY2thZ2VfOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRQYWNrYWdlIDxlbT5QYWNrYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYWNrYWdlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFja2FnZShTdHJpbmcgbmV3UGFja2FnZSkKLQl7Ci0JCVN0cmluZyBvbGRQYWNrYWdlID0gcGFja2FnZV87Ci0JCXBhY2thZ2VfID0gbmV3UGFja2FnZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFLCBvbGRQYWNrYWdlLCBwYWNrYWdlXykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NoZW1hKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX1NjaGVtYSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpCi0JewotCQlyZXR1cm4gc2NoZW1hOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIG5ld1NjaGVtYSkKLQl7Ci0JCVN0cmluZyBvbGRTY2hlbWEgPSBzY2hlbWE7Ci0JCXNjaGVtYSA9IG5ld1NjaGVtYTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUEsIG9sZFNjaGVtYSwgc2NoZW1hKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXRhbG9nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX0NhdGFsb2coKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkKLQl7Ci0JCXJldHVybiBjYXRhbG9nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgbmV3Q2F0YWxvZykKLQl7Ci0JCVN0cmluZyBvbGRDYXRhbG9nID0gY2F0YWxvZzsKLQkJY2F0YWxvZyA9IG5ld0NhdGFsb2c7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ0FUQUxPRywgb2xkQ2F0YWxvZywgY2F0YWxvZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJQUk9QRVJUWSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUKLQkgKiBAc2VlICNzZXRBY2Nlc3MoQWNjZXNzVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX0FjY2VzcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IlBST1BFUlRZIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKQotCXsKLQkJcmV0dXJuIGFjY2VzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0QWNjZXNzIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZQotCSAqIEBzZWUgI2dldEFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIG5ld0FjY2VzcykKLQl7Ci0JCUFjY2Vzc1R5cGUgb2xkQWNjZXNzID0gYWNjZXNzOwotCQlhY2Nlc3MgPSBuZXdBY2Nlc3MgPT0gbnVsbCA/IEFDQ0VTU19FREVGQVVMVCA6IG5ld0FjY2VzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1MsIG9sZEFjY2VzcywgYWNjZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX1NlcXVlbmNlR2VuZXJhdG9ycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sU2VxdWVuY2VHZW5lcmF0b3I+IGdldFNlcXVlbmNlR2VuZXJhdG9ycygpCi0JewotCQlpZiAoc2VxdWVuY2VHZW5lcmF0b3JzID09IG51bGwpCi0JCXsKLQkJCXNlcXVlbmNlR2VuZXJhdG9ycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxTZXF1ZW5jZUdlbmVyYXRvcj4oWG1sU2VxdWVuY2VHZW5lcmF0b3IuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU0VRVUVOQ0VfR0VORVJBVE9SUyk7Ci0JCX0KLQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfVGFibGVHZW5lcmF0b3JzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUYWJsZUdlbmVyYXRvcj4gZ2V0VGFibGVHZW5lcmF0b3JzKCkKLQl7Ci0JCWlmICh0YWJsZUdlbmVyYXRvcnMgPT0gbnVsbCkKLQkJewotCQkJdGFibGVHZW5lcmF0b3JzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFRhYmxlR2VuZXJhdG9yPihYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTKTsKLQkJfQotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX05hbWVkUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTmFtZWRRdWVyeT4gZ2V0TmFtZWRRdWVyaWVzKCkKLQl7Ci0JCWlmIChuYW1lZFF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRRdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkUXVlcnk+KFhtbE5hbWVkUXVlcnkuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc19OYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE5hbWVkTmF0aXZlUXVlcnk+IGdldE5hbWVkTmF0aXZlUXVlcmllcygpCi0JewotCQlpZiAobmFtZWROYXRpdmVRdWVyaWVzID09IG51bGwpCi0JCXsKLQkJCW5hbWVkTmF0aXZlUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PihYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWROYXRpdmVRdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX1NxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTcWxSZXN1bHRTZXRNYXBwaW5nPiBnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JewotCQlpZiAoc3FsUmVzdWx0U2V0TWFwcGluZ3MgPT0gbnVsbCkKLQkJewotCQkJc3FsUmVzdWx0U2V0TWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U3FsUmVzdWx0U2V0TWFwcGluZz4oU3FsUmVzdWx0U2V0TWFwcGluZy5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyk7Ci0JCX0KLQkJcmV0dXJuIHNxbFJlc3VsdFNldE1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBTdXBlcmNsYXNzZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzc30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXBwZWQgU3VwZXJjbGFzc2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIFN1cGVyY2xhc3NlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX01hcHBlZFN1cGVyY2xhc3NlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTWFwcGVkU3VwZXJjbGFzcz4gZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkKLQl7Ci0JCWlmIChtYXBwZWRTdXBlcmNsYXNzZXMgPT0gbnVsbCkKLQkJewotCQkJbWFwcGVkU3VwZXJjbGFzc2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE1hcHBlZFN1cGVyY2xhc3M+KFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTUFQUEVEX1NVUEVSQ0xBU1NFUyk7Ci0JCX0KLQkJcmV0dXJuIG1hcHBlZFN1cGVyY2xhc3NlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX0VudGl0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxFbnRpdHk+IGdldEVudGl0aWVzKCkKLQl7Ci0JCWlmIChlbnRpdGllcyA9PSBudWxsKQotCQl7Ci0JCQllbnRpdGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxFbnRpdHk+KFhtbEVudGl0eS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19FTlRJVElFUyk7Ci0JCX0KLQkJcmV0dXJuIGVudGl0aWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVtYmVkZGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW1iZWRkYWJsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbWJlZGRhYmxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX0VtYmVkZGFibGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxFbWJlZGRhYmxlPiBnZXRFbWJlZGRhYmxlcygpCi0JewotCQlpZiAoZW1iZWRkYWJsZXMgPT0gbnVsbCkKLQkJewotCQkJZW1iZWRkYWJsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sRW1iZWRkYWJsZT4oWG1sRW1iZWRkYWJsZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19FTUJFRERBQkxFUyk7Ci0JCX0KLQkJcmV0dXJuIGVtYmVkZGFibGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU0VRVUVOQ0VfR0VORVJBVE9SUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlcXVlbmNlR2VuZXJhdG9ycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFRhYmxlR2VuZXJhdG9ycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX01BUFBFRF9TVVBFUkNMQVNTRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBwZWRTdXBlcmNsYXNzZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VOVElUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RW50aXRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VNQkVEREFCTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RW1iZWRkYWJsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQToKLQkJCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFOgotCQkJCXJldHVybiBnZXRQYWNrYWdlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BOgotCQkJCXJldHVybiBnZXRTY2hlbWEoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HOgotCQkJCXJldHVybiBnZXRDYXRhbG9nKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTOgotCQkJCXJldHVybiBnZXRBY2Nlc3MoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTOgotCQkJCXJldHVybiBnZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTOgotCQkJCXJldHVybiBnZXRUYWJsZUdlbmVyYXRvcnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTOgotCQkJCXJldHVybiBnZXROYW1lZFF1ZXJpZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTUFQUEVEX1NVUEVSQ0xBU1NFUzoKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fRU5USVRJRVM6Ci0JCQkJcmV0dXJuIGdldEVudGl0aWVzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVM6Ci0JCQkJcmV0dXJuIGdldEVtYmVkZGFibGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE6Ci0JCQkJc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEFDS0FHRToKLQkJCQlzZXRQYWNrYWdlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUE6Ci0JCQkJc2V0U2NoZW1hKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HOgotCQkJCXNldENhdGFsb2coKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTUzoKLQkJCQlzZXRBY2Nlc3MoKEFjY2Vzc1R5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTOgotCQkJCWdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTZXF1ZW5jZUdlbmVyYXRvcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTOgotCQkJCWdldFRhYmxlR2VuZXJhdG9ycygpLmNsZWFyKCk7Ci0JCQkJZ2V0VGFibGVHZW5lcmF0b3JzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxUYWJsZUdlbmVyYXRvcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTOgotCQkJCWdldE5hbWVkUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TmFtZWRRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFF1ZXJ5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCWdldE5hbWVkTmF0aXZlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3FsUmVzdWx0U2V0TWFwcGluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTOgotCQkJCWdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxNYXBwZWRTdXBlcmNsYXNzPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VOVElUSUVTOgotCQkJCWdldEVudGl0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnRpdGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sRW50aXR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VNQkVEREFCTEVTOgotCQkJCWdldEVtYmVkZGFibGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbWJlZGRhYmxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sRW1iZWRkYWJsZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19WRVJTSU9OOgotCQkJCXVuc2V0VmVyc2lvbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE6Ci0JCQkJc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFOgotCQkJCXNldFBhY2thZ2UoUEFDS0FHRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQToKLQkJCQlzZXRTY2hlbWEoU0NIRU1BX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ0FUQUxPRzoKLQkJCQlzZXRDYXRhbG9nKENBVEFMT0dfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1M6Ci0JCQkJc2V0QWNjZXNzKEFDQ0VTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NFUVVFTkNFX0dFTkVSQVRPUlM6Ci0JCQkJZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUzoKLQkJCQlnZXRUYWJsZUdlbmVyYXRvcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTOgotCQkJCWdldE5hbWVkUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCWdldE5hbWVkTmF0aXZlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTUFQUEVEX1NVUEVSQ0xBU1NFUzoKLQkJCQlnZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19FTlRJVElFUzoKLQkJCQlnZXRFbnRpdGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VNQkVEREFCTEVTOgotCQkJCWdldEVtYmVkZGFibGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGlzU2V0VmVyc2lvbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE6Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEFDS0FHRToKLQkJCQlyZXR1cm4gUEFDS0FHRV9FREVGQVVMVCA9PSBudWxsID8gcGFja2FnZV8gIT0gbnVsbCA6ICFQQUNLQUdFX0VERUZBVUxULmVxdWFscyhwYWNrYWdlXyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BOgotCQkJCXJldHVybiBTQ0hFTUFfRURFRkFVTFQgPT0gbnVsbCA/IHNjaGVtYSAhPSBudWxsIDogIVNDSEVNQV9FREVGQVVMVC5lcXVhbHMoc2NoZW1hKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HOgotCQkJCXJldHVybiBDQVRBTE9HX0VERUZBVUxUID09IG51bGwgPyBjYXRhbG9nICE9IG51bGwgOiAhQ0FUQUxPR19FREVGQVVMVC5lcXVhbHMoY2F0YWxvZyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTOgotCQkJCXJldHVybiBhY2Nlc3MgIT0gQUNDRVNTX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NFUVVFTkNFX0dFTkVSQVRPUlM6Ci0JCQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9ycyAhPSBudWxsICYmICFzZXF1ZW5jZUdlbmVyYXRvcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RBQkxFX0dFTkVSQVRPUlM6Ci0JCQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9ycyAhPSBudWxsICYmICF0YWJsZUdlbmVyYXRvcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIG5hbWVkUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCXJldHVybiBuYW1lZE5hdGl2ZVF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWROYXRpdmVRdWVyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gc3FsUmVzdWx0U2V0TWFwcGluZ3MgIT0gbnVsbCAmJiAhc3FsUmVzdWx0U2V0TWFwcGluZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX01BUFBFRF9TVVBFUkNMQVNTRVM6Ci0JCQkJcmV0dXJuIG1hcHBlZFN1cGVyY2xhc3NlcyAhPSBudWxsICYmICFtYXBwZWRTdXBlcmNsYXNzZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VOVElUSUVTOgotCQkJCXJldHVybiBlbnRpdGllcyAhPSBudWxsICYmICFlbnRpdGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVM6Ci0JCQkJcmV0dXJuIGVtYmVkZGFibGVzICE9IG51bGwgJiYgIWVtYmVkZGFibGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2ZXJzaW9uOiAiKTsKLQkJaWYgKHZlcnNpb25FU2V0KSByZXN1bHQuYXBwZW5kKHZlcnNpb24pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhY2thZ2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhY2thZ2VfKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzY2hlbWE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNjaGVtYSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2F0YWxvZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2F0YWxvZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWNjZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY2Nlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUVPYmplY3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdGVkVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdGVkVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlZWY4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEdlbmVyYXRlZFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R2VuZXJhdGVkIFZhbHVlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUjZ2V0R2VuZXJhdG9yIDxlbT5HZW5lcmF0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZSNnZXRTdHJhdGVneSA8ZW0+U3RyYXRlZ3k8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRlZFZhbHVlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxHZW5lcmF0ZWRWYWx1ZSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HZW5lcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdlbmVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEdlbmVyYXRvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0ZWRWYWx1ZV9HZW5lcmF0b3IoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEdlbmVyYXRvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlI2dldEdlbmVyYXRvciA8ZW0+R2VuZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R2VuZXJhdG9yKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJhdGVneTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJUQUJMRSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJhdGVneTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJhdGVneTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUKLQkgKiBAc2VlICNzZXRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRlZFZhbHVlX1N0cmF0ZWd5KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iVEFCTEUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdlbmVyYXRpb25UeXBlIGdldFN0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUjZ2V0U3RyYXRlZ3kgPGVtPlN0cmF0ZWd5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJhdGVneTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUKLQkgKiBAc2VlICNnZXRTdHJhdGVneSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RyYXRlZ3koR2VuZXJhdGlvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGdlbmVyYXRvciBhdHRpYnV0ZS4gIElmIHRoZSBnZW5lcmF0b3IgYXR0aWJ1dGUgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGdlbmVyYXRlZC12YWx1ZSBlbGVtZW50LgotCSAqLwotCVRleHRSYW5nZSBnZXRHZW5lcmF0b3JUZXh0UmFuZ2UoKTsKLX0gLy8gR2VuZXJhdGVkVmFsdWUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdGVkVmFsdWVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEdlbmVyYXRlZFZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjcyMjdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdGVkVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R2VuZXJhdGVkIFZhbHVlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0ZWRWYWx1ZUltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sR2VuZXJhdGVkVmFsdWVJbXBsIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sR2VuZXJhdGVkVmFsdWUKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2VuZXJhdG9yKCkgPGVtPkdlbmVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2VuZXJhdG9yKCkgPGVtPkdlbmVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRvciA9IEdFTkVSQVRPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEdlbmVyYXRpb25UeXBlIFNUUkFURUdZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cmF0ZWd5KCkgPGVtPlN0cmF0ZWd5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdHJhdGVneSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5ID0gU1RSQVRFR1lfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sR2VuZXJhdGVkVmFsdWVJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdlbmVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R2VuZXJhdG9yPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R2VuZXJhdG9yKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRlZFZhbHVlX0dlbmVyYXRvcigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRvcigpCi0JewotCQlyZXR1cm4gZ2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZUltcGwjZ2V0R2VuZXJhdG9yIDxlbT5HZW5lcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0R2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdG9yKFN0cmluZyBuZXdHZW5lcmF0b3IpCi0JewotCQlTdHJpbmcgb2xkR2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotCQlnZW5lcmF0b3IgPSBuZXdHZW5lcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMX19HRU5FUkFUT1IsIG9sZEdlbmVyYXRvciwgZ2VuZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RyYXRlZ3k8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iVEFCTEUiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RyYXRlZ3k8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RyYXRlZ3k8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlCi0JICogQHNlZSAjc2V0U3RyYXRlZ3koR2VuZXJhdGlvblR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0ZWRWYWx1ZV9TdHJhdGVneSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IlRBQkxFIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKQotCXsKLQkJcmV0dXJuIHN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZUltcGwjZ2V0U3RyYXRlZ3kgPGVtPlN0cmF0ZWd5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJhdGVneTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUKLQkgKiBAc2VlICNnZXRTdHJhdGVneSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlIG5ld1N0cmF0ZWd5KQotCXsKLQkJR2VuZXJhdGlvblR5cGUgb2xkU3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJc3RyYXRlZ3kgPSBuZXdTdHJhdGVneSA9PSBudWxsID8gU1RSQVRFR1lfRURFRkFVTFQgOiBuZXdTdHJhdGVneTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX0lNUExfX1NUUkFURUdZLCBvbGRTdHJhdGVneSwgc3RyYXRlZ3kpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX0lNUExfX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0R2VuZXJhdG9yKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMX19TVFJBVEVHWToKLQkJCQlyZXR1cm4gZ2V0U3RyYXRlZ3koKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMX19HRU5FUkFUT1I6Ci0JCQkJc2V0R2VuZXJhdG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX0lNUExfX1NUUkFURUdZOgotCQkJCXNldFN0cmF0ZWd5KChHZW5lcmF0aW9uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFURURfVkFMVUVfSU1QTF9fR0VORVJBVE9SOgotCQkJCXNldEdlbmVyYXRvcihHRU5FUkFUT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX0lNUExfX1NUUkFURUdZOgotCQkJCXNldFN0cmF0ZWd5KFNUUkFURUdZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFURURfVkFMVUVfSU1QTF9fR0VORVJBVE9SOgotCQkJCXJldHVybiBHRU5FUkFUT1JfRURFRkFVTFQgPT0gbnVsbCA/IGdlbmVyYXRvciAhPSBudWxsIDogIUdFTkVSQVRPUl9FREVGQVVMVC5lcXVhbHMoZ2VuZXJhdG9yKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX0lNUExfX1NUUkFURUdZOgotCQkJCXJldHVybiBzdHJhdGVneSAhPSBTVFJBVEVHWV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ2VuZXJhdG9yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChnZW5lcmF0b3IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0cmF0ZWd5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdHJhdGVneSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKCkgewotCQlJRE9NTm9kZSBnZW5lcmF0b3JOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKHRoaXMubm9kZSwgT3JtWG1sTWFwcGVyLkdFTkVSQVRPUik7Ci0JCXJldHVybiAoZ2VuZXJhdG9yTm9kZSA9PSBudWxsKSA/IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSA6IGJ1aWxkVGV4dFJhbmdlKGdlbmVyYXRvck5vZGUpOwotCX0KLX0gLy8gR2VuZXJhdGVkVmFsdWUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWI0MTc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R2VuZXJhdG9yPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0SW5pdGlhbFZhbHVlIDxlbT5Jbml0aWFsIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yI2dldEFsbG9jYXRpb25TaXplIDxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sR2VuZXJhdG9yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbml0aWFsVmFsdWUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcl9Jbml0aWFsVmFsdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW50ZWdlciBnZXRJbml0aWFsVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0SW5pdGlhbFZhbHVlIDxlbT5Jbml0aWFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbml0aWFsVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluaXRpYWxWYWx1ZShJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcl9BbGxvY2F0aW9uU2l6ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnRlZ2VyIGdldEFsbG9jYXRpb25TaXplKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yI2dldEFsbG9jYXRpb25TaXplIDxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxsb2NhdGlvblNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsbG9jYXRpb25TaXplKEludGVnZXIgdmFsdWUpOwotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpOwotCQotCWJvb2xlYW4gaXNWaXJ0dWFsKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NmQzOGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxJZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklkPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldFRlbXBvcmFsIDxlbT5UZW1wb3JhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldFRhYmxlR2VuZXJhdG9yIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxJZCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSWQgZXh0ZW5kcyBYbWxBdHRyaWJ1dGVNYXBwaW5nLCBDb2x1bW5NYXBwaW5nCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2VuZXJhdGVkIFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRHZW5lcmF0ZWRWYWx1ZShYbWxHZW5lcmF0ZWRWYWx1ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkX0dlbmVyYXRlZFZhbHVlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEdlbmVyYXRlZFZhbHVlIGdldEdlbmVyYXRlZFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHZW5lcmF0ZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKLQkgKiBAc2VlICNzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxJZF9UZW1wb3JhbCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldFRlbXBvcmFsIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkX1RhYmxlR2VuZXJhdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0VGFibGVHZW5lcmF0b3IgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkX1NlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0U2VxdWVuY2VHZW5lcmF0b3IgPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgdmFsdWUpOwotCi19IC8vIElkCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkQ2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSWRDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmIwZTNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSWRDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWQgQ2xhc3M8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWRDbGFzcygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxJZENsYXNzIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc05hbWUoKSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzTmFtZSgpIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxJZENsYXNzKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0lEX0NMQVNTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2xhc3NOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkQ2xhc3NfQ2xhc3NOYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBuZXdDbGFzc05hbWUpCi0JewotCQlTdHJpbmcgb2xkQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQljbGFzc05hbWUgPSBuZXdDbGFzc05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX0NMQVNTX19DTEFTU19OQU1FLCBvbGRDbGFzc05hbWUsIGNsYXNzTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9DTEFTU19fQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9DTEFTU19fQ0xBU1NfTkFNRToKLQkJCQlzZXRDbGFzc05hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9DTEFTU19fQ0xBU1NfTkFNRToKLQkJCQlzZXRDbGFzc05hbWUoQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfQ0xBU1NfX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIENMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzTmFtZSAhPSBudWxsIDogIUNMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGNsYXNzTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNsYXNzTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2xhc3NOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIElkQ2xhc3MKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSWRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY3NWU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JZDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWRJbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbElkSW1wbCBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbElkCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uKCkgPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29sdW1uIGNvbHVtbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdlbmVyYXRlZFZhbHVlKCkgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R2VuZXJhdGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZTsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRlbXBvcmFsVHlwZSBURU1QT1JBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW1wb3JhbCgpIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWwgPSBURU1QT1JBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhYmxlR2VuZXJhdG9yKCkgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkgPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxJZEltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfSURfSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbHVtbihYbWxDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpCi0JewotCQlyZXR1cm4gY29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29sdW1uIG9sZENvbHVtbiA9IGNvbHVtbjsKLQkJY29sdW1uID0gbmV3Q29sdW1uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19DT0xVTU4sIG9sZENvbHVtbiwgbmV3Q29sdW1uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRJbXBsI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uKQotCXsKLQkJaWYgKG5ld0NvbHVtbiAhPSBjb2x1bW4pCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbHVtbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb2x1bW4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbHVtbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb2x1bW4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29sdW1uKG5ld0NvbHVtbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19DT0xVTU4sIG5ld0NvbHVtbiwgbmV3Q29sdW1uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2VuZXJhdGVkIFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRHZW5lcmF0ZWRWYWx1ZShYbWxHZW5lcmF0ZWRWYWx1ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkX0dlbmVyYXRlZFZhbHVlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxHZW5lcmF0ZWRWYWx1ZSBnZXRHZW5lcmF0ZWRWYWx1ZSgpCi0JewotCQlyZXR1cm4gZ2VuZXJhdGVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgbmV3R2VuZXJhdGVkVmFsdWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxHZW5lcmF0ZWRWYWx1ZSBvbGRHZW5lcmF0ZWRWYWx1ZSA9IGdlbmVyYXRlZFZhbHVlOwotCQlnZW5lcmF0ZWRWYWx1ZSA9IG5ld0dlbmVyYXRlZFZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19HRU5FUkFURURfVkFMVUUsIG9sZEdlbmVyYXRlZFZhbHVlLCBuZXdHZW5lcmF0ZWRWYWx1ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkSW1wbCNnZXRHZW5lcmF0ZWRWYWx1ZSA8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdlbmVyYXRlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgbmV3R2VuZXJhdGVkVmFsdWUpCi0JewotCQlpZiAobmV3R2VuZXJhdGVkVmFsdWUgIT0gZ2VuZXJhdGVkVmFsdWUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGdlbmVyYXRlZFZhbHVlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWdlbmVyYXRlZFZhbHVlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fR0VORVJBVEVEX1ZBTFVFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdHZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdHZW5lcmF0ZWRWYWx1ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX0dFTkVSQVRFRF9WQUxVRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRHZW5lcmF0ZWRWYWx1ZShuZXdHZW5lcmF0ZWRWYWx1ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19HRU5FUkFURURfVkFMVUUsIG5ld0dlbmVyYXRlZFZhbHVlLCBuZXdHZW5lcmF0ZWRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWRfVGVtcG9yYWwoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkKLQl7Ci0JCXJldHVybiB0ZW1wb3JhbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRJbXBsI2dldFRlbXBvcmFsIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKQotCXsKLQkJVGVtcG9yYWxUeXBlIG9sZFRlbXBvcmFsID0gdGVtcG9yYWw7Ci0JCXRlbXBvcmFsID0gbmV3VGVtcG9yYWwgPT0gbnVsbCA/IFRFTVBPUkFMX0VERUZBVUxUIDogbmV3VGVtcG9yYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RFTVBPUkFMLCBvbGRUZW1wb3JhbCwgdGVtcG9yYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWRfVGFibGVHZW5lcmF0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciBuZXdUYWJsZUdlbmVyYXRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGFibGVHZW5lcmF0b3I7Ci0JCXRhYmxlR2VuZXJhdG9yID0gbmV3VGFibGVHZW5lcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RBQkxFX0dFTkVSQVRPUiwgb2xkVGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRJbXBsI2dldFRhYmxlR2VuZXJhdG9yIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciBuZXdUYWJsZUdlbmVyYXRvcikKLQl7Ci0JCWlmIChuZXdUYWJsZUdlbmVyYXRvciAhPSB0YWJsZUdlbmVyYXRvcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodGFibGVHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdGFibGVHZW5lcmF0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19UQUJMRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1RhYmxlR2VuZXJhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RhYmxlR2VuZXJhdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fVEFCTEVfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRhYmxlR2VuZXJhdG9yKG5ld1RhYmxlR2VuZXJhdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RBQkxFX0dFTkVSQVRPUiwgbmV3VGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkX1NlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxTZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCi0JewotCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBvbGRTZXF1ZW5jZUdlbmVyYXRvciA9IHNlcXVlbmNlR2VuZXJhdG9yOwotCQlzZXF1ZW5jZUdlbmVyYXRvciA9IG5ld1NlcXVlbmNlR2VuZXJhdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19TRVFVRU5DRV9HRU5FUkFUT1IsIG9sZFNlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkSW1wbCNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpCi0JewotCQlpZiAobmV3U2VxdWVuY2VHZW5lcmF0b3IgIT0gc2VxdWVuY2VHZW5lcmF0b3IpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlcXVlbmNlR2VuZXJhdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fU0VRVUVOQ0VfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZXF1ZW5jZUdlbmVyYXRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1NFUVVFTkNFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZXF1ZW5jZUdlbmVyYXRvcihuZXdTZXF1ZW5jZUdlbmVyYXRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19TRVFVRU5DRV9HRU5FUkFUT1IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19DT0xVTU46Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q29sdW1uKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19HRU5FUkFURURfVkFMVUU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0R2VuZXJhdGVkVmFsdWUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fQ09MVU1OOgotCQkJCXJldHVybiBnZXRDb2x1bW4oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fR0VORVJBVEVEX1ZBTFVFOgotCQkJCXJldHVybiBnZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19URU1QT1JBTDoKLQkJCQlyZXR1cm4gZ2V0VGVtcG9yYWwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fVEFCTEVfR0VORVJBVE9SOgotCQkJCXJldHVybiBnZXRUYWJsZUdlbmVyYXRvcigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19DT0xVTU46Ci0JCQkJc2V0Q29sdW1uKChYbWxDb2x1bW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fR0VORVJBVEVEX1ZBTFVFOgotCQkJCXNldEdlbmVyYXRlZFZhbHVlKChYbWxHZW5lcmF0ZWRWYWx1ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19URU1QT1JBTDoKLQkJCQlzZXRUZW1wb3JhbCgoVGVtcG9yYWxUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcigoWG1sVGFibGVHZW5lcmF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXNldFNlcXVlbmNlR2VuZXJhdG9yKChYbWxTZXF1ZW5jZUdlbmVyYXRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19DT0xVTU46Ci0JCQkJc2V0Q29sdW1uKChYbWxDb2x1bW4pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19HRU5FUkFURURfVkFMVUU6Ci0JCQkJc2V0R2VuZXJhdGVkVmFsdWUoKFhtbEdlbmVyYXRlZFZhbHVlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fVEVNUE9SQUw6Ci0JCQkJc2V0VGVtcG9yYWwoVEVNUE9SQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fVEFCTEVfR0VORVJBVE9SOgotCQkJCXNldFRhYmxlR2VuZXJhdG9yKChYbWxUYWJsZUdlbmVyYXRvciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcigoWG1sU2VxdWVuY2VHZW5lcmF0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fQ09MVU1OOgotCQkJCXJldHVybiBjb2x1bW4gIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fR0VORVJBVEVEX1ZBTFVFOgotCQkJCXJldHVybiBnZW5lcmF0ZWRWYWx1ZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19URU1QT1JBTDoKLQkJCQlyZXR1cm4gdGVtcG9yYWwgIT0gVEVNUE9SQUxfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gdGFibGVHZW5lcmF0b3IgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBzZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBDb2x1bW5NYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19DT0xVTU46IHJldHVybiBPcm1QYWNrYWdlLkNPTFVNTl9NQVBQSU5HX19DT0xVTU47Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSWQuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX0dFTkVSQVRFRF9WQUxVRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0lEX19HRU5FUkFURURfVkFMVUU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19URU1QT1JBTDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0lEX19URU1QT1JBTDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RBQkxFX0dFTkVSQVRPUjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1I7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19TRVFVRU5DRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQ29sdW1uTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5DT0xVTU5fTUFQUElOR19fQ09MVU1OOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fQ09MVU1OOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbElkLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fR0VORVJBVEVEX1ZBTFVFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1RFTVBPUkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fVEVNUE9SQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fVEFCTEVfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fVEFCTEVfR0VORVJBVE9SOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1NFUVVFTkNFX0dFTkVSQVRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRlbXBvcmFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0ZW1wb3JhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBJZApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJlMjYwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Sm9pbiBDb2x1bW48L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lIDxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luQ29sdW1uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxKb2luQ29sdW1uIGV4dGVuZHMgWG1sQWJzdHJhY3RDb2x1bW4KLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW5fUmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbiNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyB2YWx1ZSk7Ci0JCi0JVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCk7Ci0KLX0gLy8gSm9pbkNvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luQ29sdW1uSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luQ29sdW1uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWU2NWY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkNvbHVtbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9ycy5Pcm1YbWxNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5lbWYuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Sm9pbiBDb2x1bW48L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW5JbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEpvaW5Db2x1bW5JbXBsIGV4dGVuZHMgQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiBpbXBsZW1lbnRzIFhtbEpvaW5Db2x1bW4KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5Db2x1bW5JbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0pPSU5fQ09MVU1OX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luQ29sdW1uX1JlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCXsKLQkJcmV0dXJuIHJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uSW1wbCNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3UmVmZXJlbmNlZENvbHVtbk5hbWUpCi0JewotCQlTdHJpbmcgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSByZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUsIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fQ09MVU1OX0lNUExfX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTl9JTVBMX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOgotCQkJCXNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRToKLQkJCQlzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTl9JTVBMX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOgotCQkJCXJldHVybiBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyByZWZlcmVuY2VkQ29sdW1uTmFtZSAhPSBudWxsIDogIVJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQuZXF1YWxzKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkNvbHVtbi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkNvbHVtbi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTl9JTVBMX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVmZXJlbmNlZENvbHVtbk5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIHJlZmVyZW5jZWRDb2x1bW5OYW1lTm9kZSA9IChJRE9NTm9kZSkgRE9NVXRpbGl0aWVzLmNoaWxkQXR0cmlidXRlTm9kZSh0aGlzLm5vZGUsIE9ybVhtbE1hcHBlci5SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQkJcmV0dXJuIChyZWZlcmVuY2VkQ29sdW1uTmFtZU5vZGUgPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOiBidWlsZFRleHRSYW5nZShyZWZlcmVuY2VkQ29sdW1uTmFtZU5vZGUpOwotCX0KLX0gLy8gSm9pbkNvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pblRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMzkzYzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlI2dldEpvaW5Db2x1bW5zIDxlbT5Kb2luIENvbHVtbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUjZ2V0SW52ZXJzZUpvaW5Db2x1bW5zIDxlbT5JbnZlcnNlIEpvaW4gQ29sdW1uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxKb2luVGFibGUgZXh0ZW5kcyBYbWxCYXNlVGFibGUKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luVGFibGVfSm9pbkNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludmVyc2UgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW52ZXJzZSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnZlcnNlIEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZV9JbnZlcnNlSm9pbkNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0KLQlib29sZWFuIGlzU3BlY2lmaWVkKCk7Ci19IC8vIEpvaW5UYWJsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luVGFibGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5UYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5ZmI0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5UYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlSW1wbCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxKb2luVGFibGVJbXBsIGV4dGVuZHMgQWJzdHJhY3RYbWxCYXNlVGFibGUgaW1wbGVtZW50cyBYbWxKb2luVGFibGUKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luQ29sdW1ucygpIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm9pbkNvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBqb2luQ29sdW1uczsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSA8ZW0+SW52ZXJzZSBKb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gaW52ZXJzZUpvaW5Db2x1bW5zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5UYWJsZUltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfSk9JTl9UQUJMRV9JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZV9Kb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKQotCXsKLQkJaWYgKGpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCWpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW52ZXJzZSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnZlcnNlIEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludmVyc2UgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlX0ludmVyc2VKb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkKLQl7Ci0JCWlmIChpbnZlcnNlSm9pbkNvbHVtbnMgPT0gbnVsbCkKLQkJewotCQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSU5WRVJTRV9KT0lOX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiBpbnZlcnNlSm9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Sm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX0lNUExfX0lOVkVSU0VfSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRKb2luQ29sdW1ucygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX0lNUExfX0lOVkVSU0VfSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSm9pbkNvbHVtbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9JTVBMX19JTlZFUlNFX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCWdldEludmVyc2VKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSm9pbkNvbHVtbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9JTVBMX19JTlZFUlNFX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBqb2luQ29sdW1ucyAhPSBudWxsICYmICFqb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSU5WRVJTRV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGludmVyc2VKb2luQ29sdW1ucyAhPSBudWxsICYmICFpbnZlcnNlSm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luVGFibGUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9JTVBMX19JTlZFUlNFX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pblRhYmxlLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX0lNUExfX0pPSU5fQ09MVU1OUzsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9JTVBMX19JTlZFUlNFX0pPSU5fQ09MVU1OUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19IC8vIEpvaW5UYWJsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9NYW55LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0NWVmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hbnkgVG8gTWFueTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFueVRvTWFueSBleHRlbmRzIFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZwotewotfSAvLyBNYW55VG9NYW55CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzAyNWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9NYW55SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hbnkgVG8gTWFueTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueUltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sTWFueVRvTWFueUltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxNYW55VG9NYW55Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldEVudGl0eSgpIDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9FTlRJVFlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0RW50aXR5KCkgPGVtPlRhcmdldCBFbnRpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhcmdldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRFbnRpdHkgPSBUQVJHRVRfRU5USVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRmV0Y2hUeXBlIEZFVENIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZldGNoKCkgPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBmZXRjaCA9IEZFVENIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pblRhYmxlKCkgPGVtPkpvaW4gVGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5UYWJsZSBqb2luVGFibGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlKCkgPGVtPkNhc2NhZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDYXNjYWRlVHlwZSBjYXNjYWRlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZEJ5KCkgPGVtPk1hcHBlZCBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9CWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWRCeSgpIDxlbT5NYXBwZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZEJ5ID0gTUFQUEVEX0JZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyQnkoKSA8ZW0+T3JkZXIgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyQnkoKSA8ZW0+T3JkZXIgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb3JkZXJCeSA9IE9SREVSX0JZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5KCkgPGVtPk1hcCBLZXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1hcEtleSBtYXBLZXk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTWFueVRvTWFueUltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFOWV9UT19NQU5ZX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYXJnZXRFbnRpdHkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19UYXJnZXRFbnRpdHkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKQotCXsKLQkJcmV0dXJuIHRhcmdldEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueUltcGwjZ2V0VGFyZ2V0RW50aXR5IDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIG5ld1RhcmdldEVudGl0eSkKLQl7Ci0JCVN0cmluZyBvbGRUYXJnZXRFbnRpdHkgPSB0YXJnZXRFbnRpdHk7Ci0JCXRhcmdldEVudGl0eSA9IG5ld1RhcmdldEVudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFksIG9sZFRhcmdldEVudGl0eSwgdGFyZ2V0RW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iTEFaWSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEZldGNoKEZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfRmV0Y2goKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJMQVpZIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkKLQl7Ci0JCXJldHVybiBmZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueUltcGwjZ2V0RmV0Y2ggPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0RmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpCi0JewotCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSBmZXRjaDsKLQkJZmV0Y2ggPSBuZXdGZXRjaCA9PSBudWxsID8gRkVUQ0hfRURFRkFVTFQgOiBuZXdGZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0ZFVENILCBvbGRGZXRjaCwgZmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZEJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBwZWRCeSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkKLQl7Ci0JCXJldHVybiBtYXBwZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueUltcGwjZ2V0TWFwcGVkQnkgPGVtPk1hcHBlZCBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBuZXdNYXBwZWRCeSkKLQl7Ci0JCVN0cmluZyBvbGRNYXBwZWRCeSA9IG1hcHBlZEJ5OwotCQltYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fTUFQUEVEX0JZLCBvbGRNYXBwZWRCeSwgbWFwcGVkQnkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9yZGVyQnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX09yZGVyQnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9yZGVyQnkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpCi0JewotCQlyZXR1cm4gb3JkZXJCeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueUltcGwjZ2V0T3JkZXJCeSA8ZW0+T3JkZXIgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcmRlckJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3JkZXJCeShTdHJpbmcgbmV3T3JkZXJCeSkKLQl7Ci0JCVN0cmluZyBvbGRPcmRlckJ5ID0gb3JkZXJCeTsKLQkJb3JkZXJCeSA9IG5ld09yZGVyQnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19PUkRFUl9CWSwgb2xkT3JkZXJCeSwgb3JkZXJCeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFwS2V5KE1hcEtleSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBLZXkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcEtleSBnZXRNYXBLZXkoKQotCXsKLQkJcmV0dXJuIG1hcEtleTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNYXBLZXkoTWFwS2V5IG5ld01hcEtleSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCU1hcEtleSBvbGRNYXBLZXkgPSBtYXBLZXk7Ci0JCW1hcEtleSA9IG5ld01hcEtleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUF9LRVksIG9sZE1hcEtleSwgbmV3TWFwS2V5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueUltcGwjZ2V0TWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNYXBLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXkoTWFwS2V5IG5ld01hcEtleSkKLQl7Ci0JCWlmIChuZXdNYXBLZXkgIT0gbWFwS2V5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChtYXBLZXkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWFwS2V5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUF9LRVksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld01hcEtleSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNYXBLZXkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fTUFQX0tFWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRNYXBLZXkobmV3TWFwS2V5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBfS0VZLCBuZXdNYXBLZXksIG5ld01hcEtleSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkKLQl7Ci0JCXJldHVybiBqb2luVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxKb2luVGFibGUgb2xkSm9pblRhYmxlID0gam9pblRhYmxlOwotCQlqb2luVGFibGUgPSBuZXdKb2luVGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFLCBvbGRKb2luVGFibGUsIG5ld0pvaW5UYWJsZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnlJbXBsI2dldEpvaW5UYWJsZSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUpCi0JewotCQlpZiAobmV3Sm9pblRhYmxlICE9IGpvaW5UYWJsZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoam9pblRhYmxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWpvaW5UYWJsZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdKb2luVGFibGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Sm9pblRhYmxlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Sm9pblRhYmxlKG5ld0pvaW5UYWJsZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRSwgbmV3Sm9pblRhYmxlLCBuZXdKb2luVGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhc2NhZGUoQ2FzY2FkZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FzY2FkZShDYXNjYWRlVHlwZSBuZXdDYXNjYWRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJQ2FzY2FkZVR5cGUgb2xkQ2FzY2FkZSA9IGNhc2NhZGU7Ci0JCWNhc2NhZGUgPSBuZXdDYXNjYWRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fQ0FTQ0FERSwgb2xkQ2FzY2FkZSwgbmV3Q2FzY2FkZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnlJbXBsI2dldENhc2NhZGUgPGVtPkNhc2NhZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhc2NhZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIG5ld0Nhc2NhZGUpCi0JewotCQlpZiAobmV3Q2FzY2FkZSAhPSBjYXNjYWRlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYXNjYWRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNhc2NhZGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fQ0FTQ0FERSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2FzY2FkZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYXNjYWRlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0NBU0NBREUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2FzY2FkZShuZXdDYXNjYWRlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19DQVNDQURFLCBuZXdDYXNjYWRlLCBuZXdDYXNjYWRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBiYXNpY1NldEpvaW5UYWJsZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2FzY2FkZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUF9LRVk6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWFwS2V5KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFRhcmdldEVudGl0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEZldGNoKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBnZXRKb2luVGFibGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGdldENhc2NhZGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkQnkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX09SREVSX0JZOgotCQkJCXJldHVybiBnZXRPcmRlckJ5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBfS0VZOgotCQkJCXJldHVybiBnZXRNYXBLZXkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXNldFRhcmdldEVudGl0eSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19GRVRDSDoKLQkJCQlzZXRGZXRjaCgoRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXNldEpvaW5UYWJsZSgoWG1sSm9pblRhYmxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19DQVNDQURFOgotCQkJCXNldENhc2NhZGUoKENhc2NhZGVUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBQRURfQlk6Ci0JCQkJc2V0TWFwcGVkQnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fT1JERVJfQlk6Ci0JCQkJc2V0T3JkZXJCeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBfS0VZOgotCQkJCXNldE1hcEtleSgoTWFwS2V5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXNldFRhcmdldEVudGl0eShUQVJHRVRfRU5USVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19GRVRDSDoKLQkJCQlzZXRGZXRjaChGRVRDSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRToKLQkJCQlzZXRKb2luVGFibGUoKFhtbEpvaW5UYWJsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19DQVNDQURFOgotCQkJCXNldENhc2NhZGUoKENhc2NhZGVUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWToKLQkJCQlzZXRNYXBwZWRCeShNQVBQRURfQllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX09SREVSX0JZOgotCQkJCXNldE9yZGVyQnkoT1JERVJfQllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUF9LRVk6Ci0JCQkJc2V0TWFwS2V5KChNYXBLZXkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJcmV0dXJuIFRBUkdFVF9FTlRJVFlfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldEVudGl0eSAhPSBudWxsIDogIVRBUkdFVF9FTlRJVFlfRURFRkFVTFQuZXF1YWxzKHRhcmdldEVudGl0eSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19GRVRDSDoKLQkJCQlyZXR1cm4gZmV0Y2ggIT0gRkVUQ0hfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBqb2luVGFibGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGNhc2NhZGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWToKLQkJCQlyZXR1cm4gTUFQUEVEX0JZX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWRCeSAhPSBudWxsIDogIU1BUFBFRF9CWV9FREVGQVVMVC5lcXVhbHMobWFwcGVkQnkpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fT1JERVJfQlk6Ci0JCQkJcmV0dXJuIE9SREVSX0JZX0VERUZBVUxUID09IG51bGwgPyBvcmRlckJ5ICE9IG51bGwgOiAhT1JERVJfQllfRURFRkFVTFQuZXF1YWxzKG9yZGVyQnkpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fTUFQX0tFWToKLQkJCQlyZXR1cm4gbWFwS2V5ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fRkVUQ0g6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0NBU0NBREU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBQRURfQlk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQUEVEX0JZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX09SREVSX0JZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0JZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUF9LRVk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9NYW55LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0ZFVENIOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0NBU0NBREU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQUEVEX0JZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19PUkRFUl9CWTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUF9LRVk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvTWFueS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFyZ2V0RW50aXR5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXRFbnRpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmZXRjaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwcGVkQnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1hcHBlZEJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvcmRlckJ5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcmRlckJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgbWFwcGVkQnlOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKGdldE5vZGUoKSwgT3JtWG1sTWFwcGVyLk1BUFBFRF9CWSk7Ci0JCXJldHVybiAobWFwcGVkQnlOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UobWFwcGVkQnlOb2RlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9PbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvT25lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYzMyYWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9PbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hbnkgVG8gT25lPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9PbmUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1hbnlUb09uZSBleHRlbmRzIFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLX0gLy8gTWFueVRvT25lCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb09uZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvT25lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5NmM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvT25lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFueSBUbyBPbmU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hbnlUb09uZUltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sTWFueVRvT25lSW1wbCBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbE1hbnlUb09uZQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRFbnRpdHkoKSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfRU5USVRZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldEVudGl0eSgpIDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0RW50aXR5ID0gVEFSR0VUX0VOVElUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZldGNoVHlwZSBGRVRDSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGZXRjaCgpIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZXRjaFR5cGUgZmV0Y2ggPSBGRVRDSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5UYWJsZSgpIDxlbT5Kb2luIFRhYmxlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luVGFibGUgam9pblRhYmxlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZSgpIDxlbT5DYXNjYWRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FzY2FkZVR5cGUgY2FzY2FkZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpb25hbCgpIDxlbT5PcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBPUFRJT05BTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpb25hbCgpIDxlbT5PcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIG9wdGlvbmFsID0gT1BUSU9OQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luQ29sdW1ucygpIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm9pbkNvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBqb2luQ29sdW1uczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxNYW55VG9PbmVJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX01BTllfVE9fT05FX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYXJnZXRFbnRpdHkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19UYXJnZXRFbnRpdHkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKQotCXsKLQkJcmV0dXJuIHRhcmdldEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lSW1wbCNnZXRUYXJnZXRFbnRpdHkgPGVtPlRhcmdldCBFbnRpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBFbnRpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhcmdldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgbmV3VGFyZ2V0RW50aXR5KQotCXsKLQkJU3RyaW5nIG9sZFRhcmdldEVudGl0eSA9IHRhcmdldEVudGl0eTsKLQkJdGFyZ2V0RW50aXR5ID0gbmV3VGFyZ2V0RW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZLCBvbGRUYXJnZXRFbnRpdHksIHRhcmdldEVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkxBWlkiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRGZXRjaChGZXRjaFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0ZldGNoKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iTEFaWSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpCi0JewotCQlyZXR1cm4gZmV0Y2g7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZUltcGwjZ2V0RmV0Y2ggPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0RmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpCi0JewotCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSBmZXRjaDsKLQkJZmV0Y2ggPSBuZXdGZXRjaCA9PSBudWxsID8gRkVUQ0hfRURFRkFVTFQgOiBuZXdGZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fRkVUQ0gsIG9sZEZldGNoLCBmZXRjaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3B0aW9uYWwoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfT3B0aW9uYWwoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkKLQl7Ci0JCXJldHVybiBvcHRpb25hbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lSW1wbCNnZXRPcHRpb25hbCA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcHRpb25hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gbmV3T3B0aW9uYWwpCi0JewotCQlCb29sZWFuIG9sZE9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCW9wdGlvbmFsID0gbmV3T3B0aW9uYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX09QVElPTkFMLCBvbGRPcHRpb25hbCwgb3B0aW9uYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nX0pvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpCi0JewotCQlpZiAoam9pbkNvbHVtbnMgPT0gbnVsbCkKLQkJewotCQkJam9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSm9pbkNvbHVtbj4oWG1sSm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luVGFibGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKQotCXsKLQkJcmV0dXJuIGpvaW5UYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIG5ld0pvaW5UYWJsZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEpvaW5UYWJsZSBvbGRKb2luVGFibGUgPSBqb2luVGFibGU7Ci0JCWpvaW5UYWJsZSA9IG5ld0pvaW5UYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRSwgb2xkSm9pblRhYmxlLCBuZXdKb2luVGFibGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmVJbXBsI2dldEpvaW5UYWJsZSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUpCi0JewotCQlpZiAobmV3Sm9pblRhYmxlICE9IGpvaW5UYWJsZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoam9pblRhYmxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWpvaW5UYWJsZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fVEFCTEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0pvaW5UYWJsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKb2luVGFibGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19KT0lOX1RBQkxFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEpvaW5UYWJsZShuZXdKb2luVGFibGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRSwgbmV3Sm9pblRhYmxlLCBuZXdKb2luVGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhc2NhZGUoQ2FzY2FkZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FzY2FkZShDYXNjYWRlVHlwZSBuZXdDYXNjYWRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJQ2FzY2FkZVR5cGUgb2xkQ2FzY2FkZSA9IGNhc2NhZGU7Ci0JCWNhc2NhZGUgPSBuZXdDYXNjYWRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19DQVNDQURFLCBvbGRDYXNjYWRlLCBuZXdDYXNjYWRlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lSW1wbCNnZXRDYXNjYWRlIDxlbT5DYXNjYWRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYXNjYWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSBuZXdDYXNjYWRlKQotCXsKLQkJaWYgKG5ld0Nhc2NhZGUgIT0gY2FzY2FkZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2FzY2FkZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYXNjYWRlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fQ0FTQ0FERSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2FzY2FkZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYXNjYWRlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fQ0FTQ0FERSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDYXNjYWRlKG5ld0Nhc2NhZGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fQ0FTQ0FERSwgbmV3Q2FzY2FkZSwgbmV3Q2FzY2FkZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBiYXNpY1NldEpvaW5UYWJsZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fQ0FTQ0FERToKLQkJCQlyZXR1cm4gYmFzaWNTZXRDYXNjYWRlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXJldHVybiBnZXRUYXJnZXRFbnRpdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEZldGNoKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJcmV0dXJuIGdldEpvaW5UYWJsZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19DQVNDQURFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX09QVElPTkFMOgotCQkJCXJldHVybiBnZXRPcHRpb25hbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGdldEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXNldFRhcmdldEVudGl0eSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0ZFVENIOgotCQkJCXNldEZldGNoKChGZXRjaFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRToKLQkJCQlzZXRKb2luVGFibGUoKFhtbEpvaW5UYWJsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19DQVNDQURFOgotCQkJCXNldENhc2NhZGUoKENhc2NhZGVUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX09QVElPTkFMOgotCQkJCXNldE9wdGlvbmFsKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEpvaW5Db2x1bW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJc2V0VGFyZ2V0RW50aXR5KFRBUkdFVF9FTlRJVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fRkVUQ0g6Ci0JCQkJc2V0RmV0Y2goRkVUQ0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRToKLQkJCQlzZXRKb2luVGFibGUoKFhtbEpvaW5UYWJsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0NBU0NBREU6Ci0JCQkJc2V0Q2FzY2FkZSgoQ2FzY2FkZVR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19PUFRJT05BTDoKLQkJCQlzZXRPcHRpb25hbChPUFRJT05BTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJcmV0dXJuIFRBUkdFVF9FTlRJVFlfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldEVudGl0eSAhPSBudWxsIDogIVRBUkdFVF9FTlRJVFlfRURFRkFVTFQuZXF1YWxzKHRhcmdldEVudGl0eSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0ZFVENIOgotCQkJCXJldHVybiBmZXRjaCAhPSBGRVRDSF9FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRToKLQkJCQlyZXR1cm4gam9pblRhYmxlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGNhc2NhZGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fT1BUSU9OQUw6Ci0JCQkJcmV0dXJuIE9QVElPTkFMX0VERUZBVUxUID09IG51bGwgPyBvcHRpb25hbCAhPSBudWxsIDogIU9QVElPTkFMX0VERUZBVUxULmVxdWFscyhvcHRpb25hbCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gam9pbkNvbHVtbnMgIT0gbnVsbCAmJiAham9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19GRVRDSDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0NBU0NBREU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19PUFRJT05BTDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fQ09MVU1OUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9PbmUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fVEFSR0VUX0VOVElUWTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0ZFVENIOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19KT0lOX1RBQkxFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19DQVNDQURFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19PUFRJT05BTDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hbnlUb09uZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFyZ2V0RW50aXR5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXRFbnRpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmZXRjaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3B0aW9uYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG9wdGlvbmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIE1hbnlUb09uZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgzZDQyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NYXBwZWQgU3VwZXJjbGFzczwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0SWRDbGFzcyA8ZW0+SWQgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UHJlUGVyc2lzdCA8ZW0+UHJlIFBlcnNpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFBvc3RQZXJzaXN0IDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UG9zdFJlbW92ZSA8ZW0+UG9zdCBSZW1vdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFBvc3RMb2FkIDxlbT5Qb3N0IExvYWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sTWFwcGVkU3VwZXJjbGFzcyBleHRlbmRzIEFic3RyYWN0WG1sVHlwZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBY2Nlc3NUeXBlIEFDQ0VTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZENsYXNzKCkgPGVtPklkIENsYXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSWRDbGFzcyBpZENsYXNzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMgPSBFWENMVURFX0RFRkFVTFRfTElTVEVORVJTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKSA8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKSA8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgPSBFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5TGlzdGVuZXJzKCkgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudGl0eUxpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eUxpc3RlbmVycyBlbnRpdHlMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVQZXJzaXN0KCkgPGVtPlByZSBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlUGVyc2lzdCBwcmVQZXJzaXN0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdFBlcnNpc3QoKSA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0UGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RQZXJzaXN0IHBvc3RQZXJzaXN0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlUmVtb3ZlKCkgPGVtPlByZSBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByZVJlbW92ZSBwcmVSZW1vdmU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0UmVtb3ZlKCkgPGVtPlBvc3QgUmVtb3ZlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0UmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFJlbW92ZSBwb3N0UmVtb3ZlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlVXBkYXRlKCkgPGVtPlByZSBVcGRhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByZVVwZGF0ZSBwcmVVcGRhdGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0VXBkYXRlKCkgPGVtPlBvc3QgVXBkYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0VXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFVwZGF0ZSBwb3N0VXBkYXRlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdExvYWQoKSA8ZW0+UG9zdCBMb2FkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RMb2FkIHBvc3RMb2FkOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoWG1sRW50aXR5TWFwcGluZ3MpIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFQUEVEX1NVUEVSQ0xBU1M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkIENsYXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkIENsYXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJZENsYXNzKFhtbElkQ2xhc3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0lkQ2xhc3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbElkQ2xhc3MgZ2V0SWRDbGFzcygpCi0JewotCQlyZXR1cm4gaWRDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJZENsYXNzKFhtbElkQ2xhc3MgbmV3SWRDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbElkQ2xhc3Mgb2xkSWRDbGFzcyA9IGlkQ2xhc3M7Ci0JCWlkQ2xhc3MgPSBuZXdJZENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1MsIG9sZElkQ2xhc3MsIG5ld0lkQ2xhc3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldElkQ2xhc3MgPGVtPklkIENsYXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZCBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SWRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkQ2xhc3MoWG1sSWRDbGFzcyBuZXdJZENsYXNzKQotCXsKLQkJaWYgKG5ld0lkQ2xhc3MgIT0gaWRDbGFzcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaWRDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpZENsYXNzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJZENsYXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0lkQ2xhc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1MsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SWRDbGFzcyhuZXdJZENsYXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JRF9DTEFTUywgbmV3SWRDbGFzcywgbmV3SWRDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlRGVmYXVsdExpc3RlbmVycyhib29sZWFuIG5ld0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKQotCXsKLQkJYm9vbGVhbiBvbGRFeGNsdWRlRGVmYXVsdExpc3RlbmVycyA9IGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzOwotCQlleGNsdWRlRGVmYXVsdExpc3RlbmVycyA9IG5ld0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUywgb2xkRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMsIGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JewotCQlyZXR1cm4gZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyA8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKGJvb2xlYW4gbmV3RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMpCi0JewotCQlib29sZWFuIG9sZEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzID0gZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnM7Ci0JCWV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzID0gbmV3RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTLCBvbGRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycywgZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVudGl0eUxpc3RlbmVycyhFbnRpdHlMaXN0ZW5lcnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0VudGl0eUxpc3RlbmVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW50aXR5TGlzdGVuZXJzIGdldEVudGl0eUxpc3RlbmVycygpCi0JewotCQlyZXR1cm4gZW50aXR5TGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVudGl0eUxpc3RlbmVycyhFbnRpdHlMaXN0ZW5lcnMgbmV3RW50aXR5TGlzdGVuZXJzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJRW50aXR5TGlzdGVuZXJzIG9sZEVudGl0eUxpc3RlbmVycyA9IGVudGl0eUxpc3RlbmVyczsKLQkJZW50aXR5TGlzdGVuZXJzID0gbmV3RW50aXR5TGlzdGVuZXJzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUywgb2xkRW50aXR5TGlzdGVuZXJzLCBuZXdFbnRpdHlMaXN0ZW5lcnMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RW50aXR5TGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5TGlzdGVuZXJzKEVudGl0eUxpc3RlbmVycyBuZXdFbnRpdHlMaXN0ZW5lcnMpCi0JewotCQlpZiAobmV3RW50aXR5TGlzdGVuZXJzICE9IGVudGl0eUxpc3RlbmVycykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZW50aXR5TGlzdGVuZXJzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWVudGl0eUxpc3RlbmVycykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FTlRJVFlfTElTVEVORVJTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdFbnRpdHlMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RW50aXR5TGlzdGVuZXJzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RW50aXR5TGlzdGVuZXJzKG5ld0VudGl0eUxpc3RlbmVycywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUywgbmV3RW50aXR5TGlzdGVuZXJzLCBuZXdFbnRpdHlMaXN0ZW5lcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZVBlcnNpc3QoUHJlUGVyc2lzdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfUHJlUGVyc2lzdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlUGVyc2lzdCBnZXRQcmVQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiBwcmVQZXJzaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZVBlcnNpc3QoUHJlUGVyc2lzdCBuZXdQcmVQZXJzaXN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUHJlUGVyc2lzdCBvbGRQcmVQZXJzaXN0ID0gcHJlUGVyc2lzdDsKLQkJcHJlUGVyc2lzdCA9IG5ld1ByZVBlcnNpc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUEVSU0lTVCwgb2xkUHJlUGVyc2lzdCwgbmV3UHJlUGVyc2lzdCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UHJlUGVyc2lzdCA8ZW0+UHJlIFBlcnNpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlUGVyc2lzdChQcmVQZXJzaXN0IG5ld1ByZVBlcnNpc3QpCi0JewotCQlpZiAobmV3UHJlUGVyc2lzdCAhPSBwcmVQZXJzaXN0KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVQZXJzaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByZVBlcnNpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1BFUlNJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZVBlcnNpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJlUGVyc2lzdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUEVSU0lTVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVQZXJzaXN0KG5ld1ByZVBlcnNpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9QRVJTSVNULCBuZXdQcmVQZXJzaXN0LCBuZXdQcmVQZXJzaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3N0UGVyc2lzdChQb3N0UGVyc2lzdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFBlcnNpc3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvc3RQZXJzaXN0IGdldFBvc3RQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiBwb3N0UGVyc2lzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0UGVyc2lzdChQb3N0UGVyc2lzdCBuZXdQb3N0UGVyc2lzdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVBvc3RQZXJzaXN0IG9sZFBvc3RQZXJzaXN0ID0gcG9zdFBlcnNpc3Q7Ci0JCXBvc3RQZXJzaXN0ID0gbmV3UG9zdFBlcnNpc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1BFUlNJU1QsIG9sZFBvc3RQZXJzaXN0LCBuZXdQb3N0UGVyc2lzdCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UG9zdFBlcnNpc3QgPGVtPlBvc3QgUGVyc2lzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0UGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3RQZXJzaXN0KFBvc3RQZXJzaXN0IG5ld1Bvc3RQZXJzaXN0KQotCXsKLQkJaWYgKG5ld1Bvc3RQZXJzaXN0ICE9IHBvc3RQZXJzaXN0KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0UGVyc2lzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwb3N0UGVyc2lzdCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1BFUlNJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3RQZXJzaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bvc3RQZXJzaXN0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUEVSU0lTVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0UGVyc2lzdChuZXdQb3N0UGVyc2lzdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9QRVJTSVNULCBuZXdQb3N0UGVyc2lzdCwgbmV3UG9zdFBlcnNpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZVJlbW92ZShQcmVSZW1vdmUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1ByZVJlbW92ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlUmVtb3ZlIGdldFByZVJlbW92ZSgpCi0JewotCQlyZXR1cm4gcHJlUmVtb3ZlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZVJlbW92ZShQcmVSZW1vdmUgbmV3UHJlUmVtb3ZlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUHJlUmVtb3ZlIG9sZFByZVJlbW92ZSA9IHByZVJlbW92ZTsKLQkJcHJlUmVtb3ZlID0gbmV3UHJlUmVtb3ZlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1JFTU9WRSwgb2xkUHJlUmVtb3ZlLCBuZXdQcmVSZW1vdmUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlUmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlUmVtb3ZlKFByZVJlbW92ZSBuZXdQcmVSZW1vdmUpCi0JewotCQlpZiAobmV3UHJlUmVtb3ZlICE9IHByZVJlbW92ZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlUmVtb3ZlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByZVJlbW92ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUkVNT1ZFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVSZW1vdmUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJlUmVtb3ZlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9SRU1PVkUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlUmVtb3ZlKG5ld1ByZVJlbW92ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1JFTU9WRSwgbmV3UHJlUmVtb3ZlLCBuZXdQcmVSZW1vdmUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3RSZW1vdmUoUG9zdFJlbW92ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFJlbW92ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9zdFJlbW92ZSBnZXRQb3N0UmVtb3ZlKCkKLQl7Ci0JCXJldHVybiBwb3N0UmVtb3ZlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3RSZW1vdmUoUG9zdFJlbW92ZSBuZXdQb3N0UmVtb3ZlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUG9zdFJlbW92ZSBvbGRQb3N0UmVtb3ZlID0gcG9zdFJlbW92ZTsKLQkJcG9zdFJlbW92ZSA9IG5ld1Bvc3RSZW1vdmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1JFTU9WRSwgb2xkUG9zdFJlbW92ZSwgbmV3UG9zdFJlbW92ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UG9zdFJlbW92ZSA8ZW0+UG9zdCBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0UmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFJlbW92ZShQb3N0UmVtb3ZlIG5ld1Bvc3RSZW1vdmUpCi0JewotCQlpZiAobmV3UG9zdFJlbW92ZSAhPSBwb3N0UmVtb3ZlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0UmVtb3ZlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBvc3RSZW1vdmUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9SRU1PVkUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3RSZW1vdmUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UG9zdFJlbW92ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1JFTU9WRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0UmVtb3ZlKG5ld1Bvc3RSZW1vdmUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUkVNT1ZFLCBuZXdQb3N0UmVtb3ZlLCBuZXdQb3N0UmVtb3ZlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVVcGRhdGUoUHJlVXBkYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19QcmVVcGRhdGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByZVVwZGF0ZSBnZXRQcmVVcGRhdGUoKQotCXsKLQkJcmV0dXJuIHByZVVwZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVVcGRhdGUoUHJlVXBkYXRlIG5ld1ByZVVwZGF0ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVByZVVwZGF0ZSBvbGRQcmVVcGRhdGUgPSBwcmVVcGRhdGU7Ci0JCXByZVVwZGF0ZSA9IG5ld1ByZVVwZGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9VUERBVEUsIG9sZFByZVVwZGF0ZSwgbmV3UHJlVXBkYXRlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQcmVVcGRhdGUgPGVtPlByZSBVcGRhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZVVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZVVwZGF0ZShQcmVVcGRhdGUgbmV3UHJlVXBkYXRlKQotCXsKLQkJaWYgKG5ld1ByZVVwZGF0ZSAhPSBwcmVVcGRhdGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByZVVwZGF0ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcmVVcGRhdGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1VQREFURSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlVXBkYXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ByZVVwZGF0ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfVVBEQVRFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZVVwZGF0ZShuZXdQcmVVcGRhdGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9VUERBVEUsIG5ld1ByZVVwZGF0ZSwgbmV3UHJlVXBkYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBVcGRhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3N0VXBkYXRlKFBvc3RVcGRhdGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RVcGRhdGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvc3RVcGRhdGUgZ2V0UG9zdFVwZGF0ZSgpCi0JewotCQlyZXR1cm4gcG9zdFVwZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0VXBkYXRlKFBvc3RVcGRhdGUgbmV3UG9zdFVwZGF0ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVBvc3RVcGRhdGUgb2xkUG9zdFVwZGF0ZSA9IHBvc3RVcGRhdGU7Ci0JCXBvc3RVcGRhdGUgPSBuZXdQb3N0VXBkYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9VUERBVEUsIG9sZFBvc3RVcGRhdGUsIG5ld1Bvc3RVcGRhdGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFBvc3RVcGRhdGUgPGVtPlBvc3QgVXBkYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UG9zdFVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3RVcGRhdGUoUG9zdFVwZGF0ZSBuZXdQb3N0VXBkYXRlKQotCXsKLQkJaWYgKG5ld1Bvc3RVcGRhdGUgIT0gcG9zdFVwZGF0ZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdFVwZGF0ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwb3N0VXBkYXRlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfVVBEQVRFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0VXBkYXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bvc3RVcGRhdGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9VUERBVEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdFVwZGF0ZShuZXdQb3N0VXBkYXRlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1VQREFURSwgbmV3UG9zdFVwZGF0ZSwgbmV3UG9zdFVwZGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgTG9hZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBMb2FkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgTG9hZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UG9zdExvYWQoUG9zdExvYWQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RMb2FkKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3N0TG9hZCBnZXRQb3N0TG9hZCgpCi0JewotCQlyZXR1cm4gcG9zdExvYWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdExvYWQoUG9zdExvYWQgbmV3UG9zdExvYWQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQb3N0TG9hZCBvbGRQb3N0TG9hZCA9IHBvc3RMb2FkOwotCQlwb3N0TG9hZCA9IG5ld1Bvc3RMb2FkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9MT0FELCBvbGRQb3N0TG9hZCwgbmV3UG9zdExvYWQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFBvc3RMb2FkIDxlbT5Qb3N0IExvYWQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgTG9hZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UG9zdExvYWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0TG9hZChQb3N0TG9hZCBuZXdQb3N0TG9hZCkKLQl7Ci0JCWlmIChuZXdQb3N0TG9hZCAhPSBwb3N0TG9hZCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdExvYWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcG9zdExvYWQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9MT0FELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0TG9hZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQb3N0TG9hZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX0xPQUQsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdExvYWQobmV3UG9zdExvYWQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfTE9BRCwgbmV3UG9zdExvYWQsIG5ld1Bvc3RMb2FkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JRF9DTEFTUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRJZENsYXNzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRFbnRpdHlMaXN0ZW5lcnMobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUEVSU0lTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVQZXJzaXN0KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9QRVJTSVNUOgotCQkJCXJldHVybiBiYXNpY1NldFBvc3RQZXJzaXN0KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1JFTU9WRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVSZW1vdmUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1JFTU9WRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQb3N0UmVtb3ZlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1VQREFURToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVVcGRhdGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1VQREFURToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQb3N0VXBkYXRlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9MT0FEOgotCQkJCXJldHVybiBiYXNpY1NldFBvc3RMb2FkKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTOgotCQkJCXJldHVybiBnZXRJZENsYXNzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTOgotCQkJCXJldHVybiBpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGdldEVudGl0eUxpc3RlbmVycygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIGdldFByZVBlcnNpc3QoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUEVSU0lTVDoKLQkJCQlyZXR1cm4gZ2V0UG9zdFBlcnNpc3QoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9SRU1PVkU6Ci0JCQkJcmV0dXJuIGdldFByZVJlbW92ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9SRU1PVkU6Ci0JCQkJcmV0dXJuIGdldFBvc3RSZW1vdmUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9VUERBVEU6Ci0JCQkJcmV0dXJuIGdldFByZVVwZGF0ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9VUERBVEU6Ci0JCQkJcmV0dXJuIGdldFBvc3RVcGRhdGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfTE9BRDoKLQkJCQlyZXR1cm4gZ2V0UG9zdExvYWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JRF9DTEFTUzoKLQkJCQlzZXRJZENsYXNzKChYbWxJZENsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTOgotCQkJCXNldEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM6Ci0JCQkJc2V0RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlzZXRFbnRpdHlMaXN0ZW5lcnMoKEVudGl0eUxpc3RlbmVycyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1BFUlNJU1Q6Ci0JCQkJc2V0UHJlUGVyc2lzdCgoUHJlUGVyc2lzdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9QRVJTSVNUOgotCQkJCXNldFBvc3RQZXJzaXN0KChQb3N0UGVyc2lzdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1JFTU9WRToKLQkJCQlzZXRQcmVSZW1vdmUoKFByZVJlbW92ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9SRU1PVkU6Ci0JCQkJc2V0UG9zdFJlbW92ZSgoUG9zdFJlbW92ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1VQREFURToKLQkJCQlzZXRQcmVVcGRhdGUoKFByZVVwZGF0ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9VUERBVEU6Ci0JCQkJc2V0UG9zdFVwZGF0ZSgoUG9zdFVwZGF0ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9MT0FEOgotCQkJCXNldFBvc3RMb2FkKChQb3N0TG9hZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1M6Ci0JCQkJc2V0SWRDbGFzcygoWG1sSWRDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTOgotCQkJCXNldEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKEVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM6Ci0JCQkJc2V0RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlzZXRFbnRpdHlMaXN0ZW5lcnMoKEVudGl0eUxpc3RlbmVycyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUEVSU0lTVDoKLQkJCQlzZXRQcmVQZXJzaXN0KChQcmVQZXJzaXN0KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUEVSU0lTVDoKLQkJCQlzZXRQb3N0UGVyc2lzdCgoUG9zdFBlcnNpc3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1JFTU9WRToKLQkJCQlzZXRQcmVSZW1vdmUoKFByZVJlbW92ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1JFTU9WRToKLQkJCQlzZXRQb3N0UmVtb3ZlKChQb3N0UmVtb3ZlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9VUERBVEU6Ci0JCQkJc2V0UHJlVXBkYXRlKChQcmVVcGRhdGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9VUERBVEU6Ci0JCQkJc2V0UG9zdFVwZGF0ZSgoUG9zdFVwZGF0ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX0xPQUQ6Ci0JCQkJc2V0UG9zdExvYWQoKFBvc3RMb2FkKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JRF9DTEFTUzoKLQkJCQlyZXR1cm4gaWRDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMgIT0gRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSU19FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzICE9IEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlNfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FTlRJVFlfTElTVEVORVJTOgotCQkJCXJldHVybiBlbnRpdHlMaXN0ZW5lcnMgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9QRVJTSVNUOgotCQkJCXJldHVybiBwcmVQZXJzaXN0ICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIHBvc3RQZXJzaXN0ICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUkVNT1ZFOgotCQkJCXJldHVybiBwcmVSZW1vdmUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUkVNT1ZFOgotCQkJCXJldHVybiBwb3N0UmVtb3ZlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfVVBEQVRFOgotCQkJCXJldHVybiBwcmVVcGRhdGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfVVBEQVRFOgotCQkJCXJldHVybiBwb3N0VXBkYXRlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX0xPQUQ6Ci0JCQkJcmV0dXJuIHBvc3RMb2FkICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGNsdWRlRGVmYXVsdExpc3RlbmVycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIE1hcHBlZFN1cGVyY2xhc3MKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmMyOTk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NdWx0aSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBwZWRCeSA8ZW0+TWFwcGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE9yZGVyQnkgPGVtPk9yZGVyIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE1hcEtleSA8ZW0+TWFwIEtleTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgZXh0ZW5kcyBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9yZGVyIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcmRlckJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19PcmRlckJ5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5PcmRlckJ5IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0T3JkZXJCeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRPcmRlckJ5IDxlbT5PcmRlciBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9yZGVyQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9yZGVyQnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFwS2V5KE1hcEtleSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBLZXkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFwS2V5IGdldE1hcEtleSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBLZXkgPGVtPk1hcCBLZXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1hcEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwS2V5KE1hcEtleSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZEJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBwZWRCeSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkQnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0TWFwcGVkQnkgPGVtPk1hcHBlZCBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIHZhbHVlKTsKLQotCVRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpOwotfSAvLyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4ZjE5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBDb2x1bW48L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbiNnZXRDb2x1bW5EZWZpbml0aW9uIDxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29sdW1uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxOYW1lZENvbHVtbiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbHVtbkRlZmluaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWRDb2x1bW5fQ29sdW1uRGVmaW5pdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uI2dldENvbHVtbkRlZmluaXRpb24gPGVtPkNvbHVtbiBEZWZpbml0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29sdW1uRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29sdW1uX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbiNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbmFtZSBhdHRpYnV0ZS4gIElmIHRoZSBuYW1lIGF0dGlidXRlIAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqdGFibGUgZWxlbWVudC4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpOwotCi19IC8vIE5hbWVkQ29sdW1uCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkTmF0aXZlUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWROYXRpdmVRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RmODIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWROYXRpdmVRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZWQgTmF0aXZlIFF1ZXJ5PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSNnZXRSZXN1bHRDbGFzcyA8ZW0+UmVzdWx0IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSNnZXRSZXN1bHRTZXRNYXBwaW5nIDxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkTmF0aXZlUXVlcnkoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sTmFtZWROYXRpdmVRdWVyeSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFF1ZXJ5Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UXVlcnkoKSA8ZW0+UXVlcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRdWVyeSgpIDxlbT5RdWVyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcXVlcnkgPSBRVUVSWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhpbnRzKCkgPGVtPkhpbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUXVlcnlIaW50PiBoaW50czsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bHRDbGFzcygpIDxlbT5SZXN1bHQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VsdENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzdWx0Q2xhc3MoKSA8ZW0+UmVzdWx0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bHRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXN1bHRDbGFzcyA9IFJFU1VMVF9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bHRTZXRNYXBwaW5nKCkgPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzdWx0U2V0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX1NFVF9NQVBQSU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VsdFNldE1hcHBpbmcoKSA8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcgPSBSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTmFtZWROYXRpdmVRdWVyeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9OQU1FRF9OQVRJVkVfUVVFUlk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5X05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3VsdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzdWx0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VsdCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzdWx0Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWROYXRpdmVRdWVyeV9SZXN1bHRDbGFzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdENsYXNzKCkKLQl7Ci0JCXJldHVybiByZXN1bHRDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSNnZXRSZXN1bHRDbGFzcyA8ZW0+UmVzdWx0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc3VsdENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0Q2xhc3MoU3RyaW5nIG5ld1Jlc3VsdENsYXNzKQotCXsKLQkJU3RyaW5nIG9sZFJlc3VsdENsYXNzID0gcmVzdWx0Q2xhc3M7Ci0JCXJlc3VsdENsYXNzID0gbmV3UmVzdWx0Q2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTLCBvbGRSZXN1bHRDbGFzcywgcmVzdWx0Q2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bHQgU2V0IE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlc3VsdFNldE1hcHBpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWROYXRpdmVRdWVyeV9SZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0U2V0TWFwcGluZygpCi0JewotCQlyZXR1cm4gcmVzdWx0U2V0TWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSNnZXRSZXN1bHRTZXRNYXBwaW5nIDxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVzdWx0U2V0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3VsdFNldE1hcHBpbmcoU3RyaW5nIG5ld1Jlc3VsdFNldE1hcHBpbmcpCi0JewotCQlTdHJpbmcgb2xkUmVzdWx0U2V0TWFwcGluZyA9IHJlc3VsdFNldE1hcHBpbmc7Ci0JCXJlc3VsdFNldE1hcHBpbmcgPSBuZXdSZXN1bHRTZXRNYXBwaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORywgb2xkUmVzdWx0U2V0TWFwcGluZywgcmVzdWx0U2V0TWFwcGluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlF1ZXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RdWVyeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UXVlcnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfUXVlcnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnkoKQotCXsKLQkJcmV0dXJuIHF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5I2dldFF1ZXJ5IDxlbT5RdWVyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIG5ld1F1ZXJ5KQotCXsKLQkJU3RyaW5nIG9sZFF1ZXJ5ID0gcXVlcnk7Ci0JCXF1ZXJ5ID0gbmV3UXVlcnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUVVFUlksIG9sZFF1ZXJ5LCBxdWVyeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfSGludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFF1ZXJ5SGludD4gZ2V0SGludHMoKQotCXsKLQkJaWYgKGhpbnRzID09IG51bGwpCi0JCXsKLQkJCWhpbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFF1ZXJ5SGludD4oWG1sUXVlcnlIaW50LmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX0hJTlRTKTsKLQkJfQotCQlyZXR1cm4gaGludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fSElOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRIaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19RVUVSWToKLQkJCQlyZXR1cm4gZ2V0UXVlcnkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19ISU5UUzoKLQkJCQlyZXR1cm4gZ2V0SGludHMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19SRVNVTFRfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldFJlc3VsdENsYXNzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HOgotCQkJCXJldHVybiBnZXRSZXN1bHRTZXRNYXBwaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUVVFUlk6Ci0JCQkJc2V0UXVlcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX0hJTlRTOgotCQkJCWdldEhpbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRIaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUXVlcnlIaW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX1JFU1VMVF9DTEFTUzoKLQkJCQlzZXRSZXN1bHRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HOgotCQkJCXNldFJlc3VsdFNldE1hcHBpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUVVFUlk6Ci0JCQkJc2V0UXVlcnkoUVVFUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19ISU5UUzoKLQkJCQlnZXRIaW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX1JFU1VMVF9DTEFTUzoKLQkJCQlzZXRSZXN1bHRDbGFzcyhSRVNVTFRfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkc6Ci0JCQkJc2V0UmVzdWx0U2V0TWFwcGluZyhSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX1FVRVJZOgotCQkJCXJldHVybiBRVUVSWV9FREVGQVVMVCA9PSBudWxsID8gcXVlcnkgIT0gbnVsbCA6ICFRVUVSWV9FREVGQVVMVC5lcXVhbHMocXVlcnkpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX0hJTlRTOgotCQkJCXJldHVybiBoaW50cyAhPSBudWxsICYmICFoaW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTOgotCQkJCXJldHVybiBSRVNVTFRfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VsdENsYXNzICE9IG51bGwgOiAhUkVTVUxUX0NMQVNTX0VERUZBVUxULmVxdWFscyhyZXN1bHRDbGFzcyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HOgotCQkJCXJldHVybiBSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VsdFNldE1hcHBpbmcgIT0gbnVsbCA6ICFSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQuZXF1YWxzKHJlc3VsdFNldE1hcHBpbmcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBxdWVyeTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocXVlcnkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3VsdENsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXN1bHRDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdWx0U2V0TWFwcGluZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVzdWx0U2V0TWFwcGluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIG5hbWVOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKGdldE5vZGUoKSwgT3JtWG1sTWFwcGVyLk5BTUUpOwotCQlyZXR1cm4gKG5hbWVOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UobmFtZU5vZGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDI5NjZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZWQgUXVlcnk8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkUXVlcnkoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sTmFtZWRRdWVyeSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFF1ZXJ5Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UXVlcnkoKSA8ZW0+UXVlcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRdWVyeSgpIDxlbT5RdWVyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcXVlcnkgPSBRVUVSWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhpbnRzKCkgPGVtPkhpbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUXVlcnlIaW50PiBoaW50czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxOYW1lZFF1ZXJ5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX05BTUVEX1FVRVJZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlF1ZXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RdWVyeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UXVlcnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfUXVlcnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnkoKQotCXsKLQkJcmV0dXJuIHF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5I2dldFF1ZXJ5IDxlbT5RdWVyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIG5ld1F1ZXJ5KQotCXsKLQkJU3RyaW5nIG9sZFF1ZXJ5ID0gcXVlcnk7Ci0JCXF1ZXJ5ID0gbmV3UXVlcnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19RVUVSWSwgb2xkUXVlcnksIHF1ZXJ5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeV9IaW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUXVlcnlIaW50PiBnZXRIaW50cygpCi0JewotCQlpZiAoaGludHMgPT0gbnVsbCkKLQkJewotCQkJaGludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUXVlcnlIaW50PihYbWxRdWVyeUhpbnQuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19ISU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGhpbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fSElOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRIaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fUVVFUlk6Ci0JCQkJcmV0dXJuIGdldFF1ZXJ5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19ISU5UUzoKLQkJCQlyZXR1cm4gZ2V0SGludHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fUVVFUlk6Ci0JCQkJc2V0UXVlcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fSElOVFM6Ci0JCQkJZ2V0SGludHMoKS5jbGVhcigpOwotCQkJCWdldEhpbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxRdWVyeUhpbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fUVVFUlk6Ci0JCQkJc2V0UXVlcnkoUVVFUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUllfX0hJTlRTOgotCQkJCWdldEhpbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fUVVFUlk6Ci0JCQkJcmV0dXJuIFFVRVJZX0VERUZBVUxUID09IG51bGwgPyBxdWVyeSAhPSBudWxsIDogIVFVRVJZX0VERUZBVUxULmVxdWFscyhxdWVyeSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19ISU5UUzoKLQkJCQlyZXR1cm4gaGludHMgIT0gbnVsbCAmJiAhaGludHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBxdWVyeTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocXVlcnkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlJRE9NTm9kZSBuYW1lTm9kZSA9IChJRE9NTm9kZSkgRE9NVXRpbGl0aWVzLmNoaWxkQXR0cmlidXRlTm9kZShnZXROb2RlKCksIE9ybVhtbE1hcHBlci5OQU1FKTsKLQkJcmV0dXJuIChuYW1lTm9kZSA9PSBudWxsKSA/IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSA6IGJ1aWxkVGV4dFJhbmdlKG5hbWVOb2RlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzdhNTMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBOdWxsIEF0dHJpYnV0ZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxOdWxsQXR0cmlidXRlTWFwcGluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgZXh0ZW5kcyBYbWxBdHRyaWJ1dGVNYXBwaW5nCi17Ci19IC8vIFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvTWFueS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb01hbnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwMmY4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvTWFueS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9uZSBUbyBNYW55PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldEpvaW5Db2x1bW5zIDxlbT5Kb2luIENvbHVtbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sT25lVG9NYW55IGV4dGVuZHMgWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55X0pvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCk7Ci0KLX0gLy8gT25lVG9NYW55CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvTWFueUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9NYW55SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2MyZDU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9NYW55SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9uZSBUbyBNYW55PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb01hbnlJbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE9uZVRvTWFueUltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxPbmVUb01hbnkKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0RW50aXR5KCkgPGVtPlRhcmdldCBFbnRpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhcmdldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0VOVElUWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRFbnRpdHkoKSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldEVudGl0eSA9IFRBUkdFVF9FTlRJVFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBGZXRjaFR5cGUgRkVUQ0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmV0Y2goKSA8ZW0+RmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGZldGNoID0gRkVUQ0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luVGFibGUoKSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSm9pblRhYmxlIGpvaW5UYWJsZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGUoKSA8ZW0+Q2FzY2FkZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENhc2NhZGVUeXBlIGNhc2NhZGU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkQnkoKSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX0JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZEJ5KCkgPGVtPk1hcHBlZCBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkQnkgPSBNQVBQRURfQllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJCeSgpIDxlbT5PcmRlciBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3JkZXJCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfQllfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJCeSgpIDxlbT5PcmRlciBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3JkZXJCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvcmRlckJ5ID0gT1JERVJfQllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXkoKSA8ZW0+TWFwIEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwS2V5IG1hcEtleTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5Db2x1bW5zKCkgPGVtPkpvaW4gQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luQ29sdW1ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9uZVRvTWFueUltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfT05FX1RPX01BTllfSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBFbnRpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRhcmdldEVudGl0eShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX1RhcmdldEVudGl0eSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpCi0JewotCQlyZXR1cm4gdGFyZ2V0RW50aXR5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnlJbXBsI2dldFRhcmdldEVudGl0eSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFyZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyBuZXdUYXJnZXRFbnRpdHkpCi0JewotCQlTdHJpbmcgb2xkVGFyZ2V0RW50aXR5ID0gdGFyZ2V0RW50aXR5OwotCQl0YXJnZXRFbnRpdHkgPSBuZXdUYXJnZXRFbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFksIG9sZFRhcmdldEVudGl0eSwgdGFyZ2V0RW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iTEFaWSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEZldGNoKEZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfRmV0Y2goKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJMQVpZIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkKLQl7Ci0JCXJldHVybiBmZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55SW1wbCNnZXRGZXRjaCA8ZW0+RmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkgKiBAc2VlICNnZXRGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkKLQl7Ci0JCUZldGNoVHlwZSBvbGRGZXRjaCA9IGZldGNoOwotCQlmZXRjaCA9IG5ld0ZldGNoID09IG51bGwgPyBGRVRDSF9FREVGQVVMVCA6IG5ld0ZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19GRVRDSCwgb2xkRmV0Y2gsIGZldGNoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwcGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXBwZWRCeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfTWFwcGVkQnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpCi0JewotCQlyZXR1cm4gbWFwcGVkQnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueUltcGwjZ2V0TWFwcGVkQnkgPGVtPk1hcHBlZCBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBuZXdNYXBwZWRCeSkKLQl7Ci0JCVN0cmluZyBvbGRNYXBwZWRCeSA9IG1hcHBlZEJ5OwotCQltYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19NQVBQRURfQlksIG9sZE1hcHBlZEJ5LCBtYXBwZWRCeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9yZGVyIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcmRlciBCeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3JkZXJCeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfT3JkZXJCeSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JkZXJCeSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcmRlckJ5KCkKLQl7Ci0JCXJldHVybiBvcmRlckJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnlJbXBsI2dldE9yZGVyQnkgPGVtPk9yZGVyIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3JkZXJCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9yZGVyQnkoU3RyaW5nIG5ld09yZGVyQnkpCi0JewotCQlTdHJpbmcgb2xkT3JkZXJCeSA9IG9yZGVyQnk7Ci0JCW9yZGVyQnkgPSBuZXdPcmRlckJ5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19PUkRFUl9CWSwgb2xkT3JkZXJCeSwgb3JkZXJCeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFwS2V5KE1hcEtleSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBLZXkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcEtleSBnZXRNYXBLZXkoKQotCXsKLQkJcmV0dXJuIG1hcEtleTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNYXBLZXkoTWFwS2V5IG5ld01hcEtleSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCU1hcEtleSBvbGRNYXBLZXkgPSBtYXBLZXk7Ci0JCW1hcEtleSA9IG5ld01hcEtleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQX0tFWSwgb2xkTWFwS2V5LCBuZXdNYXBLZXkpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnlJbXBsI2dldE1hcEtleSA8ZW0+TWFwIEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWFwS2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSBuZXdNYXBLZXkpCi0JewotCQlpZiAobmV3TWFwS2V5ICE9IG1hcEtleSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobWFwS2V5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW1hcEtleSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUF9LRVksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld01hcEtleSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNYXBLZXkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19NQVBfS0VZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1hcEtleShuZXdNYXBLZXksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQX0tFWSwgbmV3TWFwS2V5LCBuZXdNYXBLZXkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEpvaW5UYWJsZShYbWxKb2luVGFibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0pvaW5UYWJsZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpCi0JewotCQlyZXR1cm4gam9pblRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEpvaW5UYWJsZShYbWxKb2luVGFibGUgbmV3Sm9pblRhYmxlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSm9pblRhYmxlIG9sZEpvaW5UYWJsZSA9IGpvaW5UYWJsZTsKLQkJam9pblRhYmxlID0gbmV3Sm9pblRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFLCBvbGRKb2luVGFibGUsIG5ld0pvaW5UYWJsZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueUltcGwjZ2V0Sm9pblRhYmxlIDxlbT5Kb2luIFRhYmxlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRKb2luVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIG5ld0pvaW5UYWJsZSkKLQl7Ci0JCWlmIChuZXdKb2luVGFibGUgIT0gam9pblRhYmxlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChqb2luVGFibGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpam9pblRhYmxlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Sm9pblRhYmxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0pvaW5UYWJsZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Sm9pblRhYmxlKG5ld0pvaW5UYWJsZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFLCBuZXdKb2luVGFibGUsIG5ld0pvaW5UYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueV9Kb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKQotCXsKLQkJaWYgKGpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCWpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fQ09MVU1OUyk7Ci0JCX0KLQkJcmV0dXJuIGpvaW5Db2x1bW5zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfQ2FzY2FkZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpCi0JewotCQlyZXR1cm4gY2FzY2FkZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDYXNjYWRlKENhc2NhZGVUeXBlIG5ld0Nhc2NhZGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlDYXNjYWRlVHlwZSBvbGRDYXNjYWRlID0gY2FzY2FkZTsKLQkJY2FzY2FkZSA9IG5ld0Nhc2NhZGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0NBU0NBREUsIG9sZENhc2NhZGUsIG5ld0Nhc2NhZGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnlJbXBsI2dldENhc2NhZGUgPGVtPkNhc2NhZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhc2NhZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIG5ld0Nhc2NhZGUpCi0JewotCQlpZiAobmV3Q2FzY2FkZSAhPSBjYXNjYWRlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYXNjYWRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNhc2NhZGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19DQVNDQURFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDYXNjYWRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Nhc2NhZGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19DQVNDQURFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENhc2NhZGUobmV3Q2FzY2FkZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19DQVNDQURFLCBuZXdDYXNjYWRlLCBuZXdDYXNjYWRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Sm9pblRhYmxlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19DQVNDQURFOgotCQkJCXJldHVybiBiYXNpY1NldENhc2NhZGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUF9LRVk6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWFwS2V5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXJldHVybiBnZXRUYXJnZXRFbnRpdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEZldGNoKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJcmV0dXJuIGdldEpvaW5UYWJsZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19DQVNDQURFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkQnkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fT1JERVJfQlk6Ci0JCQkJcmV0dXJuIGdldE9yZGVyQnkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQX0tFWToKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJc2V0VGFyZ2V0RW50aXR5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fRkVUQ0g6Ci0JCQkJc2V0RmV0Y2goKEZldGNoVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXNldEpvaW5UYWJsZSgoWG1sSm9pblRhYmxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0NBU0NBREU6Ci0JCQkJc2V0Q2FzY2FkZSgoQ2FzY2FkZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQUEVEX0JZOgotCQkJCXNldE1hcHBlZEJ5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fT1JERVJfQlk6Ci0JCQkJc2V0T3JkZXJCeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUF9LRVk6Ci0JCQkJc2V0TWFwS2V5KChNYXBLZXkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSm9pbkNvbHVtbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fVEFSR0VUX0VOVElUWToKLQkJCQlzZXRUYXJnZXRFbnRpdHkoVEFSR0VUX0VOVElUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19GRVRDSDoKLQkJCQlzZXRGZXRjaChGRVRDSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXNldEpvaW5UYWJsZSgoWG1sSm9pblRhYmxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fQ0FTQ0FERToKLQkJCQlzZXRDYXNjYWRlKChDYXNjYWRlVHlwZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWToKLQkJCQlzZXRNYXBwZWRCeShNQVBQRURfQllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fT1JERVJfQlk6Ci0JCQkJc2V0T3JkZXJCeShPUkRFUl9CWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19NQVBfS0VZOgotCQkJCXNldE1hcEtleSgoTWFwS2V5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXJldHVybiBUQVJHRVRfRU5USVRZX0VERUZBVUxUID09IG51bGwgPyB0YXJnZXRFbnRpdHkgIT0gbnVsbCA6ICFUQVJHRVRfRU5USVRZX0VERUZBVUxULmVxdWFscyh0YXJnZXRFbnRpdHkpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19GRVRDSDoKLQkJCQlyZXR1cm4gZmV0Y2ggIT0gRkVUQ0hfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJcmV0dXJuIGpvaW5UYWJsZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19DQVNDQURFOgotCQkJCXJldHVybiBjYXNjYWRlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWToKLQkJCQlyZXR1cm4gTUFQUEVEX0JZX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWRCeSAhPSBudWxsIDogIU1BUFBFRF9CWV9FREVGQVVMVC5lcXVhbHMobWFwcGVkQnkpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19PUkRFUl9CWToKLQkJCQlyZXR1cm4gT1JERVJfQllfRURFRkFVTFQgPT0gbnVsbCA/IG9yZGVyQnkgIT0gbnVsbCA6ICFPUkRFUl9CWV9FREVGQVVMVC5lcXVhbHMob3JkZXJCeSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUF9LRVk6Ci0JCQkJcmV0dXJuIG1hcEtleSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGpvaW5Db2x1bW5zICE9IG51bGwgJiYgIWpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fVEFSR0VUX0VOVElUWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fRkVUQ0g6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19DQVNDQURFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19NQVBQRURfQlk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQUEVEX0JZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fT1JERVJfQlk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlk7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19NQVBfS0VZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9NYW55LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fRkVUQ0g7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0NBU0NBREU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQUEVEX0JZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQUEVEX0JZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0JZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fT1JERVJfQlk7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUF9LRVk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9NYW55LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFyZ2V0RW50aXR5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXRFbnRpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmZXRjaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwcGVkQnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1hcHBlZEJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvcmRlckJ5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcmRlckJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIG1hcHBlZEJ5Tm9kZSA9IChJRE9NTm9kZSkgRE9NVXRpbGl0aWVzLmNoaWxkQXR0cmlidXRlTm9kZShnZXROb2RlKCksIE9ybVhtbE1hcHBlci5NQVBQRURfQlkpOwotCQlyZXR1cm4gKG1hcHBlZEJ5Tm9kZSA9PSBudWxsKSA/IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSA6IGJ1aWxkVGV4dFJhbmdlKG1hcHBlZEJ5Tm9kZSk7Ci0JfQotfSAvLyBPbmVUb01hbnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9PbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9PbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyYWMwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvT25lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T25lIFRvIE9uZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldE1hcHBlZEJ5IDxlbT5NYXBwZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9PbmUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE9uZVRvT25lIGV4dGVuZHMgWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkQnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9PbmVfTWFwcGVkQnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hcHBlZEJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0TWFwcGVkQnkgPGVtPk1hcHBlZCBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQotCVRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpOwotCi19IC8vIE9uZVRvT25lCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvT25lSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb09uZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjMDM1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvT25lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9uZSBUbyBPbmU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvT25lSW1wbCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxPbmVUb09uZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxPbmVUb09uZQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRFbnRpdHkoKSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfRU5USVRZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldEVudGl0eSgpIDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0RW50aXR5ID0gVEFSR0VUX0VOVElUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZldGNoVHlwZSBGRVRDSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGZXRjaCgpIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZXRjaFR5cGUgZmV0Y2ggPSBGRVRDSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5UYWJsZSgpIDxlbT5Kb2luIFRhYmxlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luVGFibGUgam9pblRhYmxlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZSgpIDxlbT5DYXNjYWRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FzY2FkZVR5cGUgY2FzY2FkZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpb25hbCgpIDxlbT5PcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBPUFRJT05BTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpb25hbCgpIDxlbT5PcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIG9wdGlvbmFsID0gT1BUSU9OQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luQ29sdW1ucygpIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm9pbkNvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBqb2luQ29sdW1uczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWRCeSgpIDxlbT5NYXBwZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfQllfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkQnkoKSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeSA9IE1BUFBFRF9CWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByaW1hcnlLZXlKb2luQ29sdW1ucygpIDxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1uczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxPbmVUb09uZUltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfT05FX1RPX09ORV9JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhcmdldCBFbnRpdHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFyZ2V0RW50aXR5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkKLQl7Ci0JCXJldHVybiB0YXJnZXRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lSW1wbCNnZXRUYXJnZXRFbnRpdHkgPGVtPlRhcmdldCBFbnRpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBFbnRpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhcmdldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgbmV3VGFyZ2V0RW50aXR5KQotCXsKLQkJU3RyaW5nIG9sZFRhcmdldEVudGl0eSA9IHRhcmdldEVudGl0eTsKLQkJdGFyZ2V0RW50aXR5ID0gbmV3VGFyZ2V0RW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1RBUkdFVF9FTlRJVFksIG9sZFRhcmdldEVudGl0eSwgdGFyZ2V0RW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iTEFaWSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEZldGNoKEZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfRmV0Y2goKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJMQVpZIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkKLQl7Ci0JCXJldHVybiBmZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmVJbXBsI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKQotCXsKLQkJRmV0Y2hUeXBlIG9sZEZldGNoID0gZmV0Y2g7Ci0JCWZldGNoID0gbmV3RmV0Y2ggPT0gbnVsbCA/IEZFVENIX0VERUZBVUxUIDogbmV3RmV0Y2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fRkVUQ0gsIG9sZEZldGNoLCBmZXRjaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3B0aW9uYWwoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfT3B0aW9uYWwoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkKLQl7Ci0JCXJldHVybiBvcHRpb25hbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmVJbXBsI2dldE9wdGlvbmFsIDxlbT5PcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkKLQl7Ci0JCUJvb2xlYW4gb2xkT3B0aW9uYWwgPSBvcHRpb25hbDsKLQkJb3B0aW9uYWwgPSBuZXdPcHRpb25hbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19PUFRJT05BTCwgb2xkT3B0aW9uYWwsIG9wdGlvbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwcGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXBwZWRCeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZV9NYXBwZWRCeSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkKLQl7Ci0JCXJldHVybiBtYXBwZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmVJbXBsI2dldE1hcHBlZEJ5IDxlbT5NYXBwZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwcGVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbmV3TWFwcGVkQnkpCi0JewotCQlTdHJpbmcgb2xkTWFwcGVkQnkgPSBtYXBwZWRCeTsKLQkJbWFwcGVkQnkgPSBuZXdNYXBwZWRCeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19NQVBQRURfQlksIG9sZE1hcHBlZEJ5LCBtYXBwZWRCeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCXsKLQkJaWYgKHByaW1hcnlLZXlKb2luQ29sdW1ucyA9PSBudWxsKQotCQl7Ci0JCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+KFhtbFByaW1hcnlLZXlKb2luQ29sdW1uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCX0KLQkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nX0pvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpCi0JewotCQlpZiAoam9pbkNvbHVtbnMgPT0gbnVsbCkKLQkJewotCQkJam9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSm9pbkNvbHVtbj4oWG1sSm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19KT0lOX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiBqb2luQ29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEpvaW5UYWJsZShYbWxKb2luVGFibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0pvaW5UYWJsZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpCi0JewotCQlyZXR1cm4gam9pblRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEpvaW5UYWJsZShYbWxKb2luVGFibGUgbmV3Sm9pblRhYmxlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSm9pblRhYmxlIG9sZEpvaW5UYWJsZSA9IGpvaW5UYWJsZTsKLQkJam9pblRhYmxlID0gbmV3Sm9pblRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fVEFCTEUsIG9sZEpvaW5UYWJsZSwgbmV3Sm9pblRhYmxlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmVJbXBsI2dldEpvaW5UYWJsZSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUpCi0JewotCQlpZiAobmV3Sm9pblRhYmxlICE9IGpvaW5UYWJsZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoam9pblRhYmxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWpvaW5UYWJsZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Sm9pblRhYmxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0pvaW5UYWJsZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRKb2luVGFibGUobmV3Sm9pblRhYmxlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRSwgbmV3Sm9pblRhYmxlLCBuZXdKb2luVGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhc2NhZGUoQ2FzY2FkZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FzY2FkZShDYXNjYWRlVHlwZSBuZXdDYXNjYWRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJQ2FzY2FkZVR5cGUgb2xkQ2FzY2FkZSA9IGNhc2NhZGU7Ci0JCWNhc2NhZGUgPSBuZXdDYXNjYWRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0NBU0NBREUsIG9sZENhc2NhZGUsIG5ld0Nhc2NhZGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZUltcGwjZ2V0Q2FzY2FkZSA8ZW0+Q2FzY2FkZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGUoQ2FzY2FkZVR5cGUgbmV3Q2FzY2FkZSkKLQl7Ci0JCWlmIChuZXdDYXNjYWRlICE9IGNhc2NhZGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNhc2NhZGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2FzY2FkZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fQ0FTQ0FERSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2FzY2FkZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYXNjYWRlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19DQVNDQURFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENhc2NhZGUobmV3Q2FzY2FkZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0NBU0NBREUsIG5ld0Nhc2NhZGUsIG5ld0Nhc2NhZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBiYXNpY1NldEpvaW5UYWJsZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19DQVNDQURFOgotCQkJCXJldHVybiBiYXNpY1NldENhc2NhZGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Sm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFRhcmdldEVudGl0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0ZFVENIOgotCQkJCXJldHVybiBnZXRGZXRjaCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJcmV0dXJuIGdldEpvaW5UYWJsZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGdldENhc2NhZGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19PUFRJT05BTDoKLQkJCQlyZXR1cm4gZ2V0T3B0aW9uYWwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGdldEpvaW5Db2x1bW5zKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fTUFQUEVEX0JZOgotCQkJCXJldHVybiBnZXRNYXBwZWRCeSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJc2V0VGFyZ2V0RW50aXR5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19GRVRDSDoKLQkJCQlzZXRGZXRjaCgoRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRToKLQkJCQlzZXRKb2luVGFibGUoKFhtbEpvaW5UYWJsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0NBU0NBREU6Ci0JCQkJc2V0Q2FzY2FkZSgoQ2FzY2FkZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19PUFRJT05BTDoKLQkJCQlzZXRPcHRpb25hbCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEpvaW5Db2x1bW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fTUFQUEVEX0JZOgotCQkJCXNldE1hcHBlZEJ5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJc2V0VGFyZ2V0RW50aXR5KFRBUkdFVF9FTlRJVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19GRVRDSDoKLQkJCQlzZXRGZXRjaChGRVRDSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJc2V0Sm9pblRhYmxlKChYbWxKb2luVGFibGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0NBU0NBREU6Ci0JCQkJc2V0Q2FzY2FkZSgoQ2FzY2FkZVR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX09QVElPTkFMOgotCQkJCXNldE9wdGlvbmFsKE9QVElPTkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fTUFQUEVEX0JZOgotCQkJCXNldE1hcHBlZEJ5KE1BUFBFRF9CWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fVEFSR0VUX0VOVElUWToKLQkJCQlyZXR1cm4gVEFSR0VUX0VOVElUWV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0RW50aXR5ICE9IG51bGwgOiAhVEFSR0VUX0VOVElUWV9FREVGQVVMVC5lcXVhbHModGFyZ2V0RW50aXR5KTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19GRVRDSDoKLQkJCQlyZXR1cm4gZmV0Y2ggIT0gRkVUQ0hfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRToKLQkJCQlyZXR1cm4gam9pblRhYmxlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fQ0FTQ0FERToKLQkJCQlyZXR1cm4gY2FzY2FkZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX09QVElPTkFMOgotCQkJCXJldHVybiBPUFRJT05BTF9FREVGQVVMVCA9PSBudWxsID8gb3B0aW9uYWwgIT0gbnVsbCA6ICFPUFRJT05BTF9FREVGQVVMVC5lcXVhbHMob3B0aW9uYWwpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gam9pbkNvbHVtbnMgIT0gbnVsbCAmJiAham9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX01BUFBFRF9CWToKLQkJCQlyZXR1cm4gTUFQUEVEX0JZX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWRCeSAhPSBudWxsIDogIU1BUFBFRF9CWV9FREVGQVVMVC5lcXVhbHMobWFwcGVkQnkpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW5zICE9IG51bGwgJiYgIXByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fVEFSR0VUX0VOVElUWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19GRVRDSDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19DQVNDQURFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19PUFRJT05BTDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvT25lLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX01BUFBFRF9CWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1RBUkdFVF9FTlRJVFk7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0ZFVENIOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fVEFCTEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fQ0FTQ0FERTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX09QVElPTkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19PUFRJT05BTDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19KT0lOX0NPTFVNTlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9PbmUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fTUFQUEVEX0JZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0YXJnZXRFbnRpdHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRhcmdldEVudGl0eSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmV0Y2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZldGNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvcHRpb25hbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3B0aW9uYWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZEJ5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYXBwZWRCeSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIG1hcHBlZEJ5Tm9kZSA9IChJRE9NTm9kZSkgRE9NVXRpbGl0aWVzLmNoaWxkQXR0cmlidXRlTm9kZShnZXROb2RlKCksIE9ybVhtbE1hcHBlci5NQVBQRURfQlkpOwotCQlyZXR1cm4gKG1hcHBlZEJ5Tm9kZSA9PSBudWxsKSA/IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSA6IGJ1aWxkVGV4dFJhbmdlKG1hcHBlZEJ5Tm9kZSk7Ci0JfQotfSAvLyBPbmVUb09uZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzM1YzU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldEFjY2VzcyA8ZW0+QWNjZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjaXNDYXNjYWRlUGVyc2lzdCA8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NoZW1hKCkgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NoZW1hKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NoZW1hKCkgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NoZW1hKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjaGVtYSA9IFNDSEVNQV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRhbG9nKCkgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGFsb2coKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNhdGFsb2cgPSBDQVRBTE9HX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQWNjZXNzVHlwZSBBQ0NFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzKCkgPGVtPkFjY2VzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBhY2Nlc3MgPSBBQ0NFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYXNjYWRlUGVyc2lzdCgpIDxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZVBlcnNpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDQVNDQURFX1BFUlNJU1RfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZVBlcnNpc3QoKSA8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlUGVyc2lzdCA9IENBU0NBREVfUEVSU0lTVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGl0eUxpc3RlbmVycygpIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlMaXN0ZW5lcnMgZW50aXR5TGlzdGVuZXJzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2hlbWEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfU2NoZW1hKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkKLQl7Ci0JCXJldHVybiBzY2hlbWE7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgbmV3U2NoZW1hKQotCXsKLQkJU3RyaW5nIG9sZFNjaGVtYSA9IHNjaGVtYTsKLQkJc2NoZW1hID0gbmV3U2NoZW1hOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19TQ0hFTUEsIG9sZFNjaGVtYSwgc2NoZW1hKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXRhbG9nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0NhdGFsb2coKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkKLQl7Ci0JCXJldHVybiBjYXRhbG9nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgbmV3Q2F0YWxvZykKLQl7Ci0JCVN0cmluZyBvbGRDYXRhbG9nID0gY2F0YWxvZzsKLQkJY2F0YWxvZyA9IG5ld0NhdGFsb2c7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0csIG9sZENhdGFsb2csIGNhdGFsb2cpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iUFJPUEVSVFkiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlCi0JICogQHNlZSAjc2V0QWNjZXNzKEFjY2Vzc1R5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19BY2Nlc3MoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJQUk9QRVJUWSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldEFjY2VzcyA8ZW0+QWNjZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUKLQkgKiBAc2VlICNnZXRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdBY2Nlc3MpCi0JewotCQlBY2Nlc3NUeXBlIG9sZEFjY2VzcyA9IGFjY2VzczsKLQkJYWNjZXNzID0gbmV3QWNjZXNzID09IG51bGwgPyBBQ0NFU1NfRURFRkFVTFQgOiBuZXdBY2Nlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUywgb2xkQWNjZXNzLCBhY2Nlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIFBlcnNpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19DYXNjYWRlUGVyc2lzdCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpCi0JewotCQlyZXR1cm4gY2FzY2FkZVBlcnNpc3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2lzQ2FzY2FkZVBlcnNpc3QgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbiBuZXdDYXNjYWRlUGVyc2lzdCkKLQl7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZVBlcnNpc3QgPSBjYXNjYWRlUGVyc2lzdDsKLQkJY2FzY2FkZVBlcnNpc3QgPSBuZXdDYXNjYWRlUGVyc2lzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNULCBvbGRDYXNjYWRlUGVyc2lzdCwgY2FzY2FkZVBlcnNpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVudGl0eUxpc3RlbmVycyhFbnRpdHlMaXN0ZW5lcnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19FbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudGl0eUxpc3RlbmVycyBnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIGVudGl0eUxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbnRpdHlMaXN0ZW5lcnMoRW50aXR5TGlzdGVuZXJzIG5ld0VudGl0eUxpc3RlbmVycywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCUVudGl0eUxpc3RlbmVycyBvbGRFbnRpdHlMaXN0ZW5lcnMgPSBlbnRpdHlMaXN0ZW5lcnM7Ci0JCWVudGl0eUxpc3RlbmVycyA9IG5ld0VudGl0eUxpc3RlbmVyczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fRU5USVRZX0xJU1RFTkVSUywgb2xkRW50aXR5TGlzdGVuZXJzLCBuZXdFbnRpdHlMaXN0ZW5lcnMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRFbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVudGl0eUxpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eUxpc3RlbmVycyhFbnRpdHlMaXN0ZW5lcnMgbmV3RW50aXR5TGlzdGVuZXJzKQotCXsKLQkJaWYgKG5ld0VudGl0eUxpc3RlbmVycyAhPSBlbnRpdHlMaXN0ZW5lcnMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVudGl0eUxpc3RlbmVycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllbnRpdHlMaXN0ZW5lcnMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19FTlRJVFlfTElTVEVORVJTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdFbnRpdHlMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RW50aXR5TGlzdGVuZXJzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fRU5USVRZX0xJU1RFTkVSUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFbnRpdHlMaXN0ZW5lcnMobmV3RW50aXR5TGlzdGVuZXJzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlMsIG5ld0VudGl0eUxpc3RlbmVycywgbmV3RW50aXR5TGlzdGVuZXJzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RW50aXR5TGlzdGVuZXJzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fU0NIRU1BOgotCQkJCXJldHVybiBnZXRTY2hlbWEoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FUQUxPRzoKLQkJCQlyZXR1cm4gZ2V0Q2F0YWxvZygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1M6Ci0JCQkJcmV0dXJuIGdldEFjY2VzcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVNDQURFX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIGlzQ2FzY2FkZVBlcnNpc3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGdldEVudGl0eUxpc3RlbmVycygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fU0NIRU1BOgotCQkJCXNldFNjaGVtYSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0c6Ci0JCQkJc2V0Q2F0YWxvZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUzoKLQkJCQlzZXRBY2Nlc3MoKEFjY2Vzc1R5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNUOgotCQkJCXNldENhc2NhZGVQZXJzaXN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlzZXRFbnRpdHlMaXN0ZW5lcnMoKEVudGl0eUxpc3RlbmVycyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19TQ0hFTUE6Ci0JCQkJc2V0U2NoZW1hKFNDSEVNQV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVRBTE9HOgotCQkJCXNldENhdGFsb2coQ0FUQUxPR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1M6Ci0JCQkJc2V0QWNjZXNzKEFDQ0VTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVNDQURFX1BFUlNJU1Q6Ci0JCQkJc2V0Q2FzY2FkZVBlcnNpc3QoQ0FTQ0FERV9QRVJTSVNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJc2V0RW50aXR5TGlzdGVuZXJzKChFbnRpdHlMaXN0ZW5lcnMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fU0NIRU1BOgotCQkJCXJldHVybiBTQ0hFTUFfRURFRkFVTFQgPT0gbnVsbCA/IHNjaGVtYSAhPSBudWxsIDogIVNDSEVNQV9FREVGQVVMVC5lcXVhbHMoc2NoZW1hKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FUQUxPRzoKLQkJCQlyZXR1cm4gQ0FUQUxPR19FREVGQVVMVCA9PSBudWxsID8gY2F0YWxvZyAhPSBudWxsIDogIUNBVEFMT0dfRURFRkFVTFQuZXF1YWxzKGNhdGFsb2cpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1M6Ci0JCQkJcmV0dXJuIGFjY2VzcyAhPSBBQ0NFU1NfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBU0NBREVfUEVSU0lTVDoKLQkJCQlyZXR1cm4gY2FzY2FkZVBlcnNpc3QgIT0gQ0FTQ0FERV9QRVJTSVNUX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19FTlRJVFlfTElTVEVORVJTOgotCQkJCXJldHVybiBlbnRpdHlMaXN0ZW5lcnMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2NoZW1hOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY2hlbWEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhdGFsb2c6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhdGFsb2cpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjY2VzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWNjZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXNjYWRlUGVyc2lzdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FzY2FkZVBlcnNpc3QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZiNjE3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSNpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIDxlbT5YbWwgTWFwcGluZyBNZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI2dldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpIDxlbT5YbWwgTWFwcGluZyBNZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgPGVtPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSA9IFhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YbWwgTWFwcGluZyBNZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YbWwgTWFwcGluZyBNZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSA8ZW0+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoYm9vbGVhbiBuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSkKLQl7Ci0JCWJvb2xlYW4gb2xkWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgPSB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTsKLQkJeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgPSBuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEUsIG9sZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlLCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhtbFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCXsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIG5ld1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgb2xkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBuZXdQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUywgb2xkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMsIG5ld1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgbmV3UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpCi0JewotCQlpZiAobmV3UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgIT0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKG5ld1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMsIG5ld1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLCBuZXdQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTOgotCQkJCXJldHVybiBiYXNpY1NldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURToKLQkJCQlzZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM6Ci0JCQkJc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1hNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKFhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM6Ci0JCQkJc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1hNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXJldHVybiB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSAhPSBYTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURV9FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUzoKLQkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjc0NzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW48L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGV4dGVuZHMgWG1sTmFtZWRDb2x1bW4KLXsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5fUmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4jZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUgPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZSBhdHRpYnV0ZS4gIElmIHRoZSByZWZlcmVuY2VkLWNvbHVtbi1uYW1lIGF0dGlidXRlIAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqdGFibGUgZWxlbWVudC4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKTsKLQotfSAvLyBQcmltYXJ5S2V5Sm9pbkNvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MmI1N2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9ycy5Pcm1YbWxNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5lbWYuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uIEltcGw8L2I+PC9lbT4nLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCBleHRlbmRzIEFic3RyYWN0WG1sTmFtZWRDb2x1bW4gaW1wbGVtZW50cyBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIDxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIDxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbl9SZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQl7Ci0JCXJldHVybiByZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lIDxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuZXdSZWZlcmVuY2VkQ29sdW1uTmFtZSkKLQl7Ci0JCVN0cmluZyBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld1JlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9JTVBMX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRToKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0lNUExfX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6Ci0JCQkJc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9JTVBMX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOgotCQkJCXNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0lNUExfX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6Ci0JCQkJcmV0dXJuIFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlZmVyZW5jZWRDb2x1bW5OYW1lICE9IG51bGwgOiAhUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9FREVGQVVMVC5lcXVhbHMocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlZmVyZW5jZWRDb2x1bW5OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIHJlZmVyZW5jZWRDb2x1bW5OYW1lTm9kZSA9IChJRE9NTm9kZSkgRE9NVXRpbGl0aWVzLmNoaWxkQXR0cmlidXRlTm9kZSh0aGlzLm5vZGUsIE9ybVhtbE1hcHBlci5SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQkJcmV0dXJuIChyZWZlcmVuY2VkQ29sdW1uTmFtZU5vZGUgPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOiBidWlsZFRleHRSYW5nZShyZWZlcmVuY2VkQ29sdW1uTmFtZU5vZGUpOwotCX0KLX0gLy8gWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOWRlNTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5RdWVyeTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSNnZXRRdWVyeSA8ZW0+UXVlcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSNnZXRIaW50cyA8ZW0+SGludHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxRdWVyeSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RdWVyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UXVlcnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFF1ZXJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5X1F1ZXJ5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UXVlcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSNnZXRRdWVyeSA8ZW0+UXVlcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UXVlcnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfSGludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sUXVlcnlIaW50PiBnZXRIaW50cygpOwotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlIaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5SGludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDBhNmM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlIaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5RdWVyeSBIaW50PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeUhpbnQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUXVlcnlIaW50IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUXVlcnlIaW50KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1FVRVJZX0hJTlQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5SGludF9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5SGludF9WYWx1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0JewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkKLQl7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUVVFUllfSElOVF9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gUXVlcnlIaW50CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVlNTBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlbGF0aW9uc2hpcCBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRUYXJnZXRFbnRpdHkgPGVtPlRhcmdldCBFbnRpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0Sm9pblRhYmxlIDxlbT5Kb2luIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRDYXNjYWRlIDxlbT5DYXNjYWRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIGV4dGVuZHMgWG1sQXR0cmlidXRlTWFwcGluZwotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhcmdldCBFbnRpdHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFyZ2V0RW50aXR5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldFRhcmdldEVudGl0eSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFyZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkxBWlkiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRGZXRjaChGZXRjaFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0ZldGNoKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iTEFaWSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmV0Y2hUeXBlIGdldEZldGNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRGZXRjaCA8ZW0+RmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkgKiBAc2VlICNnZXRGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfQ2FzY2FkZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDYXNjYWRlVHlwZSBnZXRDYXNjYWRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRDYXNjYWRlIDxlbT5DYXNjYWRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYXNjYWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldEpvaW5UYWJsZSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIHZhbHVlKTsKLQotfSAvLyBSZWxhdGlvbnNoaXBNYXBwaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlY29uZGFyeVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlY29uZGFyeVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2Y2ZiN2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxTZWNvbmRhcnlUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY29uZGFyeSBUYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlI2dldFByaW1hcnlLZXlKb2luQ29sdW1ucyA8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2Vjb25kYXJ5VGFibGUgZXh0ZW5kcyBYbWxCYXNlVGFibGUKLXsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCi19IC8vIFNlY29uZGFyeVRhYmxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlY29uZGFyeVRhYmxlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxTZWNvbmRhcnlUYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkNjhkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlY29uZGFyeVRhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU2Vjb25kYXJ5IFRhYmxlIEltcGw8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlY29uZGFyeVRhYmxlSW1wbCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTZWNvbmRhcnlUYWJsZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEJhc2VUYWJsZSBpbXBsZW1lbnRzIFhtbFNlY29uZGFyeVRhYmxlCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFNlY29uZGFyeVRhYmxlSW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2Vjb25kYXJ5VGFibGVfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQl7Ci0JCWlmIChwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPT0gbnVsbCkKLQkJewotCQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPihYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCX0KLQkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9JTVBMX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW5zICE9IG51bGwgJiYgIXByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFNlY29uZGFyeVRhYmxlLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxTZWNvbmRhcnlUYWJsZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi19IC8vIFhtbFNlY29uZGFyeVRhYmxlSW1wbApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxTZXF1ZW5jZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxTZXF1ZW5jZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjFmZGM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sU2VxdWVuY2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yI2dldFNlcXVlbmNlTmFtZSA8ZW0+U2VxdWVuY2UgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3IoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFNlcXVlbmNlR2VuZXJhdG9yIGV4dGVuZHMgWG1sR2VuZXJhdG9yCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VxdWVuY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VxdWVuY2UgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXF1ZW5jZU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfU2VxdWVuY2VOYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXF1ZW5jZU5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvciNnZXRTZXF1ZW5jZU5hbWUgPGVtPlNlcXVlbmNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcXVlbmNlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcXVlbmNlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VxdWVuY2VOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2VxdWVuY2VHZW5lcmF0b3IKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlcXVlbmNlR2VuZXJhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjFmYjA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sU2VxdWVuY2VHZW5lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsVmFsdWUoKSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgSU5JVElBTF9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsVmFsdWUoKSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBpbml0aWFsVmFsdWUgPSBJTklUSUFMX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsbG9jYXRpb25TaXplKCkgPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxsb2NhdGlvblNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxsb2NhdGlvblNpemUoKSA8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbGxvY2F0aW9uU2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgYWxsb2NhdGlvblNpemUgPSBBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VxdWVuY2VOYW1lKCkgPGVtPlNlcXVlbmNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcXVlbmNlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0VfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZU5hbWUoKSA8ZW0+U2VxdWVuY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VxdWVuY2VOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcXVlbmNlTmFtZSA9IFNFUVVFTkNFX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcXVlbmNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcXVlbmNlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VxdWVuY2VOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yX1NlcXVlbmNlTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcXVlbmNlTmFtZSgpCi0JewotCQlyZXR1cm4gc2VxdWVuY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwjZ2V0U2VxdWVuY2VOYW1lIDxlbT5TZXF1ZW5jZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZU5hbWUoU3RyaW5nIG5ld1NlcXVlbmNlTmFtZSkKLQl7Ci0JCVN0cmluZyBvbGRTZXF1ZW5jZU5hbWUgPSBzZXF1ZW5jZU5hbWU7Ci0JCXNlcXVlbmNlTmFtZSA9IG5ld1NlcXVlbmNlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX1NFUVVFTkNFX05BTUUsIG9sZFNlcXVlbmNlTmFtZSwgc2VxdWVuY2VOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbml0aWFsVmFsdWUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcl9Jbml0aWFsVmFsdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SW5pdGlhbFZhbHVlKCkKLQl7Ci0JCXJldHVybiBpbml0aWFsVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCNnZXRJbml0aWFsVmFsdWUgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxWYWx1ZShJbnRlZ2VyIG5ld0luaXRpYWxWYWx1ZSkKLQl7Ci0JCUludGVnZXIgb2xkSW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlOwotCQlpbml0aWFsVmFsdWUgPSBuZXdJbml0aWFsVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19JTklUSUFMX1ZBTFVFLCBvbGRJbml0aWFsVmFsdWUsIGluaXRpYWxWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcl9BbGxvY2F0aW9uU2l6ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpCi0JewotCQlyZXR1cm4gYWxsb2NhdGlvblNpemU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCNnZXRBbGxvY2F0aW9uU2l6ZSA8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFsbG9jYXRpb25TaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlciBuZXdBbGxvY2F0aW9uU2l6ZSkKLQl7Ci0JCUludGVnZXIgb2xkQWxsb2NhdGlvblNpemUgPSBhbGxvY2F0aW9uU2l6ZTsKLQkJYWxsb2NhdGlvblNpemUgPSBuZXdBbGxvY2F0aW9uU2l6ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX0FMTE9DQVRJT05fU0laRSwgb2xkQWxsb2NhdGlvblNpemUsIGFsbG9jYXRpb25TaXplKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19JTklUSUFMX1ZBTFVFOgotCQkJCXJldHVybiBnZXRJbml0aWFsVmFsdWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX0FMTE9DQVRJT05fU0laRToKLQkJCQlyZXR1cm4gZ2V0QWxsb2NhdGlvblNpemUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX1NFUVVFTkNFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFNlcXVlbmNlTmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19JTklUSUFMX1ZBTFVFOgotCQkJCXNldEluaXRpYWxWYWx1ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fQUxMT0NBVElPTl9TSVpFOgotCQkJCXNldEFsbG9jYXRpb25TaXplKChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19TRVFVRU5DRV9OQU1FOgotCQkJCXNldFNlcXVlbmNlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fSU5JVElBTF9WQUxVRToKLQkJCQlzZXRJbml0aWFsVmFsdWUoSU5JVElBTF9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fQUxMT0NBVElPTl9TSVpFOgotCQkJCXNldEFsbG9jYXRpb25TaXplKEFMTE9DQVRJT05fU0laRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fU0VRVUVOQ0VfTkFNRToKLQkJCQlzZXRTZXF1ZW5jZU5hbWUoU0VRVUVOQ0VfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX0lOSVRJQUxfVkFMVUU6Ci0JCQkJcmV0dXJuIElOSVRJQUxfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGluaXRpYWxWYWx1ZSAhPSBudWxsIDogIUlOSVRJQUxfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19BTExPQ0FUSU9OX1NJWkU6Ci0JCQkJcmV0dXJuIEFMTE9DQVRJT05fU0laRV9FREVGQVVMVCA9PSBudWxsID8gYWxsb2NhdGlvblNpemUgIT0gbnVsbCA6ICFBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQuZXF1YWxzKGFsbG9jYXRpb25TaXplKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX1NFUVVFTkNFX05BTUU6Ci0JCQkJcmV0dXJuIFNFUVVFTkNFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlcXVlbmNlTmFtZSAhPSBudWxsIDogIVNFUVVFTkNFX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlcXVlbmNlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluaXRpYWxWYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW5pdGlhbFZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhbGxvY2F0aW9uU2l6ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWxsb2NhdGlvblNpemUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlcXVlbmNlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VxdWVuY2VOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgbmFtZU5vZGUgPSAoSURPTU5vZGUpIERPTVV0aWxpdGllcy5jaGlsZEF0dHJpYnV0ZU5vZGUoZ2V0Tm9kZSgpLCBPcm1YbWxNYXBwZXIuTkFNRSk7Ci0JCXJldHVybiAobmFtZU5vZGUgPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOiBidWlsZFRleHRSYW5nZShuYW1lTm9kZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmZlMzFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNpbmdsZSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRKb2luQ29sdW1ucyA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIGV4dGVuZHMgWG1sUmVsYXRpb25zaGlwTWFwcGluZwotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3B0aW9uYWwoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfT3B0aW9uYWwoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0T3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE9wdGlvbmFsIDxlbT5PcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pbkNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQotfSAvLyBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkY2RlOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sVGFibGUgZXh0ZW5kcyBBYnN0cmFjdFhtbEJhc2VUYWJsZQotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUYWJsZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9UQUJMRTsKLQl9Ci19IC8vIFRhYmxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YmM1NmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRQa0NvbHVtbk5hbWUgPGVtPlBrIENvbHVtbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0VmFsdWVDb2x1bW5OYW1lIDxlbT5WYWx1ZSBDb2x1bW4gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFBrQ29sdW1uVmFsdWUgPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFVuaXF1ZUNvbnN0cmFpbnRzIDxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxUYWJsZUdlbmVyYXRvciBleHRlbmRzIFhtbEdlbmVyYXRvcgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFibGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JfVGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0VGFibGUgPGVtPlRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhYmxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhdGFsb2coU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JfQ2F0YWxvZygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2F0YWxvZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhdGFsb2coKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhdGFsb2coU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NoZW1hKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yX1NjaGVtYSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2NoZW1hKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NoZW1hKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBrIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QayBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QayBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGtDb2x1bW5OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yX1BrQ29sdW1uTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGtDb2x1bW5OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0UGtDb2x1bW5OYW1lIDxlbT5QayBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGsgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBrQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGtDb2x1bW5OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlQ29sdW1uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl9WYWx1ZUNvbHVtbk5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlQ29sdW1uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFZhbHVlQ29sdW1uTmFtZSA8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZUNvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlQ29sdW1uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGsgQ29sdW1uIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QayBDb2x1bW4gVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGsgQ29sdW1uIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQa0NvbHVtblZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yX1BrQ29sdW1uVmFsdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBrQ29sdW1uVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRQa0NvbHVtblZhbHVlIDxlbT5QayBDb2x1bW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGtDb2x1bW5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGtDb2x1bW5WYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JfVW5pcXVlQ29uc3RyYWludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4gZ2V0VW5pcXVlQ29uc3RyYWludHMoKTsKLQotfSAvLyBUYWJsZUdlbmVyYXRvcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZUdlbmVyYXRvckltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGFibGVHZW5lcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjE1ZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZUdlbmVyYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzLk9ybVhtbE1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmVtZi5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JJbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFRhYmxlR2VuZXJhdG9ySW1wbCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFRhYmxlR2VuZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFZhbHVlKCkgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIElOSVRJQUxfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFZhbHVlKCkgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgaW5pdGlhbFZhbHVlID0gSU5JVElBTF9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGxvY2F0aW9uU2l6ZSgpIDxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsbG9jYXRpb25TaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgQUxMT0NBVElPTl9TSVpFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsbG9jYXRpb25TaXplKCkgPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxsb2NhdGlvblNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGFsbG9jYXRpb25TaXplID0gQUxMT0NBVElPTl9TSVpFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhYmxlKCkgPGVtPlRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGUoKSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhYmxlID0gVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2coKSA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nID0gQ0FUQUxPR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hID0gU0NIRU1BX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBrQ29sdW1uTmFtZSgpIDxlbT5QayBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGtDb2x1bW5OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQS19DT0xVTU5fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQa0NvbHVtbk5hbWUoKSA8ZW0+UGsgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBrQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwa0NvbHVtbk5hbWUgPSBQS19DT0xVTU5fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUNvbHVtbk5hbWUoKSA8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfQ09MVU1OX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVDb2x1bW5OYW1lKCkgPGVtPlZhbHVlIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUNvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lID0gVkFMVUVfQ09MVU1OX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGtDb2x1bW5WYWx1ZSgpIDxlbT5QayBDb2x1bW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBrQ29sdW1uVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBLX0NPTFVNTl9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQa0NvbHVtblZhbHVlKCkgPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGtDb2x1bW5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwa0NvbHVtblZhbHVlID0gUEtfQ09MVU1OX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pcXVlQ29uc3RyYWludHMoKSA8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXF1ZUNvbnN0cmFpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVGFibGVHZW5lcmF0b3JJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvckltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFibGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JfVGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpCi0JewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9ySW1wbCNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyBuZXdUYWJsZSkKLQl7Ci0JCVN0cmluZyBvbGRUYWJsZSA9IHRhYmxlOwotCQl0YWJsZSA9IG5ld1RhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fVEFCTEUsIG9sZFRhYmxlLCB0YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2F0YWxvZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl9DYXRhbG9nKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpCi0JewotCQlyZXR1cm4gY2F0YWxvZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3JJbXBsI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhdGFsb2coKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nKFN0cmluZyBuZXdDYXRhbG9nKQotCXsKLQkJU3RyaW5nIG9sZENhdGFsb2cgPSBjYXRhbG9nOwotCQljYXRhbG9nID0gbmV3Q2F0YWxvZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0NBVEFMT0csIG9sZENhdGFsb2csIGNhdGFsb2cpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNjaGVtYShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl9TY2hlbWEoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKQotCXsKLQkJcmV0dXJuIHNjaGVtYTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3JJbXBsI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgbmV3U2NoZW1hKQotCXsKLQkJU3RyaW5nIG9sZFNjaGVtYSA9IHNjaGVtYTsKLQkJc2NoZW1hID0gbmV3U2NoZW1hOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fU0NIRU1BLCBvbGRTY2hlbWEsIHNjaGVtYSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBrIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QayBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QayBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGtDb2x1bW5OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yX1BrQ29sdW1uTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uTmFtZSgpCi0JewotCQlyZXR1cm4gcGtDb2x1bW5OYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvckltcGwjZ2V0UGtDb2x1bW5OYW1lIDxlbT5QayBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGsgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBrQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBrQ29sdW1uTmFtZShTdHJpbmcgbmV3UGtDb2x1bW5OYW1lKQotCXsKLQkJU3RyaW5nIG9sZFBrQ29sdW1uTmFtZSA9IHBrQ29sdW1uTmFtZTsKLQkJcGtDb2x1bW5OYW1lID0gbmV3UGtDb2x1bW5OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fUEtfQ09MVU1OX05BTUUsIG9sZFBrQ29sdW1uTmFtZSwgcGtDb2x1bW5OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JfVmFsdWVDb2x1bW5OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVDb2x1bW5OYW1lKCkKLQl7Ci0JCXJldHVybiB2YWx1ZUNvbHVtbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9ySW1wbCNnZXRWYWx1ZUNvbHVtbk5hbWUgPGVtPlZhbHVlIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVDb2x1bW5OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVDb2x1bW5OYW1lKFN0cmluZyBuZXdWYWx1ZUNvbHVtbk5hbWUpCi0JewotCQlTdHJpbmcgb2xkVmFsdWVDb2x1bW5OYW1lID0gdmFsdWVDb2x1bW5OYW1lOwotCQl2YWx1ZUNvbHVtbk5hbWUgPSBuZXdWYWx1ZUNvbHVtbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19WQUxVRV9DT0xVTU5fTkFNRSwgb2xkVmFsdWVDb2x1bW5OYW1lLCB2YWx1ZUNvbHVtbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QayBDb2x1bW4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QayBDb2x1bW4gVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBrQ29sdW1uVmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JfUGtDb2x1bW5WYWx1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uVmFsdWUoKQotCXsKLQkJcmV0dXJuIHBrQ29sdW1uVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9ySW1wbCNnZXRQa0NvbHVtblZhbHVlIDxlbT5QayBDb2x1bW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGtDb2x1bW5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBrQ29sdW1uVmFsdWUoU3RyaW5nIG5ld1BrQ29sdW1uVmFsdWUpCi0JewotCQlTdHJpbmcgb2xkUGtDb2x1bW5WYWx1ZSA9IHBrQ29sdW1uVmFsdWU7Ci0JCXBrQ29sdW1uVmFsdWUgPSBuZXdQa0NvbHVtblZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fUEtfQ09MVU1OX1ZBTFVFLCBvbGRQa0NvbHVtblZhbHVlLCBwa0NvbHVtblZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbml0aWFsVmFsdWUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcl9Jbml0aWFsVmFsdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SW5pdGlhbFZhbHVlKCkKLQl7Ci0JCXJldHVybiBpbml0aWFsVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9ySW1wbCNnZXRJbml0aWFsVmFsdWUgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxWYWx1ZShJbnRlZ2VyIG5ld0luaXRpYWxWYWx1ZSkKLQl7Ci0JCUludGVnZXIgb2xkSW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlOwotCQlpbml0aWFsVmFsdWUgPSBuZXdJbml0aWFsVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19JTklUSUFMX1ZBTFVFLCBvbGRJbml0aWFsVmFsdWUsIGluaXRpYWxWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcl9BbGxvY2F0aW9uU2l6ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpCi0JewotCQlyZXR1cm4gYWxsb2NhdGlvblNpemU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9ySW1wbCNnZXRBbGxvY2F0aW9uU2l6ZSA8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFsbG9jYXRpb25TaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlciBuZXdBbGxvY2F0aW9uU2l6ZSkKLQl7Ci0JCUludGVnZXIgb2xkQWxsb2NhdGlvblNpemUgPSBhbGxvY2F0aW9uU2l6ZTsKLQkJYWxsb2NhdGlvblNpemUgPSBuZXdBbGxvY2F0aW9uU2l6ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0FMTE9DQVRJT05fU0laRSwgb2xkQWxsb2NhdGlvblNpemUsIGFsbG9jYXRpb25TaXplKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JfVW5pcXVlQ29uc3RyYWludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkKLQl7Ci0JCWlmICh1bmlxdWVDb25zdHJhaW50cyA9PSBudWxsKQotCQl7Ci0JCQl1bmlxdWVDb25zdHJhaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PihYbWxVbmlxdWVDb25zdHJhaW50LmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fVU5JUVVFX0NPTlNUUkFJTlRTKTsKLQkJfQotCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19VTklRVUVfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRVbmlxdWVDb25zdHJhaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fSU5JVElBTF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbFZhbHVlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19BTExPQ0FUSU9OX1NJWkU6Ci0JCQkJcmV0dXJuIGdldEFsbG9jYXRpb25TaXplKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19UQUJMRToKLQkJCQlyZXR1cm4gZ2V0VGFibGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0NBVEFMT0c6Ci0JCQkJcmV0dXJuIGdldENhdGFsb2coKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1NDSEVNQToKLQkJCQlyZXR1cm4gZ2V0U2NoZW1hKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19QS19DT0xVTU5fTkFNRToKLQkJCQlyZXR1cm4gZ2V0UGtDb2x1bW5OYW1lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19WQUxVRV9DT0xVTU5fTkFNRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWVDb2x1bW5OYW1lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19QS19DT0xVTU5fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFBrQ29sdW1uVmFsdWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1VOSVFVRV9DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gZ2V0VW5pcXVlQ29uc3RyYWludHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fSU5JVElBTF9WQUxVRToKLQkJCQlzZXRJbml0aWFsVmFsdWUoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0FMTE9DQVRJT05fU0laRToKLQkJCQlzZXRBbGxvY2F0aW9uU2l6ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fVEFCTEU6Ci0JCQkJc2V0VGFibGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fQ0FUQUxPRzoKLQkJCQlzZXRDYXRhbG9nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1NDSEVNQToKLQkJCQlzZXRTY2hlbWEoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fUEtfQ09MVU1OX05BTUU6Ci0JCQkJc2V0UGtDb2x1bW5OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1ZBTFVFX0NPTFVNTl9OQU1FOgotCQkJCXNldFZhbHVlQ29sdW1uTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19QS19DT0xVTU5fVkFMVUU6Ci0JCQkJc2V0UGtDb2x1bW5WYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19VTklRVUVfQ09OU1RSQUlOVFM6Ci0JCQkJZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5jbGVhcigpOwotCQkJCWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxVbmlxdWVDb25zdHJhaW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0lOSVRJQUxfVkFMVUU6Ci0JCQkJc2V0SW5pdGlhbFZhbHVlKElOSVRJQUxfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0FMTE9DQVRJT05fU0laRToKLQkJCQlzZXRBbGxvY2F0aW9uU2l6ZShBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1RBQkxFOgotCQkJCXNldFRhYmxlKFRBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19DQVRBTE9HOgotCQkJCXNldENhdGFsb2coQ0FUQUxPR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fU0NIRU1BOgotCQkJCXNldFNjaGVtYShTQ0hFTUFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1BLX0NPTFVNTl9OQU1FOgotCQkJCXNldFBrQ29sdW1uTmFtZShQS19DT0xVTU5fTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fVkFMVUVfQ09MVU1OX05BTUU6Ci0JCQkJc2V0VmFsdWVDb2x1bW5OYW1lKFZBTFVFX0NPTFVNTl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19QS19DT0xVTU5fVkFMVUU6Ci0JCQkJc2V0UGtDb2x1bW5WYWx1ZShQS19DT0xVTU5fVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1VOSVFVRV9DT05TVFJBSU5UUzoKLQkJCQlnZXRVbmlxdWVDb25zdHJhaW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0lOSVRJQUxfVkFMVUU6Ci0JCQkJcmV0dXJuIElOSVRJQUxfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGluaXRpYWxWYWx1ZSAhPSBudWxsIDogIUlOSVRJQUxfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19BTExPQ0FUSU9OX1NJWkU6Ci0JCQkJcmV0dXJuIEFMTE9DQVRJT05fU0laRV9FREVGQVVMVCA9PSBudWxsID8gYWxsb2NhdGlvblNpemUgIT0gbnVsbCA6ICFBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQuZXF1YWxzKGFsbG9jYXRpb25TaXplKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1RBQkxFOgotCQkJCXJldHVybiBUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gdGFibGUgIT0gbnVsbCA6ICFUQUJMRV9FREVGQVVMVC5lcXVhbHModGFibGUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fQ0FUQUxPRzoKLQkJCQlyZXR1cm4gQ0FUQUxPR19FREVGQVVMVCA9PSBudWxsID8gY2F0YWxvZyAhPSBudWxsIDogIUNBVEFMT0dfRURFRkFVTFQuZXF1YWxzKGNhdGFsb2cpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fU0NIRU1BOgotCQkJCXJldHVybiBTQ0hFTUFfRURFRkFVTFQgPT0gbnVsbCA/IHNjaGVtYSAhPSBudWxsIDogIVNDSEVNQV9FREVGQVVMVC5lcXVhbHMoc2NoZW1hKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1BLX0NPTFVNTl9OQU1FOgotCQkJCXJldHVybiBQS19DT0xVTU5fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcGtDb2x1bW5OYW1lICE9IG51bGwgOiAhUEtfQ09MVU1OX05BTUVfRURFRkFVTFQuZXF1YWxzKHBrQ29sdW1uTmFtZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19WQUxVRV9DT0xVTU5fTkFNRToKLQkJCQlyZXR1cm4gVkFMVUVfQ09MVU1OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlQ29sdW1uTmFtZSAhPSBudWxsIDogIVZBTFVFX0NPTFVNTl9OQU1FX0VERUZBVUxULmVxdWFscyh2YWx1ZUNvbHVtbk5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fUEtfQ09MVU1OX1ZBTFVFOgotCQkJCXJldHVybiBQS19DT0xVTU5fVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHBrQ29sdW1uVmFsdWUgIT0gbnVsbCA6ICFQS19DT0xVTU5fVkFMVUVfRURFRkFVTFQuZXF1YWxzKHBrQ29sdW1uVmFsdWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiB1bmlxdWVDb25zdHJhaW50cyAhPSBudWxsICYmICF1bmlxdWVDb25zdHJhaW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluaXRpYWxWYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW5pdGlhbFZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhbGxvY2F0aW9uU2l6ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWxsb2NhdGlvblNpemUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2F0YWxvZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2F0YWxvZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2NoZW1hOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY2hlbWEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBrQ29sdW1uTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGtDb2x1bW5OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZUNvbHVtbk5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlQ29sdW1uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGtDb2x1bW5WYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGtDb2x1bW5WYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIG5hbWVOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKGdldE5vZGUoKSwgT3JtWG1sTWFwcGVyLk5BTUUpOwotCQlyZXR1cm4gKG5hbWVOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UobmFtZU5vZGUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2llbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYWU1NjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2llbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHJhbnNpZW50KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxUcmFuc2llbnQgZXh0ZW5kcyBYbWxBdHRyaWJ1dGVNYXBwaW5nCi17Ci19IC8vIFRyYW5zaWVudApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2llbnRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRyYW5zaWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhOTU3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRyYW5zaWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUcmFuc2llbnRJbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFRyYW5zaWVudEltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxUcmFuc2llbnQKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVHJhbnNpZW50SW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9UUkFOU0lFTlRfSU1QTDsKLQl9Ci0KLX0gLy8gVHJhbnNpZW50CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaXF1ZUNvbnN0cmFpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVW5pcXVlQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTNiMjZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFVuaXF1ZSBDb25zdHJhaW50PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludCNnZXRDb2x1bW5OYW1lcyA8ZW0+Q29sdW1uIE5hbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxVbmlxdWVDb25zdHJhaW50KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxVbmlxdWVDb25zdHJhaW50IGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbiBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uIE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uIE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVW5pcXVlQ29uc3RyYWludF9Db2x1bW5OYW1lcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRDb2x1bW5OYW1lcygpOwotCi19IC8vIFhtbFVuaXF1ZUNvbnN0cmFpbnQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVW5pcXVlQ29uc3RyYWludEltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVW5pcXVlQ29uc3RyYWludEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlYTE4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaXF1ZUNvbnN0cmFpbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVW5pcXVlQ29uc3RyYWludEltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sVW5pcXVlQ29uc3RyYWludEltcGwgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxVbmlxdWVDb25zdHJhaW50Ci17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uTmFtZXMoKSA8ZW0+Q29sdW1uIE5hbWVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbHVtbk5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9VTklRVUVfQ09OU1RSQUlOVF9JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbiBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uIE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uIE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVW5pcXVlQ29uc3RyYWludF9Db2x1bW5OYW1lcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q29sdW1uTmFtZXMoKQotCXsKLQkJaWYgKGNvbHVtbk5hbWVzID09IG51bGwpCi0JCXsKLQkJCWNvbHVtbk5hbWVzID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9VTklRVUVfQ09OU1RSQUlOVF9JTVBMX19DT0xVTU5fTkFNRVMpOwotCQl9Ci0JCXJldHVybiBjb2x1bW5OYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfSU1QTF9fQ09MVU1OX05BTUVTOgotCQkJCXJldHVybiBnZXRDb2x1bW5OYW1lcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfSU1QTF9fQ09MVU1OX05BTUVTOgotCQkJCWdldENvbHVtbk5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb2x1bW5OYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9VTklRVUVfQ09OU1RSQUlOVF9JTVBMX19DT0xVTU5fTkFNRVM6Ci0JCQkJZ2V0Q29sdW1uTmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1VOSVFVRV9DT05TVFJBSU5UX0lNUExfX0NPTFVNTl9OQU1FUzoKLQkJCQlyZXR1cm4gY29sdW1uTmFtZXMgIT0gbnVsbCAmJiAhY29sdW1uTmFtZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb2x1bW5OYW1lczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29sdW1uTmFtZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gVW5pcXVlQ29uc3RyYWludApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxWZXJzaW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlNWVkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldFRlbXBvcmFsIDxlbT5UZW1wb3JhbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVmVyc2lvbiBleHRlbmRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIENvbHVtbk1hcHBpbmcKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI3NldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFZlcnNpb25fVGVtcG9yYWwoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldFRlbXBvcmFsIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgdmFsdWUpOwotCi19IC8vIFZlcnNpb24KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmVyc2lvbkltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmVyc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2Mzg4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFZlcnNpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxWZXJzaW9uSW1wbCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxWZXJzaW9uSW1wbCBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbFZlcnNpb24KLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW4oKSA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb2x1bW4gY29sdW1uOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVGVtcG9yYWxUeXBlIFRFTVBPUkFMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRlbXBvcmFsKCkgPGVtPlRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZW1wb3JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbCA9IFRFTVBPUkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFZlcnNpb25JbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1ZFUlNJT05fSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbHVtbihYbWxDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpCi0JewotCQlyZXR1cm4gY29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29sdW1uIG9sZENvbHVtbiA9IGNvbHVtbjsKLQkJY29sdW1uID0gbmV3Q29sdW1uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0lNUExfX0NPTFVNTiwgb2xkQ29sdW1uLCBuZXdDb2x1bW4pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uSW1wbCNnZXRDb2x1bW4gPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbikKLQl7Ci0JCWlmIChuZXdDb2x1bW4gIT0gY29sdW1uKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb2x1bW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29sdW1uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbHVtbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb2x1bW4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0lNUExfX0NPTFVNTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb2x1bW4obmV3Q29sdW1uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTF9fQ09MVU1OLCBuZXdDb2x1bW4sIG5ld0NvbHVtbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbl9UZW1wb3JhbCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKQotCXsKLQkJcmV0dXJuIHRlbXBvcmFsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uSW1wbCNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKLQkgKiBAc2VlICNnZXRUZW1wb3JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkKLQl7Ci0JCVRlbXBvcmFsVHlwZSBvbGRUZW1wb3JhbCA9IHRlbXBvcmFsOwotCQl0ZW1wb3JhbCA9IG5ld1RlbXBvcmFsID09IG51bGwgPyBURU1QT1JBTF9FREVGQVVMVCA6IG5ld1RlbXBvcmFsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0lNUExfX1RFTVBPUkFMLCBvbGRUZW1wb3JhbCwgdGVtcG9yYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19DT0xVTU46Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q29sdW1uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19DT0xVTU46Ci0JCQkJcmV0dXJuIGdldENvbHVtbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0lNUExfX1RFTVBPUkFMOgotCQkJCXJldHVybiBnZXRUZW1wb3JhbCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19DT0xVTU46Ci0JCQkJc2V0Q29sdW1uKChYbWxDb2x1bW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19URU1QT1JBTDoKLQkJCQlzZXRUZW1wb3JhbCgoVGVtcG9yYWxUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTF9fQ09MVU1OOgotCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19URU1QT1JBTDoKLQkJCQlzZXRUZW1wb3JhbChURU1QT1JBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19DT0xVTU46Ci0JCQkJcmV0dXJuIGNvbHVtbiAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0lNUExfX1RFTVBPUkFMOgotCQkJCXJldHVybiB0ZW1wb3JhbCAhPSBURU1QT1JBTF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQ29sdW1uTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19DT0xVTU46IHJldHVybiBPcm1QYWNrYWdlLkNPTFVNTl9NQVBQSU5HX19DT0xVTU47Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVmVyc2lvbi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19URU1QT1JBTDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RFTVBPUkFMOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQ29sdW1uTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5DT0xVTU5fTUFQUElOR19fQ09MVU1OOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19DT0xVTU47Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVmVyc2lvbi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0lNUExfX1RFTVBPUkFMOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGVtcG9yYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRlbXBvcmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIFZlcnNpb24KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTFlMTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFBcnRpZmFjdEVkaXQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgZXh0ZW5kcyBKcGFBcnRpZmFjdEVkaXQKLXsKLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiBAcmV0dXJuIGEgcGVyc2lzdGVuY2UgYXJ0aWZhY3QgZm9yIHByb2plY3QgYVByb2plY3QuCi0JICogT3BlbmVkIG9ubHkgZm9yIHJlYWQgYWNjZXNzIChubyB3cml0ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFydGlmYWN0RWRpdCA9IG5ldyBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdChhUHJvamVjdCwgdHJ1ZSk7Ci0JCX0gCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAvLyBzdXBwcmVzcyBpbGxlZ2FsIGFyZ3VtZW50IGV4Y2VwdGlvbgotICAgICAgICAgICAgSnB0Q29yZVBsdWdpbi5sb2coaWFlKTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkKLSAgICAvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiBAcmV0dXJuIGEgcGVyc2lzdGVuY2UgYXJ0aWZhY3QgZm9yIHRoZSBwcm9qZWN0IGFQcm9qZWN0LgotICAgICAqIE9wZW5lZCBmb3IgYm90aCB3cml0ZSBhbmQgcmVhZCBhY2Nlc3MKLSAgICAgKi8JCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShJUHJvamVjdCBhUHJvamVjdCkgewotCQlQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IFBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAvLyBzdXBwcmVzcyBpbGxlZ2FsIGFyZ3VtZW50IGV4Y2VwdGlvbgotICAgICAgICAgICAgSnB0Q29yZVBsdWdpbi5sb2coaWFlKTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkKLSAgICAKLQlwdWJsaWMgUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSAKLQkJCXRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlcihhUHJvamVjdCwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUZpbGUgZmlsZSkgewotCQkvLyBUaGlzICpzZWVtcyogdG8gZG8gdGhlIHNhbWUgYmFzaWMgdGhpbmcgYXMgYmVsb3csIGJ1dCBjaXJjdW12ZW50cyB0aGUKLQkJLy8gVVJJIG11bmdpbmcgdGhhdCBBcnRpZmFjdEVkaXRNb2RlbCBkb2VzIChzZWUgYnVnIDIwOTA5MykKLQkJdHJ5IHsKLQkJCVBlcnNpc3RlbmNlUmVzb3VyY2UgcmVzb3VyY2UgPSAKLQkJCQkJKFBlcnNpc3RlbmNlUmVzb3VyY2UpIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKTsKLQkJCWlmICghIHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQlyZXNvdXJjZS5sb2FkKGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRMb2FkT3B0aW9ucygpKTsKLQkJCX0KLQkJCXJldHVybiByZXNvdXJjZTsKLQkJfQotCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJSnB0Q29yZVBsdWdpbi5sb2coaW9lKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVJlc291cmNlIGdldFJlc291cmNlKFN0cmluZyBmaWxlVVJJKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFBlcnNpc3RlbmNlUmVzb3VyY2UpIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShmaWxlVVJJKSk7Ci0JCX0KLQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHBlcnNpc3RlbmNlIHJlc291cmNlIGZvciB0aGUgZGVmYXVsdCBkZXBsb3kgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKEpwdENvcmVQbHVnaW4uZ2V0UGVyc2lzdGVuY2VYbWxEZXBsb3ltZW50VVJJKGdldFByb2plY3QoKSkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBwZXJzaXN0ZW5jZSByZXNvdXJjZSB3aXRoIGJhc2UgZGVmYXVsdHMKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VSZXNvdXJjZSBjcmVhdGVEZWZhdWx0UmVzb3VyY2UoKSB7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlYbWxQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2UoKTsKLQkJcGVyc2lzdGVuY2Uuc2V0VmVyc2lvbigiMS4wIik7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCBwVW5pdCA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBVbml0LnNldE5hbWUoZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCXBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5hZGQocFVuaXQpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChwZXJzaXN0ZW5jZSk7Ci0JCXNhdmUobnVsbCk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYmVkYWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5SW1wbAotewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZUZhY3RvcnkgZUlOU1RBTkNFID0gaW5pdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VGYWN0b3J5IGluaXQoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCVBlcnNpc3RlbmNlRmFjdG9yeSB0aGVQZXJzaXN0ZW5jZUZhY3RvcnkgPSAoUGVyc2lzdGVuY2VGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqcHQucGVyc2lzdGVuY2UueG1pIik7IAotCQkJaWYgKHRoZVBlcnNpc3RlbmNlRmFjdG9yeSAhPSBudWxsKQotCQkJewotCQkJCXJldHVybiB0aGVQZXJzaXN0ZW5jZUZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCi0JCXsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VGYWN0b3J5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0JewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUGVyc2lzdGVuY2UoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfTUFQUElOR19GSUxFX1JFRjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfSkFWQV9DTEFTU19SRUY6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUSUVTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUHJvcGVydGllcygpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BST1BFUlRZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUHJvcGVydHkoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfVFJBTlNBQ1RJT05fVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGNyZWF0ZVhtbFZlcnNpb25Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfVFJBTlNBQ1RJT05fVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGNvbnZlcnRYbWxWZXJzaW9uVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZSBjcmVhdGVYbWxQZXJzaXN0ZW5jZSgpCi0JewotCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IG5ldyBYbWxQZXJzaXN0ZW5jZSgpOwotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdCBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCXsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IG5ldyBYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sTWFwcGluZ0ZpbGVSZWYgY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKQotCXsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBuZXcgWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJcmV0dXJuIHhtbE1hcHBpbmdGaWxlUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKYXZhQ2xhc3NSZWYgY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCkKLQl7Ci0JCVhtbEphdmFDbGFzc1JlZiB4bWxKYXZhQ2xhc3NSZWYgPSBuZXcgWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXJldHVybiB4bWxKYXZhQ2xhc3NSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFByb3BlcnRpZXMgY3JlYXRlWG1sUHJvcGVydGllcygpCi0JewotCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBuZXcgWG1sUHJvcGVydGllcygpOwotCQlyZXR1cm4geG1sUHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUHJvcGVydHkgY3JlYXRlWG1sUHJvcGVydHkoKQotCXsKLQkJWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgPSBuZXcgWG1sUHJvcGVydHkoKTsKLQkJcmV0dXJuIHhtbFByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHJlc3VsdCA9IFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0WG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRvciBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlyZXR1cm4gKEVudW1lcmF0b3Ipc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0WG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVYbWxWZXJzaW9uRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0WG1sVmVyc2lvblRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVBhY2thZ2UgZ2V0UGVyc2lzdGVuY2VQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiAoUGVyc2lzdGVuY2VQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VQYWNrYWdlIGdldFBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vUGVyc2lzdGVuY2VGYWN0b3J5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjIzMzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsCi17Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTkFNRSA9ICJwZXJzaXN0ZW5jZSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0LnBlcnNpc3RlbmNlLnhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UgPGVtPlhtbCBQZXJzaXN0ZW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0UgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9fUEVSU0lTVEVOQ0VfVU5JVFMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9fVkVSU0lPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBlcnNpc3RlbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fREVTQ1JJUFRJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3ZpZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkp0YSBEYXRhIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pUQV9EQVRBX1NPVVJDRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX05PTl9KVEFfREFUQV9TT1VSQ0UgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBpbmcgRmlsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphciBGaWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzc2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19DTEFTU0VTID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIFVubGlzdGVkIENsYXNzZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19FWENMVURFX1VOTElTVEVEX0NMQVNTRVMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9QRVJUSUVTID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTkFNRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1RSQU5TQUNUSU9OX1RZUEUgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0ZFQVRVUkVfQ09VTlQgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYgPGVtPlhtbCBNYXBwaW5nIEZpbGUgUmVmPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxNYXBwaW5nRmlsZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQSU5HX0ZJTEVfUkVGID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQSU5HX0ZJTEVfUkVGX19GSUxFX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYXBwaW5nIEZpbGUgUmVmPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBJTkdfRklMRV9SRUZfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZiA8ZW0+WG1sIEphdmEgQ2xhc3MgUmVmPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sSmF2YUNsYXNzUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pBVkFfQ0xBU1NfUkVGID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KYXZhIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSkFWQV9DTEFTU19SRUZfX0pBVkFfQ0xBU1MgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBKYXZhIENsYXNzIFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KQVZBX0NMQVNTX1JFRl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydGllcyA8ZW0+WG1sIFByb3BlcnRpZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0aWVzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUSUVTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUSUVTX19QUk9QRVJUSUVTID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUHJvcGVydGllczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUSUVTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eSA8ZW0+WG1sIFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByb3BlcnR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEUgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBUcmFuc2FjdGlvbiBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfVFJBTlNBQ1RJT05fVFlQRV9PQkpFQ1QgPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5YbWwgVmVyc2lvbjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT04gPSA4OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hcHBpbmdGaWxlUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEphdmFDbGFzc1JlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQcm9wZXJ0aWVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFByb3BlcnR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0geG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgeG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHhtbFZlcnNpb25FRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVBhY2thZ2UoKQotCXsKLQkJc3VwZXIoZU5TX1VSSSwgUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlUGFja2FnZSBpbml0KCkKLQl7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChQZXJzaXN0ZW5jZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJUGVyc2lzdGVuY2VQYWNrYWdlIHRoZVBlcnNpc3RlbmNlUGFja2FnZSA9IChQZXJzaXN0ZW5jZVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgUGVyc2lzdGVuY2VQYWNrYWdlKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCU9ybVBhY2thZ2UgdGhlT3JtUGFja2FnZSA9IChPcm1QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgT3JtUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSkgOiBPcm1QYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlUGVyc2lzdGVuY2VQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlUGVyc2lzdGVuY2VQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVQZXJzaXN0ZW5jZVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVBlcnNpc3RlbmNlUGFja2FnZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlIDxlbT5YbWwgUGVyc2lzdGVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBlcnNpc3RlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQZXJzaXN0ZW5jZSgpCi0JewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UjZ2V0UGVyc2lzdGVuY2VVbml0cyA8ZW0+UGVyc2lzdGVuY2UgVW5pdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcnNpc3RlbmNlIFVuaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UjZ2V0UGVyc2lzdGVuY2VVbml0cygpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZV9QZXJzaXN0ZW5jZVVuaXRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQZXJzaXN0ZW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VfVmVyc2lvbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCXsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfRGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0UHJvdmlkZXIgPGVtPlByb3ZpZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvdmlkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0UHJvdmlkZXIoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9Qcm92aWRlcigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRKdGFEYXRhU291cmNlIDxlbT5KdGEgRGF0YSBTb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KdGEgRGF0YSBTb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0SnRhRGF0YVNvdXJjZSgpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0p0YURhdGFTb3VyY2UoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0Tm9uSnRhRGF0YVNvdXJjZSA8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X05vbkp0YURhdGFTb3VyY2UoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRNYXBwaW5nRmlsZXMgPGVtPk1hcHBpbmcgRmlsZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1hcHBpbmcgRmlsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0TWFwcGluZ0ZpbGVzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfTWFwcGluZ0ZpbGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0SmFyRmlsZXMgPGVtPkphciBGaWxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SmFyIEZpbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEphckZpbGVzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfSmFyRmlsZXMoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRDbGFzc2VzIDxlbT5DbGFzc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5DbGFzc2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldENsYXNzZXMoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9DbGFzc2VzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvcGVydGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfUHJvcGVydGllcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1RyYW5zYWN0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYgPGVtPlhtbCBNYXBwaW5nIEZpbGUgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYXBwaW5nIEZpbGUgUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYXBwaW5nRmlsZVJlZigpCi0JewotCQlyZXR1cm4geG1sTWFwcGluZ0ZpbGVSZWZFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmI2dldEZpbGVOYW1lIDxlbT5GaWxlIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWxlIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZiNnZXRGaWxlTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGluZ0ZpbGVSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYXBwaW5nRmlsZVJlZl9GaWxlTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTWFwcGluZ0ZpbGVSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZiA8ZW0+WG1sIEphdmEgQ2xhc3MgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBKYXZhIENsYXNzIFJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEphdmFDbGFzc1JlZigpCi0JewotCQlyZXR1cm4geG1sSmF2YUNsYXNzUmVmRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWYjZ2V0SmF2YUNsYXNzIDxlbT5KYXZhIENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmF2YSBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZiNnZXRKYXZhQ2xhc3MoKQotCSAqIEBzZWUgI2dldFhtbEphdmFDbGFzc1JlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEphdmFDbGFzc1JlZl9KYXZhQ2xhc3MoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEphdmFDbGFzc1JlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydGllcyA8ZW0+WG1sIFByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0aWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJvcGVydGllcygpCi0JewotCQlyZXR1cm4geG1sUHJvcGVydGllc0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0aWVzI2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0aWVzI2dldFByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2dldFhtbFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQcm9wZXJ0aWVzX1Byb3BlcnRpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFByb3BlcnRpZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5IDxlbT5YbWwgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQcm9wZXJ0eSgpCi0JewotCQlyZXR1cm4geG1sUHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHkjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQcm9wZXJ0eV9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRYbWxQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFByb3BlcnR5X1ZhbHVlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBUcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZUVFbnVtOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBUcmFuc2FjdGlvbiBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVHJhbnNhY3Rpb24gVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvciIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3QoKQotCXsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5YbWwgVmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+WG1sIFZlcnNpb248L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0WG1sVmVyc2lvbigpCi0JewotCQlyZXR1cm4geG1sVmVyc2lvbkVEYXRhVHlwZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZUZhY3RvcnkgZ2V0UGVyc2lzdGVuY2VGYWN0b3J5KCkKLQl7Ci0JCXJldHVybiAoUGVyc2lzdGVuY2VGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJeG1sUGVyc2lzdGVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BFUlNJU1RFTkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQZXJzaXN0ZW5jZUVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX19QRVJTSVNURU5DRV9VTklUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9fVkVSU0lPTik7Ci0KLQkJeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QRVJTSVNURU5DRV9VTklUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pUQV9EQVRBX1NPVVJDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTk9OX0pUQV9EQVRBX1NPVVJDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTUFQUElOR19GSUxFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX19DTEFTU0VTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX19FWENMVURFX1VOTElTVEVEX0NMQVNTRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1RSQU5TQUNUSU9OX1RZUEUpOwotCi0JCXhtbE1hcHBpbmdGaWxlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQVBQSU5HX0ZJTEVfUkVGKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNYXBwaW5nRmlsZVJlZkVDbGFzcywgWE1MX01BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRSk7Ci0KLQkJeG1sSmF2YUNsYXNzUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KQVZBX0NMQVNTX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sSmF2YUNsYXNzUmVmRUNsYXNzLCBYTUxfSkFWQV9DTEFTU19SRUZfX0pBVkFfQ0xBU1MpOwotCi0JCXhtbFByb3BlcnRpZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BST1BFUlRJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFByb3BlcnRpZXNFQ2xhc3MsIFhNTF9QUk9QRVJUSUVTX19QUk9QRVJUSUVTKTsKLQotCQl4bWxQcm9wZXJ0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByb3BlcnR5RUNsYXNzLCBYTUxfUFJPUEVSVFlfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByb3BlcnR5RUNsYXNzLCBYTUxfUFJPUEVSVFlfX1ZBTFVFKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJeG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRUVudW0gPSBjcmVhdGVFRW51bShYTUxfUEVSU0lTVEVOQ0VfVU5JVF9UUkFOU0FDVElPTl9UWVBFKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQl4bWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoWE1MX1BFUlNJU1RFTkNFX1VOSVRfVFJBTlNBQ1RJT05fVFlQRV9PQkpFQ1QpOwotCQl4bWxWZXJzaW9uRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFhNTF9WRVJTSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKLQkJRWNvcmVQYWNrYWdlIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZUVDbGFzcywgWG1sUGVyc2lzdGVuY2UuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUGVyc2lzdGVuY2VfUGVyc2lzdGVuY2VVbml0cygpLCB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0cyIsIG51bGwsIDAsIC0xLCBYbWxQZXJzaXN0ZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VfVmVyc2lvbigpLCB0aGlzLmdldFhtbFZlcnNpb24oKSwgInZlcnNpb24iLCBudWxsLCAxLCAxLCBYbWxQZXJzaXN0ZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIlhtbFBlcnNpc3RlbmNlVW5pdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfUHJvdmlkZXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm92aWRlciIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9KdGFEYXRhU291cmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAianRhRGF0YVNvdXJjZSIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9Ob25KdGFEYXRhU291cmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibm9uSnRhRGF0YVNvdXJjZSIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9NYXBwaW5nRmlsZXMoKSwgdGhpcy5nZXRYbWxNYXBwaW5nRmlsZVJlZigpLCBudWxsLCAibWFwcGluZ0ZpbGVzIiwgbnVsbCwgMCwgLTEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9KYXJGaWxlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImphckZpbGVzIiwgbnVsbCwgMCwgLTEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9DbGFzc2VzKCksIHRoaXMuZ2V0WG1sSmF2YUNsYXNzUmVmKCksIG51bGwsICJjbGFzc2VzIiwgbnVsbCwgMCwgLTEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9FeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9Qcm9wZXJ0aWVzKCksIHRoaXMuZ2V0WG1sUHJvcGVydGllcygpLCBudWxsLCAicHJvcGVydGllcyIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgWG1sUGVyc2lzdGVuY2VVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1RyYW5zYWN0aW9uVHlwZSgpLCB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSgpLCAidHJhbnNhY3Rpb25UeXBlIiwgIkpUQSIsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYXBwaW5nRmlsZVJlZkVDbGFzcywgWG1sTWFwcGluZ0ZpbGVSZWYuY2xhc3MsICJYbWxNYXBwaW5nRmlsZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFwcGluZ0ZpbGVSZWZfRmlsZU5hbWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZpbGVOYW1lIiwgIiIsIDAsIDEsIFhtbE1hcHBpbmdGaWxlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxKYXZhQ2xhc3NSZWZFQ2xhc3MsIFhtbEphdmFDbGFzc1JlZi5jbGFzcywgIlhtbEphdmFDbGFzc1JlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSmF2YUNsYXNzUmVmX0phdmFDbGFzcygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF2YUNsYXNzIiwgIiIsIDAsIDEsIFhtbEphdmFDbGFzc1JlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUHJvcGVydGllc0VDbGFzcywgWG1sUHJvcGVydGllcy5jbGFzcywgIlhtbFByb3BlcnRpZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFByb3BlcnRpZXNfUHJvcGVydGllcygpLCB0aGlzLmdldFhtbFByb3BlcnR5KCksIG51bGwsICJwcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIFhtbFByb3BlcnRpZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQcm9wZXJ0eUVDbGFzcywgWG1sUHJvcGVydHkuY2xhc3MsICJYbWxQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUHJvcGVydHlfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBYbWxQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFByb3BlcnR5X1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAxLCAxLCBYbWxQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZUVFbnVtLCBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZUVFbnVtLCBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZUVFbnVtLCBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUwpOwotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKHhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdEVEYXRhVHlwZSwgRW51bWVyYXRvci5jbGFzcywgIlhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFRGF0YVR5cGUoeG1sVmVyc2lvbkVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiWG1sVmVyc2lvbiIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKLQl7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UgPGVtPlhtbCBQZXJzaXN0ZW5jZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BFUlNJU1RFTkNFID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlX1BlcnNpc3RlbmNlVW5pdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZV9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QRVJTSVNURU5DRV9VTklUID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3ZpZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVIgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1Byb3ZpZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KdGEgRGF0YSBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX19KVEFfREFUQV9TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0p0YURhdGFTb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX19OT05fSlRBX0RBVEFfU09VUkNFID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9Ob25KdGFEYXRhU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwaW5nIEZpbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QRVJTSVNURU5DRV9VTklUX19NQVBQSU5HX0ZJTEVTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9NYXBwaW5nRmlsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphciBGaWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9KYXJGaWxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3NlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fQ0xBU1NFUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfQ2xhc3NlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9FeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX19UUkFOU0FDVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9UcmFuc2FjdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmIDxlbT5YbWwgTWFwcGluZyBGaWxlIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbE1hcHBpbmdGaWxlUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BUFBJTkdfRklMRV9SRUYgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwaW5nRmlsZVJlZl9GaWxlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmIDxlbT5YbWwgSmF2YSBDbGFzcyBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWYKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sSmF2YUNsYXNzUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0pBVkFfQ0xBU1NfUkVGID0gZUlOU1RBTkNFLmdldFhtbEphdmFDbGFzc1JlZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0pBVkFfQ0xBU1NfUkVGX19KQVZBX0NMQVNTID0gZUlOU1RBTkNFLmdldFhtbEphdmFDbGFzc1JlZl9KYXZhQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnRpZXMgPGVtPlhtbCBQcm9wZXJ0aWVzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydGllcwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQcm9wZXJ0aWVzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BST1BFUlRJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUFJPUEVSVElFU19fUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0aWVzX1Byb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5IDxlbT5YbWwgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQcm9wZXJ0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BST1BFUlRZX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUFJPUEVSVFlfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIFhNTF9QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBUcmFuc2FjdGlvbiBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRURhdGFUeXBlIFhNTF9QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+WG1sIFZlcnNpb248L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFZlcnNpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVEYXRhVHlwZSBYTUxfVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uKCk7Ci0KLQl9Ci0KLX0gLy9QZXJzaXN0ZW5jZVBhY2thZ2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVJlc291cmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg5ODczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLnRyYW5zbGF0b3JzLlBlcnNpc3RlbmNlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVJlc291cmNlIGV4dGVuZHMgSnBhWG1sUmVzb3VyY2UKLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VSZXNvdXJjZShSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIoYVJlbmRlcmVyKTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVuY2VSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIodXJpLCBhUmVuZGVyZXIpOwotCX0KLQkKLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlVHJhbnNsYXRvci5JTlNUQU5DRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gVE9ETwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tUmVzb3VyY2UoKSB7Ci0JCS8vIFRPRE8KLQl9Ci0JCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlIGdldFBlcnNpc3RlbmNlKCkgewotCQlyZXR1cm4gKFhtbFBlcnNpc3RlbmNlKSBnZXRSb290T2JqZWN0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiMzQ5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVJlc291cmNlRmFjdG9yeSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkKLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VSZXNvdXJjZUZhY3RvcnkoKSB7Ci0JCXRoaXMoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5LCBib29sZWFuIGxpc3RlbmluZ0ZvclVwZGF0ZXMpIHsKLQkJc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSwgbGlzdGVuaW5nRm9yVXBkYXRlcyk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShVUkksIFJlbmRlcmVyKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgcmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVJlc291cmNlKHVyaSwgcmVuZGVyZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmZTYyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhWG1sUmVzb3VyY2VNb2RlbDsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWwgZXh0ZW5kcyBKcGFYbWxSZXNvdXJjZU1vZGVsCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbChJRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKGZpbGUpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIFJlc291cmNlTW9kZWwjZ2V0UmVzb3VyY2VUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlTW9kZWwuUEVSU0lTVEVOQ0VfUkVTT1VSQ0VfVFlQRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0IGJ1aWxkQXJ0aWZhY3RFZGl0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbEphdmFDbGFzc1JlZi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbEphdmFDbGFzc1JlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzkyYzUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxKYXZhQ2xhc3NSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBDbGFzcyBSZWY8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZiNnZXRKYXZhQ2xhc3MgPGVtPkphdmEgQ2xhc3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxKYXZhQ2xhc3NSZWYoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sSmF2YUNsYXNzUmVmIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhQ2xhc3MoKSA8ZW0+SmF2YSBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0NMQVNTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhQ2xhc3MoKSA8ZW0+SmF2YSBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGphdmFDbGFzcyA9IEpBVkFfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSmF2YUNsYXNzUmVmKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlUGFja2FnZS5MaXRlcmFscy5YTUxfSkFWQV9DTEFTU19SRUY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmF2YSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkphdmEgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SmF2YUNsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxKYXZhQ2xhc3NSZWZfSmF2YUNsYXNzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiB1bmlxdWU9ImZhbHNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQ2xhc3MoKQotCXsKLQkJcmV0dXJuIGphdmFDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWYjZ2V0SmF2YUNsYXNzIDxlbT5KYXZhIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRKYXZhQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoU3RyaW5nIG5ld0phdmFDbGFzcykKLQl7Ci0JCVN0cmluZyBvbGRKYXZhQ2xhc3MgPSBqYXZhQ2xhc3M7Ci0JCWphdmFDbGFzcyA9IG5ld0phdmFDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9KQVZBX0NMQVNTX1JFRl9fSkFWQV9DTEFTUywgb2xkSmF2YUNsYXNzLCBqYXZhQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9KQVZBX0NMQVNTX1JFRl9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX0pBVkFfQ0xBU1NfUkVGX19KQVZBX0NMQVNTOgotCQkJCXNldEphdmFDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfSkFWQV9DTEFTU19SRUZfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKEpBVkFfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfSkFWQV9DTEFTU19SRUZfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIEpBVkFfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGphdmFDbGFzcyAhPSBudWxsIDogIUpBVkFfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGphdmFDbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGphdmFDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamF2YUNsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIFhtbEphdmFDbGFzc1JlZgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbE1hcHBpbmdGaWxlUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sTWFwcGluZ0ZpbGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU3YjliNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sTWFwcGluZ0ZpbGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFwcGluZyBGaWxlIFJlZjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYjZ2V0RmlsZU5hbWUgPGVtPkZpbGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbE1hcHBpbmdGaWxlUmVmKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE1hcHBpbmdGaWxlUmVmIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWxlTmFtZSgpIDxlbT5GaWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX05BTUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbGVOYW1lKCkgPGVtPkZpbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmlsZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmlsZU5hbWUgPSBGSUxFX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTWFwcGluZ0ZpbGVSZWYoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gUGVyc2lzdGVuY2VQYWNrYWdlLkxpdGVyYWxzLlhNTF9NQVBQSU5HX0ZJTEVfUkVGOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZpbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWxlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbGVOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxNYXBwaW5nRmlsZVJlZl9GaWxlTmFtZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgdW5pcXVlPSJmYWxzZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKQotCXsKLQkJcmV0dXJuIGZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmI2dldEZpbGVOYW1lIDxlbT5GaWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmlsZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgbmV3RmlsZU5hbWUpCi0JewotCQlTdHJpbmcgb2xkRmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJZmlsZU5hbWUgPSBuZXdGaWxlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9NQVBQSU5HX0ZJTEVfUkVGX19GSUxFX05BTUUsIG9sZEZpbGVOYW1lLCBmaWxlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX01BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RmlsZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfTUFQUElOR19GSUxFX1JFRl9fRklMRV9OQU1FOgotCQkJCXNldEZpbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9NQVBQSU5HX0ZJTEVfUkVGX19GSUxFX05BTUU6Ci0JCQkJc2V0RmlsZU5hbWUoRklMRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX01BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRToKLQkJCQlyZXR1cm4gRklMRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBmaWxlTmFtZSAhPSBudWxsIDogIUZJTEVfTkFNRV9FREVGQVVMVC5lcXVhbHMoZmlsZU5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaWxlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmlsZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gWG1sTWFwcGluZ0ZpbGVSZWYKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQZXJzaXN0ZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYzc4NDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sUGVyc2lzdGVuY2U8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlI2dldFBlcnNpc3RlbmNlVW5pdHMgPGVtPlBlcnNpc3RlbmNlIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2UoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVuY2UgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0cygpIDxlbT5QZXJzaXN0ZW5jZSBVbml0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2UoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gUGVyc2lzdGVuY2VQYWNrYWdlLkxpdGVyYWxzLlhNTF9QRVJTSVNURU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlX1ZlcnNpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sVmVyc2lvbiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpCi0JewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikKLQl7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YbWxQZXJzaXN0ZW5jZSBVbml0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlX1BlcnNpc3RlbmNlVW5pdHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFBlcnNpc3RlbmNlVW5pdD4gZ2V0UGVyc2lzdGVuY2VVbml0cygpCi0JewotCQlpZiAocGVyc2lzdGVuY2VVbml0cyA9PSBudWxsKQotCQl7Ci0JCQlwZXJzaXN0ZW5jZVVuaXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFBlcnNpc3RlbmNlVW5pdD4oWG1sUGVyc2lzdGVuY2VVbml0LmNsYXNzLCB0aGlzLCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX19QRVJTSVNURU5DRV9VTklUUyk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGVyc2lzdGVuY2VVbml0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX19QRVJTSVNURU5DRV9VTklUUzoKLQkJCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0cygpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX19QRVJTSVNURU5DRV9VTklUUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQZXJzaXN0ZW5jZVVuaXQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTOgotCQkJCWdldFBlcnNpc3RlbmNlVW5pdHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTOgotCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRzICE9IG51bGwgJiYgIXBlcnNpc3RlbmNlVW5pdHMuaXNFbXB0eSgpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhRU9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlVW5pdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzFhODBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQZXJzaXN0ZW5jZVVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Vbml0PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0UHJvdmlkZXIgPGVtPlByb3ZpZGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0SnRhRGF0YVNvdXJjZSA8ZW0+SnRhIERhdGEgU291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0Tm9uSnRhRGF0YVNvdXJjZSA8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE1hcHBpbmdGaWxlcyA8ZW0+TWFwcGluZyBGaWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEphckZpbGVzIDxlbT5KYXIgRmlsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRDbGFzc2VzIDxlbT5DbGFzc2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcyA8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVuY2VVbml0IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3ZpZGVyKCkgPGVtPlByb3ZpZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm92aWRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvdmlkZXIoKSA8ZW0+UHJvdmlkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3ZpZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3ZpZGVyID0gUFJPVklERVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SnRhRGF0YVNvdXJjZSgpIDxlbT5KdGEgRGF0YSBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEp0YURhdGFTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpUQV9EQVRBX1NPVVJDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKdGFEYXRhU291cmNlKCkgPGVtPkp0YSBEYXRhIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SnRhRGF0YVNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBqdGFEYXRhU291cmNlID0gSlRBX0RBVEFfU09VUkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vbkp0YURhdGFTb3VyY2UoKSA8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX0pUQV9EQVRBX1NPVVJDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb25KdGFEYXRhU291cmNlKCkgPGVtPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vbkp0YURhdGFTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm9uSnRhRGF0YVNvdXJjZSA9IE5PTl9KVEFfREFUQV9TT1VSQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwaW5nRmlsZXMoKSA8ZW0+TWFwcGluZyBGaWxlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwaW5nRmlsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxNYXBwaW5nRmlsZVJlZj4gbWFwcGluZ0ZpbGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmFyRmlsZXMoKSA8ZW0+SmFyIEZpbGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphckZpbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBqYXJGaWxlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzZXMoKSA8ZW0+Q2xhc3NlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sSmF2YUNsYXNzUmVmPiBjbGFzc2VzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSA8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSA8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBleGNsdWRlVW5saXN0ZWRDbGFzc2VzID0gRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUHJvcGVydGllcyBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2FjdGlvblR5cGUoKSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHRyYW5zYWN0aW9uVHlwZSA9IFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlUGFja2FnZS5MaXRlcmFscy5YTUxfUEVSU0lTVEVOQ0VfVU5JVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdF9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJKVEEiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZQotCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uVHlwZShYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1RyYW5zYWN0aW9uVHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IkpUQSIgdW5pcXVlPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZQotCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uVHlwZShYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgbmV3VHJhbnNhY3Rpb25UeXBlKQotCXsKLQkJWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJdHJhbnNhY3Rpb25UeXBlID0gbmV3VHJhbnNhY3Rpb25UeXBlID09IG51bGwgPyBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1RSQU5TQUNUSU9OX1RZUEUsIG9sZFRyYW5zYWN0aW9uVHlwZSwgdHJhbnNhY3Rpb25UeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKLQl7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm92aWRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvdmlkZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdmlkZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb3ZpZGVyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfUHJvdmlkZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm92aWRlcigpCi0JewotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldFByb3ZpZGVyIDxlbT5Qcm92aWRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdmlkZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb3ZpZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvdmlkZXIoU3RyaW5nIG5ld1Byb3ZpZGVyKQotCXsKLQkJU3RyaW5nIG9sZFByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JCXByb3ZpZGVyID0gbmV3UHJvdmlkZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVIsIG9sZFByb3ZpZGVyLCBwcm92aWRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkp0YSBEYXRhIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SnRhIERhdGEgU291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkp0YSBEYXRhIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SnRhRGF0YVNvdXJjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0p0YURhdGFTb3VyY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKdGFEYXRhU291cmNlKCkKLQl7Ci0JCXJldHVybiBqdGFEYXRhU291cmNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRKdGFEYXRhU291cmNlIDxlbT5KdGEgRGF0YSBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkp0YSBEYXRhIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SnRhRGF0YVNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEp0YURhdGFTb3VyY2UoU3RyaW5nIG5ld0p0YURhdGFTb3VyY2UpCi0JewotCQlTdHJpbmcgb2xkSnRhRGF0YVNvdXJjZSA9IGp0YURhdGFTb3VyY2U7Ci0JCWp0YURhdGFTb3VyY2UgPSBuZXdKdGFEYXRhU291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pUQV9EQVRBX1NPVVJDRSwgb2xkSnRhRGF0YVNvdXJjZSwganRhRGF0YVNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9uSnRhRGF0YVNvdXJjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0X05vbkp0YURhdGFTb3VyY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb25KdGFEYXRhU291cmNlKCkKLQl7Ci0JCXJldHVybiBub25KdGFEYXRhU291cmNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXROb25KdGFEYXRhU291cmNlIDxlbT5Ob24gSnRhIERhdGEgU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gSnRhIERhdGEgU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb25KdGFEYXRhU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9uSnRhRGF0YVNvdXJjZShTdHJpbmcgbmV3Tm9uSnRhRGF0YVNvdXJjZSkKLQl7Ci0JCVN0cmluZyBvbGROb25KdGFEYXRhU291cmNlID0gbm9uSnRhRGF0YVNvdXJjZTsKLQkJbm9uSnRhRGF0YVNvdXJjZSA9IG5ld05vbkp0YURhdGFTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTk9OX0pUQV9EQVRBX1NPVVJDRSwgb2xkTm9uSnRhRGF0YVNvdXJjZSwgbm9uSnRhRGF0YVNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBpbmcgRmlsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXBwaW5nIEZpbGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGluZyBGaWxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfTWFwcGluZ0ZpbGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxNYXBwaW5nRmlsZVJlZj4gZ2V0TWFwcGluZ0ZpbGVzKCkKLQl7Ci0JCWlmIChtYXBwaW5nRmlsZXMgPT0gbnVsbCkKLQkJewotCQkJbWFwcGluZ0ZpbGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE1hcHBpbmdGaWxlUmVmPihYbWxNYXBwaW5nRmlsZVJlZi5jbGFzcywgdGhpcywgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19NQVBQSU5HX0ZJTEVTKTsKLQkJfQotCQlyZXR1cm4gbWFwcGluZ0ZpbGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkphciBGaWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SmFyIEZpbGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmFyIEZpbGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdF9KYXJGaWxlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRKYXJGaWxlcygpCi0JewotCQlpZiAoamFyRmlsZXMgPT0gbnVsbCkKLQkJewotCQkJamFyRmlsZXMgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTKTsKLQkJfQotCQlyZXR1cm4gamFyRmlsZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3NlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzc2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3NlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfQ2xhc3NlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSmF2YUNsYXNzUmVmPiBnZXRDbGFzc2VzKCkKLQl7Ci0JCWlmIChjbGFzc2VzID09IG51bGwpCi0JCXsKLQkJCWNsYXNzZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSmF2YUNsYXNzUmVmPihYbWxKYXZhQ2xhc3NSZWYuY2xhc3MsIHRoaXMsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fQ0xBU1NFUyk7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGNsdWRlIFVubGlzdGVkIENsYXNzZXM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKQotCXsKLQkJcmV0dXJuIGV4Y2x1ZGVVbmxpc3RlZENsYXNzZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuIG5ld0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMpCi0JewotCQlCb29sZWFuIG9sZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPSBleGNsdWRlVW5saXN0ZWRDbGFzc2VzOwotCQlleGNsdWRlVW5saXN0ZWRDbGFzc2VzID0gbmV3RXhjbHVkZVVubGlzdGVkQ2xhc3NlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19FWENMVURFX1VOTElTVEVEX0NMQVNTRVMsIG9sZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMsIGV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YbWxQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByb3BlcnRpZXMoWG1sUHJvcGVydGllcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByb3BlcnRpZXMoWG1sUHJvcGVydGllcyBuZXdQcm9wZXJ0aWVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUHJvcGVydGllcyBvbGRQcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLQkJcHJvcGVydGllcyA9IG5ld1Byb3BlcnRpZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUywgb2xkUHJvcGVydGllcywgbmV3UHJvcGVydGllcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKFhtbFByb3BlcnRpZXMgbmV3UHJvcGVydGllcykKLQl7Ci0JCWlmIChuZXdQcm9wZXJ0aWVzICE9IHByb3BlcnRpZXMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJvcGVydGllcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJvcGVydGllcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQcm9wZXJ0aWVzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9QRVJUSUVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByb3BlcnRpZXMobmV3UHJvcGVydGllcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVMsIG5ld1Byb3BlcnRpZXMsIG5ld1Byb3BlcnRpZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19NQVBQSU5HX0ZJTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWFwcGluZ0ZpbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19DTEFTU0VTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q2xhc3NlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcm9wZXJ0aWVzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9WSURFUjoKLQkJCQlyZXR1cm4gZ2V0UHJvdmlkZXIoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19KVEFfREFUQV9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldEp0YURhdGFTb3VyY2UoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19OT05fSlRBX0RBVEFfU09VUkNFOgotCQkJCXJldHVybiBnZXROb25KdGFEYXRhU291cmNlKCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTUFQUElOR19GSUxFUzoKLQkJCQlyZXR1cm4gZ2V0TWFwcGluZ0ZpbGVzKCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTOgotCQkJCXJldHVybiBnZXRKYXJGaWxlcygpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGdldENsYXNzZXMoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19FWENMVURFX1VOTElTVEVEX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVI6Ci0JCQkJc2V0UHJvdmlkZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pUQV9EQVRBX1NPVVJDRToKLQkJCQlzZXRKdGFEYXRhU291cmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19OT05fSlRBX0RBVEFfU09VUkNFOgotCQkJCXNldE5vbkp0YURhdGFTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVM6Ci0JCQkJZ2V0TWFwcGluZ0ZpbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRNYXBwaW5nRmlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE1hcHBpbmdGaWxlUmVmPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pBUl9GSUxFUzoKLQkJCQlnZXRKYXJGaWxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SmFyRmlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19DTEFTU0VTOgotCQkJCWdldENsYXNzZXMoKS5jbGVhcigpOwotCQkJCWdldENsYXNzZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEphdmFDbGFzc1JlZj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19FWENMVURFX1VOTElTVEVEX0NMQVNTRVM6Ci0JCQkJc2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVM6Ci0JCQkJc2V0UHJvcGVydGllcygoWG1sUHJvcGVydGllcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlzZXRUcmFuc2FjdGlvblR5cGUoKFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVI6Ci0JCQkJc2V0UHJvdmlkZXIoUFJPVklERVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19KVEFfREFUQV9TT1VSQ0U6Ci0JCQkJc2V0SnRhRGF0YVNvdXJjZShKVEFfREFUQV9TT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19OT05fSlRBX0RBVEFfU09VUkNFOgotCQkJCXNldE5vbkp0YURhdGFTb3VyY2UoTk9OX0pUQV9EQVRBX1NPVVJDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVM6Ci0JCQkJZ2V0TWFwcGluZ0ZpbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTOgotCQkJCWdldEphckZpbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fQ0xBU1NFUzoKLQkJCQlnZXRDbGFzc2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTOgotCQkJCXNldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUzoKLQkJCQlzZXRQcm9wZXJ0aWVzKChYbWxQcm9wZXJ0aWVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJc2V0VHJhbnNhY3Rpb25UeXBlKFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVI6Ci0JCQkJcmV0dXJuIFBST1ZJREVSX0VERUZBVUxUID09IG51bGwgPyBwcm92aWRlciAhPSBudWxsIDogIVBST1ZJREVSX0VERUZBVUxULmVxdWFscyhwcm92aWRlcik7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSlRBX0RBVEFfU09VUkNFOgotCQkJCXJldHVybiBKVEFfREFUQV9TT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGp0YURhdGFTb3VyY2UgIT0gbnVsbCA6ICFKVEFfREFUQV9TT1VSQ0VfRURFRkFVTFQuZXF1YWxzKGp0YURhdGFTb3VyY2UpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX05PTl9KVEFfREFUQV9TT1VSQ0U6Ci0JCQkJcmV0dXJuIE5PTl9KVEFfREFUQV9TT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IG5vbkp0YURhdGFTb3VyY2UgIT0gbnVsbCA6ICFOT05fSlRBX0RBVEFfU09VUkNFX0VERUZBVUxULmVxdWFscyhub25KdGFEYXRhU291cmNlKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19NQVBQSU5HX0ZJTEVTOgotCQkJCXJldHVybiBtYXBwaW5nRmlsZXMgIT0gbnVsbCAmJiAhbWFwcGluZ0ZpbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19KQVJfRklMRVM6Ci0JCQkJcmV0dXJuIGphckZpbGVzICE9IG51bGwgJiYgIWphckZpbGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19DTEFTU0VTOgotCQkJCXJldHVybiBjbGFzc2VzICE9IG51bGwgJiYgIWNsYXNzZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTX0VERUZBVUxUID09IG51bGwgPyBleGNsdWRlVW5saXN0ZWRDbGFzc2VzICE9IG51bGwgOiAhRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTX0VERUZBVUxULmVxdWFscyhleGNsdWRlVW5saXN0ZWRDbGFzc2VzKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGw7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIHRyYW5zYWN0aW9uVHlwZSAhPSBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb3ZpZGVyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm92aWRlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwganRhRGF0YVNvdXJjZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoanRhRGF0YVNvdXJjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm9uSnRhRGF0YVNvdXJjZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm9uSnRhRGF0YVNvdXJjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgamFyRmlsZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGphckZpbGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGNsdWRlVW5saXN0ZWRDbGFzc2VzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGNsdWRlVW5saXN0ZWRDbGFzc2VzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0cmFuc2FjdGlvblR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRyYW5zYWN0aW9uVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBYbWxQZXJzaXN0ZW5jZVVuaXQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlYmI4MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Vbml0IFRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5KVEE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSlRBX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JSlRBKDAsICJKVEEiLCAiSlRBIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVNPVVJDRSBMT0NBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVNPVVJDRV9MT0NBTF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVJFU09VUkNFX0xPQ0FMKDEsICJSRVNPVVJDRV9MT0NBTCIsICJSRVNPVVJDRV9MT0NBTCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SlRBPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KVEE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSlRBCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSlRBX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFU09VUkNFIExPQ0FMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SRVNPVVJDRSBMT0NBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVNPVVJDRV9MT0NBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX0xPQ0FMX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgUGVyc2lzdGVuY2UgVW5pdCBUcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlW10KLQkJewotCQkJSlRBLAotCQkJUkVTT1VSQ0VfTE9DQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgUGVyc2lzdGVuY2UgVW5pdCBUcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBKVEFfVkFMVUU6IHJldHVybiBKVEE7Ci0JCQljYXNlIFJFU09VUkNFX0xPQ0FMX1ZBTFVFOiByZXR1cm4gUkVTT1VSQ0VfTE9DQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5MDY5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sUHJvcGVydGllczwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydGllcyNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUHJvcGVydGllcygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQcm9wZXJ0aWVzIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUHJvcGVydGllcygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BST1BFUlRJRVM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhtbFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFByb3BlcnRpZXNfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVElFU19fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVElFU19fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUSUVTX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BST1BFUlRJRVNfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVElFU19fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BST1BFUlRJRVNfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvLyBYbWxQcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sUHJvcGVydHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWVhM2Y0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWxQcm9wZXJ0eTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUHJvcGVydHkoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUHJvcGVydHkgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQcm9wZXJ0eSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlfTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFByb3BlcnR5X1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLQl7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkKLQl7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BST1BFUlRZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVFlfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BST1BFUlRZX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBYbWxQcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvQWJzdHJhY3RUZXh0UmFuZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L0Fic3RyYWN0VGV4dFJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGM1ZWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvQWJzdHJhY3RUZXh0UmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGV4dCByYW5nZS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGV4dFJhbmdlCi0JaW1wbGVtZW50cyBUZXh0UmFuZ2UKLXsKLQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzKGludCBpbmRleCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0T2Zmc2V0KCkgPD0gaW5kZXgpICYmIChpbmRleCA8IHRoaXMuZW5kKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRvdWNoZXMoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmluY2x1ZGVzKGluZGV4KSB8fCAoaW5kZXggPT0gdGhpcy5lbmQoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGVuZCBvZmZzZXQgaXMgImV4Y2x1c2l2ZSIsIGkuZS4gdGhlIGVsZW1lbnQgYXQgdGhlIGVuZCBvZmZzZXQKLQkgKiBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHJhbmdlLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZW5kKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPZmZzZXQoKSArIHRoaXMuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIFRleHRSYW5nZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlUZXh0UmFuZ2UgciA9IChUZXh0UmFuZ2UpIG87Ci0JCXJldHVybiAoci5nZXRPZmZzZXQoKSA9PSB0aGlzLmdldE9mZnNldCgpKQotCQkJCSYmIChyLmdldExlbmd0aCgpID09IHRoaXMuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE9mZnNldCgpIF4gdGhpcy5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgc3RhcnQgPSBTdHJpbmcudmFsdWVPZih0aGlzLmdldE9mZnNldCgpKTsKLQkJU3RyaW5nIGVuZCA9IFN0cmluZy52YWx1ZU9mKHRoaXMuZW5kKCkpOwotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBzdGFydCArICIsICIgKyBlbmQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvVGV4dFJhbmdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9UZXh0UmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2NTA1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9UZXh0UmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHk7Ci0KLS8qKgotICogQSB0ZXh0IHJhbmdlIGRlZmluZXMgdGhlIG9mZnNldCBpbnRvLCBsZW5ndGggb2YsIGFuZCBsaW5lIG9mIGEgcGllY2UKLSAqIG9mIHRleHQuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUZXh0UmFuZ2UgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSB0ZXh0LgotCSAqCi0JICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSB0ZXh0Ci0JICovCi0JaW50IGdldE9mZnNldCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0LgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByYW5nZSBpbmNsdWRlcyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JYm9vbGVhbiBpbmNsdWRlcyhpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHJhbmdlIHRvdWNoZXMgYW4gaW5zZXJ0aW9uIGN1cnNvciBhdCB0aGUKLQkgKiBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JYm9vbGVhbiB0b3VjaGVzKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSB0ZXh0LgotCSAqLwotCWludCBnZXRMaW5lTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2Zmc2V0cyBhbmQgbGVuZ3RocyBhcmUgdGhlIHNhbWUuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBoYXNoIGNvZGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgI2VxdWFscygpIGNvbnRyYWN0LgotCSAqLwotCWludCBoYXNoQ29kZSgpOwotCi0KLQkvKioKLQkgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiB0ZXh0IHJhbmdlLgotCSAqLwotCWZpbmFsIGNsYXNzIEVtcHR5IGltcGxlbWVudHMgVGV4dFJhbmdlIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBUZXh0UmFuZ2UgSU5TVEFOQ0UgPSBuZXcgRW1wdHkoKTsKLQkJcHVibGljIHN0YXRpYyBUZXh0UmFuZ2UgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEVtcHR5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZXMoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gdG91Y2hlcyhpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBpbmRleCA9PSAwOyAgLy8gPz8/Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gPT0gdGhpcykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKCAhIChvIGluc3RhbmNlb2YgVGV4dFJhbmdlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCVRleHRSYW5nZSByID0gKFRleHRSYW5nZSkgbzsKLQkJCXJldHVybiAoci5nZXRPZmZzZXQoKSA9PSAwKQotCQkJCQkmJiAoci5nZXRMZW5ndGgoKSA9PSAwKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXh0UmFuZ2UuRW1wdHkiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDkyMGMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci0KLS8qKgotICogQWRhcHQgYSBKYXZhIGFubm90YXRpb24gd2l0aCBhIHNpbXBsZS10by11c2UgaW50ZXJmYWNlLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbkFkYXB0ZXIgewotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBjb21waWxhdGlvbiB1bml0LCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZQotCSAqIGFkYXB0ZXIncyBhbm5vdGF0aW9uLgotCSAqIEBzZWUgI2dldEFubm90YXRpb24oKQotCSAqLwotCUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5ldyBtYXJrZXIgYW5ub3RhdGlvbiwgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGlmIHByZXNlbnQuCi0JICovCi0Jdm9pZCBuZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5ldyBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24sIHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBpZiBwcmVzZW50LgotCSAqLwotCXZvaWQgbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpOwotCi0JLyoqCi0JICogQnVpbGQgYSBuZXcgbm9ybWFsIGFubm90YXRpb24sIHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBpZiBwcmVzZW50LgotCSAqLwotCXZvaWQgbmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBBU1Qgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBhbm5vdGF0aW9uLgotCSAqIElmIHRoZSBhbm5vdGF0aW9uIGlzIG1pc3NpbmcsIHJldHVybiB0aGUgYW5ub3RhdGlvbidzIHBhcmVudCBub2RlLgotCSAqIEBzZWUgI2dldEFzdE5vZGUoKQotCSAqLwotCUFTVE5vZGUgZ2V0QXN0Tm9kZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4Yzk4YTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotLyoqCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiBSZXZpZXcgdGhlIHNwZWNpZmllZCBlZGl0cyBhbmQgZm9ybWF0IHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQgYXMgbmVlZGVkLgotCSAqLwotCXZvaWQgZm9ybWF0KElEb2N1bWVudCBkb2MsIFRleHRFZGl0IGVkaXRUcmVlKSB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1ZDU4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLQotLyoqCi0gKiBBZGFwdCBhIEphdmEgYW5ub3RhdGlvbiBlbGVtZW50IHdpdGggYSBzaW1wbGUtdG8tdXNlIGludGVyZmFjZS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBhZGFwdGVyJ3MgYW5ub3RhdGlvbiBlbGVtZW50LgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50LgotCSAqIElmIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIGF2YWlsYWJsZSwgI3ZhbHVlKENvbXBpbGF0aW9uVW5pdCkKLQkgKiBtaWdodCBiZSBtb3JlIHBlcmZvcm1hbnQuCi0JICogQHNlZSAjZ2V0VmFsdWUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdCkKLQkgKi8KLQlUIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGNvbXBpbGF0aW9uIHVuaXQsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0JICogYWRhcHRlcidzIGFubm90YXRpb24gZWxlbWVudC4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudC4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICovCi0JVCBnZXRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhZGFwdGVyJ3MgYW5ub3RhdGlvbiBlbGVtZW50LgotCSAqIFNldHRpbmcgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IHRvIG51bGwgd2lsbCBjYXVzZQotCSAqIHRoZSBlbGVtZW50IHRvIGJlIHJlbW92ZWQgZnJvbSBpdHMgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFQgdmFsdWUpOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBjb21waWxhdGlvbiB1bml0LCByZXR1cm4gdGhlIGV4cHJlc3Npb24gdmFsdWUgb2YgdGhlCi0JICogYWRhcHRlcidzIGFubm90YXRpb24gZWxlbWVudC4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudC4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKi8KLQlFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBBU1Qgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50LgotCSAqIElmIHRoZSBlbGVtZW50IGlzIG1pc3NpbmcsIHJldHVybiB0aGUgYW5ub3RhdGlvbidzIG5vZGUuCi0JICogQHNlZSAjZ2V0QXN0Tm9kZSgpCi0JICovCi0JQVNUTm9kZSBnZXRBc3ROb2RlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0F0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0F0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGU5MTdhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci0KLS8qKgotICogQXR0cmlidXRlcyBhcmUgZWl0aGVyIHJlcHJlc2VudGVkIGJ5IGZpZWxkcyAoJ2ZvbycpIG9yIHByb3BlcnRpZXMvbWV0aG9kCi0gKiBwYWlycyAoJ2dldEZvbygpJy8nc2V0Rm9vKCknKS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZSBleHRlbmRzIE1lbWJlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIG5hbWUsIGFzIG9wcG9zZWQgdG8gdGhlIG1lbWJlcidzIG5hbWUKLQkgKiAoZS5nLiAiZ2V0Rm9vKCkiIHJldHVybnMgImZvbyIpLgotCSAqLwotCS8vIFRPRE8gcmVuYW1lIHRvIGdldE5hbWUoKT8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIGJpbmRpbmcgZm9yIHRoZSBhdHRyaWJ1dGUncyBkZWNsYXJlZCB0eXBlLAotCSAqIGFzIG9wcG9zZWQgdG8gaXRzIGRlY2xhcmluZyB0eXBlLgotCSAqLwotCUlUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIGEgZmllbGQuCi0JICovCi0JYm9vbGVhbiBpc0ZpZWxkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIGEgcHJvcGVydHkvbWV0aG9kIHBhaXIuCi0JICovCi0JLy8gVE9ETyByZW5hbWUgdG8gaXNQcm9wZXJ0eSgpPwotCWJvb2xlYW4gaXNNZXRob2QoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MGQzODkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlIGNsaWVudHMgd2l0aCBhIHBsdWdnYWJsZSB3YXkgdG8gbWFuaXB1bGF0ZSBhbgotICogYW5ub3RhdGlvbiBtb2RpZnlpbmcgYSAiZGVjbGFyYXRpb24iLgotICogCi0gKiBUT0RPIHNwZWNpZnkgaG93IG11bHRpcGxlIGFubm90YXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgdG8gYmUgaGFuZGxlZAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCByZXR1cm4gdGhlIGFubm90YXRpb24uCi0JICovCi0JQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwgbW9kaWZ5IGl0IHdpdGgKLQkgKiBhIG5ldyBtYXJrZXIgYW5ub3RhdGlvbiwgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGlmIHByZXNlbnQuCi0JICogUmV0dXJuIHRoZSBuZXcgYW5ub3RhdGlvbi4KLQkgKi8KLQlNYXJrZXJBbm5vdGF0aW9uIG5ld01hcmtlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCBtb2RpZnkgaXQgd2l0aAotCSAqIGEgbmV3IHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiwgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGlmIHByZXNlbnQuCi0JICogUmV0dXJuIHRoZSBuZXcgYW5ub3RhdGlvbi4KLQkgKi8KLQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCBtb2RpZnkgaXQgd2l0aAotCSAqIGEgbmV3IG5vcm1hbCBhbm5vdGF0aW9uLCByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFubm90YXRpb24gaWYgcHJlc2VudC4KLQkgKiBSZXR1cm4gdGhlIG5ldyBhbm5vdGF0aW9uLgotCSAqLwotCU5vcm1hbEFubm90YXRpb24gbmV3Tm9ybWFsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwgcmV0dXJuIHRoZSBBU1Qgbm9kZQotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFubm90YXRpb24uCi0JICogSWYgdGhlIGFubm90YXRpb24gaXMgbWlzc2luZywgcmV0dXJuIGl0cyBwYXJlbnQgbm9kZS4KLQkgKi8KLQlBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ODY4ZDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci0KLS8qKgotICogUHJvdmlkZSBjbGllbnRzIHdpdGggYSBwbHVnZ2FibGUgd2F5IHRvIG1hbmlwdWxhdGUgYW4KLSAqIGFubm90YXRpb24gZWxlbWVudCBtb2RpZnlpbmcgYSAiZGVjbGFyYXRpb24iLgotICogVCBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJlIHBhc3NlZCB0byBhbmQgcmV0dXJuZWQgYnkgdGhlIGFkYXB0ZXIuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiB7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZQotCSAqIGFubm90YXRpb24gZWxlbWVudC4gUmV0dXJuIG51bGwgb3IgYW4gZW1wdHkgYXJyYXkKLQkgKiBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudC4KLQkgKi8KLQlUIGdldFZhbHVlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwgc2V0IHRoZSB2YWx1ZSBvZiB0aGUKLQkgKiBhbm5vdGF0aW9uIGVsZW1lbnQuIFNldHRpbmcgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50Ci0JICogdG8gbnVsbCB3aWxsIGNhdXNlIHRoZSBlbGVtZW50IHRvIGJlIHJlbW92ZWQgZnJvbSBpdHMKLQkgKiBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgc2V0VmFsdWUoVCB2YWx1ZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCByZXR1cm4gdGhlIGVsZW1lbnQncyB2YWx1ZSBleHByZXNzaW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCUV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24sIHJldHVybiB0aGUgQVNUIG5vZGUKLQkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50J3MgdmFsdWUuCi0JICogSWYgdGhlIGVsZW1lbnQgaXMgbWlzc2luZywgcmV0dXJuIHRoZSBhbm5vdGF0aW9uJ3Mgbm9kZS4KLQkgKi8KLQlBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9FeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjFkMGM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9FeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLQotLyoqCi0gKiBEZWZpbmUgdGhlIHByb3RvY29sIGZvciBjb252ZXJ0aW5nIGFuIEFTVCBleHByZXNzaW9uIGJhY2sgYW5kIGZvcnRoCi0gKiBmcm9tIGFuIGFyYml0cmFyeSB0eXBlIChlLmcuIFN0cmluZ0xpdGVyYWwgPD0+IFN0cmluZykuCi0gKiBUIGlzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gYmUgY29udmVydGVkIHRvIGFuZCBmcm9tIGFuIGV4cHJlc3Npb24uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFeHByZXNzaW9uQ29udmVydGVyPFQ+IHsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gYW4KLQkgKiBleHByZXNzaW9uIHRoYXQgaXMgb3duZWQgYnkgdGhlIHNwZWNpZmllZCBBU1QuCi0JICogVGhlIHR5cGUgb2YgdGhlIG9iamVjdCBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IHNwZWNpZmllZCBieSB0aGUgY2xpZW50LgotCSAqLwotCUV4cHJlc3Npb24gY29udmVydChUIG9iamVjdCwgQVNUIGFzdCk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiB0byBhbiBvYmplY3Qgb2Ygc29tZQotCSAqIHByZS1kZXRlcm1pbmVkIHR5cGUuCi0JICovCi0JVCBjb252ZXJ0KEV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9GaWVsZEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0ZpZWxkQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDZjZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0ZpZWxkQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVZhcmlhYmxlQmluZGluZzsKLQotLyoqCi0gKiBGaWVsZCBhdHRyaWJ1dGU6IGp1c3Qgc29tZSBjb3ZhcmlhbnQgb3ZlcnJpZGVzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmllbGRBdHRyaWJ1dGUgZXh0ZW5kcyBBdHRyaWJ1dGUgewotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUlWYXJpYWJsZUJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JRmllbGREZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZEFubm90YXRpb25BZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZEFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjIwOWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0luZGV4ZWRBbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdDsKLQotCi0vKioKLSAqIEFkYXB0IGFuIGluZGV4ZWQgSmF2YSBhbm5vdGF0aW9uIHdpdGggYSBzaW1wbGUtdG8tdXNlIGludGVyZmFjZS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBleHRlbmRzIEFubm90YXRpb25BZGFwdGVyIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBhbm5vdGF0aW9uIGlzIHNpdHVhdGVkLgotCSAqLwotCWludCBnZXRJbmRleCgpOwotCi0JLyoqCi0JICogTW92ZSB0aGUgYW5ub3RhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGluZGV4LCBsZWF2aW5nIGl0cyBvcmlnaW5hbAotCSAqIHBvc2l0aW9uIGNsZWFyZWQgb3V0LgotCSAqLwotCXZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0luZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzNjM2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQ7Ci0KLQotLyoqCi0gKiBBbGxvdyBjbGllbnRzIHRvIG1hbmlwdWxhdGUgYW4gYW5ub3RhdGlvbiB3aXRoaW4gYW4gYXJyYXkgb2YgYW5ub3RhdGlvbnMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBleHRlbmRzIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGFubm90YXRpb24gaXMgc2l0dWF0ZWQuCi0JICovCi0JaW50IGdldEluZGV4KCk7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBhbm5vdGF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXgsIGxlYXZpbmcgaXRzIG9yaWdpbmFsCi0JICogcG9zaXRpb24gY2xlYXJlZCBvdXQuCi0JICovCi0Jdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvTWVtYmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvTWVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNmJiZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L01lbWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogRGFsaSBtYW5pcHVsYXRlcyBhbm5vdGF0aW9ucyBvbiBtZW1iZXJzICh0eXBlcywgZmllbGRzLCBhbmQgbWV0aG9kcykuCi0gKiBUaGlzIGludGVyZmFjZSBzaW1wbGlmaWVzIHRob3NlIG1hbmlwdWxhdGlvbnMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZW1iZXIgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZW1iZXIncyBib2R5IGRlY2xhcmF0aW9uIGZyb20gdGhlIHNwZWNpZmllZCBBU1QuCi0JICogVGhpcyBjYW4gYmUgbnVsbCBpZiB0aGUgbWVtYmVyIGlzIG5vIGxvbmdlciBwcmVzZW50IGluIHRoZSBBU1QKLQkgKiBiZWNhdXNlIHRoZSBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCBpbiBhbm90aGVyIHRocmVhZC4KLQkgKi8KLQlCb2R5RGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVtYmVyJ3MgYmluZGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgQVNULgotCSAqLwotCUlCaW5kaW5nIGdldEJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZW1iZXIncyAibW9kaWZpZWQiIGRlY2xhcmF0aW9uIGZyb20gdGhlIHNwZWNpZmllZCBBU1QuCi0JICovCi0JTW9kaWZpZWREZWNsYXJhdGlvbiBnZXRNb2RpZmllZERlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVtYmVyJ3MgIm1vZGlmaWVkIiBkZWNsYXJhdGlvbiBmcm9tIGEgbmV3bHktZ2VuZXJhdGVkIEFTVC4KLQkgKi8KLQlNb2RpZmllZERlY2xhcmF0aW9uIGdldE1vZGlmaWVkRGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgYSBwZXJzaXN0YWJsZSBmaWVsZCBvciBwcm9wZXJ0eSBnZXR0ZXIuCi0JICovCi0JYm9vbGVhbiBpc1BlcnNpc3RhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZW1iZXIgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIG1lbWJlcgotCSAqIGFuZCBvY2N1cnJlbmNlLgotCSAqLwotCWJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZW1iZXIncyBuYW1lIHRleHQgcmFuZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIEFTVC4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBFZGl0IHRoZSBtZW1iZXIncyBkZWNsYXJhdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGVkaXRvci4KLQkgKi8KLQl2b2lkIGVkaXQoRWRpdG9yIGVkaXRvcik7Ci0KLQotCS8vICoqKioqKioqKiogImVkaXRvciIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgbWVtYmVyJ3MKLQkgKiBjb21waWxhdGlvbiB1bml0L0FTVCBpcyBpbiBhIHN0YXRlIHRvIGJlIG1hbmlwdWxhdGVkLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgRWRpdG9yIHsKLQotCQkvKioKLQkJICogRWRpdCB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBkZWNsYXJhdGlvbgotCQkgKiB3aWxsIGJlIGNhcHR1cmVkIGFuZCBhcHBsaWVkIHRvIHRoZSBtZW1iZXIncyBjb21waWxhdGlvbiB1bml0LgotCQkgKi8KLQkJdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvTWV0aG9kQXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvTWV0aG9kQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MzdhYjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L01ldGhvZEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklNZXRob2RCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci0KLS8qKgotICogUHJvcGVydHkgYXR0cmlidXRlOiBqdXN0IHNvbWUgY292YXJpYW50IG92ZXJyaWRlcy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi0vLyBUT0RPIHJlbmFtZSBQcm9wZXJ0eUF0dHJpYnV0ZT8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kQXR0cmlidXRlIGV4dGVuZHMgQXR0cmlidXRlIHsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlJTWV0aG9kQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlNZXRob2REZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCBiZSB1c2VkIGluc3RlYWQgb2YgTWVtYmVyI21hdGNoZXMoU3RyaW5nLCBpbnQpLgotCSAqLwotCWJvb2xlYW4gbWF0Y2hlcyhNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlLCBpbnQgb2NjdXJyZW5jZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9Nb2RpZmllZERlY2xhcmF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvTW9kaWZpZWREZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODJiMjk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9Nb2RpZmllZERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBEZWZpbmUgYSB3cmFwcGVyIHRoYXQgcHJvdmlkZXMgYSBjb21tb24gcHJvdG9jb2wgZm9yIGFsbCB0aGUgdmFyaW91cyBBU1QKLSAqIGRlY2xhcmF0aW9ucyB0aGF0IGhhdmUgbW9kaWZpZXJzIChpLmUuIHRoZXJlIGFyZSBhIG51bWJlciBvZiBBU1Qgbm9kZQotICogY2xhc3NlcyB0aGF0IGltcGxlbWVudCB0aGUgbWV0aG9kICNtb2RpZmllcnMoKSwgYnV0IHRoZXkgZG8gbm90IGltcGxlbWVudAotICogYSBjb21tb24gaW50ZXJmYWNlKToKLSAqICAgICBCb2R5RGVjbGFyYXRpb24KLSAqICAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uCi0gKiAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24KLSAqICAgICBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RpZmllZERlY2xhcmF0aW9uIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgImRlY2xhcmF0aW9uIiBBU1Qgbm9kZS4KLQkgKi8KLQlBU1ROb2RlIGdldERlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJkZWNsYXJhdGlvbiIgQVNULgotCSAqLwotCUFTVCBnZXRBc3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBkZWNsYXJhdGlvbiBoYXMgbm8gc3VjaCBhbm5vdGF0aW9uLgotCSAqLwotCUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbk5hbWVkKFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlICpmaXJzdCogYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQl2b2lkIHJlbW92ZUFubm90YXRpb25OYW1lZChTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCi0JLyoqCi0JICogUmVwbGFjZSB0aGUgc3BlY2lmaWVkIG9sZCBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuZXcgYW5ub3RhdGlvbi4KLQkgKiBJZiB0aGVyZSBpcyBubyBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBzaW1wbHkgYWRkIHRoZSBuZXcKLQkgKiBhbm5vdGF0aW9uIHRvIHRoZSBkZWNsYXJhdGlvbidzIG1vZGlmaWVycy4KLQkgKi8KLQl2b2lkIHJlcGxhY2VBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIG9sZEFubm90YXRpb25OYW1lLCBBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24pOwotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaW1wb3J0IHRvIHRoZSBkZWNsYXJhdGlvbidzIGNvbXBpbGF0aW9uIHVuaXQuCi0JICovCi0Jdm9pZCBhZGRJbXBvcnQoU3RyaW5nIGltcG9ydE5hbWUpOwotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgc3RhdGljIGltcG9ydCB0byB0aGUgZGVjbGFyYXRpb24ncyBjb21waWxhdGlvbiB1bml0LgotCSAqLwotCXZvaWQgYWRkU3RhdGljSW1wb3J0KFN0cmluZyBpbXBvcnROYW1lKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGltcG9ydCB0byB0aGUgZGVjbGFyYXRpb24ncyBjb21waWxhdGlvbiB1bml0LgotCSAqLwotCXZvaWQgYWRkSW1wb3J0KFN0cmluZyBpbXBvcnROYW1lLCBib29sZWFuIHN0YXRpY18pOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGhhcyB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JYm9vbGVhbiBhbm5vdGF0aW9uSXNOYW1lZChBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBuYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L1R5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NzI2ZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci0KLS8qKgotICogVHlwZToganVzdCBzb21lIGNvdmFyaWFudCBvdmVycmlkZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlIGV4dGVuZHMgTWVtYmVyIHsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlJVHlwZUJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JVHlwZURlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyBuZXN0ZWQgdHlwZXMgKGRvZXMgbm90IGluY2x1ZGUgYW5ub3RhdGlvbnMgb3IgZW51bXMpLgotCSAqLwotCVR5cGVEZWNsYXJhdGlvbltdIGdldFR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSdzIGZpZWxkcy4KLQkgKi8KLQlGaWVsZERlY2xhcmF0aW9uW10gZ2V0RmllbGRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSdzIG1ldGhvZHMuCi0JICovCi0JTWV0aG9kRGVjbGFyYXRpb25bXSBnZXRNZXRob2RzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2ZGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLWphdmFDb21waWxlci4uLmFyZ3MuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlYTVkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYTdkYjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBKYW4gMTUgMTE6MTE6MjIgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MmMyODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTk6NDIgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWJhNDgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZGIudWkKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbDsgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjEuMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5lZGl0b3IuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDU2OTgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjQ4YWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5kYi51aSI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmRiLnVpIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMGU1ODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBEQiBVSQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdWkvaW50ZXJuYWwvRFRQVWlUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdWkvaW50ZXJuYWwvRFRQVWlUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTY3YWQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JUHJvZmlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuUHJvZmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5pbnRlcm5hbC51aS53aXphcmRzLkNQV2l6YXJkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmludGVybmFsLnVpLndpemFyZHMuTmV3Q1BXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5pbnRlcm5hbC51aS53aXphcmRzLlByb2ZpbGVXaXphcmRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnVpLndpemFyZHMuSVByb2ZpbGVXaXphcmRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnVpLndpemFyZHMuSVdpemFyZENhdGVnb3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogRFRQIFVJIHRvb2xzCi0gKi8KLXB1YmxpYyBjbGFzcyBEVFBVaVRvb2xzIHsKLQotCi0JLyoqCi0JICogTGF1bmNoIHRoZSBEVFAgTmV3IENvbm5lY3Rpb24gUHJvZmlsZSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKiAKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhZGRlZCBwcm9maWxlLCBvciBudWxsIGlmIHRoZSB3aXphcmQgd2FzIGNhbmNlbGxlZC4KLQkgKiBUaGUgbmFtZSBjYW4gYmUgdXNlZCB0byBidWlsZCBhIERhbGkgY29ubmVjdGlvbiBwcm9maWxlIGZyb20KLQkgKiBKcHREYlBsdWdpbi5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZykuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlTmV3Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCS8vIEZpbHRlciBkYXRhc291cmNlIGNhdGVnb3J5Ci0JCU5ld0NQV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdDUFdpemFyZChuZXcgTG9jYWxWaWV3ZXJGaWx0ZXIoKSwgbnVsbCk7Ci0JCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCXdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQotCQlMb2NhbFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbFByb2ZpbGVMaXN0ZW5lcigpOwotCQlQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJU3RyaW5nIG5ld0NQTmFtZSA9IG51bGw7Ci0JCWlmICh3aXphcmREaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJLy8gYXNzdW1lIHRoZSBsYXN0IGFkZGVkIHByb2ZpbGUgaXMgdGhlIG9uZSB3ZSB3YW50Ci0JCQluZXdDUE5hbWUgPSBsaXN0ZW5lci5hZGRlZFByb2ZpbGUuZ2V0TmFtZSgpOwotCQl9Ci0JCVByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlyZXR1cm4gbmV3Q1BOYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFAgcHJvZmlsZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIHNpbXBseSBob2xkcyBvbiB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjb25uZWN0aW9uCi0JICogcHJvZmlsZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTG9jYWxQcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvZmlsZUxpc3RlbmVyIHsKLQkJSUNvbm5lY3Rpb25Qcm9maWxlIGFkZGVkUHJvZmlsZTsKLQkJCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVBZGRlZChJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5hZGRlZFByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVDaGFuZ2VkKElDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkJcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoSUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB2aWV3ZXIgZmlsdGVyICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBMb2NhbFZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFX0NBVEVHT1JZX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkJTG9jYWxWaWV3ZXJGaWx0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCUNQV2l6YXJkTm9kZSB3aXphcmROb2RlID0gKENQV2l6YXJkTm9kZSkgZWxlbWVudDsKLQkJCUlQcm9maWxlV2l6YXJkUHJvdmlkZXIgd2l6YXJkUHJvdmlkZXIgPSB3aXphcmROb2RlLmdldFByb3ZpZGVyKCk7Ci0JCQlpZiAod2l6YXJkUHJvdmlkZXIgaW5zdGFuY2VvZiBJV2l6YXJkQ2F0ZWdvcnlQcm92aWRlcikgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUlDYXRlZ29yeSBjYXRlZ29yeSA9IENvbm5lY3Rpb25Qcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb3ZpZGVyKAotCQkJCQkJCSgoUHJvZmlsZVdpemFyZFByb3ZpZGVyKSB3aXphcmRQcm92aWRlcikuZ2V0UHJvZmlsZSgpKS5nZXRDYXRlZ29yeSgpOwotCQkJCi0JCQkvLyBPbmx5IGRpc3BsYXkgd2l6YXJkcyBiZWxvbmcgdG8gZGF0YWJhc2UgY2F0ZWdvcnkKLQkJCXdoaWxlIChjYXRlZ29yeSAhPSBudWxsKSB7Ci0JCQkJaWYgKGNhdGVnb3J5LmdldElkKCkuZXF1YWxzKERBVEFCQVNFX0NBVEVHT1JZX0lEKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJY2F0ZWdvcnkgPSBjYXRlZ29yeS5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2ZGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLWphdmFDb21waWxlci4uLmFyZ3MuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3NWE0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZWJiNWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBKYW4gMTUgMTE6MTE6MDIgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWQ1NDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTk6MTggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2U2YzBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZGIKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5kYi5KcHREYlBsdWdpbgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLmVkaXRvci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZGIsCi0gb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0ZWFkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlPTEuNQotamF2YWNUYXJnZXQ9MS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0YzM5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmRiIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3YTJkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIERCCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9DYXRhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9DYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNmRhNzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLS8qKgotICogRGF0YWJhc2UgY2F0YWxvZwotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2F0YWxvZwotCWV4dGVuZHMgU2NoZW1hQ29udGFpbmVyLCBDb21wYXJhYmxlPENhdGFsb2c+Ci17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0NvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MzFhNmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotCi0vKioKLSAqIERhdGFiYXNlIGNvbHVtbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sdW1uCi0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdCwgQ29tcGFyYWJsZTxDb2x1bW4+Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4ncyB0YWJsZS4KLQkgKi8KLQlUYWJsZSBnZXRUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwYXJ0IG9mIGl0J3MgdGFibGUncyBwcmltYXJ5IGtleS4KLQkgKi8KLQlib29sZWFuIGlzUHJpbWFyeUtleUNvbHVtbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwYXJ0IG9mIG9uZSBvZiBpdCdzIHRhYmxlJ3MgZm9yZWlnbiBrZXlzLgotCSAqLwotCWJvb2xlYW4gaXNGb3JlaWduS2V5Q29sdW1uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbHVtbidzIGRhdGF0eXBlLgotCSAqLwotCVN0cmluZyBnZXREYXRhVHlwZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2x1bW4ncyBkYXRhdHlwZSBpcyBhIExPQiB0eXBlCi0JICogKGkuZS4gQkxPQiwgQ0xPQiwgb3IgTkNMT0IpLgotCSAqLwotCWJvb2xlYW4gZGF0YVR5cGVJc0xPQigpOwotCi0KLQkvLyAqKioqKioqKioqIEphdmEgdHlwZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBKYXZhIHR5cGUgZGVjbGFyYXRpb24gdGhhdCBpcyByZWFzb25hYmx5Ci0JICogc2ltaWxhciB0byB0aGUgY29sdW1uJ3MgZGF0YSB0eXBlLgotCSAqLwotCVN0cmluZyBnZXRKYXZhVHlwZURlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBKYXZhIHR5cGUgdGhhdCBpcyByZWFzb25hYmx5Ci0JICogc2ltaWxhciB0byB0aGUgY29sdW1uJ3MgZGF0YSB0eXBlLgotCSAqLwotCUphdmFUeXBlIGdldEphdmFUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBKYXZhIHR5cGUgZGVjbGFyYXRpb24gdGhhdCBpcyByZWFzb25hYmx5Ci0JICogc2ltaWxhciB0byB0aGUgY29sdW1uJ3MgZGF0YSB0eXBlIGFuZCBzdWl0YWJsZSBmb3IgdXNlIGFzIGEKLQkgKiBwcmltYXJ5IGtleSBmaWVsZC4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJpbWFyeUtleUphdmFUeXBlRGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUgYW5kIHN1aXRhYmxlIGZvciB1c2UgYXMgYQotCSAqIHByaW1hcnkga2V5IGZpZWxkLgotCSAqLwotCUphdmFUeXBlIGdldFByaW1hcnlLZXlKYXZhVHlwZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyODQ4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLQotLyoqCi0gKiBBbiBlbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiBDb25uZWN0aW9uTGlzdGVuZXIuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uQWRhcHRlciBpbXBsZW1lbnRzIENvbm5lY3Rpb25MaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENhdGFsb2cgY2F0YWxvZykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc2NoZW1hQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTY2hlbWEgc2NoZW1hKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBUYWJsZSB0YWJsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29sdW1uQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDb2x1bW4gY29sdW1uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc5YmExYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi0KLS8qKgotICogQSBDb25uZWN0aW9uTGlzdGVuZXIgaXMgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMgdG8gYSBjb25uZWN0aW9uLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uTGlzdGVuZXIKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKTsKLQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKTsKLQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSk7Ci0JcHVibGljIHZvaWQgYWJvdXRUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpOwotCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKTsKLQotCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBEYXRhYmFzZSBkYXRhYmFzZSk7Ci0JcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKTsKLQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNjaGVtYSBzY2hlbWEpOwotCXB1YmxpYyB2b2lkIHNlcXVlbmNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTZXF1ZW5jZSBzZXF1ZW5jZSk7Ci0JcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKTsKLQlwdWJsaWMgdm9pZCBjb2x1bW5DaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENvbHVtbiBjb2x1bW4pOwotCXB1YmxpYyB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjZlYTlmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuamRiYy5JSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci0KLS8qKgotICogRGF0YWJhc2UgY29ubmVjdGlvbiBwcm9maWxlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uUHJvZmlsZQotCWV4dGVuZHMgRGF0YWJhc2VPYmplY3QsIENvbXBhcmFibGU8Q29ubmVjdGlvblByb2ZpbGU+Ci17Ci0KLQkvLyAqKioqKioqKioqIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUncyBkYXRhYmFzZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGlzIGluYWN0aXZlLgotCSAqLwotCURhdGFiYXNlIGdldERhdGFiYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gSUQgb2YgdGhlIHByb3ZpZGVyIG1hbmFnaW5nIHRoZSBEVFAgcHJvZmlsZS4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJvdmlkZXJJRCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUncyBzdGF0aWMgSUQuCi0JICovCi0JU3RyaW5nIGdldEluc3RhbmNlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBkYXRhYmFzZSBuYW1lLgotCSAqLwotCVN0cmluZyBnZXREYXRhYmFzZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UgcHJvZHVjdCBuYW1lLgotCSAqLwotCVN0cmluZyBnZXREYXRhYmFzZVByb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UgdmVuZG9yLgotCSAqLwotCVN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSB2ZXJzaW9uLgotCSAqLwotCVN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZHJpdmVyIGNsYXNzIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldERyaXZlckNsYXNzTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gVVJMLgotCSAqLwotCVN0cmluZyBnZXRVUkwoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCB1c2VyIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldFVzZXJOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgdXNlciBwYXNzd29yZC4KLQkgKi8KLQlTdHJpbmcgZ2V0VXNlclBhc3N3b3JkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRyaXZlciBkZWZpbml0aW9uIElELgotCSAqLwotCVN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgamFyIGxpc3QgZm9yIHRoZSBkcml2ZXIgaW5zdGFuY2UgYXMgYSAKLQkgKiBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nLgotCSAqLwotCVN0cmluZyBnZXREcml2ZXJKYXJMaXN0KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29ubmVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvZmlsZSBpcyBlaXRoZXIgY29ubmVjdGVkIHRvIGEgbGl2ZSBkYXRhYmFzZQotCSAqIHNlc3Npb24gb3Igd29ya2luZyBvZmYtbGluZSAoaS5lLiBpdCBoYXMgYWNjZXNzIHRvIG1ldGEtZGF0YSkuCi0JICogQHNlZSBpc0Nvbm5lY3RlZCgpCi0JICogQHNlZSBpc1dvcmtpbmdPZmZsaW5lKCkKLQkgKi8KLQlib29sZWFuIGlzQWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvZmlsZSBpcyBuZWl0aGVyIGNvbm5lY3RlZCB0byBhIGxpdmUgZGF0YWJhc2UKLQkgKiBzZXNzaW9uIG5vciB3b3JraW5nIG9mZi1saW5lIChpLmUuIGl0IGhhcyBhY2Nlc3MgdG8gbWV0YS1kYXRhKS4KLQkgKiBAc2VlIGlzQWN0aXZlKCkKLQkgKi8KLQlib29sZWFuIGlzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9maWxlIGlzIGNvbm5lY3RlZCB0byBhIGxpdmUgZGF0YWJhc2Ugc2Vzc2lvbgotCSAqIChpLmUuIHRoZSBtZXRhLWRhdGEgY29tZXMgZnJvbSB0aGUgZGF0YWJhc2UpLCBhcyBvcHBvc2VkIHRvIHdvcmtpbmcKLQkgKiBvZmYtbGluZS4KLQkgKiBAc2VlICNpc0FjdGl2ZSgpCi0JICovCi0JYm9vbGVhbiBpc0Nvbm5lY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2ZpbGUgaXMgbm90IGNvbm5lY3RlZCB0byBhIGxpdmUgZGF0YWJhc2Ugc2Vzc2lvbgotCSAqIChpLmUuIHRoZSBtZXRhLWRhdGEgY29tZXMgZnJvbSB0aGUgZGF0YWJhc2UpLCBhcyBvcHBvc2VkIHRvIHdvcmtpbmcKLQkgKiBvZmYtbGluZS4KLQkgKiBAc2VlICNpc0Nvbm5lY3RlZCgpCi0JICovCi0JYm9vbGVhbiBpc0Rpc2Nvbm5lY3RlZCgpOwotCi0JLyoqCi0JICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0JICogQHNlZSAjZGlzY29ubmVjdCgpCi0JICovCi0Jdm9pZCBjb25uZWN0KCk7Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IGZyb20gdGhlIGRhdGFiYXNlLgotCSAqIEBzZWUgI2Nvbm5lY3QoKQotCSAqLwotCXZvaWQgZGlzY29ubmVjdCgpOwotCi0KLQkvLyAqKioqKioqKioqIG9mZi1saW5lIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2ZpbGUgaXMgd29ya2luZyBvZmYtbGluZSAoaS5lLiB0aGUgbWV0YS1kYXRhCi0JICogY29tZXMgZnJvbSBhIGxvY2FsIGNhY2hlKSwgYXMgb3Bwb3NlZCB0byBjb25uZWN0ZWQgdG8gYSBsaXZlCi0JICogZGF0YWJhc2Ugc2Vzc2lvbi4KLQkgKiBAc2VlICNpc0FjdGl2ZSgpCi0JICovCi0JYm9vbGVhbiBpc1dvcmtpbmdPZmZsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29ubmVjdGlvbiBmYWN0b3JpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGNvbm5lY3Rpb24gcHJvZmlsZSdzIHByb3ZpZGVyIHN1cHBvcnQgd29ya2luZyBvZmZsaW5lLgotCSAqLwotCWJvb2xlYW4gc3VwcG9ydHNXb3JrT2ZmbGluZU1vZGUoKTsKLQotCS8qKgotCSAqIFNhdmUgdGhlIHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgZm9yIHdvcmtpbmcgaW4gYW4gb2ZmbGluZSBtb2RlLgotCSAqIElmIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgZG9lcyBub3Qgc3VwcG9ydCB3b3JraW5nIGluIGFuIG9mZmxpbmUgbW9kZSwgbm8KLQkgKiBleGNlcHRpb24gaXMgdGhyb3duIGFuZCB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCUlTdGF0dXMgc2F2ZVdvcmtPZmZsaW5lRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBzdXBwb3J0cyB3b3JraW5nIG9mZmxpbmUgYW5kIGRhdGEKLQkgKiBoYXMgYmVlbiBzYXZlZCBmb3Igd29ya2luZyBvZmZsaW5lLgotCSAqLwotCWJvb2xlYW4gY2FuV29ya09mZmxpbmUoKTsKLQotCS8qKgotCSAqIEJlZ2luIHdvcmtpbmcgb2ZmLWxpbmUuCi0JICovCi0JSVN0YXR1cyB3b3JrT2ZmbGluZSgpOwotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGxpc3RlbmVyIHRvIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICovCi0Jdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gbGlzdGVuZXIgZnJvbSB0aGUgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQotCVN0cmluZyBDT05ORUNUSU9OX1BST0ZJTEVfVFlQRSA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWMuY29ubmVjdGlvblByb2ZpbGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBEUklWRVJfREVGSU5JVElPTl9QUk9QX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVyRGVmaW5pdGlvbklEIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRFJJVkVSX0RFRklOSVRJT05fVFlQRV9QUk9QX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5kZWZuVHlwZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERSSVZFUl9KQVJfTElTVF9QUk9QX0lEID0gImphckxpc3QiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBEQVRBQkFTRV9TQVZFX1BXRF9QUk9QX0lEID0gSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlBST1BfUFJFRklYICsgInNhdmVQV0QiOyAgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDhkYWE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLS8qKgotICogQW4gZW1wdHkgaW1wbGVtZW50YXRpb24gb2YgUHJvZmlsZUxpc3RlbmVyLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvblByb2ZpbGVBZGFwdGVyIGltcGxlbWVudHMgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZUFkZGVkKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbW92ZWQoU3RyaW5nIG5hbWUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmZjcyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIERhdGFiYXNlIGNvbm5lY3Rpb24gcHJvZmlsZSBmYWN0b3J5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgRFRQIGNvbm5lY3Rpb24gcHJvZmlsZXMgdGhlIGZhY3RvcnkgY2FuIHdyYXAgd2l0aAotCSAqIG5ldyBjb25uZWN0aW9uIHByb2ZpbGVzLgotCSAqLwotCUl0ZXJhdG9yPFN0cmluZz4gY29ubmVjdGlvblByb2ZpbGVOYW1lcygpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIGNvbm5lY3Rpb24gcHJvZmlsZSB0aGF0IHdyYXBzIHRoZSBEVFAgY29ubmVjdGlvbgotCSAqIHByb2ZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gRFRQIGNvbm5lY3Rpb24gcHJvZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIGZpbmRlciB0byBhbGxvdyBjbGllbnRzIHRvIGNvbnRyb2wgaG93Ci0JICogZGF0YWJhc2Ugb2JqZWN0cyBhcmUgZm91bmQgYmFzZWQgb24gdGhlaXIgbmFtZXMuCi0JICovCi0JQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSwgRGF0YWJhc2VGaW5kZXIgZmluZGVyKTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBjb25uZWN0aW9uIHByb2ZpbGUgdGhhdCB3cmFwcyB0aGUgRFRQIGNvbm5lY3Rpb24KLQkgKiBwcm9maWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIERUUCBjb25uZWN0aW9uIHByb2ZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogbmFtZS4KLQkgKiBDbGllbnRzIHNob3VsZCB1c2UgdGhpcyBtZXRob2Qgd2hlbiBhIEpQQSBwbGF0Zm9ybSBpcyB1bmF2YWlsYWJsZQotCSAqIChlLmcuIGR1cmluZyBwcm9qZWN0IGNyZWF0aW9uKS4gVGhlIHJldHVybmVkIGNvbm5lY3Rpb24gcHJvZmlsZSB3aWxsCi0JICogbm90IGJlIGFibGUgdG8gc2VhcmNoIGZvciBkYXRhYmFzZSBvYmplY3RzIGJ5IGFueSBuYW1lcyBvdGhlciB0aGFuCi0JICogdGhvc2Ugc3VwcGxpZWQgYnkgdGhlIGZhY3RvcnkuCi0JICovCi0JQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YgY2hhbmdlcyB0byB0aGUgRFRQCi0JICogY29ubmVjdGlvbiBwcm9maWxlcy4KLQkgKi8KLQl2b2lkIGFkZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBsaXN0ZW5lci4KLQkgKi8KLQl2b2lkIHJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4NDRiMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Db25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotLyoqCi0gKiBBIFByb2ZpbGVMaXN0ZW5lciBpcyBub3RpZmllZCBvZiBhbnkgY2hhbmdlcyB0byB0aGUgRFRQIGNvbm5lY3Rpb24gcHJvZmlsZXMuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JUHJvZmlsZUxpc3RlbmVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBwcm9maWxlIGhhcyBiZWVuIGFkZGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlQWRkZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBwcm9maWxlIGhhcyBiZWVuIHJlbW92ZWQuCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW1vdmVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgcHJvZmlsZSBoYXMgYmVlbiByZW5hbWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9EYXRhYmFzZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRGF0YWJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRmM2MxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9EYXRhYmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogRGF0YWJhc2UKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERhdGFiYXNlCi0JZXh0ZW5kcyBTY2hlbWFDb250YWluZXIsIENvbXBhcmFibGU8RGF0YWJhc2U+Ci17Ci0KLQkvLyAqKioqKioqKioqIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSdzIHZlbmRvci4KLQkgKi8KLQlTdHJpbmcgZ2V0VmVuZG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgdmVyc2lvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSdzIGRlZmF1bHQgc2NoZW1hLgotCSAqIEluIG1vc3QgY2FzZXMgdGhlIGRlZmF1bHQgc2NoZW1hJ3MgbmFtZSB3aWxsIG1hdGNoIHRoZSB1c2VyIG5hbWUuCi0JICogSXQgbWF5IGJlIG51bGwuCi0JICovCi0JU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKTsKLQotCi0JLy8gKioqKioqKioqKiBjYXRhbG9ncyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgY2F0YWxvZ3MuCi0JICovCi0JYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgY2F0YWxvZ3MuCi0JICovCi0JSXRlcmF0b3I8Q2F0YWxvZz4gY2F0YWxvZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNhdGFsb2dzIHRoZSBkYXRhYmFzZSBjb250YWlucy4KLQkgKi8KLQlpbnQgY2F0YWxvZ3NTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBkYXRhYmFzZSdzIGNhdGFsb2dzLgotCSAqLwotCUl0ZXJhdG9yPFN0cmluZz4gY2F0YWxvZ05hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgImRlZmF1bHQiIGNhdGFsb2cuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICovCi0JQ2F0YWxvZyBnZXREZWZhdWx0Q2F0YWxvZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYXRhbG9nIHdpdGggc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIHNob3VsZCBiZSBhbiBTUUwKLQkgKiBpZGVudGlmaWVyIChpLmUuIHF1b3RlZCB3aGVuIGNhc2Utc2Vuc2l0aXZlLCB1bnF1b3RlZCB3aGVuCi0JICogY2FzZS1pbnNlbnNpdGl2ZSkuCi0JICovCi0JQ2F0YWxvZyBnZXRDYXRhbG9nTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0KLQkvLyAqKioqKioqKioqIHNlYXJjaCB1dGlsaXR5ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggc3BlY2lmaWVkIG5hbWUuCi0JICogVGhlIG5hbWUgc2hvdWxkIGJlIGFuIFNRTCBpZGVudGlmaWVyIChpLmUuIHF1b3RlZCB3aGVuIGNhc2Utc2Vuc2l0aXZlLAotCSAqIHVucXVvdGVkIHdoZW4gY2FzZS1pbnNlbnNpdGl2ZSkuCi0JICovCi0JPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBnZXREYXRhYmFzZU9iamVjdE5hbWVkKFRbXSBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBuYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRGF0YWJhc2VGaW5kZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2YyMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRGF0YWJhc2VGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBjbGllbnRzIG9mIHRoZSBEYWxpIGRiIHBhY2thZ2UgdG8gcGx1ZyBpbiBhIGN1c3RvbQotICogc3RyYXRlZ3kgZm9yIGNvbXBhcmluZyBhbiBpZGVudGlmaWVyIHRvIHRoZSBuYW1lcyBvZiBhIGNvbGxlY3Rpb24gb2YKLSAqIGRhdGFiYXNlIG9iamVjdHMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEYXRhYmFzZUZpbmRlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQk8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIGdldERhdGFiYXNlT2JqZWN0TmFtZWQoVFtdIGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIG5hbWUsIERlZmF1bHRDYWxsYmFjayBkZWZhdWx0Q2FsbGJhY2spOwotCi0JLyoqCi0JICogVGhlIHBsYXRmb3JtLXByb3ZpZGVkIGZpbmRlciBpcyBwYXNzZWQgYSAiZGVmYXVsdCIgY2FsbGJhY2sgdGhhdCBjYW4gYmUKLQkgKiB1c2VkIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCWludGVyZmFjZSBEZWZhdWx0Q2FsbGJhY2sgewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkJICovCi0JCTxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgZ2V0RGF0YWJhc2VPYmplY3ROYW1lZChUW10gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgbmFtZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZpbmRlciBzZWFyY2hlcyBmb3IgYW4gZXhhY3QgbWF0Y2guCi0JICovCi0JZmluYWwgY2xhc3MgU2ltcGxlIGltcGxlbWVudHMgRGF0YWJhc2VGaW5kZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIERhdGFiYXNlRmluZGVyIElOU1RBTkNFID0gbmV3IFNpbXBsZSgpOwotCQlwdWJsaWMgc3RhdGljIERhdGFiYXNlRmluZGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBTaW1wbGUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNlYXJjaCBmb3IgYW4gZXhhY3QgbWF0Y2ggb24gdGhlIG5hbWUKLQkJcHVibGljIDxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgZ2V0RGF0YWJhc2VPYmplY3ROYW1lZChUW10gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgbmFtZSwgRGVmYXVsdENhbGxiYWNrIGRlZmF1bHRDYWxsYmFjaykgewotCQkJZm9yIChUIGRhdGFiYXNlT2JqZWN0IDogZGF0YWJhc2VPYmplY3RzKSB7Ci0JCQkJaWYgKGRhdGFiYXNlT2JqZWN0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIGRhdGFiYXNlT2JqZWN0OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJEYXRhYmFzZUZpbmRlci5EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmaW5kZXIgdXNlcyB0aGUgcGFzc2VkIGluIGNhbGxiYWNrIHRvIHNlYXJjaCB0aGUgbGlzdCBvZiBkYXRhYmFzZSBvYmplY3RzLgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBEYXRhYmFzZUZpbmRlciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRGF0YWJhc2VGaW5kZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQlwdWJsaWMgc3RhdGljIERhdGFiYXNlRmluZGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgdXNlIHRoZSBjYWxsYmFjawotCQlwdWJsaWMgPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBnZXREYXRhYmFzZU9iamVjdE5hbWVkKFRbXSBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBuYW1lLCBEZWZhdWx0Q2FsbGJhY2sgZGVmYXVsdENhbGxiYWNrKSB7Ci0JCQlyZXR1cm4gZGVmYXVsdENhbGxiYWNrLmdldERhdGFiYXNlT2JqZWN0TmFtZWQoZGF0YWJhc2VPYmplY3RzLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiRGF0YWJhc2VGaW5kZXIuRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRGF0YWJhc2VPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjUyNTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRGF0YWJhc2VPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi0vKioKLSAqIENvbW1vbiBiZWhhdmlvciB0byBhbGwgZGF0YWJhc2Ugb2JqZWN0cwotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2VPYmplY3QgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBvYmplY3QncyBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgbmFtZSBvZiBhIEphdmEgbWVtYmVyIGFuZCB0aGUgZGF0YWJhc2Ugb2JqZWN0IHRvIHdoaWNoIGl0IGlzCi0JICogbWFwcGVkLCBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgbWVtYmVyJ3MKLQkgKiBkYXRhYmFzZSBvYmplY3QgYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LiBSZXR1cm4gbnVsbCBpZiB0aGUgbWVtYmVyCi0JICogbWFwcyB0byB0aGUgZGF0YWJhc2Ugb2JqZWN0IGJ5IGRlZmF1bHQuCi0JICovCi0JU3RyaW5nIGdldEFubm90YXRpb25JZGVudGlmaWVyKFN0cmluZyBqYXZhSWRlbnRpZmllcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBtZW1iZXIncwotCSAqIGRhdGFiYXNlIG9iamVjdCBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuCi0JICovCi0JU3RyaW5nIGdldEFubm90YXRpb25JZGVudGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKi8KLQlDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Gb3JlaWduS2V5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9Gb3JlaWduS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDZiNDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRm9yZWlnbktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIERhdGFiYXNlIGZvcmVpZ24ga2V5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBGb3JlaWduS2V5Ci0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdCwgQ29tcGFyYWJsZTxGb3JlaWduS2V5PgotewotCi0JLy8gKioqKioqKioqKiB0YWJsZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzICJiYXNlIiB0YWJsZS4KLQkgKi8KLQlUYWJsZSBnZXRCYXNlVGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyAicmVmZXJlbmNlZCIgdGFibGUuCi0JICovCi0JVGFibGUgZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIHBhaXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyBjb2x1bW4gcGFpcnMuCi0JICovCi0JSXRlcmF0b3I8Q29sdW1uUGFpcj4gY29sdW1uUGFpcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZm9yZWlnbiBrZXkncyBjb2x1bW4gcGFpcnMuCi0JICovCi0JaW50IGNvbHVtblBhaXJzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzIHNpbmdsZSBjb2x1bW4gcGFpci4gVGhyb3cgYW4KLQkgKiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGZvcmVpZ24ga2V5IGhhcyBtb3JlIHRoYW4gb25lIGNvbHVtbiBwYWlyLgotCSAqLwotCUNvbHVtblBhaXIgZ2V0Q29sdW1uUGFpcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzICJiYXNlIiBjb2x1bW5zLgotCSAqLwotCUl0ZXJhdG9yPENvbHVtbj4gYmFzZUNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyAiYmFzZSIgY29sdW1ucyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgYmFzZQotCSAqIHRhYmxlJ3MgcHJpbWFyeSBrZXkuIChUaGUgbm9uLXByaW1hcnkga2V5IGJhc2UgY29sdW1ucyBhcmUgbm90IHVzZWQgdG8KLQkgKiBnZW5lcmF0ZSBiYXNpYyBhdHRyaWJ1dGVzIGR1cmluZyBlbnRpdHkgZ2VuZXJhdGlvbi4pCi0JICovCi0JSXRlcmF0b3I8Q29sdW1uPiBub25QcmltYXJ5S2V5QmFzZUNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyAicmVmZXJlbmNlZCIgY29sdW1ucy4KLQkgKi8KLQlJdGVyYXRvcjxDb2x1bW4+IHJlZmVyZW5jZWRDb2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZm9yZWlnbiBrZXkgcmVmZXJlbmNlcyB0aGUgcHJpbWFyeSBrZXkgb2YgdGhlCi0JICogInJlZmVyZW5jZWQiIHRhYmxlIGFuZCB0aGF0IHByaW1hcnkga2V5IGhhcyBvbmx5IGEgc2luZ2xlIGNvbHVtbi4KLQkgKiBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gZGV0ZXJtaW5pbmcgSlBBIGRlZmF1bHRzLgotCSAqLwotCWJvb2xlYW4gcmVmZXJlbmNlc1NpbmdsZUNvbHVtblByaW1hcnlLZXkoKTsKLQotCi0JLy8gKioqKioqKioqKiBKUEEgc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgbmFtZSBmb3IgYW4gYXR0cmlidXRlIHRoYXQgaG9sZHMgdGhlIGVudGl0eQotCSAqIG1hcHBlZCB0byB0aGUgZm9yZWlnbiBrZXkncyAicmVmZXJlbmNlZCIgdGFibGUuCi0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIElmIHRoZSBuYW1lIG9mIHRoZSAiYmFzZSIgY29sdW1uIGFkaGVyZXMgdG8gdGhlIEpQQSBzcGVjIGZvciBhCi0JICogZGVmYXVsdCBtYXBwaW5nIChpLmUuIGl0IGVuZHMgd2l0aCBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lCi0JICogb2YgdGhlICJyZWZlcmVuY2VkIiBjb2x1bW4sIGFuZCB0aGUgInJlZmVyZW5jZWQiIGNvbHVtbiBpcyB0aGUgc2luZ2xlCi0JICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSAicmVmZXJlbmNlZCIgdGFibGUpLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBkZWZhdWx0IGF0dHJpYnV0ZSBuYW1lOgotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFX0lEID0+IENVQklDTEUuSUQpID0+ICJDVUJJQ0xFIgotCSAqIFJldHVybiBhIG51bGwgaWYgaXQgZG9lcyBub3QgYWRoZXJlIHRvIHRoZSBKUEEgc3BlYzoKLQkgKiAgICAgRm9yZWlnbktleShFTVAuQ1VCSUNMRV9JRCA9PiBDVUJJQ0xFLkNVQklDTEVfSUQpID0+IG51bGwKLQkgKiAgICAgRm9yZWlnbktleShFTVAuQ1VCSUNMRSA9PiBDVUJJQ0xFLklEKSA9PiBudWxsCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRBdHRyaWJ1dGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KSB0aGF0IGlzIG1hcHBlZCB0byB0aGUKLQkgKiBmb3JlaWduIGtleSwKLQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlJ3MKLQkgKiBKb2luQ29sdW1uIGFubm90YXRpb24ncyAnbmFtZScgZWxlbWVudC4gUmV0dXJuIG51bGwgaWYgdGhlIGF0dHJpYnV0ZQotCSAqIG1hcHMgdG8gdGhlIGpvaW4gY29sdW1uIGJ5IGRlZmF1bHQuCi0JICogUHJlY29uZGl0aW9uOiBUaGUgZm9yZWlnbiBrZXkgY29uc2lzdHMgb2YgYSBzaW5nbGUgY29sdW1uIHBhaXIgd2hvc2UKLQkgKiByZWZlcmVuY2VkIGNvbHVtbiBpcyB0aGUgc2luZ2xlLWNvbHVtbiBwcmltYXJ5IGtleSBvZiB0aGUgZm9yZWlnbgotCSAqIGtleSdzIHJlZmVyZW5jZWQgdGFibGUuCi0JICovCi0JU3RyaW5nIGdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcihTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBwYWlyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQYWlyIHVwIHRoZSBmb3JlaWduIGtleSdzIGNvbHVtbiBwYWlycywgbWF0Y2hpbmcgZWFjaCAiYmFzZSIgY29sdW1uIHdpdGgKLQkgKiB0aGUgYXBwcm9wcmlhdGUgInJlZmVyZW5jZWQiIGNvbHVtbi4KLQkgKiBAc2VlICNjb2x1bW5QYWlycygpCi0JICovCi0JaW50ZXJmYWNlIENvbHVtblBhaXIgZXh0ZW5kcyBDb21wYXJhYmxlPENvbHVtblBhaXI+IHsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb2x1bW4gcGFpcidzICJiYXNlIiBjb2x1bW4uCi0JCSAqLwotCQlDb2x1bW4gZ2V0QmFzZUNvbHVtbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBwYWlyJ3MgInJlZmVyZW5jZWQiIGNvbHVtbi4KLQkJICovCi0JCUNvbHVtbiBnZXRSZWZlcmVuY2VkQ29sdW1uKCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0pwdERiUGx1Z2luLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9KcHREYlBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDZkZTViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0pwdERiUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkRUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgSlBUIERCIHBsdWctaW4gbGlmZWN5Y2xlIGltcGxlbWVudGF0aW9uLgotICogR2xvYmFsbHkgYXZhaWxhYmxlIGNvbm5lY3Rpb24gcHJvZmlsZSBmYWN0b3J5LgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgSnB0RGJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXByaXZhdGUgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLQotCXByaXZhdGUgc3RhdGljIEpwdERiUGx1Z2luIElOU1RBTkNFOyAgLy8gc29ydGEtZmluYWwKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uIEpQVCBEQiBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0RGJQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSnB0RGJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgPSBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuaW5zdGFuY2UoKTsKLSAgICAgICAgdGhpcy5jb25uZWN0aW9uUHJvZmlsZUZhY3Rvcnkuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5zdG9wKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5ID0gbnVsbDsKLQkJSU5TVEFOQ0UgPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9TY2hlbWEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1NjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDgyYzllLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1NjaGVtYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLQotLyoqCi0gKiBEYXRhYmFzZSBzY2hlbWEKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYQotCWV4dGVuZHMgRGF0YWJhc2VPYmplY3QsIENvbXBhcmFibGU8U2NoZW1hPgotewotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hJ3MgY2F0YWxvZy4gUmV0dXJuIG51bGwgaWYgdGhlIHNjaGVtYSdzIGRhdGFiYXNlIGRvZXMKLQkgKiBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKi8KLQlDYXRhbG9nIGdldENhdGFsb2coKTsKLQotCi0JLy8gKioqKioqKioqKiB0YWJsZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyB0YWJsZXMuCi0JICovCi0JSXRlcmF0b3I8VGFibGU+IHRhYmxlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGFibGVzIHRoZSBzY2hlbWEgY29udGFpbnMuCi0JICovCi0JaW50IHRhYmxlc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIHNjaGVtYSdzIHRhYmxlcy4KLQkgKi8KLQlJdGVyYXRvcjxTdHJpbmc+IHRhYmxlTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUgd2l0aCBzcGVjaWZpZWQgbmFtZS4gVGhlIG5hbWUgc2hvdWxkIGJlIGFuIFNRTAotCSAqIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUsIHVucXVvdGVkIHdoZW4KLQkgKiBjYXNlLWluc2Vuc2l0aXZlKS4KLQkgKi8KLQlUYWJsZSBnZXRUYWJsZU5hbWVkKFN0cmluZyBuYW1lKTsKLQotCi0JLy8gKioqKioqKioqKiBzZXF1ZW5jZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyBzZXF1ZW5jZXMuCi0JICovCi0JSXRlcmF0b3I8U2VxdWVuY2U+IHNlcXVlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIHRoZSBzY2hlbWEgY29udGFpbnMuCi0JICovCi0JaW50IHNlcXVlbmNlc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIHNjaGVtYSdzIHNlcXVlbmNlcy4KLQkgKi8KLQlJdGVyYXRvcjxTdHJpbmc+IHNlcXVlbmNlTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VxdWVuY2Ugd2l0aCBzcGVjaWZpZWQgbmFtZS4gVGhlIG5hbWUgc2hvdWxkIGJlIGFuIFNRTAotCSAqIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUsIHVucXVvdGVkIHdoZW4KLQkgKiBjYXNlLWluc2Vuc2l0aXZlKS4KLQkgKi8KLQlTZXF1ZW5jZSBnZXRTZXF1ZW5jZU5hbWVkKFN0cmluZyBuYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvU2NoZW1hQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9TY2hlbWFDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxNDk0NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9TY2hlbWFDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFNjaGVtYSAiY29udGFpbmVyIiAoaS5lLiBEYXRhYmFzZSBvciBDYXRhbG9nKQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hQ29udGFpbmVyCi0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdAotewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXIncyBzY2hlbWF0YS4KLQkgKi8KLQlJdGVyYXRvcjxTY2hlbWE+IHNjaGVtYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzY2hlbWF0YSBpbiB0aGUgY29udGFpbmVyLgotCSAqLwotCWludCBzY2hlbWF0YVNpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGNvbnRhaW5lcidzIHNjaGVtYXRhLgotCSAqLwotCUl0ZXJhdG9yPFN0cmluZz4gc2NoZW1hTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hIHdpdGggc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIHNob3VsZCBiZSBhbiBTUUwKLQkgKiBpZGVudGlmaWVyIChpLmUuIHF1b3RlZCB3aGVuIGNhc2Utc2Vuc2l0aXZlLCB1bnF1b3RlZCB3aGVuCi0JICogY2FzZS1pbnNlbnNpdGl2ZSkuCi0JICovCi0JU2NoZW1hIGdldFNjaGVtYU5hbWVkKFN0cmluZyBuYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvU2VxdWVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1NlcXVlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Y2NhYTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvU2VxdWVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOwotCi0vKioKLSAqIERhdGFiYXNlIHNlcXVlbmNlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTZXF1ZW5jZQotCWV4dGVuZHMgRGF0YWJhc2VPYmplY3QsIENvbXBhcmFibGU8U2VxdWVuY2U+Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNlcXVlbmNlJ3Mgc2NoZW1hLgotCSAqLwotCVNjaGVtYSBnZXRTY2hlbWEoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYTIyM2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBEYXRhYmFzZSB0YWJsZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGUKLQlleHRlbmRzIERhdGFiYXNlT2JqZWN0LCBDb21wYXJhYmxlPFRhYmxlPgotewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIHNjaGVtYS4KLQkgKi8KLQlTY2hlbWEgZ2V0U2NoZW1hKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhYmxlJ3MgY29sdW1ucy4KLQkgKi8KLQlJdGVyYXRvcjxDb2x1bW4+IGNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgdGhlIHRhYmxlIGNvbnRhaW5zLgotCSAqLwotCWludCBjb2x1bW5zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgdGFibGUncyBjb2x1bW5zLgotCSAqLwotCUl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29sdW1uIHdpdGggc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIHNob3VsZCBiZSBhbiBTUUwKLQkgKiBpZGVudGlmaWVyIChpLmUuIHF1b3RlZCB3aGVuIGNhc2Utc2Vuc2l0aXZlLCB1bnF1b3RlZCB3aGVuCi0JICogY2FzZS1pbnNlbnNpdGl2ZSkuCi0JICovCi0JQ29sdW1uIGdldENvbHVtbk5hbWVkKFN0cmluZyBuYW1lKTsKLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBjb2x1bW5zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBwcmltYXJ5IGtleSBjb2x1bW5zLgotCSAqLwotCUl0ZXJhdG9yPENvbHVtbj4gcHJpbWFyeUtleUNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHByaW1hcnkga2V5IGNvbHVtbnMgdGhlIHRhYmxlIGNvbnRhaW5zLgotCSAqLwotCWludCBwcmltYXJ5S2V5Q29sdW1uc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uLiBUaHJvdyBhbgotCSAqIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgdGFibGUgaGFzIG1vcmUgdGhhbiBvbmUgcHJpbWFyeSBrZXkgY29sdW1uLgotCSAqLwotCUNvbHVtbiBnZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0KLQotCS8vICoqKioqKioqKiogZm9yZWlnbiBrZXlzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBmb3JlaWduIGtleXMuCi0JICovCi0JSXRlcmF0b3I8Rm9yZWlnbktleT4gZm9yZWlnbktleXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGZvcmVpZ24ga2V5cyB0aGUgdGFibGUgY29udGFpbnMuCi0JICovCi0JaW50IGZvcmVpZ25LZXlzU2l6ZSgpOwotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gdGFibGUgc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGFibGUgaXMgcG9zc2libHkgYSAiam9pbiIgdGFibGUKLQkgKiAoaS5lLiBpdCBjb250YWlucyBvbmx5IDIgZm9yZWlnbiBrZXlzKS4gV2hldGhlciB0aGUgdGFibGUgKmFjdHVhbGx5KiBpcwotCSAqIGEgImpvaW4iIHRhYmxlIGlzIGRldGVybWluZWQgYnkgdGhlIHNlbWFudGljcyBvZiB0aGUgZGF0YWJhc2UgZGVzaWduLgotCSAqLwotCWJvb2xlYW4gaXNQb3NzaWJsZUpvaW5UYWJsZSgpOwotCi0JLyoqCi0JICogQXNzdW1pbmcgdGhlIHRhYmxlIGlzIGEgImpvaW4iIHRhYmxlLCByZXR1cm4gdGhlIGZvcmVpZ24ga2V5IHRvIHRoZQotCSAqICJvd25pbmciIHRhYmxlLgotCSAqIEBzZWUgI2lzUG9zc2libGVKb2luVGFibGUoKQotCSAqLwotCUZvcmVpZ25LZXkgZ2V0Sm9pblRhYmxlT3duaW5nRm9yZWlnbktleSgpOwotCi0JLyoqCi0JICogQXNzdW1pbmcgdGhlIHRhYmxlIGlzIGEgImpvaW4iIHRhYmxlLCByZXR1cm4gdGhlIGZvcmVpZ24ga2V5IHRvIHRoZQotCSAqICJub24tb3duaW5nIiB0YWJsZS4KLQkgKiBAc2VlICNpc1Bvc3NpYmxlSm9pblRhYmxlKCkKLQkgKi8KLQlGb3JlaWduS2V5IGdldEpvaW5UYWJsZU5vbk93bmluZ0ZvcmVpZ25LZXkoKTsKLQotCS8qKgotCSAqIEFzc3VtaW5nIHRoZSB0YWJsZSBpcyBhICJqb2luIiB0YWJsZSwgcmV0dXJuIHdoZXRoZXIgaXRzIG5hbWUgbWF0Y2hlcwotCSAqIHRoZSBKUEEgZGVmYXVsdCAoaS5lLiAiT1dOSU5HVEFCTEVfTk9OT1dOSU5HVEFCTEUiKS4KLQkgKiBAc2VlICNpc1Bvc3NpYmxlSm9pblRhYmxlKCkKLQkgKi8KLQlib29sZWFuIGpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ2F0YWxvZ1dyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENhdGFsb2dXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDE0Y2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ2F0YWxvZ1dyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwotCi0vKioKLSAqIFdyYXAgYSBEVFAgQ2F0YWxvZwotICovCi1maW5hbCBjbGFzcyBEVFBDYXRhbG9nV3JhcHBlcgotCWV4dGVuZHMgRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcgotCWltcGxlbWVudHMgQ2F0YWxvZwotewotCS8vIHRoZSB3cmFwcGVkIERUUCBjYXRhbG9nCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUENhdGFsb2dXcmFwcGVyKERUUERhdGFiYXNlV3JhcHBlciBkYXRhYmFzZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZykgewotCQlzdXBlcihkYXRhYmFzZSwgZHRwQ2F0YWxvZyk7Ci0JCXRoaXMuZHRwQ2F0YWxvZyA9IGR0cENhdGFsb2c7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5jYXRhbG9nQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE+IGdldERUUFNjaGVtYXRhKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDYXRhbG9nLmdldFNjaGVtYXMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlEVFBDYXRhbG9nV3JhcHBlciBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSkgewotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBTY2hlbWEuZ2V0Q2F0YWxvZygpKSA/Ci0JCQkJCQl0aGlzLmdldFNjaGVtYV8oZHRwU2NoZW1hKQotCQkJCQk6Ci0JCQkJCQl0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hKGR0cFNjaGVtYSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBUYWJsZS5nZXRTY2hlbWEoKS5nZXRDYXRhbG9nKCkpID8KLQkJCQkJCXRoaXMuZ2V0VGFibGVfKGR0cFRhYmxlKQotCQkJCQk6Ci0JCQkJCQl0aGlzLmdldERhdGFiYXNlKCkuZ2V0VGFibGUoZHRwVGFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLndyYXBzKGR0cENvbHVtbi5nZXRUYWJsZSgpLmdldFNjaGVtYSgpLmdldENhdGFsb2coKSkgPwotCQkJCQkJdGhpcy5nZXRDb2x1bW5fKGR0cENvbHVtbikKLQkJCQkJOgotCQkJCQkJdGhpcy5nZXREYXRhYmFzZSgpLmdldENvbHVtbihkdHBDb2x1bW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEYXRhYmFzZU9iamVjdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENhdGFsb2cuZ2V0TmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKENhdGFsb2cgY2F0YWxvZykgewotCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKHRoaXMuZ2V0TmFtZSgpLCBjYXRhbG9nLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCXJldHVybiB0aGlzLmR0cENhdGFsb2cgPT0gY2F0YWxvZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbHVtbldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbHVtbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5ZDhkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDb2x1bW5XcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLmRiZGVmaW5pdGlvbi5QcmVkZWZpbmVkRGF0YVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuUHJlZGVmaW5lZERhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5QcmltaXRpdmVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVKYXZhVHlwZTsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBDb2x1bW4KLSAqLwotZmluYWwgY2xhc3MgRFRQQ29sdW1uV3JhcHBlcgotCWV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyCi0JaW1wbGVtZW50cyBDb2x1bW4KLXsKLQkvLyB0aGUgd3JhcHBlZCBEVFAgY29sdW1uCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBDb2x1bW5XcmFwcGVyKERUUFRhYmxlV3JhcHBlciB0YWJsZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJc3VwZXIodGFibGUsIGR0cENvbHVtbik7Ci0JCXRoaXMuZHRwQ29sdW1uID0gZHRwQ29sdW1uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuY29sdW1uQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29sdW1uLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKCkgewotCQlyZXR1cm4gKERUUFRhYmxlV3JhcHBlcikgdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlLZXlDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnNDb250YWlucyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcmVpZ25LZXlDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlKCkuZm9yZWlnbktleUJhc2VDb2x1bW5zQ29udGFpbnModGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSA9PSBudWxsKSA/IG51bGwgOiBkYXRhVHlwZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhVHlwZSgpLmRlY2xhcmF0aW9uKCk7Ci0JfQotCi0JcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgewotCQlEYXRhVHlwZSBkYXRhVHlwZSA9IHRoaXMuZHRwQ29sdW1uLmdldERhdGFUeXBlKCk7Ci0JCXJldHVybiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBQcmVkZWZpbmVkRGF0YVR5cGUpID8KLQkJCWNvbnZlcnRUb0pQQUphdmFUeXBlKHRoaXMuZ2V0SmF2YVR5cGUoKFByZWRlZmluZWREYXRhVHlwZSkgZGF0YVR5cGUpKQotCQk6Ci0JCQlERUZBVUxUX0pBVkFfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlKYXZhVHlwZURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcmltYXJ5S2V5SmF2YVR5cGUoKS5kZWNsYXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBKYXZhVHlwZSBnZXRQcmltYXJ5S2V5SmF2YVR5cGUoKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KUEFQcmltYXJ5S2V5SmF2YVR5cGUodGhpcy5nZXRKYXZhVHlwZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFUeXBlIGdldEphdmFUeXBlKFByZWRlZmluZWREYXRhVHlwZSBkYXRhVHlwZSkgewotCQkvLyB0aGlzIGlzIGp1c3QgYSBiaXQgaGFja3k6IG1vdmluZyBmcm9tIGEgdHlwZSBkZWNsYXJhdGlvbiB0byBhIGNsYXNzIG5hbWUgdG8gYSB0eXBlIGRlY2xhcmF0aW9uLi4uCi0JCVN0cmluZyBkdHBKYXZhQ2xhc3NOYW1lID0gdGhpcy5nZXREZWZpbml0aW9uKGRhdGFUeXBlKS5nZXRKYXZhQ2xhc3NOYW1lKCk7Ci0JCXJldHVybiBuZXcgU2ltcGxlSmF2YVR5cGUoQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oZHRwSmF2YUNsYXNzTmFtZSkpOwotCX0KLQotCXByaXZhdGUgUHJlZGVmaW5lZERhdGFUeXBlRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKFByZWRlZmluZWREYXRhVHlwZSBkYXRhVHlwZSkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhYmFzZSgpLmdldERUUERlZmluaXRpb24oKS5nZXRQcmVkZWZpbmVkRGF0YVR5cGVEZWZpbml0aW9uKGRhdGFUeXBlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZGF0YVR5cGVJc0xPQigpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgUHJlZGVmaW5lZERhdGFUeXBlKSA/Ci0JCQkJCQlwcmltaXRpdmVUeXBlSXNMb2IoKChQcmVkZWZpbmVkRGF0YVR5cGUpIGRhdGFUeXBlKS5nZXRQcmltaXRpdmVUeXBlKCkpCi0JCQkJCToKLQkJCQkJCWZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0aGlzLmdldE5hbWUoKSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5kdHBDb2x1bW4gPT0gY29sdW1uOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgY2xlYXIoKSB7Ci0JCS8vIG5vIHN0YXRlIHRvIGNsZWFyCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBKREJDIHNwZWMgc2F5cyBKREJDIGRyaXZlcnMgc2hvdWxkIGJlIGFibGUgdG8gbWFwIEJMT0JzIGFuZCBDTE9CcwotCSAqIGRpcmVjdGx5LCBidXQgdGhlIEpQQSBzcGVjIGRvZXMgbm90IGFsbG93IHRoZW0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVR5cGUgY29udmVydFRvSlBBSmF2YVR5cGUoSmF2YVR5cGUgamF2YVR5cGUpIHsKLQkJaWYgKGphdmFUeXBlLmVxdWFscyhCTE9CX0pBVkFfVFlQRSkpIHsKLQkJCXJldHVybiBCWVRFX0FSUkFZX0pBVkFfVFlQRTsKLQkJfQotCQlpZiAoamF2YVR5cGUuZXF1YWxzKENMT0JfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIFNUUklOR19KQVZBX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIGphdmFUeXBlOwotCX0KLQotCS8qKgotCSAqIFRoZSBKUEEgc3BlYyBbMi4xLjRdIHNheXMgb25seSB0aGUgZm9sbG93aW5nIHR5cGVzIGFyZSBhbGxvd2VkIGluCi0JICogcHJpbWFyeSBrZXkgZmllbGRzOgotCSAqICAgICBbdmFyaWFibGVdIHByaW1pdGl2ZXMKLQkgKiAgICAgW3ZhcmlhYmxlXSBwcmltaXRpdmUgd3JhcHBlcnMKLQkgKiAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqICAgICBqYXZhLnV0aWwuRGF0ZQotCSAqICAgICBqYXZhLnNxbC5EYXRlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVR5cGUgY29udmVydFRvSlBBUHJpbWFyeUtleUphdmFUeXBlKEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCWlmIChqYXZhVHlwZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKCkKLQkJCQl8fCBqYXZhVHlwZS5pc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcigpCi0JCQkJfHwgamF2YVR5cGUuZXF1YWxzKFNUUklOR19KQVZBX1RZUEUpCi0JCQkJfHwgamF2YVR5cGUuZXF1YWxzKFVUSUxfREFURV9KQVZBX1RZUEUpCi0JCQkJfHwgamF2YVR5cGUuZXF1YWxzKFNRTF9EQVRFX0pBVkFfVFlQRSkpIHsKLQkJCXJldHVybiBqYXZhVHlwZTsKLQkJfQotCQlpZiAoamF2YVR5cGUuZXF1YWxzKEJJR19ERUNJTUFMX0pBVkFfVFlQRSkpIHsKLQkJCXJldHVybiBMT05HX0pBVkFfVFlQRTsgIC8vID8/Ci0JCX0KLQkJaWYgKGphdmFUeXBlLmVxdWFscyhTUUxfVElNRV9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gVVRJTF9EQVRFX0pBVkFfVFlQRTsgIC8vID8/PwotCQl9Ci0JCWlmIChqYXZhVHlwZS5lcXVhbHMoU1FMX1RJTUVTVEFNUF9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gVVRJTF9EQVRFX0pBVkFfVFlQRTsgIC8vID8/PwotCQl9Ci0JCS8vIGFsbCB0aGUgb3RoZXIgdHlwaWNhbCB0eXBlcyBhcmUgcHJldHR5IG11Y2ggdW4tbWFwcGFibGUgLSByZXR1cm4gU3RyaW5nKD8pCi0JCXJldHVybiBTVFJJTkdfSkFWQV9UWVBFOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJpbWl0aXZlVHlwZUlzTG9iKFByaW1pdGl2ZVR5cGUgcHJpbWl0aXZlVHlwZSkgewotCQlyZXR1cm4gKHByaW1pdGl2ZVR5cGUgPT0gUHJpbWl0aXZlVHlwZS5CSU5BUllfTEFSR0VfT0JKRUNUX0xJVEVSQUwpCi0JCQkJfHwgKHByaW1pdGl2ZVR5cGUgPT0gUHJpbWl0aXZlVHlwZS5DSEFSQUNURVJfTEFSR0VfT0JKRUNUX0xJVEVSQUwpCi0JCQkJfHwgKHByaW1pdGl2ZVR5cGUgPT0gUHJpbWl0aXZlVHlwZS5OQVRJT05BTF9DSEFSQUNURVJfTEFSR0VfT0JKRUNUX0xJVEVSQUwpOwotCX0KLQotCi0JLy8gKioqKiogc29tZSBjb25zdGFudHMgdXNlZCB3aGVuIGNvbnZlcnRpbmcgdGhlIGNvbHVtbiB0byBhIEphdmEgYXR0cmlidXRlCi0JLy8gVE9ETyBPYmplY3QgaXMgdGhlIGRlZmF1bHQ/Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgREVGQVVMVF9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBCTE9CX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnNxbC5CbG9iLmNsYXNzKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBCWVRFX0FSUkFZX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShieXRlW10uY2xhc3MpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgQ0xPQl9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5zcWwuQ2xvYi5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgU1RSSU5HX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIFVUSUxfREFURV9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLkRhdGUuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIFNRTF9EQVRFX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnNxbC5EYXRlLmNsYXNzKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBTUUxfVElNRV9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5zcWwuVGltZS5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgU1FMX1RJTUVTVEFNUF9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIEJJR19ERUNJTUFMX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgTE9OR19KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUobG9uZy5jbGFzcyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjg4MzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcjE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Qcm9maWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogV3JhcCB0aGUgRFRQIFByb2ZpbGVNYW5hZ2VyIGluIHlldCBhbm90aGVyIHNpbmdsZXRvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeQotCWltcGxlbWVudHMgQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBQcm9maWxlTWFuYWdlciBkdHBQcm9maWxlTWFuYWdlcjsKLQotCXByaXZhdGUgTG9jYWxQcm9maWxlTGlzdGVuZXIgcHJvZmlsZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgc3RhdGljIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqICdwcml2YXRlJyB0byBlbnN1cmUgc2luZ2xldG9uCi0JICovCi0JcHJpdmF0ZSBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpZmVjeWNsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBjYWxsZWQgYnkgcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlciA9IFByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCXRoaXMucHJvZmlsZUxpc3RlbmVyID0gbmV3IExvY2FsUHJvZmlsZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIuYWRkUHJvZmlsZUxpc3RlbmVyKHRoaXMucHJvZmlsZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjYWxsZWQgYnkgcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLnJlbW92ZVByb2ZpbGVMaXN0ZW5lcih0aGlzLnByb2ZpbGVMaXN0ZW5lcik7Ci0JCXRoaXMucHJvZmlsZUxpc3RlbmVyID0gbnVsbDsKLQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlciA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gcHJvZmlsZXMgKioqKioqKioqKgotCi0JcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIG5hbWUsIERhdGFiYXNlRmluZGVyIGZpbmRlcikgewotCQlmb3IgKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlIDogdGhpcy5kdHBQcm9maWxlTWFuYWdlci5nZXRQcm9maWxlcygpKSB7Ci0JCQlpZiAoZHRwUHJvZmlsZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIG5ldyBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIoZHRwUHJvZmlsZSwgZmluZGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUsIERhdGFiYXNlRmluZGVyLlNpbXBsZS5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8SUNvbm5lY3Rpb25Qcm9maWxlLCBTdHJpbmc+KHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCQkgcmV0dXJuIGR0cFByb2ZpbGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SUNvbm5lY3Rpb25Qcm9maWxlPiBkdHBDb25uZWN0aW9uUHJvZmlsZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxJQ29ubmVjdGlvblByb2ZpbGU+KHRoaXMuZHRwUHJvZmlsZU1hbmFnZXIuZ2V0UHJvZmlsZXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5wcm9maWxlTGlzdGVuZXIuYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucHJvZmlsZUxpc3RlbmVyLnJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGb3J3YXJkIGV2ZW50cyB0byB0aGUgZmFjdG9yeSdzIGxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIExvY2FsUHJvZmlsZUxpc3RlbmVyIGltcGxlbWVudHMgSVByb2ZpbGVMaXN0ZW5lcjEgewotCQlwcml2YXRlIFZlY3RvcjxDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgVmVjdG9yPENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI+KCk7Ci0KLQkJTG9jYWxQcm9maWxlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJdm9pZCBhZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5saXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCi0JCXByaXZhdGUgSXRlcmF0b3I8Q29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcj4gbGlzdGVuZXJzKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI+KHRoaXMubGlzdGVuZXJzKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogSVByb2ZpbGVMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIHZvaWQgcHJvZmlsZUFkZGVkKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGR0cFByb2ZpbGUuZ2V0TmFtZSgpOwotCQkJZm9yIChJdGVyYXRvcjxDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyPiBzdHJlYW0gPSB0aGlzLmxpc3RlbmVycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlzdHJlYW0ubmV4dCgpLmNvbm5lY3Rpb25Qcm9maWxlQWRkZWQobmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9maWxlQ2hhbmdlZChJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSwgU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBvbGREZXNjcmlwdGlvbiwgQm9vbGVhbiBvbGRBdXRvQ29ubmVjdCkgewotCQkJU3RyaW5nIG5ld05hbWUgPSBkdHBQcm9maWxlLmdldE5hbWUoKTsKLQkJCWlmICggISBuZXdOYW1lLmVxdWFscyhvbGROYW1lKSkgewotCQkJCWZvciAoSXRlcmF0b3I8Q29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcj4gc3RyZWFtID0gdGhpcy5saXN0ZW5lcnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJCXN0cmVhbS5uZXh0KCkuY29ubmVjdGlvblByb2ZpbGVSZW5hbWVkKG9sZE5hbWUsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVDaGFuZ2VkKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQkvLyB0aGlzIG1ldGhvZCBzaG91bGRuJ3QgYmUgY2FsbGVkIG9uIElQcm9maWxlTGlzdGVuZXIxCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVEZWxldGVkKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGR0cFByb2ZpbGUuZ2V0TmFtZSgpOwotCQkJZm9yIChJdGVyYXRvcjxDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyPiBzdHJlYW0gPSB0aGlzLmxpc3RlbmVycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlzdHJlYW0ubmV4dCgpLmNvbm5lY3Rpb25Qcm9maWxlUmVtb3ZlZChuYW1lKTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2I4ZDk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Db25uZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JTWFuYWdlZENvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JTWFuYWdlZENvbm5lY3Rpb25PZmZsaW5lTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLkRyaXZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLmpkYmMuSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUuY29ubmVjdGlvbi5Db25uZWN0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuY29yZS5EYXRhYmFzZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLmNvcmUucHJvZmlsZS5Qcm9maWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIENvbm5lY3Rpb25Qcm9maWxlCi0gKi8KLWZpbmFsIGNsYXNzIERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlcgotCWltcGxlbWVudHMgRFRQRGF0YWJhc2VPYmplY3QsIENvbm5lY3Rpb25Qcm9maWxlCi17Ci0JLy8gdGhlIHdyYXBwZWQgRFRQIGNvbm5lY3Rpb24gcHJvZmlsZQotCXByaXZhdGUgZmluYWwgSUNvbm5lY3Rpb25Qcm9maWxlIGR0cENvbm5lY3Rpb25Qcm9maWxlOwotCi0JLy8gZmluZGVyIHN1cHBsaWVkIGJ5IHRoZSBKUEEgcGxhdGZvcm0gKGRldGVybWluZXMgY2FzZS1zZW5zaXRpdml0eSwgZXRjLikKLQlwcml2YXRlIGZpbmFsIERhdGFiYXNlRmluZGVyIGZpbmRlcjsKLQotCS8vIGNhbGxiYWNrIHBhc3NlZCB0byB0aGUgZmluZGVyCi0JcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUZpbmRlci5EZWZhdWx0Q2FsbGJhY2sgZGF0YWJhc2VGaW5kZXJDYWxsYmFjazsKLQotCS8vIHRoZSBEVFAgbWFuYWdlZCBjb25uZWN0aW9uIHdlIGxpc3RlbiB0bwotCXByaXZhdGUgZmluYWwgSU1hbmFnZWRDb25uZWN0aW9uIGR0cE1hbmFnZWRDb25uZWN0aW9uOwotCi0JLy8gZm9yd2FyZCBldmVudHMgZnJvbSB0aGUgRFRQIG1hbmFnZWQgY29ubmVjdGlvbiBhYm92ZTsKLQkvLyB3ZSBsaXN0ZW4gYW5kIHByb3BhZ2F0ZSBldmVudHMgaWZmIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcwotCXByaXZhdGUgZmluYWwgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCi0JLy8gbGF6eS1pbml0aWFsaXplZCwgYW5kIGRlbGV0ZWQgYXQgZGlzY29ubmVjdAotCXByaXZhdGUgRFRQRGF0YWJhc2VXcmFwcGVyIGRhdGFiYXNlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElWRV9EVFBfQ09OTkVDVElPTl9UWVBFID0gImphdmEuc3FsLkNvbm5lY3Rpb24iOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9GRkxJTkVfRFRQX0NPTk5FQ1RJT05fVFlQRSA9IENvbm5lY3Rpb25JbmZvLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9QUk9EVUNUX1BST1BfSUQgPSAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zZXJ2ZXIudmVyc2lvbiI7ICAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyKElDb25uZWN0aW9uUHJvZmlsZSBkdHBDb25uZWN0aW9uUHJvZmlsZSwgRGF0YWJhc2VGaW5kZXIgZmluZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUgPSBkdHBDb25uZWN0aW9uUHJvZmlsZTsKLQkJdGhpcy5maW5kZXIgPSBmaW5kZXI7Ci0JCXRoaXMuZGF0YWJhc2VGaW5kZXJDYWxsYmFjayA9IG5ldyBEYXRhYmFzZUZpbmRlckNhbGxiYWNrKCk7Ci0JCXRoaXMuZHRwTWFuYWdlZENvbm5lY3Rpb24gPSB0aGlzLmJ1aWxkRFRQTWFuYWdlZENvbm5lY3Rpb24oKTsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSBuZXcgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJLy8gZG9uJ3QgbGlzdGVuIHRvIHRoZSBtYW5hZ2VkIGNvbm5lY3Rpb24geWV0Ci0JfQotCi0JcHJpdmF0ZSBJTWFuYWdlZENvbm5lY3Rpb24gYnVpbGREVFBNYW5hZ2VkQ29ubmVjdGlvbigpIHsKLQkJU3RyaW5nIGNvbm5lY3Rpb25UeXBlID0gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5zdXBwb3J0c1dvcmtPZmZsaW5lTW9kZSgpID8KLQkJCQlPRkZMSU5FX0RUUF9DT05ORUNUSU9OX1RZUEUgOiBMSVZFX0RUUF9DT05ORUNUSU9OX1RZUEU7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmdldE1hbmFnZWRDb25uZWN0aW9uKGNvbm5lY3Rpb25UeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGF0YWJhc2VPYmplY3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uSWRlbnRpZmllcihTdHJpbmcgamF2YUlkZW50aWZpZXIpIHsKLQkJLy8gY29ubmVjdGlvbiBwcm9maWxlcyBzaG91bGQgbm90IGJlIGluIEphdmEgYW5ub3RhdGlvbnMKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uSWRlbnRpZmllcigpIHsKLQkJLy8gY29ubmVjdGlvbiBwcm9maWxlcyBzaG91bGQgbm90IGJlIGluIEphdmEgYW5ub3RhdGlvbnMKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUERhdGFiYXNlT2JqZWN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRFRQRGF0YWJhc2VXcmFwcGVyIGdldERhdGFiYXNlKCkgewotCQlpZiAodGhpcy5kYXRhYmFzZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmRhdGFiYXNlID0gdGhpcy5idWlsZERhdGFiYXNlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbm5lY3Rpb25Qcm9maWxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHByb3BlcnRpZXMKLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVySUQoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmdldFByb3ZpZGVySWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbmNlSUQoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmdldEluc3RhbmNlSUQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX05BTUVfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZVByb2R1Y3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KERBVEFCQVNFX1BST0RVQ1RfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFTkRPUl9QUk9QX0lEKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFUlNJT05fUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EUklWRVJfQ0xBU1NfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VUkxfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKLQkJU3RyaW5nIHVzZXJOYW1lID0gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVNFUk5BTUVfUFJPUF9JRCk7Ci0JCS8vIDIwODk0NiBoYW5kbGUgdXNlcm5hbWUgbGlrZSAic3lzIGFzIHN5c2RiYSIgb24gT3JhY2xlCi0JCWludCBpbmRleCA9IHVzZXJOYW1lLmluZGV4T2YoJyAnKTsKLQkJcmV0dXJuIChpbmRleCA9PSAtMSkgPyB1c2VyTmFtZSA6IHVzZXJOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVc2VyUGFzc3dvcmQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QQVNTV09SRF9QUk9QX0lEKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoRFJJVkVSX0RFRklOSVRJT05fUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJKYXJMaXN0KCkgewotCQlyZXR1cm4gRHJpdmVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldERyaXZlckluc3RhbmNlQnlJRCh0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpKS5nZXRKYXJMaXN0KCk7Ci0JfQotCi0JLy8gKioqKiogY29ubmVjdGlvbgotCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpIHx8IHRoaXMuaXNXb3JraW5nT2ZmbGluZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5hY3RpdmUoKSB7Ci0JCXJldHVybiAhIHRoaXMuaXNBY3RpdmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwTWFuYWdlZENvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKQotCQkJCSYmICEgdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbi5pc1dvcmtpbmdPZmZsaW5lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXNjb25uZWN0ZWQoKSB7Ci0JCXJldHVybiAhIHRoaXMuaXNDb25uZWN0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KCkgewotCQlpZiAodGhpcy5pc0Rpc2Nvbm5lY3RlZCgpKSB7Ci0JCQl0aGlzLmNoZWNrU3RhdHVzKHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotCQl0aGlzLmNoZWNrU3RhdHVzKHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpKTsKLQl9Ci0KLQkvLyAqKioqKiBvZmYtbGluZSBzdXBwb3J0Ci0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nT2ZmbGluZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwTWFuYWdlZENvbm5lY3Rpb24uaXNXb3JraW5nT2ZmbGluZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzV29ya09mZmxpbmVNb2RlKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5zdXBwb3J0c1dvcmtPZmZsaW5lTW9kZSgpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHNhdmVXb3JrT2ZmbGluZURhdGEoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLnNhdmVXb3JrT2ZmbGluZURhdGEoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuV29ya09mZmxpbmUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmNhbldvcmtPZmZsaW5lKCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgd29ya09mZmxpbmUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLndvcmtPZmZsaW5lKCk7Ci0JfQotCQotCS8vICoqKioqIGxpc3RlbmVycwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsgIC8vIGZpcnN0IGxpc3RlbmVyIGFkZGVkCi0JCQl0aGlzLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCX0KLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCXRoaXMuZHRwTWFuYWdlZENvbm5lY3Rpb24uYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZGF0YWJhc2UgIT0gbnVsbCkgeyAgLy8gZG9uJ3QgdHJpZ2dlciBkYXRhYmFzZSBjcmVhdGlvbgotCQkJaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgeyAgLy8gRFRQIGRvZXMgbm90IGNoYW5nZSB3aGVuIG9mZi1saW5lCi0JCQkJdGhpcy5kYXRhYmFzZS5zdGFydExpc3RlbmluZygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgeyAgLy8gbGFzdCBsaXN0ZW5lciByZW1vdmVkCi0JCQl0aGlzLnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5kYXRhYmFzZSAhPSBudWxsKSB7ICAvLyBkb24ndCB0cmlnZ2VyIGRhdGFiYXNlIGNyZWF0aW9uCi0JCQlpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7ICAvLyBEVFAgZG9lcyBub3QgY2hhbmdlIHdoZW4gb2ZmLWxpbmUKLQkJCQl0aGlzLmRhdGFiYXNlLnN0b3BMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJfQotCQl0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmhhc05vTGlzdGVuZXJzKCk7Ci0JfQotCi0JYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5oYXNBbnlMaXN0ZW5lcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgY2hlY2tTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJZm9yIChJU3RhdHVzIGNoaWxkIDogc3RhdHVzLmdldENoaWxkcmVuKCkpIHsKLQkJCQl0aGlzLmNoZWNrU3RhdHVzKGNoaWxkKTsgIC8vIHJlY3Vyc2UsIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCBlcnJvcgotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHN0YXR1cy5nZXRNZXNzYWdlKCksIHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBEVFBEYXRhYmFzZVdyYXBwZXIgYnVpbGREYXRhYmFzZSgpIHsKLQkJaWYgKHRoaXMuaXNJbmFjdGl2ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICh0aGlzLmlzV29ya2luZ09mZmxpbmUoKSkgewotCQkJQ29ubmVjdGlvbkluZm8gY29ubmVjdGlvbkluZm8gPSAoQ29ubmVjdGlvbkluZm8pIHRoaXMuZHRwTWFuYWdlZENvbm5lY3Rpb24uZ2V0Q29ubmVjdGlvbigpLmdldFJhd0Nvbm5lY3Rpb24oKTsKLQkJCXJldHVybiBuZXcgRFRQRGF0YWJhc2VXcmFwcGVyKHRoaXMsIGNvbm5lY3Rpb25JbmZvLmdldFNoYXJlZERhdGFiYXNlKCkpOwotCQl9Ci0KLQkJLy8gVE9ETyBzZWUgRFRQIGJ1ZyAyMDIzMDYKLQkJLy8gcGFzcyBjb25uZWN0PXRydWUgaW4gdG8gUHJvZmlsZVV0aWwuZ2V0RGF0YWJhc2UoKQotCQkvLyB0aGVyZSBpcyBhIGJ1ZyBtZW50aW9uZWQgaW4gYSBjb21tZW50OiAKLQkJLy8gICAgICJkdXJpbmcgdGhlIHByb2ZpbGUgY29ubmVjdGVkIGV2ZW50IG5vdGlmaWNhdGlvbiwgCi0JCS8vICAgICBJTWFuYWdlZENvbm5lY3Rpb24gaXMgY29ubmVjdGVkIHdoaWxlIElDb25uZWN0aW9uUHJvZmlsZSBpcyBub3QiCi0JCS8vIHNvLCBzb21lIGhhY2tlcnkgaGVyZSB0byBoYW5kbGUgaGFja2VyeSB0aGVyZQotCQlyZXR1cm4gbmV3IERUUERhdGFiYXNlV3JhcHBlcih0aGlzLCBQcm9maWxlVXRpbC5nZXREYXRhYmFzZShuZXcgRGF0YWJhc2VJZGVudGlmaWVyKHRoaXMuZ2V0TmFtZSgpLCB0aGlzLmdldERhdGFiYXNlTmFtZSgpKSwgdHJ1ZSkpOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyRGF0YWJhc2UoKSB7Ci0JCWlmICh0aGlzLmRhdGFiYXNlICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHsgIC8vIERUUCBkb2VzIG5vdCBjaGFuZ2Ugd2hlbiBvZmYtbGluZQotCQkJCXRoaXMuZGF0YWJhc2Uuc3RvcExpc3RlbmluZygpOwotCQkJfQotCQkJdGhpcy5kYXRhYmFzZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB3aGVuZXZlciB3ZSBuZWVkIHRvIGZpbmQgYSBjb21wb25lbnQgYnkgbmFtZQotCSAqIChlLmcuIFRhYmxlLmdldENvbHVtbk5hbWVkKFN0cmluZykpLiBXZSBjaGFubmVsIGFsbCB0aGUgY2FsbHMgdG8gaGVyZQotCSAqIGFuZCB0aGVuIHdlIGRlbGVnYXRlIHRvIHRoZSBKUEEgcGxhdGZvcm0tc3VwcGxpZWQgImRhdGFiYXNlIGZpbmRlciIuCi0JICovCi0JPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBnZXREYXRhYmFzZU9iamVjdE5hbWVkKFRbXSBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmZpbmRlci5nZXREYXRhYmFzZU9iamVjdE5hbWVkKGRhdGFiYXNlT2JqZWN0cywgbmFtZSwgdGhpcy5kYXRhYmFzZUZpbmRlckNhbGxiYWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCAiZGF0YWJhc2UgZmluZGVyIiBjYWxscyBiYWNrIHRvIGhlcmUgc28gd2UgY2FuIGRlbGVnYXRlIHRvCi0JICogdGhlIGRhdGFiYXNlLCB3aGljaCBjb250YWlucyBhbGwgdGhlIHN0YXRlIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBtYXRjaAotCSAqIGlkZW50aWZpZXJzLgotCSAqLwotCTxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgZ2V0RGF0YWJhc2VPYmplY3ROYW1lZF8oVFtdIGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIG5hbWUpIHsKLQkJLy8gdGhlIGRhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCBoZXJlIC0gY2FsbCBpdHMgaW50ZXJuYWwgbWV0aG9kCi0JCXJldHVybiB0aGlzLmRhdGFiYXNlLmdldERhdGFiYXNlT2JqZWN0TmFtZWRfKGRhdGFiYXNlT2JqZWN0cywgbmFtZSk7Ci0JfQotCi0Jdm9pZCBkYXRhYmFzZUNoYW5nZWQoRFRQRGF0YWJhc2VXcmFwcGVyIGRiKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmRhdGFiYXNlQ2hhbmdlZChkYik7Ci0JfQotCi0Jdm9pZCBjYXRhbG9nQ2hhbmdlZChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmNhdGFsb2dDaGFuZ2VkKGNhdGFsb2cpOwotCX0KLQotCXZvaWQgc2NoZW1hQ2hhbmdlZChEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSkgewotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5zY2hlbWFDaGFuZ2VkKHNjaGVtYSk7Ci0JfQotCi0Jdm9pZCBzZXF1ZW5jZUNoYW5nZWQoRFRQU2VxdWVuY2VXcmFwcGVyIHNlcXVlbmNlKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnNlcXVlbmNlQ2hhbmdlZChzZXF1ZW5jZSk7Ci0JfQotCi0Jdm9pZCB0YWJsZUNoYW5nZWQoRFRQVGFibGVXcmFwcGVyIHRhYmxlKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnRhYmxlQ2hhbmdlZCh0YWJsZSk7Ci0JfQotCi0Jdm9pZCBjb2x1bW5DaGFuZ2VkKERUUENvbHVtbldyYXBwZXIgY29sdW1uKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmNvbHVtbkNoYW5nZWQoY29sdW1uKTsKLQl9Ci0KLQl2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKERUUEZvcmVpZ25LZXlXcmFwcGVyIGZvcmVpZ25LZXkpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuZm9yZWlnbktleUNoYW5nZWQoZm9yZWlnbktleSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRCYXNlUHJvcGVydGllcygpLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbXBhcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBjb21wYXJlVG8oQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUpIHsKLQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0aGlzLmdldE5hbWUoKSwgY29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQIGNvbm5lY3Rpb24gbGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBsaXN0ZW5lciB0cmFuc2xhdGVzIGFuZCBmb3J3YXJkcyBJTWFuYWdlZENvbm5lY3Rpb25MaXN0ZW5lciBhbmQKLQkgKiBJTWFuYWdlZENvbm5lY3Rpb25PZmZsaW5lTGlzdGVuZXIgZXZlbnRzIHRvIENvbm5lY3Rpb25MaXN0ZW5lcnMuCi0JICovCi0JY2xhc3MgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJTWFuYWdlZENvbm5lY3Rpb25PZmZsaW5lTGlzdGVuZXIgewotCQlwcml2YXRlIFZlY3RvcjxDb25uZWN0aW9uTGlzdGVuZXI+IGxpc3RlbmVycyA9IG5ldyBWZWN0b3I8Q29ubmVjdGlvbkxpc3RlbmVyPigpOwotCi0JCUxvY2FsQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5saXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCi0JCXByaXZhdGUgSXRlcmF0b3I8Q29ubmVjdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8Q29ubmVjdGlvbkxpc3RlbmVyPih0aGlzLmxpc3RlbmVycyk7Ci0JCX0KLQotCQlib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQkJcmV0dXJuIHRoaXMubGlzdGVuZXJzLmlzRW1wdHkoKTsKLQkJfQotCi0JCWJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKCkgewotCQkJcmV0dXJuICEgdGhpcy5saXN0ZW5lcnMuaXNFbXB0eSgpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIElNYW5hZ2VkQ29ubmVjdGlvbkxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQkvLyBvZmYtbGluZSBvciBpbmFjdGl2ZSA9PiBsaXZlCi0JCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGRvIG5vdCBidWlsZCB0aGUgZGF0YWJhc2UgaGVyZSAtIGl0IGlzIGJ1aWx0IG9uLWRlbWFuZAotCQkJLy8gZm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkJCWZvciAoSXRlcmF0b3I8Q29ubmVjdGlvbkxpc3RlbmVyPiBzdHJlYW0gPSB0aGlzLmxpc3RlbmVycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlzdHJlYW0ubmV4dCgpLm9wZW5lZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkIGZyb20gdGhlIGJhc2UgRFRQIGNvZGUuCi0JCSAqIFBlcmhhcHMgRFRQIGV4dGVuZGVycyBjYWxsIGl0Li4uLgotCQkgKiBAc2VlIE1hbmFnZWRDb25uZWN0aW9uI2ZpcmVNb2RpZmllZEV2ZW50KE9iamVjdCkKLQkJICogICAgIHdoaWNoIGlzIG5ldmVyIGNhbGxlZC4uLgotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBmb3J3YXJkIGV2ZW50IHRvIGxpc3RlbmVycwotCQkJZm9yIChJdGVyYXRvcjxDb25uZWN0aW9uTGlzdGVuZXI+IHN0cmVhbSA9IHRoaXMubGlzdGVuZXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXN0cmVhbS5uZXh0KCkubW9kaWZpZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gZm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkJCWZvciAoSXRlcmF0b3I8Q29ubmVjdGlvbkxpc3RlbmVyPiBzdHJlYW0gPSB0aGlzLmxpc3RlbmVycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlpZiAoICEgc3RyZWFtLm5leHQoKS5va1RvQ2xvc2UoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JCQlmb3IgKEl0ZXJhdG9yPENvbm5lY3Rpb25MaXN0ZW5lcj4gc3RyZWFtID0gdGhpcy5saXN0ZW5lcnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJc3RyZWFtLm5leHQoKS5hYm91dFRvQ2xvc2UoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMpOwotCQkJfQotCQl9Ci0KLQkJLy8gbGl2ZSBvciBvZmYtbGluZSA9PiBpbmFjdGl2ZQotCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjbGVhciB0aGUgZGF0YWJhc2UKLQkJCURUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLmNsZWFyRGF0YWJhc2UoKTsKLQkJCS8vIGZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JCQlmb3IgKEl0ZXJhdG9yPENvbm5lY3Rpb25MaXN0ZW5lcj4gc3RyZWFtID0gdGhpcy5saXN0ZW5lcnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJc3RyZWFtLm5leHQoKS5jbG9zZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMpOwotCQkJfQotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIElNYW5hZ2VkQ29ubmVjdGlvbk9mZmxpbmVMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJLy8gbGl2ZSA9PiBvZmYtbGluZQotCQlwdWJsaWMgYm9vbGVhbiBva1RvRGV0YWNoKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gY29udmVydCB0aGUgZXZlbnQgdG8gYW4gIm9rIHRvIGNsb3NlIiBldmVudDsKLQkJCS8vIHdlIGFyZSAiY2xvc2luZyIgdGhlIGxpdmUgY29ubmVjdGlvbgotCQkJcmV0dXJuIHRoaXMub2tUb0Nsb3NlKGV2ZW50KTsKLQkJfQotCQkKLQkJLy8gbGl2ZSA9PiBvZmYtbGluZQotCQlwdWJsaWMgdm9pZCBhYm91dFRvRGV0YWNoKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gY29udmVydCB0aGUgZXZlbnQgdG8gYSAiY2xvc2UiIGV2ZW50OwotCQkJLy8gd2UgYXJlICJjbG9zaW5nIiB0aGUgbGl2ZSBjb25uZWN0aW9uCi0JCQl0aGlzLmNsb3NlZChldmVudCk7Ci0JCX0KLQotCQkvLyBpbmFjdGl2ZSBvciBsaXZlID0+IG9mZi1saW5lCi0JCXB1YmxpYyB2b2lkIHdvcmtpbmdPZmZsaW5lKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gY29udmVydCB0aGUgZXZlbnQgdG8gYW4gIm9wZW4iIGV2ZW50OwotCQkJLy8gd2UgYXJlICJvcGVuaW5nIiB0aGUgb2ZmLWxpbmUgY29ubmVjdGlvbgotCQkJdGhpcy5vcGVuZWQoZXZlbnQpOwotCQl9Ci0KLQkJLy8gb2ZmLWxpbmUgPT4gbGl2ZQotCQlwdWJsaWMgdm9pZCBhYm91dFRvQXR0YWNoKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gY29udmVydCB0aGUgZXZlbnQgdG8gYW4gImNsb3NlIiBldmVudDsKLQkJCS8vIHdlIGFyZSAiY2xvc2luZyIgdGhlIG9mZi1saW5lIGNvbm5lY3Rpb24KLQkJCXRoaXMuY2xvc2VkKGV2ZW50KTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCQl2b2lkIGRhdGFiYXNlQ2hhbmdlZChEVFBEYXRhYmFzZVdyYXBwZXIgZGIpIHsKLQkJCWZvciAoSXRlcmF0b3I8Q29ubmVjdGlvbkxpc3RlbmVyPiBzdHJlYW0gPSB0aGlzLmxpc3RlbmVycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlzdHJlYW0ubmV4dCgpLmRhdGFiYXNlQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgZGIpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBjYXRhbG9nQ2hhbmdlZChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPENvbm5lY3Rpb25MaXN0ZW5lcj4gc3RyZWFtID0gdGhpcy5saXN0ZW5lcnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJc3RyZWFtLm5leHQoKS5jYXRhbG9nQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgY2F0YWxvZyk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIHNjaGVtYUNoYW5nZWQoRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEpIHsKLQkJCWZvciAoSXRlcmF0b3I8Q29ubmVjdGlvbkxpc3RlbmVyPiBzdHJlYW0gPSB0aGlzLmxpc3RlbmVycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlzdHJlYW0ubmV4dCgpLnNjaGVtYUNoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIHNjaGVtYSk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIHNlcXVlbmNlQ2hhbmdlZChEVFBTZXF1ZW5jZVdyYXBwZXIgc2VxdWVuY2UpIHsKLQkJCWZvciAoSXRlcmF0b3I8Q29ubmVjdGlvbkxpc3RlbmVyPiBzdHJlYW0gPSB0aGlzLmxpc3RlbmVycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlzdHJlYW0ubmV4dCgpLnNlcXVlbmNlQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgc2VxdWVuY2UpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCB0YWJsZUNoYW5nZWQoRFRQVGFibGVXcmFwcGVyIHRhYmxlKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPENvbm5lY3Rpb25MaXN0ZW5lcj4gc3RyZWFtID0gdGhpcy5saXN0ZW5lcnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJc3RyZWFtLm5leHQoKS50YWJsZUNoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIHRhYmxlKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgY29sdW1uQ2hhbmdlZChEVFBDb2x1bW5XcmFwcGVyIGNvbHVtbikgewotCQkJZm9yIChJdGVyYXRvcjxDb25uZWN0aW9uTGlzdGVuZXI+IHN0cmVhbSA9IHRoaXMubGlzdGVuZXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXN0cmVhbS5uZXh0KCkuY29sdW1uQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgY29sdW1uKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgZm9yZWlnbktleUNoYW5nZWQoRFRQRm9yZWlnbktleVdyYXBwZXIgZm9yZWlnbktleSkgewotCQkJZm9yIChJdGVyYXRvcjxDb25uZWN0aW9uTGlzdGVuZXI+IHN0cmVhbSA9IHRoaXMubGlzdGVuZXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXN0cmVhbS5uZXh0KCkuZm9yZWlnbktleUNoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIGZvcmVpZ25LZXkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBEYXRhYmFzZUZpbmRlciAqKioqKioqKioqCi0KLQljbGFzcyBEYXRhYmFzZUZpbmRlckNhbGxiYWNrIGltcGxlbWVudHMgRGF0YWJhc2VGaW5kZXIuRGVmYXVsdENhbGxiYWNrIHsKLQkJcHVibGljIDxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgZ2V0RGF0YWJhc2VPYmplY3ROYW1lZChUW10gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgbmFtZSkgewotCQkJLy8gY2FsbCBiYWNrIHRvIHRoZSBpbnRlcm5hbCBtZXRob2QKLQkJCXJldHVybiBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcy5nZXREYXRhYmFzZU9iamVjdE5hbWVkXyhkYXRhYmFzZU9iamVjdHMsIG5hbWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3NmZlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VPYmplY3Q7Ci0KLS8qKgotICogRFRQIGRhdGFiYXNlIG9iamVjdAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUUERhdGFiYXNlT2JqZWN0IGV4dGVuZHMgRGF0YWJhc2VPYmplY3QgewotCi0JLyoqCi0JICogY292YXJpYW50IG92ZXJyaWRlCi0JICovCi0JRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyIGdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0V3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZDU3ZGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLlJlZnJlc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiAgRFRQIENhdGFsb2cgT2JqZWN0IFdyYXBwZXIgYmFzZSBjbGFzcwotICovCi1hYnN0cmFjdCBjbGFzcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIKLQlpbXBsZW1lbnRzIERUUERhdGFiYXNlT2JqZWN0Ci17Ci0JLy8gd2UgbmVlZCBhIHdheSB0byBnZXQgdG8gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZQotCXByaXZhdGUgZmluYWwgRFRQRGF0YWJhc2VPYmplY3QgcGFyZW50OwotCi0JLy8gbGlzdGVuIGZvciB0aGUgImNhdGFsb2cgb2JqZWN0IiBiZWluZyByZWZyZXNoZWQKLQlwcml2YXRlIGZpbmFsIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgY2F0YWxvZ09iamVjdExpc3RlbmVyOwotCi0JLy8gbGlzdGVuIGZvciB0aGlzIERUUCBjYXRhbG9nIG9iamVjdCB0byByZWZyZXNoCi0JZmluYWwgSUNhdGFsb2dPYmplY3QgY2F0YWxvZ09iamVjdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyKERUUERhdGFiYXNlT2JqZWN0IHBhcmVudCwgT2JqZWN0IGR0cE9iamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQkvLyB3ZSBvbmx5IGxpc3RlbiB0byAibGl2ZSIgY29ubmVjdGlvbnMgKGFzIG9wcG9zZWQgdG8gIm9mZi1saW5lIiBjb25uZWN0aW9ucykKLQkJCXRoaXMuY2F0YWxvZ09iamVjdCA9IChJQ2F0YWxvZ09iamVjdCkgZHRwT2JqZWN0OwotCQkJdGhpcy5jYXRhbG9nT2JqZWN0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2F0YWxvZ09iamVjdExpc3RlbmVyKCk7Ci0JCQlpZiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmhhc0FueUxpc3RlbmVycygpKSB7Ci0JCQkJdGhpcy5zdGFydExpc3RlbmluZygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5jYXRhbG9nT2JqZWN0ID0gbnVsbDsKLQkJCXRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgSUNhdGFsb2dPYmplY3RMaXN0ZW5lciBidWlsZENhdGFsb2dPYmplY3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2F0YWxvZ09iamVjdExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJQ2F0YWxvZ09iamVjdCBkbUVsZW1lbnQsIGludCBldmVudFR5cGUpIHsKLQkJCQlpZiAoZG1FbGVtZW50ID09IERUUERhdGFiYXNlT2JqZWN0V3JhcHBlci50aGlzLmNhdGFsb2dPYmplY3QpIHsKLQkJCQkJLy8gJ2V2ZW50VHlwZScgZG9lc24ndCBzZWVtIHRvIGJlIHZlcnkgdXNlZnVsLCBzbyBkcm9wIGl0Ci0JCQkJCURUUERhdGFiYXNlT2JqZWN0V3JhcHBlci50aGlzLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8vIHR5cGljYWxseSwgbm90aWZ5IHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgc29tZXRoaW5nIGhhcyBjaGFuZ2VkCi0Jdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBEVFAgb2JqZWN0IGhhcyBjaGFuZ2VkLCBjbGVhciB0aGUgd3JhcHBlcidzIHN0YXRlIHNvIGl0IHdpbGwgYmUKLQkgKiBzeW5jaHJvbml6ZWQgb24tZGVtYW5kLgotCSAqLwotCWFic3RyYWN0IHZvaWQgY2xlYXIoKTsKLQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JRFRQRGF0YWJhc2VPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCi0JcHVibGljIERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlciBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCi0JcHVibGljIERUUERhdGFiYXNlV3JhcHBlciBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHdoZW5ldmVyIHdlIG5lZWQgdG8gZmluZCBhIGNvbXBvbmVudCBieSBuYW1lCi0JICogKGUuZy4gVGFibGUuZ2V0Q29sdW1uTmFtZWQoU3RyaW5nKSkuIFdlIGNoYW5uZWwgYWxsIHRoZSBjYWxscyB0byB0aGUKLQkgKiBjb25uZWN0aW9uIHByb2ZpbGUsIHdoaWNoIHRoZW4gZGVsZWdhdGVzIHRvIHRoZSBKUEEgcGxhdGZvcm0tCi0JICogc3VwcGxpZWQgImRhdGFiYXNlIGZpbmRlciIuCi0JICovCi0JPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBnZXREYXRhYmFzZU9iamVjdE5hbWVkKFRbXSBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0RGF0YWJhc2VPYmplY3ROYW1lZChkYXRhYmFzZU9iamVjdHMsIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEV4YW1wbGVzOgotCSAqIE9yYWNsZSBldGMuCi0JICogICAgIFRhYmxlKEZPTykgdnMuICJGb28iID0+IG51bGwKLQkgKiAgICAgVGFibGUoQkFSKSB2cy4gIkZvbyIgPT4gIkJBUiIKLQkgKiAgICAgVGFibGUoRm9vKSB2cy4gIkZvbyIgPT4gIlwiRm9vXCIiCi0JICogICAgIFRhYmxlKEJhcikgdnMuICJGb28iID0+ICJcIkJhclwiIgotCSAqICAgICAKLQkgKiBQb3N0Z3JlU1FMIGV0Yy4KLQkgKiAgICAgVGFibGUoZm9vKSB2cy4gIkZvbyIgPT4gbnVsbAotCSAqICAgICBUYWJsZShiYXIpIHZzLiAiRm9vIiA9PiAiYmFyIgotCSAqICAgICBUYWJsZShGb28pIHZzLiAiRm9vIiA9PiAiXCJGb29cIiIKLQkgKiAgICAgVGFibGUoQmFyKSB2cy4gIkZvbyIgPT4gIlwiQmFyXCIiCi0JICogICAgIAotCSAqIFNRTCBTZXJ2ZXIgZXRjLgotCSAqICAgICBUYWJsZShGb28pIHZzLiAiRm9vIiA9PiBudWxsCi0JICogICAgIFRhYmxlKGZvbykgdnMuICJGb28iID0+ICJmb28iCi0JICogICAgIFRhYmxlKGJhcikgdnMuICJGb28iID0+ICJiYXIiCi0JICogICAgIFRhYmxlKEJhcikgdnMuICJGb28iID0+ICJCYXIiCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uSWRlbnRpZmllcihTdHJpbmcgamF2YUlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvbklkZW50aWZpZXIoamF2YUlkZW50aWZpZXIsIHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0QW5ub3RhdGlvbklkZW50aWZpZXIoU3RyaW5nIGphdmFJZGVudGlmaWVyLCBTdHJpbmcgZGJJZGVudGlmaWVyKSB7Ci0JCWlmICh0aGlzLmdldERhdGFiYXNlKCkudmVuZG9yRm9sZHNUb1VwcGVyY2FzZSgpKSB7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNVcHBlcmNhc2UoZGJJZGVudGlmaWVyKSkgewotCQkJCXJldHVybiBkYklkZW50aWZpZXIuZXF1YWxzSWdub3JlQ2FzZShqYXZhSWRlbnRpZmllcikgPyBudWxsIDogZGJJZGVudGlmaWVyOwotCQkJfQotCQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5kZWxpbWl0SWRlbnRpZmllcihkYklkZW50aWZpZXIpOwotCQl9Ci0JCWlmICh0aGlzLmdldERhdGFiYXNlKCkudmVuZG9yRm9sZHNUb0xvd2VyY2FzZSgpKSB7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2UoZGJJZGVudGlmaWVyKSkgewotCQkJCXJldHVybiBkYklkZW50aWZpZXIuZXF1YWxzSWdub3JlQ2FzZShqYXZhSWRlbnRpZmllcikgPyBudWxsIDogZGJJZGVudGlmaWVyOwotCQkJfQotCQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5kZWxpbWl0SWRlbnRpZmllcihkYklkZW50aWZpZXIpOwotCQl9Ci0JCWlmICh0aGlzLmdldERhdGFiYXNlKCkudmVuZG9yRG9lc05vdEZvbGQoKSkgewotCQkJcmV0dXJuIGRiSWRlbnRpZmllci5lcXVhbHMoamF2YUlkZW50aWZpZXIpID8gbnVsbCA6IGRiSWRlbnRpZmllcjsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIHZlbmRvciBmb2xkaW5nOiAiICsgdGhpcy5nZXREYXRhYmFzZSgpLmdldFZlbmRvcigpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEV4YW1wbGVzOgotCSAqIE9yYWNsZSBldGMuCi0JICogICAgIFRhYmxlKEZPTykgPT4gIkZPTyIKLQkgKiAgICAgVGFibGUoRm9vKSA9PiAiXCJGb29cIiIKLQkgKiAgICAgVGFibGUoZm9vKSA9PiAiXCJmb29cIiIKLQkgKiAgICAgCi0JICogUG9zdGdyZVNRTCBldGMuCi0JICogICAgIFRhYmxlKGZvbykgPT4gImZvbyIKLQkgKiAgICAgVGFibGUoRm9vKSA9PiAiXCJGb29cIiIKLQkgKiAgICAgVGFibGUoRk9PKSA9PiAiXCJGT09cIiIKLQkgKiAgICAgCi0JICogU1FMIFNlcnZlciBldGMuCi0JICogICAgIFRhYmxlKEZvbykgPT4gIkZvbyIKLQkgKiAgICAgVGFibGUoZm9vKSA9PiAiZm9vIgotCSAqICAgICBUYWJsZShGT08pID0+ICJGT08iCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uSWRlbnRpZmllcigpIHsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJaWYgKHRoaXMuZ2V0RGF0YWJhc2UoKS52ZW5kb3JGb2xkc1RvVXBwZXJjYXNlKCkpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShuYW1lKSA/IG5hbWUgOiB0aGlzLmdldERhdGFiYXNlKCkuZGVsaW1pdElkZW50aWZpZXIobmFtZSk7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0RGF0YWJhc2UoKS52ZW5kb3JGb2xkc1RvTG93ZXJjYXNlKCkpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShuYW1lKSA/IG5hbWUgOiB0aGlzLmdldERhdGFiYXNlKCkuZGVsaW1pdElkZW50aWZpZXIobmFtZSk7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0RGF0YWJhc2UoKS52ZW5kb3JEb2VzTm90Rm9sZCgpKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIHZlbmRvciBmb2xkaW5nOiAiICsgdGhpcy5nZXREYXRhYmFzZSgpLmdldFZlbmRvcigpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuaW5nIHRvIERUUCBkYXRhYmFzZSBvYmplY3QgKioqKioqKioqKgotCi0JLy8gdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGlzICJsaXZlIiBhbmQgaGFzIGxpc3RlbmVycwotCXZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCXRoaXMuY2hlY2tMaXN0ZW5lcigpOwotCQlSZWZyZXNoTWFuYWdlci5nZXRJbnN0YW5jZSgpLkFkZExpc3RlbmVyKHRoaXMuY2F0YWxvZ09iamVjdCwgdGhpcy5jYXRhbG9nT2JqZWN0TGlzdGVuZXIpOwotCX0KLQotCS8vIHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyAibGl2ZSIgYW5kIGhhcyBubyBsaXN0ZW5lcnMKLQl2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7Ci0JCXRoaXMuY2hlY2tMaXN0ZW5lcigpOwotICAgICAgICBSZWZyZXNoTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKHRoaXMuY2F0YWxvZ09iamVjdCwgdGhpcy5jYXRhbG9nT2JqZWN0TGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0xpc3RlbmVyKCkgewotCQlpZiAodGhpcy5jYXRhbG9nT2JqZWN0TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGhlIGNhdGFsb2cgbGlzdGVuZXIgaXMgbnVsbCIpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2RhNjgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUuZGVmaW5pdGlvbi5EYXRhYmFzZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uaW50ZXJuYWwuY29yZS5SREJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogV3JhcCBhIERUUCBEYXRhYmFzZS4KLSAqIFNvbWV0aW1lcyB0aGUgZGF0YWJhc2Ugd2lsbCBkaXJlY3RseSBob2xkIHNjaGVtYXRhOyBidXQgaWYgdGhlIGRhdGFiYXNlCi0gKiBzdXBwb3J0cyBjYXRhbG9ncywgaXQgd2lsbCBub3QgaG9sZCB0aGUgc2NoZW1hdGEgZGlyZWN0bHksIGJ1dCB3aWxsIGRlbGVnYXRlCi0gKiB0byB0aGUgImRlZmF1bHQiIGNhdGFsb2cuCi0gKi8KLWZpbmFsIGNsYXNzIERUUERhdGFiYXNlV3JhcHBlcgotCWV4dGVuZHMgRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcgotCWltcGxlbWVudHMgRGF0YWJhc2UKLXsKLQkvLyB0aGUgd3JhcHBlZCBEVFAgZGF0YWJhc2UKLQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSBkdHBEYXRhYmFzZTsKLQotCS8vIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIERUUENhdGFsb2dXcmFwcGVyW10gY2F0YWxvZ3M7Ci0KLQkvLyBsYXp5LWluaXRpYWxpemVkIC0gYnV0IGl0IGNhbiBiZSAnbnVsbCcgc28gd2UgdXNlIGEgZmxhZwotCXByaXZhdGUgRFRQQ2F0YWxvZ1dyYXBwZXIgZGVmYXVsdENhdGFsb2c7Ci0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRDYXRhbG9nQ2FsY3VsYXRlZCA9IGZhbHNlOwotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVFBDYXRhbG9nV3JhcHBlcltdIEVNUFRZX0NBVEFMT0dTID0gbmV3IERUUENhdGFsb2dXcmFwcGVyWzBdOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVEdSRVNRTF9QVUJMSUNfU0NIRU1BX05BTUUgPSAicHVibGljIjsgIC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiB2ZW5kb3JzICoqKioqKioqKioKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVSQllfVkVORE9SID0gIkRlcmJ5IjsgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEhTUUxEQl9WRU5ET1IgPSAiSFNRTERCIjsgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERCMl9VREJfSV9TRVJJRVNfVkVORE9SID0gIkRCMiBVREIgaVNlcmllcyI7ICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBEQjJfVURCX1ZFTkRPUiA9ICJEQjIgVURCIjsgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERCMl9VREJfWl9TRVJJRVNfVkVORE9SID0gIkRCMiBVREIgelNlcmllcyI7ICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUk1JWF9WRU5ET1IgPSAiSW5mb3JtaXgiOyAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1FMX1NFUlZFUl9WRU5ET1IgPSAiU1FMIFNlcnZlciI7ICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBNWVNRTF9WRU5ET1IgPSAiTXlTcWwiOyAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT1JBQ0xFX1ZFTkRPUiA9ICJPcmFjbGUiOyAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVEdSRVNfVkVORE9SID0gInBvc3RncmVzIjsgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE1BWERCX1ZFTkRPUiA9ICJNYXhEQiI7ICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTWUJBU0VfQVNBX1ZFTkRPUiA9ICJTeWJhc2VfQVNBIjsgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNZQkFTRV9BU0VfVkVORE9SID0gIlN5YmFzZV9BU0UiOyAgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUERhdGFiYXNlV3JhcHBlcihEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIgY29ubmVjdGlvblByb2ZpbGUsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSBkdHBEYXRhYmFzZSkgewotCQlzdXBlcihjb25uZWN0aW9uUHJvZmlsZSwgZHRwRGF0YWJhc2UpOwotCQl0aGlzLmR0cERhdGFiYXNlID0gZHRwRGF0YWJhc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5kYXRhYmFzZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIERUUERhdGFiYXNlV3JhcHBlciBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hPiBnZXREVFBTY2hlbWF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0U2NoZW1hcygpOwotCX0KLQotCUBPdmVycmlkZQotCURUUENhdGFsb2dXcmFwcGVyIGdldENhdGFsb2coKSB7Ci0JCXJldHVybiBudWxsOyAgLy8gY2F0YWxvZyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JQE92ZXJyaWRlCi0JRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWEob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hXyhkdHBTY2hlbWEpOwotCX0KLQotCUBPdmVycmlkZQotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGVfKGR0cFRhYmxlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbihvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5fKGR0cENvbHVtbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERhdGFiYXNlT2JqZWN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0TmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEYXRhYmFzZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFZlbmRvcigpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0VmVuZG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5kdHBEYXRhYmFzZS5nZXRWZXJzaW9uKCk7Ci0JfQotCi0JLy8gb3ZlcnJpZGUgdG8gbWFrZSBtZXRob2QgcHVibGljIHNpbmNlIGl0J3MgaW4gdGhlIERhdGFiYXNlIGludGVyZmFjZQotCUBPdmVycmlkZQotCXB1YmxpYyA8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIGdldERhdGFiYXNlT2JqZWN0TmFtZWQoVFtdIGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldERhdGFiYXNlT2JqZWN0TmFtZWQoZGF0YWJhc2VPYmplY3RzLCBuYW1lKTsKLQl9Ci0KLQkvLyAqKioqKiBjYXRhbG9ncwotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJLy8gaWYgdGhlIERUUCBkYXRhYmFzZSBkb2VzIG5vdCBoYXZlIGFueSBzY2hlbWF0YSwgaXQgbXVzdCBoYXZlIGNhdGFsb2dzLi4uCi0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZHRwU2NoZW1hdGEgPSB0aGlzLmdldERUUFNjaGVtYXRhKCk7Ci0JCXJldHVybiAoZHRwU2NoZW1hdGEgPT0gbnVsbCkgfHwgZHRwU2NoZW1hdGEuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxDYXRhbG9nPiBjYXRhbG9ncygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPENhdGFsb2c+KHRoaXMuZ2V0Q2F0YWxvZ3MoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQQ2F0YWxvZ1dyYXBwZXJbXSBnZXRDYXRhbG9ncygpIHsKLQkJaWYgKHRoaXMuY2F0YWxvZ3MgPT0gbnVsbCkgewotCQkJdGhpcy5jYXRhbG9ncyA9IHRoaXMuYnVpbGRDYXRhbG9ncygpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNhdGFsb2dzOwotCX0KLQotCXByaXZhdGUgRFRQQ2F0YWxvZ1dyYXBwZXJbXSBidWlsZENhdGFsb2dzKCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBkdHBDYXRhbG9ncyA9IHRoaXMuZ2V0RFRQQ2F0YWxvZ3MoKTsKLQkJaWYgKChkdHBDYXRhbG9ncyA9PSBudWxsKSB8fCBkdHBDYXRhbG9ncy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBFTVBUWV9DQVRBTE9HUzsKLQkJfQotCQlEVFBDYXRhbG9nV3JhcHBlcltdIHJlc3VsdCA9IG5ldyBEVFBDYXRhbG9nV3JhcHBlcltkdHBDYXRhbG9ncy5zaXplKCldOwotCQlmb3IgKGludCBpID0gcmVzdWx0Lmxlbmd0aDsgaS0tID4gMDspIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBEVFBDYXRhbG9nV3JhcHBlcih0aGlzLCBkdHBDYXRhbG9ncy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZz4gZ2V0RFRQQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0aGlzLmR0cERhdGFiYXNlLmdldENhdGFsb2dzKCk7Ci0JfQotCi0JcHVibGljIGludCBjYXRhbG9nc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2dzKCkubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNhdGFsb2dOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPENhdGFsb2csIFN0cmluZz4odGhpcy5jYXRhbG9ncygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKENhdGFsb2cgY2F0YWxvZykgewotCQkJCSByZXR1cm4gY2F0YWxvZy5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBEVFBDYXRhbG9nV3JhcHBlciBnZXREZWZhdWx0Q2F0YWxvZygpIHsKLQkJaWYgKCAhIHRoaXMuZGVmYXVsdENhdGFsb2dDYWxjdWxhdGVkKSB7Ci0JCQl0aGlzLmRlZmF1bHRDYXRhbG9nQ2FsY3VsYXRlZCA9IHRydWU7Ci0JCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gdGhpcy5idWlsZERlZmF1bHRDYXRhbG9nKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JfQotCi0JcHJpdmF0ZSBEVFBDYXRhbG9nV3JhcHBlciBidWlsZERlZmF1bHRDYXRhbG9nKCkgewotCQlpZiAoICEgdGhpcy5zdXBwb3J0c0NhdGFsb2dzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA6IHRoaXMuZ2V0Q2F0YWxvZ3MoKSkgewotCQkJU3RyaW5nIGNhdGFsb2dOYW1lID0gY2F0YWxvZy5nZXROYW1lKCk7Ci0JCQlpZiAoY2F0YWxvZ05hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBjYXRhbG9nOyAgLy8gc3BlY2lhbCBjYXRhbG9nIHRoYXQgY29udGFpbnMgYWxsIHNjaGVtYXRhIChEZXJieSkKLQkJCX0KLQkJCWlmIChjYXRhbG9nTmFtZS5lcXVhbHModGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldFVzZXJOYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIGNhdGFsb2c7ICAvLyB1c2VyIG5hbWUgaXMgZGVmYXVsdCBjYXRhbG9nCi0JCQl9Ci0JCQlpZiAoY2F0YWxvZ05hbWUuZXF1YWxzKHRoaXMuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiBjYXRhbG9nOyAgLy8gc3BlY2lhbCBjYXRhbG9nIHdpdGggc2FtZSBuYW1lIGFzIERCIChQb3N0Z3JlU1FMKQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gZGVmYXVsdCBjYXRhbG9nIik7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjYXRhbG9nIGZvciB0aGUgc3BlY2lmaWVkIERUUCBjYXRhbG9nCi0JICovCi0JRFRQQ2F0YWxvZ1dyYXBwZXIgZ2V0Q2F0YWxvZyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nKSB7Ci0JCWZvciAoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA6IHRoaXMuZ2V0Q2F0YWxvZ3MoKSkgewotCQkJaWYgKGNhdGFsb2cud3JhcHMoZHRwQ2F0YWxvZykpIHsKLQkJCQlyZXR1cm4gY2F0YWxvZzsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIERUUCBjYXRhbG9nOiAiICsgZHRwQ2F0YWxvZyk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERUUENhdGFsb2dXcmFwcGVyIGdldENhdGFsb2dOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhYmFzZU9iamVjdE5hbWVkKHRoaXMuZ2V0Q2F0YWxvZ3MoKSwgbmFtZSk7Ci0JfQotCi0JLy8gKioqKiogc2NoZW1hdGEKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCBEVFBTY2hlbWFXcmFwcGVyW10gZ2V0U2NoZW1hdGEoKSB7Ci0JCURUUENhdGFsb2dXcmFwcGVyIGNhdCA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJcmV0dXJuIChjYXQgPT0gbnVsbCkgPyBzdXBlci5nZXRTY2hlbWF0YSgpIDogY2F0LmdldFNjaGVtYXRhKCk7Ci0JfQotCi0JcHVibGljIERUUFNjaGVtYVdyYXBwZXIgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYU5hbWVkKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXRVc2VyTmFtZSgpKTsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2NoZW1hOwotCQl9Ci0JCS8vIFBvc3RncmVTUUwgaGFzIGEgInNjaGVtYSBzZWFyY2ggcGF0aCIgLSB0aGUgZGVmYXVsdCBpczoKLQkJLy8gICAgICIkdXNlciIscHVibGljCi0JCS8vIHNvIGlmICIkdXNlciIgaXMgbm90IGZvdW5kLCByZXR1cm4gcHVibGljCi0JCWlmICh0aGlzLmdldFZlbmRvcigpLmVxdWFscyhQT1NUR1JFU19WRU5ET1IpKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRTY2hlbWFOYW1lZChQT1NUR1JFU1FMX1BVQkxJQ19TQ0hFTUFfTkFNRSk7Ci0JCX0KLQkJLy8gTXlTUUwgZGF0YWJhc2UgaGFzIGEgc2luZ2xlIHNjaGVtYSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGRhdGFiYXNlCi0JCWlmICh0aGlzLmdldFZlbmRvcigpLmVxdWFscyhNWVNRTF9WRU5ET1IpKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRTY2hlbWFOYW1lZCh0aGlzLmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkZW50aWZpZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBJZiB0aGUgbmFtZSBpcwotCSAqICJkZWxpbWl0ZWQiICh0eXBpY2FsbHkgd2l0aCBkb3VibGUtcXVvdGVzKSwgaXQgd2lsbCBiZSB1c2VkIHdpdGhvdXQgYW55Ci0JICogZm9sZGluZy4gSWYgdGhlIG5hbWUgaXMgIm5vcm1hbCIgKGkuZS4gbm90IGRlbGltaXRlZCksIGl0IHdpbGwgYmUKLQkgKiBmb2xkZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGNhc2UgKHR5cGljYWxseSB1cHBlcmNhc2UpLgotCSAqIEBzZWUgI2lkZW50aWZpZXJJc0RlbGltaXRlZChTdHJpbmcpCi0JICogQHNlZSAjZm9sZElkZW50aWZpZXIoU3RyaW5nKQotCSAqIAotCSAqIFNpbmNlIHRoZSBkYXRhYmFzZSBoYXMgdGhlIGFwcHJvcHJpYXRlIHN0YXRlIHRvIGNvbXBhcmUgaWRlbnRpZmllcnMsCi0JICogdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBkZWxlZ2F0ZXMgdG8gaGVyZSB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0Ci0JICogImRhdGFiYXNlIGZpbmRlciIuCi0JICovCi0JLy8gVE9ETyBjb252ZXJ0IGVtYmVkZGVkIHF1b3Rlcz8KLQk8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIGdldERhdGFiYXNlT2JqZWN0TmFtZWRfKFRbXSBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBuYW1lKSB7Ci0JCW5hbWUgPSB0aGlzLm5vcm1hbGl6ZUlkZW50aWZpZXIobmFtZSk7Ci0JCWZvciAoVCBkYk9iamVjdCA6IGRhdGFiYXNlT2JqZWN0cykgewotCQkJaWYgKGRiT2JqZWN0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gZGJPYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbm9ybWFsaXplSWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlpZiAodGhpcy5pZGVudGlmaWVySXNEZWxpbWl0ZWQoaWRlbnRpZmllcikpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy51bndyYXAoaWRlbnRpZmllcik7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZm9sZElkZW50aWZpZXIoaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyIGlzICJkZWxpbWl0ZWQiIGZvciB0aGUgY3VycmVudAotCSAqIGRhdGFiYXNlICh0eXBpY2FsbHkgd2l0aCBkb3VibGUtcXVvdGVzKS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaWRlbnRpZmllcklzRGVsaW1pdGVkKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCWlmICh0aGlzLnZlbmRvckFsbG93c1F1b3RlRGVsaW1pdGVycygpCi0JCQkJJiYgU3RyaW5nVG9vbHMuc3RyaW5nSXNRdW90ZWQoaWRlbnRpZmllcikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0aGlzLnZlbmRvckFsbG93c0JyYWNrZXREZWxpbWl0ZXJzKCkKLQkJCQkmJiBTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNrZXRlZChpZGVudGlmaWVyKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHRoaXMudmVuZG9yQWxsb3dzQmFja3RpY2tEZWxpbWl0ZXJzKCkKLQkJCQkmJiBTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChpZGVudGlmaWVyLCBCQUNLVElDSykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGF0YWJhc2UgYWxsb3dzIGlkZW50aWZpZXJzIHRvIGRlbGltaXRlZCB3aXRoCi0JICogcXVvdGVzOiAiRk9PIi4KLQkgKi8KLQlib29sZWFuIHZlbmRvckFsbG93c1F1b3RlRGVsaW1pdGVycygpIHsKLQkJLy8gYWxsIHBsYXRmb3JtcyBhbGxvdyBpZGVudGlmaWVycyB0byBiZSBkZWxpbWl0ZWQgYnkgcXVvdGVzCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBkYXRhYmFzZSBhbGxvd3MgaWRlbnRpZmllcnMgdG8gZGVsaW1pdGVkIHdpdGgKLQkgKiBicmFja2V0czogW0ZPT10uCi0JICovCi0JYm9vbGVhbiB2ZW5kb3JBbGxvd3NCcmFja2V0RGVsaW1pdGVycygpIHsKLQkJU3RyaW5nIHZlbmRvciA9IHRoaXMuZ2V0VmVuZG9yKCk7Ci0JCXJldHVybiB2ZW5kb3IuZXF1YWxzKFNRTF9TRVJWRVJfVkVORE9SKQotCQkJCXx8IHZlbmRvci5lcXVhbHMoU1lCQVNFX0FTRV9WRU5ET1IpCi0JCQkJfHwgdmVuZG9yLmVxdWFscyhTWUJBU0VfQVNBX1ZFTkRPUik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGRhdGFiYXNlIGFsbG93cyBpZGVudGlmaWVycyB0byBkZWxpbWl0ZWQgd2l0aAotCSAqIGJhY2t0aWNrczogYEZPT2AuCi0JICovCi0JYm9vbGVhbiB2ZW5kb3JBbGxvd3NCYWNrdGlja0RlbGltaXRlcnMoKSB7Ci0JCVN0cmluZyB2ZW5kb3IgPSB0aGlzLmdldFZlbmRvcigpOwotCQlyZXR1cm4gdmVuZG9yLmVxdWFscyhNWVNRTF9WRU5ET1IpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQkFDS1RJQ0sgPSAnYCc7Ci0KLQkvKioKLQkgKiBGb2xkIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllciB0byB0aGUgYXBwcm9wcmlhdGUgY2FzZS4KLQkgKiBUaGUgU1FMLTkyIHNwZWMgc2F5cyBhICJub3JtYWwiIChub24tZGVsaW1pdGVkKSBpZGVudGlmaWVyIHNob3VsZCBiZQotCSAqIGZvbGRlZCB0byB1cHBlcmNhc2U7IGJ1dCBzb21lIGRhdGFiYXNlcyBkbyBvdGhlcndpc2UgKGUuZy4gUG9zdGdyZVNRTCkuCi0JICogCi0JICogQWNjb3JkaW5nIHRvIG9uLWxpbmUgZG9jdW1lbnRhdGlvbiBJIGNvdWxkIGZpbmQ6ICB+Ymp2Ci0JICogVGhlIGZvbGxvd2luZyBkYXRhYmFzZXMgZm9sZCB0byB1cHBlcmNhc2U6Ci0JICogICAgIERlcmJ5Ci0JICogICAgIE9yYWNsZQotCSAqICAgICBEQjIKLQkgKiAgICAgSFNRTERCCi0JICogICAgIE1heERCCi0JICogVGhlIGZvbGxvd2luZyBkYXRhYmFzZXMgZm9sZCB0byBsb3dlcmNhc2U6Ci0JICogICAgIFBvc3RncmVTUUwKLQkgKiAgICAgSW5mb3JtaXgKLQkgKiAgICAgTXlTUUwgIChzb3J0YSAtIGRlcGVuZHMgb24gdW5kZXJseWluZyBPL1MgZmlsZSBzeXN0ZW0gYW5kIGVudiB2YXIpCi0JICogVGhlIGZvbGxvd2luZyBkYXRhYmFzZXMgZG8gbm90IGZvbGQ6Ci0JICogICAgIE1TIFNRTCBTZXJ2ZXIgKG1pZ2h0IGRlcGVuZCBvbiBjb2xsYXRpb24gc2V0dGluZy4uLikKLQkgKiAgICAgU3liYXNlIChtaWdodCBkZXBlbmQgb24gY29sbGF0aW9uIHNldHRpbmcuLi4pCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZm9sZElkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJaWYgKHRoaXMudmVuZG9yRm9sZHNUb0xvd2VyY2FzZSgpKSB7Ci0JCQlyZXR1cm4gaWRlbnRpZmllci50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWlmICh0aGlzLnZlbmRvckZvbGRzVG9VcHBlcmNhc2UoKSkgewotCQkJcmV0dXJuIGlkZW50aWZpZXIudG9VcHBlckNhc2UoKTsKLQkJfQotCQlpZiAodGhpcy52ZW5kb3JEb2VzTm90Rm9sZCgpKSB7Ci0JCQlyZXR1cm4gaWRlbnRpZmllcjsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIHZlbmRvciBmb2xkaW5nOiAiICsgdGhpcy5nZXRWZW5kb3IoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGF0YWJhc2UgZm9sZHMgbm9uLWRlbGltaXRlZCBpZGVudGlmaWVycyB0byBsb3dlcmNhc2UuCi0JICovCi0JYm9vbGVhbiB2ZW5kb3JGb2xkc1RvTG93ZXJjYXNlKCkgewotCQlTdHJpbmcgdmVuZG9yID0gdGhpcy5nZXRWZW5kb3IoKTsKLQkJcmV0dXJuIHZlbmRvci5lcXVhbHMoUE9TVEdSRVNfVkVORE9SKQotCQkJCXx8IHZlbmRvci5lcXVhbHMoSU5GT1JNSVhfVkVORE9SKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGF0YWJhc2UgZG9lcyBub3QgZm9sZCBub24tZGVsaW1pdGVkIGlkZW50aWZpZXJzIHRvCi0JICogbG93ZXJjYXNlLgotCSAqLwotCWJvb2xlYW4gdmVuZG9yRG9lc05vdEZvbGRUb0xvd2VyY2FzZSgpIHsKLQkJcmV0dXJuICEgdGhpcy52ZW5kb3JGb2xkc1RvTG93ZXJjYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGRhdGFiYXNlIGZvbGRzIG5vbi1kZWxpbWl0ZWQgaWRlbnRpZmllcnMgdG8gdXBwZXJjYXNlLgotCSAqLwotCWJvb2xlYW4gdmVuZG9yRm9sZHNUb1VwcGVyY2FzZSgpIHsKLQkJcmV0dXJuIHRoaXMudmVuZG9yRm9sZHMoKQotCQkJCSYmIHRoaXMudmVuZG9yRG9lc05vdEZvbGRUb0xvd2VyY2FzZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBmb2xkIG5vbi1kZWxpbWl0ZWQgaWRlbnRpZmllcnMgdG8KLQkgKiB1cHBlcmNhc2UuCi0JICovCi0JYm9vbGVhbiB2ZW5kb3JEb2VzTm90Rm9sZFRvVXBwZXJjYXNlKCkgewotCQlyZXR1cm4gISB0aGlzLnZlbmRvckZvbGRzVG9VcHBlcmNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGF0YWJhc2UgZm9sZHMgbm9uLWRlbGltaXRlZCBpZGVudGlmaWVycyB0byBlaXRoZXIKLQkgKiB1cHBlcmNhc2Ugb3IgbG93ZXJjYXNlLgotCSAqLwotCWJvb2xlYW4gdmVuZG9yRm9sZHMoKSB7Ci0JCXJldHVybiAhIHRoaXMudmVuZG9yRG9lc05vdEZvbGQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGF0YWJhc2UgZG9lcyBub3QgZm9sZCBub24tZGVsaW1pdGVkIGlkZW50aWZpZXJzIHRvCi0JICogZWl0aGVyIHVwcGVyY2FzZSBvciBsb3dlcmNhc2UgKGkuZS4gdGhlIGlkZW50aWZpZXIgaXMgdXNlZCB1bm1vZGlmaWVkKS4KLQkgKiBUaGVzZSBndXlzIGFyZSBiaXQgZmxha3ksIHNvIHdlIGZvcmNlIGFuIGV4YWN0IG1hdGNoLgotCSAqIChlLmcuIE15U1FMIGZvbGRzIGRhdGFiYXNlIGFuZCB0YWJsZSBuYW1lcyB0byBsb3dlcmNhc2Ugb24gV2luZG93cwotCSAqIGJ5IGRlZmF1bHQ7IGJ1dCB0aGF0IGRlZmF1bHQgY2FuIGJlIGNoYW5nZWQgYnkgdGhlCi0JICogJ2xvd2VyX2Nhc2VfdGFibGVfbmFtZXMnIHN5c3RlbSB2YXJpYWJsZS4gVGhpcyBiZWNhdXNlIGRhdGFiYXNlcyBhcmUKLQkgKiBzdG9yZWQgYXMgZGlyZWN0b3JpZXMgYW5kIHRhYmxlcyBhcmUgc3RvcmVkIGFzIGZpbGVzIGluIHRoZSB1bmRlcmx5aW5nCi0JICogTy9TLCBhbmQgdGhlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgdGhlIG5hbWVzIGlzIGRldGVybWluZWQgYnkgdGhlIGJlaGF2aW9yCi0JICogb2YgZmlsZW5hbWVzIG9uIHRoZSBPL1MuIFRoZW4sIHRvIGNvbXBsaWNhdGUgdGhpbmdzLAotCSAqIG5vbmUgb2YgdGhlIG90aGVyIGlkZW50aWZpZXJzLCBsaWtlIHRhYmxlIGFuZCBjb2x1bW4gbmFtZXMsIGFyZSBmb2xkZWQ7Ci0JICogYnV0IHRoZXkgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHVubGVzcyBkZWxpbWl0ZWQuIFNlZQotCSAqIGh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNi4wL2VuL2lkZW50aWZpZXItY2FzZS1zZW5zaXRpdml0eS5odG1sLikKLQkgKi8KLQlib29sZWFuIHZlbmRvckRvZXNOb3RGb2xkKCkgewotCQlTdHJpbmcgdmVuZG9yID0gdGhpcy5nZXRWZW5kb3IoKTsKLQkJcmV0dXJuIHZlbmRvci5lcXVhbHMoU1FMX1NFUlZFUl9WRU5ET1IpCi0JCQkJfHwgdmVuZG9yLmVxdWFscyhTWUJBU0VfQVNFX1ZFTkRPUikKLQkJCQl8fCB2ZW5kb3IuZXF1YWxzKFNZQkFTRV9BU0FfVkVORE9SKQotCQkJCXx8IHZlbmRvci5lcXVhbHMoTVlTUUxfVkVORE9SKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllciBpbiBhIHZlbmRvci1hcHByb3ByaWF0ZSBmYXNoaW9uLgotCSAqLwotCVN0cmluZyBkZWxpbWl0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlpZiAodGhpcy52ZW5kb3JBbGxvd3NRdW90ZURlbGltaXRlcnMoKSkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnF1b3RlKGlkZW50aWZpZXIpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gdmVuZG9yIGRlbGltaXRlcnM6ICIgKyB0aGlzLmdldFZlbmRvcigpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcy5nZXROYW1lKCksIGRhdGFiYXNlLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JRGF0YWJhc2VEZWZpbml0aW9uIGdldERUUERlZmluaXRpb24oKSB7Ci0JCXJldHVybiBSREJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREYXRhYmFzZURlZmluaXRpb25SZWdpc3RyeSgpLmdldERlZmluaXRpb24odGhpcy5kdHBEYXRhYmFzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdGFydExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuY2F0YWxvZ3MgIT0gbnVsbCkgewotCQkJdGhpcy5zdGFydENhdGFsb2dzKCk7Ci0JCX0KLQkJc3VwZXIuc3RhcnRMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRDYXRhbG9ncygpIHsKLQkJZm9yIChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nIDogdGhpcy5jYXRhbG9ncykgewotCQkJY2F0YWxvZy5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuY2F0YWxvZ3MgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wQ2F0YWxvZ3MoKTsKLQkJfQotCQlzdXBlci5zdG9wTGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BDYXRhbG9ncygpIHsKLQkJZm9yIChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nIDogdGhpcy5jYXRhbG9ncykgewotCQkJY2F0YWxvZy5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xlYXIgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jdm9pZCBjbGVhcigpIHsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZ0NhbGN1bGF0ZWQgPSBmYWxzZTsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IG51bGw7Ci0JCWlmICh0aGlzLmNhdGFsb2dzICE9IG51bGwpIHsKLQkJCXRoaXMuY2xlYXJDYXRhbG9ncygpOwotCQl9Ci0JCXN1cGVyLmNsZWFyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyQ2F0YWxvZ3MoKSB7Ci0JCXRoaXMuc3RvcENhdGFsb2dzKCk7Ci0JCWZvciAoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA6IHRoaXMuY2F0YWxvZ3MpIHsKLQkJCWNhdGFsb2cuY2xlYXIoKTsKLQkJfQotCQl0aGlzLmNhdGFsb2dzID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUEZvcmVpZ25LZXlXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBGb3JlaWduS2V5V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjA1MDQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUEZvcmVpZ25LZXlXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgRm9yZWlnbktleQotICovCi1maW5hbCBjbGFzcyBEVFBGb3JlaWduS2V5V3JhcHBlcgotCWV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyCi0JaW1wbGVtZW50cyBGb3JlaWduS2V5Ci17Ci0JLy8gdGhlIHdyYXBwZWQgRFRQIGZvcmVpZ24ga2V5Ci0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5IGR0cEZvcmVpZ25LZXk7Ci0KLQkvLyBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBEVFBUYWJsZVdyYXBwZXIgcmVmZXJlbmNlZFRhYmxlOwotCi0JLy8gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgTG9jYWxDb2x1bW5QYWlyW10gY29sdW1uUGFpcnM7Ci0KLQkvLyBsYXp5LWluaXRpYWxpemVkIC0gYnV0IGl0IGNhbiBiZSAnbnVsbCcgc28gd2UgdXNlIGEgZmxhZwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRBdHRyaWJ1dGVOYW1lOwotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0QXR0cmlidXRlTmFtZUNhbGN1bGF0ZWQgPSBmYWxzZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBGb3JlaWduS2V5V3JhcHBlcihEVFBUYWJsZVdyYXBwZXIgYmFzZVRhYmxlLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5IGR0cEZvcmVpZ25LZXkpIHsKLQkJc3VwZXIoYmFzZVRhYmxlLCBkdHBGb3JlaWduS2V5KTsKLQkJdGhpcy5kdHBGb3JlaWduS2V5ID0gZHRwRm9yZWlnbktleTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmZvcmVpZ25LZXlDaGFuZ2VkKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0TmFtZSgpICsgIjogIiArIEFycmF5cy5hc0xpc3QodGhpcy5nZXRDb2x1bW5QYWlycygpKSk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvLyAqKioqKioqKioqIEZvcmVpZ25LZXkgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5LmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRQVGFibGVXcmFwcGVyIGdldEJhc2VUYWJsZSgpIHsKLQkJcmV0dXJuIChEVFBUYWJsZVdyYXBwZXIpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBEVFBUYWJsZVdyYXBwZXIgZ2V0UmVmZXJlbmNlZFRhYmxlKCkgewotCQlpZiAodGhpcy5yZWZlcmVuY2VkVGFibGUgPT0gbnVsbCkgewotCQkJdGhpcy5yZWZlcmVuY2VkVGFibGUgPSB0aGlzLmdldEJhc2VUYWJsZSgpLmdldFRhYmxlKHRoaXMuZHRwRm9yZWlnbktleS5nZXRVbmlxdWVDb25zdHJhaW50KCkuZ2V0QmFzZVRhYmxlKCkpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VzU2luZ2xlQ29sdW1uUHJpbWFyeUtleSgpIHsKLQkJaWYgKHRoaXMuY29sdW1uUGFpcnNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICh0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5QYWlyKCkuZ2V0UmVmZXJlbmNlZENvbHVtbigpID09IHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCX0KLQotCS8vICoqKioqIGNvbHVtbiBwYWlycwotCi0JcHVibGljIEl0ZXJhdG9yPENvbHVtblBhaXI+IGNvbHVtblBhaXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8Q29sdW1uUGFpcj4odGhpcy5nZXRDb2x1bW5QYWlycygpKTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxDb2x1bW5QYWlyIGdldENvbHVtblBhaXIoKSB7Ci0JCUxvY2FsQ29sdW1uUGFpcltdIHBhaXJzID0gdGhpcy5nZXRDb2x1bW5QYWlycygpOwotCQlpZiAocGFpcnMubGVuZ3RoICE9IDEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm11bHRpcGxlIGNvbHVtbiBwYWlyczogIiArIHBhaXJzLmxlbmd0aCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHBhaXJzWzBdOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8TG9jYWxDb2x1bW5QYWlyPiBsb2NhbENvbHVtblBhaXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8TG9jYWxDb2x1bW5QYWlyPih0aGlzLmdldENvbHVtblBhaXJzKCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIExvY2FsQ29sdW1uUGFpcltdIGdldENvbHVtblBhaXJzKCkgewotCQlpZiAodGhpcy5jb2x1bW5QYWlycyA9PSBudWxsKSB7Ci0JCQl0aGlzLmNvbHVtblBhaXJzID0gdGhpcy5idWlsZENvbHVtblBhaXJzKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uUGFpcnM7Ci0JfQotCi0JcHJpdmF0ZSBMb2NhbENvbHVtblBhaXJbXSBidWlsZENvbHVtblBhaXJzKCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGJhc2VDb2x1bW5zID0gdGhpcy5nZXREVFBCYXNlQ29sdW1ucygpOwotCQlpbnQgc2l6ZSA9IGJhc2VDb2x1bW5zLnNpemUoKTsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiByZWZDb2x1bW5zID0gdGhpcy5nZXREVFBSZWZlcmVuY2VDb2x1bW5zKCk7Ci0JCWlmIChyZWZDb2x1bW5zLnNpemUoKSAhPSBzaXplKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuZ2V0QmFzZVRhYmxlKCkuZ2V0TmFtZSgpICsgJy4nICsgdGhpcy5nZXROYW1lKCkgKwotCQkJCQkJCQkiIC0gbWlzbWF0Y2hlZCBzaXplczogIiArIHNpemUgKyAiIHZzLiAiICsgcmVmQ29sdW1ucy5zaXplKCkpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCUxvY2FsQ29sdW1uUGFpcltdIHJlc3VsdCA9IG5ldyBMb2NhbENvbHVtblBhaXJbYmFzZUNvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IGJhc2VDb2x1bW5zLnNpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgTG9jYWxDb2x1bW5QYWlyKAotCQkJCQkJCQl0aGlzLmdldEJhc2VUYWJsZSgpLmdldENvbHVtbihiYXNlQ29sdW1ucy5nZXQoaSkpLAotCQkJCQkJCQl0aGlzLmdldEJhc2VUYWJsZSgpLmdldENvbHVtbihyZWZDb2x1bW5zLmdldChpKSkKLQkJCQkJCSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGdldERUUEJhc2VDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5LmdldE1lbWJlcnMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGdldERUUFJlZmVyZW5jZUNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmR0cEZvcmVpZ25LZXkuZ2V0VW5pcXVlQ29uc3RyYWludCgpLmdldE1lbWJlcnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbHVtblBhaXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uUGFpcnMoKS5sZW5ndGg7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPENvbHVtbj4gYmFzZUNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxMb2NhbENvbHVtblBhaXIsIENvbHVtbj4odGhpcy5sb2NhbENvbHVtblBhaXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm0oTG9jYWxDb2x1bW5QYWlyIHBhaXIpIHsKLQkJCQlyZXR1cm4gcGFpci5nZXRCYXNlQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JYm9vbGVhbiBiYXNlQ29sdW1uc0NvbnRhaW5zKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmJhc2VDb2x1bW5zKCksIGNvbHVtbik7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPENvbHVtbj4gbm9uUHJpbWFyeUtleUJhc2VDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENvbHVtbiwgQ29sdW1uPih0aGlzLmJhc2VDb2x1bW5zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENvbHVtbiBjb2x1bW4pIHsKLQkJCQlyZXR1cm4gISBjb2x1bW4uaXNQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPENvbHVtbj4gcmVmZXJlbmNlZENvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxMb2NhbENvbHVtblBhaXIsIENvbHVtbj4odGhpcy5sb2NhbENvbHVtblBhaXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm0oTG9jYWxDb2x1bW5QYWlyIGNvbHVtblBhaXIpIHsKLQkJCQlyZXR1cm4gY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKiogYXR0cmlidXRlIG5hbWUKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJU3RyaW5nIGRlZmF1bHROYW1lID0gdGhpcy5nZXREZWZhdWx0QXR0cmlidXRlTmFtZSgpOwotCQlyZXR1cm4gKGRlZmF1bHROYW1lICE9IG51bGwpID8gZGVmYXVsdE5hbWUgOiB0aGlzLmdldE5vbkRlZmF1bHRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCWlmICggISB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lQ2FsY3VsYXRlZCkgewotCQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwotCQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZSA9IHRoaXMuYnVpbGREZWZhdWx0QXR0cmlidXRlTmFtZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCWlmICggISB0aGlzLnJlZmVyZW5jZXNTaW5nbGVDb2x1bW5QcmltYXJ5S2V5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxvY2FsQ29sdW1uUGFpciBjb2x1bW5QYWlyID0gdGhpcy5nZXRDb2x1bW5QYWlyKCk7Ci0JCVN0cmluZyBiYXNlQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHJlZkNvbE5hbWUgPSBjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCWlmIChiYXNlQ29sTmFtZS5sZW5ndGgoKSA8PSAocmVmQ29sTmFtZS5sZW5ndGgoKSArIDEpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoICEgYmFzZUNvbE5hbWUuZW5kc1dpdGgocmVmQ29sTmFtZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBfaW5kZXggPSBiYXNlQ29sTmFtZS5sZW5ndGgoKSAtIHJlZkNvbE5hbWUubGVuZ3RoKCkgLSAxOwotCQlpZiAoYmFzZUNvbE5hbWUuY2hhckF0KF9pbmRleCkgIT0gJ18nKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gYmFzZUNvbE5hbWUuc3Vic3RyaW5nKDAsIF9pbmRleCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBpcyBhIHNpbXBsZSAoc2luZ2xlLWNvbHVtbikgZm9yZWlnbiBrZXksIHVzZSB0aGUgbmFtZSBvZiB0aGUKLQkgKiBzaW5nbGUgYmFzZSBjb2x1bW4gdG8gYnVpbGQgYSBuYW1lLiBJZiB0aGlzIGlzIGEgY29tcG91bmQgZm9yZWlnbiBrZXksCi0JICogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIHRhYmxlLgotCSAqLwotCS8vIFRPRE8gaWYgdGhlcmUgaXMgb25seSBvbmUgRksgdG8gYSBnaXZlbiB0YWJsZSwgdXNlIHRoZSB0YWJsZSdzIG5hbWUgaW5zdGVhZCBvZiB0aGUgY29sdW1uJ3MgbmFtZT8KLQlwcml2YXRlIFN0cmluZyBnZXROb25EZWZhdWx0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmNvbHVtblBhaXJzU2l6ZSgpID09IDEpID8KLQkJCQkJCXRoaXMuZ2V0Tm9uRGVmYXVsdEF0dHJpYnV0ZU5hbWVGcm9tQmFzZUNvbHVtbigpCi0JCQkJCToKLQkJCQkJCXRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB1bmRlcnNjb3JlIGNoZWNrIGlzIGhlbHBmdWwgd2hlbiB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gaXMgTk9UIHRoZQotCSAqIHByaW1hcnkga2V5IG9mIHRoZSByZWZlcmVuY2VkIHRhYmxlIChpLmUuIGl0IGhhcyBvbmx5IGEgVU5JUVVFIGNvbnN0cmFpbnQpLgotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFX0lEID0+IENVQklDTEUuSUQpID0+ICJDVUJJQ0xFIgotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFSUQgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfUEsgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEVfUEsiCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9uRGVmYXVsdEF0dHJpYnV0ZU5hbWVGcm9tQmFzZUNvbHVtbigpIHsKLQkJTG9jYWxDb2x1bW5QYWlyIGNvbHVtblBhaXIgPSB0aGlzLmdldENvbHVtblBhaXIoKTsKLQkJU3RyaW5nIGJhc2VDb2xOYW1lID0gY29sdW1uUGFpci5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcmVmQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0UmVmZXJlbmNlZENvbHVtbigpLmdldE5hbWUoKTsKLQkJaW50IGxlbiA9IGJhc2VDb2xOYW1lLmxlbmd0aCgpOwotCQlpbnQgcmVmTGVuID0gcmVmQ29sTmFtZS5sZW5ndGgoKTsKLQkJaWYgKChsZW4gPiByZWZMZW4pICYmIGJhc2VDb2xOYW1lLmVuZHNXaXRoKHJlZkNvbE5hbWUpKSB7Ci0JCQlsZW4gPSBsZW4gLSByZWZMZW47Ci0JCQlpZiAoKGxlbiA+IDEpICYmIGJhc2VDb2xOYW1lLmNoYXJBdChsZW4gLSAxKSA9PSAnXycpIHsKLQkJCQlsZW4gPSBsZW4gLSAxOwotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlQ29sTmFtZS5zdWJzdHJpbmcoMCwgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGFtcGxlczoKLQkgKiBPcmFjbGUgZXRjLgotCSAqICAgICBGb3JlaWduS2V5KEZPT19JRCA9PiBJRCkgdnMuICJmb28iID0+IG51bGwKLQkgKiAgICAgRm9yZWlnbktleShGT09fSUQgPT4gRk9PX0lEKSB2cy4gImZvbyIgPT4gIkZPT19JRCIKLQkgKiAgICAgRm9yZWlnbktleShGT08gPT4gSUQpIHZzLiAiZm9vIiA9PiAiRk9PIgotCSAqICAgICBGb3JlaWduS2V5KEZvb19JRCA9PiBJRCkgdnMuICJmb28iID0+ICJcIkZvb19JRFwiIgotCSAqICAgICAKLQkgKiBQb3N0Z3JlU1FMIGV0Yy4KLQkgKiAgICAgRm9yZWlnbktleShmb29faWQgPT4gaWQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIEZvcmVpZ25LZXkoZm9vX2lkID0+IGZvb19pZCkgdnMuICJmb28iID0+ICJmb29faWQiCi0JICogICAgIEZvcmVpZ25LZXkoZm9vID0+IGlkKSB2cy4gImZvbyIgPT4gImZvbyIKLQkgKiAgICAgRm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiXCJGb29fSURcIiIKLQkgKiAgICAgCi0JICogU1FMIFNlcnZlciBldGMuCi0JICogICAgIEZvcmVpZ25LZXkoZm9vX0lEID0+IElEKSB2cy4gImZvbyIgPT4gbnVsbAotCSAqICAgICBGb3JlaWduS2V5KEZPT19JRCA9PiBGT09fSUQpIHZzLiAiZm9vIiA9PiAiRk9PX0lEIgotCSAqICAgICBGb3JlaWduS2V5KEZPTyA9PiBJRCkgdnMuICJmb28iID0+ICJGT08iCi0JICogICAgIEZvcmVpZ25LZXkoRm9vX0lEID0+IElEKSB2cy4gImZvbyIgPT4gIkZvb19JRCIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlTdHJpbmcgZGVmYXVsdEJhc2VDb2x1bW5OYW1lID0gYXR0cmlidXRlTmFtZSArICdfJyArIHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGJhc2VDb2x1bW5OYW1lID0gdGhpcy5nZXRDb2x1bW5QYWlyKCkuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvbklkZW50aWZpZXIoZGVmYXVsdEJhc2VDb2x1bW5OYW1lLCBiYXNlQ29sdW1uTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbXBhcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBjb21wYXJlVG8oRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcy5nZXROYW1lKCksIGZvcmVpZ25LZXkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlib29sZWFuIHdyYXBzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLkZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5ID09IGZvcmVpZ25LZXk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBjbGVhcigpIHsKLQkJLy8gdGhlIGZvcmVpZ24ga2V5IGRvZXMgbm90ICJjb250YWluIiBhbnkgb3RoZXIgb2JqZWN0cywKLQkJLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBmb3J3YXJkIHRoZSAjY2xlYXIoKQotCQl0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lQ2FsY3VsYXRlZCA9IGZhbHNlOwotCQl0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lID0gbnVsbDsKLQkJdGhpcy5jb2x1bW5QYWlycyA9ICBudWxsOwotCQl0aGlzLnJlZmVyZW5jZWRUYWJsZSA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBwYWlyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsQ29sdW1uUGFpciBpbXBsZW1lbnRzIENvbHVtblBhaXIgewotCQlwcml2YXRlIGZpbmFsIERUUENvbHVtbldyYXBwZXIgYmFzZUNvbHVtbjsKLQkJcHJpdmF0ZSBmaW5hbCBEVFBDb2x1bW5XcmFwcGVyIHJlZmVyZW5jZWRDb2x1bW47Ci0KLQkJTG9jYWxDb2x1bW5QYWlyKERUUENvbHVtbldyYXBwZXIgYmFzZUNvbHVtbiwgRFRQQ29sdW1uV3JhcHBlciByZWZlcmVuY2VkQ29sdW1uKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKChiYXNlQ29sdW1uID09IG51bGwpIHx8IChyZWZlcmVuY2VkQ29sdW1uID09IG51bGwpKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmJhc2VDb2x1bW4gPSBiYXNlQ29sdW1uOwotCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uID0gcmVmZXJlbmNlZENvbHVtbjsKLQkJfQotCi0JCXB1YmxpYyBEVFBDb2x1bW5XcmFwcGVyIGdldEJhc2VDb2x1bW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5iYXNlQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIERUUENvbHVtbldyYXBwZXIgZ2V0UmVmZXJlbmNlZENvbHVtbigpIHsKLQkJCXJldHVybiB0aGlzLnJlZmVyZW5jZWRDb2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhDb2x1bW5QYWlyIGNvbHVtblBhaXIpIHsKLQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcy5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpLCBjb2x1bW5QYWlyLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmJhc2VDb2x1bW4uZ2V0TmFtZSgpICsgIj0+IiArIHRoaXMucmVmZXJlbmNlZENvbHVtbi5nZXROYW1lKCkpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyMzQ1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBTY2hlbWFDb250YWluZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogQ29hbGVzY2UgYmVoYXZpb3IgZm9yIGEgc2NoZW1hIGNvbnRhaW5lciAoaS5lLiBkYXRhYmFzZSBvciBjYXRhbG9nKS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcgotCWV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyCi0JaW1wbGVtZW50cyBTY2hlbWFDb250YWluZXIKLXsKLQkvLyBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBEVFBTY2hlbWFXcmFwcGVyW10gc2NoZW1hdGE7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcihEVFBEYXRhYmFzZU9iamVjdCBwYXJlbnQsIE9iamVjdCBkdHBPYmplY3QpIHsKLQkJc3VwZXIocGFyZW50LCBkdHBPYmplY3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhYnN0cmFjdCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIHJldHVybiB0aGUgc2NoZW1hIGNvbnRhaW5lcidzIERUUCBzY2hlbWF0YQotCSAqLwotCWFic3RyYWN0IExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZ2V0RFRQU2NoZW1hdGEoKTsKLQotCS8qKgotCSAqIHJldHVybiB0aGUgc2NoZW1hIGNvbnRhaW5lcidzIGNhdGFsb2csCi0JICogbnVsbCBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncwotCSAqLwotCWFic3RyYWN0IERUUENhdGFsb2dXcmFwcGVyIGdldENhdGFsb2coKTsKLQotCS8qKgotCSAqIHJldHVybiB0aGUgc2NoZW1hIGZvciB0aGUgc3BlY2lmaWVkIERUUCBzY2hlbWEKLQkgKi8KLQlhYnN0cmFjdCBEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSk7Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIHNjaGVtYSBjb250YWluZXIgKGRhdGFiYXNlIG9yIGNhdGFsb2cpIGNvbnRhaW5zCi0JICogdGhlIHNwZWNpZmllZCBzY2hlbWEKLQkgKi8KLQlEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYV8ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEpIHsKLQkJZm9yIChEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSA6IHRoaXMuZ2V0U2NoZW1hdGEoKSkgewotCQkJaWYgKHNjaGVtYS53cmFwcyhkdHBTY2hlbWEpKSB7Ci0JCQkJcmV0dXJuIHNjaGVtYTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIERUUCBzY2hlbWE6ICIgKyBkdHBTY2hlbWEpOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgRFRQIHRhYmxlCi0JICovCi0JYWJzdHJhY3QgRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSk7Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIHNjaGVtYSBjb250YWluZXIgY29udGFpbnMgdGhlIHNwZWNpZmllZCB0YWJsZQotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZV8ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYV8oZHRwVGFibGUuZ2V0U2NoZW1hKCkpLmdldFRhYmxlXyhkdHBUYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjb2x1bW4gZm9yIHRoZSBzcGVjaWZpZWQgRFRQIGNvbHVtbgotCSAqLwotCWFic3RyYWN0IERUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKTsKLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgc2NoZW1hIGNvbnRhaW5lciBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNvbHVtbgotCSAqLwotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uXyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZV8oZHRwQ29sdW1uLmdldFRhYmxlKCkpLmdldENvbHVtbl8oZHRwQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2NoZW1hdGEgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPFNjaGVtYT4gc2NoZW1hdGEoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTY2hlbWE+KHRoaXMuZ2V0U2NoZW1hdGEoKSk7Ci0JfQotCi0JSXRlcmF0b3I8RFRQU2NoZW1hV3JhcHBlcj4gc2NoZW1hV3JhcHBlcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxEVFBTY2hlbWFXcmFwcGVyPih0aGlzLmdldFNjaGVtYXRhKCkpOwotCX0KLQotCXN5bmNocm9uaXplZCBEVFBTY2hlbWFXcmFwcGVyW10gZ2V0U2NoZW1hdGEoKSB7Ci0JCWlmICh0aGlzLnNjaGVtYXRhID09IG51bGwpIHsKLQkJCXRoaXMuc2NoZW1hdGEgPSB0aGlzLmJ1aWxkU2NoZW1hdGEoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zY2hlbWF0YTsKLQl9Ci0KLQlwcml2YXRlIERUUFNjaGVtYVdyYXBwZXJbXSBidWlsZFNjaGVtYXRhKCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE+IGR0cFNjaGVtYXRhID0gdGhpcy5nZXREVFBTY2hlbWF0YSgpOwotCQlEVFBTY2hlbWFXcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUFNjaGVtYVdyYXBwZXJbZHRwU2NoZW1hdGEuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRFRQU2NoZW1hV3JhcHBlcih0aGlzLCBkdHBTY2hlbWF0YS5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBzY2hlbWF0YVNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYXRhKCkubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IHNjaGVtYU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RFRQU2NoZW1hV3JhcHBlciwgU3RyaW5nPih0aGlzLnNjaGVtYVdyYXBwZXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEpIHsKLQkJCQkgcmV0dXJuIHNjaGVtYS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIERUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldFNjaGVtYXRhKCksIG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLnNjaGVtYXRhICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRTY2hlbWF0YSgpOwotCQl9Ci0JCXN1cGVyLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0U2NoZW1hdGEoKSB7Ci0JCWZvciAoRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEgOiB0aGlzLnNjaGVtYXRhKSB7Ci0JCQlzY2hlbWEuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLnNjaGVtYXRhICE9IG51bGwpIHsKLQkJCXRoaXMuc3RvcFNjaGVtYXRhKCk7Ci0JCX0KLQkJc3VwZXIuc3RvcExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wU2NoZW1hdGEoKSB7Ci0JCWZvciAoRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEgOiB0aGlzLnNjaGVtYXRhKSB7Ci0JCQlzY2hlbWEuc3RvcExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsZWFyICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotCQlpZiAodGhpcy5zY2hlbWF0YSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNsZWFyU2NoZW1hdGEoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhclNjaGVtYXRhKCkgewotCQl0aGlzLnN0b3BTY2hlbWF0YSgpOwotCQlmb3IgKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hIDogdGhpcy5zY2hlbWF0YSkgewotCQkJc2NoZW1hLmNsZWFyKCk7Ci0JCX0KLQkJdGhpcy5zY2hlbWF0YSA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBTY2hlbWFXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBTY2hlbWFXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkM2EyOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQU2NoZW1hV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBTY2hlbWEKLSAqLwotZmluYWwgY2xhc3MgRFRQU2NoZW1hV3JhcHBlcgotCWV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyCi0JaW1wbGVtZW50cyBTY2hlbWEKLXsKLQkvLyB0aGUgd3JhcHBlZCBEVFAgc2NoZW1hCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYTsKLQotCS8vIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIERUUFRhYmxlV3JhcHBlcltdIHRhYmxlczsKLQotCS8vIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIERUUFNlcXVlbmNlV3JhcHBlcltdIHNlcXVlbmNlczsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBTY2hlbWFXcmFwcGVyKERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIgY29udGFpbmVyLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSkgewotCQlzdXBlcihjb250YWluZXIsIGR0cFNjaGVtYSk7Ci0JCXRoaXMuZHRwU2NoZW1hID0gZHRwU2NoZW1hOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuc2NoZW1hQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU2NoZW1hIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgQ2F0YWxvZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5nZXRDYXRhbG9nKCk7Ci0JfQotCi0JLy8gKioqKiogdGFibGVzCi0KLQlwdWJsaWMgSXRlcmF0b3I8VGFibGU+IHRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFRhYmxlPih0aGlzLmdldFRhYmxlcygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPERUUFRhYmxlV3JhcHBlcj4gdGFibGVXcmFwcGVycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPERUUFRhYmxlV3JhcHBlcj4odGhpcy5nZXRUYWJsZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQVGFibGVXcmFwcGVyW10gZ2V0VGFibGVzKCkgewotCQlpZiAodGhpcy50YWJsZXMgPT0gbnVsbCkgewotCQkJdGhpcy50YWJsZXMgPSB0aGlzLmJ1aWxkVGFibGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudGFibGVzOwotCX0KLQotCXByaXZhdGUgRFRQVGFibGVXcmFwcGVyW10gYnVpbGRUYWJsZXMoKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBkdHBUYWJsZXMgPSB0aGlzLmdldERUUFRhYmxlcygpOwotCQlEVFBUYWJsZVdyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQVGFibGVXcmFwcGVyW2R0cFRhYmxlcy5zaXplKCldOwotCQlmb3IgKGludCBpID0gcmVzdWx0Lmxlbmd0aDsgaS0tID4gMDspIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBEVFBUYWJsZVdyYXBwZXIodGhpcywgZHRwVGFibGVzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZ2V0RFRQVGFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0VGFibGVzKCk7Ci0JfQotCi0JcHVibGljIGludCB0YWJsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZXMoKS5sZW5ndGg7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gdGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPERUUFRhYmxlV3JhcHBlciwgU3RyaW5nPih0aGlzLnRhYmxlV3JhcHBlcnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShEVFBUYWJsZVdyYXBwZXIgdGFibGUpIHsKLQkJCQkgcmV0dXJuIHRhYmxlLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIERUUCB0YWJsZQotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBUYWJsZS5nZXRTY2hlbWEoKSkgPwotCQkJCQkJdGhpcy5nZXRUYWJsZV8oZHRwVGFibGUpCi0JCQkJCToKLQkJCQkJCXRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0VGFibGUoZHRwVGFibGUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgc2NoZW1hIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdGFibGUKLQkgKi8KLQlEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGVfKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlmb3IgKERUUFRhYmxlV3JhcHBlciB0YWJsZSA6IHRoaXMuZ2V0VGFibGVzKCkpIHsKLQkJCWlmICh0YWJsZS53cmFwcyhkdHBUYWJsZSkpIHsKLQkJCQlyZXR1cm4gdGFibGU7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBEVFAgdGFibGU6ICIgKyBkdHBUYWJsZSk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERUUFRhYmxlV3JhcHBlciBnZXRUYWJsZU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlT2JqZWN0TmFtZWQodGhpcy5nZXRUYWJsZXMoKSwgbmFtZSk7Ci0JfQotCi0JLy8gKioqKiogc2VxdWVuY2VzCi0KLQlwdWJsaWMgSXRlcmF0b3I8U2VxdWVuY2U+IHNlcXVlbmNlcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFNlcXVlbmNlPih0aGlzLmdldFNlcXVlbmNlcygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPERUUFNlcXVlbmNlV3JhcHBlcj4gc2VxdWVuY2VXcmFwcGVycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPERUUFNlcXVlbmNlV3JhcHBlcj4odGhpcy5nZXRTZXF1ZW5jZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQU2VxdWVuY2VXcmFwcGVyW10gZ2V0U2VxdWVuY2VzKCkgewotCQlpZiAodGhpcy5zZXF1ZW5jZXMgPT0gbnVsbCkgewotCQkJdGhpcy5zZXF1ZW5jZXMgPSB0aGlzLmJ1aWxkU2VxdWVuY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc2VxdWVuY2VzOwotCX0KLQotCXByaXZhdGUgRFRQU2VxdWVuY2VXcmFwcGVyW10gYnVpbGRTZXF1ZW5jZXMoKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlPiBkdHBTZXF1ZW5jZXMgPSB0aGlzLmdldERUUFNlcXVlbmNlcygpOwotCQlEVFBTZXF1ZW5jZVdyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQU2VxdWVuY2VXcmFwcGVyW2R0cFNlcXVlbmNlcy5zaXplKCldOwotCQlmb3IgKGludCBpID0gcmVzdWx0Lmxlbmd0aDsgaS0tID4gMDspIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBEVFBTZXF1ZW5jZVdyYXBwZXIodGhpcywgZHRwU2VxdWVuY2VzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZT4gZ2V0RFRQU2VxdWVuY2VzKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0U2VxdWVuY2VzKCk7Ci0JfQotCi0JcHVibGljIGludCBzZXF1ZW5jZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZXF1ZW5jZXMoKS5sZW5ndGg7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gc2VxdWVuY2VOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPERUUFNlcXVlbmNlV3JhcHBlciwgU3RyaW5nPih0aGlzLnNlcXVlbmNlV3JhcHBlcnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShEVFBTZXF1ZW5jZVdyYXBwZXIgc2VxdWVuY2UpIHsKLQkJCQkgcmV0dXJuIHNlcXVlbmNlLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgRFRQU2VxdWVuY2VXcmFwcGVyIGdldFNlcXVlbmNlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldFNlcXVlbmNlcygpLCBuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tcGFyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhTY2hlbWEgc2NoZW1hKSB7Ci0JCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcy5nZXROYW1lKCksIHNjaGVtYS5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBzY2hlbWEpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hID09IHNjaGVtYTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBEVFAgY29sdW1uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW4ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMud3JhcHMoZHRwQ29sdW1uLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkpID8KLQkJCQkJCXRoaXMuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pCi0JCQkJCToKLQkJCQkJCXRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q29sdW1uKGR0cENvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBzY2hlbWEgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW4KLQkgKi8KLQlEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbl8ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGVfKGR0cENvbHVtbi5nZXRUYWJsZSgpKS5nZXRDb2x1bW5fKGR0cENvbHVtbik7Ci0JfQotCi0JcHJpdmF0ZSBEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIChEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyKSB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0U2VxdWVuY2VzKCk7Ci0JCX0KLQkJaWYgKHRoaXMudGFibGVzICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRUYWJsZXMoKTsKLQkJfQotCQlzdXBlci5zdGFydExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFNlcXVlbmNlcygpIHsKLQkJZm9yIChEVFBTZXF1ZW5jZVdyYXBwZXIgc2VxdWVuY2UgOiB0aGlzLnNlcXVlbmNlcykgewotCQkJc2VxdWVuY2Uuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFRhYmxlcygpIHsKLQkJZm9yIChEVFBUYWJsZVdyYXBwZXIgdGFibGUgOiB0aGlzLnRhYmxlcykgewotCQkJdGFibGUuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0b3BTZXF1ZW5jZXMoKTsKLQkJfQotCQlpZiAodGhpcy50YWJsZXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wVGFibGVzKCk7Ci0JCX0KLQkJc3VwZXIuc3RvcExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wU2VxdWVuY2VzKCkgewotCQlmb3IgKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSA6IHRoaXMuc2VxdWVuY2VzKSB7Ci0JCQlzZXF1ZW5jZS5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcFRhYmxlcygpIHsKLQkJZm9yIChEVFBUYWJsZVdyYXBwZXIgdGFibGUgOiB0aGlzLnRhYmxlcykgewotCQkJdGFibGUuc3RvcExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsZWFyICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotCQlpZiAodGhpcy5zZXF1ZW5jZXMgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhclNlcXVlbmNlcygpOwotCQl9Ci0JCWlmICh0aGlzLnRhYmxlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNsZWFyVGFibGVzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJTZXF1ZW5jZXMoKSB7Ci0JCXRoaXMuc3RvcFNlcXVlbmNlcygpOwotCQlmb3IgKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSA6IHRoaXMuc2VxdWVuY2VzKSB7Ci0JCQlzZXF1ZW5jZS5jbGVhcigpOwotCQl9Ci0JCXRoaXMuc2VxdWVuY2VzID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJUYWJsZXMoKSB7Ci0JCXRoaXMuc3RvcFRhYmxlcygpOwotCQlmb3IgKERUUFRhYmxlV3JhcHBlciB0YWJsZSA6IHRoaXMudGFibGVzKSB7Ci0JCQl0YWJsZS5jbGVhcigpOwotCQl9Ci0JCXRoaXMudGFibGVzID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFNlcXVlbmNlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQU2VxdWVuY2VXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNTAxMDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQU2VxdWVuY2VXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TZXF1ZW5jZTsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBTZXF1ZW5jZQotICovCi1maW5hbCBjbGFzcyBEVFBTZXF1ZW5jZVdyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcgotCWltcGxlbWVudHMgU2VxdWVuY2UKLXsKLQkvLyB0aGUgd3JhcHBlZCBEVFAgc2VxdWVuY2UKLQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZSBkdHBTZXF1ZW5jZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBTZXF1ZW5jZVdyYXBwZXIoRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZSBkdHBTZXF1ZW5jZSkgewotCQlzdXBlcihzY2hlbWEsIGR0cFNlcXVlbmNlKTsKLQkJdGhpcy5kdHBTZXF1ZW5jZSA9IGR0cFNlcXVlbmNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuc2VxdWVuY2VDaGFuZ2VkKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTZXF1ZW5jZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cFNlcXVlbmNlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiAoRFRQU2NoZW1hV3JhcHBlcikgdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tcGFyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhTZXF1ZW5jZSBzZXF1ZW5jZSkgewotCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKHRoaXMuZ2V0TmFtZSgpLCBzZXF1ZW5jZS5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0JCXJldHVybiB0aGlzLmR0cFNlcXVlbmNlID09IHNlcXVlbmNlOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgY2xlYXIoKSB7Ci0JCS8vIG5vIHN0YXRlIHRvIGNsZWFyCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBUYWJsZVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFRhYmxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUwYmM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFRhYmxlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLlByaW1hcnlLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkJhc2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgVGFibGUKLSAqLwotZmluYWwgY2xhc3MgRFRQVGFibGVXcmFwcGVyCi0JZXh0ZW5kcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIKLQlpbXBsZW1lbnRzIFRhYmxlCi17Ci0JLy8gdGhlIHdyYXBwZWQgRFRQIHRhYmxlCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGU7Ci0KLQkvLyBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBEVFBDb2x1bW5XcmFwcGVyW10gY29sdW1uczsKLQotCS8vIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIERUUENvbHVtbldyYXBwZXJbXSBwcmltYXJ5S2V5Q29sdW1uczsKLQotCS8vIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIERUUEZvcmVpZ25LZXlXcmFwcGVyW10gZm9yZWlnbktleXM7Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERUUENvbHVtbldyYXBwZXJbXSBFTVBUWV9DT0xVTU5TID0gbmV3IERUUENvbHVtbldyYXBwZXJbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRQRm9yZWlnbktleVdyYXBwZXJbXSBFTVBUWV9GT1JFSUdOX0tFWVMgPSBuZXcgRFRQRm9yZWlnbktleVdyYXBwZXJbMF07Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQVGFibGVXcmFwcGVyKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJc3VwZXIoc2NoZW1hLCBkdHBUYWJsZSk7Ci0JCXRoaXMuZHRwVGFibGUgPSBkdHBUYWJsZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnRhYmxlQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBUYWJsZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIERUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gKERUUFNjaGVtYVdyYXBwZXIpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLy8gKioqKiogY29sdW1ucwotCi0JcHVibGljIEl0ZXJhdG9yPENvbHVtbj4gY29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPENvbHVtbj4odGhpcy5nZXRDb2x1bW5zKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8RFRQQ29sdW1uV3JhcHBlcj4gY29sdW1uV3JhcHBlcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxEVFBDb2x1bW5XcmFwcGVyPih0aGlzLmdldENvbHVtbnMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQQ29sdW1uV3JhcHBlcltdIGdldENvbHVtbnMoKSB7Ci0JCWlmICh0aGlzLmNvbHVtbnMgPT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5zID0gdGhpcy5idWlsZENvbHVtbnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb2x1bW5zOwotCX0KLQotCXByaXZhdGUgRFRQQ29sdW1uV3JhcHBlcltdIGJ1aWxkQ29sdW1ucygpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBkdHBDb2x1bW5zID0gdGhpcy5nZXREVFBDb2x1bW5zKCk7Ci0JCURUUENvbHVtbldyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQQ29sdW1uV3JhcHBlcltkdHBDb2x1bW5zLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gbmV3IERUUENvbHVtbldyYXBwZXIodGhpcywgZHRwQ29sdW1ucy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5kdHBUYWJsZS5nZXRDb2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBjb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1ucygpLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPERUUENvbHVtbldyYXBwZXIsIFN0cmluZz4odGhpcy5jb2x1bW5XcmFwcGVycygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKERUUENvbHVtbldyYXBwZXIgbmV4dCkgewotCQkJCSByZXR1cm4gbmV4dC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjb2x1bW4gZm9yIHRoZSBzcGVjaWZpZWQgRFRQIGNvbHVtbgotCSAqLwotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCS8vIHRyeSB0byBzaG9ydC1jaXJjdWl0IHRoZSBzZWFyY2gKLQkJcmV0dXJuIHRoaXMud3JhcHMoZHRwQ29sdW1uLmdldFRhYmxlKCkpID8KLQkJCQkJCXRoaXMuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pCi0JCQkJCToKLQkJCQkJCXRoaXMuZ2V0U2NoZW1hKCkuZ2V0Q29sdW1uKGR0cENvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSB0YWJsZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNvbHVtbgotCSAqLwotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uXyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQlmb3IgKERUUENvbHVtbldyYXBwZXIgY29sdW1uIDogdGhpcy5nZXRDb2x1bW5zKCkpIHsKLQkJCWlmIChjb2x1bW4ud3JhcHMoZHRwQ29sdW1uKSkgewotCQkJCXJldHVybiBjb2x1bW47Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBEVFAgY29sdW1uOiAiICsgZHRwQ29sdW1uKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5OYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhYmFzZU9iamVjdE5hbWVkKHRoaXMuZ2V0Q29sdW1ucygpLCBuYW1lKTsKLQl9Ci0KLQkvLyAqKioqKiBwcmltYXJ5S2V5Q29sdW1ucwotCi0JcHVibGljIEl0ZXJhdG9yPENvbHVtbj4gcHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxDb2x1bW4+KHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSk7Ci0JfQotCi0JcHVibGljIERUUENvbHVtbldyYXBwZXIgZ2V0UHJpbWFyeUtleUNvbHVtbigpIHsKLQkJRFRQQ29sdW1uV3JhcHBlcltdIHBrQ29sdW1ucyA9IHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKLQkJaWYgKHBrQ29sdW1ucy5sZW5ndGggIT0gMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibXVsdGlwbGUgcHJpbWFyeSBrZXkgY29sdW1uczogIiArIHBrQ29sdW1ucy5sZW5ndGgpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBwa0NvbHVtbnNbMF07Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQQ29sdW1uV3JhcHBlcltdIGdldFByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlpZiAodGhpcy5wcmltYXJ5S2V5Q29sdW1ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLnByaW1hcnlLZXlDb2x1bW5zID0gdGhpcy5idWlsZFByaW1hcnlLZXlDb2x1bW5zKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucHJpbWFyeUtleUNvbHVtbnM7Ci0JfQotCi0JcHJpdmF0ZSBEVFBDb2x1bW5XcmFwcGVyW10gYnVpbGRQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJaWYgKCAhICh0aGlzLmR0cFRhYmxlIGluc3RhbmNlb2YgQmFzZVRhYmxlKSkgewotCQkJcmV0dXJuIEVNUFRZX0NPTFVNTlM7Ci0JCX0KLQkJUHJpbWFyeUtleSBwayA9ICgoQmFzZVRhYmxlKSB0aGlzLmR0cFRhYmxlKS5nZXRQcmltYXJ5S2V5KCk7Ci0JCWlmIChwayA9PSBudWxsKSB7Ci0JCQkvLyBubyBQSyB3YXMgZGVmaW5lZAotCQkJcmV0dXJuIEVNUFRZX0NPTFVNTlM7Ci0JCX0KLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBwa0NvbHVtbnMgPSB0aGlzLmdldENvbHVtbnMocGspOwotCQlEVFBDb2x1bW5XcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUENvbHVtbldyYXBwZXJbcGtDb2x1bW5zLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gdGhpcy5nZXRDb2x1bW4ocGtDb2x1bW5zLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGdldENvbHVtbnMoUHJpbWFyeUtleSBwaykgewotCQlyZXR1cm4gcGsuZ2V0TWVtYmVycygpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJpbWFyeUtleUNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLmxlbmd0aDsKLQl9Ci0KLQlib29sZWFuIHByaW1hcnlLZXlDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSwgY29sdW1uKTsKLQl9Ci0KLQkvLyAqKioqKiBmb3JlaWduS2V5cwotCi0JcHVibGljIEl0ZXJhdG9yPEZvcmVpZ25LZXk+IGZvcmVpZ25LZXlzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8Rm9yZWlnbktleT4odGhpcy5nZXRGb3JlaWduS2V5cygpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBGb3JlaWduS2V5V3JhcHBlcltdIGdldEZvcmVpZ25LZXlzKCkgewotCQlpZiAodGhpcy5mb3JlaWduS2V5cyA9PSBudWxsKSB7Ci0JCQl0aGlzLmZvcmVpZ25LZXlzID0gdGhpcy5idWlsZEZvcmVpZ25LZXlzKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZm9yZWlnbktleXM7Ci0JfQotCi0JcHJpdmF0ZSBEVFBGb3JlaWduS2V5V3JhcHBlcltdIGJ1aWxkRm9yZWlnbktleXMoKSB7Ci0JCWlmICggISAodGhpcy5kdHBUYWJsZSBpbnN0YW5jZW9mIEJhc2VUYWJsZSkpIHsKLQkJCXJldHVybiBFTVBUWV9GT1JFSUdOX0tFWVM7Ci0JCX0KLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5PiBkdHBGb3JlaWduS2V5cyA9IHRoaXMuZ2V0RFRQRm9yZWlnbktleXMoKTsKLQkJRFRQRm9yZWlnbktleVdyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQRm9yZWlnbktleVdyYXBwZXJbZHRwRm9yZWlnbktleXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRFRQRm9yZWlnbktleVdyYXBwZXIodGhpcywgZHRwRm9yZWlnbktleXMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5PiBnZXREVFBGb3JlaWduS2V5cygpIHsKLQkJcmV0dXJuICgoQmFzZVRhYmxlKSB0aGlzLmR0cFRhYmxlKS5nZXRGb3JlaWduS2V5cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZm9yZWlnbktleXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRGb3JlaWduS2V5cygpLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbHVtbiBpcyBhIGJhc2UgY29sdW1uIGZvciBhdCBsZWFzdCBvbmUKLQkgKiBvZiB0aGUgdGhlIHRhYmxlJ3MgZm9yZWlnbiBrZXlzCi0JICovCi0JYm9vbGVhbiBmb3JlaWduS2V5QmFzZUNvbHVtbnNDb250YWlucyhDb2x1bW4gY29sdW1uKSB7Ci0JCWZvciAoRFRQRm9yZWlnbktleVdyYXBwZXIgZmtXcmFwcGVyIDogdGhpcy5nZXRGb3JlaWduS2V5cygpKSB7Ci0JCQlpZiAoZmtXcmFwcGVyLmJhc2VDb2x1bW5zQ29udGFpbnMoY29sdW1uKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAqKioqKiBqb2luIHRhYmxlCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1Bvc3NpYmxlSm9pblRhYmxlKCkgewotCQlpZiAodGhpcy5nZXRGb3JlaWduS2V5cygpLmxlbmd0aCAhPSAyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgdGFibGUgbXVzdCBoYXZlIGV4YWN0bHkgMiBmb3JlaWduIGtleXMKLQkJfQotCQlmb3IgKENvbHVtbiBjb2x1bW4gOiB0aGlzLmdldENvbHVtbnMoKSkgewotCQkJaWYgKCAhIHRoaXMuZm9yZWlnbktleUJhc2VDb2x1bW5zQ29udGFpbnMoY29sdW1uKSkgewotCQkJCXJldHVybiBmYWxzZTsgIC8vIGFsbCB0aGUgdGFibGUncyBjb2x1bW5zIG11c3QgYmVsb25nIHRvIG9uZSAob3IgYm90aCkgb2YgdGhlIDIgZm9yZWlnbiBrZXlzCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHRhYmxlIG5hbWUgaXMgRk9PX0JBUiBhbmQgaXQgam9pbnMgdGFibGVzIEZPTyBhbmQgQkFSLAotCSAqIHJldHVybiB0aGUgZm9yZWlnbiBrZXkgdG8gRk9POwotCSAqIGlmIHRoZSB0YWJsZSBuYW1lIGlzIEJBUl9GT08gYW5kIGl0IGpvaW5zIHRhYmxlcyBGT08gYW5kIEJBUiwKLQkgKiByZXR1cm4gdGhlIGZvcmVpZ24ga2V5IHRvIEJBUjsKLQkgKiBvdGhlcndpc2Ugc2ltcGx5IHJldHVybiB0aGUgZmlyc3QgZm9yZWlnbiBrZXkgaW4gdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBGb3JlaWduS2V5IGdldEpvaW5UYWJsZU93bmluZ0ZvcmVpZ25LZXkoKSB7Ci0JCUZvcmVpZ25LZXkgZmswID0gdGhpcy5nZXRGb3JlaWduS2V5cygpWzBdOwotCQlTdHJpbmcgbmFtZTAgPSBmazAuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpOwotCi0JCUZvcmVpZ25LZXkgZmsxID0gdGhpcy5nZXRGb3JlaWduS2V5cygpWzFdOwotCQlTdHJpbmcgbmFtZTEgPSBmazEuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpOwotCi0JCXJldHVybiB0aGlzLmdldE5hbWUoKS5lcXVhbHMobmFtZTEgKyAnXycgKyBuYW1lMCkgPyBmazEgOiBmazA7Ci0JfQotCi0JcHVibGljIEZvcmVpZ25LZXkgZ2V0Sm9pblRhYmxlTm9uT3duaW5nRm9yZWlnbktleSgpIHsKLQkJRm9yZWlnbktleSBmazAgPSB0aGlzLmdldEZvcmVpZ25LZXlzKClbMF07Ci0JCUZvcmVpZ25LZXkgZmsxID0gdGhpcy5nZXRGb3JlaWduS2V5cygpWzFdOwotCQlGb3JlaWduS2V5IG9mayA9IHRoaXMuZ2V0Sm9pblRhYmxlT3duaW5nRm9yZWlnbktleSgpOwotCQlyZXR1cm4gKG9mayA9PSBmazApID8gZmsxIDogZmswOwotCX0KLQotCS8qKgotCSAqIEhtbW0uLi4uCi0JICogV2UgbWlnaHQgd2FudCB0byBnbyB0byB0aGUgcGxhdGZvcm0gdG8gYWxsb3cgYSB2ZW5kb3Itc3BlY2lmaWMKLQkgKiBjb21wYXJpc29uIGhlcmU7Ci0JICogYnV0LCBzaW5jZSBhbGwgdGhlIG5hbWVzIGFyZSBjb21pbmcgZGlyZWN0bHkgZnJvbSB0aGUgZGF0YWJhc2UKLQkgKiAoaS5lLiB0aGVyZSBhcmUgbm8gY29udmVyc2lvbnMgdG8gSmF2YSBpZGVudGlmaWVycyBldGMuKSwgaXQgc2VlbXMKLQkgKiBsaWtlIHdlIGNhbiBqdXN0IGNvbXBhcmUgdGhlbSBkaXJlY3RseSBhbmQgaWdub3JlIGNhc2Utc2Vuc2l0aXZpdHkKLQkgKiBpc3N1ZXMuLi4uICB+Ymp2Ci0JICovCi0JcHVibGljIGJvb2xlYW4gam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TmFtZSgpLmVxdWFscyh0aGlzLmJ1aWxkRGVmYXVsdEpvaW5UYWJsZU5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0Sm9pblRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Sm9pblRhYmxlT3duaW5nVGFibGUoKS5nZXROYW1lKCkKLQkJCQkJKyAnXycKLQkJCQkJKyB0aGlzLmdldEpvaW5UYWJsZU5vbk93bmluZ1RhYmxlKCkuZ2V0TmFtZSgpOwotCX0KLQotCXByaXZhdGUgVGFibGUgZ2V0Sm9pblRhYmxlT3duaW5nVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpvaW5UYWJsZU93bmluZ0ZvcmVpZ25LZXkoKS5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlIGdldEpvaW5UYWJsZU5vbk93bmluZ1RhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKb2luVGFibGVOb25Pd25pbmdGb3JlaWduS2V5KCkuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbXBhcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBjb21wYXJlVG8oVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0aGlzLmdldE5hbWUoKSwgdGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlib29sZWFuIHdyYXBzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gdGhpcy5kdHBUYWJsZSA9PSB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIERUUCB0YWJsZQotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgdGFibGUpIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyh0YWJsZSkgPyB0aGlzIDogdGhpcy5nZXRTY2hlbWEoKS5nZXRUYWJsZSh0YWJsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdGFydExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdGFydEZvcmVpZ25LZXlzKCk7Ci0JCX0KLQkJaWYgKHRoaXMuY29sdW1ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0Q29sdW1ucygpOwotCQl9Ci0JCXN1cGVyLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0Rm9yZWlnbktleXMoKSB7Ci0JCWZvciAoRFRQRm9yZWlnbktleVdyYXBwZXIgZm9yZWlnbktleSA6IHRoaXMuZm9yZWlnbktleXMpIHsKLQkJCWZvcmVpZ25LZXkuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydENvbHVtbnMoKSB7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmNvbHVtbnMpIHsKLQkJCWNvbHVtbi5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wRm9yZWlnbktleXMoKTsKLQkJfQotCQlpZiAodGhpcy5jb2x1bW5zICE9IG51bGwpIHsKLQkJCXRoaXMuc3RvcENvbHVtbnMoKTsKLQkJfQotCQlzdXBlci5zdG9wTGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BGb3JlaWduS2V5cygpIHsKLQkJZm9yIChEVFBGb3JlaWduS2V5V3JhcHBlciBmb3JlaWduS2V5IDogdGhpcy5mb3JlaWduS2V5cykgewotCQkJZm9yZWlnbktleS5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcENvbHVtbnMoKSB7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmNvbHVtbnMpIHsKLQkJCWNvbHVtbi5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xlYXIgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhckZvcmVpZ25LZXlzKCk7Ci0JCX0KLQotCQkvLyB0aGUgdGFibGUgZG9lcyBub3QgImNvbnRhaW4iIHRoZSBwayBjb2x1bW5zLCBzbyBubyBuZWVkIHRvIGZvcndhcmQgI2NsZWFyKCkKLQkJdGhpcy5wcmltYXJ5S2V5Q29sdW1ucyA9IG51bGw7Ci0KLQkJaWYgKHRoaXMuY29sdW1ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNsZWFyQ29sdW1ucygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRm9yZWlnbktleXMoKSB7Ci0JCXRoaXMuc3RvcEZvcmVpZ25LZXlzKCk7Ci0JCWZvciAoRFRQRm9yZWlnbktleVdyYXBwZXIgZm9yZWlnbktleSA6IHRoaXMuZm9yZWlnbktleXMpIHsKLQkJCWZvcmVpZ25LZXkuY2xlYXIoKTsKLQkJfQotICAgIAl0aGlzLmZvcmVpZ25LZXlzID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJDb2x1bW5zKCkgewotCQl0aGlzLnN0b3BDb2x1bW5zKCk7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmNvbHVtbnMpIHsKLQkJCWNvbHVtbi5jbGVhcigpOwotCQl9Ci0gICAgCXRoaXMuY29sdW1ucyA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNjcwZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjM0ZGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5oZWxwO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzYWY2ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTUgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5BYm91dCB0aGlzIGNvbnRlbnQ8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJBYm91dCB0aGlzIGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjI1NyIgbmFtZT0ic3RocmVmMjU3Ij48L2E+Ci08aDE+QWJvdXQgdGhpcyBjb250ZW50PC9oMT4KLTxwPkphbnVhcnksIDIwMDg8L3A+Ci08YSBpZD0ic3RocmVmMjU4IiBuYW1lPSJzdGhyZWYyNTgiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TGljZW5zZTwvcD4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+LiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPjwvY29kZT4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzNhZjZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTUgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5BYm91dCB0aGlzIGNvbnRlbnQ8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJBYm91dCB0aGlzIGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjI1NyIgbmFtZT0ic3RocmVmMjU3Ij48L2E+Ci08aDE+QWJvdXQgdGhpcyBjb250ZW50PC9oMT4KLTxwPkphbnVhcnksIDIwMDg8L3A+Ci08YSBpZD0ic3RocmVmMjU4IiBuYW1lPSJzdGhyZWYyNTgiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TGljZW5zZTwvcD4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+LiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPjwvY29kZT4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWNkNzUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGNoZWF0c2hlZXRzLyxcCi0gICAgICAgICAgICAgICBkY29tbW9uLyxcCi0gICAgICAgICAgICAgICBpbWcvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgY29uY2VwdF9tYXBwaW5nLmh0bSxcCi0gICAgICAgICAgICAgICBjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSxcCi0gICAgICAgICAgICAgICBjb25jZXB0cy5odG0sXAotICAgICAgICAgICAgICAgY29uY2VwdHMwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzMDAyLmh0bSxcCi0gICAgICAgICAgICAgICBjb25jZXB0czAwMy5odG0sXAotICAgICAgICAgICAgICAgY29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIGdldHRpbmdfc3RhcnRlZC5odG0sXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkMDAxLmh0bSxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtLFwKLSAgICAgICAgICAgICAgIGdldHRpbmdfc3RhcnRlZDAwMy5odG0sXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSxcCi0gICAgICAgICAgICAgICBpbmRleC54bWwsXAotICAgICAgICAgICAgICAgbGVnYWwuaHRtLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcmVmX2RldGFpbHNfb3JtLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfanBhX2ZhY2V0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfbWFwcGluZ19nZW5lcmFsLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0sXAotICAgICAgICAgICAgICAgcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0sXAotICAgICAgICAgICAgICAgcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcHJpbWFyeV9rZXkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDAxLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDIuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwMy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwNi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA3Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDguaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwOS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDEwLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTEuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxMi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDEzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxNS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE2Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxOC5odG0sXAotICAgICAgICAgICAgICAgdGFza19hZGRfcGVyc2lzdGVuY2UuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0sXAotICAgICAgICAgICAgICAgdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfaW5oZXJpdGFuY2UuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfbWFuYWdlX29ybS5odG0sXAotICAgICAgICAgICAgICAgdGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfbWFwcGluZy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDAxLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwMi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA0Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwNS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDYuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA3Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwOC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDkuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDEwLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxMS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTIuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDEzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxNC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTUuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE2Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxNy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTguaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE5Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyMC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjEuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDIyLmh0bSxcCi0gICAgICAgICAgICAgICB0aXBzX2FuZF90cmlja3MuaHRtLFwKLSAgICAgICAgICAgICAgIHRvYy54bWwsXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3Lmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwMi5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDAzLmh0bSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjAuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyMS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDIyLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyNC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI1Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjYuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyNy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI4Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMzAuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyOS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDMxLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMzIuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDM0Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyMy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjQuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDI1Lmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwNS5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDA2Lmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDcuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwOC5odG0KLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9hZGRfcGVyc2lzdGVuY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJlZWRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9hZGRfcGVyc2lzdGVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCI+Ci0gICA8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBhdXRvbWF0aWNhbGx5IGxhdW5jaCB3aXphcmRzLCBwZXJmb3JtIGFjdGlvbnMsIGFuZCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgdG8gY3JlYXRlIGEgSlBBIHByb2plY3QuIAotCi1UbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIGNoZWF0IHNoZWV0cywgb3IgdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgY2hlYXQgc2hlZXRzLCBjbGljayBIZWxwICg/KS4gCi1UbyBzdGFydCB3b3JrIHdvcmtpbmcgb24gdGhpcyBjaGVhdCBzaGVldCBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gQmVnaW4mcXVvdDsgYnV0dG9uIGJlbG93LiAKLQotTGV0JmFwb3M7cyBnZXQgc3RhcnRlZCEKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2ludHJvPgotICAgPGl0ZW0gdGl0bGU9IlNldHVwIHRoZSBFbnZpcm9ubWVudCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmRhdGF0b29scy5kb2MudXNlci9jX2RhdGFiYXNlX2RldmVsb3BtZW50X3NldHVwLmh0bWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgWW91ciBlbnZpcm9ubWVudCBtdXN0IGJlIHNldCB1cCBiZWZvcmUgeW91IGNhbiBwZXJmb3JtIHRoZSBzdGVwcyBpbiB0aGlzIGNoZWF0IHNoZWV0LiAKLQotQ3JlYXRlIGEgZGF0YWJhc2UgcHJvZmlsZSBhbmQgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0KLVRoZSBEYXRhYmFzZSBDb25uZWN0aW9uIGRpYWxvZyBhdXRvbWF0aWNhbGx5IGFwcGVhcnMgd2hlbiB5b3UgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIFBlcmZvcm0mcXVvdDsgYnV0dG9uLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxjb21tYW5kIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5zcWxlZGl0b3IuYXR0YWNoUHJvZmlsZUFjdGlvbiIgY29uZmlybT0iZmFsc2UiPgotICAgICAgPC9jb21tYW5kPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEpQQSBQcm9qZWN0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVXNlIHRoZSBOZXcgUHJvamVjdCBXaXphcmQgdG8gY3JlYXRlIGEgSlBBIHByb2plY3QuIAotU2VsZWN0IDxiPkZpbGUtJmd0O05ldy0mZ3Q7UHJvamVjdC4uLjwvYj4gYW5kIGNob29zZSA8Yj5KUEEtJmd0O0pQQSBQcm9qZWN0PC9iPiBpbiB0aGUgbGlzdC4gCi0KLU9uIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB3aXphcmQsIGVudGVyIGEgcHJvamVjdCBuYW1lIGFuZCBsb2NhdGlvbiwgc2VsZWN0IHlvdXIgdGFyZ2V0IHJ1bnRpbWUsIGFuZCBzZWxlY3QgYSBwcmVkZWZpbmVkIHByb2plY3QgY29uZmlndXJhdGlvbi4KLQotQ2xpY2sgPGI+TmV4dDwvYj4gdG8gZGlzcGxheSB0aGUgbmV4dCBwYWdlIG9mIHRoZSB3aXphcmQuCi0KLVRoZSAmcXVvdDtOZXcgSlBBIFByb2plY3QmcXVvdDsgd2l6YXJkIGlzIGF1dG9tYXRpY2FsbHkgZGlzcGxheWVkIHdoZW4geW91IGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbi4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8YWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5PcGVuUHJvamVjdFdpemFyZEFjdGlvbiIgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLmpkdC51aSIgY29uZmlybT0iZmFsc2UiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iU2VsZWN0IFByb2plY3QgRmFjZXQiIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIiBocmVmPSIvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLXByb2plY3RzLmh0bWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVXNlIHRoZSBQcm9qZWN0IEZhY2V0IHBhZ2UgdG8gc2VsZWN0IGEgcHJlZGVmaW5lZCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gb3Igc3BlY2lmaWMgc3BlY2lmaWMgZmFjZXRzIHRvIGluY2x1ZGUgaW4gdGhlIHByb2plY3QuIAotCi1DbGljayAmcXVvdDtOZXh0JnF1b3Q7IHRvIGRpc3BsYXkgdGhlIG5leHQgcGFnZSBvZiB0aGUgd2l6YXJkLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJTcGVjaWZ5IHRoZSBKUEEgRmFjZXQiIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIiBocmVmPSIvb3JnLmVjbGlwc2UuamR0LmRvYy51c2VyL3JlZl9qcGFfZmFjZXQuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgSlBBIEZhY2V0IHBhZ2UgdG8gc3BlY2lmeSB0aGUgdGhlIHZlbmRvci1zcGVjaWZpYyBKUEEgcGxhdGZvcm0sIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSwgYW5kIHRoZSBzcGVjaWZpYyBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeS4gCi0KLVlvdSBjYW4gYWxzbyBzcGVjaWZ5IGlmIERhbGkgc2hvdWxkIGNyZWF0ZSBhbiBvcm0ueG1sIGZpbGUuCi0KLUlmIHlvdSBkbyBub3QgaGF2ZSBhbiBhY3RpdmUgZGF0YWJhc2UgY29ubmVjdGlvbiwgY2xpY2sgPGI+QWRkIENvbm5lY3Rpb25zPC9iPiB0byBjcmVhdGUgb25lLiAKLQotSWYgeW91IGRvIG5vdCBoYXZlIGEgZGVmaW5lZCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSwgY2xpY2sgPGI+Q29uZmlndXJlIGRlZmF1bHQgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnk8L2I+IG9yIDxiPkNvbmZpZ3VyZSB1c2VyIGxpYnJhcmllczwvYj4gdG8gZGVmaW5lIG9uZS4gCi0KLUNsaWNrIDxiPkZpbmlzaDwvYj4gdG8gY29tcGxldGUgdGhlIHdpemFyZCBhbmQgb3BlbiB0aGUgb3BlbiB0aGUgcHJvamVjdC4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iRmluaXNoIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBDb25ncmF0dWxhdGlvbnMhIFlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGEgSlBBIHByb2plY3QuIENvbXBsZXRlIHRoZSBhZGRpdGlvbmFsIGNoZWF0IHNoZWV0cyB0byBhZGQgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBtYXAgdGhvc2UgZW50aXRpZXMgdG8gZGF0YWJhc2UgdGFibGVzLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGVfZW50aXR5LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGVfZW50aXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0ZThhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoZWF0c2hlZXQgdGl0bGU9IkNyZWF0ZSBhIFBlcnNpc3RlbnQgRW50aXR5Ij4KLQk8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4KLQkJPGRlc2NyaXB0aW9uPgotVGhpcyBjaGVhdCBzaGVldCB3aWxsIGF1dG9tYXRpY2FsbHkgbGF1bmNoIHdpemFyZHMsIHBlcmZvcm0gYWN0aW9ucywgYW5kIGd1aWRlIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyB0byBhZGQgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHRvIHlvdXIgSmF2YSBwcm9qZWN0LiAKLVRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgY2hlYXQgc2hlZXRzIG9yIHRvIHNlZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNoZWF0IHNoZWV0cywgY2xpY2sgSGVscCAoPykuIAotVG8gc3RhcnQgd29yayB3b3JraW5nIG9uIHRoaXMgY2hlYXQgc2hlZXQsIGNsaWNrIHRoZSA8Yj5DbGljayB0byBCZWdpbjwvYj4gYnV0dG9uIGJlbG93LiAKLUxldCdzIGdldCBzdGFydGVkIQotICA8L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0JPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEpQQSBQcm9qZWN0IiBza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPgotVG8gY3JlYXRlIGEgUGVyc2lzdGVudCBlbnRpdHksIHlvdSBtdXN0IGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiBJZiB5b3UgYWxyZWFkeSBoYXZlIGEgSlBBIHByb2plY3QsIHlvdSBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICJDbGljayB0byBTa2lwIiBidXR0b24uCi1JZiBub3QsIHNlbGVjdCA8Yj5GaWxlLT5OZXctPlByb2plY3QuLi48L2I+IGFuZCBjaG9vc2UgPGI+SlBBLT5KUEEgUHJvamVjdDwvYj4gaW4gdGhlIGxpc3QuIENvbXBsZXRlIGVhY2ggcGFnZSBvZiB0aGUgQ3JlYXRlIEpQQSBQcm9qZWN0IHdpemFyZCB0byBjcmVhdGUgYSBuZXcgSlBBIHByb2plY3QuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iT3BlbiB0aGUgSlBBIERldmVsb3BtZW50IFBlcnNwZWN0aXZlIiBza2lwPSJ0cnVlIiBocmVmPSIvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0iPgotCQk8YWN0aW9uIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLmFjdGlvbnMuT3BlblBlcnNwZWN0aXZlIiBwYXJhbTE9Im9yZy5lY2xpcHNlLmpwdC51aS5QZXJzaXN0ZW5jZVBlcnNwZWN0aXZlIi8+Ci0JCTxkZXNjcmlwdGlvbj4KLVdoZW4gd29ya2luZyB3aXRoIEpQQSAgcGVyc2lzdGVuY2UsIHlvdSBzaG91bGQgdXNlIHRoZSBQZXJzaXN0ZW5jZSBwZXJzcGVjdGl2ZS4gSWYgeW91IGFscmVhZHkgaGF2ZSB0aGUgUGVyc2lzdGVuY2UgcGVyc3BlY3RpdmUgYWN0aXZlLCB5b3UgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAiQ2xpY2sgdG8gU2tpcCIgYnV0dG9uLiAKLUlmIG5vdCwgc2VsZWN0IDxiPldpbmRvdy0+T3BlbiBQZXJzcGVjdGl2ZS0+T3RoZXI8L2I+IGluIHRoZSBtZW51YmFyIGF0IHRoZSB0b3Agb2YgdGhlIHdvcmtiZW5jaC4gSW4gdGhlIFNlbGVjdCBQZXJzcGVjdGl2ZXMgZGlhbG9nLCBzZWxlY3QgPGI+SlBBIERldmVsb3BtZW50PC9iPiBhbmQgY2xpY2sgT0suIFRoaXMgc3RlcCBjaGFuZ2VzIHRoZSBwZXJzcGVjdGl2ZSB0byBzZXQgdXAgdGhlIEVjbGlwc2Ugd29ya2JlbmNoIGZvciBKUEEgZGV2ZWxvcG1lbnQuCi1Zb3UgY2FuIGNsaWNrIHRoZSAiQ2xpY2sgdG8gUGVyZm9ybSIgYnV0dG9uIHRvIGhhdmUgdGhlICJQZXJzaXN0ZW5jZSIgcGVyc3BlY3RpdmUgb3BlbmVkIGF1dG9tYXRpY2FsbHkuCi0gICA8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgSmF2YSBDbGFzcyI+Ci0JCTxkZXNjcmlwdGlvbj4KLVRoZSBuZXh0IHN0ZXAgaXMgdG8gY3JlYXRlIGEgbmV3IEphdmEgY2xhc3MuIEluIHRoZSBtYWluIHRvb2xiYXIgYWdhaW4sIGNsaWNrIG9uIDxiPk5ldyBKYXZhIENsYXNzPC9iPiBidXR0b24gKG9yIHRoZSBsaW5rIGJlbG93KS4KLVRoZSBKYXZhIGVkaXRvciB3aWxsIGF1dG9tYXRpY2FsbHkgb3BlbiBzaG93aW5nIHlvdXIgbmV3IGNsYXNzLiAgICAgIAotICAgICA8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgUGVyc2lzdGVudCBFbnRpdHkiPgotCQk8ZGVzY3JpcHRpb24+Ci1GaW5hbGx5IHdlIHdpbGwgbWFrZSB0aGUgSmF2YSBjbGFzcyBhIHBlcnNpc3RlbnQgZW50aXR5LgotSW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldyBzZWxlY3QgdGhlIEphdmEgY2xhc3MuIAotSW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcsIHVzZSB0aGUgIk1hcCBBcyIgZmllbGQgdG8gc2VsZWN0IDxiPkVudGl0eTwvYj4uIERhbGkgYXV0b21hdGljYWxseSBhZGRzIHRoZSBARW50aXR5IGFubm90YXRpb24gdG8gdGhlIGNsYXNzIGluIHRoZSBKYXZhIGVkaXRvci4gCi1Vc2UgdGhlIFRhYmxlLCBDYXRhbG9nLCBhbmQgU2NoZW1hIGZpZWxkcyB0byBhc3NvY2lhdGUgdGhlIGVudGl0eSB3aXRoIGEgc3BlY2lmaWMgdGFibGUgaW4gdGhlIGRhdGFiYXNlLgotICAgICA8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRmluaXNoIj4KLQkJPGRlc2NyaXB0aW9uPgotQ29uZ3JhdHVsYXRpb25zISBZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgYWRkZWQgYSBKUEEgZW50aXR5IHRvIHlvdXIgSlBBIHByb2plY3QuIENvbXBsZXRlIHRoZSBhZGRpdGlvbmFsIGNoZWF0IHNoZWV0cyB0byBtYXAgdGhlIGVudGl0eSdzIGZpZWxkcyB0byBkYXRhYmFzZSB0YWJsZXMuCi0gIDwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL21hcF9lbnRpdHkueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL21hcF9lbnRpdHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzMwN2YyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hlYXRzaGVldCB0aXRsZT0iTWFwIGEgSmF2YSBQZXJzaXN0ZW50IEVudGl0eSI+Ci0gICA8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBhdXRvbWF0aWNhbGx5IGxhdW5jaCB3aXphcmRzLCBwZXJmb3JtIGFjdGlvbnMsIGFuZCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgdG8gbWFwIHRoZSBmaWVsZHMgb2YgYSBKUEEgZW50aXR5IGVudGl0eSB0byB5b3VyIGRhdGFiYXNlLgotCi1UbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIGNoZWF0IHNoZWV0cyBvciB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBjaGVhdCBzaGVldHMsIGNsaWNrIEhlbHAgKD8pLiAKLVRvIHN0YXJ0IHdvcmsgd29ya2luZyBvbiB0aGlzIGNoZWF0IHNoZWV0LCBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gQmVnaW4mcXVvdDsgYnV0dG9uIGJlbG93LiAKLQotTGV0JmFwb3M7cyBnZXQgc3RhcnRlZCEKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2ludHJvPgotICAgPGl0ZW0gdGl0bGU9IlNldHVwIHRoZSBFbnZpcm9ubWVudCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmRhdGF0b29scy5kb2MudXNlci9jX2RhdGFiYXNlX2RldmVsb3BtZW50X3NldHVwLmh0bWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgWW91ciBlbnZpcm9ubWVudCBtdXN0IGJlIHNldCB1cCBiZWZvcmUgeW91IGNhbiBwZXJmb3JtIHRoZSBzdGVwcyBpbiB0aGlzIGNoZWF0IHNoZWV0LiAKLQotQ3JlYXRlIGEgZGF0YWJhc2UgcHJvZmlsZSBhbmQgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0KLUlmIHlvdSBhbHJlYWR5IGhhdmUgKGFuZCBhcmUgY29ubmVjdGVkIHRvKSBhIGRhdGFiYXNlIGNvbm5lY3Rpb24sIHlvdSAgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtDbGljayB0byBTa2lwJnF1b3Q7IGJ1dHRvbi4KLQotVGhlIERhdGFiYXNlIENvbm5lY3Rpb24gZGlhbG9nIGF1dG9tYXRpY2FsbHkgYXBwZWFycyB3aGVuIHlvdSBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGNvbW1hbmQgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLnNxbGVkaXRvci5hdHRhY2hQcm9maWxlQWN0aW9uIiBjb25maXJtPSJmYWxzZSI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgSlBBIFByb2plY3QiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgTmV3IFByb2plY3QgV2l6YXJkIHRvIGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiAKLVNlbGVjdCA8Yj5GaWxlLSZndDtOZXctJmd0O1Byb2plY3QuLi48L2I+IGFuZCBjaG9vc2UgPGI+SlBBLSZndDtKUEEgUHJvamVjdDwvYj4gaW4gdGhlIGxpc3QuIAotCi1Db21wbGV0ZSBlYWNoIHBhZ2Ugb2YgdGhlIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgSlBBIHByb2plY3QuCi0KLVRoZSAmcXVvdDtOZXcgSlBBIFByb2plY3QmcXVvdDsgd2l6YXJkIGlzIGF1dG9tYXRpY2FsbHkgZGlzcGxheWVkIHdoZW4geW91IGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbi4KLQotSWYgeW91IGFscmVhZHkgaGF2ZSBhIEpQQSBwcm9qZWN0LCB5b3UgIG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gU2tpcCZxdW90OyBidXR0b24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuT3BlblByb2plY3RXaXphcmRBY3Rpb24iIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5qZHQudWkiIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9Ik9wZW4gdGhlIEpQQSBEZXZlbG9wbWVudCBQZXJzcGVjdGl2ZSIgZGlhbG9nPSJmYWxzZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFdoZW4gd29ya2luZyB3aXRoIEpQQSAgcGVyc2lzdGVuY2UsIHlvdSBzaG91bGQgdXNlIHRoZSBQZXJzaXN0ZW5jZSBwZXJzcGVjdGl2ZS4gSWYgeW91IGFscmVhZHkgaGF2ZSB0aGUgUGVyc2lzdGVuY2UgcGVyc3BlY3RpdmUgYWN0aXZlLCB5b3UgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtDbGljayB0byBTa2lwJnF1b3Q7IGJ1dHRvbi4gCi1JZiBub3QsIHNlbGVjdCA8Yj5XaW5kb3ctJmd0O09wZW4gUGVyc3BlY3RpdmUtJmd0O090aGVyPC9iPiBpbiB0aGUgbWVudWJhciBhdCB0aGUgdG9wIG9mIHRoZSB3b3JrYmVuY2guIEluIHRoZSBTZWxlY3QgUGVyc3BlY3RpdmVzIGRpYWxvZywgc2VsZWN0IDxiPkpQQSBEZXZlbG9wbWVudDwvYj4gYW5kIGNsaWNrIE9LLiBUaGlzIHN0ZXAgY2hhbmdlcyB0aGUgcGVyc3BlY3RpdmUgdG8gc2V0IHVwIHRoZSBFY2xpcHNlIHdvcmtiZW5jaCBmb3IgSlBBIGRldmVsb3BtZW50LgotWW91IGNhbiBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24gdG8gaGF2ZSB0aGUgJnF1b3Q7UGVyc2lzdGVuY2UmcXVvdDsgcGVyc3BlY3RpdmUgb3BlbmVkIGF1dG9tYXRpY2FsbHkuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5PcGVuUGVyc3BlY3RpdmUiIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIgY29uZmlybT0iZmFsc2UiIHBhcmFtMT0ib3JnLmVjbGlwc2UuanB0LnVpLlBlcnNpc3RlbmNlUGVyc3BlY3RpdmUiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgSmF2YSBDbGFzcyIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVGhlIG5leHQgc3RlcCBpcyB0byBjcmVhdGUgYSBuZXcgSmF2YSBjbGFzcy4gSW4gdGhlIG1haW4gdG9vbGJhciBhZ2FpbiwgY2xpY2sgb24gPGI+TmV3IEphdmEgQ2xhc3M8L2I+IGJ1dHRvbiAob3IgdGhlIGxpbmsgYmVsb3cpLgotVGhlIEphdmEgZWRpdG9yIHdpbGwgYXV0b21hdGljYWxseSBvcGVuIHNob3dpbmcgeW91ciBuZXcgY2xhc3MuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIFBlcnNpc3RlbnQgRW50aXR5IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBGaW5hbGx5IHdlIHdpbGwgbWFrZSB0aGUgSmF2YSBjbGFzcyBhIHBlcnNpc3RlbnQgZW50aXR5LgotSW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldyBzZWxlY3QgdGhlIEphdmEgY2xhc3MuIAotSW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcsIHVzZSB0aGUgJnF1b3Q7TWFwIEFzJnF1b3Q7IGZpZWxkIHRvIHNlbGVjdCA8Yj5FbnRpdHk8L2I+LiBEYWxpIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgQEVudGl0eSBhbm5vdGF0aW9uIHRvIHRoZSBjbGFzcyBpbiB0aGUgSmF2YSBlZGl0b3IuIAotVXNlIHRoZSBUYWJsZSwgQ2F0YWxvZywgYW5kIFNjaGVtYSBmaWVsZHMgdG8gYXNzb2NpYXRlIHRoZSBlbnRpdHkgd2l0aCBhIHNwZWNpZmljIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQWRkIEZpZWxkcyB0byB0aGUgQ2xhc3MiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgTm93IHlvdSB3aWxsIGFkZCBzb21lIGZpZWxkcyB0byB0aGUgZW50aXR5IHRvIG1hcCB0byByb3dzIGluIHRoZSBkYXRhYmFzZSB0YWJsZS4gICAKLQotSWYgeW91ciBwZXJzaXN0ZW50IGVudGl0eSBhbHJlYWR5IGhhcyBmaWVsZHMgdG8gbWFwLCB5b3UgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtDbGljayB0byBTa2lwJnF1b3Q7IGJ1dHRvbi4gSWYgbm90LCB1c2UgdGhlIEphdmEgZWRpdG9yIHRvIGFkZCBmaWVsZHMgdG8gdGhlIGVudGl0eS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8YWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZSIgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIiBjb25maXJtPSJmYWxzZSIgcGFyYW0xPSJvcmcuZWNsaXBzZS5kYWxpLnVpLlBlcnNpc3RlbmNlUGVyc3BlY3RpdmUiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIHRoZSBNYXBwaW5nIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmRhbGkuZG9jLnVzZXIvcmVmX2VudGl0eV9wYWdlLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBOb3cgeW91IGFyZSByZWFkeSB0byBtYXAgdGhlIGVudGl0eSBmaWVsZHMgdG8gY29sdW1ucyBpbiB0aGUgZGF0YWJhc2UgdGFibGUuIEluIHRoZSBQYWNrYWdlIEV4cGxvcmVyLCBzZWxlY3QgdGhlIEphdmEgY2xhc3MuIAotCi1JbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LCBleHBhbmQgdGhlIHBlcnNpc3RlbnQgZW50aXR5IHRvIGRpc3BsYXkgdGhlIGZpZWxkcy4gU2VsZWN0IGEgZmllbGQuIAotCi1UaGUgSlBBIERldGFpbHMgdmlldyBkaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBmaWVsZC4gVXNlIHRoZSBNYXAgQXMgZmllbGQgdG8gc2VsZWN0IHRoZSBCYXNpYyBtYXBwaW5nLiBVc2UgdGhlIENvbHVtbiBmaWVsZCB0byBzZWxlY3QgYSBjb2x1bW4gZnJvbSB0aGUgZGF0YWJhc2UgdGFibGUuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5PcGVuUGVyc3BlY3RpdmUiIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIgY29uZmlybT0iZmFsc2UiIHBhcmFtMT0ib3JnLmVjbGlwc2UuZGFsaS51aS5QZXJzaXN0ZW5jZVBlcnNwZWN0aXZlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkZpbmlzaCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISBZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgbWFwcGVkIHRoZSBmaWVsZHMgZnJvbSBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgdG8gYSBjb2x1bW4gaW4gYSBkYXRhYmFzZSB0YWJsZS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9tYXBwaW5nLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X21hcHBpbmcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDYzNTI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X21hcHBpbmcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDEgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkJESkZJIiBuYW1lPSJCQUJCREpGSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMCIgbmFtZT0ic3RocmVmMjAiPjwvYT48YSBpZD0ic3RocmVmMjEiIG5hbWU9InN0aHJlZjIxIj48L2E+VGhlIERhbGkgT1IgKG9iamVjdC1yZWxhdGlvbmFsKSBNYXBwaW5nIFRvb2wgYWxsb3dzIHlvdSB0byBkZXNjcmliZSBob3cgeW91ciBlbnRpdHkgb2JqZWN0cyA8c3BhbiBjbGFzcz0iaXRhbGljIj5tYXA8L3NwYW4+IHRvIHRoZSBkYXRhIHNvdXJjZSAob3Igb3RoZXIgb2JqZWN0cykuIFRoaXMgYXBwcm9hY2ggaXNvbGF0ZXMgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZnJvbSB0aGUgb2JqZWN0IG1vZGVsJm5kYXNoO2RldmVsb3BlcnMgYXJlIGZyZWUgdG8gZGVzaWduIHRoZWlyIGlkZWFsIG9iamVjdCBtb2RlbCwgYW5kIERCQXMgYXJlIGZyZWUgdG8gZGVzaWduIHRoZWlyIGlkZWFsIHNjaGVtYS48L3A+Ci08cD5UaGVzZSBtYXBwaW5ncyB0cmFuc2Zvcm0gYW4gb2JqZWN0IGRhdGEgbWVtYmVyIHR5cGUgdG8gYSBjb3JyZXNwb25kaW5nIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGF0YSBzb3VyY2UgcmVwcmVzZW50YXRpb24uIFRoZXNlIE9SIG1hcHBpbmdzIGNhbiBhbHNvIHRyYW5zZm9ybSBvYmplY3QgZGF0YSBtZW1iZXJzIHRoYXQgcmVmZXJlbmNlIG90aGVyIGRvbWFpbiBvYmplY3RzIHN0b3JlZCBpbiBvdGhlciB0YWJsZXMgaW4gdGhlIGRhdGFiYXNlIGFuZCBhcmUgcmVsYXRlZCB0aHJvdWdoIGZvcmVpZ24ga2V5cy48L3A+Ci08cD5Zb3UgY2FuIHVzZSB0aGVzZSBtYXBwaW5ncyB0byBtYXAgc2ltcGxlIGRhdGEgdHlwZXMgaW5jbHVkaW5nIHByaW1pdGl2ZXMgKHN1Y2ggYXMgPGNvZGU+aW50PC9jb2RlPiksIEpESyBjbGFzc2VzIChzdWNoIGFzIDxjb2RlPlN0cmluZzwvY29kZT4pLCBhbmQgbGFyZ2Ugb2JqZWN0IChMT0IpIHZhbHVlcy4gWW91IGNhbiBhbHNvIHVzZSB0aGVtIHRvIHRyYW5zZm9ybSBvYmplY3QgZGF0YSBtZW1iZXJzIHRoYXQgcmVmZXJlbmNlIG90aGVyIGRvbWFpbiBvYmplY3RzIGJ5IHdheSBvZiBhc3NvY2lhdGlvbiB3aGVyZSBkYXRhIHNvdXJjZSByZXByZXNlbnRhdGlvbnMgcmVxdWlyZSBvYmplY3QgaWRlbnRpdHkgbWFpbnRlbmFuY2UgKHN1Y2ggYXMgc2VxdWVuY2luZyBhbmQgYmFjayByZWZlcmVuY2VzKSBhbmQgcG9zc2VzcyB2YXJpb3VzIHR5cGVzIG9mIG11bHRpcGxpY2l0eSBhbmQgbmF2aWdhYmlsaXR5LiBUaGUgYXBwcm9wcmlhdGUgbWFwcGluZyBjbGFzcyBpcyBjaG9zZW4gcHJpbWFyaWx5IGJ5IHRoZSBjYXJkaW5hbGl0eSBvZiB0aGUgcmVsYXRpb25zaGlwLjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZmM0Y2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfcGVyc2lzdGVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDEgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJDQUhJQyIgbmFtZT0iQkFCQ0FISUMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxOCIgbmFtZT0ic3RocmVmMTgiPjwvYT48c3BhbiBjbGFzcz0iaXRhbGljIj5QZXJzaXN0ZW5jZTwvc3Bhbj4gcmVmZXJzIHRvIHRoZSBhYmlsaXR5IHRvIHN0b3JlIG9iamVjdHMgaW4gYSBkYXRhYmFzZSBhbmQgdXNlIHRob3NlIG9iamVjdHMgd2l0aCB0cmFuc2FjdGlvbmFsIGludGVncml0eS4gSW4gYSBKMkVFIGFwcGxpY2F0aW9uLCBkYXRhIGlzIHR5cGljYWxseSBzdG9yZWQgYW5kIHBlcnNpc3RlZCBpbiB0aGUgZGF0YSB0aWVyLCBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UuPC9wPgotPHA+PGEgaWQ9InN0aHJlZjE5IiBuYW1lPSJzdGhyZWYxOSI+PC9hPjxzcGFuIGNsYXNzPSJpdGFsaWMiPkVudGl0eSBiZWFuczwvc3Bhbj4gYXJlIGVudGVycHJpc2UgYmVhbnMgdGhhdCBjb250YWluIHBlcnNpc3RlbnQgZGF0YSBhbmQgdGhhdCBjYW4gYmUgc2F2ZWQgaW4gdmFyaW91cyBwZXJzaXN0ZW50IGRhdGEgc3RvcmVzLiBUaGUgZW50aXR5IGJlYW5zIHJlcHJlc2VudCBkYXRhIGZyb20gYSBkYXRhYmFzZTsgZWFjaCBlbnRpdHkgYmVhbiBjYXJyaWVzIGl0cyBvd24gaWRlbnRpdHkuIEVudGl0eSBiZWFucyBjYW4gYmUgZGVwbG95ZWQgdXNpbmcgPHNwYW4gY2xhc3M9Iml0YWxpYyI+YXBwbGljYXRpb24tbWFuYWdlZCBwZXJzaXN0ZW5jZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9Iml0YWxpYyI+Y29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2U8L3NwYW4+LjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0cy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NjNkNjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQxIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+Q29uY2VwdHM8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgQ29uY2VwdHMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYxNyIgbmFtZT0ic3RocmVmMTciPjwvYT48L3A+Ci08aDE+Q29uY2VwdHM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGFuIG92ZXJ2aWV3IG9mIGNvbmNlcHRzIHlvdSBzaG91bGQgYmUgZmFtaWxpYXIgd2l0aCB3aGVuIHVzaW5nIERhbGkgdG8gY3JlYXRlIG1hcHBpbmdzIGZvciBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5JbiBhZGRpdGlvbiB0byB0aGVzZSBzZWN0aW9ucywgeW91IHNob3VsZCByZXZpZXcgdGhlIGZvbGxvd2luZyByZXNvdXJjZXMgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246PC9wPgotPHVsPgotPGxpPgotPHA+RWNsaXBzZSBEYWxpIHByb2plY3Q6IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaSI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gcHJvamVjdDogPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29sczwvYT48L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPkpTUiAyMjAgRUpCIDMuMCBzcGVjaWZpY2F0aW9uOiA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmpjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0yMjAiPmh0dHA6Ly93d3cuamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTIyMDwvYT48L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0MTE1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDEgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJCR0ZKRyIgbmFtZT0iQkFCQkdGSkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9oMT4KLTxwPlRoZSBKYXZhIDIgRW50ZXJwcmlzZSBFZGl0aW9uKEoyRUUpIEVudGVycHJpc2UgSmF2YUJlYW5zIChFSkIpIGFyZSBhIGNvbXBvbmVudCBhcmNoaXRlY3R1cmUgdGhhdCB5b3UgdXNlIHRvIGRldmVsb3AgYW5kIGRlcGxveSBvYmplY3Qtb3JpZW50ZWQsIGRpc3RyaWJ1dGVkLCBlbnRlcnByaXNlLXNjYWxlIGFwcGxpY2F0aW9ucy4gQW4gYXBwbGljYXRpb24gd3JpdHRlbiBhY2NvcmRpbmcgdG8gdGhlIEVudGVycHJpc2UgSmF2YUJlYW5zIGFyY2hpdGVjdHVyZSBpcyBzY2FsYWJsZSwgdHJhbnNhY3Rpb25hbCwgYW5kIHNlY3VyZS48L3A+Ci08cD5UaGUgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBpbXByb3ZlcyB0aGUgRUpCIGFyY2hpdGVjdHVyZSBieSByZWR1Y2luZyBpdHMgY29tcGxleGl0eSB0aHJvdWdoIHRoZSB1c2Ugb2YgbWV0YWRhdGEgKGFubm90YXRpb25zKSBhbmQgc3BlY2lmeWluZyBwcm9ncmFtbWF0aWMgZGVmYXVsdHMgb2YgdGhhdCBtZXRhZGF0YS48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDc1MTYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0MSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNIREhBR0lIIiBuYW1lPSJDSERIQUdJSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjIyIiBuYW1lPSJzdGhyZWYyMiI+PC9hPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvaDE+Ci08cD5UaGUgSlBBIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdGhlIHVzZSBvZiBhIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSBmb3IgZGVwbG95bWVudC4gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGRhdGFiYXNlIGFuZCBlbnRpdHkgbWFuYWdlciBvcHRpb25zLCBhbmQgbWF5IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBwZXJzaXN0ZW5jZSB1bml0LiBUbyBlbmFibGUgeW91IHRvIGVhc2lseSBlZGl0IHRoaXMgaW5mb3JtYXRpb24sIERhbGkgcHJvdmlkZXMgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgRWNsaXBzZSBYTUwgRWRpdG9yIHRvIGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhpcyBpbmZvcm1hdGlvbi4gU2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVRvIHdvcmsgd2l0aCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cywgY29tbWVudCBvdXQgYWxsIGJ1dCBvbmUgcGVyc2lzdGVuY2UgdW5pdCBpbiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZmZmOWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQyIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+VGhlIG9ybS54bWwgZmlsZTwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlRoZSBvcm0ueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSERCSUpBQyIgbmFtZT0iQ0hEQklKQUMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWYyMyIgbmFtZT0ic3RocmVmMjMiPjwvYT5UaGUgb3JtLnhtbCBmaWxlPC9oMT4KLTxwPkFsdGhvdWdoIHRoZSBKUEEgc3BlY2lmaWNhdGlvbiBlbXBoYXNpemVzIHRoZSB1c2Ugb2YgYW5ub3RhdGlvbnMgdG8gc3BlY2lmeSBwZXJzaXN0ZW5jZSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB0byBzdG9yZSB0aGlzIG1ldGFkYXRhLiBEYWxpIGVuYWJsZXMgeW91IHRvIGNyZWF0ZSBhIHN0dWIgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBmb3IgYSBKUEEgcHJvamVjdCB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDA1Lmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uIFNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj4iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhlIG1ldGFkYXRhIG11c3QgbWF0Y2ggdGhlIFhTRCBzcGVjaWZpY2F0aW9uIG9mIHlvdXIgc2VsZWN0ZWQgSlBBIGltcGxlbWVudGF0aW9uLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPHA+RGFsaSBwcm92aWRlcyBjb21wcmVoZW5zaXZlIHN1cHBvcnQgZm9yIGNvbmZpZ3VyaW5nIFhNTCBtYXBwaW5nIGZpbGVzIHRocm91Z2ggdGhlIDxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT4gdGhhdCBpcyBuZWFybHkgaWRlbnRpY2FsIHRvIHRoZSBhbm5vdGF0aW9uLWJhc2VkIGNvbmZpZ3VyYXRpb24gaW4gdGhlIEphdmEgc291cmNlLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gdXNlIHRoZSBFY2xpcHNlIFhNTCBFZGl0b3IgdG8gY3JlYXRlIGFuZCBtYWludGFpbiB0aGUgbWV0YWRhdGEgaW5mb3JtYXRpb24gaW4gPGNvZGU+b3JtLnhtbDwvY29kZT4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1EYWxpIHdvcmtzIGV4Y2x1c2l2ZWx5IHdpdGggWE1MIG1hcHBpbmcgZmlsZXMgbmFtZWQgPGNvZGU+b3JtLnhtbDwvY29kZT4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbnRleHRzLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZGUwZWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPGNvbnRleHRzPgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYWNjZXNzVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdmFyaWFibGUgaXMgYWNjZXNzZWQ6IFByb3BlcnR5IChkZWZhdWx0KSBvciBGaWVsZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X25hbWUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhpcyBlbnRpdHkuIEJ5IGRlZmF1bHQsIHRoZSBjbGFzcyBuYW1lIGlzIHVzZWQgYXMgdGhlIGVudGl0eSBuYW1lLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfdGFibGUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIHRhYmxlIGFzc2lnbmVkIHRvIHRoaXMgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGUgY2xhc3MgbmFtZSBpcyB1c2VkIGFzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGEgcHJvcGVydHkgb3IgZmllbGQgdG8gYmUgb3ZlcnJpZGRlbiAoZnJvbSB0aGUgZGVmYXVsdCBtYXBwaW5ncykuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc0NvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgb3ZlcnJpZGVzIGEgcHJvcGVydHkgb3IgZmllbGQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNJbnNlcnRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBTUUwgSU5TRVJUIHN0YXRlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNVcGRhdGFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIFNRTCBVUERBVEUgc3RhdGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19tYXBBcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyB0aGlzIGF0dHJpYnV0ZSBtYXBzIHRvIHRoZSBkYXRhYmFzZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2NvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uVGFibGUiPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgY29sdW1uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uSW5zZXJ0YWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gU1FMIElOU0VSVCBzdGF0ZW1lbnRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uVXBkYXRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBTUUwgVVBEQVRFIHN0YXRlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19mZXRjaFR5cGUiPgotCQk8ZGVzY3JpcHRpb24+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2U6IEVhZ2VyIChkZWZhdWx0KSBvciBMYXp5PC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19vcHRpb25hbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2dlbmVyYXRlZFZhbHVlU3RyYXRlZ3kiPgotCQk8ZGVzY3JpcHRpb24+RGV0ZXJtaW5lcyBob3cgdGhlIHByaW1hcnkga2V5IGlzIGdlbmVyYXRlZDogQXV0byAoZGVmYXVsdCksIFNlcXVlbmNlLCBJZGVudGl0eSwgb3IgVGFibGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19nZW5lcmF0ZWRWYWx1ZUdlbmVyYXRvck5hbWUiPgotCQk8ZGVzY3JpcHRpb24+VW5pcXVlIG5hbWUgb2YgdGhlIGdlbmVyYXRvci48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhcmdldEVudGl0eSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jYXNjYWRlVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgZW50aXR5OiBBbGwsIFBlcnNpc3QsIE1lcmdlLCBvciBNb3ZlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfbWFwcGVkQnkiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGZpZWxkIGluIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5Db2x1bW5OYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgcmVmZXJlbmNlIGZvciB0aGUgZW50aXR5IGFzc29jaWF0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pblJlZmVyZW5jZWRDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgam9pbiB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19lbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0ICBtYXBwaW5nIG9mIGFuIGVudGl0eeKAmXMgYXR0cmlidXRlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGlzIGJlaW5nIG1hcHBlZCB0byB0aGUgZW50aXR54oCZcyBhdHRyaWJ1dGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X21hcEFzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIHR5cGUgb2YgcGVyc2lzdGVudCBkb21haW4gb2JqZWN0IGZvciB0aGUgSmF2YSBjbGFzczogUGVyc2lzdGVudCwgRW1iZWRkZWQsIG9yIE1hcHBlZCBTdXBlcmNsYXNzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfaW5oZXJpdGFuY2VTdHJhdGVneSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyBhbiBlbnRpdHkgbWF5IGluaGVyaXQgcHJvcGVydGllcyBmcm9tIG90aGVyIGVudGl0aWVzOiBTaW5nbGUgdGFibGUsIE9uZSB0YWJsZSBwZXIgY2xhc3MsIG9yIEpvaW5lZCB0YWJsZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvckNvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2hlbiB1c2luZyBhIFNpbmdsZSBvciBKb2luZWQgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvclR5cGUiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZmllbGQgdG8gc2V0IHRoZSBkaXNjcmltaW5hdG9yIHR5cGUgdG8gQ0hBUiBvciBJTlRFR0VSIChpbnN0ZWFkIG9mIGl0cyBkZWZhdWx0OiBTdHJpbmcpLiBUaGUgZGlzY3JpbWluYXRvciB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhpcyB0eXBlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU3BlY2lmeWluZyBpbmhlcml0YW5jZSIgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JWYWx1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBhbiBlbnRpdHkgaW4gdGhpcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFRoZSB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhlIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIHR5cGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19vcmRlckJ5Ij4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGRlZmF1bHQgb3JkZXIgZm9yIG9iamVjdHMgcmV0dXJuZWQgZnJvbSBhIHF1ZXJ5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBFbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pblRhYmxlTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSAgbmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSBmb3JlaWduIGtleSBmb3IgYSBtYW55LXRvLW1hbnkgb3IgYSB1bmlkaXJlY3Rpb25hbCBvbmUtdG8tbWFueSBhc3NvY2lhdGlvbi4gWW91IGNhbiBjb25maWd1cmUgdGhlIGpvaW4gdGFibGUgd2l0aCBhIHNwZWNpZmljIGNhdGFsb2cgb3Igc2NoZW1hLCBjb25maWd1cmUgb25lIG9yIG1vcmUgam9pbiB0YWJsZSBjb2x1bW5zIHdpdGggYSB1bmlxdWUgY29uc3RyYWludCwgYW5kIHVzZSBtdWx0aXBsZSBqb2luIGNvbHVtbnMgcGVyIGVudGl0eS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5UYWJsZUpvaW5Db2x1bW5zIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgIHR3byBvciBtb3JlIGpvaW4gY29sdW1ucyAodGhhdCBpcywgYSBjb21wb3NpdGUgcHJpbWFyeSBrZXkpLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5zIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGpvaW4gY29sdW1uIG9uIHRoZSBvd25lZCAob3IgaW52ZXJzZSBzaWRlKSBvZiB0aGUgYXNzb2NpYXRpb246IHRoZSBvd25lZCBlbnRpdHkncyBwcmltYXJ5IGtleSBjb2x1bW4uIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBvcHRpb25zIG9uIHRoZSBQcm9wZXJ0aWVzIHBhZ2UgdG8gc2VsZWN0IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSB3aXRoIHRoZSBwcm9qZWN0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwcm9wZXJ0aWVzX2phdmFQZXJzaXN0ZW5jZUNvbm5lY3Rpb24iPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdXNlZCB0byBtYXAgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2VTY2hlbWEiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIHNjaGVtYSB1c2VkIHRvIG1hcCB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfYWRkUGVyc2lzdGVuY2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZSBBZGQgUGVyc2lzdGVuY2UgZGlhbG9nIHRvIGRlZmluZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB1c2UgdG8gc3RvcmUgdGhlIHBlcnNpc3RlbmNlIGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZU91dGxpbmUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIEpQQSBTdHJ1Y3R1cmUgdmlldyBkaXNwbGF5cyBhbiBvdXRsaW5lIG9mIHRoZSBzdHJ1Y3R1cmUgKGl0cyBhdHRyaWJ1dGVzIGFuZCBtYXBwaW5ncykgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGN1cnJlbnRseSBzZWxlY3RlZCBvciBvcGVuZWQgaW4gdGhlIGVkaXRvci48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBTdHJ1Y3R1cmUgdmlldyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgR2VuZXJhdGUgRW50aXRpZXMgZGlhbG9nIHRvIGNyZWF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgYmFzZWQgb24geW91ciBkYXRhYmFzZSB0YWJsZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllc19zb3VyY2UiPgotCQk8ZGVzY3JpcHRpb24+VGhlIHByb2plY3QgZm9sZGVyIG5hbWUgaW4gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcy4gQ2xpY2sgQnJvd3NlIHRvIHNlbGVjdCBhbiBleGlzdGluZyBmb2xkZXIuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfcGFja2FnZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgcGFja2FnZSBpbiB3aGljaCB0byBnZW5lcmF0ZSB0aGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLCBvciBjbGljayBCcm93c2UgdG8gc2VsZWN0IGFuIGV4aXN0aW5nIHBhY2thZ2UuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfdGFibGVzIj4KLQkJPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgdGFibGVzIGZyb20gd2hpY2ggdG8gY3JlYXRlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBkZWZpbmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdXNlZCB0byBzdG9yZSB0aGUgcGVyc2lzdGVuY2UgZW50aXRpZXMgYW5kIHRvIGNyZWF0ZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgUGVyc2lzdGVuY2UgZGlhbG9nIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBwcm9qZWN0IiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZSIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19uZXdKUEFQcm9qZWN0Ij4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBkZWZpbmUgdGhlIG5ldyBKUEEgcHJvamVjdCBuYW1lLCBpdHMgbG9jYXRpb24sIHRhcmdldCBydW50aW1lLCBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik5ldyBKUEEgUHJvamVjdCBwYWdlIiBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIFByb2plY3Qgd2l6YXJkIiBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZCIgLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBwcm9qZWN0IiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCIgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9kYXRhYmFzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlc2UgZmllbGRzIHRvIGRlZmluZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB1c2VkIHRvIHN0b3JlIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX2NsYXNzcGF0aCI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBvcHRpb24gdG8gYWRkIGxpYnJhcmllcyBvciBKQVJzIHRoYXQgY29udGFpbiB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgYW5kIGVudGl0aWVzIHRvIHRoZSBwcm9qZWN04oCZcyBKYXZhIEJ1aWxkIFBhdGguPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgUGVyc2lzdGVuY2UgZGlhbG9nIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBwcm9qZWN0IiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2VfcGFja2FnaW5nIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGVzZSBmaWVsZHMgdG8gY3JlYXRlIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZS4gU2VsZWN0IHRoZSBwZXJzaXN0ZW5jZSB2ZXJzaW9uLCB0aGUgbmFtZSBvZiB0aGUgSlBBIHByb3ZpZGVyLCBhbmQgYSB1bmlxdWUgbmFtZSB0byBpZGVudGlmeSB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBQZXJzaXN0ZW5jZSBkaWFsb2ciIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2l6YXJkX2dlbmVyYXRlRERMX29wdGlvbnMgIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHdoaWNoIHNjcmlwdCBvcHRpb25zIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBzY3JpcHQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIHRhYmxlcyAoRERMKSBmcm9tIGVudGl0aWVzICIgaHJlZj0idGFza19nZW5lcmF0ZV9kZGwuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik9wdGlvbnMgcGFnZSAiIGhyZWY9InJlZl9vcHRpb25zLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9nZW5lcmF0ZURETF9vYmplY3RzICI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB3aGljaCBlbGVtZW50cyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJPYmplY3RzIHBhZ2UgIiBocmVmPSJyZWZfb2JqZWN0cy5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfZ2VuZXJhdGVERExfc2F2ZSAiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzZWxlY3QgdGhlIGZpbGVuYW1lIGFuZCBsb2NhdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIHNjcmlwdC4gWW91IGNhbiBhbHNvIHByZXZpZXcgdGhlIHNjcmlwdCBhbmQgc3BlY2lmeSB0byBydW4gb3IgY29udGludWUgZWRpdGluZyB0aGUgc2NyaXB0IGFmdGVyIGdlbmVyYXRpb24uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIHRhYmxlcyAoRERMKSBmcm9tIGVudGl0aWVzICIgaHJlZj0idGFza19nZW5lcmF0ZV9kZGwuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IlNhdmUgYW5kIFJ1biBEREwgcGFnZSAiIGhyZWY9InJlZl9zYXZlX2FuZF9ydW4uaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2l6YXJkX2dlbmVyYXRlRERMX3N1bW1hcnkgIj4KLQkJPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBzaG93cyB0aGUgc2V0dGluZ3MgdGhhdCB5b3Ugc2VsZWN0ZWQgZm9yIHRoZSBnZW5lcmF0ZWQgRERMLiBUbyBjaGFuZ2UgYW55IG9wdGlvbiBjbGljayAiQmFjayIgb3IgY2xpY2sgIkZpbmlzaCIgdG8gY29udGludWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIHRhYmxlcyAoRERMKSBmcm9tIGVudGl0aWVzICIgaHJlZj0idGFza19nZW5lcmF0ZV9kZGwuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvck5hbWUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIHRhYmxlIHNlcXVlbmNlIGdlbmVyYXRvci4gVGhpcyBuYW1lIGlzIGdsb2JhbCB0byB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCAoYWNyb3NzIGFsbCBnZW5lcmF0b3IgdHlwZXMpLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yUHJpbWFyeUtleUNvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIG9mIHRoZSBnZW5lcmF0b3IgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGdlbmVyYXRlZCBJRCB2YWx1ZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yVmFsdWVDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VGhlIG5hbWUgZm9yIHRoZSBjb2x1bW4gdGhhdCBzdG9yZXMgdGhlIGdlbmVyYXRlZCBJRCB2YWx1ZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yUHJpbWFyeUtleUNvbHVtblZhbHVlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb2x1bW4gb2YgdGhlIGdlbmVyYXRvciB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHByaW1hcnkga2V5IHZhbHVlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2RhdGFiYXNlQXV0aG9yaXphdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdG8gY29ubmVjdCAobG9nIGluKSB0byBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gdXNlIHdpdGggeW91ciBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuIAotCQlZb3UgbXVzdCBoYXZlIGEgZGVmaW5lZCBkYXRhYmFzZSBjb25uZWN0aW9uIChhbmQgYmUgY29ubmVjdGVkKSB0byBhZGQgcGVyc2lzdGVuY2UuIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIHBlcnNpc3RlbmNlIHRvIGEgSmF2YSBwcm9qZWN0IiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZV9wcm9qZWN0Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190ZW1wb3JhbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGlmIHRoZSBtYXBwZWQgZmllbGQgY29udGFpbnMgYSBEYXRlIChqYXZhLnNxbC5EYXRlKSwgVGltZSAoamF2YS5zcWwuVGltZSksIG9yIFRpbWVzdGFtcCAoamF2YS5zcWwuVGltZXN0YW1wKSB2YWx1ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfcHJpbWFyeUtleUdlbmVyYXRpb24iPgotCQk8ZGVzY3JpcHRpb24+RGVmaW5lIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvciI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRvIHVzZSBhIHNwZWNpZmljIGRhdGFiYXNlIHRhYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBwcmltYXJ5IGtleS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdG8gdXNlIGEgc3BlY2lmaWMgc2VxdWVuY2UgZm9yIGdlbmVyYXRpbmcgdGhlIHByaW1hcnkga2V5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfc2VxdWVuY2VHZW5lcmF0b3JOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIHNlcXVlbmNlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfc2VxdWVuY2VHZW5lcmF0b3JTZXF1ZW5jZSI+Ci0JCTxkZXNjcmlwdGlvbj4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19sb2IiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiB0aGUgZmllbGQgaXMgbWFwcGVkIHRvIGphdmEuc3FsLkNsb2Igb3IgamF2YS5zcWwuQmxvYi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19lbnVtZXJhdGVkIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaG93IHRvIHBlcnNpc3QgZW51bWVyYXRlZCBjb25zdHJhaW50cyBpZiB0aGUgU3RyaW5nIHZhbHVlIHN1aXRzIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzIG9yIHRvIG1hdGNoIGFuIGV4aXN0aW5nIGRhdGFiYXNlIHNjaGVtYS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2VkaXRJbnZlcnNlSm9pbkNvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj4uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2NhdGFsb2ciPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgVGFibGUuIFRoaXMgZmllbGQgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0cyBpbiB0aGUgb3JtLnhtbCBmaWxlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfc2NoZW1hIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBzY2hlbWEgdGhhdCBjb250YWlucyB0aGUgVGFibGUuIFRoaXMgZmllbGQgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0cyBpbiB0aGUgb3JtLnhtbCBmaWxlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1fcGFja2FnZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgSmF2YSBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMgdG8gd2hpY2ggdGhlIG9ybS54bWwgZmlsZSBhcHBsaWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1fc2NoZW1hIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBzY2hlbWEgdG8gdXNlIGFzIHRoZSBkZWZhdWx0IGZvciBhbGwgZW50aXRpZXMgbWFuYWdlZCBieSB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV9jYXRhbG9nIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjYXRhbG9nIHRvIHVzZSBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsIGVudGl0aWVzIG1hbmFnZWQgYnkgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1fYWNjZXNzIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkZWZhdWx0IGFjY2VzcyBtZXRob2QgZm9yIHZhcmlhYmxlcyBpbiB0aGlzIHByb2plY3Q6IFByb3BlcnR5IG9yIEZpZWxkLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1fY2FzY2FkZSI+Ci0JCTxkZXNjcmlwdGlvbj5BZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucyBpbiBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX3htbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgdGhhdCB0aGUgSmF2YSBjbGFzc2VzIGluIHRoaXMgcGVyc2lzdGVuY2UgdW5pdCBhcmUgZnVsbHkgc3BlY2lmaWVkIGJ5IHRoZWlyIG1ldGFkYXRhLiBBbnkgYW5ub3RhdGlvbnMgd2lsbCBiZSBpZ25vcmVkLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfSlBBUGxhdGZvcm0iPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgdmVuZG9yLXNwZWNpZmljIEpQQSBpbXBsZW1lbnRhdGlvbi5EZWZhdWx0IGlzIEdlbmVyaWMuLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIEZhY2V0IHBhZ2UiIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfY3JlYXRlT1JNIj4KLQkJPGRlc2NyaXB0aW9uPkNyZWF0ZSBhbiBpbml0aWFsIG9ybS54bWwgZmlsZS4gVXNlIHRoaXMgZmlsZSB0byBzcGVjaWZ5IHByb2plY3QgYW5kIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIEZhY2V0IHBhZ2UiIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtIi8+Ci0JPC9jb250ZXh0PgotCi0KLQotCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vY3NzL2JsYWZkb2MuY3NzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vY3NzL2JsYWZkb2MuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWY2MTI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2Nzcy9ibGFmZG9jLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLUBpbXBvcnQgIi4uLy4uLy4uL1BST0RVQ1RfUExVR0lOL2Jvb2suY3NzIjsKLQotc3Bhbi5jb250cm9sLCBzcGFuLmd1aS1vYmplY3QtYWN0aW9uLCBwLnN1YmhlYWQyLCBzcGFuLmJvbGQsIHAubm90ZXAxIHsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ubmFtZSwgcC50aXRsZWluZmlndXJlLCBzcGFuLml0YWxpYyB7Ci0gIGZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotcC50aXRsZWluZmlndXJlLCBwLnN1YmhlYWQyIHsKLSAgcGFkZGluZy10b3A6IDEwcHg7Ci19Ci0KLXNwYW4uY29kZSB7Ci0gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci19Ci0KLXNwYW4uY29weXJpZ2h0bG9nbyB7Zm9udC1zaXplOiAwLjhlbX0KLQotLmZvb3RlciB7bWFyZ2luLXRvcDogMmVtO2JvcmRlci10b3A6MXB4IHNvbGlkICNjY2NjY2M7cGFkZGluZy10b3A6MWVtO30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9odG1sL2NweXIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyZWM2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9odG1sL2NweXIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLQotPGhlYWQ+Ci08IS0tICA8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwO3VybD0uLi8uLi9sZWdhbC5odG0iPiAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaHJlZj0iLi4vLi4vbGVnYWwuaHRtIj5MaWNlbnNlIEluZm9ybWF0aW9uPC9hPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NmM4YzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0MSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkdldHRpbmcgc3RhcnRlZDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBHZXR0aW5nIHN0YXJ0ZWQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYyIiBuYW1lPSJzdGhyZWYyIj48L2E+PC9wPgotPGgxPkdldHRpbmcgc3RhcnRlZDwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gZ2V0dGluZyBzdGFydGVkIHdpdGggdGhlIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNCQUJFRkhDRCI+UmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMi5odG0jQkFCSUdDSkEiPkRhbGkgcXVpY2sgc3RhcnQ8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpc2l0IHRoZSBEYWxpIGhvbWUgcGFnZSBhdDo8L3A+Ci08cD48Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkvbWFpbi5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaS9tYWluLnBocDwvYT48L2NvZGU+LjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMzZmMjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0MSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJFRkhDRCIgbmFtZT0iQkFCRUZIQ0QiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPGEgaWQ9InN0aHJlZjMiIG5hbWU9InN0aHJlZjMiPjwvYT48YSBpZD0ic3RocmVmNCIgbmFtZT0ic3RocmVmNCI+PC9hPjwvaDE+Ci08cD5CZWZvcmUgaW5zdGFsbGluZyBEYWxpLCBlbnN1cmUgdGhhdCB5b3VyIGVudmlyb25tZW50IG1lZXRzIHRoZSBmb2xsb3dpbmcgPHNwYW4gY2xhc3M9Iml0YWxpYyI+bWluaW11bTwvc3Bhbj4gcmVxdWlyZW1lbnRzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkVjbGlwc2UgMy40ICg8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2FkcyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHM8L2E+PC9jb2RlPik8L3A+Ci08L2xpPgotPGxpPgotPHA+SmF2YSBSdW50aW1lIEVudmlyb25tZW50IChKUkUpIDEuNSAoPGNvZGU+PGEgaHJlZj0iaHR0cDovL2phdmEuY29tIj5odHRwOi8vamF2YS5jb208L2E+PC9jb2RlPik8L3A+Ci08L2xpPgotPGxpPgotPHA+RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgMy4wICg8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzPC9hPjwvY29kZT4pPC9wPgotPC9saT4KLTxsaT4KLTxwPkphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGZvciBKYXZhIEVFIDUuIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gY2FuIGJlIG9idGFpbmVkIGZyb206PC9wPgotPC9saT4KLTwvdWw+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci08Y29kZT48YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvZG93bmxvYWRzL3BlcnNpc3RlbmNlL0phdmFQZXJzaXN0ZW5jZS5odG1sIj5odHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvZG93bmxvYWRzL3BlcnNpc3RlbmNlL0phdmFQZXJzaXN0ZW5jZS5odG1sPC9hPjwvY29kZT4KLTwvcHJlPgotPHA+UmVmZXIgdG8gPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpL2dldHRpbmdzdGFydGVkX21haW4uaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpL2dldHRpbmdzdGFydGVkX21haW4uaHRtbDwvYT48L2NvZGU+IGZvciBhZGRpdGlvbmFsIGluc3RhbGxhdGlvbiBpbmZvcm1hdGlvbi48L3A+Ci08cD5EYWxpIGlzIGluY2x1ZGVkIGFzIHBhcnQgb2YgV1RQIDIuMC4gTm8gYWRkaXRpb25hbCBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZC48L3A+Ci08YSBpZD0ic3RocmVmNSIgbmFtZT0ic3RocmVmNSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5BY2Nlc3NpYmlsaXR5IEZlYXR1cmVzPC9wPgotPHA+RGFsaSBzdXBwb3J0cyB0aGUgc3RhbmRhcmQgYWNjZXNzaWJpbGl0eSBmZWF0dXJlcyBpbiBFY2xpcHNlLCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD5OYXZpZ2F0aW5nIHRoZSB1c2VyIGludGVyZmFjZSB1c2luZyB0aGUga2V5Ym9hcmQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNwZWNpZnlpbmcgZ2VuZXJhbCBhY2Nlc3NpYmlsaXR5IHByZWZlcmVuY2VzIGZvciB0aGUgZWRpdG9yLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+U2VlIDxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2FjY2Vzc2liaWxpdHkvYWNjZXNzbWFpbi5odG0iPkFjY2Vzc2liaWxpdHkgRmVhdHVyZXMgaW4gRWNsaXBzZTwvYT4gaW4gdGhlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPldvcmtiZW5jaCBVc2VyIEd1aWRlPC9zcGFuPiBmb3IgZGV0YWlscy48L3A+Ci08YSBpZD0ic3RocmVmNiIgbmFtZT0ic3RocmVmNiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5IZWxwIEFjY2Vzc2liaWxpdHk8L3A+Ci08cD5UaGUgZG9jdW1lbnRhdGlvbiBhbmQgaGVscCBjb250YWlucyBtYXJrdXAgdG8gZmFjaWxpdGF0ZSBhY2Nlc3MgYnkgdGhlIGRpc2FibGVkIGNvbW11bml0eS4gU2VlIDxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3Rhc2tzL2hlbHBfYWNjZXNzaWJpbGl0eS5odG0iPkhlbHAgQWNjZXNzaWJpbGl0eTwvYT4gaW4gdGhlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPldvcmtiZW5jaCBVc2VyIEd1aWRlPC9zcGFuPiBmb3IgZGV0YWlscy48L3A+Ci08cD5XaGVuIHVzaW5nIHRoZSBoZWxwLCBiZSBhd2FyZSBvZiB0aGUgZm9sbG93aW5nOjwvcD4KLTx1bD4KLTxsaT4KLTxwPlNjcmVlbiByZWFkZXJzIG1heSBub3QgYWx3YXlzIGNvcnJlY3RseSByZWFkIHRoZSBjb2RlIGV4YW1wbGVzIGluIHRoaXMgZG9jdW1lbnQuIFRoZSBjb252ZW50aW9ucyBmb3Igd3JpdGluZyBjb2RlIHJlcXVpcmUgdGhhdCBjbG9zaW5nIGJyYWNlcyBzaG91bGQgYXBwZWFyIG9uIGFuIG90aGVyd2lzZSBlbXB0eSBsaW5lOyBob3dldmVyLCBzb21lIHNjcmVlbiByZWFkZXJzIG1heSBub3QgYWx3YXlzIHJlYWQgYSBsaW5lIG9mIHRleHQgdGhhdCBjb25zaXN0cyBzb2xlbHkgb2YgYSBicmFja2V0IG9yIGJyYWNlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaGlzIGRvY3VtZW50YXRpb24gbWF5IGNvbnRhaW4gbGlua3MgdG8gV2ViIHNpdGVzIG9mIG90aGVyIGNvbXBhbmllcyBvciBvcmdhbml6YXRpb25zIHRoYXQgd2UgZG8gbm90IGNvbnRyb2wuIFdlIG5laXRoZXIgZXZhbHVhdGUgbm9yIG1ha2UgYW55IHJlcHJlc2VudGF0aW9ucyByZWdhcmRpbmcgdGhlIGFjY2Vzc2liaWxpdHkgb2YgdGhlc2UgV2ViIHNpdGVzLjwvcD4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDdmNTRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDEgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5EYWxpIHF1aWNrIHN0YXJ0PC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRGFsaSBxdWljayBzdGFydCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQklHQ0pBIiBuYW1lPSJCQUJJR0NKQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RGFsaSBxdWljayBzdGFydDwvaDE+Ci08cD48YSBpZD0ic3RocmVmNyIgbmFtZT0ic3RocmVmNyI+PC9hPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiB0byBoZWxwIHlvdSBxdWlja2x5IHN0YXJ0IHVzaW5nIERhbGkgdG8gY3JlYXRlIHJlbGF0aW9uYWwgbWFwcGluZ3MgYmV0d2VlbiBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgYW5kIGRhdGFiYXNlIHRhYmxlcy48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI0JBQkRGSERBIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNCQUJGR0RERyI+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGlwc19hbmRfdHJpY2tzLmh0bSNDSERIR0hCRiI+VGlwcyBhbmQgdHJpY2tzPC9hPjxiciAvPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5MDdjMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0MSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJERkhEQSIgbmFtZT0iQkFCREZIREEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY4IiBuYW1lPSJzdGhyZWY4Ij48L2E+VGhpcyBxdWljayBzdGFydCBzaG93cyBob3cgdG8gY3JlYXRlIGEgbmV3IEpQQSBwcm9qZWN0LjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U2VsZWN0IEZpbGUgJmd0OyBOZXcgJmd0OyBQcm9qZWN0PC9zcGFuPi4gVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1Zb3UgY2FuIGFsc28gc2VsZWN0IHRoZSBKUEEgcGVyc3BlY3RpdmUgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5GaWxlICZndDsgTmV3ICZndDsgSlBBIFByb2plY3Q8L3NwYW4+LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSBQcm9qZWN0PC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSNDQUNCSkFHQyI+TmV3IEpQQSBQcm9qZWN0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIGEgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5Qcm9qZWN0IG5hbWU8L3NwYW4+IChzdWNoIGFzIDxjb2RlPlF1aWNrU3RhcnQ8L2NvZGU+KS48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5UYXJnZXQgUnVudGltZTwvc3Bhbj4gKHN1Y2ggYXMgPGNvZGU+QXBhY2hlIFRvbWNhdDwvY29kZT4pIGFuZCBjb25maWd1cmF0aW9uLCBzdWNoIGFzIDxzcGFuIGNsYXNzPSJib2xkIj5VdGlsaXR5IEpQQSBQcm9qZWN0IHdpdGggSmF2YSA1LjA8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoZSBUYXJnZXQgUnVudGltZSBpcyBub3QgcmVxdWlyZWQgZm9yIEphdmEgU0UgZGV2ZWxvcG1lbnQuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+T24gdGhlIEpQQSBGYWNldCBkaWFsb2csIHNlbGVjdCB5b3VyIHZlbmRvci1zcGVjaWZpYyBKUEEgcGxhdGZvcm0gKG9yIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4pLCBkYXRhYmFzZSBjb25uZWN0aW9uIChvciBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiksIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5IChzdWNoIGFzIEVjbGlwc2VMaW5rKSwgZGVmaW5lIGhvdyBEYWxpIHNob3VsZCBtYW5hZ2UgcGVyc2lzdGVudCBjbGFzc2VzLCBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIHRoZSBEZWZhdWx0IFNjaGVtYSBmb3IgQ29ubmVjdGlvbjwvc3Bhbj4gaWYgeW91IHJlcXVpcmUgYSBzY2hlbWEgb3RoZXIgdGhhbiB0aGUgb25lIHRoYXQgRGFsaSBkZXJpdmVzIGZyb20gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24sIHdoaWNoIG1heSBiZSBpbmNvcnJlY3QgaW4gc29tZSBjYXNlcy4gVXNpbmcgdGhpcyBvcHRpb24sIHlvdSBjYW4gc2VsZWN0IGEgZGV2ZWxvcG1lbnQgdGltZSBzY2hlbWEgZm9yIGRlZmF1bHRzIGFuZCB2YWxpZGF0aW9uLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBwcm9qZWN0IHRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW5zIHRoZSBKUEEgcGVyc3BlY3RpdmUuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmOSIgbmFtZT0ic3RocmVmOSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlByb2plY3QgaW4gUGFja2FnZSBFeHBsb3JlcjwvcD4KLTxpbWcgc3JjPSJpbWcvcXVpY2tzdGFydF9wcm9qZWN0LnBuZyIgYWx0PSJQYWNrYWdlIEV4cGxvcmVyIHNob3dpbmcgdGhlIEpQQSBwcm9qZWN0LiIgdGl0bGU9IlBhY2thZ2UgRXhwbG9yZXIgc2hvd2luZyB0aGUgSlBBIHByb2plY3QuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPk5vdyB0aGF0IHlvdSBoYXZlIGNyZWF0ZWQgYSBwcm9qZWN0IHdpdGggcGVyc2lzdGVuY2UsIHlvdSBjYW4gY29udGludWUgd2l0aCA8YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI0JBQkZHRERHIj5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvYT4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWMyZjE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQxIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZHRERHIiBuYW1lPSJCQUJGR0RERyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEwIiBuYW1lPSJzdGhyZWYxMCI+PC9hPlRoaXMgcXVpY2sgc3RhcnQgc2hvd3MgaG93IHRvIGNyZWF0ZSBhIG5ldyBwZXJzaXN0ZW50IEphdmEgZW50aXR5LiBXZSB3aWxsIGNyZWF0ZSBhbiBlbnRpdHkgdG8gYXNzb2NpYXRlIHdpdGggYSBkYXRhYmFzZSB0YWJsZS4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIGFkZCB0aGUgQUREUkVTUyB0YWJsZSB0byB5b3VyIGRhdGFiYXNlLjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIEpQQSBwcm9qZWN0IGluIHRoZSBOYXZpZ2F0b3Igb3IgUGFja2FnZSBFeHBsb3JlciBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV3ICZndDsgT3RoZXI8L3NwYW4+LiBUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyBhcHBlYXJzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkVudGl0eTwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgRW50aXR5IENsYXNzIHBhZ2UgYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIHBhY2thZ2UgbmFtZSAoc3VjaCBhcyA8Y29kZT5xdWlja3N0YXJ0LmRlbW8ubW9kZWw8L2NvZGU+KSwgdGhlIGNsYXNzIG5hbWUgKHN1Y2ggYXMgPGNvZGU+QWRkcmVzczwvY29kZT4pIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwNC5odG0jQ0lBREVDSUEiPkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2U8L2E+IGFwcGVhcnMsIHdoaWNoIGVuYWJsZXMgeW91IHRvIGRlZmluZSB0aGUgcGVyc2lzdGVuY2UgZmllbGRzLCB3aGljaCB5b3Ugd2lsbCBtYXAgdG8gdGhlIGNvbHVtbnMgb2YgYSBkYXRhYmFzZSB0YWJsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaWQ9InN0aHJlZjExIiBuYW1lPSJzdGhyZWYxMSI+PC9hPjxhIGlkPSJzdGhyZWYxMiIgbmFtZT0ic3RocmVmMTIiPjwvYT5Vc2UgdGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nIChpbnZva2VkIGJ5IGNsaWNraW5nIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+KSB0byBhZGQgcGVyc2lzdGVuY2UgZmllbGRzIHRvIHRoZSBBZGRyZXNzIGNsYXNzOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLXByaXZhdGUgTG9uZyBpZDsKLXByaXZhdGUgU3RyaW5nIGNpdHk7Ci1wcml2YXRlIFN0cmluZyBjb3VudHJ5OwotcHJpdmF0ZSBTdHJpbmcgc3RhdGVPclByb3ZpbmNlOwotcHJpdmF0ZSBTdHJpbmcgcG9zdGFsQ29kZTsKLXByaXZhdGUgU3RyaW5nIHN0cmVldDsKLTwvcHJlPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1Zb3Ugd2lsbCBhbHNvIG5lZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgY29sdW1ucyB0byB0aGUgQUREUkVTUyBkYXRhYmFzZSB0YWJsZToKLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLU5VTUJFUigxMCwwKSBBRERSRVNTX0lEIChwcmltYXJ5IGtleSkKLVZBUkNIQVIyKDgwKSBQUk9WSU5DRQotVkFSQ0hBUjIoODApIENPVU5UUlkKLVZBUkNIQVIyKDIwKSBQX0NPREUKLVZBUkNIQVIyKDgwKSBTVFJFRVQKLVZBUkNIQVIyKDgwKSBDSVRZCi08L3ByZT4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLTwvcHJlPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LiBXaXRoIHRoZSBDcmVhdGUgSlBBIEVudGl0eSBjb21wbGV0ZWQsIEVjbGlwc2UgZGlzcGxheXMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5BZGRyZXNzPC9zcGFuPiBlbnRpdHkgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldy48L3A+Ci08cD5BZGRyZXNzLmphdmEgaW5jbHVkZXMgdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IGFubm90YXRpb24sIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZHMsIGFzIHdlbGwgYXMgPGNvZGU+Z2V0dGVyPC9jb2RlPiBhbmQgPGNvZGU+c2V0dGVyPC9jb2RlPiBtZXRob2RzIGZvciBlYWNoIG9mIHRoZSBmaWVsZHMuPC9wPgotPC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxMyIgbmFtZT0ic3RocmVmMTMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5BZGRyZXNzIEVudGl0eSBpbiBBZGRyZXNzLmphdmE8L3A+Ci08aW1nIHNyYz0iaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nIiBhbHQ9IkphdmEgZWRpdG9yIHdpdGggdGhlIEFkZHJlc3MgZW50aXR5LiIgdGl0bGU9IkphdmEgZWRpdG9yIHdpdGggdGhlIEFkZHJlc3MgZW50aXR5LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5FY2xpcHNlIGFsc28gZGlzcGxheXMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5BZGRyZXNzPC9zcGFuPiBlbnRpdHkgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldzo8L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNCIgbmFtZT0ic3RocmVmMTQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5BZGRyZXNzIEVudGl0eSBpbiB0aGUgSlBBIFN0cnVjdHVyZSBWaWV3PC9wPgotPGltZyBzcmM9ImltZy9hZGRyZXNzX2phdmFfSlBBX3N0cnVjdHVyZV9xdWlja3N0YXJ0LnBuZyIgYWx0PSJBZGRyZXNzLmphdmEgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldy4iIHRpdGxlPSJBZGRyZXNzLmphdmEgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5BZGRyZXNzPC9zcGFuPiBjbGFzcyBpbiB0aGUgUGFja2FnZSBFeHBsb3JlciB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LCBub3RpY2UgdGhhdCBEYWxpIGhhcyBhdXRvbWF0aWNhbGx5IGFzc29jaWF0ZWQgdGhlIEFERFJFU1MgZGF0YWJhc2UgdGFibGUgd2l0aCB0aGUgZW50aXR5IGJlY2F1c2UgdGhleSBhcmUgbmFtZWQgaWRlbnRpY2FsbHkuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1EZXBlbmRpbmcgb24geW91ciBkYXRhYmFzZSBjb25uZWN0aW9uIHR5cGUsIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U2NoZW1hPC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE1IiBuYW1lPSJzdGhyZWYxNSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBEZXRhaWxzIFZpZXcgZm9yIEFkZHJlc3MgRW50aXR5PC9wPgotPGltZyBzcmM9ImltZy9hZGRyZXNzLmphdmFfanBhX2RldGFpbHMucG5nIiBhbHQ9IkFkZHJlc3MuamF2YSBpbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJBZGRyZXNzLmphdmEgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPC9vbD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLUFmdGVyIGFzc29jaWF0aW5nIHRoZSBlbnRpdHkgd2l0aCB0aGUgZGF0YWJhc2UgdGFibGUsIHlvdSBzaG91bGQgdXBkYXRlIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgdG8gaW5jbHVkZSB0aGlzIEpQQSBlbnRpdHkuCi08cD5SaWdodC1jbGljayB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSBQYWNrYWdlIEV4cGxvcmVyIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzZXM8L3NwYW4+LiBEYWxpIGFkZHMgdGhlIGZvbGxvd2luZyB0byB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlOjwvcD4KLTxwPjxjb2RlPiZsdDtjbGFzcyZndDtxdWlja3N0YXJ0LmRlbW8ubW9kZWwuQWRkcmVzcyZsdDsvY2xhc3MmZ3Q7PC9jb2RlPjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTxwPk5vdyB3ZSBhcmUgcmVhZHkgdG8gbWFwIGVhY2ggZmllbGRzIGluIHRoZSBBZGRyZXNzIGNsYXNzIHRvIGEgY29sdW1uIGluIHRoZSBkYXRhYmFzZSB0YWJsZS48L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPmlkPC9zcGFuPiBmaWVsZCBpbiB0aGUgSlBBIERldGFpbHMgdmlldy48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQgY2xpY2sgaWQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBpZDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkFERFJFU1NfSUQ8L3NwYW4+IGluIHRoZSBOYW1lIGZpZWxkOjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2IiBuYW1lPSJzdGhyZWYxNiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBEZXRhaWxzIFZpZXcgZm9yIHRoZSBhZGRyZXNzSWQgRmllbGQ8L3A+Ci08aW1nIHNyYz0iaW1nL2FkZHJlc3NfaWRfZGV0YWlsc19xdWlja3N0YXJ0LnBuZyIgYWx0PSJUaGUgSlBBIERldGFpbHMgdmlldyBmb3IgdGhlIEFkZHJlc3MgZW50aXR5JnJzcXVvO3MgaWQgYXR0cmlidXRlLiIgdGl0bGU9IlRoZSBKUEEgRGV0YWlscyB2aWV3IGZvciB0aGUgQWRkcmVzcyBlbnRpdHkmcnNxdW87cyBpZCBhdHRyaWJ1dGUuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBBZGRyZXNzIGVudGl0eTo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1ASWQKLUBDb2x1bW4obmFtZT0iQUREUkVTU19JRCIpCi08L3ByZT48L2xpPgotPGxpPgotPHA+TWFwIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgKGFzIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYzwvc3Bhbj4gbWFwcGluZ3MpIHRvIHRoZSBhcHByb3ByaWF0ZSBkYXRhYmFzZSBjb2x1bW46PC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkhSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgbWFwcGluZ3MgZm9yIGVhY2ggb2YgdGhlIGZpZWxkcyBpbiB0aGUgQWRkcmVzcyBlbnRpdHkuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgbWFwcGluZ3MgZm9yIGVhY2ggb2YgdGhlIGZpZWxkcyBpbiB0aGUgQWRkcmVzcyBlbnRpdHkuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDgiPkZpZWxkPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ4Ij5NYXAgQXM8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDgiPkRhdGFiYXNlIENvbHVtbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10OCIgaGVhZGVycz0icjFjMS10OCI+Y2l0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzMtdDgiPkNJVFk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10OCIgaGVhZGVycz0icjFjMS10OCI+Y291bnRyeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ4IHIxYzMtdDgiPkNPVU5UUlk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10OCIgaGVhZGVycz0icjFjMS10OCI+cG9zdGFsQ29kZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzMtdDgiPlBfQ09ERTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5wcm92aW5jZU9yU3RhdGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzItdDgiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMzLXQ4Ij5QUk9WSU5DRTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5zdHJlZXQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzItdDgiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10OCByMWMzLXQ4Ij5TVFJFRVQ8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkRhbGkgYXV0b21hdGljYWxseSBtYXBzIHNvbWUgZmllbGRzIHRvIHRoZSBjb3JyZWN0IGRhdGFiYXNlIGNvbHVtbiAoc3VjaCBhcyB0aGUgY2l0eSBmaWVsZCB0byB0aGUgQ2l0eSBjb2x1bW4pIGlmIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzLmphdmFfanBhX2RldGFpbHMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzLmphdmFfanBhX2RldGFpbHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDI3YTVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzcy5qYXZhX2pwYV9kZXRhaWxzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2lkX2RldGFpbHNfcXVpY2tzdGFydC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjQwY2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2lkX2RldGFpbHNfcXVpY2tzdGFydC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfamF2YV9KUEFfc3RydWN0dXJlX3F1aWNrc3RhcnQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2phdmFfSlBBX3N0cnVjdHVyZV9xdWlja3N0YXJ0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmNTFhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfamF2YV9KUEFfc3RydWN0dXJlX3F1aWNrc3RhcnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jaGFuZ2VfY29ubmVjdGlvbl9wcm9maWxlLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY2hhbmdlX2Nvbm5lY3Rpb25fcHJvZmlsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YWIwNWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jaGFuZ2VfY29ubmVjdGlvbl9wcm9maWxlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY29sdW1uX3N1cHBvcnRfbmV3LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY29sdW1uX3N1cHBvcnRfbmV3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxNmU4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NvbHVtbl9zdXBwb3J0X25ldy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NvbnZlcnRfamF2YV9wcm9qZWN0X25ldy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NvbnZlcnRfamF2YV9wcm9qZWN0X25ldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxY2RhNmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jb252ZXJ0X2phdmFfcHJvamVjdF9uZXcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2VudGl0eV9uZXcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2VudGl0eV9uZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWM3OGE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9lbnRpdHlfbmV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjMGE2Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZmllbGRzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmE3ZmFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9kZXRhaWxzX2VudGl0eW1hcHBpbmdzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZGV0YWlsc19lbnRpdHltYXBwaW5ncy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDQ4ODUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9kZXRhaWxzX2VudGl0eW1hcHBpbmdzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZW50ZXJpbmdfcXVlcnlfbmV3LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZW50ZXJpbmdfcXVlcnlfbmV3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlYzBhYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2VudGVyaW5nX3F1ZXJ5X25ldy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2Vycm9yX3NhbXBsZS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2Vycm9yX3NhbXBsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDk2NDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9lcnJvcl9zYW1wbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9nZW5lcmF0ZV9lbnRpdGllcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2dlbmVyYXRlX2VudGl0aWVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjYjIyYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2dlbmVyYXRlX2VudGl0aWVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfam9pbi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmI2ODc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfam9pbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3NpbmdsZS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3NpbmdsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDY0ODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV90YWIucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV90YWIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWQ3MjFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2VfdGFiLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvamF2YV9lZGl0b3JfYWRkcmVzcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdlYWE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvamF2YV9lZGl0b3JfYWRkcmVzcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pwYV93aXphcmRfY3JlYXRlX2ZpZWxkcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pwYV93aXphcmRfY3JlYXRlX2ZpZWxkcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNTUwZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qcGFfd2l6YXJkX2NyZWF0ZV9maWVsZHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwZWRfZW50aXR5X3R5cGVfbGluay5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBlZF9lbnRpdHlfdHlwZV9saW5rLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2NGQwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBlZF9lbnRpdHlfdHlwZV9saW5rLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ19maWxlX25ldy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfZmlsZV9uZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzU1NzQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ19maWxlX25ldy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW1iZWQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VtYmVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzZDFiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW1iZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW50aXR5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2NTNkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW50aXR5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9zdXBlcmNsYXNzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9zdXBlcmNsYXNzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmNTQzNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fc3VwZXJjbGFzcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9iYXNpY21hcHBpbmdzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwYjdmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRhYmxlZW50aXR5bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyOTRlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkZWRpZG1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTlkYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDUyYjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZG1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGVmYjVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25faWRtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFueXRvbWFueW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODAyMmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9vbmVtYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhY2MxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThlYTJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkZW50aXR5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hcHBlZHN1cGVyY2xhc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk3Y2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b21hbnltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRkYzk4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQ5YmJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fb25ldG9vbmVtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX3RyYW5zaWVudG1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA0ODhmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX3ZlcnNpb25tYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODczNzEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2ZmY2RjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wZXJzcGVjdGl2ZV9idXR0b24ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDI1YWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfcHJvamVjdF90YXNrLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWU3MWJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM4MWE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxjLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiYzc0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYWYyMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9vcGVuX3BlcnNpc3RlbmNlX2VkaXRvci5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL29wZW5fcGVyc2lzdGVuY2VfZWRpdG9yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5MTFmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL29wZW5fcGVyc2lzdGVuY2VfZWRpdG9yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcGVyc2lzdGVuY2VfZWRpdG9yX25ldy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3BlcnNpc3RlbmNlX2VkaXRvcl9uZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWVmYWU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcGVyc2lzdGVuY2VfZWRpdG9yX25ldy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3BlcnNpc3RlbmNlX291dGxpbmVfdmlldy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3BlcnNpc3RlbmNlX291dGxpbmVfdmlldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OWFhODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9vdXRsaW5lX3ZpZXcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcGVyc2lzdGVuY2VfeG1sX2VkaXRvci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNGRjMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY2MzEwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3Byb2plY3RfcHJvcGVydGllc190YXNrcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YzA2NjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9xdWlja3N0YXJ0X3Byb2plY3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2Vjb25kYXJ5X3RhYmxlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YTkxNTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9lbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ViZTkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjM1MDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfanBhX3Byb2plY3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2Mjc3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc3luY2hvcm5pemVfY2xhc3Nlcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3N5bmNob3JuaXplX2NsYXNzZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWRlNjNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc3luY2hvcm5pemVfY2xhc3Nlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2VudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2VudGl0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTFkYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YWJsZV9lbnRpdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YXNrX2VudGVyaW5nX3F1ZXJ5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZWMwYWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YXNrX2VudGVyaW5nX3F1ZXJ5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbmRleC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjNjNDliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/PgotPGluZGV4IHZlcnNpb249IjEuMCI+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAQmFzaWMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJCYXNpYyBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTAuaHRtI3N0aHJlZjk5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAQ29sdW1uIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjE5MyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQERpc2NyaW1pbmF0b3JDb2x1bW4iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjgzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJARGlzY3JpbWluYXRvclZhbHVlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY4NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGFibGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRhYmxlIj48dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI3N0aHJlZjY4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJARW1iZWRkZWQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRlZCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTEuaHRtI3N0aHJlZjEwMyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGVkSWQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRlZCBJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTIuaHRtI3N0aHJlZjEwNyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEVudGl0eSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY2MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEVudW1lcmF0ZWQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjAzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAR2VuZXJhdGVkVmFsdWUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyMTEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBJZCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jc3RocmVmMTExIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJASW5oZXJpdGFuY2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjgxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJASm9pbkNvbHVtbiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTIyIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNzdGhyZWYxMzIiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSm9pbiBUYWJsZSBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxNC5odG0jc3RocmVmMjA4IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jc3RocmVmMjEwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJATG9iIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjE5OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE1hbnlUb01hbnkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE0Lmh0bSNzdGhyZWYxMTUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBNYW55VG9PbmUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjEyMCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE1hcHBlZFN1cGVyY2xhc3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY3NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE5hbWVkUXVlcnkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjk1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAT25lVG9NYW55Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE2Lmh0bSNzdGhyZWYxMjUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb09uZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNzdGhyZWYxMjkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBPcmRlckJ5Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjIwNiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQFNlcXVlbmNlR2VuZXJhdG9yIj4KLSAgICA8ZW50cnkga2V5d29yZD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jc3RocmVmMjEzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAVGVtcG9yYWwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjAwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAVHJhbnNpZW50Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iVHJhbnNpZW50IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOC5odG0jc3RocmVmMTM1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAVmVyc2lvbiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlZlcnNpb24gbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE5Lmh0bSNzdGhyZWYxMzkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImFyY2hpdGVjdHVyZSBvZiBEYWxpIGZlYXR1cmUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJEYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDM0Lmh0bSNzdGhyZWYyNDciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZSBvdmVycmlkZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDEwLmh0bSNzdGhyZWYxODAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkF0dHJpYnV0ZSBPdmVycmlkZXMgLSBpbiBKYXZhIERldGFpbHMgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkF0dHJpYnV0ZSBvdmVycmlkZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTAuaHRtI3N0aHJlZjE4MiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYXR0cmlidXRlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jc3RocmVmMTkyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyI+PHRvcGljIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jc3RocmVmMjAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYmFzaWMgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBCYXNpYyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQmFzaWMgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNzdGhyZWYxMDAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQmFzaWMgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNzdGhyZWY5OCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IihTZWUgYWxzbyBtYXBwaW5ncykiPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjbGFzc2VzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIHBlcnNpc3RlbmNlIHRvIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY1NiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmNjciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbnRpdHkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY1OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBlZCBzdXBlcmNsYXNzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY3MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InN5bmNocm9uaXppbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlN5bmNocm9uaXppbmcgY2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tzMDAzLmh0bSNzdGhyZWY0MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjb2x1bW5zIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZGlzY3JpbWluYXRvciI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY4NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImpvaW4iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTIxIiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjEzMSIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gVGFibGUgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTQuaHRtI3N0aHJlZjIwNyIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jc3RocmVmMjA5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyB0byI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjE5NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InZhbHVlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjg2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIHRhYmxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyI+PHRvcGljIGhyZWY9InRhc2tzMDIwLmh0bSNzdGhyZWYxNDUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZGF0YWJhc2UgLSBwZXJzaXN0ZW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbm5lY3Rpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSlBBIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyMzYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzY2hlbWEiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSlBBIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyMzgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZGV2ZWxvcGVyIGRvY3VtZW50YXRpb24gLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAzNC5odG0jc3RocmVmMjQ2IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlYWdlciBmZXRjaCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYxOTYiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGFibGUgY2xhc3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJARW1iZWRkYWJsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY2OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRhYmxlIj48dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI3N0aHJlZjY2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGVkIElEIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJARW1iZWRkZWRJZCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNzdGhyZWYxMDgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNzdGhyZWYxMDYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZW1iZWRkZWQgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRlZCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMDQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMDIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZW50aXRpZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJARW50aXR5IGFubm90YXRpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY2MiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiPjx0b3BpYyBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNzdGhyZWYxOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIEpQQSBFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwMS5odG0jc3RocmVmMzAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRhYmxlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRhYmxlIj48dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI3N0aHJlZjcwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZnJvbSB0YWJsZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMC5odG0jc3RocmVmMTQxIiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgZGlhbG9nIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0jc3RocmVmMjQyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI3N0aHJlZjE3OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBlZCBzdXBlcmNsYXNzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY3NiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNzdGhyZWYxMiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbmNlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jc3RocmVmMTAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW50Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNTciIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNjMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZWNvbmRhcnkgdGFibGVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI3N0aHJlZjE4NSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbnVtZXJhdGVkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjIwMiIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjA0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlcnJvciBtZXNzYWdlcyAtIERhbGkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMi5odG0jc3RocmVmMTQ2IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkVycm9yIG1lc3NhZ2VzIj48dG9waWMgaHJlZj0idGFza3MwMjMuaHRtI3N0aHJlZjE1MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZXh0ZW5zaW9uIHBvaW50cyAtIERhbGkgZmVhdHVyZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzQuaHRtI3N0aHJlZjI0OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZmV0Y2ggdHlwZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYxOTUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIGRpYWxvZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMC5odG0jc3RocmVmMTQ0IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIGRpYWxvZyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtI3N0aHJlZjI0MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZ2VuZXJhdGVkIHZhbHVlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmdzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyMTIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZXF1ZW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jc3RocmVmMjE0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJASWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jc3RocmVmMTEyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jc3RocmVmMTEwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImluaGVyaXRhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZW50aXR5Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjgwIiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI3N0aHJlZjE4OCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImpvaW5lZCB0YWJsZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmOTIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzaW5nbGUgdGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmODciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgLSBpbiBKYXZhIERldGFpbHMgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNzdGhyZWYxODciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Imluc3RhbGxhdGlvbiAtIERhbGkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmMyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iam9pbmVkIHRhYmxlcyAtIGluaGVyaXRhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5MyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jc3RocmVmMTkwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW50aXRpZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNzdGhyZWYxNzciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNzdGhyZWYyNDQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBwcm9qZWN0Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgbmV3Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYyNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBsYXRmb3JtIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEpQQSBPcHRpb25zIj48dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jc3RocmVmMjM1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBTdHJ1Y3R1cmUgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBTdHJ1Y3R1cmUgdmlldyI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNzdGhyZWYyMTYiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImxhenkgZmV0Y2giPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMTk3IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYW55LXRvLW1hbnkgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBNYW55VG9NYW55Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE0Lmh0bSNzdGhyZWYxMTYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTE0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im1hbnktdG8tb25lIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJATWFueVRvT25lIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjExOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjExOCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXBwZWQgc3VwZXJjbGFzcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBNYXBwZWRTdXBlcmNsYXNzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY3NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY3MiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIGVudGl0aWVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI3N0aHJlZjExIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5ncyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIj48dG9waWMgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNzdGhyZWYyMSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImJhc2ljIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJCYXNpYyBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTAuaHRtI3N0aHJlZjk3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW1iZWRkZWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTAxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW1iZWRkZWQgSUQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTA1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSUQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jc3RocmVmMTA5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFueS10by1tYW55Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE0Lmh0bSNzdGhyZWYxMTMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW55LXRvLW9uZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvbmUtdG8tbWFueSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE2Lmh0bSNzdGhyZWYxMjMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvbmUtdG8tb25lIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTI3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvYmxlbXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyI+PHRvcGljIGhyZWY9InRhc2tzMDIyLmh0bSNzdGhyZWYxNDkiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ0cmFuc2llbnQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlRyYW5zaWVudCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTguaHRtI3N0aHJlZjEzMyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InZlcnNpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlZlcnNpb24gbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE5Lmh0bSNzdGhyZWYxMzciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibmFtZWQgcXVlcmllcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNzdGhyZWY5NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJub25wZXJzaXN0ZW50Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iY2xhc3NlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNTUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJmaWVsZHMuIFNlZSB0cmFuc2llbnQiPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJvbmUtdG8tbWFueSBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQE9uZVRvTWFueSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE2Lmh0bSNzdGhyZWYxMjYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE2Lmh0bSNzdGhyZWYxMjQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib25lLXRvLW9uZSBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQE9uZVRvT25lIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTMwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNzdGhyZWYxMjgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib3JkZXJpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjA1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJvcm0ueG1sIGZpbGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNzdGhyZWYyMyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbmFnaW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNzdGhyZWY0NiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNhbXBsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jc3RocmVmNDciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib3ZlcnJpZGVzIC0gSlBBIGF0dHJpYnV0ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDEwLmh0bSNzdGhyZWYxODEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZSI+PHRvcGljIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjE4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGF0YWJhc2UgY29ubmVjdGlvbiI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKUEEgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjIzNyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIHNjaGVtYSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKUEEgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjI0MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSBjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNTQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvcHRpb25zIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEpQQSBPcHRpb25zIj48dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jc3RocmVmMjMyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlBlcnNpc3RlbmNlIFhNTCBFZGl0b3IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJVc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNzdGhyZWY0MCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icGVyc2lzdGVuY2UueG1sIGZpbGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0iY29uY2VwdHMwMDIuaHRtI3N0aHJlZjIyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdG9yIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJVc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNzdGhyZWY0MSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbmFnaW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmMzUiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJVc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNzdGhyZWYzOCIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ildvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNS5odG0jc3RocmVmNTIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzYW1wbGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWYzNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InN5bmNocm9uaXppbmcgd2l0aCBjbGFzc2VzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwMy5odG0jc3RocmVmNDQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icGVyc2lzdGVudCBlbnRpdHkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNTgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InBlcnNwZWN0aXZlIC0gSlBBIERldmVsb3BtZW50Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNzdGhyZWYyNDUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InBsYXRmb3JtIC0gSlBBIj4KLSAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKUEEgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjIzNCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icHJvYmxlbXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMi5odG0jc3RocmVmMTQ4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwcm9qZWN0cyAtIEpQQSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIG5ldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI3N0aHJlZjgiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYyNSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im9wdGlvbnMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSlBBIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyMzMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icXVpY2sgc3RhcnQgLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBxdWljayBzdGFydCI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMi5odG0jc3RocmVmNyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icmVxdWlyZW1lbnRzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbnQgZW50aXRpZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY2MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzY2hlbWEgLSBkYXRhYmFzZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSlBBIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyMzkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNlY29uZGFyeSB0YWJsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI3N0aHJlZjE4MyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iU2Vjb25kYXJ5IFRhYmxlcyAtIGluIEphdmEgRGV0YWlscyB2aWV3Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNzdGhyZWYxODYiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmODgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InN1cGVyY2xhc3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY3NyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idGFibGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgZW50aXRpZXMgZnJvbSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyI+PHRvcGljIGhyZWY9InRhc2tzMDIwLmh0bSNzdGhyZWYxNDIiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBkaWFsb2ciPjx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSNzdGhyZWYyNDMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbmhlcml0YW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY4OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNlY29uZGFyeSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNzdGhyZWYxODQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idGVtcG9yYWwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMTk5IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyMDEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRyYW5zaWVudCBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQFRyYW5zaWVudCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVHJhbnNpZW50IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOC5odG0jc3RocmVmMTM2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlRyYW5zaWVudCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTguaHRtI3N0aHJlZjEzNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ2ZXJzaW9uIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJAVmVyc2lvbiI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE0MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJWZXJzaW9uIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jc3RocmVmMTM4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InZpZXdzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI3N0aHJlZjE3OCIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jc3RocmVmMTkxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgU3RydWN0dXJlIHZpZXciPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jc3RocmVmMjE1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Indhcm5pbmcgbWVzc2FnZXMgLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIj48dG9waWMgaHJlZj0idGFza3MwMjIuaHRtI3N0aHJlZjE0NyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlVzaW5nIHRoZSBYTUwgRWRpdG9yIHRvIGVkaXQgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza3MwMDIuaHRtI3N0aHJlZjM3IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ildvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNS5odG0jc3RocmVmNTEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTwvaW5kZXg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvbGVnYWwuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2xlZ2FsLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhOTllNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvbGVnYWwuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTUgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5MZWdhbDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBMZWdhbCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjI1NiIgbmFtZT0ic3RocmVmMjU2Ij48L2E+PC9wPgotPGgxPkxlZ2FsPC9oMT4KLTxwPkNvcHlyaWdodCAmY29weTsgMjAwNiwgMjAwOCwgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvcD4KLTxwPlRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+PC9wPgotPHA+PGEgaHJlZj0iYWJvdXQuaHRtIj5UZXJtcyBhbmQgY29uZGl0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiB0aGlzIGd1aWRlLjwvYT48L3A+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NWMwODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBEb2N1bWVudGF0aW9uIC0gRG9jCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCi1qcGFEZXZlbG9wbWVudD1KUEEgRGV2ZWxvcG1lbnQKLWNyZWF0ZUFKcGFQcm9qZWN0PUNyZWF0ZSBhIEpQQSBwcm9qZWN0Ci1jcmVhdGVBSnBhUHJvamVjdERlc2NyaXB0aW9uPVRoaXMgY2hlYXQgc2hlZXQgaGVscHMgeW91IGNyZWF0ZSBhIEpQQSBwcm9qZWN0LgotY3JlYXRlQVBlcnNpc3RlbnRFbnRpdHk9Q3JlYXRlIGEgcGVyc2lzdGVudCBlbnRpdHkKLWNyZWF0ZUFQZXJzaXN0ZW50RW50aXR5RGVzY3JpcHRpb249VGhpcyBjaGVhdCBzaGVldCBoZWxwcyB5b3UgY3JlYXRlIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eS4KLU1hcEFQZXJzaXN0ZW50RW50aXR5PU1hcCBhIHBlcnNpc3RlbnQgZW50aXR5Ci1NYXBBUGVyc2lzdGVudEVudGl0eURlc2NyaXB0aW9uPVRoaXMgY2hlYXQgc2hlZXQgaGVscHMgeW91IG1hcCB0aGUgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHRvIGEgZGF0YWJhc2UgdGFibGUuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjMwOGYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4gbmFtZT0iSlBBIERvY3VtZW50YXRpb24gUGx1Zy1pbiIgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kb2MudXNlciIgdmVyc2lvbj0iMi4wLjAiIHByb3ZpZGVyLW5hbWU9Ik9yYWNsZSI+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmluZSBUT0MgIC0tPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotCQk8dG9jIGZpbGU9InRvYy54bWwiIHByaW1hcnk9InRydWUiLz4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTwhLS0gRGVmaW5lIEYxICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLQkJPGNvbnRleHRzIGZpbGU9ImNvbnRleHRzLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQudWkiLz4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gRGVmaW5lIEtleXdvcmQgSW5kZXggLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLQkJPGluZGV4IGZpbGU9ImluZGV4LnhtbCIvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPCEtLSBDaGVhdHNoZWV0cyAtLT4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50Ij4KLQkJPGNhdGVnb3J5IG5hbWU9IiVqcGFEZXZlbG9wbWVudCIgaWQ9ImNvbS5qcGEuY2F0ZWdvcnkiLz4KLQkJPGNoZWF0c2hlZXQgbmFtZT0iJWNyZWF0ZUFKcGFQcm9qZWN0IiBjYXRlZ29yeT0iY29tLmpwYS5jYXRlZ29yeSIgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbCIgaWQ9Im9yZy5lY2xpcHNlLmpwYS5jaGVhdHNoZWV0LmNyZWF0ZXByb2plY3QxIj4KLQkJCTxkZXNjcmlwdGlvbj4lY3JlYXRlQUpwYVByb2plY3REZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTwvY2hlYXRzaGVldD4KLQkJPGNoZWF0c2hlZXQgbmFtZT0iJWNyZWF0ZUFQZXJzaXN0ZW50RW50aXR5IiBjYXRlZ29yeT0iY29tLmpwYS5jYXRlZ29yeSIgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwiIGlkPSJvcmcuZWNsaXBzZS5qcGEuY2hlYXRzaGVldC5hZGRlbnRpdHkiPgotCQkJPGRlc2NyaXB0aW9uPiVjcmVhdGVBUGVyc2lzdGVudEVudGl0eURlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPC9jaGVhdHNoZWV0PgotCQk8Y2hlYXRzaGVldCBuYW1lPSIlTWFwQVBlcnNpc3RlbnRFbnRpdHkiIGNhdGVnb3J5PSJjb20uanBhLmNhdGVnb3J5IiBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbCIgaWQ9Im9yZy5lY2xpcHNlLmpwYS5jaGVhdHNoZWV0Lm1hcGVudGl0eSI+Ci0JCQk8ZGVzY3JpcHRpb24+JU1hcEFQZXJzaXN0ZW50RW50aXR5RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8L2NoZWF0c2hlZXQ+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZGV0YWlsc19vcm0uaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9kZXRhaWxzX29ybS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZGE0NmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9kZXRhaWxzX29ybS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1MSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dER0hDIiBuYW1lPSJDQUNHREdIQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9oMT4KLTxwPlRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZGlzcGxheXMgdGhlIGRlZmF1bHQgbWFwcGluZyBhbmQgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9qZWN0IGFuZCBjb250YWlucyB0aGUgZm9sbG93aW5nIGFyZWFzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNi5odG0jQ0FDQ0FDR0giPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNy5odG0jQ0FDRUFHQkciPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGVzZSBkZWZhdWx0cyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgc2V0dGluZ3Mgb24gYSBzcGVjaWZpYyBlbnRpdHkgb3IgbWFwcGluZy48L3A+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pwYV9mYWNldC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pwYV9mYWNldC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YzU1OTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qcGFfZmFjZXQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDkgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5KUEEgRmFjZXQgcGFnZTwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBGYWNldCBwYWdlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDSUZESUYiIG5hbWU9IkNBQ0lGRElGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KUEEgRmFjZXQgcGFnZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBvbiB0aGUgSlBBIEZhY2V0IHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRERMIC0gT2JqZWN0cyBwYWdlLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzIiBoZWFkZXJzPSJyMWMxLXQzIj5QbGF0Zm9ybTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMgcjFjMi10MyI+VmVuZG9yLXNwZWNpZmljIEpQQSBpbXBsZW1lbnRhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzIHIxYzMtdDMiPkVjbGlwc2VMaW5rPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDMiIGhlYWRlcnM9InIxYzEtdDMiPkNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzIHIxYzItdDMiPlNlbGVjdCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC4gRGFsaSByZXF1aXJlcyBhbiBhY3RpdmUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2UgYW5kIHZhbGlkYXRlIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBtYXBwaW5ncy4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgY29ubmVjdGlvbjwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MyByMWMzLXQzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MyIgaGVhZGVycz0icjFjMS10MyI+Jm5ic3A7Jm5ic3A7T3ZlcnJpZGUgZGVmYXVsdCBzY2hlbWEgZnJvbSBjb25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MyByMWMyLXQzIj5TZWxlY3QgYSBzY2hlbWEgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24uIFVzZSB0aGlzIG9wdGlvbiBpZiB0aGUgZGVmYXVsdCBzY2hlbWEgY2Fubm90IGJlIHVzZWQuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBvcHRpb24gd2hlbiB0aGUgZGVwbG95bWVudCBsb2dpbiBkaWZmZXJzIGZyb20gdGhlIGRlc2lnbi10aW1lIGxvZ2luLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDMgcjFjMy10MyI+VGhlIHZhbHVlIGNhbGN1bGF0ZWQgYnkgRGFsaS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MyIgaGVhZGVycz0icjFjMS10MyI+SlBBIEltcGxlbWVudGF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MyByMWMyLXQzIj5TZWxlY3QgdG8gdXNlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2ZXIgYXQgcnVudGltZTwvc3Bhbj4sIG9yIHNlbGVjdCBhIHNwZWNpZmljIDxzcGFuIGNsYXNzPSJib2xkIj5pbXBsZW1lbnRhdGlvbiBsaWJyYXJ5PC9zcGFuPiB0aGF0IGNvbnRhaW4gdGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGFuZCBlbnRpdGllcyB0byBiZSBhZGRlZCB0byB0aGUgcHJvamVjdCdzIEphdmEgQnVpbGQgUGF0aC4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Db25maWd1cmUgZGVmYXVsdCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeTwvc3Bhbj4gdG8gY3JlYXRlIGEgZGVmYXVsdCBsaWJyYXJ5IGZvciB0aGUgcHJvamVjdCBvciBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+Q29uZmlndXJlIHVzZXIgbGlicmFyaWVzPC9zcGFuPiB0byBkZWZpbmUgYWRkaXRpb25hbCBsaWJyYXJpZXMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MyByMWMzLXQzIj5EZXRlcm1pbmVkIGJ5IHNlcnZlci48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MyIgaGVhZGVycz0icjFjMS10MyI+UGVyc2lzdGVudCBjbGFzcyBtYW5hZ2VtZW50PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MyByMWMyLXQzIj5TcGVjaWZ5IGlmIERhbGkgd2lsbCA8c3BhbiBjbGFzcz0iYm9sZCI+ZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseTwvc3Bhbj4sIG9yIGlmIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+YW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj4gZmlsZS4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob3RlPC9zcGFuPjogVG8gaW5zdXJlIGFwcGxpY2F0aW9uIHBvcnRhYmlsaXR5LCB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMgcjFjMy10MyI+RGV0ZXJtaW5lZCBieSBzZXJ2ZXIuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDMiIGhlYWRlcnM9InIxYzEtdDMiPkNyZWF0ZSBvcm0ueG1sPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MyByMWMyLXQzIj5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIGNyZWF0ZSBhIGRlZmF1bHQgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBmb3IgeW91ciBlbnRpdHkgbWFwcGluZ3MgYW5kIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MyByMWMzLXQzIj5TZWxlY3RlZDwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbWFwcGluZ19nZW5lcmFsLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbWFwcGluZ19nZW5lcmFsLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4ODM0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTAgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JIRklKIiBuYW1lPSJDQUNCSEZJSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhbCBpbmZvcm1hdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBHZW5lcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SmF2YSBEZXRhaWxzIHZpZXc8L3NwYW4+IGZvciBlYWNoIG1hcHBpbmcgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTAiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDEwIj5EZWZhdWx0PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWM0LXQxMCI+QXZhaWxhYmxlIGZvciBNYXBwaW5nIFR5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+TWFwcGluZyBUeXBlIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEwIHIxYzItdDEwIj5DbGlja2luZyB0aGUgbmFtZSBvZiB0aGUgbWFwcGluZyB0eXBlLCB3aGljaCBpcyByZXByZXNlbnRlZCBhcyBhIGh5cGVybGluaywgaW52b2tlcyB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuIFVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGF0dHJpYnV0ZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMCByMWMzLXQxMCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMCByMWM0LXQxMCI+QWxsIG1hcHBpbmcgdHlwZXM8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj48YSBpZD0iQ0FDR0NCSEIiIG5hbWU9IkNBQ0dDQkhCIj48L2E+Q29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTAgcjFjMi10MTAiPjxhIGlkPSJzdGhyZWYxOTMiIG5hbWU9InN0aHJlZjE5MyI+PC9hPjxhIGlkPSJzdGhyZWYxOTQiIG5hbWU9InN0aHJlZjE5NCI+PC9hPlRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuIFRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBDb2x1bW48L2NvZGU+IGFubm90YXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTAgcjFjMy10MTAiPkJ5IGRlZmF1bHQsIHRoZSBDb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBuYW1lZCBpZGVudGljYWxseSB0byB0aGUgYXR0cmlidXRlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEwIHIxYzQtdDEwIj48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCSElCSUkiPlZlcnNpb24gbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTAgcjFjMi10MTAiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBDb2x1bW48L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTAgcjFjMy10MTAiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEwIHIxYzQtdDEwIj48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMCByMWMyLXQxMCI+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgY29sdW1uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEwIHIxYzMtdDEwIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPiZuYnNwOyZuYnNwO0luc2VydGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMCByMWMyLXQxMCI+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIDxjb2RlPlNRTCBJTlNFUlQ8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTAgcjFjMy10MTAiPlRydWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPiZuYnNwOyZuYnNwO1VwZGF0YWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZpZXMgaWYgdGhpcyBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIDxjb2RlPlNRTCBVUERBVEU8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTAgcjFjMy10MTAiPlRydWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPiZuYnNwOyZuYnNwO1VuaXF1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDEwIHIxYzItdDEwIj5TZXRzIHRoZSA8Y29kZT5VTklRVUU8L2NvZGU+IGNvbnN0cmFpbnQgZm9yIHRoZSBjb2x1bW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTAgcjFjMy10MTAiPkZhbHNlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtOdWxsYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBhbGxvd3MgbnVsbCB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTAgcjFjMy10MTAiPlRydWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtMZW5ndGg8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTAgcjFjMi10MTAiPlNldHMgdGhlIGNvbHVtbiBsZW5ndGguPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDEwIHIxYzMtdDEwIj4yNTU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7UHJlY2lzaW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDEwIHIxYzItdDEwIj5TZXRzIHRoZSBwcmVjaXNpb24gZm9yIHRoZSBjb2x1bW4gdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxMCByMWMzLXQxMCI+MDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTJjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtTY2FsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxMCByMWMyLXQxMCI+U2V0cyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB0aGF0IGFwcGVhciB0byB0aGUgcmlnaHQgb2YgdGhlIGRlY2ltYWwgcG9pbnQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDEwIHIxYzMtdDEwIj4wPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDEwIHIxYzQtdDEwIj48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxM2MxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPiZuYnNwOyZuYnNwO0NvbHVtbiBEZWZpbml0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDEwIHIxYzItdDEwIj5EZWZpbmUgdGhlIERETCBmb3IgYSBjb2x1bW4uIFRoaXMgaXMgdXNlZCB3aGVuIGEgdGFibGUgaXMgYmVpbmcgZ2VuZXJhdGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQxMCByMWMzLXQxMCI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDEwIHIxYzQtdDEwIj48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNGMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPjxhIGlkPSJDQUNHR0dIQiIgbmFtZT0iQ0FDR0dHSEIiPjwvYT48YSBpZD0ic3RocmVmMTk1IiBuYW1lPSJzdGhyZWYxOTUiPjwvYT48YSBpZD0ic3RocmVmMTk2IiBuYW1lPSJzdGhyZWYxOTYiPjwvYT48YSBpZD0ic3RocmVmMTk3IiBuYW1lPSJzdGhyZWYxOTciPjwvYT5GZXRjaCBUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDEwIHIxYzItdDEwIj5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZToKLTx1bD4KLTxsaT4KLTxwPkVhZ2VyICZuZGFzaDsgRGF0YSBpcyBsb2FkZWQgaW4gYmVmb3JlIGl0IGlzIGFjdHVhbGx5IG5lZWRlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eSAmbmRhc2g7IERhdGEgaXMgbG9hZGVkIG9ubHkgd2hlbiByZXF1aXJlZCBieSB0aGUgdHJhbnNhY3Rpb24uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTRjMS10MTAgcjFjMy10MTAiPkVhZ2VyPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDEwIHIxYzQtdDEwIj48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNWMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPk9wdGlvbmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE1YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTVjMS10MTAgcjFjMy10MTAiPlllczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNWMxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNmMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPjxhIGlkPSJDQUNCQklCSSIgbmFtZT0iQ0FDQkJJQkkiPjwvYT48YSBpZD0ic3RocmVmMTk4IiBuYW1lPSJzdGhyZWYxOTgiPjwvYT5Mb2I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10MTAgcjFjMi10MTAiPlNwZWNpZnkgaWYgdGhlIGZpZWxkIGlzIG1hcHBlZCB0byA8Y29kZT5qYXZhLnNxbC5DbG9iPC9jb2RlPiBvciA8Y29kZT5qYXZhLnNxbC5CbG9iPC9jb2RlPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBMb2I8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE2YzEtdDEwIHIxYzMtdDEwIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE3YzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+PGEgaWQ9IkNBQ0VBSkdEIiBuYW1lPSJDQUNFQUpHRCI+PC9hPjxhIGlkPSJzdGhyZWYxOTkiIG5hbWU9InN0aHJlZjE5OSI+PC9hPjxhIGlkPSJzdGhyZWYyMDAiIG5hbWU9InN0aHJlZjIwMCI+PC9hPjxhIGlkPSJzdGhyZWYyMDEiIG5hbWU9InN0aHJlZjIwMSI+PC9hPlRlbXBvcmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLTx1bD4KLTxsaT4KLTxwPkRhdGUgJm5kYXNoOyA8Y29kZT5qYXZhLnNxbC5EYXRlPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuVGltZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZXN0YW1wICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuVGltZXN0YW1wPC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QFRlbXBvcmFsPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxN2MxLXQxMCByMWMzLXQxMCI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDEwIHIxYzQtdDEwIj48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxOGMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPjxhIGlkPSJzdGhyZWYyMDIiIG5hbWU9InN0aHJlZjIwMiI+PC9hPjxhIGlkPSJzdGhyZWYyMDMiIG5hbWU9InN0aHJlZjIwMyI+PC9hPjxhIGlkPSJzdGhyZWYyMDQiIG5hbWU9InN0aHJlZjIwNCI+PC9hPkVudW1lcmF0ZWQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10MTAgcjFjMi10MTAiPlNwZWNpZnkgaG93IHRvIHBlcnNpc3QgZW51bWVyYXRlZCBjb25zdHJhaW50cyBpZiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSBzdWl0cyB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cyBvciB0byBtYXRjaCBhbiBleGlzdGluZyBkYXRhYmFzZSBzY2hlbWEuCi08dWw+Ci08bGk+Ci08cD5vcmRpbmFsPC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPlN0cmluZzwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbnVtZXJhdGVkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOGMxLXQxMCByMWMzLXQxMCI+T3JkaW5hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOGMxLXQxMCByMWM0LXQxMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxOWMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTljMS10MTAgcjFjMi10MTAiPlRoZSBwZXJzaXN0ZW50IGVudGl0eSB0byB3aGljaCB0aGUgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTljMS10MTAgcjFjMy10MTAiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOWMxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+IDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyMGMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPjxhIGlkPSJDQUNKQUlIQiIgbmFtZT0iQ0FDSkFJSEIiPjwvYT5DYXNjYWRlIFR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjBjMS10MTAgcjFjMi10MTAiPlNwZWNpZnkgd2hpY2ggb3BlcmF0aW9ucyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdob3V0IHRoZSBlbnRpdHkuCi08dWw+Ci08bGk+Ci08cD5BbGwgJm5kYXNoOyBBbGwgb3BlcmF0aW9uczwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJzaXN0PC9wPgotPC9saT4KLTxsaT4KLTxwPk1lcmdlPC9wPgotPC9saT4KLTxsaT4KLTxwPk1vdmU8L3A+Ci08L2xpPgotPGxpPgotPHA+UmVtb3ZlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlZnJlc2g8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMGMxLXQxMCByMWMzLXQxMCI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIwYzEtdDEwIHIxYzQtdDEwIj48YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyMWMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPjxhIGlkPSJDQUNKREpKQSIgbmFtZT0iQ0FDSkRKSkEiPjwvYT5NYXBwZWQgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjFjMS10MTAgcjFjMi10MTAiPlRoZSBmaWVsZCBpbiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCAib3ducyIgdGhlIHJlbGF0aW9uc2hpcC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBvbmx5IG9uIHRoZSBub24tb3duaW5nIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjFjMS10MTAgcjFjMy10MTAiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMWMxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyMmMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPjxhIGlkPSJDQUNEQURJSCIgbmFtZT0iQ0FDREFESUgiPjwvYT48YSBpZD0ic3RocmVmMjA1IiBuYW1lPSJzdGhyZWYyMDUiPjwvYT48YSBpZD0ic3RocmVmMjA2IiBuYW1lPSJzdGhyZWYyMDYiPjwvYT5PcmRlciBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMmMxLXQxMCByMWMyLXQxMCI+U3BlY2lmeSB0aGUgZGVmYXVsdCBvcmRlciBmb3Igb2JqZWN0cyByZXR1cm5lZCBmcm9tIGEgcXVlcnk6Ci08dWw+Ci08bGk+Ci08cD5ObyBvcmRlcmluZzwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QcmltYXJ5IGtleTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DdXN0b20gb3JkZXJpbmc8L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBPcmRlckJ5PC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMmMxLXQxMCByMWMzLXQxMCI+UHJpbWFyeSBrZXk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjJjMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT4uIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyM2MxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjNjMS10MTAgcjFjMi10MTAiPk92ZXJyaWRlcyA8c3BhbiBjbGFzcz0iYm9sZCI+QmFzaWM8L3NwYW4+IG1hcHBpbmdzIG9mIGEgbWFwcGVkIHN1cGVyY2xhc3MgKGZvciBleGFtcGxlLCBpZiB0aGUgaW5oZXJpdGVkIGNvbHVtbiBuYW1lIGlzIGluY29tcGF0aWJsZSB3aXRoIGEgcHJlLWV4aXN0aW5nIGRhdGEgbW9kZWwsIG9yIGludmFsaWQgYXMgYSBjb2x1bW4gbmFtZSBpbiB5b3VyIGRhdGFiYXNlKS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjNjMS10MTAgcjFjMy10MTAiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyM2MxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPgotPHA+PGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPjwvcD4KLTxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZlNmY1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0OSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPk5ldyBKUEEgUHJvamVjdCBwYWdlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTmV3IEpQQSBQcm9qZWN0IHBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCSkFHQyIgbmFtZT0iQ0FDQkpBR0MiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIG9uIHRoZSBOZXcgSlBBIFByb2plY3QgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRERMIC0gT2JqZWN0cyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPlByb2plY3QgbmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIgcjFjMi10MiI+TmFtZSBvZiB0aGUgRWNsaXBzZSBKUEEgcHJvamVjdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyIHIxYzMtdDIiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj5Qcm9qZWN0IGNvbnRlbnRzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MiByMWMyLXQyIj5Mb2NhdGlvbiBvZiB0aGUgd29ya3NwYWNlIGluIHdoaWNoIHRvIHNhdmUgdGhlIHByb2plY3QuCi08cD5VbnNlbGVjdCBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZSBEZWZhdWx0PC9zcGFuPiBvcHRpb24gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IHRvIHNlbGVjdCBhIG5ldyBsb2NhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyIHIxYzMtdDIiPkN1cnJlbnQgd29ya3NwYWNlPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPlRhcmdldCBydW50aW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MiByMWMyLXQyIj5TZWxlY3QgYSBwcmUtZGVmaW5lZCB0YXJnZXQgZm9yIHRoZSBwcm9qZWN0LgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5ldzwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGVudmlyb25tZW50IHdpdGggdGhlIE5ldyBTZXJ2ZXIgUnVudGltZSB3aXphcmQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MiByMWMzLXQyIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MiIgaGVhZGVycz0icjFjMS10MiI+Q29uZmlndXJhdGlvbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyIHIxYzItdDIiPlNlbGVjdCBhIHByb2plY3QgY29uZmlndXJhdGlvbiB3aXRoIHByZS1kZWZpbmVkIGZhY2V0cy4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+Jmx0O2N1c3RvbSZndDs8L3NwYW4+IHRvIG1hbnVhbGx5IHNlbGVjdCB0aGUgZmFjZXRzIGZvciB0aGlzIHByb2plY3QuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MiByMWMzLXQyIj5VdGlsaXR5IEpQQSBwcm9qZWN0IHdpdGggSmF2YSA1LjA8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MiIgaGVhZGVycz0icjFjMS10MiI+RUFSIG1lbWJlcnNoaXA8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyIHIxYzItdDIiPlNwZWNpZnkgaWYgdGhpcyBwcm9qZWN0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVBUiBQcm9qZWN0IE5hbWU8L3NwYW4+LCBvciBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV3PC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgRUFSIHByb2plY3QuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MiByMWMzLXQyIj48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiMDE0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDkgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkpHQkciIG5hbWU9IkNBQ0JKR0JHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvaDE+Ci08cD5UaGUgQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBuZXcgSmF2YSBwcm9qZWN0IHVzaW5nIEpQQS4gVGhlIHdpemFyZCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJhNzYwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjUwIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSUZCQUYiIG5hbWU9IkJBQklGQkFGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE5MCIgbmFtZT0ic3RocmVmMTkwIj48L2E+PGEgaWQ9InN0aHJlZjE5MSIgbmFtZT0ic3RocmVmMTkxIj48L2E+PGEgaWQ9InN0aHJlZjE5MiIgbmFtZT0ic3RocmVmMTkyIj48L2E+VGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBkaXNwbGF5cyB0aGUgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFwcGVkIGF0dHJpYnV0ZSBhbmQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBhcmVhczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDE0Lmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDE1Lmh0bSNDQUNGQ0VKQyI+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0ZDQ0FCIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZmE2YjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjUxIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+SlBBIFN0cnVjdHVyZSB2aWV3PC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIFN0cnVjdHVyZSB2aWV3IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRUdHRkUiIG5hbWU9IkJBQkVHR0ZFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KUEEgU3RydWN0dXJlIHZpZXc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIxNSIgbmFtZT0ic3RocmVmMjE1Ij48L2E+PGEgaWQ9InN0aHJlZjIxNiIgbmFtZT0ic3RocmVmMjE2Ij48L2E+VGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgU3RydWN0dXJlPC9zcGFuPiB2aWV3IGRpc3BsYXlzIGFuIG91dGxpbmUgb2YgdGhlIHN0cnVjdHVyZSAoaXRzIGF0dHJpYnV0ZXMgYW5kIG1hcHBpbmdzKSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkIG9yIG9wZW5lZCBpbiB0aGUgZWRpdG9yLiBUaGUgc3RydWN0dXJhbCBlbGVtZW50cyBzaG93biBpbiB0aGUgb3V0bGluZSBhcmUgdGhlIGVudGl0eSBhbmQgaXRzIGZpZWxkcy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyMTciIG5hbWU9InN0aHJlZjIxNyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNhbXBsZSBKUEEgU3RydWN0dXJlIFZpZXc8L3A+Ci08aW1nIHNyYz0iaW1nL3BlcnNpc3RlbmNlX291dGxpbmVfdmlldy5wbmciIGFsdD0iU2FtcGxlIEpQQSBTdHJ1Y3R1cmUgdmlldyBmb3IgYW4gZW50aXR5LiIgdGl0bGU9IlNhbXBsZSBKUEEgU3RydWN0dXJlIHZpZXcgZm9yIGFuIGVudGl0eS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5OTA4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjUyIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSUZCREIiIG5hbWU9IkJBQklGQkRCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI0NCIgbmFtZT0ic3RocmVmMjQ0Ij48L2E+PGEgaWQ9InN0aHJlZjI0NSIgbmFtZT0ic3RocmVmMjQ1Ij48L2E+VGhlIDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L3NwYW4+IGRlZmluZXMgdGhlIGluaXRpYWwgc2V0IGFuZCBsYXlvdXQgb2Ygdmlld3MgaW4gdGhlIFdvcmtiZW5jaCB3aW5kb3cgd2hlbiB1c2luZyBEYWxpLiBCeSBkZWZhdWx0LCB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvc3Bhbj4gaW5jbHVkZXMgdGhlIGZvbGxvd2luZyB2aWV3czo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2NvbmNlcHRzLTQuaHRtIj5QZXJzcGVjdGl2ZXM8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YTA3YzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDkgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZBRUJCIiBuYW1lPSJCQUJGQUVCQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTc3IiBuYW1lPSJzdGhyZWYxNzciPjwvYT48YSBpZD0ic3RocmVmMTc4IiBuYW1lPSJzdGhyZWYxNzgiPjwvYT48YSBpZD0ic3RocmVmMTc5IiBuYW1lPSJzdGhyZWYxNzkiPjwvYT5UaGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGRpc3BsYXlzIHRoZSBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbnRpdHkgYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgdGFiczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI0NBQ0NBR0dDIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTAuaHRtI0NBQ0lKQkdIIj5BdHRyaWJ1dGUgb3ZlcnJpZGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI0NBQ0JISURBIj5TZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkhHSEUiPkluaGVyaXRhbmNlIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcmltYXJ5X2tleS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3ByaW1hcnlfa2V5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4YTU0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3ByaW1hcnlfa2V5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1MSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb248L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkNDQUIiIG5hbWU9IkNBQ0ZDQ0FCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uPC9zcGFuPiBhcmVhIGluIEpQQSBEZXRhaWxzIHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT4gdHlwZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDEzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPjxhIGlkPSJDQUNCQUpCQyIgbmFtZT0iQ0FDQkFKQkMiPjwvYT5QcmltYXJ5IEtleSBHZW5lcmF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTMgcjFjMi10MTMiPjxhIGlkPSJzdGhyZWYyMTEiIG5hbWU9InN0aHJlZjIxMSI+PC9hPjxhIGlkPSJzdGhyZWYyMTIiIG5hbWU9InN0aHJlZjIxMiI+PC9hPlRoZXNlIGZpZWxkcyBkZWZpbmUgaG93IHRoZSBwcmltYXJ5IGtleSBpcyBnZW5lcmF0ZWQuIFRoZXNlIGZpZWxkcyBjb3JyZXNwb25kIHRvIHRoZSA8Y29kZT5AR2VuZXJhdGVkVmFsdWU8L2NvZGU+IGFubm90YXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTMgcjFjMy10MTMiPkdlbmVyYXRlZCBWYWx1ZTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPjxhIGlkPSJDQUNKRUVFQyIgbmFtZT0iQ0FDSkVFRUMiPjwvYT4mbmJzcDsmbmJzcDsmbmJzcDtTdHJhdGVneTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzItdDEzIj4KLTx1bD4KLTxsaT5BdXRvPC9saT4KLTxsaT4KLTxwPklkZW50aXR5ICZuZGFzaDsgVmFsdWVzIGFyZSBhc3NpZ25lZCBieSB0aGUgZGF0YWJhc2UncyA8c3BhbiBjbGFzcz0iYm9sZCI+SWRlbnRpdHk8L3NwYW4+IGNvbHVtbi48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VxdWVuY2UgJm5kYXNoOyBWYWx1ZXMgYXJlIGFzc2lnbmVkIGJ5IGEgc2VxdWVuY2UgdGFibGUgKHNlZSA8YSBocmVmPSIjQ0FDRkZIRUgiPlNlcXVlbmNlJm5ic3A7R2VuZXJhdG9yPC9hPikuPC9wPgotPC9saT4KLTxsaT4KLTxwPlRhYmxlICZuZGFzaDsgVmFsdWVzIGFyZSBhc3NpZ25lZCBieSBhIGRhdGFiYXNlIHRhYmxlIChzZWUgPGEgaHJlZj0iI0NBQ0dGRUFIIj5UYWJsZSBHZW5lcmF0b3I8L2E+KS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzMtdDEzIj5BdXRvPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+PGEgaWQ9IkJBQkVFQUhKIiBuYW1lPSJCQUJFRUFISiI+PC9hPiZuYnNwOyZuYnNwO0dlbmVyYXRvciBOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTMgcjFjMi10MTMiPlVuaXF1ZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgdmFsdWUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPjxhIGlkPSJDQUNHRkVBSCIgbmFtZT0iQ0FDR0ZFQUgiPjwvYT5UYWJsZSBHZW5lcmF0b3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMyByMWMyLXQxMyI+VGhlc2UgZmllbGRzIGRlZmluZSB0aGUgZGF0YWJhc2UgdGFibGUgdXNlZCBmb3IgZ2VuZXJhdGluZyB0aGUgcHJpbWFyeSBrZXkgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIDxjb2RlPkBUYWJsZUdlbmVyYXRvcjwvY29kZT4gYW5ub3RhdGlvbi4KLTxwPlRoZXNlIGZpZWxkcyBhcHBseSBvbmx5IHdoZW4gPHNwYW4gY2xhc3M9ImJvbGQiPlN0cmF0ZWd5PC9zcGFuPiZuYnNwOz0mbmJzcDs8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTMgcjFjMi10MTMiPlVuaXF1ZSBuYW1lIG9mIHRoZSBnZW5lcmF0b3IuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPiZuYnNwOyZuYnNwO1RhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTMgcjFjMi10MTMiPkRhdGFiYXNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtQcmltYXJ5IEtleSBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxMyByMWMyLXQxMyI+VGhlIGNvbHVtbiBpbiB0aGUgdGFibGUgZ2VuZXJhdG9yJ3MgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPiB0aGF0IGNvbnRhaW5zIHRoZSBwcmltYXJ5IGtleS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+Jm5ic3A7Jm5ic3A7VmFsdWUgQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTMgcjFjMi10MTMiPlRoZSBjb2x1bW4gdGhhdCBzdG9yZXMgdGhlIGdlbmVyYXRlZCBJRCB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtQcmltYXJ5IEtleSBDb2x1bW4gVmFsdWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTMgcjFjMi10MTMiPlRoZSB2YWx1ZSBmb3IgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5QcmltYXJ5IEtleSBDb2x1bW48L3NwYW4+IGluIHRoZSBnZW5lcmF0b3IgdGFibGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+PGEgaWQ9IkNBQ0ZGSEVIIiBuYW1lPSJDQUNGRkhFSCI+PC9hPlNlcXVlbmNlJm5ic3A7R2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDEzIHIxYzItdDEzIj48YSBpZD0ic3RocmVmMjEzIiBuYW1lPSJzdGhyZWYyMTMiPjwvYT48YSBpZD0ic3RocmVmMjE0IiBuYW1lPSJzdGhyZWYyMTQiPjwvYT5UaGVzZSBmaWVsZHMgZGVmaW5lIHRoZSBzcGVjaWZpYyBzZXF1ZW5jZSB1c2VkIGZvciBnZW5lcmF0aW5nIHRoZSBwcmltYXJ5IGtleSBhbmQgY29ycmVzcG9uZCB0byB0aGUgPGNvZGU+QFNlcXVlbmNlR2VuZXJhdG9yPC9jb2RlPiBhbm5vdGF0aW9uLgotPHA+VGhlc2UgZmllbGRzIGFwcGx5IG9ubHkgd2hlbiA8c3BhbiBjbGFzcz0iYm9sZCI+U3RyYXRlZ3k8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImJvbGQiPlNlcXVlbmNlPC9zcGFuPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTJjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDEzIHIxYzItdDEzIj5OYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZSB0byB1c2UgZm9yIGRlZmluaW5nIHByaW1hcnkga2V5IHZhbHVlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTNjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtTZXF1ZW5jZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQxMyByMWMyLXQxMyI+VW5pcXVlIG5hbWUgb2YgdGhlIHNlcXVlbmNlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkNDczZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1MiAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSlBBIE9wdGlvbnM8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEpQQSBPcHRpb25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSkhCQ0kiIG5hbWU9IkJBQkpIQkNJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEpQQSBPcHRpb25zPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMzIiIG5hbWU9InN0aHJlZjIzMiI+PC9hPjxhIGlkPSJzdGhyZWYyMzMiIG5hbWU9InN0aHJlZjIzMyI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQTwvc3Bhbj4gb3B0aW9ucyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb3BlcnRpZXM8L3NwYW4+IHBhZ2UgdG8gc2VsZWN0IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSB3aXRoIHRoZSBwcm9qZWN0LjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHMgcGFnZTwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij48YSBpZD0ic3RocmVmMjM0IiBuYW1lPSJzdGhyZWYyMzQiPjwvYT48YSBpZD0ic3RocmVmMjM1IiBuYW1lPSJzdGhyZWYyMzUiPjwvYT48YSBpZD0ic3RocmVmMjM2IiBuYW1lPSJzdGhyZWYyMzYiPjwvYT48YSBpZD0ic3RocmVmMjM3IiBuYW1lPSJzdGhyZWYyMzciPjwvYT5QbGF0Zm9ybTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI4IHIxYzItdDI4Ij5TZWxlY3QgdGhlIHZlbmRvci1zcGVjaWZpYyBwbGF0Zm9ybS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij48YSBpZD0ic3RocmVmMjM4IiBuYW1lPSJzdGhyZWYyMzgiPjwvYT48YSBpZD0ic3RocmVmMjM5IiBuYW1lPSJzdGhyZWYyMzkiPjwvYT48YSBpZD0ic3RocmVmMjQwIiBuYW1lPSJzdGhyZWYyNDAiPjwvYT5Db25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjggcjFjMi10MjgiPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gbWFwIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLgotPHVsPgotPGxpPgotPHA+VG8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgQ29ubmVjdGlvbnM8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UbyByZWNvbm5lY3QgdG8gYW4gZXhpc3RpbmcgY29ubmVjdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlJlY29ubmVjdDwvc3Bhbj4uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4mbmJzcDsmbmJzcDtPdmVycmlkZSBkZWZhdWx0IHNjaGVtYSBmcm9tIGNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyOCByMWMyLXQyOCI+U2VsZWN0IGEgc2NoZW1hIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgb25lIGRlcml2ZWQgZnJvbSB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi4gVXNlIHRoaXMgb3B0aW9uIGlmIHRoZSBkZWZhdWx0IHNjaGVtYSBpcyBpbmNvcnJlY3Qgb3IgY2Fubm90IGJlIHVzZWQuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBvcHRpb24gd2hlbiB0aGUgZGVwbG95bWVudCBsb2dpbiBkaWZmZXJzIGZyb20gdGhlIGRlc2lnbi10aW1lIGxvZ2luLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPlBlcnNpc3RlbnQgQ2xhc3MgTWFuYWdlbWVudDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI4IHIxYzItdDI4Ij5TcGVjaWZ5IGlmIERhbGkgd2lsbCA8c3BhbiBjbGFzcz0iYm9sZCI+ZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseTwvc3Bhbj4sIG9yIGlmIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+YW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj4gZmlsZS4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob3RlPC9zcGFuPjogVG8gaW5zdXJlIGFwcGxpY2F0aW9uIHBvcnRhYmlsaXR5LCB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tzMDI1Lmh0bSNCQUJEQkNCSSI+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmNDA1Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQ5IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+UmVmZXJlbmNlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFJlZmVyZW5jZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjE2OCIgbmFtZT0ic3RocmVmMTY4Ij48L2E+PC9wPgotPGgxPlJlZmVyZW5jZTwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgZGV0YWlsZWQgaGVscCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIGluIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbDo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDEuaHRtI0NBQ0pKSkpIIj5XaXphcmRzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDguaHRtI0NBQ0RKSUlHIj5Qcm9wZXJ0eSBwYWdlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI4Lmh0bSNDQUNERUlFRSI+UHJlZmVyZW5jZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyOS5odG0jQ0FDR0VKREEiPkRpYWxvZ3M8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMxLmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzNC5odG0jQ0FDQkJESUIiPkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb248L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzMyNmQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDkgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5XaXphcmRzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iV2l6YXJkcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0pKSkpIIiBuYW1lPSJDQUNKSkpKSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+V2l6YXJkczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZyB3aXphcmRzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MzIyZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0OSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdHR0RGIiBuYW1lPSJDSUFHR0dERiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9oMT4KLTxwPlRoZSBDcmVhdGUgSlBBIHdpemFyZCBlbmFibGVzIHlvdSB0byBxdWlja2x5IGFkZCBhbiBlbnRpdHkgYW5kIGFsc28gYWRkIHBlcnNpc3RlbmNlIGZpZWxkcyB0byB0aGF0IGVudGl0eS4gSW4gYWRkaXRpb24sIHRoaXMgd2l6YXJkIGFkZHMgdGhlIGFjY2Vzc29yIG1ldGhvZHMgKDxjb2RlPmdldHRlcjwvY29kZT4gYW5kIDxjb2RlPnNldHRlcjwvY29kZT4pIGluIHRoZSBjbGFzcyBmaWxlLiBUaGUgd2l6YXJkIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDAzLmh0bSNDSUFGRUlHRiI+RW50aXR5IENsYXNzIHBhZ2U8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAwNC5odG0jQ0lBREVDSUEiPkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2IwOGQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQ5IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+RW50aXR5IENsYXNzIHBhZ2U8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbnRpdHkgQ2xhc3MgcGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZFSUdGIiBuYW1lPSJDSUFGRUlHRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW50aXR5IENsYXNzIHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgRW50aXR5IENsYXNzIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMTY5IiBuYW1lPSJzdGhyZWYxNjkiPjwvYT48YSBpZD0ic3RocmVmMTcwIiBuYW1lPSJzdGhyZWYxNzAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPiZuYnNwOzwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgRW50aXR5IENsYXNzIHBhZ2Ugb2YgdGhlIENyZWF0ZSBKUEEgRW50aXRpZXMgd2l6YXJkLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDQiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPgotPHA+UHJvamVjdDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQgcjFjMi10NCI+Ci08cD5UaGUgbmFtZSBvZiB0IGhlIEpQQSBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQgcjFjMy10NCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPgotPHA+U291cmNlIEZvbGRlcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDQgcjFjMi10NCI+Ci08cD5UaGUgbG9jYXRpb24gb2YgdGhlIEpQQSBwcm9qZWN0J3Mgc3JjIGZvbGRlci48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ0IHIxYzMtdDQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij4KLTxwPkphdmEgUGFja2FnZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDQgcjFjMi10NCI+Ci08cD5UaGUgbmFtZSBvZiB0aGUgY2xhc3MgcGFja2FnZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ0IHIxYzMtdDQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij4KLTxwPkNsYXNzIG5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ0IHIxYzItdDQiPgotPHA+VGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NCByMWMzLXQ0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Ci08cD5TdXBlcmNsYXNzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NCByMWMyLXQ0Ij4KLTxwPlNlbGVjdCB0aGUgc3VwZXJjbGFzcy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ0IHIxYzMtdDQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij4KLTxwPkluaGVyaXRhbmNlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NCByMWMyLXQ0Ij4KLTxwPkJlY2F1c2UgdGhlIHdpemFyZCBjcmVhdGVzIGEgSmF2YSBjbGFzcyB3aXRoIGFuIDxjb2RlPkBFbnRpdHk8L2NvZGU+IG5vdGF0aW9uLCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVudGl0eTwvc3Bhbj4gb3B0aW9uIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuPC9wPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwZWQgU3VwZXJjbGFzczwvc3Bhbj4gaWYgeW91IGRlZmluZWQgYSBzdXBlcmNsYXNzLjwvcD4KLTxwPlRvIGFkZCBhbiA8Y29kZT5ASW5oZXJpdGFuY2U8L2NvZGU+IG5vdGF0aW9uIHRvIHRoZSBlbnRpdHksIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SW5oZXJpdGFuY2U8L3NwYW4+IGFuZCB0aGVuIHNlbGVjdCBvbmUgb2YgdGhlIGluaGVyaXRhbmNlIG1hcHBpbmcgc3RyYXRlZ2llcyAoZGVzY3JpYmVkIGluIEpTUiAyMjApOjwvcD4KLTx1bD4KLTxsaT4KLTxwPlNJTkdMRV9UQUJMRSAtLSBBbGwgY2xhc3NlcyBpbiBhIGhpZXJhcmNoeSBhcyBtYXBwZWQgdG8gYSBzaW5nbGUgdGFibGUuIFRoaXMgYW5ub3RhdGlvbiBpcyB3aXRob3V0IGFuIGF0dHJpYnV0ZSBmb3IgdGhlIGluaGVyaXRhbmNlIHN0cmF0ZWd5LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UQUJMRV9QRVJfQ0xBU1MgLS0gRWFjaCBjbGFzcyBpcyBtYXBwZWQgdG8gYSBzZXBhcmF0ZSB0YWJsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+Sk9JTkVEIC0tIFRoZSByb290IG9mIHRoZSBjbGFzcyBoaWVyYXJjaHkgaXMgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgdGFibGUuIEVhY2ggc3ViY2xhc3MgaXMgcmVwcmVzZW50ZWQgYnkgYSBzZXBhcmF0ZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRob3NlIGZpZWxkcyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgc3ViY2xhc3MgKG5vdCBpbmhlcml0ZWQgZnJvbSBpdHMgc3VwZXJjbGFzcyksIGFzIHdlbGwgYXMgdGhlIGNvbHVtbihzKSB0aGF0IHJlcHJlc2VudCBpdHMgcHJpbWFyeSBrZXkuIFRoZSBwcmltYXJ5IGtleSBjb2x1bW4ocykgb2YgdGhlIHN1YmNsYXNzIHRhYmxlIHNlcnZlcyBhcyBhIGZvcmVpZ24ga2V5IHRvIHRoZSBwcmltYXJ5IGtleSBvZiB0aGUgc3VwZXJjbGFzcyB0YWJsZS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDQgcjFjMy10NCI+Ci08cD5FbnRpdHk8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Ci08cD5YTUwgRW50aXR5IE1hcHBpbmdzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NCByMWMyLXQ0Ij4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIHRvIGVudGl0eSBtYXBwaW5ncyBpbiBYTUw8L3NwYW4+IHRvIGNyZWF0ZSBYTUwgbWFwcGluZ3MgaW4gPGNvZGU+b3JtLnhtbDwvY29kZT4sIHJhdGhlciB0aGFuIGFubm90YXRpb25zLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDQgcjFjMy10NCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMWI5OTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDkgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW50aXR5IFByb3BlcnRpZXMgcGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQURFQ0lBIiBuYW1lPSJDSUFERUNJQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW50aXR5IFByb3BlcnRpZXMgcGFnZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBFbnRpdHkgUHJvcGVydGllcyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDIuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjE3MSIgbmFtZT0ic3RocmVmMTcxIj48L2E+PGEgaWQ9InN0aHJlZjE3MiIgbmFtZT0ic3RocmVmMTcyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj4mbmJzcDs8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IiIgc3VtbWFyeT0iVGhpcyB0YWJsZSB0byBiZSBjb252ZXJ0ZWQgdG8gaW5mb3JtYWwuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10NSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NSIgaGVhZGVycz0icjFjMS10NSI+Ci08cD5FbnRpdHkgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDUgcjFjMi10NSI+Ci08cD5UaGUgbmFtZSBvZiB0aGUgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZW50ZXJlZCBhcyB0aGUgY2xhc3MgbmFtZS4gSWYgdGhlIGVudGl0eSBuYW1lIGRpZmZlcnMgZnJvbSB0aGUgY2xhc3MgbmFtZSwgdGhlbiB0aGUgZW50aXR5IG5hbWUgaXMgYWRkZWQgYXMgYW4gYXR0cmlidXRlLiBGb3IgZXhhbXBsZTogPGNvZGU+QEVudGl0eShuYW1lPSJFbnRpdHlOYW1lIik8L2NvZGU+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDUgcjFjMy10NSI+Ci08cD5EZXRlcm1pbmVkIGJ5IHNlcnZlci48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NSIgaGVhZGVycz0icjFjMS10NSI+Ci08cD5UYWJsZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NSByMWMyLXQ1Ij4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlIGRlZmF1bHQ8L3NwYW4+IHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBtYXBwZWQgdGFibGUgbmFtZSB0byB0aGUgZW50aXR5IG5hbWUuIE90aGVyd2lzZSwgY2xlYXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Vc2UgZGVmYXVsdDwvc3Bhbj4gb3B0aW9uIGFuZCBlbnRlciB0aGUgbmFtZSBpbiB0aGUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+VGFibGUgTmFtZTwvc3Bhbj4gZmllbGQuIFRoZXNlIG9wdGlvbnMgcmVzdWx0IGluIHRoZSBhZGRpdGlvbiBvZiB0aGUgPGNvZGU+QFRhYmxlPC9jb2RlPiBvcHRpb24gdG8gdGhlIEphdmEgY2xhc3MgZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ1IHIxYzMtdDUiPgotPHA+VXNlIGRlZmF1bHQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDUiIGhlYWRlcnM9InIxYzEtdDUiPgotPHA+RW50aXR5IEZpZWxkczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDUgcjFjMi10NSI+Ci08cD5DbGljayB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gYnV0dG9uIHRvIGFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdXNpbmcgdGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nLiBUaGlzIGRpYWxvZyBlbmFibGUgeW91IHRvIGJ1aWxkIGEgZmllbGQgYnkgZW50ZXJpbmcgYSBmaWVsZCBuYW1lIGFuZCBzZWxlY3RpbmcgYW1vbmcgcGVyc2lzdGVuY2UgdHlwZXMuIFRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+S2V5PC9zcGFuPiBvcHRpb24gZW5hYmxlcyB5b3UgdG8gbWFyayBhIGZpZWxkIGFzIGEgcHJpbWFyeSBrZXkuIFRoZSBkaWFsb2cncyA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiBmdW5jdGlvbiBlbmFibGVzIHlvdSB0byBhZGQgb3RoZXIgcGVyc2lzdGVuY2UgdHlwZXMgZGVzY3JpYmVkIGluIHRoZSBKUEEgc3BlY2lmaWNhdGlvbi4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5FZGl0PC9zcGFuPiBidXR0b24gZW5hYmxlcyB5b3UgdG8gY2hhbmdlIHRoZSBuYW1lIG9yIHR5cGUgc2V0IGZvciBhIHBlcnNpc3RlbnQgZmllbGQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NSIgaGVhZGVycz0icjFjMS10NSI+Ci08cD5BY2Nlc3MgVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDUgcjFjMi10NSI+Ci08cD5TZWxlY3Qgd2hldGhlciB0aGUgZW50aXR5J3MgYWNjZXNzIHRvIGluc3RhbmNlIHZhcmlhYmxlcyBpcyBmaWVsZC1iYXNlZCBvciBwcm9wZXJ0eS1iYXNlZCwgYXMgZGVmaW5lZCBpbiB0aGUgSlBBIHNwZWNpZmljYXRpb24uPC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZpZWxkLWJhc2VkPC9zcGFuPiAmbmRhc2g7IEluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQgZGlyZWN0bHkuIEFsbCBub24tdHJhbnNpZW50IGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgcGVyc2lzdGVudC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5LWJhc2VkPC9zcGFuPiAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ1IHIxYzMtdDUiPgotPHA+RmllbGQtYmFzZWQ8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMDEuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkNDA0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQ5IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+TWFwcGluZyBGaWxlIFdpemFyZDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBpbmcgRmlsZSBXaXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFJSkNDRSIgbmFtZT0iQ0lBSUpDQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2gxPgotPHA+VGhlIE1hcHBpbmcgRmlsZSB3aXphcmQgZW5hYmxlcyB5b3UgdG8gYWRkIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdG8gYSBKUEEgcHJvamVjdCBpZiBubyBvYmplY3QgbWFwIGV4aXN0cyBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGNsZWFyZWQgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DcmVhdGUgb3JtLnhtbDwvc3Bhbj4gb3B0aW9uIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+LCB5b3UgY2FuIGxhdGVyIGFkZCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB0byB0aGUgc3JjIGZpbGUgb2YgdGhlIHByb2plY3QgdXNpbmcgdGhpcyB3aXphcmQuPC9wPgotPHA+VGhlIDxhIGhyZWY9IiNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4gY29uc2lzdHMgb2YgdGhlIE1hcHBpbmcgRmlsZSBwYWdlLjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMjhjMjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDkgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5NYXBwaW5nIEZpbGUgV2l6YXJkPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGluZyBGaWxlIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMTczIiBuYW1lPSJzdGhyZWYxNzMiPjwvYT4KLTxoMT5NYXBwaW5nIEZpbGU8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDA1Lmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMTc0IiBuYW1lPSJzdGhyZWYxNzQiPjwvYT48YSBpZD0ic3RocmVmMTc1IiBuYW1lPSJzdGhyZWYxNzUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPk1hcHBpbmcgRmlsZSBXaXphcmQgUHJvcGVydGllczwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iTWFwcGluZyBGaWxlIFdpemFyZCBQcm9wZXJ0aWVzIiBzdW1tYXJ5PSIiIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDYiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ2Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ2IiBoZWFkZXJzPSJyMWMxLXQ2Ij4KLTxwPlByb2plY3Q8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ2IHIxYzItdDYiPgotPHA+VGhlIG5hbWUgb2YgdGhlIEpQQSBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDYgcjFjMy10NiI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5Tb3VyY2UgZm9sZGVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NiByMWMyLXQ2Ij4KLTxwPlRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvamVjdCdzIHNyYyBmb2xkZXIuIElmIG5lZWRlZCwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gdG8gcG9pbnQgdGhlIHdpemFyZCB0byB0aGUgc3JjIGZpbGUncyBsb2NhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ2IHIxYzMtdDYiPgotPHA+U2VsZWN0ZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+RmlsZSBQYXRoPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NiByMWMyLXQ2Ij4KLTxwPlRoZSBsb2NhdGlvbiBmb3IgdGhlIG5ldyA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDYgcjFjMy10NiI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5EZWZhdWx0IEFjY2VzczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDYgcjFjMi10NiI+Ci08cD5TZWxlY3Qgd2hldGhlciB0aGUgYWNjZXNzIHRvIHRoZSBlbnRpdHkgaXMgZmllbGQtYmFzZWQgb3IgcHJvcGVydHktYmFzZWQsIGFzIGRlZmluZWQgaW4gSlBBIHNwZWNpZmljYXRpb24uPC9wPgotPHVsPgotPGxpPgotPHA+Tm9uZSAmbmRhc2g7IE5vIGFjY2VzcyB0eXBlIHNwZWNpZmllZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5LWJhc2VkPC9zcGFuPiAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GaWVsZC1iYXNlZDwvc3Bhbj4gJm5kYXNoOyBJbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkIGRpcmVjdGx5LiBBbGwgbm9uLXRyYW5zaWVudCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHBlcnNpc3RlbnQuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ2IHIxYzMtdDYiPgotPHA+Tm9uZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ2IiBoZWFkZXJzPSJyMWMxLXQ2Ij4KLTxwPkFkZCB0byBwZXJzaXN0ZW5jZSB1bml0PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NiByMWMyLXQ2Ij4KLTxwPkRlc2lnbmF0ZXMgdGhlIHBlcnNpc3RlbmNlIHVuaXQgZm9yIHRoaXMgb2JqZWN0IG1hcCBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDYgcjFjMy10NiI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4YTAzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQ5IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+TWFwcGluZyBGaWxlIFdpemFyZCBQcm9wZXJ0aWVzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGluZyBGaWxlIFdpemFyZCBQcm9wZXJ0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPjxhIGlkPSJzdGhyZWYxNzYiIG5hbWU9InN0aHJlZjE3NiI+PC9hPgotPGgxPkdlbmVyYXRlIERETCBmcm9tIEVudGl0aWVzIFdpemFyZDwvaDE+Ci08cD5UaGUgR2VuZXJhdGUgRERMIGZyb20gRW50aXRpZXMgV2l6YXJkIHRvIHF1aWNrbHkgY3JlYXRlIERETCBzY3JpcHRzIGZyb20geW91ciBwZXJzaXN0ZW50IGVudGl0aWVzLiBEYWxpIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IHByaW1hcnkgYW5kIGZvcmVpZ24ga2V5cywgYmFzZWQgb24gdGhlIGVudGl0eSBtYXBwaW5ncy48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYTM2ZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0OSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlByb3BlcnR5IHBhZ2VzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJvcGVydHkgcGFnZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNESklJRyIgbmFtZT0iQ0FDREpJSUciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByb3BlcnR5IHBhZ2VzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWI5YjI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDkgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0NBR0dDIiBuYW1lPSJDQUNDQUdHQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhbCBpbmZvcm1hdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBHZW5lcmFsIGluZm9ybWF0aW9uIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDciPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ3Ij5EZWZhdWx0PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWM0LXQ3Ij5BdmFpbGFibGUgZm9yIEVudGl0eSZuYnNwO1R5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDciIGhlYWRlcnM9InIxYzEtdDciPk1hcHBpbmcgVHlwZSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ3IHIxYzItdDciPkNsaWNraW5nIHRoZSBuYW1lIG9mIHRoZSBtYXBwaW5nIHR5cGUsIHdoaWNoIGlzIHJlcHJlc2VudGVkIGFzIGEgaHlwZXJsaW5rLCBpbnZva2VzIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy4gVXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgZW50aXR5OiBNYXBwZWQgU3VwZXJjbGFzcywgRW1iZWRkYWJsZSBvciB0aGUgZGVmYXVsdCBtYXBwaW5nIHR5cGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NyByMWMzLXQ3Ij5FbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ3IHIxYzQtdDciPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPiwgPGEgaHJlZj0idGFza3MwMDcuaHRtI0JBQkZFSUNFIj5FbWJlZGRhYmxlPC9hPiwgYW5kIDxhIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSI+TWFwcGVkIHN1cGVyY2xhc3M8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDciIGhlYWRlcnM9InIxYzEtdDciPk5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ3IHIxYzItdDciPlRoZSBuYW1lIG9mIHRoaXMgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGUgY2xhc3MgbmFtZSBpcyB1c2VkIGFzIHRoZSBlbnRpdHkgbmFtZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ3IHIxYzMtdDciPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDcgcjFjNC10NyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDciIGhlYWRlcnM9InIxYzEtdDciPlRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NyByMWMyLXQ3Ij5UaGUgZGVmYXVsdCBkYXRhYmFzZSB0YWJsZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBlbnRpdHkuIFRoZXNlIGZpZWxkcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxMC5odG0jQ0FDSUpCR0giPkF0dHJpYnV0ZSBvdmVycmlkZXM8L2E+IGFyZWEuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NyByMWMzLXQ3Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ3IHIxYzQtdDciPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij4mbmJzcDsmbmJzcDtOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NyByMWMyLXQ3Ij5UaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBkYXRhYmFzZSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0eS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ3IHIxYzMtdDciPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDcgcjFjNC10NyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDciIGhlYWRlcnM9InIxYzEtdDciPiZuYnNwOyZuYnNwO0NhdGFsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ3IHIxYzItdDciPlRoZSBkYXRhYmFzZSBjYXRhbG9nIHRoYXQgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NyByMWMzLXQ3Ij5BcyBkZWZpbmVkIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDcgcjFjNC10NyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDciIGhlYWRlcnM9InIxYzEtdDciPiZuYnNwOyZuYnNwO1NjaGVtYTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDcgcjFjMi10NyI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDcgcjFjMy10NyI+QXMgZGVmaW5lZCBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ3IHIxYzQtdDciPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWJkYWQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDkgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5BdHRyaWJ1dGUgb3ZlcnJpZGVzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQXR0cmlidXRlIG92ZXJyaWRlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0lKQkdIIiBuYW1lPSJDQUNJSkJHSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QXR0cmlidXRlIG92ZXJyaWRlczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTgwIiBuYW1lPSJzdGhyZWYxODAiPjwvYT48YSBpZD0ic3RocmVmMTgxIiBuYW1lPSJzdGhyZWYxODEiPjwvYT48YSBpZD0ic3RocmVmMTgyIiBuYW1lPSJzdGhyZWYxODIiPjwvYT5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9zcGFuPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3Mgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI0NBQ0NBR0dDIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBhcmVhIG9mIGFuIGF0dHJpYnV0ZS4gQXR0cmlidXRlIG92ZXJyaWRlcyBnZW5lcmFsbHkgb3ZlcnJpZGUvY29uZmlndXJlIGF0dHJpYnR1ZXMgdGhhdCBhcmUgaW5oZXJpdGVkIG9yIGVtYmVkZGVkLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIEF0dHJpYnV0ZSBvdmVycmlkZSBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10OCI+RGVmYXVsdDwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjNC10OCI+QXZhaWxhYmxlIGZvciBFbnRpdHkmbmJzcDtUeXBlPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMyLXQ4Ij5TcGVjaWZ5IGEgcHJvcGVydHkgb3IgZmllbGQgdG8gYmUgb3ZlcnJpZGRlbiAoZnJvbSB0aGUgZGVmYXVsdCBtYXBwaW5ncykuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMzLXQ4Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzQtdDgiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ4IHIxYzItdDgiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMy10OCI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWM0LXQ4Ij48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI0NBQ0NBR0dDIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNWUzNjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1MCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JISURBIiBuYW1lPSJDQUNCSElEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxODMiIG5hbWU9InN0aHJlZjE4MyI+PC9hPjxhIGlkPSJzdGhyZWYxODQiIG5hbWU9InN0aHJlZjE4NCI+PC9hPjxhIGlkPSJzdGhyZWYxODUiIG5hbWU9InN0aHJlZjE4NSI+PC9hPjxhIGlkPSJzdGhyZWYxODYiIG5hbWU9InN0aHJlZjE4NiI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlNlY29uZGFyeSBUYWJsZXM8L3NwYW4+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyB0byBhc3NvY2lhdGUgYWRkaXRpb25hbCB0YWJsZXMgd2l0aCBhbiBlbnRpdHkuIFVzZSB0aGlzIGFyZWEgaWYgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIGVudGl0eSBpcyBzcHJlYWQgYWNyb3NzIG11bHRpcGxlIHRhYmxlcy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDYwNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTAgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkhHSEUiIG5hbWU9IkNBQ0ZIR0hFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTg3IiBuYW1lPSJzdGhyZWYxODciPjwvYT48YSBpZD0ic3RocmVmMTg4IiBuYW1lPSJzdGhyZWYxODgiPjwvYT5UaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgYXZhaWxhYmxlIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SW5oZXJpdGFuY2U8L3NwYW4+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDkiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ5Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10OSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10OSIgaGVhZGVycz0icjFjMS10OSI+U3RyYXRlZ3k8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ5IHIxYzItdDkiPlNwZWNpZnkgdGhlIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIG1hcHBpbmcgYSBjbGFzcyBvciBjbGFzcyBoaWVyYXJjaHk6Ci08dWw+Ci08bGk+Ci08cD5TaW5nbGUgdGFibGUgJm5kYXNoOyBBbGwgY2xhc3NlcyBpbiB0aGUgaGllcmFyY2h5IGFyZSBtYXBwZWQgdG8gYSBzaW5nbGUgdGFibGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPkpvaW5lZCAmbmRhc2g7IFRoZSByb290IG9mIHRoZSBoaWVyYXJjaHkgaXMgbWFwcGVkIHRvIGEgc2luZ2xlIHRhYmxlOyBlYWNoIGNoaWxkIG1hcHMgdG8gaXRzIG93biB0YWJsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+VGFibGUgcGVyIGNsYXNzICZuZGFzaDsgRWFjaCBjbGFzcyBpcyBtYXBwZWQgdG8gYSBzZXBhcmF0ZSB0YWJsZS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDkgcjFjMy10OSI+U2luZ2xlIHRhYmxlPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDkiIGhlYWRlcnM9InIxYzEtdDkiPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OSByMWMyLXQ5Ij5Vc2UgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2hlbiB1c2luZyBhIDxzcGFuIGNsYXNzPSJib2xkIj5TaW5nbGU8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJib2xkIj5Kb2luZWQ8L3NwYW4+IGluaGVyaXRhbmNlIHN0cmF0ZWd5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDkgcjFjMy10OSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDkiIGhlYWRlcnM9InIxYzEtdDkiPkRpc2NyaW1pbmF0b3IgVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDkgcjFjMi10OSI+U2V0IHRoaXMgZmllbGQgdG8gc2V0IHRoZSBkaXNjcmltaW5hdG9yIHR5cGUgdG8gPGNvZGU+Q2hhcjwvY29kZT4gb3IgPGNvZGU+SW50ZWdlcjwvY29kZT4gKGluc3RlYWQgb2YgaXRzIGRlZmF1bHQ6IDxjb2RlPlN0cmluZzwvY29kZT4pLiBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L3NwYW4+IG11c3QgY29uZm9ybSB0byB0aGlzIHR5cGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10OSByMWMzLXQ5Ij5TdHJpbmc8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10OSIgaGVhZGVycz0icjFjMS10OSI+RGlzY3JpbWluYXRvciBWYWx1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDkgcjFjMi10OSI+U3BlY2lmeSB0aGUgZGlzY3JpbWluYXRvciB2YWx1ZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYW4gZW50aXR5IGluIHRoaXMgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBUaGUgdmFsdWUgbXVzdCBjb25mb3JtIHRvIHRoZSBzcGVjaWZpZWQgPHNwYW4gY2xhc3M9ImJvbGQiPkRpc2NyaW1pbmF0b3IgVHlwZTwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OSByMWMzLXQ5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10OSIgaGVhZGVycz0icjFjMS10OSI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10OSByMWMyLXQ5Ij5Vc2UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLiBTZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRvIHNlbGVjdCBuZXcgSm9pbiBDb2x1bW4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHdpdGggQFByaW1hcnlLZXlKb2luQ29sdW1uIGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10OSByMWMzLXQ5Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDk1ODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1MCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkluaGVyaXRhbmNlIGluZm9ybWF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjE4OSIgbmFtZT0ic3RocmVmMTg5Ij48L2E+Ci08aDE+UXVlcmllczwvaDE+Ci08cD5Vc2UgdGhlIHF1ZXJpZXMgYXJlYSBvZiB0aGUgSlBBIERldGFpbHMgdmlldyB0byBjcmVhdGUgbmFtZWQgcXVlcmllcyBhbmQgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuIFJlZmVyIHRvIDxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJJR0JHRyI+IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCSUdCR0ciPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTk5NzgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTAgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5Kb2luIFRhYmxlIEluZm9ybWF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSm9pbiBUYWJsZSBJbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JBRUJDIiBuYW1lPSJDQUNCQUVCQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvaDE+Ci08cD5Vc2UgYXJlYSB0byBzcGVjaWZ5IGEgbWFwcGVkIGNvbHVtbiBmb3Igam9pbmluZyBhbiBlbnRpdHkgYXNzb2NpYXRpb24uIEJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBhdmFpbGFibGUgb24gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Kb2luIFRhYmxlPC9zcGFuPiBhcmVhIGluIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj50aGUgSlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT4gYW5kIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+IG1hcHBpbmcgdHlwZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gVGFibGUgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gVGFibGUgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDExIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTEiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDExIHIxYzItdDExIj5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMSByMWMzLXQxMSI+QnkgZGVmYXVsdCwgdGhlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgcHJpbWFyeSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdGllcyBjb25jYXRlbmF0ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPjxhIGlkPSJDQUNCQkRGRyIgbmFtZT0iQ0FDQkJERkciPjwvYT5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMSByMWMyLXQxMSI+PGEgaWQ9InN0aHJlZjIwNyIgbmFtZT0ic3RocmVmMjA3Ij48L2E+PGEgaWQ9InN0aHJlZjIwOCIgbmFtZT0ic3RocmVmMjA4Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTEgcjFjMy10MTEiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPkludmVyc2UgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTEgcjFjMi10MTEiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMSByMWMzLXQxMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDMwLmh0bSNDQUNDR0VIQyI+RWRpdCBKb2luIENvbHVtbnMgRGlhbG9nPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlMzVmYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjUwIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkNFSkMiIG5hbWU9IkNBQ0ZDRUpDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Kb2luIENvbHVtbnMgSW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpvaW4gVGFibGU8L3NwYW4+IGFyZWEgaW4gPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+IGFuZCA8YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4gbWFwcGluZyB0eXBlcy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDEyIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTIiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEyIiBoZWFkZXJzPSJyMWMxLXQxMiI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMiByMWMyLXQxMiI+PGEgaWQ9InN0aHJlZjIwOSIgbmFtZT0ic3RocmVmMjA5Ij48L2E+PGEgaWQ9InN0aHJlZjIxMCIgbmFtZT0ic3RocmVmMjEwIj48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTIgcjFjMy10MTIiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAzMC5odG0jQ0FDQ0dFSEMiPkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZzwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MzhhNDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1MSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkdlbmVyYWwgaW5mb3JtYXRpb248L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQ0FDR0giIG5hbWU9IkNBQ0NBQ0dIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmFsIGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIEdlbmVyYWwgaW5mb3JtYXRpb24gZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciBlYWNoIGVudGl0eSB0eXBlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5QYWNrYWdlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTQgcjFjMi10MTQiPlRoZSBKYXZhIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gYW5kIHNlbGVjdCB0aGUgcGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzMtdDE0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5TY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMyLXQxNCI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O3NjaGVtYSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPkNhdGFsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNCByMWMyLXQxNCI+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXRhbG9nJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNCByMWMzLXQxNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+QWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTQgcjFjMi10MTQiPlNwZWNpZnkgdGhlIGRlZmF1bHQgYWNjZXNzIG1ldGhvZCBmb3IgdGhlIHZhcmlhYmxlcyBpbiB0aGUgcHJvamVjdDoKLTx1bD4KLTxsaT4KLTxwPlByb3BlcnR5PC9wPgotPC9saT4KLTxsaT4KLTxwPkZpZWxkPC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7YWNjZXNzJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNCByMWMzLXQxNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTgzMTcyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjUxIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+UGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbjwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNFQUdCRyIgbmFtZT0iQ0FDRUFHQkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgUGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuIFRoZXNlIGZpZWxkcyBhcmUgY29udGFpbmVkIGluIHRoZSA8Y29kZT4mbHQ7cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPlhNTCBNYXBwaW5nIERhdGEgQ29tcGxldGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMyLXQxNSI+U3BlY2lmaWVzIHRoYXQgdGhlIEphdmEgY2xhc3NlcyBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgYXJlIGZ1bGx5IHNwZWNpZmllZCBieSB0aGVpciBtZXRhZGF0YS4gQW55IGFubm90YXRpb25zIHdpbGwgYmUgaWdub3JlZC4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDt4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPlNjaGVtYTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE1IHIxYzItdDE1Ij5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRoYXQgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7c2NoZW1hJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNSByMWMzLXQxNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+Q2F0YWxvZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE1IHIxYzItdDE1Ij5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O2NhdGFsb2cmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5BY2Nlc3MgVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzItdDE1Ij5TcGVjaWZ5IGhvdyB0aGUgZW50aXR5IGl0cyBhY2Nlc3MgaW5zdGFuY2UgdmFyaWFibGVzLgotPHVsPgotPGxpPgotPHA+UHJvcGVydHkgJm5kYXNoOyBQZXJzaXN0ZW50IHN0YXRlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMuIFRoZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIG11c3QgYmUgPHNwYW4gY2xhc3M9ImJvbGQiPnB1YmxpYzwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPnByaXZhdGU8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5GaWVsZCAmbmRhc2g7IEluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQgZGlyZWN0bHkuIEFsbCBub24tdHJhbnNpZW50IGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgcGVyc2lzdGVudC48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzMtdDE1Ij5Qcm9wZXJ0eTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPkNhc2NhZGUgUGVyc2lzdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE1IHIxYzItdDE1Ij5BZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucyBpbiBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXNjYWRlLXBlcnNpc3QmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZGJjNDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1MSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJwZXJzaXN0ZW5jZS54bWwgRWRpdG9yIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0NISUQiIG5hbWU9IkNJQUNDSElEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9oMT4KLTxwPlRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0aGF0IGVuYWJsZXMgeW91IHRvIHVwZGF0ZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUuIEZvciBwcm9qZWN0cyB1c2luZyB0aGUgRWNsaXBzZUxpbmsgcGxhdGZvcm0sIHRoZSBwZXJpc2lzdGVuY2UueG1sIEVkaXRvciBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOS5odG0jQ0lBQ0lGR0oiPkdlbmVyYWw8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBSkFGRUciPkN1c3RvbWl6YXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMi5odG0jQ0lBQkVEQ0giPkNhY2hpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMy5odG0jQ0lBQkdISEkiPkxvZ2dpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBRkpDSEUiPk9wdGlvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNS5odG0jQ0lBQ0NGQ0IiPlNjaGVtYSBHZW5lcmF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjYuaHRtI0NJQUhKREZGIj5Qcm9wZXJ0aWVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI0NJQUhDSkFIIj5Tb3VyY2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0sIHRoZSBmb2xsb3dpbmcgc3Vic2V0IG9mIHRoZXNlIHBhZ2VzIGlzIGF2YWlsYWJsZTo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTkuaHRtI0NJQUNJRkdKIj5HZW5lcmFsPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjAuaHRtI0NJQUZGSklFIj5Db25uZWN0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjYuaHRtI0NJQUhKREZGIj5Qcm9wZXJ0aWVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI0NJQUhDSkFIIj5Tb3VyY2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY2MGM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjUxIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+R2VuZXJhbDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYWwiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFDSUZHSiIgbmFtZT0iQ0lBQ0lGR0oiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWw8L2gxPgotPHA+VGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgR2VuZXJhbCBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyMTgiIG5hbWU9InN0aHJlZjIxOCI+PC9hPjxhIGlkPSJzdGhyZWYyMTkiIG5hbWU9InN0aHJlZjIxOSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgR2VuZXJhbCBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBHZW5lcmFsIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwmcnNxdW87cyBHZW5lcmFsIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTYiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4KLTxwPk5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWMyLXQxNiI+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWMzLXQxNiI+Ci08cD5UaGUgcHJvamVjdCBuYW1lLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPgotPHA+UGVyc2lzdGVuY2UgUHJvdmlkZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNiByMWMyLXQxNiI+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTYgcjFjMy10MTYiPgotPHA+RGV0ZXJtaW5lZCBieSB0aGUgc2VydmVyLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPgotPHA+RGVzY3JpcHRpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNiByMWMyLXQxNiI+Ci08cD5FbnRlciBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuIFRoaXMgaXMgYW4gb3B0aW9uYWwgcHJvcGVydHkuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPgotPHA+TWFuYWdlZCBDbGFzc2VzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTYgcjFjMi10MTYiPgotPHA+QWRkIG9yIHJlbW92ZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPgotPHA+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTYgcjFjMi10MTYiPgotPHA+U2VsZWN0IHRvIGluY2x1ZGUgYWxsIGFubm90YXRlZCBlbnRpdHkgY2xhc3NlcyBpbiB0aGUgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNiByMWMzLXQxNiI+Ci08cD5GYWxzZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPgotPHA+WE1MIE1hcHBpbmcgRmlsZXM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNiByMWMyLXQxNiI+Ci08cD5BZGQgb3IgcmVtb3ZlIHRoZSBvYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIFhNTCBmaWxlcyB0aGF0IGRlZmluZSB0aGUgY2xhc3NlcyB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE2IHIxYzMtdDE2Ij4KLTxwPk1ldGEtSU5GXG9ybS54bWw8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljNDI1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1MSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkNvbm5lY3Rpb248L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDb25uZWN0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRkZKSUUiIG5hbWU9IkNJQUZGSklFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Db25uZWN0aW9uPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSBDb25uZWN0aW9uIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjIyMCIgbmFtZT0ic3RocmVmMjIwIj48L2E+PGEgaWQ9InN0aHJlZjIyMSIgbmFtZT0ic3RocmVmMjIxIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBDb25uZWN0aW9uIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIENvbm5lY3Rpb24gUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHBlcnNpc3RlbmNlLnhtbCBlZGl0b3ImcnNxdW87cyBjb25uZWN0aW9uIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE3Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTciPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij4KLTxwPlRyYW5zYWN0aW9uIFR5cGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNyByMWMyLXQxNyI+Ci08cD5TcGVjaWZ5IGlmIHRoZSBjb25uZWN0aW9uIGZvciB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgdXNlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB0cmFuc2FjdGlvbiB0eXBlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RGVmYXVsdDwvc3Bhbj4gLS0gU2VsZWN0IHRvIHVzZSB0aGUgY29udGFpbmVyIHVzZWQgYnkgdGhlIGNvbnRhaW5lci48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkpUQTwvc3Bhbj4gKEphdmEgVHJhbnNhY3Rpb24gQVBJKSAtLSBUcmFuc2FjdGlvbnMgb2YgdGhlIEphdmEgRUUgc2VydmVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+UmVzb3VyY2UgTG9jYWw8L3NwYW4+IC0tIE5hdGl2ZSBhY3Rpb25zIG9mIGEgSkRCQyBkcml2ZXIgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSBhIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNyByMWMzLXQxNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+Ci08cD5CYXRjaCBXcml0aW5nPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTcgcjFjMi10MTciPgotPHA+U3BlY2lmeSB0aGUgdXNlIG9mIGJhdGNoIHdyaXRpbmcgdG8gb3B0aW1pemUgdHJhbnNhY3Rpb25zIHdpdGggbXVsdGlwbGUgd3JpdGUgb3BlcmF0aW9ucy48L3A+Ci08cD5TZXQgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaW50byB0aGUgc2Vzc2lvbiBhdCBkZXBsb3ltZW50IHRpbWUuPC9wPgotPHA+Tm90ZTogVGhpcyBwcm9wZXJ0eSBhcHBsaWVzIHdoZW4gdXNlZCBib3RoIGluIGEgSmF2YSBTRSBhbmQgSmF2YSBFRSBlbnZpcm9ubWVudC48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzIGZvciBvcmFjbGUudG9wbGluay5jb25maWcuQmF0Y2hXcml0aW5nOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5KREJDPC9zcGFuPiZuZGFzaDtVc2UgSkRCQyBiYXRjaCB3cml0aW5nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+QnVmZmVyZWQ8L3NwYW4+Jm5kYXNoO0RvIG5vdCB1c2UgZWl0aGVyIEpEQkMgYmF0Y2ggd3JpdGluZyBub3IgbmF0aXZlIHBsYXRmb3JtIGJhdGNoIHdyaXRpbmcuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5PcmFjbGVKREJDPC9zcGFuPiZuZGFzaDtVc2UgYm90aCBKREJDIGJhdGNoIHdyaXRpbmcgYW5kIE9yYWNsZSBuYXRpdmUgcGxhdGZvcm0gYmF0Y2ggd3JpdGluZy48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vbmU8L3NwYW4+Jm5kYXNoO0RvIG5vdCB1c2UgYmF0Y2ggd3JpdGluZyAodHVybiBpdCBvZmYpLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTcgcjFjMy10MTciPgotPHA+Tm9uZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPgotPHA+SlRBIERhdGEgU291cmNlIE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNyByMWMyLXQxNyI+Ci08cD5JZiB5b3Ugc2VsZWN0ZWQgPHNwYW4gY2xhc3M9ImJvbGQiPkpUQTwvc3Bhbj4gYXMgdGhlIHRyYW5zYWN0aW9uIHR5cGUsIHRoZW4gZW50ZXIgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgSlRBIGRhdGEgc291cmNlIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNyByMWMzLXQxNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+Ci08cD5Ob24tSlRBIERhdGEgU291cmNlIE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNyByMWMyLXQxNyI+Ci08cD5JZiB5b3Ugc2VsZWN0ZWQgPHNwYW4gY2xhc3M9ImJvbGQiPlJlc291cmNlIExvY2FsPC9zcGFuPiBhcyB0aGUgdHJhbnNhY3Rpb24gdHlwZSwgdGhlbiBlbnRlciB0aGUgbmFtZSBvZiB0aGUgbm9uLUpUQSBkYXRhIHNvdXJjZS48L3A+Ci08cD5UaGlzIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE3IHIxYzMtdDE3Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij4KLTxwPiZuYnNwOyZuYnNwO0JpbmQgUGFyYW1ldGVyczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE3IHIxYzItdDE3Ij4KLTxwPkNvbnRyb2wgd2hldGhlciBvciBub3QgdGhlIHF1ZXJ5IHVzZXMgcGFyYW1ldGVyIGJpbmRpbmcuPC9wPgotPHA+Tm90ZTogVGhpcyBwcm9wZXJ0eSBhcHBsaWVzIHdoZW4gdXNlZCBpbiBhIEphdmEgU0UgZW52aXJvbm1lbnQuPC9wPgotPHA+VGhpcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNyByMWMzLXQxNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+Ci08cD5FY2xpcHNlTGluayBDb25uZWN0aW9uIFBvb2w8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNyByMWMyLXQxNyI+Ci08cD5EZWZpbmUgdGhlIGNvbm5lY3Rpb24gcG9vbCBkcml2ZXIsIFVSTCwgdXNlciBuYW1lIGFuZCBwYXNzd29yZC48L3A+Ci08cD5UaGVzZSBwcm9wZXJ0aWVzIGFyZSBub3RlIGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTcgcjFjMy10MTciPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPgotPHA+Jm5ic3A7Jm5ic3A7UmVhZCBDb25uZWN0aW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTcgcjFjMi10MTciPgotPHA+VGhlIG1heGltdW0gYW5kIG1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgaW4gdGhlIEpEQkMgcmVhZCBjb25uZWN0aW9uIHBvb2wuPC9wPgotPHA+Tm90ZTogVGhlc3NlIHByb3BlcnR5IGFwcGx5IHdoZW4gdXNlZCBpbiBhIEphdmEgU0UgZW52aXJvbm1lbnQuPC9wPgotPHA+VGhlc2UgcHJvcGVydGllcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm08L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxNyByMWMzLXQxNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+Ci08cD4mbmJzcDsmbmJzcDtXcml0ZSBDb25uZWN0aW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTcgcjFjMi10MTciPgotPHA+VGhlIG1heGltdW0gYW5kIG1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgaW4gdGhlIEpEQkMgcmVhZCBjb25uZWN0aW9uIHBvb2wuPC9wPgotPHA+Tm90ZTogVGhlc3NlIHByb3BlcnR5IGFwcGx5IHdoZW4gdXNlZCBpbiBhIEphdmEgU0UgZW52aXJvbm1lbnQuPC9wPgotPHA+VGhlc2UgcHJvcGVydGllcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm08L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxNyByMWMzLXQxNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWIxNWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTEgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5DdXN0b21pemF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3VzdG9taXphdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUpBRkVHIiBuYW1lPSJDSUFKQUZFRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3VzdG9taXphdGlvbjwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgQ3VzdG9taXphdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyMjIiIG5hbWU9InN0aHJlZjIyMiI+PC9hPjxhIGlkPSJzdGhyZWYyMjMiIG5hbWU9InN0aHJlZjIyMyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgQ3VzdG9taXphdGlvbiBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBDdXN0b21pemF0aW9uIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3ImcnNxdW87cyBDdXN0b21pemF0aW9uIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE4Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTgiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxOCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij4KLTxwPldlYXZpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOCByMWMyLXQxOCI+Ci08cD5TcGVjaWZpZXMgaWYgd2VhdmluZyBvZiB0aGUgZW50aXR5IGNsYXNzZXMgaXMgcGVyZm9ybWVkLiBUaGUgRWNsaXBzZUxpbmsgSlBBIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHVzZXMgd2VhdmluZyB0byBlbmhhbmNlIEpQQSBlbnRpdGllcyBmb3Igc3VjaCBwcm9wZXJ0aWVzIGFzIGxhenkgbG9hZGluZywgY2hhbmdlIHRyYWNraW5nLCBmZXRjaCBncm91cHMsIGFuZCBpbnRlcm5hbCBvcHRpbWl6YXRpb25zLiBTZWxlY3QgZnJvbSB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vIFdlYXZpbmc8L3NwYW4+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XZWF2ZSBEeW5hbWljYWxseTwvc3Bhbj48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPldlYXZlIFN0YXRpY2FsbHk8L3NwYW4+IC0tIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgcGxhbiB0byBleGVjdXRlIHlvdXIgYXBwbGljYXRpb24gb3V0c2lkZSBvZiBhIEphdmEgRUUgNSBjb250YWluZXIgaW4gYW4gZW52aXJvbm1lbnQgdGhhdCBkb2VzIG5vdCBwZXJtaXQgdGhlIHVzZSBvZiA8Y29kZT4tamF2YWFnZW50OmVjbGlwc2VsaW5rLmphcjwvY29kZT4gb24gdGhlIEpWTSBjb21tYW5kIGxpbmUuIFRoaXMgYXNzdW1lcyB0aGF0IGNsYXNzZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3RhdGljYWxseSB3b3Zlbi4gUnVuIHRoZSBzdGF0aWMgd2VhdmVyIG9uIHRoZSBjbGFzc2VzIGJlZm9yZSBkZXBsb3lpbmcgdGhlbS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE4IHIxYzMtdDE4Ij4KLTxwPldlYXZlIER5bmFtaWNhbGx5PC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+Ci08cD4mbmJzcDsmbmJzcDtXZWF2aW5nIExhenk8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOCByMWMyLXQxOCI+Ci08cD5TZWxlY3QgdGhpcyBvcHRvaW4gdG8gZW5hYmxlIGxhenkgd2VhdmluZy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOCByMWMzLXQxOCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+Ci08cD4mbmJzcDsmbmJzcDtXZWF2aW5nIEZldGNoIEdyb3VwczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE4IHIxYzItdDE4Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgZmV0Y2ggZ3JvdXBzIHRocm91Z2ggd2VhdmluZy4gU2V0IHRoaXMgb3B0aW9uIHRvIGZhbHNlIGlmOjwvcD4KLTx1bD4KLTxsaT4KLTxwPlRoZXJlIGlzIG5vIHdlYXZpbmcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNsYXNzZXMgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGR1cmluZyB3ZWF2aW5nIChmb3IgZXhhbXBsZSwgd2hlbiBkZWJ1Z2dpbmcpLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+U2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgZm9yIHBsYXRmb3JtcyB3aGVyZSBpdCBpcyBub3Qgc3VwcG9ydGVkLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE4IHIxYzMtdDE4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij4KLTxwPiZuYnNwOyZuYnNwO1dlYXZpbmcgQ2hhbmdlIFRyYWNraW5nPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTggcjFjMi10MTgiPgotPHA+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIHVzZSB3ZWF2aW5nIHRvIGRldGVjdCB3aGljaCBmaWVsZHMgb3IgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IGNoYW5nZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxOCByMWMzLXQxOCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+Ci08cD4mbmJzcDsmbmJzcDtUaHJvdyBFeGNlcHRpb25zPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTggcjFjMi10MTgiPgotPHA+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIHNldCBFY2xpcHNlTGluayB0byB0aHJvdyBhbiBleGNlcHRpb24gb3IgbG9nIGEgd2FybmluZyB3aGVuIGl0IGVuY291bnRlcnMgYSBwcm9ibGVtIHdpdGggYW55IG9mIHRoZSBmaWxlcyBsaXN0ZWQgaW4gYSA8c3BhbiBjbGFzcz0iYm9sZCI+cGVyc2lzdGVuY2UueG1sPC9zcGFuPiBmaWxlIDxjb2RlPiZsdDttYXBwaW5nLWZpbGUmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE4IHIxYzMtdDE4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij4KLTxwPlNlc3Npb24gQ3VzdG9taXplcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE4IHIxYzItdDE4Ij4KLTxwPlNlbGVjdCBhIHNlc3Npb24gY3VzdG9taXplciBjbGFzczogYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+ZWNsaXBzZWxpbmsudG9vbHMuc2Vzc2lvbmNvbmZpZ3VyYXRpb24uU2Vzc2lvbkN1c3RvbWl6ZXI8L2NvZGU+IGludGVyZmFjZSBhbmQgcHJvdmlkZXMgYSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4gVXNlIHRoaXMgY2xhc3MnIDxjb2RlPmN1c3RvbWl6ZTwvY29kZT4gbWV0aG9kLCB3aGljaCB0YWtlcyBhbiA8Y29kZT5lY2xpcHNlbGluay5zZXNzaW9ucy5TZXNzaW9uPC9jb2RlPiwgdG8gcHJvZ3JhbW1hdGljYWxseSBhY2Nlc3MgYWR2YW5jZWQgRWNsaXBzZUxpbmsgc2Vzc2lvbiBBUEkuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTggcjFjMy10MTgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxOCIgaGVhZGVycz0icjFjMS10MTgiPgotPHA+RGVzY3JpcHRvciBDdXN0b21pemVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTggcjFjMi10MTgiPgotPHA+U2VsZWN0IGFuIEVjbGlwc2VMaW5rIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyZuZGFzaDthIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT5lY2xpcHNlbGluay50b29scy5zZXNzaW9uY29uZmlndXJhdGlvbi5EZXNjcmlwdG9yQ3VzdG9taXplcjwvY29kZT4gaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBhIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLiBVc2UgdGhpcyBjbGFzcydzIDxjb2RlPmN1c3RvbWl6ZTwvY29kZT4gbWV0aG9kLCB3aGljaCB0YWtlcyBhbiA8Y29kZT5lY2xpcHNlbGluay5kZXNjcmlwdG9ycy5DbGFzc0Rlc2NyaXB0b3I8L2NvZGU+LCB0byBwcm9ncmFtbWF0aWNhbGx5IGFjY2VzcyBhZHZhbmNlZCBFY2xpcHNlTGluayBkZXNjcmlwdG9yIGFuZCBtYXBwaW5nIEFQSSBmb3IgdGhlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBKUEEgZW50aXR5IG5hbWVkIDxjb2RlPiZsdDtFTlRJVFkmZ3Q7PC9jb2RlPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxOCByMWMzLXQxOCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT4KLTxwPlRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhpcyBwYWdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4gcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MWQ5MTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTEgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5DYWNoaW5nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ2FjaGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUJFRENIIiBuYW1lPSJDSUFCRURDSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q2FjaGluZzwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBDYWNoaW5nIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjIyNCIgbmFtZT0ic3RocmVmMjI0Ij48L2E+PGEgaWQ9InN0aHJlZjIyNSIgbmFtZT0ic3RocmVmMjI1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBDYWNoaW5nIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIENhY2hpbmcgUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sJnJzcXVvO3MgQ2FjaGluZyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIwIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjAiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+Ci08cD5EZWZhdWx0IENhY2hlIFR5cGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMCByMWMyLXQyMCI+Ci08cD5TZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgYXMgdGhlIERlZmF1bHQgQ2FjaGUgVHlwZTo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U29mdCB3aXRoIFdlYWsgU3ViY2FjaGU8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGlzIHNpbWlsYXIgdG8gPHNwYW4gY2xhc3M9ImJvbGQiPldlYWsgd2l0aCBIYXJkIFN1YmNhY2hlPC9zcGFuPiBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBzdWJjYWNoZSB0aGF0IHVzZXMgc29mdCByZWZlcmVuY2VzLiBUaGUgc2l6ZSBvZiB0aGUgc3ViY2FjaGUgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAuIFRoZSBzdWJjYWNoZSB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZSBnYXJiYWdlLWNvbGxlY3RlZCBvbmx5IGlmIHRoZSBzeXN0ZW0gaXMgbG93IG9uIG1lbW9yeS48L3A+Ci08cD5Vc2UgdGhpcyBpZGVudGl0eSBtYXAgaW4gbW9zdCBjaXJjdW1zdGFuY2VzIGFzIGEgbWVhbnMgdG8gY29udHJvbCBtZW1vcnkgdXNlZCBieSB0aGUgY2FjaGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XZWVrIHdpdGggSGFyZCBTdWJjYWNoZTwvc3Bhbj4mbmRhc2g7VGhpcyBvcHRpb24gaXMgc2ltaWxhciB0byA8c3BhbiBjbGFzcz0iYm9sZCI+U29mdCB3aXRoIFdlYWs8L3NwYW4+IHN1YmNhY2hlIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhIG1vc3QgZnJlcXVlbnRseSB1c2VkIHN1YmNhY2hlIHRoYXQgdXNlcyBoYXJkIHJlZmVyZW5jZXMuIFVzZSB0aGlzIGlkZW50aXR5IG1hcCBpZiBzb2Z0IHJlZmVyZW5jZXMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgeW91ciBwbGF0Zm9ybS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPldlYWs8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGlzIHNpbWlsYXIgdG8gPHNwYW4gY2xhc3M9ImJvbGQiPkZ1bGw8L3NwYW4+LCBleGNlcHQgdGhhdCBvYmplY3RzIGFyZSByZWZlcmVuY2VkIHVzaW5nIHdlYWsgcmVmZXJlbmNlcy4gVGhpcyBvcHRpb24gdXNlcyBsZXNzIG1lbW9yeSB0aGFuIDxzcGFuIGNsYXNzPSJib2xkIj5GdWxsPC9zcGFuPiwgYWxsb3dzIGNvbXBsZXRlIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LjwvcD4KLTxwPlVzZSB0aGlzIGlkZW50aXR5IG1hcCBmb3IgdHJhbnNhY3Rpb25zIHRoYXQsIG9uY2Ugc3RhcnRlZCwgc3RheSBvbiB0aGUgc2VydmVyIHNpZGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Tb2Z0PC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBpcyBzaW1pbGFyIHRvIDxzcGFuIGNsYXNzPSJib2xkIj5XZWFrPC9zcGFuPiBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZSBvYmplY3RzIHVzaW5nIHNvZnQgcmVmZXJlbmNlcy4gVGhpcyBpZGVudGl0eSBtYXAgZW5hYmxlcyBmdWxsIGdhcmJhZ2UgY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cuIEl0IHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZ1bGw8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eTogYWxsIG9iamVjdHMgYXJlIGNhY2hlZCBhbmQgbm90IHJlbW92ZWQuPC9wPgotPHA+Tm90ZTogVGhpcyBwcm9jZXNzIG1heSBiZSBtZW1vcnktaW50ZW5zaXZlIHdoZW4gbWFueSBvYmplY3RzIGFyZSByZWFkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm9uZTwvc3Bhbj4mbmRhc2g7VGhpcyBvcHRpb24gZG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSBvYmplY3RzLlRoaXMgb3B0aW9uIGlzIG5vdCByZWNvbW1lbmRlZC48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzMtdDIwIj4KLTxwPldlYWsgd2l0aCBoYXJkIHN1YmNhY2hlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+Ci08cD5EZWZhdWx0IENhY2hlIFNpemU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMCByMWMyLXQyMCI+Ci08cD5TZXQgdGhlIHNpemUgb2YgdGhlIGNhY2hlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIwIHIxYzMtdDIwIj4KLTxwPjEwMDA8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj4KLTxwPkRlZmF1bHQgU2hhcmVkIENhY2hlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjAgcjFjMi10MjAiPgotPHA+U3BlY2ZpZXMgaWYgY2FjaGVkIGluc3RhbmNlcyBzaG91bGQgYmUgaW4gdGhlIHNoYXJlZCBjYWNoZSBvciBpbiBhIGNsaWVudCBpc29sYXRlZCBjYWNoZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+Ci08cD5FbnRpdHkgQ2FjaGluZzwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIwIHIxYzItdDIwIj4KLTxwPlNwZWNpZnkgdGhlIGVudGl0eS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+Ci08cD4mbmJzcDsmbmJzcDtDYWNoZSBUeXBlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjAgcjFjMi10MjAiPgotPHA+U2VsZWN0IGEgY2FjaGUgdHlwZS4gU2VlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPkRlZmF1bHQgQ2FjaGU8L3NwYW4+PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjAgcjFjMy10MjAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPgotPHA+Jm5ic3A7Jm5ic3A7Q2FjaGUgU2l6ZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIwIHIxYzItdDIwIj4KLTxwPlNldCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjAgcjFjMy10MjAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPgotPHA+Jm5ic3A7Jm5ic3A7U2hhcmVkIENhY2hlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjAgcjFjMi10MjAiPgotPHA+U2VlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPkRlZmF1bHQgU2hhcmVkIENhY2hlPC9zcGFuPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhpcyBwYWdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4gcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5M2FkMWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTEgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5Mb2dnaW5nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTG9nZ2luZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUJHSEhJIiBuYW1lPSJDSUFCR0hISSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TG9nZ2luZzwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBMb2dnaW5nIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhpcyBwYWdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4gcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyMjYiIG5hbWU9InN0aHJlZjIyNiI+PC9hPjxhIGlkPSJzdGhyZWYyMjciIG5hbWU9InN0aHJlZjIyNyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBMb2dnaW5nIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIExvZ2dpbmcgcGFnZSBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvci4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPgotPHA+TG9nZ2luZyBMZXZlbDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIzIHIxYzItdDIzIj4KLTxwPlNwZWNpZmllcyB0aGUgYW1vdW50IGFuZCBkZXRhaWwgb2YgbG9nIG91dHB1dCBieSBzZWxlY3RpbmcgdGhlIGxvZyBsZXZlbCAoaW4gYXNjZW5kaW5nIG9yZGVyIG9mIGluZm9ybWF0aW9uKTo8L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzIGZvciB0aGUgPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw8L2NvZGU+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5PRkY8L3NwYW4+Jm5kYXNoO2Rpc2FibGVzIGxvZ2dpbmc8L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNFVkVSRTwvc3Bhbj4mbmRhc2g7bG9ncyBleGNlcHRpb25zIGluZGljYXRpbmcgVG9wTGluayBjYW5ub3QgY29udGludWUsIGFzIHdlbGwgYXMgYW55IGV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGR1cmluZyBsb2dpbi4gVGhpcyBpbmNsdWRlcyBhIHN0YWNrIHRyYWNlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+V0FSTklORzwvc3Bhbj4mbmRhc2g7bG9ncyBleGNlcHRpb25zIHRoYXQgZG8gbm90IGZvcmNlIFRvcExpbmsgdG8gc3RvcCwgaW5jbHVkaW5nIGFsbCBleGNlcHRpb25zIG5vdCBsb2dnZWQgd2l0aCBzZXZlcmUgbGV2ZWwuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBhIHN0YWNrIHRyYWNlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+SU5GTzwvc3Bhbj4mbmRhc2g7bG9ncyB0aGUgbG9naW4vbG9nb3V0IHBlciBzZXZlciBzZXNzaW9uLCBpbmNsdWRpbmcgdGhlIHVzZXIgbmFtZS4gQWZ0ZXIgYWNxdWlyaW5nIHRoZSBzZXNzaW9uLCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBpcyBsb2dnZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5DT05GSUc8L3NwYW4+Jm5kYXNoO2xvZ3Mgb25seSBsb2dpbiwgSkRCQyBjb25uZWN0aW9uLCBhbmQgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GSU5FPC9zcGFuPiZuZGFzaDtsb2dzIFNRTC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZJTkVSPC9zcGFuPiZuZGFzaDtzaW1pbGFyIHRvIHdhcm5pbmcuIEluY2x1ZGVzIHN0YWNrIHRyYWNlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RklORVNUPC9zcGFuPiZuZGFzaDtpbmNsdWRlcyBhZGRpdGlvbmFsIGxvdyBsZXZlbCBpbmZvcm1hdGlvbi48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcubGV2ZWwiIHZhbHVlPSJJTkZPIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMyByMWMzLXQyMyI+Ci08cD5JbmZvPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+Ci08cD4mbmJzcDsmbmJzcDtUaW1lU3RhbXA8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMyByMWMyLXQyMyI+Ci08cD5Db250cm9sIHdoZXRoZXIgdGhlIHRpbWVzdGFtcCBpcyBsb2dnZWQgaW4gZWFjaCBsb2cgZW50cnkuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGEgdGltZXN0YW1wLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+ZmFsc2U8L3NwYW4+Jm5kYXNoO2RvIG5vdCBsb2cgYSB0aW1lc3RhbXAuPC9wPgotPC9saT4KLTwvdWw+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLnRpbWVzdGFtcCIgdmFsdWU9ImZhbHNlIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMyByMWMzLXQyMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+Ci08cD4mbmJzcDsmbmJzcDtUaHJlYWQ8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMyByMWMyLXQyMyI+Ci08cD5Db250cm9sIHdoZXRoZXIgYSB0aHJlYWQgaWRlbnRpZmllciBpcyBsb2dnZWQgaW4gZWFjaCBsb2cgZW50cnkuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGEgdGhyZWFkIGlkZW50aWZpZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5mYWxzZTwvc3Bhbj4mbmRhc2g7ZG8gbm90IGxvZyBhIHRocmVhZCBpZGVudGlmaWVyLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjMgcjFjMy10MjMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPgotPHA+Jm5ic3A7Jm5ic3A7U2Vzc2lvbjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIzIHIxYzItdDIzIj4KLTxwPkNvbnRyb2wgd2hldGhlciBhbiBFY2xpcHNlTGluayBzZXNzaW9uIGlkZW50aWZpZXIgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPnRydWU8L3NwYW4+Jm5kYXNoO2xvZyBhIEVjbGlwc2VMaW5rIHNlc3Npb24gaWRlbnRpZmllci48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPmZhbHNlPC9zcGFuPiZuZGFzaDtkbyBub3QgbG9nIGEgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpZGVudGlmaWVyLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsubG9nZ2luZy5zZXNzaW9uIiB2YWx1ZT0iZmFsc2UiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIzIHIxYzMtdDIzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj4KLTxwPiZuYnNwOyZuYnNwO0V4Y2VwdGlvbnM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMyByMWMyLXQyMyI+Ci08cD5Db250cm9sIHdoZXRoZXIgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gd2l0aGluIHRoZSBUb3BMaW5rIGNvZGUgYXJlIGxvZ2dlZCBwcmlvciB0byByZXR1cm5pbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gRW5zdXJlcyB0aGF0IGFsbCBleGNlcHRpb25zIGFyZSBsb2dnZWQgYW5kIG5vdCBtYXNrZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGFsbCBleGNlcHRpb25zLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+ZmFsc2U8L3NwYW4+Jm5kYXNoO2RvIG5vdCBsb2cgZXhjZXB0aW9ucy48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcuZXhjZXB0aW9ucyIgdmFsdWU9InRydWUiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIzIHIxYzMtdDIzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj4KLTxwPkxvZ2dlcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIzIHIxYzItdDIzIj4KLTxwPlNlbGVjdCB0aGUgdHlwZSBvZiBsb2dnZXIgdG8gdXNlOjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkRlZmF1bHRMb2dnZXI8L3NwYW4+Jm5kYXNoO3RoZSBFY2xpcHNlTGluayBuYXRpdmUgbG9nZ2VyIDxjb2RlPmVjbGlwc2VsaW5rLmxvZ2dpbmcuRGVmYXVsdFNlc3Npb25Mb2c8L2NvZGU+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+SmF2YUxvZ2dlcjwvc3Bhbj4mbmRhc2g7dGhlIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nPC9jb2RlPiBsb2dnZXIgPGNvZGU+ZWNsaXBzZWxpbmsubG9nZ2luZy5KYXZhTG9nPC9jb2RlPi48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNlcnZlckxvZ2dlcjwvc3Bhbj4mbmRhc2g7dGhlIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nPC9jb2RlPiBsb2dnZXIgPGNvZGU+ZWNsaXBzZWxpbmsucGxhdGZvcm0uc2VydmVyLlNlcnZlckxvZzwvY29kZT4uIEludGVncmF0ZXMgd2l0aCB0aGUgYXBwbGljYXRpb24gc2VydmVyJ3MgbG9nZ2luZyBhcyBkZWZpbmUgaW4gdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnBsYXRmb3JtLnNlcnZlci5TZXJ2ZXJQbGF0Zm9ybS48L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY3VzdG9tIGxvZ2dlci4gVGhlIGN1c3RvbSBsb2dnZXIgbXVzdCBpbXBsZW1lbnQgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLmxvZ2dpbmcuU2Vzc2lvbkxvZzwvY29kZT4gaW50ZXJmYWNlLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsubG9nZ2luZy5sb2dnZXIiIHZhbHVlPSJhY21lLmxvZ2dlcnMuTXlDdXN0b21Mb2dnZXIiIC8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyMyByMWMzLXQyMyI+Ci08cD5EZWZhdWx0TG9nZ2VyPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NmUzOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTEgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5PcHRpb25zPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT3B0aW9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZKQ0hFIiBuYW1lPSJDSUFGSkNIRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+T3B0aW9uczwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBPcHRpb25zIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhpcyBwYWdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4gcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyMjgiIG5hbWU9InN0aHJlZjIyOCI+PC9hPjxhIGlkPSJzdGhyZWYyMjkiIG5hbWU9InN0aHJlZjIyOSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgT3B0aW9ucyBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBPcHRpb25zIFBhZ2UiIHN1bW1hcnk9IiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5TZXNzaW9uIE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNSByMWMyLXQyNSI+Ci08cD5TcGVjaWZ5IHRoZSBuYW1lIGJ5IHdoaWNoIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGlzIHN0b3JlZCBpbiB0aGUgc3RhdGljIHNlc3Npb24gbWFuYWdlci4gVXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgRWNsaXBzZUxpbmsgc2hhcmVkIHNlc3Npb24gb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiB0aGUgSlBBIG9yIHRvIHVzZSBhIHByZS1leGlzdGluZyBFY2xpcHNlTGluayBzZXNzaW9uIGNvbmZpZ3VyZWQgdGhyb3VnaCBhIEVjbGlwc2VMaW5rIDxjb2RlPnNlc3Npb25zLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwPlZhbGlkIHZhbHVlczogYSB2YWxpZCBFY2xpcHNlTGluayBzZXNzaW9uIG5hbWUgdGhhdCBpcyB1bmlxdWUgaW4gYSBzZXJ2ZXIgZGVwbG95bWVudC48L3A+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5zZXNzaW9uLW5hbWUiIHZhbHVlPSJNeVNlc3Npb24iLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPlNlc3Npb25zIFhNTDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI1IHIxYzItdDI1Ij4KLTxwPlNwZWNpZnkgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gbG9hZGVkIGZyb20gdGhlIEVjbGlwc2VMaW5rIHNlc3Npb24gY29uZmlndXJhdGlvbiBmaWxlICg8Y29kZT5zZXNzaW9ucy54bWw8L2NvZGU+KS48L3A+Ci08cD5Zb3UgY2FuIHVzZSB0aGlzIG9wdGlvbiBhcyBhbiBhbHRlcm5hdGl2ZSB0byBhbm5vdGF0aW9ucyBhbmQgZGVwbG95bWVudCBYTUwuIElmIHlvdSBzcGVjaWZ5IHRoaXMgcHJvcGVydHksIFRvcExpbmsgd2lsbCBvdmVycmlkZSBhbGwgY2xhc3MgYW5ub3RhdGlvbiBhbmQgdGhlIG9iamVjdCByZWxhdGlvbmFsIG1hcHBpbmcgZnJvbSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiwgYXMgd2VsbCBhcyA8Y29kZT5PUk0ueG1sPC9jb2RlPiBhbmQgb3RoZXIgbWFwcGluZyBmaWxlcywgaWYgcHJlc2VudC4gLjwvcD4KLTxwPkluZGljYXRlIHRoZSBzZXNzaW9uIGJ5IHNldHRpbmcgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnNlc3Npb24tbmFtZTwvY29kZT4gcHJvcGVydHkuPC9wPgotPHA+Tm90ZTogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSwgPGNvZGU+c2Vzc2lvbnMueG1sPC9jb2RlPiBmaWxlIHdpbGwgbm90IGJlIHVzZWQuPC9wPgotPHA+VmFsaWQgdmFsdWVzOiB0aGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgc2Vzc2lvbnMgWE1MIGZpbGUuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0idG9wbGluay5zZXNzaW9uLXhtbCIgdmFsdWU9Im15c2Vzc2lvbi54bWwiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPlRhcmdldCBEYXRhYmFzZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzItdDI1Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5FdmVudCBMaXN0ZW5lcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI1IHIxYzItdDI1Ij4KLTxwPlNwZWNpZnkgYSBkZXNjcmlwdG9yIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGFkZGVkIGR1cmluZyBib290c3RyYXBwaW5nLjwvcD4KLTxwPlZhbGlkIHZhbHVlczogcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT5lY2xpcHNlbGluay5zZXNzaW9ucy5TZXNzaW9uRXZlbnRMaXN0ZW5lcjwvY29kZT4gaW50ZXJmYWNlLjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLnNlc3Npb24tZXZlbnQtbGlzdGVuZXIiIHZhbHVlPSJteXBhY2thZ2UuTXlDbGFzcy5jbGFzcyIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+SW5jbHVkZSBEZXNjcmlwdG9yIFF1ZXJpZXM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNSByMWMyLXQyNSI+Ci08cD5FbmFibGUgb3IgZGlzYWJsZSB0aGUgZGVmYXVsdCBjb3B5aW5nIG9mIGFsbCBuYW1lZCBxdWVyaWVzIGZyb20gdGhlIGRlc2NyaXB0b3JzIHRvIHRoZSBzZXNzaW9uLiBUaGVzZSBxdWVyaWVzIGluY2x1ZGUgdGhlIG9uZXMgZGVmaW5lZCB1c2luZyBFY2xpcHNlTGluayBBUEksIGRlc2NyaXB0b3IgYW1lbmRtZW50IG1ldGhvZHMsIGFuZCBzbyBvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4M2UzMTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTEgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5TY2hlbWEgR2VuZXJhdGlvbjwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNjaGVtYSBHZW5lcmF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0NGQ0IiIG5hbWU9IkNJQUNDRkNCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TY2hlbWEgR2VuZXJhdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBTY2hlbWEgR2VuZXJhdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjMwIiBuYW1lPSJzdGhyZWYyMzAiPjwvYT48YSBpZD0ic3RocmVmMjMxIiBuYW1lPSJzdGhyZWYyMzEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPiZuYnNwOzwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yJnJzcXVvO3MgU2NoZW1hIEdlbmVyYXRpb24gcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI3Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNyIgaGVhZGVycz0icjFjMS10MjciPgotPHA+RERMIEdlbmVyYXRpb24gVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI3IHIxYzItdDI3Ij4KLTxwPlNlbGVjdCB0aGUgdHlwZSBvZiBEREwgZ2VuZXJhdGlvbjo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm9uZTwvc3Bhbj4gLS0gRG8gbm90IGdlbmVyYXRlIERETDsgbm8gc2NoZW1hIGlzIGdlbmVyYXRlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBUYWJsZXM8L3NwYW4+IC0tIENyZWF0ZSBEREwgZm9yIG5vbi1leGlzdGVudCB0YWJsZXM7IGxlYXZlIGV4aXN0aW5nIHRhYmxlcyB1bmNoYW5nZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ecm9wIGFuZCBDcmVhdGUgVGFibGVzPC9zcGFuPiAtLSBDcmVhdGUgRERMIGZvciBhbGwgdGFibGVzOyBkcm9wIGFsbCBleGlzdGluZyB0YWJsZXMuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNyByMWMzLXQyNyI+Ci08cD5Ob25lPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI3IiBoZWFkZXJzPSJyMWMxLXQyNyI+Ci08cD5PdXRwdXQgTW9kZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI3IHIxYzItdDI3Ij4KLTxwPlNlbGVjdCB0aGUgRERMIGdlbmVyYXRpb24gdGFyZ2V0OjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Cb3RoPC9zcGFuPiAtLSBHZW5lcmF0ZSBTUUwgZmlsZXMgYW5kIGV4ZWN1dGUgdGhlbSBvbiB0aGUgZGF0YWJhc2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EYXRhYmFzZTwvc3Bhbj4gLS0gRXhlY3V0ZSBTUUwgb24gdGhlIGRhdGFiYXNlIG9ubHkgKGRvIG5vdCBnZW5lcmF0ZSBTUUwgZmlsZXMpLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U1FMIFNjcmlwdDwvc3Bhbj4gLS0gR2VuZXJhdGUgU1FMIGZpbGVzIG9ubHkgKGRvIG5vdCBleGVjdXRlIHRoZW0gb24gdGhlIGRhdGFiYXNlKS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI3IHIxYzMtdDI3Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij4KLTxwPkRETCBHZW5lcmF0aW9uIExvY2F0aW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjcgcjFjMi10MjciPgotPHA+U3BlY2lmeSB3aGVyZSBFY2xpcHNlTGluayB3cml0ZXMgRERMIG91dHB1dC4gU3BlY2lmeSBhIGZpbGUgc3BlY2lmaWNhdGlvbiB0byBhIGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgaGF2ZSB3cml0ZSBhY2Nlc3MuIFRoZSBmaWxlIHNwZWNpZmljYXRpb24gbWF5IGJlIHJlbGF0aXZlIHRvIHlvdXIgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBvciBhYnNvbHV0ZS4gSWYgaXQgZG9lcyBub3QgZW5kIGluIGEgZmlsZSBzZXBhcmF0b3IsIHRoZW4gRWNsaXBzZUxpbmsgYXBwZW5kcyBvbmUgdGhhdCBpcyB2YWxpZCBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI3IHIxYzMtdDI3Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij4KLTxwPkNyZWF0ZSBEREwgRmlsZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjcgcjFjMi10MjciPgotPHA+U3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSBEREwgZmlsZSB0aGF0IEVjbGlwc2VMaW5rIGdlbmVyYXRlcyB0aGF0IGNvbnRhaW5zIFNRTCBzdGF0ZW1lbnRzIGZvciBjcmVhdGluZyB0YWJsZXMgZm9yIEpQQSBlbnRpdGllcy4gU3BlY2lmeSBhIGZpbGUgbmFtZSB2YWxpZCBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI3IHIxYzMtdDI3Ij4KLTxwPmNyZWF0ZURETC5qZGJjPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDI3IiBoZWFkZXJzPSJyMWMxLXQyNyI+Ci08cD5Ecm9wIERETCBGaWxlIE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNyByMWMyLXQyNyI+Ci08cD5TcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIERETCBmaWxlIHRoYXQgRWNsaXBzZUxpbmsgZ2VuZXJhdGVzIHRoYXQgY29udGFpbnMgU1FMIHN0YXRlbWVudHMgZm9yIGRyb3BwaW5nIHRhYmxlcyBmb3IgSlBBIGVudGl0aWVzLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI3IHIxYzMtdDI3Ij4KLTxwPmRyb3BEREwuamRiYzwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDBjNDE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTEgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5Qcm9wZXJ0aWVzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJvcGVydGllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUhKREZGIiBuYW1lPSJDSUFISkRGRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UHJvcGVydGllczwvaDE+Ci08cD5UaGlzIHBhZ2UgZW5hYmxlcyB5b3UgdG8gYWRkIG9yIHJlbW92ZSB0aGUgdmVuZG9yLXNwZWNpZmljIDxjb2RlPiZsdDtwcm9wZXJ0aWVzJmd0OzwvY29kZT4gZWxlbWVudHMgb2YgcGVyc2lzdGVuY2UueG1sLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2OWVjOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjUxIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+U291cmNlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU291cmNlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSENKQUgiIG5hbWU9IkNJQUhDSkFIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Tb3VyY2U8L2gxPgotPHA+VXNpbmcgdGhpcyBwYWdlLCB5b3UgY2FuIG1hbnVhbGx5IGVkaXQgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPiJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYmZjMzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1MiAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlByZWZlcmVuY2VzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJlZmVyZW5jZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNERUlFRSIgbmFtZT0iQ0FDREVJRUUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByZWZlcmVuY2VzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nIHByZWZlcmVuY2UgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSlBBIE9wdGlvbnM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ5NDk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTIgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5EaWFsb2dzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRGlhbG9ncyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dFSkRBIiBuYW1lPSJDQUNHRUpEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RGlhbG9nczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZyBwcmVmZXJlbmNlIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtI0NBQ0RBRkpEIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBkaWFsb2c8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMC5odG0jQ0FDQ0dFSEMiPkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZzwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMjNkZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1MiAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZzwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0NHRUhDIiBuYW1lPSJDQUNDR0VIQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RWRpdCBKb2luIENvbHVtbnMgRGlhbG9nPC9oMT4KLTxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpvaW4gQ29sdW1uczwvc3Bhbj4gZGlhbG9nIHRvIGNyZWF0ZSBvciBtb2RpZnkgdGhlIGpvaW4gdGFibGVzIGFuZCBjb2x1bW5zIGluIHJlbGF0aW9uc2hpcCBtYXBwaW5ncy48L3A+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpvaW4gQ29sdW1uczwvc3Bhbj4gZGlhbG9nLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzMCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDMwIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzAiIGhlYWRlcnM9InIxYzEtdDMwIj5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzAgcjFjMi10MzAiPk5hbWUgb2YgdGhlIGpvaW50IHRhYmxlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDMwIiBoZWFkZXJzPSJyMWMxLXQzMCI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMwIHIxYzItdDMwIj5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgcmVmZXJlbmNlIGZvciB0aGUgZW50aXR5IHJlbGF0aW9uc2hpcC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDE0Lmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT48YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZDFlM2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1MiAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkljb25zIGFuZCBidXR0b25zPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSWNvbnMgYW5kIGJ1dHRvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNESENJQSIgbmFtZT0iQ0FDREhDSUEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkljb25zIGFuZCBidXR0b25zPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9mIHRoZSBpY29ucyBhbmQgYnV0dG9ucyB1c2VkIGluIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbC48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzIuaHRtI0NBQ0dFQUNHIj5JY29uczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMzLmh0bSNDQUNESkNFSSI+QnV0dG9uczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMWNkODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTIgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5JY29uczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ikljb25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDR0VBQ0ciIG5hbWU9IkNBQ0dFQUNHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5JY29uczwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIGljb25zIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIERhbGkgT1IgTWFwcGluZyBUb29sLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBpY29ucyB1c2VkIGluIHRoZSBEYWxpIHBsdWctaW4uIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgaWNvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzMSI+SWNvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzEiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fbWFwcGVkZW50aXR5LnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzEgcjFjMi10MzEiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fZW1iZWRkYWJsZWVudGl0eW1hcHBpbmcucG5nIiBhbHQ9IkVtYmVkZGFibGUgZW50aXR5IGljb24iIHRpdGxlPSJFbWJlZGRhYmxlIGVudGl0eSBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMxIHIxYzItdDMxIj48YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCRkVJQ0UiPkVtYmVkZGFibGU8L2E+IGVudGl0eTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmciIGFsdD0iTWFwcGVkIHN1cGVyY2xhc3MgaWNvbiIgdGl0bGU9Ik1hcHBlZCBzdXBlcmNsYXNzIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzEgcjFjMi10MzEiPjxhIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSI+TWFwcGVkIHN1cGVyY2xhc3M8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9iYXNpY21hcHBpbmdzLnBuZyIgYWx0PSJCYXNpYyBtYXBwaW5nIGljb24iIHRpdGxlPSJCYXNpYyBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzEgcjFjMi10MzEiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2VtYmVkZGVkaWRtYXBwaW5nLnBuZyIgYWx0PSJFbWJlZGRlZCBtYXBwaW5nIGljb24iIHRpdGxlPSJFbWJlZGRlZCBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzEgcjFjMi10MzEiPjxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmciIGFsdD0iRW1iZWRkZWQgSUQgbWFwcGluZyBpY29uIiB0aXRsZT0iRW1iZWRkZWQgSUQgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMxIHIxYzItdDMxIj48YSBocmVmPSJ0YXNrczAxMi5odG0jQ0lIRElBRUUiPkVtYmVkZGVkIElEIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nIiBhbHQ9IklEIG1hcHBpbmcgaWNvbiIgdGl0bGU9IklEIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzMSByMWMyLXQzMSI+PGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fbWFueXRvbWFueW1hcHBpbmcucG5nIiBhbHQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIGljb24iIHRpdGxlPSJNYW55LXRvLW1hbnkgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDMxIHIxYzItdDMxIj48YSBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nIiBhbHQ9Ik1hbnktdG8tb25lIG1hcHBpbmcgaWNvbi4iIHRpdGxlPSJNYW55LXRvLW9uZSBtYXBwaW5nIGljb24uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQzMSByMWMyLXQzMSI+PGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTFjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nIiBhbHQ9Ik9uZS10by1tYW55IG1hcHBpbmcgaWNvbiIgdGl0bGU9Ik9uZS10by1tYW55IG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MzEgcjFjMi10MzEiPjxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nIiBhbHQ9Ik9uZS10by1vbmUgbWFwcGluZyBpY29uLiIgdGl0bGU9Ik9uZS10by1vbmUgbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10MzEgcjFjMi10MzEiPjxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTNjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX3RyYW5zaWVudG1hcHBpbmcucG5nIiBhbHQ9IlRyYW5zaWVudCBtYXBwaW5nIGljb24uIiB0aXRsZT0iVHJhbnNpZW50IG1hcHBpbmcgaWNvbi4iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDMxIHIxYzItdDMxIj48YSBocmVmPSJ0YXNrczAxOC5odG0jQkFCSEZIRUkiPlRyYW5zaWVudCBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTRjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX3ZlcnNpb25tYXBwaW5nLnBuZyIgYWx0PSJWZXJzaW9uIG1hcHBpbmcgaWNvbi4iIHRpdGxlPSJWZXJzaW9uIG1hcHBpbmcgaWNvbi4iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDMxIHIxYzItdDMxIj48YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCSElCSUkiPlZlcnNpb24gbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMS5odG0jQ0FDREhDSUEiPkljb25zIGFuZCBidXR0b25zPC9hPjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyZTQ4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjUzIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+QnV0dG9uczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkJ1dHRvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNESkNFSSIgbmFtZT0iQ0FDREpDRUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkJ1dHRvbnM8L2gxPgotPHA+VGhlIGZvbGxvd2luZyBidXR0b25zIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIERhbGkgT1IgTWFwcGluZyBUb29sLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBidXR0b25zIHVzZWQgaW4gdGhlIERhbGkgcGx1Zy1pbi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBidXR0b25zIHVzZWQgaW4gdGhlIERhbGkgcGx1Zy1pbi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzIiPkljb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDMyIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzIiIGhlYWRlcnM9InIxYzEtdDMyIj48aW1nIHNyYz0iaW1nL25ld19qcGFfcGVyc3BlY3RpdmVfYnV0dG9uLnBuZyIgYWx0PSJUaGUgSlBBIFBlcnNwZWN0aXZlIGljb24iIHRpdGxlPSJUaGUgSlBBIFBlcnNwZWN0aXZlIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzIgcjFjMi10MzIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMxLmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDM0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjY3N2UzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTMgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5EYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JCRElCIiBuYW1lPSJDQUNCQkRJQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjQ2IiBuYW1lPSJzdGhyZWYyNDYiPjwvYT48YSBpZD0ic3RocmVmMjQ3IiBuYW1lPSJzdGhyZWYyNDciPjwvYT48YSBpZD0ic3RocmVmMjQ4IiBuYW1lPSJzdGhyZWYyNDgiPjwvYT5BZGRpdGlvbmFsIERhbGkgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgb25saW5lIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL2luZGV4LnBocC9EYWxpX0RldmVsb3Blcl9Eb2N1bWVudGF0aW9uIj5odHRwOi8vd2lraS5lY2xpcHNlLm9yZy9pbmRleC5waHAvRGFsaV9EZXZlbG9wZXJfRG9jdW1lbnRhdGlvbjwvYT48L2NvZGU+PC9wPgotPHA+VGhpcyBkZXZlbG9wZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dDo8L3A+Ci08dWw+Ci08bGk+Ci08cD5EYWxpIGFyY2hpdGVjdHVyZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QbHVnaW5zIHRoYXQgY29tcHJpc2UgdGhlIERhbGkgSlBBIEVjbGlwc2UgZmVhdHVyZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FeHRlbnNpb24gcG9pbnRzPC9wPgotPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRfcGVyc2lzdGVuY2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmRlMWUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0NCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJISUNBSSIgbmFtZT0iQkFCSElDQUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjU0IiBuYW1lPSJzdGhyZWY1NCI+PC9hPjxhIGlkPSJzdGhyZWY1NSIgbmFtZT0ic3RocmVmNTUiPjwvYT48YSBpZD0ic3RocmVmNTYiIG5hbWU9InN0aHJlZjU2Ij48L2E+WW91IGNhbiBtYWtlIGEgSmF2YSBjbGFzcyBpbnRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBlcnNpc3RlbnQgdHlwZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyI+VGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPiA8IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTc2MGY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDUgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEdCSUVJIiBuYW1lPSJDSUhHQklFSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvaDE+Ci08cD5BZGQgYSBzZWNvbmRhcnkgdGFibGUgYW5ub3RhdGlvbiB0byBhbiBlbnRpdHkgaWYgaXRzIGRhdGEgaXMgc3BsaXQgYWNyb3NzIG1vcmUgbW9yZSB0aGFuIG9uZSB0YWJsZS48L3A+Ci08cD5UbyBhZGQgYSBzZWNvbmRhcnkgdGFibGUgdG8gdGhlIGVudGl0eSw8L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QYWNrYWdlIEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldywgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlNlY29uZGFyeSBUYWJsZXM8L3NwYW4+IGluZm9ybWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjc5IiBuYW1lPSJzdGhyZWY3OSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNwZWNpZnlpbmcgU2Vjb25kYXJ5IFRhYmxlczwvcD4KLTxpbWcgc3JjPSJpbWcvc2Vjb25kYXJ5X3RhYmxlcy5wbmciIGFsdD0iU2Vjb25kYXJ5IFRhYmxlcyBhcmVhIG9uIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgdGl0bGU9IlNlY29uZGFyeSBUYWJsZXMgYXJlYSBvbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBhc3NvY2lhdGUgYW4gYWRkaXRpb25hbCB0YWJsZSB3aXRoIHRoZSBlbnRpdHkuIFRoZSBFZGl0IFNlY29uZGFyeSBUYWJsZSBkaWFsb2cgYXBwZWFyczwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5OYW1lPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImJvbGQiPkNhdGFsb2c8L3NwYW4+LCBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPlNjaGVtYTwvc3Bhbj4gb2YgdGhlIGFkZGl0aW9uYWwgdGFibGUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGVudGl0eS48L3A+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRoZSBlbnRpdHk6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQFNlY29uZGFyeVRhYmxlKG5hbWU9Ik5BTUUiLCBjYXRhbG9nID0gIkNBVEFMT0ciLCBzY2hlbWEgPSAiU0NIRU1BIgotCi08L3ByZT4KLTxiciAvPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3YWQ0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQyIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEhFSkNKIiBuYW1lPSJDSUhIRUpDSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI1IiBuYW1lPSJzdGhyZWYyNSI+PC9hPjxhIGlkPSJzdGhyZWYyNiIgbmFtZT0ic3RocmVmMjYiPjwvYT5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gY3JlYXRlIGEgbmV3IEpQQSBwcm9qZWN0LjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUGFja2FnZSBFeHBsb3Jlciwgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5GaWxlICZndDsgTmV3ICZndDsgUHJvamVjdDwvc3Bhbj4uIFRoZSBTZWxlY3QgYSB3aXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgSlBBIHBlcnNwZWN0aXZlIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IEpQQSBQcm9qZWN0PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyNyIgbmFtZT0ic3RocmVmMjciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TZWxlY3RpbmcgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZDwvcD4KLTxpbWcgc3JjPSJpbWcvc2VsZWN0X2Ffd2l6YXJkX2pwYV9wcm9qZWN0LnBuZyIgYWx0PSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEpQQSBwcm9qZWN0IHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggSlBBIHByb2plY3Qgc2VsZWN0ZWQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgUHJvamVjdDwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjI4IiBuYW1lPSJzdGhyZWYyOCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBKUEEgUHJvamVjdCBQYWdlPC9wPgotPGltZyBzcmM9ImltZy9uZXdfanBhX3Byb2plY3RfdGFzay5wbmciIGFsdD0iVGhlIEpQQSBQcm9qZWN0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIHRpdGxlPSJUaGUgSlBBIFByb2plY3QgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIFByb2plY3Qgd2l6YXJkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSBmaWVsZHMgb24gdGhlIDxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT4gdG8gc3BlY2lmeSB0aGUgcHJvamVjdCBuYW1lIGFuZCBsb2NhdGlvbiwgdGFyZ2V0IHJ1bnRpbWUsIGFuZCBwcmUtZGVmaW5lZCBjb25maWd1cmF0aW9uLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhlIFRhcmdldCBSdW50aW1lIGlzIG5vdCByZXF1aXJlZCBmb3IgSmF2YSBTRSBkZXZlbG9wbWVudC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyOSIgbmFtZT0ic3RocmVmMjkiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgSlBBIEZhY2V0IFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL25ld19qcGFfZmFjZXRfdGFzay5wbmciIGFsdD0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiB0aXRsZT0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPiB0byBzcGVjaWZ5IHlvdXIgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtLCBkYXRhYmFzZSBjb25uZWN0aW9uLCBhbmQgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkuPC9wPgotPHA+SWYgRGFsaSBkZXJpdmVzIHRoZSBpbmNvcnJlY3Qgc2NoZW1hLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIHRoZSBEZWZhdWx0IFNjaGVtYSBmb3IgQ29ubmVjdGlvbjwvc3Bhbj4uIFVzaW5nIHRoaXMgb3B0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIGRldmVsb3BtZW50IHRpbWUgc2NoZW1hIGZvciBkZWZhdWx0cyBhbmQgdmFsaWRhdGlvbi48L3A+Ci08cD5JZiB5b3UgY2xlYXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DcmVhdGUgb3JtLnhtbDwvc3Bhbj4gb3B0aW9uICh3aGljaCBpcyBzZWxlY3RlZCBieSBkZWZhdWx0KSwgeW91IGNhbiBsYXRlciBhZGQgYSBtYXBwaW5nIGZpbGUgdG8gdGhlIHByb2plY3QgdXNpbmcgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwNS5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotSWYgdGhlIHNlcnZlciBydW50aW1lIGRvZXMgbm90IHByb3ZpZGUgYSBKUEEgaW1wbGVtZW50YXRpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgc2VsZWN0IGEgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkuCi08cD5UbyBpbnN1cmUgdGhlIHBvcnRhYmlsaXR5IG9mIHlvdXIgYXBwbGljYXRpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIEVKQiAzLjAsIHRoZSBwZXJzaXN0ZW50IGNsYXNzZXMgd2lsbCBiZSBkaXNjb3ZlcmVkIGF1dG9tYXRpY2FsbHkuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uIFlvdSBzaG91bGQgbm93IG9wZW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT48YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwNS5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTlhZWRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjUyIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgZGlhbG9nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgZGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDREFGSkQiIG5hbWU9IkNBQ0RBRkpEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBkaWFsb2c8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI0MSIgbmFtZT0ic3RocmVmMjQxIj48L2E+PGEgaWQ9InN0aHJlZjI0MiIgbmFtZT0ic3RocmVmMjQyIj48L2E+PGEgaWQ9InN0aHJlZjI0MyIgbmFtZT0ic3RocmVmMjQzIj48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+R2VuZXJhdGUgRW50aXRpZXM8L3NwYW4+IGRpYWxvZyB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzIGZyb20geW91ciBkYXRhYmFzZSB0YWJsZXMgYW5kIGNvbHVtbnMuPC9wPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5HZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2c8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRW50aXRpZXMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjkiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyOSI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI5IiBoZWFkZXJzPSJyMWMxLXQyOSI+U291cmNlIEZvbGRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI5IHIxYzItdDI5Ij5FbnRlciBhIHByb2plY3QgZm9sZGVyIG5hbWUgaW4gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcywgb3IgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gdG8gc2VsZWN0IGFuIGV4aXN0aW5nIGZvbGRlci48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjkiIGhlYWRlcnM9InIxYzEtdDI5Ij5QYWNrYWdlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjkgcjFjMi10MjkiPkVudGVyIGEgcGFja2FnZSBuYW1lIGluIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMsIG9yIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IHRvIHNlbGVjdCBhbiBleGlzdGluZyBwYWNrYWdlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyOSIgaGVhZGVycz0icjFjMS10MjkiPlN5bmNocm9uaXplIENsYXNzZXMgaW4gcGVyc2lzdGVuY2UueG1sPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjkgcjFjMi10MjkiPlNwZWNpZnkgaWYgRGFsaSBzaG91bGQgdXBkYXRlIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSB0byBpbmNsdWRlIHRoZSBnZW5lcmF0ZWQgY2xhc3Nlcy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjkiIGhlYWRlcnM9InIxYzEtdDI5Ij5UYWJsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyOSByMWMyLXQyOSI+U2VsZWN0IHRoZSB0YWJsZXMgZnJvbSB3aGljaCB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiBUaGUgdGFibGVzIHNob3duIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRoYXQgeW91IGRlZmluZWQgaW4gdGhlIDxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEpQQSBPcHRpb25zPC9hPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPHA+PGEgaHJlZj0idGFza3MwMjAuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjwvcD4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfaW5oZXJpdGFuY2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfaW5oZXJpdGFuY2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGUxMjRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2luaGVyaXRhbmNlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0NSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhDQ0NKRCIgbmFtZT0iQ0lIQ0NDSkQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY4MCIgbmFtZT0ic3RocmVmODAiPjwvYT48YSBpZD0ic3RocmVmODEiIG5hbWU9InN0aHJlZjgxIj48L2E+QW4gZW50aXR5IG1heSBpbmhlcml0IHByb3BlcnRpZXMgZnJvbSBvdGhlciBlbnRpdGllcy4gWW91IGNhbiBzcGVjaWZ5IGEgc3BlY2lmaWMgc3RyYXRlZ3kgdG8gdXNlIGZvciBpbmhlcml0YW5jZS48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gc3BlY2lmeSBpbmhlcml0YW5jZSAoPGNvZGU+QEluaGVyaXRhbmNlKTwvY29kZT4gZm9yIGFuIGV4aXN0aW5nIGVudGl0eSAoPGNvZGU+QEVudGl0eTwvY29kZT4pOjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGVudGl0eSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlBhY2thZ2UgRXhwbG9yZXI8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SW5oZXJpdGFuY2U8L3NwYW4+IGluZm9ybWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjgyIiBuYW1lPSJzdGhyZWY4MiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNwZWNpZnlpbmcgSW5oZXJpdGFuY2U8L3A+Ci08aW1nIHNyYz0iaW1nL2luaGVyaXRhbmNlX3RhYi5wbmciIGFsdD0iU2VsZWN0aW5nIHRoZSBJbmhlcml0YW5jZSBhcmVhIG9uIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgdGl0bGU9IlNlbGVjdGluZyB0aGUgSW5oZXJpdGFuY2UgYXJlYSBvbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlN0cmF0ZWd5PC9zcGFuPiBsaXN0LCBzZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhlIGluaGVyaXRhbmNlIHN0cmF0ZWdpZXM6PC9wPgotPHVsPgotPGxpPgotPHA+QSBzaW5nbGUgdGFibGUgKGRlZmF1bHQpPC9wPgotPC9saT4KLTxsaT4KLTxwPkpvaW5lZCB0YWJsZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PbmUgdGFibGUgcGVyIGNsYXNzPC9wPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSBmb2xsb3dpbmcgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgb24gdGhlIHRhYi4gU2VlIDxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkhHSEUiPiJJbmhlcml0YW5jZSBpbmZvcm1hdGlvbiI8L2E+IGZvciBhZGRpdGlvbmFsIGRldGFpbHMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgSW5oZXJpdGFuY2UgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgSW5oZXJpdGFuY2UgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE0Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTQiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+PGEgaWQ9InN0aHJlZjgzIiBuYW1lPSJzdGhyZWY4MyI+PC9hPjxhIGlkPSJzdGhyZWY4NCIgbmFtZT0ic3RocmVmODQiPjwvYT5EaXNjcmltaW5hdG9yIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzItdDE0Ij5OYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aGVuIHVzaW5nIGEgPHNwYW4gY2xhc3M9ImJvbGQiPlNpbmdsZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkpvaW5lZDwvc3Bhbj4gaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARGlzY3JpbWluYXRvckNvbHVtbjwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNCByMWMzLXQxNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+RGlzY3JpbWluYXRvciBUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjMi10MTQiPlNldCB0aGUgZGlzY3JpbWluYXRvciB0eXBlIHRvIDxjb2RlPkNoYXI8L2NvZGU+IG9yIDxjb2RlPkludGVnZXI8L2NvZGU+IChpbnN0ZWFkIG9mIGl0cyBkZWZhdWx0OiA8Y29kZT5TdHJpbmc8L2NvZGU+KS4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFZhbHVlPC9zcGFuPiBtdXN0IGNvbmZvcm0gdG8gdGhpcyB0eXBlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE0IHIxYzMtdDE0Ij5TdHJpbmc8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij48YSBpZD0ic3RocmVmODUiIG5hbWU9InN0aHJlZjg1Ij48L2E+PGEgaWQ9InN0aHJlZjg2IiBuYW1lPSJzdGhyZWY4NiI+PC9hPkRpc2NyaW1pbmF0b3IgVmFsdWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNCByMWMyLXQxNCI+U3BlY2lmeSB0aGUgZGlzY3JpbWluYXRvciB2YWx1ZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYW4gZW50aXR5IGluIHRoaXMgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBUaGUgdmFsdWUgbXVzdCBjb25mb3JtIHRvIHRoZSBzcGVjaWZpZWQgPHNwYW4gY2xhc3M9ImJvbGQiPkRpc2NyaW1pbmF0b3IgVHlwZTwvc3Bhbj4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARGlzY3JpbWluYXRvclZhbHVlPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE0IHIxYzMtdDE0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5PdmVycmlkZSBEZWZhdWx0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTQgcjFjMi10MTQiPlVzZSB0aGlzIGZpZWxkIHRvIHNwZWNpZnkgY3VzdG9tIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucy4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBQcmltYXJ5S2V5Sm9pbkNsdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE0IHIxYzMtdDE0Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdGhlIGVudGl0eSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1ASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTkhFUklUQU5DRV9TVFJBVEVHWSZndDs8L3NwYW4+KQotQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0RJU0NSSU1JTkFUT1JfQ09MVU1OJmd0Ozwvc3Bhbj4iLAotICAgIGRpc2NyaW1pbmF0b3JUeXBlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtESVNDUklNSU5BVE9SX1RZUEUmZ3Q7PC9zcGFuPikKLUBEaXNjcmltaW5hdG9yVmFsdWUodmFsdWUtIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtESVNDUklNSU5BVE9SX1ZBTFVFJmd0Ozwvc3Bhbj4iKQotQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCAKLSAgICByZWZlcmVuY2VkQ29sdW1uTmFtZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7UkVGRVJFTkNFRF9DT0xVTU5fTkFNRSZndDs8L3NwYW4+IikKLQotPC9wcmU+Ci08cD48YSBpZD0ic3RocmVmODciIG5hbWU9InN0aHJlZjg3Ij48L2E+PGEgaWQ9InN0aHJlZjg4IiBuYW1lPSJzdGhyZWY4OCI+PC9hPjxhIGlkPSJzdGhyZWY4OSIgbmFtZT0ic3RocmVmODkiPjwvYT5UaGUgZm9sbG93aW5nIGZpZ3VyZXMgaWxsdXN0cmF0ZXMgdGhlIGRpZmZlcmVudCBpbmhlcml0YW5jZSBzdHJhdGVnaWVzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjkwIiBuYW1lPSJzdGhyZWY5MCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNpbmdsZSBUYWJsZSBJbmhlcml0YW5jZTwvcD4KLTxpbWcgc3JjPSJpbWcvaW5oZXJpdGFuY2Vfc2luZ2xlLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBpbGx1c3RyYXRlcyBlbnRpdHkgaW5oZXJpdGFuY2UgaW4gYSBzaW5nbGUgdGFibGUuIiB0aXRsZT0iVGhpcyBmaWd1cmUgaWxsdXN0cmF0ZXMgZW50aXR5IGluaGVyaXRhbmNlIGluIGEgc2luZ2xlIHRhYmxlLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY5MSIgbmFtZT0ic3RocmVmOTEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmOTIiIG5hbWU9InN0aHJlZjkyIj48L2E+PGEgaWQ9InN0aHJlZjkzIiBuYW1lPSJzdGhyZWY5MyI+PC9hPkpvaW5lZCBUYWJsZSBJbmhlcml0YW5jZTwvcD4KLTxpbWcgc3JjPSJpbWcvaW5oZXJpdGFuY2Vfam9pbi5wbmciIGFsdD0iVGhpcyBmaWd1cmUgaWxsdXN0cmF0ZXMgYSBqb2luZWQgc3ViY2xhc3MgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuIiB0aXRsZT0iVGhpcyBmaWd1cmUgaWxsdXN0cmF0ZXMgYSBqb2luZWQgc3ViY2xhc3MgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxiciAvPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2Vfb3JtLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9vcm0uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njc4MGU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9vcm0uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDMgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSERHRENEIiBuYW1lPSJDSUhER0RDRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjQ2IiBuYW1lPSJzdGhyZWY0NiI+PC9hPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L2gxPgotPHA+V2hlbiBjcmVhdGluZyBhIEpQQSBwcm9qZWN0LCAoc2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4pIHlvdSBjYW4gYWxzbyBjcmVhdGUgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBtYXBwaW5nIG1ldGFkYXRhIGFuZCBkZWZhdWx0cy48L3A+Ci08cD48YSBpZD0ic3RocmVmNDciIG5hbWU9InN0aHJlZjQ3Ij48L2E+RWNsaXBzZSBjcmVhdGVzIHRoZSA8Y29kZT5NRVRBLUlORlxvcm0ueG1sPC9jb2RlPiBmaWxlIGluIHlvdXIgcHJvamVjdCdzIGRpcmVjdG9yeTo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0OwotJmx0O3BlcnNpc3RlbmNlIHZlcnNpb249IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9WRVJTSU9OJmd0Ozwvc3Bhbj4iCi0gICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiCi0gICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfMV8wLnhzZCImZ3Q7Ci0gICZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9VTklUX05BTUUmZ3Q7PC9zcGFuPiImZ3Q7Ci0gICAgJmx0O3Byb3ZpZGVyPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7UEVSU0lTVEVOQ0VfUFJPVklERVImZ3Q7PC9zcGFuPiIgLyZndDsKLSAgJmx0Oy9wZXJzaXN0ZW5jZS11bml0Jmd0OwotJmx0Oy9wZXJzaXN0ZW5jZSZndDsKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwNS5odG0jQ0lIQkNEQ0UiPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiPlRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlOTBhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQzIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIREFKSUQiIG5hbWU9IkNJSERBSklEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmMzUiIG5hbWU9InN0aHJlZjM1Ij48L2E+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYzNiIgbmFtZT0ic3RocmVmMzYiPjwvYT5XaGVuIHlvdSBjcmVhdGUgYSBwcm9qZWN0LCBFY2xpcHNlIGNyZWF0ZXMgdGhlIDxjb2RlPk1FVEEtSU5GXHBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgcHJvamVjdCdzIGRpcmVjdG9yeS48L3A+Ci08cD5Zb3UgY2FuIGNyZWF0ZSBhIHN0dWIgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSBNRVRBLUlORiBkaXJlY3Rvcnkgd2hlbiB5b3UgY3JlYXRlIGEgSlBBIHByb2plY3QgKHNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+KS4gWW91IGNhbiBtYW5hZ2UgdGhpcyBmaWxlIGVpdGhlciB0aHJvdWdoIHRoZSBYTUwgZWRpdG9yIChzZWUgPGEgaHJlZj0idGFza3MwMDIuaHRtI0NJSEVKQUlFIj4iVXNpbmcgdGhlIFhNTCBFZGl0b3IgdG8gZWRpdCB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPikgb3IgdGhyb3VnaCB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDE4Lmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1JbiBhZGRpdG9uIHRvIHRoZSBHZW5lcmFsLCBDb25uZWN0aW9uLCBQcm9wZXJ0aWVzIGFuZCBTb3VyY2UgcGFnZXMsIHRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yIHBhZ2VzIGZvciBwcm9qZWN0cyB0aGF0IHVzZSB0aGUgRWNsaXBzZUxpbmsgcGxhdGZvcm0gaW5jbHVkZSB0aGUgZm9sbG93aW5nOgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIxLmh0bSNDSUFKQUZFRyI+Q3VzdG9taXphdGlvbjwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSBjaGFuZ2UtdHJhY2tpbmcgYW5kIHNlc3Npb24gY3VzdG9taXplci1yZWxhdGVkIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMi5odG0jQ0lBQkVEQ0giPkNhY2hpbmc8L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgY2FjaGluZyBwcm9wZXJ0aWVzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjMuaHRtI0NJQUJHSEhJIj5Mb2dnaW5nPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIGxvZ2dpbmcgcHJvcGVydGllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI0Lmh0bSNDSUFGSkNIRSI+T3B0aW9uczwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSBzZXNzaW9uIGFuZCB0YXJnZXQgZGF0YWJhc2UgcHJvcGVydGllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI1Lmh0bSNDSUFDQ0ZDQiI+U2NoZW1hIEdlbmVyYXRpb248L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgRERMLXJlbGF0ZWQgcHJvcGVydGllcy48L3A+Ci08L2xpPgotPC91bD4KLTxwPkZvciBwcm9qZWN0cyB1c2luZyB0aGUgRWNsaXBzZUxpbmsgcGxhdGZvcm0sIHRoZSBDb25uZWN0aW9ucyBwYWdlIGFsc28gaW5jbHVkZXMgSkRCQyBjb25uZWN0aW9uIHBvb2wgcHJvcGVydGllcy48L3A+Ci08cD5JZiB0aGUgcHJvamVjdCB1c2VzIHRoZSBHZW5lcmljIHBsYXRmb3JtLCB0aGVuIG9ubHkgdGhlIEdlbmVyYWwsIENvbm5lY3Rpb24sIFByb3BlcnRpZXMgYW5kIFNvdXJjZSBwYWdlcyBhcmUgYXZhaWxhYmxlLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPHA+VG8gdXNlIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IEVkaXRvcjo8L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+T3BlbiB0aGUgPGNvZGU+cGVyaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuIFRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTkuaHRtI0NJQUNJRkdKIj5HZW5lcmFsPC9hPiBwYWdlIG9mIHRoZSBlZGl0b3IgYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSBHZW5lcmFsIHBhZ2UgdG8gZGVmaW5lIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGVzIDxjb2RlPiZsdDtwZXJzaXN0ZW50LXVuaXQmZ3Q7PC9jb2RlPi1yZWxhdGVkIGF0dHJpYnV0ZXMgYXMgd2VsbCBhcyB0aGUgPGNvZGU+Jmx0O3Byb3ZpZGVyJmd0OzwvY29kZT4sIGFuZCA8Y29kZT4mbHQ7Y2xhc3MmZ3Q7PC9jb2RlPiBlbGVtZW50cyAoZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGUpLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yJ3MgU291cmNlIHBhZ2UgZW5hYmxlcyB5b3UgdG8gdmlldyBhbmQgZWRpdCB0aGUgcmF3IFhNTCBmaWxlLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBlZGl0b3IuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10OCI+RWxlbWVudCBEZWZpbmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMyLXQ4Ij5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWUgPSAiJmx0O05hbWUmZ3Q7IiZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPlBlcnNpc3RlbmNlIFByb3ZpZGVyPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMyLXQ4Ij5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7cHJvdmlkZXImZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5EZXNjcmlwdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMi10OCI+RW50ZXIgYSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LiBUaGlzIGlzIGFuIG9wdGlvbmFsIHByb3BlcnR5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10OCIgaGVhZGVycz0icjFjMS10OCI+TWFuYWdlZCBDbGFzc2VzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMyLXQ4Ij5BZGQgb3IgcmVtb3ZlIHRoZSBjbGFzc2VzIG1hbmFnZWQgdGhyb3VnaCB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtjbGFzcyZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPiZuYnNwOyZuYnNwO0V4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDggcjFjMi10OCI+U2VsZWN0IHRvIGluY2x1ZGUgYWxsIGFubm90YXRlZCBlbnRpdHkgY2xhc3NlcyBpbiB0aGUgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMmZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5YTUwgTWFwcGluZyBGaWxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDggcjFjMi10OCI+QWRkIG9yIHJlbW92ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwgbWFwcGluZyBYTUwgZmlsZXMgZGVmaW5lIHRoZSBjbGFzc2VzIG1hbmFnZWQgdGhyb3VnaCB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDttYXBwaW5nLWZpbGUmZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMjAuaHRtI0NJQUZGSklFIj5Db25uZWN0aW9uPC9hPiBwYWdlIHRvIGRlZmluZSB0aGUgPGNvZGU+Jmx0O2p0YS1kYXRhLXNvdXJjZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7bm9uLWp0YS1kYXRhLXNvdXJjZSZndDs8L2NvZGU+IGVsZW1lbnRzIGFzIGZvbGxvd3M6PC9wPgotPHA+VG8gY29uZmlndXJlIHRoZSBKVEEgKEphdmEgVHJhbnNhY3Rpb24gQVBJKSBzb3VyY2UgdXNlZCBieSB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXI6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlRBPC9zcGFuPiBmcm9tIHRoZSBUcmFuc2FjdGlvbiBUeXBlIGxpc3QuPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBnbG9iYWwgSk5ESSBuYW1lIG9mIHRoZSBkYXRhIHNvdXJjZS48L3A+Ci08L2xpPgotPC9vbD4KLTxwPlRvIGNvbmZpZ3VyZSBhIG5vbi1KVEEgZGF0YSBzb3VyY2U6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+UmVzb3VyY2UgTG9jYWw8L3NwYW4+IGZyb20gdGhlIFRyYW5zYWN0aW9uIFR5cGUgbGlzdC48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIGdsb2JhbCBKTkRJIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0KCk8L3NwYW4+IHRvIHVzZSB0aGUgZGF0YSBzb3VyY2UgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lci48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgdGFibGUgaW4gdGhlIFByb3BlcnRpZXMgcGFnZSB0byBzZXQgdGhlIHZlbmRvci1zcGVjaWZpYyA8Y29kZT4mbHQ7cHJvcGVydGllcyZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgotPHA+VG8gYWRkIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnRzOjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIDxjb2RlPiZsdDtuYW1lJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt2YWx1ZSZndDs8L2NvZGU+IGF0dHJpYnV0ZXMgZm9yIHRoZSA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50IHVzaW5nIHRoZSB0YWJsZSdzIE5hbWUgYW5kIFZhbHVlIGZpZWxkcy48L3A+Ci08L2xpPgotPC9vbD4KLTxwPlRvIHJlbW92ZSBhIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQsIHNlbGVjdCBhIGRlZmluZWQgcHJvcGVydHkgaW4gdGhlIHRhYmxlIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5SZW1vdmU8L3NwYW4+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotSWYgdGhlIHByb2plY3QgdXNlcyB0aGUgRWNsaXBzZUxpbmsgcGxhdGZvcm0sIHRoZSBjb25uZWN0aW9uIHBhZ2UgYWxzbyBpbmNsdWRlcyBwYXJhbWV0ZXJzIGZvciBKREJDIGNvbm5lY3Rpb24gcG9vbGluZy48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwMi5odG0jQ0lIRUpBSUUiPlVzaW5nIHRoZSBYTUwgRWRpdG9yIHRvIGVkaXQgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYXBwaW5nLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hcHBpbmcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM3ODVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hcHBpbmcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDUgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5NYXBwaW5nIGFuIGVudGl0eTwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBpbmcgYW4gZW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCREdCSUoiIG5hbWU9IkJBQkRHQklKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPk1hcHBpbmcgYW4gZW50aXR5PC9oMT4KLTxwPkRhbGkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtYXBwaW5nIHR5cGVzIGZvciBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDEyLmh0bSNDSUhESUFFRSI+RW1iZWRkZWQgSUQgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJIRkhFSSI+VHJhbnNpZW50IG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJISUJJSSI+VmVyc2lvbiBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT4gPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZDRkZDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQyIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+VGFza3M8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgVGFza3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYyNCIgbmFtZT0ic3RocmVmMjQiPjwvYT48L3A+Ci08aDE+VGFza3M8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGRldGFpbGVkIHN0ZXAtYnktc3RlcCBwcm9jZWR1cmVzIGZvciBhY2Nlc3NpbmcgdGhlIERhbGkgT1IgbWFwcGluZyB0b29sIGZ1bmN0aW9uYWxpdHkuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDEuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCI+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyMC5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDIyLmh0bSNCQUJGQUlCQSI+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyNS5odG0jQkFCREJDQkkiPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzBiZjkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDIgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIEpQQSBFbnRpdHkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJGQkpCRyIgbmFtZT0iQkFCRkJKQkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWYzMCIgbmFtZT0ic3RocmVmMzAiPjwvYT5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2gxPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGNyZWF0ZSBhIEpQQSBlbnRpdHk6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPkZyb20gdGhlIE5hdmlnYXRvciBvciBQYWNrYWdlIEV4cGxvcmVyLCBzZWxlY3QgdGhlIEpQQSBwcm9qZWN0IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJib2xkIj5GaWxlICZndDsgTmV3ICZndDsgT3RoZXI8L3NwYW4+LiBUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjMxIiBuYW1lPSJzdGhyZWYzMSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNlbGVjdGluZyB0aGUgQ3JlYXRlIGEgSlBBIEVudGl0eSBXaXphcmQ8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF9hX3dpemFyZF9lbnRpdHkucG5nIiBhbHQ9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggRW50aXR5IHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggRW50aXR5IHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDMuaHRtI0NJQUZFSUdGIj5FbnRpdHkgQ2xhc3MgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzMiIgbmFtZT0ic3RocmVmMzIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgRW50aXR5IENsYXNzIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5wbmciIGFsdD0iVGhlIEVudGl0eSBDbGFzcyBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgRW50aXR5IHdpemFyZC4iIHRpdGxlPSJUaGUgRW50aXR5IENsYXNzIHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgd2l6YXJkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5Db21wbGV0ZSB0aGlzIHBhZ2UgYXMgZm9sbG93czo8L3A+Ci08dWw+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIEpQQSBwcm9qZWN0IGluIHRoZSBQcm9qZWN0IGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgU291cmNlIEZvbGRlciBmaWVsZCwgc2VsZWN0LCBvciBlbnRlciwgdGhlIGxvY2F0aW9uIG9mIHRoZSBKUEEgcHJvamVjdCdzIHNyYyBmb2xkZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCwgb3IgZW50ZXIsIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBwYWNrYWdlIGZvciB0aGlzIGVudGl0eSBpbiB0aGUgSmF2YSBQYWNrYWdlIGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyBpbiB0aGUgQ2xhc3MgbmFtZSBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBlbnRlciwgb3Igc2VsZWN0IGEgc3VwZXJjbGFzcy48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBjb21wbGV0ZSB0aGUgSW5oZXJpdGFuY2Ugc2VjdGlvbiBhcyBmb2xsb3dzICh0aGVzZSBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbCk6PC9wPgotPHVsPgotPGxpPgotPHA+QWNjZXB0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBvcHRpb24gKHRoZSBkZWZhdWx0KSB0byBjcmVhdGUgYSBKYXZhIGNsYXNzIHdpdGggdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IG9wdGlvbi48L3A+Ci08L2xpPgotPGxpPgotPHA+QWx0ZXJuYXRpdmVseSwgc2VsZWN0IDxhIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSI+TWFwcGVkIHN1cGVyY2xhc3M8L2E+IChpZiB5b3UgZGVmaW5lZCBhIHN1cGVyIGNsYXNzKS48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Jbmhlcml0YW5jZTwvc3Bhbj4gYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgSlNSIDIyMCBpbmhlcml0YW5jZSBtYXBwaW5nIHN0cmF0ZWdpZXMgKFNJTkdMRV9UQUJMRSwgVEFCTEVfUEVSX0NMQVNTLCBKT0lORUQpLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gZW50aXR5IG1hcHBpbmdzIGluIFhNTCB0byBjcmVhdGUgWE1MIG1hcHBpbmdzIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LCByYXRoZXIgdGhhbiBhbm5vdGF0aW9ucy48L3A+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPiB0byBwcm9jZWVkIHRvIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDQuaHRtI0NJQURFQ0lBIj5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC9hPiB3aGVyZSB5b3UgZGVmaW5lIHRoZSBwZXJzaXN0ZW50IGZpZWxkcyBmb3IgdGhlIGVudGl0eS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzMyIgbmFtZT0ic3RocmVmMzMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgRW50aXR5IFByb3BlcnRpZXMgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nIiBhbHQ9IlRoZSBFbnRpdHkgUHJvcGVydGllcyBwYWdlIG9mIHRoZSBDcmVhdGUgSlBBIEVudGl0eSB3aXphcmQuIiB0aXRsZT0iVGhlIEVudGl0eSBQcm9wZXJ0aWVzIHBhZ2Ugb2YgdGhlIENyZWF0ZSBKUEEgRW50aXR5IHdpemFyZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+QWx0ZXJuYXRpdmVseSwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4gdG8gY29tcGxldGUgdGhlIGVudGl0eS48L3A+Ci08L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIHBhZ2UgYXMgZm9sbG93czo8L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+SWYgbmVlZGVkLCBlbnRlciBhIG5ldyBuYW1lIGZvciB0aGUgZW50aXR5LiBEb2luZyBzbyByZXN1bHRzIGluIGFkZGluZyBhIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZSB0byB0aGUgPGNvZGU+QEVudGl0eTwvY29kZT4gbm90YXRpb24gKDxjb2RlPkBFbnRpdHkobmFtZT0iRW50aXR5TmFtZSIpPC9jb2RlPikuPC9wPgotPC9saT4KLTxsaT4KLTxwPkFjY2VwdCA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlIGRlZmF1bHQ8L3NwYW4+ICh0aGUgZGVmYXVsdCBzZXR0aW5nKSB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBuYW1lIG9mIHRoZSBtYXBwZWQgdGFibGUuIEVudGVyaW5nIGEgZGlmZmVyZW50IG5hbWUgcmVzdWx0cyBpbiBhZGRpbmcgdGhlIDxjb2RlPkBUYWJsZTwvY29kZT4gbm90YXRpb24gd2l0aCBpdHMgPGNvZGU+bmFtZTwvY29kZT4gYXR0cmlidXRlIGRlZmluZWQgYXMgdGhlIG5ldyB0YWJsZSAoPGNvZGU+QFRhYmxlKG5hbWU9IlRhYmxlTmFtZSIpPC9jb2RlPikuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgRW50aXR5IE5hbWUtcmVsYXRlZCBvcHRpb25zIGFyZSBub3QgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3RlZCA8YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPiBvbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAzLmh0bSNDSUFGRUlHRiI+RW50aXR5IENsYXNzIHBhZ2U8L2E+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+QWRkIHBlcnNpc3RlbmNlIGZpZWxkcyB0byB0aGUgZW50aXR5IGJ5IGNsaWNraW5nIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+LiBUaGUgRW50aXR5IEZpZWxkcyBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzNCIgbmFtZT0ic3RocmVmMzQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgRW50aXR5IEZpZWxkcyBEaWFsb2c8L3A+Ci08aW1nIHNyYz0iaW1nL2pwYV93aXphcmRfY3JlYXRlX2ZpZWxkcy5wbmciIGFsdD0iVGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nLiIgdGl0bGU9IlRoZSBFbnRpdHkgRmllbGRzIGRpYWxvZy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgYSBwZXJzaXN0ZW5jZSB0eXBlIGZyb20gdGhlIFR5cGUgbGlzdC4gWW91IGNhbiByZXRyaWV2ZSBhZGRpdGlvbmFsIHR5cGVzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiBmdW5jdGlvbi48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIGZpZWxkIG5hbWUgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi4gUmVwZWF0IHRoaXMgcHJvY2VkdXJlIGZvciBlYWNoIGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JZiBuZWVkZWQsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+S2V5PC9zcGFuPiB0byBkZXNpZ25hdGUgdGhlIGZpZWxkIGFzIGEgcHJpbWFyeSBrZXkuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCBlaXRoZXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5GaWVsZC1iYXNlZDwvc3Bhbj4gYWNjZXNzIHR5cGUgKHRoZSBkZWZhdWx0KSBvciA8c3BhbiBjbGFzcz0iYm9sZCI+UHJvcGVydHktYmFzZWQ8L3NwYW4+IGFjY2VzcyB0eXBlLjwvcD4KLTwvbGk+Ci08L29sPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0YzgyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDMgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5Vc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlVzaW5nIHRoZSBYTUwgRWRpdG9yIHRvIGVkaXQgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIRUpBSUUiIG5hbWU9IkNJSEVKQUlFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Vc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMzciIG5hbWU9InN0aHJlZjM3Ij48L2E+PGEgaWQ9InN0aHJlZjM4IiBuYW1lPSJzdGhyZWYzOCI+PC9hPllvdSBjYW4gd29yayB3aXRoIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGJ5IHVzaW5nIHRoZSBYTUwgRWRpdG9yLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byB3b3JrIHdpdGggdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlBhY2thZ2UgRXhwbG9yZXI8L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5PcGVuIFdpdGggJmd0OyBYTUwgRWRpdG9yPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzOSIgbmFtZT0ic3RocmVmMzkiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5PcGVuaW5nIHRoZSBYTUwgRWRpdG9yPC9wPgotPGltZyBzcmM9ImltZy9vcGVuX3BlcnNpc3RlbmNlX2VkaXRvci5wbmciIGFsdD0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIE9wZW4gJmd0OyBYTUwgRWRpdG9yIG9wdGlvbiBmb3IgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBPcGVuICZndDsgWE1MIEVkaXRvciBvcHRpb24gZm9yIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD48YSBpZD0ic3RocmVmNDAiIG5hbWU9InN0aHJlZjQwIj48L2E+PGEgaWQ9InN0aHJlZjQxIiBuYW1lPSJzdGhyZWY0MSI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlhNTCBFZGl0b3I8L3NwYW4+IHRvIGVkaXQgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0MiIgbmFtZT0ic3RocmVmNDIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5YTUwgRWRpdG9yPC9wPgotPGltZyBzcmM9ImltZy9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgWE1MIEVkaXRvci4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgWE1MIEVkaXRvci4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iI0NJSEVKQUlFIj5Vc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWE1MLmh0bWwiPldvcmtpbmcgd2l0aCBYTUwgRmlsZXM8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjgwZmY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0MyAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlN5bmNocm9uaXppbmcgY2xhc3NlczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlN5bmNocm9uaXppbmcgY2xhc3NlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEZFQkFJIiBuYW1lPSJDSUhGRUJBSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U3luY2hyb25pemluZyBjbGFzc2VzPC9oMT4KLTxwPkFzIHlvdSB3b3JrIHdpdGggdGhlIGNsYXNzZXMgaW4geW91ciBKYXZhIHByb2plY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgdG8gcmVmbGVjdCB0aGUgY2hhbmdlcy4gPGEgaWQ9InN0aHJlZjQzIiBuYW1lPSJzdGhyZWY0MyI+PC9hPjxhIGlkPSJzdGhyZWY0NCIgbmFtZT0ic3RocmVmNDQiPjwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gc3luY2hyb25pemUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlBhY2thZ2UgRXhwbG9yZXI8L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5KUEEgVG9vbHMgJmd0OyBTeW5jaHJvbml6ZSBDbGFzc2VzPC9zcGFuPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0iYm9sZCI+QW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbCBvcHRpb248L3NwYW4+IGluIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+LiBJbiBnZW5lcmFsLCB5b3UgZG8gbm90IGhhdmUgdG8gdXNlIHRoaXMgZnVuY3Rpb24gd2l0aGluIHRoZSBjb250YWluZXIuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0NSIgbmFtZT0ic3RocmVmNDUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TeW5jaHJvbml6aW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgRmlsZTwvcD4KLTxpbWcgc3JjPSJpbWcvc3luY2hvcm5pemVfY2xhc3Nlcy5wbmciIGFsdD0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzZXMgb3B0aW9uLiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBKUEEgVG9vbHMgJmd0OyBTeW5jaHJvbml6ZSBDbGFzc2VzIG9wdGlvbi4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+RGFsaSBhZGRzIHRoZSBuZWNlc3NhcnkgPGNvZGU+Jmx0O2NsYXNzJmd0OzwvY29kZT4gZWxlbWVudHMgdG8gdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UGVyc2lzdGVuY2UgWE1MIEVkaXRvcjwvc3Bhbj4gdG8gY29udGludWUgZWRpdGluZyB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMDIuaHRtI0NJSEVKQUlFIj5Vc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThjODMyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDMgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmNDgiIG5hbWU9InN0aHJlZjQ4Ij48L2E+Ci08aDE+Q3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlPC9oMT4KLTxwPklmIHlvdSBvcHQgbm90IHRvIGNyZWF0ZSBhbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIHdoZW4geW91IGNyZWF0ZSBhIEpQQSBwcm9qZWN0LCB5b3UgY2FuIGNyZWF0ZSBvbmUgdXNpbmcgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwNS5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+LjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBjcmVhdGUgYW4gPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+RnJvbSB0aGUgTmF2aWdhdG9yIG9yIFBhY2thZ2UgRXhwbG9yZXIsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0OSIgbmFtZT0ic3RocmVmNDkiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgU2VsZWN0IGEgV2l6YXJkIERpYWxvZzwvcD4KLTxpbWcgc3JjPSJpbWcvc2VsZWN0X2Ffd2l6YXJkX21hcHBpbmcucG5nIiBhbHQ9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggTWFwcGluZyBmaWxlIHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggTWFwcGluZyBmaWxlIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwcGluZyBGaWxlPC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSBNYXBwaW5nIEZpbGUgcGFnZSBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjUwIiBuYW1lPSJzdGhyZWY1MCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBNYXBwaW5nIEZpbGUgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ19maWxlX25ldy5wbmciIGFsdD0iVGhlIE1hcHBpbmcgRmlsZSBwYWdlLiIgdGl0bGU9IlRoZSBNYXBwaW5nIEZpbGUgcGFnZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5EZWZpbmUgdGhlIHByb3BlcnRpZXMgaW4gdGhlIHBhZ2UgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LiBUaGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBhcHBlYXJzIGluIHRoZSBzcmMgZGlyZWN0b3J5IG9mIHRoZSBzZWxlY3RlZCBKUEEgcHJvamVjdC4gWW91IGNhbiBtYW5hZ2UgdGhlIG9ybS54bWwgZmlsZSB1c2luZyB0aGUgSlBBIERldGFpbHMgdmlldyBvciB0aHJvdWdoIHRoZSBYTUwgRWRpdG9yLiBTZWUgYWxzbyA8YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhlIE1hcHBpbmcgRmlsZSBXaXphcmQgd2lsbCBub3QgYWxsb3cgeW91IHRvIHByb2NlZWQgaWYgeW91IHNlbGVjdCBhIEpQQSBwcm9qZWN0IHRoYXQgYWxyZWFkeSBpbmNsdWRlcyBhbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTVkMWRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0NCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJXb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIQkNEQ0UiIG5hbWU9IkNJSEJDRENFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY1MSIgbmFtZT0ic3RocmVmNTEiPjwvYT48YSBpZD0ic3RocmVmNTIiIG5hbWU9InN0aHJlZjUyIj48L2E+WW91IGNhbiB3b3JrIHdpdGggdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGJ5IHVzaW5nIHRoZSBKUEEgRGV0YWlscyB2aWV3LjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byB3b3JrIHdpdGggdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGU6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UGFja2FnZSBFeHBsb3Jlcjwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPk9wZW48L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkVudGl0eU1hcHBpbmdzPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSBKUEEgRGV0YWlscyB2aWV3IHRvIGNvbmZpZ3VyZSB0aGUgZW50aXR5IG1hcHBpbmcgYW5kIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNTMiIG5hbWU9InN0aHJlZjUzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+SlBBIERldGFpbHMgdmlldyBmb3IgRW50aXR5TWFwcGluZ3MgKG9ybS54bWwpPC9wPgotPGltZyBzcmM9ImltZy9kZXRhaWxzX2VudGl0eW1hcHBpbmdzLnBuZyIgYWx0PSJKUEEgRGV0YWlscyB2aWV3IGZvciBvcm0ueG1sIGZpbGUuIiB0aXRsZT0iSlBBIERldGFpbHMgdmlldyBmb3Igb3JtLnhtbCBmaWxlLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTwvb2w+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSIjQ0lIQkNEQ0UiPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hNTC5odG1sIj5Xb3JraW5nIHdpdGggWE1MIEZpbGVzPC9hPjxiciAvPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDMuaHRtI0NIREJJSkFDIj5UaGUgb3JtLnhtbCBmaWxlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZWY2OTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA2Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQ0IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+RW50aXR5PC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCR0JJRUUiIG5hbWU9IkJBQkdCSUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjU3IiBuYW1lPSJzdGhyZWY1NyI+PC9hPjxhIGlkPSJzdGhyZWY1OCIgbmFtZT0ic3RocmVmNTgiPjwvYT48YSBpZD0ic3RocmVmNTkiIG5hbWU9InN0aHJlZjU5Ij48L2E+PGEgaWQ9InN0aHJlZjYwIiBuYW1lPSJzdGhyZWY2MCI+PC9hPkFuIDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IGlzIGEgcGVyc2lzdGVudCBkb21haW4gb2JqZWN0LjwvcD4KLTxwPkFuIGVudGl0eSA8c3BhbiBjbGFzcz0iaXRhbGljIj5jYW4gYmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFic3RyYWN0IG9yIGNvbmNyZXRlIGNsYXNzZXMuIEVudGl0aWVzIG1heSBhbHNvIGV4dGVuZCBub24tZW50aXR5IGNsYXNzZXMgYXMgd2VsbCBhcyBlbnRpdHkgY2xhc3NlcywgYW5kIG5vbi1lbnRpdHkgY2xhc3NlcyBtYXkgZXh0ZW5kIGVudGl0eSBjbGFzc2VzLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QW4gZW50aXR5IDxzcGFuIGNsYXNzPSJpdGFsaWMiPm11c3QgaGF2ZTwvc3Bhbj46PC9wPgotPHVsPgotPGxpPgotPHA+QSBuby1hcmcgY29uc3RydWN0b3IgKHB1YmxpYyBvciBwcm90ZWN0ZWQpOyB0aGUgZW50aXR5IGNsYXNzIG1heSBoYXZlIG90aGVyIGNvbnN0cnVjdG9ycyBhcyB3ZWxsLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PGEgaWQ9InN0aHJlZjYxIiBuYW1lPSJzdGhyZWY2MSI+PC9hPjxhIGlkPSJzdGhyZWY2MiIgbmFtZT0ic3RocmVmNjIiPjwvYT48YSBpZD0ic3RocmVmNjMiIG5hbWU9InN0aHJlZjYzIj48L2E+RWFjaCBwZXJzaXN0ZW50IGVudGl0eSBtdXN0IGJlIG1hcHBlZCB0byBhIGRhdGFiYXNlIHRhYmxlIGFuZCBjb250YWluIGEgcHJpbWFyeSBrZXkuIFBlcnNpc3RlbnQgZW50aXRpZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPk9wZW4gdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QYWNrYWdlIEV4cGxvcmVyLjwvc3Bhbj48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSBjbGFzcyBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgSlBBIERldGFpbHMgdmlldywgY2xpY2sgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsgdG8gYWNjZXNzIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy4gSW4gdGhlIGZvbGxvd2luZyBmaWd1cmUsIGNsaWNraW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmVudGl0eTwvc3Bhbj4gaW52b2tlcyB0aGUgZGlhbG9nIGZyb20gdGhlIEpQQSBEZXRhaWxzIFZpZXcuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNjQiIG5hbWU9InN0aHJlZjY0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIE1hcHBpbmcgVHlwZSBIeXBlcmxpbms8L3A+Ci08aW1nIHNyYz0iaW1nL21hcHBlZF9lbnRpdHlfdHlwZV9saW5rLnBuZyIgYWx0PSJUaGUgSlBBIERldGFpbHMgdmlldyBmb3IgYW4gZW50aXR5IHNob3dpbmcgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsuIiB0aXRsZT0iVGhlIEpQQSBEZXRhaWxzIHZpZXcgZm9yIGFuIGVudGl0eSBzaG93aW5nIHRoZSBtYXBwaW5nIHR5cGUgaHlwZXJsaW5rLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1Zb3UgY2FuIGFsc28gY2hhbmdlIChvciBhZGQpIHBlcnNpc3RlbmNlIGZvciBhbiBlbnRpdHkgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIFZpZXcgYW5kIHRoZW4gY2xpY2tpbmcgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IEVudGl0eTwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBmcm9tIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjY1IiBuYW1lPSJzdGhyZWY2NSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIERpYWxvZzwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIFR5cGUgc2VsZWN0aW9uIGRpYWxvZyB3aXRoIEVuaXR5IHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBNYXBwaW5nIFR5cGUgc2VsZWN0aW9uIGRpYWxvZyB3aXRoIEVuaXR5IHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSByZW1haW5pbmcgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmQxMDlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0NCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkVtYmVkZGFibGU8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbWJlZGRhYmxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkVJQ0UiIG5hbWU9IkJBQkZFSUNFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbWJlZGRhYmxlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY2NiIgbmFtZT0ic3RocmVmNjYiPjwvYT48YSBpZD0ic3RocmVmNjciIG5hbWU9InN0aHJlZjY3Ij48L2E+QW4gPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkPC9zcGFuPiBjbGFzcyBpcyBhIGNsYXNzIHdob3NlIGluc3RhbmNlcyBhcmUgc3RvcmVkIGFzIHBhcnQgb2YgYW4gb3duaW5nIGVudGl0eTsgaXQgc2hhcmVzIHRoZSBpZGVudGl0eSBvZiB0aGUgb3duaW5nIGVudGl0eS4gRWFjaCBmaWVsZCBvZiB0aGUgZW1iZWRkZWQgY2xhc3MgaXMgbWFwcGVkIHRvIHRoZSBkYXRhYmFzZSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIG93bmluZyBlbnRpdHkuPC9wPgotPHA+VG8gb3ZlcnJpZGUgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgc3ViY2xhc3MsIHVzZSB0aGUgPGNvZGU+QEF0dHJpYnV0ZU92ZXJyaWRlPC9jb2RlPiBhbm5vdGF0aW9uIGZvciB0aGF0IHNwZWNpZmljIGNsYXNzLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWY2OCIgbmFtZT0ic3RocmVmNjgiPjwvYT48YSBpZD0ic3RocmVmNjkiIG5hbWU9InN0aHJlZjY5Ij48L2E+PGEgaWQ9InN0aHJlZjcwIiBuYW1lPSJzdGhyZWY3MCI+PC9hPkFuIGVtYmVkZGFibGUgZW50aXR5IGlzIGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPkBFbWJlZGRhYmxlPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBhZGQgZW1iZWRkYWJsZSBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPk9wZW4gdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QYWNrYWdlIEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSBjbGFzcyBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluayB0byBvcGVuIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRhYmxlPC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjcxIiBuYW1lPSJzdGhyZWY3MSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPk1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gRGlhbG9nIChFbWJlZGRhYmxlKTwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmciIGFsdD0iVGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggRW1iZWRkYWJsZSBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cgd2l0aCBFbWJlZGRhYmxlIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSByZW1haW5pbmcgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGRsPgotPGRkPjxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+PC9kZD4KLTxkZD48YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjwvZGQ+Ci08ZGQ+PGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjwvZGQ+Ci08L2RsPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAzZDNkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDQgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5NYXBwZWQgc3VwZXJjbGFzczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBlZCBzdXBlcmNsYXNzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCREFHQ0kiIG5hbWU9IkJBQkRBR0NJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYXBwZWQgc3VwZXJjbGFzczwvaDE+Ci08cD48YSBpZD0ic3RocmVmNzIiIG5hbWU9InN0aHJlZjcyIj48L2E+PGEgaWQ9InN0aHJlZjczIiBuYW1lPSJzdGhyZWY3MyI+PC9hPkFuIGVudGl0eSB0aGF0IGV4dGVuZHMgYSA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwcGVkIFN1cGVyY2xhc3M8L3NwYW4+IGNsYXNzIGluaGVyaXRzIHRoZSBwZXJzaXN0ZW50IHN0YXRlIGFuZCBtYXBwaW5nIGluZm9ybWF0aW9uIGZyb20gYSBzdXBlcmNsYXNzLiBZb3Ugc2hvdWxkIHVzZSBhIG1hcHBlZCBzdXBlcmNsYXNzIHRvIGRlZmluZSBtYXBwaW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgY29tbW9uIHRvIG11bHRpcGxlIGVudGl0eSBjbGFzc2VzLjwvcD4KLTxwPkEgbWFwcGVkIHN1cGVyY2xhc3MgPHNwYW4gY2xhc3M9Iml0YWxpYyI+Y2FuIGJlPC9zcGFuPjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5BYnN0cmFjdCBvciBjb25jcmV0ZSBjbGFzc2VzPC9wPgotPC9saT4KLTwvdWw+Ci08cD5BIG1hcHBlZCBzdXBlcmNsYXNzIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmNhbm5vdCBiZTwvc3Bhbj46PC9wPgotPHVsPgotPGxpPgotPHA+QmUgcXVlcmllZCBvciBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gRW50aXR5LU1hbmFnZXIgb3IgUXVlcnkgb3BlcmF0aW9uczwvcD4KLTwvbGk+Ci08bGk+Ci08cD5CZSB0aGUgdGFyZ2V0IG9mIGEgcGVyc2lzdGVudCByZWxhdGlvbnNoaXA8L3A+Ci08L2xpPgotPC91bD4KLTxwPkEgbWFwcGVkIHN1cGVyY2xhc3MgZG9lcyBub3QgaGF2ZSBhIGRlZmluZWQgZGF0YWJhc2UgdGFibGUuIEluc3RlYWQsIGl0cyBtYXBwaW5nIGluZm9ybWF0aW9uIGlzIGRlcml2ZWQgZnJvbSBpdHMgc3VwZXJjbGFzcy4gVG8gb3ZlcnJpZGUgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgc3ViY2xhc3MsIHVzZSB0aGUgPGNvZGU+QEF0dHJpYnV0ZU92ZXJyaWRlPC9jb2RlPiBhbm5vdGF0aW9uIGZvciB0aGF0IHNwZWNpZmljIGNsYXNzLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWY3NCIgbmFtZT0ic3RocmVmNzQiPjwvYT48YSBpZD0ic3RocmVmNzUiIG5hbWU9InN0aHJlZjc1Ij48L2E+PGEgaWQ9InN0aHJlZjc2IiBuYW1lPSJzdGhyZWY3NiI+PC9hPjxhIGlkPSJzdGhyZWY3NyIgbmFtZT0ic3RocmVmNzciPjwvYT5BIG1hcHBlZCBzdXBlcmNsYXNzIGlzIGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPkBNYXBwZWRTdXBlcmNsYXNzPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBhZGQgTWFwcGVkIFN1cGVyY2xhc3MgcGVyc2lzdGVuY2UgdG8gYW4gZXhpc3RpbmcgZW50aXR5OjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5PcGVuIHRoZSBKYXZhIGNsYXNzIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UGFja2FnZSBFeHBsb3Jlcjwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgY2xhc3MgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldy48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcsIGNsaWNrIHRoZSBtYXBwaW5nIHR5cGUgaHlwZXJsaW5rIHRvIG9wZW4gdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcHBlZCBTdXBlcmNsYXNzPC9zcGFuPiBhbmQgdGhlbiA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjc4IiBuYW1lPSJzdGhyZWY3OCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPk1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gRGlhbG9nIChNYXBwZWQgU3VwZXJjbGFzcyk8L3A+Ci08aW1nIHNyYz0iaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fc3VwZXJjbGFzcy5wbmciIGFsdD0iVGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggTWFwcGVkIFN1cGVyY2xhc3Mgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggTWFwcGVkIFN1cGVyY2xhc3Mgc2VsZWN0ZWQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIHJlbWFpbmluZyA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OGE2ZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQ1IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgTmFtZWQgUXVlcmllczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJJR0JHRyIgbmFtZT0iQkFCSUdCR0ciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjk0IiBuYW1lPSJzdGhyZWY5NCI+PC9hPjxhIGlkPSJzdGhyZWY5NSIgbmFtZT0ic3RocmVmOTUiPjwvYT5OYW1lZCBxdWVyaWVzIGltcHJvdmUgYXBwbGljYXRpb24gcGVyZm9ybWFuY2UgYmVjYXVzZSB0aGV5IGFyZSBwcmVwYXJlZCBvbmNlIGFuZCB0aGV5IChhbmQgYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgc3VwcG9ydGluZyBvYmplY3RzKSBjYW4gYmUgZWZmaWNpZW50bHkgcmV1c2VkIHRoZXJlYWZ0ZXIsIG1ha2luZyB0aGVtIHdlbGwgc3VpdGVkIGZvciBjb21wbGV4IGFuZCBmcmVxdWVudGx5IGV4ZWN1dGVkIG9wZXJhdGlvbnMuIE5hbWVkIHF1ZXJpZXMgdXNlIHRoZSBKUEEgcXVlcnkgbGFuZ3VhZ2UgZm9yIHBvcnRhYmxlIGV4ZWN1dGlvbiBvbiBhbnkgdW5kZXJseWluZyBkYXRhYmFzZTsgbmFtZWQgbmF0aXZlIHF1ZXJpZXMgdXNlIHRoZSBTUUwgbGFuZ3VhZ2UgbmF0aXZlIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBhZGQgPGNvZGU+QE5hbWVkUXVlcnk8L2NvZGU+IGFuZCA8Y29kZT5ATmFtZWROYXRpdmVRdWVyeTwvY29kZT4gYW5ub3RhdGlvbnMgdG8gdGhlIGVudGl0eS48L3A+Ci08cD5UbyBjcmVhdGUgYSBuYW1lZCBxdWVyeTo8L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBleHBhbmQgUXVlcmllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gZm9yIGEgbmFtZWQgcXVlcnksIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgTmF0aXZlPC9zcGFuPiBmb3IgYSBuYXRpdmUgcXVlcnkuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBkaWFsb2cgdGhhdCBhcHBlYXJzLCBlbnRlciB0aGUgbmFtZSBvZiB0aGUgcXVlcnkgaW4gdGhlIE5hbWUgZmllbGQgYW5kIHRoZW4gY2xpY2sgT0suPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBxdWVyeSBpbiB0aGUgUXVlcnkgZmllbGQuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmOTYiIG5hbWU9InN0aHJlZjk2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+RW50ZXJpbmcgYSBOYW1lZCBRdWVyeTwvcD4KLTxpbWcgc3JjPSJpbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmciIGFsdD0iVGhlIFF1ZXJpZXMgc2VjdGlvbiBvZiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJUaGUgUXVlcmllcyBzZWN0aW9uIG9mIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M5M2Y3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDYgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5CYXNpYyBtYXBwaW5nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQmFzaWMgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkJBQkNFIiBuYW1lPSJCQUJCQUJDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QmFzaWMgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmOTciIG5hbWU9InN0aHJlZjk3Ij48L2E+PGEgaWQ9InN0aHJlZjk4IiBuYW1lPSJzdGhyZWY5OCI+PC9hPjxhIGlkPSJzdGhyZWY5OSIgbmFtZT0ic3RocmVmOTkiPjwvYT48YSBpZD0ic3RocmVmMTAwIiBuYW1lPSJzdGhyZWYxMDAiPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+QmFzaWMgTWFwcGluZzwvc3Bhbj4gdG8gbWFwIGFuIGF0dHJpYnV0ZSBkaXJlY3RseSB0byBhIGRhdGFiYXNlIGNvbHVtbi4gQmFzaWMgbWFwcGluZ3MgbWF5IGJlIHVzZWQgb25seSB3aXRoIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlIHR5cGVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkphdmEgcHJpbWl0aXZlIHR5cGVzIGFuZCB3cmFwcGVycyBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzPC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEubGFuZy5TdHJpbmcsIGphdmEubWF0aC5CaWdJbnRlZ2VyPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLm1hdGguQmlnRGVjaW1hbDwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS51dGlsLkRhdGU8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEudXRpbC5DYWxlbmRhciwgamF2YS5zcWwuRGF0ZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS5zcWwuVGltZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS5zcWwuVGltZXN0YW1wPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5ieXRlW108L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPkJ5dGVbXTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+Y2hhcltdPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5DaGFyYWN0ZXJbXTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+ZW51bXM8L3A+Ci08L2xpPgotPGxpPgotPHA+YW55IG90aGVyIHR5cGUgdGhhdCBpbXBsZW1lbnRzIDxjb2RlPlNlcmlhbGl6YWJsZTwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRvIGNyZWF0ZSBhIGJhc2ljIG1hcHBpbmc6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHJpZ2h0LWNsaWNrIHRoZSBmaWVsZCB0byBtYXAuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgQmFzaWM8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkIGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+RW50aXR5IE1hcCBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMyLXQxNSI+RGVmaW5lcyB0aGlzIG1hcHBpbmcgYXMgYSA8c3BhbiBjbGFzcz0iYm9sZCI+QmFzaWMgTWFwcGluZzwvc3Bhbj4uCi08cD5UaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AQmFzaWM8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTUgcjFjMy10MTUiPkJhc2ljPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+Q29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMi10MTUiPlRoZSBkYXRhYmFzZSBjb2x1bW4gbWFwcGVkIHRvIHRoZSBlbnRpdHkgYXR0cmlidXRlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0NCSEIiPiJDb2x1bW4iPC9hPiBmb3IgZGV0YWlscy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNSByMWMzLXQxNSI+QnkgZGVmYXVsdCwgdGhlIENvbHVtbiBpcyBhc3N1bWVkIHRvIGJlIG5hbWVkIGlkZW50aWNhbGx5IHRvIHRoZSBhdHRyaWJ1dGUgYW5kIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+SU5TRVJUPC9jb2RlPiBhbmQgPGNvZGU+VVBEQVRFPC9jb2RlPiBzdGF0ZW1lbnRzLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPlRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTUgcjFjMi10MTUiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5GZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzItdDE1Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTUgcjFjMy10MTUiPkVhZ2VyPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+T3B0aW9uYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNSByMWMyLXQxNSI+U3BlY2lmaWVzIGlmIHRoaXMgZmllbGQgaXMgY2FuIGJlIG51bGwuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTUgcjFjMy10MTUiPlllczwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPlRlbXBvcmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTUgcjFjMi10MTUiPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBkYXRhLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDRUFKR0QiPiJUZW1wb3JhbCI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RGF0ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWVzdGFtcDwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPkxvYjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE1IHIxYzItdDE1Ij5TcGVjaWZpZXMgaWYgdGhpcyBpcyBhIGxhcmdlIG9iamVjdHMgKEJMT0Igb3IgQ0xPQikuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCQklCSSI+IkxvYiI8L2E+IGZvciBkZXRhaWxzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBDb2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCB0YWJsZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9UQUJMRSZndDs8L3NwYW4+IiwgCi0gICAgaW5zZXJ0YWJsZT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5TRVJUQUJMRSZndDs8L3NwYW4+LCB1cGRhdGFibGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1VQREFUQUJMRSZndDs8L3NwYW4+KQotQEJhc2ljKGZldGNoPUZldGNoVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LCBvcHRpb25hbCA9IDxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtPUFRJT05BTCZndDs8L3NwYW4+KQotQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEVNUE9SQUwmZ3Q7PC9zcGFuPikKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGQ4MzhkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDYgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5FbWJlZGRlZCBtYXBwaW5nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW1iZWRkZWQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkNCSERGIiBuYW1lPSJCQUJDQkhERiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW1iZWRkZWQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTAxIiBuYW1lPSJzdGhyZWYxMDEiPjwvYT48YSBpZD0ic3RocmVmMTAyIiBuYW1lPSJzdGhyZWYxMDIiPjwvYT48YSBpZD0ic3RocmVmMTAzIiBuYW1lPSJzdGhyZWYxMDMiPjwvYT48YSBpZD0ic3RocmVmMTA0IiBuYW1lPSJzdGhyZWYxMDQiPjwvYT5Vc2UgYW4gPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkIE1hcHBpbmc8L3NwYW4+IHRvIHNwZWNpZnkgYSBwZXJzaXN0ZW50IGZpZWxkIG9yIHByb3BlcnR5IG9mIGFuIGVudGl0eSB3aG9zZSB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBhbiBlbWJlZGRhYmxlIGNsYXNzLjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCByaWdodC1jbGljayB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBhcyAmZ3Q7IEVtYmVkZGVkPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZCBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgb24gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE2Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPkVudGl0eSBNYXBwaW5nIEh5cGVybG5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTYgcjFjMi10MTYiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbWJlZGRlZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWMzLXQxNiI+RW1iZWRkZWQ8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTYgcjFjMi10MTYiPlNwZWNpZnkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbWFwcGluZyBvZiBhbiBlbnRpdHkncyBhdHRyaWJ1dGUuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPkNvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNiByMWMyLXQxNiI+VGhlIGRhdGFiYXNlIGNvbHVtbiAoYW5kIGl0cyB0YWJsZSkgbWFwcGVkIHRvIHRoZSBlbnRpdHkgYXR0cmlidXRlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0NCSEIiPiJDb2x1bW4iPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPk5hbWUgJm5kYXNoOyBOYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlRhYmxlICZuZGFzaDsgTmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1ARW1iZWRkZWQKLUBBdHRyaWJ1dGVPdmVycmlkZShjb2x1bW49QENvbHVtbih0YWJsZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9UQUJMRSZndDs8L3NwYW4+IiwgbmFtZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIpKQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjM1ZDljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0NiAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkVtYmVkZGVkIElEIG1hcHBpbmc8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbWJlZGRlZCBJRCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIRElBRUUiIG5hbWU9IkNJSERJQUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbWJlZGRlZCBJRCBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMDUiIG5hbWU9InN0aHJlZjEwNSI+PC9hPjxhIGlkPSJzdGhyZWYxMDYiIG5hbWU9InN0aHJlZjEwNiI+PC9hPjxhIGlkPSJzdGhyZWYxMDciIG5hbWU9InN0aHJlZjEwNyI+PC9hPjxhIGlkPSJzdGhyZWYxMDgiIG5hbWU9InN0aHJlZjEwOCI+PC9hPlVzZSBhbiA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkZWQgSUQgTWFwcGluZzwvc3Bhbj4gdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgb2YgYW4gZW1iZWRkZWQgSUQuIFRoZXNlIG1hcHBpbmdzIG1heSBiZSB1c2VkIHdpdGggYSA8YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCRkVJQ0UiPkVtYmVkZGFibGU8L2E+IGVudGl0aWVzLjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgRW1iZWRkZWQgSWQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkIGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTciPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+RW50aXR5IE1hcHBpbmcgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTcgcjFjMi10MTciPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkIElkPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbWJlZGRlZElkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE3IHIxYzMtdDE3Ij5FbWJlZGRlZCBJZDwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEVtYmVkZGVkSWQKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1OTJkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQ2IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+SUQgbWFwcGluZzwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IklEIG1hcHBpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJHQ0JIRyIgbmFtZT0iQkFCR0NCSEciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPklEIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEwOSIgbmFtZT0ic3RocmVmMTA5Ij48L2E+PGEgaWQ9InN0aHJlZjExMCIgbmFtZT0ic3RocmVmMTEwIj48L2E+PGEgaWQ9InN0aHJlZjExMSIgbmFtZT0ic3RocmVmMTExIj48L2E+PGEgaWQ9InN0aHJlZjExMiIgbmFtZT0ic3RocmVmMTEyIj48L2E+VXNlIGFuIDxzcGFuIGNsYXNzPSJib2xkIj5JRCBNYXBwaW5nPC9zcGFuPiB0byBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSBvZiBhbiBlbnRpdHkuIElEIG1hcHBpbmdzIG1heSBiZSB1c2VkIHdpdGggYSA8YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT4gb3IgPGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT4uIEVhY2ggPGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+IG11c3QgaGF2ZSBhbiBJRCBtYXBwaW5nLjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQgY2xpY2sgdGhlIGZpbGVkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIGFzICZndDsgSUQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+IGZpZWxkcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTgiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+RW50aXR5IE1hcHBpbmcgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTggcjFjMi10MTgiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGFuIDxzcGFuIGNsYXNzPSJib2xkIj5JRCBNYXBwaW5nPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBJZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOCByMWMzLXQxOCI+SUQ8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij5Db2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOCByMWMyLXQxOCI+VGhlIGRhdGFiYXNlIGNvbHVtbiBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHQ0JIQiI+IkNvbHVtbiI8L2E+IGZvciBkZXRhaWxzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE4IHIxYzMtdDE4Ij5CeSBkZWZhdWx0LCB0aGUgQ29sdW1uIGlzIGFzc3VtZWQgdG8gYmUgbmFtZWQgaWRlbnRpY2FsbHkgdG8gdGhlIGF0dHJpYnV0ZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij5UYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE4IHIxYzItdDE4Ij5UaGUgZGF0YWJhc2UgdGFibGUgbWFwcGVkIHRvIHRoZSBlbnRpdHkgYXR0cmlidXRlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE4IHIxYzMtdDE4Ij5CeSBkZWZhdWx0LCB0aGUgVGFibGUgaXMgYXNzdW1lZCB0byBiZSBpZGVudGljYWwgdG8gdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxOCIgaGVhZGVycz0icjFjMS10MTgiPlRlbXBvcmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTggcjFjMi10MTgiPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBkYXRhLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDRUFKR0QiPiJUZW1wb3JhbCI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RGF0ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWVzdGFtcDwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTggcjFjMy10MTgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSBmaWVsZHMgaW4gPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvYT4gYXJlYSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUEsgR2VuZXJhdGlvbiB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBLIEdlbmVyYXRpb24gdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE5Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTkiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzItdDE5Ij5UaGVzZSBmaWVsZHMgZGVmaW5lIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij4mbmJzcDsmbmJzcDtTdHJhdGVneTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE5IHIxYzItdDE5Ij5TZWUgPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNCQUpCQyI+IlByaW1hcnkgS2V5IEdlbmVyYXRpb24iPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkF1dG88L3A+Ci08L2xpPgotPGxpPgotPHA+U2VxdWVuY2U8L3A+Ci08L2xpPgotPGxpPgotPHA+SWRlbnRpdHk8L3A+Ci08L2xpPgotPGxpPgotPHA+VGFibGU8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE5IHIxYzMtdDE5Ij5BdXRvPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7R2VuZXJhdG9yJm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzItdDE5Ij5OYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBnZW5lcmF0b3Igc3BlY2lmaWVkIGluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U3RyYXRlZ3k8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5BZGRpdGlvbmFsIGZpZWxkcyB3aWxsIGFwcGVhciBpbiB0aGUgPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvYT4gYXJlYSwgZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBTdHJhdGVneS4gU2VlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPiJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQElkCi1AQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgdGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iLCBpbnNlcnRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTlNFUlRBQkxFJmd0Ozwvc3Bhbj4sCi0gICAgdXBkYXRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtVUERBVEFCTEUmZ3Q7PC9zcGFuPikKLUBUZW1wb3JhbCg8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEVNUE9SQUwmZ3Q7PC9zcGFuPikKLUBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT1HZW5lcmF0b3JUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtTVFJBVEVHWSZndDs8L3NwYW4+LCBnZW5lcmF0b3I9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtHRU5FUkFUT1JfTkFNRSZndDs8L3NwYW4+IilAVGFibGVHZW5lcmF0b3IobmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9OQU1FJmd0Ozwvc3Bhbj4iLCB0YWJsZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfR0VORVJBVE9SX1RBQkxFJmd0Ozwvc3Bhbj4iLCAKLSAgICBwa0NvbHVtbk5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9QSyZndDs8L3NwYW4+IiwgCi0gICAgdmFsdWVDb2x1bW5OYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfVkFMVUVfQ09MVU1OJmd0Ozwvc3Bhbj4iLCAKLSAgICBwa0NvbHVtblZhbHVlID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfUEtfQ09MVU1OX1ZBTFVFJmd0Ozwvc3Bhbj4iKUBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7U0VRVUVOQ0VfR0VORVJBVE9SX05BTUUmZ3Q7PC9zcGFuPiIsIAotICAgIHNlcXVlbmNlTmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRSZndDs8L3NwYW4+IikKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFiNmFlOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQ3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+TWFueS10by1tYW55IG1hcHBpbmc8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW55LXRvLW1hbnkgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkVJRUdEIiBuYW1lPSJCQUJFSUVHRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TWFueS10by1tYW55IG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjExMyIgbmFtZT0ic3RocmVmMTEzIj48L2E+PGEgaWQ9InN0aHJlZjExNCIgbmFtZT0ic3RocmVmMTE0Ij48L2E+PGEgaWQ9InN0aHJlZjExNSIgbmFtZT0ic3RocmVmMTE1Ij48L2E+PGEgaWQ9InN0aHJlZjExNiIgbmFtZT0ic3RocmVmMTE2Ij48L2E+VXNlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbnktdG8tTWFueSBNYXBwaW5nPC9zcGFuPiB0byBkZWZpbmUgYSBtYW55LXZhbHVlZCBhc3NvY2lhdGlvbiB3aXRoIG1hbnktdG8tbWFueSBtdWx0aXBsaWNpdHkuIEEgbWFueS10by1tYW55IG1hcHBpbmcgaGFzIHR3byBzaWRlczogdGhlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPm93bmluZyBzaWRlPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9Iml0YWxpYyI+bm9uLW93bmluZyBzaWRlPC9zcGFuPi4gWW91IG11c3Qgc3BlY2lmeSB0aGUgam9pbiB0YWJsZSBvbiB0aGUgb3duaW5nIHNpZGUuIEZvciBiaWRpcmVjdGlvbmFsIG1hcHBpbmdzLCBlaXRoZXIgc2lkZSBtYXkgYmUgdGhlIG93bmluZyBzaWRlLjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgTWFueS10b01hbnk8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkIGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+IGZpZWxkcyBvZiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIwIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjAiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+TWFwcGluZyBFbnRpdHkgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjAgcjFjMi10MjAiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbnkgdG8gTWFueSBNYXBwaW5nPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBNYW55VG9NYW55PC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzMtdDIwIj5NYW55IHRvIE1hbnk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5UYXJnZXQgRW50aXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjAgcjFjMi10MjAiPlRoZSBlbnRpdHkgdG8gd2hpY2ggdGhpcyBhdHRyaWJ1dGUgaXMgbWFwcGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIwIHIxYzMtdDIwIj5udWxsCi08cD5Zb3UgZG8gbm90IG5lZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB0YXJnZXQgZW50aXR5LCBzaW5jZSBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5GZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIwIHIxYzItdDIwIj5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjAgcjFjMy10MjAiPkxhenk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5NYXBwZWQgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMCByMWMyLXQyMCI+VGhlIGRhdGFiYXNlIGZpZWxkIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIwIHIxYzMtdDIwIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5PcmRlciBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIwIHIxYzItdDIwIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0RBRElIIj4iT3JkZXIgQnkiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjAgcjFjMy10MjAiPk5vIG9yZGVyaW5nPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIGZpZWxkcyBpbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDE0Lmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT4gYXJlYSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBKb2luIFRhYmxlIHRhYiBvZiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIxIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjEiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjEgcjFjMi10MjEiPk5hbWUgb2YgdGhlIGpvaW4gdGFibGUgdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgY29sdW1uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIxIHIxYzMtdDIxIj5Zb3UgbXVzdCBzcGVjaWZ5IHRoZSBqb2luIHRhYmxlIG9uIHRoZSBvd25pbmcgc2lkZS4KLTxwPkJ5IGRlZmF1bHQsIHRoZSBuYW1lIGlzIGFzc3VtZWQgdG8gYmUgdGhlIHByaW1hcnkgdGFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXRpZXMgY29uY2F0ZW5hdGVkIHdpdGggYW4gdW5kZXJzY29yZS48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMSByMWMyLXQyMSI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBBZGQsIEVkaXQsIG9yIFJlbW92ZSB0aGUgam9pbiBjb2x1bW5zLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIxIHIxYzMtdDIxIj5CeSBkZWZhdWx0LCB0aGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBwcmltYXJ5IHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0aWVzIGNvbmNhdGVuYXRlZCB3aXRoIGFuIHVuZGVyc2NvcmUuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+SW52ZXJzZSBKb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMyLXQyMSI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBBZGQsIEVkaXQsIG9yIFJlbW92ZSB0aGUgam9pbiBjb2x1bW5zLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIxIHIxYzMtdDIxIj5CeSBkZWZhdWx0LCB0aGUgbWFwcGluZyBpcyBhc3N1bWVkIHRvIGhhdmUgYSBzaW5nbGUgam9pbi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08bGk+Ci08cD5UbyBhZGQgYSBuZXcgSm9pbiBvciBJbnZlcnNlIEpvaW4gQ29sdW1uLCBjbGljayA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkFkZDwvc3Bhbj4uPC9wPgotPHA+VG8gZWRpdCBhbiBleGlzdGluZyBKb2luIG9yIEludmVyc2UgSm9pbiBDb2x1bW4sIHNlbGVjdCB0aGUgZmllbGQgdG8gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+RWRpdDwvc3Bhbj4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEpvaW5UYWJsZShqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU4mZ3Q7PC9zcGFuPiIpLCAKLSAgICBuYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX1RBQkxFX05BTUUmZ3Q7PC9zcGFuPiIpCi1ATWFueVRvTWFueShjYXNjYWRlPUNhc2NhZGVUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPiwgZmV0Y2g9RmV0Y2hUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtGRVRDSF9UWVBFJmd0Ozwvc3Bhbj4sCi0gICAgdGFyZ2V0RW50aXR5PTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQVJHRVRfRU5USVRZJmd0Ozwvc3Bhbj4sIG1hcHBlZEJ5ID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtNQVBQRURfQlkmZ3Q7PC9zcGFuPiIpCi1AT3JkZXJCeSgiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O09SREVSX0JZJmd0Ozwvc3Bhbj4iKQotCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OTQzYWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0NyAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPk1hbnktdG8tb25lIG1hcHBpbmc8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW55LXRvLW9uZSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEZBRkoiIG5hbWU9IkJBQkhGQUZKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYW55LXRvLW9uZSBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMTciIG5hbWU9InN0aHJlZjExNyI+PC9hPjxhIGlkPSJzdGhyZWYxMTgiIG5hbWU9InN0aHJlZjExOCI+PC9hPjxhIGlkPSJzdGhyZWYxMTkiIG5hbWU9InN0aHJlZjExOSI+PC9hPjxhIGlkPSJzdGhyZWYxMjAiIG5hbWU9InN0aHJlZjEyMCI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55LXRvLU9uZTwvc3Bhbj4gbWFwcGluZyB0byBkZWZpbmVzIGEgc2luZ2xlLXZhbHVlZCBhc3NvY2lhdGlvbiB0byBhbm90aGVyIGVudGl0eSBjbGFzcyB0aGF0IGhhcyBtYW55LXRvLW9uZSBtdWx0aXBsaWNpdHkuPC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodCBjbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBNYW55LXRvLU9uZTwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGlvbiB0aGUgR2VuZXJhbCB0YWIgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpb24gdGhlIEdlbmVyYWwgdGFiIGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIyIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjIiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjIiIGhlYWRlcnM9InIxYzEtdDIyIj5NYXBwaW5nIEVudGl0eSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMiByMWMyLXQyMiI+RGVmaW5lcyBtYXBwaW5nIGFzIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55LXRvLU9uZTwvc3Bhbj4uIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBNYW55VG9PbmU8L2NvZGU+IGFubm90YXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjIgcjFjMy10MjIiPk1hbnktdG8tT25lPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIyIiBoZWFkZXJzPSJyMWMxLXQyMiI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIyIHIxYzItdDIyIj5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMiByMWMzLXQyMiI+bnVsbAotPHA+WW91IGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGVudGl0eSwgc2luY2UgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIyIiBoZWFkZXJzPSJyMWMxLXQyMiI+RmV0Y2g8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMiByMWMyLXQyMiI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHR0dIQiI+IkZldGNoIFR5cGUiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkVhZ2VyPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenk8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIyIHIxYzMtdDIyIj5FYWdlcjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMiIgaGVhZGVycz0icjFjMS10MjIiPkNhc2NhZGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMiByMWMyLXQyMiI+U2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0pBSUhCIj4iQ2FzY2FkZSBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EZWZhdWx0PC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJzaXN0PC9wPgotPC9saT4KLTxsaT4KLTxwPk1lcmdlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlbW92ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjIgcjFjMy10MjIiPkRlZmF1bHQ8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjIiIGhlYWRlcnM9InIxYzEtdDIyIj5PcHRpb25hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIyIHIxYzItdDIyIj5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMiByMWMzLXQyMiI+WWVzPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDE1Lmh0bSNDQUNGQ0VKQyI+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC9hPiB0YWIgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPkpvaW4gQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjMgcjFjMi10MjMiPjxhIGlkPSJzdGhyZWYxMjEiIG5hbWU9InN0aHJlZjEyMSI+PC9hPjxhIGlkPSJzdGhyZWYxMjIiIG5hbWU9InN0aHJlZjEyMiI+PC9hPlNwZWNpZnkgYSBtYXBwZWQgY29sdW1uIGZvciBqb2luaW5nIGFuIGVudGl0eSBhc3NvY2lhdGlvbi4gVGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEpvaW5Db2x1bTwvY29kZT4gYXR0cmlidXRlLgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBBZGQsIEVkaXQsIG9yIFJlbW92ZSB0aGUgam9pbiBjb2x1bW5zLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIzIHIxYzMtdDIzIj5CeSBkZWZhdWx0LCB0aGUgbWFwcGluZyBpcyBhc3N1bWVkIHRvIGhhdmUgYSBzaW5nbGUgam9pbi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBKb2luVGFibGUoam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OJmd0Ozwvc3Bhbj4iKSwgCi0gICAgbmFtZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9UQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iKQotQE1hbnlUb09uZSh0YXJnZXRFbnRpdHk9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBUkdFVF9FTlRJVFkmZ3Q7PC9zcGFuPiwgZmV0Y2g9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwgCi0gICAgY2FzY2FkZT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q0FTQ0FERV9UWVBFJmd0Ozwvc3Bhbj4pCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNDExN2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0NyAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPk9uZS10by1tYW55IG1hcHBpbmc8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJPbmUtdG8tbWFueSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEdFQkQiIG5hbWU9IkJBQkhHRUJEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PbmUtdG8tbWFueSBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMjMiIG5hbWU9InN0aHJlZjEyMyI+PC9hPjxhIGlkPSJzdGhyZWYxMjQiIG5hbWU9InN0aHJlZjEyNCI+PC9hPjxhIGlkPSJzdGhyZWYxMjUiIG5hbWU9InN0aHJlZjEyNSI+PC9hPjxhIGlkPSJzdGhyZWYxMjYiIG5hbWU9InN0aHJlZjEyNiI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tTWFueSBNYXBwaW5nPC9zcGFuPiB0byBkZWZpbmUgYSByZWxhdGlvbnNoaXAgd2l0aCBvbmUtdG8tbWFueSBtdWx0aXBsaWNpdHkuPC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBPbmUtdG8tbWFueTwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBHZW5lcmFsIHRhYiBvZiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEdlbmVyYWwgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjQiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI0Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPk1hcHBpbmcgRW50aXR5IFR5cGUgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjQgcjFjMi10MjQiPkRlZmluZXMgbWFwcGluZyBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+T25lLXRvLU1hbnk8L3NwYW4+LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AT25lVG9NYW55PC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI0IHIxYzMtdDI0Ij5PbmUtdG8tTWFueTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNCByMWMyLXQyNCI+VGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGF0dHJpYnV0ZSBpcyBtYXBwZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPkNhc2NhZGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNCByMWMyLXQyNCI+U2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0pBSUhCIj4iQ2FzY2FkZSBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EZWZhdWx0PC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJzaXN0PC9wPgotPC9saT4KLTxsaT4KLTxwPk1lcmdlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlbW92ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPkZldGNoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjQgcjFjMi10MjQiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0dHSEIiPiJGZXRjaCBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5FYWdlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MYXp5PC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNCByMWMzLXQyNCI+RWFnZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij5NYXBwZWQgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNCByMWMyLXQyNCI+VGhlIGRhdGFiYXNlIGZpZWxkIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI0IHIxYzMtdDI0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij5PcmRlciBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI0IHIxYzItdDI0Ij5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0RBRElIIj4iT3JkZXIgQnkiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjQgcjFjMy10MjQiPk5vIG9yZGVyaW5nPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxNC5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+IGZpZWxkcyBpbiB0aGUgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEpvaW4gVGFibGUgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzItdDI1Ij5OYW1lIG9mIHRoZSBqb2luIHRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjUgcjFjMy10MjUiPkJ5IGRlZmF1bHQsIHRoZSBuYW1lIGlzIGFzc3VtZWQgdG8gYmUgdGhlIHByaW1hcnkgdGFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXRpZXMgY29uY2F0ZW5hdGVkIHdpdGggYW4gdW5kZXJzY29yZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMyLXQyNSI+U3BlY2lmeSB0d28gb3IgbW9yZSBqb2luIGNvbHVtbnMgKHRoYXQgaXMsIGEgcHJpbWFyeSBrZXkpLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij5JbnZlcnNlIEpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzItdDI1Ij5UaGUgam9pbiBjb2x1bW4gb24gdGhlIG93bmVkIChvciBpbnZlcnNlKSBzaWRlIG9mIHRoZSBhc3NvY2lhdGlvbjogdGhlIG93bmVkIGVudGl0eSdzIHByaW1hcnkga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AT25lVG9NYW55KHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+KQotQENvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OJmd0Ozwvc3Bhbj4iKQotCi0KLUBPbmVUb01hbnkodGFyZ2V0RW50aXR5PTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQVJHRVRfRU5USVRZJmd0Ozwvc3Bhbj4uY2xhc3MsIGNhc2NhZGU9Q2FzY2FkZVR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NBU0NBREVfVFlQRSZndDs8L3NwYW4+LCAKLSAgICBmZXRjaCA9IEZldGNoVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LCBtYXBwZWRCeSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7TUFQUEVEX0JZJmd0Ozwvc3Bhbj4iKUBPcmRlckJ5KCI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7T1JERVJfQlkmZ3Q7PC9zcGFuPiIpCi1ASm9pblRhYmxlKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX1RBQkxFX05BTUUmZ3Q7PC9zcGFuPiIsIGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9Ci0gICAgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OJmd0Ozwvc3Bhbj4iKSwgCi0gICAgaW52ZXJzZUpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTlZFUlNFX0pPSU5fQ09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIsIAotICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTiZndDs8L3NwYW4+IikpCi0KLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwMjMwMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQ3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+T25lLXRvLW9uZSBtYXBwaW5nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT25lLXRvLW9uZSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkhCQ0oiIG5hbWU9IkJBQkZIQkNKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PbmUtdG8tb25lIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEyNyIgbmFtZT0ic3RocmVmMTI3Ij48L2E+PGEgaWQ9InN0aHJlZjEyOCIgbmFtZT0ic3RocmVmMTI4Ij48L2E+PGEgaWQ9InN0aHJlZjEyOSIgbmFtZT0ic3RocmVmMTI5Ij48L2E+PGEgaWQ9InN0aHJlZjEzMCIgbmFtZT0ic3RocmVmMTMwIj48L2E+VXNlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk9uZS10by1PbmUgTWFwcGluZzwvc3Bhbj4gdG8gZGVmaW5lIGEgcmVsYXRpb25zaGlwIHdpdGggb25lLXRvLW1hbnkgbXVsdGlwbGljaXR5LjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgT25lLXRvLU9uZTwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjYiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+TWFwcGVkIEVudGl0eSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNiByMWMyLXQyNiI+RGVmaW5lcyBtYXBwaW5nIGFzIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tT25lPC9zcGFuPi4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QE9uZVRvT25lPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI2IHIxYzMtdDI2Ij5PbmUtdG8tT25lPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI2IHIxYzItdDI2Ij5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNiByMWMzLXQyNiI+bnVsbAotPHA+WW91IGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGVudGl0eSwgc2luY2UgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+RmV0Y2ggVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI2IHIxYzItdDI2Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjYgcjFjMy10MjYiPkVhZ2VyPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+TWFwcGVkIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjYgcjFjMi10MjYiPlRoZSBkYXRhYmFzZSBmaWVsZCB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNiByMWMzLXQyNiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT4gZmllbGRzIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI3Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjciPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyNyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij5Kb2luIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI3IHIxYzItdDI3Ij48YSBpZD0ic3RocmVmMTMxIiBuYW1lPSJzdGhyZWYxMzEiPjwvYT48YSBpZD0ic3RocmVmMTMyIiBuYW1lPSJzdGhyZWYxMzIiPjwvYT5TcGVjaWZ5IGEgbWFwcGVkIGNvbHVtbiBmb3Igam9pbmluZyBhbiBlbnRpdHkgYXNzb2NpYXRpb24uIFRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBKb2luQ29sdW08L2NvZGU+IGF0dHJpYnV0ZS4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNyByMWMzLXQyNyI+QnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AT25lVG9PbmUodGFyZ2V0RW50aXR5PTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQVJHRVRfRU5USVRZJmd0Ozwvc3Bhbj4sIGNhc2NhZGU9Q2FzY2FkZVR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NBU0NBREVfVFlQRSZndDs8L3NwYW4+LCAKLSAgICBmZXRjaCA9IEZldGNoVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LCBtYXBwZWRCeSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7TUFQUEVEX0JZJmd0Ozwvc3Bhbj4iKQotQEpvaW5Db2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPQotICAgICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU4mZ3Q7PC9zcGFuPiIsIGluc2VydGFibGUgPSA8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5TRVJUQUJMRSZndDs8L3NwYW4+LCAKLSAgICB1cGRhdGFibGUgPSA8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VVBEQVRBQkxFJmd0Ozwvc3Bhbj4pCi0KLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliYmIzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDggLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5UcmFuc2llbnQgbWFwcGluZzwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlRyYW5zaWVudCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEZIRUkiIG5hbWU9IkJBQkhGSEVJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5UcmFuc2llbnQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTMzIiBuYW1lPSJzdGhyZWYxMzMiPjwvYT48YSBpZD0ic3RocmVmMTM0IiBuYW1lPSJzdGhyZWYxMzQiPjwvYT48YSBpZD0ic3RocmVmMTM1IiBuYW1lPSJzdGhyZWYxMzUiPjwvYT48YSBpZD0ic3RocmVmMTM2IiBuYW1lPSJzdGhyZWYxMzYiPjwvYT5Vc2UgdGhlIFRyYW5zaWVudCBNYXBwaW5nIHRvIHNwZWNpZnkgYSBmaWVsZCBvZiB0aGUgZW50aXR5IGNsYXNzIHRoYXQgPHNwYW4gY2xhc3M9Iml0YWxpYyI+aXMgbm90PC9zcGFuPiBwZXJzaXN0ZW50LjwvcD4KLTxwPlRvIGNyZWF0ZSBhIHRyYW5zaWVudCBtYXBwaW5nOjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzIFRyYW5zaWVudDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9uIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AVHJhbnNpZW50Ci08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZGUyOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0OCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlZlcnNpb24gbWFwcGluZzwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlZlcnNpb24gbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkhJQklJIiBuYW1lPSJCQUJISUJJSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+VmVyc2lvbiBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMzciIG5hbWU9InN0aHJlZjEzNyI+PC9hPjxhIGlkPSJzdGhyZWYxMzgiIG5hbWU9InN0aHJlZjEzOCI+PC9hPjxhIGlkPSJzdGhyZWYxMzkiIG5hbWU9InN0aHJlZjEzOSI+PC9hPjxhIGlkPSJzdGhyZWYxNDAiIG5hbWU9InN0aHJlZjE0MCI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5WZXJzaW9uIE1hcHBpbmc8L3NwYW4+IHRvIHNwZWNpZnkgdGhlIGZpZWxkIHVzZWQgZm9yIG9wdGltaXN0aWMgbG9ja2luZy4gSWYgdGhlIGVudGl0eSBpcyBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgdGFibGVzLCB5b3Ugc2hvdWxkIHVzZSBhIHZlcnNpb24gbWFwcGluZyBvbmx5IHdpdGggdGhlIHByaW1hcnkgdGFibGUuIFlvdSBzaG91bGQgaGF2ZSBvbmx5IGEgc2luZ2xlIHZlcnNpb24gbWFwcGluZyBwZXIgcGVyc2lzdGVudCBlbnRpdHkuIFZlcnNpb24gbWFwcGluZ3MgbWF5IGJlIHVzZWQgb25seSB3aXRoIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlIHR5cGVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxjb2RlPmludDwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+SW50ZWdlcjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+c2hvcnQsIFNob3J0PC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5sb25nLCBMb25nPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5UaW1lc3RhbXA8L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5UbyBjcmVhdGUgYSB2ZXJzaW9uIG1hcHBpbmc6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBWZXJzaW9uPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI4Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjgiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyOCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij5NYXBwZWQgRW50aXR5IEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI4IHIxYzItdDI4Ij5EZWZpbmVzIHRoZSBtYXBwaW5nIGFzIFZlcnNpb24uIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBWZXJzaW9uPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI4IHIxYzMtdDI4Ij5WZXJzaW9uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI4IiBoZWFkZXJzPSJyMWMxLXQyOCI+Q29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjggcjFjMi10MjgiPlRoZSBkYXRhYmFzZSBjb2x1bW4gbWFwcGVkIHRvIHRoZSBlbnRpdHkgYXR0cmlidXRlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0NCSEIiPiJDb2x1bW4iPC9hPiBmb3IgZGV0YWlscy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyOCByMWMzLXQyOCI+QnkgZGVmYXVsdCwgdGhlIENvbHVtbiBpcyBhc3N1bWVkIHRvIGJlIG5hbWVkIGlkZW50aWNhbGx5IHRvIHRoZSBhdHRyaWJ1dGUgYW5kIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+SU5TRVJUPC9jb2RlPiBhbmQgPGNvZGU+VVBEQVRFPC9jb2RlPiBzdGF0ZW1lbnRzLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPlRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjggcjFjMi10MjgiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlLiBUaGlzIG11c3QgYmUgdGhlIHByaW1hcnkgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUncyBlbnRpdHkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPlRlbXBvcmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjggcjFjMi10MjgiPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBkYXRhLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDRUFKR0QiPiJUZW1wb3JhbCI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RGF0ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWVzdGFtcDwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQFZlcnNpb24KLUBDb2x1bW4odGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fVEFCTEUmZ3Q7PC9zcGFuPiIsIG5hbWU9IiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5DT0xVTU5fTkFNRTwvc3Bhbj4mZ3Q7IikKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWI3YTdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0OCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQkFHRkkiIG5hbWU9IkJBQkJBR0ZJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE0MSIgbmFtZT0ic3RocmVmMTQxIj48L2E+PGEgaWQ9InN0aHJlZjE0MiIgbmFtZT0ic3RocmVmMTQyIj48L2E+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGdlbmVyYXRlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBmcm9tIGRhdGFiYXNlIHRhYmxlcy4gWW91IG11c3QgY3JlYXRlIGEgSlBBIHByb2plY3QgYW5kIGVzdGFibGlzaCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gPHNwYW4gY2xhc3M9Iml0YWxpYyI+YmVmb3JlPC9zcGFuPiBnZW5lcmF0aW5nIHBlcnNpc3RlbnQgZW50aXRpZXMuIFNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgSlBBIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QYWNrYWdlIEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgR2VuZXJhdGUgRW50aXRpZXM8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE0MyIgbmFtZT0ic3RocmVmMTQzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+R2VuZXJhdGluZyBFbnRpdGllczwvcD4KLTxpbWcgc3JjPSJpbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nIiBhbHQ9IlVzaW5nIHRoZSBKUEEgVG9vbHMgJmd0OyBHZW5lcmF0ZSBFbnRpdGllcyBtZW51IG9wdGlvbi4iIHRpdGxlPSJVc2luZyB0aGUgSlBBIFRvb2xzICZndDsgR2VuZXJhdGUgRW50aXRpZXMgbWVudSBvcHRpb24uIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+SWYgeW91IGFyZSBub3QgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgZGF0YWJhc2UsIHRoZSBEYXRhYmFzZSBDb25uZWN0aW9uIHBhZ2UgYXBwZWFycy4gU2VsZWN0IHlvdXIgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgc2NoZW1hLCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlJlY29ubmVjdDwvc3Bhbj4uPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgY29ubmVjdGlvbjwvc3Bhbj4uPC9wPgotPHA+QWZ0ZXIgY29ubmVjdGluZyB0byB0aGUgZGF0YWJhc2UsIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaWQ9InN0aHJlZjE0NCIgbmFtZT0ic3RocmVmMTQ0Ij48L2E+PGEgaWQ9InN0aHJlZjE0NSIgbmFtZT0ic3RocmVmMTQ1Ij48L2E+T24gdGhlIDxhIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtI0NBQ0RBRkpEIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBkaWFsb2c8L2E+IGRpYWxvZywgc2VsZWN0IHRoZSB0YWJsZXMgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBjcmVhdGVzIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSBmb3IgZWFjaCBkYXRhYmFzZSB0YWJsZS4gRWFjaCBlbnRpdHkgY29udGFpbnMgZmllbGRzIGJhc2VkIG9uIHRoZSB0YWJsZSdzIGNvbHVtbnMuIEVjbGlwc2Ugd2lsbCBhbHNvIGdlbmVyYXRlIGVudGl0eSByZWxhdGlvbnNoaXBzIChzdWNoIGFzIG9uZS10by1vbmUpIGJhc2VkIG9uIHRoZSB0YWJsZSBjb25zdHJhaW50cy4gPGEgaHJlZj0iI0NJSEpJSkpDIj5GaWd1cmU6IEdlbmVyYXRpbmcgRW50aXRpZXMgZnJvbSBUYWJsZXM8L2E+IGlsbHVzdHJhdGVzIGhvdyBFY2xpcHNlIGdlbmVyYXRlcyBlbnRpdGllcyBmcm9tIHRhYmxlcy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJDSUhKSUpKQyIgbmFtZT0iQ0lISklKSkMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5HZW5lcmF0aW5nIEVudGl0aWVzIGZyb20gVGFibGVzPC9wPgotPGltZyBzcmM9ImltZy90YWJsZV9lbnRpdHkucG5nIiBhbHQ9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBFTVBMT1lFRSBhbmQgQUREUkVTUyBlbnRpdGllcyBnZW5lcmF0ZWQgZnJvbSBkYXRhYmFzZSB0YWJsZXMuIiB0aXRsZT0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEVNUExPWUVFIGFuZCBBRERSRVNTIGVudGl0aWVzIGdlbmVyYXRlZCBmcm9tIGRhdGFiYXNlIHRhYmxlcy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxwPjxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+PC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEpQQSBPcHRpb25zPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NmYxZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQ4IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+R2VuZXJhdGluZyBEREwgZnJvbSBFbnRpdGllczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgRERMIGZyb20gRW50aXRpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhKSUdCRSIgbmFtZT0iQ0lISklHQkUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYXRpbmcgRERMIGZyb20gRW50aXRpZXM8L2gxPgotPHA+V2hlbiB1c2luZyBhIHZlbmRvci1zcGVjaWZpYyBwbGF0Zm9ybSwgeW91IGNhbiBjcmVhdGUgYSBEREwgc2NyaXB0IGZyb20geW91ciBwZXJzaXN0ZW50IGVudGl0aWVzLjwvcD4KLTxwPlRvIGdlbmVyYXRlIGEgRERMIHNjcmlwdDo8L3A+Ci08cD5SaWdodC1jbGljayB0aGUgSlBBIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QYWNrYWdlIEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgR2VuZXJhdGUgRERMPC9zcGFuPi48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPHA+PGEgaHJlZj0idGFza3MwMDEuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEpQQSBPcHRpb25zPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Mjg1NWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjQ4IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkFJQkEiIG5hbWU9IkJBQkZBSUJBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTQ2IiBuYW1lPSJzdGhyZWYxNDYiPjwvYT48YSBpZD0ic3RocmVmMTQ3IiBuYW1lPSJzdGhyZWYxNDciPjwvYT48YSBpZD0ic3RocmVmMTQ4IiBuYW1lPSJzdGhyZWYxNDgiPjwvYT48YSBpZD0ic3RocmVmMTQ5IiBuYW1lPSJzdGhyZWYxNDkiPjwvYT5FcnJvcnMgYW5kIHdhcm5pbmdzIG9uIHBlcnNpc3RlbnQgZW50aXRpZXMgYW5kIG1hcHBpbmdzIGFyZSBpbmRpY2F0ZWQgd2l0aCBhIHJlZCBlcnJvciBvciB5ZWxsb3cgd2FybmluZyBuZXh0IHRvIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBlcnJvciwgYXMgd2VsbCBhcyB0aGUgcGFyZW50IGNvbnRhaW5lcnMgdXAgdG8gdGhlIHByb2plY3QuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTUwIiBuYW1lPSJzdGhyZWYxNTAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TYW1wbGUgRXJyb3JzIGFuZCBXYXJuaW5nczwvcD4KLTxpbWcgc3JjPSJpbWcvZXJyb3Jfc2FtcGxlLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyBzYW1wbGUgZXJyb3IgYW5kIHdhcm5pbmcgaWNvbnMgaW4gdGhlIEV4cGxvcmVyIHZpZXcuIiB0aXRsZT0iVGhpcyBmaWd1cmUgc2hvd3Mgc2FtcGxlIGVycm9yIGFuZCB3YXJuaW5nIGljb25zIGluIHRoZSBFeHBsb3JlciB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyMy5odG0jQ0lIRkVERUkiPkVycm9yIG1lc3NhZ2VzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyNC5odG0jQ0lIR0VBSUoiPldhcm5pbmcgbWVzc2FnZXM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvY29uY2VwdHMvY3ByYnZpZXcuaHRtIj5Qcm9ibGVtcyB2aWV3PC9hPjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjI1NDFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0OSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkVycm9yIG1lc3NhZ2VzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRXJyb3IgbWVzc2FnZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhGRURFSSIgbmFtZT0iQ0lIRkVERUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVycm9yIG1lc3NhZ2VzPGEgaWQ9InN0aHJlZjE1MSIgbmFtZT0ic3RocmVmMTUxIj48L2E+PC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBlcnJvciBtZXNzYWdlcyAoaW5jbHVkaW5nIGhvdyB0byByZXNvbHZlIHRoZSBpc3N1ZSkgeW91IG1heSBlbmNvdW50ZXIgd2hpbGUgd29ya2luZyB3aXRoIERhbGkuPC9wPgotPGEgaWQ9InN0aHJlZjE1MiIgbmFtZT0ic3RocmVmMTUyIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkF0dHJpYnV0ZSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0FUVFJJQlVURV9fTkFNRSZndDs8L3NwYW4+IiBoYXMgaW52YWxpZCBtYXBwaW5nIHR5cGUgaW4gdGhpcyBjb250ZXh0PC9wPgotPHA+VGhlIG1hcHBlZCBhdHRyaWJ1dGUgaXMgaW52YWxpZC4gRWl0aGVyIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlIG9yIGNoYW5nZSB0aGUgZW50aXR5IHR5cGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPiJNYXBwaW5nIGFuIGVudGl0eSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNTMiIG5hbWU9InN0aHJlZjE1MyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5BdHRyaWJ1dGUgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtBVFRSSUJVVEVfTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+RGFsaSBjYW5ub3QgbWFwIHRoZSBhdHRyaWJ1dGUgdG8gYSBkYXRhYmFzZSB0YWJsZSBhbmQgY29sdW1uLiBWZXJpZnkgdGhhdCB5b3UgZGF0YWJhc2UgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBpcyBjb3JyZWN0LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNTQiIG5hbWU9InN0aHJlZjE1NCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5DbGFzcyAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NMQVNTX05BTUUmZ3Q7PC9zcGFuPiIgaXMgbm90IGFubm90YXRlZCBhcyBhIHBlcnNpc3RlbnQgY2xhc3MuPC9wPgotPHA+VGhlIGNsYXNzIGhhcyBub3QgYmVlbiBpZGVudGlmaWVkIGFzIGEgcGVyc2lzdGVudCBjbGFzcy4gQ29uZmlndXJlIHRoZSBjbGFzcyBhcyBhbiBFbnRpdHksIE1hcHBlZCBTdXBlcmNsYXNzLCBvciBFbWJlZGRhYmxlIHBlcnNpc3RlbnQgZW50aXR5LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPiJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxNTUiIG5hbWU9InN0aHJlZjE1NSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5Db2x1bW4gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+WW91IG1hcHBlZCBhbiBlbnRpdHkncyBmaWVsZCB0byBhbiBpbmNvcnJlY3Qgb3IgaW52YWxpZCBjb2x1bW4gaW4gdGhlIGRhdGFiYXNlIHRhYmxlLiBCeSBkZWZhdWx0LCBEYWxpIHdpbGwgYXR0ZW1wdCB0byBtYXAgZWFjaCBmaWVsZCBpbiB0aGUgZW50aXR5IHdpdGggYW4gaWRlbnRpY2FsbHkgbmFtZWQgcm93IGluIHRoZSBkYXRhYmFzZSB0YWJsZS4gSWYgdGhlIGZpZWxkJ3MgbmFtZSBkaWZmZXJzIGZyb20gdGhlIHJvdydzIG5hbWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBtYXBwaW5nLjwvcD4KLTxwPk1hcCB0aGUgZmllbGQgdG8gYSB2YWxpZCByb3cgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIGFzIHNob3duIGluIDxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPiJNYXBwaW5nIGFuIGVudGl0eSI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxNTYiIG5hbWU9InN0aHJlZjE1NiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5EdXBsaWNhdGUgY2xhc3MgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDTEFTU19OQU1FJmd0Ozwvc3Bhbj4iLjwvcD4KLTxwPllvdSBjcmVhdGVkIHRvIHBlcnNpc3RlbmNlIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lLiBFYWNoIEphdmEgY2xhc3MgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuIFNlZSA8YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPiJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNTciIG5hbWU9InN0aHJlZjE1NyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5FbnRpdHkgZG9lcyBub3QgaGF2ZSBhbiBJZCBvciBFbWJlZGRlZCBJZC48L3A+Ci08cD5Zb3UgY3JlYXRlZCBhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGhvdXQgaWRlbnRpZnlpbmcgaXRzIHByaW1hcnkga2V5LiBBIHBlcnNpc3RlbnQgZW50aXR5IG11c3QgaGF2ZSBhIHByaW1hcnkga2V5IGZpZWxkIGRlc2lnbmF0ZWQgd2l0aCBhbiA8Y29kZT5ASWQ8L2NvZGU+IG9yIDxjb2RlPkBFbWJlZGRlZElkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTxwPkFkZCBhbiBJRCBtYXBwaW5nIHRvIHRoZSBlbnRpdHkgYXMgc2hvd24gaW4gPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj4iSUQgbWFwcGluZyI8L2E+IG9yIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNDSUhESUFFRSI+IkVtYmVkZGVkIElEIG1hcHBpbmciPC9hPi48L3A+Ci08YSBpZD0ic3RocmVmMTU4IiBuYW1lPSJzdGhyZWYxNTgiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TXVsdGlwbGUgcGVyc2lzdGVuY2UueG1sIGZpbGVzIGluIHByb2plY3QuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBKUEEgcHJvamVjdCB3aXRoIG1vcmUgdGhhbiBvbmUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBFYWNoIEpQQSBwcm9qZWN0IG11c3QgY29udGFpbiBhIDxzcGFuIGNsYXNzPSJpdGFsaWMiPnNpbmdsZTwvc3Bhbj4gPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPiJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTU5IiBuYW1lPSJzdGhyZWYxNTkiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Tm8gcGVyc2lzdGVuY2UgdW5pdCBkZWZpbmVkLjwvcD4KLTxwPlRoZXJlIGlzIG5vIHBlcnNpc3RlbmNlIHVuaXQgZGVmaW5lZCBpbiB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBVc2UgdGhlICZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9VTklUX05BTUUmZ3Q7PC9zcGFuPiIgdGFnIHRvIGRlZmluZSB0aGUgcGVyc2lzdGVudCB1bml0LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj4iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNjAiIG5hbWU9InN0aHJlZjE2MCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5ObyBwZXJzaXN0ZW5jZS54bWwgZmlsZSBpbiBwcm9qZWN0LjwvcD4KLTxwPllvdSBjcmVhdGVkIGEgSlBBIHByb2plY3Qgd2l0aG91dCBhIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS4gRWFjaCBKUEEgcHJvamVjdCBtdXN0IGNvbnRhaW4gYSA8c3BhbiBjbGFzcz0iaXRhbGljIj5zaW5nbGU8L3NwYW4+IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj4iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE2MSIgbmFtZT0ic3RocmVmMTYxIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlJlZmVyZW5jZWQgY29sdW1uICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIgaW4gam9pbiBjb2x1bW4gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+VGhlIGNvbHVtbiB0aGF0IHlvdSBzZWxlY3RlZCB0byBqb2luIGEgcmVsYXRpb25zaGlwIG1hcHBpbmcgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGRhdGFiYXNlIHRhYmxlLiBFaXRoZXIgc2VsZWN0IGEgZGlmZmVyZW50IGNvbHVtbiBvbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDE0Lmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT4gb3IgY3JlYXRlIHRoZSBuZWNlc3NhcnkgY29sdW1uIG9uIHRoZSBkYXRhYmFzZSB0YWJsZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNjIiIG5hbWU9InN0aHJlZjE2MiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5TY2hlbWEgIiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5TQ0hFTUFfTkFNRTwvc3Bhbj4mZ3Q7IiBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIHRhYmxlL2pvaW4gdGFibGUgIiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5UQUJMRV9OQU1FPC9zcGFuPiZndDsiLjwvcD4KLTxwPkRlZmluZSB0aGUgZGVmYXVsdCBkYXRhYmFzZSBzY2hlbWEgaW5mb3JtYXRpb24gaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPiJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE2MyIgbmFtZT0ic3RocmVmMTYzIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlRhYmxlICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+WW91IGFzc29jaWF0ZWQgYSBwZXJzaXN0ZW50IGVudGl0eSB0byBhbiBpbmNvcnJlY3Qgb3IgaW52YWxpZCBkYXRhYmFzZSB0YWJsZS4gQnkgZGVmYXVsdCwgRGFsaSB3aWxsIGF0dGVtcHQgdG8gYXNzb2NpYXRlIGVhY2ggcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBhbiBpZGVudGljYWxseSBuYW1lZCBkYXRhYmFzZSB0YWJsZS4gSWYgdGhlIGVudGl0eSdzIG5hbWUgZGlmZmVycyBmcm9tIHRoZSB0YWJsZSdzIG5hbWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBhc3NvY2lhdGlvbi48L3A+Ci08cD5Bc3NvY2lhdGUgdGhlIGVudGl0eSB3aXRoIGEgdmFsaWQgZGF0YWJhc2UgdGFibGUgYXMgc2hvd24gaW4gPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj4iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPC9hPi48L3A+Ci08YSBpZD0ic3RocmVmMTY0IiBuYW1lPSJzdGhyZWYxNjQiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+VW5yZXNvdmx2ZWQgZ2VuZXJhdG9yICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7R0VORVJBVE9SX05BTUUmZ3Q7PC9zcGFuPiIgaXMgZGVmaW5lZCBpbiBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTxwPllvdSBjcmVhdGVkIGEgcGVyc2lzdGVuY2UgZW50aXR5IHRoYXQgdXNlcyBzZXF1ZW5jaW5nIG9yIGEgdGFibGUgZ2VuZXJhdG9yLCBidXQgZGlkIG5vdCBkZWZpbmUgdGhlIGdlbmVyYXRvciBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gRWl0aGVyIGRlZmluZSB0aGUgZ2VuZXJhdG9yIGJ5IHVzaW5nIGFuIGFubm90YXRpb24gb3IgaW5jbHVkaW5nIGl0IGluIHRoZSBYTUwgbWFwcGluZyBmaWxlLjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jcHJidmlldy5odG0iPlByb2JsZW1zIHZpZXc8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjZGVjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDkgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5XYXJuaW5nIG1lc3NhZ2VzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iV2FybmluZyBtZXNzYWdlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEdFQUlKIiBuYW1lPSJDSUhHRUFJSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+V2FybmluZyBtZXNzYWdlczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gd2FybmluZyBtZXNzYWdlcyAoaW5jbHVkaW5nIGhvdyB0byByZXNvbHZlIHRoZSBpc3N1ZSkgeW91IG1heSBlbmNvdW50ZXIgd2hpbGUgd29ya2luZyB3aXRoIERhbGkuPC9wPgotPGEgaWQ9InN0aHJlZjE2NSIgbmFtZT0ic3RocmVmMTY1Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkNvbm5lY3Rpb24gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT05ORUNUSU9OX05BTUUmZ3Q7PC9zcGFuPiIgaXMgbm90IGFjdGl2ZS4gTm8gdmFsaWRhdGlvbiB3aWxsIGJlIGRvbmUgYWdhaW5zdCB0aGUgZGF0YSBzb3VyY2UuPC9wPgotPHA+VGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24geW91IHNwZWNpZmllZCB0byB1c2Ugd2l0aCB0aGUgSlBBIHByb2plY3QgaXMgbm90IGFjdGl2ZS4gVGhlIEpQQSBwcm9qZWN0IHJlcXVpcmVzIGFuIGFjdGl2ZSBjb25uZWN0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNjYiIG5hbWU9InN0aHJlZjE2NiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5ObyBjb25uZWN0aW9uIHNwZWNpZmllZCBmb3IgdGhlIHByb2plY3QuIE5vIGRhdGEtc3BlY2lmaWMgdmFsaWRhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC48L3A+Ci08cD5Zb3UgY3JlYXRlZCBhIEpQQSBwcm9qZWN0IHdpdGhvdXQgc3BlY2lmeWluZyBhIGRhdGFiYXNlIGNvbm5lY3Rpb24uIFRoZSBKUEEgcHJvamVjdCByZXF1aXJlcyBhbiBhY3RpdmUgY29ubmVjdGlvbi48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj4iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPC9hPiBvciA8YSBocmVmPSJ0YXNrczAyNS5odG0jQkFCREJDQkkiPiJNb2RpZnlpbmcgcGVyc2lzdGVudCBwcm9qZWN0IHByb3BlcnRpZXMiPC9hPiBmb3IgaW5mb3JtYXRpb24gb24gc3BlY2lmeWluZyBhIGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2NwcmJ2aWV3Lmh0bSI+UHJvYmxlbXMgdmlldzwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVmODAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0OSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkRCQ0JJIiBuYW1lPSJCQUJEQkNCSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC9oMT4KLTxwPkVhY2ggcGVyc2lzdGVudCBwcm9qZWN0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgZGF0YWJhc2UgY29ubmVjdGlvbi4gVG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+RGF0YWJhc2UgQ29ubmVjdGlvbjwvc3Bhbj4gdXNlIHRoZSBOZXcgQ29ubmVjdGlvbiB3aXphcmQuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIG1vZGlmeSB0aGUgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtIGFuZCBkYXRhYmFzZSBjb25uZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB5b3VyIEpQQSBwcm9qZWN0LjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgcHJvamVjdCBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkV4cGxvcmVyPC9zcGFuPiB2aWV3IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5Qcm9wZXJ0aWVzPC9zcGFuPi4gVGhlIFByb3BlcnRpZXMgcGFnZSBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2NyIgbmFtZT0ic3RocmVmMTY3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIFByb3BlcnRpZXMgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZyIgYWx0PSJUaGUgUGVyc2lzdGVuY2UgcGFnZS4iIHRpdGxlPSJUaGUgUGVyc2lzdGVuY2UgcGFnZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBvbiB0aGUgUHJvcGVydGllcyAmbmRhc2g7IEpQQSBwYWdlIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUHJvcGVydGllcyAtIEphdmEgUGVyc2lzdGVuY2UgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQcm9wZXJ0aWVzIC0gSmF2YSBQZXJzaXN0ZW5jZSBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjkiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyOSIgaGVhZGVycz0icjFjMS10MjkiPlBsYXRmb3JtPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjkgcjFjMi10MjkiPlNlbGVjdCB0aGUgdmVuZG9yLXNwZWNpZmljIHBsYXRmb3JtIGZvciB0aGUgSlBBIGltcGxlbWVudGF0aW9uLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyOSIgaGVhZGVycz0icjFjMS10MjkiPkRhdGFiYXNlIENvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyOSByMWMyLXQyOSI+RGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2UgdG8gc3RvcmUgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMuIFRvIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIENvbm5lY3Rpb248L3NwYW4+LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyOSIgaGVhZGVycz0icjFjMS10MjkiPiZuYnNwOyZuYnNwO092ZXJyaWRlIGRlZmF1bHQgc2NoZW1hIGZyb20gY29ubmVjdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI5IHIxYzItdDI5Ij5TZWxlY3QgYSBzY2hlbWEgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUgZGVyaXZlZCBmcm9tIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uLiBVc2UgdGhpcyBvcHRpb24gaWYgdGhlIGRlZmF1bHQgc2NoZW1hIGNhbm5vdCBiZSB1c2VkLiBGb3IgZXhhbXBsZSwgdXNlIHRoaXMgb3B0aW9uIGluIGNhc2VzIHdoZXJlIHRoZSBkZXBsb3ltZW50IGxvZ2luIGRpZmZlcnMgZnJvbSB0aGUgZGVzaWduLXRpbWUgbG9naW4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPlRvIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIGNvbm5lY3Rpb25zPC9zcGFuPi48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEpQQSBPcHRpb25zPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzdjMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1MyAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlRpcHMgYW5kIHRyaWNrczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBUaXBzIGFuZCB0cmlja3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSERIR0hCRiIgbmFtZT0iQ0hESEdIQkYiPjwvYT48L3A+Ci08aDE+VGlwcyBhbmQgdHJpY2tzPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgdGlwcyBhbmQgdHJpY2tzIGdpdmUgc29tZSBoZWxwZnVsIGlkZWFzIGZvciBpbmNyZWFzaW5nIHlvdXIgcHJvZHVjdGl2aXR5LjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9IiNCQUJGSUlIQSI+PHNwYW4gY2xhc3M9ImJvbGQiPkRhdGFiYXNlIENvbm5lY3Rpb25zPC9zcGFuPjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iI0JBQkNIQUhGIj48c3BhbiBjbGFzcz0iYm9sZCI+U2NoZW1hLWJhc2VkIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj48L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSB0aXBzIGFuZCB0cmlja3MgaW4gdGhpcyBjYXRlZ29yeS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHRpcHMgYW5kIHRyaWNrcyBpbiB0aGlzIGNhdGVnb3J5LiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyIj5UaXA8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj48YSBpZD0iQkFCRklJSEEiIG5hbWU9IkJBQkZJSUhBIj48L2E+PHNwYW4gY2xhc3M9ImJvbGQiPkRhdGFiYXNlIENvbm5lY3Rpb25zPC9zcGFuPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIgcjFjMi10MiI+V2hlbiBzdGFydGluZyBhIG5ldyB3b3JrYmVuY2ggc2Vzc2lvbiwgYmUgc3VyZSB0byA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZG9jLnVzZXIvcHJvamVjdHMvd29ya3NwYWNlL2RtcC9lbi9zb3VyY2UvY19kYXRhYmFzZV9kZXZlbG9wbWVudF9zZXR1cC5odG1sIj5yZWNvbm5lY3QgdG8geW91ciBkYXRhYmFzZTwvYT4gKGlmIHlvdSBhcmUgd29ya2luZyBvbmxpbmUpLiBUaGlzIGFsbG93cyBEYWxpIHRvIHByb3ZpZGUgZGF0YWJhc2UtcmVsYXRlZCBtYXBwaW5nIGFzc2lzdGFuY2UgYW5kIHZhbGlkYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPjxhIGlkPSJCQUJDSEFIRiIgbmFtZT0iQkFCQ0hBSEYiPjwvYT48c3BhbiBjbGFzcz0iYm9sZCI+U2NoZW1hLWJhc2VkIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyIHIxYzItdDIiPklmIHlvdSBhcmUgYmVoaW5kIGEgZmlyZXdhbGwsIHlvdSBtYXkgbmVlZCB0byBjb25maWd1cmUgeW91ciBFY2xpcHNlIHdvcmtzcGFjZSBwcm94eSBpbiB0aGUgPGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi03Mi5odG0iPlByZWZlcmVuY2VzIGRpYWxvZzwvYT4gKDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+UHJlZmVyZW5jZXMgJmd0OyBJbnRlcm5ldCAmZ3Q7IFByb3h5IFNldHRpbmdzPC9zcGFuPikgdG8gcHJvcGVybHkgdmFsaWRhdGUgYSBzY2hlbWEtYmFzZWQgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdG9jLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzFhOWQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz4KLTwhLS0gVXNlciBHdWlkZSAtLT4KLSAgPHRvYyBsYWJlbD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFVzZXIgR3VpZGUiPjx0b3BpYyBsYWJlbD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFVzZXIgR3VpZGUiPgotICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQuaHRtIiBsYWJlbD0iR2V0dGluZyBzdGFydGVkIj4KLSAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtI0JBQkVGSENEIiBsYWJlbD0iUmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb24iIC8+Ci0gICAgICA8dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAyLmh0bSNCQUJJR0NKQSIgbGFiZWw9IkRhbGkgcXVpY2sgc3RhcnQiPgotICAgICAgICA8dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAzLmh0bSNCQUJERkhEQSIgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiAvPgotICAgICAgICA8dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNCQUJGR0RERyIgbGFiZWw9IkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzIiAvPgotICAgICAgPC90b3BpYz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJjb25jZXB0cy5odG0iIGxhYmVsPSIgQ29uY2VwdHMiPgotICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIiBsYWJlbD0iVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIiAvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiAvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyIgbGFiZWw9IlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSSI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiIGxhYmVsPSJUaGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiIGxhYmVsPSJUaGUgb3JtLnhtbCBmaWxlIiAvPgotICAgICAgPC90b3BpYz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJ0YXNrcy5odG0iIGxhYmVsPSIgVGFza3MiPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiIgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDAxLmh0bSNCQUJGQkpCRyIgbGFiZWw9IkNyZWF0aW5nIGEgSlBBIEVudGl0eSIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDIuaHRtI0NJSEVKQUlFIiBsYWJlbD0iVXNpbmcgdGhlIFhNTCBFZGl0b3IgdG8gZWRpdCB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwMy5odG0jQ0lIRkVCQUkiIGxhYmVsPSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA0Lmh0bSNzdGhyZWY0OCIgbGFiZWw9IkNyZWF0aW5nIGFuIG9ybS54bWwgZmlsZSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNDSUhCQ0RDRSIgbGFiZWw9Ildvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGUiIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSIgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSIgbGFiZWw9IkVudGl0eSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJGRUlDRSIgbGFiZWw9IkVtYmVkZGFibGUiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiIGxhYmVsPSJNYXBwZWQgc3VwZXJjbGFzcyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSIgbGFiZWw9IlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiIGxhYmVsPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jQkFCSUdCR0ciIGxhYmVsPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiIGxhYmVsPSJCYXNpYyBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIiBsYWJlbD0iRW1iZWRkZWQgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNDSUhESUFFRSIgbGFiZWw9IkVtYmVkZGVkIElEIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciIGxhYmVsPSJJRCBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIiBsYWJlbD0iTWFueS10by1tYW55IG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiIGxhYmVsPSJNYW55LXRvLW9uZSBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIiBsYWJlbD0iT25lLXRvLW1hbnkgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiIgbGFiZWw9Ik9uZS10by1vbmUgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJIRkhFSSIgbGFiZWw9IlRyYW5zaWVudCBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI0JBQkhJQklJIiBsYWJlbD0iVmVyc2lvbiBtYXBwaW5nIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyMC5odG0jQkFCQkFHRkkiIGxhYmVsPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDIxLmh0bSNDSUhKSUdCRSIgbGFiZWw9IkdlbmVyYXRpbmcgRERMIGZyb20gRW50aXRpZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza3MwMjIuaHRtI0JBQkZBSUJBIiBsYWJlbD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDIzLmh0bSNDSUhGRURFSSIgbGFiZWw9IkVycm9yIG1lc3NhZ2VzIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMjQuaHRtI0NJSEdFQUlKIiBsYWJlbD0iV2FybmluZyBtZXNzYWdlcyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza3MwMjUuaHRtI0JBQkRCQ0JJIiBsYWJlbD0iTW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzIiAvPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGxhYmVsPSIgUmVmZXJlbmNlIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iV2l6YXJkcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciIGxhYmVsPSJDcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZCI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIiBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHBhZ2UiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIiBsYWJlbD0iSlBBIEZhY2V0IHBhZ2UiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDIuaHRtI0NJQUdHR0RGIiBsYWJlbD0iQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDAzLmh0bSNDSUFGRUlHRiIgbGFiZWw9IkVudGl0eSBDbGFzcyBwYWdlIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDQuaHRtI0NJQURFQ0lBIiBsYWJlbD0iRW50aXR5IFByb3BlcnRpZXMgcGFnZSIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNS5odG0jQ0lBSUpDQ0UiIGxhYmVsPSJNYXBwaW5nIEZpbGUgV2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDA2Lmh0bSNzdGhyZWYxNzMiIGxhYmVsPSJNYXBwaW5nIEZpbGUiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDcuaHRtI3N0aHJlZjE3NiIgbGFiZWw9IkdlbmVyYXRlIERETCBmcm9tIEVudGl0aWVzIFdpemFyZCIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9IlByb3BlcnR5IHBhZ2VzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIiBsYWJlbD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jQ0FDQ0FHR0MiIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTAuaHRtI0NBQ0lKQkdIIiBsYWJlbD0iQXR0cmlidXRlIG92ZXJyaWRlcyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCSElEQSIgbGFiZWw9IlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNDQUNGSEdIRSIgbGFiZWw9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTMuaHRtI3N0aHJlZjE4OSIgbGFiZWw9IlF1ZXJpZXMiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIiBsYWJlbD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTQuaHRtI0NBQ0JBRUJDIiBsYWJlbD0iSm9pbiBUYWJsZSBJbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE1Lmh0bSNDQUNGQ0VKQyIgbGFiZWw9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiIgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIiBsYWJlbD0iSlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE2Lmh0bSNDQUNDQUNHSCIgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxNy5odG0jQ0FDRUFHQkciIGxhYmVsPSJQZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIiBsYWJlbD0iSlBBIFN0cnVjdHVyZSB2aWV3IiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE4Lmh0bSNDSUFDQ0hJRCIgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBFZGl0b3IiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTkuaHRtI0NJQUNJRkdKIiBsYWJlbD0iR2VuZXJhbCIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNDSUFGRkpJRSIgbGFiZWw9IkNvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBSkFGRUciIGxhYmVsPSJDdXN0b21pemF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjIuaHRtI0NJQUJFRENIIiBsYWJlbD0iQ2FjaGluZyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIzLmh0bSNDSUFCR0hISSIgbGFiZWw9IkxvZ2dpbmciIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBRkpDSEUiIGxhYmVsPSJPcHRpb25zIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjUuaHRtI0NJQUNDRkNCIiBsYWJlbD0iU2NoZW1hIEdlbmVyYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNi5odG0jQ0lBSEpERkYiIGxhYmVsPSJQcm9wZXJ0aWVzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI0NJQUhDSkFIIiBsYWJlbD0iU291cmNlIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUHJlZmVyZW5jZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiIGxhYmVsPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEpQQSBPcHRpb25zIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRGlhbG9ncyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSNDQUNEQUZKRCIgbGFiZWw9IkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIGRpYWxvZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMC5odG0jQ0FDQ0dFSEMiIGxhYmVsPSJFZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2ciIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiIGxhYmVsPSJKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiIC8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ikljb25zIGFuZCBidXR0b25zIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMi5odG0jQ0FDR0VBQ0ciIGxhYmVsPSJJY29ucyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMy5odG0jQ0FDREpDRUkiIGxhYmVsPSJCdXR0b25zIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzQuaHRtI0NBQ0JCRElCIiBsYWJlbD0iRGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiIgLz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJ0aXBzX2FuZF90cmlja3MuaHRtIiBsYWJlbD0iVGlwcyBhbmQgdHJpY2tzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ3aGF0c19uZXcwMDEuaHRtI0JHR0NKSEFHIiBsYWJlbD0iQ3JlYXRlIEpQQSBFbnRpdHkgV2l6YXJkIiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwMi5odG0jQkdHSUhKQ0oiIGxhYmVsPSJOYW1lZCBRdWVyeSBTdXBwb3J0IiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwMy5odG0jQkdHR0FDQ0QiIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgRWRpdG9yIiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwNC5odG0jQkdHSUlDRUYiIGxhYmVsPSJPdmVycmlkZSB0aGUgRGVmYXVsdCBTY2hlbWEgZm9yIENvbm5lY3Rpb24iIC8+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDA1Lmh0bSNzdGhyZWYyNTMiIGxhYmVsPSJOZXcgTWFwcGluZyBGaWxlIFdpemFyZCIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ3aGF0c19uZXcwMDYuaHRtI3N0aHJlZjI1NCIgbGFiZWw9IkNvbnZlcnQgdG8gSmF2YSBQcm9qZWN0IiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwNy5odG0jc3RocmVmMjU1IiBsYWJlbD0iQ29sdW1uIERlZmluaXRpb24gU3VwcG9ydCIgLz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJsZWdhbC5odG0iIGxhYmVsPSIgTGVnYWwiPgotICAgICAgPHRvcGljIGhyZWY9ImFib3V0Lmh0bSNzdGhyZWYyNTciIGxhYmVsPSJBYm91dCB0aGlzIGNvbnRlbnQiIC8+Ci0gICAgPC90b3BpYz4KLSAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3ZjA3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjUzIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+V2hhdCdzIG5ldzwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBXaGF0J3MgbmV3IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0ic3RocmVmMjQ5IiBuYW1lPSJzdGhyZWYyNDkiPjwvYT4gV2hhdCdzIG5ldzwvcD4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBkZXNjcmlwdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBuZXcgZmVhdHVyZXMgYW5kIHNpZ25pZmljYW50IGNoYW5nZXMgbWFkZSB0byB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgZm9yIFJlbGVhc2UgMi4wOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwMS5odG0jQkdHQ0pIQUciPkNyZWF0ZSBKUEEgRW50aXR5IFdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDAyLmh0bSNCR0dJSEpDSiI+TmFtZWQgUXVlcnkgU3VwcG9ydDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDAzLmh0bSNCR0dHQUNDRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDA0Lmh0bSNCR0dJSUNFRiI+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ3aGF0c19uZXcwMDUuaHRtI0JHR0dER0lFIj5OZXcgTWFwcGluZyBGaWxlIFdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDA2Lmh0bSNCR0dDR0RKRyI+VGhlIENvbnZlcnQgdG8gSmF2YSBQcm9qZWN0IE9wdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDA3Lmh0bSNCR0dGR0JISiI+RGVmaW5pbmcgQ29sdW1ucyBpbiBKUEEgRGV0YWlscyBWaWV3IGZvciBFbnRpdHkgQXR0cmlidXRlczwvYT48L3A+Ci08L2xpPgotPGxpIHN0eWxlPSJsaXN0LXN0eWxlOiBub25lIj48YSBocmVmPSJ3aGF0c19uZXcwMDguaHRtI0NFR0lEQ0NFIj5HZW5lcmF0ZSBEREwgZnJvbSBFbnRpdGllcyB3aXphcmQ8L2E+PC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTQ3MjA2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTMgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5DcmVhdGUgSlBBIEVudGl0eSBXaXphcmQ8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGUgSlBBIEVudGl0eSBXaXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCR0dDSkhBRyIgbmFtZT0iQkdHQ0pIQUciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0ZSBKUEEgRW50aXR5IFdpemFyZDwvaDE+Ci08cD5Vc2UgdGhlIENyZWF0ZSBKUEEgRW50aXR5IHdpemFyZCB0byBxdWlja2x5IGNyZWF0ZSBhbiBlbnRpdHkuIFRoaXMgd2l6YXJkIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIEphdmEgY2xhc3MgYW5ub3RhdGVkIHdpdGggPGNvZGU+QEVudGl0eTwvY29kZT4gYW5kIGVuYWJsZXMgdXNlcnMgdG8gYWRkIHBlcnNpc3RlbmNlIGZpZWxkcyB0byB0aGUgZW50aXR5LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjI1MCIgbmFtZT0ic3RocmVmMjUwIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIENyZWF0ZSBOZXcgSlBBIEVudGl0eSBXaXphcmQ8L3A+Ci08aW1nIHNyYz0iaW1nL2NyZWF0ZV9qcGFfZW50aXR5X25ldy5wbmciIGFsdD0iVGhlIEVudGl0eSBDbGFzcyBwYWdlIG9mIHRoZSBDcmVhdGUgTmV3IEpQQSBFbnRpdHkgd2l6YXJkLiIgdGl0bGU9IlRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBvZiB0aGUgQ3JlYXRlIE5ldyBKUEEgRW50aXR5IHdpemFyZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI0JBQklGQkRCIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMDUuaHRtI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzE5MTJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTMgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5OYW1lZCBRdWVyeSBTdXBwb3J0PC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTmFtZWQgUXVlcnkgU3VwcG9ydCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJHR0lISkNKIiBuYW1lPSJCR0dJSEpDSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TmFtZWQgUXVlcnkgU3VwcG9ydDwvaDE+Ci08cD5UaGUgSlBBIERldGFpbHMgdmlldyBmb3IgYW4gZW50aXR5IGluY2x1ZGVzIGZ1bmN0aW9ucyBmb3IgYWRkaW5nIG5hbWVkIGFuZCBuYW1lZCBuYXRpdmUgcXVlcmllcyB0byBhbiBlbnRpdHkuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMjUxIiBuYW1lPSJzdGhyZWYyNTEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5FbnRlcmluZyBhIE5hbWVkIFF1ZXJ5PC9wPgotPGltZyBzcmM9ImltZy9lbnRlcmluZ19xdWVyeV9uZXcucG5nIiBhbHQ9IlRoZSBRdWVyaWVzIHNlY3Rpb24gb2YgdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiB0aXRsZT0iVGhlIFF1ZXJpZXMgc2VjdGlvbiBvZiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQklHQkdHIj5DcmVhdGluZyBOYW1lZCBRdWVyaWVzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZDEzNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1NCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJwZXJzaXN0ZW5jZS54bWwgRWRpdG9yIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkdHR0FDQ0QiIG5hbWU9IkJHR0dBQ0NEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9oMT4KLTxwPlJhdGhlciB0aGFuIGVkaXQgdGhlIFhNTCBmb3IgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiwgdGhpcyByZWxlYXNlIG9mIERhbGkgcHJvdmlkZXMgYW4gZWRpdG9yIHRoYXQgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgdGhlIGZpbGUncyA8Y29kZT4mbHQ7cGVyc2lzdGVuY2UtdW5pdCZndDs8L2NvZGU+IGVsZW1lbnQsIGl0cyA8Y29kZT50cmFuc2FjdGlvbiB0eXBlPC9jb2RlPiBhdHRyaWJ1dGUgYXMgd2VsbCBhcyBpdHMgPGNvZGU+Jmx0O3Byb3ZpZGVyJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtjbGFzcyZndDs8L2NvZGU+LCBkYXRhIHNvdXJjZSBhbmQgPGNvZGU+Jmx0O3Byb3BlcnRpZXMmZ3Q7PC9jb2RlPiBzdWItZWxlbWVudHMuIFRoZSBlZHRpb3IgYWxzbyBlbmFibGVzIHlvdSB0byBlZGl0IHRoZSBmaWxlIGRpcmVjdGx5LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjI1MiIgbmFtZT0ic3RocmVmMjUyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L3A+Ci08aW1nIHNyYz0iaW1nL3BlcnNpc3RlbmNlX2VkaXRvcl9uZXcucG5nIiBhbHQ9IlRoZSBHZW5lcmFsIHBhZ2Ugb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IuIiB0aXRsZT0iVGhlIEdlbmVyYWwgcGFnZSBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvci4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4YWNmMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gSnVseSAyMywgMjAwOCA4OjU5OjU0IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkdHSUlDRUYiIG5hbWU9IkJHR0lJQ0VGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PdmVycmlkZSB0aGUgRGVmYXVsdCBTY2hlbWEgZm9yIENvbm5lY3Rpb248L2gxPgotPHA+SW4gc29tZSBjYXNlcywgRGFsaSBjYW5ub3QgY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHNjaGVtYSBmb3IgYSBwcm9qZWN0LiBJZiBzdWNoIGFuIGluc3RhbmNlIGFyaXNlcywgeW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBzY2hlbWEgZGVyaXZlZCBmcm9tIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC9zcGFuPiBvcHRpb24gaW4gdGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgTmV3IEpQQSBFbnRpdHkgd2l6YXJkIChpbGx1c3RyYXRlZCBpbiA8YSBocmVmPSIjQkdHSkZGQ0QiPkZpZ3VyZTogQ2hhbmdpbmcgdGhlIFNjaGVtYSBmb3IgYSBQcm9qZWN0PC9hPikgb3IgdGhyb3VnaCB0aGUgcHJvcGVydGllcyBmb3IgdGhlIEpQQSBwcm9qZWN0IChhY2Nlc3NlZCBieSBzZWxlY3RpbmcgdGhlIEpQQSBwcm9qZWN0IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0aWVzICZndDsgSlBBPC9zcGFuPikuIFVzZSB0aGlzIG9wdGlvbiB3aGVuIHRoZSBkZWZhdWx0IGxvZ2luIGluZm9ybWF0aW9uIGNhbm5vdCBiZSB1c2VkLCBzdWNoIGFzIHdoZW4gdGhlIGRlcGxveW1lbnQgbG9naW4gZGlmZmVycyBmcm9tIHRoZSBkZXNpZ24tdGltZSBsb2dpbi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJCR0dKRkZDRCIgbmFtZT0iQkdHSkZGQ0QiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5DaGFuZ2luZyB0aGUgU2NoZW1hIGZvciBhIFByb2plY3Q8L3A+Ci08aW1nIHNyYz0iaW1nL2NoYW5nZV9jb25uZWN0aW9uX3Byb2ZpbGUucG5nIiBhbHQ9IlRoZSBKUEEgRmFjZXQgcGFnZSBvZiB0aGUgQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQgd2l0aCB0aGUgT3ZlcnJpZGUgZGVmdWFsdCBzY2hlbWEgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZCB3aXRoIHRoZSBPdmVycmlkZSBkZWZ1YWx0IHNjaGVtYSBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDA4ZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1NCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkNoYW5naW5nIHRoZSBTY2hlbWEgZm9yIGEgUHJvamVjdDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNoYW5naW5nIHRoZSBTY2hlbWEgZm9yIGEgUHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjUzIiBuYW1lPSJzdGhyZWYyNTMiPjwvYT4KLTxoMT5OZXcgTWFwcGluZyBGaWxlIFdpemFyZDwvaDE+Ci08cD5UaGUgTWFwcGluZyBGaWxlIHdpemFyZCBlbmFibGVzIHlvdSB0byBhZGQgYW4gb2JqZWN0IG1hcCAob3JtLnhtbCkgdG8gYSBKUEEgcHJvamVjdCBpZiBubyBvYmplY3QgbWFwIGV4aXN0cyBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkLiBDb21wbGV0aW5nIHRoZSB3aXphcmQgcmVzdWx0cyBpbiBhIHN0dWIgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJCR0dHREdJRSIgbmFtZT0iQkdHR0RHSUUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5OZXcgTWFwcGluZyBGaWxlIFdpemFyZDwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ19maWxlX25ldy5wbmciIGFsdD0iVGhlIE1hcHBpbmcgRmlsZSBwYWdlIG9mIHRoZSBOZXcgTWFwcGluZyBGaWxlIHdpemFyZC4iIHRpdGxlPSJUaGUgTWFwcGluZyBGaWxlIHBhZ2Ugb2YgdGhlIE5ldyBNYXBwaW5nIEZpbGUgd2l6YXJkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDA1Lmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiPlRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDZkZmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTQgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5OZXcgTWFwcGluZyBGaWxlIFdpemFyZDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik5ldyBNYXBwaW5nIEZpbGUgV2l6YXJkIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPjxhIGlkPSJzdGhyZWYyNTQiIG5hbWU9InN0aHJlZjI1NCI+PC9hPgotPGgxPkNvbnZlcnQgdG8gSmF2YSBQcm9qZWN0PC9oMT4KLTxwPlRoZSBDb252ZXJ0IHRvIEpQQSBQcm9qZWN0IG9wdGlvbiAoYWNjZXNzZWQgYnkgc2VsZWN0aW5nIGEgSmF2YSBwcm9qZWN0IGFuZCB0aGVuIGNsaWNraW5nIDxzcGFuIGNsYXNzPSJib2xkIj5OZXcgJmd0OyBKUEEgVG9vbHMgJmd0OyBDb252ZXJ0IHRvIEpQQSBQcm9qZWN0PC9zcGFuPikgZW5hYmxlcyB5b3UgdG8gY29udmVydCBhIG5vbi1mYWNldGVkIEphdmEgcHJvamVjdCBpbnRvIGEgZmFjZXRlZCBKYXZhIHByb2plY3QuIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBpbnZva2VzIHRoZSBNb2RpZnkgRmFjZXRlZCBQcm9qZWN0IHdpemFyZCwgd2hpY2ggcHJvbXB0cyB5b3UgdG8gYWRkIHRoZSBKUEEgZmFjZXQuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0iQkdHQ0dESkciIG5hbWU9IkJHR0NHREpHIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIENvbnZlcnQgdG8gSmF2YSBQcm9qZWN0IE9wdGlvbjwvcD4KLTxpbWcgc3JjPSJpbWcvY29udmVydF9qYXZhX3Byb2plY3RfbmV3LnBuZyIgYWx0PSJBIEphdmEgcHJvamVjdCBpbiB0aGUgTmF2aWdhdG9yIHdpdGggdGhlIEpQQSBUb29scyAmZ3Q7IENvbnZlcnQgdG8gSmF2YSBvcHRpb24gc2VsZWN0ZWQuIiB0aXRsZT0iQSBKYXZhIHByb2plY3QgaW4gdGhlIE5hdmlnYXRvciB3aXRoIHRoZSBKUEEgVG9vbHMgJmd0OyBDb252ZXJ0IHRvIEphdmEgb3B0aW9uIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmZkNDIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTQgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5UaGUgQ29udmVydCB0byBKYXZhIFByb2plY3QgT3B0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVGhlIENvbnZlcnQgdG8gSmF2YSBQcm9qZWN0IE9wdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjU1IiBuYW1lPSJzdGhyZWYyNTUiPjwvYT4KLTxoMT5Db2x1bW4gRGVmaW5pdGlvbiBTdXBwb3J0PC9oMT4KLTxwPlRoZSBKUEEgRGV0YWlscyB2aWV3IGZvciBhdHRyaWJ1dGVzIGVuYWJsZXMgeW91IHRvIG1vZGlmeSB0aGUgbnVsbGFibGUgYW5kIHVuaXF1ZSBjb2x1bW4gY29uc3RyYWludHMgYW5kIHN1Y2ggY29sdW1uIHByb3BlcnRpZXMgYXMgbGVuZ3RoLCBzY2FsZSwgYW5kIHByZWNpc2lvbi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJCR0dGR0JISiIgbmFtZT0iQkdHRkdCSEoiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5EZWZpbmluZyBDb2x1bW5zIGluIEpQQSBEZXRhaWxzIFZpZXcgZm9yIEVudGl0eSBBdHRyaWJ1dGVzPC9wPgotPGltZyBzcmM9ImltZy9jb2x1bW5fc3VwcG9ydF9uZXcucG5nIiBhbHQ9IlRoZSBKUEEgRGV0YWlscyBWaWV3IGZvciBhbiBlbnRpdHkgd2l0aCBpdHMgRGV0YWlscyBzZWN0aW9uIGV4cGFuZGVkIHRvIHNob3cgdGhlIGNvbHVtbiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuIiB0aXRsZT0iVGhlIEpQQSBEZXRhaWxzIFZpZXcgZm9yIGFuIGVudGl0eSB3aXRoIGl0cyBEZXRhaWxzIHNlY3Rpb24gZXhwYW5kZWQgdG8gc2hvdyB0aGUgY29sdW1uIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI0JBQklGQkRCIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OGUyZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo1NCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkdlbmVyYXRlIERETCBmcm9tIEVudGl0aWVzIHdpemFyZDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRlIERETCBmcm9tIEVudGl0aWVzIHdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNFR0lEQ0NFIiBuYW1lPSJDRUdJRENDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgRERMIGZyb20gRW50aXRpZXMgd2l6YXJkPC9oMT4KLTxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkdlbmVyYXRlIERETDwvc3Bhbj4gd2l6YXJkIHRvIHF1aWNrbHkgY3JlYXRlIERETCBzY3JpcHRzIGZyb20geW91ciBwZXJzaXN0ZW50IGVudGl0aWVzLiBEYWxpIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IHByaW1hcnkgYW5kIGZvcmVpZ24ga2V5cywgYmFzZWQgb24gdGhlIGVudGl0eSBtYXBwaW5ncy48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQ0lISklHQkUiPkdlbmVyYXRpbmcgRERMIGZyb20gRW50aXRpZXM8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjAwY2U4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9wZXJzaXN0ZW5jZS5qYXIiIHNvdXJjZXBhdGg9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbnNyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2MzExZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDFiYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1dlZCBBcHIgMzAgMTc6MjQ6NDEgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTA4YzVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW47c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IGxpYi9wZXJzaXN0ZW5jZS5qYXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IGphdmF4LnBlcnNpc3RlbmNlLAotIGphdmF4LnBlcnNpc3RlbmNlLnNwaSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZjU4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgyPkFib3V0IFRoaXMgQ29udGVudDwvSDI+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgCi0gIG91dCBiZWxvdy4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCAKLSAgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIAotICB0byB0aGUgUmVkaXN0cmlidXRvciYjODIxNztzIGxpY2Vuc2UgZm9yIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND48YSBuYW1lPSJKUEEiIGlkPSJKUEEiPjwvYT5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB2MS4wPC9oND4KLQotPGJsb2NrcXVvdGU+Ci0gIDxwPlRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB3aGljaCBpcyBkaXN0cmlidXRlZCB1bmRlciA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPkNEREwgCi0gICAgdjEuMDwvYT4gaXMgcmVxdWlyZWQgYnkgdGhlIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBQcm9qZWN0IGluIG9yZGVyIAotICAgIHRvIHN1cHBvcnQgdGhpcyBzdGFuZGFyZC48L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjdiY2UzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS41Ci1qYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBsaWIvcGVyc2lzdGVuY2UuamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9saWIvcGVyc2lzdGVuY2UuamFyIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2xpYi9wZXJzaXN0ZW5jZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWIyMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2xpYi9wZXJzaXN0ZW5jZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzExMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IC0gRERMIEdlbmVyYXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZWEwYWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9kZGxnZW4vTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotCi0vKiogCi0gKiBUaGlzIGNsYXNzIGNyZWF0ZXMgYSBFY2xpcHNlTGluayA8Y29kZT5FbnRpdHlNYW5hZ2VyRmFjdG9yeTwvY29kZT4sIAotICogYW5kIGV4ZWN1dGVzIHRoZSBEREwgZ2VuZXJhdG9yIHdpdGggdGhlIGNvbW1hbmQgc2V0IGluIHRoZSBwcm9wZXJ0aWVzOiAKLSAqICAgICA8Y29kZT5lY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbi5vdXRwdXQtbW9kZTwvY29kZT4gCi0gKiAgICAgPGNvZGU+ZWNsaXBzZWxpbmsuYXBwbGljYXRpb24tbG9jYXRpb248L2NvZGU+Ci0gKiAKLSAqIEN1cnJlbnQgY29tbWFuZC1saW5lIGFyZ3VtZW50czoKLSAqICAgICBbLXB1IHB1TmFtZV0gLSBwZXJzaXN0ZW5jZSB1bml0IG5hbWUKLSAqICAgICBbLXAgcHJvcGVydGllc0ZpbGVQYXRoXSAtIHByb3BlcnRpZXMgZm9yIEVjbGlwc2VMaW5rIEVudGl0eU1hbmFnZXIKLSAqICAKLSAqICBFeGFtcGxlIG9mIGEgcHJvcGVydGllcyBmaWxlOgotICogIAllY2xpcHNlbGluay5qZGJjLmJpbmQtcGFyYW1ldGVycz1mYWxzZQotICogIAllY2xpcHNlbGluay5qZGJjLmRyaXZlcj1vcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREcml2ZXIKLSAqICAJZWNsaXBzZWxpbmsuamRiYy51cmw9amRiY1w6ZGVyYnlcOmNcOi9kZXJieWRiL3Rlc3RkYjtjcmVhdGVcPXRydWUKLSAqICAJZWNsaXBzZWxpbmsuamRiYy51c2VyPXRyYW4KLSAqICAJZWNsaXBzZWxpbmsuamRiYy5wYXNzd29yZD0KLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy5sZXZlbD1GSU5FU1QKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy50aW1lc3RhbXA9ZmFsc2UKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy50aHJlYWQ9ZmFsc2UKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy5zZXNzaW9uPWZhbHNlCi0gKiAgCWVjbGlwc2VsaW5rLmxvZ2dpbmcuZXhjZXB0aW9ucz10cnVlCi0gKiAgCWVjbGlwc2VsaW5rLm9ybS50aHJvdy5leGNlcHRpb25zPXRydWUKLSAqICAJZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb24ub3V0cHV0LW1vZGU9ZGF0YWJhc2UKLSAqICAJZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb249ZHJvcC1hbmQtY3JlYXRlLXRhYmxlcwotICogIAllY2xpcHNlbGluay5hcHBsaWNhdGlvbi1sb2NhdGlvbj1jXDovX1Byb2plY3RzXy9FeGFtcGxlRERMCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluCi17Ci0JcHJvdGVjdGVkIEVudGl0eU1hbmFnZXJGYWN0b3J5IGVtZjsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZWNsaXBzZUxpbmtQcm9wZXJ0aWVzOwotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZURETEZpbGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIGRyb3BERExGaWxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBhcHBMb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoOwotCXByaXZhdGUgYm9vbGVhbiBpc0RlYnVnTW9kZTsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgTWFpbigpLmV4ZWN1dGUoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBNYWluKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoU3RyaW5nW10gYXJncykgewotCQl0aGlzLmluaXRpYWxpemVXaXRoKGFyZ3MpOwotCQkKLQkJdGhpcy5lbWYgPSBQZXJzaXN0ZW5jZS5jcmVhdGVFbnRpdHlNYW5hZ2VyRmFjdG9yeSh0aGlzLmdldFBVTmFtZShhcmdzKSwgdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMpOwotCQl0aGlzLnBlcmZvcm0oKTsKLQkJdGhpcy5jbG9zZUVudGl0eU1hbmFnZXJGYWN0b3J5KCk7Ci0JCQotCQl0aGlzLmRpc3Bvc2UoKTsKLQkJcmV0dXJuOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtKCkgewotCQkvLyBjcmVhdGUgYW4gRU0gdG8gZ2VuZXJhdGUgc2NoZW1hLgotCQl0aGlzLmVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCkuY2xvc2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2VFbnRpdHlNYW5hZ2VyRmFjdG9yeSgpIHsKLQkJdGhpcy5lbWYuY2xvc2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVXaXRoKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQl0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGggPSB0aGlzLmdldEVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgoYXJncyk7Ci0JCXRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCk7Ci0JCQotCQl0aGlzLmNyZWF0ZURETEZpbGVOYW1lID0gdGhpcy5nZXRDb25maWdQcm9wZXJ0eUFzU3RyaW5nKCAKLQkJCQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSwgCi0JCQkJCQl0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcywgIAotCQkJCQkJU2NoZW1hR2VuZXJhdGlvbi5ERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0NSRUFURV9GSUxFX05BTUUpOwotCi0JCXRoaXMuZHJvcERETEZpbGVOYW1lID0gdGhpcy5nZXRDb25maWdQcm9wZXJ0eUFzU3RyaW5nKAotCQkJCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19EUk9QX0ZJTEVfTkFNRSwgCi0JCQkJCQl0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcywgIAotCQkJCQkJU2NoZW1hR2VuZXJhdGlvbi5ERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RST1BfRklMRV9OQU1FKTsgCi0JCQotCQl0aGlzLmFwcExvY2F0aW9uID0gdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMuZ2V0KAotCQkJCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTik7Ci0KLQkJdGhpcy5pc0RlYnVnTW9kZSA9IHRoaXMuZ2V0RGVidWdNb2RlKGFyZ3MpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcG9zZSgpIHsKLQotCQlpZiggISB0aGlzLmlzRGVidWdNb2RlKSB7Ci0JCQluZXcgRmlsZSh0aGlzLmFwcExvY2F0aW9uICsgIi8iICsgdGhpcy5jcmVhdGVERExGaWxlTmFtZSkuZGVsZXRlKCk7Ci0JCQluZXcgRmlsZSh0aGlzLmFwcExvY2F0aW9uICsgIi8iICsgdGhpcy5kcm9wRERMRmlsZU5hbWUpLmRlbGV0ZSgpOwotCQkJbmV3IEZpbGUodGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKS5kZWxldGUoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcyhTdHJpbmcgZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCkgewotCQkKLQkJU2V0PEVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gcHJvcGVydGllc1NldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm9wZXJ0aWVzU2V0ID0gdGhpcy5sb2FkRWNsaXBzZUxpbmtQcm9wZXJ0aWVzKGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWlzc2luZzogIiArIGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgsIGUpOwotCQl9Ci0JCQotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJZm9yKEVudHJ5PE9iamVjdCwgT2JqZWN0PiBwcm9wZXJ0eSA6IHByb3BlcnRpZXNTZXQpIHsKLQkJCXByb3BlcnRpZXMucHV0KChTdHJpbmcpcHJvcGVydHkuZ2V0S2V5KCksIChTdHJpbmcpcHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0gICAgcHJpdmF0ZSBTZXQ8RW50cnk8T2JqZWN0LCBPYmplY3Q+PiBsb2FkRWNsaXBzZUxpbmtQcm9wZXJ0aWVzKFN0cmluZyBlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCk7Ci0gICAgICAgIAotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wZXJ0aWVzLmxvYWQoc3RyZWFtKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhcmd1bWVudCBxdWVyaWVzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIFN0cmluZyBnZXRQVU5hbWUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1wdSIsIGFyZ3MpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRFY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5nZXRBcmd1bWVudFZhbHVlKCItcCIsIGFyZ3MpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXREZWJ1Z01vZGUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmFyZ3VtZW50RXhpc3RzKCItZGVidWciLCBhcmdzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRWYWx1ZShTdHJpbmcgYXJndW1lbnQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJndW1lbnQpKSB7Ci0JCQkJaW50IGogPSBpICsgMTsKLQkJCQlpZiAoaiA8IGFyZ3MubGVuZ3RoKSB7Ci0JCQkJCXJldHVybiBhcmdzW2pdOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFyZ3VtZW50RXhpc3RzKFN0cmluZyBhcmd1bWVudCwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmd1bWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gKioqKioqIHV0aWxpdHkgbWV0aG9kcyAqKioqKioqCi0JCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHByb3ZpZGVkIG1hcCBmb3IgYW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIGtleS4gIElmIHRoYXQgb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUsIGNoZWNrIHRoZQotICAgICAqIFN5c3RlbSBwcm9wZXJ0aWVzLiAgSWYgaXQgaXMgbm90IGF2YWlsYWJsZSBmcm9tIGVpdGhlciBsb2NhdGlvbiwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAKLSAgICAgKiBAcGFyYW0gbWFwIAotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgCi0gICAgICogQHJldHVybiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ1Byb3BlcnR5QXNTdHJpbmcoU3RyaW5nIHByb3BlcnR5S2V5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG92ZXJyaWRlcywgU3RyaW5nIGRlZmF1bHRWYWx1ZSl7Ci0gICAgCVN0cmluZyB2YWx1ZSA9IHRoaXMuZ2V0Q29uZmlnUHJvcGVydHlBc1N0cmluZyhwcm9wZXJ0eUtleSwgb3ZlcnJpZGVzKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpewotICAgICAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ1Byb3BlcnR5QXNTdHJpbmcoU3RyaW5nIHByb3BlcnR5S2V5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG92ZXJyaWRlcyl7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgICAgIGlmIChvdmVycmlkZXMgIT0gbnVsbCl7Ci0gICAgICAgICAgICB2YWx1ZSA9IChTdHJpbmcpb3ZlcnJpZGVzLmdldChwcm9wZXJ0eUtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpewotICAgICAgICAgICAgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHlLZXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwNWUwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU2NDQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYTg4MGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNGVlY2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAwNyAxNDoyNjo0OCBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNjIxOTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIEZlYiAyNCAyMToyNTozNCBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmZkNDA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjEuMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aSxvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cyIsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWksb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMiLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZywKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24sCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWksb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMiLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZywKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnMsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbiwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5kZGxnZW4sCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YmRiNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlPTEuNQotamF2YWNUYXJnZXQ9MS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTZlY2ZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IC0gQ29yZQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzRlMTg0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFQbGF0Zm9ybSI+Ci0gICAgICA8anBhUGxhdGZvcm0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua1BsYXRmb3JtIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjbGlwc2VsaW5rLnBsYXRmb3JtIgotICAgICAgICAgICAgbGFiZWw9IkVjbGlwc2VMaW5rIj4KLSAgICAgIDwvanBhUGxhdGZvcm0+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL0VjbGlwc2VMaW5rSnBhRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL0VjbGlwc2VMaW5rSnBhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzVlZDFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9FY2xpcHNlTGlua0pwYUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUVudGl0eTsKLQotLyoqCi0gKiBVc2UgRWNsaXBzZUxpbmtKcGFGYWN0b3J5IHRvIGNyZWF0ZSBhbnkgRWNsaXNwZUxpbmsgc3BlY2lmaWMKLSAqIGphdmEsIG9ybSwgb3IgcGVyc2lzdGVuY2UgY29udGV4dCBtb2RlbCBvYmplY3RzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtKcGFGYWN0b3J5IGV4dGVuZHMgSnBhRmFjdG9yeQotewotCi0JRWNsaXBzZUxpbmtKYXZhRW50aXR5IGJ1aWxkSmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KTsKLQkKLQlFY2xpcHNlTGlua0phdmFDYWNoaW5nIGJ1aWxkRWNsaXBzZUxpbmtKYXZhQ2FjaGluZyhKYXZhVHlwZU1hcHBpbmcgcGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTlmNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gQ2FjaGVDb29yZGluYXRpb25UeXBlIHsKLQotCVNFTkRfT0JKRUNUX0NIQU5HRVMsCi0JSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0JU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsCi0JTk9ORTsKLQkKLQotCXB1YmxpYyBzdGF0aWMgQ2FjaGVDb29yZGluYXRpb25UeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZSBqYXZhQ2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCWlmIChqYXZhQ2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YUNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgewotCQkJY2FzZSBTRU5EX09CSkVDVF9DSEFOR0VTOgotCQkJCXJldHVybiBTRU5EX09CSkVDVF9DSEFOR0VTOwotCQkJY2FzZSBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzoKLQkJCQlyZXR1cm4gSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFM7Ci0JCQljYXNlIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTOgotCQkJCXJldHVybiBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUzsKLQkJCWNhc2UgTk9ORToKLQkJCQlyZXR1cm4gTk9ORTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSBjb29yZGluYXRpb24gdHlwZTogIiArIGphdmFDYWNoZUNvb3JkaW5hdGlvblR5cGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjYWNoZUNvb3JkaW5hdGlvblR5cGUpIHsKLQkJaWYgKGNhY2hlQ29vcmRpbmF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgewotCQkJY2FzZSBTRU5EX09CSkVDVF9DSEFOR0VTOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTOwotCQkJY2FzZSBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFM7Ci0JCQljYXNlIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUzsKLQkJCWNhc2UgTk9ORToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuTk9ORTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSB0eXBlOiAiICsgY2FjaGVDb29yZGluYXRpb25UeXBlKTsKLQkJfQotCX0KLQkKLQotLy8JcHVibGljIHN0YXRpYyBDYWNoZVR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZSBvcm1DYWNoZVR5cGUpIHsKLS8vCQlpZiAob3JtQ2FjaGVUeXBlID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCXN3aXRjaCAob3JtQ2FjaGVUeXBlKSB7Ci0vLwkJCWNhc2UgRlVMTDoKLS8vCQkJCXJldHVybiBGVUxMOwotLy8JCQljYXNlIFdFQUs6Ci0vLwkJCQlyZXR1cm4gV0VBSzsKLS8vCQkJY2FzZSBTT0ZUOgotLy8JCQkJcmV0dXJuIFNPRlQ7Ci0vLwkJCWNhc2UgU09GVF9XRUFLOgotLy8JCQkJcmV0dXJuIFNPRlRfV0VBSzsKLS8vCQkJY2FzZSBIQVJEX1dFQUs6Ci0vLwkJCQlyZXR1cm4gSEFSRF9XRUFLOwotLy8JCQljYXNlIENBQ0hFOgotLy8JCQkJcmV0dXJuIENBQ0hFOwotLy8JCQljYXNlIE5PTkU6Ci0vLwkJCQlyZXR1cm4gTk9ORTsKLS8vCQkJZGVmYXVsdDoKLS8vCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgdHlwZTogIiArIG9ybUNhY2hlVHlwZSk7Ci0vLwkJfQotLy8JfQotLy8JCi0vLwlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKENhY2hlVHlwZSBjYWNoZVR5cGUpIHsKLS8vCQlpZiAoY2FjaGVUeXBlID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCXN3aXRjaCAoY2FjaGVUeXBlKSB7Ci0vLwkJCWNhc2UgRlVMTDoKLS8vCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkZVTEw7Ci0vLwkJCWNhc2UgV0VBSzoKLS8vCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLldFQUs7Ci0vLwkJCWNhc2UgU09GVDoKLS8vCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLlNPRlQ7Ci0vLwkJCWNhc2UgU09GVF9XRUFLOgotLy8JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuU09GVF9XRUFLOwotLy8JCQljYXNlIEhBUkRfV0VBSzoKLS8vCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkhBUkRfV0VBSzsKLS8vCQkJY2FzZSBDQUNIRToKLS8vCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkNBQ0hFOwotLy8JCQljYXNlIE5PTkU6Ci0vLwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5OT05FOwotLy8JCQlkZWZhdWx0OgotLy8JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSB0eXBlOiAiICsgY2FjaGVUeXBlKTsKLS8vCQl9Ci0vLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0NhY2hlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvQ2FjaGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDkwMTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvQ2FjaGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLQotCVNPRlRfV0VBSywKLQlIQVJEX1dFQUssCi0JV0VBSywKLQlTT0ZULAotCUZVTEwsCi0JQ0FDSEUsCi0JTk9ORTsKLQkKLQotCXB1YmxpYyBzdGF0aWMgQ2FjaGVUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZSBqYXZhQ2FjaGVUeXBlKSB7Ci0JCWlmIChqYXZhQ2FjaGVUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YUNhY2hlVHlwZSkgewotCQkJY2FzZSBGVUxMOgotCQkJCXJldHVybiBGVUxMOwotCQkJY2FzZSBXRUFLOgotCQkJCXJldHVybiBXRUFLOwotCQkJY2FzZSBTT0ZUOgotCQkJCXJldHVybiBTT0ZUOwotCQkJY2FzZSBTT0ZUX1dFQUs6Ci0JCQkJcmV0dXJuIFNPRlRfV0VBSzsKLQkJCWNhc2UgSEFSRF9XRUFLOgotCQkJCXJldHVybiBIQVJEX1dFQUs7Ci0JCQljYXNlIENBQ0hFOgotCQkJCXJldHVybiBDQUNIRTsKLQkJCWNhc2UgTk9ORToKLQkJCQlyZXR1cm4gTk9ORTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSB0eXBlOiAiICsgamF2YUNhY2hlVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQlpZiAoY2FjaGVUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoY2FjaGVUeXBlKSB7Ci0JCQljYXNlIEZVTEw6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLkZVTEw7Ci0JCQljYXNlIFdFQUs6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLldFQUs7Ci0JCQljYXNlIFNPRlQ6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLlNPRlQ7Ci0JCQljYXNlIFNPRlRfV0VBSzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuU09GVF9XRUFLOwotCQkJY2FzZSBIQVJEX1dFQUs6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLkhBUkRfV0VBSzsKLQkJCWNhc2UgQ0FDSEU6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLkNBQ0hFOwotCQkJY2FzZSBOT05FOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5OT05FOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIHR5cGU6ICIgKyBjYWNoZVR5cGUpOwotCQl9Ci0JfQotCQotCi0vLwlwdWJsaWMgc3RhdGljIENhY2hlVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIG9ybUNhY2hlVHlwZSkgewotLy8JCWlmIChvcm1DYWNoZVR5cGUgPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwkJc3dpdGNoIChvcm1DYWNoZVR5cGUpIHsKLS8vCQkJY2FzZSBGVUxMOgotLy8JCQkJcmV0dXJuIEZVTEw7Ci0vLwkJCWNhc2UgV0VBSzoKLS8vCQkJCXJldHVybiBXRUFLOwotLy8JCQljYXNlIFNPRlQ6Ci0vLwkJCQlyZXR1cm4gU09GVDsKLS8vCQkJY2FzZSBTT0ZUX1dFQUs6Ci0vLwkJCQlyZXR1cm4gU09GVF9XRUFLOwotLy8JCQljYXNlIEhBUkRfV0VBSzoKLS8vCQkJCXJldHVybiBIQVJEX1dFQUs7Ci0vLwkJCWNhc2UgQ0FDSEU6Ci0vLwkJCQlyZXR1cm4gQ0FDSEU7Ci0vLwkJCWNhc2UgTk9ORToKLS8vCQkJCXJldHVybiBOT05FOwotLy8JCQlkZWZhdWx0OgotLy8JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSB0eXBlOiAiICsgb3JtQ2FjaGVUeXBlKTsKLS8vCQl9Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZSB0b09ybVJlc291cmNlTW9kZWwoQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotLy8JCWlmIChjYWNoZVR5cGUgPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwkJc3dpdGNoIChjYWNoZVR5cGUpIHsKLS8vCQkJY2FzZSBGVUxMOgotLy8JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRlVMTDsKLS8vCQkJY2FzZSBXRUFLOgotLy8JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuV0VBSzsKLS8vCQkJY2FzZSBTT0ZUOgotLy8JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuU09GVDsKLS8vCQkJY2FzZSBTT0ZUX1dFQUs6Ci0vLwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5TT0ZUX1dFQUs7Ci0vLwkJCWNhc2UgSEFSRF9XRUFLOgotLy8JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuSEFSRF9XRUFLOwotLy8JCQljYXNlIENBQ0hFOgotLy8JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuQ0FDSEU7Ci0vLwkJCWNhc2UgTk9ORToKLS8vCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLk5PTkU7Ci0vLwkJCWRlZmF1bHQ6Ci0vLwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIHR5cGU6ICIgKyBjYWNoZVR5cGUpOwotLy8JCX0KLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NhY2hpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg1OTI0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NhY2hpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDYWNoaW5nIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkvLyoqKioqKioqKioqKioqKioqIHNoYXJlZCAqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlCb29sZWFuIGdldFNoYXJlZCgpOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFNoYXJlZCgpOwotCQlTdHJpbmcgREVGQVVMVF9TSEFSRURfUFJPUEVSVFkgPSAiZGVmYXVsdFNoYXJlZFByb3BlcnR5IjsKLQkJQm9vbGVhbiBERUZBVUxUX1NIQVJFRCA9IEJvb2xlYW4uVFJVRTsKLQkKLQlCb29sZWFuIGdldFNwZWNpZmllZFNoYXJlZCgpOwotCQotCS8qKgotCSAqIFNldHRpbmcgdGhpcyB0byBmYWxzZSBtZWFucyB0aGF0IGNhY2hlVHlwZSwgY2FjaGVTaXplLCBhbHdheXNSZWZyZXNoLCAKLQkgKiByZWZyZXNoT25seUlmTmV3ZXIsIGRpc2FibGVIaXRzLCBjYWNoZUNvb3JkaW5hdGlvblR5cGUgd2lsbCBhbGwgYmUgc2V0IAotCSAqIHRvIHRoZWlyIGRlZmF1bHQgc3RhdGVzLiAgVGhlc2Ugc2V0dGluZ3MgZG8gbm90IGFwcGx5IHRvIGEgY2FjaGUgdGhhdCBpcyBub3Qgc2hhcmVkCi0JICogQHBhcmFtIG5ld1NwZWNpZmllZFNoYXJlZAotCSAqLwotCXZvaWQgc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4gbmV3U3BlY2lmaWVkU2hhcmVkKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9TSEFSRURfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2hhcmVkUHJvcGVydHkiOwotCQotCQotCS8vKioqKioqKioqKioqKioqKiogY2FjaGUgdHlwZSAqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCi0JQ2FjaGVUeXBlIGdldFR5cGUoKTsKLQkKLQlDYWNoZVR5cGUgZ2V0RGVmYXVsdFR5cGUoKTsJCQotCQlTdHJpbmcgREVGQVVMVF9UWVBFX1BST1BFUlRZID0gImRlZmF1bHRUeXBlUHJvcGVydHkiOwotCQlDYWNoZVR5cGUgREVGQVVMVF9UWVBFID0gQ2FjaGVUeXBlLlNPRlRfV0VBSzsKLQkJCi0JQ2FjaGVUeXBlIGdldFNwZWNpZmllZFR5cGUoKTsJCi0Jdm9pZCBzZXRTcGVjaWZpZWRUeXBlKENhY2hlVHlwZSBuZXdTcGVjaWZpZWRUeXBlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZFR5cGVQcm9wZXJ0eSI7Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKiBzaXplICoqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUludGVnZXIgZ2V0U2l6ZSgpOwotCi0JSW50ZWdlciBnZXREZWZhdWx0U2l6ZSgpOwotCUludGVnZXIgREVGQVVMVF9TSVpFID0gSW50ZWdlci52YWx1ZU9mKDEwMCk7Ci0JCVN0cmluZyBERUZBVUxUX1NJWkVfUFJPUEVSVFkgPSAiZGVmYXVsdFNpemVQcm9wZXJ0eSI7Ci0KLQlJbnRlZ2VyIGdldFNwZWNpZmllZFNpemUoKTsKLQl2b2lkIHNldFNwZWNpZmllZFNpemUoSW50ZWdlciBuZXdTcGVjaWZpZWRTaXplKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9TSVpFX1BST1BFUlRZID0gInNwY2lmaWVkU2l6ZVByb3BlcnR5IjsKLQkKLQkvLyoqKioqKioqKioqKioqKioqIGFsd2F5cyByZWZyZXNoICoqKioqKioqKioqKioqKioqKioqKioqKgotCQkKLQlCb29sZWFuIGdldEFsd2F5c1JlZnJlc2goKTsKLQkKLQlCb29sZWFuIGdldERlZmF1bHRBbHdheXNSZWZyZXNoKCk7Ci0JCVN0cmluZyBERUZBVUxUX0FMV0FZU19SRUZSRVNIX1BST1BFUlRZID0gImRlZmF1bHRBbHdheXNSZWZyZXNoUHJvcGVydHkiOwotCQlCb29sZWFuIERFRkFVTFRfQUxXQVlTX1JFRlJFU0ggPSBCb29sZWFuLkZBTFNFOwotCQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpOwotCXZvaWQgc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuIG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0FMV0FZU19SRUZSRVNIX1BST1BFUlRZID0gInNwZWNpZmllZEFsd2F5c1JlZnJlc2hQcm9wZXJ0eSI7Ci0KLQotCS8vKioqKioqKioqKioqKioqKiogcmVmcmVzaCBvbmx5IGlmIG5ld2VyICoqKioqKioqKioqKioqKioqKioqKioqKgotCQkKLQlCb29sZWFuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQlTdHJpbmcgREVGQVVMVF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFkgPSAiZGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlclByb3BlcnR5IjsKLQkJQm9vbGVhbiBERUZBVUxUX1JFRlJFU0hfT05MWV9JRl9ORVdFUiA9IEJvb2xlYW4uRkFMU0U7Ci0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQl2b2lkIHNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcik7Ci0JCVN0cmluZyBTUEVDSUZJRURfUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZID0gInNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlclByb3BlcnR5IjsKLQotCQkKLQkvLyoqKioqKioqKioqKioqKioqIGRpc2FibGUgaGl0cyAqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCi0JQm9vbGVhbiBnZXREaXNhYmxlSGl0cygpOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdERpc2FibGVIaXRzKCk7Ci0JCVN0cmluZyBERUZBVUxUX0RJU0FCTEVfSElUU19QUk9QRVJUWSA9ICJkZWZhdWx0RGlzYWJsZUhpdHNQcm9wZXJ0eSI7Ci0JCUJvb2xlYW4gREVGQVVMVF9ESVNBQkxFX0hJVFMgPSBCb29sZWFuLkZBTFNFOwotCQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKTsKLQl2b2lkIHNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4gbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHMpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0RJU0FCTEVfSElUU19QUk9QRVJUWSA9ICJzcGVjaWZpZWREaXNhYmxlSGl0c1Byb3BlcnR5IjsKLQotCQkKLQkvLyoqKioqKioqKioqKioqKioqIGNvb3JkaW5hdGlvbiB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCk7Ci0JCi0JQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCk7CQkKLQkJU3RyaW5nIERFRkFVTFRfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdENvb3JkaW5hdGlvblR5cGVQcm9wZXJ0eSI7Ci0JCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSBERUZBVUxUX0NPT1JESU5BVElPTl9UWVBFID0gQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0JCQotCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCk7CQotCXZvaWQgc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZVByb3BlcnR5IjsKLQotCQkJCi0JLy8qKioqKioqKioqKioqKioqKiBleGlzdGVuY2UgY2hlY2tpbmcgKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JCQotCWJvb2xlYW4gaGFzRXhpc3RlbmNlQ2hlY2tpbmcoKTsKLQl2b2lkIHNldEV4aXN0ZW5jZUNoZWNraW5nKGJvb2xlYW4gZXhpc3RlbmNlQ2hlY2tpbmcpOwotCQlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HX1BST1BFUlRZID0gImV4aXN0ZW5jZUNoZWNraW5nUHJvcGVydHkiOwotCQotCUV4aXN0ZW5jZVR5cGUgZ2V0RXhpc3RlbmNlVHlwZSgpOwotCQotCUV4aXN0ZW5jZVR5cGUgZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKTsJCQotCQlTdHJpbmcgREVGQVVMVF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSA9ICJkZWZhdWx0RXhpc3RlbmNlVHlwZVByb3BlcnR5IjsKLQkJLy9kZWZhdWx0IGlmIGhhc0V4aXN0ZW5jZUNoZWNraW5nIHJldHVybnMgZmFsc2UKLQkJRXhpc3RlbmNlVHlwZSBERUZBVUxUX0VYSVNURU5DRV9UWVBFID0gRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRTsKLQkJCi0JRXhpc3RlbmNlVHlwZSBnZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCk7CQotCXZvaWQgc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFeGlzdGVuY2VUeXBlIG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZEV4aXN0ZW5jZVR5cGVQcm9wZXJ0eSI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0VudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmJkYTlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rRW50aXR5IGV4dGVuZHMgRW50aXR5Ci17Ci0JRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0V4aXN0ZW5jZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0V4aXN0ZW5jZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5YmJlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FeGlzdGVuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gRXhpc3RlbmNlVHlwZSB7Ci0KLSAgICBDSEVDS19DQUNIRSwKLSAgICBDSEVDS19EQVRBQkFTRSwKLSAgICBBU1NVTUVfRVhJU1RFTkNFLAotICAgIEFTU1VNRV9OT05fRVhJU1RFTkNFOwotCQotCi0JcHVibGljIHN0YXRpYyBFeGlzdGVuY2VUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUgamF2YUV4aXN0ZW5jZVR5cGUpIHsKLQkJaWYgKGphdmFFeGlzdGVuY2VUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YUV4aXN0ZW5jZVR5cGUpIHsKLQkJCWNhc2UgQ0hFQ0tfQ0FDSEU6Ci0JCQkJcmV0dXJuIENIRUNLX0NBQ0hFOwotCQkJY2FzZSBDSEVDS19EQVRBQkFTRToKLQkJCQlyZXR1cm4gQ0hFQ0tfREFUQUJBU0U7Ci0JCQljYXNlIEFTU1VNRV9FWElTVEVOQ0U6Ci0JCQkJcmV0dXJuIEFTU1VNRV9FWElTVEVOQ0U7Ci0JCQljYXNlIEFTU1VNRV9OT05fRVhJU1RFTkNFOgotCQkJCXJldHVybiBBU1NVTUVfTk9OX0VYSVNURU5DRTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBleGlzdGVuY2UgdHlwZTogIiArIGphdmFFeGlzdGVuY2VUeXBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoRXhpc3RlbmNlVHlwZSBleGlzdGVuY2VUeXBlKSB7Ci0JCWlmIChleGlzdGVuY2VUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoZXhpc3RlbmNlVHlwZSkgewotCQkJY2FzZSBDSEVDS19DQUNIRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFOwotCQkJY2FzZSBDSEVDS19EQVRBQkFTRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFOwotCQkJY2FzZSBBU1NVTUVfRVhJU1RFTkNFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRTsKLQkJCWNhc2UgQVNTVU1FX05PTl9FWElTVEVOQ0U6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBleGlzdGVuY2UgdHlwZTogIiArIGV4aXN0ZW5jZVR5cGUpOwotCQl9Ci0JfQotCQotCi0vLwlwdWJsaWMgc3RhdGljIENhY2hlVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIG9ybUNhY2hlVHlwZSkgewotLy8JCWlmIChvcm1DYWNoZVR5cGUgPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwkJc3dpdGNoIChvcm1DYWNoZVR5cGUpIHsKLS8vCQkJY2FzZSBGVUxMOgotLy8JCQkJcmV0dXJuIEZVTEw7Ci0vLwkJCWNhc2UgV0VBSzoKLS8vCQkJCXJldHVybiBXRUFLOwotLy8JCQljYXNlIFNPRlQ6Ci0vLwkJCQlyZXR1cm4gU09GVDsKLS8vCQkJY2FzZSBTT0ZUX1dFQUs6Ci0vLwkJCQlyZXR1cm4gU09GVF9XRUFLOwotLy8JCQljYXNlIEhBUkRfV0VBSzoKLS8vCQkJCXJldHVybiBIQVJEX1dFQUs7Ci0vLwkJCWNhc2UgQ0FDSEU6Ci0vLwkJCQlyZXR1cm4gQ0FDSEU7Ci0vLwkJCWNhc2UgTk9ORToKLS8vCQkJCXJldHVybiBOT05FOwotLy8JCQlkZWZhdWx0OgotLy8JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSB0eXBlOiAiICsgb3JtQ2FjaGVUeXBlKTsKLS8vCQl9Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZSB0b09ybVJlc291cmNlTW9kZWwoQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotLy8JCWlmIChjYWNoZVR5cGUgPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwkJc3dpdGNoIChjYWNoZVR5cGUpIHsKLS8vCQkJY2FzZSBGVUxMOgotLy8JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRlVMTDsKLS8vCQkJY2FzZSBXRUFLOgotLy8JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuV0VBSzsKLS8vCQkJY2FzZSBTT0ZUOgotLy8JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuU09GVDsKLS8vCQkJY2FzZSBTT0ZUX1dFQUs6Ci0vLwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5TT0ZUX1dFQUs7Ci0vLwkJCWNhc2UgSEFSRF9XRUFLOgotLy8JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuSEFSRF9XRUFLOwotLy8JCQljYXNlIENBQ0hFOgotLy8JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuQ0FDSEU7Ci0vLwkJCWNhc2UgTk9ORToKLS8vCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLk5PTkU7Ci0vLwkJCWRlZmF1bHQ6Ci0vLwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIHR5cGU6ICIgKyBjYWNoZVR5cGUpOwotLy8JCX0KLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDYWNoaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNhY2hpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwYTY5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNhY2hpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtKYXZhQ2FjaGluZyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZywgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0Jdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQotCXZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYWZlOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VudGl0eTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rSmF2YUVudGl0eSBleHRlbmRzIEVjbGlwc2VMaW5rRW50aXR5LCBKYXZhRW50aXR5Ci17Ci0JRWNsaXBzZUxpbmtKYXZhQ2FjaGluZyBnZXRDYWNoaW5nKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUFubm90YXRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhQW5ub3RhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MmQ5MWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhQW5ub3RhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQ2FjaGVJbXBsLkNhY2hlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VDaGVja2luZ0ltcGwuRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhQW5ub3RhdGlvblByb3ZpZGVyCi0JZXh0ZW5kcyBHZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyCi17Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZUFubm90YXRpb25EZWZpbml0aW9uc1RvKENvbGxlY3Rpb248QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCXN1cGVyLmFkZFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7Ci0JCWRlZmluaXRpb25zLmFkZChDYWNoZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUZhY3RvcnlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzlkZjNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkdlbmVyaWNKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua0pwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFDYWNoaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhRW50aXR5SW1wbDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhRmFjdG9yeUltcGwgZXh0ZW5kcyBHZW5lcmljSnBhRmFjdG9yeSBpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSnBhRmFjdG9yeQotewotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pwYUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQocGFyZW50LCBwZXJzaXN0ZW5jZVVuaXQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhRW50aXR5IGJ1aWxkSmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKYXZhRW50aXR5SW1wbChwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhQ2FjaGluZyBidWlsZEVjbGlwc2VMaW5rSmF2YUNhY2hpbmcoSmF2YVR5cGVNYXBwaW5nIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rSmF2YUNhY2hpbmdJbXBsKHBhcmVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtQbGF0Zm9ybS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rUGxhdGZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyYzkzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtQbGF0Zm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5HZW5lcmljSnBhUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BsYXRmb3JtIGV4dGVuZHMgR2VuZXJpY0pwYVBsYXRmb3JtCi17Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZWNsaXBzZWxpbmsucGxhdGZvcm0iOwotCi0JLy8gKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua1BsYXRmb3JtKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1BsYXRmb3JtLklEOwotCX0KLQotCS8vICoqKioqKioqKiBNb2RlbCBjb25zdHJ1Y3Rpb24gLyB1cGRhdGluZyAqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhRmFjdG9yeSBidWlsZEpwYUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKcGFGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8vICoqKioqKioqKiBqYXZhIGFubm90YXRpb24gc3VwcG9ydCAqKioqKioqKioJCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYUFubm90YXRpb25Qcm92aWRlciBidWlsZEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0pwYUFubm90YXRpb25Qcm92aWRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxM2ZjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4oKSB7fQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua0pwYVByb3BlcnRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rSnBhUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzZiNDEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rSnBhUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkVjbGlwc2VMaW5rQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24uRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5FY2xpcHNlTGlua0xvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcHRpb25zLkVjbGlwc2VMaW5rT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLkVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rSnBhUHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzIGV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtQcm9wZXJ0aWVzCi17Ci0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0OwotCQotCXByaXZhdGUgQ2FjaGluZyBjYWNoaW5nOwotCXByaXZhdGUgQ29ubmVjdGlvbiBjb25uZWN0aW9uOwotCXByaXZhdGUgQ3VzdG9taXphdGlvbiBjdXN0b21pemF0aW9uOwotCXByaXZhdGUgTG9nZ2luZyBsb2dnaW5nOwotCXByaXZhdGUgT3B0aW9ucyBvcHRpb25zOwotCXByaXZhdGUgU2NoZW1hR2VuZXJhdGlvbiBzY2hlbWFHZW5lcmF0aW9uOwotCQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnRpZXNBZGFwdGVyOwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rSnBhUHJvcGVydGllcyhQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCA9IHBhcmVudDsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gcGVyc2lzdGVuY2VVbml0SG9sZGVyID0gCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4odGhpcy5wZXJzaXN0ZW5jZVVuaXQpOwotCQkKLQkJdGhpcy5wcm9wZXJ0aWVzQWRhcHRlciA9IHRoaXMuYnVpbGRQcm9wZXJ0aWVzQWRhcHRlcihwZXJzaXN0ZW5jZVVuaXRIb2xkZXIpOwotCQl0aGlzLnByb3BlcnR5TGlzdEFkYXB0ZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlMaXN0QWRhcHRlcih0aGlzLnByb3BlcnRpZXNBZGFwdGVyKTsKLQkJCi0JCXRoaXMuY2FjaGluZyA9IHRoaXMuYnVpbGRDYWNoaW5nKCk7Ci0JCXRoaXMuY29ubmVjdGlvbiA9IHRoaXMuYnVpbGRDb25uZWN0aW9uKCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbiA9IHRoaXMuYnVpbGRDdXN0b21pemF0aW9uKCk7Ci0JCXRoaXMubG9nZ2luZyA9IHRoaXMuYnVpbGRMb2dnaW5nKCk7Ci0JCXRoaXMub3B0aW9ucyA9IHRoaXMuYnVpbGRPcHRpb25zKCk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbiA9IHRoaXMuYnVpbGRTY2hlbWFHZW5lcmF0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gYnVpbGRQcm9wZXJ0eUxpc3RBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0aWVzQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxQcm9wZXJ0eT4ocHJvcGVydGllc0FkYXB0ZXIsIFByb3BlcnR5LlZBTFVFX1BST1BFUlRZKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBidWlsZFByb3BlcnRpZXNBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFByb3BlcnR5PihzdWJqZWN0SG9sZGVyLCBQZXJzaXN0ZW5jZVVuaXQuUFJPUEVSVElFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UHJvcGVydHk+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wcm9wZXJ0aWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnByb3BlcnRpZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDYWNoaW5nIGJ1aWxkQ2FjaGluZygpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0NhY2hpbmcodGhpcy5wZXJzaXN0ZW5jZVVuaXQoKSwgdGhpcy5wcm9wZXJ0eUxpc3RBZGFwdGVyKCkpOwotCX0KLQkKLQlwcml2YXRlIENvbm5lY3Rpb24gYnVpbGRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29ubmVjdGlvbih0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLCB0aGlzLnByb3BlcnR5TGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDdXN0b21pemF0aW9uIGJ1aWxkQ3VzdG9taXphdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24odGhpcy5wZXJzaXN0ZW5jZVVuaXQoKSwgdGhpcy5wcm9wZXJ0eUxpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTG9nZ2luZyBidWlsZExvZ2dpbmcoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtMb2dnaW5nKHRoaXMucGVyc2lzdGVuY2VVbml0KCksIHRoaXMucHJvcGVydHlMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIE9wdGlvbnMgYnVpbGRPcHRpb25zKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3B0aW9ucyh0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLCB0aGlzLnByb3BlcnR5TGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTY2hlbWFHZW5lcmF0aW9uIGJ1aWxkU2NoZW1hR2VuZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24odGhpcy5wZXJzaXN0ZW5jZVVuaXQoKSwgdGhpcy5wcm9wZXJ0eUxpc3RBZGFwdGVyKCkpOwotCX0KLQkKLQkvLyAqKioqKioqKiBCZWhhdmlvciAqKioqKioqKioKLQlwdWJsaWMgQ2FjaGluZyBnZXRDYWNoaW5nKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nOwotCX0KLQkKLQlwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uOwotCX0KLQotCXB1YmxpYyBDdXN0b21pemF0aW9uIGdldEN1c3RvbWl6YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6YXRpb247Ci0JfQotCi0JcHVibGljIExvZ2dpbmcgZ2V0TG9nZ2luZygpIHsKLQkJcmV0dXJuIHRoaXMubG9nZ2luZzsKLQl9Ci0KLQlwdWJsaWMgT3B0aW9ucyBnZXRPcHRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zOwotCX0KLQkKLQlwdWJsaWMgU2NoZW1hR2VuZXJhdGlvbiBnZXRTY2hlbWFHZW5lcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFHZW5lcmF0aW9uOwotCX0KLQotCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydGllc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnRpZXNBZGFwdGVyOwotCX0KLQotCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMucHJvcGVydHlMaXN0QWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0OwotCX0KLQkKLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGl0ZW1Jc1Byb3BlcnR5KFByb3BlcnR5IGl0ZW0pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBwcm9wZXJ0eUlkRm9yKFByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2NWY5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci0KLS8qKgotICogRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGV4dGVuZHMgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdAotewotCXByaXZhdGUgRWNsaXBzZUxpbmtQcm9wZXJ0aWVzIGVjbGlwc2VMaW5rUHJvcGVydGllczsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXN1cGVyKHBhcmVudCwgcGVyc2lzdGVuY2VVbml0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSh4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCQl0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcyA9IG5ldyBFY2xpcHNlTGlua0pwYVByb3BlcnRpZXModGhpcyk7Ci0JfQotCi0JLy8gKioqKioqKiogQmVoYXZpb3IgKioqKioqKioqCi0JcHVibGljIENhY2hpbmcgZ2V0Q2FjaGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzLmdldENhY2hpbmcoKTsKLQl9Ci0JCi0JcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzLmdldENvbm5lY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQ3VzdG9taXphdGlvbiBnZXRDdXN0b21pemF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMuZ2V0Q3VzdG9taXphdGlvbigpOwotCX0KLQotCXB1YmxpYyBMb2dnaW5nIGdldExvZ2dpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcy5nZXRMb2dnaW5nKCk7Ci0JfQotCi0JcHVibGljIFNjaGVtYUdlbmVyYXRpb24gZ2V0U2NoZW1hR2VuZXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzLmdldFNjaGVtYUdlbmVyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgT3B0aW9ucyBnZXRPcHRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMuZ2V0T3B0aW9ucygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2MTUxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0gKiAKLSAqIExpc3RlbnMgdG8gdGhlIHByb3BlcnR5TGlzdEFkYXB0ZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBleHRlbmRzIEFic3RyYWN0TW9kZWwgCi0JCQkJaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0OwotCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lciBwcm9wZXJ0eUxpc3RMaXN0ZW5lcjsKLQotCS8vIGtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleTsgdmFsdWUgPSBwcm9wZXJ0eSBpZAotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgLyBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcygKLQkJCVBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIAotCQkJTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pbml0aWFsaXplKHBhcmVudCwgcHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgKLQkJCVBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIAotCQkJTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQgPSBwYXJlbnQ7Ci0JCQotCQl0aGlzLnByb3BlcnR5TGlzdExpc3RlbmVyID0gbmV3IFBlcnNpc3RlbmNlVW5pdFByb3BlcnR5TGlzdExpc3RlbmVyKHRoaXMpOwotCQlwcm9wZXJ0eUxpc3RBZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5wcm9wZXJ0eUxpc3RMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmluaXRpYWxpemVQcm9wZXJ0eU5hbWVzKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydHlOYW1lcygpIHsKLQkJdGhpcy5wcm9wZXJ0eU5hbWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkUHJvcGVydHlOYW1lcyh0aGlzLnByb3BlcnR5TmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHByb3BlcnRpZXMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpOwotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlVW5pdDsKLQl9Ci0JCi0JcHVibGljIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0LmdldEpwYVByb2plY3QoKTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXIgcHJvcGVydHlMaXN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5TGlzdExpc3RlbmVyOwotCX0KLQotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eU5hbWVzOwotCX0KLQotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB1c2VkIGJ5IHRoZSBtZXRob2RzOiBpdGVtSXNQcm9wZXJ0eQotCSAqIGFuZCBwcm9wZXJ0eUlkRm9yLgotCSAqIAotCSAqIGtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleTsgdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKTsKLQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIGZvciBpZGVudGlmeWluZyB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXRlbUlzUHJvcGVydHkoUHJvcGVydHkgaXRlbSkgewotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSBpcyBudWxsIik7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucHJvcGVydHlOYW1lcygpLmtleVNldCgpLmNvbnRhaW5zKGl0ZW0uZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIHVzZWQgZm9yIGNoYW5nZSBub3RpZmljYXRpb24gb2YgdGhlIGdpdmVuCi0JICogcHJvcGVydHkuCi0JICovCi0JcHVibGljIFN0cmluZyBwcm9wZXJ0eUlkRm9yKFByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eUlkID0gdGhpcy5wcm9wZXJ0eU5hbWVzKCkuZ2V0KHByb3BlcnR5LmdldE5hbWUoKSk7Ci0JCWlmIChwcm9wZXJ0eUlkID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHlJZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGVjbGlwc2VMaW5rS2V5Rm9yKFN0cmluZyBwcm9wZXJ0eUlkKSB7Ci0JCWZvciAoU3RyaW5nIGVjbGlwc2VMaW5rS2V5IDogdGhpcy5wcm9wZXJ0eU5hbWVzKCkua2V5U2V0KCkpIHsKLQkJCWlmICh0aGlzLnByb3BlcnR5TmFtZXMoKS5nZXQoZWNsaXBzZUxpbmtLZXkpLmVxdWFscyhwcm9wZXJ0eUlkKSkgewotCQkJCXJldHVybiBlY2xpcHNlTGlua0tleTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHByb3BlcnR5OiAiICsgcHJvcGVydHlJZCk7Ci0JfQotCi0JLy8gKioqKioqIGdldC9zZXQgU3RyaW5nIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4gUHJvcGVydHkgZnJvbSB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdWYWx1ZShTdHJpbmcgZWxLZXkpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3RyaW5nVmFsdWUoZWxLZXksIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCkgewotCQlTdHJpbmcgZWxLZXkgPSAoa2V5U3VmZml4ID09IG51bGwpID8ga2V5IDoga2V5ICsga2V5U3VmZml4OwotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5jb250YWluc1Byb3BlcnR5KGVsS2V5KSkgewotCQkJLy8gVE9SRVZJRVcgLSBoYW5kbGUgaW5jb3JyZWN0IFN0cmluZyBpbiBwZXJzaXN0ZW5jZS54bWwKLQkJCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KS5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gU3RyaW5nIHZhbHVlIGludG8gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqIEBwYXJhbSBrZXkgLQotCSAqICAgICAgICAgICAgRWNsaXBzZUxpbmsgS2V5Ci0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1dFN0cmluZ1ZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBuZXdWYWx1ZSkgewotCQl0aGlzLnB1dFN0cmluZ1ZhbHVlKGtleSwgbnVsbCwgbmV3VmFsdWUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBQdXQgdGhlIGdpdmVuIFN0cmluZyB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBFY2xpcHNlTGluayBLZXkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0JICogQHBhcmFtIGFsbG93RHVwbGljYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHV0U3RyaW5nVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIG5ld1ZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlKSB7Ci0JCXRoaXMucHV0U3RyaW5nVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgYWxsb3dEdXBsaWNhdGUpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gU3RyaW5nIHZhbHVlIGludG8gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEVjbGlwc2VMaW5rIEtleQotCSAqIEBwYXJhbSBrZXlTdWZmaXgKLQkgKiAgICAgICAgICAgIGUuZy4gZW50aXR5IG5hbWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0JICogQHBhcmFtIGFsbG93RHVwbGljYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHV0U3RyaW5nVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCwgU3RyaW5nIG5ld1ZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlKSB7Ci0JCVN0cmluZyBlbEtleSA9IChrZXlTdWZmaXggPT0gbnVsbCkgPyBrZXkgOiBrZXkgKyBrZXlTdWZmaXg7Ci0JCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGVsS2V5KTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0KCkucHV0UHJvcGVydHkoZWxLZXksIG5ld1ZhbHVlLCBhbGxvd0R1cGxpY2F0ZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKiogSW50ZWdlciBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJbnRlZ2VyIHZhbHVlIG9mIHRoZSBnaXZlbiBQcm9wZXJ0eSBmcm9tIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRJbnRlZ2VyVmFsdWUoU3RyaW5nIGVsS2V5KSB7Ci0JCXJldHVybiB0aGlzLmdldEludGVnZXJWYWx1ZShlbEtleSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEludGVnZXIgZ2V0SW50ZWdlclZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBrZXlTdWZmaXgpIHsKLQkJU3RyaW5nIGVsS2V5ID0gKGtleVN1ZmZpeCA9PSBudWxsKSA/IGtleSA6IGtleSArIGtleVN1ZmZpeDsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0KCkuY29udGFpbnNQcm9wZXJ0eShlbEtleSkpIHsKLQkJCVN0cmluZyBlY2xpcHNlTGlua1ZhbHVlID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkuZ2V0VmFsdWUoKTsKLQkJCS8vIFRPUkVWSUVXIC0gaGFuZGxlIGluY29ycmVjdCBlY2xpcHNlTGlua1ZhbHVlIFN0cmluZyBpbgotCQkJLy8gcGVyc2lzdGVuY2UueG1sCi0JCQlyZXR1cm4gZ2V0SW50ZWdlclZhbHVlT2YoZWNsaXBzZUxpbmtWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBnaXZlbiBJbnRlZ2VyIHZhbHVlIGludG8gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqIEBwYXJhbSBrZXkgLQotCSAqICAgICAgICAgICAgRWNsaXBzZUxpbmsgS2V5Ci0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1dEludGVnZXJWYWx1ZShTdHJpbmcga2V5LCBJbnRlZ2VyIG5ld1ZhbHVlKSB7Ci0JCXRoaXMucHV0SW50ZWdlclZhbHVlKGtleSwgbnVsbCwgbmV3VmFsdWUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBQdXQgdGhlIGdpdmVuIEludGVnZXIgdmFsdWUgaW50byB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgRWNsaXBzZUxpbmsgS2V5Ci0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotCSAqIEBwYXJhbSBhbGxvd0R1cGxpY2F0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1dEludGVnZXJWYWx1ZShTdHJpbmcga2V5LCBJbnRlZ2VyIG5ld1ZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlKSB7Ci0JCXRoaXMucHV0SW50ZWdlclZhbHVlKGtleSwgbnVsbCwgbmV3VmFsdWUsIGFsbG93RHVwbGljYXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBQdXQgdGhlIGdpdmVuIEludGVnZXIgdmFsdWUgaW50byB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgRWNsaXBzZUxpbmsgS2V5Ci0JICogQHBhcmFtIGtleVN1ZmZpeAotCSAqICAgICAgICAgICAgZS5nLiBlbnRpdHkgbmFtZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLQkgKiBAcGFyYW0gYWxsb3dEdXBsaWNhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXRJbnRlZ2VyVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCwgSW50ZWdlciBuZXdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZSkgewotCQlTdHJpbmcgZWxLZXkgPSAoa2V5U3VmZml4ID09IG51bGwpID8ga2V5IDoga2V5ICsga2V5U3VmZml4OwotCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShlbEtleSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnB1dFByb3BlcnR5KGVsS2V5LCBuZXdWYWx1ZS50b1N0cmluZygpLCBhbGxvd0R1cGxpY2F0ZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKiogQm9vbGVhbiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKiogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQm9vbGVhbiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gUHJvcGVydHkgZnJvbSB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKFN0cmluZyBlbEtleSkgewotCQlyZXR1cm4gdGhpcy5nZXRCb29sZWFuVmFsdWUoZWxLZXksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEJvb2xlYW4gdmFsdWUgb2YgdGhlIGdpdmVuIFByb3BlcnR5IGZyb20gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGdldEJvb2xlYW5WYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcga2V5U3VmZml4KSB7Ci0JCVN0cmluZyBlbEtleSA9IChrZXlTdWZmaXggPT0gbnVsbCkgPyBrZXkgOiBrZXkgKyBrZXlTdWZmaXg7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmNvbnRhaW5zUHJvcGVydHkoZWxLZXkpKSB7Ci0JCQlTdHJpbmcgZWNsaXBzZUxpbmtWYWx1ZSA9IHRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpLmdldFZhbHVlKCk7Ci0JCQkvLyBUT1JFVklFVyAtIGhhbmRsZSBpbmNvcnJlY3QgZWNsaXBzZUxpbmtWYWx1ZSBTdHJpbmcgaW4KLQkJCS8vIHBlcnNpc3RlbmNlLnhtbAotCQkJcmV0dXJuIGdldEJvb2xlYW5WYWx1ZU9mKGVjbGlwc2VMaW5rVmFsdWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gQm9vbGVhbiB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBFY2xpcHNlTGluayBLZXkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHV0Qm9vbGVhblZhbHVlKFN0cmluZyBrZXksIEJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJdGhpcy5wdXRCb29sZWFuVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gQm9vbGVhbiB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBFY2xpcHNlTGluayBLZXkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0JICogQHBhcmFtIGFsbG93RHVwbGljYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHV0Qm9vbGVhblZhbHVlKFN0cmluZyBrZXksIEJvb2xlYW4gbmV3VmFsdWUsIGJvb2xlYW4gYWxsb3dEdXBsaWNhdGUpIHsKLQkJdGhpcy5wdXRCb29sZWFuVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgYWxsb3dEdXBsaWNhdGUpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gQm9vbGVhbiB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBFY2xpcHNlTGluayBLZXkKLQkgKiBAcGFyYW0ga2V5U3VmZml4Ci0JICogICAgICAgICAgICBlLmcuIGVudGl0eSBuYW1lCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotCSAqIEBwYXJhbSBhbGxvd0R1cGxpY2F0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1dEJvb2xlYW5WYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcga2V5U3VmZml4LCBCb29sZWFuIG5ld1ZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlKSB7Ci0JCVN0cmluZyBlbEtleSA9IChrZXlTdWZmaXggPT0gbnVsbCkgPyBrZXkgOiBrZXkgKyBrZXlTdWZmaXg7Ci0JCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGVsS2V5KTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0KCkucHV0UHJvcGVydHkoZWxLZXksIG5ld1ZhbHVlLnRvU3RyaW5nKCksIGFsbG93RHVwbGljYXRlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKiBFbnVtIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFbnVtIHZhbHVlIG9mIHRoZSBnaXZlbiBQcm9wZXJ0eSBmcm9tIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKi8KLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBFbnVtPFQ+PiBUIGdldEVudW1WYWx1ZShTdHJpbmcgZWxLZXksIFRbXSBlbnVtVmFsdWVzKSB7Ci0JCXJldHVybiBnZXRFbnVtVmFsdWUoZWxLZXksIG51bGwsIGVudW1WYWx1ZXMpOwotCX0KLQotCXByb3RlY3RlZCA8VCBleHRlbmRzIEVudW08VD4+IFQgZ2V0RW51bVZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBrZXlTdWZmaXgsIFRbXSBlbnVtVmFsdWVzKSB7Ci0JCVN0cmluZyBlbEtleSA9IChrZXlTdWZmaXggPT0gbnVsbCkgPyBrZXkgOiBrZXkgKyBrZXlTdWZmaXg7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmNvbnRhaW5zUHJvcGVydHkoZWxLZXkpKSB7Ci0JCQlTdHJpbmcgZWxTdHJpbmdWYWx1ZSA9IHRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpLmdldFZhbHVlKCk7Ci0JCQkvLyBUT1JFVklFVyAtIGhhbmRsZSBpbmNvcnJlY3QgZWNsaXBzZUxpbmtWYWx1ZSBTdHJpbmcgaW4gcGVyc2lzdGVuY2UueG1sCi0JCQlyZXR1cm4gZ2V0RW51bVZhbHVlT2YoZWxTdHJpbmdWYWx1ZSwgZW51bVZhbHVlcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBnaXZlbiBFbnVtIHZhbHVlIGludG8gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqIAotCSAqIEBwYXJhbSBrZXkgLQotCSAqICAgICAgICAgICAgRWNsaXBzZUxpbmsgS2V5Ci0JICovCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgRW51bTxUPj4gdm9pZCBwdXRFbnVtVmFsdWUoU3RyaW5nIGtleSwgVCBuZXdWYWx1ZSkgewotCQl0aGlzLnB1dEVudW1WYWx1ZShrZXksIG51bGwsIG5ld1ZhbHVlLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgRW51bTxUPj4gdm9pZCBwdXRFbnVtVmFsdWUoU3RyaW5nIGtleSwgVCBuZXdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZSkgewotCQl0aGlzLnB1dEVudW1WYWx1ZShrZXksIG51bGwsIG5ld1ZhbHVlLCBhbGxvd0R1cGxpY2F0ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgRW51bTxUPj4gdm9pZCBwdXRFbnVtVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCwgVCBuZXdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZSkgewotCQlTdHJpbmcgZWxLZXkgPSAoa2V5U3VmZml4ID09IG51bGwpID8ga2V5IDoga2V5ICsga2V5U3VmZml4OwotCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShlbEtleSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnB1dFByb3BlcnR5KGVsS2V5LCBnZXRFY2xpcHNlTGlua1N0cmluZ1ZhbHVlT2YobmV3VmFsdWUpLCBhbGxvd0R1cGxpY2F0ZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKiBDb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqCi0JLyoqCi0JICogUHV0IGludG8gcGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMuCi0JICogCi0JICogQHBhcmFtIGtleSAtCi0JICogICAgICAgICAgICBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIHByb3BlcnR5IHZhbHVlCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgcHV0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCVN0cmluZyBlbEtleSA9IHRoaXMuZWNsaXBzZUxpbmtLZXlGb3Ioa2V5KTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQl0aGlzLnJlbW92ZVByb3BlcnR5KGVsS2V5KTsKLQkJZWxzZSBpZiAodmFsdWUuZ2V0Q2xhc3MoKS5pc0VudW0oKSkKLQkJCXRoaXMucHV0RW51bVZhbHVlKGVsS2V5LCAoRW51bSkgdmFsdWUpOwotCQllbHNlCi0JCQkgdGhpcy5wdXRQcm9wZXJ0eV8oZWxLZXksIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHV0UHJvcGVydHlfKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnB1dFByb3BlcnR5KGtleSwgdmFsdWUudG9TdHJpbmcoKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBrZXkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGVsS2V5KSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkoZWxLZXkpOwotCX0KLQotCXByb3RlY3RlZCBTZXQ8UHJvcGVydHk+IGdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KFN0cmluZyBrZXlQcmVmaXgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5wcm9wZXJ0aWVzV2l0aFByZWZpeChrZXlQcmVmaXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgZW50aXR5TmFtZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuIElmIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogaGFzIG5vIHN1ZmZpeCwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVudGl0eU5hbWUoUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGdldEVudGl0eU5hbWUocHJvcGVydHkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgZW50aXR5TmFtZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy4gSWYgdGhlIHN0cmluZwotCSAqIGhhcyBubyBzdWZmaXgsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbnRpdHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaW50IGluZGV4ID0gcHJvcGVydHlOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JfQotCi0JLy8gKioqKioqIFN0YXRpYyBtZXRob2RzICoqKioqKiogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRWNsaXBzZUxpbmsgc3RyaW5nIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtTdHJpbmdWYWx1ZU9mKE9iamVjdCB2YWx1ZSkgewotCQkKLQkJaWYgKHZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpIHsKLQkJCXJldHVybiAoU3RyaW5nKSBDbGFzc1Rvb2xzLnN0YXRpY0ZpZWxkVmFsdWUodmFsdWUuZ2V0Q2xhc3MoKSwgdmFsdWUudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpKTsKLQkJfQotCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbnVtIGNvbnN0YW50IG9mIHRoZSBzcGVjaWZpZWQgZW51bSB0eXBlIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgRW51bTxUPj4gVCBnZXRFbnVtVmFsdWVPZihTdHJpbmcgZWxTdHJpbmdWYWx1ZSwgVFtdIGVudW1WYWx1ZXMpIHsKLQkJZm9yIChUIGVudW1WYWx1ZSA6IGVudW1WYWx1ZXMpIHsKLQkJCWlmIChnZXRFY2xpcHNlTGlua1N0cmluZ1ZhbHVlT2YoZW51bVZhbHVlKS5lcXVhbHMoZWxTdHJpbmdWYWx1ZSkpIHsKLQkJCQlyZXR1cm4gZW51bVZhbHVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiBnZXRCb29sZWFuVmFsdWVPZihTdHJpbmcgZWxTdHJpbmdWYWx1ZSkgewotCQlpZiAoZWxTdHJpbmdWYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGVsU3RyaW5nVmFsdWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW50ZWdlciBnZXRJbnRlZ2VyVmFsdWVPZihTdHJpbmcgZWxTdHJpbmdWYWx1ZSkgewotCQlpZiAoZWxTdHJpbmdWYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKGVsU3RyaW5nVmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYzBiYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtQcm9wZXJ0aWVzIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCUNhY2hpbmcgZ2V0Q2FjaGluZygpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hJTkdfUFJPUEVSVFkgPSAiY2FjaGluZ1Byb3BlcnR5IjsKLQkJCi0JQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCk7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX1BST1BFUlRZID0gImNvbm5lY3Rpb25Qcm9wZXJ0eSI7Ci0JCi0JQ3VzdG9taXphdGlvbiBnZXRDdXN0b21pemF0aW9uKCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpBVElPTl9QUk9QRVJUWSA9ICJjdXN0b21pemF0aW9uUHJvcGVydHkiOwotCQkKLQkJTG9nZ2luZyBnZXRMb2dnaW5nKCk7Ci0JCQlzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dJTkdfUFJPUEVSVFkgPSAibG9nZ2luZ1Byb3BlcnR5IjsKLQkJCQotCQlPcHRpb25zIGdldE9wdGlvbnMoKTsKLQkJCXN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OU19QUk9QRVJUWSA9ICJvcHRpb25zUHJvcGVydHkiOwotCQkKLQlTY2hlbWFHZW5lcmF0aW9uIGdldFNjaGVtYUdlbmVyYXRpb24oKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfR0VORVJBVElPTl9QUk9QRVJUWSA9ICJzY2hlbWFHZW5lcmF0aW9uUHJvcGVydHkiOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTZlOTRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZXh0ZW5kcyBNb2RlbCwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotewotCS8qKgotCSAqIE1ldGhvZCB1c2VkIGZvciBpZGVudGlmeWluZyB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0JICovCi0JYm9vbGVhbiBpdGVtSXNQcm9wZXJ0eShQcm9wZXJ0eSBpdGVtKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgdXNlZCBmb3IgY2hhbmdlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0JICovCi0JU3RyaW5nIHByb3BlcnR5SWRGb3IoUHJvcGVydHkgcHJvcGVydHkpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgUGVyc2lzdGVuY2VVbml0IG9mIHRoaXMgUHJvcGVydGllcy4KLQkgKi8KLQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCB0aGUgUGVyc2lzdGVuY2VVbml0IGJlbG9uZ3MgdG8uCi0JICovCi0JSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbmNlVW5pdFByb3BlcnR5TGlzdExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMzNjNDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXIgTm90aWZpZXMgdGhlIGdpdmVuIHBhcmVudCB3aGVuIGEgY2hhbmdlCi0gKiBvY2N1cmVkIGluIEpQVCBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgcGFyZW50OwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgLyBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnR5TGlzdExpc3RlbmVyKFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8vICoqKioqKioqKiogQmVoYXZpb3IgKioqKioqKioqKgotCXByb3RlY3RlZCBib29sZWFuIGFkZChQcm9wZXJ0eSBuZXdJdGVtLCBNb2RlbCBzb3VyY2UpIHsKLQkJaWYgKHRoaXMubW9kZWwoKS5pdGVtSXNQcm9wZXJ0eShuZXdJdGVtKSkgewotCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMubW9kZWwoKS5wcm9wZXJ0eUlkRm9yKG5ld0l0ZW0pOwotCQkJdGhpcy5tb2RlbCgpLnByb3BlcnR5Q2hhbmdlZCgKLQkJCQluZXcgUHJvcGVydHlDaGFuZ2VFdmVudChzb3VyY2UsIHByb3BlcnR5TmFtZSwgbnVsbCwgbmV3SXRlbSkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZShQcm9wZXJ0eSBpdGVtLCBNb2RlbCBzb3VyY2UpIHsKLQkJaWYgKHRoaXMubW9kZWwoKS5pdGVtSXNQcm9wZXJ0eShpdGVtKSkgewotCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMubW9kZWwoKS5wcm9wZXJ0eUlkRm9yKGl0ZW0pOwotCQkJdGhpcy5tb2RlbCgpLnByb3BlcnR5Q2hhbmdlZCgKLQkJCQluZXcgUHJvcGVydHlDaGFuZ2VFdmVudChzb3VyY2UsIHByb3BlcnR5TmFtZSwgaXRlbSwgbnVsbCkpOyAvLyBvbGRJdGVtIGlzIHRoZSByZW1vdmVkIHByb3BlcnR5Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gcmVwbGFjZQotCXByb3RlY3RlZCBQcm9wZXJ0eSBzZXQoUHJvcGVydHkgbmV3SXRlbSwgTW9kZWwgc291cmNlKSB7Ci0JCWlmICh0aGlzLm1vZGVsKCkuaXRlbUlzUHJvcGVydHkobmV3SXRlbSkpIHsKLQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLm1vZGVsKCkucHJvcGVydHlJZEZvcihuZXdJdGVtKTsKLQkJCXRoaXMubW9kZWwoKS5wcm9wZXJ0eUNoYW5nZWQoCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQoc291cmNlLCBwcm9wZXJ0eU5hbWUsIG51bGwsIG5ld0l0ZW0pKTsgLy8gb2xkSXRlbSB1bmtub3duCi0JCQlyZXR1cm4gbmV3SXRlbTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQlmb3IgKEl0ZXJhdG9yPFByb3BlcnR5PiBzdHJlYW0gPSB0aGlzLml0ZW1zKGUpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJdGhpcy5hZGQoc3RyZWFtLm5leHQoKSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJZm9yIChJdGVyYXRvcjxQcm9wZXJ0eT4gc3RyZWFtID0gdGhpcy5pdGVtcyhlKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXRoaXMucmVtb3ZlKHN0cmVhbS5uZXh0KCksIGUuZ2V0U291cmNlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkvLyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyKDI3MCkgZG9lcyBub3QgcHJvdmlkZSBvbGQgdmFsdWUKLQkJZm9yIChJdGVyYXRvcjxQcm9wZXJ0eT4gbmV3U3RyZWFtID0gdGhpcy5pdGVtcyhlKTsgbmV3U3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXRoaXMuc2V0KG5ld1N0cmVhbS5uZXh0KCksIGUuZ2V0U291cmNlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInNvdXJjZTogIiArIGUuZ2V0U291cmNlKCkgKyAiIC0gYXNwZWN0OiAiICsgZS5nZXRBc3BlY3ROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigic291cmNlOiAiICsgZS5nZXRTb3VyY2UoKSArICIgLSBhc3BlY3Q6ICIgKyBlLmdldEFzcGVjdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJzb3VyY2U6ICIgKyBlLmdldFNvdXJjZSgpICsgIiAtIGFzcGVjdDogIiArIGUuZ2V0QXNwZWN0TmFtZSgpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiggIiArIHRoaXMubW9kZWwoKS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIpIjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBtb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSXRlcmF0b3I8UHJvcGVydHk+IGl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhdG9yPFByb3BlcnR5PikgZXZlbnQuaXRlbXMoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBnZXRTb3VyY2UoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+KSBldmVudC5nZXRTb3VyY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jYWNoaW5nL0NhY2hlUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY2FjaGluZy9DYWNoZVByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5MDI2Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jYWNoaW5nL0NhY2hlUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZzsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQ2FjaGVQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZVByb3BlcnRpZXMgaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgU3RyaW5nIGVudGl0eU5hbWU7Ci0KLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgQ2FjaGVUeXBlIHR5cGU7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHNpemU7Ci0JcHJpdmF0ZSBCb29sZWFuIGlzU2hhcmVkOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIENhY2hlUHJvcGVydGllcyhTdHJpbmcgZW50aXR5TmFtZSkgewotCQl0aGlzLmVudGl0eU5hbWUgPSBlbnRpdHlOYW1lOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3JzICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYobyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQ2FjaGVQcm9wZXJ0aWVzIGNhY2hlID0gKENhY2hlUHJvcGVydGllcykgbzsKLQkJcmV0dXJuICgKLQkJCSh0aGlzLnR5cGUgPT0gbnVsbCA/Ci0JCQkJY2FjaGUudHlwZSA9PSBudWxsIDogdGhpcy50eXBlLmVxdWFscyhjYWNoZS50eXBlKSkgJiYKLQkJCSh0aGlzLmlzU2hhcmVkID09IG51bGwgPwotCQkJCWNhY2hlLmlzU2hhcmVkID09IG51bGwgOiB0aGlzLmlzU2hhcmVkLmVxdWFscyhjYWNoZS5pc1NoYXJlZCkpICYmCi0JCQkodGhpcy5zaXplID09IG51bGwgPwotCQkJCWNhY2hlLnNpemUgPT0gbnVsbCA6IHRoaXMuc2l6ZS5lcXVhbHMoY2FjaGUuc2l6ZSkpKTsKLQl9Ci0JCi0JIEBPdmVycmlkZQotCSBwdWJsaWMgc3luY2hyb25pemVkIENhY2hlUHJvcGVydGllcyBjbG9uZSgpIHsKLQkJIHRyeSB7Ci0JCQkgcmV0dXJuIChDYWNoZVByb3BlcnRpZXMpc3VwZXIuY2xvbmUoKTsKLQkJIH0KLQkJIGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCSB9Ci0JIH0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiAodGhpcy50eXBlID09IG51bGwpICYmCi0JCQkJCSh0aGlzLnNpemUgPT0gbnVsbCkgJiYKLQkJCQkJKHRoaXMuaXNTaGFyZWQgPT0gbnVsbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXR0ZXIvc2V0dGVyICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldEVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiBlbnRpdHlOYW1lOwotCX0KLQotCXB1YmxpYyBDYWNoZVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKENhY2hlVHlwZSBjYWNoZVR5cGUpIHsKLQkJdGhpcy50eXBlID0gY2FjaGVUeXBlOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShJbnRlZ2VyIGNhY2hlU2l6ZSkgewotCQl0aGlzLnNpemUgPSBjYWNoZVNpemU7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiB0aGlzLmlzU2hhcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNoYXJlZChCb29sZWFuIGlzU2hhcmVkKSB7Ci0JCXRoaXMuaXNTaGFyZWQgPSBpc1NoYXJlZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuYnVpbGRTaW1wbGVUb1N0cmluZ09uKHRoaXMsIHNiKTsKLQkJc2IuYXBwZW5kKCIgKCIpOwotCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCJ0eXBlOiAiKTsKLQkJc2IuYXBwZW5kKHRoaXMudHlwZSk7Ci0JCXNiLmFwcGVuZCgiLCBzaXplOiAiKTsKLQkJc2IuYXBwZW5kKHRoaXMuc2l6ZSk7Ci0JCXNiLmFwcGVuZCgiLCBpc1NoYXJlZDogIik7Ci0JCXNiLmFwcGVuZCh0aGlzLmlzU2hhcmVkKTsKLQkJc2IuYXBwZW5kKCIsIGVudGl0eU5hbWU6ICIpOwotCQlzYi5hcHBlbmQodGhpcy5lbnRpdHlOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY2FjaGluZy9DYWNoZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2NhY2hpbmcvQ2FjaGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YmYwMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY2FjaGluZy9DYWNoZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmc7Ci0KLS8qKgotICogIENhY2hlVHlwZQotICovCi1wdWJsaWMgZW51bSBDYWNoZVR5cGUgewotCXNvZnRfd2VhaywgCi0JaGFyZF93ZWFrLCAKLQl3ZWFrLAotCXNvZnQsCi0JZnVsbCwKLQlub25lOyAKLQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTEwgPSAiRnVsbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFSRF9XRUFLID0gIkhhcmRXZWFrIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIk5PTkUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPRlQgPSAiU29mdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09GVF9XRUFLID0gIlNvZnRXZWFrIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFLID0gIldlYWsiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY2FjaGluZy9DYWNoaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jYWNoaW5nL0NhY2hpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3YWI3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jYWNoaW5nL0NhY2hpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqICBDYWNoaW5nCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FjaGluZyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLXsKLQlDYWNoZVR5cGUgZ2V0RGVmYXVsdENhY2hlVHlwZURlZmF1bHQoKTsKLQlDYWNoZVR5cGUgZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCXZvaWQgc2V0Q2FjaGVUeXBlRGVmYXVsdChDYWNoZVR5cGUgY2FjaGVUeXBlRGVmYXVsdCk7Ci0JCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSA9ICJjYWNoZVR5cGVEZWZhdWx0UHJvcGVydHkiOwotCQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQgPSAiZWNsaXBzZWxpbmsuY2FjaGUudHlwZS5kZWZhdWx0IjsKLQkJCXN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgREVGQVVMVF9DQUNIRV9UWVBFX0RFRkFVTFQgPSBDYWNoZVR5cGUuc29mdF93ZWFrOwotCi0JSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTaXplRGVmYXVsdCgpOwotCUludGVnZXIgZ2V0Q2FjaGVTaXplRGVmYXVsdCgpOwotCXZvaWQgc2V0Q2FjaGVTaXplRGVmYXVsdChJbnRlZ2VyIGNhY2hlU2l6ZURlZmF1bHQpOwotCQkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFkgPSAiY2FjaGVTaXplRGVmYXVsdFByb3BlcnR5IjsKLQkJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxUID0gImVjbGlwc2VsaW5rLmNhY2hlLnNpemUuZGVmYXVsdCI7Ci0JCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX0NBQ0hFX1NJWkVfREVGQVVMVCA9IG5ldyBJbnRlZ2VyKDEwMCk7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQlCb29sZWFuIGdldFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCXZvaWQgc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KEJvb2xlYW4gc2hhcmVkQ2FjaGVEZWZhdWx0KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSA9ICJzaGFyZWRDYWNoZURlZmF1bHRQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCA9ICJlY2xpcHNlbGluay5jYWNoZS5zaGFyZWQuZGVmYXVsdCI7Ci0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfU0hBUkVEX0NBQ0hFX0RFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQotCUNhY2hlVHlwZSBnZXREZWZhdWx0Q2FjaGVUeXBlKCk7Ci0JQ2FjaGVUeXBlIGdldENhY2hlVHlwZShTdHJpbmcgZW50aXR5TmFtZSk7Ci0Jdm9pZCBzZXRDYWNoZVR5cGUoQ2FjaGVUeXBlIGNhY2hlVHlwZSwgU3RyaW5nIGVudGl0eU5hbWUpOwotCQkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9UWVBFX1BST1BFUlRZID0gImNhY2hlVHlwZVByb3BlcnR5IjsKLQkJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSA9ICJlY2xpcHNlbGluay5jYWNoZS50eXBlLiI7Ci0JCQlzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIERFRkFVTFRfQ0FDSEVfVFlQRSA9IENhY2hlVHlwZS5zb2Z0X3dlYWs7Ci0KLQlJbnRlZ2VyIGdldERlZmF1bHRDYWNoZVNpemUoKTsKLQlJbnRlZ2VyIGdldENhY2hlU2l6ZShTdHJpbmcgZW50aXR5TmFtZSk7Ci0Jdm9pZCBzZXRDYWNoZVNpemUoSW50ZWdlciBjYWNoZVNpemUsIFN0cmluZyBlbnRpdHlOYW1lKTsKLQkJCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU0laRV9QUk9QRVJUWSA9ICJjYWNoZVNpemVQcm9wZXJ0eSI7Ci0JCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUgPSAiZWNsaXBzZWxpbmsuY2FjaGUuc2l6ZS4iOwotCQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9DQUNIRV9TSVpFID0gbmV3IEludGVnZXIoMTAwKTsKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdFNoYXJlZENhY2hlKCk7Ci0JQm9vbGVhbiBnZXRTaGFyZWRDYWNoZShTdHJpbmcgZW50aXR5TmFtZSk7Ci0Jdm9pZCBzZXRTaGFyZWRDYWNoZShCb29sZWFuIHNoYXJlZENhY2hlLCBTdHJpbmcgZW50aXR5TmFtZSk7Ci0JCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRF9DQUNIRV9QUk9QRVJUWSA9ICJzaGFyZWRDYWNoZVByb3BlcnR5IjsKLQkJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFID0gImVjbGlwc2VsaW5rLmNhY2hlLnNoYXJlZC4iOwotCQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9TSEFSRURfQ0FDSEUgPSBCb29sZWFuLlRSVUU7Ci0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGVudGl0aWVzKCk7Ci0JaW50IGVudGl0aWVzU2l6ZSgpOwotCWJvb2xlYW4gZW50aXR5RXhpc3RzKFN0cmluZyBlbnRpdHkpOwotCVN0cmluZyBhZGRFbnRpdHkoU3RyaW5nIGVudGl0eSk7Ci0Jdm9pZCByZW1vdmVFbnRpdHkoU3RyaW5nIGVudGl0eSk7Ci0JCVN0cmluZyBFTlRJVElFU19MSVNUX1BST1BFUlRZID0gImVudGl0aWVzTGlzdFByb3BlcnR5IjsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZWQ5YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtDYWNoaW5nIGVuY2Fwc3VsYXRlcyBFY2xpcHNlTGluayBDYWNoaW5nIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NhY2hpbmcgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLQlpbXBsZW1lbnRzIENhY2hpbmcKLXsKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgQ2FjaGVUeXBlIGNhY2hlVHlwZURlZmF1bHQ7Ci0JcHJpdmF0ZSBJbnRlZ2VyIGNhY2hlU2l6ZURlZmF1bHQ7Ci0JcHJpdmF0ZSBCb29sZWFuIHNoYXJlZENhY2hlRGVmYXVsdDsKLQotCS8vIGtleSA9IEVudGl0eSBuYW1lIDsgdmFsdWUgPSBDYWNoZSBwcm9wZXJ0aWVzCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBDYWNoZVByb3BlcnRpZXM+IGVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hpbmcoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBwcm9wZXJ0eUxpc3RBZGFwdGVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCS8vIFRPUkVWSUVXIC0gaGFuZGxlIGluY29ycmVjdCBTdHJpbmcgaW4gcGVyc2lzdGVuY2UueG1sCi0JCXRoaXMuZW50aXRpZXNDYWNoZVByb3BlcnRpZXMgPSAKLQkJCW5ldyBIYXNoTWFwPFN0cmluZywgQ2FjaGVQcm9wZXJ0aWVzPigpOwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHQgPSAKLQkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCwgQ2FjaGVUeXBlLnZhbHVlcygpKTsKLQkJdGhpcy5jYWNoZVNpemVEZWZhdWx0ID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQpOwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdCA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQpOwotCQkKLQkJU2V0PFByb3BlcnR5PiBjYWNoZVR5cGVQcm9wZXJ0aWVzID0gCi0JCQl0aGlzLmdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUpOwotCQlTZXQ8UHJvcGVydHk+IGNhY2hlU2l6ZVByb3BlcnRpZXMgPSAKLQkJCXRoaXMuZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoRUNMSVBTRUxJTktfQ0FDSEVfU0laRSk7Ci0JCVNldDxQcm9wZXJ0eT4gc2hhcmVkQ2FjaGVQcm9wZXJ0aWVzID0gCi0JCQl0aGlzLmdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KEVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSk7Ci0JCQotCQl0aGlzLmluaXRpYWxpemVFbnRpdGllc0NhY2hlVHlwZShjYWNoZVR5cGVQcm9wZXJ0aWVzKTsKLQkJdGhpcy5pbml0aWFsaXplRW50aXRpZXNDYWNoZVNpemUoY2FjaGVTaXplUHJvcGVydGllcyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0aWVzU2hhcmVkQ2FjaGUoc2hhcmVkQ2FjaGVQcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVudGl0aWVzQ2FjaGVUeXBlKFNldDxQcm9wZXJ0eT4gcHJvcGVydGllcykgewotCQlmb3IgKFByb3BlcnR5IHByb3BlcnR5IDogcHJvcGVydGllcykgewotCQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmdldEVudGl0eU5hbWUocHJvcGVydHkpOwotCQkJQ2FjaGVUeXBlIGNhY2hlVHlwZSA9IGdldEVudW1WYWx1ZU9mKHByb3BlcnR5LmdldFZhbHVlKCksIENhY2hlVHlwZS52YWx1ZXMoKSk7Ci0JCQl0aGlzLnNldENhY2hlVHlwZV8oY2FjaGVUeXBlLCBlbnRpdHlOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRW50aXRpZXNDYWNoZVNpemUoU2V0PFByb3BlcnR5PiBwcm9wZXJ0aWVzKSB7Ci0JCWZvciAoUHJvcGVydHkgcHJvcGVydHkgOiBwcm9wZXJ0aWVzKSB7Ci0JCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZ2V0RW50aXR5TmFtZShwcm9wZXJ0eSk7Ci0JCQl0aGlzLnNldENhY2hlU2l6ZV8ocHJvcGVydHksIGVudGl0eU5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFbnRpdGllc1NoYXJlZENhY2hlKFNldDxQcm9wZXJ0eT4gcHJvcGVydGllcykgewotCQlmb3IgKFByb3BlcnR5IHByb3BlcnR5IDogcHJvcGVydGllcykgewotCQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmdldEVudGl0eU5hbWUocHJvcGVydHkpOwotCQkJdGhpcy5zZXRTaGFyZWRDYWNoZV8ocHJvcGVydHksIGVudGl0eU5hbWUpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleTsKLQkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCwKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxULAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKTsKLQkJCi0JCS8vIERvbid0IG5lZWQgdG8gaW5pdGlhbGl6ZSBwcm9wZXJ0eU5hbWVzIGZvcjogCi0JCS8vIGNhY2hlVHlwZSwgc2hhcmVkQ2FjaGUsIGNhY2hlU2l6ZQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIGZvciBpZGVudGlmeWluZyB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXRlbUlzUHJvcGVydHkoUHJvcGVydHkgaXRlbSkgewotCQlib29sZWFuIGlzUHJvcGVydHkgPSBzdXBlci5pdGVtSXNQcm9wZXJ0eShpdGVtKTsKLQkJCi0JCWlmICggISBpc1Byb3BlcnR5ICYmIGl0ZW0uZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQlpZiAoaXRlbS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19DQUNIRV9UWVBFKSB8fCAKLQkJCQkJCWl0ZW0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfU0laRSkgfHwgCi0JCQkJCQlpdGVtLmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBpc1Byb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgdXNlZCBmb3IgY2hhbmdlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZ2l2ZW4KLQkgKiBwcm9wZXJ0eS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5SWRGb3IoUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5wcm9wZXJ0eUlkRm9yKHByb3BlcnR5KTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChwcm9wZXJ0eS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19DQUNIRV9UWVBFKSkgewotCQkJCXJldHVybiBDQUNIRV9UWVBFX1BST1BFUlRZOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfU0laRSkpIHsKLQkJCQlyZXR1cm4gQ0FDSEVfU0laRV9QUk9QRVJUWTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5LmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSkpIHsKLQkJCQlyZXR1cm4gU0hBUkVEX0NBQ0hFX1BST1BFUlRZOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgYXNwZWN0TmFtZSA9IGV2ZW50LmdldEFzcGVjdE5hbWUoKTsKLQkJaWYgKGFzcGVjdE5hbWUuZXF1YWxzKENBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkpIHsKLQkJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKENBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSkpIHsKLQkJCXRoaXMuY2FjaGVTaXplRGVmYXVsdENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSkgewotCQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhDQUNIRV9UWVBFX1BST1BFUlRZKSkgewotCQkJdGhpcy5jYWNoZVR5cGVDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhDQUNIRV9TSVpFX1BST1BFUlRZKSkgewotCQkJdGhpcy5jYWNoZVNpemVDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhTSEFSRURfQ0FDSEVfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLnNoYXJlZENhY2hlQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGV2ZW50IHJlY2VpdmVkIC0gcHJvcGVydHkgbm90IGFwcGxpY2FibGU6ICIgKyBhc3BlY3ROYW1lKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVR5cGUgKioqKioqKioqKgotCXB1YmxpYyBDYWNoZVR5cGUgZ2V0Q2FjaGVUeXBlKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUNhY2hlUHJvcGVydGllcyBjYWNoZSA9IHRoaXMuY2FjaGVQcm9wZXJ0aWVzT2YoZW50aXR5TmFtZSk7Ci0JCXJldHVybiAoY2FjaGUgPT0gbnVsbCkgPyBudWxsIDogY2FjaGUuZ2V0VHlwZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlVHlwZShDYWNoZVR5cGUgbmV3Q2FjaGVUeXBlLCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDYWNoZVByb3BlcnRpZXMgb2xkID0gdGhpcy5zZXRDYWNoZVR5cGVfKG5ld0NhY2hlVHlwZSwgZW50aXR5TmFtZSk7Ci0JCXRoaXMucHV0RW51bVZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUsIGVudGl0eU5hbWUsIG5ld0NhY2hlVHlwZSwgZmFsc2UpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmNhY2hlUHJvcGVydGllc09mKGVudGl0eU5hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVUeXBlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkvLyBwcm9wZXJ0eSA9PSBudWxsIHdoZW4gcmVtb3ZlZAotCQlTdHJpbmcgZW50aXR5TmFtZSA9IChwcm9wZXJ0eSA9PSBudWxsKSA/IHRoaXMuZ2V0RW50aXR5TmFtZSgoUHJvcGVydHkpIGV2ZW50LmdldE9sZFZhbHVlKCkpIDogdGhpcy5nZXRFbnRpdHlOYW1lKHByb3BlcnR5KTsKLQkJQ2FjaGVQcm9wZXJ0aWVzIG9sZCA9IHRoaXMuc2V0Q2FjaGVUeXBlXyhwcm9wZXJ0eSwgZW50aXR5TmFtZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgdGhpcy5jYWNoZVByb3BlcnRpZXNPZihlbnRpdHlOYW1lKSk7Ci0JfQotCi0JcHVibGljIENhY2hlVHlwZSBnZXREZWZhdWx0Q2FjaGVUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuY2FjaGVUeXBlRGVmYXVsdCA9PSBudWxsKSA/IERFRkFVTFRfQ0FDSEVfVFlQRSA6IHRoaXMuY2FjaGVUeXBlRGVmYXVsdDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENhY2hlU2l6ZSAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0Q2FjaGVTaXplKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUNhY2hlUHJvcGVydGllcyBjYWNoZSA9IHRoaXMuY2FjaGVQcm9wZXJ0aWVzT2YoZW50aXR5TmFtZSk7Ci0JCXJldHVybiAoY2FjaGUgPT0gbnVsbCkgPyBudWxsIDogY2FjaGUuZ2V0U2l6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlU2l6ZShJbnRlZ2VyIG5ld0NhY2hlU2l6ZSwgU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJQ2FjaGVQcm9wZXJ0aWVzIG9sZCA9IHRoaXMuc2V0Q2FjaGVTaXplXyhuZXdDYWNoZVNpemUsIGVudGl0eU5hbWUpOwotCQl0aGlzLnB1dEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19DQUNIRV9TSVpFICsgZW50aXR5TmFtZSwgbmV3Q2FjaGVTaXplKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NJWkVfUFJPUEVSVFksIG9sZCwgdGhpcy5jYWNoZVByb3BlcnRpZXNPZihlbnRpdHlOYW1lKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhY2hlU2l6ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJLy8gcHJvcGVydHkgPT0gbnVsbCB3aGVuIHJlbW92ZWQKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSAocHJvcGVydHkgPT0gbnVsbCkgPyB0aGlzLmdldEVudGl0eU5hbWUoKFByb3BlcnR5KSBldmVudC5nZXRPbGRWYWx1ZSgpKSA6IHRoaXMuZ2V0RW50aXR5TmFtZShwcm9wZXJ0eSk7Ci0JCUNhY2hlUHJvcGVydGllcyBvbGQgPSB0aGlzLnNldENhY2hlU2l6ZV8ocHJvcGVydHksIGVudGl0eU5hbWUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIHRoaXMuY2FjaGVQcm9wZXJ0aWVzT2YoZW50aXR5TmFtZSkpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRDYWNoZVNpemUoKSB7Ci0JCXJldHVybiAodGhpcy5jYWNoZVNpemVEZWZhdWx0ID09IG51bGwpID8gREVGQVVMVF9DQUNIRV9TSVpFIDogdGhpcy5jYWNoZVNpemVEZWZhdWx0OwotCX0KLQotCS8vICoqKioqKioqKiogU2hhcmVkQ2FjaGUgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFNoYXJlZENhY2hlKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUNhY2hlUHJvcGVydGllcyBjYWNoZSA9IHRoaXMuY2FjaGVQcm9wZXJ0aWVzT2YoZW50aXR5TmFtZSk7Ci0JCXJldHVybiAoY2FjaGUgPT0gbnVsbCkgPyBudWxsIDogY2FjaGUuaXNTaGFyZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWRDYWNoZShCb29sZWFuIG5ld1NoYXJlZENhY2hlLCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDYWNoZVByb3BlcnRpZXMgb2xkID0gdGhpcy5zZXRTaGFyZWRDYWNoZV8obmV3U2hhcmVkQ2FjaGUsIGVudGl0eU5hbWUpOwotCQl0aGlzLnB1dEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUsIGVudGl0eU5hbWUsIG5ld1NoYXJlZENhY2hlLCBmYWxzZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSEFSRURfQ0FDSEVfUFJPUEVSVFksIG9sZCwgdGhpcy5jYWNoZVByb3BlcnRpZXNPZihlbnRpdHlOYW1lKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNoYXJlZENhY2hlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBlbnRpdHlOYW1lOwotCQlQcm9wZXJ0eSBuZXdQcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJLy8gcHJvcGVydHkgPT0gbnVsbCB3aGVuIHJlbW92ZWQKLQkJZW50aXR5TmFtZSA9IChuZXdQcm9wZXJ0eSA9PSBudWxsKSA/IAotCQkJdGhpcy5nZXRFbnRpdHlOYW1lKChQcm9wZXJ0eSkgZXZlbnQuZ2V0T2xkVmFsdWUoKSkgOiB0aGlzLmdldEVudGl0eU5hbWUobmV3UHJvcGVydHkpOwotCQlDYWNoZVByb3BlcnRpZXMgb2xkID0gdGhpcy5zZXRTaGFyZWRDYWNoZV8obmV3UHJvcGVydHksIGVudGl0eU5hbWUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIHRoaXMuY2FjaGVQcm9wZXJ0aWVzT2YoZW50aXR5TmFtZSkpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRTaGFyZWRDYWNoZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNoYXJlZENhY2hlRGVmYXVsdCA9PSBudWxsKSA/IERFRkFVTFRfU0hBUkVEX0NBQ0hFIDogdGhpcy5zaGFyZWRDYWNoZURlZmF1bHQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVR5cGVEZWZhdWx0ICoqKioqKioqKioKLQlwdWJsaWMgQ2FjaGVUeXBlIGdldENhY2hlVHlwZURlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlVHlwZURlZmF1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FjaGVUeXBlRGVmYXVsdChDYWNoZVR5cGUgbmV3Q2FjaGVUeXBlRGVmYXVsdCkgewotCQlDYWNoZVR5cGUgb2xkID0gdGhpcy5jYWNoZVR5cGVEZWZhdWx0OwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHQgPSBuZXdDYWNoZVR5cGVEZWZhdWx0OwotCQl0aGlzLnB1dFByb3BlcnR5KENBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSwgbmV3Q2FjaGVUeXBlRGVmYXVsdCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgbmV3Q2FjaGVUeXBlRGVmYXVsdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhY2hlVHlwZURlZmF1bHRDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJQ2FjaGVUeXBlIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIENhY2hlVHlwZS52YWx1ZXMoKSk7Ci0JCUNhY2hlVHlwZSBvbGQgPSB0aGlzLmNhY2hlVHlwZURlZmF1bHQ7Ci0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQ2FjaGVUeXBlIGdldERlZmF1bHRDYWNoZVR5cGVEZWZhdWx0KCkgewotCQlyZXR1cm4gREVGQVVMVF9DQUNIRV9UWVBFX0RFRkFVTFQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVNpemVEZWZhdWx0ICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRDYWNoZVNpemVEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZVNpemVEZWZhdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlU2l6ZURlZmF1bHQoSW50ZWdlciBuZXdDYWNoZVNpemVEZWZhdWx0KSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5jYWNoZVNpemVEZWZhdWx0OwotCQl0aGlzLmNhY2hlU2l6ZURlZmF1bHQgPSBuZXdDYWNoZVNpemVEZWZhdWx0OwotCQl0aGlzLnB1dFByb3BlcnR5KENBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSwgbmV3Q2FjaGVTaXplRGVmYXVsdCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgbmV3Q2FjaGVTaXplRGVmYXVsdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhY2hlU2l6ZURlZmF1bHRDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmNhY2hlU2l6ZURlZmF1bHQ7Ci0JCXRoaXMuY2FjaGVTaXplRGVmYXVsdCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTaXplRGVmYXVsdCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfQ0FDSEVfU0laRV9ERUZBVUxUOwotCX0KLQotCS8vICoqKioqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWRDYWNoZURlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWRDYWNoZURlZmF1bHQoQm9vbGVhbiBuZXdTaGFyZWRDYWNoZURlZmF1bHQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdDsKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHQgPSBuZXdTaGFyZWRDYWNoZURlZmF1bHQ7Ci0JCXRoaXMucHV0UHJvcGVydHkoU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFksIG5ld1NoYXJlZENhY2hlRGVmYXVsdCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSwgb2xkLCBuZXdTaGFyZWRDYWNoZURlZmF1bHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaGFyZWRDYWNoZURlZmF1bHRDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5zaGFyZWRDYWNoZURlZmF1bHQ7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0ID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHQoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NIQVJFRF9DQUNIRV9ERUZBVUxUOwotCX0KLQotCS8vICoqKioqKiBDYWNoZVByb3BlcnRpZXMgKioqKioqKgotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byB1cGRhdGUgdGhlIENhY2hlVHlwZSBpbiBlbnRpdGllc0NhY2hlIG1hcC4gUmV0dXJucwotCSAqIHRoZSBvbGQgdmFsdWUgb2YgQ2FjaGVQcm9wZXJ0aWVzCi0JICovCi0JcHJpdmF0ZSBDYWNoZVByb3BlcnRpZXMgc2V0Q2FjaGVUeXBlXyhQcm9wZXJ0eSBuZXdQcm9wZXJ0eSwgU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKG5ld1Byb3BlcnR5ID09IG51bGwpID8gbnVsbCA6IG5ld1Byb3BlcnR5LmdldFZhbHVlKCk7Ci0JCUNhY2hlVHlwZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBDYWNoZVR5cGUudmFsdWVzKCkpOwotCQlyZXR1cm4gdGhpcy5zZXRDYWNoZVR5cGVfKG5ld1ZhbHVlLCBlbnRpdHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlUHJvcGVydGllcyBzZXRDYWNoZVR5cGVfKENhY2hlVHlwZSBuZXdWYWx1ZSwgU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJQ2FjaGVQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSB0aGlzLmNhY2hlUHJvcGVydGllc09mKGVudGl0eU5hbWUpOwotCQlDYWNoZVByb3BlcnRpZXMgb2xkID0gcHJvcGVydGllcy5jbG9uZSgpOwotCQlwcm9wZXJ0aWVzLnNldFR5cGUobmV3VmFsdWUpOwotCQl0aGlzLnB1dEVudGl0eUNhY2hlUHJvcGVydGllcyhlbnRpdHlOYW1lLCBwcm9wZXJ0aWVzKTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gdXBkYXRlIHRoZSBDYWNoZVNpemUgaW4gZW50aXRpZXNDYWNoZSBtYXAuIFJldHVybnMKLQkgKiB0aGUgb2xkIHZhbHVlIG9mIENhY2hlUHJvcGVydGllcwotCSAqLwotCXByaXZhdGUgQ2FjaGVQcm9wZXJ0aWVzIHNldENhY2hlU2l6ZV8oUHJvcGVydHkgbmV3UHJvcGVydHksIFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChuZXdQcm9wZXJ0eSA9PSBudWxsKSA/IG51bGwgOiBuZXdQcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQlyZXR1cm4gdGhpcy5zZXRDYWNoZVNpemVfKG5ld1ZhbHVlLCBlbnRpdHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlUHJvcGVydGllcyBzZXRDYWNoZVNpemVfKEludGVnZXIgbmV3VmFsdWUsIFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUNhY2hlUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gdGhpcy5jYWNoZVByb3BlcnRpZXNPZihlbnRpdHlOYW1lKTsKLQkJQ2FjaGVQcm9wZXJ0aWVzIG9sZCA9IHByb3BlcnRpZXMuY2xvbmUoKTsKLQkJcHJvcGVydGllcy5zZXRTaXplKG5ld1ZhbHVlKTsKLQkJdGhpcy5wdXRFbnRpdHlDYWNoZVByb3BlcnRpZXMoZW50aXR5TmFtZSwgcHJvcGVydGllcyk7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHVwZGF0ZSB0aGUgU2hhcmVkQ2FjaGUgaW4gZW50aXRpZXNDYWNoZVByb3BlcnRpZXMgbWFwLgotCSAqIFJldHVybnMgdGhlIG9sZCB2YWx1ZSBvZiBDYWNoZVByb3BlcnRpZXMKLQkgKi8KLQlwcml2YXRlIENhY2hlUHJvcGVydGllcyBzZXRTaGFyZWRDYWNoZV8oUHJvcGVydHkgbmV3UHJvcGVydHksIFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IChuZXdQcm9wZXJ0eSA9PSBudWxsKSA/IG51bGwgOiBuZXdQcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gdGhpcy5zZXRTaGFyZWRDYWNoZV8obmV3VmFsdWUsIGVudGl0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgQ2FjaGVQcm9wZXJ0aWVzIHNldFNoYXJlZENhY2hlXyhTdHJpbmcgbmV3U3RyaW5nLCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2YobmV3U3RyaW5nKTsKLQkJcmV0dXJuIHNldFNoYXJlZENhY2hlXyhuZXdWYWx1ZSwgZW50aXR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDYWNoZVByb3BlcnRpZXMgc2V0U2hhcmVkQ2FjaGVfKEJvb2xlYW4gbmV3VmFsdWUsIFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUNhY2hlUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gdGhpcy5jYWNoZVByb3BlcnRpZXNPZihlbnRpdHlOYW1lKTsKLQkJQ2FjaGVQcm9wZXJ0aWVzIG9sZCA9IHByb3BlcnRpZXMuY2xvbmUoKTsKLQkJcHJvcGVydGllcy5zZXRTaGFyZWQobmV3VmFsdWUpOwotCQl0aGlzLnB1dEVudGl0eUNhY2hlUHJvcGVydGllcyhlbnRpdHlOYW1lLCBwcm9wZXJ0aWVzKTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDYWNoZVByb3BlcnRpZXMgb2YgdGhlIEVudGl0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqLwotCXByaXZhdGUgQ2FjaGVQcm9wZXJ0aWVzIGNhY2hlUHJvcGVydGllc09mKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUNhY2hlUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gdGhpcy5lbnRpdGllc0NhY2hlUHJvcGVydGllcy5nZXQoZW50aXR5TmFtZSk7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCXByb3BlcnRpZXMgPSBuZXcgQ2FjaGVQcm9wZXJ0aWVzKGVudGl0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIFNldCBhbGwgQ2FjaGVQcm9wZXJ0aWVzIHRvIGRlZmF1bHQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyQ2FjaGVQcm9wZXJ0aWVzKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCXRoaXMuc2V0Q2FjaGVUeXBlKG51bGwsIGVudGl0eU5hbWUpOwotCQl0aGlzLnNldENhY2hlU2l6ZShudWxsLCBlbnRpdHlOYW1lKTsKLQkJdGhpcy5zZXRTaGFyZWRDYWNoZShudWxsLCBlbnRpdHlOYW1lKTsKLQl9Ci0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvKioKLQkgKiBQdXQgdGhlIGdpdmVuIEVudGl0eSBDYWNoZVByb3BlcnRpZXMgaW4gdGhpcyBlbnRpdGllc0NhY2hlUHJvcGVydGllcyBtYXAuCi0JICogQHBhcmFtIGVudGl0eU5hbWUgLSBFbnRpdHkgbmFtZS4gVGhlIGVudGl0eSBtYXkgYmUgYSBuZXcgb3IgYW4gZXhpc3RpbmcgZW50aXR5LgotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gRW50aXR5IENhY2hlUHJvcGVydGllcwotCSAqLwotCXByaXZhdGUgdm9pZCBwdXRFbnRpdHlDYWNoZVByb3BlcnRpZXMoU3RyaW5nIGVudGl0eU5hbWUsIENhY2hlUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXRoaXMuYWRkT3JSZXBsYWNlUHJvcGVydGllc0ZvckVudGl0eShlbnRpdHlOYW1lLCBwcm9wZXJ0aWVzKTsKLQl9Ci0KLQkvLyAqKioqKiogZW50aXRpZXMgbGlzdCAqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gZW50aXRpZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzLmtleVNldCgpKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGVudGl0aWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXRpZXNDYWNoZVByb3BlcnRpZXMuc2l6ZSgpOwotCX0KLQotCS8qIAotCSAqIFZlcmlmaWVzIGlmIHRoaXMgZW50aXRpZXNDYWNoZVByb3BlcnRpZXMgbWFwIGNvbnRhaW5zIHRoZSBnaXZlbiBFbnRpdHkuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVudGl0eUV4aXN0cyhTdHJpbmcgZW50aXR5KSB7Ci0JCXJldHVybiB0aGlzLmVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KGVudGl0eSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBhZGRFbnRpdHkoU3RyaW5nIGVudGl0eSkgewotCQlpZiAoZW50aXR5RXhpc3RzKGVudGl0eSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVudGl0eSAiICsgZW50aXR5ICsgIiBhbHJlYWR5IGV4aXN0LiIpOwotCQl9Ci0JCXJldHVybiB0aGlzLmFkZE9yUmVwbGFjZVByb3BlcnRpZXNGb3JFbnRpdHkoZW50aXR5LCBuZXcgQ2FjaGVQcm9wZXJ0aWVzKGVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgb3IgcmVwbGFjZXMgdGhlIGdpdmVuIEVudGl0eSBDYWNoZVByb3BlcnRpZXMgaW4gdGhpcwotCSAqIGVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzIG1hcC4gCi0JICogSWYgdGhlIHNwZWNpZmllZCBFbnRpdHkgZXhpc3RzIGFuZCB0aGUgZ2l2ZW4gQ2FjaGVQcm9wZXJ0aWVzIGlzIGVtcHR5IAotCSAqIChpLmUuIGFsbCBwcm9wZXJ0aWVzIGFyZSBudWxsKSB0aGUgbWFwcGluZyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFwLgotCSAqIAotCSAqIEBwYXJhbSBlbnRpdHkgLSBFbnRpdHkgbmFtZQotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gRW50aXR5IENhY2hlUHJvcGVydGllcwotCSAqIEByZXR1cm4gRW50aXR5IG5hbWUgYWRkZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBhZGRPclJlcGxhY2VQcm9wZXJ0aWVzRm9yRW50aXR5KFN0cmluZyBlbnRpdHksIENhY2hlUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCWlmICh0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHkpKSB7Ci0JCQl0aGlzLnJlcGxhY2VFbnRpdHlfKGVudGl0eSwgcHJvcGVydGllcyk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0aGlzLmVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzLnB1dChlbnRpdHksIHByb3BlcnRpZXMpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChFTlRJVElFU19MSVNUX1BST1BFUlRZKTsKLQkJcmV0dXJuIGVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgZ2l2ZW4gRW50aXR5IENhY2hlUHJvcGVydGllcyBpbiB0aGlzCi0JICogZW50aXRpZXNDYWNoZVByb3BlcnRpZXMgbWFwLgotCSAqIElmIHRoZSBnaXZlbiBFbnRpdHkgQ2FjaGVQcm9wZXJ0aWVzIGlzIGVtcHR5IChpLmUuIGFsbCBwcm9wZXJ0aWVzIGFyZSBudWxsKSB0aGUgCi0JICogbWFwcGluZyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFwLgotCSAqIEBwYXJhbSBlbnRpdHkgLSBFbnRpdHkgbmFtZQotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gRW50aXR5IENhY2hlUHJvcGVydGllcwotCSAqIEByZXR1cm4gRW50aXR5IG5hbWUgcmVwbGFjZWQKLQkgKi8KLQlwcml2YXRlIENhY2hlUHJvcGVydGllcyByZXBsYWNlRW50aXR5XyhTdHJpbmcgZW50aXR5LCBDYWNoZVByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlDYWNoZVByb3BlcnRpZXMgb2xkID0gdGhpcy5lbnRpdGllc0NhY2hlUHJvcGVydGllcy5nZXQoZW50aXR5KTsKLQkJaWYgKHByb3BlcnRpZXMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzLnJlbW92ZShlbnRpdHkpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoRU5USVRJRVNfTElTVF9QUk9QRVJUWSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzLnB1dChlbnRpdHksIHByb3BlcnRpZXMpOwotCQl9Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50aXR5KFN0cmluZyBlbnRpdHkpIHsKLQkJaWYgKCAhIHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmNsZWFyQ2FjaGVQcm9wZXJ0aWVzKGVudGl0eSk7Ci0JCXRoaXMuZW50aXRpZXNDYWNoZVByb3BlcnRpZXMucmVtb3ZlKGVudGl0eSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEVOVElUSUVTX0xJU1RfUFJPUEVSVFkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2Nvbm5lY3Rpb24vQmF0Y2hXcml0aW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jb25uZWN0aW9uL0JhdGNoV3JpdGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzJhNWMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2Nvbm5lY3Rpb24vQmF0Y2hXcml0aW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb247Ci0KLS8qKgotICogIEJhdGNoV3JpdGluZwotICovCi1wdWJsaWMgZW51bSBCYXRjaFdyaXRpbmcgewotCQkJbm9uZSwgCi0JCQlqZGJjLCAKLQkJCWJ1ZmZlcmVkLCAKLQkJCW9yYWNsZV9qZGJjOwotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIk5vbmUiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSkRCQyA9ICJKREJDIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEJVRkZFUkVEID0gIkJ1ZmZlcmVkIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE9SQUNMRV9KREJDID0gIk9yYWNsZS1KREJDIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2Nvbm5lY3Rpb24vQ29ubmVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY29ubmVjdGlvbi9Db25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwM2Q4NmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY29ubmVjdGlvbi9Db25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLQotLyoqCi0gKiAgQ29ubmVjdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb24gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldERlZmF1bHRUcmFuc2FjdGlvblR5cGUoKTsKLQlQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0Jdm9pZCBzZXRUcmFuc2FjdGlvblR5cGUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIG5ld1RyYW5zYWN0aW9uVHlwZSk7Ci0JCS8vIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkgPSAidHJhbnNhY3Rpb25UeXBlUHJvcGVydHkiOwotCQlzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIERFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRSA9IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEE7Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdEp0YURhdGFTb3VyY2UoKTsKLQlTdHJpbmcgZ2V0SnRhRGF0YVNvdXJjZSgpOwotCXZvaWQgc2V0SnRhRGF0YVNvdXJjZShTdHJpbmcgbmV3SnRhRGF0YVNvdXJjZSk7Ci0JCS8vIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSA9ICJqdGFEYXRhU291cmNlUHJvcGVydHkiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSlRBX0RBVEFfU09VUkNFID0gIiI7Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdE5vbkp0YURhdGFTb3VyY2UoKTsKLQlTdHJpbmcgZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpOwotCXZvaWQgc2V0Tm9uSnRhRGF0YVNvdXJjZShTdHJpbmcgbmV3Tm9uSnRhRGF0YVNvdXJjZSk7Ci0JCS8vIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkgPSAibm9uSnRhRGF0YVNvdXJjZVByb3BlcnR5IjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05PTl9KVEFfREFUQV9TT1VSQ0UgPSAiIjsKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdE5hdGl2ZVNxbCgpOwotCUJvb2xlYW4gZ2V0TmF0aXZlU3FsKCk7Ci0Jdm9pZCBzZXROYXRpdmVTcWwoQm9vbGVhbiBuZXdOYXRpdmVTcWwpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9TUUxfUFJPUEVSVFkgPSAibmF0aXZlU3FsUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTkFUSVZFX1NRTCA9ICJlY2xpcHNlbGluay5qZGJjLm5hdGl2ZS1zcWwiOwotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX05BVElWRV9TUUwgPSBCb29sZWFuLkZBTFNFOwotCi0JQmF0Y2hXcml0aW5nIGdldERlZmF1bHRCYXRjaFdyaXRpbmcoKTsKLQlCYXRjaFdyaXRpbmcgZ2V0QmF0Y2hXcml0aW5nKCk7Ci0Jdm9pZCBzZXRCYXRjaFdyaXRpbmcoQmF0Y2hXcml0aW5nIG5ld0JhdGNoV3JpdGluZyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQkFUQ0hfV1JJVElOR19QUk9QRVJUWSA9ICJiYXRjaFdyaXRpbmdQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19CQVRDSF9XUklUSU5HID0gImVjbGlwc2VsaW5rLmpkYmMuYmF0Y2gtd3JpdGluZyI7Ci0JCXN0YXRpYyBmaW5hbCBCYXRjaFdyaXRpbmcgREVGQVVMVF9CQVRDSF9XUklUSU5HID0gQmF0Y2hXcml0aW5nLm5vbmU7Ci0JCQotCUJvb2xlYW4gZ2V0RGVmYXVsdENhY2hlU3RhdGVtZW50cygpOwotCUJvb2xlYW4gZ2V0Q2FjaGVTdGF0ZW1lbnRzKCk7Ci0Jdm9pZCBzZXRDYWNoZVN0YXRlbWVudHMoQm9vbGVhbiBuZXdDYWNoZVN0YXRlbWVudHMpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFkgPSAiY2FjaGVTdGF0ZW1lbnRzUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUyA9ICJlY2xpcHNlbGluay5qZGJjLmNhY2hlLXN0YXRlbWVudHMiOwotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX0NBQ0hFX1NUQVRFTUVOVFMgPSBCb29sZWFuLkZBTFNFOwotCQkKLQlJbnRlZ2VyIGdldERlZmF1bHRDYWNoZVN0YXRlbWVudHNTaXplKCk7Ci0JSW50ZWdlciBnZXRDYWNoZVN0YXRlbWVudHNTaXplKCk7Ci0Jdm9pZCBzZXRDYWNoZVN0YXRlbWVudHNTaXplKEludGVnZXIgbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZID0gImNhY2hlU3RhdGVtZW50c1NpemVQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTX1NJWkUgPSAiZWNsaXBzZWxpbmsuamRiYy5jYWNoZS1zdGF0ZW1lbnRzLnNpemUiOwotCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX0NBQ0hFX1NUQVRFTUVOVFNfU0laRSA9IDUwOwotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdERyaXZlcigpOwotCVN0cmluZyBnZXREcml2ZXIoKTsKLQl2b2lkIHNldERyaXZlcihTdHJpbmcgbmV3RHJpdmVyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfUFJPUEVSVFkgPSAiZHJpdmVyUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRFJJVkVSID0gImVjbGlwc2VsaW5rLmpkYmMuZHJpdmVyIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0RSSVZFUiA9ICIiOwotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFVybCgpOwotCVN0cmluZyBnZXRVcmwoKTsKLQl2b2lkIHNldFVybChTdHJpbmcgbmV3VXJsKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUFJPUEVSVFkgPSAidXJsUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVVJMID0gImVjbGlwc2VsaW5rLmpkYmMudXJsIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1VSTCA9ICIiOwotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFVzZXIoKTsKLQlTdHJpbmcgZ2V0VXNlcigpOwotCXZvaWQgc2V0VXNlcihTdHJpbmcgbmV3VXNlcik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9QUk9QRVJUWSA9ICJ1c2VyUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVVNFUiA9ICJlY2xpcHNlbGluay5qZGJjLnVzZXIiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVVNFUiA9ICIiOwotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFBhc3N3b3JkKCk7Ci0JU3RyaW5nIGdldFBhc3N3b3JkKCk7Ci0Jdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgbmV3UGFzc3dvcmQpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1BST1BFUlRZID0gInBhc3N3b3JkUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUEFTU1dPUkQgPSAiZWNsaXBzZWxpbmsuamRiYy5wYXNzd29yZCI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QQVNTV09SRCA9ICIiOwotCi0JQm9vbGVhbiBnZXREZWZhdWx0QmluZFBhcmFtZXRlcnMoKTsKLQlCb29sZWFuIGdldEJpbmRQYXJhbWV0ZXJzKCk7Ci0Jdm9pZCBzZXRCaW5kUGFyYW1ldGVycyhCb29sZWFuIG5ld0JpbmRQYXJhbWV0ZXJzKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBCSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkgPSAiYmluZFBhcmFtZXRlcnNQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlMgPSAiZWNsaXBzZWxpbmsuamRiYy5iaW5kLXBhcmFtZXRlcnMiOwotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX0JJTkRfUEFSQU1FVEVSUyA9IEJvb2xlYW4uVFJVRTsKLQkJCi0JQm9vbGVhbiBnZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCk7Ci0JQm9vbGVhbiBnZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKTsKLQl2b2lkIHNldFJlYWRDb25uZWN0aW9uc1NoYXJlZChCb29sZWFuIG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFkgPSAicmVhZENvbm5lY3Rpb25zU2hhcmVkUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQgPSAiZWNsaXBzZWxpbmsuamRiYy5yZWFkLWNvbm5lY3Rpb25zLnNoYXJlZCI7Ci0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQgPSBCb29sZWFuLkZBTFNFOwotCi0JSW50ZWdlciBnZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWluKCk7Ci0JSW50ZWdlciBnZXRSZWFkQ29ubmVjdGlvbnNNaW4oKTsKLQl2b2lkIHNldFJlYWRDb25uZWN0aW9uc01pbihJbnRlZ2VyIG5ld1JlYWRDb25uZWN0aW9uc01pbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkgPSAicmVhZENvbm5lY3Rpb25zTWluUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NSU4gPSAiZWNsaXBzZWxpbmsuamRiYy5yZWFkLWNvbm5lY3Rpb25zLm1pbiI7Ci0JCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19NSU4gPSAyOwotCi0JSW50ZWdlciBnZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWF4KCk7Ci0JSW50ZWdlciBnZXRSZWFkQ29ubmVjdGlvbnNNYXgoKTsKLQl2b2lkIHNldFJlYWRDb25uZWN0aW9uc01heChJbnRlZ2VyIG5ld1JlYWRDb25uZWN0aW9uc01heCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkgPSAicmVhZENvbm5lY3Rpb25zTWF4UHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NQVggPSAiZWNsaXBzZWxpbmsuamRiYy5yZWFkLWNvbm5lY3Rpb25zLm1heCI7Ci0JCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19NQVggPSAyOwotCi0JSW50ZWdlciBnZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbigpOwotCUludGVnZXIgZ2V0V3JpdGVDb25uZWN0aW9uc01pbigpOwotCXZvaWQgc2V0V3JpdGVDb25uZWN0aW9uc01pbihJbnRlZ2VyIG5ld1dyaXRlQ29ubmVjdGlvbnNNaW4pOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSA9ICJ3cml0ZUNvbm5lY3Rpb25zTWluUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUlOID0gImVjbGlwc2VsaW5rLmpkYmMud3JpdGUtY29ubmVjdGlvbnMubWluIjsKLQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9XUklURV9DT05ORUNUSU9OU19NSU4gPSA1OwotCi0JSW50ZWdlciBnZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01heCgpOwotCUludGVnZXIgZ2V0V3JpdGVDb25uZWN0aW9uc01heCgpOwotCXZvaWQgc2V0V3JpdGVDb25uZWN0aW9uc01heChJbnRlZ2VyIG5ld1dyaXRlQ29ubmVjdGlvbnNNYXgpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSA9ICJ3cml0ZUNvbm5lY3Rpb25zTWF4UHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUFYID0gImVjbGlwc2VsaW5rLmpkYmMud3JpdGUtY29ubmVjdGlvbnMubWF4IjsKLQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9XUklURV9DT05ORUNUSU9OU19NQVggPSAxMDsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTU2ZjUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtDb25uZWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Nvbm5lY3Rpb24gZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLQlpbXBsZW1lbnRzIENvbm5lY3Rpb24KLXsKLQkvLyAqKioqKioqKioqIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzICoqKioqKioqKioKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB0cmFuc2FjdGlvblR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcganRhRGF0YVNvdXJjZTsKLQlwcml2YXRlIFN0cmluZyBub25KdGFEYXRhU291cmNlOwotCQotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBCYXRjaFdyaXRpbmcgYmF0Y2hXcml0aW5nOwotCXByaXZhdGUgQm9vbGVhbiBuYXRpdmVTcWw7Ci0JcHJpdmF0ZSBCb29sZWFuIGNhY2hlU3RhdGVtZW50czsKLQlwcml2YXRlIEludGVnZXIgY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQlwcml2YXRlIFN0cmluZyBkcml2ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCXByaXZhdGUgU3RyaW5nIHVzZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7Ci0JcHJpdmF0ZSBCb29sZWFuIGJpbmRQYXJhbWV0ZXJzOwotCXByaXZhdGUgQm9vbGVhbiByZWFkQ29ubmVjdGlvbnNTaGFyZWQ7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHJlYWRDb25uZWN0aW9uc01pbjsKLQlwcml2YXRlIEludGVnZXIgcmVhZENvbm5lY3Rpb25zTWF4OwotCXByaXZhdGUgSW50ZWdlciB3cml0ZUNvbm5lY3Rpb25zTWluOwotCXByaXZhdGUgSW50ZWdlciB3cml0ZUNvbm5lY3Rpb25zTWF4OwotCQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0Nvbm5lY3Rpb24oUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBwcm9wZXJ0eUxpc3RBZGFwdGVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCS8vIFRPUkVWSUVXIC0gaGFuZGxlIGluY29ycmVjdCBTdHJpbmcgaW4gcGVyc2lzdGVuY2UueG1sCi0JCXRoaXMudHJhbnNhY3Rpb25UeXBlID0gCi0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpOwotCQl0aGlzLmp0YURhdGFTb3VyY2UgPSAKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0SnRhRGF0YVNvdXJjZSgpOwotCQl0aGlzLm5vbkp0YURhdGFTb3VyY2UgPSAKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpOwotCQl0aGlzLmJhdGNoV3JpdGluZyA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORywgQmF0Y2hXcml0aW5nLnZhbHVlcygpKTsKLQkJdGhpcy5uYXRpdmVTcWwgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX05BVElWRV9TUUwpOwotCQl0aGlzLmNhY2hlU3RhdGVtZW50cyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUyk7Ci0JCXRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZSA9IAotCQkJdGhpcy5nZXRJbnRlZ2VyVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFKTsKLQkJdGhpcy5kcml2ZXIgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfRFJJVkVSKTsKLQkJdGhpcy51cmwgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfVVJMKTsKLQkJdGhpcy51c2VyID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1VTRVIpOwotCQl0aGlzLnBhc3N3b3JkID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1BBU1NXT1JEKTsKLQkJdGhpcy5iaW5kUGFyYW1ldGVycyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTKTsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWQgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEKTsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOKTsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXggPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYKTsKLQkJdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NSU4pOwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXggPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWCk7Ci0JCQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgYW5kIGFkZCBsaXN0ZW5lcnMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlcikgewotCQlzdXBlci5pbml0aWFsaXplKHBhcmVudCwgcHJvcGVydHlMaXN0QWRhcHRlcik7Ci0KLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZLCAKLQkJCXRoaXMuYnVpbGRUcmFuc2FjdGlvblR5cGVDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUGVyc2lzdGVuY2VVbml0LkpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSwKLQkJCXRoaXMuYnVpbGRKdGFEYXRhU291cmNlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0KCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVBlcnNpc3RlbmNlVW5pdC5OT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZLAotCQkJdGhpcy5idWlsZE5vbkp0YURhdGFTb3VyY2VDaGFuZ2VMaXN0ZW5lcigpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAotCSAqIAkJa2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkga2V5Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19OQVRJVkVfU1FMLAotCQkJTkFUSVZFX1NRTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORywKLQkJCUJBVENIX1dSSVRJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFMsCi0JCQlDQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTX1NJWkUsCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0RSSVZFUiwKLQkJCURSSVZFUl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVVJMLAotCQkJVVJMX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19VU0VSLAotCQkJVVNFUl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfUEFTU1dPUkQsCi0JCQlQQVNTV09SRF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTLAotCQkJQklORF9QQVJBTUVURVJTX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRCwKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01JTiwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01BWCwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NSU4sCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWCwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGFzcGVjdE5hbWUgPSBldmVudC5nZXRBc3BlY3ROYW1lKCk7Ci0JCWlmIChhc3BlY3ROYW1lLmVxdWFscyhOQVRJVkVfU1FMX1BST1BFUlRZKSkgewotCQkJdGhpcy5uYXRpdmVTcWxDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQkgZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoQkFUQ0hfV1JJVElOR19QUk9QRVJUWSkpIHsKLQkJCXRoaXMuYmF0Y2hXcml0aW5nQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJIGVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKENBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFkpKSB7Ci0JCQkgdGhpcy5jYWNoZVN0YXRlbWVudHNDaGFuZ2VkKGV2ZW50KTsKLQkJIH0KLQkJIGVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKERSSVZFUl9QUk9QRVJUWSkpIHsKLQkJCSB0aGlzLmRyaXZlckNoYW5nZWQoZXZlbnQpOwotCQkgfQotCQkgZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoVVJMX1BST1BFUlRZKSkgewotCQkJIHRoaXMudXJsQ2hhbmdlZChldmVudCk7Ci0JCSB9Ci0JCSBlbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhVU0VSX1BST1BFUlRZKSkgewotCQkJIHRoaXMudXNlckNoYW5nZWQoZXZlbnQpOwotCQkgfQotCQkgZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoUEFTU1dPUkRfUFJPUEVSVFkpKSB7Ci0JCQkgdGhpcy5wYXNzd29yZENoYW5nZWQoZXZlbnQpOwotCQkgfQotCQkgZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoQklORF9QQVJBTUVURVJTX1BST1BFUlRZKSkgewotCQkJIHRoaXMuYmluZFBhcmFtZXRlcnNDaGFuZ2VkKGV2ZW50KTsKLQkJIH0KLQkJIGVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKSkgewotCQkJIHRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkQ2hhbmdlZChldmVudCk7Ci0JCSB9Ci0JCSBlbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhDQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFkpKSB7Ci0JCQkgdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplQ2hhbmdlZChldmVudCk7Ci0JCSB9Ci0JCSBlbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhSRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSkpIHsKLQkJCSB0aGlzLnJlYWRDb25uZWN0aW9uc01pbkNoYW5nZWQoZXZlbnQpOwotCQkgfQotCQkgZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpKSB7Ci0JCQkgdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXhDaGFuZ2VkKGV2ZW50KTsKLQkJIH0KLQkJIGVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFdSSVRFX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSkpIHsKLQkJCSB0aGlzLndyaXRlQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKGV2ZW50KTsKLQkJIH0KLQkJIGVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSkpIHsKLQkJCSB0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXhDaGFuZ2VkKGV2ZW50KTsKLQkJIH0KLQl9Ci0KLQkvLyAqKioqKioqKioqIFRyYW5zYWN0aW9uVHlwZSAqKioqKioqKioqCi0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zYWN0aW9uVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25UeXBlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBuZXdUcmFuc2FjdGlvblR5cGUpIHsKLQkJUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIG9sZCA9IHRoaXMudHJhbnNhY3Rpb25UeXBlOwotCQl0aGlzLnRyYW5zYWN0aW9uVHlwZSA9IG5ld1RyYW5zYWN0aW9uVHlwZTsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0KCkuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCBuZXdUcmFuc2FjdGlvblR5cGUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgb2xkLCBuZXdUcmFuc2FjdGlvblR5cGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0cmFuc2FjdGlvblR5cGVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIG5ld1ZhbHVlID0gKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSkgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIG9sZCA9IHRoaXMudHJhbnNhY3Rpb25UeXBlOwotCQl0aGlzLnRyYW5zYWN0aW9uVHlwZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRyYW5zYWN0aW9uVHlwZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUVjbGlwc2VMaW5rQ29ubmVjdGlvbi50aGlzLnRyYW5zYWN0aW9uVHlwZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKioqKiogSnRhRGF0YVNvdXJjZSAqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRKdGFEYXRhU291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5qdGFEYXRhU291cmNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRKdGFEYXRhU291cmNlKFN0cmluZyBuZXdKdGFEYXRhU291cmNlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmp0YURhdGFTb3VyY2U7Ci0JCXRoaXMuanRhRGF0YVNvdXJjZSA9IG5ld0p0YURhdGFTb3VyY2U7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnNldEp0YURhdGFTb3VyY2UoIG5ld0p0YURhdGFTb3VyY2UpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZLCBvbGQsIG5ld0p0YURhdGFTb3VyY2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBqdGFEYXRhU291cmNlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmp0YURhdGFTb3VyY2U7Ci0JCXRoaXMuanRhRGF0YVNvdXJjZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0SnRhRGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfSlRBX0RBVEFfU09VUkNFOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSnRhRGF0YVNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUVjbGlwc2VMaW5rQ29ubmVjdGlvbi50aGlzLmp0YURhdGFTb3VyY2VDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE5vbkp0YURhdGFTb3VyY2UgKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMubm9uSnRhRGF0YVNvdXJjZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Tm9uSnRhRGF0YVNvdXJjZShTdHJpbmcgbmV3Tm9uSnRhRGF0YVNvdXJjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5ub25KdGFEYXRhU291cmNlOwotCQl0aGlzLm5vbkp0YURhdGFTb3VyY2UgPSBuZXdOb25KdGFEYXRhU291cmNlOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5zZXROb25KdGFEYXRhU291cmNlKCBuZXdOb25KdGFEYXRhU291cmNlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFksIG9sZCwgbmV3Tm9uSnRhRGF0YVNvdXJjZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vbkp0YURhdGFTb3VyY2VDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubm9uSnRhRGF0YVNvdXJjZTsKLQkJdGhpcy5ub25KdGFEYXRhU291cmNlID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Tm9uSnRhRGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTk9OX0pUQV9EQVRBX1NPVVJDRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE5vbkp0YURhdGFTb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlFY2xpcHNlTGlua0Nvbm5lY3Rpb24udGhpcy5ub25KdGFEYXRhU291cmNlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqKioqKiBOYXRpdmVTcWwgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldE5hdGl2ZVNxbCgpIHsKLQkJcmV0dXJuIHRoaXMubmF0aXZlU3FsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hdGl2ZVNxbChCb29sZWFuIG5ld05hdGl2ZVNxbCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMubmF0aXZlU3FsOwotCQl0aGlzLm5hdGl2ZVNxbCA9IG5ld05hdGl2ZVNxbDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShOQVRJVkVfU1FMX1BST1BFUlRZLCBuZXdOYXRpdmVTcWwpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFUSVZFX1NRTF9QUk9QRVJUWSwgb2xkLCBuZXdOYXRpdmVTcWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBuYXRpdmVTcWxDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5uYXRpdmVTcWw7Ci0JCXRoaXMubmF0aXZlU3FsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHROYXRpdmVTcWwoKSB7Ci0JCXJldHVybiBERUZBVUxUX05BVElWRV9TUUw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCYXRjaFdyaXRpbmcgKioqKioqKioqKgotCQotCXB1YmxpYyBCYXRjaFdyaXRpbmcgZ2V0QmF0Y2hXcml0aW5nKCkgewotCQlyZXR1cm4gdGhpcy5iYXRjaFdyaXRpbmc7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJhdGNoV3JpdGluZyhCYXRjaFdyaXRpbmcgbmV3QmF0Y2hXcml0aW5nKSB7Ci0JCUJhdGNoV3JpdGluZyBvbGQgPSB0aGlzLmJhdGNoV3JpdGluZzsKLQkJdGhpcy5iYXRjaFdyaXRpbmcgPSBuZXdCYXRjaFdyaXRpbmc7Ci0JCXRoaXMucHV0UHJvcGVydHkoQkFUQ0hfV1JJVElOR19QUk9QRVJUWSwgbmV3QmF0Y2hXcml0aW5nKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJBVENIX1dSSVRJTkdfUFJPUEVSVFksIG9sZCwgbmV3QmF0Y2hXcml0aW5nKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmF0Y2hXcml0aW5nQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJhdGNoV3JpdGluZyBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBCYXRjaFdyaXRpbmcudmFsdWVzKCkpOwotCQlCYXRjaFdyaXRpbmcgb2xkID0gdGhpcy5iYXRjaFdyaXRpbmc7Ci0JCXRoaXMuYmF0Y2hXcml0aW5nID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgQmF0Y2hXcml0aW5nIGdldERlZmF1bHRCYXRjaFdyaXRpbmcoKSB7Ci0JCXJldHVybiBERUZBVUxUX0JBVENIX1dSSVRJTkc7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVN0YXRlbWVudHMgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldENhY2hlU3RhdGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVTdGF0ZW1lbnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlU3RhdGVtZW50cyhCb29sZWFuIG5ld0NhY2hlU3RhdGVtZW50cykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuY2FjaGVTdGF0ZW1lbnRzOwotCQl0aGlzLmNhY2hlU3RhdGVtZW50cyA9IG5ld0NhY2hlU3RhdGVtZW50czsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZLCBuZXdDYWNoZVN0YXRlbWVudHMpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSwgb2xkLCBuZXdDYWNoZVN0YXRlbWVudHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVN0YXRlbWVudHNDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5jYWNoZVN0YXRlbWVudHM7Ci0JCXRoaXMuY2FjaGVTdGF0ZW1lbnRzID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRDYWNoZVN0YXRlbWVudHMoKSB7Ci0JCXJldHVybiBERUZBVUxUX0NBQ0hFX1NUQVRFTUVOVFM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVN0YXRlbWVudHNTaXplICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRDYWNoZVN0YXRlbWVudHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlU3RhdGVtZW50c1NpemUoSW50ZWdlciBuZXdDYWNoZVN0YXRlbWVudHNTaXplKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplOwotCQl0aGlzLmNhY2hlU3RhdGVtZW50c1NpemUgPSBuZXdDYWNoZVN0YXRlbWVudHNTaXplOwotCQl0aGlzLnB1dFByb3BlcnR5KENBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSwgbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFksIG9sZCwgbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhY2hlU3RhdGVtZW50c1NpemVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplOwotCQl0aGlzLmNhY2hlU3RhdGVtZW50c1NpemUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0NBQ0hFX1NUQVRFTUVOVFNfU0laRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERyaXZlciAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmRyaXZlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREcml2ZXIoU3RyaW5nIG5ld0RyaXZlcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kcml2ZXI7Ci0JCXRoaXMuZHJpdmVyID0gbmV3RHJpdmVyOwotCQl0aGlzLnB1dFByb3BlcnR5KERSSVZFUl9QUk9QRVJUWSwgbmV3RHJpdmVyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERSSVZFUl9QUk9QRVJUWSwgb2xkLCBuZXdEcml2ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkcml2ZXJDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZHJpdmVyOwotCQl0aGlzLmRyaXZlciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREcml2ZXIoKSB7Ci0JCXJldHVybiBERUZBVUxUX0RSSVZFUjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFVSTCAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiB0aGlzLnVybDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIG5ld1VybCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy51cmw7Ci0JCXRoaXMudXJsID0gbmV3VXJsOwotCQl0aGlzLnB1dFByb3BlcnR5KFVSTF9QUk9QRVJUWSwgbmV3VXJsKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFVSTF9QUk9QRVJUWSwgb2xkLCBuZXdVcmwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cmxDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudXJsOwotCQl0aGlzLnVybCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRVcmwoKSB7Ci0JCXJldHVybiBERUZBVUxUX1VSTDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFVzZXIgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKLQkJcmV0dXJuIHRoaXMudXNlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVc2VyKFN0cmluZyBuZXdVc2VyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnVzZXI7Ci0JCXRoaXMudXNlciA9IG5ld1VzZXI7Ci0JCXRoaXMucHV0UHJvcGVydHkoVVNFUl9QUk9QRVJUWSwgbmV3VXNlcik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVU0VSX1BST1BFUlRZLCBvbGQsIG5ld1VzZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1c2VyQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnVzZXI7Ci0JCXRoaXMudXNlciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRVc2VyKCkgewotCQlyZXR1cm4gREVGQVVMVF9VU0VSOwotCX0KLQotCS8vICoqKioqKioqKiogUGFzc3dvcmQgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0JCXJldHVybiB0aGlzLnBhc3N3b3JkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBuZXdQYXNzd29yZCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5wYXNzd29yZDsKLQkJdGhpcy5wYXNzd29yZCA9IG5ld1Bhc3N3b3JkOwotCQl0aGlzLnB1dFByb3BlcnR5KFBBU1NXT1JEX1BST1BFUlRZLCBuZXdQYXNzd29yZCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQQVNTV09SRF9QUk9QRVJUWSwgb2xkLCBuZXdQYXNzd29yZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhc3N3b3JkQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnBhc3N3b3JkOwotCQl0aGlzLnBhc3N3b3JkID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhc3N3b3JkKCkgewotCQlyZXR1cm4gREVGQVVMVF9QQVNTV09SRDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEJpbmRQYXJhbWV0ZXJzICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRCaW5kUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIHRoaXMuYmluZFBhcmFtZXRlcnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmluZFBhcmFtZXRlcnMoQm9vbGVhbiBuZXdCaW5kUGFyYW1ldGVycykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuYmluZFBhcmFtZXRlcnM7Ci0JCXRoaXMuYmluZFBhcmFtZXRlcnMgPSBuZXdCaW5kUGFyYW1ldGVyczsKLQkJdGhpcy5wdXRQcm9wZXJ0eShCSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFksIG5ld0JpbmRQYXJhbWV0ZXJzKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSwgb2xkLCBuZXdCaW5kUGFyYW1ldGVycyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJpbmRQYXJhbWV0ZXJzQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuYmluZFBhcmFtZXRlcnM7Ci0JCXRoaXMuYmluZFBhcmFtZXRlcnMgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdEJpbmRQYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gREVGQVVMVF9CSU5EX1BBUkFNRVRFUlM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNTaGFyZWQgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRDb25uZWN0aW9uc1NoYXJlZChCb29sZWFuIG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkOwotCQl0aGlzLnJlYWRDb25uZWN0aW9uc1NoYXJlZCA9IG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSwgbmV3UmVhZENvbm5lY3Rpb25zU2hhcmVkKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZLCBvbGQsIG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRDb25uZWN0aW9uc1NoYXJlZENoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc1NoYXJlZDsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNNaW4gKioqKioqKioqKgotCXB1YmxpYyBJbnRlZ2VyIGdldFJlYWRDb25uZWN0aW9uc01pbigpIHsKLQkJcmV0dXJuIHRoaXMucmVhZENvbm5lY3Rpb25zTWluOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRDb25uZWN0aW9uc01pbihJbnRlZ2VyIG5ld1JlYWRDb25uZWN0aW9uc01pbikgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMucmVhZENvbm5lY3Rpb25zTWluOwotCQl0aGlzLnJlYWRDb25uZWN0aW9uc01pbiA9IG5ld1JlYWRDb25uZWN0aW9uc01pbjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShSRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgbmV3UmVhZENvbm5lY3Rpb25zTWluKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBvbGQsIG5ld1JlYWRDb25uZWN0aW9uc01pbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRDb25uZWN0aW9uc01pbkNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc01pbjsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01pbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19NSU47Ci0JfQotCi0JLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNNYXggKioqKioqKioqKgotCXB1YmxpYyBJbnRlZ2VyIGdldFJlYWRDb25uZWN0aW9uc01heCgpIHsKLQkJcmV0dXJuIHRoaXMucmVhZENvbm5lY3Rpb25zTWF4OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRDb25uZWN0aW9uc01heChJbnRlZ2VyIG5ld1JlYWRDb25uZWN0aW9uc01heCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMucmVhZENvbm5lY3Rpb25zTWF4OwotCQl0aGlzLnJlYWRDb25uZWN0aW9uc01heCA9IG5ld1JlYWRDb25uZWN0aW9uc01heDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShSRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgbmV3UmVhZENvbm5lY3Rpb25zTWF4KTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBvbGQsIG5ld1JlYWRDb25uZWN0aW9uc01heCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRDb25uZWN0aW9uc01heENoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc01heDsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXggPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01heCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19NQVg7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXcml0ZUNvbm5lY3Rpb25zTWluICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRXcml0ZUNvbm5lY3Rpb25zTWluKCkgewotCQlyZXR1cm4gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdyaXRlQ29ubmVjdGlvbnNNaW4oSW50ZWdlciBuZXdXcml0ZUNvbm5lY3Rpb25zTWluKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluOwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNaW4gPSBuZXdXcml0ZUNvbm5lY3Rpb25zTWluOwotCQl0aGlzLnB1dFByb3BlcnR5KFdSSVRFX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgbmV3V3JpdGVDb25uZWN0aW9uc01pbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIG9sZCwgbmV3V3JpdGVDb25uZWN0aW9uc01pbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluOwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNaW4gPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNaW4oKSB7Ci0JCXJldHVybiBERUZBVUxUX1dSSVRFX0NPTk5FQ1RJT05TX01JTjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdyaXRlQ29ubmVjdGlvbnNNYXggKioqKioqKioqKgotCXB1YmxpYyBJbnRlZ2VyIGdldFdyaXRlQ29ubmVjdGlvbnNNYXgoKSB7Ci0JCXJldHVybiB0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V3JpdGVDb25uZWN0aW9uc01heChJbnRlZ2VyIG5ld1dyaXRlQ29ubmVjdGlvbnNNYXgpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXg7Ci0JCXRoaXMud3JpdGVDb25uZWN0aW9uc01heCA9IG5ld1dyaXRlQ29ubmVjdGlvbnNNYXg7Ci0JCXRoaXMucHV0UHJvcGVydHkoV1JJVEVfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBuZXdXcml0ZUNvbm5lY3Rpb25zTWF4KTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgb2xkLCBuZXdXcml0ZUNvbm5lY3Rpb25zTWF4KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVDb25uZWN0aW9uc01heENoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXg7Ci0JCXRoaXMud3JpdGVDb25uZWN0aW9uc01heCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01heCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfV1JJVEVfQ09OTkVDVElPTlNfTUFYOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY3VzdG9taXphdGlvbi9DdXN0b21pemF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jdXN0b21pemF0aW9uL0N1c3RvbWl6YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0ZTc2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jdXN0b21pemF0aW9uL0N1c3RvbWl6YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqICBDdXN0b21pemF0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9taXphdGlvbiBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLXsKLQlCb29sZWFuIGdldERlZmF1bHRUaHJvd0V4Y2VwdGlvbnMoKTsKLQlCb29sZWFuIGdldFRocm93RXhjZXB0aW9ucygpOwotCXZvaWQgc2V0VGhyb3dFeGNlcHRpb25zKEJvb2xlYW4gbmV3VGhyb3dFeGNlcHRpb25zKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBUSFJPV19FWENFUFRJT05TX1BST1BFUlRZID0gInRocm93RXhjZXB0aW9uc1Byb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlMgPSAiZWNsaXBzZWxpbmsub3JtLnRocm93LmV4Y2VwdGlvbnMiOwotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1RIUk9XX0VYQ0VQVElPTlMgPSBCb29sZWFuLlRSVUU7Ci0JCi0JV2VhdmluZyBnZXREZWZhdWx0V2VhdmluZygpOwotCVdlYXZpbmcgZ2V0V2VhdmluZygpOwotCXZvaWQgc2V0V2VhdmluZyhXZWF2aW5nIG5ld1dlYXZpbmcpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfUFJPUEVSVFkgPSAid2VhdmluZ1Byb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dFQVZJTkcgPSAiZWNsaXBzZWxpbmsud2VhdmluZyI7Ci0JCXN0YXRpYyBmaW5hbCBXZWF2aW5nIERFRkFVTFRfV0VBVklORyA9IFdlYXZpbmcudHJ1ZV87Ci0gCi0JQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0xhenkoKTsKLQlCb29sZWFuIGdldFdlYXZpbmdMYXp5KCk7Ci0Jdm9pZCBzZXRXZWF2aW5nTGF6eShCb29sZWFuIG5ld1dlYXZpbmdMYXp5KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0xBWllfUFJPUEVSVFkgPSAid2VhdmluZ0xhenlQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HX0xBWlkgPSAiZWNsaXBzZWxpbmsud2VhdmluZy5sYXp5IjsKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9XRUFWSU5HX0xBWlkgPSBCb29sZWFuLlRSVUU7Ci0JCi0JQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCk7Ci0JQm9vbGVhbiBnZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKTsKLQl2b2lkIHNldFdlYXZpbmdDaGFuZ2VUcmFja2luZyhCb29sZWFuIG5ld1dlYXZpbmdDaGFuZ2VUcmFja2luZyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFkgPSAid2VhdmluZ0NoYW5nZVRyYWNraW5nUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkcgPSAiZWNsaXBzZWxpbmsud2VhdmluZy5jaGFuZ2V0cmFja2luZyI7Ci0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkcgPSBCb29sZWFuLlRSVUU7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nRmV0Y2hHcm91cHMoKTsKLQlCb29sZWFuIGdldFdlYXZpbmdGZXRjaEdyb3VwcygpOwotCXZvaWQgc2V0V2VhdmluZ0ZldGNoR3JvdXBzKEJvb2xlYW4gbmV3V2VhdmluZ0ZldGNoR3JvdXBzKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSA9ICJ3ZWF2aW5nRmV0Y2hHcm91cHNQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUyA9ICJlY2xpcHNlbGluay53ZWF2aW5nLmZldGNoZ3JvdXBzIjsKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9XRUFWSU5HX0ZFVENIX0dST1VQUyA9IEJvb2xlYW4uVFJVRTsKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFNlc3Npb25DdXN0b21pemVyKCk7Ci0JU3RyaW5nIGdldFNlc3Npb25DdXN0b21pemVyKCk7Ci0Jdm9pZCBzZXRTZXNzaW9uQ3VzdG9taXplcihTdHJpbmcgbmV3U2Vzc2lvbkN1c3RvbWl6ZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSA9ICJzZXNzaW9uQ3VzdG9taXplclByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUiA9ICJlY2xpcHNlbGluay5zZXNzaW9uLmN1c3RvbWl6ZXIiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VTU0lPTl9DVVNUT01JWkVSID0gbnVsbDsJLy8gbm8gZGVmYXVsdAotCQotCVN0cmluZyBnZXREZWZhdWx0RGVzY3JpcHRvckN1c3RvbWl6ZXIoKTsKLQlTdHJpbmcgZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoU3RyaW5nIGVudGl0eU5hbWUpOwotCXZvaWQgc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoU3RyaW5nIG5ld0Rlc2NyaXB0b3JDdXN0b21pemVyLCBTdHJpbmcgZW50aXR5TmFtZSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZID0gImRlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSID0gImVjbGlwc2VsaW5rLmRlc2NyaXB0b3IuY3VzdG9taXplci4iOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfREVTQ1JJUFRPUl9DVVNUT01JWkVSID0gbnVsbDsJLy8gbm8gZGVmYXVsdAotCi0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBlbnRpdGllcygpOwotCWludCBlbnRpdGllc1NpemUoKTsKLQlib29sZWFuIGVudGl0eUV4aXN0cyhTdHJpbmcgZW50aXR5KTsKLQlTdHJpbmcgYWRkRW50aXR5KFN0cmluZyBlbnRpdHkpOwotCXZvaWQgcmVtb3ZlRW50aXR5KFN0cmluZyBlbnRpdHkpOwotCQlTdHJpbmcgRU5USVRJRVNfTElTVF9QUk9QRVJUWSA9ICJlbnRpdGllc0xpc3RQcm9wZXJ0eSI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2N1c3RvbWl6YXRpb24vQ3VzdG9taXplclByb3BlcnRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2N1c3RvbWl6YXRpb24vQ3VzdG9taXplclByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4ZjhmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jdXN0b21pemF0aW9uL0N1c3RvbWl6ZXJQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21pemVyUHJvcGVydGllcyBpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBTdHJpbmcgZW50aXR5TmFtZTsKLQotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCXRoaXMuZW50aXR5TmFtZSA9IGVudGl0eU5hbWU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvcnMgKioqKioqKioqKgotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZihvID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDdXN0b21pemVyUHJvcGVydGllcyBjdXN0b21pemVyID0gKEN1c3RvbWl6ZXJQcm9wZXJ0aWVzKSBvOwotCQlyZXR1cm4gKAotCQkJKHRoaXMuY2xhc3NOYW1lID09IG51bGwgPwotCQkJCWN1c3RvbWl6ZXIuY2xhc3NOYW1lID09IG51bGwgOiB0aGlzLmNsYXNzTmFtZS5lcXVhbHMoY3VzdG9taXplci5jbGFzc05hbWUpKSk7Ci0JfQotCQotCSBAT3ZlcnJpZGUKLQkgcHVibGljIHN5bmNocm9uaXplZCBDdXN0b21pemVyUHJvcGVydGllcyBjbG9uZSgpIHsKLQkJIHRyeSB7Ci0JCQkgcmV0dXJuIChDdXN0b21pemVyUHJvcGVydGllcylzdXBlci5jbG9uZSgpOwotCQkgfQotCQkgY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJIH0KLQkgfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lID09IG51bGw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXR0ZXIvc2V0dGVyICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldEVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIG5ld0NsYXNzTmFtZSkgewotCQl0aGlzLmNsYXNzTmFtZSA9IG5ld0NsYXNzTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuYnVpbGRTaW1wbGVUb1N0cmluZ09uKHRoaXMsIHNiKTsKLQkJc2IuYXBwZW5kKCIgKCIpOwotCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCIgY2xhc3M6ICIpOwotCQlzYi5hcHBlbmQodGhpcy5jbGFzc05hbWUpOwotCQlzYi5hcHBlbmQoIiwgZW50aXR5TmFtZTogIik7Ci0JCXNiLmFwcGVuZCh0aGlzLmVudGl0eU5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3ODk5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0JaW1wbGVtZW50cyBDdXN0b21pemF0aW9uCi17Ci0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQlwcml2YXRlIEJvb2xlYW4gdGhyb3dFeGNlcHRpb25zOwotCXByaXZhdGUgV2VhdmluZyB3ZWF2aW5nOwotCXByaXZhdGUgQm9vbGVhbiB3ZWF2aW5nTGF6eTsKLQlwcml2YXRlIEJvb2xlYW4gd2VhdmluZ0NoYW5nZVRyYWNraW5nOwotCXByaXZhdGUgQm9vbGVhbiB3ZWF2aW5nRmV0Y2hHcm91cHM7Ci0JcHJpdmF0ZSBTdHJpbmcgc2Vzc2lvbkN1c3RvbWl6ZXI7Ci0KLQkvLyBrZXkgPSBFbnRpdHkgbmFtZSA7IHZhbHVlID0gQ3VzdG9taXplciBwcm9wZXJ0aWVzCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBDdXN0b21pemVyUHJvcGVydGllcz4gZW50aXRpZXNDdXN0b21pemVyUHJvcGVydGllczsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIHByb3BlcnR5TGlzdEFkYXB0ZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCS8qKgotCSAqIEluaXRpYWxpemVzIHByb3BlcnRpZXMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKLQkJLy8gVE9SRVZJRVcgLSBoYW5kbGUgaW5jb3JyZWN0IFN0cmluZyBpbiBwZXJzaXN0ZW5jZS54bWwKLQkJdGhpcy5lbnRpdGllc0N1c3RvbWl6ZXJQcm9wZXJ0aWVzID0gCi0JCQluZXcgSGFzaE1hcDxTdHJpbmcsIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzPigpOwotCi0JCXRoaXMudGhyb3dFeGNlcHRpb25zID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TKTsKLQkJdGhpcy53ZWF2aW5nID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19XRUFWSU5HLCBXZWF2aW5nLnZhbHVlcygpKTsKLQkJdGhpcy53ZWF2aW5nTGF6eSA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfV0VBVklOR19MQVpZKTsKLQkJdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmcgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HKTsKLQkJdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHMgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkdfRkVUQ0hfR1JPVVBTKTsKLQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplciA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVIpOwotCi0JCVNldDxQcm9wZXJ0eT4gcHJvcGVydGllcyA9IAotCQkJdGhpcy5nZXRQcm9wZXJ0aWVzU2V0V2l0aFByZWZpeChFQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVIpOwotCQkKLQkJdGhpcy5pbml0aWFsaXplRW50aXRpZXNDdXN0b21pemVyQ2xhc3MocHJvcGVydGllcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFbnRpdGllc0N1c3RvbWl6ZXJDbGFzcyhTZXQ8UHJvcGVydHk+IHByb3BlcnRpZXMpIHsKLQkJZm9yIChQcm9wZXJ0eSBwcm9wZXJ0eSA6IHByb3BlcnRpZXMpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlOYW1lKHByb3BlcnR5KTsKLQkJCXRoaXMuc2V0Q3VzdG9taXplckNsYXNzXyhwcm9wZXJ0eSwgZW50aXR5TmFtZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAotCSAqIAkJa2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkga2V5Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TLAotCQkJVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfV0VBVklORywKLQkJCVdFQVZJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1dFQVZJTkdfTEFaWSwKLQkJCVdFQVZJTkdfTEFaWV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkcsCi0JCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfV0VBVklOR19GRVRDSF9HUk9VUFMsCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZKTsKLQotCQkvLyBEb24ndCBuZWVkIHRvIGluaXRpYWxpemUgcHJvcGVydHlOYW1lcyBmb3I6IAotCQkvLyBkZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnR5Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHRoZSBnaXZlbiBwcm9wZXJ0eS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpdGVtSXNQcm9wZXJ0eShQcm9wZXJ0eSBpdGVtKSB7Ci0JCWJvb2xlYW4gaXNQcm9wZXJ0eSA9IHN1cGVyLml0ZW1Jc1Byb3BlcnR5KGl0ZW0pOwotCQkKLQkJaWYgKCAhIGlzUHJvcGVydHkgJiYgaXRlbS5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCWlmIChpdGVtLmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBpc1Byb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgdXNlZCBmb3IgY2hhbmdlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZ2l2ZW4KLQkgKiBwcm9wZXJ0eS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5SWRGb3IoUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5wcm9wZXJ0eUlkRm9yKHByb3BlcnR5KTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChwcm9wZXJ0eS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVIpKSB7Ci0JCQkJcmV0dXJuIERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHByb3BlcnR5OiAiICsgcHJvcGVydHkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGFzcGVjdE5hbWUgPSBldmVudC5nZXRBc3BlY3ROYW1lKCk7Ci0JCWlmIChhc3BlY3ROYW1lLmVxdWFscyhUSFJPV19FWENFUFRJT05TX1BST1BFUlRZKSkgewotCQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhXRUFWSU5HX1BST1BFUlRZKSkgewotCQkJdGhpcy53ZWF2aW5nQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoV0VBVklOR19MQVpZX1BST1BFUlRZKSkgewotCQkJdGhpcy53ZWF2aW5nTGF6eUNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZKSkgewotCQkJdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmdDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhXRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSkpIHsKLQkJCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZKSkgewotCQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplckNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSkpIHsKLQkJCXRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXJDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgZXZlbnQgcmVjZWl2ZWQgLSBwcm9wZXJ0eSBub3QgYXBwbGljYWJsZTogIiArIGFzcGVjdE5hbWUpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIFRocm93RXhjZXB0aW9ucyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0VGhyb3dFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gdGhpcy50aHJvd0V4Y2VwdGlvbnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRocm93RXhjZXB0aW9ucyhCb29sZWFuIG5ld1Rocm93RXhjZXB0aW9ucykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudGhyb3dFeGNlcHRpb25zOwotCQl0aGlzLnRocm93RXhjZXB0aW9ucyA9IG5ld1Rocm93RXhjZXB0aW9uczsKLQkJdGhpcy5wdXRQcm9wZXJ0eShUSFJPV19FWENFUFRJT05TX1BST1BFUlRZLCBuZXdUaHJvd0V4Y2VwdGlvbnMpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSwgb2xkLCBuZXdUaHJvd0V4Y2VwdGlvbnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0aHJvd0V4Y2VwdGlvbnNDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy50aHJvd0V4Y2VwdGlvbnM7Ci0JCXRoaXMudGhyb3dFeGNlcHRpb25zID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VGhyb3dFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gREVGQVVMVF9USFJPV19FWENFUFRJT05TOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZ0xhenkgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFdlYXZpbmdMYXp5KCkgewotCQlyZXR1cm4gdGhpcy53ZWF2aW5nTGF6eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXZWF2aW5nTGF6eShCb29sZWFuIG5ld1dlYXZpbmdMYXp5KSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nTGF6eTsKLQkJdGhpcy53ZWF2aW5nTGF6eSA9IG5ld1dlYXZpbmdMYXp5OwotCQl0aGlzLnB1dFByb3BlcnR5KFdFQVZJTkdfTEFaWV9QUk9QRVJUWSwgbmV3V2VhdmluZ0xhenkpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19MQVpZX1BST1BFUlRZLCBvbGQsIG5ld1dlYXZpbmdMYXp5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2VhdmluZ0xhenlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nTGF6eTsKLQkJdGhpcy53ZWF2aW5nTGF6eSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0xhenkoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dFQVZJTkdfTEFaWTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdDaGFuZ2VUcmFja2luZyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKEJvb2xlYW4gbmV3V2VhdmluZ0NoYW5nZVRyYWNraW5nKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmc7Ci0JCXRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nID0gbmV3V2VhdmluZ0NoYW5nZVRyYWNraW5nOwotCQl0aGlzLnB1dFByb3BlcnR5KFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZLCBuZXdXZWF2aW5nQ2hhbmdlVHJhY2tpbmcpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFksIG9sZCwgbmV3V2VhdmluZ0NoYW5nZVRyYWNraW5nKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2VhdmluZ0NoYW5nZVRyYWNraW5nQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nOwotCQl0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZyA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gREVGQVVMVF9XRUFWSU5HX0NIQU5HRV9UUkFDS0lORzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdGZXRjaEdyb3VwcyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0V2VhdmluZ0ZldGNoR3JvdXBzKCkgewotCQlyZXR1cm4gdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2VhdmluZ0ZldGNoR3JvdXBzKEJvb2xlYW4gbmV3V2VhdmluZ0ZldGNoR3JvdXBzKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHM7Ci0JCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzID0gbmV3V2VhdmluZ0ZldGNoR3JvdXBzOwotCQl0aGlzLnB1dFByb3BlcnR5KFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZLCBuZXdXZWF2aW5nRmV0Y2hHcm91cHMpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFksIG9sZCwgbmV3V2VhdmluZ0ZldGNoR3JvdXBzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2VhdmluZ0ZldGNoR3JvdXBzQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0ZldGNoR3JvdXBzOwotCQl0aGlzLndlYXZpbmdGZXRjaEdyb3VwcyA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0ZldGNoR3JvdXBzKCkgewotCQlyZXR1cm4gREVGQVVMVF9XRUFWSU5HX0ZFVENIX0dST1VQUzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNlc3Npb25DdXN0b21pemVyICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25DdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5zZXNzaW9uQ3VzdG9taXplcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uQ3VzdG9taXplcihTdHJpbmcgbmV3U2Vzc2lvbkN1c3RvbWl6ZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXI7Ci0JCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXIgPSBuZXdTZXNzaW9uQ3VzdG9taXplcjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFksIG5ld1Nlc3Npb25DdXN0b21pemVyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSwgb2xkLCBuZXdTZXNzaW9uQ3VzdG9taXplcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlc3Npb25DdXN0b21pemVyQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25DdXN0b21pemVyOwotCQl0aGlzLnNlc3Npb25DdXN0b21pemVyID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlc3Npb25DdXN0b21pemVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9TRVNTSU9OX0NVU1RPTUlaRVI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nICoqKioqKioqKioKLQkKLQlwdWJsaWMgV2VhdmluZyBnZXRXZWF2aW5nKCkgewotCQlyZXR1cm4gdGhpcy53ZWF2aW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXZWF2aW5nKFdlYXZpbmcgbmV3V2VhdmluZykgewotCQlXZWF2aW5nIG9sZCA9IHRoaXMud2VhdmluZzsKLQkJdGhpcy53ZWF2aW5nID0gbmV3V2VhdmluZzsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX1BST1BFUlRZLCBuZXdXZWF2aW5nKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfUFJPUEVSVFksIG9sZCwgbmV3V2VhdmluZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdlYXZpbmdDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJV2VhdmluZyBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBXZWF2aW5nLnZhbHVlcygpKTsKLQkJV2VhdmluZyBvbGQgPSB0aGlzLndlYXZpbmc7Ci0JCXRoaXMud2VhdmluZyA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFdlYXZpbmcgZ2V0RGVmYXVsdFdlYXZpbmcoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dFQVZJTkc7Ci0JfQotCi0JLy8gKioqKioqKioqKiBEZXNjcmlwdG9yQ3VzdG9taXplciAqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdG9yQ3VzdG9taXplcihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDdXN0b21pemVyUHJvcGVydGllcyBjdXN0b21pemVyID0gdGhpcy5jdXN0b21pemVyUHJvcGVydGllc09mKGVudGl0eU5hbWUpOwotCQlyZXR1cm4gKGN1c3RvbWl6ZXIgPT0gbnVsbCkgPyBudWxsIDogY3VzdG9taXplci5nZXRDbGFzc05hbWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoU3RyaW5nIG5ld0Rlc2NyaXB0b3JDdXN0b21pemVyLCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDdXN0b21pemVyUHJvcGVydGllcyBvbGQgPSB0aGlzLnNldEN1c3RvbWl6ZXJDbGFzc18obmV3RGVzY3JpcHRvckN1c3RvbWl6ZXIsIGVudGl0eU5hbWUpOwotCQl0aGlzLnB1dFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiwgZW50aXR5TmFtZSwgbmV3RGVzY3JpcHRvckN1c3RvbWl6ZXIsIGZhbHNlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwgb2xkLCB0aGlzLmN1c3RvbWl6ZXJQcm9wZXJ0aWVzT2YoZW50aXR5TmFtZSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZXNjcmlwdG9yQ3VzdG9taXplckNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgZW50aXR5TmFtZTsKLQkJUHJvcGVydHkgbmV3UHJvcGVydHkgPSAoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCS8vIHByb3BlcnR5ID09IG51bGwgd2hlbiByZW1vdmVkCi0JCWVudGl0eU5hbWUgPSAobmV3UHJvcGVydHkgPT0gbnVsbCkgPyAKLQkJCXRoaXMuZ2V0RW50aXR5TmFtZSgoUHJvcGVydHkpIGV2ZW50LmdldE9sZFZhbHVlKCkpIDogdGhpcy5nZXRFbnRpdHlOYW1lKG5ld1Byb3BlcnR5KTsKLQkJQ3VzdG9taXplclByb3BlcnRpZXMgb2xkID0gdGhpcy5zZXRDdXN0b21pemVyQ2xhc3NfKG5ld1Byb3BlcnR5LCBlbnRpdHlOYW1lKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCB0aGlzLmN1c3RvbWl6ZXJQcm9wZXJ0aWVzT2YoZW50aXR5TmFtZSkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREZXNjcmlwdG9yQ3VzdG9taXplcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfREVTQ1JJUFRPUl9DVVNUT01JWkVSOwotCX0KLQotCi0JLy8gKioqKioqIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzICoqKioqKioKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byB1cGRhdGUgdGhlIEN1c3RvbWl6ZXJDbGFzcyBpbiBlbnRpdGllc0N1c3RvbWl6ZXJQcm9wZXJ0aWVzIG1hcC4KLQkgKiBSZXR1cm5zIHRoZSBvbGQgdmFsdWUgb2YgQ3VzdG9taXplclByb3BlcnRpZXMKLQkgKi8KLQlwcml2YXRlIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzIHNldEN1c3RvbWl6ZXJDbGFzc18oUHJvcGVydHkgbmV3UHJvcGVydHksIFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IChuZXdQcm9wZXJ0eSA9PSBudWxsKSA/IG51bGwgOiBuZXdQcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gdGhpcy5zZXRDdXN0b21pemVyQ2xhc3NfKG5ld1ZhbHVlLCBlbnRpdHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzIHNldEN1c3RvbWl6ZXJDbGFzc18oU3RyaW5nIG5ld1ZhbHVlLCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDdXN0b21pemVyUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gdGhpcy5jdXN0b21pemVyUHJvcGVydGllc09mKGVudGl0eU5hbWUpOwotCQlDdXN0b21pemVyUHJvcGVydGllcyBvbGQgPSBwcm9wZXJ0aWVzLmNsb25lKCk7Ci0JCXByb3BlcnRpZXMuc2V0Q2xhc3NOYW1lKG5ld1ZhbHVlKTsKLQkJdGhpcy5wdXRFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcyhlbnRpdHlOYW1lLCBwcm9wZXJ0aWVzKTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDdXN0b21pemVyUHJvcGVydGllcyBvZiB0aGUgRW50aXR5IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBDdXN0b21pemVyUHJvcGVydGllcyBjdXN0b21pemVyUHJvcGVydGllc09mKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUN1c3RvbWl6ZXJQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSB0aGlzLmVudGl0aWVzQ3VzdG9taXplclByb3BlcnRpZXMuZ2V0KGVudGl0eU5hbWUpOwotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEN1c3RvbWl6ZXJQcm9wZXJ0aWVzKGVudGl0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIFNldCBhbGwgQ3VzdG9taXplclByb3BlcnRpZXMgdG8gZGVmYXVsdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJDdXN0b21pemVyUHJvcGVydGllcyhTdHJpbmcgZW50aXR5TmFtZSkgewotCQl0aGlzLnNldERlc2NyaXB0b3JDdXN0b21pemVyKG51bGwsIGVudGl0eU5hbWUpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQkvKioKLQkgKiBQdXQgdGhlIGdpdmVuIEVudGl0eSBDdXN0b21pemVyUHJvcGVydGllcyBpbiB0aGlzIGVudGl0aWVzQ3VzdG9taXplclByb3BlcnRpZXMgbWFwLgotCSAqIEBwYXJhbSBlbnRpdHlOYW1lIC0gRW50aXR5IG5hbWUuIFRoZSBlbnRpdHkgbWF5IGJlIGEgbmV3IG9yIGFuIGV4aXN0aW5nIGVudGl0eS4KLQkgKiBAcGFyYW0gcHJvcGVydGllcyAtIEVudGl0eSBDdXN0b21pemVyUHJvcGVydGllcwotCSAqLwotCXByaXZhdGUgdm9pZCBwdXRFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcyhTdHJpbmcgZW50aXR5TmFtZSwgQ3VzdG9taXplclByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQl0aGlzLmFkZE9yUmVwbGFjZVByb3BlcnRpZXNGb3JFbnRpdHkoZW50aXR5TmFtZSwgcHJvcGVydGllcyk7Ci0JfQotCQotCi0KLQkvLyAqKioqKiogZW50aXRpZXMgbGlzdCAqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IGVudGl0aWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5lbnRpdGllc0N1c3RvbWl6ZXJQcm9wZXJ0aWVzLmtleVNldCgpKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGVudGl0aWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXRpZXNDdXN0b21pemVyUHJvcGVydGllcy5zaXplKCk7Ci0JfQotCi0JLyogCi0JICogVmVyaWZpZXMgaWYgdGhpcyBlbnRpdGllc0NhY2hlUHJvcGVydGllcyBtYXAgY29udGFpbnMgdGhlIGdpdmVuIEVudGl0eS4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gZW50aXR5RXhpc3RzKFN0cmluZyBlbnRpdHkpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXRpZXNDdXN0b21pemVyUHJvcGVydGllcy5jb250YWluc0tleShlbnRpdHkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgYWRkRW50aXR5KFN0cmluZyBlbnRpdHkpIHsKLQkJaWYgKGVudGl0eUV4aXN0cyhlbnRpdHkpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbnRpdHkgIiArIGVudGl0eSArICIgYWxyZWFkeSBleGlzdC4iKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5hZGRPclJlcGxhY2VQcm9wZXJ0aWVzRm9yRW50aXR5KGVudGl0eSwgbmV3IEN1c3RvbWl6ZXJQcm9wZXJ0aWVzKGVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgb3IgUmVwbGFjZXMgdGhlIGdpdmVuIEVudGl0eSBDdXN0b21pemVyUHJvcGVydGllcyBpbiAKLQkgKiB0aGlzIGVudGl0aWVzQ3VzdG9taXplclByb3BlcnRpZXMgbWFwLgotCSAqIElmIHRoZSBzcGVjaWZpZWQgRW50aXR5IGV4aXN0cyBhbmQgdGhlIGdpdmVuIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzIGlzIGVtcHR5IAotCSAqIChpLmUuIGFsbCBwcm9wZXJ0aWVzIGFyZSBudWxsKSB0aGUgbWFwcGluZyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFwLgotCSAqIEBwYXJhbSBlbnRpdHkgLSBFbnRpdHkgbmFtZQotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gRW50aXR5IEN1c3RvbWl6ZXJQcm9wZXJ0aWVzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGFkZE9yUmVwbGFjZVByb3BlcnRpZXNGb3JFbnRpdHkoU3RyaW5nIGVudGl0eSwgQ3VzdG9taXplclByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlpZiAoZW50aXR5RXhpc3RzKGVudGl0eSkpIHsKLQkJCXRoaXMucmVwbGFjZUVudGl0eV8oZW50aXR5LCBwcm9wZXJ0aWVzKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRoaXMuZW50aXRpZXNDdXN0b21pemVyUHJvcGVydGllcy5wdXQoZW50aXR5LCBwcm9wZXJ0aWVzKTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoRU5USVRJRVNfTElTVF9QUk9QRVJUWSk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgdGhlIGdpdmVuIEVudGl0eSBDdXN0b21pemVyUHJvcGVydGllcyBpbiB0aGlzCi0JICogZW50aXRpZXNDdXN0b21pemVyUHJvcGVydGllcyBtYXAuCi0JICogSWYgdGhlIEVudGl0eSBDdXN0b21pemVyUHJvcGVydGllcyBpcyBlbXB0eSAoaS5lLiBhbGwgcHJvcGVydGllcyBpcyBudWxsKSB0aGUgCi0JICogbWFwcGluZyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFwLgotCSAqIEBwYXJhbSBlbnRpdHkgLSBFbnRpdHkgbmFtZQotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gRW50aXR5IEN1c3RvbWl6ZXJQcm9wZXJ0aWVzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ3VzdG9taXplclByb3BlcnRpZXMgcmVwbGFjZUVudGl0eV8oU3RyaW5nIGVudGl0eSwgQ3VzdG9taXplclByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlDdXN0b21pemVyUHJvcGVydGllcyBvbGQgPSB0aGlzLmVudGl0aWVzQ3VzdG9taXplclByb3BlcnRpZXMuZ2V0KGVudGl0eSk7Ci0JCWlmIChwcm9wZXJ0aWVzLmlzRW1wdHkoKSkgewotCQkJdGhpcy5lbnRpdGllc0N1c3RvbWl6ZXJQcm9wZXJ0aWVzLnJlbW92ZShlbnRpdHkpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoRU5USVRJRVNfTElTVF9QUk9QRVJUWSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmVudGl0aWVzQ3VzdG9taXplclByb3BlcnRpZXMucHV0KGVudGl0eSwgcHJvcGVydGllcyk7Ci0JCX0KLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRpdHkoU3RyaW5nIGVudGl0eSkgewotCQlpZiAoICEgZW50aXR5RXhpc3RzKGVudGl0eSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmNsZWFyQ3VzdG9taXplclByb3BlcnRpZXMoZW50aXR5KTsKLQkJdGhpcy5lbnRpdGllc0N1c3RvbWl6ZXJQcm9wZXJ0aWVzLnJlbW92ZShlbnRpdHkpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChFTlRJVElFU19MSVNUX1BST1BFUlRZKTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY3VzdG9taXphdGlvbi9XZWF2aW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jdXN0b21pemF0aW9uL1dlYXZpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhNmNjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jdXN0b21pemF0aW9uL1dlYXZpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb247Ci0KLS8qKgotICogIFdlYXZpbmcKLSAqLwotcHVibGljIGVudW0gV2VhdmluZyB7Ci0JdHJ1ZV8sCi0JZmFsc2VfLCAKLQlzdGF0aWNfOwotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRV8gPSAidHJ1ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0VfID0gImZhbHNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUNfID0gInN0YXRpYyI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNhY2hpbmdJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNhY2hpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDg5YzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDYWNoaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUNhY2hpbmdJbXBsIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgaW1wbGVtZW50cyBFY2xpcHNlTGlua0phdmFDYWNoaW5nCi17Ci0JCi0JcHJvdGVjdGVkIENhY2hlVHlwZSBzcGVjaWZpZWRUeXBlOwotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFNpemU7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkU2hhcmVkOwotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEFsd2F5c1JlZnJlc2g7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZERpc2FibGVIaXRzOwotCQotCXByb3RlY3RlZCBib29sZWFuIGV4aXN0ZW5jZUNoZWNraW5nOwotCXByb3RlY3RlZCBFeGlzdGVuY2VUeXBlIHNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7Ci0JcHJvdGVjdGVkIEV4aXN0ZW5jZVR5cGUgZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0KLQlwcm90ZWN0ZWQgQ2FjaGVDb29yZGluYXRpb25UeXBlIHNwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7Ci0JCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUNhY2hpbmdJbXBsKEphdmFUeXBlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFUeXBlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQkvL3F1ZXJ5IGZvciB0aGUgY2FjaGUgYW5ub3RhdGlvbiBldmVyeSB0aW1lIG9uIHNldHRlcnMuCi0JLy9jYWxsIG9uZSBzZXR0ZXIgYW5kIHRoZSBDYWNoZUFubm90YXRpb24gY291bGQgY2hhbmdlLiAKLQkvL1lvdSBjb3VsZCBjYWxsIG1vcmUgdGhhbiBvbmUgc2V0dGVyIGJlZm9yZSB0aGlzIG9iamVjdCBoYXMgcmVjZWl2ZWQgYW55IG5vdGlmaWNhdGlvbgotCS8vZnJvbSB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAotCXByb3RlY3RlZCBDYWNoZUFubm90YXRpb24gZ2V0Q2FjaGVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKENhY2hlQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldE5vbk51bGxBbm5vdGF0aW9uKGdldENhY2hlQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENhY2hlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBDYWNoZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwdWJsaWMgQ2FjaGVUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRUeXBlKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRUeXBlKCkgOiB0aGlzLmdldFNwZWNpZmllZFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ2FjaGVUeXBlIGdldERlZmF1bHRUeXBlKCkgewotCQlyZXR1cm4gREVGQVVMVF9UWVBFOwotCX0KLQkJCi0JcHVibGljIENhY2hlVHlwZSBnZXRTcGVjaWZpZWRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUeXBlKENhY2hlVHlwZSBuZXdTcGVjaWZpZWRUeXBlKSB7Ci0JCUNhY2hlVHlwZSBvbGRTcGVjaWZpZWRUeXBlID0gdGhpcy5zcGVjaWZpZWRUeXBlOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBuZXdTcGVjaWZpZWRUeXBlOwotCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldFR5cGUoQ2FjaGVUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkVHlwZSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRUeXBlLCBuZXdTcGVjaWZpZWRUeXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCi0JICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKLQkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCi0JICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUeXBlXyhDYWNoZVR5cGUgbmV3U3BlY2lmaWVkVHlwZSkgewotCQlDYWNoZVR5cGUgb2xkU3BlY2lmaWVkVHlwZSA9IHRoaXMuc3BlY2lmaWVkVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gbmV3U3BlY2lmaWVkVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVHlwZSwgbmV3U3BlY2lmaWVkVHlwZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFNpemUoKSA9PSBudWxsKSA/IGdldERlZmF1bHRTaXplKCkgOiB0aGlzLmdldFNwZWNpZmllZFNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0U2l6ZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NJWkU7Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2l6ZShJbnRlZ2VyIG5ld1NwZWNpZmllZFNpemUpIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRTaXplID0gdGhpcy5zcGVjaWZpZWRTaXplOwotCQl0aGlzLnNwZWNpZmllZFNpemUgPSBuZXdTcGVjaWZpZWRTaXplOwotCQlnZXRDYWNoZUFubm90YXRpb24oKS5zZXRTaXplKG5ld1NwZWNpZmllZFNpemUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TSVpFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTaXplLCBuZXdTcGVjaWZpZWRTaXplKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2l6ZV8oSW50ZWdlciBuZXdTcGVjaWZpZWRTaXplKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkU2l6ZSA9IHRoaXMuc3BlY2lmaWVkU2l6ZTsKLQkJdGhpcy5zcGVjaWZpZWRTaXplID0gbmV3U3BlY2lmaWVkU2l6ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0laRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2l6ZSwgbmV3U3BlY2lmaWVkU2l6ZSk7Ci0JfQotCi0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWQoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTaGFyZWQoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFNoYXJlZCgpIDogdGhpcy5nZXRTcGVjaWZpZWRTaGFyZWQoKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFNoYXJlZCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NIQVJFRDsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkU2hhcmVkKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTaGFyZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuIG5ld1NwZWNpZmllZFNoYXJlZCkgewotCQlCb29sZWFuIG9sZFNoYXJlZCA9IHRoaXMuc3BlY2lmaWVkU2hhcmVkOwotCQl0aGlzLnNwZWNpZmllZFNoYXJlZCA9IG5ld1NwZWNpZmllZFNoYXJlZDsKLQkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5zZXRTaGFyZWQobmV3U3BlY2lmaWVkU2hhcmVkKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1NIQVJFRF9QUk9QRVJUWSwgb2xkU2hhcmVkLCBuZXdTcGVjaWZpZWRTaGFyZWQpOwotCQkKLQkJaWYgKG5ld1NwZWNpZmllZFNoYXJlZCA9PSBCb29sZWFuLkZBTFNFKSB7Ci0JCQlzZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkJc2V0U3BlY2lmaWVkU2l6ZShudWxsKTsKLQkJCXNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2gobnVsbCk7Ci0JCQlzZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0JCQlzZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhudWxsKTsKLQkJCXNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0JCQkvL1RPRE8gZXhwaXJ5IHNldCB0byBudWxsIGFzIHdlbGwsIHdoZW4gaXQgaXMgc3VwcG9ydGVkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTaGFyZWRfKEJvb2xlYW4gbmV3U3BlY2lmaWVkU2hhcmVkKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkU2hhcmVkID0gdGhpcy5zcGVjaWZpZWRTaGFyZWQ7Ci0JCXRoaXMuc3BlY2lmaWVkU2hhcmVkID0gbmV3U3BlY2lmaWVkU2hhcmVkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfU0hBUkVEX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTaGFyZWQsIG5ld1NwZWNpZmllZFNoYXJlZCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEFsd2F5c1JlZnJlc2goKSA6IHRoaXMuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0QWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX0FMV0FZU19SRUZSRVNIOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4gbmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCkgewotCQlCb29sZWFuIG9sZEFsd2F5c1JlZnJlc2ggPSB0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2g7Ci0JCXRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaCA9IG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2g7Ci0JCXRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuc2V0QWx3YXlzUmVmcmVzaChuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX0FMV0FZU19SRUZSRVNIX1BST1BFUlRZLCBvbGRBbHdheXNSZWZyZXNoLCBuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoXyhCb29sZWFuIG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpIHsKLQkJQm9vbGVhbiBvbGRBbHdheXNSZWZyZXNoID0gdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoOwotCQl0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2ggPSBuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksIG9sZEFsd2F5c1JlZnJlc2gsIG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkgOiB0aGlzLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfUkVGUkVTSF9PTkxZX0lGX05FV0VSOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4gbmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKSB7Ci0JCUJvb2xlYW4gb2xkUmVmcmVzaE9ubHlJZk5ld2VyID0gdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyID0gbmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZLCBvbGRSZWZyZXNoT25seUlmTmV3ZXIsIG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyXyhCb29sZWFuIG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlCb29sZWFuIG9sZFJlZnJlc2hPbmx5SWZOZXdlciA9IHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9IG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1JFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwgb2xkUmVmcmVzaE9ubHlJZk5ld2VyLCBuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdERpc2FibGVIaXRzKCkgOiB0aGlzLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHREaXNhYmxlSGl0cygpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX0RJU0FCTEVfSElUUzsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuIG5ld1NwZWNpZmllZERpc2FibGVIaXRzKSB7Ci0JCUJvb2xlYW4gb2xkRGlzYWJsZUhpdHMgPSB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCQl0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzID0gbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHM7Ci0JCXRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuc2V0RGlzYWJsZUhpdHMobmV3U3BlY2lmaWVkRGlzYWJsZUhpdHMpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfRElTQUJMRV9ISVRTX1BST1BFUlRZLCBvbGREaXNhYmxlSGl0cywgbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2FibGVIaXRzXyhCb29sZWFuIG5ld1NwZWNpZmllZERpc2FibGVIaXRzKSB7Ci0JCUJvb2xlYW4gb2xkRGlzYWJsZUhpdHMgPSB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCQl0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzID0gbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHM7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9ESVNBQkxFX0hJVFNfUFJPUEVSVFksIG9sZERpc2FibGVIaXRzLCBuZXdTcGVjaWZpZWREaXNhYmxlSGl0cyk7Ci0JfQotCQotCXB1YmxpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0Q29vcmRpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpOwotCX0KLQotCXB1YmxpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0NPT1JESU5BVElPTl9UWVBFOwotCX0KLQkJCi0JcHVibGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBuZXdTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKSB7Ci0JCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSBvbGRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlID0gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOwotCQl0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPSBuZXdTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldENvb3JkaW5hdGlvblR5cGUoQ2FjaGVDb29yZGluYXRpb25UeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSwgbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZV8oQ2FjaGVDb29yZGluYXRpb25UeXBlIG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGUpIHsKLQkJQ2FjaGVDb29yZGluYXRpb25UeXBlIG9sZFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPSB0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA9IG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NPT1JESU5BVElPTl9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlLCBuZXdTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzRXhpc3RlbmNlQ2hlY2tpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmV4aXN0ZW5jZUNoZWNraW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFeGlzdGVuY2VDaGVja2luZyhib29sZWFuIG5ld0V4aXN0ZW5jZUNoZWNraW5nKSB7Ci0JCWJvb2xlYW4gb2xkRXhpc3RlbmNlQ2hlY2tpbmcgPSB0aGlzLmV4aXN0ZW5jZUNoZWNraW5nOwotCQl0aGlzLmV4aXN0ZW5jZUNoZWNraW5nID0gbmV3RXhpc3RlbmNlQ2hlY2tpbmc7Ci0JCWlmIChuZXdFeGlzdGVuY2VDaGVja2luZykgewotCQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uTmFtZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKGdldEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbk5hbWUoKSk7Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFWElTVEVOQ0VfQ0hFQ0tJTkdfUFJPUEVSVFksIG9sZEV4aXN0ZW5jZUNoZWNraW5nLCBuZXdFeGlzdGVuY2VDaGVja2luZyk7Ci0JCXNldERlZmF1bHRFeGlzdGVuY2VUeXBlKGNhY2x1bGF0ZURlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeGlzdGVuY2VDaGVja2luZ18oYm9vbGVhbiBuZXdFeGlzdGVuY2VDaGVja2luZykgewotCQlib29sZWFuIG9sZEV4aXN0ZW5jZUNoZWNraW5nID0gdGhpcy5leGlzdGVuY2VDaGVja2luZzsKLQkJdGhpcy5leGlzdGVuY2VDaGVja2luZyA9IG5ld0V4aXN0ZW5jZUNoZWNraW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVYSVNURU5DRV9DSEVDS0lOR19QUk9QRVJUWSwgb2xkRXhpc3RlbmNlQ2hlY2tpbmcsIG5ld0V4aXN0ZW5jZUNoZWNraW5nKTsKLQkJc2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoY2FjbHVsYXRlRGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBFeGlzdGVuY2VUeXBlIGNhY2x1bGF0ZURlZmF1bHRFeGlzdGVuY2VUeXBlKCkgewotCQlpZiAoaGFzRXhpc3RlbmNlQ2hlY2tpbmcoKSkgewotCQkJcmV0dXJuIEV4aXN0ZW5jZVR5cGUuQ0hFQ0tfQ0FDSEU7Ci0JCX0KLQkJcmV0dXJuIERFRkFVTFRfRVhJU1RFTkNFX1RZUEU7Ci0JfQotCQotCXB1YmxpYyBFeGlzdGVuY2VUeXBlIGdldEV4aXN0ZW5jZVR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkgOiB0aGlzLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRXhpc3RlbmNlVHlwZSBnZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRFeGlzdGVuY2VUeXBlKEV4aXN0ZW5jZVR5cGUgbmV3RGVmYXVsdEV4aXN0ZW5jZVR5cGUpIHsKLQkJRXhpc3RlbmNlVHlwZSBvbGREZWZhdWx0RXhpc3RlbmNlVHlwZSA9IHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0JCXRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGUgPSBuZXdEZWZhdWx0RXhpc3RlbmNlVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZLCBvbGREZWZhdWx0RXhpc3RlbmNlVHlwZSwgbmV3RGVmYXVsdEV4aXN0ZW5jZVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgRXhpc3RlbmNlVHlwZSBnZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEV4aXN0ZW5jZVR5cGUgbmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSkgewotCQlpZiAoIWhhc0V4aXN0ZW5jZUNoZWNraW5nKCkpIHsKLQkJCWlmIChuZXdTcGVjaWZpZWRFeGlzdGVuY2VUeXBlICE9IG51bGwpIHsKLQkJCQlzZXRFeGlzdGVuY2VDaGVja2luZyh0cnVlKTsKLQkJCX0KLQkJCWVsc2UgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCUV4aXN0ZW5jZVR5cGUgb2xkU3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IHRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlID0gbmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZTsKLQkJdGhpcy5nZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKS5zZXRWYWx1ZShFeGlzdGVuY2VUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkRXhpc3RlbmNlVHlwZSwgbmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZV8oRXhpc3RlbmNlVHlwZSBuZXdTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKSB7Ci0JCUV4aXN0ZW5jZVR5cGUgb2xkU3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IHRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlID0gbmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUsIG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgPSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotCQlpbml0aWFsaXplKGdldENhY2hlQW5ub3RhdGlvbigpKTsKLQkJaW5pdGlhbGl6ZShnZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShDYWNoZUFubm90YXRpb24gY2FjaGUpIHsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gdGhpcy5zcGVjaWZpZWRUeXBlKGNhY2hlKTsKLQkJdGhpcy5zcGVjaWZpZWRTaXplID0gdGhpcy5zcGVjaWZpZWRTaXplKGNhY2hlKTsKLQkJdGhpcy5zcGVjaWZpZWRTaGFyZWQgPSB0aGlzLnNwZWNpZmllZFNoYXJlZChjYWNoZSk7Ci0JCXRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaCA9IHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaChjYWNoZSk7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyID0gdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoY2FjaGUpOwotCQl0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzID0gdGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0cyhjYWNoZSk7Ci0JCXRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA9IHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShjYWNoZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nKSB7Ci0JCXRoaXMuZXhpc3RlbmNlQ2hlY2tpbmcgPSBleGlzdGVuY2VDaGVja2luZyAhPSBudWxsOwotCQl0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSBzcGVjaWZpZWRFeGlzdGVuY2VUeXBlKGV4aXN0ZW5jZUNoZWNraW5nKTsKLQkJdGhpcy5kZWZhdWx0RXhpc3RlbmNlVHlwZSA9IHRoaXMuY2FjbHVsYXRlRGVmYXVsdEV4aXN0ZW5jZVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgPSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotCQl1cGRhdGUoZ2V0Q2FjaGVBbm5vdGF0aW9uKCkpOwotCQl1cGRhdGUoZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7Ci0JCXNldFNwZWNpZmllZFR5cGVfKHRoaXMuc3BlY2lmaWVkVHlwZShjYWNoZSkpOwotCQlzZXRTcGVjaWZpZWRTaXplXyh0aGlzLnNwZWNpZmllZFNpemUoY2FjaGUpKTsKLQkJc2V0U3BlY2lmaWVkU2hhcmVkXyh0aGlzLnNwZWNpZmllZFNoYXJlZChjYWNoZSkpOwotCQlzZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoXyh0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2goY2FjaGUpKTsKLQkJc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyXyh0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihjYWNoZSkpOwotCQlzZXRTcGVjaWZpZWREaXNhYmxlSGl0c18odGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0cyhjYWNoZSkpOwotCQlzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlXyh0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoY2FjaGUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nKSB7Ci0JCXNldEV4aXN0ZW5jZUNoZWNraW5nXyhleGlzdGVuY2VDaGVja2luZyAhPSBudWxsKTsKLQkJc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZV8oc3BlY2lmaWVkRXhpc3RlbmNlVHlwZShleGlzdGVuY2VDaGVja2luZykpOwotCQlzZXREZWZhdWx0RXhpc3RlbmNlVHlwZShjYWNsdWxhdGVEZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENhY2hlVHlwZSBzcGVjaWZpZWRUeXBlKENhY2hlQW5ub3RhdGlvbiBjYWNoZSkgewotCQlyZXR1cm4gQ2FjaGVUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChjYWNoZS5nZXRUeXBlKCkpOwotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFNpemUoQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7Ci0JCXJldHVybiBjYWNoZS5nZXRTaXplKCk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFNoYXJlZChDYWNoZUFubm90YXRpb24gY2FjaGUpIHsKLQkJcmV0dXJuIGNhY2hlLmdldFNoYXJlZCgpOwotCX0JCi0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkQWx3YXlzUmVmcmVzaChDYWNoZUFubm90YXRpb24gY2FjaGUpIHsKLQkJcmV0dXJuIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKTsKLQl9CQotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihDYWNoZUFubm90YXRpb24gY2FjaGUpIHsKLQkJcmV0dXJuIGNhY2hlLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCX0JCi0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkRGlzYWJsZUhpdHMoQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7Ci0JCXJldHVybiBjYWNoZS5nZXREaXNhYmxlSGl0cygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ2FjaGVDb29yZGluYXRpb25UeXBlIHNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7Ci0JCXJldHVybiBDYWNoZUNvb3JkaW5hdGlvblR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGNhY2hlLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBFeGlzdGVuY2VUeXBlIHNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nKSB7Ci0JCWlmIChleGlzdGVuY2VDaGVja2luZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gRXhpc3RlbmNlVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoZXhpc3RlbmNlQ2hlY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldENhY2hlQW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVudGl0eUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjJhNmQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhRW50aXR5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhRW50aXR5SW1wbCBleHRlbmRzIEdlbmVyaWNKYXZhRW50aXR5IGltcGxlbWVudHMgRWNsaXBzZUxpbmtKYXZhRW50aXR5Ci17Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSmF2YUNhY2hpbmcgZWNsaXBzZUxpbmtDYWNoaW5nOwotCQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFFbnRpdHlJbXBsKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5lY2xpcHNlTGlua0NhY2hpbmcgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRFY2xpcHNlTGlua0phdmFDYWNoaW5nKHRoaXMpOwotCX0KLQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFDYWNoaW5nIGdldENhY2hpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rQ2FjaGluZzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSnBhRmFjdG9yeSBnZXRKcGFGYWN0b3J5KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgc3VwZXIuZ2V0SnBhRmFjdG9yeSgpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlzdXBlci51cGRhdGUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuZWNsaXBzZUxpbmtDYWNoaW5nLnVwZGF0ZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuZWNsaXBzZUxpbmtDYWNoaW5nLmluaXRpYWxpemUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MzE4YjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtMb2dnaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0xvZ2dpbmcgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLQlpbXBsZW1lbnRzIExvZ2dpbmcKLXsKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgTG9nZ2luZ0xldmVsIGxldmVsOwotCXByaXZhdGUgQm9vbGVhbiB0aW1lc3RhbXA7Ci0JcHJpdmF0ZSBCb29sZWFuIHRocmVhZDsKLQlwcml2YXRlIEJvb2xlYW4gc2Vzc2lvbjsKLQlwcml2YXRlIEJvb2xlYW4gZXhjZXB0aW9uczsKLQlwcml2YXRlIFN0cmluZyBsb2dGaWxlTG9jYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbG9nZ2VyOyAvLyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUgc2luY2UgdmFsdWUgY2FuIGJlIExvZ2dlciBvciBjdXN0b20gY2xhc3MKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtMb2dnaW5nKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0eUxpc3RBZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgcHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQkvLyBUT1JFVklFVyAtIGhhbmRsZSBpbmNvcnJlY3QgU3RyaW5nIGluIHBlcnNpc3RlbmNlLnhtbAotCQl0aGlzLmxldmVsID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19MRVZFTCwgTG9nZ2luZ0xldmVsLnZhbHVlcygpKTsKLQkJdGhpcy50aW1lc3RhbXAgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1RJTUVTVEFNUCk7Ci0JCXRoaXMudGhyZWFkID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19USFJFQUQpOwotCQl0aGlzLnNlc3Npb24gPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT04pOwotCQl0aGlzLmV4Y2VwdGlvbnMgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX0VYQ0VQVElPTlMpOwotCQl0aGlzLmxvZ0ZpbGVMb2NhdGlvbiA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19MT0dfRklMRV9MT0NBVElPTik7Ci0JCQotCQlMb2dnZXIgc3RhbmRhcmRMb2dnZXIgPSB0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19MT0dHRVIsIExvZ2dlci52YWx1ZXMoKSk7Ci0JCWlmKCAhIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuY29udGFpbnNQcm9wZXJ0eShFQ0xJUFNFTElOS19MT0dHRVIpKSB7Ci0JCQl0aGlzLmxvZ2dlciA9IG51bGw7Ci0JCX0KLQkJZWxzZSBpZihzdGFuZGFyZExvZ2dlciA9PSBudWxsKSB7Ci0JCQl0aGlzLmxvZ2dlciA9IHRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfTE9HR0VSKTsgLy8gY3VzdG9tIGxvZ2dlcgotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5sb2dnZXIgPSBnZXRFY2xpcHNlTGlua1N0cmluZ1ZhbHVlT2Yoc3RhbmRhcmRMb2dnZXIpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTEVWRUwsCi0JCQlMRVZFTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVElNRVNUQU1QLAotCQkJVElNRVNUQU1QX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19USFJFQUQsCi0JCQlUSFJFQURfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT04sCi0JCQlTRVNTSU9OX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19FWENFUFRJT05TLAotCQkJRVhDRVBUSU9OU19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTE9HX0ZJTEVfTE9DQVRJT04sCi0JCQlMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTE9HR0VSLAotCQkJTE9HR0VSX1BST1BFUlRZKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgYXNwZWN0TmFtZSA9IGV2ZW50LmdldEFzcGVjdE5hbWUoKTsKLQkJaWYgKGFzcGVjdE5hbWUuZXF1YWxzKExFVkVMX1BST1BFUlRZKSkgewotCQkJdGhpcy5sZXZlbENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFRJTUVTVEFNUF9QUk9QRVJUWSkpIHsKLQkJCXRoaXMudGltZXN0YW1wQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoVEhSRUFEX1BST1BFUlRZKSkgewotCQkJdGhpcy50aHJlYWRDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhTRVNTSU9OX1BST1BFUlRZKSkgewotCQkJdGhpcy5zZXNzaW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoRVhDRVBUSU9OU19QUk9QRVJUWSkpIHsKLQkJCXRoaXMuZXhjZXB0aW9uc0NoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKExPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZKSkgewotCQkJdGhpcy5sb2dGaWxlTG9jYXRpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhMT0dHRVJfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLmxvZ2dlckNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBldmVudCByZWNlaXZlZCAtIHByb3BlcnR5IG5vdCBhcHBsaWNhYmxlOiAiICsgYXNwZWN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8vICoqKioqKioqKiogTG9nZ2luZ0xldmVsICoqKioqKioqKioKLQkKLQlwdWJsaWMgTG9nZ2luZ0xldmVsIGdldExldmVsKCkgewotCQlyZXR1cm4gdGhpcy5sZXZlbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGV2ZWwoTG9nZ2luZ0xldmVsIG5ld0xldmVsKSB7Ci0JCUxvZ2dpbmdMZXZlbCBvbGQgPSB0aGlzLmxldmVsOwotCQl0aGlzLmxldmVsID0gbmV3TGV2ZWw7Ci0JCXRoaXMucHV0UHJvcGVydHkoTEVWRUxfUFJPUEVSVFksIG5ld0xldmVsKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExFVkVMX1BST1BFUlRZLCBvbGQsIG5ld0xldmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGV2ZWxDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJTG9nZ2luZ0xldmVsIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIExvZ2dpbmdMZXZlbC52YWx1ZXMoKSk7Ci0JCUxvZ2dpbmdMZXZlbCBvbGQgPSB0aGlzLmxldmVsOwotCQl0aGlzLmxldmVsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgTG9nZ2luZ0xldmVsIGdldERlZmF1bHRMZXZlbCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTEVWRUw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaW1lc3RhbXAgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIHRoaXMudGltZXN0YW1wOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChCb29sZWFuIG5ld1RpbWVzdGFtcCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudGltZXN0YW1wOwotCQl0aGlzLnRpbWVzdGFtcCA9IG5ld1RpbWVzdGFtcDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShUSU1FU1RBTVBfUFJPUEVSVFksIG5ld1RpbWVzdGFtcCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUSU1FU1RBTVBfUFJPUEVSVFksIG9sZCwgbmV3VGltZXN0YW1wKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGltZXN0YW1wQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMudGltZXN0YW1wOwotCQl0aGlzLnRpbWVzdGFtcCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VGltZXN0YW1wKCkgewotCQlyZXR1cm4gREVGQVVMVF9USU1FU1RBTVA7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaHJlYWQgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFRocmVhZCgpIHsKLQkJcmV0dXJuIHRoaXMudGhyZWFkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRocmVhZChCb29sZWFuIG5ld1RocmVhZCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudGhyZWFkOwotCQl0aGlzLnRocmVhZCA9IG5ld1RocmVhZDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShUSFJFQURfUFJPUEVSVFksIG5ld1RocmVhZCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUSFJFQURfUFJPUEVSVFksIG9sZCwgbmV3VGhyZWFkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGhyZWFkQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMudGhyZWFkOwotCQl0aGlzLnRocmVhZCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VGhyZWFkKCkgewotCQlyZXR1cm4gREVGQVVMVF9USFJFQUQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRTZXNzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5zZXNzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oQm9vbGVhbiBuZXdTZXNzaW9uKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zZXNzaW9uOwotCQl0aGlzLnNlc3Npb24gPSBuZXdTZXNzaW9uOwotCQl0aGlzLnB1dFByb3BlcnR5KFNFU1NJT05fUFJPUEVSVFksIG5ld1Nlc3Npb24pOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9QUk9QRVJUWSwgb2xkLCBuZXdTZXNzaW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2Vzc2lvbkNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNlc3Npb247Ci0JCXRoaXMuc2Vzc2lvbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0U2Vzc2lvbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV4Y2VwdGlvbnMgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldEV4Y2VwdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmV4Y2VwdGlvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhjZXB0aW9ucyhCb29sZWFuIG5ld0V4Y2VwdGlvbnMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmV4Y2VwdGlvbnM7Ci0JCXRoaXMuZXhjZXB0aW9ucyA9IG5ld0V4Y2VwdGlvbnM7Ci0JCXRoaXMucHV0UHJvcGVydHkoRVhDRVBUSU9OU19QUk9QRVJUWSwgbmV3RXhjZXB0aW9ucyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENFUFRJT05TX1BST1BFUlRZLCBvbGQsIG5ld0V4Y2VwdGlvbnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGNlcHRpb25zQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuZXhjZXB0aW9uczsKLQkJdGhpcy5leGNlcHRpb25zID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gREVGQVVMVF9FWENFUFRJT05TOwotCX0KLQotCS8vICoqKioqKioqKiogbG9nRmlsZUxvY2F0aW9uICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubG9nRmlsZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvZ0ZpbGVMb2NhdGlvbihTdHJpbmcgbmV3TG9nRmlsZUxvY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvZ0ZpbGVMb2NhdGlvbjsKLQkJdGhpcy5sb2dGaWxlTG9jYXRpb24gPSBuZXdMb2dGaWxlTG9jYXRpb247Ci0JCXRoaXMucHV0UHJvcGVydHkoTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFksIG5ld0xvZ0ZpbGVMb2NhdGlvbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdMb2dGaWxlTG9jYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dGaWxlTG9jYXRpb25DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubG9nRmlsZUxvY2F0aW9uOwotCQl0aGlzLmxvZ0ZpbGVMb2NhdGlvbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBERUZBVUxUX0xPR19GSUxFX0xPQ0FUSU9OOwotCX0KLQotCS8vICoqKioqKioqKiogTG9nZ2VyICoqKioqKioqKioKLQkvKioKLQkgKiBSZXR1cm5zIExvZ2dlciBvciBjdXN0b20gbG9nZ2VyIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gRWNsaXBzZUxpbmsgc3RyaW5nIHZhbHVlIGZvciBMb2dnZXIgZW51bSBvciBjdXN0b20gbG9nZ2VyIGNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dnZXIoKSB7Ci0JCXJldHVybiB0aGlzLmxvZ2dlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIGxvZ2dlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TG9nZ2VyIC0gTG9nZ2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9nZ2VyKExvZ2dlciBuZXdMb2dnZXIpIHsKLQkJaWYoIG5ld0xvZ2dlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldExvZ2dlcl8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5zZXRMb2dnZXJfKGdldEVjbGlwc2VMaW5rU3RyaW5nVmFsdWVPZihuZXdMb2dnZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIGxvZ2dlciBvciBjdXN0b20gbG9nZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdMb2dnZXIgLQotCSAqICAgICAgICAgICAgQ2FuIGJlIGEgRWNsaXBzZUxpbmsgbG9nZ2VyIGxpdGVyYWwgb3IKLQkgKiAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjdXN0b20gbG9nZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvZ2dlcihTdHJpbmcgbmV3TG9nZ2VyKSB7Ci0JCWlmKCBuZXdMb2dnZXIgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRMb2dnZXJfKChTdHJpbmcpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyRm9yKG5ld0xvZ2dlcik7Ci0JCWlmKGxvZ2dlciA9PSBudWxsKSB7CS8vIGN1c3RvbSBMb2dnZXIgY2xhc3MKLQkJCXRoaXMuc2V0TG9nZ2VyXyhuZXdMb2dnZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZXRMb2dnZXIobG9nZ2VyKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0TG9nZ2VyXyhTdHJpbmcgbmV3TG9nZ2VyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvZ2dlcjsKLQkJdGhpcy5sb2dnZXIgPSBuZXdMb2dnZXI7Ci0JCXRoaXMucHV0UHJvcGVydHkoTE9HR0VSX1BST1BFUlRZLCBuZXdMb2dnZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTE9HR0VSX1BST1BFUlRZLCBvbGQsIG5ld0xvZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ2dlckNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbmV3VmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlTdHJpbmcgb2xkID0gdGhpcy5sb2dnZXI7Ci0JCXRoaXMubG9nZ2VyID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExvZ2dlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfTE9HR0VSOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2xvZ2dpbmcvTG9nZ2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9sb2dnaW5nL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWM1ZDFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2xvZ2dpbmcvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmc7Ci0KLS8qKgotICogTG9nZ2VyCi0gKi8KLXB1YmxpYyBlbnVtIExvZ2dlciB7Ci0JCQlkZWZhdWx0X2xvZ2dlciwgCi0JCQlqYXZhX2xvZ2dlciwgCi0JCQlzZXJ2ZXJfbG9nZ2VyOwotCQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HR0VSID0gIkRlZmF1bHRMb2dnZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTE9HR0VSID0gIkphdmFMb2dnZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9MT0dHRVIgPSAiU2VydmVyTG9nZ2VyIjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIExvZ2dlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaXRlcmFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGdldExvZ2dlckZvcihTdHJpbmcgbGl0ZXJhbCkgewotCQkKLQkJZm9yKCBMb2dnZXIgbG9nZ2VyIDogTG9nZ2VyLnZhbHVlcygpKSB7Ci0JCQlpZihsb2dnZXIudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gbG9nZ2VyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9sb2dnaW5nL0xvZ2dpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2xvZ2dpbmcvTG9nZ2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWUwYjRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2xvZ2dpbmcvTG9nZ2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqIExvZ2dpbmcKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2dnaW5nIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCUxvZ2dpbmdMZXZlbCBnZXREZWZhdWx0TGV2ZWwoKTsKLQlMb2dnaW5nTGV2ZWwgZ2V0TGV2ZWwoKTsKLQl2b2lkIHNldExldmVsKExvZ2dpbmdMZXZlbCBsZXZlbCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxfUFJPUEVSVFkgPSAibGV2ZWxQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19MRVZFTCA9ICJlY2xpcHNlbGluay5sb2dnaW5nLmxldmVsIjsKLQkJc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBERUZBVUxUX0xFVkVMID0gTG9nZ2luZ0xldmVsLmluZm87Ci0JCi0JQm9vbGVhbiBnZXREZWZhdWx0VGltZXN0YW1wKCk7Ci0JQm9vbGVhbiBnZXRUaW1lc3RhbXAoKTsKLQl2b2lkIHNldFRpbWVzdGFtcChCb29sZWFuIHRpbWVzdGFtcCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVNUQU1QX1BST1BFUlRZID0gInRpbWVzdGFtcFByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RJTUVTVEFNUCA9ICJlY2xpcHNlbGluay5sb2dnaW5nLnRpbWVzdGFtcCI7Ci0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfVElNRVNUQU1QID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFRocmVhZCgpOwotCUJvb2xlYW4gZ2V0VGhyZWFkKCk7Ci0Jdm9pZCBzZXRUaHJlYWQoQm9vbGVhbiB0aHJlYWQpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9QUk9QRVJUWSA9ICJ0aHJlYWRQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19USFJFQUQgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy50aHJlYWQiOwotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1RIUkVBRCA9IEJvb2xlYW4uVFJVRTsKLQkKLQlCb29sZWFuIGdldERlZmF1bHRTZXNzaW9uKCk7Ci0JQm9vbGVhbiBnZXRTZXNzaW9uKCk7Ci0Jdm9pZCBzZXRTZXNzaW9uKEJvb2xlYW4gc2Vzc2lvbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9QUk9QRVJUWSA9ICJzZXNzaW9uUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTiA9ICJlY2xpcHNlbGluay5sb2dnaW5nLnNlc3Npb24iOwotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1NFU1NJT04gPSBCb29sZWFuLlRSVUU7Ci0JCi0JQm9vbGVhbiBnZXREZWZhdWx0RXhjZXB0aW9ucygpOwotCUJvb2xlYW4gZ2V0RXhjZXB0aW9ucygpOwotCXZvaWQgc2V0RXhjZXB0aW9ucyhCb29sZWFuIGV4Y2VwdGlvbnMpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTlNfUFJPUEVSVFkgPSAiZXhjZXB0aW9uc1Byb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0VYQ0VQVElPTlMgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5leGNlcHRpb25zIjsKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9FWENFUFRJT05TID0gQm9vbGVhbi5GQUxTRTsKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKTsKLQlTdHJpbmcgZ2V0TG9nRmlsZUxvY2F0aW9uKCk7Ci0Jdm9pZCBzZXRMb2dGaWxlTG9jYXRpb24oU3RyaW5nIG5ld0xvZ0ZpbGVMb2NhdGlvbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFkgPSAibG9nRmlsZUxvY2F0aW9uUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTE9HX0ZJTEVfTE9DQVRJT04gPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5maWxlIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xPR19GSUxFX0xPQ0FUSU9OID0gbnVsbDsJCS8vIE5vIERlZmF1bHQKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRMb2dnZXIoKTsKLQlTdHJpbmcgZ2V0TG9nZ2VyKCk7Ci0Jdm9pZCBzZXRMb2dnZXIoU3RyaW5nIG5ld0xvZ2dlcik7Ci0Jdm9pZCBzZXRMb2dnZXIoTG9nZ2VyIG5ld0xvZ2dlcik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0VSX1BST1BFUlRZID0gImxvZ2dlclByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0xPR0dFUiA9ICJlY2xpcHNlbGluay5sb2dnaW5nLmxvZ2dlciI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dHRVIgPSAKLQkJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5nZXRFY2xpcHNlTGlua1N0cmluZ1ZhbHVlT2YoTG9nZ2VyLmRlZmF1bHRfbG9nZ2VyKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvbG9nZ2luZy9Mb2dnaW5nTGV2ZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2xvZ2dpbmcvTG9nZ2luZ0xldmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MGY0NzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvbG9nZ2luZy9Mb2dnaW5nTGV2ZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZzsKLQotLyoqCi0gKiAgTG9nZ2luZ0xldmVsCi0gKi8KLXB1YmxpYyBlbnVtIExvZ2dpbmdMZXZlbCB7Ci0JCQlvZmYsIAotCQkJc2V2ZXJlLCAKLQkJCXdhcm5pbmcsIAotCQkJaW5mbywgCi0JCQljb25maWcsIAotCQkJZmluZSwgCi0JCQlmaW5lciwgCi0JCQlmaW5lc3Q7Ci0KLQkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRkYgPSAiT0ZGIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVZFUkUgPSAiU0VWRVJFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HID0gIldBUk5JTkciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORk8gPSAiSU5GTyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHID0gIkNPTkZJRyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklORSA9ICJGSU5FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5FUiA9ICJGSU5FUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklORVNUID0gIkZJTkVTVCI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9ucy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiOGFlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqICBFY2xpcHNlTGlua09wdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3B0aW9ucyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotCWltcGxlbWVudHMgT3B0aW9ucwotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBTdHJpbmcgc2Vzc2lvbk5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgc2Vzc2lvbnNYbWw7Ci0JcHJpdmF0ZSBCb29sZWFuIGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllczsKLQlwcml2YXRlIFN0cmluZyB0YXJnZXREYXRhYmFzZTsgLy8gc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlIHNpbmNlIHZhbHVlIGNhbiBiZSBUYXJnZXREYXRhYmFzZSBvciBjdXN0b20gY2xhc3MKLQlwcml2YXRlIFN0cmluZyB0YXJnZXRTZXJ2ZXI7IC8vIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZSBzaW5jZSB2YWx1ZSBjYW4gYmUgVGFyZ2V0U2VydmVyIG9yIGN1c3RvbSBjbGFzcwotCXByaXZhdGUgU3RyaW5nIGV2ZW50TGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0eUxpc3RBZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgcHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQkvLyBUT1JFVklFVyAtIGhhbmRsZSBpbmNvcnJlY3QgU3RyaW5nIGluIHBlcnNpc3RlbmNlLnhtbAotCQl0aGlzLnNlc3Npb25OYW1lID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT05fTkFNRSk7Ci0JCXRoaXMuc2Vzc2lvbnNYbWwgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MKTsKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMpOwotCQl0aGlzLnRhcmdldERhdGFiYXNlID0gdGhpcy5nZXRUYXJnZXREYXRhYmFzZUZyb21QZXJzaXN0ZW5jZVhtbCgpOwotCQl0aGlzLnRhcmdldFNlcnZlciA9IHRoaXMuZ2V0VGFyZ2V0U2VydmVyRnJvbVBlcnNpc3RlbmNlWG1sKCk7Ci0JCXRoaXMuZXZlbnRMaXN0ZW5lciA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXREYXRhYmFzZUZyb21QZXJzaXN0ZW5jZVhtbCgpIHsKLQotCQlUYXJnZXREYXRhYmFzZSBzdGFuZGFyZFRhcmdldERhdGFiYXNlID0gdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfVEFSR0VUX0RBVEFCQVNFLCBUYXJnZXREYXRhYmFzZS52YWx1ZXMoKSk7Ci0JCWlmKCAhIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuY29udGFpbnNQcm9wZXJ0eShFQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0UpKSB7Ci0JCQlyZXR1cm4obnVsbCk7Ci0JCX0KLQkJZWxzZSBpZihzdGFuZGFyZFRhcmdldERhdGFiYXNlID09IG51bGwpIHsKLQkJCXJldHVybih0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSkpOyAvLyBjdXN0b20gdGFyZ2V0RGF0YWJhc2UKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybihnZXRFY2xpcHNlTGlua1N0cmluZ1ZhbHVlT2Yoc3RhbmRhcmRUYXJnZXREYXRhYmFzZSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0U2VydmVyRnJvbVBlcnNpc3RlbmNlWG1sKCkgewotCi0JCVRhcmdldFNlcnZlciBzdGFuZGFyZFRhcmdldFNlcnZlciA9IHRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVIsIFRhcmdldFNlcnZlci52YWx1ZXMoKSk7Ci0JCWlmKCAhIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuY29udGFpbnNQcm9wZXJ0eShFQ0xJUFNFTElOS19UQVJHRVRfU0VSVkVSKSkgewotCQkJcmV0dXJuKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYoc3RhbmRhcmRUYXJnZXRTZXJ2ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuKHRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfVEFSR0VUX1NFUlZFUikpOyAvLyBjdXN0b20gdGFyZ2V0U2VydmVyCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4oZ2V0RWNsaXBzZUxpbmtTdHJpbmdWYWx1ZU9mKHN0YW5kYXJkVGFyZ2V0U2VydmVyKSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAotCSAqIAkJa2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkga2V5Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TRVNTSU9OX05BTUUsCi0JCQlTRVNTSU9OX05BTUVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT05TX1hNTCwKLQkJCVNFU1NJT05TX1hNTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUywKLQkJCVNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSwKLQkJCVRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVEFSR0VUX1NFUlZFUiwKLQkJCVRBUkdFVF9TRVJWRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT05fRVZFTlRfTElTVEVORVIsCi0JCQlTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgYXNwZWN0TmFtZSA9IGV2ZW50LmdldEFzcGVjdE5hbWUoKTsKLQkJaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFNFU1NJT05fTkFNRV9QUk9QRVJUWSkpIHsKLQkJCXRoaXMuc2Vzc2lvbk5hbWVDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhTRVNTSU9OU19YTUxfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLnNlc3Npb25zWG1sQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSkgewotCQkJdGhpcy50YXJnZXREYXRhYmFzZUNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFRBUkdFVF9TRVJWRVJfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLnRhcmdldFNlcnZlckNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLmV2ZW50TGlzdGVuZXJDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgZXZlbnQgcmVjZWl2ZWQgLSBwcm9wZXJ0eSBub3QgYXBwbGljYWJsZTogIiArIGFzcGVjdE5hbWUpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNlc3Npb25OYW1lICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZXNzaW9uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uTmFtZShTdHJpbmcgbmV3U2Vzc2lvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc2Vzc2lvbk5hbWU7Ci0JCXRoaXMuc2Vzc2lvbk5hbWUgPSBuZXdTZXNzaW9uTmFtZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OX05BTUVfUFJPUEVSVFksIG5ld1Nlc3Npb25OYW1lKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fTkFNRV9QUk9QRVJUWSwgb2xkLCBuZXdTZXNzaW9uTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlc3Npb25OYW1lQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25OYW1lOwotCQl0aGlzLnNlc3Npb25OYW1lID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlc3Npb25OYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9TRVNTSU9OX05BTUU7Ci0JfQotCi0JCS8vICoqKioqKioqKiogU2Vzc2lvbnNYbWwgKioqKioqKioqKgotCQlwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25zWG1sKCkgewotCQkJcmV0dXJuIHRoaXMuc2Vzc2lvbnNYbWw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uc1htbChTdHJpbmcgbmV3U2Vzc2lvbnNYbWwpIHsKLQkJCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25zWG1sOwotCQkJdGhpcy5zZXNzaW9uc1htbCA9IG5ld1Nlc3Npb25zWG1sOwotCQkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OU19YTUxfUFJPUEVSVFksIG5ld1Nlc3Npb25zWG1sKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OU19YTUxfUFJPUEVSVFksIG9sZCwgbmV3U2Vzc2lvbnNYbWwpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNlc3Npb25zWG1sQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQkJU3RyaW5nIG9sZCA9IHRoaXMuc2Vzc2lvbnNYbWw7Ci0JCQl0aGlzLnNlc3Npb25zWG1sID0gbmV3VmFsdWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlc3Npb25zWG1sKCkgewotCQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTlNfWE1MOwotCQl9Ci0KLQkvLyAqKioqKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCkgewotCQlyZXR1cm4gdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKEJvb2xlYW4gbmV3SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXM7Ci0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzID0gbmV3SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzOwotCQl0aGlzLnB1dFByb3BlcnR5KFNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFksIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZLCBvbGQsIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllczsKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRhcmdldERhdGFiYXNlICoqKioqKioqKioKLQkvKioKLQkgKiBSZXR1cm5zIFRhcmdldERhdGFiYXNlIG9yIGN1c3RvbSB0YXJnZXREYXRhYmFzZSBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIEVjbGlwc2VMaW5rIHN0cmluZyB2YWx1ZSBmb3IgVGFyZ2V0RGF0YWJhc2UgZW51bSBvciBjdXN0b20gdGFyZ2V0RGF0YWJhc2UgY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXREYXRhYmFzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIHRhcmdldERhdGFiYXNlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdUYXJnZXREYXRhYmFzZSAtIFRhcmdldERhdGFiYXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RGF0YWJhc2UoVGFyZ2V0RGF0YWJhc2UgbmV3VGFyZ2V0RGF0YWJhc2UpIHsKLQkJaWYoIG5ld1RhcmdldERhdGFiYXNlID09IG51bGwpIHsKLQkJCXRoaXMuc2V0VGFyZ2V0RGF0YWJhc2VfKChTdHJpbmcpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuc2V0VGFyZ2V0RGF0YWJhc2VfKGdldEVjbGlwc2VMaW5rU3RyaW5nVmFsdWVPZihuZXdUYXJnZXREYXRhYmFzZSkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgRWNsaXBzZUxpbmsgdGFyZ2V0RGF0YWJhc2Ugb3IgY3VzdG9tIHRhcmdldERhdGFiYXNlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdUYXJnZXREYXRhYmFzZSAtCi0JICogICAgICAgICAgICBDYW4gYmUgYSBFY2xpcHNlTGluayBUYXJnZXREYXRhYmFzZSBsaXRlcmFsIG9yCi0JICogICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY3VzdG9tIHRhcmdldERhdGFiYXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldERhdGFiYXNlKFN0cmluZyBuZXdUYXJnZXREYXRhYmFzZSkgewotCQlpZiggbmV3VGFyZ2V0RGF0YWJhc2UgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRUYXJnZXREYXRhYmFzZV8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVGFyZ2V0RGF0YWJhc2UgY3VzdG9tVGFyZ2V0RGF0YWJhc2UgPSBUYXJnZXREYXRhYmFzZS5nZXRUYXJnZXREYXRhYmFzZUZvcihuZXdUYXJnZXREYXRhYmFzZSk7Ci0JCWlmKGN1c3RvbVRhcmdldERhdGFiYXNlID09IG51bGwpIHsJLy8gY3VzdG9tIFRhcmdldERhdGFiYXNlIGNsYXNzCi0JCQl0aGlzLnNldFRhcmdldERhdGFiYXNlXyhuZXdUYXJnZXREYXRhYmFzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNldFRhcmdldERhdGFiYXNlKGN1c3RvbVRhcmdldERhdGFiYXNlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VGFyZ2V0RGF0YWJhc2VfKFN0cmluZyBuZXdUYXJnZXREYXRhYmFzZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50YXJnZXREYXRhYmFzZTsKLQkJdGhpcy50YXJnZXREYXRhYmFzZSA9IG5ld1RhcmdldERhdGFiYXNlOwotCQl0aGlzLnB1dFByb3BlcnR5KFRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSwgbmV3VGFyZ2V0RGF0YWJhc2UpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZLCBvbGQsIG5ld1RhcmdldERhdGFiYXNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGFyZ2V0RGF0YWJhc2VDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0RGF0YWJhc2U7Ci0JCXRoaXMudGFyZ2V0RGF0YWJhc2UgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gREVGQVVMVF9UQVJHRVRfREFUQUJBU0U7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUYXJnZXRTZXJ2ZXIgKioqKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgVGFyZ2V0U2VydmVyIG9yIGN1c3RvbSB0YXJnZXRTZXJ2ZXIgY2xhc3MuCi0JICogCi0JICogQHJldHVybiBFY2xpcHNlTGluayBzdHJpbmcgdmFsdWUgZm9yIFRhcmdldFNlcnZlciBlbnVtIG9yIGN1c3RvbSB0YXJnZXRTZXJ2ZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0U2VydmVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgRWNsaXBzZUxpbmsgdGFyZ2V0U2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdUYXJnZXRTZXJ2ZXIgLSBUYXJnZXRTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRTZXJ2ZXIoVGFyZ2V0U2VydmVyIG5ld1RhcmdldFNlcnZlcikgewotCQlpZiggbmV3VGFyZ2V0U2VydmVyID09IG51bGwpIHsKLQkJCXRoaXMuc2V0VGFyZ2V0U2VydmVyXygoU3RyaW5nKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnNldFRhcmdldFNlcnZlcl8oZ2V0RWNsaXBzZUxpbmtTdHJpbmdWYWx1ZU9mKG5ld1RhcmdldFNlcnZlcikpOwotCX0KLQotCS8qKgotCSAqIFNldHMgRWNsaXBzZUxpbmsgdGFyZ2V0U2VydmVyIG9yIGN1c3RvbSB0YXJnZXRTZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIG5ld1RhcmdldFNlcnZlciAtCi0JICogICAgICAgICAgICBDYW4gYmUgYSBFY2xpcHNlTGluayBUYXJnZXRTZXJ2ZXIgbGl0ZXJhbCBvcgotCSAqICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGN1c3RvbSB0YXJnZXRTZXJ2ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0U2VydmVyKFN0cmluZyBuZXdUYXJnZXRTZXJ2ZXIpIHsKLQkJaWYoIG5ld1RhcmdldFNlcnZlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFRhcmdldFNlcnZlcl8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVGFyZ2V0U2VydmVyIGN1c3RvbVRhcmdldFNlcnZlciA9IFRhcmdldFNlcnZlci5nZXRUYXJnZXRTZXJ2ZXJGb3IobmV3VGFyZ2V0U2VydmVyKTsKLQkJaWYoY3VzdG9tVGFyZ2V0U2VydmVyID09IG51bGwpIHsJLy8gY3VzdG9tIFRhcmdldFNlcnZlciBjbGFzcwotCQkJdGhpcy5zZXRUYXJnZXRTZXJ2ZXJfKG5ld1RhcmdldFNlcnZlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNldFRhcmdldFNlcnZlcihjdXN0b21UYXJnZXRTZXJ2ZXIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRUYXJnZXRTZXJ2ZXJfKFN0cmluZyBuZXdUYXJnZXRTZXJ2ZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0U2VydmVyOwotCQl0aGlzLnRhcmdldFNlcnZlciA9IG5ld1RhcmdldFNlcnZlcjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShUQVJHRVRfU0VSVkVSX1BST1BFUlRZLCBuZXdUYXJnZXRTZXJ2ZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSwgb2xkLCBuZXdUYXJnZXRTZXJ2ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0YXJnZXRTZXJ2ZXJDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0U2VydmVyOwotCQl0aGlzLnRhcmdldFNlcnZlciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9UQVJHRVRfU0VSVkVSOwotCX0KLQotCS8vICoqKioqKioqKiogRXZlbnRMaXN0ZW5lciAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRFdmVudExpc3RlbmVyKCkgewotCQlyZXR1cm4gdGhpcy5ldmVudExpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV2ZW50TGlzdGVuZXIoU3RyaW5nIG5ld0V2ZW50TGlzdGVuZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZXZlbnRMaXN0ZW5lcjsKLQkJdGhpcy5ldmVudExpc3RlbmVyID0gbmV3RXZlbnRMaXN0ZW5lcjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZLCBuZXdFdmVudExpc3RlbmVyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFksIG9sZCwgbmV3RXZlbnRMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV2ZW50TGlzdGVuZXJDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZXZlbnRMaXN0ZW5lcjsKLQkJdGhpcy5ldmVudExpc3RlbmVyID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEV2ZW50TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NFU1NJT05fRVZFTlRfTElTVEVORVI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3B0aW9ucy9PcHRpb25zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcHRpb25zL09wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlODFmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcHRpb25zL09wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogIFNlc3Npb24gT3B0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9wdGlvbnMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JU3RyaW5nIGdldERlZmF1bHRTZXNzaW9uTmFtZSgpOwotCVN0cmluZyBnZXRTZXNzaW9uTmFtZSgpOwotCXZvaWQgc2V0U2Vzc2lvbk5hbWUoU3RyaW5nIG5ld1Nlc3Npb25OYW1lKTsgCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9OQU1FX1BST1BFUlRZID0gInNlc3Npb25OYW1lUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FID0gImVjbGlwc2VsaW5rLnNlc3Npb24tbmFtZSI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVNTSU9OX05BTUUgPSAiIjsJLy8gbm8gZGVmYXVsdAotCi0JU3RyaW5nIGdldERlZmF1bHRTZXNzaW9uc1htbCgpOwotCVN0cmluZyBnZXRTZXNzaW9uc1htbCgpOwotCXZvaWQgc2V0U2Vzc2lvbnNYbWwoU3RyaW5nIG5ld1Nlc3Npb25zWG1sKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OU19YTUxfUFJPUEVSVFkgPSAic2Vzc2lvbnNYbWxQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TRVNTSU9OU19YTUwgPSAiZWNsaXBzZWxpbmsuc2Vzc2lvbnMteG1sIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFU1NJT05TX1hNTCA9ICIiOwkvLyBubyBkZWZhdWx0Ci0JCQotCUJvb2xlYW4gZ2V0RGVmYXVsdEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpOwotCUJvb2xlYW4gZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0Jdm9pZCBzZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoQm9vbGVhbiBuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkgPSAiaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUyA9ICJlY2xpcHNlbGluay5zZXNzaW9uLmluY2x1ZGUuZGVzY3JpcHRvci5xdWVyaWVzIjsKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTID0gQm9vbGVhbi5UUlVFOwotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldERhdGFiYXNlKCk7Ci0JU3RyaW5nIGdldFRhcmdldERhdGFiYXNlKCk7Ci0Jdm9pZCBzZXRUYXJnZXREYXRhYmFzZShTdHJpbmcgbmV3VGFyZ2V0RGF0YWJhc2UpOwotCXZvaWQgc2V0VGFyZ2V0RGF0YWJhc2UoVGFyZ2V0RGF0YWJhc2UgbmV3VGFyZ2V0RGF0YWJhc2UpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSA9ICJ0YXJnZXREYXRhYmFzZVByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSA9ICJlY2xpcHNlbGluay50YXJnZXQtZGF0YWJhc2UiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFSR0VUX0RBVEFCQVNFID0gCi0JCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuZ2V0RWNsaXBzZUxpbmtTdHJpbmdWYWx1ZU9mKFRhcmdldERhdGFiYXNlLmF1dG8pOwotCi0JU3RyaW5nIGdldERlZmF1bHRUYXJnZXRTZXJ2ZXIoKTsKLQlTdHJpbmcgZ2V0VGFyZ2V0U2VydmVyKCk7Ci0Jdm9pZCBzZXRUYXJnZXRTZXJ2ZXIoU3RyaW5nIG5ld1RhcmdldFNlcnZlcik7Ci0Jdm9pZCBzZXRUYXJnZXRTZXJ2ZXIoVGFyZ2V0U2VydmVyIG5ld1RhcmdldFNlcnZlcik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSA9ICJ0YXJnZXRTZXJ2ZXJQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19UQVJHRVRfU0VSVkVSID0gImVjbGlwc2VsaW5rLnRhcmdldC1zZXJ2ZXIiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFSR0VUX1NFUlZFUiA9IAotCQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmdldEVjbGlwc2VMaW5rU3RyaW5nVmFsdWVPZihUYXJnZXRTZXJ2ZXIubm9uZSk7Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdEV2ZW50TGlzdGVuZXIoKTsKLQlTdHJpbmcgZ2V0RXZlbnRMaXN0ZW5lcigpOwotCXZvaWQgc2V0RXZlbnRMaXN0ZW5lcihTdHJpbmcgbmV3RXZlbnRMaXN0ZW5lcik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSA9ICJldmVudExpc3RlbmVyUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTl9FVkVOVF9MSVNURU5FUiA9ICJlY2xpcHNlbGluay5zZXNzaW9uLWV2ZW50LWxpc3RlbmVyIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFU1NJT05fRVZFTlRfTElTVEVORVIgPSBudWxsOwkvLyBubyBkZWZhdWx0Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29wdGlvbnMvVGFyZ2V0RGF0YWJhc2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29wdGlvbnMvVGFyZ2V0RGF0YWJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1MDEwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcHRpb25zL1RhcmdldERhdGFiYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcHRpb25zOwotCi0vKioKLSAqICBUYXJnZXREYXRhYmFzZQotICovCi1wdWJsaWMgZW51bSBUYXJnZXREYXRhYmFzZSB7Ci0JCQlhdHR1bml0eSwKLQkJCWF1dG8sCi0JCQljbG91ZHNjYXBlLAotCQkJZGF0YWJhc2UsCi0JCQlkYjIsCi0JCQlkYjJtYWluZnJhbWUsCi0JCQlkYmFzZSwKLQkJCWRlcmJ5LAotCQkJaHNxbCwKLQkJCWluZm9ybWl4LAotCQkJamF2YWRiLAotCQkJbXlzcWxwbGF0Zm9ybSwKLQkJCW9yYWNsZSwKLQkJCXBvaW50YmFzZSwKLQkJCXBvc3RncmVzcWwsCi0JCQlzcWxhbnl3aGVyZSwKLQkJCXNxbHNlcnZlciwKLQkJCXN5YmFzZSwKLQkJCXRpbWVzdGVuOwotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRVTklUWSA9ICJBdHR1bml0eSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPID0gIkF1dG8iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPVURTQ0FQRSA9ICJDbG91ZHNjYXBlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFID0gIkRhdGFiYXNlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERCMiA9ICJEQjIiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREIyTUFJTkZSQU1FID0gIkRCMk1haW5mcmFtZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQkFTRSA9ICJEQmFzZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERVJCWSA9ICJEZXJieSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBIU1FMID0gIkhTUUwiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT1JNSVggPSAiSW5mb3JtaXgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQURCID0gIkphdmFEQiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNWVNRTFBMQVRGT1JNID0gIk15U1FMUGxhdGZvcm0iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JBQ0xFID0gIk9yYWNsZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQT0lOVEJBU0UgPSAiUG9pbnRCYXNlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RHUkVTUUwgPSAiUG9zdGdyZVNRTCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTUUxBTllXSEVSRSA9ICJTUUxBbnlXaGVyZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTUUxTRVJWRVIgPSAiU1FMU2VydmVyIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNZQkFTRSA9ICJTeWJhc2UiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVNURU4gPSAiVGltZXNUZW4iOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBUYXJnZXREYXRhYmFzZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaXRlcmFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFyZ2V0RGF0YWJhc2UgZ2V0VGFyZ2V0RGF0YWJhc2VGb3IoU3RyaW5nIGxpdGVyYWwpIHsKLQkJCi0JCWZvciggVGFyZ2V0RGF0YWJhc2UgdGFyZ2V0RGF0YWJhc2UgOiBUYXJnZXREYXRhYmFzZS52YWx1ZXMoKSkgewotCQkJaWYodGFyZ2V0RGF0YWJhc2UudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gdGFyZ2V0RGF0YWJhc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3B0aW9ucy9UYXJnZXRTZXJ2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29wdGlvbnMvVGFyZ2V0U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyY2VhYWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3B0aW9ucy9UYXJnZXRTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnM7Ci0KLS8qKgotICogIFRhcmdldFNlcnZlcgotICovCi1wdWJsaWMgZW51bSBUYXJnZXRTZXJ2ZXIgewotCQkJbm9uZSwKLQkJCW9jNGosCi0JCQlzdW5hczksCi0JCQl3ZWJzcGhlcmUsCi0JCQl3ZWJzcGhlcmVfNl8xLAotCQkJd2VibG9naWMsCi0JCQl3ZWJsb2dpY185LAotCQkJd2VibG9naWNfMTAsCi0JCQlqYm9zczsKLQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJOb25lIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE9DNEogPSAiT0M0SiI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBTVU5BUzkgPSAiU3VuQVM5IjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNQSEVSRSA9ICJXZWJTcGhlcmUiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU1BIRVJFXzZfMSA9ICJXZWJTcGhlcmVfNl8xIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkxPR0lDID0gIldlYkxvZ2ljIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkxPR0lDXzkgPSAiV2ViTG9naWNfOSI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBXRUJMT0dJQ18xMCA9ICJXZWJMb2dpY18xMCI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBKQk9TUyA9ICJKQm9zcyI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFRhcmdldFNlcnZlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaXRlcmFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFyZ2V0U2VydmVyIGdldFRhcmdldFNlcnZlckZvcihTdHJpbmcgbGl0ZXJhbCkgewotCQkKLQkJZm9yKCBUYXJnZXRTZXJ2ZXIgdGFyZ2V0U2VydmVyIDogVGFyZ2V0U2VydmVyLnZhbHVlcygpKSB7Ci0JCQlpZih0YXJnZXRTZXJ2ZXIudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gdGFyZ2V0U2VydmVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0ZTg4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb247Ci0KLS8qKgotICogIERkbEdlbmVyYXRpb25UeXBlCi0gKi8KLXB1YmxpYyBlbnVtIERkbEdlbmVyYXRpb25UeXBlIHsKLQlub25lLCAKLQljcmVhdGVfdGFibGVzLCAKLQlkcm9wX2FuZF9jcmVhdGVfdGFibGVzOwotCQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAibm9uZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1RBQkxFUyA9ICJjcmVhdGUtdGFibGVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QX0FORF9DUkVBVEVfVEFCTEVTID0gImRyb3AtYW5kLWNyZWF0ZS10YWJsZXMiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvc2NoZW1hL2dlbmVyYXRpb24vRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGI0OGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvc2NoZW1hL2dlbmVyYXRpb24vRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uIGVuY2Fwc3VsYXRlcyBFY2xpcHNlTGluayBTY2hlbWFHZW5lcmF0aW9uCi0gKiBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgaW1wbGVtZW50cyBTY2hlbWFHZW5lcmF0aW9uCi17Ci0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQkKLQlwcml2YXRlIE91dHB1dE1vZGUgb3V0cHV0TW9kZTsKLQlwcml2YXRlIERkbEdlbmVyYXRpb25UeXBlIGRkbEdlbmVyYXRpb25UeXBlOwotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZUZpbGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIGRyb3BGaWxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBhcHBsaWNhdGlvbkxvY2F0aW9uOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyBFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24oUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBwcm9wZXJ0eUxpc3RBZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCXRoaXMub3V0cHV0TW9kZSA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUsIE91dHB1dE1vZGUudmFsdWVzKCkpOwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFLCBEZGxHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKSk7Ci0JCXRoaXMuY3JlYXRlRmlsZU5hbWUgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSk7Ci0JCXRoaXMuZHJvcEZpbGVOYW1lID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FKTsKLQkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IGtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5Ci0JICoga2V5OyB2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSwKLQkJCU9VVFBVVF9NT0RFX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFLAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSwKLQkJCUNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FLAotCQkJRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBhc3BlY3ROYW1lID0gZXZlbnQuZ2V0QXNwZWN0TmFtZSgpOwotCQkKLQkJaWYgKGFzcGVjdE5hbWUuZXF1YWxzKE9VVFBVVF9NT0RFX1BST1BFUlRZKSkgewotCQkJdGhpcy5vdXRwdXRNb2RlQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSkpIHsKLQkJCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZKSkgewotCQkJdGhpcy5jcmVhdGVGaWxlTmFtZUNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKERST1BfRklMRV9OQU1FX1BST1BFUlRZKSkgewotCQkJdGhpcy5kcm9wRmlsZU5hbWVDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhBUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSkpIHsKLQkJCXRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbkNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBldmVudCByZWNlaXZlZCAtIHByb3BlcnR5IG5vdCBhcHBsaWNhYmxlOiAiICsgYXNwZWN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8vICoqKioqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKioqKgotCXB1YmxpYyBEZGxHZW5lcmF0aW9uVHlwZSBnZXREZGxHZW5lcmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGRsR2VuZXJhdGlvblR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGRsR2VuZXJhdGlvblR5cGUoRGRsR2VuZXJhdGlvblR5cGUgbmV3RGRsR2VuVHlwZSkgewotCQlEZGxHZW5lcmF0aW9uVHlwZSBvbGQgPSB0aGlzLmRkbEdlbmVyYXRpb25UeXBlOwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlID0gbmV3RGRsR2VuVHlwZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZLCBuZXdEZGxHZW5UeXBlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFksIG9sZCwgbmV3RGRsR2VuVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRkbEdlbmVyYXRpb25UeXBlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCURkbEdlbmVyYXRpb25UeXBlIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIERkbEdlbmVyYXRpb25UeXBlLnZhbHVlcygpKTsKLQkJRGRsR2VuZXJhdGlvblR5cGUgb2xkID0gdGhpcy5kZGxHZW5lcmF0aW9uVHlwZTsKLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgRGRsR2VuZXJhdGlvblR5cGUgZ2V0RGVmYXVsdERkbEdlbmVyYXRpb25UeXBlKCkgewotCQlyZXR1cm4gREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9ERExfR0VORVJBVElPTl9UWVBFOwotCX0KLQotCS8vICoqKioqKioqKiogT3V0cHV0TW9kZSAqKioqKioqKioqCi0JcHVibGljIE91dHB1dE1vZGUgZ2V0T3V0cHV0TW9kZSgpIHsKLQkJcmV0dXJuIHRoaXMub3V0cHV0TW9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPdXRwdXRNb2RlKE91dHB1dE1vZGUgbmV3T3V0cHV0TW9kZSkgewotCQlPdXRwdXRNb2RlIG9sZCA9IHRoaXMub3V0cHV0TW9kZTsKLQkJdGhpcy5vdXRwdXRNb2RlID0gbmV3T3V0cHV0TW9kZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShPVVRQVVRfTU9ERV9QUk9QRVJUWSwgbmV3T3V0cHV0TW9kZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPVVRQVVRfTU9ERV9QUk9QRVJUWSwgb2xkLCBuZXdPdXRwdXRNb2RlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3V0cHV0TW9kZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlPdXRwdXRNb2RlIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIE91dHB1dE1vZGUudmFsdWVzKCkpOwotCQlPdXRwdXRNb2RlIG9sZCA9IHRoaXMub3V0cHV0TW9kZTsKLQkJdGhpcy5vdXRwdXRNb2RlID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBPdXRwdXRNb2RlIGdldERlZmF1bHRPdXRwdXRNb2RlKCkgewotCQlyZXR1cm4gREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9PVVRQVVRfTU9ERTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENyZWF0ZUZpbGVOYW1lICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUZpbGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVGaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGVGaWxlTmFtZShTdHJpbmcgbmV3Q3JlYXRlRmlsZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY3JlYXRlRmlsZU5hbWU7Ci0JCXRoaXMuY3JlYXRlRmlsZU5hbWUgPSBuZXdDcmVhdGVGaWxlTmFtZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZLCBuZXdDcmVhdGVGaWxlTmFtZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld0NyZWF0ZUZpbGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRmlsZU5hbWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY3JlYXRlRmlsZU5hbWU7Ci0JCXRoaXMuY3JlYXRlRmlsZU5hbWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q3JlYXRlRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0NSRUFURV9GSUxFX05BTUU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkcm9wRmlsZU5hbWUgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0RHJvcEZpbGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kcm9wRmlsZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RHJvcEZpbGVOYW1lKFN0cmluZyBuZXdEcm9wRmlsZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZHJvcEZpbGVOYW1lOwotCQl0aGlzLmRyb3BGaWxlTmFtZSA9IG5ld0Ryb3BGaWxlTmFtZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShEUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSwgbmV3RHJvcEZpbGVOYW1lKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERST1BfRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld0Ryb3BGaWxlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BGaWxlTmFtZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbmV3VmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlTdHJpbmcgb2xkID0gdGhpcy5kcm9wRmlsZU5hbWU7Ci0JCXRoaXMuZHJvcEZpbGVOYW1lID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERyb3BGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRFJPUF9GSUxFX05BTUU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhcHBsaWNhdGlvbkxvY2F0aW9uICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uTG9jYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb25Mb2NhdGlvbihTdHJpbmcgbmV3QXBwbGljYXRpb25Mb2NhdGlvbikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uOwotCQl0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb24gPSBuZXdBcHBsaWNhdGlvbkxvY2F0aW9uOwotCQl0aGlzLnB1dFByb3BlcnR5KEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZLCBuZXdBcHBsaWNhdGlvbkxvY2F0aW9uKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZLCBvbGQsIG5ld0FwcGxpY2F0aW9uTG9jYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBsaWNhdGlvbkxvY2F0aW9uQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb247Ci0JCXRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRBcHBsaWNhdGlvbkxvY2F0aW9uKCkgewotCQlyZXR1cm4gREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9BUFBMSUNBVElPTl9MT0NBVElPTjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9zY2hlbWEvZ2VuZXJhdGlvbi9PdXRwdXRNb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9zY2hlbWEvZ2VuZXJhdGlvbi9PdXRwdXRNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMjhhYTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvc2NoZW1hL2dlbmVyYXRpb24vT3V0cHV0TW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb247Ci0KLS8qKgotICogIE91dHB1dE1vZGUKLSAqLwotcHVibGljIGVudW0gT3V0cHV0TW9kZSB7Ci0JYm90aCwgCi0Jc3FsX3NjcmlwdCwgCi0JZGF0YWJhc2U7Ci0KLQkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT1RIID0gImJvdGgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFID0gImRhdGFiYXNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUUxfU0NSSVBUID0gInNxbC1zY3JpcHQiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMxYTkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqICBTY2hlbWFHZW5lcmF0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hR2VuZXJhdGlvbiBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLXsKLQlEZGxHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0RGRsR2VuZXJhdGlvblR5cGUoKTsKLQlEZGxHZW5lcmF0aW9uVHlwZSBnZXREZGxHZW5lcmF0aW9uVHlwZSgpOwotCXZvaWQgc2V0RGRsR2VuZXJhdGlvblR5cGUoRGRsR2VuZXJhdGlvblR5cGUgZGRsR2VuZXJhdGlvblR5cGUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFkgPSAiZGRsR2VuZXJhdGlvblR5cGVQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFID0gImVjbGlwc2VsaW5rLmRkbC1nZW5lcmF0aW9uIjsKLQkJc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRERMX0dFTkVSQVRJT05fVFlQRSA9IERkbEdlbmVyYXRpb25UeXBlLm5vbmU7Ci0KLQlPdXRwdXRNb2RlIGdldERlZmF1bHRPdXRwdXRNb2RlKCk7Ci0JT3V0cHV0TW9kZSBnZXRPdXRwdXRNb2RlKCk7Ci0Jdm9pZCBzZXRPdXRwdXRNb2RlKE91dHB1dE1vZGUgb3V0cHV0TW9kZSk7IC8vIHB1dAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9NT0RFX1BST1BFUlRZID0gIm91dHB1dE1vZGVQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSA9ICJlY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbi5vdXRwdXQtbW9kZSI7Ci0JCXN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fT1VUUFVUX01PREUgPSBudWxsOwkJLy8gTm8gRGVmYXVsdAotCi0JU3RyaW5nIGdldERlZmF1bHRDcmVhdGVGaWxlTmFtZSgpOwotCVN0cmluZyBnZXRDcmVhdGVGaWxlTmFtZSgpOwotCXZvaWQgc2V0Q3JlYXRlRmlsZU5hbWUoU3RyaW5nIGNyZWF0ZUZpbGVOYW1lKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZID0gImNyZWF0ZUZpbGVOYW1lUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSA9ICJlY2xpcHNlbGluay5jcmVhdGUtZGRsLWpkYmMtZmlsZS1uYW1lIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0NSRUFURV9GSUxFX05BTUUgPSAiY3JlYXRlRERMLmpkYmMiOwotCQotCVN0cmluZyBnZXREZWZhdWx0RHJvcEZpbGVOYW1lKCk7Ci0JU3RyaW5nIGdldERyb3BGaWxlTmFtZSgpOwotCXZvaWQgc2V0RHJvcEZpbGVOYW1lKFN0cmluZyBkcm9wRmlsZU5hbWUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfRklMRV9OQU1FX1BST1BFUlRZID0gImRyb3BGaWxlTmFtZVByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FID0gImVjbGlwc2VsaW5rLmRyb3AtZGRsLWpkYmMtZmlsZS1uYW1lIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RST1BfRklMRV9OQU1FID0gImRyb3BEREwuamRiYyI7Ci0JCQotCVN0cmluZyBnZXREZWZhdWx0QXBwbGljYXRpb25Mb2NhdGlvbigpOwotCVN0cmluZyBnZXRBcHBsaWNhdGlvbkxvY2F0aW9uKCk7Ci0Jdm9pZCBzZXRBcHBsaWNhdGlvbkxvY2F0aW9uKFN0cmluZyBhcHBsaWNhdGlvbkxvY2F0aW9uKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSA9ICJhcHBsaWNhdGlvbkxvY2F0aW9uUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT04gPSAiZWNsaXBzZWxpbmsuYXBwbGljYXRpb24tbG9jYXRpb24iOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQVBQTElDQVRJT05fTE9DQVRJT04gPSAiLiI7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0VjbGlwc2VMaW5rRERMR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0VjbGlwc2VMaW5rRERMR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmY2I0MWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2RkbGdlbi9FY2xpcHNlTGlua0RETEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5kZGxnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoZXNMaXN0ZW5lcjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5Mb2dnaW5nTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5EZGxHZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLk91dHB1dE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdG9ySm9iOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0RMTEdlbmVyYXRvciBsYXVuY2hlcyB0aGUgRWNsaXBzZUxpbmsgRERMIGdlbmVyYXRvciBpbiBhIHNlcGFyYXRlIFZNLgotICogIEZvciB0aGlzIGl0IHdpbGwgY3JlYXRlIGEgSmF2YSBDb25maWd1cmF0aW9uIG5hbWVkICJFY2xpcHNlTGluayIgCi0gKiAgaW4gdGhlIHRhcmdldCB3b3Jrc3BhY2UgKG5vdGU6IHRoZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBhdCBlYWNoIHJ1bikuCi0gKiAgSXQgd2lsbCB0aGFuIGxhdW5jaCB0aGUgY29uZmlndXJhdGlvbiBjcmVhdGVkIHdpdGggdGhlIGxvZ2luIGluZm9ybWF0aW9uIGZyb20gCi0gKiAgdGhlIGN1cnJlbnQgRGFsaSBwcm9qZWN0LCBhbmQgcGFzc2VzIGl0IHRvIEVjbGlwc2VMaW5rLgotICogIAotICogIFByZS1yZXE6Ci0gKiAgCW9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi5qYXIgaW4gRUNMSVBTRV9IT01FL3BsdWdpbnMKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yCi17Ci0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTl9KQVJfVkVSU0lPTiA9ICIxLjAuMCI7CS8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBMQVVOQ0hfQ09ORklHX05BTUUgPSAiRWNsaXBzZUxpbmsiOyAgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBERExfR0VOX1BBQ0tBR0VfTkFNRSA9ICJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4iOyAgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBFQ0xJUFNFTElOS19ERExfR0VOX0NMQVNTID0gRERMX0dFTl9QQUNLQUdFX05BTUUgKyAiLk1haW4iOwkgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBFQ0xJUFNFTElOS19ERExfR0VOX0pBUiA9IERETF9HRU5fUEFDS0FHRV9OQU1FICsgIl8iICsgRUNMSVBTRUxJTktfRERMX0dFTl9KQVJfVkVSU0lPTiArICIuamFyIjsJLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIFBST1BFUlRJRVNfRklMRV9OQU1FID0gImxvZ2luLnByb3BlcnRpZXMiOwkgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBFQ0xJUFNFX0hPTUUgPSAiRUNMSVBTRV9IT01FIjsJICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgUExVR0lOU19ESVIgPSAicGx1Z2lucyI7CSAgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSVZNSW5zdGFsbCBqcmU7Ci0JcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGxhdW5jaENvbmZpZzsKLQlwcml2YXRlIElMYXVuY2ggbGF1bmNoOwotCQotCXByaXZhdGUgU3RyaW5nIHB1TmFtZTsKLQlwcml2YXRlIEpwYVByb2plY3QgcHJvamVjdDsKLQlwcml2YXRlIFN0cmluZyBwcm9qZWN0TG9jYXRpb247Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWcgPSBmYWxzZTsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByb2plY3RMb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChwdU5hbWUgPT0gbnVsbCB8fCBwdU5hbWUubGVuZ3RoKCkgPT0gMCB8fCBwcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCW5ldyBFY2xpcHNlTGlua0RETEdlbmVyYXRvcihwdU5hbWUsIHByb2plY3QsIHByb2plY3RMb2NhdGlvbiwgbW9uaXRvcikuZ2VuZXJhdGUoKTsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByb2plY3RMb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHVOYW1lID0gcHVOYW1lOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl0aGlzLnByb2plY3RMb2NhdGlvbiA9IHByb2plY3RMb2NhdGlvbjsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogUXVlcmllcyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gdGhpcy5wcm9qZWN0LmdldEpwYVBsYXRmb3JtKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJTGF1bmNoIGdldExhdW5jaCgpIHsKLQkJcmV0dXJuIHRoaXMubGF1bmNoOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUxhdW5jaE1hbmFnZXIgZ2V0TGF1bmNoTWFuYWdlcigpIHsKLQkJcmV0dXJuIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JfQotCQotCXByaXZhdGUgSVZNSW5zdGFsbCBnZXRQcm9qZWN0SlJFKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIEphdmFSdW50aW1lLmdldFZNSW5zdGFsbCh0aGlzLnByb2plY3QuZ2V0SmF2YVByb2plY3QoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuanJlID0gdGhpcy5nZXRQcm9qZWN0SlJFKCk7Ci0JCQlpZih0aGlzLmpyZSA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSAiQ291bGQgbm90IGlkZW50aWZ5IHRoZSBWTS4iOwotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQkJfQotCQkJdGhpcy5sYXVuY2hDb25maWcgPSB0aGlzLmJ1aWxkTGF1bmNoQ29uZmlndXJhdGlvbigpOwotCQl9IAotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlKCkgewotCQl0aGlzLnByZUdlbmVyYXRlKCk7Ci0JCVN0cmluZyBwcm9wZXJ0aWVzRmlsZSAgPSB0aGlzLnByb2plY3RMb2NhdGlvbiArICIvIiArIFBST1BFUlRJRVNfRklMRV9OQU1FOwotCQl0cnkgewotCQkJdGhpcy5pbml0aWFsaXplTGF1bmNoQ29uZmlndXJhdGlvbih0aGlzLnByb2plY3RMb2NhdGlvbiwgcHJvcGVydGllc0ZpbGUpOwotCQotCQkJdGhpcy5zYXZlTG9naW5Qcm9wZXJ0aWVzKHRoaXMucHJvamVjdExvY2F0aW9uLCBwcm9wZXJ0aWVzRmlsZSk7Ci0JCi0JCQl0aGlzLmxhdW5jaCA9IHRoaXMuc2F2ZUFuZExhdW5jaENvbmZpZygpOwotCQkJdGhpcy5hZGRMYXVuY2hMaXN0ZW5lcigpOwotCQl9IAotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUxhdW5jaENvbmZpZ3VyYXRpb24oU3RyaW5nIHByb2plY3RMb2NhdGlvbiwgU3RyaW5nIHByb3BlcnRpZXNGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJdGhpcy5zcGVjaWZ5SlJFKHRoaXMuanJlLmdldE5hbWUoKSwgdGhpcy5qcmUuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCkpOwotCQkKLQkJdGhpcy5zcGVjaWZ5UHJvamVjdCh0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7IAotCQl0aGlzLnNwZWNpZnlNYWluVHlwZShFQ0xJUFNFTElOS19ERExfR0VOX0NMQVNTKTsJCi0JCQotCQl0aGlzLnNwZWNpZnlQcm9ncmFtQXJndW1lbnRzKHRoaXMucHVOYW1lLCBwcm9wZXJ0aWVzRmlsZSk7IAotCQl0aGlzLnNwZWNpZnlXb3JraW5nRGlyKHByb2plY3RMb2NhdGlvbik7IAotCi0JCXRoaXMuc3BlY2lmeUNsYXNzcGF0aFByb3BlcnRpZXModGhpcy5wcm9qZWN0LCB0aGlzLmJ1aWxkSmRiY0phclBhdGgoKSwgdGhpcy5idWlsZEJvb3RzdHJhcEphclBhdGgoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRMYXVuY2hMaXN0ZW5lcigpIHsKLQotCQl0aGlzLmdldExhdW5jaE1hbmFnZXIoKS5hZGRMYXVuY2hMaXN0ZW5lcih0aGlzLmJ1aWxkTGF1bmNoTGlzdGVuZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByZUdlbmVyYXRlKCkgewotCQl0aGlzLnByb2plY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5kaXNjb25uZWN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvc3RHZW5lcmF0ZSgpIHsKLQkJdHJ5IHsKLQkJCWlmKCEgdGhpcy5pc0RlYnVnKSB7Ci0JCQkJdGhpcy5yZW1vdmVMYXVuY2hDb25maWd1cmF0aW9uKExBVU5DSF9DT05GSUdfTkFNRSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKCBDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXRoaXMucHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmNvbm5lY3QoKTsKLQkJCi0JCXRoaXMudmFsaWRhdGVQcm9qZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcm9qZWN0KCkgewotCQkgSnBhVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBKcGFWYWxpZGF0b3IoKTsKLQkJIElQcm9qZWN0IHByb2plY3QgPSB0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpOwotCQkgSnBhSGVscGVyIGhlbHBlciA9IG5ldyBKcGFIZWxwZXIoKTsKLQkJIGhlbHBlci5zZXRQcm9qZWN0KHByb2plY3QpOwotCi0JCSBWYWxpZGF0b3JKb2IgdmFsaWRhdG9ySm9iID0gbmV3IFZhbGlkYXRvckpvYih2YWxpZGF0b3IsICJKUEEgVmFsaWRhdG9yIiwgIiIsIHByb2plY3QsIGhlbHBlcik7Ci0JCSB2YWxpZGF0b3JKb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJIHZhbGlkYXRvckpvYi5zZXRVc2VyKHRydWUpOwotCQkgdmFsaWRhdG9ySm9iLnNjaGVkdWxlKCk7Ci0JfQotCQotCXByaXZhdGUgSVBhdGggYnVpbGRKZGJjSmFyUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKHRoaXMuZ2V0UHJvamVjdENvbm5lY3Rpb25Ecml2ZXJKYXJMaXN0KCkpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRQcm9qZWN0Q29ubmVjdGlvbkRyaXZlckphckxpc3QoKSB7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5wcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCXJldHVybiAoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldERyaXZlckphckxpc3QoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIElQYXRoIGJ1aWxkQm9vdHN0cmFwSmFyUGF0aCgpIHsKLQkJSVBhdGggcGF0aCA9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKEVDTElQU0VfSE9NRSk7Ci0JCXJldHVybiBwYXRoLmFwcGVuZChQTFVHSU5TX0RJUikuYXBwZW5kKEVDTElQU0VMSU5LX0RETF9HRU5fSkFSKTsKLQl9Ci0KLQlwcml2YXRlIElMYXVuY2hlc0xpc3RlbmVyMiBidWlsZExhdW5jaExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElMYXVuY2hlc0xpc3RlbmVyMigpIHsKLQkJCQotCQkJcHVibGljIHZvaWQgbGF1bmNoZXNUZXJtaW5hdGVkKElMYXVuY2hbXSBsYXVuY2hlcykgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGF1bmNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUxhdW5jaCBsYXVuY2ggPSBsYXVuY2hlc1tpXTsKLQkJCQkJaWYgKGxhdW5jaC5lcXVhbHMoRWNsaXBzZUxpbmtERExHZW5lcmF0b3IudGhpcy5nZXRMYXVuY2goKSkpIHsKLQotCQkJCQkJRWNsaXBzZUxpbmtERExHZW5lcmF0b3IudGhpcy5wb3N0R2VuZXJhdGUoKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGF1bmNoZXNBZGRlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxhdW5jaGVzQ2hhbmdlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxhdW5jaGVzUmVtb3ZlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqKioqKiBsYXVuY2ggY29uZmlndXJhdGlvbiAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSB2b2lkIHNwZWNpZnlKUkUoU3RyaW5nIGpyZU5hbWUsIFN0cmluZyB2bUlkKSB7Ci0KLQkJdGhpcy5sYXVuY2hDb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0pSRV9DT05UQUlORVJfUEFUSCwganJlTmFtZSk7Ci0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9KUkVfQ09OVEFJTkVSX1BBVEgsIHZtSWQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3BlY2lmeVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0KLQkJdGhpcy5sYXVuY2hDb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3BlY2lmeU1haW5UeXBlKFN0cmluZyBtYWluVHlwZSkgewotCi0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9NQUlOX1RZUEVfTkFNRSwgbWFpblR5cGUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3BlY2lmeVByb2dyYW1Bcmd1bWVudHMoU3RyaW5nIHB1TmFtZSwgU3RyaW5nIHByb3BlcnRpZXNQYXRoKSB7Ci0KLQkJU3RyaW5nQnVmZmVyIHByb2dyYW1Bcmd1bWVudHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKHRoaXMuYnVpbGRQdU5hbWVBcmd1bWVudChwdU5hbWUpKTsKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQodGhpcy5idWlsZFByb3BlcnRpZXNQYXRoQXJndW1lbnQocHJvcGVydGllc1BhdGgpKTsKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQodGhpcy5idWlsZERlYnVnQXJndW1lbnQoKSk7Ci0JCQotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsIHByb2dyYW1Bcmd1bWVudHMudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNwZWNpZnlDbGFzc3BhdGhQcm9wZXJ0aWVzKEpwYVByb2plY3QgcHJvamVjdCwgSVBhdGggamRiY0phciwgSVBhdGggYm9vdHN0cmFwSmFyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIERETF9HRU4gamFyCi0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgYm9vdHN0cmFwRW50cnkgPSBKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KGJvb3RzdHJhcEphcik7Ci0JCWJvb3RzdHJhcEVudHJ5LnNldENsYXNzcGF0aFByb3BlcnR5KElSdW50aW1lQ2xhc3NwYXRoRW50cnkuVVNFUl9DTEFTU0VTKTsKLQkJLy8gRGVmYXVsdCBQcm9qZWN0IGNsYXNzcGF0aAotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGRlZmF1bHRFbnRyeSA9IEphdmFSdW50aW1lLm5ld0RlZmF1bHRQcm9qZWN0Q2xhc3NwYXRoRW50cnkocHJvamVjdC5nZXRKYXZhUHJvamVjdCgpKTsKLQkJZGVmYXVsdEVudHJ5LnNldENsYXNzcGF0aFByb3BlcnR5KElSdW50aW1lQ2xhc3NwYXRoRW50cnkuVVNFUl9DTEFTU0VTKTsKLQkJLy8gSkRCQyBqYXIKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBqZGJjRW50cnkgPSBKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KGpkYmNKYXIpOwotCQlqZGJjRW50cnkuc2V0Q2xhc3NwYXRoUHJvcGVydHkoSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5VU0VSX0NMQVNTRVMpOwotCQkvLyBTeXN0ZW0gTGlicmFyeSAgCi0JCUlQYXRoIHN5c3RlbUxpYnNQYXRoID0gbmV3IFBhdGgoSmF2YVJ1bnRpbWUuSlJFX0NPTlRBSU5FUik7Ci0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgc3lzdGVtTGlic0VudHJ5ID0gSmF2YVJ1bnRpbWUubmV3UnVudGltZUNvbnRhaW5lckNsYXNzcGF0aEVudHJ5KHN5c3RlbUxpYnNQYXRoLCBJUnVudGltZUNsYXNzcGF0aEVudHJ5LlNUQU5EQVJEX0NMQVNTRVMpOwotCi0JCUxpc3Q8U3RyaW5nPiBjbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJY2xhc3NwYXRoLmFkZChib290c3RyYXBFbnRyeS5nZXRNZW1lbnRvKCkpOwotCQljbGFzc3BhdGguYWRkKGRlZmF1bHRFbnRyeS5nZXRNZW1lbnRvKCkpOwotCQljbGFzc3BhdGguYWRkKGpkYmNFbnRyeS5nZXRNZW1lbnRvKCkpOwotCQljbGFzc3BhdGguYWRkKHN5c3RlbUxpYnNFbnRyeS5nZXRNZW1lbnRvKCkpOwotCQkKLQkJdGhpcy5sYXVuY2hDb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0NMQVNTUEFUSCwgY2xhc3NwYXRoKTsKLQkJdGhpcy5sYXVuY2hDb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0RFRkFVTFRfQ0xBU1NQQVRILCBmYWxzZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzcGVjaWZ5V29ya2luZ0RpcihTdHJpbmcgcHJvamVjdExvY2F0aW9uKSB7Ci0JCQotCQlGaWxlIHdvcmtpbmdEaXIgPSBuZXcgUGF0aChwcm9qZWN0TG9jYXRpb24pLnRvRmlsZSgpOwotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksIHdvcmtpbmdEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCX0KLQkKLQlwcml2YXRlIElMYXVuY2ggc2F2ZUFuZExhdW5jaENvbmZpZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHRoaXMubGF1bmNoQ29uZmlnLmRvU2F2ZSgpOwotCQkKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb24ubGF1bmNoKElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgYnVpbGRMYXVuY2hDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGxhdW5jaENvbmZpZyA9IG51bGw7Ci0JCXRoaXMucmVtb3ZlTGF1bmNoQ29uZmlndXJhdGlvbiggTEFVTkNIX0NPTkZJR19OQU1FKTsKLQotCQlJTGF1bmNoTWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIHR5cGUgPSBtYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JRF9KQVZBX0FQUExJQ0FUSU9OKTsKLQotCQlsYXVuY2hDb25maWcgPSB0eXBlLm5ld0luc3RhbmNlKG51bGwsIExBVU5DSF9DT05GSUdfTkFNRSk7Ci0JCXJldHVybiBsYXVuY2hDb25maWc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUxhdW5jaENvbmZpZ3VyYXRpb24oU3RyaW5nIGxhdW5jaENvbmZpZ3VyYXRpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSUxhdW5jaE1hbmFnZXIgbWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSB0eXBlID0gbWFuYWdlci5nZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuSURfSkFWQV9BUFBMSUNBVElPTik7Ci0JCi0JCUlMYXVuY2hDb25maWd1cmF0aW9uW10gY29uZmlndXJhdGlvbnMgPSBtYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKHR5cGUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uc1tpXTsKLQkJCWlmIChjb25maWd1cmF0aW9uLmdldE5hbWUoKS5lcXVhbHMobGF1bmNoQ29uZmlndXJhdGlvbk5hbWUpKSB7Ci0JCQkJY29uZmlndXJhdGlvbi5kZWxldGUoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJvamVjdExvY2F0aW9uUHJvcGVydHkoUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgbG9jYXRpb24pIHsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLCAKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT04sCi0JCQlsb2NhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZERETE1vZGVQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsICAKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCURkbEdlbmVyYXRpb25UeXBlLkRST1BfQU5EX0NSRUFURV9UQUJMRVMpOwotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsICAKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUsCi0JCQlPdXRwdXRNb2RlLkRBVEFCQVNFKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTG9naW5Qcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMucHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCi0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywgIAotCQkJQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlMsCi0JCQkiZmFsc2UiKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLCAKLQkJCUNvbm5lY3Rpb24uRUNMSVBTRUxJTktfRFJJVkVSLAotCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXREcml2ZXJDbGFzc05hbWUoKSk7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUNvbm5lY3Rpb24uRUNMSVBTRUxJTktfVVJMLAotCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVUkwoKSk7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUNvbm5lY3Rpb24uRUNMSVBTRUxJTktfVVNFUiwKLQkJCShjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VXNlck5hbWUoKSk7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUNvbm5lY3Rpb24uRUNMSVBTRUxJTktfUEFTU1dPUkQsCi0JCQkoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJQYXNzd29yZCgpKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJTG9nZ2luZy5FQ0xJUFNFTElOS19MRVZFTCwKLQkJCUxvZ2dpbmdMZXZlbC5GSU5FU1QpOwotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUCwKLQkJCSJmYWxzZSIpOwotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX1RIUkVBRCwKLQkJCSJmYWxzZSIpOwotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX1NFU1NJT04sCi0JCQkiZmFsc2UiKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJTG9nZ2luZy5FQ0xJUFNFTElOS19FWENFUFRJT05TLAotCQkJInRydWUiKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TLAotCQkJInRydWUiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHB1dFByb3BlcnR5KFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXByb3BlcnRpZXMucHV0KGtleSwgKHZhbHVlID09IG51bGwpID8gIiIgOiB2YWx1ZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzYXZlTG9naW5Qcm9wZXJ0aWVzKFN0cmluZyBwcm9qZWN0TG9jYXRpb24sIFN0cmluZyBwcm9wZXJ0aWVzRmlsZSkgewotCQlQcm9wZXJ0aWVzIGVsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQotCQl0aGlzLmJ1aWxkTG9naW5Qcm9wZXJ0aWVzKGVsUHJvcGVydGllcyk7Ci0JCQotCQl0aGlzLmJ1aWxkRERMTW9kZVByb3BlcnRpZXMoZWxQcm9wZXJ0aWVzKTsKLQotCQl0aGlzLmJ1aWxkUHJvamVjdExvY2F0aW9uUHJvcGVydHkoZWxQcm9wZXJ0aWVzLCBwcm9qZWN0TG9jYXRpb24pOwotCSAgICB0cnkgewotCSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocHJvcGVydGllc0ZpbGUpOwotCSAgICAgICAgZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCSAgICAgICAgZWxQcm9wZXJ0aWVzLnN0b3JlKHN0cmVhbSwgbnVsbCk7Ci0JCSAgICBzdHJlYW0uY2xvc2UoKTsKLQkgICAgfQotCSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkgICAgCVN0cmluZyBtZXNzYWdlID0gIkVycm9yIHNhdmluZzogIiArIHByb3BlcnRpZXNGaWxlOwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSwgZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIE1haW4gYXJndW1lbnRzICoqKioqKioqKioKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUHVOYW1lQXJndW1lbnQoU3RyaW5nIHB1TmFtZSkgewotCQlyZXR1cm4gIiAtcHUgXCIiICsgcHVOYW1lICsgIlwiIjsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRQcm9wZXJ0aWVzUGF0aEFyZ3VtZW50KFN0cmluZyBwcm9wZXJ0aWVzRmlsZSkgewotCQlyZXR1cm4gIiAtcCBcIiIgKyBwcm9wZXJ0aWVzRmlsZSArICJcIiI7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVidWdBcmd1bWVudCgpIHsKLQkJcmV0dXJuICh0aGlzLmlzRGVidWcpID8gIiAtZGVidWciIDogIiI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2FjaGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DYWNoZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzNWQ0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DYWNoZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5UaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBDYWNoZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxUeXBlPiBpbXBsZW1lbnRzIENhY2hlQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdHlwZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gc2l6ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gc2hhcmVkQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBleHBpcnlBZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFsd2F5c1JlZnJlc2hBZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHJlZnJlc2hPbmx5SWZOZXdlckFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGlzYWJsZUhpdHNBZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY29vcmRpbmF0aW9uVHlwZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlciBleHBpcnlUaW1lT2ZEYXlBZGFwdGVyOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVFlQRV9BREFQVEVSID0gYnVpbGRUeXBlQWRhcHRlcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IFNJWkVfQURBUFRFUiA9IGJ1aWxkU2l6ZUFkYXB0ZXIoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBTSEFSRURfQURBUFRFUiA9IGJ1aWxkU2hhcmVkQWRhcHRlcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IEVYUElSWV9BREFQVEVSID0gYnVpbGRFeHBpcnlBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gQUxXQVlTX1JFRlJFU0hfQURBUFRFUiA9IGJ1aWxkQWx3YXlzUmVmcmVzaEFkYXB0ZXIoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBSRUZSRVNIX09OTFlfSUZfTkVXRVJfQURBUFRFUiA9IGJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyQWRhcHRlcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IERJU0FCTEVfSElUU19BREFQVEVSID0gYnVpbGREaXNhYmxlSGl0c0FkYXB0ZXIoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IENPT1JESU5BVElPTl9UWVBFX0FEQVBURVIgPSBidWlsZENvb3JkaW5hdGlvblR5cGVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBFWFBJUllfVElNRV9PRl9EQVlfQURBUFRFUiA9IGJ1aWxkRXhwaXJ5VGltZU9mRGF5QW5ub3RhdGlvbkFkYXB0ZXIoKTsKLQkKLQkKLQlwcml2YXRlIENhY2hlVHlwZSB0eXBlOwotCXByaXZhdGUgSW50ZWdlciBzaXplOwotCXByaXZhdGUgQm9vbGVhbiBzaGFyZWQ7Ci0JcHJpdmF0ZSBJbnRlZ2VyIGV4cGlyeTsKLQlwcml2YXRlIFRpbWVPZkRheUFubm90YXRpb24gZXhwaXJ5VGltZU9mRGF5OwotCXByaXZhdGUgQm9vbGVhbiBhbHdheXNSZWZyZXNoOwotCXByaXZhdGUgQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIGRpc2FibGVIaXRzOwotCXByaXZhdGUgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGU7Ci0JCi0JcHJvdGVjdGVkIENhY2hlSW1wbChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudHlwZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odHlwZSwgVFlQRV9BREFQVEVSKTsKLQkJdGhpcy5zaXplQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odHlwZSwgU0laRV9BREFQVEVSKTsKLQkJdGhpcy5zaGFyZWRBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0eXBlLCBTSEFSRURfQURBUFRFUik7Ci0JCXRoaXMuZXhwaXJ5QWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odHlwZSwgRVhQSVJZX0FEQVBURVIpOwotCQl0aGlzLmFsd2F5c1JlZnJlc2hBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0eXBlLCBBTFdBWVNfUkVGUkVTSF9BREFQVEVSKTsKLQkJdGhpcy5yZWZyZXNoT25seUlmTmV3ZXJBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0eXBlLCBSRUZSRVNIX09OTFlfSUZfTkVXRVJfQURBUFRFUik7Ci0JCXRoaXMuZGlzYWJsZUhpdHNBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0eXBlLCBESVNBQkxFX0hJVFNfQURBUFRFUik7Ci0JCXRoaXMuY29vcmRpbmF0aW9uVHlwZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odHlwZSwgQ09PUkRJTkFUSU9OX1RZUEVfQURBUFRFUik7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5QWRhcHRlciA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0eXBlLCBFWFBJUllfVElNRV9PRl9EQVlfQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqIENhY2hlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgQ2FjaGVUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFR5cGUoQ2FjaGVUeXBlIG5ld1R5cGUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnR5cGUsIG5ld1R5cGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ2FjaGVUeXBlIG9sZFR5cGUgPSB0aGlzLnR5cGU7Ci0JCXRoaXMudHlwZSA9IG5ld1R5cGU7Ci0JCXRoaXMudHlwZUFkYXB0ZXIuc2V0VmFsdWUoQ2FjaGVUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShuZXdUeXBlKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkVHlwZSwgbmV3VHlwZSk7Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShJbnRlZ2VyIG5ld1NpemUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnNpemUsIG5ld1NpemUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW50ZWdlciBvbGRTaXplID0gdGhpcy5zaXplOwotCQl0aGlzLnNpemUgPSBuZXdTaXplOwotCQl0aGlzLnNpemVBZGFwdGVyLnNldFZhbHVlKG5ld1NpemUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNJWkVfUFJPUEVSVFksIG9sZFNpemUsIG5ld1NpemUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc2hhcmVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWQoQm9vbGVhbiBuZXdTaGFyZWQpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnNoYXJlZCwgbmV3U2hhcmVkKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUJvb2xlYW4gb2xkU2hhcmVkID0gdGhpcy5zaGFyZWQ7Ci0JCXRoaXMuc2hhcmVkID0gbmV3U2hhcmVkOwotCQl0aGlzLnNoYXJlZEFkYXB0ZXIuc2V0VmFsdWUobmV3U2hhcmVkKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTSEFSRURfUFJPUEVSVFksIG9sZFNoYXJlZCwgbmV3U2hhcmVkKTsKLQl9Ci0JCi0JcHVibGljIEludGVnZXIgZ2V0RXhwaXJ5KCkgewotCQlyZXR1cm4gdGhpcy5leHBpcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhwaXJ5KEludGVnZXIgbmV3RXhwaXJ5KSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5leHBpcnksIG5ld0V4cGlyeSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJbnRlZ2VyIG9sZEV4cGlyeSA9IHRoaXMuZXhwaXJ5OwotCQl0aGlzLmV4cGlyeSA9IG5ld0V4cGlyeTsKLQkJdGhpcy5leHBpcnlBZGFwdGVyLnNldFZhbHVlKG5ld0V4cGlyeSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1BST1BFUlRZLCBvbGRFeHBpcnksIG5ld0V4cGlyeSk7Ci0JfQotCQotCXB1YmxpYyBUaW1lT2ZEYXlBbm5vdGF0aW9uIGdldEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5VGltZU9mRGF5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBpcnlUaW1lT2ZEYXkoVGltZU9mRGF5QW5ub3RhdGlvbiBuZXdFeHBpcnlUaW1lT2ZEYXkpIHsKLQkJVGltZU9mRGF5QW5ub3RhdGlvbiBvbGRFeHBpcnlUaW1lT2ZEYXkgPSB0aGlzLmV4cGlyeVRpbWVPZkRheTsKLQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkgPSBuZXdFeHBpcnlUaW1lT2ZEYXk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBvbGRFeHBpcnlUaW1lT2ZEYXksIG5ld0V4cGlyeVRpbWVPZkRheSk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldEFsd2F5c1JlZnJlc2goKSB7Ci0JCXJldHVybiB0aGlzLmFsd2F5c1JlZnJlc2g7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFsd2F5c1JlZnJlc2goQm9vbGVhbiBuZXdBbHdheXNSZWZyZXNoKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5hbHdheXNSZWZyZXNoLCBuZXdBbHdheXNSZWZyZXNoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUJvb2xlYW4gb2xkQWx3YXlzUmVmcmVzaCA9IHRoaXMuYWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5hbHdheXNSZWZyZXNoID0gbmV3QWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5hbHdheXNSZWZyZXNoQWRhcHRlci5zZXRWYWx1ZShuZXdBbHdheXNSZWZyZXNoKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChBTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSwgb2xkQWx3YXlzUmVmcmVzaCwgbmV3QWx3YXlzUmVmcmVzaCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiBuZXdSZWZyZXNoT25seUlmTmV3ZXIpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnJlZnJlc2hPbmx5SWZOZXdlciwgbmV3UmVmcmVzaE9ubHlJZk5ld2VyKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUJvb2xlYW4gb2xkUmVmcmVzaE9ubHlJZk5ld2VyID0gdGhpcy5yZWZyZXNoT25seUlmTmV3ZXI7Ci0JCXRoaXMucmVmcmVzaE9ubHlJZk5ld2VyID0gbmV3UmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlckFkYXB0ZXIuc2V0VmFsdWUobmV3UmVmcmVzaE9ubHlJZk5ld2VyKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChSRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFksIG9sZFJlZnJlc2hPbmx5SWZOZXdlciwgbmV3UmVmcmVzaE9ubHlJZk5ld2VyKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0RGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiB0aGlzLmRpc2FibGVIaXRzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlSGl0cyhCb29sZWFuIG5ld0Rpc2FibGVIaXRzKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5kaXNhYmxlSGl0cywgbmV3RGlzYWJsZUhpdHMpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQm9vbGVhbiBvbGREaXNhYmxlSGl0cyA9IHRoaXMuZGlzYWJsZUhpdHM7Ci0JCXRoaXMuZGlzYWJsZUhpdHMgPSBuZXdEaXNhYmxlSGl0czsKLQkJdGhpcy5kaXNhYmxlSGl0c0FkYXB0ZXIuc2V0VmFsdWUobmV3RGlzYWJsZUhpdHMpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERJU0FCTEVfSElUU19QUk9QRVJUWSwgb2xkRGlzYWJsZUhpdHMsIG5ld0Rpc2FibGVIaXRzKTsKLQl9Ci0JCi0JcHVibGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5jb29yZGluYXRpb25UeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBuZXdDb29yZGluYXRpb25UeXBlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5jb29yZGluYXRpb25UeXBlLCBuZXdDb29yZGluYXRpb25UeXBlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSBvbGRDb29yZGluYXRpb25UeXBlID0gdGhpcy5jb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmNvb3JkaW5hdGlvblR5cGUgPSBuZXdDb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmNvb3JkaW5hdGlvblR5cGVBZGFwdGVyLnNldFZhbHVlKENhY2hlQ29vcmRpbmF0aW9uVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUobmV3Q29vcmRpbmF0aW9uVHlwZSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfUFJPUEVSVFksIG9sZENvb3JkaW5hdGlvblR5cGUsIG5ld0Nvb3JkaW5hdGlvblR5cGUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShUWVBFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNpemVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShTSVpFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNoYXJlZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFNIQVJFRF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRFeHBpcnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShFWFBJUllfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGltZU9mRGF5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOy8vVE9ETyByZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEVYUElSWV9USU1FX09GX0RBWV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRBbHdheXNSZWZyZXNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoQUxXQVlTX1JFRlJFU0hfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmcmVzaE9ubHlJZk5ld2VyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoUkVGUkVTSF9PTkxZX0lGX05FV0VSX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldERpc2FibGVzSGl0c1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKERJU0FCTEVfSElUU19BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb29yZGluYXRpb25UeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoQ09PUkRJTkFUSU9OX1RZUEVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy50eXBlID0gdGhpcy50eXBlKGFzdFJvb3QpOwotCQl0aGlzLnNpemUgPSB0aGlzLnNpemUoYXN0Um9vdCk7Ci0JCXRoaXMuc2hhcmVkID0gdGhpcy5zaGFyZWQoYXN0Um9vdCk7Ci0JCXRoaXMuZXhwaXJ5ID0gdGhpcy5leHBpcnkoYXN0Um9vdCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUV4cGlyeVRpbWVPZkRheShhc3RSb290KTsKLQkJdGhpcy5hbHdheXNSZWZyZXNoID0gdGhpcy5hbHdheXNSZWZyZXNoKGFzdFJvb3QpOwotCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlciA9IHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyKGFzdFJvb3QpOwotCQl0aGlzLmRpc2FibGVIaXRzID0gdGhpcy5kaXNhYmxlSGl0cyhhc3RSb290KTsKLQkJdGhpcy5jb29yZGluYXRpb25UeXBlID0gdGhpcy5jb29yZGluYXRpb25UeXBlKGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFeHBpcnlUaW1lT2ZEYXkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5QWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpICE9IG51bGwpIHsKLQkJCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gY3JlYXRlVGltZU9mRGF5QW5ub3RhdGlvbigpOwotCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldFR5cGUodGhpcy50eXBlKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRTaXplKHRoaXMuc2l6ZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0U2hhcmVkKHRoaXMuc2hhcmVkKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRFeHBpcnkodGhpcy5leHBpcnkoYXN0Um9vdCkpOwotCQl0aGlzLnVwZGF0ZUV4cGlyeVRpbWVPZkRheShhc3RSb290KTsKLQkJdGhpcy5zZXRBbHdheXNSZWZyZXNoKHRoaXMuYWx3YXlzUmVmcmVzaChhc3RSb290KSk7Ci0JCXRoaXMuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXREaXNhYmxlSGl0cyh0aGlzLmRpc2FibGVIaXRzKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRDb29yZGluYXRpb25UeXBlKHRoaXMuY29vcmRpbmF0aW9uVHlwZShhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUV4cGlyeVRpbWVPZkRheShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXlBZGFwdGVyLmdldEFubm90YXRpb24oYXN0Um9vdCkgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRFeHBpcnlUaW1lT2ZEYXkobnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0RXhwaXJ5VGltZU9mRGF5KCkgIT0gbnVsbCkgewotCQkJCWdldEV4cGlyeVRpbWVPZkRheSgpLnVwZGF0ZShhc3RSb290KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVRpbWVPZkRheUFubm90YXRpb24gZXhwaXJ5VGltZU9mRGF5ID0gY3JlYXRlVGltZU9mRGF5QW5ub3RhdGlvbigpOwotCQkJCWV4cGlyeVRpbWVPZkRheS5pbml0aWFsaXplKGFzdFJvb3QpOwotCQkJCXNldEV4cGlyeVRpbWVPZkRheShleHBpcnlUaW1lT2ZEYXkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBDYWNoZVR5cGUgdHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gQ2FjaGVUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMudHlwZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBzaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnNpemVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzaGFyZWQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuc2hhcmVkQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEludGVnZXIgZXhwaXJ5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmV4cGlyeUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBUaW1lT2ZEYXlBbm5vdGF0aW9uIGNyZWF0ZVRpbWVPZkRheUFubm90YXRpb24oKSB7Ci0JCXJldHVybiBuZXcgVGltZU9mRGF5SW1wbCh0aGlzLCBnZXRNZW1iZXIoKSwgRVhQSVJZX1RJTUVfT0ZfREFZX0FEQVBURVIpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGFsd2F5c1JlZnJlc2goQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuYWx3YXlzUmVmcmVzaEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZWZyZXNoT25seUlmTmV3ZXJBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBkaXNhYmxlSGl0cyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kaXNhYmxlSGl0c0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gQ2FjaGVDb29yZGluYXRpb25UeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuY29vcmRpbmF0aW9uVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGlua0pQQS5DQUNIRV9fVFlQRSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkU2l6ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmtKUEEuQ0FDSEVfX1NJWkUsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFNoYXJlZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmtKUEEuQ0FDSEVfX1NIQVJFRCwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkRXhwaXJ5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGlua0pQQS5DQUNIRV9fRVhQSVJZLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRBbHdheXNSZWZyZXNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGlua0pQQS5DQUNIRV9fQUxXQVlTX1JFRlJFU0gsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFJlZnJlc2hPbmx5SWZOZXdlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmtKUEEuQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkRGlzYWJsZUhpdHNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rSlBBLkNBQ0hFX19ESVNBQkxFX0hJVFMsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRDb29yZGluYXRpb25UeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGlua0pQQS5DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRFeHBpcnlUaW1lT2ZEYXlBbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmtKUEEuQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSwgRWNsaXBzZUxpbmtKUEEuVElNRV9PRl9EQVkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIENhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIENhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgQ2FjaGVJbXBsKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBOdWxsQ2FjaGVBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FeGlzdGVuY2VDaGVja2luZ0ltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZUNoZWNraW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWY3Y2JhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZUNoZWNraW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5BYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIEV4aXN0ZW5jZUNoZWNraW5nSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPFR5cGU+IGltcGxlbWVudHMgRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQkKLQkKLQlwcml2YXRlIEV4aXN0ZW5jZVR5cGUgdmFsdWU7Ci0JCi0JcHJvdGVjdGVkIEV4aXN0ZW5jZUNoZWNraW5nSW1wbChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHR5cGUsIFZBTFVFX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKiBDYWNoZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCi0JcHVibGljIEV4aXN0ZW5jZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFeGlzdGVuY2VUeXBlIG5ld1ZhbHVlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy52YWx1ZSwgbmV3VmFsdWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRXhpc3RlbmNlVHlwZSBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoRXhpc3RlbmNlVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUobmV3VmFsdWUpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLnZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEV4aXN0ZW5jZVR5cGUgdmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEV4aXN0ZW5jZVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGlua0pQQS5FWElTVEVOQ0VfQ0hFQ0tJTkdfX1ZBTFVFLCBmYWxzZSk7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgRXhpc3RlbmNlQ2hlY2tpbmdJbXBsKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBOdWxsRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQ2FjaGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQ2FjaGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NTBhYzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbENhY2hlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5BYnN0cmFjdEphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5UaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgTnVsbENhY2hlQW5ub3RhdGlvbiBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRzIENhY2hlQW5ub3RhdGlvbiwgQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBOdWxsQ2FjaGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIENhY2hlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL251bGwsIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQkKLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ2FjaGVBbm5vdGF0aW9uIGNyZWF0ZUNhY2hlUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoQ2FjaGVBbm5vdGF0aW9uKSBnZXRQYXJlbnQoKS5hZGRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgQ2FjaGVUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUeXBlKENhY2hlVHlwZSB0eXBlKSB7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNhY2hlUmVzb3VyY2UoKS5zZXRUeXBlKHR5cGUpOwotCQl9Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNpemUoSW50ZWdlciBzaXplKSB7Ci0JCWlmIChzaXplICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNhY2hlUmVzb3VyY2UoKS5zZXRTaXplKHNpemUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNoYXJlZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNoYXJlZChCb29sZWFuIHNoYXJlZCkgewotCQlpZiAoc2hhcmVkICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNhY2hlUmVzb3VyY2UoKS5zZXRTaGFyZWQoc2hhcmVkKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRFeHBpcnkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFeHBpcnkoSW50ZWdlciBleHBpcnkpIHsKLQkJaWYgKGV4cGlyeSAhPSBudWxsKSB7Ci0JCQljcmVhdGVDYWNoZVJlc291cmNlKCkuc2V0RXhwaXJ5KGV4cGlyeSk7Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgVGltZU9mRGF5QW5ub3RhdGlvbiBnZXRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuIGFsd2F5c1JlZnJlc2gpIHsKLQkJaWYgKGFsd2F5c1JlZnJlc2ggIT0gbnVsbCkgewotCQkJY3JlYXRlQ2FjaGVSZXNvdXJjZSgpLnNldEFsd2F5c1JlZnJlc2goYWx3YXlzUmVmcmVzaCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKSB7Ci0JCWlmIChyZWZyZXNoT25seUlmTmV3ZXIgIT0gbnVsbCkgewotCQkJY3JlYXRlQ2FjaGVSZXNvdXJjZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihyZWZyZXNoT25seUlmTmV3ZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldERpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZUhpdHMoQm9vbGVhbiBkaXNhYmxlSGl0cykgewotCQlpZiAoZGlzYWJsZUhpdHMgIT0gbnVsbCkgewotCQkJY3JlYXRlQ2FjaGVSZXNvdXJjZSgpLnNldERpc2FibGVIaXRzKGRpc2FibGVIaXRzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKSB7Ci0JCWlmIChjb29yZGluYXRpb25UeXBlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNhY2hlUmVzb3VyY2UoKS5zZXRDb29yZGluYXRpb25UeXBlKGNvb3JkaW5hdGlvblR5cGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNpemVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2hhcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEV4cGlyeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRFeHBpcnlUaW1lT2ZEYXlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QWx3YXlzUmVmcmVzaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZyZXNoT25seUlmTmV3ZXJUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGlzYWJsZXNIaXRzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlMGI4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZTsKLQotcHVibGljIGNsYXNzIE51bGxFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUgaW1wbGVtZW50cyBFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24sIEFubm90YXRpb24KLXsKLQlwcm90ZWN0ZWQgTnVsbEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9udWxsLCBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0JCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBjcmVhdGVFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKSBnZXRQYXJlbnQoKS5hZGRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgRXhpc3RlbmNlVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEV4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbigpLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGltZU9mRGF5SW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGltZU9mRGF5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmUyZWM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RpbWVPZkRheUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5UaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBUaW1lT2ZEYXlJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248VHlwZT4gaW1wbGVtZW50cyBUaW1lT2ZEYXlBbm5vdGF0aW9uCi17CQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGhvdXJBZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IG1pbnV0ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gc2Vjb25kQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBtaWxsaXNlY29uZEFkYXB0ZXI7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBob3VyRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbWludXRlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbWlsbGlzZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JCi0JCi0JcHJpdmF0ZSBJbnRlZ2VyIGhvdXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIG1pbnV0ZTsKLQlwcml2YXRlIEludGVnZXIgc2Vjb25kOwotCXByaXZhdGUgSW50ZWdlciBtaWxsaXNlY29uZDsKLQkKLQlwcm90ZWN0ZWQgVGltZU9mRGF5SW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIGRhYSk7Ci0JCXRoaXMuaG91ckRlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkSG91ckFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5ob3VyQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odHlwZSwgdGhpcy5ob3VyRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5taW51dGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZE1pbnV0ZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5taW51dGVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPih0eXBlLCB0aGlzLm1pbnV0ZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRTZWNvbmRBZGFwdGVyKGRhYSk7Ci0JCXRoaXMuc2Vjb25kQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odHlwZSwgdGhpcy5zZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm1pbGxpc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRNaWxsaXNlY29uZEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5taWxsaXNlY29uZEFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHR5cGUsIHRoaXMubWlsbGlzZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKiBUaW1lT2ZEYXlBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRIb3VyKCkgewotCQlyZXR1cm4gdGhpcy5ob3VyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRIb3VyKEludGVnZXIgbmV3SG91cikgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuaG91ciwgbmV3SG91cikpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJbnRlZ2VyIG9sZEhvdXIgPSB0aGlzLmhvdXI7Ci0JCXRoaXMuaG91ciA9IG5ld0hvdXI7Ci0JCXRoaXMuaG91ckFkYXB0ZXIuc2V0VmFsdWUobmV3SG91cik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSE9VUl9QUk9QRVJUWSwgb2xkSG91ciwgbmV3SG91cik7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0TWludXRlKCkgewotCQlyZXR1cm4gdGhpcy5taW51dGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1pbnV0ZShJbnRlZ2VyIG5ld01pbnV0ZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubWludXRlLCBuZXdNaW51dGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW50ZWdlciBvbGRNaW51dGUgPSB0aGlzLm1pbnV0ZTsKLQkJdGhpcy5taW51dGUgPSBuZXdNaW51dGU7Ci0JCXRoaXMubWludXRlQWRhcHRlci5zZXRWYWx1ZShuZXdNaW51dGUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1JTlVURV9QUk9QRVJUWSwgb2xkTWludXRlLCBuZXdNaW51dGUpOwotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRTZWNvbmQoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2Vjb25kKEludGVnZXIgbmV3U2Vjb25kKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5zZWNvbmQsIG5ld1NlY29uZCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJbnRlZ2VyIG9sZFNlY29uZCA9IHRoaXMuc2Vjb25kOwotCQl0aGlzLnNlY29uZCA9IG5ld1NlY29uZDsKLQkJdGhpcy5zZWNvbmRBZGFwdGVyLnNldFZhbHVlKG5ld1NlY29uZCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VDT05EX1BST1BFUlRZLCBvbGRTZWNvbmQsIG5ld1NlY29uZCk7Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCkgewotCQlyZXR1cm4gdGhpcy5taWxsaXNlY29uZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBuZXdNaWxsaXNlY29uZCkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubWlsbGlzZWNvbmQsIG5ld01pbGxpc2Vjb25kKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUludGVnZXIgb2xkTWlsbGlzZWNvbmQgPSB0aGlzLm1pbGxpc2Vjb25kOwotCQl0aGlzLm1pbGxpc2Vjb25kID0gbmV3TWlsbGlzZWNvbmQ7Ci0JCXRoaXMubWlsbGlzZWNvbmRBZGFwdGVyLnNldFZhbHVlKG5ld01pbGxpc2Vjb25kKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNSUxMSVNFQ09ORF9QUk9QRVJUWSwgb2xkTWlsbGlzZWNvbmQsIG5ld01pbGxpc2Vjb25kKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRIb3VyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5ob3VyRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1pbnV0ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubWludXRlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWNvbmRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnNlY29uZERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWlsbGlzZWNvbmRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm1pbGxpc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLmhvdXIgPSB0aGlzLmhvdXIoYXN0Um9vdCk7Ci0JCXRoaXMubWludXRlID0gdGhpcy5taW51dGUoYXN0Um9vdCk7Ci0JCXRoaXMuc2Vjb25kID0gdGhpcy5zZWNvbmQoYXN0Um9vdCk7Ci0JCXRoaXMubWlsbGlzZWNvbmQgPSB0aGlzLm1pbGxpc2Vjb25kKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldEhvdXIodGhpcy5ob3VyKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRNaW51dGUodGhpcy5taW51dGUoYXN0Um9vdCkpOwotCQl0aGlzLnNldFNlY29uZCh0aGlzLnNlY29uZChhc3RSb290KSk7Ci0JCXRoaXMuc2V0TWlsbGlzZWNvbmQodGhpcy5taWxsaXNlY29uZChhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIGhvdXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuaG91ckFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIG1pbnV0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5taW51dGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBzZWNvbmQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuc2Vjb25kQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEludGVnZXIgbWlsbGlzZWNvbmQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubWlsbGlzZWNvbmRBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZEhvdXJBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGRhYSwgRWNsaXBzZUxpbmtKUEEuVElNRV9PRl9EQVlfX0hPVVIsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZE1pbnV0ZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZGFhLCBFY2xpcHNlTGlua0pQQS5USU1FX09GX0RBWV9fTUlOVVRFLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRTZWNvbmRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGRhYSwgRWNsaXBzZUxpbmtKUEEuVElNRV9PRl9EQVlfX1NFQ09ORCwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkTWlsbGlzZWNvbmRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGRhYSwgRWNsaXBzZUxpbmtKUEEuVElNRV9PRl9EQVlfX01JTExJU0VDT05ELCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NhY2hlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2FjaGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNTM2YTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2FjaGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogUmVzb3VyY2UgbW9kZWwgaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBDYWNoZUFubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCi17Ci0JCi0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rSlBBLkNBQ0hFOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB0eXBlIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSB0eXBlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlDYWNoZVR5cGUgZ2V0VHlwZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB0eXBlIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSB0eXBlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRUeXBlKENhY2hlVHlwZSB0eXBlKTsKLQkJU3RyaW5nIFRZUEVfUFJPUEVSVFkgPSAidHlwZVByb3BlcnR5IjsJCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgc2l6ZSBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgc2l6ZSB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KLQkgKi8KLQlJbnRlZ2VyIGdldFNpemUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgc2l6ZSBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgc2l6ZSB2YWx1ZVBhaXIgZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgc2V0U2l6ZShJbnRlZ2VyIHNpemUpOwotCQlTdHJpbmcgU0laRV9QUk9QRVJUWSA9ICJzaXplUHJvcGVydHkiOwotCQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgc2hhcmVkIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBzaGFyZWQgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0U2hhcmVkKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHNoYXJlZCBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgc2hhcmVkIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRTaGFyZWQoQm9vbGVhbiBzaGFyZWQpOwotCQlTdHJpbmcgU0hBUkVEX1BST1BFUlRZID0gInNoYXJlZFByb3BlcnR5IjsKLQotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBleHBpcnkgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGV4cGlyeSB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KLQkgKi8KLQlJbnRlZ2VyIGdldEV4cGlyeSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBleHBpcnkgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGV4cGlyeSB2YWx1ZVBhaXIgZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgc2V0RXhwaXJ5KEludGVnZXIgZXhwaXJ5KTsKLQkJU3RyaW5nIEVYUElSWV9QUk9QRVJUWSA9ICJleHBpcnlQcm9wZXJ0eSI7Ci0KLQlUaW1lT2ZEYXlBbm5vdGF0aW9uIGdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlTdHJpbmcgRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZID0gImV4cGlyeVRpbWVPZkRheVByb3BlcnR5IjsKLQkJCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGFsd2F5c1JlZnJlc2ggZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGFsd2F5c1JlZnJlc2ggZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBhbHdheXNSZWZyZXNoIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBhbHdheXNSZWZyZXNoIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCk7Ci0JCVN0cmluZyBBTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSA9ICJhbHdheXNSZWZyZXNoUHJvcGVydHkiOwotCQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgcmVmcmVzaE9ubHlJZk5ld2VyIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSByZWZyZXNoT25seUlmTmV3ZXIgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHJlZnJlc2hPbmx5SWZOZXdlciBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgcmVmcmVzaE9ubHlJZk5ld2VyIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIpOwotCQlTdHJpbmcgUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZID0gInJlZnJlc2hPbmx5SWZOZXdlclByb3BlcnR5IjsKLQkJCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGRpc2FibGVIaXRzIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBkaXNhYmxlSGl0cyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCi0JICovCi0JQm9vbGVhbiBnZXREaXNhYmxlSGl0cygpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBkaXNhYmxlSGl0cyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZGlzYWJsZUhpdHMgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldERpc2FibGVIaXRzKEJvb2xlYW4gZGlzYWJsZUhpdHMpOwotCQlTdHJpbmcgRElTQUJMRV9ISVRTX1BST1BFUlRZID0gImRpc2FibGVIaXRzUHJvcGVydHkiOwotCQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdHlwZSBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgdHlwZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCi0JICovCi0JQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldENvb3JkaW5hdGlvblR5cGUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdHlwZSBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgdHlwZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0Q29vcmRpbmF0aW9uVHlwZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSk7Ci0JCVN0cmluZyBDT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSA9ICJjb29yZGluYXRpb25UeXBlUHJvcGVydHkiOwotCi0JCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgdHlwZSBlbGVtZW50LiAgSWYgdGhlIHR5cGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHNoYXJlZCBlbGVtZW50LiAgSWYgdGhlIHNoYXJlZCBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTaXplVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgc2hhcmVkIGVsZW1lbnQuICBJZiB0aGUgc2hhcmVkIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFNoYXJlZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGV4cGlyeSBlbGVtZW50LiAgSWYgdGhlIGV4cGlyeSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRFeHBpcnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBleHBpcnlUaW1lT2ZEYXkgZWxlbWVudC4gIElmIHRoZSBleHBpcnlUaW1lT2ZEYXkgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGltZU9mRGF5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgYWx3YXlzUmVmcmVzaCBlbGVtZW50LiAgSWYgdGhlIGFsd2F5c1JlZnJlc2ggZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0QWx3YXlzUmVmcmVzaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHJlZnJlc2hPbmx5SWZOZXdlciBlbGVtZW50LiAgSWYgdGhlIHJlZnJlc2hPbmx5SWZOZXdlciBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRSZWZyZXNoT25seUlmTmV3ZXJUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBkaXNhYmxlSGl0cyBlbGVtZW50LiAgSWYgdGhlIGRpc2FibGVIaXRzIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldERpc2FibGVzSGl0c1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGNvb3JkaW5hdGlvblR5cGUgZWxlbWVudC4gIElmIHRoZSBjb29yZGluYXRpb25UeXBlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldENvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0ZDdlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gQ2FjaGVDb29yZGluYXRpb25UeXBlIHsKLQkKLQlTRU5EX09CSkVDVF9DSEFOR0VTLAotCUlOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLAotCVNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCU5PTkU7Ci0JCi0JcHVibGljIHN0YXRpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEVjbGlwc2VMaW5rSlBBLkNBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19TRU5EX09CSkVDVF9DSEFOR0VTKSkgewotCQkJcmV0dXJuIFNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEVjbGlwc2VMaW5rSlBBLkNBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUykpIHsKLQkJCXJldHVybiBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoRWNsaXBzZUxpbmtKUEEuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX1NFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKSkgewotCQkJcmV0dXJuIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTOwotCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhFY2xpcHNlTGlua0pQQS5DQUNIRV9DT09SRElOQVRJT05fVFlQRV9fTk9ORSkpIHsKLQkJCXJldHVybiBOT05FOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgY2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCWlmIChjYWNoZUNvb3JkaW5hdGlvblR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChjYWNoZUNvb3JkaW5hdGlvblR5cGUpIHsKLQkJCWNhc2UgU0VORF9PQkpFQ1RfQ0hBTkdFUyA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rSlBBLkNBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19TRU5EX09CSkVDVF9DSEFOR0VTOwotCQkJY2FzZSBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rSlBBLkNBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKLQkJCWNhc2UgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua0pQQS5DQUNIRV9DT09SRElOQVRJT05fVFlQRV9fU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM7Ci0JCQljYXNlIE5PTkUgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua0pQQS5DQUNIRV9DT09SRElOQVRJT05fVFlQRV9fTk9ORTsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgY29vcmRpbmF0aW9uIHR5cGU6ICIgKyBjYWNoZUNvb3JkaW5hdGlvblR5cGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2FjaGVUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4ZmM5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLQkKLQlGVUxMLAotCVdFQUssCi0JU09GVCwKLQlTT0ZUX1dFQUssCi0JSEFSRF9XRUFLLAotCUNBQ0hFLAotCU5PTkU7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBDYWNoZVR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEVjbGlwc2VMaW5rSlBBLkNBQ0hFX1RZUEVfX0ZVTEwpKSB7Ci0JCQlyZXR1cm4gRlVMTDsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoRWNsaXBzZUxpbmtKUEEuQ0FDSEVfVFlQRV9fV0VBSykpIHsKLQkJCXJldHVybiBXRUFLOwotCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhFY2xpcHNlTGlua0pQQS5DQUNIRV9UWVBFX19TT0ZUKSkgewotCQkJcmV0dXJuIFNPRlQ7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEVjbGlwc2VMaW5rSlBBLkNBQ0hFX1RZUEVfX1NPRlRfV0VBSykpIHsKLQkJCXJldHVybiBTT0ZUX1dFQUs7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEVjbGlwc2VMaW5rSlBBLkNBQ0hFX1RZUEVfX0hBUkRfV0VBSykpIHsKLQkJCXJldHVybiBIQVJEX1dFQUs7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEVjbGlwc2VMaW5rSlBBLkNBQ0hFX1RZUEVfX0NBQ0hFKSkgewotCQkJcmV0dXJuIENBQ0hFOwotCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhFY2xpcHNlTGlua0pQQS5DQUNIRV9UWVBFX19OT05FKSkgewotCQkJcmV0dXJuIE5PTkU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKENhY2hlVHlwZSBjYWNoZVR5cGUpIHsKLQkJaWYgKGNhY2hlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGNhY2hlVHlwZSkgewotCQkJY2FzZSBGVUxMIDoKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtKUEEuQ0FDSEVfVFlQRV9fRlVMTDsKLQkJCWNhc2UgV0VBSyA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rSlBBLkNBQ0hFX1RZUEVfX1dFQUs7Ci0JCQljYXNlIFNPRlQgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua0pQQS5DQUNIRV9UWVBFX19TT0ZUOwotCQkJY2FzZSBTT0ZUX1dFQUsgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua0pQQS5DQUNIRV9UWVBFX19TT0ZUX1dFQUs7Ci0JCQljYXNlIEhBUkRfV0VBSyA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rSlBBLkNBQ0hFX1RZUEVfX0hBUkRfV0VBSzsKLQkJCWNhc2UgQ0FDSEUgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua0pQQS5DQUNIRV9UWVBFX19DQUNIRTsKLQkJCWNhc2UgTk9ORSA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rSlBBLkNBQ0hFX1RZUEVfX05PTkU7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIHR5cGU6ICIgKyBjYWNoZVR5cGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKUEEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSlBBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTQwZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKUEEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotCi0vKioKLSAqIEVjbGlwc2VMaW5rIEpQQSBKYXZhLXJlbGF0ZWQgc3R1ZmYgKGFubm90YXRpb25zIGV0Yy4pCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0pQQSB7Ci0KLQkvLyBFY2xpcHNlTGluayBKUEEgcGFja2FnZQotCVN0cmluZyBQQUNLQUdFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zIjsKLQlTdHJpbmcgUEFDS0FHRV8gPSBQQUNLQUdFICsgIi4iOwotCi0KLQkvLyAqKioqKioqKioqIEFQSSAqKioqKioqKioqCi0KLQkvLyBKUEEgYW5ub3RhdGlvbnMKLQlTdHJpbmcgQ0FDSEUgPSBQQUNLQUdFXyArICJDYWNoZSI7Ci0JCVN0cmluZyBDQUNIRV9fU0hBUkVEID0gInNoYXJlZCI7Ci0JCVN0cmluZyBDQUNIRV9fRVhQSVJZID0gImV4cGlyeSI7Ci0JCVN0cmluZyBDQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZID0gImV4cGlyeVRpbWVPZkRheSI7Ci0JCVN0cmluZyBDQUNIRV9fVFlQRSA9ICJ0eXBlIjsKLQkJU3RyaW5nIENBQ0hFX19TSVpFID0gInNpemUiOwotCQlTdHJpbmcgQ0FDSEVfX0FMV0FZU19SRUZSRVNIID0gImFsd2F5c1JlZnJlc2giOwotCQlTdHJpbmcgQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiA9ICJyZWZyZXNoT25seUlmTmV3ZXIiOwotCQlTdHJpbmcgQ0FDSEVfX0RJU0FCTEVfSElUUyA9ICJkaXNhYmxlSGl0cyI7Ci0JCVN0cmluZyBDQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEUgPSAiY29vcmRpbmF0aW9uVHlwZSI7Ci0JU3RyaW5nIENBQ0hFX1RZUEUgPSBQQUNLQUdFXyArICJDYWNoZVR5cGUiOwotCVN0cmluZyBDQUNIRV9UWVBFXyA9IENBQ0hFX1RZUEUgKyAiLiI7Ci0JU3RyaW5nIENBQ0hFX1RZUEVfX0ZVTEwgPSBDQUNIRV9UWVBFXyArICJGVUxMIjsKLQlTdHJpbmcgQ0FDSEVfVFlQRV9fV0VBSyA9IENBQ0hFX1RZUEVfICsgIldFQUsiOwotCVN0cmluZyBDQUNIRV9UWVBFX19TT0ZUID0gQ0FDSEVfVFlQRV8gKyAiU09GVCI7Ci0JU3RyaW5nIENBQ0hFX1RZUEVfX1NPRlRfV0VBSyA9IENBQ0hFX1RZUEVfICsgIlNPRlRfV0VBSyI7Ci0JU3RyaW5nIENBQ0hFX1RZUEVfX0hBUkRfV0VBSyA9IENBQ0hFX1RZUEVfICsgIkhBUkRfV0VBSyI7Ci0JU3RyaW5nIENBQ0hFX1RZUEVfX0NBQ0hFID0gQ0FDSEVfVFlQRV8gKyAiQ0FDSEUiOwotCVN0cmluZyBDQUNIRV9UWVBFX19OT05FID0gQ0FDSEVfVFlQRV8gKyAiTk9ORSI7Ci0KLQlTdHJpbmcgQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUgPSBQQUNLQUdFXyArICJDYWNoZUNvb3JkaW5hdGlvblR5cGUiOwotCVN0cmluZyBDQUNIRV9DT09SRElOQVRJT05fVFlQRV8gPSBDQUNIRV9DT09SRElOQVRJT05fVFlQRSArICIuIjsKLQlTdHJpbmcgQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX1NFTkRfT0JKRUNUX0NIQU5HRVMgPSBDQUNIRV9DT09SRElOQVRJT05fVFlQRV8gKyAiU0VORF9PQkpFQ1RfQ0hBTkdFUyI7Ci0JU3RyaW5nIENBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyA9IENBQ0hFX0NPT1JESU5BVElPTl9UWVBFXyArICJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyI7Ci0JU3RyaW5nIENBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyA9IENBQ0hFX0NPT1JESU5BVElPTl9UWVBFXyArICJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyI7Ci0JU3RyaW5nIENBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19OT05FID0gQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfICsgIk5PTkUiOwotCi0KLQlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HID0gUEFDS0FHRV8gKyAiRXhpc3RlbmNlQ2hlY2tpbmciOwotCVN0cmluZyBFWElTVEVOQ0VfQ0hFQ0tJTkdfX1ZBTFVFID0gInZhbHVlIjsKLQotCVN0cmluZyBFWElTVEVOQ0VfVFlQRSA9IFBBQ0tBR0VfICsgIkV4aXN0ZW5jZVR5cGUiOwotCVN0cmluZyBFWElTVEVOQ0VfVFlQRV8gPSBFWElTVEVOQ0VfVFlQRSArICIuIjsKLQlTdHJpbmcgRVhJU1RFTkNFX1RZUEVfX0NIRUNLX0NBQ0hFID0gRVhJU1RFTkNFX1RZUEVfICsgIkNIRUNLX0NBQ0hFIjsKLQlTdHJpbmcgRVhJU1RFTkNFX1RZUEVfX0NIRUNLX0RBVEFCQVNFID0gRVhJU1RFTkNFX1RZUEVfICsgIkNIRUNLX0RBVEFCQVNFIjsKLQlTdHJpbmcgRVhJU1RFTkNFX1RZUEVfX0FTU1VNRV9FWElTVEVOQ0UgPSBFWElTVEVOQ0VfVFlQRV8gKyAiQVNTVU1FX0VYSVNURU5DRSI7Ci0JU3RyaW5nIEVYSVNURU5DRV9UWVBFX19BU1NVTUVfTk9OX0VYSVNURU5DRSA9IEVYSVNURU5DRV9UWVBFXyArICJBU1NVTUVfTk9OX0VYSVNURU5DRSI7Ci0KLQkKLQlTdHJpbmcgVElNRV9PRl9EQVkgPSBQQUNLQUdFXyArICJUaW1lT2ZEYXkiOwotCQlTdHJpbmcgVElNRV9PRl9EQVlfX0hPVVIgPSAiaG91ciI7Ci0JCVN0cmluZyBUSU1FX09GX0RBWV9fTUlOVVRFID0gIm1pbnV0ZSI7Ci0JCVN0cmluZyBUSU1FX09GX0RBWV9fU0VDT05EID0gInNlY29uZCI7Ci0JCVN0cmluZyBUSU1FX09GX0RBWV9fTUlMTElTRUNPTkQgPSAibWlsbGlzZWNvbmQiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDYyMGRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogUmVzb3VyY2UgbW9kZWwgaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5FeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCi17Ci0JCi0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rSlBBLkVYSVNURU5DRV9DSEVDS0lORzsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHZhbHVlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlFeGlzdGVuY2VUeXBlIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHR5cGUgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIHR5cGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKEV4aXN0ZW5jZVR5cGUgdmFsdWUpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWVQcm9wZXJ0eSI7Ci0JCi0JCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB2YWx1ZSBlbGVtZW50LiAgSWYgdGhlIHZhbHVlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEV4aXN0ZW5jZUNoZWNraW5nIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRXhpc3RlbmNlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRXhpc3RlbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmI1OGRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gRXhpc3RlbmNlVHlwZSB7Ci0KLQotICAgIENIRUNLX0NBQ0hFLAotICAgIENIRUNLX0RBVEFCQVNFLAotICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0gICAgQVNTVU1FX05PTl9FWElTVEVOQ0U7Ci0JCi0JcHVibGljIHN0YXRpYyBFeGlzdGVuY2VUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhFY2xpcHNlTGlua0pQQS5FWElTVEVOQ0VfVFlQRV9fQ0hFQ0tfQ0FDSEUpKSB7Ci0JCQlyZXR1cm4gQ0hFQ0tfQ0FDSEU7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEVjbGlwc2VMaW5rSlBBLkVYSVNURU5DRV9UWVBFX19DSEVDS19EQVRBQkFTRSkpIHsKLQkJCXJldHVybiBDSEVDS19EQVRBQkFTRTsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoRWNsaXBzZUxpbmtKUEEuRVhJU1RFTkNFX1RZUEVfX0FTU1VNRV9FWElTVEVOQ0UpKSB7Ci0JCQlyZXR1cm4gQVNTVU1FX0VYSVNURU5DRTsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoRWNsaXBzZUxpbmtKUEEuRVhJU1RFTkNFX1RZUEVfX0FTU1VNRV9OT05fRVhJU1RFTkNFKSkgewotCQkJcmV0dXJuIEFTU1VNRV9OT05fRVhJU1RFTkNFOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShFeGlzdGVuY2VUeXBlIGV4aXN0ZW5jZVR5cGUpIHsKLQkJaWYgKGV4aXN0ZW5jZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChleGlzdGVuY2VUeXBlKSB7Ci0JCQljYXNlIENIRUNLX0NBQ0hFIDoKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtKUEEuRVhJU1RFTkNFX1RZUEVfX0NIRUNLX0NBQ0hFOwotCQkJY2FzZSBDSEVDS19EQVRBQkFTRSA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rSlBBLkVYSVNURU5DRV9UWVBFX19DSEVDS19EQVRBQkFTRTsKLQkJCWNhc2UgQVNTVU1FX0VYSVNURU5DRSA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rSlBBLkVYSVNURU5DRV9UWVBFX19BU1NVTUVfRVhJU1RFTkNFOwotCQkJY2FzZSBBU1NVTUVfTk9OX0VYSVNURU5DRSA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rSlBBLkVYSVNURU5DRV9UWVBFX19BU1NVTUVfTk9OX0VYSVNURU5DRTsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZXhpc3RlbmNlIHR5cGU6ICIgKyBleGlzdGVuY2VUeXBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1RpbWVPZkRheUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1RpbWVPZkRheUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2ZTM5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9UaW1lT2ZEYXlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogUmVzb3VyY2UgbW9kZWwgaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UaW1lT2ZEYXkgYW5ub3RhdGlvbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGltZU9mRGF5QW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQkKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmtKUEEuVElNRV9PRl9EQVk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGhvdXIgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBob3VyIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgotCSAqLwotCUludGVnZXIgZ2V0SG91cigpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBob3VyIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgaG91ciB2YWx1ZVBhaXIgZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgc2V0SG91cihJbnRlZ2VyIGhvdXIpOwotCQlTdHJpbmcgSE9VUl9QUk9QRVJUWSA9ICJob3VyUHJvcGVydHkiOwotCQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbWludXRlIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbWludXRlIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgotCSAqLwotCUludGVnZXIgZ2V0TWludXRlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG1pbnV0ZSBlbGVtZW50IG9mIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIG1pbnV0ZSB2YWx1ZVBhaXIgZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgc2V0TWludXRlKEludGVnZXIgbWludXRlKTsKLQkJU3RyaW5nIE1JTlVURV9QUk9QRVJUWSA9ICJtaW51dGVQcm9wZXJ0eSI7Ci0JCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBzZWNvbmQgdmFsdWVQYWlyIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCi0JICovCi0JSW50ZWdlciBnZXRTZWNvbmQoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgc2Vjb25kIHZhbHVlUGFpciBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXRTZWNvbmQoSW50ZWdlciBzZWNvbmQpOwotCQlTdHJpbmcgU0VDT05EX1BST1BFUlRZID0gInNlY29uZFByb3BlcnR5IjsKLQotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBtaWxsaXNlY29uZCBlbGVtZW50IG9mIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG1pbGxpc2Vjb25kIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgotCSAqLwotCUludGVnZXIgZ2V0TWlsbGlzZWNvbmQoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbWlsbGlzZWNvbmQgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBtaWxsaXNlY29uZCB2YWx1ZVBhaXIgZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBtaWxsaXNlY29uZCk7Ci0JCVN0cmluZyBNSUxMSVNFQ09ORF9QUk9QRVJUWSA9ICJtaWxsaXNlY29uZFByb3BlcnR5IjsKLQkJCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGhvdXIgZWxlbWVudC4gIElmIHRoZSBob3VyIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRIb3VyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbWludXRlIGVsZW1lbnQuICBJZiB0aGUgbWludXRlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRNaW51dGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBzZWNvbmQgZWxlbWVudC4gIElmIHRoZSBzZWNvbmQgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFNlY29uZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG1pbGxpc2Vjb25kIGVsZW1lbnQuICBJZiB0aGUgbWlsbGlzZWNvbmQgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE1pbGxpc2Vjb25kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkJCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMGEyMzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC91aS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTY0NDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3MmJlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZGIyYjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMDcgMTQ6MjY6NTkgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZDRjMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBGZWIgMjQgMjE6Mjc6MDEgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzA4MzdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuSnB0RWNsaXBzZUxpbmtVaVBsdWdpbgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5kYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC51aTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWksCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jYWNoaW5nLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jb25uZWN0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jdXN0b21pemF0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW4sCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRkbGdlbi53aXphcmRzLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmxvZ2dpbmcsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLm1hcHBpbmdzLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5vcHRpb25zLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZXhtbC5kZXRhaWxzLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc2NoZW1hLmdlbmVyYXRpb24KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTNhMmUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZSA9IDEuNQotamF2YWNUYXJnZXQgPSAxLjUKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YjJhZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1wbHVnaW5OYW1lPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgLSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmI0MGM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qcHQudWkuanBhUGxhdGZvcm0iPgotICAgICAgPGpwYVBsYXRmb3JtCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VSSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lY2xpcHNlbGluay5wbGF0Zm9ybSI+Ci0gICAgICA8L2pwYVBsYXRmb3JtPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX3VpLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyOTBiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotIyB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAotCi1Cb29sZWFuX1RydWUgPSBUcnVlCi1Cb29sZWFuX0ZhbHNlID0gRmFsc2UKLQotRGVmYXVsdFdpdGhvdXRWYWx1ZT1EZWZhdWx0ICgpCi1EZWZhdWx0V2l0aFZhbHVlPURlZmF1bHQgKHswfSkKLQkKLVBlcnNpc3RlbmNlWG1sVGFiRm9sZGVyX2RlZmF1bHRFbXB0eSA9IERlZmF1bHQgKCkKLVBlcnNpc3RlbmNlWG1sVGFiRm9sZGVyX2RlZmF1bHRXaXRoT25lUGFyYW0gPSBEZWZhdWx0ICh7MH0pCi0KLVBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9uYW1lID0gTmFtZToKLVBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9wcm92aWRlciA9IFByb3ZpZGVyOgotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2Jyb3dzZSA9IEJyb3dzZS4uLgotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2Rlc2NyaXB0aW9uID0gRGVzY3JpcHRpb246Ci0KLSMgQ29ubmVjdGlvbgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3RpdGxlID0gQ29ubmVjdGlvbgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3NlY3Rpb25UaXRsZSA9IFBlcnNpc3RlbmNlIFVuaXQgQ29ubmVjdGlvbgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3NlY3Rpb25EZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSB0aGUgRGF0YSBTb3VyY2Ugb3IgSkRCQyBDb25uZWN0aW9uIHByb3BlcnRpZXMuCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSA9IERlZmF1bHQgKHswfSkKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9kZWZhdWx0RW1wdHkgPSBEZWZhdWx0ICgpCi0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl90cmFuc2FjdGlvblR5cGVMYWJlbCA9IFRyYW5zYWN0aW9uIFR5cGU6Ci0KLVRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV9qdGEgPSBKVEEKLVRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV9yZXNvdXJjZV9sb2NhbCA9IFJlc291cmNlIExvY2FsCi0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9uYXRpdmVTcWxMYWJlbCA9IE5hdGl2ZSBTUUwKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9uYXRpdmVTcWxMYWJlbERlZmF1bHQgPSBOYXRpdmUgU1FMICh7MH0pCi0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iYXRjaFdyaXRpbmdMYWJlbCA9IEJhdGNoIFdyaXRpbmc6Ci0KLUJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9ub25lID0gTm9uZQotQmF0Y2hXcml0aW5nQ29tcG9zaXRlX2pkYmMgPSBKREJDCi1CYXRjaFdyaXRpbmdDb21wb3NpdGVfYnVmZmVyZWQgPSBCdWZmZXJlZAotQmF0Y2hXcml0aW5nQ29tcG9zaXRlX29yYWNsZV9qZGJjID0gT3JhY2xlIEpEQkMKLQotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2NhY2hlU3RhdGVtZW50c0xhYmVsID0gU3RhdGVtZW50IENhY2hpbmc6Ci0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9qdGFEYXRhU291cmNlTGFiZWwgPSBKVEEgRGF0YSBTb3VyY2U6Ci1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbm9uSnRhRGF0YVNvdXJjZUxhYmVsID0gTm9uLUpUQSBEYXRhIFNvdXJjZToKLQotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2RyaXZlckxhYmVsID0gRHJpdmVyOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3VybExhYmVsID0gVVJMOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3VzZXJMYWJlbCA9IFVzZXI6Ci1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcGFzc3dvcmRMYWJlbCA9IFBhc3N3b3JkOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWwgPSBCaW5kIFBhcmFtZXRlcnMKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iaW5kUGFyYW1ldGVyc0xhYmVsRGVmYXVsdCA9IEJpbmQgUGFyYW1ldGVycyAoezB9KQotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2hhcmVkTGFiZWwgPSBTaGFyZWQKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbERlZmF1bHQgPSBTaGFyZWQgKHswfSkKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTZWN0aW9uVGl0bGUgPSBSZWFkIENvbm5lY3Rpb24KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNNaW5MYWJlbCA9IE1pbmltdW06Ci1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWF4TGFiZWwgPSBNYXhpbXVtOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3dyaXRlQ29ubmVjdGlvbnNTZWN0aW9uVGl0bGUgPSBXcml0ZSBDb25uZWN0aW9uCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfd3JpdGVDb25uZWN0aW9uc01pbkxhYmVsID0gTWluaW11bToKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zTWF4TGFiZWwgPSBNYXhpbXVtOgotCi1Db25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9EYXRhYmFzZV9Hcm91cEJveD1EYXRhYmFzZQotCi1KZGJjUHJvcGVydGllc0NvbXBvc2l0ZV9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Qb29sX0dyb3VwQm94PUVjbGlwc2VMaW5rIENvbm5lY3Rpb24gUG9vbAotCi1KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19NZXNzYWdlPSZFbnRlciBjb25uZWN0aW9uIG5hbWUgb3IgcGF0dGVybiAoKiwgPywgb3IgY2FtZWwgY2FzZSk6Ci1KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19UaXRsZT1Db25uZWN0aW9uIFNlbGVjdGlvbgotCi0jIFNjaGVtYUdlbmVyYXRpb24KLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl90aXRsZSA9IFNjaGVtYSBHZW5lcmF0aW9uCi1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvblRpdGxlID0gUGVyc2lzdGVuY2UgVW5pdCBTY2hlbWEgR2VuZXJhdGlvbgotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3NlY3Rpb25EZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSB0aGUgRWNsaXBzZUxpbmsgU2NoZW1hIEdlbmVyYXRpb24gcHJvcGVydGllcy4KLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZWZhdWx0V2l0aE9uZVBhcmFtID0gRGVmYXVsdCAoezB9KQotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRFbXB0eSA9IERlZmF1bHQgKCkKLQotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RkbEdlbmVyYXRpb25UeXBlTGFiZWwgPSBEREwgR2VuZXJhdGlvbiBUeXBlOgotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX291dHB1dE1vZGVMYWJlbCA9IE91dHB1dCBNb2RlOgotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2NyZWF0ZURkbEZpbGVOYW1lTGFiZWwgPSBDcmVhdGUgRERMIEZpbGUgTmFtZToKLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kcm9wRGRsRmlsZU5hbWVMYWJlbCA9IERyb3AgRERMIEZpbGUgTmFtZToKLQotT3V0cHV0TW9kZUNvbXBvc2l0ZV9ib3RoID0gQm90aAotT3V0cHV0TW9kZUNvbXBvc2l0ZV9zcWxfc2NyaXB0ID0gU3FsLXNjcmlwdAotT3V0cHV0TW9kZUNvbXBvc2l0ZV9kYXRhYmFzZSA9IERhdGFiYXNlCi0KLURkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlX25vbmUgPSBOb25lCi1EZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZV9jcmVhdGVfdGFibGVzID0gQ3JlYXRlIFRhYmxlcwotRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGVfZHJvcF9hbmRfY3JlYXRlX3RhYmxlcyA9IERyb3AgYW5kIENyZWF0ZSBUYWJsZXMKLQotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RkbEdlbmVyYXRpb25Mb2NhdGlvbkxhYmVsID0gRERMIEdlbmVyYXRpb24gTG9jYXRpb246Ci0JCi1EZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nVGl0bGUgPSBHZW5lcmF0aW9uIExvY2F0aW9uCi1EZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nTWVzc2FnZSA9IENob29zZSBhIGZvbGRlciBmb3IgdGhlIGdlbmVyYXRlZCBEREwgZmlsZXM6Ci0KLSMgQ2FjaGluZwotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3RpdGxlID0gQ2FjaGluZwotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25UaXRsZSA9IFBlcnNpc3RlbmNlIFVuaXQgQ2FjaGluZwotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25EZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSB0aGUgc2Vzc2lvbiBvciBlbnRpdHkgc3BlY2lmaWMgRWNsaXBzZUxpbmsgY2FjaGluZyBwcm9wZXJ0aWVzLgotCi1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfZGVmYXVsdENhY2hlVHlwZUxhYmVsID0gRGVmYXVsdCBDYWNoZSBUeXBlOgotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2NhY2hlVHlwZUxhYmVsID0gQ2FjaGUgVHlwZToKLQotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZUxhYmVsID0gU2hhcmVkIENhY2hlICh7MH0pCi1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVMYWJlbCA9IFNoYXJlZCBDYWNoZQotCi1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfZGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdExhYmVsID0gRGVmYXVsdCBTaGFyZWQgQ2FjaGUgKHswfSkKLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZURlZmF1bHRMYWJlbCA9IERlZmF1bHQgU2hhcmVkIENhY2hlCi0KLUNhY2hlU2l6ZUNvbXBvc2l0ZV9jYWNoZVNpemU9Q2FjaGUgU2l6ZToKLQotQ2FjaGVUeXBlQ29tcG9zaXRlX2Z1bGwgPSBGdWxsCi1DYWNoZVR5cGVDb21wb3NpdGVfaGFyZF93ZWFrID0gV2VhayBXaXRoIEhhcmQgU3ViY2FjaGUKLUNhY2hlVHlwZUNvbXBvc2l0ZV9ub25lID0gTm9uZQotQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnQgPSBTb2Z0Ci1DYWNoZVR5cGVDb21wb3NpdGVfc29mdF93ZWFrID0gV2VhayB3aXRoIFNvZnQgU3ViY2FjaGUKLUNhY2hlVHlwZUNvbXBvc2l0ZV93ZWFrID0gV2VhawotCi1EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlX2RlZmF1bHRDYWNoZVNpemU9RGVmYXVsdCBDYWNoZSBTaXplOgotCi1EZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX2Z1bGwgPSBGdWxsCi1EZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhayA9IFdlYWsgV2l0aCBIYXJkIFN1YmNhY2hlCi1EZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX25vbmUgPSBOb25lCi1EZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX3NvZnQgPSBTb2Z0Ci1EZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX3NvZnRfd2VhayA9IFdlYWsgd2l0aCBTb2Z0IFN1YmNhY2hlCi1EZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX3dlYWsgPSBXZWFrCi0KLUVudGl0eURpYWxvZ19zZWxlY3RFbnRpdHkgPSBTZWxlY3QgYW4gRW50aXR5Ci1FbnRpdHlEaWFsb2dfbmFtZSA9IE5hbWU6Ci0KLUNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2dyb3VwVGl0bGUgPSBFbnRpdHkgQ2FjaGluZwotQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZWRpdEJ1dHRvbiA9IEVkaXQuLi4KLQotQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nTWVzc2FnZT0mRW50ZXIgdHlwZSBuYW1lIHByZWZpeCBvciBwYXR0ZXJuICgqLCA/LCBvciBjYW1lbCBjYXNlKToKLUNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlPUVudGl0eSBTZWxlY3Rpb24KLQkKLSMgQ3VzdG9taXphdGlvbgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3RpdGxlID0gQ3VzdG9taXphdGlvbgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25UaXRsZSA9IFBlcnNpc3RlbmNlIFVuaXQgQ3VzdG9taXphdGlvbgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25EZXNjcmlwdGlvbiA9IFNldCBkZWZhdWx0IG9yIGVudGl0eSBzcGVjaWZpYyBFY2xpcHNlTGluayBjdXN0b21pemF0aW9uIGFuZCB2YWxpZGF0aW9uIHByb3BlcnRpZXMuCi0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbERlZmF1bHQgPSBUaHJvdyBFeGNlcHRpb25zICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGhyb3dFeGNlcHRpb25zTGFiZWwgPSBUaHJvdyBFeGNlcHRpb25zCi0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGFiZWwgPSBXZWF2aW5nOgotCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbERlZmF1bHQgPSBXZWF2aW5nIExhenkgKHswfSkKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsID0gV2VhdmluZyBMYXp5Ci0JCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWxEZWZhdWx0ID0gV2VhdmluZyBDaGFuZ2UgVHJhY2tpbmcgKHswfSkKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nQ2hhbmdlVHJhY2tpbmdMYWJlbCA9IFdlYXZpbmcgQ2hhbmdlIFRyYWNraW5nCi0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRmV0Y2hHcm91cHNMYWJlbERlZmF1bHQgPSBXZWF2aW5nIEZldGNoIEdyb3VwcyAoezB9KQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsID0gV2VhdmluZyBGZXRjaCBHcm91cHMKLQkKLVdlYXZpbmdDb21wb3NpdGVfdHJ1ZV8gPSBXZWF2ZSBEeW5hbWljYWxseQotV2VhdmluZ0NvbXBvc2l0ZV9mYWxzZV8gPSBObyBXZWF2aW5nCi1XZWF2aW5nQ29tcG9zaXRlX3N0YXRpY18gPSBXZWF2ZSBTdGF0aWNhbGx5Ci0KLUN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2dyb3VwVGl0bGUgPSBEZXNjcmlwdG9yIEN1c3RvbWl6ZXIKLUN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2VkaXRCdXR0b24gPSBFZGl0Li4uCi0KLUN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U9JkVudGVyIHR5cGUgbmFtZSBwcmVmaXggb3IgcGF0dGVybiAoKiwgPywgb3IgY2FtZWwgY2FzZSk6Ci1DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dUaXRsZT1FbnRpdHkgU2VsZWN0aW9uCi0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9jdXN0b21pemVyTGFiZWwgPSBDdXN0b21pemVyOgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Nlc3Npb25DdXN0b21pemVyTGFiZWwgPSBTZXNzaW9uIEN1c3RvbWl6ZXI6Ci0KLSMgTG9nZ2luZwotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpdGxlID0gTG9nZ2luZwotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlY3Rpb25UaXRsZSA9IFBlcnNpc3RlbmNlIFVuaXQgTG9nZ2luZwotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlY3Rpb25EZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSB0aGUgRWNsaXBzZUxpbmsgTG9nZ2luZyBwcm9wZXJ0aWVzLgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0gPSBEZWZhdWx0ICh7MH0pCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZGVmYXVsdEVtcHR5ID0gRGVmYXVsdCAoKQotCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0xldmVsTGFiZWwgPSBMb2dnaW5nIExldmVsOgotCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfb2ZmID0gT2ZmCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfc2V2ZXJlID0gU2V2ZXJlCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfd2FybmluZyA9IFdhcm5pbmcKLUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9pbmZvID0gSW5mbwotTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2NvbmZpZyA9IENvbmZpZwotTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmUgPSBGaW5lCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZXIgPSBGaW5lcgotTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmVzdCA9IEZpbmVzdAotCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2VyTGFiZWwgPSBMb2dnZXI6Ci0KLUxvZ2dlckNvbXBvc2l0ZV9kZWZhdWx0X2xvZ2dlciA9IERlZmF1bHQgTG9nZ2VyCi1Mb2dnZXJDb21wb3NpdGVfamF2YV9sb2dnZXIgPSBKYXZhIExvZ2dlcgotTG9nZ2VyQ29tcG9zaXRlX3NlcnZlcl9sb2dnZXIgPSBTZXJ2ZXIgTG9nZ2VyCi0KLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aW1lc3RhbXBMYWJlbCA9IFRpbWVzdGFtcAotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpbWVzdGFtcExhYmVsRGVmYXVsdCA9IFRpbWVzdGFtcCAoezB9KQotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RocmVhZExhYmVsID0gVGhyZWFkCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWxEZWZhdWx0ID0gVGhyZWFkICh7MH0pCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2Vzc2lvbkxhYmVsID0gU2Vzc2lvbgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Nlc3Npb25MYWJlbERlZmF1bHQgPSBTZXNzaW9uICh7MH0pCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZXhjZXB0aW9uc0xhYmVsID0gRXhjZXB0aW9ucwotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbERlZmF1bHQgPSBFeGNlcHRpb25zICh7MH0pCi0KLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJzTGFiZWwgPSBMb2dnZXJzOgotCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0ZpbGVMYWJlbCA9IExvZyBGaWxlOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dpbmdGaWxlTGFiZWxEZWZhdWx0ID0gTG9nIEZpbGUgKHswfSkKLQotTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dUaXRsZSA9IExvZyBGaWxlIExvY2F0aW9uCi1Mb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ01lc3NhZ2UgPSBDaG9vc2UgYSBmb2xkZXIgZm9yIHRoZSBsb2cgZmlsZToKLQotIyBPcHRpb25zCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGl0bGUgPSBPcHRpb25zCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2VjdGlvblRpdGxlID0gRWNsaXBzZUxpbmsgU2Vzc2lvbiBPcHRpb25zCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBFY2xpcHNlTGluayBTZXNzaW9uIE9wdGlvbnMuCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSA9IERlZmF1bHQgKHswfSkKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9kZWZhdWx0RW1wdHkgPSBEZWZhdWx0ICgpCi0KLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uTmFtZSA9IFNlc3Npb24gTmFtZToKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uc1htbCA9IFNlc3Npb25zIFhtbDoKLQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsID0gSW5jbHVkZSBEZXNjcmlwdG9yIFF1ZXJpZXMKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbERlZmF1bHQgPSBJbmNsdWRlIERlc2NyaXB0b3IgUXVlcmllcyAoezB9KQotCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZXZlbnRMaXN0ZW5lckxhYmVsID0gRXZlbnQgTGlzdGVuZXI6Ci1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGFyZ2V0RGF0YWJhc2VMYWJlbCA9IFRhcmdldCBEYXRhYmFzZToKLQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfYXR0dW5pdHkgPSBBdHR1bml0eQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfYXV0byA9IEF1dG8KLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2Nsb3Vkc2NhcGUgPSBDbG91ZHNjYXBlCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYXRhYmFzZSA9IERhdGFiYXNlCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYjIgPSBEQjIKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RiMm1haW5mcmFtZSA9IERCMk1haW5mcmFtZQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGJhc2UgPSBEQmFzZQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGVyYnkgPSBEZXJieQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfaHNxbCA9IEhTUUwKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2luZm9ybWl4ID0gSW5mb3JtaXgKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2phdmFkYiA9IEphdmFEQgotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfbXlzcWxwbGF0Zm9ybSA9IE15U1FMUGxhdGZvcm0KLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZSA9IE9yYWNsZQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfcG9pbnRiYXNlID0gUG9pbnRCYXNlCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9wb3N0Z3Jlc3FsID0gUG9zdGdyZVNRTAotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3FsYW55d2hlcmUgPSBTUUxBbnlXaGVyZQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3Fsc2VydmVyID0gU1FMU2VydmVyCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9zeWJhc2UgPSBTeWJhc2UKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3RpbWVzdGVuID0gVGltZXNUZW4KLQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldFNlcnZlckxhYmVsID0gVGFyZ2V0IFNlcnZlcjoKLQotVGFyZ2V0U2VydmVyQ29tcG9zaXRlX25vbmUgPSBOb25lCi1UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfb2M0aiA9IE9DNEoKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV9zdW5hczkgPSBTdW5BUzkKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJzcGhlcmUgPSBXZWJTcGhlcmUKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJzcGhlcmVfNl8xID0gV2ViU3BoZXJlIDYuMQotVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljID0gV2ViTG9naWMKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJsb2dpY185ID0gV2ViTG9naWMgOQotVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljXzEwID0gV2ViTG9naWMgMTAKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV9qYm9zcyA9IEpCb3NzCi0KLSMgRERMR2VuZXJhdGlvbgotRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaV9nZW5lcmF0aW5nRERMV2FybmluZ1RpdGxlID0gR2VuZXJhdGluZyBEREwKLUVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0RETFdhcm5pbmdNZXNzYWdlID0gV2FybmluZzogIEdlbmVyYXRpbmcgRERMIHdpbGwgRFJPUCBleGlzdGluZyB0YWJsZXMgYW5kezB9Q1JFQVRFIG5ldyB0YWJsZXMgYmFzZWQgb24gdGhlIEVudGl0aWVzIGluIHlvdXIgcHJvamVjdC57MX1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWlfbWFwcGluZ3MucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua191aV9tYXBwaW5ncy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2FmNzg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua191aV9tYXBwaW5ncy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSMgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKLQotQ2FjaGVUeXBlQ29tcG9zaXRlX2xhYmVsID0gVHlwZToKLUVjbGlwc2VMaW5rSmF2YUVudGl0eUNvbXBvc2l0ZV9jYWNoaW5nID0gQ2FjaGluZwkKLUNhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsID0gRnVsbAotQ2FjaGVUeXBlQ29tcG9zaXRlX3dlYWsgPSBXZWFrCi1DYWNoZVR5cGVDb21wb3NpdGVfc29mdCA9IFNvZnQKLUNhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0X3dlYWsgPSBXZWFrIHdpdGggU29mdCBTdWJjYWNoZQotQ2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhayA9IFdlYWsgd2l0aCBIYXJkIFN1YmNhY2hlCi1DYWNoZVR5cGVDb21wb3NpdGVfY2FjaGUgPSBDYWNoZQotQ2FjaGVUeXBlQ29tcG9zaXRlX25vbmUgPSAgTm9uZQotCi1DYWNoZVNpemVDb21wb3NpdGVfc2l6ZSA9IFNpemU6Ci0KLUNhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9sYWJlbCA9IENvb3JkaW5hdGlvbiBUeXBlOgotQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX3NlbmRfb2JqZWN0X2NoYW5nZXMgPSBTZW5kIE9iamVjdCBDaGFuZ2VzCi1DYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfaW52YWxpZGF0ZV9jaGFuZ2VkX29iamVjdHMgPSBJbnZhbGlkYXRlIENoYW5nZWQgT2JqZWN0cwotQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX3NlbmRfbmV3X29iamVjdHNfd2l0aF9jaGFuZ2VzID0gU2VuZCBOZXcgT2JqZWN0cyB3aXRoIENoYW5nZXMKLUNhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9ub25lID0gTm9uZQotCi1DYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsRGVmYXVsdCA9IFNoYXJlZCAoezB9KQotQ2FjaGluZ0NvbXBvc2l0ZV9zaGFyZWRMYWJlbCA9IFNoYXJlZAotQ2FjaGluZ0NvbXBvc2l0ZV9hZHZhbmNlZCA9IEFkdmFuY2VkCi0KLUFsd2F5c1JlZnJlc2hDb21wb3NpdGVfYWx3YXlzUmVmcmVzaERlZmF1bHQgPSBBbHdheXMgUmVmcmVzaCAoezB9KQotQWx3YXlzUmVmcmVzaENvbXBvc2l0ZV9hbHdheXNSZWZyZXNoTGFiZWwgPSBBbHdheXMgUmVmcmVzaAotUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlX3JlZnJlc2hPbmx5SWZOZXdlckRlZmF1bHQgPSBSZWZyZXNoIE9ubHkgaWYgTmV3ZXIgKHswfSkKLVJlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJMYWJlbCA9IFJlZnJlc2ggT25seSBpZiBOZXdlcgotRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNEZWZhdWx0ID0gRGlzYWJsZSBIaXRzICh7MH0pCi1EaXNhYmxlSGl0c0NvbXBvc2l0ZV9kaXNhYmxlSGl0c0xhYmVsID0gRGlzYWJsZSBIaXRzCi0KLUV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2xhYmVsID0gRXhpc3RlbmNlIENoZWNraW5nOgotRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfY2hlY2tfY2FjaGUgPSBDaGVjayBDYWNoZQotRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfY2hlY2tfZGF0YWJhc2UgPSBDaGVjayBDYWNoZSB0aGVuIERhdGFiYXNlCi1FeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfZXhpc3RlbmNlID0gQXNzdW1lIEV4aXN0ZW5jZQotRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfYXNzdW1lX25vbl9leGlzdGVuY2UgPSBBc3N1bWUgTm9uLUV4aXN0ZW5jZQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9FY2xpcHNlTGlua0pwYVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvRWNsaXBzZUxpbmtKcGFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyMzgwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9FY2xpcHNlTGlua0pwYVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0pwYVVpRmFjdG9yeSBleHRlbmRzIEpwYVVpRmFjdG9yeQotewotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9KcHRFY2xpcHNlTGlua1VpUGx1Z2luLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9KcHRFY2xpcHNlTGlua1VpUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZTJkOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvSnB0RWNsaXBzZUxpbmtVaVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rVWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0JcHJpdmF0ZSBzdGF0aWMgSnB0RWNsaXBzZUxpbmtVaVBsdWdpbiBJTlNUQU5DRTsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgSnB0RWNsaXBzZUxpbmtVaVBsdWdpbiBwbHVnaW47Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEpwdEVjbGlwc2VMaW5rVWlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHRFY2xpcHNlTGlua1VpUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSU5TVEFOQ0UuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgdGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBJbWFnZSBBUEkgKioqKioqKioqKgotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCWlmICghIGtleS5zdGFydHNXaXRoKCJpY29ucy8iKSkgewotCQkJa2V5ID0gImljb25zLyIgKyBrZXk7Ci0JCX0KLQkJaWYgKCEga2V5LmVuZHNXaXRoKCIuZ2lmIikpIHsKLQkJCWtleSA9IGtleSArICIuZ2lmIjsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIGFuIGltYWdlIGZvciBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKGtleSk7Ci0JCXJldHVybiAoZGVzYyA9PSBudWxsKSA/IG51bGwgOiBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHRFY2xpcHNlTGlua1VpUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjAxNGRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuSnB0RWNsaXBzZUxpbmtVaVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgRGFsaSBFY2xpcHNlTGluayBVSS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzIHsKLQotCS8vQ29udGV4dElEIHByZWZpeAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IEpwdEVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lEICsgIi4iOwotCi0JLy9QZXJzaXN0ZW50IFR5cGUgY29tcG9zaXRlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hJTkdfQ0FDSEVfVFlQRSA9IFBSRUZJWCArICJjYWNoaW5nX2NhY2hlVHlwZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19TSEFSRUQgPSBQUkVGSVggKyAiY2FjaGluZ19zaGFyZWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hJTkdfQUxXQVlTX1JFRlJFU0ggPSBQUkVGSVggKyAiY2FjaGluZ19hbHdheXNSZWZyZXNoIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNISU5HX1JFRlJFU0hfT05MWV9JRl9ORVdFUiA9IFBSRUZJWCArICJjYWNoaW5nX3JlZnJlc2hPbmx5SWZOZXdlciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19ESVNBQkxFX0hJVFMgPSBQUkVGSVggKyAiY2FjaGluZ19kaXNhYmxlSGl0cyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19DQUNIRV9DT09SRElOQVRJT05fVFlQRSA9IFBSRUZJWCArICJjYWNoaW5nX2NhY2hlQ29vcmRpbmF0aW9uVHlwZSI7Ci0JCi0JCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFVaUZhY3RvcnlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVVpRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzNTM4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVVpRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLkVjbGlwc2VMaW5rSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jYWNoaW5nLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbi5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmN1c3RvbWl6YXRpb24uUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuRWNsaXBzZUxpbmtKYXZhRW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5sb2dnaW5nLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwub3B0aW9ucy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnNjaGVtYS5nZW5lcmF0aW9uLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuQmFzZUpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBFY2xpcHNlTGlua0pwYVVpRmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFVaUZhY3RvcnlJbXBsIGV4dGVuZHMgQmFzZUpwYVVpRmFjdG9yeSBpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSnBhVWlGYWN0b3J5Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rSnBhVWlGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW50aXR5Q29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0phdmFFbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpwYVBhZ2VDb21wb3NpdGU+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoCi0JCQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQkJCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBlY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlciA9IAotCQkJdGhpcy5idWlsZEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCQlBcnJheUxpc3Q8SnBhUGFnZUNvbXBvc2l0ZT4gcGFnZXMgPSAKLQkJCW5ldyBBcnJheUxpc3Q8SnBhUGFnZUNvbXBvc2l0ZT4oOCk7Ci0KLQkJcGFnZXMuYWRkKG5ldyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCQkKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbm5lY3Rpb24+IGNvbm5lY3Rpb25Ib2xkZXIgPSAKLQkJCXRoaXMuYnVpbGRDb25uZWN0aW9uSG9sZGVyKGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyKTsKLQkJcGFnZXMuYWRkKG5ldyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWIoY29ubmVjdGlvbkhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4gY3VzdG9taXphdGlvbkhvbGRlciA9IAotCQkJdGhpcy5idWlsZEN1c3RvbWl6YXRpb25Ib2xkZXIoZWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIpOwotCQlwYWdlcy5hZGQobmV3IFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYihjdXN0b21pemF0aW9uSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBjYWNoaW5nSG9sZGVyID0gCi0JCQl0aGlzLmJ1aWxkQ2FjaGluZ0hvbGRlcihlY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlcik7Ci0JCXBhZ2VzLmFkZChuZXcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiKGNhY2hpbmdIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCQkKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IGxvZ2dpbmdIb2xkZXIgPSAKLQkJCXRoaXMuYnVpbGRMb2dnaW5nSG9sZGVyKGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyKTsKLQkJcGFnZXMuYWRkKG5ldyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWIobG9nZ2luZ0hvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0KLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9wdGlvbnM+IG9wdGlvbnNIb2xkZXIgPSAKLQkJCXRoaXMuYnVpbGRPcHRpb25zSG9sZGVyKGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyKTsKLQkJcGFnZXMuYWRkKG5ldyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIob3B0aW9uc0hvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc2NoZW1hR2VuSG9sZGVyID0gCi0JCQl0aGlzLmJ1aWxkU2NoZW1hR2VuZXJhdGlvbkhvbGRlcihlY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlcik7Ci0JCXBhZ2VzLmFkZChuZXcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiKHNjaGVtYUdlbkhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCQotCQlwYWdlcy5hZGQobmV3IFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCQotCQlyZXR1cm4gcGFnZXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvbj4gYnVpbGRDb25uZWN0aW9uSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBDb25uZWN0aW9uPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb25uZWN0aW9uIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q29ubmVjdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPE9wdGlvbnM+IGJ1aWxkT3B0aW9uc0hvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgT3B0aW9ucz4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3B0aW9ucyB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldE9wdGlvbnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nPiBidWlsZExvZ2dpbmdIb2xkZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQsIExvZ2dpbmc+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExvZ2dpbmcgdHJhbnNmb3JtXyhFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRMb2dnaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4gYnVpbGRDdXN0b21pemF0aW9uSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBDdXN0b21pemF0aW9uPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDdXN0b21pemF0aW9uIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q3VzdG9taXphdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgQ2FjaGluZz4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGluZyB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENhY2hpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTY2hlbWFHZW5lcmF0aW9uPiBidWlsZFNjaGVtYUdlbmVyYXRpb25Ib2xkZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQsIFNjaGVtYUdlbmVyYXRpb24+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNjaGVtYUdlbmVyYXRpb24gdHJhbnNmb3JtXyhFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRTY2hlbWFHZW5lcmF0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdCwgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHRyYW5zZm9ybV8oUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua1VpTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmZDUzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua1VpTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rVWlNZXNzYWdlcwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rVWlNZXNzYWdlcyBleHRlbmRzIE5MUwotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJlY2xpcHNlbGlua191aSI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm9vbGVhbl9UcnVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvb2xlYW5fRmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0V2l0aG91dFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRXaXRoVmFsdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFRhYkZvbGRlcl9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxUYWJGb2xkZXJfZGVmYXVsdFdpdGhPbmVQYXJhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9wcm92aWRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfYnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9kZXNjcmlwdGlvbjsKLQotCS8vIENvbm5lY3Rpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9kZWZhdWx0RW1wdHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdHJhbnNhY3Rpb25UeXBlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9EYXRhYmFzZV9Hcm91cEJveDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlX0VjbGlwc2VMaW5rQ29ubmVjdGlvblBvb2xfR3JvdXBCb3g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX2p0YTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfcmVzb3VyY2VfbG9jYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25hdGl2ZVNxbExhYmVsRGVmYXVsdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iYXRjaFdyaXRpbmdMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9qZGJjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9idWZmZXJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXRjaFdyaXRpbmdDb21wb3NpdGVfb3JhY2xlX2pkYmM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfY2FjaGVTdGF0ZW1lbnRzTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9ub25KdGFEYXRhU291cmNlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfZHJpdmVyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3VybExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91c2VyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3Bhc3N3b3JkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWxEZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NoYXJlZExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWluTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc01heExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zTWluTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3dyaXRlQ29ubmVjdGlvbnNNYXhMYWJlbDsKLQotCS8vIFNjaGVtYUdlbmVyYXRpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZWZhdWx0RW1wdHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGRsR2VuZXJhdGlvblR5cGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfb3V0cHV0TW9kZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2NyZWF0ZURkbEZpbGVOYW1lTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2Ryb3BEZGxGaWxlTmFtZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0TW9kZUNvbXBvc2l0ZV9ib3RoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dE1vZGVDb21wb3NpdGVfc3FsX3NjcmlwdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRNb2RlQ29tcG9zaXRlX2RhdGFiYXNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGVfbm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZV9jcmVhdGVfdGFibGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlX2Ryb3BfYW5kX2NyZWF0ZV90YWJsZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGRsR2VuZXJhdGlvbkxvY2F0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U7Ci0KLQkvLyBDYWNoaW5nCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0Q2FjaGVUeXBlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2NhY2hlVHlwZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVNpemVDb21wb3NpdGVfY2FjaGVTaXplOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVUeXBlQ29tcG9zaXRlX2Z1bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVR5cGVDb21wb3NpdGVfbm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVR5cGVDb21wb3NpdGVfc29mdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVR5cGVDb21wb3NpdGVfc29mdF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hlVHlwZUNvbXBvc2l0ZV93ZWFrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZV9kZWZhdWx0Q2FjaGVTaXplOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfaGFyZF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfbm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX3NvZnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0X3dlYWs7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV93ZWFrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5RGlhbG9nX3NlbGVjdEVudGl0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlEaWFsb2dfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2dyb3VwVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZWRpdEJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nVGl0bGU7Ci0KLQkvLyBDdXN0b21pemF0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nQ2hhbmdlVHJhY2tpbmdMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdDaGFuZ2VUcmFja2luZ0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWF2aW5nQ29tcG9zaXRlX3RydWVfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYXZpbmdDb21wb3NpdGVfZmFsc2VfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYXZpbmdDb21wb3NpdGVfc3RhdGljXzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2dyb3VwVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZWRpdEJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nVGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2N1c3RvbWl6ZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2Vzc2lvbkN1c3RvbWl6ZXJMYWJlbDsKLQotCS8vIExvZ2dpbmcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9kZWZhdWx0RW1wdHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0xldmVsTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfb2ZmOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9zZXZlcmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX3dhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2luZm87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2NvbmZpZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmVzdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dlckNvbXBvc2l0ZV9kZWZhdWx0X2xvZ2dlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnZXJDb21wb3NpdGVfamF2YV9sb2dnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2VyQ29tcG9zaXRlX3NlcnZlcl9sb2dnZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGltZXN0YW1wTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpbWVzdGFtcExhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RocmVhZExhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2Vzc2lvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbERlZmF1bHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dlcnNMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0ZpbGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0ZpbGVMYWJlbERlZmF1bHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nTWVzc2FnZTsKLQotCS8vIFNlc3Npb24gT3B0aW9ucwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRFbXB0eTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvbnNYbWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsRGVmYXVsdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9ldmVudExpc3RlbmVyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldERhdGFiYXNlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9hdHR1bml0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9hdXRvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2Nsb3Vkc2NhcGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGF0YWJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGIyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RiMm1haW5mcmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kZXJieTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9oc3FsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2luZm9ybWl4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2phdmFkYjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9teXNxbHBsYXRmb3JtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9wb2ludGJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfcG9zdGdyZXNxbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9zcWxhbnl3aGVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9zcWxzZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3liYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3RpbWVzdGVuOwotCSAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90YXJnZXRTZXJ2ZXJMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV9vYzRqOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV9zdW5hczk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYnNwaGVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2Vic3BoZXJlXzZfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2VibG9naWM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljXzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV9qYm9zczsKLQotCS8vIERETEdlbmVyYXRpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2dlbmVyYXRpbmdERExXYXJuaW5nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaV9nZW5lcmF0aW5nRERMV2FybmluZ01lc3NhZ2U7Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rVWlNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VudGl0eURpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRW50aXR5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMGE2NDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRW50aXR5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogRW50aXR5RGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlEaWFsb2cgZXh0ZW5kcyBEaWFsb2cKLXsKLQlwcml2YXRlIEVudGl0eSBlbnRpdHk7Ci0KLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCXByb3RlY3RlZCBDb21ibyBuYW1lQ29tYm87Ci0KLQlwcml2YXRlIFN0cmluZyBzZWxlY3RlZE5hbWU7Ci0KLQlwdWJsaWMgRW50aXR5RGlhbG9nKFNoZWxsIHBhcmVudCwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0JfQotCi0JcHVibGljIEVudGl0eURpYWxvZyhTaGVsbCBwYXJlbnQsIEVudGl0eSBlbnRpdHksIEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmVudGl0eSA9IGVudGl0eTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQoZ2V0VGl0bGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FbnRpdHlEaWFsb2dfc2VsZWN0RW50aXR5OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCi0JCUxhYmVsIG5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJbmFtZUxhYmVsLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVudGl0eURpYWxvZ19uYW1lKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMubmFtZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLm5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlwb3B1bGF0ZU5hbWVDb21ibygpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTmFtZUNvbWJvKCkgewotCQlpZiAoc2VsZWN0ZWROYW1lICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZUNvbWJvLnNldFRleHQoc2VsZWN0ZWROYW1lKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb21ibyBnZXROYW1lQ29tYm8oKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVDb21ibzsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW50aXR5IGdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWROYW1lKFN0cmluZyBzZWxlY3RlZE5hbWUpIHsKLQkJdGhpcy5zZWxlY3RlZE5hbWUgPSBzZWxlY3RlZE5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCXRoaXMuc2VsZWN0ZWROYW1lID0gdGhpcy5uYW1lQ29tYm8uZ2V0VGV4dCgpOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0NhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9DYWNoZVNpemVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzYTg3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0NhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRDb250cm9sVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci0KLS8qKgotICogQ2FjaGVTaXplQ29tcG9zaXRlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENhY2hlU2l6ZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxFbnRpdHlDYWNoZVByb3BlcnRpZXM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2FjaGVTaXplQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxFbnRpdHlDYWNoZVByb3BlcnRpZXM+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZENhY2hlU2l6ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5Q2FjaGVQcm9wZXJ0aWVzLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eUNhY2hlUHJvcGVydGllcy5DQUNIRV9TSVpFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCUludGVnZXIgdmFsdWUgPSBzdWJqZWN0LmdldENhY2hlU2l6ZSgpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gLTE7Ci0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0Q2FjaGVTaXplKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBidWlsZENhY2hpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q2FjaGVQcm9wZXJ0aWVzLCBDYWNoaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hpbmcgdHJhbnNmb3JtXyhFbnRpdHlDYWNoZVByb3BlcnRpZXMgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q2FjaGluZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdENhY2hlU2l6ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgSW50ZWdlcj4oYnVpbGRDYWNoaW5nSG9sZGVyKCksIENhY2hpbmcuQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCUludGVnZXIgdmFsdWUgPSBzdWJqZWN0LmdldENhY2hlU2l6ZURlZmF1bHQoKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdENhY2hlU2l6ZURlZmF1bHQoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZERlZmF1bHRDYWNoZVNpemVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBidWlsZExhYmVsKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRlZmF1bHRXaXRob3V0VmFsdWUKLQkJKTsKLQotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKAotCQkJbmV3IExhYmVsZWRMYWJlbChsYWJlbCksCi0JCQlidWlsZERlZmF1bHRDYWNoZVNpemVMYWJlbEhvbGRlcigpCi0JCSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0Q2FjaGVTaXplTGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdENhY2hlU2l6ZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSW50ZWdlciB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0V2l0aFZhbHVlLCB2YWx1ZSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuICIiOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IHRoaXMuYnVpbGRMYWJlbGVkU3Bpbm5lcigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoZVNpemVDb21wb3NpdGVfY2FjaGVTaXplLAotCQkJdGhpcy5idWlsZENhY2hlU2l6ZUhvbGRlcigpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJdGhpcy5idWlsZERlZmF1bHRDYWNoZVNpemVMYWJlbChjb250YWluZXIpCi0JCSk7Ci0KLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLCBzcGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBsYXlvdXQgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciBieSBjaGFuZ2luZyB3aGljaCB3aWRnZXQgd2lsbAotCSAqIGdyYWIgdGhlIGV4Y2VzcyBvZiBob3Jpem9udGFsIHNwYWNlLiBCeSBkZWZhdWx0LCB0aGUgY2VudGVyIGNvbnRyb2wgZ3JhYnMKLQkgKiB0aGUgZXhjZXNzIHNwYWNlLCB3ZSBjaGFuZ2UgaXQgdG8gYmUgdGhlIHJpZ2h0IGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgY29udGFpbmluZyB0aGUgY29udHJvbHMgbmVlZGluZyB0aGVpcgotCSAqIDxjb2RlPkdyaWREYXRhPC9jb2RlPiB0byBiZSBtb2RpZmllZCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlcwotCSAqIEBwYXJhbSBzcGlubmVyIFRoZSBzcGlubmVyIHRoYXQgZ290IGNyZWF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3Bpbm5lciBzcGlubmVyKSB7Ci0KLQkJLy8gSXQgaXMgcG9zc2libGUgdGhlIHNwaW5uZXIncyBwYXJlbnQgaXMgbm90IHRoZSBjb250YWluZXIgb2YgdGhlCi0JCS8vIGxhYmVsLCBzcGlubmVyIGFuZCByaWdodCBjb250cm9sIChhIHBhbmUgaXMgc29tZXRpbWVzIHJlcXVpcmVkIGZvcgotCQkvLyBwYWludGluZyB0aGUgc3Bpbm5lcidzIGJvcmRlcikKLQkJQ29tcG9zaXRlIHBhbmVDb250YWluZXIgPSBzcGlubmVyLmdldFBhcmVudCgpOwotCi0JCXdoaWxlIChjb250YWluZXIgIT0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKSkgewotCQkJcGFuZUNvbnRhaW5lciA9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlDb250cm9sW10gY29udHJvbHMgPSBwYW5lQ29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQljb250cm9sc1sxXS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljb250cm9sc1syXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlQWxpZ25SaWdodChjb250cm9sc1syXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0NhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWRkZWZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY2FjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBDYWNoZVR5cGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIENhY2hlVHlwZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxFbnRpdHlDYWNoZVByb3BlcnRpZXM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2FjaGVUeXBlQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxFbnRpdHlDYWNoZVByb3BlcnRpZXM+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2NhY2hlVHlwZUxhYmVsLAotCQkJbmV3IENhY2hlVHlwZUNvbWJvKGNvbnRhaW5lciksCi0JCQludWxsCQkvLyBUT0RPIElKcGFIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIENhY2hlVHlwZUNvbWJvIGV4dGVuZHMgRW51bUZvcm1Db21ib1ZpZXdlcjxFbnRpdHlDYWNoZVByb3BlcnRpZXMsIENhY2hlVHlwZT4gewotCi0JCXByaXZhdGUgQ2FjaGVUeXBlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoQ2FjaGVUeXBlQ29tcG9zaXRlLnRoaXMsIHBhcmVudCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eUNhY2hlUHJvcGVydGllcy5DQUNIRV9UWVBFX1BST1BFUlRZKTsKLQkJfQotCi0JCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q2FjaGVQcm9wZXJ0aWVzLCBDYWNoaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgQ2FjaGluZyB0cmFuc2Zvcm1fKEVudGl0eUNhY2hlUHJvcGVydGllcyB2YWx1ZSkgewotCQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q2FjaGluZygpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZVR5cGU+IGJ1aWxkRGVmYXVsdENhY2hlVHlwZUhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4oYnVpbGRDYWNoaW5nSG9sZGVyKCksIENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIENhY2hlVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQkJQ2FjaGVUeXBlIGNhY2hlVHlwZSA9IHN1YmplY3QuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCQkJCQlpZiAoY2FjaGVUeXBlID09IG51bGwpIHsKLQkJCQkJCWNhY2hlVHlwZSA9IHN1YmplY3QuZ2V0RGVmYXVsdENhY2hlVHlwZURlZmF1bHQoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gY2FjaGVUeXBlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREZWZhdWx0Q2FjaGluZ1R5cGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCQlidWlsZERlZmF1bHRDYWNoaW5nVHlwZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkKLQkJCSk7Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREZWZhdWx0Q2FjaGluZ1R5cGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJCWlmICgoZS5nZXROZXdWYWx1ZSgpICE9IG51bGwpICYmICFnZXRDb21ibygpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJQ2FjaGVUeXBlQ29tYm8udGhpcy5kb1BvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDYWNoZVR5cGVbXSBjaG9pY2VzKCkgewotCQkJcmV0dXJuIENhY2hlVHlwZS52YWx1ZXMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QoKS5nZXREZWZhdWx0Q2FjaGVUeXBlKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKENhY2hlVHlwZSB2YWx1ZSkgewotCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsCi0JCQkJQ2FjaGVUeXBlQ29tcG9zaXRlLnRoaXMsCi0JCQkJdmFsdWUKLQkJCSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJCS8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gYWxsb3cgdGhlIGNsYXNzIGxvYWRlciB0byBsZXQgdGhlIGxpc3RlbmVyCi0JCQkvLyB3cml0dGVuIGFib3ZlIHRvIGFjY2VzcyB0aGlzIG1ldGhvZAotCQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDYWNoZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWJqZWN0KCkuZ2V0Q2FjaGVUeXBlKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gZGVmYXVsdENhY2hlVHlwZUhvbGRlciA9Ci0JCQkJYnVpbGREZWZhdWx0Q2FjaGVUeXBlSG9sZGVyKCk7Ci0KLQkJCWRlZmF1bHRDYWNoZVR5cGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJYnVpbGREZWZhdWx0Q2FjaGluZ1R5cGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKLQkJCSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQ2FjaGVUeXBlIHZhbHVlKSB7Ci0JCQl0aGlzLnN1YmplY3QoKS5zZXRDYWNoZVR5cGUodmFsdWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGY2ZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZENvbnRyb2xVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLQotLyoqCi0gKiBDYWNoZVNpemVDb21wb3NpdGUKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDYWNoaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2FjaGVUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERlZmF1bHRDYWNoZVNpemVDb21wb3NpdGUoQWJzdHJhY3RQYW5lPENhY2hpbmc+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRDYWNoZVNpemVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ2FjaGluZy5DQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJSW50ZWdlciB2YWx1ZSA9IHN1YmplY3QuZ2V0Q2FjaGVTaXplRGVmYXVsdCgpOwotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSAtMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlID09IC0xKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRDYWNoZVNpemVEZWZhdWx0KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRDYWNoZVNpemVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgIiIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdENhY2hlU2l6ZURlZmF1bHQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoSW50ZWdlci5NSU5fVkFMVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkRGVmYXVsdENhY2hlU2l6ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlMYWJlbCBsYWJlbCA9IGJ1aWxkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGVmYXVsdFdpdGhvdXRWYWx1ZQotCQkpOwotCi0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoCi0JCQluZXcgTGFiZWxlZExhYmVsKGxhYmVsKSwKLQkJCWJ1aWxkRGVmYXVsdENhY2hlU2l6ZUxhYmVsSG9sZGVyKCkKLQkJKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRDYWNoZVNpemVMYWJlbEhvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXIsIFN0cmluZz4oYnVpbGREZWZhdWx0Q2FjaGVTaXplSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJbnRlZ2VyIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsIHZhbHVlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy5idWlsZExhYmVsZWRTcGlubmVyKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRlZmF1bHRDYWNoZVNpemVDb21wb3NpdGVfZGVmYXVsdENhY2hlU2l6ZSwKLQkJCXRoaXMuYnVpbGRDYWNoZVNpemVIb2xkZXIoKSwKLQkJCS0xLAotCQkJLTEsCi0JCQlJbnRlZ2VyLk1BWF9WQUxVRSwKLQkJCXRoaXMuYnVpbGREZWZhdWx0Q2FjaGVTaXplTGFiZWwoY29udGFpbmVyKQotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lciwgc3Bpbm5lcik7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgbGF5b3V0IG9mIHRoZSBnaXZlbiBjb250YWluZXIgYnkgY2hhbmdpbmcgd2hpY2ggd2lkZ2V0IHdpbGwKLQkgKiBncmFiIHRoZSBleGNlc3Mgb2YgaG9yaXpvbnRhbCBzcGFjZS4gQnkgZGVmYXVsdCwgdGhlIGNlbnRlciBjb250cm9sIGdyYWJzCi0JICogdGhlIGV4Y2VzcyBzcGFjZSwgd2UgY2hhbmdlIGl0IHRvIGJlIHRoZSByaWdodCBjb250cm9sLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIGNvbnRhaW5pbmcgdGhlIGNvbnRyb2xzIG5lZWRpbmcgdGhlaXIKLQkgKiA8Y29kZT5HcmlkRGF0YTwvY29kZT4gdG8gYmUgbW9kaWZpZWQgZnJvbSB0aGUgZGVmYXVsdCB2YWx1ZXMKLQkgKiBAcGFyYW0gc3Bpbm5lciBUaGUgc3Bpbm5lciB0aGF0IGdvdCBjcmVhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIsIFNwaW5uZXIgc3Bpbm5lcikgewotCi0JCS8vIEl0IGlzIHBvc3NpYmxlIHRoZSBzcGlubmVyJ3MgcGFyZW50IGlzIG5vdCB0aGUgY29udGFpbmVyIG9mIHRoZQotCQkvLyBsYWJlbCwgc3Bpbm5lciBhbmQgcmlnaHQgY29udHJvbCAoYSBwYW5lIGlzIHNvbWV0aW1lcyByZXF1aXJlZCBmb3IKLQkJLy8gcGFpbnRpbmcgdGhlIHNwaW5uZXIncyBib3JkZXIpCi0JCUNvbXBvc2l0ZSBwYW5lQ29udGFpbmVyID0gc3Bpbm5lci5nZXRQYXJlbnQoKTsKLQotCQl3aGlsZSAoY29udGFpbmVyICE9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCkpIHsKLQkJCXBhbmVDb250YWluZXIgPSBwYW5lQ29udGFpbmVyLmdldFBhcmVudCgpOwotCQl9Ci0KLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gcGFuZUNvbnRhaW5lci5nZXRDaGlsZHJlbigpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJY29udHJvbHNbMV0uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY29udHJvbHNbMl0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJlbW92ZUFsaWduUmlnaHQoY29udHJvbHNbMl0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0RlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmJhOGQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNhY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPENhY2hpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBDYWNoaW5nPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPiBidWlsZERlZmF1bHRDYWNoZVR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlVHlwZVtdIGNob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIENhY2hlVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlVHlwZSBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhDYWNoZVR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldENhY2hlVHlwZURlZmF1bHQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShDYWNoZVR5cGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0Q2FjaGVUeXBlRGVmYXVsdCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfZGVmYXVsdENhY2hlVHlwZUxhYmVsLAotCQkJdGhpcy5idWlsZERlZmF1bHRDYWNoZVR5cGVDb21ibyggY29udGFpbmVyKSwKLQkJCW51bGwJCS8vIFRPRE8gSUpwYUhlbHBDb250ZXh0SWRzLgotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0RlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGJlNzUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRGVmYXVsdFNoYXJlQ2FjaGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8Q2FjaGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRlZmF1bHRTaGFyZUNhY2hlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgQ2FjaGluZz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0VmFsdWUgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWwsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWwsCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlU3RyaW5nSG9sZGVyKCksCi0JCQludWxsCi0vLwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19TSEFSRURfQ0FDSEVfREVGQVVMVAotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI2Zjg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDYWNoaW5nPgotewotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvblRpdGxlLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uRGVzY3JpcHRpb24KLQkJKTsKLQotCQkvLyBEZWZhdWx0IHBhbmUKLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ3JvdXBCb3hNYXJnaW4oKTsKLQotCQlDb21wb3NpdGUgZGVmYXVsdFBhbmUgPSBidWlsZFN1YlBhbmUoCi0JCQljb250YWluZXIsCi0JCQkwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4KLQkJKTsKLQotCQkvLyBEZWZhdWx0IENhY2hlIFR5cGUKLQkJbmV3IERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUodGhpcywgZGVmYXVsdFBhbmUpOwotCi0JCS8vIERlZmF1bHQgQ2FjaGUgU2l6ZQotCQluZXcgRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7Ci0KLQkJLy8gRGVmYXVsdCBTaGFyZWQgQ2FjaGUKLQkJbmV3IERlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7Ci0KLQkJLy8gRW50aXRpZXNMaXN0Ci0JCW5ldyBFbnRpdHlMaXN0Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRW50aXR5Q2FjaGVQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0VudGl0eUNhY2hlUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGM1MjE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRW50aXR5Q2FjaGVQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFbnRpdHlDYWNoZVByb3BlcnRpZXMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW50aXR5Q2FjaGVQcm9wZXJ0aWVzIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQlwcml2YXRlIENhY2hpbmcgY2FjaGluZzsKLQlwcml2YXRlIFN0cmluZyBlbnRpdHlOYW1lOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gY2FjaGVUeXBlSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjYWNoZVR5cGVMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBjYWNoZVNpemVIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNhY2hlU2l6ZUxpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHNoYXJlZENhY2hlSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzaGFyZWRDYWNoZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9UWVBFX1BST1BFUlRZID0gQ2FjaGluZy5DQUNIRV9UWVBFX1BST1BFUlRZOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NJWkVfUFJPUEVSVFkgPSBDYWNoaW5nLkNBQ0hFX1NJWkVfUFJPUEVSVFk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0NBQ0hFX1BST1BFUlRZID0gQ2FjaGluZy5TSEFSRURfQ0FDSEVfUFJPUEVSVFk7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVudGl0eUNhY2hlUHJvcGVydGllcyhDYWNoaW5nIGNhY2hpbmcsIFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY2FjaGluZyAgICA9IGNhY2hpbmc7Ci0JCXRoaXMuZW50aXR5TmFtZSA9IGVudGl0eU5hbWU7Ci0JCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gY2FjaGluZ0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4odGhpcy5jYWNoaW5nKTsKLQkJdGhpcy5pbml0aWFsaXplKGNhY2hpbmdIb2xkZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBjYWNoaW5nSG9sZGVyKSB7Ci0JCXRoaXMuY2FjaGVUeXBlSG9sZGVyID0gdGhpcy5idWlsZENhY2hlVHlwZUFBKGNhY2hpbmdIb2xkZXIpOwotCQl0aGlzLmNhY2hlVHlwZUxpc3RlbmVyID0gdGhpcy5idWlsZENhY2hlVHlwZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY2FjaGVUeXBlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhY2hlVHlwZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNhY2hlU2l6ZUhvbGRlciA9IHRoaXMuYnVpbGRDYWNoZVNpemVBQShjYWNoaW5nSG9sZGVyKTsKLQkJdGhpcy5jYWNoZVNpemVMaXN0ZW5lciA9IHRoaXMuYnVpbGRDYWNoZVNpemVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmNhY2hlU2l6ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYWNoZVNpemVMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zaGFyZWRDYWNoZUhvbGRlciA9IHRoaXMuYnVpbGRTaGFyZWRDYWNoZUFBKGNhY2hpbmdIb2xkZXIpOwotCQl0aGlzLnNoYXJlZENhY2hlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNoYXJlZENhY2hlTGlzdGVuZXIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQlwdWJsaWMgYm9vbGVhbiBlbnRpdHlOYW1lSXNWYWxpZCgpIHsKLQkJcmV0dXJuICFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZW50aXR5TmFtZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0Q2FjaGVTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nLmdldENhY2hlU2l6ZSh0aGlzLmVudGl0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBDYWNoZVR5cGUgZ2V0Q2FjaGVUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nLmdldENhY2hlVHlwZSh0aGlzLmVudGl0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBDYWNoaW5nIGdldENhY2hpbmcoKSB7Ci0JCXJldHVybiBjYWNoaW5nOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRDYWNoZVNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hpbmcuZ2V0RGVmYXVsdENhY2hlU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBDYWNoZVR5cGUgZ2V0RGVmYXVsdENhY2hlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZy5nZXREZWZhdWx0Q2FjaGVUeXBlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHlOYW1lOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNoYXJlZENhY2hlKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nLmdldFNoYXJlZENhY2hlKHRoaXMuZW50aXR5TmFtZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFNoYXJlZENhY2hlKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nLmdldERlZmF1bHRTaGFyZWRDYWNoZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlU2l6ZShJbnRlZ2VyIGNhY2hlU2l6ZSkgewotCQlJbnRlZ2VyIG9sZENhY2hlU2l6ZSA9IHRoaXMuZ2V0Q2FjaGVTaXplKCk7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChvbGRDYWNoZVNpemUsIGNhY2hlU2l6ZSkpIHsKLQkJCXRoaXMuY2FjaGluZy5zZXRDYWNoZVNpemUoY2FjaGVTaXplLCB0aGlzLmVudGl0eU5hbWUpOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NJWkVfUFJPUEVSVFksIG9sZENhY2hlU2l6ZSwgY2FjaGVTaXplKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlVHlwZShDYWNoZVR5cGUgY2FjaGVUeXBlKSB7Ci0JCUNhY2hlVHlwZSBvbGRDYWNoZVR5cGUgPSB0aGlzLmdldENhY2hlVHlwZSgpOwotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQob2xkQ2FjaGVUeXBlLCBjYWNoZVR5cGUpKSB7Ci0JCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVUeXBlKGNhY2hlVHlwZSwgdGhpcy5lbnRpdHlOYW1lKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9UWVBFX1BST1BFUlRZLCBvbGRDYWNoZVR5cGUsIGNhY2hlVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWRDYWNoZShCb29sZWFuIHNoYXJlZENhY2hlKSB7Ci0JCUJvb2xlYW4gb2xkU2hhcmVkQ2FjaGUgPSB0aGlzLmdldFNoYXJlZENhY2hlKCk7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChvbGRTaGFyZWRDYWNoZSwgc2hhcmVkQ2FjaGUpKSB7Ci0JCQl0aGlzLmNhY2hpbmcuc2V0U2hhcmVkQ2FjaGUoc2hhcmVkQ2FjaGUsIHRoaXMuZW50aXR5TmFtZSk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX0NBQ0hFX1BST1BFUlRZLCBvbGRTaGFyZWRDYWNoZSwgc2hhcmVkQ2FjaGUpOwotCQl9Ci0JfQotCQotCS8vICoqKioqKioqKiogUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVUeXBlPiBidWlsZENhY2hlVHlwZUFBKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4oCi0JCQkJCQkJCXN1YmplY3RIb2xkZXIsIENBQ0hFX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhY2hlVHlwZShFbnRpdHlDYWNoZVByb3BlcnRpZXMudGhpcy5lbnRpdHlOYW1lKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2FjaGVUeXBlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlFbnRpdHlDYWNoZVByb3BlcnRpZXMudGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1RZUEVfUFJPUEVSVFksIGUuZ2V0T2xkVmFsdWUoKSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRDYWNoZVNpemVBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBJbnRlZ2VyPigKLQkJCQkJCQkJc3ViamVjdEhvbGRlciwgQ0FDSEVfU0laRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhY2hlU2l6ZShFbnRpdHlDYWNoZVByb3BlcnRpZXMudGhpcy5lbnRpdHlOYW1lKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2FjaGVTaXplQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlFbnRpdHlDYWNoZVByb3BlcnRpZXMudGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NJWkVfUFJPUEVSVFksIGUuZ2V0T2xkVmFsdWUoKSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTaGFyZWRDYWNoZUFBKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KAotCQkJCQkJCQlzdWJqZWN0SG9sZGVyLCBTSEFSRURfQ0FDSEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTaGFyZWRDYWNoZShFbnRpdHlDYWNoZVByb3BlcnRpZXMudGhpcy5lbnRpdHlOYW1lKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2hhcmVkQ2FjaGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUVudGl0eUNhY2hlUHJvcGVydGllcy50aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX0NBQ0hFX1BST1BFUlRZLCBlLmdldE9sZFZhbHVlKCksIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmJ1aWxkU2ltcGxlVG9TdHJpbmdPbih0aGlzLCBzYik7Ci0JCXNiLmFwcGVuZCgiICgiKTsKLQkJdGhpcy50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCgibmFtZTogIik7Ci0JCXNiLmFwcGVuZCh0aGlzLmVudGl0eU5hbWUpOwotCQlzYi5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldENhY2hlVHlwZSgpKTsKLQkJc2IuYXBwZW5kKCIsIHNpemU6ICIpOwotCQlzYi5hcHBlbmQodGhpcy5nZXRDYWNoZVNpemUoKSk7Ci0JCXNiLmFwcGVuZCgiLCBpc1NoYXJlZDogIik7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldFNoYXJlZENhY2hlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0VudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmU4YTYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxFbnRpdHlDYWNoZVByb3BlcnRpZXM+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGUoQWJzdHJhY3RQYW5lPENhY2hpbmc+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlDYWNoZVByb3BlcnRpZXM+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIENhY2hlIFR5cGUKLQkJbmV3IENhY2hlVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIENhY2hlIFNpemUKLQkJbmV3IENhY2hlU2l6ZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIFNoYXJlIENhY2hlCi0JCW5ldyBTaGFyZWRDYWNoZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9FbnRpdHlMaXN0Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YWI4ODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9FbnRpdHlMaXN0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNhY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLkpwdEVjbGlwc2VMaW5rVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLQotLyoqCi0gKiAgRW50aXR5TGlzdENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TGlzdENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDYWNoaW5nPgotewotCXB1YmxpYyBFbnRpdHlMaXN0Q29tcG9zaXRlKEFic3RyYWN0UGFuZTxDYWNoaW5nPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5idWlsZFRpdGxlZFBhbmUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZ3JvdXBUaXRsZQotCQkpOwotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eUNhY2hlUHJvcGVydGllcz4gZW50aXR5SG9sZGVyID0gdGhpcy5idWlsZEVudGl0eUhvbGRlcigpOwotCi0JCS8vIEVudGl0aWVzIGFkZC9yZW1vdmUgbGlzdCBwYW5lCi0JCW5ldyBBZGRSZW1vdmVMaXN0UGFuZTxDYWNoaW5nPigKLQkJCXRoaXMsCi0JCQljb250YWluZXIsCi0JCQl0aGlzLmJ1aWxkRW50aXRpZXNBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkRW50aXR5Q2FjaGluZ0xpc3RIb2xkZXIoKSwKLQkJCWVudGl0eUhvbGRlciwKLQkJCXRoaXMuYnVpbGRFbnRpdHlMYWJlbFByb3ZpZGVyKCksCi0JCQludWxsCQkJLy8JCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19FTlRJVElFUwotCQkpOwotCi0JCS8vIEVudGl0eSBDYWNoaW5nIHByb3BlcnR5IHBhbmUKLQkJRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlIHBhbmUgPSBuZXcgRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWVudGl0eUhvbGRlciwKLQkJCWNvbnRhaW5lcgotCQkpOwotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcihlbnRpdHlIb2xkZXIsIHBhbmUpOwotCX0KLQkKLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lLkFkYXB0ZXIgYnVpbGRFbnRpdGllc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkRW50aXRpZXMobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJQ2FjaGluZyBjYWNoaW5nID0gc3ViamVjdCgpOwotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlFbnRpdHlDYWNoZVByb3BlcnRpZXMgZW50aXR5Q2FjaGluZyA9IChFbnRpdHlDYWNoZVByb3BlcnRpZXMpIGl0ZW07Ci0JCQkJCWNhY2hpbmcucmVtb3ZlRW50aXR5KGVudGl0eUNhY2hpbmcuZ2V0RW50aXR5TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRFbnRpdGllcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJSVR5cGUgdHlwZSA9IHRoaXMuY2hvb3NlRW50aXR5KCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmdldEVudGl0eU5hbWUodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCQlpZiAoZW50aXR5TmFtZSA9PSBudWxsKSB7Ci0JCQkJZW50aXR5TmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCX0KLQkJCQotCQkJaWYoICEgdGhpcy5zdWJqZWN0KCkuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7Ci0JCQkJU3RyaW5nIGVudGl0eSA9IHRoaXMuc3ViamVjdCgpLmFkZEVudGl0eShlbnRpdHlOYW1lKTsKLQkKLQkJCQlsaXN0U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShlbnRpdHkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEVudGl0eU5hbWUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IHN1YmplY3QoKS5wZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQotCQlpZiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCAmJiBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nS2V5KCkgPT0gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpIHsKLQkJCVR5cGVNYXBwaW5nIG1hcHBpbmcgPSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQlpZiAobWFwcGluZyBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXJldHVybiAoKEVudGl0eSltYXBwaW5nKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSVR5cGUgY2hvb3NlRW50aXR5KCkgewotCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHsgcm9vdC5nZXRKYXZhUHJvamVjdCgpIH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKLQkJCQlzaGVsbCgpLAotCQkJCXNlcnZpY2UsCi0JCQkJc2NvcGUsCi0JCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsCi0JCQkJZmFsc2UsCi0JCQkJIiIKLQkJCSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlKTsKLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlKTsKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQotCQl0cnkgewotCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRFbnRpdHlMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUVudGl0eUNhY2hlUHJvcGVydGllcyBlbnRpdHlDYWNoaW5nID0gKEVudGl0eUNhY2hlUHJvcGVydGllcykgZWxlbWVudDsKLQkJCQlyZXR1cm4gZW50aXR5Q2FjaGluZy5nZXRFbnRpdHlOYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlDYWNoZVByb3BlcnRpZXM+IGJ1aWxkRW50aXR5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlDYWNoZVByb3BlcnRpZXM+KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFbnRpdHlDYWNoZVByb3BlcnRpZXM+IGJ1aWxkRW50aXR5Q2FjaGluZ0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nLCBFbnRpdHlDYWNoZVByb3BlcnRpZXM+KGJ1aWxkRW50aXRpZXNMaXN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudGl0eUNhY2hlUHJvcGVydGllcyB0cmFuc2Zvcm1JdGVtKFN0cmluZyBpdGVtKSB7Ci0JCQkJcmV0dXJuIG5ldyBFbnRpdHlDYWNoZVByb3BlcnRpZXMoc3ViamVjdCgpLCBpdGVtKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRFbnRpdGllc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgU3RyaW5nPigKLQkJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIENhY2hpbmcuRU5USVRJRVNfTElTVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmVudGl0aWVzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5lbnRpdGllc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eUNhY2hlUHJvcGVydGllcz4gZW50aXR5SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlIHBhbmUpIHsKLQotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQl0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoZW50aXR5SG9sZGVyKSwKLQkJCXBhbmUKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eUNhY2hlUHJvcGVydGllcz4gZW50aXR5SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q2FjaGVQcm9wZXJ0aWVzLCBCb29sZWFuPihlbnRpdHlIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhFbnRpdHlDYWNoZVByb3BlcnRpZXMgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZW50aXR5TmFtZUlzVmFsaWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL1BlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1ZTU0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL1BlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWIgCi0JCQkJCQkJCWV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDYWNoaW5nPgotCQkJCQkJCQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQluZXcgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldFBhZ2VJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3RpdGxlOwotCX0KLQotCS8vICoqKioqKioqKiogTGF5b3V0ICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7Ci0JCQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gYnVpbGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL1NoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL1NoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNmZlYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9TaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlRyaVN0YXRlQ2hlY2tCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2hhcmVkQ2FjaGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNoYXJlZENhY2hlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPEVudGl0eUNhY2hlUHJvcGVydGllcz4KLXsKLQlwcml2YXRlIFRyaVN0YXRlQ2hlY2tCb3ggc2hhcmVkQ2FjaGVDaGVja0JveDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2hhcmVDYWNoZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlciBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2hhcmVkQ2FjaGVDb21wb3NpdGUoQWJzdHJhY3RQYW5lPEVudGl0eUNhY2hlUHJvcGVydGllcz4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eUNhY2hlUHJvcGVydGllcywgQ2FjaGluZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoaW5nIHRyYW5zZm9ybV8oRW50aXR5Q2FjaGVQcm9wZXJ0aWVzIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENhY2hpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRBbmROb25EZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4oCi0JCQlidWlsZERlZmF1bHRBbmROb25EZWZhdWx0U2hhcmVkQ2FjaGVMaXN0SG9sZGVyKCkKLQkJKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQkJLy8gSWYgdGhlIG51bWJlciBvZiBMaXN0VmFsdWVNb2RlbCBlcXVhbHMgMSwgdGhhdCBtZWFucyB0aGUgc2hhcmVkCi0JCQkJLy8gQ2FjaGUgcHJvcGVydGllcyBpcyBub3Qgc2V0IChwYXJ0aWFsbHkgc2VsZWN0ZWQpLCB3aGljaCBtZWFucyB3ZQotCQkJCS8vIHdhbnQgdG8gc2VlIHRoZSBkZWZhdWx0IHZhbHVlIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKGxpc3RIb2xkZXIuc2l6ZSgpID09IDEpIHsKLQkJCQkJcmV0dXJuIChCb29sZWFuKSBsaXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpLm5leHQoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfTsKLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0QW5kTm9uRGVmYXVsdFNoYXJlZENhY2hlTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPEJvb2xlYW4+PiBob2xkZXJzID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxCb29sZWFuPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkU2hhcmVkQ2FjaGVMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKSk7Ci0KLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxCb29sZWFuPiwgQm9vbGVhbj4oCi0JCQlob2xkZXJzCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KGJ1aWxkQ2FjaGluZ0hvbGRlcigpLCBDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUJvb2xlYW4gdmFsdWUgPSBzdWJqZWN0LmdldFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7Ci0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPigKLQkJCWJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eUNhY2hlUHJvcGVydGllcywgQm9vbGVhbj4oCi0JCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5Q2FjaGVQcm9wZXJ0aWVzLlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNoYXJlZENhY2hlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U2hhcmVkQ2FjaGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4oCi0JCQlidWlsZFNoYXJlZENhY2hlSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRBbmROb25EZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVMYWJlbCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCQl0aGlzLnNoYXJlZENhY2hlQ2hlY2tCb3guc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLnNoYXJlZENhY2hlQ2hlY2tCb3ggPSB0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZUxhYmVsLAotCQkJdGhpcy5idWlsZFNoYXJlZENhY2hlSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DQUNISU5HX1NIQVJFRF9DQUNIRQotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0JhdGNoV3JpdGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9CYXRjaFdyaXRpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwMTUyMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0JhdGNoV3JpdGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5CYXRjaFdyaXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQmF0Y2hXcml0aW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDb25uZWN0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmF0Y2hXcml0aW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBCYXRjaFdyaXRpbmdDb21wb3NpdGUoCi0JCQkJCUFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIENvbm5lY3Rpb24+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlciggcGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxDb25uZWN0aW9uLCBCYXRjaFdyaXRpbmc+IGJ1aWxkQmF0Y2hXcml0aW5nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q29ubmVjdGlvbiwgQmF0Y2hXcml0aW5nPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQ29ubmVjdGlvbi5CQVRDSF9XUklUSU5HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQmF0Y2hXcml0aW5nW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gQmF0Y2hXcml0aW5nLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCYXRjaFdyaXRpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdEJhdGNoV3JpdGluZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhCYXRjaFdyaXRpbmcgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgQmF0Y2hXcml0aW5nQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQmF0Y2hXcml0aW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0QmF0Y2hXcml0aW5nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQmF0Y2hXcml0aW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldEJhdGNoV3JpdGluZyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmF0Y2hXcml0aW5nTGFiZWwsCi0JCQl0aGlzLmJ1aWxkQmF0Y2hXcml0aW5nQ29tYm8oIGNvbnRhaW5lciksCi0JCQludWxsCQkvLyBUT0RPIElKcGFIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0NhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjcwMjU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5UcmlTdGF0ZUNoZWNrQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci0KLS8qKgotICogIENhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPgotewotCXB1YmxpYyBDYWNoZVN0YXRlbWVudHNQcm9wZXJ0aWVzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhY2hlU3RhdGVtZW50c0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0Q2FjaGVTdGF0ZW1lbnRzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldENhY2hlU3RhdGVtZW50cyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkQ2FjaGVTdGF0ZW1lbnRzU2l6ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlJbnRlZ2VyIHZhbHVlID0gc3ViamVjdC5nZXRDYWNoZVN0YXRlbWVudHNTaXplKCk7Ci0KLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gLTEpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldENhY2hlU3RhdGVtZW50c1NpemUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgIiIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoSW50ZWdlci5NSU5fVkFMVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBidWlsZERlZmF1bHRDYWNoZVN0YXRlbWVudHNTaXplTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUxhYmVsIGxhYmVsID0gYnVpbGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0V2l0aG91dFZhbHVlCi0JCSk7Ci0KLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcigKLQkJCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpLAotCQkJYnVpbGREZWZhdWx0Q2FjaGVTdGF0ZW1lbnRzU2l6ZUxhYmVsSG9sZGVyKCkKLQkJKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRDYWNoZVN0YXRlbWVudHNTaXplTGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGVmYXVsdFdpdGhWYWx1ZSwgdmFsdWUpOwotCQkJCX0KLQotCQkJCXJldHVybiAiIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBjYWNoZVN0YXRlbWVudHNIb2xkZXIgPSBidWlsZENhY2hlU3RhdGVtZW50c0hvbGRlcigpOwotCi0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSB0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfY2FjaGVTdGF0ZW1lbnRzTGFiZWwsCi0JCQljYWNoZVN0YXRlbWVudHNIb2xkZXIsCi0JCQludWxsCi0JCSk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy5idWlsZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQl0aGlzLmJ1aWxkQ2FjaGVTdGF0ZW1lbnRzU2l6ZUhvbGRlcigpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFCi0JCSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSB0aGlzLmJ1aWxkRGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemVMYWJlbChjb250YWluZXIpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJY2hlY2tCb3guZ2V0Q2hlY2tCb3goKSwKLQkJCShzcGlubmVyLmdldFBhcmVudCgpID09IGNvbnRhaW5lcikgPyBzcGlubmVyIDogc3Bpbm5lci5nZXRQYXJlbnQoKSwKLQkJCWxhYmVsLAotCQkJbnVsbAotLy8JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLgotCQkpOwotCi0JCXRoaXMuaW5zdGFsbENvbnRyb2xFbmFibGVyKGNhY2hlU3RhdGVtZW50c0hvbGRlciwgbGFiZWwsIHNwaW5uZXIpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lciwgc3Bpbm5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxDb250cm9sRW5hYmxlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBjYWNoZVN0YXRlbWVudHNIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCBsYWJlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwaW5uZXIgc3Bpbm5lcikgewotCi0JCW5ldyBDb250cm9sRW5hYmxlcihjYWNoZVN0YXRlbWVudHNIb2xkZXIsIGxhYmVsLCBzcGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBsYXlvdXQgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciBieSBjaGFuZ2luZyB3aGljaCB3aWRnZXQgd2lsbAotCSAqIGdyYWIgdGhlIGV4Y2VzcyBvZiBob3Jpem9udGFsIHNwYWNlLiBCeSBkZWZhdWx0LCB0aGUgY2VudGVyIGNvbnRyb2wgZ3JhYnMKLQkgKiB0aGUgZXhjZXNzIHNwYWNlLCB3ZSBjaGFuZ2UgaXQgdG8gYmUgdGhlIHJpZ2h0IGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgY29udGFpbmluZyB0aGUgY29udHJvbHMgbmVlZGluZyB0aGVpcgotCSAqIDxjb2RlPkdyaWREYXRhPC9jb2RlPiB0byBiZSBtb2RpZmllZCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlcwotCSAqIEBwYXJhbSBzcGlubmVyIFRoZSBzcGlubmVyIHRoYXQgZ290IGNyZWF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3Bpbm5lciBzcGlubmVyKSB7Ci0KLQkJLy8gSXQgaXMgcG9zc2libGUgdGhlIHNwaW5uZXIncyBwYXJlbnQgaXMgbm90IHRoZSBjb250YWluZXIgb2YgdGhlCi0JCS8vIGxhYmVsLCBzcGlubmVyIGFuZCByaWdodCBjb250cm9sIChhIHBhbmUgaXMgc29tZXRpbWVzIHJlcXVpcmVkIGZvcgotCQkvLyBwYWludGluZyB0aGUgc3Bpbm5lcidzIGJvcmRlcikKLQkJQ29tcG9zaXRlIHBhbmVDb250YWluZXIgPSBzcGlubmVyLmdldFBhcmVudCgpOwotCi0JCXdoaWxlIChjb250YWluZXIgIT0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKSkgewotCQkJcGFuZUNvbnRhaW5lciA9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlDb250cm9sW10gY29udHJvbHMgPSBwYW5lQ29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQljb250cm9sc1sxXS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljb250cm9sc1syXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlQWxpZ25SaWdodChjb250cm9sc1syXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYTQwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JcHVibGljIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRUaXRsZWRQYW5lKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0RhdGFiYXNlX0dyb3VwQm94Ci0JCSk7Ci0KLQkJbmV3IERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0RhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0RhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYTI1MzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbEVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8Q29ubmVjdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRKdGFEYXRhU291cmNlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRKdGFEYXRhU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEpUQURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPihidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5vbkp0YURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLk5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROb25KdGFEYXRhU291cmNlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXROb25KdGFEYXRhU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vbkpUQURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPihidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4gYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCi0JCWNvbnRhaW5lciA9IGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0KLQkJLy8gSlRBIERhdGEgU291cmNlCi0JCVRleHQgdGV4dCA9IHRoaXMuYnVpbGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsLAotCQkJYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCkKLQkJKTsKLQotCQl0aGlzLmluc3RhbGxKVEFEYXRhU291cmNlQ29udHJvbEVuYWJsZXIodGV4dCk7Ci0KLQkJLy8gTm9uLUpUQSBEYXRhIFNvdXJjZQotCQl0ZXh0ID0gdGhpcy5idWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9ub25KdGFEYXRhU291cmNlTGFiZWwsCi0JCQlidWlsZE5vbkp0YURhdGFTb3VyY2VIb2xkZXIoKQotCQkpOwotCi0JCXRoaXMuaW5zdGFsbE5vbkpUQURhdGFTb3VyY2VDb250cm9sRW5hYmxlcih0ZXh0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbEpUQURhdGFTb3VyY2VDb250cm9sRW5hYmxlcihUZXh0IHRleHQpIHsKLQkJbmV3IENvbnRyb2xFbmFibGVyKGJ1aWxkSlRBRGF0YVNvdXJjZUhvbGRlcigpLCB0ZXh0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbE5vbkpUQURhdGFTb3VyY2VDb250cm9sRW5hYmxlcihUZXh0IHRleHQpIHsKLQkJbmV3IENvbnRyb2xFbmFibGVyKGJ1aWxkTm9uSlRBRGF0YVNvdXJjZUhvbGRlcigpLCB0ZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNjdhMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rQ29ubmVjdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPENvbm5lY3Rpb24+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rQ29ubmVjdGlvbkNvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTxDb25uZWN0aW9uPiBzdWJqZWN0SG9sZGVyLAotCQkJCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdyb3VwQm94TWFyZ2luKCkgKiAyOwotCi0JCWNvbnRhaW5lciA9IGJ1aWxkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfc2VjdGlvblRpdGxlLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24KLQkJKTsKLQotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGJ1aWxkU3ViUGFuZSgKLQkJCWNvbnRhaW5lciwKLQkJCTAsIGdyb3VwQm94TWFyZ2luLCAxMCwgZ3JvdXBCb3hNYXJnaW4KLQkJKTsKLQotCQluZXcgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpOwotCi0JCW5ldyBCYXRjaFdyaXRpbmdDb21wb3NpdGUodGhpcywgc3ViUGFuZSk7Ci0KLQkJbmV3IENhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGUodGhpcywgc3ViUGFuZSk7Ci0KLQkJbmV3IE5hdGl2ZVNxbENvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKTsKLQotCQluZXcgQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZjgwNzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEpkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdFBhbmU8PyBleHRlbmRzIENvbm5lY3Rpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQmluZFBhcmFtZXRlcnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5CSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0QmluZFBhcmFtZXRlcnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0QmluZFBhcmFtZXRlcnModmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEJpbmRQYXJhbWV0ZXJzU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRCaW5kUGFyYW1ldGVyc0hvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdEJpbmRQYXJhbWV0ZXJzKCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmluZFBhcmFtZXRlcnNMYWJlbCwKLQkJCXRoaXMuYnVpbGRCaW5kUGFyYW1ldGVyc0hvbGRlcigpLAotCQkJdGhpcy5idWlsZEJpbmRQYXJhbWV0ZXJzU3RyaW5nSG9sZGVyKCksCi0JCQludWxsCi0vLwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Yjg1NjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5KcHREYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbHRlcmVkSXRlbXNTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8Q29ubmVjdGlvbj4KLXsKLQkvKioKLQkgKiBUaGUgY29uc3RhbnQgSUQgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGlhbG9nIHNldHRpbmdzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfU0VUVElOR1MgPSAib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmRpYWxvZ3MuQ29ubmVjdGlvbkRpYWxvZyI7Ci0KLQlwdWJsaWMgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUGFzc3dvcmRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0UGFzc3dvcmQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFBhc3N3b3JkKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUG9wdWxhdGVGcm9tQ29ubmVjdGlvbkFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcm9tcHRDb25uZWN0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXJsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRVcmwoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFVybCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXNlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFVzZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFVzZXIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFBvcHVsYXRlIGZyb20gQ29ubmVjdGlvbiBoeXBlcmxpbmsKLQkJdGhpcy5idWlsZEh5cGVyTGluaygKLQkJCWNvbnRhaW5lciwKLQkJCSJQb3B1bGF0ZSBmcm9tIENvbm5lY3Rpb24uLi4iLAotCQkJYnVpbGRQb3B1bGF0ZUZyb21Db25uZWN0aW9uQWN0aW9uKCkKLQkJKTsKLQotCQkvLyBEcml2ZXIKLQkJbmV3IEpkYmNEcml2ZXJDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBVcmwKLQkJdGhpcy5idWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91cmxMYWJlbCwKLQkJCWJ1aWxkVXJsSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBVc2VyCi0JCXRoaXMuYnVpbGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdXNlckxhYmVsLAotCQkJYnVpbGRVc2VySG9sZGVyKCkKLQkJKTsKLQotCQkvLyBQYXNzd29yZAotCQl0aGlzLmJ1aWxkTGFiZWxlZFBhc3N3b3JkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcGFzc3dvcmRMYWJlbCwKLQkJCWJ1aWxkUGFzc3dvcmRIb2xkZXIoKQotCQkpOwotCi0JCS8vIEJpbmQgUGFyYW1ldGVycwotCQluZXcgSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0Jdm9pZCBwcm9tcHRDb25uZWN0aW9uKCkgewotCi0JCUNvbm5lY3Rpb25TZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbm5lY3Rpb25TZWxlY3Rpb25EaWFsb2coKTsKLQotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUobmFtZSk7Ci0KLQkJQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gc3ViamVjdCgpOwotCQljb25uZWN0aW9uLnNldFVybCgoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVSTCgpKTsKLQkJY29ubmVjdGlvbi5zZXRVc2VyKChjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VXNlck5hbWUoKSk7Ci0JCWNvbm5lY3Rpb24uc2V0UGFzc3dvcmQoKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVc2VyUGFzc3dvcmQoKSk7Ci0JCWNvbm5lY3Rpb24uc2V0RHJpdmVyKChjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0RHJpdmVyQ2xhc3NOYW1lKCkpOwotCX0KLQotCUNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBnZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKSB7Ci0JCS8vIHdlIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBhbnkgY29ubmVjdGlvbiBwcm9maWxlIGFuZCBzaW1wbHkKLQkJLy8gdGFrZSB0aGUgc2V0dGluZ3MgZnJvbSBpdCAodXNlciwgcGFzc3dvcmQsIGV0Yy4pIGFuZCBnaXZlIHRoZW0KLQkJLy8gdG8gdGhlIEVjbGlwc2VMaW5rIGNvbm5lY3Rpb24sIHNvIHdlIGdvCi0JCS8vIHRvIHRoZSBkYiBwbHVnLWluIGRpcmVjdGx5IHRvIGdldCB0aGUgZmFjdG9yeQotCQlyZXR1cm4gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKTsKLQl9Ci0KLQkvLyBicm9hZGVuIGFjY2VzcyBhIGJpdAotCVNoZWxsIHNoZWxsXygpIHsKLQkJcmV0dXJuIHRoaXMuc2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRpYWxvZyBzaG93cyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBjb25uZWN0aW9uIG5hbWVzIGFuZCBsZXRzIHRoZSB1c2VyCi0JICogdGhlIG9wdGlvbiB0byBmaWx0ZXIgdGhlbSB1c2luZyBhIHNlYXJjaCBmaWVsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgQ29ubmVjdGlvblNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIEZpbHRlcmVkSXRlbXNTZWxlY3Rpb25EaWFsb2cgewotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBpbmdTZWxlY3Rpb25EaWFsb2c8L2NvZGU+LgotCQkgKi8KLQkJcHJvdGVjdGVkIENvbm5lY3Rpb25TZWxlY3Rpb25EaWFsb2coKSB7Ci0JCQlzdXBlcihKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUudGhpcy5zaGVsbF8oKSwgZmFsc2UpOwotCQkJc2V0TWVzc2FnZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfTWVzc2FnZSk7Ci0JCQlzZXRUaXRsZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfVGl0bGUpOwotCQkJc2V0TGlzdExhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQkJc2V0RGV0YWlsc0xhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoZWxlbWVudCA9PSBudWxsKSA/ICIiIDogZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRXh0ZW5kZWRDb250ZW50QXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlbXNGaWx0ZXIgY3JlYXRlRmlsdGVyKCkgewotCQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uSXRlbXNGaWx0ZXIoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGVudFByb3ZpZGVyKEFic3RyYWN0Q29udGVudFByb3ZpZGVyIHByb3ZpZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1zRmlsdGVyIGl0ZW1zRmlsdGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCQltb25pdG9yLmJlZ2luVGFzayhudWxsLCAtMSk7Ci0KLQkJCXRyeSB7Ci0JCQkJLy8gQWRkIHRoZSBjb25uZWN0aW9uIG5hbWVzIHRvIHRoZSBkaWFsb2cKLQkJCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCQlwcm92aWRlci5hZGQoc3RyZWFtLm5leHQoKSwgaXRlbXNGaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLnRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuY29ubmVjdGlvblByb2ZpbGVOYW1lcygpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0KLQkJCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IEpwdFVpUGx1Z2luLmdldFBsdWdpbigpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7Ci0KLQkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5hZGROZXdTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7Ci0JCQl9Ci0KLQkJCXJldHVybiBzZXR0aW5nczsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxTdHJpbmc+IGdldEl0ZW1zQ29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgaXRlbTEsIFN0cmluZyBpdGVtMikgewotCQkJCQlyZXR1cm4gaXRlbTEuY29tcGFyZVRvKGl0ZW0yKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlSXRlbShPYmplY3QgaXRlbSkgewotCi0JCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiIiwgbnVsbCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSB0aGUgZmlsdGVyIHJlc3BvbnNpYmxlIHRvIHJlbW92ZSBhbnkgY29ubmVjdGlvbiBuYW1lIGJhc2VkIG9uCi0JCSAqIHRoZSBwYXR0ZXJuIGVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQuCi0JCSAqLwotCQlwcml2YXRlIGNsYXNzIENvbm5lY3Rpb25JdGVtc0ZpbHRlciBleHRlbmRzIEl0ZW1zRmlsdGVyIHsKLQotCQkJLyoqCi0JCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbm5lY3Rpb25JdGVtc0ZpbHRlcjwvY29kZT4uCi0JCQkgKi8KLQkJCUNvbm5lY3Rpb25JdGVtc0ZpbHRlcigpIHsKLQotCQkJCXN1cGVyKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgcGF0dGVybiBpcyBlbXB0eSwgd2Ugc3BlY2lmeSAqIGluIG9yZGVyCi0JCQkJLy8gdG8gc2hvdyBhbGwgdGhlIG1hcHBpbmcgdHlwZXMKLQkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRQYXR0ZXJuKCkpKSB7Ci0JCQkJCXBhdHRlcm5NYXRjaGVyLnNldFBhdHRlcm4oIioiKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW50SXRlbShPYmplY3QgaXRlbSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIG1hdGNoSXRlbShPYmplY3QgaXRlbSkgewotCQkJCXJldHVybiBtYXRjaGVzKGl0ZW0udG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjRHJpdmVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNEcml2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkZGUwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNEcml2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5KcHRFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgSmRiY0RyaXZlckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY0RyaXZlckNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXZlbnRMaXN0ZW5lckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEpkYmNEcml2ZXJDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBDb25uZWN0aW9uPiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPENvbm5lY3Rpb24+IGluaXRpYWxpemVDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxDb25uZWN0aW9uPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgU3RyaW5nPigKLQkJCQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERyaXZlcigpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQl0aGlzLnN1YmplY3Quc2V0RHJpdmVyKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdCgpLmdldERyaXZlcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgbGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2RyaXZlckxhYmVsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLnN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJCUlKYXZhUHJvamVjdCByb290ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpwdEVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRUeXBlKCkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOwotCQkJCQl0aGlzLnN1YmplY3QoKS5zZXREcml2ZXIoY2xhc3NOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YTA3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JcHVibGljIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUsIEJvb2xlYW4+KGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPiBidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkVGl0bGVkUGFuZSgKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDEwKSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KZGJjUHJvcGVydGllc0NvbXBvc2l0ZV9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Qb29sX0dyb3VwQm94Ci0JCSk7Ci0KLQkJbmV3IEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCi0JCWNvbnRhaW5lciA9IGJ1aWxkUGFuZShjb250YWluZXIsIG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQotCQluZXcgSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgSmRiY1dyaXRlQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcihidWlsZFBhbmVFbmFibGVySG9sZGVyKCksIHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGZlNDE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBKZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JcHVibGljIEpkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+IHBhcmVudENvbXBvc2l0ZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5idWlsZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NlY3Rpb25UaXRsZQotCQkpOwotCi0JCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCi0JCWRhdGEgPSAoR3JpZERhdGEpIGdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCi0JCS8vIFJlYWQgQ29ubmVjdGlvbnMgU2hhcmVkCi0JCW5ldyBKZGJjUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gUmVhZCBDb25uZWN0aW9ucyBNaW5pbXVtCi0JCW5ldyBKZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gUmVhZCBDb25uZWN0aW9ucyBNYXhpbXVtCi0JCW5ldyBKZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2E5M2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZENvbnRyb2xVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLQotLyoqCi0gKiBKZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8Q29ubmVjdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZShBYnN0cmFjdFBhbmU8Q29ubmVjdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFJlYWRDb25uZWN0aW9uc01heEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCUludGVnZXIgdmFsdWUgPSBzdWJqZWN0LmdldFJlYWRDb25uZWN0aW9uc01heCgpOwotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSAtMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlID09IC0xKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRSZWFkQ29ubmVjdGlvbnNNYXgodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdFJlYWRDb25uZWN0aW9uc01heEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCAiIikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWF4KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEludGVnZXIuTUlOX1ZBTFVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNYXhMYWJlbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBidWlsZExhYmVsKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRlZmF1bHRXaXRob3V0VmFsdWUKLQkJKTsKLQotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKAotCQkJbmV3IExhYmVsZWRMYWJlbChsYWJlbCksCi0JCQlidWlsZERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNYXhMYWJlbEhvbGRlcigpCi0JCSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWF4TGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFJlYWRDb25uZWN0aW9uc01heEhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSW50ZWdlciB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0V2l0aFZhbHVlLCB2YWx1ZSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuICIiOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IHRoaXMuYnVpbGRMYWJlbGVkU3Bpbm5lcigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWF4TGFiZWwsCi0JCQl0aGlzLmJ1aWxkUmVhZENvbm5lY3Rpb25zTWF4SG9sZGVyKCksCi0JCQktMSwKLQkJCS0xLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFJlYWRDb25uZWN0aW9uc01heExhYmVsKGNvbnRhaW5lcikKLQkJKTsKLQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIsIHNwaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGxheW91dCBvZiB0aGUgZ2l2ZW4gY29udGFpbmVyIGJ5IGNoYW5naW5nIHdoaWNoIHdpZGdldCB3aWxsCi0JICogZ3JhYiB0aGUgZXhjZXNzIG9mIGhvcml6b250YWwgc3BhY2UuIEJ5IGRlZmF1bHQsIHRoZSBjZW50ZXIgY29udHJvbCBncmFicwotCSAqIHRoZSBleGNlc3Mgc3BhY2UsIHdlIGNoYW5nZSBpdCB0byBiZSB0aGUgcmlnaHQgY29udHJvbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBjb250YWluaW5nIHRoZSBjb250cm9scyBuZWVkaW5nIHRoZWlyCi0JICogPGNvZGU+R3JpZERhdGE8L2NvZGU+IHRvIGJlIG1vZGlmaWVkIGZyb20gdGhlIGRlZmF1bHQgdmFsdWVzCi0JICogQHBhcmFtIHNwaW5uZXIgVGhlIHNwaW5uZXIgdGhhdCBnb3QgY3JlYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyLCBTcGlubmVyIHNwaW5uZXIpIHsKLQotCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGUgc3Bpbm5lcidzIHBhcmVudCBpcyBub3QgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkJLy8gbGFiZWwsIHNwaW5uZXIgYW5kIHJpZ2h0IGNvbnRyb2wgKGEgcGFuZSBpcyBzb21ldGltZXMgcmVxdWlyZWQgZm9yCi0JCS8vIHBhaW50aW5nIHRoZSBzcGlubmVyJ3MgYm9yZGVyKQotCQlDb21wb3NpdGUgcGFuZUNvbnRhaW5lciA9IHNwaW5uZXIuZ2V0UGFyZW50KCk7Ci0KLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBwYW5lQ29udGFpbmVyLmdldFBhcmVudCgpKSB7Ci0JCQlwYW5lQ29udGFpbmVyID0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKTsKLQkJfQotCi0JCUNvbnRyb2xbXSBjb250cm9scyA9IHBhbmVDb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWNvbnRyb2xzWzFdLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNvbnRyb2xzWzJdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVBbGlnblJpZ2h0KGNvbnRyb2xzWzJdKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjNWY4OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqIEpkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkUmVhZENvbm5lY3Rpb25zTWluSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJSW50ZWdlciB2YWx1ZSA9IHN1YmplY3QuZ2V0UmVhZENvbm5lY3Rpb25zTWluKCk7Ci0KLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gLTEpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFJlYWRDb25uZWN0aW9uc01pbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWluSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksICIiKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNaW4oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoSW50ZWdlci5NSU5fVkFMVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkRGVmYXVsdFJlYWRDb25uZWN0aW9uc01pbkxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlMYWJlbCBsYWJlbCA9IGJ1aWxkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGVmYXVsdFdpdGhvdXRWYWx1ZQotCQkpOwotCi0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoCi0JCQluZXcgTGFiZWxlZExhYmVsKGxhYmVsKSwKLQkJCWJ1aWxkRGVmYXVsdFJlYWRDb25uZWN0aW9uc01pbkxhYmVsSG9sZGVyKCkKLQkJKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNaW5MYWJlbEhvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXIsIFN0cmluZz4oYnVpbGREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWluSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJbnRlZ2VyIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsIHZhbHVlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy5idWlsZExhYmVsZWRTcGlubmVyKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNNaW5MYWJlbCwKLQkJCXRoaXMuYnVpbGRSZWFkQ29ubmVjdGlvbnNNaW5Ib2xkZXIoKSwKLQkJCS0xLAotCQkJLTEsCi0JCQlJbnRlZ2VyLk1BWF9WQUxVRSwKLQkJCXRoaXMuYnVpbGREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWluTGFiZWwoY29udGFpbmVyKQotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lciwgc3Bpbm5lcik7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgbGF5b3V0IG9mIHRoZSBnaXZlbiBjb250YWluZXIgYnkgY2hhbmdpbmcgd2hpY2ggd2lkZ2V0IHdpbGwKLQkgKiBncmFiIHRoZSBleGNlc3Mgb2YgaG9yaXpvbnRhbCBzcGFjZS4gQnkgZGVmYXVsdCwgdGhlIGNlbnRlciBjb250cm9sIGdyYWJzCi0JICogdGhlIGV4Y2VzcyBzcGFjZSwgd2UgY2hhbmdlIGl0IHRvIGJlIHRoZSByaWdodCBjb250cm9sLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIGNvbnRhaW5pbmcgdGhlIGNvbnRyb2xzIG5lZWRpbmcgdGhlaXIKLQkgKiA8Y29kZT5HcmlkRGF0YTwvY29kZT4gdG8gYmUgbW9kaWZpZWQgZnJvbSB0aGUgZGVmYXVsdCB2YWx1ZXMKLQkgKiBAcGFyYW0gc3Bpbm5lciBUaGUgc3Bpbm5lciB0aGF0IGdvdCBjcmVhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIsIFNwaW5uZXIgc3Bpbm5lcikgewotCi0JCS8vIEl0IGlzIHBvc3NpYmxlIHRoZSBzcGlubmVyJ3MgcGFyZW50IGlzIG5vdCB0aGUgY29udGFpbmVyIG9mIHRoZQotCQkvLyBsYWJlbCwgc3Bpbm5lciBhbmQgcmlnaHQgY29udHJvbCAoYSBwYW5lIGlzIHNvbWV0aW1lcyByZXF1aXJlZCBmb3IKLQkJLy8gcGFpbnRpbmcgdGhlIHNwaW5uZXIncyBib3JkZXIpCi0JCUNvbXBvc2l0ZSBwYW5lQ29udGFpbmVyID0gc3Bpbm5lci5nZXRQYXJlbnQoKTsKLQotCQl3aGlsZSAoY29udGFpbmVyICE9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCkpIHsKLQkJCXBhbmVDb250YWluZXIgPSBwYW5lQ29udGFpbmVyLmdldFBhcmVudCgpOwotCQl9Ci0KLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gcGFuZUNvbnRhaW5lci5nZXRDaGlsZHJlbigpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJY29udHJvbHNbMV0uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY29udHJvbHNbMl0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJlbW92ZUFsaWduUmlnaHQoY29udHJvbHNbMl0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdiNjU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5SZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY1JlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFJlYWRDb25uZWN0aW9uc1NoYXJlZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFJlYWRDb25uZWN0aW9uc1NoYXJlZFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkUmVhZENvbm5lY3Rpb25zU2hhcmVkSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NoYXJlZExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbCwKLQkJCXRoaXMuYnVpbGRSZWFkQ29ubmVjdGlvbnNTaGFyZWRIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRSZWFkQ29ubmVjdGlvbnNTaGFyZWRTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MmM3NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JcHVibGljIEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IHRoaXMuYnVpbGRTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zU2VjdGlvblRpdGxlCi0JCSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29udGFpbmVyLmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0KLQkJZGF0YSA9IChHcmlkRGF0YSkgZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0KLQkJLy8gVGhpcyB3aWxsIGFkZCBzcGFjZSB0byBoYXZlIHRoZSBzYW1lIGxheW91dCB0aGFuIHJlYWQgY29ubmVjdGlvbiBwb29sCi0JCUJ1dHRvbiBzcGFjZSA9IHRoaXMuZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNoZWNrQm94KGNvbnRhaW5lciwgIm0iKTsKLQkJUG9pbnQgc2l6ZSA9IHNwYWNlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWNvbnRhaW5lciA9IHRoaXMuYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgc2l6ZS55ICsgNSk7Ci0JCXNwYWNlLmRpc3Bvc2UoKTsKLQotCQkvLyBXcml0ZSBDb25uZWN0aW9ucyBNaW5pbXVtCi0JCW5ldyBKZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIFdyaXRlIENvbm5lY3Rpb25zIE1heGltdW0KLQkJbmV3IEpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTMzNmFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZShBYnN0cmFjdFBhbmU8Q29ubmVjdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFdyaXRlQ29ubmVjdGlvbnNNYXhIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJSW50ZWdlciB2YWx1ZSA9IHN1YmplY3QuZ2V0V3JpdGVDb25uZWN0aW9uc01heCgpOwotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSAtMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlID09IC0xKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRXcml0ZUNvbm5lY3Rpb25zTWF4KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWF4SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksICIiKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWF4KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEludGVnZXIuTUlOX1ZBTFVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWF4TGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUxhYmVsIGxhYmVsID0gYnVpbGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0V2l0aG91dFZhbHVlCi0JCSk7Ci0KLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcigKLQkJCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpLAotCQkJYnVpbGREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01heExhYmVsSG9sZGVyKCkKLQkJKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWF4TGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNYXhIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGVmYXVsdFdpdGhWYWx1ZSwgdmFsdWUpOwotCQkJCX0KLQotCQkJCXJldHVybiAiIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSB0aGlzLmJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3dyaXRlQ29ubmVjdGlvbnNNYXhMYWJlbCwKLQkJCXRoaXMuYnVpbGRXcml0ZUNvbm5lY3Rpb25zTWF4SG9sZGVyKCksCi0JCQktMSwKLQkJCS0xLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNYXhMYWJlbChjb250YWluZXIpCi0JCSk7Ci0KLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLCBzcGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBsYXlvdXQgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciBieSBjaGFuZ2luZyB3aGljaCB3aWRnZXQgd2lsbAotCSAqIGdyYWIgdGhlIGV4Y2VzcyBvZiBob3Jpem9udGFsIHNwYWNlLiBCeSBkZWZhdWx0LCB0aGUgY2VudGVyIGNvbnRyb2wgZ3JhYnMKLQkgKiB0aGUgZXhjZXNzIHNwYWNlLCB3ZSBjaGFuZ2UgaXQgdG8gYmUgdGhlIHJpZ2h0IGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgY29udGFpbmluZyB0aGUgY29udHJvbHMgbmVlZGluZyB0aGVpcgotCSAqIDxjb2RlPkdyaWREYXRhPC9jb2RlPiB0byBiZSBtb2RpZmllZCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlcwotCSAqIEBwYXJhbSBzcGlubmVyIFRoZSBzcGlubmVyIHRoYXQgZ290IGNyZWF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3Bpbm5lciBzcGlubmVyKSB7Ci0KLQkJLy8gSXQgaXMgcG9zc2libGUgdGhlIHNwaW5uZXIncyBwYXJlbnQgaXMgbm90IHRoZSBjb250YWluZXIgb2YgdGhlCi0JCS8vIGxhYmVsLCBzcGlubmVyIGFuZCByaWdodCBjb250cm9sIChhIHBhbmUgaXMgc29tZXRpbWVzIHJlcXVpcmVkIGZvcgotCQkvLyBwYWludGluZyB0aGUgc3Bpbm5lcidzIGJvcmRlcikKLQkJQ29tcG9zaXRlIHBhbmVDb250YWluZXIgPSBzcGlubmVyLmdldFBhcmVudCgpOwotCi0JCXdoaWxlIChjb250YWluZXIgIT0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKSkgewotCQkJcGFuZUNvbnRhaW5lciA9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlDb250cm9sW10gY29udHJvbHMgPSBwYW5lQ29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQljb250cm9sc1sxXS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljb250cm9sc1syXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlQWxpZ25SaWdodChjb250cm9sc1syXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzOTAzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZENvbnRyb2xVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLQotLyoqCi0gKiBKZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUoQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRXcml0ZUNvbm5lY3Rpb25zTWluSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCUludGVnZXIgdmFsdWUgPSBzdWJqZWN0LmdldFdyaXRlQ29ubmVjdGlvbnNNaW4oKTsKLQotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gLTE7Ci0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0V3JpdGVDb25uZWN0aW9uc01pbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCAiIikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShJbnRlZ2VyLk1JTl9WQUxVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbkxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlMYWJlbCBsYWJlbCA9IGJ1aWxkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGVmYXVsdFdpdGhvdXRWYWx1ZQotCQkpOwotCi0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoCi0JCQluZXcgTGFiZWxlZExhYmVsKGxhYmVsKSwKLQkJCWJ1aWxkRGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNaW5MYWJlbEhvbGRlcigpCi0JCSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbkxhYmVsSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlciwgU3RyaW5nPihidWlsZERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWluSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJbnRlZ2VyIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsIHZhbHVlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy5idWlsZExhYmVsZWRTcGlubmVyKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zTWluTGFiZWwsCi0JCQl0aGlzLmJ1aWxkV3JpdGVDb25uZWN0aW9uc01pbkhvbGRlcigpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJdGhpcy5idWlsZERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWluTGFiZWwoY29udGFpbmVyKQotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lciwgc3Bpbm5lcik7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgbGF5b3V0IG9mIHRoZSBnaXZlbiBjb250YWluZXIgYnkgY2hhbmdpbmcgd2hpY2ggd2lkZ2V0IHdpbGwKLQkgKiBncmFiIHRoZSBleGNlc3Mgb2YgaG9yaXpvbnRhbCBzcGFjZS4gQnkgZGVmYXVsdCwgdGhlIGNlbnRlciBjb250cm9sIGdyYWJzCi0JICogdGhlIGV4Y2VzcyBzcGFjZSwgd2UgY2hhbmdlIGl0IHRvIGJlIHRoZSByaWdodCBjb250cm9sLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIGNvbnRhaW5pbmcgdGhlIGNvbnRyb2xzIG5lZWRpbmcgdGhlaXIKLQkgKiA8Y29kZT5HcmlkRGF0YTwvY29kZT4gdG8gYmUgbW9kaWZpZWQgZnJvbSB0aGUgZGVmYXVsdCB2YWx1ZXMKLQkgKiBAcGFyYW0gc3Bpbm5lciBUaGUgc3Bpbm5lciB0aGF0IGdvdCBjcmVhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIsIFNwaW5uZXIgc3Bpbm5lcikgewotCi0JCS8vIEl0IGlzIHBvc3NpYmxlIHRoZSBzcGlubmVyJ3MgcGFyZW50IGlzIG5vdCB0aGUgY29udGFpbmVyIG9mIHRoZQotCQkvLyBsYWJlbCwgc3Bpbm5lciBhbmQgcmlnaHQgY29udHJvbCAoYSBwYW5lIGlzIHNvbWV0aW1lcyByZXF1aXJlZCBmb3IKLQkJLy8gcGFpbnRpbmcgdGhlIHNwaW5uZXIncyBib3JkZXIpCi0JCUNvbXBvc2l0ZSBwYW5lQ29udGFpbmVyID0gc3Bpbm5lci5nZXRQYXJlbnQoKTsKLQotCQl3aGlsZSAoY29udGFpbmVyICE9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCkpIHsKLQkJCXBhbmVDb250YWluZXIgPSBwYW5lQ29udGFpbmVyLmdldFBhcmVudCgpOwotCQl9Ci0KLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gcGFuZUNvbnRhaW5lci5nZXRDaGlsZHJlbigpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJY29udHJvbHNbMV0uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY29udHJvbHNbMl0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJlbW92ZUFsaWduUmlnaHQoY29udHJvbHNbMl0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL05hdGl2ZVNxbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9OYXRpdmVTcWxDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4OTFjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL05hdGl2ZVNxbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogTmF0aXZlU3FsQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXRpdmVTcWxDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8Q29ubmVjdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5hdGl2ZVNxbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBOYXRpdmVTcWxDb21wb3NpdGUoCi0JCQkJCUFic3RyYWN0UGFuZTw/IGV4dGVuZHMgQ29ubmVjdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROYXRpdmVTcWxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldE5hdGl2ZVNxbCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXROYXRpdmVTcWwodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hdGl2ZVNxbFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkTmF0aXZlU3FsSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0TmF0aXZlU3FsKCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25hdGl2ZVNxbExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9uYXRpdmVTcWxMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9uYXRpdmVTcWxMYWJlbCwKLQkJCXRoaXMuYnVpbGROYXRpdmVTcWxIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGROYXRpdmVTcWxTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL1BlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjMzA1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL1BlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiCi0JZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPENvbm5lY3Rpb24+Ci0JaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbm5lY3Rpb24+IHN1YmplY3RIb2xkZXIsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rQ29ubmVjdGlvbkNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRQYWdlSW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3RpdGxlOwotCX0KLQotCS8vICoqKioqKioqKiogTGF5b3V0ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLmJ1aWxkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL1RyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9UcmFuc2FjdGlvblR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0MzI3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL1RyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPENvbm5lY3Rpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UcmFuc2FjdGlvblR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlciggcGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxDb25uZWN0aW9uLCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q29ubmVjdGlvbiwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFRyYW5zYWN0aW9uVHlwZSh2YWx1ZSk7Ci0KLQkJCQlpZiAodmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMKSB7Ci0JCQkJCWNsZWFySlRBUHJvcGVydGllcygpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2xlYXJSZXNvdXJjZUxvY2FsUHJvcGVydGllcygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJKVEFQcm9wZXJ0aWVzKCkgewotCQlzdWJqZWN0KCkuc2V0SnRhRGF0YVNvdXJjZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJSZXNvdXJjZUxvY2FsUHJvcGVydGllcygpIHsKLQkJQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gc3ViamVjdCgpOwotCQljb25uZWN0aW9uLnNldE5vbkp0YURhdGFTb3VyY2UobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0RHJpdmVyKG51bGwpOwotCQljb25uZWN0aW9uLnNldFVybChudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRVc2VyKG51bGwpOwotCQljb25uZWN0aW9uLnNldFBhc3N3b3JkKG51bGwpOwotCQljb25uZWN0aW9uLnNldEJpbmRQYXJhbWV0ZXJzKG51bGwpOwotCQljb25uZWN0aW9uLnNldFdyaXRlQ29ubmVjdGlvbnNNYXgobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0V3JpdGVDb25uZWN0aW9uc01pbihudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRSZWFkQ29ubmVjdGlvbnNNYXgobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0UmVhZENvbm5lY3Rpb25zTWluKG51bGwpOwotCQljb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc1NoYXJlZChudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3RyYW5zYWN0aW9uVHlwZUxhYmVsLAotCQkJdGhpcy5idWlsZFRyYW5zYWN0aW9uVHlwZUNvbWJvKCBjb250YWluZXIpLAotCQkJbnVsbAkJLy8gVE9ETyBJSnBhSGVscENvbnRleHRJZHMuCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9DdXN0b21pemVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4ZTA5Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5KcHRFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgQ3VzdG9taXplckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9taXplckNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkN1c3RvbWl6ZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDdXN0b21pemVyQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgRW50aXR5Q3VzdG9taXplclByb3BlcnRpZXM+IHBhcmVudFBhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8RW50aXR5Q3VzdG9taXplclByb3BlcnRpZXM+IGluaXRpYWxpemVDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcz4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzLCBTdHJpbmc+KAotCQkJCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlc2NyaXB0b3JDdXN0b21pemVyKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXREZXNjcmlwdG9yQ3VzdG9taXplcih2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9jdXN0b21pemVyTGFiZWw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJCUlKYXZhUHJvamVjdCByb290ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpwdEVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRUeXBlKCkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOwotCQkJCQlzdWJqZWN0KCkuc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoY2xhc3NOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDhiN2ZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlVW5pdEN1c3RvbWl6YXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8Q3VzdG9taXphdGlvbj4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8Q3VzdG9taXphdGlvbj4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU2VjdGlvbiBzZWN0aW9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTik7Ci0JCXNlY3Rpb24uc2V0VGV4dChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25UaXRsZSk7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24pOwotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0aGlzLmJ1aWxkU3ViUGFuZShzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQotCQkvLyBEZWZhdWx0IHBhbmUKLQkJaW50IGdyb3VwQm94TWFyZ2luID0gdGhpcy5ncm91cEJveE1hcmdpbigpOwotCi0JCUNvbXBvc2l0ZSBkZWZhdWx0UGFuZSA9IHRoaXMuYnVpbGRTdWJQYW5lKAotCQkJY29tcG9zaXRlLAotCQkJMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luCi0JCSk7Ci0KLQkJLy8gV2VhdmluZwotCQluZXcgV2VhdmluZ0NvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7Ci0KLQkJLy8gV2VhdmluZyBMYXp5Ci0JCW5ldyBXZWF2aW5nTGF6eUNvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7Ci0KLQkJLy8gV2VhdmluZyBGZXRjaCBHcm91cHMKLQkJbmV3IFdlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7Ci0KLQkJLy8gV2VhdmluZyBDaGFuZ2UgVHJhY2tpbmcKLQkJbmV3IFdlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7Ci0KLQkJLy8gVGhyb3cgRXhjZXB0aW9ucwotCQluZXcgVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKLQotCQkvLyBTZXNzaW9uIEN1c3RvbWl6ZXIKLQkJbmV3IFNlc3Npb25DdXN0b21pemVyQ29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKLQotCQkvLyBFbnRpdGllc0xpc3QKLQkJbmV3IEVudGl0eUxpc3RDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9FbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYmZjYjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9FbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlKEFic3RyYWN0UGFuZTxDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q3VzdG9taXplclByb3BlcnRpZXM+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIEN1c3RvbWl6ZXIKLQkJbmV3IEN1c3RvbWl6ZXJDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9FbnRpdHlDdXN0b21pemVyUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9FbnRpdHlDdXN0b21pemVyUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDYxOWIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vRW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcyBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JcHJpdmF0ZSBDdXN0b21pemF0aW9uIGN1c3RvbWl6YXRpb247Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZW50aXR5TmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSA9IEN1c3RvbWl6YXRpb24uREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZOwotCQotCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPiBjdXN0b21pemF0aW9uSG9sZGVyOwotCVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGRlc2NyaXB0b3JDdXN0b21pemVySG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZGVzY3JpcHRvckN1c3RvbWl6ZXJMaXN0ZW5lcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcyhDdXN0b21pemF0aW9uIGN1c3RvbWl6YXRpb24sIFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbiA9IGN1c3RvbWl6YXRpb247Ci0JCXRoaXMuZW50aXR5TmFtZSA9IGVudGl0eU5hbWU7Ci0JCXRoaXMuY3VzdG9taXphdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4odGhpcy5jdXN0b21pemF0aW9uKTsKLQotCQl0aGlzLmRlc2NyaXB0b3JDdXN0b21pemVySG9sZGVyID0gdGhpcy5idWlsZERlc2NyaXB0b3JDdXN0b21pemVyQUEodGhpcy5jdXN0b21pemF0aW9uSG9sZGVyKTsKLQkJdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplckxpc3RlbmVyID0gdGhpcy5idWlsZERlc2NyaXB0b3JDdXN0b21pemVyQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplckhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplckxpc3RlbmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQlwdWJsaWMgYm9vbGVhbiBlbnRpdHlOYW1lSXNWYWxpZCgpIHsKLQkJcmV0dXJuICFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZW50aXR5TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHlOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIodGhpcy5lbnRpdHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREZXNjcmlwdG9yQ3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXphdGlvbi5nZXREZWZhdWx0RGVzY3JpcHRvckN1c3RvbWl6ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yQ3VzdG9taXplcihTdHJpbmcgZGVzY3JpcHRvckN1c3RvbWl6ZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoKTsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG9sZCwgZGVzY3JpcHRvckN1c3RvbWl6ZXIpKSB7Ci0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoZGVzY3JpcHRvckN1c3RvbWl6ZXIsIHRoaXMuZW50aXR5TmFtZSk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZLCBvbGQsIGRlc2NyaXB0b3JDdXN0b21pemVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0SnBhUHJvamVjdCgpOwotCX0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0b3JDdXN0b21pemVyQUEoUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgU3RyaW5nPigKLQkJCQkJCQkJc3ViamVjdEhvbGRlciwgREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZXNjcmlwdG9yQ3VzdG9taXplcihFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcy50aGlzLmVudGl0eU5hbWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREZXNjcmlwdG9yQ3VzdG9taXplckNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMudGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplckNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVzY3JpcHRvckN1c3RvbWl6ZXJDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQlTdHJpbmcgb2xkID0gKFN0cmluZykgZS5nZXRPbGRWYWx1ZSgpOwotCQlTdHJpbmcgbmV3RGVzY3JpcHRvckN1c3RvbWl6ZXIgPSAoU3RyaW5nKSBlLmdldE5ld1ZhbHVlKCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksIG9sZCwgbmV3RGVzY3JpcHRvckN1c3RvbWl6ZXIpOwotCQlyZXR1cm47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmJ1aWxkU2ltcGxlVG9TdHJpbmdPbih0aGlzLCBzYik7Ci0JCXNiLmFwcGVuZCgiICgiKTsKLQkJdGhpcy50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCgibmFtZTogIik7Ci0JCXNiLmFwcGVuZCh0aGlzLmVudGl0eU5hbWUpOwotCQlzYi5hcHBlbmQoIiwgZGVzY3JpcHRvckN1c3RvbWl6ZXI6ICIpOwotCQlzYi5hcHBlbmQodGhpcy5nZXREZXNjcmlwdG9yQ3VzdG9taXplcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL0VudGl0eUxpc3RDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzRiOGQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5KcHRFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi0vKioKLSAqICBFbnRpdHlMaXN0Q29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlMaXN0Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcz4gZW50aXR5SG9sZGVyOwotCi0JcHVibGljIEVudGl0eUxpc3RDb21wb3NpdGUoQWJzdHJhY3RQYW5lPEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCWVudGl0eUhvbGRlciA9IHRoaXMuYnVpbGRFbnRpdHlIb2xkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmJ1aWxkVGl0bGVkUGFuZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9ncm91cFRpdGxlCi0JCSk7Ci0KLQkJLy8gRW50aXRpZXMgYWRkL3JlbW92ZSBsaXN0IHBhbmUKLQkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEN1c3RvbWl6YXRpb24+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYnVpbGRFbnRpdGllc0FkYXB0ZXIoKSwKLQkJCXRoaXMuYnVpbGRFbnRpdHlDdXN0b21pemF0aW9uTGlzdEhvbGRlcigpLAotCQkJZW50aXR5SG9sZGVyLAotCQkJdGhpcy5idWlsZEVudGl0eUxhYmVsUHJvdmlkZXIoKSwKLQkJCW51bGwJCQkvLwkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DVVNUT01JWkFUSU9OX0VOVElUSUVTCi0JCSk7Ci0KLQkJLy8gRW50aXR5IEN1c3RvbWl6YXRpb24gcHJvcGVydHkgcGFuZQotCQlFbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUgcGFuZSA9IG5ldyBFbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJZW50aXR5SG9sZGVyLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JCXRoaXMuaW5zdGFsbFBhbmVFbmFibGVyKGVudGl0eUhvbGRlciwgcGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZS5BZGFwdGVyIGJ1aWxkRW50aXRpZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZEVudGl0aWVzKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCUN1c3RvbWl6YXRpb24gY3VzdG9taXphdGlvbiA9IHN1YmplY3QoKTsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJRW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMgZW50aXR5Q3VzdG9taXphdGlvbiA9IChFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcykgaXRlbTsKLQkJCQkJY3VzdG9taXphdGlvbi5yZW1vdmVFbnRpdHkoZW50aXR5Q3VzdG9taXphdGlvbi5nZXRFbnRpdHlOYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEVudGl0aWVzKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlJVHlwZSB0eXBlID0gdGhpcy5jaG9vc2VFbnRpdHkoKTsKLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZ2V0RW50aXR5TmFtZSh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJCWlmIChlbnRpdHlOYW1lID09IG51bGwpIHsKLQkJCQllbnRpdHlOYW1lID0gdHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCQkJfQotCQkJCi0JCQlpZiggISB0aGlzLnN1YmplY3QoKS5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpIHsKLQkJCQlTdHJpbmcgZW50aXR5ID0gdGhpcy5zdWJqZWN0KCkuYWRkRW50aXR5KGVudGl0eU5hbWUpOwotCi0JCQkJaW50IGluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2YodGhpcy5zdWJqZWN0KCkuZW50aXRpZXMoKSwgZW50aXR5TmFtZSk7Ci0JCQkJRW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMgaXRlbSA9IChFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcykgbGlzdFNlbGVjdGlvbk1vZGVsLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JCQkJZW50aXR5SG9sZGVyLnNldFZhbHVlKGl0ZW0pOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEVudGl0eU5hbWUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IHN1YmplY3QoKS5wZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQotCQlpZiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCAmJiBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nS2V5KCkgPT0gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpIHsKLQkJCVR5cGVNYXBwaW5nIG1hcHBpbmcgPSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQlpZiAobWFwcGluZyBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXJldHVybiAoKEVudGl0eSltYXBwaW5nKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSVR5cGUgY2hvb3NlRW50aXR5KCkgewotCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHsgcm9vdC5nZXRKYXZhUHJvamVjdCgpIH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKLQkJCQlzaGVsbCgpLAotCQkJCXNlcnZpY2UsCi0JCQkJc2NvcGUsCi0JCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsCi0JCQkJZmFsc2UsCi0JCQkJIiIKLQkJCSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlKTsKLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlKTsKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQotCQl0cnkgewotCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRFbnRpdHlMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzIGVudGl0eUN1c3RvbWl6YXRpb24gPSAoRW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIGVudGl0eUN1c3RvbWl6YXRpb24uZ2V0RW50aXR5TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q3VzdG9taXplclByb3BlcnRpZXM+IGJ1aWxkRW50aXR5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcz4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzPiBidWlsZEVudGl0eUN1c3RvbWl6YXRpb25MaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZywgRW50aXR5Q3VzdG9taXplclByb3BlcnRpZXM+KGJ1aWxkRW50aXRpZXNMaXN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzIHRyYW5zZm9ybUl0ZW0oU3RyaW5nIGl0ZW0pIHsKLQkJCQlyZXR1cm4gbmV3IEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzKHN1YmplY3QoKSwgaXRlbSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRW50aXRpZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIFN0cmluZz4oCi0JCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uRU5USVRJRVNfTElTVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmVudGl0aWVzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5lbnRpdGllc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzPiBlbnRpdHlIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUgcGFuZSkgewotCi0JCW5ldyBQYW5lRW5hYmxlcigKLQkJCXRoaXMuYnVpbGRQYW5lRW5hYmxlckhvbGRlcihlbnRpdHlIb2xkZXIpLAotCQkJcGFuZQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q3VzdG9taXplclByb3BlcnRpZXM+IGVudGl0eUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzLCBCb29sZWFuPihlbnRpdHlIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcyB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5lbnRpdHlOYW1lSXNWYWxpZCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTQ3OTg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWIgCi0JCQkJCQkJCWV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDdXN0b21pemF0aW9uPgotCQkJCQkJCQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQluZXcgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldFBhZ2VJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3RpdGxlOwotCX0KLQotCS8vICoqKioqKioqKiogTGF5b3V0ICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7Ci0JCQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gYnVpbGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1Nlc3Npb25DdXN0b21pemVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1Nlc3Npb25DdXN0b21pemVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzljZWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9TZXNzaW9uQ3VzdG9taXplckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLkpwdEVjbGlwc2VMaW5rVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBTZXNzaW9uQ3VzdG9taXplckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkN1c3RvbWl6ZXJDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8Q3VzdG9taXphdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlc3Npb25DdXN0b21pemVyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvbkN1c3RvbWl6ZXJDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEN1c3RvbWl6YXRpb24+IGluaXRpYWxpemVDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxDdXN0b21pemF0aW9uPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0U2Vzc2lvbkN1c3RvbWl6ZXIoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCi0JCQkJCQlzdWJqZWN0LnNldFNlc3Npb25DdXN0b21pemVyKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTZXNzaW9uQ3VzdG9taXplcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgbGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Nlc3Npb25DdXN0b21pemVyTGFiZWw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJCUlKYXZhUHJvamVjdCByb290ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpwdEVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRUeXBlKCkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOwotCQkJCQlzdWJqZWN0KCkuc2V0U2Vzc2lvbkN1c3RvbWl6ZXIoY2xhc3NOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1Rocm93RXhjZXB0aW9uc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjU3YTFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRocm93RXhjZXB0aW9uc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGhyb3dFeGNlcHRpb25zKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFRocm93RXhjZXB0aW9ucyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGhyb3dFeGNlcHRpb25zU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRUaHJvd0V4Y2VwdGlvbnNIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0JCQkJCUJvb2xlYW4gZGVmYXVsdFZhbHVlID0gc3ViamVjdCgpLmdldERlZmF1bHRUaHJvd0V4Y2VwdGlvbnMoKTsKLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGhyb3dFeGNlcHRpb25zTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsLAotCQkJdGhpcy5idWlsZFRocm93RXhjZXB0aW9uc0hvbGRlcigpLAotCQkJdGhpcy5idWlsZFRocm93RXhjZXB0aW9uc1N0cmluZ0hvbGRlcigpLAotCQkJbnVsbAotLy8JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNVU1RPTUlaQVRJT05fVEhST1dfRVhDRVBUSU9OUwotCQkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1dlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjJiMGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWF2aW5nQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFdlYXZpbmdDaGFuZ2VUcmFja2luZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLldFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFdlYXZpbmdDaGFuZ2VUcmFja2luZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFdlYXZpbmdDaGFuZ2VUcmFja2luZ1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkV2VhdmluZ0NoYW5nZVRyYWNraW5nSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdDaGFuZ2VUcmFja2luZ0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nQ2hhbmdlVHJhY2tpbmdMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nQ2hhbmdlVHJhY2tpbmdMYWJlbCwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DVVNUT01JWkFUSU9OX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9XZWF2aW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1dlYXZpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFiMDc4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1dlYXZpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24uV2VhdmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogV2VhdmluZ0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8Q3VzdG9taXphdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPldlYXZpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFdlYXZpbmdDb21wb3NpdGUoCi0JCQkJCUFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlciggcGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxDdXN0b21pemF0aW9uLCBXZWF2aW5nPiBidWlsZFdlYXZpbmdDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxDdXN0b21pemF0aW9uLCBXZWF2aW5nPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQ3VzdG9taXphdGlvbi5XRUFWSU5HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV2VhdmluZ1tdIGNob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIFdlYXZpbmcudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdlYXZpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFdlYXZpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoV2VhdmluZyB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBXZWF2aW5nQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV2VhdmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFdlYXZpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShXZWF2aW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFdlYXZpbmcodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYWJlbCwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nQ29tYm8oIGNvbnRhaW5lciksCi0JCQludWxsCQkvLyBUT0RPIElKcGFIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1dlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTFmMTgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFdlYXZpbmdMYXp5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0V2VhdmluZ0ZldGNoR3JvdXBzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFdlYXZpbmdGZXRjaEdyb3Vwcyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkV2VhdmluZ0xhenlTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZFdlYXZpbmdMYXp5SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0V2VhdmluZ0xhenkoKTsKLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsLAotCQkJdGhpcy5idWlsZFdlYXZpbmdMYXp5SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkV2VhdmluZ0xhenlTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DVVNUT01JWkFUSU9OX1dFQVZJTkdfRkVUQ0hfR1JPVVBTCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9XZWF2aW5nTGF6eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9XZWF2aW5nTGF6eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2Q0YWRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vV2VhdmluZ0xhenlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBXZWF2aW5nTGF6eUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ0xhenlDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nTGF6eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBXZWF2aW5nTGF6eUNvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRXZWF2aW5nTGF6eUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRXZWF2aW5nTGF6eSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRXZWF2aW5nTGF6eSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkV2VhdmluZ0xhenlTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZFdlYXZpbmdMYXp5SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0V2VhdmluZ0xhenkoKTsKLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsLAotCQkJdGhpcy5idWlsZFdlYXZpbmdMYXp5SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkV2VhdmluZ0xhenlTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DVVNUT01JWkFUSU9OX1dFQVZJTkdfTEFaWQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RkbGdlbi9FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTgwOTYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RkbGdlbi9FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW47Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmRkbGdlbi5FY2xpcHNlTGlua0RETEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW4ud2l6YXJkcy5HZW5lcmF0ZURETFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0RMTEdlbmVyYXRvclVpIGlzIHVzZWQgYnkgdGhlIEVjbGlwc2VMaW5rUGxhdGZvcm1VaSB0byBpbml0aWF0ZSAKLSAqICB0aGUgZXhlY3V0aW9uIG9mIEVjbGlwc2VMaW5rIERETCBnZW5lcmF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpCi17Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvamVjdExvY2F0aW9uOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGUoSnBhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcHJvamVjdExvY2F0aW9uLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJbmV3IEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWkocHJvamVjdCwgcHJvamVjdExvY2F0aW9uLCBzZWxlY3Rpb24pLmdlbmVyYXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaShKcGFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwcm9qZWN0TG9jYXRpb24sIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJdGhpcy5wcm9qZWN0TG9jYXRpb24gPSBwcm9qZWN0TG9jYXRpb247Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGUoKSB7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkubmV4dCgpOyAvLyBUYWtlIHRoZSBmaXJzdCBwZXJzaXN0ZW5jZVVuaXQKLQkJU3RyaW5nIHB1TmFtZSA9IHBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCk7Ci0JCWlmKCAhIHRoaXMuZGlzcGxheUdlbmVyYXRpbmdERExXYXJuaW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJR2VuZXJhdGVERExXaXphcmQgd2l6YXJkID0gbmV3IEdlbmVyYXRlRERMV2l6YXJkKHRoaXMucHJvamVjdCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJaWYod2l6YXJkLmdldFBhZ2VDb3VudCgpID4gMCkgewotCQkJaW50IHJldHVybkNvZGUgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKHJldHVybkNvZGUgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgR2VuZXJhdGVERExSdW5uYWJsZShwdU5hbWUsIHRoaXMucHJvamVjdCwgcHJvamVjdExvY2F0aW9uKTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IAotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU2hlbGwgZ2V0Q3VycmVudFNoZWxsKCkgewotCSAgICByZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRpc3BsYXlHZW5lcmF0aW5nRERMV2FybmluZygpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTLmJpbmQoCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaV9nZW5lcmF0aW5nRERMV2FybmluZ01lc3NhZ2UsCi0JCQlTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiksICAKLQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSArICBTeXN0ZW0uZ2V0UHJvcGVydHkoICJsaW5lLnNlcGFyYXRvciIpKTsKLQkJCQotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCi0JCQl0aGlzLmdldEN1cnJlbnRTaGVsbCgpLCAKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2dlbmVyYXRpbmdERExXYXJuaW5nVGl0bGUsIAotCQkJbWVzc2FnZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBQZXJzaXN0ZW5jZSBVbml0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybSBnZXRQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBnZXRQZXJzaXN0ZW5jZVVuaXRzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZSgpLnBlcnNpc3RlbmNlVW5pdHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3QuZ2V0Um9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBydW5uYWJsZSAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgR2VuZXJhdGVERExSdW5uYWJsZSBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHB1TmFtZTsKLQkJcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IHByb2plY3Q7Ci0JCXByaXZhdGUgIFN0cmluZyBwcm9qZWN0TG9jYXRpb247Ci0KLQkJR2VuZXJhdGVERExSdW5uYWJsZShTdHJpbmcgcHVOYW1lLCBKcGFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwcm9qZWN0TG9jYXRpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnB1TmFtZSA9IHB1TmFtZTsKLQkJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCQl0aGlzLnByb2plY3RMb2NhdGlvbiA9IHByb2plY3RMb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXRyeSB7Ci0JCQkJRWNsaXBzZUxpbmtERExHZW5lcmF0b3IuZ2VuZXJhdGUodGhpcy5wdU5hbWUsIHRoaXMucHJvamVjdCwgdGhpcy5wcm9qZWN0TG9jYXRpb24sIG1vbml0b3IpOwotCQkJfSAKLQkJCWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuOwotCQkJCS8vIGZhbGwgdGhyb3VnaCBhbmQgdGVsbCBtb25pdG9yIHdlIGFyZSBkb25lCi0JCQl9Ci0JCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCVN0cmluZyBtc2cgPSByZS5nZXRNZXNzYWdlKCk7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSAobXNnID09IG51bGwpID8gcmUudG9TdHJpbmcoKSA6IG1zZzsKLQkJCQkKLQkJCQl0aGlzLmxvZ0Vycm9yKG1lc3NhZ2UpOwotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHJlKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQkJdGhpcy5kaXNwbGF5RXJyb3IobWVzc2FnZSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCQotCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsIG5ldyBTdHJpbmcgW10ge21lc3NhZ2V9KTsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksICJFcnJvciIsIG1zZyk7Ci0JCX0KLQotCQlwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlTaGVsbCBzaGVsbCA9IChkaXNwbGF5ID09IG51bGwpID8gbnVsbCA6IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJCWlmIChzaGVsbCA9PSBudWxsICYmIGRpc3BsYXkgIT0gbnVsbCkgewotCQkJCVNoZWxsW10gc2hlbGxzID0gZGlzcGxheS5nZXRTaGVsbHMoKTsKLQkJCQlpZiAoc2hlbGxzLmxlbmd0aCA+IDApCi0JCQkJCXNoZWxsID0gc2hlbGxzWzBdOwotCQkJfQotCQkJcmV0dXJuIHNoZWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGRsZ2VuL3dpemFyZHMvR2VuZXJhdGVERExXaXphcmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RkbGdlbi93aXphcmRzL0dlbmVyYXRlRERMV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNWJlOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGRsZ2VuL3dpemFyZHMvR2VuZXJhdGVERExXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGRsZ2VuLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuRGF0YWJhc2VDb25uZWN0aW9uV2l6YXJkUGFnZTsKLQotLyoqCi0gKiAgR2VuZXJhdGVERExXaXphcmQKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlRERMV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsJCi0KLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCXByaXZhdGUgRGF0YWJhc2VDb25uZWN0aW9uV2l6YXJkUGFnZSBkYlNldHRpbmdzUGFnZTsKLQotCXB1YmxpYyBHZW5lcmF0ZURETFdpemFyZChKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZSgiRERMIEdlbmVyYXRpb24iKTsgIC8vIFRPRE8KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCWlmICh0aGlzLmdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpID09IG51bGwpIHsKLQkJCXRoaXMuZGJTZXR0aW5nc1BhZ2UgPSBuZXcgRGF0YWJhc2VDb25uZWN0aW9uV2l6YXJkUGFnZSh0aGlzLmpwYVByb2plY3QpOwotCQkJdGhpcy5hZGRQYWdlKHRoaXMuZGJTZXR0aW5nc1BhZ2UpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0gICAgICAgIGlmICh0aGlzLmdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpICE9IG51bGwpIHsKLSAgICAgICAgCXJldHVybiB0cnVlOwotICAgICAgICB9Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5kYlNldHRpbmdzUGFnZS5nZXRTZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCWlmIChjcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdGhpcy5zZXRQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGVOYW1lKGNwLmdldE5hbWUoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRiU2V0dGluZ3NQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0gICAgfQotICAgIAotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZU5hbWUoU3RyaW5nIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSkgewotCQl0aGlzLmpwYVByb2plY3QuZ2V0RGF0YVNvdXJjZSgpLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShjb25uZWN0aW9uUHJvZmlsZU5hbWUpOwotCQlKcHRDb3JlUGx1Z2luLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZSh0aGlzLmpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBjb25uZWN0aW9uUHJvZmlsZU5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0VjbGlwc2VMaW5rSmF2YUVudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0VjbGlwc2VMaW5rSmF2YUVudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDFhYTJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9FY2xpcHNlTGlua0phdmFFbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubWFwcGluZ3MuRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuQ2FjaGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLkphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLkphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gRWNsaXBzZUxpbmsgSmF2YSBlbnRpdHkuCi0gKgotICogQHNlZSBFY2xpcHNlTGlua0phdmFFbnRpdHkKLSAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUVudGl0eUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlPEphdmFFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhRW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SmF2YUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFFbnRpdHlDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVDYWNoaW5nUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplUXVlcmllc1BhbmUoY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUluaGVyaXRhbmNlUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplR2VuZXJhdG9yc1BhbmUoY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlc1BhbmUoY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBidWlsZENvbGxhcHNhYmxlU2VjdGlvbigKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDUpLAotCQkJRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXMuRWNsaXBzZUxpbmtKYXZhRW50aXR5Q29tcG9zaXRlX2NhY2hpbmcKLQkJKTsKLQotCQluZXcgQ2FjaGluZ0NvbXBvc2l0ZSh0aGlzLCBidWlsZENhY2hpbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW50aXR5LCBFY2xpcHNlTGlua0NhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVudGl0eSwgRWNsaXBzZUxpbmtDYWNoaW5nPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rSmF2YUVudGl0eSkgdGhpcy5zdWJqZWN0KS5nZXRDYWNoaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JCQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRJbmhlcml0YW5jZUNvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBKYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYzE1ZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLS8qKgotICogRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8TG9nZ2luZz4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPExvZ2dpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNXVC5GTEFUIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OKTsKLQkJc2VjdGlvbi5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VjdGlvblRpdGxlKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29tcG9zaXRlKTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUuZ2V0UGFyZW50KCkpOwotCQkKLQkJLy8gTG9nZ2luZ0xldmVsOgotCQluZXcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0KLQkJLy8gVGltZXN0YW1wOgotCQluZXcgVGltZXN0YW1wQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0KLQkJLy8gVGhyZWFkOgotCQluZXcgVGhyZWFkQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0KLQkJLy8gU2Vzc2lvbjoKLQkJbmV3IFNlc3Npb25Db21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQotCQkvLyBFeGNlcHRpb25zOgotCQluZXcgRXhjZXB0aW9uc0NvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCi0JCS8vIExvZ2dpbmdGaWxlOgotCQluZXcgTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJLy8gTG9nZ2VyOgotCQluZXcgTG9nZ2VyQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlyZXR1cm47Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9FeGNlcHRpb25zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlNmRiYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBFeGNlcHRpb25zQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25zQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxMb2dnaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXhjZXB0aW9uc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFeGNlcHRpb25zQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEV4Y2VwdGlvbnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgTG9nZ2luZy5FWENFUFRJT05TX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEV4Y2VwdGlvbnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0RXhjZXB0aW9ucyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXhjZXB0aW9uc1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRXhjZXB0aW9uc0hvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdEV4Y2VwdGlvbnMoKTsKLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZXhjZXB0aW9uc0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZXhjZXB0aW9uc0xhYmVsLAotCQkJdGhpcy5idWlsZEV4Y2VwdGlvbnNIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRFeGNlcHRpb25zU3RyaW5nSG9sZGVyKCksCi0JCQludWxsCi0vLwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuTE9HR0lOR18KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL0xvZ2dlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9Mb2dnZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkNjBiZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL0xvZ2dlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5sb2dnaW5nOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIExvZ2dlckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPExvZ2dpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Mb2dnZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIExvZ2dlckNvbXBvc2l0ZSgKLQkJCQkJCQkJQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TG9nZ2VySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLkRFRkFVTFRfTE9HR0VSKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIExvZ2dlckNvbXBvc2l0ZS50aGlzLmRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TG9nZ2VyTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHRMb2dnZXJIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhTdHJpbmcgbG9nZ2VyTmFtZSkgewotCi0JCXN3aXRjaCAoTG9nZ2VyLnZhbHVlT2YobG9nZ2VyTmFtZSkpIHsKLQkJCWNhc2UgZGVmYXVsdF9sb2dnZXI6IHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dlckNvbXBvc2l0ZV9kZWZhdWx0X2xvZ2dlcjsKLQkJCX0KLQkJCWNhc2UgamF2YV9sb2dnZXI6IHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dlckNvbXBvc2l0ZV9qYXZhX2xvZ2dlcjsKLQkJCX0KLQkJCWNhc2Ugc2VydmVyX2xvZ2dlcjogewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuTG9nZ2VyQ29tcG9zaXRlX3NlcnZlcl9sb2dnZXI7Ci0JCQl9Ci0JCQlkZWZhdWx0OiB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZExvZ2dlckNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBsb2dnZXIxLCBTdHJpbmcgbG9nZ2VyMikgewotCQkJCWxvZ2dlcjEgPSBidWlsZERpc3BsYXlTdHJpbmcobG9nZ2VyMSk7Ci0JCQkJbG9nZ2VyMiA9IGJ1aWxkRGlzcGxheVN0cmluZyhsb2dnZXIyKTsKLQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGxvZ2dlcjEsIGxvZ2dlcjIpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRMb2dnZXJDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0cnkgewotCQkJCQlMb2dnZXIudmFsdWVPZih2YWx1ZSk7Ci0JCQkJCXZhbHVlID0gYnVpbGREaXNwbGF5U3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIElnbm9yZSBzaW5jZSB0aGUgdmFsdWUgaXMgbm90IGEgTG9nZ2VyCi0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMb2dnZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuTE9HR0VSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0TG9nZ2VyKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gTG9nZ2VyQ29tcG9zaXRlLnRoaXMuZGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZGVmYXVsdFZhbHVlKHN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldExvZ2dlcih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTG9nZ2VyTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRMb2dnZXJMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZExvZ2dlcnNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTG9nZ2VycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPExvZ2dlciwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoTG9nZ2VyLnZhbHVlcygpKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShMb2dnZXIgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMb2dnZXJzQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYnVpbGRMb2dnZXJzKCkpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTG9nZ2Vyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZExvZ2dlcnNDb2xsZWN0aW9uSG9sZGVyKCksCi0JCQlidWlsZExvZ2dlckNvbXBhcmF0b3IoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZShMb2dnaW5nIHN1YmplY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdExvZ2dlcigpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9kZWZhdWx0RW1wdHk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDQ29tYm8gY29tYm8gPSBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2VyTGFiZWwsCi0JCQl0aGlzLmJ1aWxkTG9nZ2VyTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZExvZ2dlckhvbGRlcigpLAotCQkJdGhpcy5idWlsZExvZ2dlckNvbnZlcnRlcigpLAotCQkJbnVsbAkJLy8gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5MT0dHRVJfTkFNRQotCQkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9Mb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMzRjMmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9Mb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb2xkZXJDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIExvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGUgCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPExvZ2dpbmc+Ci17Ci0JcHVibGljIExvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQluZXcgRm9sZGVyQ2hvb3NlclBhbmU8TG9nZ2luZz4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIFN0cmluZz4oCi0JCQkJCQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLkxPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0TG9nRmlsZUxvY2F0aW9uKCk7Ci0JCQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCQkJbmFtZSA9IGRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuYW1lOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJc3ViamVjdC5zZXRMb2dGaWxlTG9jYXRpb24odmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlKExvZ2dpbmcgc3ViamVjdCkgewotCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKTsKLQotCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJCQlkZWZhdWx0VmFsdWUKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2RlZmF1bHRFbXB0eTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaWFsb2dNZXNzYWdlKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlhbG9nVGl0bGUoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Mb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgbGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dpbmdGaWxlTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9Mb2dnaW5nTGV2ZWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvTG9nZ2luZ0xldmVsQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiODYyZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9Mb2dnaW5nTGV2ZWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5sb2dnaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dpbmdMZXZlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogTG9nZ2luZ0xldmVsQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnaW5nTGV2ZWxDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPExvZ2dpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Mb2dnaW5nTGV2ZWxDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIExvZ2dpbmdMZXZlbENvbXBvc2l0ZSgKLQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8TG9nZ2luZywgTG9nZ2luZ0xldmVsPiBidWlsZExvZ2dpbmdMZXZlbENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPExvZ2dpbmcsIExvZ2dpbmdMZXZlbD4odGhpcywgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcuTEVWRUxfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMb2dnaW5nTGV2ZWxbXSBjaG9pY2VzKCkgewotCQkJCXJldHVybiBMb2dnaW5nTGV2ZWwudmFsdWVzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMb2dnaW5nTGV2ZWwgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QoKS5nZXREZWZhdWx0TGV2ZWwoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoTG9nZ2luZ0xldmVsIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgTG9nZ2luZ0xldmVsQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QoKS5nZXRMZXZlbCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKExvZ2dpbmdMZXZlbCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdCgpLnNldExldmVsKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0xldmVsTGFiZWwsCi0JCQkJdGhpcy5idWlsZExvZ2dpbmdMZXZlbENvbWJvKGNvbnRhaW5lciksCi0JCQkJbnVsbCAvLyBUT0RPIElKcGFIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL1BlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmMmM4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL1BlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiCi0JZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPExvZ2dpbmc+Ci0JaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rTG9nZ2luZ0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRQYWdlSW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpdGxlOwotCX0KLQotCS8vICoqKioqKioqKiogTGF5b3V0ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLmJ1aWxkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL1Nlc3Npb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvU2Vzc2lvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWMyMjNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvU2Vzc2lvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFNlc3Npb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25Db21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPExvZ2dpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZXNzaW9uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFNlc3Npb25Db21wb3NpdGUoCi0JCQkJCUFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIExvZ2dpbmc+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2Vzc2lvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLlNFU1NJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U2Vzc2lvbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRTZXNzaW9uKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTZXNzaW9uU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRTZXNzaW9uSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0U2Vzc2lvbigpOwotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0VmFsdWUgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Nlc3Npb25MYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWwsCi0JCQl0aGlzLmJ1aWxkU2Vzc2lvbkhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlc3Npb25TdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5MT0dHSU5HXwotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvVGhyZWFkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL1RocmVhZENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODdjNTMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvVGhyZWFkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhyZWFkQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlYWRDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPExvZ2dpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UaHJlYWRDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGhyZWFkQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRocmVhZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLlRIUkVBRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRUaHJlYWQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0VGhyZWFkKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUaHJlYWRTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZFRocmVhZEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFRocmVhZCgpOwotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0VmFsdWUgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aHJlYWRMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVGhyZWFkSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGhyZWFkU3RyaW5nSG9sZGVyKCksCi0JCQludWxsCi0vLwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuTE9HR0lOR18KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL1RpbWVzdGFtcENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9UaW1lc3RhbXBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0Zjg3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL1RpbWVzdGFtcENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRpbWVzdGFtcENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGltZXN0YW1wQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxMb2dnaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGltZXN0YW1wQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRpbWVzdGFtcENvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaW1lc3RhbXBIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGltZXN0YW1wKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFRpbWVzdGFtcCh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGltZXN0YW1wU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRUaW1lc3RhbXBIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0JCQkJCUJvb2xlYW4gZGVmYXVsdFZhbHVlID0gc3ViamVjdCgpLmdldERlZmF1bHRUaW1lc3RhbXAoKTsKLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGltZXN0YW1wTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpbWVzdGFtcExhYmVsOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpbWVzdGFtcExhYmVsLAotCQkJdGhpcy5idWlsZFRpbWVzdGFtcEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFRpbWVzdGFtcFN0cmluZ0hvbGRlcigpLAotCQkJbnVsbAotLy8JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkxPR0dJTkdfCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbWFwcGluZ3MvRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL21hcHBpbmdzL0VjbGlwc2VMaW5rVWlNYXBwaW5nc01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjljMzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbWFwcGluZ3MvRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubWFwcGluZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBsb2NhbGl6ZWQgc3RyaW5ncyB1c2VkIGJ5IHRoZSBtYXBwaW5nIHBhbmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1VpTWFwcGluZ3NNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVR5cGVDb21wb3NpdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVUeXBlQ29tcG9zaXRlX2Z1bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVUeXBlQ29tcG9zaXRlX3dlYWs7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnRfd2VhazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVR5cGVDb21wb3NpdGVfaGFyZF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hlVHlwZUNvbXBvc2l0ZV9jYWNoZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVR5cGVDb21wb3NpdGVfbm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0phdmFFbnRpdHlDb21wb3NpdGVfY2FjaGluZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVNpemVDb21wb3NpdGVfc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX3NlbmRfb2JqZWN0X2NoYW5nZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX2ludmFsaWRhdGVfY2hhbmdlZF9vYmplY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9zZW5kX25ld19vYmplY3RzX3dpdGhfY2hhbmdlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfbm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGluZ0NvbXBvc2l0ZV9hZHZhbmNlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFsd2F5c1JlZnJlc2hDb21wb3NpdGVfYWx3YXlzUmVmcmVzaExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNhYmxlSGl0c0NvbXBvc2l0ZV9kaXNhYmxlSGl0c0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19jYWNoZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19kYXRhYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfZXhpc3RlbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2Fzc3VtZV9ub25fZXhpc3RlbmNlOwotCQotCQotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoImVjbGlwc2VsaW5rX3VpX21hcHBpbmdzIiwgRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWx3YXlzUmVmcmVzaENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI4YjhiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWx3YXlzUmVmcmVzaENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5tYXBwaW5ncy5FY2xpcHNlTGlua1VpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotCi0vKioKLSAqIFRoaXMgY29tcG9zaXRlIHNpbXBseSBzaG93cyBhIHRyaS1zdGF0ZSBjaGVjayBib3ggZm9yIHRoZSBBbHdheXMgUmVmcmVzaCBvcHRpb24uCi0gKiAKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCi0gKiBAc2VlIENhY2hpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgQWx3YXlzUmVmcmVzaENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8RWNsaXBzZUxpbmtDYWNoaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3B0aW9uYWxDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEFsd2F5c1JlZnJlc2hDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQWx3YXlzUmVmcmVzaEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQWx3YXlzUmVmcmVzaFN0cmluZ0hvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRBbHdheXNSZWZyZXNoSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0QWx3YXlzUmVmcmVzaCgpOwotCi0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0KLQkJCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCQlFY2xpcHNlTGlua1VpTWFwcGluZ3NNZXNzYWdlcy5BbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hEZWZhdWx0LAotCQkJCQkJCWRlZmF1bHRTdHJpbmdWYWx1ZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWFwcGluZ3NNZXNzYWdlcy5BbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlidWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNYXBwaW5nc01lc3NhZ2VzLkFsd2F5c1JlZnJlc2hDb21wb3NpdGVfYWx3YXlzUmVmcmVzaExhYmVsLAotCQkJYnVpbGRBbHdheXNSZWZyZXNoSG9sZGVyKCksCi0JCQlidWlsZEFsd2F5c1JlZnJlc2hTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19BTFdBWVNfUkVGUkVTSAotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJiZDljYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkNhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubWFwcGluZ3MuRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ29vcmRpbmF0aW9uIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIENhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8RWNsaXBzZUxpbmtDYWNoaW5nPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhY2hlVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIENhY2hlQ29vcmRpbmF0aW9uVHlwZT4gYnVpbGRDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEVjbGlwc2VMaW5rQ2FjaGluZywgQ2FjaGVDb29yZGluYXRpb25UeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlQ29vcmRpbmF0aW9uVHlwZVtdIGNob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIENhY2hlQ29vcmRpbmF0aW9uVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGVDb29yZGluYXRpb25UeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKENhY2hlQ29vcmRpbmF0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUVjbGlwc2VMaW5rVWlNYXBwaW5nc01lc3NhZ2VzLmNsYXNzLAotCQkJCQlDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUudGhpcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQ2FjaGVDb29yZGluYXRpb25UeXBlIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUodmFsdWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWFwcGluZ3NNZXNzYWdlcy5DYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfbGFiZWwsCi0JCQlidWlsZENhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbWJvKGNvbnRhaW5lciksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNBQ0hJTkdfQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0NhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYWNoZVNpemVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmMjdjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0NhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubWFwcGluZ3MuRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgU2l6ZTogICAgICAgICAgICAgIHwgSSAgICAgICAgIHxJfCAgRGVmYXVsdCAoWFhYKSAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIENhY2hlU2l6ZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8RWNsaXBzZUxpbmtDYWNoaW5nPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhY2hlU2l6ZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2FjaGVTaXplQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFNpemUgd2lkZ2V0cwotCQlTcGlubmVyIHNpemVTcGlubmVyID0gYnVpbGRMYWJlbGVkU3Bpbm5lcigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNYXBwaW5nc01lc3NhZ2VzLkNhY2hlU2l6ZUNvbXBvc2l0ZV9zaXplLAotCQkJYnVpbGRTaXplSG9sZGVyKCksCi0JCQktMSwKLQkJCS0xLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQlidWlsZERlZmF1bHRTaXplTGFiZWwoY29udGFpbmVyKS8vLAotCQkJLy9UT0RPIEpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0xFTkdUSAotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lciwgc2l6ZVNwaW5uZXIpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2l6ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfU0laRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTcGVjaWZpZWRTaXplKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gLTEpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZFNpemUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0U2l6ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NJWkVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdFNpemUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoSW50ZWdlci5NSU5fVkFMVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkRGVmYXVsdFNpemVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBidWlsZExhYmVsKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRob3V0VmFsdWUKLQkJKTsKLQotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKAotCQkJbmV3IExhYmVsZWRMYWJlbChsYWJlbCksCi0JCQlidWlsZERlZmF1bHRTaXplTGFiZWxIb2xkZXIoKQotCQkpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNpemVMYWJlbEhvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXIsIFN0cmluZz4oYnVpbGREZWZhdWx0U2l6ZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSW50ZWdlciB2YWx1ZSkgewotCi0JCQkJSW50ZWdlciBkZWZhdWx0VmFsdWUgPSAoc3ViamVjdCgpICE9IG51bGwpID8gc3ViamVjdCgpLmdldERlZmF1bHRTaXplKCkgOgotCQkJCQkJCQlFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9TSVpFOwotCi0JCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGVmYXVsdFdpdGhWYWx1ZSwKLQkJCQkJZGVmYXVsdFZhbHVlCi0JCQkJKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBsYXlvdXQgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciBieSBjaGFuZ2luZyB3aGljaCB3aWRnZXQgd2lsbAotCSAqIGdyYWIgdGhlIGV4Y2VzcyBvZiBob3Jpem9udGFsIHNwYWNlLiBCeSBkZWZhdWx0LCB0aGUgY2VudGVyIGNvbnRyb2wgZ3JhYnMKLQkgKiB0aGUgZXhjZXNzIHNwYWNlLCB3ZSBjaGFuZ2UgaXQgdG8gYmUgdGhlIHJpZ2h0IGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgY29udGFpbmluZyB0aGUgY29udHJvbHMgbmVlZGluZyB0aGVpcgotCSAqIDxjb2RlPkdyaWREYXRhPC9jb2RlPiB0byBiZSBtb2RpZmllZCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlcwotCSAqIEBwYXJhbSBzcGlubmVyIFRoZSBzcGlubmVyIHRoYXQgZ290IGNyZWF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3Bpbm5lciBzcGlubmVyKSB7Ci0KLQkJLy8gSXQgaXMgcG9zc2libGUgdGhlIHNwaW5uZXIncyBwYXJlbnQgaXMgbm90IHRoZSBjb250YWluZXIgb2YgdGhlCi0JCS8vIGxhYmVsLCBzcGlubmVyIGFuZCByaWdodCBjb250cm9sIChhIHBhbmUgaXMgc29tZXRpbWVzIHJlcXVpcmVkIGZvcgotCQkvLyBwYWludGluZyB0aGUgc3Bpbm5lcidzIGJvcmRlcikKLQkJQ29tcG9zaXRlIHBhbmVDb250YWluZXIgPSBzcGlubmVyLmdldFBhcmVudCgpOwotCi0JCXdoaWxlIChjb250YWluZXIgIT0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKSkgewotCQkJcGFuZUNvbnRhaW5lciA9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlDb250cm9sW10gY29udHJvbHMgPSBwYW5lQ29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQljb250cm9sc1sxXS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljb250cm9sc1syXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlQWxpZ25SaWdodChjb250cm9sc1syXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYWNoZVR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYWU2OGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYWNoZVR5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLm1hcHBpbmdzLkVjbGlwc2VMaW5rVWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZVR5cGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENhY2hlVHlwZUNvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBDYWNoZVR5cGU+IGJ1aWxkQ2FjaGVUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIENhY2hlVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfVFlQRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gQ2FjaGVUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoZVR5cGUgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoQ2FjaGVUeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXMuY2xhc3MsCi0JCQkJCUNhY2hlVHlwZUNvbXBvc2l0ZS50aGlzLAotCQkJCQl2YWx1ZQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZFR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShDYWNoZVR5cGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNYXBwaW5nc01lc3NhZ2VzLkNhY2hlVHlwZUNvbXBvc2l0ZV9sYWJlbCwKLQkJCWJ1aWxkQ2FjaGVUeXBlQ29tYm8oY29udGFpbmVyKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19DQUNIRV9UWVBFCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYWNoaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0NhY2hpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiYzlkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0NhY2hpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5tYXBwaW5ncy5FY2xpcHNlTGlua1VpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBzaG93cyB0aGUgY2FjaGluZyBvcHRpb25zLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IHggU2hhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgQWx3YXlzUmVmcmVzaENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIFJlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBEaXNhYmxlSGl0c0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHkKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCi0gKiBAc2VlIEVjbGlwc2VMaW5rSmF2YUVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENhY2hlVHlwZUNvbXBvc2l0ZQotICogQHNlZSBBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIFJlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZQotICogQHNlZSBEaXNhYmxlSGl0c0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8RWNsaXBzZUxpbmtDYWNoaW5nPgotewotCi0JcHVibGljIENhY2hpbmdDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAotICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLAotICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvL1NoYXJlZCBDaGVjayBib3gsIHVuY2hlY2sgdGhpcyBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBhbmVsIGlzIGRpc2FibGVkCi0JCWJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgOCksCi0JCQlFY2xpcHNlTGlua1VpTWFwcGluZ3NNZXNzYWdlcy5DYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsLAotCQkJYnVpbGRTaGFyZWRIb2xkZXIoKSwKLQkJCWJ1aWxkU2hhcmVkU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNBQ0hJTkdfU0hBUkVECi0JCSk7Ci0KLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSBidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNik7Ci0KLQkJQ29sbGVjdGlvbjxBYnN0cmFjdFBhbmU8Pz4+IHBhbmVzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFBhbmU8Pz4+KCk7Ci0JCQotCQlwYW5lcy5hZGQobmV3IENhY2hlVHlwZUNvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKSk7Ci0JCXBhbmVzLmFkZChuZXcgQ2FjaGVTaXplQ29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpKTsKLQkJCi0JCS8vIEFkdmFuY2VkIHN1Yi1wYW5lCi0JCUNvbXBvc2l0ZSBhZHZhbmNlZFNlY3Rpb24gPSBidWlsZENvbGxhcHNhYmxlU3ViU2VjdGlvbigKLQkJCXN1YlBhbmUsCi0JCQlFY2xpcHNlTGlua1VpTWFwcGluZ3NNZXNzYWdlcy5DYWNoaW5nQ29tcG9zaXRlX2FkdmFuY2VkLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQotCQkpOwotCi0JCWluaXRpYWxpemVBZHZhbmNlZFBhbmUoYnVpbGRTdWJQYW5lKGFkdmFuY2VkU2VjdGlvbiwgMCwgMTYpLCBwYW5lcyk7Ci0JCQkKLQkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkU2hhcmVkQ2FjaGVFbmFibGVyKCksIHBhbmVzKTsKLQkJCQotCQluZXcgRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUodGhpcywgYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgOCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBDb2xsZWN0aW9uPEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMpIHsKLQkJcGFuZXMuYWRkKG5ldyBBbHdheXNSZWZyZXNoQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcikpOwotCQlwYW5lcy5hZGQobmV3IFJlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQkJcGFuZXMuYWRkKG5ldyBEaXNhYmxlSGl0c0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQkJcGFuZXMuYWRkKG5ldyBDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVFbmFibGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9TSEFSRURfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTaGFyZWQoKTsKLQkJCX0KLQkJfTsKLQl9CQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTaGFyZWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1NIQVJFRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFNoYXJlZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZFNoYXJlZCh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2hhcmVkU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZFNoYXJlZEhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0KLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFNoYXJlZCgpOwotCi0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0KLQkJCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCQlFY2xpcHNlTGlua1VpTWFwcGluZ3NNZXNzYWdlcy5DYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsRGVmYXVsdCwKLQkJCQkJCQlkZWZhdWx0U3RyaW5nVmFsdWUKLQkJCQkJCSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXMuQ2FjaGluZ0NvbXBvc2l0ZV9zaGFyZWRMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Rpc2FibGVIaXRzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Rpc2FibGVIaXRzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDlmNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9EaXNhYmxlSGl0c0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5tYXBwaW5ncy5FY2xpcHNlTGlua1VpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgYSB0cmktc3RhdGUgY2hlY2sgYm94IGZvciB0aGUgRGlzYWJsZSBIaXRzIG9wdGlvbi4KLSAqIAotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNhYmxlSGl0c0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8RWNsaXBzZUxpbmtDYWNoaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3B0aW9uYWxDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERpc2FibGVIaXRzQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERpc2FibGVIaXRzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9ESVNBQkxFX0hJVFNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZERpc2FibGVIaXRzKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREaXNhYmxlSGl0c1N0cmluZ0hvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREaXNhYmxlSGl0c0hvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0KLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdERpc2FibGVIaXRzKCk7Ci0KLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0KLQkJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0VmFsdWUgPyBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDoKLQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQkJCUVjbGlwc2VMaW5rVWlNYXBwaW5nc01lc3NhZ2VzLkRpc2FibGVIaXRzQ29tcG9zaXRlX2Rpc2FibGVIaXRzRGVmYXVsdCwKLQkJCQkJCQlkZWZhdWx0U3RyaW5nVmFsdWUKLQkJCQkJCSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXMuRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlidWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNYXBwaW5nc01lc3NhZ2VzLkRpc2FibGVIaXRzQ29tcG9zaXRlX2Rpc2FibGVIaXRzTGFiZWwsCi0JCQlidWlsZERpc2FibGVIaXRzSG9sZGVyKCksCi0JCQlidWlsZERpc2FibGVIaXRzU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNBQ0hJTkdfRElTQUJMRV9ISVRTCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2ODliYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubWFwcGluZ3MuRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgIAkJCSAgCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgeCBFeGlzdGVuY2UgQ2hlY2tpbmc6ICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgCQkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDIsIDgsIDAsIDAsIDApOwotCQkKLQkJCi0JCWJ1aWxkQ2hlY2tCb3goCi0JCQlzdWJQYW5lLCAKLQkJCUVjbGlwc2VMaW5rVWlNYXBwaW5nc01lc3NhZ2VzLkV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2xhYmVsLCAKLQkJCWJ1aWxkRXhpc3RlbmNlQ2hlY2tpbmdIb2xkZXIoKSk7Ci0JCQotCQkKLQkJYnVpbGRFeGlzdGVuY2VDaGVja2luZ1R5cGVDb21ibyhzdWJQYW5lKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFeGlzdGVuY2VUeXBlPiBidWlsZEV4aXN0ZW5jZUNoZWNraW5nVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFeGlzdGVuY2VUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEV4aXN0ZW5jZVR5cGVbXSBjaG9pY2VzKCkgewotCQkJCXJldHVybiBFeGlzdGVuY2VUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFeGlzdGVuY2VUeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEV4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlFY2xpcHNlTGlua1VpTWFwcGluZ3NNZXNzYWdlcy5jbGFzcywKLQkJCQkJRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUudGhpcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFeGlzdGVuY2VUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEV4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRXhpc3RlbmNlQ2hlY2tpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuRVhJU1RFTkNFX0NIRUNLSU5HX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuaGFzRXhpc3RlbmNlQ2hlY2tpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFeGlzdGVuY2VDaGVja2luZyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9SZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5OWU2Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5tYXBwaW5ncy5FY2xpcHNlTGlua1VpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgYSB0cmktc3RhdGUgY2hlY2sgYm94IGZvciB0aGUgUmVmcmVzaCBPbmx5IElmIE5ld2VyIG9wdGlvbi4KLSAqIAotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9wdGlvbmFsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFJlZnJlc2hPbmx5SWZOZXdlclN0cmluZ0hvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCi0JCQkJCUJvb2xlYW4gZGVmYXVsdFZhbHVlID0gc3ViamVjdCgpLmdldERlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX1RydWUgOgotCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCi0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJRWNsaXBzZUxpbmtVaU1hcHBpbmdzTWVzc2FnZXMuUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlX3JlZnJlc2hPbmx5SWZOZXdlckRlZmF1bHQsCi0JCQkJCQkJZGVmYXVsdFN0cmluZ1ZhbHVlCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNYXBwaW5nc01lc3NhZ2VzLlJlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlidWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNYXBwaW5nc01lc3NhZ2VzLlJlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJMYWJlbCwKLQkJCWJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VySG9sZGVyKCksCi0JCQlidWlsZFJlZnJlc2hPbmx5SWZOZXdlclN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DQUNISU5HX1JFRlJFU0hfT05MWV9JRl9ORVdFUgotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwYjg1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotLyoqCi0gKiBFY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxPcHRpb25zPgotewotCXB1YmxpYyBFY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGUoCi0JCQkJCUFic3RyYWN0Rm9ybVBhbmU8T3B0aW9ucz4gc3ViamVjdEhvbGRlciwgCi0JCQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04pOwotCQlzZWN0aW9uLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZWN0aW9uVGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSk7Ci0KLQkJbmV3IFNlc3Npb25OYW1lQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0KLQkJbmV3IFNlc3Npb25zWG1sQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQluZXcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCW5ldyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCW5ldyBFdmVudExpc3RlbmVyQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQluZXcgSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlyZXR1cm47Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9FdmVudExpc3RlbmVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL0V2ZW50TGlzdGVuZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3ZGNhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL0V2ZW50TGlzdGVuZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5KcHRFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRXZlbnRMaXN0ZW5lckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRXZlbnRMaXN0ZW5lckNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxPcHRpb25zPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXZlbnRMaXN0ZW5lckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEV2ZW50TGlzdGVuZXJDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPE9wdGlvbnM+IGluaXRpYWxpemVDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxPcHRpb25zPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPigKLQkJCQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5TRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFdmVudExpc3RlbmVyKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRFdmVudExpc3RlbmVyKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdCgpLmdldEV2ZW50TGlzdGVuZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9ldmVudExpc3RlbmVyTGFiZWw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IHRoaXMuc3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCQkJSUphdmFQcm9qZWN0IHJvb3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0KLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gcm9vdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpWzBdOwotCQkJCX0KLQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJSnB0RWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByb21wdFR5cGUoKSB7Ci0JCQkJSVR5cGUgdHlwZSA9IGNob29zZVR5cGUoKTsKLQotCQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJyk7Ci0JCQkJCXRoaXMuc3ViamVjdCgpLnNldEV2ZW50TGlzdGVuZXIoY2xhc3NOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzM3MjU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPE9wdGlvbnM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5JbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0JCQkJCUJvb2xlYW4gZGVmYXVsdFZhbHVlID0gc3ViamVjdCgpLmdldERlZmF1bHRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKTsKLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsLAotCQkJdGhpcy5idWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlcigpLAotCQkJdGhpcy5idWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc1N0cmluZ0hvbGRlcigpLAotCQkJbnVsbAotLy8JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLgotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL1BlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmE0YjJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIKLQlleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8T3B0aW9ucz4KLQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gc3ViamVjdEhvbGRlciwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtPcHRpb25zQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldFBhZ2VJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGl0bGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMYXlvdXQgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYnVpbGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvU2Vzc2lvbk5hbWVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvU2Vzc2lvbk5hbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExNDhiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL1Nlc3Npb25OYW1lQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBTZXNzaW9uTmFtZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbk5hbWVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlc3Npb25OYW1lQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTZXNzaW9uTmFtZUNvbXBvc2l0ZSgKLQkJCQkJCQkJQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2Vzc2lvbk5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OX05BTUUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gU2Vzc2lvbk5hbWVDb21wb3NpdGUudGhpcy5kZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25OYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHRTZXNzaW9uTmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2Vzc2lvbk5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0U2Vzc2lvbk5hbWUoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBTZXNzaW9uTmFtZUNvbXBvc2l0ZS50aGlzLmRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRTZXNzaW9uTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlKE9wdGlvbnMgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0U2Vzc2lvbk5hbWUoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdEVtcHR5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25OYW1lLAotCQkJdGhpcy5idWlsZERlZmF1bHRTZXNzaW9uTmFtZUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRTZXNzaW9uTmFtZUhvbGRlcigpLAotCQkJbnVsbAkJLy8gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy4KLQkJKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL1Nlc3Npb25zWG1sQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL1Nlc3Npb25zWG1sQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NTk2YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9TZXNzaW9uc1htbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2Vzc2lvbnNYbWxDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25zWG1sQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPE9wdGlvbnM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZXNzaW9uc1htbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvbnNYbWxDb21wb3NpdGUoCi0JCQkJCQkJCUFic3RyYWN0UGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OU19YTUwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gU2Vzc2lvbnNYbWxDb21wb3NpdGUudGhpcy5kZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTlNfWE1MX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0U2Vzc2lvbnNYbWwoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBTZXNzaW9uc1htbENvbXBvc2l0ZS50aGlzLmRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRTZXNzaW9uc1htbCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlKE9wdGlvbnMgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0U2Vzc2lvbnNYbWwoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdEVtcHR5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25zWG1sLAotCQkJdGhpcy5idWlsZERlZmF1bHRTZXNzaW9uc1htbEZpbGVOYW1lTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKSwKLQkJCW51bGwJCS8vIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuCi0JCSk7Ci0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTBiZDU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwub3B0aW9uczsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucy5UYXJnZXREYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPE9wdGlvbnM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUoCi0JCQkJCQkJCUFic3RyYWN0UGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFRhcmdldERhdGFiYXNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLkRFRkFVTFRfVEFSR0VUX0RBVEFCQVNFKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlLnRoaXMuZGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRUYXJnZXREYXRhYmFzZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0VGFyZ2V0RGF0YWJhc2VIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhTdHJpbmcgdGFyZ2V0RGF0YWJhc2VOYW1lKSB7Ci0JCQotCQlyZXR1cm4gU1dUVXRpbC5idWlsZERpc3BsYXlTdHJpbmcoCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsIAotCQkJdGhpcy5nZXRDbGFzcygpLCAKLQkJCVRhcmdldERhdGFiYXNlLnZhbHVlT2YodGFyZ2V0RGF0YWJhc2VOYW1lKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRUYXJnZXREYXRhYmFzZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyB0YXJnZXREYXRhYmFzZTEsIFN0cmluZyB0YXJnZXREYXRhYmFzZTIpIHsKLQkJCQl0YXJnZXREYXRhYmFzZTEgPSBidWlsZERpc3BsYXlTdHJpbmcodGFyZ2V0RGF0YWJhc2UxKTsKLQkJCQl0YXJnZXREYXRhYmFzZTIgPSBidWlsZERpc3BsYXlTdHJpbmcodGFyZ2V0RGF0YWJhc2UyKTsKLQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKHRhcmdldERhdGFiYXNlMSwgdGFyZ2V0RGF0YWJhc2UyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0cnkgewotCQkJCQlUYXJnZXREYXRhYmFzZS52YWx1ZU9mKHZhbHVlKTsKLQkJCQkJdmFsdWUgPSBidWlsZERpc3BsYXlTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlIHNpbmNlIHRoZSB2YWx1ZSBpcyBub3QgYSBUYXJnZXREYXRhYmFzZQotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0VGFyZ2V0RGF0YWJhc2UoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZS50aGlzLmRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRUYXJnZXREYXRhYmFzZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VMaXN0SG9sZGVyKCkgewotCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkRGVmYXVsdFRhcmdldERhdGFiYXNlTGlzdEhvbGRlcigpKTsKLQkJaG9sZGVycy5hZGQoYnVpbGRUYXJnZXREYXRhYmFzZXNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VGFyZ2V0RGF0YWJhc2UsIFN0cmluZz4oQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKFRhcmdldERhdGFiYXNlLnZhbHVlcygpKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShUYXJnZXREYXRhYmFzZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlc0NvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigKLQkJCUNvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGJ1aWxkVGFyZ2V0RGF0YWJhc2VzKCkpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkVGFyZ2V0RGF0YWJhc2VzQ29sbGVjdGlvbkhvbGRlcigpLAotCQkJYnVpbGRUYXJnZXREYXRhYmFzZUNvbXBhcmF0b3IoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZShPcHRpb25zIHN1YmplY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdFRhcmdldERhdGFiYXNlKCk7Ci0KLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9kZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZQotCQkJKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRFbXB0eTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUNDb21ibyBjb21ibyA9IGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90YXJnZXREYXRhYmFzZUxhYmVsLAotCQkJdGhpcy5idWlsZFRhcmdldERhdGFiYXNlTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFRhcmdldERhdGFiYXNlSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGFyZ2V0RGF0YWJhc2VDb252ZXJ0ZXIoKSwKLQkJCW51bGwJCS8vIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuVEFSR0VUX0RBVEFCQVNFX05BTUUKLQkJKTsKLQotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvVGFyZ2V0U2VydmVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL1RhcmdldFNlcnZlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGQ4Y2YzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvVGFyZ2V0U2VydmVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5vcHRpb25zOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcHRpb25zLlRhcmdldFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFRhcmdldFNlcnZlckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0U2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPE9wdGlvbnM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYXJnZXRTZXJ2ZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRhcmdldFNlcnZlckNvbXBvc2l0ZSgKLQkJCQkJCQkJQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0VGFyZ2V0U2VydmVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLkRFRkFVTFRfVEFSR0VUX1NFUlZFUikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBUYXJnZXRTZXJ2ZXJDb21wb3NpdGUudGhpcy5kZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFRhcmdldFNlcnZlckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0VGFyZ2V0U2VydmVySG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoU3RyaW5nIHRhcmdldFNlcnZlck5hbWUpIHsKLQkJCi0JCXJldHVybiBTV1RVdGlsLmJ1aWxkRGlzcGxheVN0cmluZygKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgCi0JCQl0aGlzLmdldENsYXNzKCksIAotCQkJVGFyZ2V0U2VydmVyLnZhbHVlT2YodGFyZ2V0U2VydmVyTmFtZSkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHRhcmdldFNlcnZlcjEsIFN0cmluZyB0YXJnZXRTZXJ2ZXIyKSB7Ci0JCQkJdGFyZ2V0U2VydmVyMSA9IGJ1aWxkRGlzcGxheVN0cmluZyh0YXJnZXRTZXJ2ZXIxKTsKLQkJCQl0YXJnZXRTZXJ2ZXIyID0gYnVpbGREaXNwbGF5U3RyaW5nKHRhcmdldFNlcnZlcjIpOwotCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGFyZ2V0U2VydmVyMSwgdGFyZ2V0U2VydmVyMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFRhcmdldFNlcnZlckNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQkJCXRyeSB7Ci0JCQkJCVRhcmdldFNlcnZlci52YWx1ZU9mKHZhbHVlKTsKLQkJCQkJdmFsdWUgPSBidWlsZERpc3BsYXlTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlIHNpbmNlIHRoZSB2YWx1ZSBpcyBub3QgYSBUYXJnZXRTZXJ2ZXIKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldFNlcnZlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5UQVJHRVRfU0VSVkVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0VGFyZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gVGFyZ2V0U2VydmVyQ29tcG9zaXRlLnRoaXMuZGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZGVmYXVsdFZhbHVlKHN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFRhcmdldFNlcnZlcih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRUYXJnZXRTZXJ2ZXJMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZFRhcmdldFNlcnZlcnNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRhcmdldFNlcnZlciwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoVGFyZ2V0U2VydmVyLnZhbHVlcygpKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShUYXJnZXRTZXJ2ZXIgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUYXJnZXRTZXJ2ZXJzQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYnVpbGRUYXJnZXRTZXJ2ZXJzKCkpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZFRhcmdldFNlcnZlcnNDb2xsZWN0aW9uSG9sZGVyKCksCi0JCQlidWlsZFRhcmdldFNlcnZlckNvbXBhcmF0b3IoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZShPcHRpb25zIHN1YmplY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdFRhcmdldFNlcnZlcigpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9kZWZhdWx0RW1wdHk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDQ29tYm8gY29tYm8gPSBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGFyZ2V0U2VydmVyTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVGFyZ2V0U2VydmVyTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFRhcmdldFNlcnZlckhvbGRlcigpLAotCQkJdGhpcy5idWlsZFRhcmdldFNlcnZlckNvbnZlcnRlcigpLAotCQkJbnVsbAkJLy8gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5UQVJHRVRfU0VSVkVSX05BTUUKLQkJKTsKLQotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2V4bWwvZGV0YWlscy9FY2xpcHNlTGlua05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MDFlZGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2V4bWwvZGV0YWlscy9FY2xpcHNlTGlua05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2V4bWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotCi0vKioKLSAqIEVjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQlleHRlbmRzIEdlbmVyaWNOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL0VjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL0VjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTAzZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2V4bWwvZGV0YWlscy9FY2xpcHNlTGlua05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNleG1sLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JZXh0ZW5kcyBHZW5lcmljTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLXsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvUGVyc2lzdGVuY2VEZXRhaWxzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvUGVyc2lzdGVuY2VEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjMGI4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL1BlcnNpc3RlbmNlRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNleG1sLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUGVyc2lzdGVuY2VEZXRhaWxzUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlRGV0YWlsc1Byb3ZpZGVyIGltcGxlbWVudHMgSnBhRGV0YWlsc1Byb3ZpZGVyCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlRGV0YWlsc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkRGV0YWlsc1BhZ2UoCi0JCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJCQkJCU9iamVjdCBjb250ZW50Tm9kZUlkLAotCQkJCQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCWlmIChjb250ZW50Tm9kZUlkID09IFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOQ0VfSUQpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnROb2RlSWQgPT0gUGVyc2lzdGVuY2VTdHJ1Y3R1cmVOb2Rlcy5QRVJTSVNURU5DRV9VTklUX0lEKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sRGV0YWlsc1BhZ2UocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGZpbGVDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL1BlcnNpc3RlbmNlWG1sRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvUGVyc2lzdGVuY2VYbWxEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzRjNmViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvUGVyc2lzdGVuY2VYbWxEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZXhtbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RKcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlWG1sRGV0YWlsc1BhZ2UKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sRGV0YWlsc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdEpwYURldGFpbHNQYWdlPFBlcnNpc3RlbmNlVW5pdD4KLXsKLQotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbERldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVUkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1VSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzZlMmVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1VSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5FY2xpcHNlTGlua0pwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFVaUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW4uRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2V4bWwuZGV0YWlscy5QZXJzaXN0ZW5jZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5iYXNlLkJhc2VKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBFY2xpcHNlTGlua1BsYXRmb3JtVUkKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VSSBleHRlbmRzIEJhc2VKcGFQbGF0Zm9ybVVpCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VSSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKiogbmF2aWdhdG9yIGNvbnRlbnQgKioqKioqKioqCi0JcHVibGljIEpwYU5hdmlnYXRvclByb3ZpZGVyIGJ1aWxkTmF2aWdhdG9yUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pwYVVpRmFjdG9yeSBjcmVhdGVKcGFVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKcGFVaUZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVEREwoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotCQlTdHJpbmcgcHJvamVjdExvY2F0aW9uID0gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkKLQkJRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaS5nZW5lcmF0ZShwcm9qZWN0LCBwcm9qZWN0TG9jYXRpb24sIHNlbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheU5vdFN1cHBvcnRlZE1lc3NhZ2UoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlTdHJpbmcgZm9ybWF0dGVkTWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsIG1lc3NhZ2UpOwotCQlTaGVsbCBjdXJyZW50U2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihjdXJyZW50U2hlbGwsIHRpdGxlLCBmb3JtYXR0ZWRNZXNzYWdlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oQ29sbGVjdGlvbjxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlzdXBlci5hZGREZXRhaWxzUHJvdmlkZXJzVG8ocHJvdmlkZXJzKTsKLQkJcHJvdmlkZXJzLmFkZChuZXcgUGVyc2lzdGVuY2VEZXRhaWxzUHJvdmlkZXIoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyc1RvKAotCQkJCQkJCUxpc3Q8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBwcm92aWRlcnMpIHsKLQkJc3VwZXIuYWRkSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyc1RvKHByb3ZpZGVycyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVR5cGVNYXBwaW5nVWlQcm92aWRlcnNUbygKLQkJCQkJCQlMaXN0PFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBwcm92aWRlcnMpIHsKLQkJc3VwZXIuYWRkSmF2YVR5cGVNYXBwaW5nVWlQcm92aWRlcnNUbyhwcm92aWRlcnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlNWM0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua05hdmlnYXRvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2V4bWwuZGV0YWlscy5FY2xpcHNlTGlua05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZXhtbC5kZXRhaWxzLkVjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXIgaW1wbGVtZW50cyBKcGFOYXZpZ2F0b3JQcm92aWRlcgotewotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL0NyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZjE1OWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUoCi0JCQkJCQkJCUFic3RyYWN0UGFuZTw/IGV4dGVuZHMgU2NoZW1hR2VuZXJhdGlvbj4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQ1JFQVRFX0ZJTEVfTkFNRSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS50aGlzLmRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0Q3JlYXRlRGRsRmlsZU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDcmVhdGVEZGxGaWxlTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U2NoZW1hR2VuZXJhdGlvbiwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgU2NoZW1hR2VuZXJhdGlvbi5DUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0Q3JlYXRlRmlsZU5hbWUoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS50aGlzLmRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRDcmVhdGVGaWxlTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlKFNjaGVtYUdlbmVyYXRpb24gc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0Q3JlYXRlRmlsZU5hbWUoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdEVtcHR5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2NyZWF0ZURkbEZpbGVOYW1lTGFiZWwsCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdENyZWF0ZURkbEZpbGVOYW1lTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCksCi0JCQludWxsCQkvLyBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNSRUFURV9ERExfRklMRV9OQU1FCi0JCSk7Ci0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjMzcwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9sZGVyQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIERkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxTY2hlbWFHZW5lcmF0aW9uPgotewotCXB1YmxpYyBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBTY2hlbWFHZW5lcmF0aW9uPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQluZXcgRm9sZGVyQ2hvb3NlclBhbmU8U2NoZW1hR2VuZXJhdGlvbj4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIFN0cmluZz4oCi0JCQkJCQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0QXBwbGljYXRpb25Mb2NhdGlvbigpOwotCQkJCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQkJCW5hbWUgPSBkZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbmFtZTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmIChkZWZhdWx0VmFsdWUoc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXN1YmplY3Quc2V0QXBwbGljYXRpb25Mb2NhdGlvbih2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWUoU2NoZW1hR2VuZXJhdGlvbiBzdWJqZWN0KSB7Ci0JCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdEFwcGxpY2F0aW9uTG9jYXRpb24oKTsKLQotCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJCQlkZWZhdWx0VmFsdWUKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRFbXB0eTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaWFsb2dNZXNzYWdlKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaWFsb2dUaXRsZSgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dUaXRsZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uTG9jYXRpb25MYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhNWU1OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLkRkbEdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUoCi0JCQkJCUFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIFNjaGVtYUdlbmVyYXRpb24+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8U2NoZW1hR2VuZXJhdGlvbiwgRGRsR2VuZXJhdGlvblR5cGU+IGJ1aWxkRGRsR2VuZXJhdGlvblR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxTY2hlbWFHZW5lcmF0aW9uLCBEZGxHZW5lcmF0aW9uVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERkbEdlbmVyYXRpb25UeXBlW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRGRsR2VuZXJhdGlvblR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERkbEdlbmVyYXRpb25UeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0KCkuZ2V0RGVmYXVsdERkbEdlbmVyYXRpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKERkbEdlbmVyYXRpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEZGxHZW5lcmF0aW9uVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0KCkuZ2V0RGRsR2VuZXJhdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShEZGxHZW5lcmF0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdCgpLnNldERkbEdlbmVyYXRpb25UeXBlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGRsR2VuZXJhdGlvblR5cGVMYWJlbCwKLQkJCWJ1aWxkRGRsR2VuZXJhdGlvblR5cGVDb21ibyggY29udGFpbmVyKSwKLQkJCW51bGwJCS8vIFRPRE8gSUpwYUhlbHBDb250ZXh0SWRzLgotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL0Ryb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NmNlMzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIERyb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Ecm9wRGRsRmlsZU5hbWVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERyb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZSgKLQkJCQkJCQkJQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBTY2hlbWFHZW5lcmF0aW9uPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0RHJvcERkbEZpbGVOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRFJPUF9GSUxFX05BTUUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlLnRoaXMuZGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHREcm9wRGRsRmlsZU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdERyb3BEZGxGaWxlTmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRHJvcERkbEZpbGVOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkRST1BfRklMRV9OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0RHJvcEZpbGVOYW1lKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlLnRoaXMuZGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlLnRoaXMuZGVmYXVsdFZhbHVlKHN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldERyb3BGaWxlTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlKFNjaGVtYUdlbmVyYXRpb24gc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0RHJvcEZpbGVOYW1lKCk7Ci0KLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZQotCQkJKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRFbXB0eTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUNDb21ibyBjb21ibyA9IGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kcm9wRGRsRmlsZU5hbWVMYWJlbCwKLQkJCXRoaXMuYnVpbGREZWZhdWx0RHJvcERkbEZpbGVOYW1lTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZERyb3BEZGxGaWxlTmFtZUhvbGRlcigpLAotCQkJbnVsbAkJLy8gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5EUk9QX0RETF9GSUxFX05BTUUKLQkJKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9FY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTM0ODNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxTY2hlbWFHZW5lcmF0aW9uPgotewotCXB1YmxpYyBFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb25Db21wb3NpdGUoCi0JCQkJCUFic3RyYWN0Rm9ybVBhbmU8U2NoZW1hR2VuZXJhdGlvbj4gc3ViamVjdEhvbGRlciwKLQkJCQkJQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBidWlsZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3NlY3Rpb25UaXRsZSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uCi0JCSk7Ci0KLQkJLy8gRERMIEdlbmVyYXRpb24gVHlwZToKLQkJbmV3IERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCS8vIE91dHB1dCBNb2RlOgotCQluZXcgT3V0cHV0TW9kZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQkvLyBEREwgR2VuZXJhdGlvbiBMb2NhdGlvbgotCQluZXcgRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCS8vIENyZWF0ZSBEREwgRmlsZSBOYW1lOgotCQluZXcgQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJLy8gRHJvcCBEREwgRmlsZSBOYW1lOgotCQluZXcgRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL091dHB1dE1vZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL091dHB1dE1vZGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmYWMyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9PdXRwdXRNb2RlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uT3V0cHV0TW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIE91dHB1dE1vZGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIE91dHB1dE1vZGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PdXRwdXRNb2RlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPdXRwdXRNb2RlQ29tcG9zaXRlKAotCQkJCUFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIFNjaGVtYUdlbmVyYXRpb24+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxTY2hlbWFHZW5lcmF0aW9uLCBPdXRwdXRNb2RlPiBidWlsZE91dHB1dE1vZGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxTY2hlbWFHZW5lcmF0aW9uLCBPdXRwdXRNb2RlPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE91dHB1dE1vZGVbXSBjaG9pY2VzKCkgewotCQkJCXJldHVybiBPdXRwdXRNb2RlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPdXRwdXRNb2RlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0KCkuZ2V0RGVmYXVsdE91dHB1dE1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoT3V0cHV0TW9kZSB2YWx1ZSkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkRGlzcGxheVN0cmluZyhFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsIE91dHB1dE1vZGVDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPdXRwdXRNb2RlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QoKS5nZXRPdXRwdXRNb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT3V0cHV0TW9kZSB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdCgpLnNldE91dHB1dE1vZGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9vdXRwdXRNb2RlTGFiZWwsCi0JCQkJdGhpcy5idWlsZE91dHB1dE1vZGVDb21ibyhjb250YWluZXIpLAotCQkJCW51bGwgLy8gVE9ETyBJSnBhSGVscENvbnRleHRJZHMuCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjYzQ0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiCi0JZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci0JaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldFBhZ2VJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfdGl0bGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyNTc0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTZkZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLWphdmFDb21waWxlci4uLmFyZ3MuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJkNTA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZ2VuPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTVmZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjEyOjA3IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMWQ1MGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjI4OjU0IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWIwZDgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmdlbgotQnVuZGxlLVZlcnNpb246IDEuMS4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjEuMSwyLjAuMCkiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTgzN2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0ZTA0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5nZW4iPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5nZW4iIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODc1YThiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IAotIyAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBFbnRpdHkgR2VuCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9wcm9wZXJ0eV9maWxlcy9qcHRfZ2VuLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3Byb3BlcnR5X2ZpbGVzL2pwdF9nZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlODkwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3Byb3BlcnR5X2ZpbGVzL2pwdF9nZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1QYWNrYWdlR2VuZXJhdG9yX3Rhc2tOYW1lPUdlbmVyYXRlIEVudGl0aWVzCi1HZW5TY29wZV90YXNrTmFtZT1CdWlsZCBEYXRhYmFzZSBNb2RlbAotRW50aXR5R2VuZXJhdG9yX3Rhc2tOYW1lPUdlbmVyYXRlIEVudGl0eTogezB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0VudGl0eUdlblRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0VudGl0eUdlblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZjU5NWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9FbnRpdHlHZW5Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5OYW1lVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzIGZvciBlbnRpdHkgZ2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUdlblRvb2xzIHsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAoZGF0YWJhc2UpIGlkZW50aWZpZXIgdG8gYSB1bmlxdWUgIkphdmEgc3R5bGUiCi0JICogY2xhc3MgbmFtZS4KLQkgKiBAc2VlICNjb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVJZGVudGlmaWVyKFN0cmluZywgYm9vbGVhbiwgQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoU3RyaW5nIGlkZW50aWZpZXIsIENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVJZGVudGlmaWVyKGlkZW50aWZpZXIsIHRydWUsIGNsYXNzTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAoZGF0YWJhc2UpIGlkZW50aWZpZXIgdG8gYSB1bmlxdWUgIkphdmEgc3R5bGUiCi0JICogYXR0cmlidXRlIChmaWVsZC9wcm9wZXJ0eSkgbmFtZS4KLQkgKiBAc2VlICNjb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVJZGVudGlmaWVyKFN0cmluZywgYm9vbGVhbiwgQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKFN0cmluZyBpZGVudGlmaWVyLCBDb2xsZWN0aW9uPFN0cmluZz4gYXR0cmlidXRlTmFtZXMpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoaWRlbnRpZmllciwgZmFsc2UsIGF0dHJpYnV0ZU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgKGRhdGFiYXNlKSBpZGVudGlmaWVyIHRvIGEgdW5pcXVlICJKYXZhIHN0eWxlIgotCSAqIGlkZW50aWZpZXI6Ci0JICogICAgIC0gaWYgdGhlIGlkZW50aWZpZXIgaXMgYWxsLWNhcHMsIGNvbnZlcnQgdW5kZXJzY29yZXMgdG8gImNhbWVsIGNhc2UiCi0JICogICAgIC0gaWYgdGhlIGlkZW50aWZpZXIgaXMgbm90IGFsbC1jYXBzLCBsZWF2ZSBpdCB1bmNoYW5nZWQgKGV4Y2VwdCwgcG9zc2libHksIGZvciB0aGUgZmlyc3QgbGV0dGVyKQotCSAqICAgICAtIGNvbnZlcnQgdG8gYSBsZWdhbCBKYXZhIGlkZW50aWZpZXIKLQkgKiAgICAgICAgIC0gZWxpbWluYXRlIGlsbGVnYWwgY2hhcmFjdGVycwotCSAqICAgICAgICAgLSBpZiB0aGUgcmVzdWx0IGlzIGEgcmVzZXJ2ZWQgd29yZCwgbW9kaWZ5IGl0IHNsaWdodGx5Ci0JICogSWYgdGhlIHJlc3VsdCBpcyBhbHJlYWR5IG9uZSBvZiB0aGUgc3BlY2lmaWVkIGV4aXN0aW5nIGlkZW50aWZpZXJzCi0JICogKGlnbm9yaW5nIGNhc2Ugc28gd2UgZG9uJ3QgaGF2ZSBmaWxlbmFtZSBjb2xsaXNpb25zIG9uIFdpbmRvd3MpLAotCSAqIG1vZGlmeSBpdCBzbGlnaHRseSBhZ2Fpbi4KLQkgKiAgICAgIkZPTyIgPT4gIkZvbyIgb3IgImZvbyIKLQkgKiAgICAgIkZPT19CQVIiID0+ICJGb29CYXIiIG9yICJmb29CYXIiCi0JICogICAgICJQQUNLQUdFIiA9PiAiUGFja2FnZSIgb3IgInBhY2thZ2VfIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gaWRlbnRpZmllcnMpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IGlkZW50aWZpZXI7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShyZXN1bHQpKSB7Ci0JCQkvLyBsZWF2ZSBtaXhlZCBjYXNlIGlkZW50aWZpZXJzIGFsb25lPwotCQkJcmVzdWx0ID0gU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UocmVzdWx0LCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpOwotCQl9IGVsc2UgewotCQkJaWYgKGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQkJCXJlc3VsdCA9IFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUocmVzdWx0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplKHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmVzdWx0ID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKHJlc3VsdCk7Ci0JCS8vIGFzc3VtZSB0aGF0IGNvbnZlcnRpbmcgdG8gYSB1bmlxdWUgbmFtZSB3aWxsIG5vdCByZXN1bHQgaW4gYSBKYXZhIHJlc2VydmVkIHdvcmQKLQkJLy8gKHNpbmNlIG5vIEphdmEgcmVzZXJ2ZWQgd29yZHMgZW5kIHdpdGggYSBudW1iZXIpCi0JCXJlc3VsdCA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShyZXN1bHQsIGlkZW50aWZpZXJzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEVudGl0eUdlblRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvRW50aXR5R2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0VudGl0eUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWM0MzQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvRW50aXR5R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJvb2xlYW5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSW5kZW50aW5nUHJpbnRXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vLyBUT0RPIGZvcm1hdCBnZW5lcmF0ZWQgY29kZSBwZXIgcHJlZmVyZW5jZXMKLS8vIFRPRE8gb3JnYW5pemUgZ2VuZXJhdGVkIGltcG9ydHMgcGVyIHByZWZlcmVuY2VzCi0vKioKLSAqIFRoaXMgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgYW4gZW50aXR5IGZvciBhIHRhYmxlLgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5R2VuZXJhdG9yIHsKLQlmaW5hbCBDb25maWcgY29uZmlnOwotCXByaXZhdGUgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQ7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBnZW5UYWJsZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBlbnRpdHlDbGFzc05hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGtDbGFzc05hbWU7Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQlzdGF0aWMgdm9pZCBnZW5lcmF0ZUVudGl0eSgKLQkJCUNvbmZpZyBjb25maWcsCi0JCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCwKLQkJCUdlblRhYmxlIGdlblRhYmxlLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IKLQkpIHsKLQkJaWYgKChjb25maWcgPT0gbnVsbCkgfHwgKHBhY2thZ2VGcmFnbWVudCA9PSBudWxsKSB8fCAoZ2VuVGFibGUgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCW5ldyBFbnRpdHlHZW5lcmF0b3IoY29uZmlnLCBwYWNrYWdlRnJhZ21lbnQsIGdlblRhYmxlKS5nZW5lcmF0ZUVudGl0eShwcm9ncmVzc01vbml0b3IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEVudGl0eUdlbmVyYXRvcihDb25maWcgY29uZmlnLCBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCwgR2VuVGFibGUgZ2VuVGFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMucGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50OwotCQl0aGlzLmdlblRhYmxlID0gZ2VuVGFibGU7Ci0JCXRoaXMuZW50aXR5Q2xhc3NOYW1lID0gdGhpcy5mdWxseVF1YWxpZnkodGhpcy5nZXRFbnRpdHlOYW1lKCkpOwotCQl0aGlzLnBrQ2xhc3NOYW1lID0gdGhpcy5lbnRpdHlDbGFzc05hbWUgKyAnLicgKyBjb25maWcuZ2V0UHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2RlIGdlbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVFbnRpdHkoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuZ2VuZXJhdGVFbnRpdHlfKHByb2dyZXNzTW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRW50aXR5XyhJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQocHJvZ3Jlc3NNb25pdG9yLCB0aGlzLmJ1aWxkVGFza05hbWUoKSwgMTAwKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gdGhpcy5nZXRFbnRpdHlOYW1lKCkgKyAiLmphdmEiOyAgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc291cmNlID0gdGhpcy5idWlsZFNvdXJjZSgpOwotCQlzbS53b3JrZWQoMjApOwotCQl0cnkgewotCQkJdGhpcy5wYWNrYWdlRnJhZ21lbnQuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGZpbGVOYW1lLCBzb3VyY2UsIGZhbHNlLCBzbS5uZXdDaGlsZCg0MCkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRKYXZhTW9kZWxTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTikgewotCQkJCWlmICh0aGlzLmNvbmZpZy5nZXRPdmVyd3JpdGVDb25maXJtZXIoKS5vdmVyd3JpdGUodGhpcy5lbnRpdHlDbGFzc05hbWUpKSB7Ci0JCQkJCXRoaXMucGFja2FnZUZyYWdtZW50LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmaWxlTmFtZSwgc291cmNlLCB0cnVlLCBzbS5uZXdDaGlsZCg0MCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCX0KLQkJc20uc2V0V29ya1JlbWFpbmluZygwKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFRhc2tOYW1lKCkgewotCQlyZXR1cm4gTkxTLmJpbmQoSnB0R2VuTWVzc2FnZXMuRW50aXR5R2VuZXJhdG9yX3Rhc2tOYW1lLCB0aGlzLmdldEVudGl0eU5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgdGhlICJib2R5IiBzb3VyY2UgZmlyc3Q7IHRoZW4gYnVpbGQgdGhlICJwYWNrYWdlIiBhbmQgImltcG9ydHMiIHNvdXJjZQotCSAqIGFuZCBjb25jYXRlbmF0ZSB0aGUgImJvZHkiIHNvdXJjZSB0byBpdAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGJ1aWxkU291cmNlKCkgewotCQkvLyBidWlsZCB0aGUgYm9keSBzb3VyY2UgZmlyc3Qgc28gd2UgY2FuIGdhdGhlciB1cCB0aGUgaW1wb3J0IHN0YXRlbWVudHMKLQkJQm9keVNvdXJjZSBib2R5U291cmNlID0gdGhpcy5idWlsZEJvZHlTb3VyY2UoKTsKLQotCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKGJvZHlTb3VyY2UubGVuZ3RoKCkgKyAyMDAwKTsKLQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCQl0aGlzLnByaW50UGFja2FnZUFuZEltcG9ydHNPbihwdywgYm9keVNvdXJjZSk7Ci0JCXB3LnByaW50KGJvZHlTb3VyY2UuZ2V0U291cmNlKCkpOwotCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIEJvZHlTb3VyY2UgYnVpbGRCb2R5U291cmNlKCkgewotCQlFbnRpdHlTb3VyY2VXcml0ZXIgcHcgPSBuZXcgRW50aXR5U291cmNlV3JpdGVyKHRoaXMuZ2V0UGFja2FnZU5hbWUoKSwgdGhpcy5lbnRpdHlDbGFzc05hbWUpOwotCQl0aGlzLnByaW50Qm9keVNvdXJjZU9uKHB3KTsKLQkJcmV0dXJuIHB3OwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEJvZHlTb3VyY2VPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJdGhpcy5wcmludENsYXNzRGVjbGFyYXRpb25Pbihwdyk7Ci0KLQkJcHcuaW5kZW50KCk7Ci0JCQl0aGlzLnByaW50RW50aXR5UHJpbWFyeUtleUZpZWxkc09uKHB3KTsKLQkJCXRoaXMucHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50RW50aXR5TWFueVRvT25lRmllbGRzT24ocHcpOwotCQkJdGhpcy5wcmludEVudGl0eU9uZVRvTWFueUZpZWxkc09uKHB3KTsKLQkJCXRoaXMucHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50RW50aXR5Tm9uT3duZWRNYW55VG9NYW55RmllbGRzT24ocHcpOwotCQkJdGhpcy5wcmludFNlcmlhbFZlcnNpb25VSURGaWVsZE9uKHB3KTsKLQkJCXB3LnByaW50bG4oKTsKLQotCQkJdGhpcy5wcmludFplcm9Bcmd1bWVudENvbnN0cnVjdG9yT24odGhpcy5nZXRFbnRpdHlOYW1lKCksIHRoaXMuY29uZmlnLmdldE1ldGhvZFZpc2liaWxpdHlDbGF1c2UoKSwgcHcpOwotCQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpIHx8IHRoaXMuY29uZmlnLmdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMoKSkgewotCQkJCXRoaXMucHJpbnRFbnRpdHlQcmltYXJ5S2V5UHJvcGVydGllc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljUHJvcGVydGllc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW50aXR5TWFueVRvT25lUHJvcGVydGllc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW50aXR5T25lVG9NYW55UHJvcGVydGllc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW50aXR5T3duZWRNYW55VG9NYW55UHJvcGVydGllc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW50aXR5Tm9uT3duZWRNYW55VG9NYW55UHJvcGVydGllc09uKHB3KTsKLQkJCX0KLQotCQkJaWYgKHRoaXMucHJpbWFyeUtleUNsYXNzSXNSZXF1aXJlZCgpKSB7Ci0JCQkJdGhpcy5wcmludFByaW1hcnlLZXlDbGFzc09uKHB3KTsKLQkJCX0KLQkJcHcudW5kZW50KCk7Ci0KLQkJcHcucHJpbnQoJ30nKTsKLQkJcHcucHJpbnRsbigpOyAgLy8gRU9GCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsYXNzIGRlY2xhcmF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBwcmludENsYXNzRGVjbGFyYXRpb25PbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJdGhpcy5wcmludEVudGl0eUFubm90YXRpb25Pbihwdyk7Ci0JCXRoaXMucHJpbnRUYWJsZUFubm90YXRpb25Pbihwdyk7Ci0JCXRoaXMucHJpbnRJZENsYXNzQW5ub3RhdGlvbk9uKHB3KTsKLQotCQlwdy5wcmludCgicHVibGljIGNsYXNzICIpOyAgLy8kTk9OLU5MUy0xJAotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLmVudGl0eUNsYXNzTmFtZSk7Ci0JCWlmIChjb25maWcuc2VyaWFsaXphYmxlKCkpIHsKLQkJCXB3LnByaW50KCIgaW1wbGVtZW50cyAiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKFNlcmlhbGl6YWJsZS5jbGFzcy5nZXROYW1lKCkpOwotCQl9Ci0JCXB3LnByaW50KCIgeyIpOyAgLy8kTk9OLU5MUy0xJAotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5QW5ub3RhdGlvbk9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oSlBBLkVOVElUWSk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRUYWJsZUFubm90YXRpb25PbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIHRhYmxlTmFtZSA9IHRoaXMuY29uZmlnLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKHRoaXMuZ2V0RW50aXR5TmFtZSgpLCB0aGlzLmdldFRhYmxlKCkpOwotCQlpZiAodGFibGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsgIC8vIHRoZSBkZWZhdWx0IHRhYmxlIG5hbWUgaXMgT0sKLQkJfQotCQlwdy5wcmludEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJcHcucHJpbnQoIihuYW1lPSIpOyAgLy8kTk9OLU5MUy0xJAotCQlwdy5wcmludFN0cmluZ0xpdGVyYWwodGFibGVOYW1lKTsKLQkJcHcucHJpbnQoJyknKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludElkQ2xhc3NBbm5vdGF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICh0aGlzLnByaW1hcnlLZXlDbGFzc0lzUmVxdWlyZWQoKSAmJiB0aGlzLmNvbmZpZy5nZW5lcmF0ZUlkQ2xhc3NGb3JDb21wb3VuZFBLKCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSURfQ0xBU1MpOwotCQkJcHcucHJpbnQoJygnKTsKLQkJCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKHRoaXMucGtDbGFzc05hbWUpOwotCQkJcHcucHJpbnQoIi5jbGFzcykiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBmaWVsZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5UHJpbWFyeUtleUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy5wcmltYXJ5S2V5Q2xhc3NJc1JlcXVpcmVkKCkgJiYgdGhpcy5jb25maWcuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlGaWVsZE9uKHB3KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlSZWFkT25seVByaW1hcnlLZXlGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50RW50aXR5V3JpdGFibGVQcmltYXJ5S2V5RmllbGRzT24ocHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlGaWVsZE9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy5jb25maWcuZmllbGRBY2Nlc3NUeXBlKCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuRU1CRURERURfSUQpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JCXRoaXMucHJpbnRGaWVsZE9uKHRoaXMuZ2VuVGFibGUuZ2V0QXR0cmlidXRlTmFtZUZvckVtYmVkZGVkSWQoKSwgdGhpcy5wa0NsYXNzTmFtZSwgcHcpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVJlYWRPbmx5UHJpbWFyeUtleUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50UHJpbWFyeUtleUZpZWxkc09uKHB3LCB0cnVlLCB0cnVlKTsgIC8vIHRydWU9cmVhZC1vbmx5OyB0cnVlPXByaW50IElEIGFubm90YXRpb24gb24gZmllbGRzCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5V3JpdGFibGVQcmltYXJ5S2V5RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRQcmltYXJ5S2V5RmllbGRzT24ocHcsIGZhbHNlLCB0cnVlKTsgIC8vIGZhbHNlPXdyaXRhYmxlOyB0cnVlPXByaW50IElEIGFubm90YXRpb24gb24gZmllbGRzCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdywgYm9vbGVhbiByZWFkT25seSwgYm9vbGVhbiBwcmludElkQW5ub3RhdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5wcmltYXJ5S2V5Q29sdW1ucyhyZWFkT25seSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludFByaW1hcnlLZXlGaWVsZE9uKHN0cmVhbS5uZXh0KCksIHB3LCByZWFkT25seSwgcHJpbnRJZEFubm90YXRpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxDb2x1bW4+IHByaW1hcnlLZXlDb2x1bW5zKGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJcmV0dXJuIHJlYWRPbmx5ID8gdGhpcy5nZW5UYWJsZS5yZWFkT25seVByaW1hcnlLZXlDb2x1bW5zKCkgOiB0aGlzLmdlblRhYmxlLndyaXRhYmxlUHJpbWFyeUtleUNvbHVtbnMoKTsKLQl9Ci0KLQkvLyBUT0RPIGlmIHRoZSBmaWVsZCdzIHR5cGUgaXMgamF2YS51dGlsL3NxbC5EYXRlLCBpdCBuZWVkcyBAVGVtcG9yYWwoREFURSkKLQkvLyBUT0RPIGlmIHRoZSBwcmltYXJ5IGtleSBpcyBhdXRvLWdlbmVyYXRlZCwgdGhlIGZpZWxkIG11c3QgYmUgYW4gaW50ZWdyYWwgdHlwZQotCXByaXZhdGUgdm9pZCBwcmludFByaW1hcnlLZXlGaWVsZE9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdywgYm9vbGVhbiByZWFkT25seSwgYm9vbGVhbiBwcmludElkQW5ub3RhdGlvbikgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKGNvbHVtbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJaWYgKHByaW50SWRBbm5vdGF0aW9uKSB7Ci0JCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJfQotCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSB0aGlzLmNvbmZpZy5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLmJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUoZmllbGROYW1lLCBjb2x1bW4pOwotCQkJaWYgKHJlYWRPbmx5KSB7Ci0JCQkJdGhpcy5wcmludFJlYWRPbmx5Q29sdW1uQW5ub3RhdGlvbk9uKGNvbHVtbk5hbWUsIHB3KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5wcmludENvbHVtbkFubm90YXRpb25Pbihjb2x1bW5OYW1lLCBwdyk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5wcmludEZpZWxkT24oZmllbGROYW1lLCBjb2x1bW4uZ2V0UHJpbWFyeUtleUphdmFUeXBlRGVjbGFyYXRpb24oKSwgcHcpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlYWRPbmx5Q29sdW1uQW5ub3RhdGlvbk9uKFN0cmluZyBjb2x1bW5OYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQlwdy5wcmludCgnKCcpOwotCQlpZiAoY29sdW1uTmFtZSAhPSBudWxsKSB7Ci0JCQlwdy5wcmludCgibmFtZT0iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50U3RyaW5nTGl0ZXJhbChjb2x1bW5OYW1lKTsKLQkJCXB3LnByaW50KCIsICIpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXB3LnByaW50KCJpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UpIik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmFzaWMgZmllbGRzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vblByaW1hcnlLZXlCYXNpY0ZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5ub25QcmltYXJ5S2V5QmFzaWNDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU5vblByaW1hcnlLZXlCYXNpY0ZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljRmllbGRPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZ2V0QXR0cmlidXRlTmFtZUZvcihjb2x1bW4pOwotCQlpZiAodGhpcy5jb25maWcuZmllbGRBY2Nlc3NUeXBlKCkpIHsKLQkJCVN0cmluZyBjb2x1bW5OYW1lID0gdGhpcy5jb25maWcuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS5idWlsZENvbHVtbkFubm90YXRpb25OYW1lKGZpZWxkTmFtZSwgY29sdW1uKTsKLQkJCXRoaXMucHJpbnRDb2x1bW5Bbm5vdGF0aW9uT24oY29sdW1uTmFtZSwgcHcpOwotCQl9Ci0JCWlmIChjb2x1bW4uZGF0YVR5cGVJc0xPQigpKSB7Ci0JCQlwdy5wcmludEFubm90YXRpb24oSlBBLkxPQik7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQkJdGhpcy5wcmludEZpZWxkT24oZmllbGROYW1lLCBjb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpLCBwdyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Q29sdW1uQW5ub3RhdGlvbk9uKFN0cmluZyBjb2x1bW5OYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKGNvbHVtbk5hbWUgIT0gbnVsbCkgeyAgLy8gdGhlIGNvbHVtbiBuYW1lIGlzIG51bGwgaWYgdGhlIGRlZmF1bHQgaXMgT0sKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCXB3LnByaW50KCIobmFtZT0iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50U3RyaW5nTGl0ZXJhbChjb2x1bW5OYW1lKTsKLQkJCXB3LnByaW50KCcpJyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFueS10by1vbmUgZmllbGRzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU1hbnlUb09uZUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPE1hbnlUb09uZVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm1hbnlUb09uZVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlNYW55VG9PbmVGaWVsZE9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU1hbnlUb09uZUZpZWxkT24oTWFueVRvT25lUmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLmZpZWxkQWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50TWFueVRvT25lQW5ub3RhdGlvbk9uKGZpZWxkTmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCQl0aGlzLnByaW50RmllbGRPbihmaWVsZE5hbWUsIHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLmdldFJlZmVyZW5jZWRFbnRpdHlOYW1lKCkpLCBwdyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50TWFueVRvT25lQW5ub3RhdGlvbk9uKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBNYW55VG9PbmVSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlwdy5wcmludGxuKCk7Ci0JCUZvcmVpZ25LZXkgZm9yZWlnbktleSA9IHJlbGF0aW9uLmdldEZvcmVpZ25LZXkoKTsKLQkJaWYgKGZvcmVpZ25LZXkucmVmZXJlbmNlc1NpbmdsZUNvbHVtblByaW1hcnlLZXkoKSkgewotCQkJLy8gaWYgdGhlIEZLIHJlZmVyZW5jZXMgYSBzaW5nbGUtY29sdW1uIFBLLCAncmVmZXJlbmNlZENvbHVtbk5hbWUnIGlzIG5vdCByZXF1aXJlZAotCQkJU3RyaW5nIGpvaW5Db2x1bW5OYW1lID0gdGhpcy5jb25maWcuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS5idWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShhdHRyaWJ1dGVOYW1lLCBmb3JlaWduS2V5KTsKLQkJCWlmIChqb2luQ29sdW1uTmFtZSA9PSBudWxsKSB7Ci0JCQkJLy8gbm8gSm9pbkNvbHVtbiBhbm5vdGF0aW9uIG5lZWRlZDogdGhlIGRlZmF1bHQgJ25hbWUnIGFuZCAncmVmZXJlbmNlZENvbHVtbk5hbWUnIHdvcmsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBqb2luIGNvbHVtbiBoZXJlIChqdXN0IG5vdCB0aGUgZGVmYXVsdCBuYW1lKQotCQkJCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKGpvaW5Db2x1bW5OYW1lLCBudWxsLCBwdyk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5wcmludE1hbnlUb09uZUpvaW5Db2x1bW5zQW5ub3RhdGlvbk9uKGZvcmVpZ25LZXksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludE1hbnlUb09uZUpvaW5Db2x1bW5zQW5ub3RhdGlvbk9uKEZvcmVpZ25LZXkgZm9yZWlnbktleSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmIChmb3JlaWduS2V5LmNvbHVtblBhaXJzU2l6ZSgpID4gMSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTlMpOwotCQkJcHcucHJpbnQoIih7Iik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJfQotCQl0aGlzLnByaW50Sm9pbkNvbHVtbkFubm90YXRpb25zT24oZm9yZWlnbktleSwgcHcpOwotCQlpZiAoZm9yZWlnbktleS5jb2x1bW5QYWlyc1NpemUoKSA+IDEpIHsKLQkJCXB3LnVuZGVudCgpOwotCQkJcHcucHJpbnRsbigpOwotCQkJcHcucHJpbnQoIn0pIik7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uc09uKEZvcmVpZ25LZXkgZm9yZWlnbktleSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Rm9yZWlnbktleS5Db2x1bW5QYWlyPiBzdHJlYW0gPSBmb3JlaWduS2V5LmNvbHVtblBhaXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQlwdy5wcmludGxuKCcsJyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKEZvcmVpZ25LZXkuQ29sdW1uUGFpciBjb2x1bW5QYWlyLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJdGhpcy5wcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uT24oCi0JCQl0aGlzLmNvbmZpZy5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLmJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpKSwKLQkJCXRoaXMuY29uZmlnLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCkpLAotCQkJcHcKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiAnYmFzZUNvbHVtbk5hbWUnIGNhbm5vdCBiZSBudWxsOwotCSAqICdyZWZlcmVuY2VkQ29sdW1uTmFtZScgaXMgbnVsbCB3aGVuIHRoZSBkZWZhdWx0IGlzIGFwcGxpY2FibGUgKGkuZS4gdGhlCi0JICogcmVmZXJlbmNlZCBjb2x1bW4gaXMgdGhlIHNpbmdsZS1jb2x1bW4gcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZQotCSAqIHJlZmVyZW5jZWQgdGFibGUpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50Sm9pbkNvbHVtbkFubm90YXRpb25PbihTdHJpbmcgYmFzZUNvbHVtbk5hbWUsIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwotCQlwdy5wcmludCgiKG5hbWU9Iik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50U3RyaW5nTGl0ZXJhbChiYXNlQ29sdW1uTmFtZSk7Ci0KLQkJaWYgKHJlZmVyZW5jZWRDb2x1bW5OYW1lICE9IG51bGwpIHsKLQkJCXB3LnByaW50KCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnRTdHJpbmdMaXRlcmFsKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCi0JCXB3LnByaW50KCcpJyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9uZS10by1tYW55IGZpZWxkcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlPbmVUb01hbnlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxPbmVUb01hbnlSZWxhdGlvbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5vbmVUb01hbnlSZWxhdGlvbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5T25lVG9NYW55RmllbGRPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlPbmVUb01hbnlGaWVsZE9uKE9uZVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZ2V0QXR0cmlidXRlTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE9uZVRvTWFueUFubm90YXRpb25PbihyZWxhdGlvbiwgcHcpOwotCQl9Ci0JCXRoaXMucHJpbnRDb2xsZWN0aW9uRmllbGRPbihmaWVsZE5hbWUsIHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLmdldFJlZmVyZW5jZWRFbnRpdHlOYW1lKCkpLCBwdyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50T25lVG9NYW55QW5ub3RhdGlvbk9uKE9uZVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCXB3LnByaW50KCIobWFwcGVkQnk9XCIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcucHJpbnQocmVsYXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCXB3LnByaW50KCJcIikiKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvd25lZCBtYW55LXRvLW1hbnkgZmllbGRzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU93bmVkTWFueVRvTWFueUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPE1hbnlUb01hbnlSZWxhdGlvbj4gIHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUub3duZWRNYW55VG9NYW55UmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU93bmVkTWFueVRvTWFueUZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T3duZWRNYW55VG9NYW55RmllbGRPbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLmZpZWxkQWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50T3duZWRNYW55VG9NYW55QW5ub3RhdGlvbk9uKGZpZWxkTmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCQl0aGlzLnByaW50Q29sbGVjdGlvbkZpZWxkT24oZmllbGROYW1lLCB0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5nZXROb25Pd25pbmdFbnRpdHlOYW1lKCkpLCBwdyk7Ci0JfQotCi0JLyoqCi0JICogb25seSBwcmludCB0aGUgSm9pblRhYmxlIGFubm90YXRpb24gaWYgb25lIG9yIG1vcmUgb2YgdGhlCi0JICogW2dlbmVyYXRlZF0gZWxlbWVudHMgaXMgbm90IGRlZmF1bHRlZDoKLQkgKiAgICAgbmFtZQotCSAqICAgICBqb2luQ29sdW1ucwotCSAqICAgICBpbnZlcnNlSm9pbkNvbHVtbnMKLQkgKiB0aHVzIHRoZSBuZWVkIGZvciB0aGUgJ3ByaW50Sm9pblRhYmxlQW5ub3RhdGlvbicgZmxhZwotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludE93bmVkTWFueVRvTWFueUFubm90YXRpb25PbihTdHJpbmcgYXR0cmlidXRlTmFtZSwgTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlwdy5wcmludGxuKCk7Ci0JCUJvb2xlYW5Ib2xkZXIgcHJpbnRKb2luVGFibGVBbm5vdGF0aW9uID0gbmV3IEJvb2xlYW5Ib2xkZXIodHJ1ZSk7Ci0KLQkJaWYgKCAhIHJlbGF0aW9uLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSkgeyAgLy8gZGItb25seSB0ZXN0IC0gbm8gbmVlZCB0byBkZWxlZ2F0ZSB0byBwbGF0Zm9ybT8KLQkJCXByaW50Sm9pblRhYmxlQW5ub3RhdGlvbi5zZXRGYWxzZSgpOwotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCXB3LnByaW50KCIobmFtZT0iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50U3RyaW5nTGl0ZXJhbCh0aGlzLmNvbmZpZy5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLmJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbk5hbWUocmVsYXRpb24uZ2V0Sm9pbkdlblRhYmxlKCkuZ2V0VGFibGUoKSkpOwotCQl9Ci0KLQkJdGhpcy5wcmludEpvaW5UYWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uc09uKAotCQkJCSJqb2luQ29sdW1ucyIsICAvLyROT04tTkxTLTEkCi0JCQkJYXR0cmlidXRlTmFtZSwKLQkJCQlyZWxhdGlvbi5nZXRPd25pbmdGb3JlaWduS2V5KCksCi0JCQkJcHJpbnRKb2luVGFibGVBbm5vdGF0aW9uLAotCQkJCXB3Ci0JCSk7Ci0KLQkJdGhpcy5wcmludEpvaW5UYWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uc09uKAotCQkJCSJpbnZlcnNlSm9pbkNvbHVtbnMiLCAgLy8kTk9OLU5MUy0xJAotCQkJCXJlbGF0aW9uLmdldE5vbk93bmluZ0dlblRhYmxlKCkuZ2V0QXR0cmlidXRlTmFtZUZvcihyZWxhdGlvbiksCi0JCQkJcmVsYXRpb24uZ2V0Tm9uT3duaW5nRm9yZWlnbktleSgpLAotCQkJCXByaW50Sm9pblRhYmxlQW5ub3RhdGlvbiwKLQkJCQlwdwotCQkpOwotCi0JCWlmIChwcmludEpvaW5UYWJsZUFubm90YXRpb24uaXNGYWxzZSgpKSB7Ci0JCQlwdy5wcmludCgnKScpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogJ2VsZW1lbnROYW1lJyBpcyBlaXRoZXIgImpvaW5Db2x1bW5zIiBvciAiaW52ZXJzZUpvaW5Db2x1bW5zIgotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludEpvaW5UYWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uc09uKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSwgQm9vbGVhbkhvbGRlciBwcmludEpvaW5UYWJsZUFubm90YXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQkvLyB3ZSBoYXZlIHRvIHByZS1jYWxjdWxhdGUgd2hldGhlciBlaXRoZXIgJ25hbWUnIGFuZC9vciAncmVmZXJlbmNlZENvbHVtbk5hbWUnCi0JCS8vIGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhleSBhcmUgd3JhcHBlZCBieSB0aGUgSm9pblRhYmxlIGFubm90YXRpb24gYW5kIHdlCi0JCS8vIG5lZWQgdG8gcHJpbnQgdGhlIEpvaW5UYWJsZSBhbm5vdGF0aW9uIGZpcnN0IChpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHByaW50ZWQpCi0JCWJvb2xlYW4gcHJpbnRSZWYgPSAhIGZvcmVpZ25LZXkucmVmZXJlbmNlc1NpbmdsZUNvbHVtblByaW1hcnlLZXkoKTsKLQkJLy8gaWYgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJyBpcyByZXF1aXJlZCwgJ25hbWUnIGlzIGFsc28gcmVxdWlyZWQgKGkuZS4gaXQgY2Fubm90IGJlIGRlZmF1bHRlZCk7Ci0JCS8vIGJ1dCB3ZSB3aWxsIGNhbGN1bGF0ZSBpdCBsYXRlciBbMV0sIHNpbmNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGpvaW4gY29sdW1ucwotCQlTdHJpbmcgam9pbkNvbHVtbk5hbWUgPSAocHJpbnRSZWYpID8KLQkJCQkJbnVsbCAgLy8gJ2pvaW5Db2x1bW5OYW1lJyBpcyBub3QgdXNlZAotCQkJCToKLQkJCQkJdGhpcy5jb25maWcuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS5idWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShhdHRyaWJ1dGVOYW1lLCBmb3JlaWduS2V5KTsKLQkJYm9vbGVhbiBwcmludEJhc2UgPSAocHJpbnRSZWYgfHwgKGpvaW5Db2x1bW5OYW1lICE9IG51bGwpKTsKLQkJaWYgKHByaW50QmFzZSB8fCBwcmludFJlZikgewotCQkJaWYgKHByaW50Sm9pblRhYmxlQW5ub3RhdGlvbi5pc1RydWUoKSkgewotCQkJCXByaW50Sm9pblRhYmxlQW5ub3RhdGlvbi5zZXRGYWxzZSgpOwotCQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQkJcHcucHJpbnQoJygnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHcucHJpbnQoJywnKTsKLQkJCX0KLQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LmluZGVudCgpOwotCQkJCWlmIChwcmludFJlZikgewotCQkJCQkvLyBpZiAncHJpbnRSZWYnIGlzIHRydWUsICdqb2luQ29sdW1uTmFtZScgd2lsbCBhbHdheXMgYmUgIklHTk9SRUQiIChzbyB3ZSBpZ25vcmUgaXQpCi0JCQkJCXRoaXMucHJpbnRKb2luVGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbnNPbihlbGVtZW50TmFtZSwgZm9yZWlnbktleSwgcHcpOyAgLy8gWzFdCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gaWYgdGhlIEZLIHJlZmVyZW5jZXMgYSBzaW5nbGUtY29sdW1uIFBLLCAncmVmZXJlbmNlZENvbHVtbk5hbWUnIGlzIG5vdCByZXF1aXJlZAotCQkJCQlpZiAocHJpbnRCYXNlKSB7Ci0JCQkJCQkvLyB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIGpvaW4gY29sdW1uIGhlcmUgKGp1c3Qgbm90IHRoZSBkZWZhdWx0IG5hbWUpCi0JCQkJCQlwdy5wcmludChlbGVtZW50TmFtZSk7Ci0JCQkJCQlwdy5wcmludCgnPScpOwotCQkJCQkJdGhpcy5wcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uT24oam9pbkNvbHVtbk5hbWUsIG51bGwsIHB3KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5vIEpvaW5Db2x1bW4gYW5ub3RhdGlvbiBuZWVkZWQ6IHRoZSBkZWZhdWx0ICduYW1lJyBhbmQgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJyB3b3JrCi0JCQkJCX0KLQkJCQl9Ci0JCQlwdy51bmRlbnQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICdlbGVtZW50TmFtZScgaXMgZWl0aGVyICJqb2luQ29sdW1ucyIgb3IgImludmVyc2VKb2luQ29sdW1ucyIKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnRKb2luVGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbnNPbihTdHJpbmcgZWxlbWVudE5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KGVsZW1lbnROYW1lKTsKLQkJcHcucHJpbnQoJz0nKTsKLQkJaWYgKGZvcmVpZ25LZXkuY29sdW1uUGFpcnNTaXplKCkgPiAxKSB7Ci0JCQlwdy5wcmludCgneycpOwotCQkJcHcucHJpbnRsbigpOwotCQkJcHcuaW5kZW50KCk7Ci0JCX0KLQkJdGhpcy5wcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uc09uKGZvcmVpZ25LZXksIHB3KTsKLQkJaWYgKGZvcmVpZ25LZXkuY29sdW1uUGFpcnNTaXplKCkgPiAxKSB7Ci0JCQlwdy51bmRlbnQoKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LnByaW50KCd9Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbm9uLW93bmVkIG1hbnktdG8tbWFueSBmaWVsZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uT3duZWRNYW55VG9NYW55RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8TWFueVRvTWFueVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlGaWVsZE9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vbk93bmVkTWFueVRvTWFueUZpZWxkT24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZ2V0QXR0cmlidXRlTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE5vbk93bmVkTWFueVRvTWFueUFubm90YXRpb25PbihyZWxhdGlvbiwgcHcpOwotCQl9Ci0JCXRoaXMucHJpbnRDb2xsZWN0aW9uRmllbGRPbihmaWVsZE5hbWUsIHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLmdldE93bmluZ0VudGl0eU5hbWUoKSksIHB3KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnROb25Pd25lZE1hbnlUb01hbnlBbm5vdGF0aW9uT24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlwdy5wcmludCgiKG1hcHBlZEJ5PVwiIik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50KHJlbGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlwdy5wcmludCgiXCIpIik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRTZXJpYWxWZXJzaW9uVUlERmllbGRPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCgpKSB7Ci0JCQlwdy5wcmludCgicHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Iik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRaZXJvQXJndW1lbnRDb25zdHJ1Y3Rvck9uKFN0cmluZyBjdG9yTmFtZSwgU3RyaW5nIHZpc2liaWxpdHksIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy5jb25maWcuZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IoKSkgewotCQkJcHcucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQkJcHcucHJpbnQoY3Rvck5hbWUpOwotCQkJcHcucHJpbnQoIigpIHsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LmluZGVudCgpOwotCQkJCXB3LnByaW50bG4oInN1cGVyKCk7Iik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy51bmRlbnQoKTsKLQkJCXB3LnByaW50KCd9Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgcHJvcGVydGllcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlQcmltYXJ5S2V5UHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy5wcmltYXJ5S2V5Q2xhc3NJc1JlcXVpcmVkKCkgJiYgdGhpcy5jb25maWcuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlQcm9wZXJ0eU9uKHB3KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlSZWFkT25seVByaW1hcnlLZXlQcm9wZXJ0aWVzT24ocHcpOwotCQkJdGhpcy5wcmludEVudGl0eVdyaXRhYmxlUHJpbWFyeUtleVByb3BlcnRpZXNPbihwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlFbWJlZGRlZElkUHJpbWFyeUtleVByb3BlcnR5T24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5FTUJFRERFRF9JRCk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQkJdGhpcy5wcmludFByb3BlcnR5T24odGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yRW1iZWRkZWRJZCgpLCB0aGlzLnBrQ2xhc3NOYW1lLCBwdyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5UmVhZE9ubHlQcmltYXJ5S2V5UHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50UHJpbWFyeUtleVByb3BlcnRpZXNPbihwdywgdHJ1ZSwgdHJ1ZSk7ICAvLyB0cnVlPXJlYWQtb25seTsgdHJ1ZT1wcmludCBJRCBhbm5vdGF0aW9uIG9uIGdldHRlcnMKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlXcml0YWJsZVByaW1hcnlLZXlQcm9wZXJ0aWVzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRQcmltYXJ5S2V5UHJvcGVydGllc09uKHB3LCBmYWxzZSwgdHJ1ZSk7ICAvLyBmYWxzZT13cml0YWJsZTsgdHJ1ZT1wcmludCBJRCBhbm5vdGF0aW9uIG9uIGdldHRlcnMKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5UHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdywgYm9vbGVhbiByZWFkT25seSwgYm9vbGVhbiBwcmludElkQW5ub3RhdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5wcmltYXJ5S2V5Q29sdW1ucyhyZWFkT25seSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludFByaW1hcnlLZXlQcm9wZXJ0eU9uKHN0cmVhbS5uZXh0KCksIHB3LCByZWFkT25seSwgcHJpbnRJZEFubm90YXRpb24pOwotCQl9Ci0JfQotCi0JLy8gVE9ETyBpZiB0aGUgcHJvcGVydHkncyB0eXBlIGlzIGphdmEudXRpbC9zcWwuRGF0ZSwgaXQgbmVlZHMgQFRlbXBvcmFsKERBVEUpCi0JLy8gVE9ETyBpZiB0aGUgcHJpbWFyeSBrZXkgaXMgYXV0by1nZW5lcmF0ZWQsIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIGFuIGludGVncmFsIHR5cGUKLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5UHJvcGVydHlPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcsIGJvb2xlYW4gcmVhZE9ubHksIGJvb2xlYW4gcHJpbnRJZEFubm90YXRpb24pIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2VuVGFibGUuZ2V0QXR0cmlidXRlTmFtZUZvcihjb2x1bW4pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCWlmIChwcmludElkQW5ub3RhdGlvbikgewotCQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSUQpOwotCQkJCXB3LnByaW50bG4oKTsKLQkJCX0KLQkJCVN0cmluZyBjb2x1bW5OYW1lID0gdGhpcy5jb25maWcuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS5idWlsZENvbHVtbkFubm90YXRpb25OYW1lKHByb3BlcnR5TmFtZSwgY29sdW1uKTsKLQkJCWlmIChyZWFkT25seSkgewotCQkJCXRoaXMucHJpbnRSZWFkT25seUNvbHVtbkFubm90YXRpb25Pbihjb2x1bW5OYW1lLCBwdyk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucHJpbnRDb2x1bW5Bbm5vdGF0aW9uT24oY29sdW1uTmFtZSwgcHcpOwotCQkJfQotCQl9Ci0JCXRoaXMucHJpbnRQcm9wZXJ0eU9uKHByb3BlcnR5TmFtZSwgY29sdW1uLmdldFByaW1hcnlLZXlKYXZhVHlwZURlY2xhcmF0aW9uKCksIHB3KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmFzaWMgcHJvcGVydGllcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNQcm9wZXJ0aWVzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm5vblByaW1hcnlLZXlCYXNpY0NvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljUHJvcGVydHlPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNQcm9wZXJ0eU9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKGNvbHVtbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSkgewotCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSB0aGlzLmNvbmZpZy5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLmJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUocHJvcGVydHlOYW1lLCBjb2x1bW4pOwotCQkJdGhpcy5wcmludENvbHVtbkFubm90YXRpb25Pbihjb2x1bW5OYW1lLCBwdyk7Ci0JCX0KLQkJdGhpcy5wcmludFByb3BlcnR5T24ocHJvcGVydHlOYW1lLCBjb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpLCBwdyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hbnktdG8tb25lIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5TWFueVRvT25lUHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPE1hbnlUb09uZVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm1hbnlUb09uZVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlNYW55VG9PbmVQcm9wZXJ0eU9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU1hbnlUb09uZVByb3BlcnR5T24oTWFueVRvT25lUmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50TWFueVRvT25lQW5ub3RhdGlvbk9uKHByb3BlcnR5TmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCQlTdHJpbmcgdHlwZURlY2xhcmF0aW9uID0gdGhpcy5mdWxseVF1YWxpZnkocmVsYXRpb24uZ2V0UmVmZXJlbmNlZEVudGl0eU5hbWUoKSk7Ci0JCXRoaXMucHJpbnRQcm9wZXJ0eU9uKHByb3BlcnR5TmFtZSwgdHlwZURlY2xhcmF0aW9uLCBwdyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9uZS10by1tYW55IHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T25lVG9NYW55UHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPE9uZVRvTWFueVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm9uZVRvTWFueVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlPbmVUb01hbnlQcm9wZXJ0eU9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU9uZVRvTWFueVByb3BlcnR5T24oT25lVG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50T25lVG9NYW55QW5ub3RhdGlvbk9uKHJlbGF0aW9uLCBwdyk7Ci0JCX0KLQkJU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24gPSB0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5nZXRSZWZlcmVuY2VkRW50aXR5TmFtZSgpKTsKLQkJdGhpcy5wcmludENvbGxlY3Rpb25Qcm9wZXJ0eU9uKHByb3BlcnR5TmFtZSwgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgcHcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvd25lZCBtYW55LXRvLW1hbnkgcHJvcGVydGllcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlQcm9wZXJ0aWVzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8TWFueVRvTWFueVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlQcm9wZXJ0eU9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU93bmVkTWFueVRvTWFueVByb3BlcnR5T24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2VuVGFibGUuZ2V0QXR0cmlidXRlTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE93bmVkTWFueVRvTWFueUFubm90YXRpb25Pbihwcm9wZXJ0eU5hbWUsIHJlbGF0aW9uLCBwdyk7Ci0JCX0KLQkJU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24gPSB0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5nZXROb25Pd25pbmdFbnRpdHlOYW1lKCkpOwotCQl0aGlzLnByaW50Q29sbGVjdGlvblByb3BlcnR5T24ocHJvcGVydHlOYW1lLCBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCBwdyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5vbi1vd25lZCBtYW55LXRvLW1hbnkgcHJvcGVydGllcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlQcm9wZXJ0aWVzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8TWFueVRvTWFueVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlQcm9wZXJ0eU9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vbk93bmVkTWFueVRvTWFueVByb3BlcnR5T24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2VuVGFibGUuZ2V0QXR0cmlidXRlTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE5vbk93bmVkTWFueVRvTWFueUFubm90YXRpb25PbihyZWxhdGlvbiwgcHcpOwotCQl9Ci0JCVN0cmluZyBlbGVtZW50VHlwZURlY2xhcmF0aW9uID0gdGhpcy5mdWxseVF1YWxpZnkocmVsYXRpb24uZ2V0T3duaW5nRW50aXR5TmFtZSgpKTsKLQkJdGhpcy5wcmludENvbGxlY3Rpb25Qcm9wZXJ0eU9uKHByb3BlcnR5TmFtZSwgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgcHcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb21wb3VuZCBwcmltYXJ5IGtleSBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5Q2xhc3NPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRsbigpOwotCQlpZiAodGhpcy5jb25maWcuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpKSB7Ci0JCQlwdy5wcmludEFubm90YXRpb24oSlBBLkVNQkVEREFCTEUpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JCXB3LnByaW50KCJwdWJsaWMgc3RhdGljIGNsYXNzICIpOyAgLy8kTk9OLU5MUy0xJAotCQlwdy5wcmludCh0aGlzLmNvbmZpZy5nZXRQcmltYXJ5S2V5TWVtYmVyQ2xhc3NOYW1lKCkpOwotCQlwdy5wcmludCgiIGltcGxlbWVudHMgIik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKFNlcmlhbGl6YWJsZS5jbGFzcy5nZXROYW1lKCkpOwotCQlwdy5wcmludCgiIHsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcucHJpbnRsbigpOwotCi0JCXB3LmluZGVudCgpOwotCQkJaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoKSkgewotCQkJCXRoaXMucHJpbnRFbWJlZGRhYmxlUmVhZE9ubHlQcmltYXJ5S2V5RmllbGRzT24ocHcpOwotCQkJCXRoaXMucHJpbnRFbWJlZGRhYmxlV3JpdGFibGVQcmltYXJ5S2V5RmllbGRzT24ocHcpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnByaW50SWRGaWVsZHNPbihwdyk7Ci0JCQl9Ci0JCQl0aGlzLnByaW50U2VyaWFsVmVyc2lvblVJREZpZWxkT24ocHcpOwotCQkJcHcucHJpbnRsbigpOwotCQkJdGhpcy5wcmludFplcm9Bcmd1bWVudENvbnN0cnVjdG9yT24odGhpcy5jb25maWcuZ2V0UHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZSgpLCAicHVibGljIiwgcHcpOyAgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkgfHwgdGhpcy5jb25maWcuZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycygpKSB7Ci0JCQkJaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoKSkgewotCQkJCQl0aGlzLnByaW50RW1iZWRkYWJsZVJlYWRPbmx5UHJpbWFyeUtleVByb3BlcnRpZXNPbihwdyk7Ci0JCQkJCXRoaXMucHJpbnRFbWJlZGRhYmxlV3JpdGFibGVQcmltYXJ5S2V5UHJvcGVydGllc09uKHB3KTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aGlzLnByaW50SWRQcm9wZXJ0aWVzT24ocHcpOwotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5wcmludFByaW1hcnlLZXlFcXVhbHNNZXRob2RPbih0aGlzLmNvbmZpZy5nZXRQcmltYXJ5S2V5TWVtYmVyQ2xhc3NOYW1lKCksIHRoaXMuZ2V0VGFibGUoKS5wcmltYXJ5S2V5Q29sdW1ucygpLCBwdyk7Ci0JCQl0aGlzLnByaW50UHJpbWFyeUtleUhhc2hDb2RlTWV0aG9kT24odGhpcy5nZXRUYWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zKCksIHB3KTsKLQkJcHcudW5kZW50KCk7Ci0KLQkJcHcucHJpbnQoJ30nKTsKLQkJcHcucHJpbnRsbigpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbXBvdW5kIHByaW1hcnkga2V5IGNsYXNzIGZpZWxkcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbWJlZGRhYmxlUmVhZE9ubHlQcmltYXJ5S2V5RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRQcmltYXJ5S2V5RmllbGRzT24ocHcsIHRydWUsIGZhbHNlKTsgIC8vIHRydWU9cmVhZC1vbmx5OyBmYWxzZT1kbyBub3QgcHJpbnQgSUQgYW5ub3RhdGlvbiBvbiBmaWVsZHMKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbWJlZGRhYmxlV3JpdGFibGVQcmltYXJ5S2V5RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRQcmltYXJ5S2V5RmllbGRzT24ocHcsIGZhbHNlLCBmYWxzZSk7ICAvLyBmYWxzZT13cml0YWJsZTsgZmFsc2U9ZG8gbm90IHByaW50IElEIGFubm90YXRpb24gb24gZmllbGRzCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50SWRGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IHRoaXMuZ2V0VGFibGUoKS5wcmltYXJ5S2V5Q29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRJZEZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50SWRGaWVsZE9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50RmllbGRPbih0aGlzLmdlblRhYmxlLmdldEF0dHJpYnV0ZU5hbWVGb3IoY29sdW1uKSwgY29sdW1uLmdldFByaW1hcnlLZXlKYXZhVHlwZURlY2xhcmF0aW9uKCksIHB3KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29tcG91bmQgcHJpbWFyeSBrZXkgY2xhc3MgcHJvcGVydGllcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbWJlZGRhYmxlUmVhZE9ubHlQcmltYXJ5S2V5UHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50UHJpbWFyeUtleVByb3BlcnRpZXNPbihwdywgdHJ1ZSwgZmFsc2UpOyAgLy8gdHJ1ZT1yZWFkLW9ubHk7IGZhbHNlPWRvIG5vdCBwcmludCBJRCBhbm5vdGF0aW9uIG9uIGdldHRlcnMKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbWJlZGRhYmxlV3JpdGFibGVQcmltYXJ5S2V5UHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50UHJpbWFyeUtleVByb3BlcnRpZXNPbihwdywgZmFsc2UsIGZhbHNlKTsgIC8vIGZhbHNlPXdyaXRhYmxlOyBmYWxzZT1kbyBub3QgcHJpbnQgSUQgYW5ub3RhdGlvbiBvbiBnZXR0ZXJzCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50SWRQcm9wZXJ0aWVzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmdldFRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50SWRQcm9wZXJ0eU9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludElkUHJvcGVydHlPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJdGhpcy5wcmludFByb3BlcnR5T24odGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKGNvbHVtbiksIGNvbHVtbi5nZXRQcmltYXJ5S2V5SmF2YVR5cGVEZWNsYXJhdGlvbigpLCBwdyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbXBvdW5kIHByaW1hcnkga2V5IGNsYXNzIGVxdWFscyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5RXF1YWxzTWV0aG9kT24oU3RyaW5nIGNsYXNzTmFtZSwgSXRlcmF0b3I8Q29sdW1uPiBjb2x1bW5zLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKCJqYXZhLmxhbmcuT3ZlcnJpZGUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcucHJpbnRsbigpOwotCi0JCXB3LnByaW50bG4oInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeyIpOyAgLy8kTk9OLU5MUy0xJAotCQlwdy5pbmRlbnQoKTsKLQkJCXB3LnByaW50bG4oImlmIChvID09IHRoaXMpIHsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LmluZGVudCgpOwotCQkJCXB3LnByaW50bG4oInJldHVybiB0cnVlOyIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcudW5kZW50KCk7Ci0JCQlwdy5wcmludCgnfScpOwotCQkJcHcucHJpbnRsbigpOwotCi0JCQlwdy5wcmludCgiaWYgKCAhIChvIGluc3RhbmNlb2YgIik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludChjbGFzc05hbWUpOwotCQkJcHcucHJpbnQoIikpIHsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LmluZGVudCgpOwotCQkJCXB3LnByaW50bG4oInJldHVybiBmYWxzZTsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnVuZGVudCgpOwotCQkJcHcucHJpbnQoJ30nKTsKLQkJCXB3LnByaW50bG4oKTsKLQotCQkJcHcucHJpbnQoY2xhc3NOYW1lKTsKLQkJCXB3LnByaW50KCIgb3RoZXIgPSAoIik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludChjbGFzc05hbWUpOwotCQkJcHcucHJpbnQoIikgbzsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50bG4oKTsKLQotCQkJcHcucHJpbnQoInJldHVybiAiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LmluZGVudCgpOwotCQkJCXdoaWxlIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJCQl0aGlzLnByaW50UHJpbWFyeUtleUVxdWFsc0NsYXVzZU9uKGNvbHVtbnMubmV4dCgpLCBwdyk7Ci0JCQkJCWlmIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJCQkJcHcucHJpbnRsbigpOwotCQkJCQkJcHcucHJpbnQoIiYmICIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCXB3LnByaW50KCc7Jyk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJcHcudW5kZW50KCk7Ci0JCXB3LnVuZGVudCgpOwotCQlwdy5wcmludCgnfScpOwotCQlwdy5wcmludGxuKCk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5RXF1YWxzQ2xhdXNlT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmdldEF0dHJpYnV0ZU5hbWVGb3IoY29sdW1uKTsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBjb2x1bW4uZ2V0UHJpbWFyeUtleUphdmFUeXBlKCk7Ci0JCWlmIChqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQl0aGlzLnByaW50UHJpbWl0aXZlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBwdyk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnByaW50UmVmZXJlbmNlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltaXRpdmVFcXVhbHNDbGF1c2VPbihTdHJpbmcgZmllbGROYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoIih0aGlzLiIpOyAgLy8kTk9OLU5MUy0xJAotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgiID09IG90aGVyLiIpOyAgLy8kTk9OLU5MUy0xJAotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgnKScpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlZmVyZW5jZUVxdWFsc0NsYXVzZU9uKFN0cmluZyBmaWVsZE5hbWUsIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludCgidGhpcy4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJcHcucHJpbnQoIi5lcXVhbHMob3RoZXIuIik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCcpJyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbXBvdW5kIHByaW1hcnkga2V5IGNsYXNzIGhhc2ggY29kZSAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5SGFzaENvZGVNZXRob2RPbihJdGVyYXRvcjxDb2x1bW4+IGNvbHVtbnMsIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oImphdmEubGFuZy5PdmVycmlkZSIpOyAgLy8kTk9OLU5MUy0xJAotCQlwdy5wcmludGxuKCk7Ci0KLQkJcHcucHJpbnRsbigicHVibGljIGludCBoYXNoQ29kZSgpIHsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcuaW5kZW50KCk7Ci0JCQlwdy5wcmludGxuKCJmaW5hbCBpbnQgcHJpbWUgPSAzMTsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50bG4oImludCBoYXNoID0gMTc7Iik7ICAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoY29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQlwdy5wcmludCgiaGFzaCA9IGhhc2ggKiBwcmltZSArICIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMucHJpbnRQcmltYXJ5S2V5SGFzaENvZGVDbGF1c2VPbihjb2x1bW5zLm5leHQoKSwgcHcpOwotCQkJCXB3LnByaW50KCc7Jyk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJfQotCQkJcHcucHJpbnRsbigicmV0dXJuIGhhc2g7Iik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnVuZGVudCgpOwotCQlwdy5wcmludCgnfScpOwotCQlwdy5wcmludGxuKCk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5SGFzaENvZGVDbGF1c2VPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZ2V0QXR0cmlidXRlTmFtZUZvcihjb2x1bW4pOwotCQlKYXZhVHlwZSBqYXZhVHlwZSA9IGNvbHVtbi5nZXRQcmltYXJ5S2V5SmF2YVR5cGUoKTsKLQkJaWYgKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXRoaXMucHJpbnRQcmltaXRpdmVIYXNoQ29kZUNsYXVzZU9uKGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpLCBmaWVsZE5hbWUsIHB3KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucHJpbnRSZWZlcmVuY2VIYXNoQ29kZUNsYXVzZU9uKGZpZWxkTmFtZSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWl0aXZlSGFzaENvZGVDbGF1c2VPbihTdHJpbmcgcHJpbWl0aXZlTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmIChwcmltaXRpdmVOYW1lLmVxdWFscygiaW50IikpIHsgIC8vJE5PTi1OTFMtMSQKLQkJCS8vIHRoaXMudmFsdWUKLQkJCXB3LnByaW50KCJ0aGlzLiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJfSBlbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygic2hvcnQiKSAgLy8kTk9OLU5MUy0xJAotCQkJCXx8IHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJieXRlIikgIC8vJE5PTi1OTFMtMSQKLQkJCQl8fCBwcmltaXRpdmVOYW1lLmVxdWFscygiY2hhciIpKSB7ICAvLyROT04tTkxTLTEkCi0JCQkvLyAoKGludCkgdGhpcy52YWx1ZSkgIC0gZXhwbGljaXQgY2FzdAotCQkJcHcucHJpbnQoIigoaW50KSB0aGlzLiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCcpJyk7Ci0JCX0gZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImxvbmciKSkgeyAgLy8gY3JpYmJlZCBmcm9tIExvbmcjaGFzaENvZGUoKSAgLy8kTk9OLU5MUy0xJAotCQkJLy8gKChpbnQpICh0aGlzLnZhbHVlIF4gKHRoaXMudmFsdWUgPj4+IDMyKSkpCi0JCQlwdy5wcmludCgiKChpbnQpICh0aGlzLiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCIgXiAodGhpcy4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCQlwdy5wcmludCgiID4+PiAzMikpKSIpOyAgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJmbG9hdCIpKSB7ICAvLyBjcmliYmVkIGZyb20gRmxvYXQjaGFzaENvZGUoKSAgLy8kTk9OLU5MUy0xJAotCQkJLy8gamF2YS5sYW5nLkZsb2F0LmZsb2F0VG9JbnRCaXRzKHRoaXMudmFsdWUpCi0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLkZsb2F0Iik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludCgiLmZsb2F0VG9JbnRCaXRzKHRoaXMuIik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQkJcHcucHJpbnQoJyknKTsKLQkJfSBlbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygiZG91YmxlIikpIHsgIC8vIGNyaWJiZWQgZnJvbSBEb3VibGUjaGFzaENvZGUoKSAgLy8kTk9OLU5MUy0xJAotCQkJLy8JKChpbnQpIChqYXZhLmxhbmcuRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModGhpcy52YWx1ZSkgXiAoamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHRoaXMudmFsdWUpID4+PiAzMikpKQotCQkJcHcucHJpbnQoIigoaW50KSAoIik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLkRvdWJsZSIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnQoIi5kb3VibGVUb0xvbmdCaXRzKHRoaXMuIik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQkJcHcucHJpbnQoIikgXiAoIik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLkRvdWJsZSIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnQoIi5kb3VibGVUb0xvbmdCaXRzKHRoaXMuIik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQkJcHcucHJpbnQoIikgPj4+IDMyKSkpIik7ICAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImJvb2xlYW4iKSkgeyAgLy8kTk9OLU5MUy0xJAotCQkJLy8gKHRoaXMudmFsdWUgPyAxIDogMCkKLQkJCXB3LnByaW50KCIodGhpcy4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCQlwdy5wcmludCgiID8gMSA6IDApIik7ICAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHByaW1pdGl2ZU5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UmVmZXJlbmNlSGFzaENvZGVDbGF1c2VPbihTdHJpbmcgZmllbGROYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoInRoaXMuIik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCIuaGFzaENvZGUoKSIpOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBwYWNrYWdlIGFuZCBpbXBvcnRzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBwcmludFBhY2thZ2VBbmRJbXBvcnRzT24oUHJpbnRXcml0ZXIgcHcsIEJvZHlTb3VyY2UgYm9keVNvdXJjZSkgewotCQlpZiAodGhpcy5nZXRQYWNrYWdlTmFtZSgpLmxlbmd0aCgpICE9IDApIHsKLQkJCXB3LnByaW50KCJwYWNrYWdlICIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnQodGhpcy5nZXRQYWNrYWdlTmFtZSgpKTsKLQkJCXB3LnByaW50KCc7Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IHN0cmVhbSA9IGJvZHlTb3VyY2UuaW1wb3J0RW50cmllcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBzdHJlYW0ubmV4dCgpOwotCQkJcHcucHJpbnQoImltcG9ydCAiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50KGVudHJ5LmdldFZhbHVlKCkpOyAgLy8gcGFja2FnZQotCQkJcHcucHJpbnQoJy4nKTsKLQkJCXB3LnByaW50KGVudHJ5LmdldEtleSgpKTsgIC8vIHNob3J0IGNsYXNzIG5hbWUKLQkJCXB3LnByaW50KCc7Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQkJcHcucHJpbnRsbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmaWVsZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogdmlzaWJpbGl0eSBpcyBzZXQgaW4gdGhlIGNvbmZpZwotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludEZpZWxkT24oU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50RmllbGQoCi0JCQkJZmllbGROYW1lLAotCQkJCXR5cGVEZWNsYXJhdGlvbiwKLQkJCQl0aGlzLmNvbmZpZy5nZXRGaWVsZFZpc2liaWxpdHlDbGF1c2UoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIHZpc2liaWxpdHkgYW5kIGNvbGxlY3Rpb24gdHlwZSBhcmUgc2V0IGluIHRoZSBjb25maWcKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnRDb2xsZWN0aW9uRmllbGRPbihTdHJpbmcgZmllbGROYW1lLCBTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50UGFyYW1ldGVyaXplZEZpZWxkKAotCQkJCWZpZWxkTmFtZSwKLQkJCQl0aGlzLmNvbmZpZy5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSwKLQkJCQllbGVtZW50VHlwZURlY2xhcmF0aW9uLAotCQkJCXRoaXMuY29uZmlnLmdldEZpZWxkVmlzaWJpbGl0eUNsYXVzZSgpCi0JCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogdmlzaWJpbGl0eSBpcyBzZXQgaW4gdGhlIGNvbmZpZwotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludFByb3BlcnR5T24oU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50R2V0dGVyQW5kU2V0dGVyKAotCQkJCXByb3BlcnR5TmFtZSwKLQkJCQl0eXBlRGVjbGFyYXRpb24sCi0JCQkJdGhpcy5jb25maWcuZ2V0TWV0aG9kVmlzaWJpbGl0eUNsYXVzZSgpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogdmlzaWJpbGl0eSBhbmQgY29sbGVjdGlvbiB0eXBlIGFyZSBzZXQgaW4gdGhlIGNvbmZpZwotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludENvbGxlY3Rpb25Qcm9wZXJ0eU9uKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRDb2xsZWN0aW9uR2V0dGVyQW5kU2V0dGVyKAotCQkJCXByb3BlcnR5TmFtZSwKLQkJCQl0aGlzLmNvbmZpZy5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSwKLQkJCQllbGVtZW50VHlwZURlY2xhcmF0aW9uLAotCQkJCXRoaXMuY29uZmlnLmdldE1ldGhvZFZpc2liaWxpdHlDbGF1c2UoKQotCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5wYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZW5UYWJsZS5nZXRUYWJsZSgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdlblRhYmxlLmdldEVudGl0eU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJpbWFyeUtleUNsYXNzSXNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGUoKS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+IDE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZ5KFN0cmluZyBzaG9ydENsYXNzTmFtZSkgewotCQlTdHJpbmcgcGtnID0gdGhpcy5nZXRQYWNrYWdlTmFtZSgpOwotCQlyZXR1cm4gKHBrZy5sZW5ndGgoKSA9PSAwKSA/IHNob3J0Q2xhc3NOYW1lIDogcGtnICsgJy4nICsgc2hvcnRDbGFzc05hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5nZW5UYWJsZS5nZXROYW1lKCkgKyAiID0+ICIgKyB0aGlzLmVudGl0eUNsYXNzTmFtZSk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHNvdXJjZSB3cml0ZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgQm9keVNvdXJjZSB7Ci0KLQkJLyoqCi0JCSAqIHJldHVybiBhIHNvcnRlZCBzZXQgb2YgbWFwIGVudHJpZXM7IHRoZSBrZXkgaXMgdGhlIHNob3J0IGNsYXNzIG5hbWUsCi0JCSAqIHRoZSB2YWx1ZSBpcyB0aGUgcGFja2FnZSBuYW1lCi0JCSAqLwotCQlJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBpbXBvcnRFbnRyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIHJldHVybiB0aGUgYm9keSBzb3VyY2UgY29kZQotCQkgKi8KLQkJU3RyaW5nIGdldFNvdXJjZSgpOwotCi0JCS8qKgotCQkgKiByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYm9keSBzb3VyY2UgY29kZQotCQkgKi8KLQkJaW50IGxlbmd0aCgpOwotCi0JfQotCi0JLyoqCi0JICogRXh0ZW5kIEluZGVudGluZ1ByaW50V3JpdGVyIHdpdGggc29tZSBtZXRob2RzIHRoYXQgZmFjaWxpdGF0ZSBidWlsZGluZwotCSAqIGNsYXNzIHNvdXJjZSBjb2RlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVudGl0eVNvdXJjZVdyaXRlciBleHRlbmRzIEluZGVudGluZ1ByaW50V3JpdGVyIGltcGxlbWVudHMgQm9keVNvdXJjZSB7Ci0JCWZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZTsKLQkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKLQkJLy8ga2V5ID0gc2hvcnQgY2xhc3MgbmFtZTsgdmFsdWUgPSBwYWNrYWdlIG5hbWUKLQkJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGltcG9ydHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotCQlFbnRpdHlTb3VyY2VXcml0ZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQlzdXBlcihuZXcgU3RyaW5nV3JpdGVyKDIwMDAwKSk7Ci0JCQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0JCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgU3RyaW5nIExpdGVyYWwgYW5kIHByaW50IGl0LAotCQkgKiBhZGRpbmcgdGhlIHN1cnJvdW5kaW5nIGRvdWJsZS1xdW90ZXMgYW5kIGVzY2FwaW5nIGNoYXJhY3RlcnMKLQkJICogYXMgbmVjZXNzYXJ5LgotCQkgKi8KLQkJdm9pZCBwcmludFN0cmluZ0xpdGVyYWwoU3RyaW5nIHN0cmluZykgewotCQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzdHJpbmcsIHRoaXMpOwotCQl9Ci0KLQkJdm9pZCBwcmludFZpc2liaWxpdHkoU3RyaW5nIHZpc2liaWxpdHlNb2RpZmllcikgewotCQkJaWYgKHZpc2liaWxpdHlNb2RpZmllci5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJdGhpcy5wcmludCh2aXNpYmlsaXR5TW9kaWZpZXIpOwotCQkJCXRoaXMucHJpbnQoJyAnKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgcHJpbnRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQkJdGhpcy5wcmludCgnQCcpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCX0KLQotCQl2b2lkIHByaW50VHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJCXRoaXMucHJpbnQodGhpcy5idWlsZEltcG9ydGVkVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbikpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzJ3MgImltcG9ydGVkIiBuYW1lLgotCQkgKiBUaGUgY2xhc3MgZGVjbGFyYXRpb24gbXVzdCBiZSBvZiB0aGUgZm9ybToKLQkJICogICAgICJpbnQiCi0JCSAqICAgICAiaW50W10iIChub3QgIltJIikKLQkJICogICAgICJqYXZhLmxhbmcuT2JqZWN0IgotCQkgKiAgICAgImphdmEubGFuZy5PYmplY3RbXSIgKG5vdCAiW0xqYXZhLmxhbmcuT2JqZWN0OyIpCi0JCSAqICAgICAiamF2YS51dGlsLk1hcC5FbnRyeSIgKG5vdCAiamF2YS51dGlsLk1hcCRFbnRyeSIpCi0JCSAqICAgICAiamF2YS51dGlsLk1hcC5FbnRyeVtdW10iIChub3QgIltbTGphdmEudXRpbC5NYXAkRW50cnk7IikKLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGJ1aWxkSW1wb3J0ZWRUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQkJaWYgKHRoaXMudHlwZURlY2xhcmF0aW9uSXNNZW1iZXJDbGFzcyh0eXBlRGVjbGFyYXRpb24pKSB7Ci0JCQkJLy8gbm8gbmVlZCBmb3IgYW4gaW1wb3J0LCBqdXN0IHJldHVybiB0aGUgcGFydGlhbGx5LXF1YWxpZmllZCBuYW1lCi0JCQkJcmV0dXJuIHRoaXMuYnVpbGRNZW1iZXJDbGFzc1R5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQkJfQotCQkJaW50IGxhc3QgPSB0eXBlRGVjbGFyYXRpb24ubGFzdEluZGV4T2YoJy4nKTsKLQkJCVN0cmluZyBwa2cgPSAobGFzdCA9PSAtMSkgPyAiIiA6IHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoMCwgbGFzdCk7ICAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgc2hvcnRUeXBlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKGxhc3QgKyAxKTsKLQkJCVN0cmluZyBzaG9ydEVsZW1lbnRUeXBlTmFtZSA9IHNob3J0VHlwZURlY2xhcmF0aW9uOwotCQkJd2hpbGUgKHNob3J0RWxlbWVudFR5cGVOYW1lLmVuZHNXaXRoKCJbXSIpKSB7ICAvLyROT04tTkxTLTEkCi0JCQkJc2hvcnRFbGVtZW50VHlwZU5hbWUgPSBzaG9ydEVsZW1lbnRUeXBlTmFtZS5zdWJzdHJpbmcoMCwgc2hvcnRFbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgLSAyKTsKLQkJCX0KLQkJCVN0cmluZyBwcmV2ID0gdGhpcy5pbXBvcnRzLmdldChzaG9ydEVsZW1lbnRUeXBlTmFtZSk7Ci0JCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgZmlyc3QgY2xhc3Mgd2l0aCB0aGlzIHNob3J0IGVsZW1lbnQgdHlwZSBuYW1lCi0JCQkJdGhpcy5pbXBvcnRzLnB1dChzaG9ydEVsZW1lbnRUeXBlTmFtZSwgcGtnKTsKLQkJCQlyZXR1cm4gc2hvcnRUeXBlRGVjbGFyYXRpb247Ci0JCQl9Ci0JCQlpZiAocHJldi5lcXVhbHMocGtnKSkgewotCQkJCS8vIHRoaXMgZWxlbWVudCB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQKLQkJCQlyZXR1cm4gc2hvcnRUeXBlRGVjbGFyYXRpb247Ci0JCQl9Ci0JCQkvLyBhbm90aGVyIGNsYXNzIHdpdGggdGhlIHNhbWUgc2hvcnQgZWxlbWVudCB0eXBlIG5hbWUgaGFzIGJlZW4KLQkJCS8vIHByZXZpb3VzbHkgaW1wb3J0ZWQsIHNvIHRoaXMgb25lIG11c3QgYmUgdXNlZCBmdWxseS1xdWFsaWZpZWQKLQkJCXJldHVybiB0eXBlRGVjbGFyYXRpb247Ci0JCX0KLQotCQkvKioKLQkJICogZS5nLiAiZm9vLmJhci5FbXBsb3llZS5QSyIgd2lsbCByZXR1cm4gdHJ1ZQotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHR5cGVEZWNsYXJhdGlvbklzTWVtYmVyQ2xhc3MoU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQkJcmV0dXJuICh0eXBlRGVjbGFyYXRpb24ubGVuZ3RoKCkgPiB0aGlzLmNsYXNzTmFtZS5sZW5ndGgoKSkKLQkJCQkJJiYgdHlwZURlY2xhcmF0aW9uLnN0YXJ0c1dpdGgodGhpcy5jbGFzc05hbWUpCi0JCQkJCSYmICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KHRoaXMuY2xhc3NOYW1lLmxlbmd0aCgpKSA9PSAnLicpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGUuZy4gImZvby5iYXIuRW1wbG95ZWUuUEsiIHdpbGwgcmV0dXJuICJFbXBsb3llZS5QSyIKLQkJICogdGhpcyBwcmV2ZW50cyBjb2xsaXNpb25zIHdpdGggb3RoZXIgaW1wb3J0ZWQgY2xhc3NlcyAoZS5nLiAiam9vLmphci5QSyIpCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBidWlsZE1lbWJlckNsYXNzVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJCWludCBpbmRleCA9IHRoaXMucGFja2FnZU5hbWUubGVuZ3RoKCk7Ci0JCQlpZiAoaW5kZXggIT0gMCkgewotCQkJCWluZGV4Kys7ICAvLyBidW1wIHBhc3QgdGhlICcuJwotCQkJfQotCQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoaW5kZXgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBzb3J0ZWRJbXBvcnRFbnRyaWVzKCkgewotCQkJVHJlZVNldDxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBzb3J0ZWRJbXBvcnRzID0gbmV3IFRyZWVTZXQ8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4odGhpcy5idWlsZEltcG9ydEVudHJpZXNDb21wYXJhdG9yKCkpOwotCQkJc29ydGVkSW1wb3J0cy5hZGRBbGwodGhpcy5pbXBvcnRzLmVudHJ5U2V0KCkpOwotCQkJcmV0dXJuIHNvcnRlZEltcG9ydHMuaXRlcmF0b3IoKTsKLQkJfQotCi0JCXByaXZhdGUgQ29tcGFyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBidWlsZEltcG9ydEVudHJpZXNDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUxLCBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUyKSB7Ci0JCQkJCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJCQkJaW50IHBrZyA9IGNvbGxhdG9yLmNvbXBhcmUoZTEuZ2V0VmFsdWUoKSwgZTIuZ2V0VmFsdWUoKSk7Ci0JCQkJCXJldHVybiAocGtnID09IDApID8gY29sbGF0b3IuY29tcGFyZShlMS5nZXRLZXkoKSwgZTIuZ2V0S2V5KCkpIDogcGtnOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQl2b2lkIHByaW50RmllbGQoU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKLQkJCXRoaXMucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQkJdGhpcy5wcmludCgnICcpOwotCQkJdGhpcy5wcmludChmaWVsZE5hbWUpOwotCQkJdGhpcy5wcmludCgnOycpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQkJfQotCi0JCXZvaWQgcHJpbnRQYXJhbWV0ZXJpemVkRmllbGQoU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHBhcmFtZXRlclR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKLQkJCXRoaXMucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQkJdGhpcy5wcmludCgnPCcpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihwYXJhbWV0ZXJUeXBlRGVjbGFyYXRpb24pOwotCQkJdGhpcy5wcmludCgnPicpOwotCQkJdGhpcy5wcmludCgnICcpOwotCQkJdGhpcy5wcmludChmaWVsZE5hbWUpOwotCQkJdGhpcy5wcmludCgnOycpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQkJfQotCi0JCXZvaWQgcHJpbnRHZXR0ZXJBbmRTZXR0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKLQkJCXRoaXMucHJpbnRHZXR0ZXIocHJvcGVydHlOYW1lLCB0eXBlRGVjbGFyYXRpb24sIHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQotCQkJdGhpcy5wcmludFNldHRlcihwcm9wZXJ0eU5hbWUsIHR5cGVEZWNsYXJhdGlvbiwgdmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByaW50R2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJCXRoaXMucHJpbnQoJyAnKTsKLQkJCXRoaXMucHJpbnQodHlwZURlY2xhcmF0aW9uLmVxdWFscygiYm9vbGVhbiIpID8gImlzIiA6ICJnZXQiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl0aGlzLnByaW50KFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUocHJvcGVydHlOYW1lKSk7Ci0JCQl0aGlzLnByaW50KCIoKSB7Iik7ICAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnByaW50bG4oKTsKLQotCQkJdGhpcy5pbmRlbnQoKTsKLQkJCQl0aGlzLnByaW50KCJyZXR1cm4gdGhpcy4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQkJdGhpcy5wcmludCgnOycpOwotCQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy51bmRlbnQoKTsKLQotCQkJdGhpcy5wcmludCgnfScpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByaW50U2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnQoInZvaWQgc2V0Iik7ICAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnByaW50KFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUocHJvcGVydHlOYW1lKSk7Ci0JCQl0aGlzLnByaW50KCcoJyk7Ci0JCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCQl0aGlzLnByaW50KCcgJyk7Ci0JCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQl0aGlzLnByaW50KCIpIHsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMucHJpbnRsbigpOwotCi0JCQl0aGlzLmluZGVudCgpOwotCQkJCXRoaXMucHJpbnQoInRoaXMuIik7ICAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJCXRoaXMucHJpbnQoIiA9ICIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCQl0aGlzLnByaW50KCc7Jyk7Ci0JCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnVuZGVudCgpOwotCi0JCQl0aGlzLnByaW50KCd9Jyk7Ci0JCX0KLQotCQl2b2lkIHByaW50Q29sbGVjdGlvbkdldHRlckFuZFNldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgY29sbGVjdGlvblR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50Q29sbGVjdGlvbkdldHRlcihwcm9wZXJ0eU5hbWUsIGNvbGxlY3Rpb25UeXBlRGVjbGFyYXRpb24sIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQotCQkJdGhpcy5wcmludENvbGxlY3Rpb25TZXR0ZXIocHJvcGVydHlOYW1lLCBjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uLCBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCB2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJpbnRDb2xsZWN0aW9uR2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKLQkJCXRoaXMucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uKTsKLQkJCXRoaXMucHJpbnQoJzwnKTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24oZWxlbWVudFR5cGVEZWNsYXJhdGlvbik7Ci0JCQl0aGlzLnByaW50KCI+IGdldCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5wcmludChTdHJpbmdUb29scy5jYXBpdGFsaXplKHByb3BlcnR5TmFtZSkpOwotCQkJdGhpcy5wcmludCgiKCkgeyIpOyAgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5wcmludGxuKCk7Ci0KLQkJCXRoaXMuaW5kZW50KCk7Ci0JCQkJdGhpcy5wcmludCgicmV0dXJuIHRoaXMuIik7ICAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJCXRoaXMucHJpbnQoJzsnKTsKLQkJCQl0aGlzLnByaW50bG4oKTsKLQkJCXRoaXMudW5kZW50KCk7Ci0KLQkJCXRoaXMucHJpbnQoJ30nKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcmludENvbGxlY3Rpb25TZXR0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGNvbGxlY3Rpb25UeXBlRGVjbGFyYXRpb24sIFN0cmluZyBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgewotCQkJdGhpcy5wcmludFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50KCJ2b2lkIHNldCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5wcmludChTdHJpbmdUb29scy5jYXBpdGFsaXplKHByb3BlcnR5TmFtZSkpOwotCQkJdGhpcy5wcmludCgnKCcpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uKTsKLQkJCXRoaXMucHJpbnQoJzwnKTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24oZWxlbWVudFR5cGVEZWNsYXJhdGlvbik7Ci0JCQl0aGlzLnByaW50KCc+Jyk7Ci0JCQl0aGlzLnByaW50KCcgJyk7Ci0JCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQl0aGlzLnByaW50KCIpIHsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMucHJpbnRsbigpOwotCi0JCQl0aGlzLmluZGVudCgpOwotCQkJCXRoaXMucHJpbnQoInRoaXMuIik7ICAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJCXRoaXMucHJpbnQoIiA9ICIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCQl0aGlzLnByaW50KCc7Jyk7Ci0JCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnVuZGVudCgpOwotCi0JCQl0aGlzLnByaW50KCd9Jyk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogQm9keVNvdXJjZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGltcG9ydEVudHJpZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4sIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+KHRoaXMuc29ydGVkSW1wb3J0RW50cmllcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gbmV4dCkgewotCQkJCQlTdHJpbmcgcGtnID0gbmV4dC5nZXRWYWx1ZSgpOwotCQkJCQlpZiAocGtnLmVxdWFscygiIikgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl8fCBwa2cuZXF1YWxzKCJqYXZhLmxhbmciKSAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXx8IHBrZy5lcXVhbHMoRW50aXR5U291cmNlV3JpdGVyLnRoaXMucGFja2FnZU5hbWUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIHRoaXMub3V0LnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGxlbmd0aCgpIHsKLQkJCXJldHVybiAoKFN0cmluZ1dyaXRlcikgdGhpcy5vdXQpLmdldEJ1ZmZlcigpLmxlbmd0aCgpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uZmlnICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uZmlnIHsKLQkJcHJpdmF0ZSBib29sZWFuIGNvbnZlcnRUb0phdmFTdHlsZUlkZW50aWZpZXJzID0gdHJ1ZTsKLQotCQlwcml2YXRlIGJvb2xlYW4gcHJvcGVydHlBY2Nlc3NUeXBlID0gZmFsc2U7ICAvLyBhcyBvcHBvc2VkIHRvICJmaWVsZCIKLQotCQlwcml2YXRlIFN0cmluZyBjb2xsZWN0aW9uVHlwZU5hbWUgPSBTZXQuY2xhc3MuZ2V0TmFtZSgpOwotCQlwcml2YXRlIFN0cmluZyBjb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeCA9ICJfY29sbGVjdGlvbiI7ICAvLyBlLmcuICJwcml2YXRlIFNldDxGb28+IGZvb19jb2xsZWN0aW9uIiAgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgaW50IGZpZWxkVmlzaWJpbGl0eSA9IE1vZGlmaWVyLlBSSVZBVEU7Ci0JCXByaXZhdGUgaW50IG1ldGhvZFZpc2liaWxpdHkgPSBNb2RpZmllci5QVUJMSUM7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMgPSB0cnVlOwotCQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOwotCi0JCXByaXZhdGUgYm9vbGVhbiBzZXJpYWxpemFibGUgPSB0cnVlOwotCQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEID0gdHJ1ZTsKLQotCQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSyA9IHRydWU7ICAvLyBhcyBvcHBvc2VkIHRvIElkQ2xhc3MKLQkJcHJpdmF0ZSBTdHJpbmcgZW1iZWRkZWRJZEF0dHJpYnV0ZU5hbWUgPSAicGsiOyAgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIFN0cmluZyBwcmltYXJ5S2V5TWVtYmVyQ2xhc3NOYW1lID0gIlBLIjsgIC8vJE5PTi1OTFMtMSQKLQotCQkvKioKLQkJICoga2V5ID0gdGFibGUKLQkJICogdmFsdWUgPSBlbnRpdHkgbmFtZQotCQkgKi8KLQkJcHJpdmF0ZSBIYXNoTWFwPFRhYmxlLCBTdHJpbmc+IHRhYmxlcyA9IG5ldyBIYXNoTWFwPFRhYmxlLCBTdHJpbmc+KCk7Ci0KLQkJcHJpdmF0ZSBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBkYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciA9IERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLkRlZmF1bHQuSU5TVEFOQ0U7Ci0KLQkJcHJpdmF0ZSBPdmVyd3JpdGVDb25maXJtZXIgb3ZlcndyaXRlQ29uZmlybWVyID0gT3ZlcndyaXRlQ29uZmlybWVyLk5ldmVyLklOU1RBTkNFOwotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEUgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVEVEID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElDID0gMzsKLQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnZlcnRUb0phdmFTdHlsZUlkZW50aWZpZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuY29udmVydFRvSmF2YVN0eWxlSWRlbnRpZmllcnM7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Q29udmVydFRvSmF2YVN0eWxlSWRlbnRpZmllcnMoYm9vbGVhbiBjb252ZXJ0VG9KYXZhU3R5bGVJZGVudGlmaWVycykgewotCQkJdGhpcy5jb252ZXJ0VG9KYXZhU3R5bGVJZGVudGlmaWVycyA9IGNvbnZlcnRUb0phdmFTdHlsZUlkZW50aWZpZXJzOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcHJvcGVydHlBY2Nlc3NUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMucHJvcGVydHlBY2Nlc3NUeXBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5QWNjZXNzVHlwZShib29sZWFuIHByb3BlcnR5QWNjZXNzVHlwZSkgewotCQkJdGhpcy5wcm9wZXJ0eUFjY2Vzc1R5cGUgPSBwcm9wZXJ0eUFjY2Vzc1R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBmaWVsZEFjY2Vzc1R5cGUoKSB7Ci0JCQlyZXR1cm4gISB0aGlzLnByb3BlcnR5QWNjZXNzVHlwZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGaWVsZEFjY2Vzc1R5cGUoYm9vbGVhbiBmaWVsZEFjY2Vzc1R5cGUpIHsKLQkJCXRoaXMucHJvcGVydHlBY2Nlc3NUeXBlID0gISBmaWVsZEFjY2Vzc1R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbGxlY3Rpb25UeXBlTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLmNvbGxlY3Rpb25UeXBlTmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb2xsZWN0aW9uVHlwZU5hbWUoU3RyaW5nIGNvbGxlY3Rpb25UeXBlTmFtZSkgewotCQkJdGhpcy5jaGVja1JlcXVpcmVkU3RyaW5nKGNvbGxlY3Rpb25UeXBlTmFtZSwgImNvbGxlY3Rpb24gdHlwZSBuYW1lIGlzIHJlcXVpcmVkIik7ICAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmNvbGxlY3Rpb25UeXBlTmFtZSA9IGNvbGxlY3Rpb25UeXBlTmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sbGVjdGlvbkF0dHJpYnV0ZU5hbWVTdWZmaXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeChTdHJpbmcgY29sbGVjdGlvbkF0dHJpYnV0ZU5hbWVTdWZmaXgpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkF0dHJpYnV0ZU5hbWVTdWZmaXggPSBjb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RmllbGRWaXNpYmlsaXR5KCkgewotCQkJcmV0dXJuIHRoaXMuZmllbGRWaXNpYmlsaXR5OwotCQl9Ci0JCS8qKiBlbnRpdHkgZmllbGRzIGNhbm5vdCBiZSAncHVibGljJyAqLwotCQlwdWJsaWMgdm9pZCBzZXRGaWVsZFZpc2liaWxpdHkoaW50IGZpZWxkVmlzaWJpbGl0eSkgewotCQkJc3dpdGNoIChmaWVsZFZpc2liaWxpdHkpIHsKLQkJCQljYXNlIFBSSVZBVEU6Ci0JCQkJY2FzZSBQQUNLQUdFOgotCQkJCWNhc2UgUFJPVEVDVEVEOgotCQkJCQl0aGlzLmZpZWxkVmlzaWJpbGl0eSA9IGZpZWxkVmlzaWJpbGl0eTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBmaWVsZCB2aXNpYmlsaXR5OiAiICsgZmllbGRWaXNpYmlsaXR5KTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlTdHJpbmcgZ2V0RmllbGRWaXNpYmlsaXR5Q2xhdXNlKCkgewotCQkJc3dpdGNoICh0aGlzLmZpZWxkVmlzaWJpbGl0eSkgewotCQkJCWNhc2UgUFJJVkFURToKLQkJCQkJcmV0dXJuICJwcml2YXRlIjsgIC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIFBBQ0tBR0U6Ci0JCQkJCXJldHVybiAiIjsgIC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIFBST1RFQ1RFRDoKLQkJCQkJcmV0dXJuICJwcm90ZWN0ZWQiOyAgLy8kTk9OLU5MUy0xJAotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgZmllbGQgdmlzaWJpbGl0eTogIiArIHRoaXMuZmllbGRWaXNpYmlsaXR5KTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TWV0aG9kVmlzaWJpbGl0eSgpIHsKLQkJCXJldHVybiB0aGlzLm1ldGhvZFZpc2liaWxpdHk7Ci0JCX0KLQkJLyoqIGVudGl0eSBwcm9wZXJ0aWVzIG11c3QgYmUgJ3B1YmxpYycgb3IgJ3Byb3RlY3RlZCcgKi8KLQkJcHVibGljIHZvaWQgc2V0TWV0aG9kVmlzaWJpbGl0eShpbnQgbWV0aG9kVmlzaWJpbGl0eSkgewotCQkJc3dpdGNoIChtZXRob2RWaXNpYmlsaXR5KSB7Ci0JCQkJY2FzZSBQUk9URUNURUQ6Ci0JCQkJY2FzZSBQVUJMSUM6Ci0JCQkJCXRoaXMubWV0aG9kVmlzaWJpbGl0eSA9IG1ldGhvZFZpc2liaWxpdHk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgbWV0aG9kIHZpc2liaWxpdHk6ICIgKyBtZXRob2RWaXNpYmlsaXR5KTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlTdHJpbmcgZ2V0TWV0aG9kVmlzaWJpbGl0eUNsYXVzZSgpIHsKLQkJCXN3aXRjaCAodGhpcy5tZXRob2RWaXNpYmlsaXR5KSB7Ci0JCQkJY2FzZSBQUk9URUNURUQ6Ci0JCQkJCXJldHVybiAicHJvdGVjdGVkIjsgIC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIFBVQkxJQzoKLQkJCQkJcmV0dXJuICJwdWJsaWMiOyAgLy8kTk9OLU5MUy0xJAotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgbWV0aG9kIHZpc2liaWxpdHk6ICIgKyB0aGlzLm1ldGhvZFZpc2liaWxpdHkpOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycygpIHsKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnM7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0R2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycyhib29sZWFuIGdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMpIHsKLQkJCXRoaXMuZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycyA9IGdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnM7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcigpIHsKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yKGJvb2xlYW4gZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IpIHsKLQkJCXRoaXMuZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IgPSBnZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNlcmlhbGl6YWJsZSgpIHsKLQkJCXJldHVybiB0aGlzLnNlcmlhbGl6YWJsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRTZXJpYWxpemFibGUoYm9vbGVhbiBzZXJpYWxpemFibGUpIHsKLQkJCXRoaXMuc2VyaWFsaXphYmxlID0gc2VyaWFsaXphYmxlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKCkgewotCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRChib29sZWFuIGdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCkgewotCQkJdGhpcy5nZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQgPSBnZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkgewotCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSzsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKGJvb2xlYW4gZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSykgewotCQkJdGhpcy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLID0gZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSzsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlSWRDbGFzc0ZvckNvbXBvdW5kUEsoKSB7Ci0JCQlyZXR1cm4gISB0aGlzLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEs7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0R2VuZXJhdGVJZENsYXNzRm9yQ29tcG91bmRQSyhib29sZWFuIGdlbmVyYXRlSWRDbGFzc0ZvckNvbXBvdW5kUEspIHsKLQkJCXRoaXMuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSyA9ICEgZ2VuZXJhdGVJZENsYXNzRm9yQ29tcG91bmRQSzsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RW1iZWRkZWRJZEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbWJlZGRlZElkQXR0cmlidXRlTmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRFbWJlZGRlZElkQXR0cmlidXRlTmFtZShTdHJpbmcgZW1iZWRkZWRJZEF0dHJpYnV0ZU5hbWUpIHsKLQkJCXRoaXMuY2hlY2tSZXF1aXJlZFN0cmluZyhlbWJlZGRlZElkQXR0cmlidXRlTmFtZSwgIkVtYmVkZGVkSWQgYXR0cmlidXRlIG5hbWUgaXMgcmVxdWlyZWQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuZW1iZWRkZWRJZEF0dHJpYnV0ZU5hbWUgPSBlbWJlZGRlZElkQXR0cmlidXRlTmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLnByaW1hcnlLZXlNZW1iZXJDbGFzc05hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZShTdHJpbmcgcHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZSkgewotCQkJdGhpcy5jaGVja1JlcXVpcmVkU3RyaW5nKHByaW1hcnlLZXlNZW1iZXJDbGFzc05hbWUsICJwcmltYXJ5IGtleSBtZW1iZXIgY2xhc3MgbmFtZSBpcyByZXF1aXJlZCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5wcmltYXJ5S2V5TWVtYmVyQ2xhc3NOYW1lID0gcHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZTsKLQkJfQotCi0JCVN0cmluZyBnZXRFbnRpdHlOYW1lKFRhYmxlIHRhYmxlKSB7Ci0JCQlyZXR1cm4gdGhpcy50YWJsZXMuZ2V0KHRhYmxlKTsKLQkJfQotCQlJdGVyYXRvcjxUYWJsZT4gdGFibGVzKCkgewotCQkJcmV0dXJuIHRoaXMudGFibGVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCX0KLQkJaW50IHRhYmxlc1NpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YWJsZXMuc2l6ZSgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFRhYmxlKFRhYmxlIHRhYmxlLCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQkJaWYgKHRhYmxlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRhYmxlIGlzIHJlcXVpcmVkIik7ICAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmNoZWNrUmVxdWlyZWRTdHJpbmcoZW50aXR5TmFtZSwgImVudGl0eSBuYW1lIGlzIHJlcXVpcmVkIik7ICAvLyROT04tTkxTLTEkCi0JCQlpZiAodGhpcy50YWJsZXMuY29udGFpbnNLZXkodGFibGUpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVwbGljYXRlIHRhYmxlOiAiICsgdGFibGUuZ2V0TmFtZSgpKTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICh0aGlzLnRhYmxlcy52YWx1ZXMoKS5jb250YWlucyhlbnRpdHlOYW1lKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBlbnRpdHkgbmFtZTogIiArIGVudGl0eU5hbWUpOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCAhIE5hbWVUb29scy5zdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzKGVudGl0eU5hbWUpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW50aXR5IG5hbWUgaXMgbm90IGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyOiAiICsgZW50aXR5TmFtZSk7ICAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoTmFtZVRvb2xzLkpBVkFfUkVTRVJWRURfV09SRFNfU0VULmNvbnRhaW5zKGVudGl0eU5hbWUpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW50aXR5IG5hbWUgaXMgYSBKYXZhIHJlc2VydmVkIHdvcmQ6ICIgKyBlbnRpdHlOYW1lKTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRoaXMudGFibGVzLnB1dCh0YWJsZSwgZW50aXR5TmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcihEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBkYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcikgewotCQkJaWYgKGRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImRhdGFiYXNlIGFubm90YXRpb24gbmFtZSBidWlsZGVyIGlzIHJlcXVpcmVkIik7ICAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyID0gZGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXI7Ci0JCX0KLQotCQlwdWJsaWMgT3ZlcndyaXRlQ29uZmlybWVyIGdldE92ZXJ3cml0ZUNvbmZpcm1lcigpIHsKLQkJCXJldHVybiB0aGlzLm92ZXJ3cml0ZUNvbmZpcm1lcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGVDb25maXJtZXIoT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lcikgewotCQkJaWYgKG92ZXJ3cml0ZUNvbmZpcm1lciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJvdmVyd3JpdGUgY29uZmlybWVyIGlzIHJlcXVpcmVkIik7ICAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLm92ZXJ3cml0ZUNvbmZpcm1lciA9IG92ZXJ3cml0ZUNvbmZpcm1lcjsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjaGVja1JlcXVpcmVkU3RyaW5nKFN0cmluZyBzdHJpbmcsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCQlpZiAoKHN0cmluZyA9PSBudWxsKSB8fCAoc3RyaW5nLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJ3cml0ZSBjb25maXJtZXIgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgT3ZlcndyaXRlQ29uZmlybWVyIHsKLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkgZ2VuZXJhdG9yIHNob3VsZCBvdmVyd3JpdGUgdGhlIHNwZWNpZmllZAotCQkgKiBmaWxlLgotCQkgKi8KLQkJYm9vbGVhbiBvdmVyd3JpdGUoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQotCQlmaW5hbCBjbGFzcyBBbHdheXMgaW1wbGVtZW50cyBPdmVyd3JpdGVDb25maXJtZXIgewotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBPdmVyd3JpdGVDb25maXJtZXIgSU5TVEFOQ0UgPSBuZXcgQWx3YXlzKCk7Ci0JCQlwdWJsaWMgc3RhdGljIE92ZXJ3cml0ZUNvbmZpcm1lciBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIEFsd2F5cygpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gZXZlcnl0aGluZyB3aWxsIGJlIG92ZXJ3cml0dGVuCi0JCQlwdWJsaWMgYm9vbGVhbiBvdmVyd3JpdGUoU3RyaW5nIGFyZzApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIk92ZXJ3cml0ZUNvbmZpcm1lci5BbHdheXMiOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQotCQlmaW5hbCBjbGFzcyBOZXZlciBpbXBsZW1lbnRzIE92ZXJ3cml0ZUNvbmZpcm1lciB7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE92ZXJ3cml0ZUNvbmZpcm1lciBJTlNUQU5DRSA9IG5ldyBOZXZlcigpOwotCQkJcHVibGljIHN0YXRpYyBPdmVyd3JpdGVDb25maXJtZXIgaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOZXZlcigpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gbm90aGluZyB3aWxsIGJlIG92ZXJ3cml0dGVuCi0JCQlwdWJsaWMgYm9vbGVhbiBvdmVyd3JpdGUoU3RyaW5nIGFyZzApIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJPdmVyd3JpdGVDb25maXJtZXIuTmV2ZXIiOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbiBuYW1lIGJ1aWxkZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogUHJvdmlkZSBhIHBsdWdnYWJsZSB3YXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW5kIGhvdyB0aGUgZW50aXR5IGdlbmVyYXRvcgotCSAqIHByaW50cyB0aGUgbmFtZXMgb2YgdmFyaW91cyBkYXRhYmFzZSBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIHsKLQotCQkvKioKLQkJICogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gZW50aXR5IGFuZCB0aGUgdGFibGUgdG8gd2hpY2ggaXQgaXMgbWFwcGVkLAotCQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgZW50aXR5J3MKLQkJICogVGFibGUgYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LiBSZXR1cm4gbnVsbCBpZiB0aGUgZW50aXR5Ci0JCSAqIG1hcHMgdG8gdGhlIHRhYmxlIGJ5IGRlZmF1bHQuCi0JCSAqLwotCQlTdHJpbmcgYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBlbnRpdHlOYW1lLCBUYWJsZSB0YWJsZSk7Ci0KLQkJLyoqCi0JCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpIGFuZCB0aGUgY29sdW1uCi0JCSAqIHRvIHdoaWNoIGl0IGlzIG1hcHBlZCwKLQkJICogYnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSdzCi0JCSAqIENvbHVtbiBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuIFJldHVybiBudWxsIGlmIHRoZSBhdHRyaWJ1dGUKLQkJICogbWFwcyB0byB0aGUgY29sdW1uIGJ5IGRlZmF1bHQuCi0JCSAqLwotCQlTdHJpbmcgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgQ29sdW1uIGNvbHVtbik7Ci0KLQkJLyoqCi0JCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpIGFuZCB0aGUKLQkJICogbWFueS10by1vbmUgb3IgbWFueS10by1tYW55IGZvcmVpZ24ga2V5IHRvIHdoaWNoIGl0IGlzIG1hcHBlZCwKLQkJICogYnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSdzCi0JCSAqIEpvaW5Db2x1bW4gYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LiBSZXR1cm4gbnVsbCBpZiB0aGUgYXR0cmlidXRlCi0JCSAqIG1hcHMgdG8gdGhlIGpvaW4gY29sdW1uIGJ5IGRlZmF1bHQuCi0JCSAqIFRoZSBzcGVjaWZpZWQgZm9yZWlnbiBrZXkgY29uc2lzdHMgb2YgYSBzaW5nbGUgY29sdW1uIHBhaXIgd2hvc2UKLQkJICogcmVmZXJlbmNlZCBjb2x1bW4gaXMgdGhlIHNpbmdsZS1jb2x1bW4gcHJpbWFyeSBrZXkgb2YgdGhlIGZvcmVpZ24KLQkJICoga2V5J3MgcmVmZXJlbmNlZCB0YWJsZS4KLQkJICovCi0JCVN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KTsKLQotCQkvKioKLQkJICogQnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgYSBKb2luQ29sdW1uCi0JCSAqIGFubm90YXRpb24ncyAnbmFtZScgb3IgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJyBlbGVtZW50LgotCQkgKiBUaGlzIGlzIGNhbGxlZCBmb3IgbWFueS10by1vbmUgYW5kIG1hbnktdG8tbWFueSBtYXBwaW5ncyB3aGVuCi0JCSAqIHRoZSBkZWZhdWx0IGpvaW4gY29sdW1uIG5hbWUgYW5kL29yIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgYXJlL2lzCi0JCSAqIG5vdCBhcHBsaWNhYmxlLgotCQkgKiBAc2VlIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZywgRm9yZWlnbktleSkKLQkJICovCi0JCVN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShDb2x1bW4gY29sdW1uKTsKLQotCQkvKioKLQkJICogQnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgYSBKb2luVGFibGUKLQkJICogYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LgotCQkgKiBUaGlzIGlzIGNhbGxlZCBmb3IgbWFueS10by1tYW55IG1hcHBpbmdzIHdoZW4gdGhlIGRlZmF1bHQKLQkJICogam9pbiB0YWJsZSBuYW1lIGlzIG5vdCBhcHBsaWNhYmxlLgotCQkgKi8KLQkJU3RyaW5nIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbk5hbWUoVGFibGUgdGFibGUpOwotCi0KLQkJLyoqCi0JCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBsZSByZXR1cm5zIHRoZSBkYXRhYmFzZSBvYmplY3QncyBuYW1lLAotCQkgKiB1bmFsdGVyZWQuCi0JCSAqLwotCQlmaW5hbCBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgewotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCQlwdWJsaWMgc3RhdGljIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBidWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGVudGl0eU5hbWUsIFRhYmxlIHRhYmxlKSB7Ci0JCQkJcmV0dXJuIHRhYmxlLmdldE5hbWUoKTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgQ29sdW1uIGNvbHVtbikgewotCQkJCXJldHVybiBjb2x1bW4uZ2V0TmFtZSgpOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCQkJcmV0dXJuIGZvcmVpZ25LZXkuZ2V0Q29sdW1uUGFpcigpLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKENvbHVtbiBjb2x1bW4pIHsKLQkJCQlyZXR1cm4gY29sdW1uLmdldE5hbWUoKTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZShUYWJsZSB0YWJsZSkgewotCQkJCXJldHVybiB0YWJsZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5EZWZhdWx0IjsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0dlblNjb3BlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0dlblNjb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YTc0ZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9HZW5TY29wZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotLyoqCi0gKiBCdWlsZCBhIEdlblRhYmxlIGZvciBlYWNoIGRiLlRhYmxlIHBhc3NlZCBpbi4KLSAqIERldGVybWluZSBhbGwgdGhlIHJlbGF0aW9ucyBhbW9uZyB0aGUgdGFibGVzIGluIHRoZSBzY29wZToKLSAqICAgICBtYW55LXRvLW1hbnkKLSAqICAgICBtYW55LXRvLW9uZQotICogICAgIG9uZS10by1tYW55Ci0gKiBNYWtlIGEgZmlyc3QgcGFzcyB0byBkZXRlcm1pbmUgZWFjaCBlbnRpdHkgdGFibGUncyBKYXZhIGF0dHJpYnV0ZSBuYW1lcywKLSAqIGJlY2F1c2Ugd2Ugd2lsbCBuZWVkIHRoZW0gb24gc3Vic2VxdWVudCBwYXNzZXMuCi0gKi8KLWNsYXNzIEdlblNjb3BlIHsKLQlwcml2YXRlIGZpbmFsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnOwotCXByaXZhdGUgZmluYWwgSGFzaE1hcDxUYWJsZSwgR2VuVGFibGU+IGdlblRhYmxlczsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JR2VuU2NvcGUoRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWcsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZW50aXR5Q29uZmlnID0gZW50aXR5Q29uZmlnOwotCQl0aGlzLmdlblRhYmxlcyA9IG5ldyBIYXNoTWFwPFRhYmxlLCBHZW5UYWJsZT4oZW50aXR5Q29uZmlnLnRhYmxlc1NpemUoKSk7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQocHJvZ3Jlc3NNb25pdG9yLCBKcHRHZW5NZXNzYWdlcy5HZW5TY29wZV90YXNrTmFtZSwgNCk7Ci0KLQkJdGhpcy5idWlsZEdlblRhYmxlcygpOwotCQlzbS53b3JrZWQoMSk7Ci0JCXRoaXMuY2hlY2tDYW5jZWxlZChzbSk7Ci0KLQkJdGhpcy5idWlsZE1hbnlUb01hbnlSZWxhdGlvbnMoKTsKLQkJc20ud29ya2VkKDEpOwotCQl0aGlzLmNoZWNrQ2FuY2VsZWQoc20pOwotCi0JCXRoaXMuYnVpbGRNYW55VG9PbmVSZWxhdGlvbnMoKTsgIC8vIHRoaXMgd2lsbCBhbHNvIGJ1aWxkIHRoZSBjb3JyZXNwb25kaW5nIG9uZS10by1tYW55IHJlbGF0aW9ucwotCQlzbS53b3JrZWQoMSk7Ci0JCXRoaXMuY2hlY2tDYW5jZWxlZChzbSk7Ci0KLQkJdGhpcy5idWlsZEF0dHJpYnV0ZU5hbWVzKCk7Ci0JCXNtLndvcmtlZCgxKTsKLQkJdGhpcy5jaGVja0NhbmNlbGVkKHNtKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRHZW5UYWJsZXMoKSB7Ci0JCWZvciAoSXRlcmF0b3I8VGFibGU+IHN0cmVhbSA9IGVudGl0eUNvbmZpZy50YWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlUYWJsZSB0YWJsZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQl0aGlzLmdlblRhYmxlcy5wdXQodGFibGUsIG5ldyBHZW5UYWJsZSh0aGlzLCB0YWJsZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZmluZCBhbGwgdGhlICJqb2luIiB0YWJsZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGRNYW55VG9NYW55UmVsYXRpb25zKCkgewotCQlmb3IgKEl0ZXJhdG9yPEdlblRhYmxlPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCkuYnVpbGRKb2luVGFibGVSZWxhdGlvbigpOwotCQl9Ci0KLQkJLy8gcmV2ZXJ0IGFueSAiam9pbiIgdGFibGUgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgdGFibGUgYmFjayB0byBhbiAiZW50aXR5IiB0YWJsZQotCQlIYXNoU2V0PEdlblRhYmxlPiByZWZlcmVuY2VkR2VuVGFibGVzID0gdGhpcy5idWlsZFJlZmVyZW5jZWRHZW5UYWJsZXMoKTsKLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy5qb2luR2VuVGFibGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJR2VuVGFibGUgam9pbkdlblRhYmxlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChyZWZlcmVuY2VkR2VuVGFibGVzLmNvbnRhaW5zKGpvaW5HZW5UYWJsZSkpIHsKLQkJCQlqb2luR2VuVGFibGUuY2xlYXJKb2luVGFibGVSZWxhdGlvbigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZmluZCBhbGwgdGhlIG1hbnktdG8tb25lIGFuZCBjb3JyZXNwb25kaW5nIG9uZS10by1tYW55IHJlbGF0aW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBidWlsZE1hbnlUb09uZVJlbGF0aW9ucygpIHsKLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy5lbnRpdHlHZW5UYWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLmJ1aWxkTWFueVRvT25lUmVsYXRpb25zKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBkZXRlcm1pbmUgYWxsIHRoZSBKYXZhIGF0dHJpYnV0ZSBuYW1lcyB1cC1mcm9udCBiZWNhdXNlIHdlIHdpbGwKLQkgKiBuZWVkIHRoZW0gZm9yIHRoaW5ncyBsaWtlICdtYXBwZWRCeScgYW5ub3RhdGlvbiBlbGVtZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCBidWlsZEF0dHJpYnV0ZU5hbWVzKCkgewotCQlmb3IgKEl0ZXJhdG9yPEdlblRhYmxlPiBzdHJlYW0gPSB0aGlzLmVudGl0eUdlblRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCkuYnVpbGRBdHRyaWJ1dGVOYW1lcygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBhY2thZ2UgQVBJICoqKioqKioqKioKLQotCUVudGl0eUdlbmVyYXRvci5Db25maWcgZ2V0RW50aXR5Q29uZmlnKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHlDb25maWc7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIG9ubHkgdGhlIGdlbiB0YWJsZXMgdGhhdCBhcmUgc3VpdGFibGUgZm9yIGdlbmVyYXRpbmcKLQkgKiBlbnRpdGllcyAoaS5lLiBleGNsdWRlIHRoZSAiam9pbiIgdGFibGVzKQotCSAqLwotCUl0ZXJhdG9yPEdlblRhYmxlPiBlbnRpdHlHZW5UYWJsZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8R2VuVGFibGUsIEdlblRhYmxlPih0aGlzLmdlblRhYmxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChHZW5UYWJsZSBnZW5UYWJsZSkgewotCQkJCXJldHVybiAhIGdlblRhYmxlLmlzSm9pblRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JaW50IGVudGl0eVRhYmxlc1NpemUoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmVudGl0eUdlblRhYmxlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGdlbiB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZGIgdGFibGU7Ci0JICogcmV0dXJuIG51bGwgaWYgdGhlIGdlbiB0YWJsZSBpcyBub3QgImluLXNjb3BlIiAoZS5nLiBhIGRiIGZvcmVpZ24ga2V5Ci0JICogbWlnaHQgaGF2ZSBhIHJlZmVyZW5jZSB0byBhIGRiIHRhYmxlIHRoYXQgd2FzIG5vdCBpbmNsdWRlZCBpbiB0aGUKLQkgKiBzY29wZSwgc28gd2Ugd29uJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZ2VuIHRhYmxlKQotCSAqLwotCUdlblRhYmxlIGdldEdlblRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmdlblRhYmxlcy5nZXQodGFibGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgSXRlcmF0b3I8R2VuVGFibGU+IGdlblRhYmxlcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuVGFibGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2VuVGFibGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuVGFibGVzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gb25seSB0aGUgImpvaW4iIGdlbiB0YWJsZXMKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPEdlblRhYmxlPiBqb2luR2VuVGFibGVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEdlblRhYmxlLCBHZW5UYWJsZT4odGhpcy5nZW5UYWJsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoR2VuVGFibGUgZ2VuVGFibGUpIHsKLQkJCQlyZXR1cm4gZ2VuVGFibGUuaXNKb2luVGFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBhIHNldCBvZiB0aGUgZ2VuIHRhYmxlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IG90aGVyIGdlbiB0YWJsZXMKLQkgKiBpbiB0aGUgc2NvcGUKLQkgKi8KLQlwcml2YXRlIEhhc2hTZXQ8R2VuVGFibGU+IGJ1aWxkUmVmZXJlbmNlZEdlblRhYmxlcygpIHsKLQkJSGFzaFNldDxHZW5UYWJsZT4gcmVmZXJlbmNlZEdlblRhYmxlcyA9IG5ldyBIYXNoU2V0PEdlblRhYmxlPih0aGlzLmdlblRhYmxlc1NpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3I8R2VuVGFibGU+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKS5hZGRSZWZlcmVuY2VkR2VuVGFibGVzVG8ocmVmZXJlbmNlZEdlblRhYmxlcyk7Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZWRHZW5UYWJsZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2FuY2VsZWQoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJaWYgKHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5nZW5UYWJsZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9HZW5UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9HZW5UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmUyNjA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvR2VuVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk5hbWVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci0KLS8qKgotICogYXNzb2NpYXRlIGEgdGFibGUgd2l0aCB0aGUgdmFyaW91cyByZWxhdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbgotICogZ2VuZXJhdGluZyB0aGUgZW50aXR5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhYmxlCi0gKi8KLWNsYXNzIEdlblRhYmxlIHsKLQlwcml2YXRlIGZpbmFsIEdlblNjb3BlIHNjb3BlOwotCXByaXZhdGUgZmluYWwgVGFibGUgdGFibGU7Ci0KLQkvLyB0aGVzZSByZWxhdGlvbnMgY2Fubm90IGJlIGJ1aWx0IHVudGlsIGFmdGVyIHdlIGhhdmUgYnVpbHQgYWxsIHRoZSBzY29wZSdzIHRhYmxlcwotCXByaXZhdGUgTWFueVRvTWFueVJlbGF0aW9uIGpvaW5UYWJsZVJlbGF0aW9uOwotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PE1hbnlUb01hbnlSZWxhdGlvbj4gb3duZWRNYW55VG9NYW55UmVsYXRpb25zID0gbmV3IEFycmF5TGlzdDxNYW55VG9NYW55UmVsYXRpb24+KCk7Ci0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8TWFueVRvTWFueVJlbGF0aW9uPiBub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE1hbnlUb01hbnlSZWxhdGlvbj4oKTsKLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxNYW55VG9PbmVSZWxhdGlvbj4gbWFueVRvT25lUmVsYXRpb25zID0gbmV3IEFycmF5TGlzdDxNYW55VG9PbmVSZWxhdGlvbj4oKTsKLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxPbmVUb01hbnlSZWxhdGlvbj4gb25lVG9NYW55UmVsYXRpb25zID0gbmV3IEFycmF5TGlzdDxPbmVUb01hbnlSZWxhdGlvbj4oKTsKLQlwcml2YXRlIGZpbmFsIEhhc2hTZXQ8Q29sdW1uPiBmb3JlaWduS2V5Q29sdW1ucyA9IG5ldyBIYXNoU2V0PENvbHVtbj4oKTsKLQotCS8vIGtleT1jb2x1bW4vcmVsYXRpb247IHZhbHVlPWVudGl0eSBhdHRyaWJ1dGUgKGZpZWxkL3Byb3BlcnR5KSBuYW1lCi0JcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPE9iamVjdCwgU3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgU3RyaW5nPigpOwotCS8vIGtleSB0byAnYXR0cmlidXRlTmFtZXMnIGZvciB0aGUgb3B0aW9uYWwgZW1iZWRkZWQgSUQgYXR0cmlidXRlIG5hbWUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgRU1CRURERURfSURfVklSVFVBTF9DT0xVTU4gPSBuZXcgT2JqZWN0KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUdlblRhYmxlKEdlblNjb3BlIHNjb3BlLCBUYWJsZSB0YWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnNjb3BlID0gc2NvcGU7Ci0JCXRoaXMudGFibGUgPSB0YWJsZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGFja2FnZSBBUEkgKioqKioqKioqKgotCi0JRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBnZXRFbnRpdHlDb25maWcoKSB7Ci0JCXJldHVybiB0aGlzLnNjb3BlLmdldEVudGl0eUNvbmZpZygpOwotCX0KLQotCS8qKgotCSAqIGRldGVybWluZSB3aGV0aGVyIHRoZSB0YWJsZSBpcyBhICJqb2luIiB0YWJsZSB3aXRoaW4gdGhlIHRhYmxlJ3Mgc2NvcGU7Ci0JICogdGhpcyBjYW4gYmUgcmVtb3ZlZCwgbGF0ZXIsIGlmIHdlIGZpbmQgYW5vdGhlciB0YWJsZSByZWZlcmVuY2VzIHRoZSwKLQkgKiBzZWVtaW5nbHksIGpvaW4gdGFibGUKLQkgKiBAc2VlICNjbGVhckpvaW5UYWJsZVJlbGF0aW9uKCkgKGFuZCBjYWxsZXJzKQotCSAqLwotCXZvaWQgYnVpbGRKb2luVGFibGVSZWxhdGlvbigpIHsKLQkJaWYgKCAhIHRoaXMudGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKSB7Ci0JCQlyZXR1cm47ICAvLyB0aGUgdGFibGUgbXVzdCBoYXZlIGV4YWN0bHkgMiBmb3JlaWduIGtleXMKLQkJfQotCQlGb3JlaWduS2V5IG93bmluZ0ZLID0gdGhpcy50YWJsZS5nZXRKb2luVGFibGVPd25pbmdGb3JlaWduS2V5KCk7Ci0JCUdlblRhYmxlIG93bmluZ0dlblRhYmxlID0gdGhpcy5zY29wZS5nZXRHZW5UYWJsZShvd25pbmdGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0JCWlmIChvd25pbmdHZW5UYWJsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47ICAvLyBib3RoIHRhYmxlcyBtdXN0IGJlIGluIHRoZSBzY29wZQotCQl9Ci0JCUZvcmVpZ25LZXkgbm9uT3duaW5nRksgPSB0aGlzLnRhYmxlLmdldEpvaW5UYWJsZU5vbk93bmluZ0ZvcmVpZ25LZXkoKTsKLQkJR2VuVGFibGUgbm9uT3duaW5nR2VuVGFibGUgPSB0aGlzLnNjb3BlLmdldEdlblRhYmxlKG5vbk93bmluZ0ZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQkJaWYgKG5vbk93bmluZ0dlblRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsgIC8vIGJvdGggdGFibGVzIG11c3QgYmUgaW4gdGhlIHNjb3BlCi0JCX0KLQkJdGhpcy5qb2luVGFibGVSZWxhdGlvbiA9IG5ldyBNYW55VG9NYW55UmVsYXRpb24oCi0JCQkJCQkJCQkJCXRoaXMsCi0JCQkJCQkJCQkJCW93bmluZ0ZLLAotCQkJCQkJCQkJCQlvd25pbmdHZW5UYWJsZSwKLQkJCQkJCQkJCQkJbm9uT3duaW5nRkssCi0JCQkJCQkJCQkJCW5vbk93bmluZ0dlblRhYmxlCi0JCQkJCQkJCQkJKTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VkIGJ5IHRoZSBzY29wZSB0byBmaWd1cmUgb3V0IHdoZXRoZXIgImpvaW4iIHRhYmxlcyBzaG91bGQgYmUKLQkgKiBjb252ZXJ0ZWQgdG8gImVudGl0eSIgdGFibGVzCi0JICovCi0Jdm9pZCBhZGRSZWZlcmVuY2VkR2VuVGFibGVzVG8oU2V0PEdlblRhYmxlPiByZWZlcmVuY2VkVGFibGVzKSB7Ci0JCWZvciAoSXRlcmF0b3I8Rm9yZWlnbktleT4gc3RyZWFtID0gdGhpcy50YWJsZS5mb3JlaWduS2V5cygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUZvcmVpZ25LZXkgZmsgPSBzdHJlYW0ubmV4dCgpOwotCQkJR2VuVGFibGUgZ2VuVGFibGUgPSB0aGlzLnNjb3BlLmdldEdlblRhYmxlKGZrLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQkJCWlmIChnZW5UYWJsZSAhPSBudWxsKSB7Ci0JCQkJcmVmZXJlbmNlZFRhYmxlcy5hZGQoZ2VuVGFibGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhlIHNjb3BlIGNsZWFycyB0aGUgam9pbiB0YWJsZSByZWxhdGlvbiBpZiB0aGVyZSBhcmUgYW55IHJlZmVyZW5jZXMKLQkgKiB0byB0aGUgam9pbiB0YWJsZSBmcm9tIG90aGVyIHRhYmxlcyBpbiB0aGUgc2NvcGUKLQkgKi8KLQl2b2lkIGNsZWFySm9pblRhYmxlUmVsYXRpb24oKSB7Ci0JCXRoaXMuam9pblRhYmxlUmVsYXRpb24uY2xlYXIoKTsKLQkJdGhpcy5qb2luVGFibGVSZWxhdGlvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogZmluZCAiaW4tc2NvcGUiIGZvcmVpZ24ga2V5cwotCSAqLwotCXZvaWQgYnVpbGRNYW55VG9PbmVSZWxhdGlvbnMoKSB7Ci0JCWZvciAoSXRlcmF0b3I8Rm9yZWlnbktleT4gc3RyZWFtID0gdGhpcy50YWJsZS5mb3JlaWduS2V5cygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUZvcmVpZ25LZXkgZmsgPSBzdHJlYW0ubmV4dCgpOwotCQkJR2VuVGFibGUgcmVmZXJlbmNlZEdlblRhYmxlID0gdGhpcy5zY29wZS5nZXRHZW5UYWJsZShmay5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0JCQlpZiAocmVmZXJlbmNlZEdlblRhYmxlICE9IG51bGwpIHsKLQkJCQl0aGlzLm1hbnlUb09uZVJlbGF0aW9ucy5hZGQobmV3IE1hbnlUb09uZVJlbGF0aW9uKHRoaXMsIGZrLCByZWZlcmVuY2VkR2VuVGFibGUpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIG5vdyB0aGF0IGFsbCB0aGUgcmVsYXRpb25zIGFyZSBpbiBwbGFjZSwgd2UgY2FuIGNvbmZpZ3VyZSB0aGUgSmF2YQotCSAqIGF0dHJpYnV0ZSBuYW1lcwotCSAqLwotCXZvaWQgYnVpbGRBdHRyaWJ1dGVOYW1lcygpIHsKLQkJaWYgKCh0aGlzLnRhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID4gMSkgJiYgdGhpcy5nZXRFbnRpdHlDb25maWcoKS5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpIHsKLQkJCS8vIGlmIHdlIGFyZSBnb2luZyB0byBnZW5lcmF0ZSBhbiBFbWJlZGRlZElkIGF0dHJpYnV0ZSwgYWRkIGl0IHRvCi0JCQkvLyAnYXR0cmlidXRlTmFtZXMnIHNvIHdlIGRvbid0IGNvbGxpZGUgd2l0aCBpdCBsYXRlciwgd2hlbiBnZW5lcmF0aW5nCi0JCQkvLyBhdHRyaWJ1dGUgbmFtZXMgZm9yIHRoZSBjb2x1bW5zIGV0Yy4KLQkJCXRoaXMuY29uZmlndXJlQXR0cmlidXRlTmFtZShFTUJFRERFRF9JRF9WSVJUVUFMX0NPTFVNTiwgdGhpcy5nZXRFbnRpdHlDb25maWcoKS5nZXRFbWJlZGRlZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJfQotCi0JCS8vIGdhdGhlciB1cCBhbGwgdGhlIHRhYmxlJ3MgY29sdW1ucy4uLgotCQlTZXQ8Q29sdW1uPiBjb2x1bW5zID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLnRhYmxlLmNvbHVtbnMoKSwgdGhpcy50YWJsZS5jb2x1bW5zU2l6ZSgpKTsKLQkJLy8gLi4ucmVtb3ZlIHRoZSBjb2x1bW5zIHRoYXQgYmVsb25nIGV4Y2x1c2l2ZWx5IHRvIG1hbnktdG8tb25lIGZvcmVpZ24ga2V5cy4uLgotCQl0aGlzLmJ1aWxkTWFueVRvT25lQXR0cmlidXRlTmFtZXMoY29sdW1ucyk7Ci0JCS8vIC4uLmFuZCB1c2UgdGhlIHJlbWFpbmluZyBjb2x1bW5zIHRvIGdlbmVyYXRlICJiYXNpYyIgYXR0cmlidXRlIG5hbWVzCi0JCXRoaXMuYnVpbGRCYXNpY0F0dHJpYnV0ZU5hbWVzKGNvbHVtbnMpOwotCi0JCXRoaXMuYnVpbGRPbmVUb01hbnlBdHRyaWJ1dGVOYW1lcygpOwotCQl0aGlzLmJ1aWxkT3duZWRNYW55VG9NYW55QXR0cmlidXRlTmFtZXMoKTsKLQkJdGhpcy5idWlsZE5vbk93bmVkTWFueVRvTWFueUF0dHJpYnV0ZU5hbWVzKCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjb2x1bW5zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHRhYmxlJ3MgcHJpbWFyeSBrZXkKLQkgKiBidXQgYXJlIGFsc28gcGFydCBvZiBhbiAiaW4tc2NvcGUiIGZvcmVpZ24ga2V5Ci0JICovCi0JSXRlcmF0b3I8Q29sdW1uPiByZWFkT25seVByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENvbHVtbiwgQ29sdW1uPih0aGlzLnRhYmxlLnByaW1hcnlLZXlDb2x1bW5zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENvbHVtbiBwa0NvbHVtbikgewotCQkJCXJldHVybiBwa0NvbHVtbi5pc0ZvcmVpZ25LZXlDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGNvbHVtbnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgdGFibGUncyBwcmltYXJ5IGtleQotCSAqIGJ1dCBhcmUgTk9UIHBhcnQgb2YgYW55ICJpbi1zY29wZSIgZm9yZWlnbiBrZXkKLQkgKi8KLQlJdGVyYXRvcjxDb2x1bW4+IHdyaXRhYmxlUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Q29sdW1uLCBDb2x1bW4+KHRoaXMudGFibGUucHJpbWFyeUtleUNvbHVtbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQ29sdW1uIHBrQ29sdW1uKSB7Ci0JCQkJcmV0dXJuICEgcGtDb2x1bW4uaXNGb3JlaWduS2V5Q29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjb2x1bW5zIHRoYXQgTkVJVEhFUiBwYXJ0IG9mIHRoZSB0YWJsZSdzIHByaW1hcnkga2V5Ci0JICogTk9SIHBhcnQgb2YgYW55IGZvcmVpZ24ga2V5Ci0JICovCi0JSXRlcmF0b3I8Q29sdW1uPiBub25QcmltYXJ5S2V5QmFzaWNDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENvbHVtbiwgQ29sdW1uPih0aGlzLnRhYmxlLmNvbHVtbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQ29sdW1uIGNvbHVtbikgewotCQkJCXJldHVybiAhIChjb2x1bW4uaXNQcmltYXJ5S2V5Q29sdW1uKCkgfHwgY29sdW1uLmlzRm9yZWlnbktleUNvbHVtbigpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlUYWJsZSBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGU7Ci0JfQotCi0JU3RyaW5nIGdldEVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eUNvbmZpZygpLmdldEVudGl0eU5hbWUodGhpcy50YWJsZSk7Ci0JfQotCi0JYm9vbGVhbiBpc0pvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlUmVsYXRpb24gIT0gbnVsbDsKLQl9Ci0KLQl2b2lkIGFkZE93bmVkTWFueVRvTWFueVJlbGF0aW9uKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbikgewotCQl0aGlzLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucy5hZGQocmVsYXRpb24pOwotCX0KLQotCXZvaWQgcmVtb3ZlT3duZWRNYW55VG9NYW55UmVsYXRpb24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXRoaXMub3duZWRNYW55VG9NYW55UmVsYXRpb25zLnJlbW92ZShyZWxhdGlvbik7Ci0JfQotCi0Jdm9pZCBhZGROb25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24pIHsKLQkJdGhpcy5ub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMuYWRkKHJlbGF0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlbW92ZU5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9uKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbikgewotCQl0aGlzLm5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9ucy5yZW1vdmUocmVsYXRpb24pOwotCX0KLQotCXZvaWQgYWRkT25lVG9NYW55UmVsYXRpb24oT25lVG9NYW55UmVsYXRpb24gcmVsYXRpb24pIHsKLQkJdGhpcy5vbmVUb01hbnlSZWxhdGlvbnMuYWRkKHJlbGF0aW9uKTsKLQl9Ci0KLQlJdGVyYXRvcjxNYW55VG9PbmVSZWxhdGlvbj4gbWFueVRvT25lUmVsYXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5tYW55VG9PbmVSZWxhdGlvbnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlJdGVyYXRvcjxPbmVUb01hbnlSZWxhdGlvbj4gb25lVG9NYW55UmVsYXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5vbmVUb01hbnlSZWxhdGlvbnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlJdGVyYXRvcjxNYW55VG9NYW55UmVsYXRpb24+IG93bmVkTWFueVRvTWFueVJlbGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMub3duZWRNYW55VG9NYW55UmVsYXRpb25zLml0ZXJhdG9yKCk7Ci0JfQotCi0JSXRlcmF0b3I8TWFueVRvTWFueVJlbGF0aW9uPiBub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9ucy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIHRoZSBrZXkgY2FuIGJlIGEgY29sdW1uIG9yIHJlbGF0aW9uIG9yICNFTUJFRERFRF9JRF9WSVJUVUFMX0NPTFVNTgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVGb3JfKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZU5hbWVzLmdldChvKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIHdpbGwgcmV0dXJuIG51bGwgaWYgd2UgZG9uJ3Qgd2FudCBhbiBlbWJlZGRlZCBpZCBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZUZvckVtYmVkZGVkSWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU5hbWVGb3JfKEVNQkVEREVEX0lEX1ZJUlRVQUxfQ09MVU1OKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZUZvcihDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU5hbWVGb3JfKGNvbHVtbik7Ci0JfQotCi0JU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVGb3IoTWFueVRvT25lUmVsYXRpb24gcmVsYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTmFtZUZvcl8ocmVsYXRpb24pOwotCX0KLQotCVN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lRm9yKE9uZVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU5hbWVGb3JfKHJlbGF0aW9uKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZUZvcihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTmFtZUZvcl8ocmVsYXRpb24pOwotCX0KLQotCVN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5nZXROYW1lKCk7Ci0JfQotCi0JYm9vbGVhbiBqb2luVGFibGVOYW1lSXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiB3aGlsZSB3ZSBhcmUgZmlndXJpbmcgb3V0IHRoZSBuYW1lcyBmb3IgdGhlIG06MSBhdHRyaWJ1dGVzLCByZW1vdmUgZnJvbSB0aGUKLQkgKiBzcGVjaWZpZWQgc2V0IG9mIGNvbHVtbnMgdGhlIGNvbHVtbnMgdGhhdCBhcmUgb25seSBwYXJ0IG9mIHRoZSBmb3JlaWduIGtleXMKLQkgKiAobGVhdmluZyB0aGUgcmVtYWluaW5nIGNvbHVtbnMgZm9yIGJhc2ljIGF0dHJpYnV0ZXMpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTWFueVRvT25lQXR0cmlidXRlTmFtZXMoU2V0PENvbHVtbj4gY29sdW1ucykgewotCQlmb3IgKE1hbnlUb09uZVJlbGF0aW9uIHJlbGF0aW9uIDogdGhpcy5tYW55VG9PbmVSZWxhdGlvbnMpIHsKLQkJCUNvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoY29sdW1ucywgcmVsYXRpb24uZ2V0Rm9yZWlnbktleSgpLm5vblByaW1hcnlLZXlCYXNlQ29sdW1ucygpKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5mb3JlaWduS2V5Q29sdW1ucywgcmVsYXRpb24uZ2V0Rm9yZWlnbktleSgpLmJhc2VDb2x1bW5zKCkpOwotCQkJcmVsYXRpb24uc2V0TWFwcGVkQnkodGhpcy5jb25maWd1cmVBdHRyaWJ1dGVOYW1lKHJlbGF0aW9uLCByZWxhdGlvbi5nZXRBdHRyaWJ1dGVOYW1lKCkpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgdW5pcXVlIGF0dHJpYnV0ZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkICJiYXNpYyIgY29sdW1ucywKLQkgKiBjaGVja2luZyBmb3IgbmFtZSBjb2xsaXNpb25zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQmFzaWNBdHRyaWJ1dGVOYW1lcyhTZXQ8Q29sdW1uPiBjb2x1bW5zKSB7Ci0JCWZvciAoQ29sdW1uIGNvbHVtbiA6IGNvbHVtbnMpIHsKLQkJCXRoaXMuY29uZmlndXJlQXR0cmlidXRlTmFtZShjb2x1bW4sIGNvbHVtbi5nZXROYW1lKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkT25lVG9NYW55QXR0cmlidXRlTmFtZXMoKSB7Ci0JCWZvciAoT25lVG9NYW55UmVsYXRpb24gcmVsYXRpb24gOiB0aGlzLm9uZVRvTWFueVJlbGF0aW9ucykgewotCQkJdGhpcy5jb25maWd1cmVBdHRyaWJ1dGVOYW1lKHJlbGF0aW9uLCByZWxhdGlvbi5nZXRKYXZhQXR0cmlidXRlTmFtZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE93bmVkTWFueVRvTWFueUF0dHJpYnV0ZU5hbWVzKCkgewotCQlmb3IgKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbiA6IHRoaXMub3duZWRNYW55VG9NYW55UmVsYXRpb25zKSB7Ci0JCQlyZWxhdGlvbi5zZXRNYXBwZWRCeSh0aGlzLmNvbmZpZ3VyZUF0dHJpYnV0ZU5hbWUocmVsYXRpb24sIHJlbGF0aW9uLmdldE93bmVkSmF2YUF0dHJpYnV0ZU5hbWUoKSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTm9uT3duZWRNYW55VG9NYW55QXR0cmlidXRlTmFtZXMoKSB7Ci0JCWZvciAoTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uIDogdGhpcy5ub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMpIHsKLQkJCXRoaXMuY29uZmlndXJlQXR0cmlidXRlTmFtZShyZWxhdGlvbiwgcmVsYXRpb24uZ2V0Tm9uT3duZWRKYXZhQXR0cmlidXRlTmFtZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgbmFtZSB0byBzb21ldGhpbmcgdW5pcXVlIGZvciB0aGUgZW50aXR5LAotCSAqIGNvbnZlcnRpbmcgaXQgdG8gc29tZXRoaW5nIEphdmEtbGlrZSBpZiB0aGUgY29uZmlnIGZsYWcgaXMgc2V0LgotCSAqIFN0b3JlIHRoZSBjYWxjdWxhdGVkIG5hbWUgc28gd2UgY2FuIGdldCBpdCBiYWNrIGxhdGVyLCB3aGVuIHdlCi0JICogYXJlIGdlbmVyYXRpbmcgc291cmNlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNvbmZpZ3VyZUF0dHJpYnV0ZU5hbWUoT2JqZWN0IG8sIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBhdHRyaWJ1dGVOYW1lOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdBdHRyaWJ1dGVOYW1lcyA9IHRoaXMuYXR0cmlidXRlTmFtZXMudmFsdWVzKCk7Ci0JCWlmICh0aGlzLmdldEVudGl0eUNvbmZpZygpLmNvbnZlcnRUb0phdmFTdHlsZUlkZW50aWZpZXJzKCkpIHsKLQkJCXJlc3VsdCA9IEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUocmVzdWx0LCBleGlzdGluZ0F0dHJpYnV0ZU5hbWVzKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGZpcnN0LCBjb252ZXJ0IHRoZSBhdHRyaWJ1dGUgbmFtZSB0byBhIGxlZ2FsIEphdmEgaWRlbnRpZmllcgotCQkJcmVzdWx0ID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKHJlc3VsdCk7Ci0JCQkvLyB0aGVuIG1ha2Ugc3VyZSBpdCdzIHVuaXF1ZQotCQkJcmVzdWx0ID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKGF0dHJpYnV0ZU5hbWUsIGV4aXN0aW5nQXR0cmlidXRlTmFtZXMpOwotCQl9Ci0JCXRoaXMuYXR0cmlidXRlTmFtZXMucHV0KG8sIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy50YWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0pQQS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9KUEEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2MDFlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0pQQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotCi0vKioKLSAqIEpQQSBKYXZhLXJlbGF0ZWQgc3R1ZmYgKGFubm90YXRpb25zIGV0Yy4pCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi0vLyBUT0RPIG1vdmUgdG8gdXRpbGl0eT8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBKUEEgewotCi0JLy8gSlBBIHBhY2thZ2UKLQlTdHJpbmcgUEFDS0FHRSA9ICJqYXZheC5wZXJzaXN0ZW5jZSI7Ci0JU3RyaW5nIFBBQ0tBR0VfID0gUEFDS0FHRSArICcuJzsKLQotCi0JLy8gKioqKioqKioqKiBBUEkgKioqKioqKioqKgotCi0JLy8gSlBBIGFubm90YXRpb25zCi0JU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFID0gUEFDS0FHRV8gKyAiQXNzb2NpYXRpb25PdmVycmlkZSI7Ci0JCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlMgPSAiam9pbkNvbHVtbnMiOwotCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERVMgPSBQQUNLQUdFXyArICJBc3NvY2lhdGlvbk92ZXJyaWRlcyI7Ci0JCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERVNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFID0gUEFDS0FHRV8gKyAiQXR0cmlidXRlT3ZlcnJpZGUiOwotCQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU4gPSAiY29sdW1uIjsKLQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFUyA9IFBBQ0tBR0VfICsgIkF0dHJpYnV0ZU92ZXJyaWRlcyI7Ci0JCVN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEJBU0lDID0gUEFDS0FHRV8gKyAiQmFzaWMiOwotCQlTdHJpbmcgQkFTSUNfX0ZFVENIID0gImZldGNoIjsKLQkJU3RyaW5nIEJBU0lDX19PUFRJT05BTCA9ICJvcHRpb25hbCI7Ci0JU3RyaW5nIENPTFVNTiA9IFBBQ0tBR0VfICsgIkNvbHVtbiI7Ci0JCVN0cmluZyBDT0xVTU5fX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBDT0xVTU5fX1VOSVFVRSA9ICJ1bmlxdWUiOwotCQlTdHJpbmcgQ09MVU1OX19OVUxMQUJMRSA9ICJudWxsYWJsZSI7Ci0JCVN0cmluZyBDT0xVTU5fX0lOU0VSVEFCTEUgPSAiaW5zZXJ0YWJsZSI7Ci0JCVN0cmluZyBDT0xVTU5fX1VQREFUQUJMRSA9ICJ1cGRhdGFibGUiOwotCQlTdHJpbmcgQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9ICJjb2x1bW5EZWZpbml0aW9uIjsKLQkJU3RyaW5nIENPTFVNTl9fVEFCTEUgPSAidGFibGUiOwotCQlTdHJpbmcgQ09MVU1OX19MRU5HVEggPSAibGVuZ3RoIjsKLQkJU3RyaW5nIENPTFVNTl9fUFJFQ0lTSU9OID0gInByZWNpc2lvbiI7Ci0JCVN0cmluZyBDT0xVTU5fX1NDQUxFID0gInNjYWxlIjsKLQlTdHJpbmcgQ09MVU1OX1JFU1VMVCA9IFBBQ0tBR0VfICsgIkNvbHVtblJlc3VsdCI7Ci0JCVN0cmluZyBDT0xVTU5fUkVTVUxUX19OQU1FID0gIm5hbWUiOwotCVN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTiA9IFBBQ0tBR0VfICsgIkRpc2NyaW1pbmF0b3JDb2x1bW4iOwotCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9DT0xVTU5fX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFID0gImRpc2NyaW1pbmF0b3JUeXBlIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9ICJjb2x1bW5EZWZpbml0aW9uIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEggPSAibGVuZ3RoIjsKLQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9WQUxVRSA9IFBBQ0tBR0VfICsgIkRpc2NyaW1pbmF0b3JWYWx1ZSI7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX1ZBTFVFX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEVNQkVEREFCTEUgPSBQQUNLQUdFXyArICJFbWJlZGRhYmxlIjsKLQlTdHJpbmcgRU1CRURERUQgPSBQQUNLQUdFXyArICJFbWJlZGRlZCI7Ci0JU3RyaW5nIEVNQkVEREVEX0lEID0gUEFDS0FHRV8gKyAiRW1iZWRkZWRJZCI7Ci0JU3RyaW5nIEVOVElUWSA9IFBBQ0tBR0VfICsgIkVudGl0eSI7Ci0JCVN0cmluZyBFTlRJVFlfX05BTUUgPSAibmFtZSI7Ci0JU3RyaW5nIEVOVElUWV9MSVNURU5FUlMgPSBQQUNLQUdFXyArICJFbnRpdHlMaXN0ZW5lcnMiOwotCQlTdHJpbmcgRU5USVRZX0xJU1RFTkVSU19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBFTlRJVFlfUkVTVUxUID0gUEFDS0FHRV8gKyAiRW50aXR5UmVzdWx0IjsKLQkJU3RyaW5nIEVOVElUWV9SRVNVTFRfX0VOVElUWV9DTEFTUyA9ICJlbnRpdHlDbGFzcyI7Ci0JCVN0cmluZyBFTlRJVFlfUkVTVUxUX19GSUVMRFMgPSAiZmllbGRzIjsKLQkJU3RyaW5nIEVOVElUWV9SRVNVTFRfX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gImRpc2NyaW1pbmF0b3JDb2x1bW4iOwotCVN0cmluZyBFTlVNRVJBVEVEID0gUEFDS0FHRV8gKyAiRW51bWVyYXRlZCI7Ci0JCVN0cmluZyBFTlVNRVJBVEVEX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBQQUNLQUdFXyArICJFeGNsdWRlRGVmYXVsdExpc3RlbmVycyI7Ci0JU3RyaW5nIEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSBQQUNLQUdFXyArICJFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyI7Ci0JU3RyaW5nIEZJRUxEX1JFU1VMVCA9IFBBQ0tBR0VfICsgIkZpZWxkUmVzdWx0IjsKLQkJU3RyaW5nIEZJRUxEX1JFU1VMVF9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIEZJRUxEX1JFU1VMVF9fQ09MVU1OID0gImNvbHVtbiI7Ci0JU3RyaW5nIEZMVVNIX01PREUgPSBQQUNLQUdFXyArICJGbHVzaE1vZGUiOwotCQlTdHJpbmcgRkxVU0hfTU9ERV9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBHRU5FUkFURURfVkFMVUUgPSBQQUNLQUdFXyArICJHZW5lcmF0ZWRWYWx1ZSI7Ci0JCVN0cmluZyBHRU5FUkFURURfVkFMVUVfX1NUUkFURUdZID0gInN0cmF0ZWd5IjsKLQkJU3RyaW5nIEdFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SID0gImdlbmVyYXRvciI7Ci0JU3RyaW5nIElEID0gUEFDS0FHRV8gKyAiSWQiOwotCVN0cmluZyBJRF9DTEFTUyA9IFBBQ0tBR0VfICsgIklkQ2xhc3MiOwotCQlTdHJpbmcgSURfQ0xBU1NfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgSU5IRVJJVEFOQ0UgPSBQQUNLQUdFXyArICJJbmhlcml0YW5jZSI7Ci0JCVN0cmluZyBJTkhFUklUQU5DRV9fU1RSQVRFR1kgPSAic3RyYXRlZ3kiOwotCVN0cmluZyBKT0lOX0NPTFVNTiA9IFBBQ0tBR0VfICsgIkpvaW5Db2x1bW4iOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5fX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJyZWZlcmVuY2VkQ29sdW1uTmFtZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fVU5JUVVFID0gInVuaXF1ZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fTlVMTEFCTEUgPSAibnVsbGFibGUiOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5fX0lOU0VSVEFCTEUgPSAiaW5zZXJ0YWJsZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fVVBEQVRBQkxFID0gInVwZGF0YWJsZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSAiY29sdW1uRGVmaW5pdGlvbiI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fVEFCTEUgPSAidGFibGUiOwotCVN0cmluZyBKT0lOX0NPTFVNTlMgPSBQQUNLQUdFXyArICJKb2luQ29sdW1ucyI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTlNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgSk9JTl9UQUJMRSA9IFBBQ0tBR0VfICsgIkpvaW5UYWJsZSI7Ci0JCVN0cmluZyBKT0lOX1RBQkxFX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgSk9JTl9UQUJMRV9fQ0FUQUxPRyA9ICJjYXRhbG9nIjsKLQkJU3RyaW5nIEpPSU5fVEFCTEVfX1NDSEVNQSA9ICJzY2hlbWEiOwotCQlTdHJpbmcgSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TID0gImpvaW5Db2x1bW5zIjsKLQkJU3RyaW5nIEpPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gImludmVyc2VKb2luQ29sdW1ucyI7Ci0JCVN0cmluZyBKT0lOX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSAidW5pcXVlQ29uc3RyYWludHMiOwotCVN0cmluZyBMT0IgPSBQQUNLQUdFXyArICJMb2IiOwotCVN0cmluZyBNQU5ZX1RPX01BTlkgPSBQQUNLQUdFXyArICJNYW55VG9NYW55IjsKLQkJU3RyaW5nIE1BTllfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSA9ICJ0YXJnZXRFbnRpdHkiOwotCQlTdHJpbmcgTUFOWV9UT19NQU5ZX19DQVNDQURFID0gImNhc2NhZGUiOwotCQlTdHJpbmcgTUFOWV9UT19NQU5ZX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBNQU5ZX1RPX01BTllfX01BUFBFRF9CWSA9ICJtYXBwZWRCeSI7Ci0JU3RyaW5nIE1BTllfVE9fT05FID0gUEFDS0FHRV8gKyAiTWFueVRvT25lIjsKLQkJU3RyaW5nIE1BTllfVE9fT05FX19UQVJHRVRfRU5USVRZID0gInRhcmdldEVudGl0eSI7Ci0JCVN0cmluZyBNQU5ZX1RPX09ORV9fQ0FTQ0FERSA9ICJjYXNjYWRlIjsKLQkJU3RyaW5nIE1BTllfVE9fT05FX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBNQU5ZX1RPX09ORV9fT1BUSU9OQUwgPSAib3B0aW9uYWwiOwotCVN0cmluZyBNQVBfS0VZID0gUEFDS0FHRV8gKyAiTWFwS2V5IjsKLQkJU3RyaW5nIE1BUF9LRVlfX05BTUUgPSAibmFtZSI7Ci0JU3RyaW5nIE1BUFBFRF9TVVBFUkNMQVNTID0gUEFDS0FHRV8gKyAiTWFwcGVkU3VwZXJjbGFzcyI7Ci0JU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSSUVTID0gUEFDS0FHRV8gKyAiTmFtZWROYXRpdmVRdWVyaWVzIjsKLQkJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSSUVTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWSA9IFBBQ0tBR0VfICsgIk5hbWVkTmF0aXZlUXVlcnkiOwotCQlTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJZX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJZX19RVUVSWSA9ICJxdWVyeSI7Ci0JCVN0cmluZyBOQU1FRF9OQVRJVkVfUVVFUllfX0hJTlRTID0gImhpbnRzIjsKLQkJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTID0gInJlc3VsdENsYXNzIjsKLQkJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HID0gInJlc3VsdFNldE1hcHBpbmciOwotCVN0cmluZyBOQU1FRF9RVUVSSUVTID0gUEFDS0FHRV8gKyAiTmFtZWRRdWVyaWVzIjsKLQkJU3RyaW5nIE5BTUVEX1FVRVJJRVNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgTkFNRURfUVVFUlkgPSBQQUNLQUdFXyArICJOYW1lZFF1ZXJ5IjsKLQkJU3RyaW5nIE5BTUVEX1FVRVJZX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgTkFNRURfUVVFUllfX1FVRVJZID0gInF1ZXJ5IjsKLQkJU3RyaW5nIE5BTUVEX1FVRVJZX19ISU5UUyA9ICJoaW50cyI7Ci0JU3RyaW5nIE9ORV9UT19NQU5ZID0gUEFDS0FHRV8gKyAiT25lVG9NYW55IjsKLQkJU3RyaW5nIE9ORV9UT19NQU5ZX19UQVJHRVRfRU5USVRZID0gInRhcmdldEVudGl0eSI7Ci0JCVN0cmluZyBPTkVfVE9fTUFOWV9fQ0FTQ0FERSA9ICJjYXNjYWRlIjsKLQkJU3RyaW5nIE9ORV9UT19NQU5ZX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBPTkVfVE9fTUFOWV9fTUFQUEVEX0JZID0gIm1hcHBlZEJ5IjsKLQlTdHJpbmcgT05FX1RPX09ORSA9IFBBQ0tBR0VfICsgIk9uZVRvT25lIjsKLQkJU3RyaW5nIE9ORV9UT19PTkVfX1RBUkdFVF9FTlRJVFkgPSAidGFyZ2V0RW50aXR5IjsKLQkJU3RyaW5nIE9ORV9UT19PTkVfX0NBU0NBREUgPSAiY2FzY2FkZSI7Ci0JCVN0cmluZyBPTkVfVE9fT05FX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBPTkVfVE9fT05FX19PUFRJT05BTCA9ICJvcHRpb25hbCI7Ci0JCVN0cmluZyBPTkVfVE9fT05FX19NQVBQRURfQlkgPSAibWFwcGVkQnkiOwotCVN0cmluZyBPUkRFUl9CWSA9IFBBQ0tBR0VfICsgIk9yZGVyQnkiOwotCQlTdHJpbmcgT1JERVJfQllfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVCA9IFBBQ0tBR0VfICsgIlBlcnNpc3RlbmNlQ29udGV4dCI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9fVU5JVF9OQU1FID0gInVuaXROYW1lIjsKLQkJU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFRfX1RZUEUgPSAidHlwZSI7Ci0JU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFRTID0gUEFDS0FHRV8gKyAiUGVyc2lzdGVuY2VDb250ZXh0cyI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUU19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBQRVJTSVNURU5DRV9VTklUID0gUEFDS0FHRV8gKyAiWG1sUGVyc2lzdGVuY2VVbml0IjsKLQkJU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9VTklUX19VTklUX05BTUUgPSAidW5pdE5hbWUiOwotCVN0cmluZyBQRVJTSVNURU5DRV9VTklUUyA9IFBBQ0tBR0VfICsgIlBlcnNpc3RlbmNlVW5pdHMiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVFNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgUE9TVF9MT0FEID0gUEFDS0FHRV8gKyAiUG9zdExvYWQiOwotCVN0cmluZyBQT1NUX1BFUlNJU1QgPSBQQUNLQUdFXyArICJQb3N0UGVyc2lzdCI7Ci0JU3RyaW5nIFBPU1RfUkVNT1ZFID0gUEFDS0FHRV8gKyAiUG9zdFJlbW92ZSI7Ci0JU3RyaW5nIFBPU1RfVVBEQVRFID0gUEFDS0FHRV8gKyAiUG9zdFVwZGF0ZSI7Ci0JU3RyaW5nIFBSRV9QRVJTSVNUID0gUEFDS0FHRV8gKyAiUHJlUGVyc2lzdCI7Ci0JU3RyaW5nIFBSRV9SRU1PVkUgPSBQQUNLQUdFXyArICJQcmVSZW1vdmUiOwotCVN0cmluZyBQUkVfVVBEQVRFID0gUEFDS0FHRV8gKyAiUHJlVXBkYXRlIjsKLQlTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4gPSBQQUNLQUdFXyArICJQcmltYXJ5S2V5Sm9pbkNvbHVtbiI7Ci0JCVN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gInJlZmVyZW5jZWRDb2x1bW5OYW1lIjsKLQkJU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9ICJjb2x1bW5EZWZpbml0aW9uIjsKLQlTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TID0gUEFDS0FHRV8gKyAiUHJpbWFyeUtleUpvaW5Db2x1bW5zIjsKLQkJU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBRVUVSWV9ISU5UID0gUEFDS0FHRV8gKyAiUXVlcnlIaW50IjsKLQkJU3RyaW5nIFFVRVJZX0hJTlRfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBRVUVSWV9ISU5UX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIFNFQ09OREFSWV9UQUJMRSA9IFBBQ0tBR0VfICsgIlNlY29uZGFyeVRhYmxlIjsKLQkJU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9fQ0FUQUxPRyA9ICJjYXRhbG9nIjsKLQkJU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9fU0NIRU1BID0gInNjaGVtYSI7Ci0JCVN0cmluZyBTRUNPTkRBUllfVEFCTEVfX1BLX0pPSU5fQ09MVU1OUyA9ICJwa0pvaW5Db2x1bW5zIjsKLQkJU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsKLQlTdHJpbmcgU0VDT05EQVJZX1RBQkxFUyA9IFBBQ0tBR0VfICsgIlNlY29uZGFyeVRhYmxlcyI7Ci0JCVN0cmluZyBTRUNPTkRBUllfVEFCTEVTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUiA9IFBBQ0tBR0VfICsgIlNlcXVlbmNlR2VuZXJhdG9yIjsKLQkJU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9fU0VRVUVOQ0VfTkFNRSA9ICJzZXF1ZW5jZU5hbWUiOwotCQlTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFID0gImluaXRpYWxWYWx1ZSI7Ci0JCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRSA9ICJhbGxvY2F0aW9uU2l6ZSI7Ci0JU3RyaW5nIFNRTF9SRVNVTFRfU0VUX01BUFBJTkcgPSBQQUNLQUdFXyArICJTcWxSZXN1bHRTZXRNYXBwaW5nIjsKLQkJU3RyaW5nIFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19FTlRJVElFUyA9ICJlbnRpdGllcyI7Ci0JCVN0cmluZyBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19DT0xVTU5TID0gImNvbHVtbnMiOwotCVN0cmluZyBUQUJMRSA9IFBBQ0tBR0VfICsgIlRhYmxlIjsKLQkJU3RyaW5nIFRBQkxFX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgVEFCTEVfX0NBVEFMT0cgPSAiY2F0YWxvZyI7Ci0JCVN0cmluZyBUQUJMRV9fU0NIRU1BID0gInNjaGVtYSI7Ci0JCVN0cmluZyBUQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsKLQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SID0gUEFDS0FHRV8gKyAiVGFibGVHZW5lcmF0b3IiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19UQUJMRSA9ICJ0YWJsZSI7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0cgPSAiY2F0YWxvZyI7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfX1NDSEVNQSA9ICJzY2hlbWEiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fTkFNRSA9ICJwa0NvbHVtbk5hbWUiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRSA9ICJ2YWx1ZUNvbHVtbk5hbWUiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUUgPSAicGtDb2x1bW5WYWx1ZSI7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUgPSAiaW5pdGlhbFZhbHVlIjsKLQkJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFID0gImFsbG9jYXRpb25TaXplIjsKLQkJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsKLQlTdHJpbmcgVEVNUE9SQUwgPSBQQUNLQUdFXyArICJUZW1wb3JhbCI7Ci0JCVN0cmluZyBURU1QT1JBTF9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBUUkFOU0lFTlQgPSBQQUNLQUdFXyArICJUcmFuc2llbnQiOwotCVN0cmluZyBVTklRVUVfQ09OU1RSQUlOVCA9IFBBQ0tBR0VfICsgIlVuaXF1ZUNvbnN0cmFpbnQiOwotCQlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUyA9ICJjb2x1bW5OYW1lcyI7Ci0JU3RyaW5nIFZFUlNJT04gPSBQQUNLQUdFXyArICJWZXJzaW9uIjsKLQotCS8vIEpQQSBlbnVtcwotCVN0cmluZyBHRU5FUkFUSU9OX1RZUEUgPSBQQUNLQUdFXyArICJHZW5lcmF0aW9uVHlwZSI7Ci0JCVN0cmluZyBHRU5FUkFUSU9OX1RZUEVfID0gR0VORVJBVElPTl9UWVBFICsgJy4nOwotCQlTdHJpbmcgR0VORVJBVElPTl9UWVBFX19BVVRPID0gR0VORVJBVElPTl9UWVBFXyArICJBVVRPIjsKLQkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fSURFTlRJVFkgPSBHRU5FUkFUSU9OX1RZUEVfICsgIklERU5USVRZIjsKLQkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fU0VRVUVOQ0UgPSBHRU5FUkFUSU9OX1RZUEVfICsgIlNFUVVFTkNFIjsKLQkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fVEFCTEUgPSBHRU5FUkFUSU9OX1RZUEVfICsgIlRBQkxFIjsKLQotCVN0cmluZyBDQVNDQURFX1RZUEUgPSBQQUNLQUdFXyArICJDYXNjYWRlVHlwZSI7Ci0JCVN0cmluZyBDQVNDQURFX1RZUEVfID0gQ0FTQ0FERV9UWVBFICsgJy4nOwotCQlTdHJpbmcgQ0FTQ0FERV9UWVBFX19BTEwgPSBDQVNDQURFX1RZUEVfICsgIkFMTCI7Ci0JCVN0cmluZyBDQVNDQURFX1RZUEVfX01FUkdFID0gQ0FTQ0FERV9UWVBFXyArICJNRVJHRSI7Ci0JCVN0cmluZyBDQVNDQURFX1RZUEVfX1BFUlNJU1QgPSBDQVNDQURFX1RZUEVfICsgIlBFUlNJU1QiOwotCQlTdHJpbmcgQ0FTQ0FERV9UWVBFX19SRUZSRVNIID0gQ0FTQ0FERV9UWVBFXyArICJSRUZSRVNIIjsKLQkJU3RyaW5nIENBU0NBREVfVFlQRV9fUkVNT1ZFID0gQ0FTQ0FERV9UWVBFXyArICJSRU1PVkUiOwotCi0JU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRSA9IFBBQ0tBR0VfICsgIkRpc2NyaW1pbmF0b3JUeXBlIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRV8gPSBESVNDUklNSU5BVE9SX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX1RZUEVfX0NIQVIgPSBESVNDUklNSU5BVE9SX1RZUEVfICsgIkNIQVIiOwotCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9UWVBFX19JTlRFR0VSID0gRElTQ1JJTUlOQVRPUl9UWVBFXyArICJJTlRFR0VSIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRV9fU1RSSU5HID0gRElTQ1JJTUlOQVRPUl9UWVBFXyArICJTVFJJTkciOwotCi0JU3RyaW5nIEVOVU1fVFlQRSA9IFBBQ0tBR0VfICsgIkVudW1UeXBlIjsKLQkJU3RyaW5nIEVOVU1fVFlQRV8gPSBFTlVNX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBFTlVNX1RZUEVfX09SRElOQUwgPSBFTlVNX1RZUEVfICsgIk9SRElOQUwiOwotCQlTdHJpbmcgRU5VTV9UWVBFX19TVFJJTkcgPSBFTlVNX1RZUEVfICsgIlNUUklORyI7Ci0KLQlTdHJpbmcgRkVUQ0hfVFlQRSA9IFBBQ0tBR0VfICsgIkZldGNoVHlwZSI7Ci0JCVN0cmluZyBGRVRDSF9UWVBFXyA9IEZFVENIX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBGRVRDSF9UWVBFX19FQUdFUiA9IEZFVENIX1RZUEVfICsgIkVBR0VSIjsKLQkJU3RyaW5nIEZFVENIX1RZUEVfX0xBWlkgPSBGRVRDSF9UWVBFXyArICJMQVpZIjsKLQotCVN0cmluZyBGTFVTSF9NT0RFX1RZUEUgPSBQQUNLQUdFXyArICJGbHVzaE1vZGVUeXBlIjsKLQkJU3RyaW5nIEZMVVNIX01PREVfVFlQRV8gPSBGTFVTSF9NT0RFX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBGTFVTSF9NT0RFX1RZUEVfX0FVVE8gPSBGTFVTSF9NT0RFX1RZUEVfICsgIkFVVE8iOwotCQlTdHJpbmcgRkxVU0hfTU9ERV9UWVBFX19DT01NSVQgPSBGTFVTSF9NT0RFX1RZUEVfICsgIkNPTU1JVCI7Ci0KLQlTdHJpbmcgSU5IRVJJVEFOQ0VfVFlQRSA9IFBBQ0tBR0VfICsgIkluaGVyaXRhbmNlVHlwZSI7Ci0JCVN0cmluZyBJTkhFUklUQU5DRV9UWVBFXyA9IElOSEVSSVRBTkNFX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBJTkhFUklUQU5DRV9UWVBFX19KT0lORUQgPSBJTkhFUklUQU5DRV9UWVBFXyArICJKT0lORUQiOwotCQlTdHJpbmcgSU5IRVJJVEFOQ0VfVFlQRV9fU0lOR0xFX1RBQkxFID0gSU5IRVJJVEFOQ0VfVFlQRV8gKyAiU0lOR0xFX1RBQkxFIjsKLQkJU3RyaW5nIElOSEVSSVRBTkNFX1RZUEVfX1RBQkxFX1BFUl9DTEFTUyA9IElOSEVSSVRBTkNFX1RZUEVfICsgIlRBQkxFX1BFUl9DTEFTUyI7Ci0KLQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFID0gUEFDS0FHRV8gKyAiUGVyc2lzdGVuY2VDb250ZXh0VHlwZSI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUX1RZUEVfID0gUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFICsgJy4nOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX19FWFRFTkRFRCA9IFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV8gKyAiRVhURU5ERUQiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX19UUkFOU0FDVElPTiA9IFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV8gKyAiVFJBTlNBQ1RJT04iOwotCi0JU3RyaW5nIFRFTVBPUkFMX1RZUEUgPSBQQUNLQUdFXyArICJUZW1wb3JhbFR5cGUiOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV8gPSBURU1QT1JBTF9UWVBFICsgJy4nOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV9fREFURSA9IFRFTVBPUkFMX1RZUEVfICsgIkRBVEUiOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV9fVElNRSA9IFRFTVBPUkFMX1RZUEVfICsgIlRJTUUiOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV9fVElNRVNUQU1QID0gVEVNUE9SQUxfVFlQRV8gKyAiVElNRVNUQU1QIjsKLQotCS8vIEpQQSBpbnRlcmZhY2VzCi0JU3RyaW5nIEVOVElUWV9NQU5BR0VSID0gUEFDS0FHRV8gKyAiRW50aXR5TWFuYWdlciI7Ci0JU3RyaW5nIEVOVElUWV9NQU5BR0VSX0ZBQ1RPUlkgPSBQQUNLQUdFXyArICJFbnRpdHlNYW5hZ2VyRmFjdG9yeSI7Ci0JU3RyaW5nIEVOVElUWV9UUkFOU0FDVElPTiA9IFBBQ0tBR0VfICsgIkVudGl0eVRyYW5zYWN0aW9uIjsKLQlTdHJpbmcgSU5TVFJVTUVOVEFCTEVfQ0xBU1NfTE9BREVSID0gUEFDS0FHRV8gKyAiSW5zdHJ1bWVudGFibGVDbGFzc0xvYWRlciI7Ci0JU3RyaW5nIFFVRVJZID0gUEFDS0FHRV8gKyAiUXVlcnkiOwotCi0JLy8gSlBBIGNsYXNzZXMKLQlTdHJpbmcgUEVSU0lTVEVOQ0UgPSBQQUNLQUdFXyArICJYbWxQZXJzaXN0ZW5jZSI7Ci0KLQkvLyBKUEEgZXhjZXB0aW9ucwotCVN0cmluZyBOT05fVU5JUVVFX1JFU1VMVF9FWENFUFRJT04gPSBQQUNLQUdFXyArICJOb25VbmlxdWVSZXN1bHRFeGNlcHRpb24iOwotCVN0cmluZyBPQkpFQ1RfTk9UX0ZPVU5EX0VYQ0VQVElPTiA9IFBBQ0tBR0VfICsgIk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIjsKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfRVhDRVBUSU9OID0gUEFDS0FHRV8gKyAiUGVyc2lzdGVuY2VFeGNlcHRpb24iOwotCi0KLQkvLyAqKioqKioqKioqIFNQSSAqKioqKioqKioqCi0KLQkvLyBKUEEgU1BJIHBhY2thZ2UKLQlTdHJpbmcgU1BJX1BBQ0tBR0UgPSBQQUNLQUdFXyArICJzcGkiOwotCVN0cmluZyBTUElfUEFDS0FHRV8gPSBTUElfUEFDS0FHRSArICcuJzsKLQotCS8vIEpQQSBTUEkgaW50ZXJmYWNlcwotCVN0cmluZyBFTlRJVFlfTUFOQUdFUl9GQUNUT1JZX1BST1ZJREVSID0gU1BJX1BBQ0tBR0VfICsgIkVudGl0eU1hbmFnZXJGYWN0b3J5UHJvdmlkZXIiOwotCVN0cmluZyBQRVJTSVNURU5DRV9JTkZPID0gU1BJX1BBQ0tBR0VfICsgIlBlcnNpc3RlbmNlSW5mbyI7Ci0JU3RyaW5nIFBFUlNJU1RFTkNFX1BST1ZJREVSID0gU1BJX1BBQ0tBR0VfICsgIlBlcnNpc3RlbmNlUHJvdmlkZXIiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0pwdEdlbk1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0pwdEdlbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjM2JiZjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9KcHRHZW5NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIGVudGl0eSBnZW5lcmF0aW9uLgotICovCi1jbGFzcyBKcHRHZW5NZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYWNrYWdlR2VuZXJhdG9yX3Rhc2tOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlblNjb3BlX3Rhc2tOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUdlbmVyYXRvcl90YXNrTmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfZ2VuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdEdlbk1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCQotCXByaXZhdGUgSnB0R2VuTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9NYW55VG9NYW55UmVsYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvTWFueVRvTWFueVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNmMwN2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9NYW55VG9NYW55UmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBUaGlzIG9iamVjdCBpcyBzaGFyZWQgYnkgdGhlIHR3byBnZW4gdGFibGVzIHRoYXQgbWFrZSB1cCB0aGUgcmVsYXRpb24uCi0gKiBVcG9uIGNvbnN0cnVjdGlvbiwgJ21hcHBlZEJ5JyB3aWxsIGJlICdudWxsJy4gVGhlIGZpcnN0IGdlbiB0YWJsZSB0byBiZQotICogdXNlZCB0byBnZW5lcmF0ZSBhbiBlbnRpdHkgd2lsbCBmaWxsIGluICdtYXBwZWRCeScgd2l0aCB0aGUgYXBwcm9wcmlhdGUKLSAqIGF0dHJpYnV0ZSAoZmllbGQvcHJvcGVydHkpIG5hbWUuCi0gKi8KLWNsYXNzIE1hbnlUb01hbnlSZWxhdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBqb2luR2VuVGFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBGb3JlaWduS2V5IG93bmluZ0ZvcmVpZ25LZXk7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBvd25pbmdHZW5UYWJsZTsKLQlwcml2YXRlIGZpbmFsIEZvcmVpZ25LZXkgbm9uT3duaW5nRm9yZWlnbktleTsKLQlwcml2YXRlIGZpbmFsIEdlblRhYmxlIG5vbk93bmluZ0dlblRhYmxlOwotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OyAgLy8gc2V0IHdoaWxlIGdlbmVyYXRpbmcgZW50aXRpZXMKLQotCi0JTWFueVRvTWFueVJlbGF0aW9uKAotCQkJR2VuVGFibGUgam9pbkdlblRhYmxlLAotCQkJRm9yZWlnbktleSBvd25pbmdGb3JlaWduS2V5LAotCQkJR2VuVGFibGUgb3duaW5nR2VuVGFibGUsCi0JCQlGb3JlaWduS2V5IG5vbk93bmluZ0ZvcmVpZ25LZXksCi0JCQlHZW5UYWJsZSBub25Pd25pbmdHZW5UYWJsZQotCSkgewotCQlzdXBlcigpOwotCQl0aGlzLmpvaW5HZW5UYWJsZSA9IGpvaW5HZW5UYWJsZTsKLQotCQl0aGlzLm93bmluZ0ZvcmVpZ25LZXkgPSBvd25pbmdGb3JlaWduS2V5OwotCQl0aGlzLm93bmluZ0dlblRhYmxlID0gb3duaW5nR2VuVGFibGU7Ci0JCW93bmluZ0dlblRhYmxlLmFkZE93bmVkTWFueVRvTWFueVJlbGF0aW9uKHRoaXMpOwotCi0JCXRoaXMubm9uT3duaW5nRm9yZWlnbktleSA9IG5vbk93bmluZ0ZvcmVpZ25LZXk7Ci0JCXRoaXMubm9uT3duaW5nR2VuVGFibGUgPSBub25Pd25pbmdHZW5UYWJsZTsKLQkJbm9uT3duaW5nR2VuVGFibGUuYWRkTm9uT3duZWRNYW55VG9NYW55UmVsYXRpb24odGhpcyk7Ci0JfQotCi0JR2VuVGFibGUgZ2V0Sm9pbkdlblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5qb2luR2VuVGFibGU7Ci0JfQotCi0JRm9yZWlnbktleSBnZXRPd25pbmdGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gdGhpcy5vd25pbmdGb3JlaWduS2V5OwotCX0KLQotCUdlblRhYmxlIGdldE93bmluZ0dlblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vd25pbmdHZW5UYWJsZTsKLQl9Ci0KLQlGb3JlaWduS2V5IGdldE5vbk93bmluZ0ZvcmVpZ25LZXkoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk93bmluZ0ZvcmVpZ25LZXk7Ci0JfQotCi0JR2VuVGFibGUgZ2V0Tm9uT3duaW5nR2VuVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk93bmluZ0dlblRhYmxlOwotCX0KLQotCVN0cmluZyBnZXRPd25lZEphdmFBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5ub25Pd25pbmdHZW5UYWJsZS5nZXROYW1lKCkgKyB0aGlzLmdldENvbGxlY3Rpb25BdHRyaWJ1dGVOYW1lU3VmZml4KCk7Ci0JfQotCi0JU3RyaW5nIGdldE5vbk93bmVkSmF2YUF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmluZ0dlblRhYmxlLmdldE5hbWUoKSArIHRoaXMuZ2V0Q29sbGVjdGlvbkF0dHJpYnV0ZU5hbWVTdWZmaXgoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRDb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5Q29uZmlnKCkuZ2V0Q29sbGVjdGlvbkF0dHJpYnV0ZU5hbWVTdWZmaXgoKTsKLQl9Ci0KLQlwcml2YXRlIEVudGl0eUdlbmVyYXRvci5Db25maWcgZ2V0RW50aXR5Q29uZmlnKCkgewotCQlyZXR1cm4gdGhpcy5qb2luR2VuVGFibGUuZ2V0RW50aXR5Q29uZmlnKCk7Ci0JfQotCi0JLyoqCi0JICogdGhlIHNjb3BlIGNsZWFycyB0aGUgam9pbiB0YWJsZSByZWxhdGlvbiBpZiB0aGVyZSBhcmUgYW55IHJlZmVyZW5jZXMKLQkgKiB0byB0aGUgam9pbiB0YWJsZQotCSAqLwotCXZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMub3duaW5nR2VuVGFibGUucmVtb3ZlT3duZWRNYW55VG9NYW55UmVsYXRpb24odGhpcyk7Ci0JCXRoaXMubm9uT3duaW5nR2VuVGFibGUucmVtb3ZlTm9uT3duZWRNYW55VG9NYW55UmVsYXRpb24odGhpcyk7Ci0JfQotCi0JU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgewotCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JfQotCi0JU3RyaW5nIGdldE93bmluZ0VudGl0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmluZ0dlblRhYmxlLmdldEVudGl0eU5hbWUoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0Tm9uT3duaW5nRW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubm9uT3duaW5nR2VuVGFibGUuZ2V0RW50aXR5TmFtZSgpOwotCX0KLQotCWJvb2xlYW4gam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkdlblRhYmxlLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmpvaW5HZW5UYWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL01hbnlUb09uZVJlbGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL01hbnlUb09uZVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDQ0MzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9NYW55VG9PbmVSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBvYmplY3QgaXMgaGVsZCBieSB0aGUgImJhc2UiIGdlbiB0YWJsZSBhbmQsIGluZGlyZWN0bHkgdmlhIGEKLSAqIG9uZS10by1tYW55IHJlbGF0aW9uLCB0aGUgInJlZmVyZW5jZWQiIGdlbiB0YWJsZS4KLSAqIFRoZSAibWFwcGVkIGJ5IiBhdHRyaWJ1dGUgKGZpZWxkL3Byb3BlcnR5KSBuYW1lIGlzIHNldCB3aGlsZSB0aGUKLSAqICJiYXNlIiB0YWJsZSBpcyBjYWxjdWxhdGluZyBpdHMgYXR0cmlidXRlIG5hbWVzLgotICovCi1jbGFzcyBNYW55VG9PbmVSZWxhdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBiYXNlR2VuVGFibGU7ICAvLyB0aGUgIm1hbnkiIHNpZGUgKGUuZy4gRGV0YWlsKQotCXByaXZhdGUgZmluYWwgRm9yZWlnbktleSBmb3JlaWduS2V5OwotCXByaXZhdGUgZmluYWwgR2VuVGFibGUgcmVmZXJlbmNlZEdlblRhYmxlOyAgLy8gdGhlICJvbmUiIHNpZGUgKGUuZy4gTWFzdGVyKQotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OyAgLy8gc2V0IHdoaWxlIGdlbmVyYXRpbmcgZW50aXRpZXM7IHVzZWQgYnkgcGFydG5lciBvbmUtdG8tbWFueSByZWxhdGlvbgotCi0KLQlNYW55VG9PbmVSZWxhdGlvbigKLQkJCUdlblRhYmxlIGJhc2VHZW5UYWJsZSwKLQkJCUZvcmVpZ25LZXkgZm9yZWlnbktleSwKLQkJCUdlblRhYmxlIHJlZmVyZW5jZWRHZW5UYWJsZQotCSkgewotCQlzdXBlcigpOwotCQl0aGlzLmJhc2VHZW5UYWJsZSA9IGJhc2VHZW5UYWJsZTsKLQkJdGhpcy5mb3JlaWduS2V5ID0gZm9yZWlnbktleTsKLQkJdGhpcy5yZWZlcmVuY2VkR2VuVGFibGUgPSByZWZlcmVuY2VkR2VuVGFibGU7Ci0JCXJlZmVyZW5jZWRHZW5UYWJsZS5hZGRPbmVUb01hbnlSZWxhdGlvbihuZXcgT25lVG9NYW55UmVsYXRpb24odGhpcykpOwotCX0KLQotCUdlblRhYmxlIGdldEJhc2VHZW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFzZUdlblRhYmxlOwotCX0KLQotCUZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleSgpIHsKLQkJcmV0dXJuIHRoaXMuZm9yZWlnbktleTsKLQl9Ci0KLQlHZW5UYWJsZSBnZXRSZWZlcmVuY2VkR2VuVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRHZW5UYWJsZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZm9yZWlnbktleS5nZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgewotCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JfQotCi0JU3RyaW5nIGdldEJhc2VFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5iYXNlR2VuVGFibGUuZ2V0RW50aXR5TmFtZSgpOwotCX0KLQotCVN0cmluZyBnZXRSZWZlcmVuY2VkRW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZEdlblRhYmxlLmdldEVudGl0eU5hbWUoKTsKLQl9Ci0KLQlFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGdldEVudGl0eUNvbmZpZygpIHsKLQkJcmV0dXJuIHRoaXMuYmFzZUdlblRhYmxlLmdldEVudGl0eUNvbmZpZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZm9yZWlnbktleSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL09uZVRvTWFueVJlbGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL09uZVRvTWFueVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZmE3OGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PbmVUb01hbnlSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBvYmplY3QgaXMgdGhlIGludmVyc2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgbWFueS10by1vbmUgcmVsYXRpb24uCi0gKi8KLWNsYXNzIE9uZVRvTWFueVJlbGF0aW9uIHsKLQlwcml2YXRlIGZpbmFsIE1hbnlUb09uZVJlbGF0aW9uIG1hbnlUb09uZVJlbGF0aW9uOwotCi0KLQlPbmVUb01hbnlSZWxhdGlvbihNYW55VG9PbmVSZWxhdGlvbiBtYW55VG9PbmVSZWxhdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLm1hbnlUb09uZVJlbGF0aW9uID0gbWFueVRvT25lUmVsYXRpb247Ci0JfQotCi0JTWFueVRvT25lUmVsYXRpb24gZ2V0TWFueVRvT25lUmVsYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLm1hbnlUb09uZVJlbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIGUuZy4gIkZPT19jb2xsZWN0aW9uIgotCSAqLwotCVN0cmluZyBnZXRKYXZhQXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFueVRvT25lUmVsYXRpb24uZ2V0QmFzZUdlblRhYmxlKCkuZ2V0TmFtZSgpICsgdGhpcy5nZXRDb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeCgpOwotCX0KLQotCVN0cmluZyBnZXRNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMubWFueVRvT25lUmVsYXRpb24uZ2V0TWFwcGVkQnkoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0UmVmZXJlbmNlZEVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm1hbnlUb09uZVJlbGF0aW9uLmdldEJhc2VFbnRpdHlOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29sbGVjdGlvbkF0dHJpYnV0ZU5hbWVTdWZmaXgoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eUNvbmZpZygpLmdldENvbGxlY3Rpb25BdHRyaWJ1dGVOYW1lU3VmZml4KCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGdldEVudGl0eUNvbmZpZygpIHsKLQkJcmV0dXJuIHRoaXMubWFueVRvT25lUmVsYXRpb24uZ2V0RW50aXR5Q29uZmlnKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5tYW55VG9PbmVSZWxhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvUGFja2FnZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWY2N2ZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvUGFja2FnZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgYSBwYWNrYWdlIG9mIGVudGl0aWVzIGZvciBhIHNldCBvZiB0YWJsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlR2VuZXJhdG9yIHsKLQlwcml2YXRlIGZpbmFsIENvbmZpZyBjb25maWc7Ci0JcHJpdmF0ZSBmaW5hbCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUNvbmZpZzsKLQlwcml2YXRlIGZpbmFsIEdlblNjb3BlIHNjb3BlOwotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlRW50aXRpZXMoCi0JCQlDb25maWcgY29uZmlnLAotCQkJRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWcsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcgotCSkgewotCQlpZiAoKGNvbmZpZyA9PSBudWxsKSB8fCAoZW50aXR5Q29uZmlnID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KHByb2dyZXNzTW9uaXRvciwgSnB0R2VuTWVzc2FnZXMuUGFja2FnZUdlbmVyYXRvcl90YXNrTmFtZSwgMTAwKTsKLQkJbmV3IFBhY2thZ2VHZW5lcmF0b3IoY29uZmlnLCBlbnRpdHlDb25maWcsIHNtLm5ld0NoaWxkKDEwKSkuZ2VuZXJhdGVFbnRpdGllcyhzbS5uZXdDaGlsZCg5MCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQYWNrYWdlR2VuZXJhdG9yKAotCQkJQ29uZmlnIGNvbmZpZywKLQkJCUVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IKLQkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMuZW50aXR5Q29uZmlnID0gZW50aXR5Q29uZmlnOwotCQl0aGlzLnNjb3BlID0gbmV3IEdlblNjb3BlKGVudGl0eUNvbmZpZywgcHJvZ3Jlc3NNb25pdG9yKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2VuZXJhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVFbnRpdGllcyhJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KHByb2dyZXNzTW9uaXRvciwgdGhpcy5zY29wZS5lbnRpdHlUYWJsZXNTaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEdlblRhYmxlPiBzdHJlYW0gPSB0aGlzLnNjb3BlLmVudGl0eUdlblRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuY2hlY2tDYW5jZWxlZChzbSk7Ci0JCQl0aGlzLmdlbmVyYXRlRW50aXR5KHN0cmVhbS5uZXh0KCksIHNtLm5ld0NoaWxkKDEpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUVudGl0eShHZW5UYWJsZSBnZW5UYWJsZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJRW50aXR5R2VuZXJhdG9yLmdlbmVyYXRlRW50aXR5KAotCQkJCXRoaXMuZW50aXR5Q29uZmlnLAotCQkJCXRoaXMuY29uZmlnLmdldFBhY2thZ2VGcmFnbWVudCgpLAotCQkJCWdlblRhYmxlLAotCQkJCXByb2dyZXNzTW9uaXRvcgotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NhbmNlbGVkKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCWlmIChwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc2NvcGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25maWcgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb25maWcgewotCQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50OwotCi0JCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudCgpIHsKLQkJCXJldHVybiB0aGlzLnBhY2thZ2VGcmFnbWVudDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQkJdGhpcy5wYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnQ7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlN2M3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NmRkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLm9wdGlvbnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZTEyMjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3Igb3JnLmVjbGlwc2UuanB0LnVpIHBsdWctaW4KLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgdGhlIG9yZy5lY2xpcHNlLmpwdC51aSBwbHVnaW4uCi1vcmcuZWNsaXBzZS5qcHQudWkvZGVidWc9ZmFsc2UKLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgdW5pdC10ZXN0cwotb3JnLmVjbGlwc2UuanB0LnVpL2RlYnVnL3VuaXQtdGVzdHM9ZmFsc2UKLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgZXZlbnRzIG9jY3VycmluZyBpbiB0aGUgVUkgcGFuZXMKLW9yZy5lY2xpcHNlLmpwdC51aS9kZWJ1Zy91aS9sYXlvdXQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpwdC51aS9kZWJ1Zy91aS9kZXRhaWxzVmlldz1mYWxzZQotCi0jIFR1cm4gb24gZGVidWdnaW5nIGZvciBldmVudHMgY29taW5nIGZyb20gQ29ubmVjdGlvblByb2ZpbGUKLW9yZy5lY2xpcHNlLmpwdC51aS9kZWJ1Zy91aS9kYj1mYWxzZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGVmOWUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM2ZGRhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEphbiAxNSAxMToxMjoxNCBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwOWMxMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDo1NTowMSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MDU0MDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZHJhdzJkO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbjtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZGIudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5nZW47YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IjMuMy4xMDAiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC51aSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscywKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kcywKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kaWFsb2dzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmVkaXRvcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5nczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm5hdmlnYXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLmRldGFpbHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscywKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc3BlY3RpdmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uYmFzZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByZWZzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3cy5zdHJ1Y3R1cmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5vcGVyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UsCi0gb3JnLmVjbGlwc2UuanB0LnVpLm5hdmlnYXRvciwKLSBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiYTBmMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2UgPSAxLjUKLWphdmFjVGFyZ2V0ID0gMS41Ci1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLwotamFycy5jb21waWxlLm9yZGVyID0gLgotc3JjLmluY2x1ZGVzID0gdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODI3YjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC51aSI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LnVpIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2VudGl0eV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWY3Y2M5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2VudGl0eV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfanBhX2ZpbGVfd2l6LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2pwYV9maWxlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMGY2MDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfanBhX2ZpbGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzNzY4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19qcGFwcm9qZWN0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2pwYV9mYWNldC5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2pwYV9mYWNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWI5MTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9qcGFfZmFjZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZW50aXR5X3dpei5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzM2NhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2pwYV9maWxlX3dpei5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qcGFfZmlsZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTAwNDJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2pwYV9maWxlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qcGFwcm9qZWN0X3dpei5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qcGFwcm9qZWN0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGE4MDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhcHJvamVjdF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfZGV0YWlscy5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9kZXRhaWxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4MDEzOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9kZXRhaWxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V2aWV3MTYvanBhX3BlcnNwZWN0aXZlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V2aWV3MTYvanBhX3BlcnNwZWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhYjkxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9wZXJzcGVjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9zdHJ1Y3R1cmUuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfc3RydWN0dXJlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyYzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9zdHJ1Y3R1cmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvYmFzaWMuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvYmFzaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTQ3ZDc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2Jhc2ljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGFibGUuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NTZmNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRlZC1pZC5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRlZC1pZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYzhlMjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkZWQtaWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkZWQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmFlNjY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS1tYXBwaW5ncy5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHktbWFwcGluZ3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzQ5Yzk2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS1tYXBwaW5ncy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwNmY0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvaWQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvaWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjA1ZWMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2lkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2pwYS1jb250ZW50LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2pwYS1jb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhYjkxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9qcGEtY29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9qcGEtZmlsZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9qcGEtZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZTlmNDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvanBhLWZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1tYW55LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L21hbnktdG8tbWFueS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODg1YjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1tYW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L21hbnktdG8tb25lLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L21hbnktdG8tb25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxZTJiOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYW55LXRvLW9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYXBwZWQtc3VwZXJjbGFzcy5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYXBwZWQtc3VwZXJjbGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYzM3NjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFwcGVkLXN1cGVyY2xhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbnVsbC1hdHRyaWJ1dGUtbWFwcGluZy5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhOWMyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L251bGwtdHlwZS1tYXBwaW5nLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L251bGwtdHlwZS1tYXBwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3OTQ3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9udWxsLXR5cGUtbWFwcGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tbWFueS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tbWFueS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOTAwMjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvb25lLXRvLW1hbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvb25lLXRvLW9uZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tb25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4ZWMzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tb25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3BlcnNpc3RlbmNlLXVuaXQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVuY2UtdW5pdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzQ1ZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVuY2UtdW5pdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZjYxNmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvdHJhbnNpZW50LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3RyYW5zaWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNWQ4M2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvdHJhbnNpZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3ZlcnNpb24uZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvdmVyc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMmE4MTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvdmVyc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3dhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDAwOWU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3dhcm5pbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvd2l6YmFuL2pwYV9mYWNldF93aXpiYW4uZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvd2l6YmFuL2pwYV9mYWNldF93aXpiYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2UxODFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL3dpemJhbi9qcGFfZmFjZXRfd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfZW50aXR5X3dpemJhbi5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X2VudGl0eV93aXpiYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ5MzRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfZW50aXR5X3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X2pwYV9maWxlX3dpemJhbi5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X2pwYV9maWxlX3dpemJhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDYyMjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19qcGFfZmlsZV93aXpiYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODhjMTgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotcGx1Z2luTmFtZT0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLUpQQV9QTEFURk9STT0iSlBBIFBsYXRmb3JtIFVJIgotCi1qcGFOYXZpZ2F0b3JDb250ZW50PUpQQSBDb250ZW50Ci0KLWpwYVdpemFyZENhdGVnb3J5TmFtZSA9IEpQQQotbmV3SnBhUHJvamVjdFdpemFyZE5hbWUgPSBKUEEgUHJvamVjdAotbmV3SnBhUHJvamVjdFdpemFyZERlc2MgPSBDcmVhdGUgYSBKUEEgcHJvamVjdAotbmV3SnBhRW50aXR5V2l6YXJkTmFtZSA9IEVudGl0eQotbmV3SnBhRW50aXR5V2l6YXJkRGVzYyA9IENyZWF0ZSBhIEpQQSBFbnRpdHkgCi1uZXdKcGFNYXBwaW5nRmlsZVdpemFyZE5hbWUgPSBNYXBwaW5nIEZpbGUKLW5ld0pwYU1hcHBpbmdGaWxlV2l6YXJkRGVzYyA9IENyZWF0ZSBhIEpQQSBNYXBwaW5nIEZpbGUKLQotanBhU3RydWN0dXJlVmlld0NvbW1hbmRDYXRlZ29yeSA9IEpQQSBTdHJ1Y3R1cmUgVmlldwotYWRkUGVyc2lzdGVudENsYXNzID0gQWRkIENsYXNzIC4uLgotcmVtb3ZlUGVyc2lzdGVudENsYXNzID0gUmVtb3ZlIENsYXNzCi1hZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWwgPSBBZGQgQXR0cmlidXRlIHRvIFhNTAotYWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwID0gQWRkIEF0dHJpYnV0ZSB0byBYTUwgYW5kIE1hcCAuLi4KLXJlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sID0gUmVtb3ZlIEF0dHJpYnV0ZSBmcm9tIFhNTAotbWFwQXM9TWFwIEFzCi1tYXBBc01uZW1vbmljPU0KLW1hcEFzUGFyYW1ldGVyTmFtZT1tYXBwaW5nIGtleQotCi1qcGFNZW51TmFtZSA9IEpQQSBUb29scwotZ2VuZXJhdGVFbnRpdGllcyA9IEdlbmVyYXRlIEVudGl0aWVzLi4uCi1nZW5lcmF0ZURETCA9IEdlbmVyYXRlIERETC4uLgotbWlncmF0ZUphdmFQcm9qZWN0ID0gQ29udmVydCB0byBKUEEgUHJvamVjdCAuLi4KLXN5bmNocm9uaXplQ2xhc3NlcyA9IFN5bmNocm9uaXplIENsYXNzZXMKLQotcGVyc2lzdGVuY2VFZGl0b3I9UGVyc2lzdGVuY2UgWE1MIEVkaXRvcgotCi1qcGFQcmVmZXJlbmNlUGFnZSA9IEpQQQotCi1qcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UgPSBKUEEKLQotanBhUGVyc3BlY3RpdmUgPSBKUEEKLWpwYURldGFpbHMgPSBKUEEgRGV0YWlscwotanBhU3RydWN0dXJlID0gSlBBIFN0cnVjdHVyZQotCi1KcGFQcm9wb3NhbENhdGVnb3J5ID0gSlBBIFByb3Bvc2FscwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxMGVjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQkKLQk8ZXh0ZW5zaW9uLXBvaW50IAotCQlpZD0ianBhUGxhdGZvcm0iIAotCQluYW1lPSIlSlBBX1BMQVRGT1JNIiAKLQkJc2NoZW1hPSJzY2hlbWEvanBhUGxhdGZvcm0uZXhzZCIvPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQkKLQkJPCEtLSAKLQkJCUEgdGVzdCBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBvdXIgY3VycmVudCBjb250ZXh0IGlzIHdpdGhpbiB0aGUgCi0JCQlKUEEgU3RydWN0dXJlIFZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQktLT4KLQkJPGRlZmluaXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyI+Ci0JCQk8d2l0aAotCQkJCXZhcmlhYmxlPSJhY3RpdmVQYXJ0SWQiPgotCQkJCTxlcXVhbHMKLQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Ii8+Ci0JCQk8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLQkJCi0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvblBhcnRpY2lwYW50RmFjdG9yeSI+Ci0JCQk8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkpwYVNlbGVjdGlvblBhcnRpY2lwYW50Ii8+Ci0JCTwvZmFjdG9yeT4KLQkJCi0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhRmlsZUFkYXB0ZXJGYWN0b3J5Ij4KLQkJCTxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGUiLz4KLQkJPC9mYWN0b3J5PgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEV4dGVuc2lvbjogSmF2YSBDb21wbGV0aW9uIFByb3Bvc2FsIENvbXB1dGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qZHQudWkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgotCQlpZD0iSnBhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiPgotCQk8amF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhUHJvcG9zYWxDYXRlZ29yeSI+Ci0JCQk8cGFydGl0aW9uIHR5cGU9Il9fZGZ0bF9wYXJ0aXRpb25fY29udGVudF90eXBlIi8+Ci0JCQk8cGFydGl0aW9uIHR5cGU9Il9famF2YV9zdHJpbmciLz4KLQkJPC9qYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI+Ci0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciIKLQkJaWQ9ImpwYVByb3Bvc2FsQ2F0ZWdvcnkiCi0JCW5hbWU9IiVKcGFQcm9wb3NhbENhdGVnb3J5Ij4KLQkJPHByb3Bvc2FsQ2F0ZWdvcnkKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9wZXJzcGVjdGl2ZS5naWYiLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qcHQudWkuanBhUGxhdGZvcm0iPgotCQkKLQkJPGpwYVBsYXRmb3JtCi0JCQlpZD0iZ2VuZXJpYyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljUGxhdGZvcm1VaSIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JCQotCQk8Y2F0ZWdvcnkKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlld0NvbW1hbmRzIgotCQkJbmFtZT0iJWpwYVN0cnVjdHVyZVZpZXdDb21tYW5kQ2F0ZWdvcnkiPgotCQk8L2NhdGVnb3J5PgotCQkKLQkJPGNvbW1hbmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuZW50aXR5TWFwcGluZ3NBZGRQZXJzaXN0ZW50Q2xhc3MiCi0JCQluYW1lPSIlYWRkUGVyc2lzdGVudENsYXNzIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVN0cnVjdHVyZVZpZXdDb21tYW5kcyI+Ci0JCTwvY29tbWFuZD4KLQkJCi0JCTxjb21tYW5kCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRUeXBlUmVtb3ZlUGVyc2lzdGVudENsYXNzIgotCQkJbmFtZT0iJXJlbW92ZVBlcnNpc3RlbnRDbGFzcyIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Q29tbWFuZHMiPgotCQk8L2NvbW1hbmQ+Ci0JCQotCQk8Y29tbWFuZAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW50QXR0cmlidXRlQWRkVG9YbWwiCi0JCQluYW1lPSIlYWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVN0cnVjdHVyZVZpZXdDb21tYW5kcyI+Ci0JCTwvY29tbWFuZD4KLQkJCi0JCTxjb21tYW5kCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVBZGRUb1htbEFuZE1hcCIKLQkJCW5hbWU9IiVhZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXAiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlld0NvbW1hbmRzIj4KLQkJPC9jb21tYW5kPgotCQkKLQkJPGNvbW1hbmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVudEF0dHJpYnV0ZVJlbW92ZUZyb21YbWwiCi0JCQluYW1lPSIlcmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZUZyb21YbWwiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlld0NvbW1hbmRzIj4KLQkJPC9jb21tYW5kPgotCi0JCTxjb21tYW5kCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRUeXBlTWFwQXMiCi0JCQluYW1lPSIlbWFwQXMiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlld0NvbW1hbmRzIj4KLQkJCTxjb21tYW5kUGFyYW1ldGVyCi0JCQkJaWQ9InBlcnNpc3RlbnRUeXBlTWFwcGluZ0tleSIKLQkJCQluYW1lPSIlbWFwQXNQYXJhbWV0ZXJOYW1lIgotCQkJCW9wdGlvbmFsPSJmYWxzZSI+Ci0JCQk8L2NvbW1hbmRQYXJhbWV0ZXI+Ci0JCTwvY29tbWFuZD4KLQkJCi0JCTxjb21tYW5kCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBcyIKLQkJCW5hbWU9IiVtYXBBcyIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Q29tbWFuZHMiPgotCQkJPGNvbW1hbmRQYXJhbWV0ZXIKLQkJCQlpZD0icGVyc2lzdGVudEF0dHJpYnV0ZU1hcHBpbmdLZXkiCi0JCQkJbmFtZT0iJW1hcEFzUGFyYW1ldGVyTmFtZSIKLQkJCQlvcHRpb25hbD0iZmFsc2UiPgotCQkJPC9jb21tYW5kUGFyYW1ldGVyPgotCQk8L2NvbW1hbmQ+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRXh0ZW5zaW9uOiBQZXJzaXN0ZW5jZSBFZGl0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQkKLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCQotCQk8ZWRpdG9yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmVkaXRvcnMuUGVyc2lzdGVuY2VFZGl0b3IiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZWRpdG9ycy5QZXJzaXN0ZW5jZUNvbnRyaWJ1dG9yIgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL29iajE2L2pwYS1maWxlLmdpZiIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZWRpdG9ycy5QZXJzaXN0ZW5jZUVkaXRvciIKLQkJCW5hbWU9IiVwZXJzaXN0ZW5jZUVkaXRvciI+Ci0gICAgICAJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50LnBlcnNpc3RlbmNlIi8+Ci0JCTwvZWRpdG9yPgotCQkKLSAJPC9leHRlbnNpb24+Ci0gCQotIAkKLSAJPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotCQkKLQkJPGhhbmRsZXIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLmVudGl0eU1hcHBpbmdzQWRkUGVyc2lzdGVudENsYXNzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyIj4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UKLQkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5qcHQudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyI+Ci0JCQkJPC9yZWZlcmVuY2U+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGFuZD4KLQkJCQkJPGNvdW50IHZhbHVlPSIxIi8+Ci0JCQkJCTxpdGVyYXRlPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzIi8+Ci0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L2FuZD4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJCi0JCTxoYW5kbGVyCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW50VHlwZVJlbW92ZVBlcnNpc3RlbnRDbGFzcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHMuUmVtb3ZlUGVyc2lzdGVudENsYXNzSGFuZGxlciI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlCi0JCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UuanB0LnVpLnJlZmVyZW5jZS5pbkpwYVN0cnVjdHVyZVZpZXciPgotCQkJCTwvcmVmZXJlbmNlPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxpdGVyYXRlPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGUiLz4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JCQotCQk8aGFuZGxlcgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVudEF0dHJpYnV0ZUFkZFRvWG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxIYW5kbGVyIj4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UKLQkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5qcHQudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyI+Ci0JCQkJPC9yZWZlcmVuY2U+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGU+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSIvPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmlzVmlydHVhbCIgdmFsdWU9InRydWUiLz4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc01hcHBlZCIgdmFsdWU9InRydWUiLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9pdGVyYXRlPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCQkKLQkJPGhhbmRsZXIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVBZGRUb1htbEFuZE1hcCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwSGFuZGxlciI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlCi0JCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UuanB0LnVpLnJlZmVyZW5jZS5pbkpwYVN0cnVjdHVyZVZpZXciPgotCQkJCTwvcmVmZXJlbmNlPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxpdGVyYXRlPgotCQkJCQk8YW5kPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUiLz4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJ0cnVlIi8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJCi0JCTxoYW5kbGVyCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW50QXR0cmlidXRlUmVtb3ZlRnJvbVhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHMuUmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZUZyb21YbWxIYW5kbGVyIj4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UKLQkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5qcHQudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyI+Ci0JCQkJPC9yZWZlcmVuY2U+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGU+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSIvPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmlzVmlydHVhbCIgdmFsdWU9ImZhbHNlIi8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJCi0JCTxoYW5kbGVyCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW50VHlwZU1hcEFzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kcy5QZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlciI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlCi0JCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UuanB0LnVpLnJlZmVyZW5jZS5pbkpwYVN0cnVjdHVyZVZpZXciLz4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8aXRlcmF0ZT4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGUiLz4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JCQotCQk8aGFuZGxlcgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kcy5QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyIj4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UKLQkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5qcHQudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyIvPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxpdGVyYXRlPgotCQkJCQk8YW5kPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZSIvPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmlzVmlydHVhbCIgdmFsdWU9ImZhbHNlIi8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJCi0gCTwvZXh0ZW5zaW9uPgotIAkKLSAJCi0gCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLQkJCi0JCTxtZW51Q29udHJpYnV0aW9uCi0JCQlsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UuanB0LnVpLmpwYVN0cnVjdHVyZVZpZXciPgotCQkJPGNvbW1hbmQKLQkJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5lbnRpdHlNYXBwaW5nc0FkZFBlcnNpc3RlbnRDbGFzcyI+Ci0JCQkJPHZpc2libGVXaGVuPgotCQkJCQk8d2l0aAotCQkJCQkJdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0JCQkJCQk8aXRlcmF0ZT4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3MiLz4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCQk8Y29tbWFuZAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRUeXBlUmVtb3ZlUGVyc2lzdGVudENsYXNzIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZSIvPgotCQkJCQkJPC9pdGVyYXRlPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJCTxjb21tYW5kCi0JCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVudEF0dHJpYnV0ZUFkZFRvWG1sIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlPgotCQkJCQkJCTxhbmQ+Ci0JCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlIi8+Ci0JCQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJ0cnVlIi8+Ci0JCQkJCQkJPC9hbmQ+Ci0JCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJCTwvd2l0aD4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJPGNvbW1hbmQKLQkJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW50QXR0cmlidXRlQWRkVG9YbWxBbmRNYXAiPgotCQkJCTx2aXNpYmxlV2hlbj4KLQkJCQkJPHdpdGgKLQkJCQkJCXZhcmlhYmxlPSJzZWxlY3Rpb24iPgotCQkJCQkJPGl0ZXJhdGU+Ci0JCQkJCQkJPGFuZD4KLQkJCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUiLz4KLQkJCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmlzVmlydHVhbCIgdmFsdWU9InRydWUiLz4KLQkJCQkJCQk8L2FuZD4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCQk8Y29tbWFuZAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVSZW1vdmVGcm9tWG1sIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlPgotCQkJCQkJCTxhbmQ+Ci0JCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlIi8+Ci0JCQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJmYWxzZSIvPgotCQkJCQkJCTwvYW5kPgotCQkJCQkJPC9pdGVyYXRlPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJCQotCQkJPG1lbnUKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRUeXBlTWFwQXMiCi0JCQkJbGFiZWw9IiVtYXBBcyIKLQkJCQltbmVtb25pYz0iJW1hcEFzTW5lbW9uaWMiPgotCQkJCTx2aXNpYmxlV2hlbj4KLQkJCQkJPHdpdGgKLQkJCQkJCXZhcmlhYmxlPSJzZWxlY3Rpb24iPgotCQkJCQkJPGl0ZXJhdGU+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGUiLz4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQkJPGR5bmFtaWMKLQkJCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW50VHlwZU1hcEFzIgotCQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1lbnVzLlBlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb24iPgotCQkJCTwvZHluYW1pYz4KLQkJCTwvbWVudT4KLQotCQkJPG1lbnUKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBcyIKLQkJCQlsYWJlbD0iJW1hcEFzIgotCQkJCW1uZW1vbmljPSIlbWFwQXNNbmVtb25pYyI+Ci0JCQkJPHZpc2libGVXaGVuPgotCQkJCQk8d2l0aAotCQkJCQkJdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0JCQkJCQk8aXRlcmF0ZT4KLQkJCQkJCQk8YW5kPgotCQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlIi8+Ci0JCQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJmYWxzZSIvPgotCQkJCQkJCTwvYW5kPgotCQkJCQkJPC9pdGVyYXRlPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCQk8ZHluYW1pYwotCQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBcyIKLQkJCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tZW51cy5QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb250cmlidXRpb24iPgotCQkJCTwvZHluYW1pYz4KLQkJCTwvbWVudT4KLQotCQk8L21lbnVDb250cmlidXRpb24+Ci0JCQotIAk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld2VyIj4KLQkJCi0JCTx2aWV3ZXJDb250ZW50QmluZGluZwotCQkJdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiPgotCQkJPGluY2x1ZGVzPgotCQkJCTxjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLmpwdC51aS4qIi8+Ci0JCQk8L2luY2x1ZGVzPgotCQk8L3ZpZXdlckNvbnRlbnRCaW5kaW5nPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0JCQotCQk8bmF2aWdhdG9yQ29udGVudAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFOYXZpZ2F0b3JDb250ZW50IgotCQkJbmFtZT0iJWpwYU5hdmlnYXRvckNvbnRlbnQiIAotCQkJcHJpb3JpdHk9ImhpZ2hlciIKLQkJCWljb249Imljb25zL2Z1bGwvb2JqMTYvanBhLWNvbnRlbnQuZ2lmIgotCQkJYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotCQkJY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubmF2aWdhdG9yLkpwYU5hdmlnYXRvckNvbnRlbnRQcm92aWRlciIKLQkJCWxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yTGFiZWxQcm92aWRlciI+Ci0JCQkKLQkJCTx0cmlnZ2VyUG9pbnRzPgotCQkJCTxhbmQ+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+IAotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpwdC5qcGEiIC8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9hbmQ+Ci0JCQk8L3RyaWdnZXJQb2ludHM+Ci0JCQkKLQkJCTxwb3NzaWJsZUNoaWxkcmVuPgotCQkJCTxpbnN0YW5jZW9mCi0JCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlIi8+Ci0JCQk8L3Bvc3NpYmxlQ2hpbGRyZW4+Ci0JCQkKLQkJCTxhY3Rpb25Qcm92aWRlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubmF2aWdhdG9yLkpwYU5hdmlnYXRvckFjdGlvblByb3ZpZGVyIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhQWN0aW9uUHJvdmlkZXIiPgotCQkJCTxlbmFibGVtZW50PgotCQkJCQk8YW5kPgotCQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZSIvPgotCQkJCQk8L2FuZD4KLQkJCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8L2FjdGlvblByb3ZpZGVyPgotCQkJCi0JCQk8IS0tCi0JCQkKLQkJCTxjb21tb25Tb3J0ZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVWaWV3ZXJTb3J0ZXIiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFVmlld2VyU29ydGVyIiAvPgotCQkJCi0JCQktLT4KLQkJCQotCQk8L25hdmlnYXRvckNvbnRlbnQ+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCQkKLQkJPGNhdGVnb3J5Ci0JCQlpZD0ib3JnLmVjbGlwc2UuanB0IgotCQkJbmFtZT0iJWpwYVdpemFyZENhdGVnb3J5TmFtZSIvPgotCQkKLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3SnBhUHJvamVjdCIKLQkJCW5hbWU9IiVuZXdKcGFQcm9qZWN0V2l6YXJkTmFtZSIKLQkJCWljb249Imljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhcHJvamVjdF93aXouZ2lmIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdKcGFQcm9qZWN0V2l6YXJkIgotCQkJcHJvamVjdD0idHJ1ZSIKLQkJCWZpbmFsUGVyc3BlY3RpdmU9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQZXJzcGVjdGl2ZSI+Ci0JCQk8ZGVzY3JpcHRpb24+JW5ld0pwYVByb2plY3RXaXphcmREZXNjPC9kZXNjcmlwdGlvbj4KLQkJPC93aXphcmQ+Ci0JCQotCQk8d2l6YXJkCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnVpLndpemFyZC5uZXdFbnRpdHkiCi0JCQluYW1lPSIlbmV3SnBhRW50aXR5V2l6YXJkTmFtZSIKLQkJCWljb249Imljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZW50aXR5X3dpei5naWYiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5FbnRpdHlXaXphcmQiPgotCQkJPGRlc2NyaXB0aW9uPiVuZXdKcGFFbnRpdHlXaXphcmREZXNjPC9kZXNjcmlwdGlvbj4KLQkJPC93aXphcmQ+Ci0JCQotCQk8d2l6YXJkCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnVpLndpemFyZC5uZXdNYXBwaW5nRmlsZSIKLQkJCW5hbWU9IiVuZXdKcGFNYXBwaW5nRmlsZVdpemFyZE5hbWUiCi0JCQlpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvbmV3X2pwYV9maWxlX3dpei5naWYiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLm9ybS5NYXBwaW5nRmlsZVdpemFyZCI+Ci0JCQk8ZGVzY3JpcHRpb24+JW5ld0pwYU1hcHBpbmdGaWxlV2l6YXJkRGVzYzwvZGVzY3JpcHRpb24+Ci0JCTwvd2l6YXJkPgotICAgICAgCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCQotCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnByb2plY3QuSlBBVG9vbHMiCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0JCQlhZGFwdGFibGU9InRydWUiPgotCQkJPG1lbnUKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnByb2plY3QuSlBBVG9vbHMiCi0JCQkJbGFiZWw9IiVqcGFNZW51TmFtZSIvPgotCi0JCQk8ZW5hYmxlbWVudD4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGEiLz4KLQkJCTwvZW5hYmxlbWVudD4KLQotCQkJPGFjdGlvbgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuZ2VuZXJhdGVFbnRpdGllcyIKLQkJCQlsYWJlbD0iJWdlbmVyYXRlRW50aXRpZXMiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5hY3Rpb25zLkdlbmVyYXRlRW50aXRpZXNBY3Rpb24iCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQltZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanB0LnVpLnByb2plY3QuSlBBVG9vbHMvY29udGVudCIvPgotCQkJCi0JCQk8YWN0aW9uCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5nZW5lcmF0ZURETCIKLQkJCQlsYWJlbD0iJWdlbmVyYXRlRERMIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9ucy5HZW5lcmF0ZURETEFjdGlvbiIKLQkJCQllbmFibGVzRm9yPSIxIgotCQkJCW1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qcHQudWkucHJvamVjdC5KUEFUb29scy9jb250ZW50Ii8+Ci0JCQkJCi0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotCQkKLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wcm9qZWN0LkpQQVRvb2xzIgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotCQkJYWRhcHRhYmxlPSJ0cnVlIj4KLQkJCTxtZW51Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wcm9qZWN0LkpQQVRvb2xzIgotCQkJCWxhYmVsPSIlanBhTWVudU5hbWUiLz4KLQkJCQotCQkJPHZpc2liaWxpdHk+Ci0JCQkJPGFuZD4KLQkJCQkJPG9iamVjdFN0YXRlIAotCQkJCQkJbmFtZT0icHJvamVjdE5hdHVyZSIgCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPgotCQkJCQk8bm90PgotCQkJCQkJPG9iamVjdFN0YXRlIAotCQkJCQkJCW5hbWU9InByb2plY3ROYXR1cmUiIAotCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5uYXR1cmUiLz4KLQkJCQkJPC9ub3Q+Ci0JCQkJPC9hbmQ+Ci0JCQk8L3Zpc2liaWxpdHk+Ci0JCQkKLQkJCTxhY3Rpb24KLQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLmdlbmVyYXRlRERMIgotCQkJCWxhYmVsPSIlbWlncmF0ZUphdmFQcm9qZWN0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9ucy5NaWdyYXRlSmF2YVByb2plY3RBY3Rpb24iCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQltZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanB0LnVpLnByb2plY3QuSlBBVG9vbHMvY29udGVudCIvPgotCQkJCQotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLQkJCi0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVuY2VYbWxGaWxlQWN0aW9ucyIKLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCW5hbWVGaWx0ZXI9InBlcnNpc3RlbmNlLnhtbCI+Ci0JCQk8bWVudQotCQkJCWlkPSJwZXJzaXN0ZW5jZVhtbEpQQVRvb2xzIgotCQkJCWxhYmVsPSIlanBhTWVudU5hbWUiLz4KLQkJCTxhY3Rpb24KLQkJCQlpZD0ic3luY2hDbGFzc2VzQWN0aW9uIgotCQkJCWxhYmVsPSIlc3luY2hyb25pemVDbGFzc2VzIgotCQkJCW1lbnViYXJQYXRoPSJwZXJzaXN0ZW5jZVhtbEpQQVRvb2xzL2NvbnRlbnQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5hY3Rpb25zLlN5bmNocm9uaXplQ2xhc3Nlc0FjdGlvbiIKLQkJCQllbmFibGVzRm9yPSIxIi8+Ci0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotCQkKLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wZXJzaXN0ZW5jZVhtbEFjdGlvbnMiCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbCI+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9InN5bmNoQ2xhc3Nlc0FjdGlvbiIKLQkJCQlsYWJlbD0iJXN5bmNocm9uaXplQ2xhc3NlcyIKLQkJCQltZW51YmFyUGF0aD0iY29udGVudCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnMuU3luY2hyb25pemVDbGFzc2VzQWN0aW9uIgotCQkJCWVuYWJsZXNGb3I9IjEiLz4KLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCQotCQk8cGFnZQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQcmVmZXJlbmNlUGFnZSIKLQkJCW5hbWU9IiVqcGFQcmVmZXJlbmNlUGFnZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJlZnMuSnBhUHJlZmVyZW5jZVBhZ2UiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0JCQotCQk8cGFnZQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UiCi0JCQluYW1lPSIlanBhUHJvamVjdFByb3BlcnRpZXNQYWdlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZSI+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGFkYXB0IAotCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCTx0ZXN0IAotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCXZhbHVlPSJqcHQuanBhIi8+Ci0JCQkJPC9hZGFwdD4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQkJCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotCQkKLQkJPGNhdGVnb3J5Ci0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpIgotCQkJbmFtZT0iJWpwYVBlcnNwZWN0aXZlIi8+Ci0JCQotCQk8dmlldwotCSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3IgotCSAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdC51aSIKLQkgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3Muc3RydWN0dXJlLkpwYVN0cnVjdHVyZVZpZXciCi0JICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V2aWV3MTYvanBhX3N0cnVjdHVyZS5naWYiCi0JICAgICAgICBuYW1lPSIlanBhU3RydWN0dXJlIi8+Ci0JCQkKLQkJPHZpZXcKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhRGV0YWlsc1ZpZXciCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LnVpIgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3cy5KcGFEZXRhaWxzVmlldyIKLQkgICAgICAgIGljb249Imljb25zL2Z1bGwvZXZpZXcxNi9qcGFfZGV0YWlscy5naWYiCi0JCQluYW1lPSIlanBhRGV0YWlscyIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEV4dGVuc2lvbjogUGVyc2lzdGVuY2UgUGVyc3BlY3RpdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPgotCQkKLQkJPHBlcnNwZWN0aXZlCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVBlcnNwZWN0aXZlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZS5KcGFQZXJzcGVjdGl2ZUZhY3RvcnkiCi0JCQluYW1lPSIlanBhUGVyc3BlY3RpdmUiCi0JCQlpY29uPSJpY29ucy9mdWxsL2V2aWV3MTYvanBhX3BlcnNwZWN0aXZlLmdpZiIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW1hZ2VzIj4KLQkJCi0JCTxpbWFnZSBmYWNldD0ianB0LmpwYSIgcGF0aD0iaWNvbnMvZnVsbC9ldG9vbDE2L2pwYV9mYWNldC5naWYiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbiAKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS53aXphcmRQYWdlcyI+Ci0JCQotCQk8d2l6YXJkLXBhZ2VzIGFjdGlvbj0ianB0LmpwYS5pbnN0YWxsIj4KLQkJCTxwYWdlIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5KcGFGYWNldFdpemFyZFBhZ2UiLz4KLQkJPC93aXphcmQtcGFnZXM+Ci0JCQotCTwvZXh0ZW5zaW9uPgotIAkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aS5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2MyNjBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQWJzdHJhY3RDaG9vc2VyUGFuZV9icm93c2VCdXR0b249QnJvd3NlLi4uCi0KLUFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfdGl0bGU9QWRkIFBlcnNpc3RlbnQgQXR0cmlidXRlCi1BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX2F0dHJpYnV0ZUxhYmVsPUF0dHJpYnV0ZToKLUFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfbWFwcGluZ0xhYmVsPU1hcCBhczoKLUFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfbm9NYXBwaW5nS2V5RXJyb3I9WW91IG11c3Qgc3BlY2lmeSBhIG1hcHBpbmcgdHlwZQotCi1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfdGl0bGU9QWRkIFBlcnNpc3RlbnQgQ2xhc3MKLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0xhYmVsPUNsYXNzOgotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzRGlhbG9nX3RpdGxlPVBlcnNpc3RlbnQgQ2xhc3MgU2VsZWN0aW9uCi1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfbWVzc2FnZT1DaG9vc2UgYSBjbGFzczoKLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19tYXBwaW5nTGFiZWw9TWFwIGFzOgotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vQ2xhc3NFcnJvcj1Zb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3MKLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19kdXBsaWNhdGVDbGFzc1dhcm5pbmc9RmlsZSBhbHJlYWR5IGNvbnRhaW5zIHRoYXQgcGVyc2lzdGVudCBjbGFzcwotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzTm90Rm91bmRXYXJuaW5nPUNhbm5vdCByZXNvbHZlIGNsYXNzCi1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbm9NYXBwaW5nS2V5RXJyb3I9WW91IG11c3Qgc3BlY2lmeSBhIG1hcHBpbmcgdHlwZQotCi1BZGRSZW1vdmVQYW5lX0FkZEJ1dHRvblRleHQ9QWRkLi4uCi1BZGRSZW1vdmVQYW5lX1JlbW92ZUJ1dHRvblRleHQ9UmVtb3ZlCi0KLUNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZT0mRW50ZXIgdHlwZSBuYW1lIHByZWZpeCBvciBwYXR0ZXJuICgqLCA/LCBvciBjYW1lbCBjYXNlKToKLUNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nVGl0bGU9Q2xhc3MgU2VsZWN0aW9uCi0KLURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9kYXRhYmFzZT1EYXRhYmFzZSBTZXR0aW5ncwotRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2RhdGFiYXNlQ29ubmVjdGlvbj1EYXRhYmFzZSBDb25uZWN0aW9uCi1EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfcmVjb25uZWN0VG9EYXRhYmFzZT1SZWNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2Nvbm5lY3Rpb249Q29ubmVjdGlvbjoKLURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9zY2hlbWE9U2NoZW1hOgotRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3NjaGVtYUluZm89KE5vdGU6ICBNdXN0IGhhdmUgYWN0aXZlIGNvbm5lY3Rpb24gdG8gc2VsZWN0IHNjaGVtYSkKLURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9hZGRDb25uZWN0aW9uTGluaz08YT5BZGQgY29ubmVjdGlvbnMuLi48L2E+Ci1EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfcmVjb25uZWN0TGluaz08YT5SZWNvbm5lY3QuLi48L2E+Ci0KLUVudW1Db21ib1ZpZXdlcl9kZWZhdWx0PURlZmF1bHQgKCkKLUVudW1Db21ib1ZpZXdlcl9kZWZhdWx0V2l0aERlZmF1bHQ9RGVmYXVsdCAoezB9KQotCi1FcnJvcl9vcGVuaW5nRWRpdG9yPUVycm9yIE9wZW5pbmcgRWRpdG9yCi0KLUdlbmVyYWxfYnJvd3NlPUJyb3dzZS4uLgotR2VuZXJhbF9kZXNlbGVjdEFsbD1EZXNlbGVjdCBBbGwKLUdlbmVyYWxfc2VsZWN0QWxsPVNlbGVjdCBBbGwKLQotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzPUdlbmVyYXRlIEVudGl0aWVzCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9jaG9vc2VFbnRpdHlUYWJsZT1DaG9vc2UgdGFibGVzIHRvIGdlbmVyYXRlIGVudGl0aWVzIGZyb20uCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9nZW5lcmF0ZUVudGl0aWVzPUdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9zeW5jaHJvbml6ZUNsYXNzZXM9U3luY2hyb25pemUgQ2xhc3NlcyBpbiBwZXJzaXN0ZW5jZS54bWwKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3RhYmxlcz1UYWJsZXM6Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV90YWJsZUNvbHVtbj1UYWJsZQotR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfZW50aXR5TmFtZUNvbHVtbj1FbnRpdHkgTmFtZQotCi1FbnRpdGllc0dlbmVyYXRvcl9qb2JOYW1lPUdlbmVyYXRpbmcgRW50aXRpZXMKLQotR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRpdGxlPURETCBHZW5lcmF0aW9uCi1HZW5lcmljUGxhdGZvcm1VaURpYWxvZ19ub3RTdXBwb3J0ZWRNZXNzYWdlVGV4dD1EREwgR2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBHZW5lcmljIFBsYXRmb3JtLgotCi1KcGFDb250ZW50X2xhYmVsPUpQQSBDb250ZW50Ci0KLUpwYVByZWZlcmVuY2VQYWdlX2RlZmF1bHRKcGFMaWI9RGVmYXVsdCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeToKLUpwYVByZWZlcmVuY2VQYWdlX3VzZXJMaWJzTGluaz08YT5Db25maWd1cmUgdXNlciBsaWJyYXJpZXMgLi4uPC9hPgotSnBhUHJlZmVyZW5jZVBhZ2VfaW52YWxpZEpwYUxpYj1JbnZhbGlkIExpYnJhcnk6ICBNdXN0IGNvbnRhaW4gamF2YXgucGVyc2lzdGVuY2UgY2xhc3Nlcy4KLQotSnBhU3RydWN0dXJlVmlld19zdHJ1Y3R1cmVOb3RBdmFpbGFibGU9SlBBIHN0cnVjdHVyZSBpcyBub3QgYXZhaWxhYmxlLgotSnBhU3RydWN0dXJlVmlld19saW5rV2l0aEVkaXRvclRleHQ9TGluayB3aXRoIEVkaXRvcgotSnBhU3RydWN0dXJlVmlld19saW5rV2l0aEVkaXRvckRlc2M9TGluayB3aXRoIEFjdGl2ZSBFZGl0b3IKLUpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JUb29sdGlwPUxpbmsgd2l0aCBFZGl0b3IKLQotSnBhRGV0YWlsc1ZpZXdfdmlld05vdEF2YWlsYWJsZT1EZXRhaWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0KLUpwYUZhY2V0V2l6YXJkUGFnZV90aXRsZT1KUEEgRmFjZXQKLUpwYUZhY2V0V2l6YXJkUGFnZV9kZXNjcmlwdGlvbj1Db25maWd1cmUgSlBBIHNldHRpbmdzLgotSnBhRmFjZXRXaXphcmRQYWdlX3BsYXRmb3JtTGFiZWw9UGxhdGZvcm0KLUpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGFiZWw9Q29ubmVjdGlvbgotSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MaW5rPTxhPkFkZCBjb25uZWN0aW9uIC4uLjwvYT4KLUpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0TGluaz08YT5Db25uZWN0PC9hPgotSnBhRmFjZXRXaXphcmRQYWdlX292ZXJyaWRlRGVmYXVsdFNjaGVtYUxhYmVsPU92ZXJyaWRlIGRlZmF1bHQgc2NoZW1hIGZyb20gY29ubmVjdGlvbgotSnBhRmFjZXRXaXphcmRQYWdlX2RlZmF1bHRTY2hlbWFMYWJlbD1TY2hlbWE6Ci1KcGFGYWNldFdpemFyZFBhZ2VfanBhSW1wbGVtZW50YXRpb25MYWJlbD1KUEEgaW1wbGVtZW50YXRpb24KLUpwYUZhY2V0V2l6YXJkUGFnZV91c2VyU2VydmVyTGliTGFiZWw9VXNlIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHNlcnZlciBydW50aW1lCi1KcGFGYWNldFdpemFyZFBhZ2Vfc3BlY2lmeUxpYkxhYmVsPVVzZSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5OgotSnBhRmFjZXRXaXphcmRQYWdlX2pwYVByZWZzTGluaz08YT5Db25maWd1cmUgZGVmYXVsdCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSAuLi48L2E+Ci1KcGFGYWNldFdpemFyZFBhZ2VfdXNlckxpYnNMaW5rPTxhPkNvbmZpZ3VyZSB1c2VyIGxpYnJhcmllcyAuLi48L2E+Ci1KcGFGYWNldFdpemFyZFBhZ2VfcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudExhYmVsPVBlcnNpc3RlbnQgY2xhc3MgbWFuYWdlbWVudAotSnBhRmFjZXRXaXphcmRQYWdlX2Rpc2NvdmVyQ2xhc3Nlc0J1dHRvbj1EaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyBhdXRvbWF0aWNhbGx5Ci1KcGFGYWNldFdpemFyZFBhZ2VfbGlzdENsYXNzZXNCdXR0b249QW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gcGVyc2lzdGVuY2UueG1sCi1KcGFGYWNldFdpemFyZFBhZ2VfY3JlYXRlT3JtWG1sQnV0dG9uPUNyZWF0ZSBvcm0ueG1sCi1KcGFGYWNldFdpemFyZFBhZ2Vfbm9uZT08Tm9uZT4KLQotTWFwQXNDb21wb3NpdGVfYmFzaWM9YmFzaWMKLU1hcEFzQ29tcG9zaXRlX2Jhc2ljX2RlZmF1bHQ9YmFzaWMgKGRlZmF1bHQpCi1NYXBBc0NvbXBvc2l0ZV9iYXNpY19kZWZhdWx0Mj1CYXNpYyAoRGVmYXVsdCkKLU1hcEFzQ29tcG9zaXRlX2NoYW5nZU1hcHBpbmdUeXBlPWhlcmUKLU1hcEFzQ29tcG9zaXRlX2RlZmF1bHQ9RGVmYXVsdAotTWFwQXNDb21wb3NpdGVfZGlhbG9nVGl0bGU9TWFwcGluZyBUeXBlIFNlbGVjdGlvbgotTWFwQXNDb21wb3NpdGVfZW1iZWRkZWQ9ZW1iZWRkZWQKLU1hcEFzQ29tcG9zaXRlX2VtYmVkZGVkX2RlZmF1bHQ9ZW1iZWRkZWQgKGRlZmF1bHQpCi1NYXBBc0NvbXBvc2l0ZV9lbWJlZGRlZF9kZWZhdWx0Mj1FbWJlZGRlZCAoRGVmYXVsdCkKLU1hcEFzQ29tcG9zaXRlX2VtYmVkZGVkaWQ9ZW1iZWRkZWQgaWQKLU1hcEFzQ29tcG9zaXRlX2VtYmVkZGFibGU9ZW1iZWRkYWJsZQotTWFwQXNDb21wb3NpdGVfZW50aXR5PWVudGl0eQotTWFwQXNDb21wb3NpdGVfaWQ9aWQKLU1hcEFzQ29tcG9zaXRlX2xhYmVsVGV4dD0mRW50ZXIgbWFwcGluZyB0eXBlIG9yIHBhdHRlcm4gKCosID8sIG9yIGNhbWVsIGNhc2UpOgotTWFwQXNDb21wb3NpdGVfbWFueXRvbWFueT1tYW55IHRvIG1hbnkKLU1hcEFzQ29tcG9zaXRlX21hbnl0b29uZT1tYW55IHRvIG9uZQotTWFwQXNDb21wb3NpdGVfbWFwcGVkc3VwZXJjbGFzcz1tYXBwZWQgc3VwZXJjbGFzcwotTWFwQXNDb21wb3NpdGVfbWFwcGVkQXR0cmlidXRlVGV4dD1BdHRyaWJ1dGUgJyd7MH0nJyBpcyBtYXBwZWQgYXMgezF9LgotTWFwQXNDb21wb3NpdGVfbWFwcGVkVHlwZVRleHQ9VHlwZSAnJ3swfScnIGlzIG1hcHBlZCBhcyB7MX0uCi1NYXBBc0NvbXBvc2l0ZV9vbmV0b21hbnk9b25lIHRvIG1hbnkKLU1hcEFzQ29tcG9zaXRlX29uZXRvb25lPW9uZSB0byBvbmUKLU1hcEFzQ29tcG9zaXRlX3RyYW5zaWVudD10cmFuc2llbnQKLU1hcEFzQ29tcG9zaXRlX3VubWFwcGVkQXR0cmlidXRlVGV4dD1BdHRyaWJ1dGUgJyd7MH0nJyBpcyBub3QgbWFwcGVkLCBjbGljayBoZXJlIHRvIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlLgotTWFwQXNDb21wb3NpdGVfdW5tYXBwZWRUeXBlVGV4dD1UeXBlICcnezB9JycgaXMgbm90IG1hcHBlZCwgY2xpY2sgaGVyZSB0byBjaGFuZ2UgdGhlIG1hcHBpbmcgdHlwZS4KLU1hcEFzQ29tcG9zaXRlX3ZlcnNpb249dmVyc2lvbgotTWFwQXNDb21wb3NpdGVfdmlydHVhbEF0dHJpYnV0ZVRleHQ9QXR0cmlidXRlICcnezB9JycgaXMgbm90IG1hcHBlZC4KLQotTWFwcGluZ0ZpbGVXaXphcmRfdGl0bGU9TmV3IE1hcHBpbmcgRmlsZQotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3RpdGxlPU1hcHBpbmcgZmlsZQotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2Rlc2M9U3BlY2lmeSBtYXBwaW5nIGZpbGUgbG9jYXRpb24gYW5kIHByb3BlcnRpZXMKLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9wcm9qZWN0TGFiZWw9UHJvamVjdDoKLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9zb3VyY2VGb2xkZXJMYWJlbD1Tb3VyY2UgZm9sZGVyOgotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2ZpbGVQYXRoTGFiZWw9RmlsZSBwYXRoOgotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FjY2Vzc0xhYmVsPURlZmF1bHQgYWNjZXNzOgotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FkZFRvUGVyc2lzdGVuY2VVbml0QnV0dG9uPUFkZCB0byBwZXJzaXN0ZW5jZSB1bml0Ci1NYXBwaW5nRmlsZVdpemFyZFBhZ2VfcGVyc2lzdGVuY2VVbml0TGFiZWw9UGVyc2lzdGVuY2UgdW5pdDoKLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9pbmNvcnJlY3RTb3VyY2VGb2xkZXJFcnJvcj1TZWxlY3Rpb24gbXVzdCBiZSBhIHZhbGlkIHNvdXJjZSBmb2xkZXIKLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hY2Nlc3NMYWJlbF9zb3VyY2VGb2xkZXJEaWFsb2dUaXRsZT1Tb3VyY2UgRm9sZGVyIFNlbGVjdGlvbgotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FjY2Vzc0xhYmVsX3NvdXJjZUZvbGRlckRpYWxvZ0Rlc2M9Q2hvb3NlIGEgc291cmNlIGZvbGRlcjoKLQotTmV3SnBhUHJvamVjdFdpemFyZF90aXRsZT1OZXcgSlBBIFByb2plY3QKLU5ld0pwYVByb2plY3RXaXphcmRfZmlyc3RQYWdlX3RpdGxlPUpQQSBQcm9qZWN0Ci1OZXdKcGFQcm9qZWN0V2l6YXJkX2ZpcnN0UGFnZV9kZXNjcmlwdGlvbj1Db25maWd1cmUgSlBBIHByb2plY3Qgc2V0dGluZ3MuCi0KLU9ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeV9lbnRpdHlNYXBwaW5nc0xhYmVsPUVudGl0eSBNYXBwaW5ncwotCi1QYWNrYWdlQ2hvb3NlclBhbmVfZGlhbG9nVGl0bGU9UGFja2FnZSBTZWxlY3Rpb24KLVBhY2thZ2VDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlPUNob29zZSBhIGZvbGRlcjogCi0KLVBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X3BlcnNpc3RlbmNlTGFiZWw9UGVyc2lzdGVuY2UKLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX21hcEFzPU1hcCBBczoKLQotUGVyc2lzdGVudFR5cGVQYWdlX21hcEFzPU1hcCBBczoKLQotT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RpdGxlPU92ZXJ3cml0ZSBFeGlzdGluZyBDbGFzcwotT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RleHQ9T3ZlcndyaXRlIHNvdXJjZSBjb2RlIGZvciB0aGUgY2xhc3MgJyd7MH0nJz8KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZW50aXR5X3dpemFyZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9lbnRpdHlfd2l6YXJkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMmFmMTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9lbnRpdHlfd2l6YXJkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgRGltaXRlciBEaW1pdHJvdiwgZC5kaW1pdHJvdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUVOVElUWV9XSVpBUkRfVElUTEU9TmV3IEpQQSBFbnRpdHkKLUFERF9FTlRJVFlfV0laQVJEX1BBR0VfVElUTEU9RW50aXR5IGNsYXNzCi1BRERfRU5USVRZX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OPVNwZWNpZnkgcGFja2FnZSwgY2xhc3MgbmFtZSwgYW5kIGluaGVyaXRhbmNlIHByb3BlcnRpZXMuCi1ERUZBVUxUX1BBQ0tBR0VfV0FSTklORz1UaGUgdXNhZ2Ugb2YgdGhlIGRlZmF1bHQgcGFja2FnZSBpcyBub3QgcmVjb21tZW5kZWQuCi1FTlRJVFlfUFJPUEVSVElFU19USVRMRT1FbnRpdHkgUHJvcGVydGllcwotRU5USVRZX1BST1BFUlRJRVNfREVTQ1JJUFRJT049U2V0IGVudGl0eSBuYW1lLCB0YWJsZSBuYW1lLCBmaWVsZHMsIGFuZCBhY2Nlc3MgdHlwZS4KLUVOVElUWT1FbnRpdHkKLU1BUFBFRF9BU19TVVBFUkNMQVNTPU1hcHBlZCBTdXBlcmNsYXNzCi1JTkhFUklUQU5DRV9HUk9VUD1Jbmhlcml0YW5jZQotSU5IRVJJVEFOQ0VfQ0hFQ0tfQk9YPUluaGVyaXRhbmNlOgotWE1MX1NUT1JBR0VfR1JPVVA9WE1MIEVudGl0eSBNYXBwaW5ncwotWE1MX1NVUFBPUlQ9QWRkIHRvIGVudGl0eSBtYXBwaW5ncyBpbiBYTUwKLUNIT09TRV9YTUw9Q2hvb3NlIFhNTDoKLU1BUFBJTkdfWE1MX1RJVExFPU1hcHBpbmcgWE1MCi1YTUxfTkFNRV9USVRMRT1YTUwgbmFtZToKLUNIT09TRV9NQVBQSU5HX1hNTF9NRVNTQUdFPUNob29zZSBtYXBwaW5nIFhNTCBvciBjcmVhdGUgbmV3IG9uZQotSU5DT1JSRUNUX1hNTF9OQU1FPUluY29ycmVjdCBYTUwgbmFtZQotVFlQRV9ESUFMT0dfVElUTEU9Q2hvb3NlIFR5cGUKLVRZUEVfRElBTE9HX0RFU0NSSVBUSU9OPUNob29zZSB0aGUgdHlwZSBvZiB0aGUgZW50aXR5IGZpZWxkLgotRU5USVRZX05BTUU9RW50aXR5IE5hbWU6Ci1UQUJMRV9OQU1FX0dST1VQPVRhYmxlIE5hbWUKLVRBQkxFX05BTUU9VGFibGUgTmFtZToKLVVTRV9ERUZBVUxUPVVzZSBkZWZhdWx0Ci1FTlRJVFlfRklFTERTPUVudGl0eSBGaWVsZHMKLUtFWT1LZXkKLU5BTUVfQ09MVU1OPU5hbWUKLVRZUEVfQ09MVU1OPVR5cGUKLU5BTUVfVEVYVF9GSUVMRD1OYW1lOgotVFlQRV9URVhUX0ZJRUxEPVR5cGU6Ci1CUk9XU0VfQlVUVE9OX0xBQkVMPUJyb3dzZS4uLgotQUREX0JVVFRPTl9MQUJFTD1BZGQuLi4KLUVESVRfQlVUVE9OX0xBQkVMPUVkaXQuLi4KLVJFTU9WRV9CVVRUT05fTEFCRUw9UmVtb3ZlCi1EVVBMSUNBVEVEX0VOVElUWV9OQU1FU19NRVNTQUdFPVRoZXJlIGFyZSBkdXBsaWNhdGUgbmFtZXMgb24gY3JlYXRlZCBlbnRpdHkgZmllbGRzLiBQbGVhc2UgcmVzb2x2ZSB0aGUgZHVwbGljYXRpb24uCi1BQ0NFU1NfVFlQRT1BY2Nlc3MgVHlwZQotRklFTERfQkFTRUQ9RmllbGQtYmFzZWQKLVBST1BFUlRZX0JBU0VEPVByb3BlcnR5LWJhc2VkCi1OT19KUEFfUFJPSkVDVFM9Tm8gSlBBIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UKLUFQUExZX0NIQU5HRVNfVE9fUEVSU0lTVEVOQ0VfWE1MPUFwcGx5IGNoYW5nZXMgdG8gcGVyc2lzdGVuY2UgWE1MCi1BRERfTUFQUEVEX1NVUEVSQ0xBU1NfVE9fWE1MPUFkZCBtYXBwZWQgc3VwZXJjbGFzcyB0byBYTUwKLUFERF9FTlRJVFlfVE9fWE1MPUFkZCBlbnRpdHkgdG8gWE1MCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX21hcHBpbmdzLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX21hcHBpbmdzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMTAxNTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9tYXBwaW5ncy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Cb29sZWFuX1RydWU9VHJ1ZQotQm9vbGVhbl9GYWxzZT1GYWxzZQotTm9uZVNlbGVjdGVkPURlZmF1bHQgKCkKLURlZmF1bHRXaXRob3V0VmFsdWU9RGVmYXVsdCAoKQotRGVmYXVsdFdpdGhWYWx1ZT1EZWZhdWx0ICh7MH0pCi1Ob05hbWVTZXQ9PE5vIG5hbWUgc2V0PgotCi1QZXJzaXN0ZW50VHlwZVBhZ2VfVW5tYXBwZWRMYWJlbD1Vbm1hcHBlZAotUGVyc2lzdGVudFR5cGVQYWdlX0VudGl0eUxhYmVsPUVudGl0eQotUGVyc2lzdGVudFR5cGVQYWdlX0VtYmVkZGFibGVMYWJlbD1FbWJlZGRhYmxlCi1QZXJzaXN0ZW50VHlwZVBhZ2VfTWFwcGVkU3VwZXJjbGFzc0xhYmVsPU1hcHBlZCBTdXBlcmNsYXNzCi0KLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0Jhc2ljTGFiZWw9QmFzaWMKLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0lkTGFiZWw9SWQKLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX09uZVRvTWFueUxhYmVsPU9uZSB0byBNYW55Ci1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9NYW55VG9PbmVMYWJlbD1NYW55IHRvIE9uZQotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfTWFueVRvTWFueUxhYmVsPU1hbnkgdG8gTWFueQotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVHJhbnNpZW50TGFiZWw9VHJhbnNpZW50Ci1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9WZXJzaW9uTGFiZWw9VmVyc2lvbgotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfRW1iZWRkZWRMYWJlbD1FbWJlZGRlZAotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfRW1iZWRkZWRJZExhYmVsPUVtYmVkZGVkIElkCi1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9PbmVUb09uZUxhYmVsPU9uZSB0byBPbmUKLQotRW50aXR5Q29tcG9zaXRlX2luaGVyaXRhbmNlPUluaGVyaXRhbmNlCi1FbnRpdHlDb21wb3NpdGVfcXVlcmllcz1RdWVyaWVzCi1FbnRpdHlDb21wb3NpdGVfdGFibGVEZWZhdWx0PURlZmF1bHQgKHswfSkKLUVudGl0eUNvbXBvc2l0ZV90YWJsZU5vRGVmYXVsdFNwZWNpZmllZD1EZWZhdWx0ICgpCi0KLUVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLUVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0RW1wdHk9RGVmYXVsdCAoKQotRW50aXR5R2VuZXJhbFNlY3Rpb25fbmFtZT1OYW1lOgotCi1FbnRpdHlOYW1lQ29tcG9zaXRlX25hbWU9TmFtZToKLQotQmFzaWNHZW5lcmFsU2VjdGlvbl9uYW1lPU5hbWU6Ci1CYXNpY0dlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0PURlZmF1bHQgKHswfSkKLUJhc2ljR2VuZXJhbFNlY3Rpb25fZmV0Y2hMYWJlbD1GZXRjaDoKLUJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbD1PcHRpb25hbAotQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsRGVmYXVsdD1PcHRpb25hbCAoezB9KQotQmFzaWNHZW5lcmFsU2VjdGlvbl9sb2JMYWJlbD1Mb2IKLUJhc2ljR2VuZXJhbFNlY3Rpb25fdGVtcG9yYWxMYWJlbD1UZW1wb3JhbDoKLUJhc2ljR2VuZXJhbFNlY3Rpb25fZW51bWVyYXRlZExhYmVsPUVudW1lcmF0ZWQ6Ci0KLURlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyX0RlZmF1bHQ9RGVmYXVsdCAoezB9KQotRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXJfRGVmYXVsdD1EZWZhdWx0ICh7MH0pCi0KLVRhYmxlQ2hvb3Nlcl9sYWJlbD1OYW1lOgotQ2F0YWxvZ0Nob29zZXJfbGFiZWw9Q2F0YWxvZzoKLVNjaGVtYUNob29zZXJfbGFiZWw9U2NoZW1hOgotVGFibGVDb21wb3NpdGVfdGFibGVTZWN0aW9uPVRhYmxlCi1UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk9RGVmYXVsdCAoKQotVGFibGVDb21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi0KLVRhcmdldEVudGl0eUNob29zZXJfbGFiZWw9VGFyZ2V0IEVudGl0eToKLVRhcmdldEVudGl0eUNob29zZXJfZGVmYXVsdEVtcHR5PURlZmF1bHQgKCkKLVRhcmdldEVudGl0eUNob29zZXJfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1UYXJnZXRFbnRpdHlDaG9vc2VyX2Jyb3dzZT1Ccm93c2UuLi4KLVRhcmdldEVudGl0eUNob29zZXJfc2VsZWN0VHlwZVRpdGxlPVNlbGVjdCBUeXBlCi0KLU5vbk93bmluZ01hcHBpbmdfbWFwcGVkQnlMYWJlbD1NYXBwZWQgQnk6Ci0KLUlkQ2xhc3NDb21wb3NpdGVfbGFiZWw9UHJpbWFyeSBLZXkgQ2xhc3M6Ci0KLUpvaW5UYWJsZUNvbXBvc2l0ZV9hZGQ9QWRkLi4uCi1Kb2luVGFibGVDb21wb3NpdGVfZGVmYXVsdEVtcHR5PURlZmF1bHQgKCkKLUpvaW5UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLUpvaW5UYWJsZUNvbXBvc2l0ZV9lZGl0PUVkaXQuLi4KLUpvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbj1JbnZlcnNlIEpvaW4gQ29sdW1ucwotCi1Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0PURlZmF1bHQgKHswfSAtPiB7MX0pCi1Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiB7MX0KLUpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQ9ezB9IC0+IERlZmF1bHQgKHsxfSkKLUpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0PURlZmF1bHQgKHswfSkgLT4gRGVmYXVsdCAoezF9KQotSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zPXswfSAtPiB7MX0KLUpvaW5UYWJsZUNvbXBvc2l0ZV9qb2luQ29sdW1uPUpvaW4gQ29sdW1ucwotSm9pblRhYmxlQ29tcG9zaXRlX25hbWU9TmFtZToKLUpvaW5UYWJsZUNvbXBvc2l0ZV9yZW1vdmU9UmVtb3ZlCi1Kb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnM9T3ZlcnJpZGUgRGVmYXVsdAotSm9pblRhYmxlQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1ucz1PdmVycmlkZSBEZWZhdWx0Ci0KLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9nZW5lcmFsPUdlbmVyYWwKLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9qb2luVGFibGU9Sm9pbiBUYWJsZQotTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX3RhcmdldEVudGl0eT1UYXJnZXQgRW50aXR5OgotTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2Nhc2NhZGVUeXBlPUNhc2NhZGUgVHlwZToKLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9mZXRjaFR5cGU9RmV0Y2ggVHlwZToKLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9tYXBwZWRCeT1NYXBwZWQgQnk6Ci0KLUNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uPUNvbHVtbiBEZWZpbml0aW9uOgotQ29sdW1uQ29tcG9zaXRlX2NvbHVtblNlY3Rpb249Q29sdW1uCi1Db2x1bW5Db21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1Db2x1bW5Db21wb3NpdGVfZGVmYXVsdEVtcHR5PURlZmF1bHQoKQotQ29sdW1uQ29tcG9zaXRlX2RldGFpbHM9RGV0YWlscwotQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGU9SW5zZXJ0YWJsZQotQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGVXaXRoRGVmYXVsdD1JbnNlcnRhYmxlICh7MH0pCi1Db2x1bW5Db21wb3NpdGVfbGVuZ3RoPUxlbmd0aDoKLUNvbHVtbkNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci1Db2x1bW5Db21wb3NpdGVfbnVsbGFibGU9TnVsbGFibGUKLUNvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZVdpdGhEZWZhdWx0PU51bGxhYmxlICh7MH0pCi1Db2x1bW5Db21wb3NpdGVfcHJlY2lzaW9uPVByZWNpc2lvbjoKLUNvbHVtbkNvbXBvc2l0ZV9zY2FsZT1TY2FsZToKLUNvbHVtbkNvbXBvc2l0ZV90YWJsZT1UYWJsZToKLUNvbHVtbkNvbXBvc2l0ZV91bmlxdWU9VW5pcXVlCi1Db2x1bW5Db21wb3NpdGVfdW5pcXVlV2l0aERlZmF1bHQ9VW5pcXVlICh7MH0pCi1Db2x1bW5Db21wb3NpdGVfdXBkYXRhYmxlPVVwZGF0YWJsZQotQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZVdpdGhEZWZhdWx0PVVwZGF0YWJsZSAoezB9KQotCi1Kb2luQ29sdW1uQ29tcG9zaXRlX2pvaW5Db2x1bW49Sm9pbiBDb2x1bW5zCi1Kb2luQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eT1EZWZhdWx0KCkKLUpvaW5Db2x1bW5Db21wb3NpdGVfbmFtZT1OYW1lOgotSm9pbkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLUpvaW5Db2x1bW5Db21wb3NpdGVfYWRkPUFkZC4uLgotSm9pbkNvbHVtbkNvbXBvc2l0ZV9lZGl0PUVkaXQuLi4KLUpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM9ezB9IC0+IHsxfQotSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQ9RGVmYXVsdCAoezB9IC0+IHsxfSkKLUpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdD1EZWZhdWx0ICh7MH0pIC0+IERlZmF1bHQgKHsxfSkKLUpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiB7MX0KLUpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0PXswfSAtPiBEZWZhdWx0ICh7MX0pCi1Kb2luQ29sdW1uQ29tcG9zaXRlX3JlbW92ZT1SZW1vdmUKLUpvaW5Db2x1bW5Db21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnM9T3ZlcnJpZGUgRGVmYXVsdAotCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zPU92ZXJyaWRlIERlZmF1bHQKLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9lZGl0PUVkaXQuLi4KLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9kZWZhdWx0RW1wdHk9RGVmYXVsdCgpCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW49UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM9ezB9IC0+IHsxfQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdD1EZWZhdWx0ICh7MH0gLT4gezF9KQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiBEZWZhdWx0ICh7MX0pCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiB7MX0KLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQ9ezB9IC0+IERlZmF1bHQgKHsxfSkKLQotSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uRGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgTmV3IEpvaW4gQ29sdW1uCi1Kb2luQ29sdW1uRGlhbG9nX2FkZEpvaW5Db2x1bW5UaXRsZT1BZGQgSm9pbiBDb2x1bW4KLUpvaW5Db2x1bW5EaWFsb2dfZGVzY3JpcHRpb249U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLgotSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtbkRlc2NyaXB0aW9uVGl0bGU9RWRpdCBKb2luIENvbHVtbgotSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtblRpdGxlPUVkaXQgSm9pbiBDb2x1bW4KLUpvaW5Db2x1bW5EaWFsb2dfbmFtZT0mTmFtZToKLUpvaW5Db2x1bW5EaWFsb2dfcmVmZXJlbmNlZENvbHVtbk5hbWU9JlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU6Ci0KLUpvaW5Db2x1bW5EaWFsb2dQYW5lX2NvbHVtbkRlZmluaXRpb249JkNvbHVtbiBEZWZpbml0aW9uOgotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfZGVmYXVsdEVtcHR5PURlZmF1bHQgKCkKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX2RlZmF1bHRXaXRoT25lUGFyYW09RGVmYXVsdCAoezB9KQotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZT0mSW5zZXJ0YWJsZQotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZVdpdGhEZWZhdWx0PSZJbnNlcnRhYmxlICh7MH0pCi1Kb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZT0mTnVsbGFibGUKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX251bGxhYmxlV2l0aERlZmF1bHQ9Jk51bGxhYmxlICh7MH0pCi1Kb2luQ29sdW1uRGlhbG9nUGFuZV90YWJsZT0mVGFibGU6Ci1Kb2luQ29sdW1uRGlhbG9nUGFuZV91bmlxdWU9JlVuaXF1ZQotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdW5pcXVlV2l0aERlZmF1bHQ9JlVuaXF1ZSAoezB9KQotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdXBkYXRhYmxlPSZVcGRhdGFibGUKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZVdpdGhEZWZhdWx0PSZVcGRhdGFibGUgKHswfSkKLQotSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2dfZWRpdEludmVyc2VKb2luQ29sdW1uVGl0bGU9RWRpdCBJbnZlcnNlIEpvaW4gQ29sdW1uCi0KLVByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGREZXNjcmlwdGlvblRpdGxlPUNyZWF0ZSBOZXcgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KLVByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRUaXRsZT1BZGQgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KLVByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZT1FZGl0IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFRpdGxlPUVkaXQgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KLQotUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkRGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgTmV3IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19hZGRUaXRsZT1BZGQgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KLVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2VkaXREZXNjcmlwdGlvblRpdGxlPUVkaXQgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KLVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2VkaXRUaXRsZT1FZGl0IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi0KLUF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXM9QXR0cmlidXRlIE92ZXJyaWRlcwotQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdD1PdmVycmlkZSBEZWZhdWx0Ci0KLU92ZXJyaWRlc0NvbXBvc2l0ZV9hc3NvY2lhdGlvbj1Bc3NvY2lhdGlvbiBPdmVycmlkZQotT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZT1BdHRyaWJ1dGUgT3ZlcnJpZGUKLU92ZXJyaWRlc0NvbXBvc2l0ZV9ub05hbWU9PE5hbWUgbm90IHNldD4KLU92ZXJyaWRlc0NvbXBvc2l0ZV9qb2luQ29sdW1uPUpvaW4gQ29sdW1ucwotCi1BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX2NoYXI9Q2hhcmFjdGVyCi1Jbmhlcml0YW5jZUNvbXBvc2l0ZV9kZXRhaWxzR3JvdXBCb3g9RGV0YWlscwotSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvckNvbHVtbkdyb3VwQm94PURpc2NyaW1pbmF0b3IgQ29sdW1uCi1Jbmhlcml0YW5jZUNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yVmFsdWU9RGlzY3JpbWluYXRvciBWYWx1ZToKLUFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfaW50ZWdlcj1JbnRlZ2VyCi1BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX2pvaW5lZD1Kb2luZWQKLUFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfc2luZ2xlX3RhYmxlPVNpbmdsZSBUYWJsZQotSW5oZXJpdGFuY2VDb21wb3NpdGVfc3RyYXRlZ3k9U3RyYXRlZ3k6Ci1BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3N0cmluZz1TdHJpbmcKLUFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfdGFibGVfcGVyX2NsYXNzPVRhYmxlIFBlciBDbGFzcwotCi1EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eT1EZWZhdWx0KDxwcm92aWRlci1zcGVjaWZpYz4pCi1EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlPVR5cGU6Ci1EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX25hbWU9TmFtZToKLQotSWRNYXBwaW5nQ29tcG9zaXRlX3BrX2dlbmVyYXRpb249UEsgR2VuZXJhdGlvbgotSWRNYXBwaW5nQ29tcG9zaXRlX3ByaW1hcnlLZXlHZW5lcmF0aW9uPVByaW1hcnkgS2V5IEdlbmVyYXRpb24KLUlkTWFwcGluZ0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvcj1UYWJsZSBHZW5lcmF0b3IKLUlkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvcj1TZXF1ZW5jZSBHZW5lcmF0b3IKLQotR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfZ2VuZXJhdGVkVmFsdWU9R2VuZXJhdGVkIFZhbHVlCi1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0b3JOYW1lPUdlbmVyYXRvciBOYW1lOgotR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfc3RyYXRlZ3k9U3RyYXRlZ3k6Ci1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9hdXRvPUF1dG8KLUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2lkZW50aXR5PUlkZW50aXR5Ci1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zZXF1ZW5jZT1TZXF1ZW5jZQotR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfdGFibGU9VGFibGUKLQotU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3I9U2VxdWVuY2UgR2VuZXJhdG9yCi1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZT1TZXF1ZW5jZToKLVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ9RGVmYXVsdAotCi1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9jYXRhbG9nPUNhdGFsb2c6Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU9TmFtZToKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uPVByaW1hcnkgS2V5IENvbHVtbjoKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uVmFsdWU9UHJpbWFyeSBLZXkgQ29sdW1uIFZhbHVlOgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfc2NoZW1hPVNjaGVtYToKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlPVRhYmxlOgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGVHZW5lcmF0b3I9VGFibGUgR2VuZXJhdG9yCi1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV92YWx1ZUNvbHVtbj1WYWx1ZSBDb2x1bW46Ci0KLUdlbmVyYXRvckNvbXBvc2l0ZV9hbGxvY2F0aW9uU2l6ZT1BbGxvY2F0aW9uIFNpemU6Ci1HZW5lcmF0b3JDb21wb3NpdGVfaW5pdGlhbFZhbHVlPUluaXRpYWwgVmFsdWU6Ci0KLU9yZGVyQnlDb21wb3NpdGVfb3JkZXJCeUdyb3VwPU9yZGVyIEJ5Ci1PcmRlckJ5Q29tcG9zaXRlX29yZGVyQnlMYWJlbD1PcmRlciBCeToKLU9yZGVyQnlDb21wb3NpdGVfbm9PcmRlcmluZz1ObyBPcmRlcmluZwotT3JkZXJCeUNvbXBvc2l0ZV9wcmltYXJ5S2V5T3JkZXJpbmc9UHJpbWFyeSBLZXkgT3JkZXJpbmcKLU9yZGVyQnlDb21wb3NpdGVfY3VzdG9tT3JkZXJpbmc9Q3VzdG9tIE9yZGVyaW5nCi0KLVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9zZWNvbmRhcnlUYWJsZXM9U2Vjb25kYXJ5IFRhYmxlcwotU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2VkaXQ9RWRpdC4uLgotCi1TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRTZWNvbmRhcnlUYWJsZT1BZGQgU2Vjb25kYXJ5IFRhYmxlCi1TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0U2Vjb25kYXJ5VGFibGU9RWRpdCBTZWNvbmRhcnkgVGFibGUKLVNlY29uZGFyeVRhYmxlRGlhbG9nX25hbWU9TmFtZToKLVNlY29uZGFyeVRhYmxlRGlhbG9nX2NhdGFsb2c9Q2F0YWxvZzoKLVNlY29uZGFyeVRhYmxlRGlhbG9nX3NjaGVtYT1TY2hlbWE6Ci1TZWNvbmRhcnlUYWJsZURpYWxvZ19kZWZhdWx0U2NoZW1hPURlZmF1bHQgKHswfSkKLVNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRDYXRhbG9nPURlZmF1bHQgKHswfSkKLQotQWNjZXNzVHlwZUNvbWJvX2RlZmF1bHQ9RGVmYXVsdAotTWV0YURhdGFDb21wbGV0ZUNvbWJvX0RlZmF1bHQ9RGVmYXVsdCAoezB9KQotCi1PcHRpb25hbENvbXBvc2l0ZV9mYWxzZT1GYWxzZQotT3B0aW9uYWxDb21wb3NpdGVfdHJ1ZT1UcnVlCi0KLUVudW1UeXBlQ29tcG9zaXRlX29yZGluYWw9T3JkaW5hbAotRW51bVR5cGVDb21wb3NpdGVfc3RyaW5nPVN0cmluZwotCi1GZXRjaFR5cGVDb21wb3NpdGVfZWFnZXI9RWFnZXIKLUZldGNoVHlwZUNvbXBvc2l0ZV9sYXp5PUxhenkKLQotVGVtcG9yYWxUeXBlQ29tcG9zaXRlX2RhdGU9RGF0ZQotVGVtcG9yYWxUeXBlQ29tcG9zaXRlX3RpbWU9VGltZQotVGVtcG9yYWxUeXBlQ29tcG9zaXRlX3RpbWVzdGFtcD1UaW1lc3RhbXAKLQotQ2FzY2FkZUNvbXBvc2l0ZV9hbGw9QWxsCi1DYXNjYWRlQ29tcG9zaXRlX2Nhc2NhZGVUaXRsZT1DYXNjYWRlCi1DYXNjYWRlQ29tcG9zaXRlX21lcmdlPU1lcmdlCi1DYXNjYWRlQ29tcG9zaXRlX3BlcnNpc3Q9UGVyc2lzdAotQ2FzY2FkZUNvbXBvc2l0ZV9yZWZyZXNoPVJlZnJlc2gKLUNhc2NhZGVDb21wb3NpdGVfcmVtb3ZlPVJlbW92ZQotCi1RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkUXVlcnk9QWRkLi4uCi1RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkUXVlcnlEZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgcXVlcnksIHdoaWNoIHNlYXJjaGVzIGFnYWluc3QgcGVyc2lzdGVudCBlbnRpdGllcyBpbmRlcGVuZGVudCBvZiB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gc3RvcmUgdGhvc2UgZW50aXRpZXMuCi1RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkUXVlcnlEZXNjcmlwdGlvblRpdGxlPUNyZWF0ZSBuZXcgbmFtZWQgcXVlcnkKLVF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWRRdWVyeVRpdGxlPU5ldyBOYW1lZCBRdWVyeQotUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZE5hdGl2ZVF1ZXJ5PUFkZCBOYXRpdmUuLi4KLVF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWROYXRpdmVRdWVyeURlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBuYXRpdmUgcXVlcnksIHRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHV0aWxpemUgZGF0YWJhc2Ugc3BlY2lmaWMgZmVhdHVyZXMuCi1RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkTmF0aXZlUXVlcnlEZXNjcmlwdGlvblRpdGxlPUNyZWF0ZSBuZXcgbmFtZWQgbmF0aXZlIHF1ZXJ5Ci1RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkTmF0aXZlUXVlcnlUaXRsZT1OZXcgTmFtZWQgTmF0aXZlIFF1ZXJ5Ci1RdWVyaWVzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmc9PE5hbWUgbm90IHNldD4gezB9Ci1RdWVyaWVzQ29tcG9zaXRlX2VkaXQ9RWRpdC4uLgotUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWROYXRpdmVRdWVyeVRpdGxlPUVkaXQgTmFtZWQgTmF0aXZlIFF1ZXJ5Ci1RdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZE5hdGl2ZVF1ZXJ5RGVzY3JpcHRpb249RWRpdCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbmF0aXZlIHF1ZXJ5LgotUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWROYXRpdmVRdWVyeURlc2NyaXB0aW9uVGl0bGU9RWRpdCBuYW1lZCBuYXRpdmUgcXVlcnkKLVF1ZXJpZXNDb21wb3NpdGVfZWRpdE5hbWVkUXVlcnlUaXRsZT1FZGl0IE5hbWVkIFF1ZXJ5Ci1RdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZFF1ZXJ5RGVzY3JpcHRpb249RWRpdCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgcXVlcnkuCi1RdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZFF1ZXJ5RGVzY3JpcHRpb25UaXRsZT1FZGl0IG5hbWVkIHF1ZXJ5Ci1RdWVyaWVzQ29tcG9zaXRlX2xhYmVsPSZOYW1lOgotCi1OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnk9UXVlcnk6Ci1OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnlIaW50c0dyb3VwQm94PVF1ZXJ5IEhpbnRzCi1OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcmVzdWx0Q2xhc3M9UmVzdWx0IENsYXNzOgotCi1OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnk9UXVlcnk6Ci1OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnlIaW50c0dyb3VwQm94PVF1ZXJ5IEhpbnRzCi0KLU5ld05hbWVTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkPUEgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KLU5ld05hbWVTdGF0ZU9iamVjdF9uYW1lQWxyZWFkeUV4aXN0cz1BIHF1ZXJ5IHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLgotCi1RdWVyeUhpbnRzQ29tcG9zaXRlX25hbWVDb2x1bW49TmFtZQotUXVlcnlIaW50c0NvbXBvc2l0ZV92YWx1ZUNvbHVtbj1WYWx1ZQotCi1Pcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfZGVmaW5lSW5YbWw9RGVmaW5lIGluIFhNTAotCi1OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9VW5tYXBwZWQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfb3JtLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX29ybS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmM1M2U5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfb3JtLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQWNjZXNzVHlwZUNvbXBvc2l0ZV9hY2Nlc3M9QWNjZXNzOgotQWNjZXNzVHlwZUNvbXBvc2l0ZV9maWVsZD1GaWVsZAotQWNjZXNzVHlwZUNvbXBvc2l0ZV9wcm9wZXJ0eT1Qcm9wZXJ0eQotQm9vbGVhbl9GYWxzZT1GYWxzZQotQm9vbGVhbl9UcnVlPVRydWUKLUVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfYWNjZXNzPUFjY2VzczoKLUVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfY2F0YWxvZz1DYXRhbG9nOgotRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9maWVsZD1GaWVsZAotRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wYWNrYWdlPVBhY2thZ2UKLUVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfcHJvcGVydHk9UHJvcGVydHkKLUVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2Vfc2NoZW1hPVNjaGVtYToKLUVudGl0eU1hcHBpbmdzUGFnZV9jYXRhbG9nRGVmYXVsdD1EZWZhdWx0ICh7MH0KLUVudGl0eU1hcHBpbmdzUGFnZV9jYXRhbG9nTm9EZWZhdWx0U3BlY2lmaWVkPURlZmF1bHQKLUVudGl0eU1hcHBpbmdzUGFnZV9zY2hlbWFEZWZhdWx0PURlZmF1bHQgKHswfSkKLUVudGl0eU1hcHBpbmdzUGFnZV9zY2hlbWFOb0RlZmF1bHRTcGVjaWZpZWQ9RGVmYXVsdAotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRUYWJsZUdlbmVyYXRvcj1BZGQgVGFibGUuLi4KLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkVGFibGVHZW5lcmF0b3JEZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgdGFibGUgZ2VuZXJhdG9yLCBhIHRhYmxlIGdlbmVyYXRvciBkZWZpbmVzIGEgcHJpbWFyeSBrZXkgZ2VuZXJhdG9yIHRoYXQgbWF5IGJlIHJlZmVyZW5jZWQgYnkgbmFtZSB3aGVuIGEgZ2VuZXJhdG9yIGVsZW1lbnQgaXMgc3BlY2lmaWVkLgotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRUYWJsZUdlbmVyYXRvckRlc2NyaXB0aW9uVGl0bGU9Q3JlYXRlIG5ldyB0YWJsZSBnZW5lcmF0b3IKLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkVGFibGVHZW5lcmF0b3JUaXRsZT1OZXcgVGFibGUgR2VuZXJhdG9yCi1Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2FkZFNlcXVlbmNlR2VuZXJhdG9yPUFkZCBTZXF1ZW5jZS4uLgotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvckRlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBzZXF1ZW5jZSBnZW5lcmF0b3IsIGEgc2VxdWVuY2UgZ2VuZXJhdG9yIGRlZmluZXMgYSBwcmltYXJ5IGtleSBnZW5lcmF0b3IgdGhhdCBtYXkgYmUgcmVmZXJlbmNlZCBieSBuYW1lIHdoZW4gYSBnZW5lcmF0b3IgZWxlbWVudCBpcyBzcGVjaWZpZWQuCi1Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2FkZFNlcXVlbmNlR2VuZXJhdG9yRGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgbmV3IHNlcXVlbmNlIGdlbmVyYXRvcgotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvclRpdGxlPU5ldyBTZXF1ZW5jZSBHZW5lcmF0b3IKLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZGlzcGxheVN0cmluZz08TmFtZSBub3Qgc2V0PiB7MH0KLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZWRpdD1FZGl0Li4uCi1Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRTZXF1ZW5jZUdlbmVyYXRvclRpdGxlPUVkaXQgU2VxdWVuY2UgR2VuZXJhdG9yCi1Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRTZXF1ZW5jZUdlbmVyYXRvckRlc2NyaXB0aW9uPUVkaXQgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGdlbmVyYXRvci4KLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZWRpdFNlcXVlbmNlR2VuZXJhdG9yRGVzY3JpcHRpb25UaXRsZT1FZGl0IHNlcXVlbmNlIGdlbmVyYXRvcgotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0VGFibGVHZW5lcmF0b3JUaXRsZT1FZGl0IFRhYmxlIEdlbmVyYXRvcgotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0VGFibGVHZW5lcmF0b3JEZXNjcmlwdGlvbj1FZGl0IHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBnZW5lcmF0b3IuCi1Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRUYWJsZUdlbmVyYXRvckRlc2NyaXB0aW9uVGl0bGU9RWRpdCBuYW1lZCB0YWJsZSBnZW5lcmF0b3IKLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZ3JvdXBCb3g9R2VuZXJhdG9ycwotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9sYWJlbD0mTmFtZToKLU9ybUphdmFBdHRyaWJ1dGVDaG9vc2VyX2phdmFBdHRyaWJ1dGU9SmF2YSBBdHRyaWJ1dGU6Ci1Pcm1KYXZhQ2xhc3NDaG9vc2VyX2phdmFDbGFzcz1KYXZhIENsYXNzOgotT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZV9tZXRhZGF0YUNvbXBsZXRlPU1ldGFkYXRhIENvbXBsZXRlCi1Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlX21ldGFkYXRhQ29tcGxldGVXaXRoRGVmYXVsdD1NZXRhZGF0YSBDb21wbGV0ZSAoezB9KQotT3JtUXVlcmllc0NvbXBvc2l0ZV9ncm91cEJveD1RdWVyaWVzCi1Pcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZT1TZXF1ZW5jZToKLU9ybVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU9TmFtZToKLU9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU9TmFtZToKLU9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlPVRhYmxlOgotT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGVHZW5lcmF0b3I9VGFibGUgR2VuZXJhdG9yCi1Pcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbj1QcmltYXJ5IEtleSBDb2x1bW46Ci1Pcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV92YWx1ZUNvbHVtbj1WYWx1ZSBDb2x1bW46Ci1Pcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlPVByaW1hcnkgS2V5IENvbHVtbiBWYWx1ZToKLU9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ9RGVmYXVsdAotUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfYWNjZXNzPUFjY2VzczoKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2Nhc2NhZGVQZXJzaXN0Q2hlY2tCb3g9Q2FzY2FkZSBQZXJzaXN0Ci1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9jYXRhbG9nPUNhdGFsb2c6Ci1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9maWVsZD1GaWVsZAotUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfcGVyc2lzdGVuY2VVbml0U2VjdGlvbj1QZXJzaXN0ZW5jZSBVbml0Ci1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9wcm9wZXJ0eT1Qcm9wZXJ0eQotUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfc2NoZW1hPVNjaGVtYToKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3g9WE1MIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGUKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbl9jYXRhbG9nRGVmYXVsdD1EZWZhdWx0ICh7MH0pCi1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fc2NoZW1hRGVmYXVsdD1EZWZhdWx0ICh7MH0pCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3BlcnNpc3RlbmNlLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3BlcnNpc3RlbmNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOGI0MTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9wZXJzaXN0ZW5jZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUJvb2xlYW5fRmFsc2U9RmFsc2UKLUJvb2xlYW5fVHJ1ZT1UcnVlCi0KLVBlcnNpc3RlbmNlRWRpdG9yX3BhZ2VfaGVscD1IZWxwCi1QZXJzaXN0ZW5jZUVkaXRvcl9zb3VyY2VUYWI9U291cmNlCi0KLVBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZGVzY3JpcHRpb249U3BlY2lmeSB0aGUgbGlzdCBvZiBjbGFzc2VzIHRvIGJlIG1hbmFnZWQgaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0LgotUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzPUV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlcwotUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzV2l0aERlZmF1bHQ9RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzICh7MH0pCi1QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX21hcHBlZENsYXNzZXNOb05hbWU9PG5hbWUgbm90IHNldD4KLVBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfb3Blbj1PcGVuCi0KLVBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX2RlZmF1bHQ9RGVmYXVsdChKVEEpCi1QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZV9qdGE9SlRBCi1QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZV9yZXNvdXJjZV9sb2NhbD1SZXNvdXJjZSBMb2NhbAotCi1QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlX2Nvbm5lY3Rpb249Q29ubmVjdGlvbgotUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZV9kYXRhYmFzZT1EYXRhYmFzZQotUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZV9nZW5lcmFsPUdlbmVyYWwKLQotUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlX2p0YURhdGFzb3VyY2VOYW1lPUpUQSBEYXRhIFNvdXJjZSBOYW1lOgotUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlX25vbkp0YURhdGFzb3VyY2VOYW1lPU5vbi1KVEEgRGF0YSBTb3VyY2UgTmFtZToKLQotUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGVfdHJhbnNhY3Rpb25UeXBlPVRyYW5zYWN0aW9uIFR5cGU6Ci0KLVBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfZ2VuZXJhbD1HZW5lcmFsCi1QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2phdmFBcmNoaXZlcz1KYXZhIEFyY2hpdmVzCi1QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9ycz1YTUwgTWFwcGluZyBGaWxlcwotUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qcGFNYXBwaW5nRGVzY3JpcHRvcnNfZGVzY3JpcHRpb249U3BlY2lmeSB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KLVBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfbWFwcGVkQ2xhc3Nlcz1NYW5hZ2VkIENsYXNzZXMKLVBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfbmFtZT1OYW1lOgotUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9wZXJzaXN0ZW5jZVByb3ZpZGVyPVBlcnNpc3RlbmNlIFByb3ZpZGVyOgotUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9kZXNjcmlwdGlvbj1EZXNjcmlwdGlvbjoKLQotUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX21hcHBpbmdGaWxlRGlhbG9nX21lc3NhZ2U9Q2hvb3NlIHRoZSBYTUwgbWFwcGluZyBmaWxlcyB0byBiZSBhZGRlZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLVBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9tYXBwaW5nRmlsZURpYWxvZ190aXRsZT1KUEEgWE1MIE1hcHBpbmcgRmlsZSBTZWxlY3Rpb24KLVBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9vcm1Ob05hbWU9PG5hbWUgbm90IHNldD4KLQotUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV9uYW1lQ29sdW1uPU5hbWUKLVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGVfcHJvcGVydGllcz1Qcm9wZXJ0aWVzCi1QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX3Byb3BlcnRpZXNfZGVzY3JpcHRpb249VGhpcyB0YWJsZSBsaXN0cyBhbGwgcHJvcGVydGllcyB0aGF0IGFyZSBkZWZpbmVkIGZvciB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi1QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX3ZhbHVlQ29sdW1uPVZhbHVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NjaGVtYS9qcGFQbGF0Zm9ybS5leHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NjaGVtYS9qcGFQbGF0Zm9ybS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWI2ZTQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zY2hlbWEvanBhUGxhdGZvcm0uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LnVpIiBpZD0ianBhUGxhdGZvcm0iIG5hbWU9IkpQQSBQbGF0Zm9ybSBVSSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJqcGFQbGF0Zm9ybSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJqcGFQbGF0Zm9ybSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRXh0ZW5kIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFuZCB5b3UgbXVzdCBhbHNvIGV4dGVuZCB0aGUgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhUGxhdGZvcm0gCi0gICAgICAgICAgICBleHRlbnNpb24gcG9pbnQuICBUaGUgaWRzIG11c3QgbWF0Y2guICBPbmUganBhUGxhdGZvcm0gd2lsbCBiZSBjaG9zZW4gcGVyIEpwYVByb2plY3QuICBUaGUgCi0gICAgICAgICAgICBwb3NzaWJsZSBqcGFQbGF0Zm9ybXMgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYXMgYSBwcm9qZWN0IHByb3BlcnR5LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgbXVzdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFQbGF0Zm9ybSBleHRlbnNpb24gaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaSZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVBsYXRmb3JtVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVBsYXRmb3JtVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5OWVhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcGFQbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLlR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBKUEEgdmVuZG9yIHRvIHByb3ZpZGUgZXh0ZW5zaW9ucyB0bwotICogSlBBIFVJIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGlzIGludGVuZGVkIHRvIHdvcmsgaW4gY29uanVuY3Rpb24gd2l0aCBhIGNvcmUKLSAqIEpQQSBwbGF0Zm9ybSAoe0BsaW5rIEpwYVBsYXRmb3JtfSkgaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgc2FtZSBJRC4KLSAqIDxwPgotICogQW55IGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSA8aT5zdGF0ZWxlc3M8L2k+IGluIG5hdHVyZS4KLSAqIDxwPgotICogVGhlICJnZW5lcmljIiBleHRlbnNpb24gc3VwcGxpZXMgVUkgZm9yIHRoZSBjb3JlIHBsYXRmb3JtIGV4dGVuc2lvbiB3aXRoIHRoZSBzYW1lCi0gKiBJRC4KLSAqCi0gKiBAc2VlIHRoZSBvcmcuZWNsaXBzZS5qcHQudWkuanBhUGxhdGZvcm0gZXh0ZW5zaW9uIHBvaW50Ci0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhUGxhdGZvcm1VaQotewotCS8qKgotCSAqIFJldHVybiBhICpuZXcqIHtAbGluayBKcGFOYXZpZ2F0b3JQcm92aWRlcn0sIHdoaWNoIGRldGVybWluZXMKLQkgKiBQcm9qZWN0IEV4cGxvcmVyIGNvbnRlbnQgYW5kIGxvb2sKLQkgKi8KLQlKcGFOYXZpZ2F0b3JQcm92aWRlciBidWlsZE5hdmlnYXRvclByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSAqbmV3KiBzdHJ1Y3R1cmUgcHJvdmlkZXIgZm9yIHRoZSBnaXZlbiBKUEEgZmlsZQotCSAqLwotCS8vIFRPRE8gLSBiaW5hcnkgamF2YSB0eXBlIHN1cHBvcnQKLQlKcGFTdHJ1Y3R1cmVQcm92aWRlciBidWlsZFN0cnVjdHVyZVByb3ZpZGVyKEpwYUZpbGUganBhRmlsZSk7Ci0KLQlJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0KLQlJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmF1bHRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQotCUpwYURldGFpbHNQcm92aWRlciBkZXRhaWxzUHJvdmlkZXIoSnBhU3RydWN0dXJlTm9kZSBjb250ZXh0Tm9kZSk7Ci0KLQl2b2lkIGdlbmVyYXRlRERMKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKTsKLQotCXZvaWQgZ2VuZXJhdGVFbnRpdGllcyhKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7Ci0KLQlKcGFVaUZhY3RvcnkgZ2V0SnBhVWlGYWN0b3J5KCk7Ci0KLQlJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQotCUl0ZXJhdG9yPFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBqYXZhVHlwZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCi0JSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBvcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQotCUl0ZXJhdG9yPFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBvcm1UeXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvSnBhVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcGFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY0YWU3OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcGFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFVzZSB7QGxpbmsgSnBhRmFjdG9yeX0gdG8gY3JlYXRlIGFueSB7QGxpbmsgSmF2YVR5cGVNYXBwaW5nfSBvcgotICoge0BsaW5rIEphdmFBdHRyaWJ1dGVNYXBwaW5nfXMuIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgcGxhdGZvcm1zIGNhbgotICogZXh0ZW5kIHRoZSBqYXZhIG1vZGVsIHdpdGggdGhlaXIgb3duIGFubm90YXRpb25zLgotICoge0BsaW5rIEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyfSBhbmQge0BsaW5rIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJ9IHVzZQotICogdGhpcyBmYWN0b3J5LiBTZWUge0BsaW5rIEpwYVBsYXRmb3JtI2phdmFUeXBlTWFwcGluZ1Byb3ZpZGVycygpfSBhbmQKLSAqIHtAbGluayBKcGFQbGF0Zm9ybSNqYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycygpIGZvciBjcmVhdGluZyBuZXcgbWFwcGluZ3MKLSAqIHR5cGVzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuCi0gKiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZwotICogYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QKLSAqIGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5CYXNlSnBhVWlGYWN0b3J5Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhVWlGYWN0b3J5Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkJhc2ljTWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBiYXNpYyBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUJhc2ljTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+RW1iZWRkYWJsZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBiYXNpYyBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUVtYmVkZGFibGVDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5FbWJlZGRlZElkTWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBlbWJlZGRlZCBJRCBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPkVtYmVkZGVkTWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBlbWJlZGRlZCBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVtYmVkZGVkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+SmF2YUVudGl0eTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBqYXZhIGVudGl0eQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW50aXR5Q29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5Pcm1FbnRpdHk8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgb3JtIGVudGl0eQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbnRpdHlDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPklkTWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBJRCBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUlkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5NYW55VG9NYW55TWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBtYW55IHRvIG1hbnkgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPk1hbnlUb09uZU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFueSB0byBvbmUgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5NYXBwZWRTdXBlcmNsYXNzPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1hcHBlZCBzdXBlcmNsYXNzCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPk9uZVRvTWFueU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgb25lIHRvIG1hbnkgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5PbmVUb09uZU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgb25lIHRvIG9uZSBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxpc3Qgb2YgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPnMgdXNlZCB0byBlZGl0IGEKLQkgKiA8Y29kZT5QZXJzaXN0ZW5jZVVuaXQ8L2NvZGU+LiBUaGUgcHJvcGVydGllcyBjYW4gYmUgcmVncm91cGVkIGludG8KLQkgKiBzZWN0aW9ucyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGVkaXRvciBhcyBwYWdlcy4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHBlcnRpc3RlbmNlIHVuaXQKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8SnBhUGFnZUNvbXBvc2l0ZT4gY3JlYXRlUGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlcygKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5UcmFuc2llbnRNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRyYW5zaWVudCBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZVRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxUcmFuc2llbnRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPlZlcnNpb25NYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHZlcnNpb24gbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwdFVpUGx1Z2luLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcHRVaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTcyNjViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwdFVpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtVWlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICoKLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0VWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0JcHJpdmF0ZSBzdGF0aWMgSnB0VWlQbHVnaW4gSU5TVEFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgcGx1Zy1pbiBpZGVudGlmaWVyIG9mIEpQQSBVSSBzdXBwb3J0Ci0JICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQudWkiPC9jb2RlPikuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC51aSI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHRVaVBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKioqKioqKiBJbWFnZSBBUEkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBnZXRzIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJaWYgKCEga2V5LnN0YXJ0c1dpdGgoImljb25zLyIpKSB7Ci0JCQlrZXkgPSAiaWNvbnMvIiArIGtleTsKLQkJfQotCQlpZiAoISBrZXkuZW5kc1dpdGgoIi5naWYiKSkgewotCQkJa2V5ID0ga2V5ICsgIi5naWYiOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwga2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgYW4gaW1hZ2UgZm9yIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRJbWFnZURlc2NyaXB0b3Ioa2V5KTsKLQkJcmV0dXJuIChkZXNjID09IG51bGwpID8gbnVsbCA6IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogQ29uc3RydWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBKcHRVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcGxhdGZvcm0gVUkgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gSlBBIHBsYXRmb3JtCi0JICovCi0JcHVibGljIEpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaShKcGFQbGF0Zm9ybSBqcGFQbGF0Zm9ybSkgewotCQlyZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuanBhUGxhdGZvcm0oanBhUGxhdGZvcm0uZ2V0SWQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvV2lkZ2V0RmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTk1N2RhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL1dpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotLyoqCi0gKiBBIHdpZGdldCBmYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhbiBTV1Qgd2lkZ2V0IGJhc2VkIG9uIHRoZSByaWdodAotICogc3R5bGUuIFNvbWUgc3R5bGUgc2hvd3MgdGhlIHdpZGdldHMgZGlmZmVyZW50bHksIGZvciBpbnN0YW5jZSwgdGhlIGZsYXQgc3R5bGUKLSAqIHNob3dzIHRoZSB3aWRnZXRzIHdpdGggbGVzcyBib3JkZXJzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuCi0gKiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZwotICogYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QKLSAqIGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBXaWRnZXRGYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcmVndWxhciBidXR0b24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKi8KLQlCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbm9uLWVkaXRhYmxlIGN1c3RvbSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICovCi0JQ0NvbWJvIGNyZWF0ZUNDb21ibyhDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCUJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ibzwvY29kZT4KLQkgKi8KLQlDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIGN1c3RvbSA8Y29kZT5DQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqLwotCUNDb21ibyBjcmVhdGVFZGl0YWJsZUNDb21ibyhDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICovCi0JQ29tYm8gY3JlYXRlRWRpdGFibGVDb21ibyhDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdGl0bGVkIHBhbmUgKGdyb3VwIGJveCkuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRpdGxlIFRoZSBncm91cCBwYW5lJ3MgdGl0bGUKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkdyb3VwPC9jb2RlPgotCSAqLwotCUdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0aXRsZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxhYmVsIHRoYXQgaXMgc2hvd24gYXMgYSBoeXBlcmxpbmsuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SHlwZXJsaW5rPC9jb2RlPgotCSAqLwotCUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkxhYmVsPC9jb2RlPgotCSAqLwotCUxhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBsYWJlbFRleHQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsaXN0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgaXMgdXN1YWxseSB0byB0ZWxsIHdoYXQgdHlwZSBvZiBzZWxlY3Rpb24KLQkgKiAoPGNvZGU+U1dULk1VTFRJPC9jb2RlPiBvciA8Y29kZT5TV1QuU0lOR0xFPC9jb2RlPikKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkxhYmVsPC9jb2RlPgotCSAqLwotCUxpc3QgY3JlYXRlTGlzdChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3R5bGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYWJlbCB0aGF0IGNhbiBiZSB3cmFwcGVkIG9uIG11bHRpcGxlIGxpbmVzLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Rm9ybVRleHQ8L2NvZGU+Ci0JICovCi0JRm9ybVRleHQgY3JlYXRlTXVsdGlMaW5lTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGxhYmVsVGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIHRleHQgYXJlYS4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4KLQkgKi8KLQlUZXh0IGNyZWF0ZU11bHRpTGluZVRleHQoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIHRleHQgZmllbGQgdGhhdCBoYW5kbGVzIHBhc3N3b3JkLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4KLQkgKi8KLQlUZXh0IGNyZWF0ZVBhc3N3b3JkVGV4dChDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcHVzaCBidXR0b24gKHRvZ2dsZSBiZXR3ZWVuIHNlbGVjdGVkIGFuZCB1bnNlbGVjdGVkKS4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCUJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcmFkaW8gYnV0dG9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHJldHVybiBBIG5ldyA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICovCi0JQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2VjdGlvbiwgd2hpY2ggaXMgYSBjb2xsYXBzYWJsZSBwYW5lIHdpdGggYSB0aXRsZSBiYXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSBvZiB0aGUgdGl0bGUgYmFyLCB3aGljaCBjYW4gYmUKLQkgKiA8Y29kZT5FeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUU8L2NvZGU+IGFuZAotCSAqIDxjb2RlPkV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSPC9jb2RlPgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4KLQkgKi8KLQlTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3Bpbm5lci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlNwaW5uZXI8L2NvZGU+Ci0JICovCi0JU3Bpbm5lciBjcmVhdGVTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSB0YWJsZQotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGFibGU8L2NvZGU+Ci0JICovCi0JVGFibGUgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgdGV4dCBmaWVsZC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+Ci0JICovCi0JVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0cmktc3RhdGUgY2hlY2sgYm94LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHJldHVybiBBIG5ldyA8Y29kZT5CdXR0b248L2NvZGU+IHRoYXQgaGFzIDMgc2VsZWN0aW9uIHN0YXRlcwotCSAqLwotCUJ1dHRvbiBjcmVhdGVUcmlTdGF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0F0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0F0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwODFlODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPFQgZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBleHRlbmRzIE1hcHBpbmdVaVByb3ZpZGVyPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHRoYXQgY29ycmVwb25kcyB0byB0aGlzIG1hcHBpbmcgdHlwZS4KLQkgKiBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGJ5IHRoZSA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8L2NvZGU+Ci0JICogd2hlbiB0aGUgbWFwcGluZyBrZXkgbWF0Y2hlcyB0aGUga2V5IGdpdmVuIGJ5IHRoaXMgcHJvdmlkZXIuIFRoZQotCSAqIGNvbXBvc2l0ZXMgd2lsbCBiZSBzdG9yZWQgaW4gYSBNYXAgd2l0aCB0aGUgbWFwcGluZyBrZXkgYXMgdGhlIGtleS4KLQkgKgotCSAqIEBwYXJhbSBmYWN0b3J5IFRoZSBVSSBmYWN0b3J5IHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSB0aGUgcmlnaHQgY29tcG9zaXRlCi0JICogZm9yIGFueSBtYXBwaW5nIHR5cGUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IGJlaW5nIGRpc3BsYXllZAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHJldHVybiBUaGUgY29tcG9zaXRlIGRpc3BsYXlpbmcgdGhlIGluZm9ybWF0aW9uIGZvciBhIGNlcnRhaW4gbWFwcGluZwotCSAqLwotCUpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCUpwYVVpRmFjdG9yeSBmYWN0b3J5LAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9KcGFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkZDM4MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBBIHtAbGluayBKcGFDb21wb3NpdGV9IGRlZmluZXMgdGhlIGNvbW1vbiBiZWhhdmlvciBvZiB0aGUgSlBBIHJlbGF0ZWQKLSAqIHdpZGdldHMuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhQ29tcG9zaXRlIHsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgY29tcG9zaXRlIGl0IHNob3VsZCBwb3B1bGF0ZXMgaXRzIHdpZGdldHMgdXNpbmcgdGhlIGdpdmVuCi0JICogbW9kZWwgb2JqZWN0LgotCSAqCi0JICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB1c2VkIHRvIHJldHJpZXZlIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQKLQkgKi8KLQl2b2lkIHBvcHVsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3R1YWwgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gVGhpcyBjb21wb3NpdGUncyBhY3R1YWwgd2lkZ2V0Ci0JICovCi0JQ29udHJvbCBnZXRDb250cm9sKCk7Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBlbmFibGVtZW50IHN0YXRlIG9mIHRoZSB3aWRnZXRzIG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGVuYWJsZSB0aGUgd2lkZ2V0cyBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiB0byBkaXNhYmxlIHRoZW0KLQkgKi8KLQl2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgY29tcG9zaXRlIGl0IHNob3VsZCBkaXNwb3NlIGFueSByZXNvdXJjZXMuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9KcGFEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9KcGFEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmE3OWVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQSBkZXRhaWxzIHBhZ2UgaXMgdXNlZCB0byBzaG93IHRoZSBwcm9wZXJ5IHBhbmUgZm9yIGEgZ2l2ZW4gY29udGV4dCBub2RlLiBUaGUKLSAqIHtAbGluayBKcGFEZXRhaWxzUHJvdmlkZXJ9IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgcGFuZS4KLSAqCi0gKiBAc2VlIEpwYURldGFpbHNQcm92aWRlcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFEZXRhaWxzUGFnZTxUIGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4KLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgZGV0YWlscycgcGFnZSdzIHdpZGdldC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgd2lkZ2V0cyBzaG93biBieSB0aGlzIGRldGFpbHMgcGFnZQotCSAqLwotCUNvbnRyb2wgZ2V0Q29udHJvbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgc3ViamVjdCBmb3IgdGhpcyBkZXRhaWxzIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdCBFaXRoZXIgdGhlIG5ldyBzdWJqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzdWJqZWN0Ci0JICogbmVlZHMgdG8gYmUgcmVtb3ZlZAotCSAqLwotCXZvaWQgc2V0U3ViamVjdChUIHN1YmplY3QpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYURldGFpbHNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWJkZmE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSB0aGUge0BsaW5rIEpwYURldGFpbHNQYWdlfQotICogcmVzcG9uc2libGUgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gY29udGVudCBub2RlIGlkLgotICoKLSAqIEBzZWUgSnBhRGV0YWlsc1BhZ2UKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFEZXRhaWxzUHJvdmlkZXIKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGRldGFpbHMgcGFnZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gY29udGVudCBub2RlIGlkLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBjb250ZW50Tm9kZUlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciB1c2VkIHRvIGRldGVybWluZSB3aGljaCBkZXRhaWxzCi0JICogcGFnZSB0byBjcmVhdGUKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKi8KLQlKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gYnVpbGREZXRhaWxzUGFnZSgKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJT2JqZWN0IGNvbnRlbnROb2RlSWQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9KcGFQYWdlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYVBhZ2VDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxZjMxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYVBhZ2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBBIHtAbGluayBKcGFQYWdlQ29tcG9zaXRlfSBkZWZpbmVzIHRoZSBjb21tb24gYmVoYXZpb3Igb2YgdGhlIEpQQQotICogcmVsYXRlZCB3aWRnZXRzIHRoYXQgaXMgc2hvd24gYXMgYSBwYWdlIHdpdGhpbiBhbiBlZGl0b3IuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVBhZ2VDb21wb3NpdGUgZXh0ZW5kcyBKcGFDb21wb3NpdGUgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVscCBJRC4gVGhpcyBJRCB3aWxsIGJlIHVzZWQgaWYgdGhlIGhlbHAgYnV0dG9uIGlzIGludm9rZWQuCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciB0aGUgaGVscCBJRCBvZiB0aGlzIHBhZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaGVscAotCSAqIGlzIHJlcXVpcmVkCi0JICovCi0JU3RyaW5nIGdldEhlbHBJRCgpOwotCi0JLyoqCi0JICogVGhlIGltYWdlIG9mIHRoZSB0YWIgc2hvd2luZyB0aGlzIHBhZ2UuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwYWdlJ3MgaW1hZ2UKLQkgKi8KLQlJbWFnZSBnZXRQYWdlSW1hZ2UoKTsKLQotCS8qKgotCSAqIFRoZSB0ZXh0IG9mIHRoZSB0YWIgc2hvd2luZyB0aGlzIHBhZ2UuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwYWdlJ3MgdGV4dAotCSAqLwotCVN0cmluZyBnZXRQYWdlVGV4dCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9NYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9NYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmI1YWQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBBIFVJIHByb3ZpZGVyIGlzIHJlcG9uc2libGUgdG8gcHJvdmlkZSB0aGUgc3VwcG9ydCBmb3IgZGlzcGxheWluZyB0aGUKLSAqIGluZm9ybWF0aW9uIGZvciBhIGNlcnRhaW4gbWFwcGluZyB0eXBlLgotICoKLSAqIEBzZWUgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIKLSAqIEBzZWUgVHlwZU1hcHBpbmdVaVByb3ZpZGVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdVaVByb3ZpZGVyPFQ+IHsKLQotCS8qKgotCSAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSB0ZXh0IG9mIHRoZSBtYXBwaW5nIHR5cGUuCi0JICoKLQkgKiBAcmV0dXJuIEEgZGlzcGxheSBzdHJpbmcgZm9yIHRoZSBtYXBwaW5nIHR5cGUKLQkgKi8KLQlTdHJpbmcgZ2V0TGFiZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgdGhhdCByZXByZXNlbnRzIHRoZSBtYXBwaW5nIHR5cGUgZGVmaW5lZCBieSB0aGlzIHByb3ZpZGVyLgotCSAqCi0JICogQHJldHVybiBBbiBpbWFnZSByZXByZXNlbnRpbmcgYSBtYXBwaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGltYWdlCi0JICogaXMgcmVxdWlyZWQKLQkgKi8KLQlJbWFnZSBnZXRJbWFnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHVuaXF1ZSBzdHJpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUga2V5IG9mIHRoZSBtYXBwaW5nIGluIHRoZQotCSAqIGNvcmUgKEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgYW5kL29yIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcikuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBrZXkgcmVwcmVzZW50aW5nIHRoZSBtYXBwaW5nCi0JICovCi0JU3RyaW5nIGdldE1hcHBpbmdLZXkoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvVHlwZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL1R5cGVNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2M4ODMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvVHlwZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVNYXBwaW5nVWlQcm92aWRlcjxUIGV4dGVuZHMgVHlwZU1hcHBpbmc+IGV4dGVuZHMgTWFwcGluZ1VpUHJvdmlkZXI8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdGhhdCBjb3JyZXBvbmRzIHRvIHRoaXMgbWFwcGluZyB0eXBlLgotCSAqIFRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgYnkgdGhlIDxjb2RlPlBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2U8L2NvZGU+IHdoZW4KLQkgKiB0aGUgbWFwcGluZyBrZXkgbWF0Y2hlcyB0aGUga2V5IGdpdmVuIGJ5IHRoaXMgcHJvdmlkZXIuIFRoZSBjb21wb3NpdGVzCi0JICogd2lsbCBiZSBzdG9yZWQgaW4gYSBNYXAgd2l0aCB0aGUgbWFwcGluZyBrZXkgYXMgdGhlIGtleS4KLQkgKgotCSAqIEBwYXJhbSBmYWN0b3J5IFRoZSBVSSBmYWN0b3J5IHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSB0aGUgcmlnaHQgY29tcG9zaXRlCi0JICogZm9yIGFueSBtYXBwaW5nIHR5cGUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IGJlaW5nIGRpc3BsYXllZAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHJldHVybiBUaGUgY29tcG9zaXRlIGRpc3BsYXlpbmcgdGhlIGluZm9ybWF0aW9uIGZvciBhIGNlcnRhaW4gbWFwcGluZwotCSAqLwotCUpwYUNvbXBvc2l0ZSBidWlsZFBlcnNpc3RlbnRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0FzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9Bc3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWNmNDcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0FzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBDb21tYW5kRXhlY3V0b3IgY2FuIGJlIHVzZWQgYnkgYSBub24tVUkKLSAqIHRocmVhZCB0byBhc3luY2hyb25vdXNseSBtb2RpZnkgYSBKUEEgcHJvamVjdCB3aXRoIGFueSBvYmplY3RzIGFzc29jaWF0ZWQKLSAqIHdpdGggZG9jdW1lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5ZWQgaW4gdGhlIFVJLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IKLQlpbXBsZW1lbnRzIENvbW1hbmRFeGVjdXRvcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IEFzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yKCk7Ci0KLQlwdWJsaWMgc3RhdGljIENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQlwcml2YXRlIEFzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMuZGlzcGxheSgpLmFzeW5jRXhlYyh0aGlzLmJ1aWxkUnVubmFibGUoY29tbWFuZCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIERpc3BsYXkgZGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCXJldHVybiAoZGlzcGxheSAhPSBudWxsKSA/IGRpc3BsYXkgOiBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0Jhc2VKcGFVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0Jhc2VKcGFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhMWEzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9CYXNlSnBhVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSmF2YUVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5CYXNpY01hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuRW1iZWRkYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuSWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLk1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLk1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLk9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLlZlcnNpb25NYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlscy5Pcm1FbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVUkgZmFjdG9yeSByZXF1aXJlZCB0byBzaG93IHRoZSBpbmZvcm1hdGlvbgotICogcmVsYXRlZCB0byBhIEpQQSBtYXBwaW5nICh0eXBlIG9yIGF0dHJpYnV0ZSkuCi0gKgotICogQHNlZSBKcGFVaUZhY3RvcnkKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VKcGFVaUZhY3RvcnkgaW1wbGVtZW50cyBKcGFVaUZhY3RvcnkKLXsKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUJhc2ljTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBCYXNpY01hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUVtYmVkZGFibGVDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IEVtYmVkZGFibGVDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBuZXcgRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVtYmVkZGVkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbnRpdHlDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IEphdmFFbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBPcm1FbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUlkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBJZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBuZXcgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpwYVBhZ2VDb21wb3NpdGU+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCUFycmF5TGlzdDxKcGFQYWdlQ29tcG9zaXRlPiBwYWdlcyA9Ci0JCQluZXcgQXJyYXlMaXN0PEpwYVBhZ2VDb21wb3NpdGU+KDEpOwotCi0JCXBhZ2VzLmFkZChuZXcgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKG5ldyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCQlwYWdlcy5hZGQobmV3IFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0KLQkJcmV0dXJuIHBhZ2VzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBuZXcgVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9HZW5lcmljSnBhVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9HZW5lcmljSnBhVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmN2JmY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvR2VuZXJpY0pwYVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVUkgZmFjdG9yeSByZXF1aXJlZCB0byBzaG93IHRoZSBpbmZvcm1hdGlvbgotICogcmVsYXRlZCB0byBhIEpQQSBtYXBwaW5nICh0eXBlIG9yIGF0dHJpYnV0ZSkuCi0gKgotICogQHNlZSBKcGFVaUZhY3RvcnkKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKcGFVaUZhY3RvcnkgZXh0ZW5kcyBCYXNlSnBhVWlGYWN0b3J5Ci17Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFGaWxlQWRhcHRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYUZpbGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWYwODU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYUZpbGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotCi1wdWJsaWMgY2xhc3MgSnBhRmlsZUFkYXB0ZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLXsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfTElTVCA9IAotCQkJbmV3IENsYXNzW10geyBKcGFGaWxlLmNsYXNzIH07Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBBREFQVEVSX0xJU1Q7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoISAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKChJRWRpdG9yUGFydCkgYWRhcHRhYmxlT2JqZWN0KS5nZXRFZGl0b3JJbnB1dCgpOwotCQkKLQkJaWYgKCEgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJRmlsZSBmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQkKLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBqcGFQcm9qZWN0LmdldEpwYUZpbGUoZmlsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhSGVscENvbnRleHRJZHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1Zjc5MWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBEYWxpIEpQQSBVSS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBKcGFIZWxwQ29udGV4dElkcyB7Ci0KLQkvL0NvbnRleHRJRCBwcmVmaXgKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBKcHRVaVBsdWdpbi5QTFVHSU5fSUQgKyAiLiI7Ci0KLQkvL1BlcnNpc3RlbnQgVHlwZSBjb21wb3NpdGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0FDQ0VTU19UWVBFID0gUFJFRklYICsgImVudGl0eV9hY2Nlc3NUeXBlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQVRUUklCVVRFX09WRVJSSURFUyA9IFBSRUZJWCArICJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQVRUUklCVVRFX09WRVJSSURFU19DT0xVTU4gPSBQUkVGSVggKyAiZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc0NvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0NBVEFMT0cgPSBQUkVGSVggKyAiZW50aXR5X2NhdGFsb2ciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9JTkhFUklUQU5DRV9TVFJBVEVHWSA9IFBSRUZJWCArICJlbnRpdHlfaW5oZXJpdGFuY2VTdHJhdGVneSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0lOSEVSSVRBTkNFX0RJU0NSSU1JTkFUT1JfVFlQRSA9IFBSRUZJWCArICJlbnRpdHlfaW5oZXJpdGFuY2VEaXNjcmltaW5hdG9yVHlwZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0lOSEVSSVRBTkNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gUFJFRklYICsgImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JDb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9JTkhFUklUQU5DRV9ESVNDUklNSU5BVE9SX1ZBTFVFID0gUFJFRklYICsgImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JWYWx1ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUUgPSBQUkVGSVggKyAiZW50aXR5X25hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9PUk1fUEFDS0FHRSA9IFBSRUZJWCArICJvcm1fcGFja2FnZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX09STV9TQ0hFTUEgPSBQUkVGSVggKyAib3JtX3NjaGVtYSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX09STV9DQVRBTE9HID0gUFJFRklYICsgIm9ybV9jYXRhbG9nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfT1JNX0FDQ0VTUyA9IFBSRUZJWCArICJvcm1fYWNjZXNzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfT1JNX0NBU0NBREUgPSBQUkVGSVggKyAib3JtX2Nhc2NhZGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9PUk1fWE1MID0gUFJFRklYICsgIm9ybV94bWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9TQ0hFTUEgPSBQUkVGSVggKyAiZW50aXR5X3NjaGVtYSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RBQkxFID0gUFJFRklYICsgImVudGl0eV90YWJsZSI7Ci0KLQkvL1BlcnNpc3RlbnQgQXR0cmlidXRlIGNvbXBvc2l0ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NBU0NBREVfVFlQRSA9IFBSRUZJWCArICJtYXBwaW5nX2Nhc2NhZGVUeXBlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NPTFVNTiA9IFBSRUZJWCArICJtYXBwaW5nX2NvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU5fSU5TRVJUQUJMRSA9IFBSRUZJWCArICJtYXBwaW5nX2NvbHVtbkluc2VydGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MVU1OX0xFTkdUSCA9IFBSRUZJWCArICJtYXBwaW5nX2NvbHVtbkxlbmd0aCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU5fTlVMTEFCTEUgPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW5OdWxsYWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU5fUFJFQ0lTSU9OID0gUFJFRklYICsgIm1hcHBpbmdfY29sdW1uUHJlY2lzaW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NPTFVNTl9TQ0FMRSA9IFBSRUZJWCArICJtYXBwaW5nX2NvbHVtblNjYWxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NPTFVNTl9UQUJMRSA9IFBSRUZJWCArICJtYXBwaW5nX2NvbHVtblRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NPTFVNTl9VTklRVUUgPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW5VbmlxdWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MVU1OX1VQREFUQUJMRT0gUFJFRklYICsgIm1hcHBpbmdfY29sdW1uVXBkYXRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0VNQkVEREVEX0FUVFJJQlVURV9PVkVSUklERVMgPSBQUkVGSVggKyAibWFwcGluZ19lbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19FTUJFRERFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0NPTFVNTiA9IFBSRUZJWCArICJtYXBwaW5nX2VtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0VOVU1FUkFURUQgPSBQUkVGSVggKyAibWFwcGluZ19lbnVtZXJhdGVkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0ZFVENIX1RZUEUgPSBQUkVGSVggKyAibWFwcGluZ19mZXRjaFR5cGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfR0VORVJBVEVEX1ZBTFVFX1NUUkFURUdZID0gUFJFRklYICsgIm1hcHBpbmdfZ2VuZXJhdGVkVmFsdWVTdHJhdGVneSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19HRU5FUkFURURfVkFMVUVfR0VORVJBVE9SX05BTUUgPSBQUkVGSVggKyAibWFwcGluZ19nZW5lcmF0ZWRWYWx1ZUdlbmVyYXRvck5hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfSk9JTl9DT0xVTU5fTkFNRSA9IFBSRUZJWCArICJtYXBwaW5nX2pvaW5Db2x1bW5OYW1lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fUkVGRVJFTkNFRF9DT0xVTU4gPSBQUkVGSVggKyAibWFwcGluZ19qb2luUmVmZXJlbmNlZENvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1RBQkxFX05BTUUgPSBQUkVGSVggKyAibWFwcGluZ19qb2luVGFibGVOYW1lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUyA9IFBSRUZJWCArICJtYXBwaW5nX2pvaW5UYWJsZUpvaW5Db2x1bW5zIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fVEFCTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMgPSBQUkVGSVggKyAibWFwcGluZ19qb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbnMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfTE9CID0gUFJFRklYICsgIm1hcHBpbmdfbG9iIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX01BUF9BUyA9IFBSRUZJWCArICJtYXBwaW5nX21hcEFzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX01BUFBFRF9CWSA9IFBSRUZJWCArICJtYXBwaW5nX21hcHBlZEJ5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX05BTUVEX05BVElWRV9RVUVSSUVTID0gIm5hbWVkX25hdGl2ZV9xdWVyaWVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX05BTUVEX1FVRVJJRVMgPSBQUkVGSVggKyAibmFtZWRfcXVlcmllcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUFRJT05BTCA9IFBSRUZJWCArICJtYXBwaW5nX29wdGlvbmFsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX09SREVSX0JZID0gUFJFRklYICsgIm1hcHBpbmdfb3JkZXJCeSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUkRFUl9CWV9OT19PUkRFUklORyA9IFBSRUZJWCArICJtYXBwaW5nX29yZGVyQnlOb09yZGVyaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX09SREVSX0JZX1BSSU1BUllfS0VZX09SREVSSU5HID0gUFJFRklYICsgIm1hcHBpbmdfb3JkZXJCeVByaW1hcnlLZXlPcmRlcmluZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUkRFUl9CWV9DVVNUT01fT1JERVJJTkcgPSBQUkVGSVggKyAibWFwcGluZ19vcmRlckJ5Q3VzdG9tT3JkZXJpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfUFJJTUFSWV9LRVlfR0VORVJBVElPTiA9IFBSRUZJWCArICJtYXBwaW5nX3ByaW1hcnlLZXlHZW5lcmF0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUiA9IFBSRUZJWCArICJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9OQU1FID0gUFJFRklYICsgIm1hcHBpbmdfc2VxdWVuY2VHZW5lcmF0b3JOYW1lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRSA9IFBSRUZJWCArICJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yU2VxdWVuY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SID0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3IiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX0NBVEFMT0cgPSBQUkVGSVggKyAibWFwcGluZ190YWJsZUdlbmVyYXRvckNhdGFsb2ciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX05BTUUgPSBQUkVGSVggKyAibWFwcGluZ190YWJsZUdlbmVyYXRvck5hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1BSSU1BUllfS0VZX0NPTFVNTiA9IFBSRUZJWCArICJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yUHJpbWFyeUtleUNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfUFJJTUFSWV9LRVlfQ09MVU1OX1ZBTFVFID0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3JQcmltYXJ5S2V5Q29sdW1uVmFsdWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1NDSEVNQSA9IFBSRUZJWCArICJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yU2NoZW1hIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9UQUJMRT0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3JUYWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfVkFMVUVfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3JWYWx1ZUNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQVJHRVRfRU5USVRZID0gUFJFRklYICsgIm1hcHBpbmdfdGFyZ2V0RW50aXR5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1RFTVBPUkFMID0gUFJFRklYICsgIm1hcHBpbmdfdGVtcG9yYWwiOwotCi0JLy9Qcm9qZWN0IHByb3BlcnRpZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0UgPSBQUkVGSVggKyAicHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRV9DT05ORUNUSU9OID0gUFJFRklYICsgInByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlQ29ubmVjdGlvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19KQVZBX1BFUlNJU1RFTkNFX1NDSEVNQSA9IFBSRUZJWCArICJwcm9wZXJ0aWVzX2phdmFQZXJzaXN0ZW5jZVNjaGVtYSI7Ci0KLQkvL0RpYWxvZ3MsIFdpemFyZHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfQ1JFQVRFX09STSA9IFBSRUZJWCArICJkaWFsb2dfY3JlYXRlT1JNIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfRURJVF9JTlZFUlNFX0pPSU5fQ09MVU5OID0gUFJFRklYICsgImRpYWxvZ19lZGl0SW52ZXJzZUpvaW5Db2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19HRU5FUkFURV9FTlRJVElFUyA9IFBSRUZJWCArICJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0dFTkVSQVRFX0VOVElUSUVTX1NPVVJDRSA9IFBSRUZJWCArICJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllc19zb3VyY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19HRU5FUkFURV9FTlRJVElFU19QQUNLQUdFID0gUFJFRklYICsgImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3BhY2thZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19HRU5FUkFURV9FTlRJVElFU19UQUJMRVMgPSBQUkVGSVggKyAiZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfdGFibGVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfSlBBX0ZBQ0VUID0gUFJFRklYICsgImRpYWxvZ19KUEFGYWNldCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0pQQV9QTEFURk9STSA9IFBSRUZJWCArICJkaWFsb2dfSlBBUGxhdGZvcm0iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfUFJPSkVDVCA9IFBSRUZJWCArICJkaWFsb2dfbmV3SlBBUHJvamVjdCI7Ci0gCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfQ0xBU1NQQVRIID0gUFJFRklYICsgImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2VfY2xhc3NwYXRoIjsKLSAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9EQVRBQkFTRSA9IFBSRUZJWCArICJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX2RhdGFiYXNlIjsKLSAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9QQUNLQUdJTkcgPSBQUkVGSVggKyAiZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9wYWNrYWdpbmciOwotIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfSlBBX1BST0pFQ1RfQ1JFQVRJT05fUEFHRSA9IFBSRUZJWCArICJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlIjsKLQotCS8vT3RoZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9PVVRMSU5FID0gUFJFRklYICsgInBlcnNpc3RlbmNlT3V0bGluZSI7Ci0KLQkvL1BlcnNpc3RlbmNlVW5pdAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfQ09OTkVDVElPTiA9IFBSRUZJWCArICJwZXJzaXN0ZW5jZVVuaXRfY29ubmVjdGlvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9HRU5FUkFMICAgID0gUFJFRklYICsgInBlcnNpc3RlbmNlVW5pdF9nZW5lcmFsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX1BST1BFUlRJRVMgPSBQUkVGSVggKyAicGVyc2lzdGVuY2VVbml0X3Byb3BlcnRpZXMiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhYTQ1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLkphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogSlBBIEphdmEgY29kZS1jb21wbGV0aW9uIHByb3Bvc2FsIGNvbXB1dGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgaW1wbGVtZW50cyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIHsKLQotCXB1YmxpYyBKcGFKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2Vzc2lvblN0YXJ0ZWQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiAoY29udGV4dCBpbnN0YW5jZW9mIEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQpID8KLQkJCQkJdGhpcy5jb21wdXRlQ29tcGxldGlvblByb3Bvc2FscygoSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCkgY29udGV4dCkKLQkJCQk6Ci0JCQkJCUNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzXyhjb250ZXh0KTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHNfKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjb250ZXh0LmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlpZiAoY3UgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLQkJSnBhRmlsZSBqcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkpOwotCQlpZiAoanBhRmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yPEpwYVN0cnVjdHVyZU5vZGU+IHJvb3RTdHJ1Y3R1cmVOb2RlcyA9IGpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCk7Ci0JCWlmICghcm9vdFN0cnVjdHVyZU5vZGVzLmhhc05leHQoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCUNvbXBsZXRpb25Db250ZXh0IGNjID0gY29udGV4dC5nZXRDb3JlQ29udGV4dCgpOwotCi0JCS8vIHRoZSBjb250ZXh0J3MgInRva2VuIiBpcyByZWFsbHkgYSBzb3J0IG9mICJwcmVmaXgiIC0gaXQgZG9lcyBOT1QKLQkJLy8gY29ycmVzcG9uZCB0byB0aGUgInN0YXJ0IiBhbmQgImVuZCIgd2UgZ2V0IGJlbG93Li4uIAotCQljaGFyW10gcHJlZml4ID0gY2MuZ2V0VG9rZW4oKTsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gKChwcmVmaXggPT0gbnVsbCkgPyBGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkgOiBuZXcgSWdub3JlQ2FzZVByZWZpeEZpbHRlcihwcmVmaXgpKTsKLQkJLy8gdGhlIHRva2VuICJzdGFydCIgaXMgdGhlIG9mZnNldCBvZiB0aGUgdG9rZW4ncyBmaXJzdCBjaGFyYWN0ZXIKLQkJaW50IHRva2VuU3RhcnQgPSBjYy5nZXRUb2tlblN0YXJ0KCk7Ci0JCS8vIHRoZSB0b2tlbiAiZW5kIiBpcyB0aGUgb2Zmc2V0IG9mIHRoZSB0b2tlbidzIGxhc3QgY2hhcmFjdGVyICh5dWspCi0JCWludCB0b2tlbkVuZCA9IGNjLmdldFRva2VuRW5kKCk7Ci0KLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oInByZWZpeDogIiArIG5ldyBTdHJpbmcocHJlZml4KSk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJ0b2tlbiBzdGFydDogIiArIHRva2VuU3RhcnQpOwotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigidG9rZW4gZW5kOiAiICsgdG9rZW5FbmQpOwotLy8JCVN0cmluZyBzb3VyY2UgPSBjdS5nZXRTb3VyY2UoKTsKLS8vCQlTdHJpbmcgdG9rZW4gPSBzb3VyY2Uuc3Vic3RyaW5nKHRva2VuU3RhcnQsIHRva2VuRW5kICsgMSk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJ0b2tlbjogPT4iICsgdG9rZW4gKyAiPD0iKTsKLS8vCQlTdHJpbmcgc25pcHBldCA9IHNvdXJjZS5zdWJzdHJpbmcoTWF0aC5tYXgoMCwgdG9rZW5TdGFydCAtIDIwKSwgTWF0aC5taW4oc291cmNlLmxlbmd0aCgpLCB0b2tlbkVuZCArIDIxKSk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJzdXJyb3VuZGluZyBzbmlwcGV0OiA9PiIgKyBzbmlwcGV0ICsgIjw9Iik7Ci0KLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpOwotCQlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLQkJZm9yIChKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUocm9vdFN0cnVjdHVyZU5vZGVzKSkgewotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9ICgoSmF2YVBlcnNpc3RlbnRUeXBlKSBzdHJ1Y3R1cmVOb2RlKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhjb250ZXh0LmdldEludm9jYXRpb25PZmZzZXQoKSwgZmlsdGVyLCBhc3RSb290KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJU3RyaW5nIHMgPSBzdHJlYW0ubmV4dCgpOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbChzLCB0b2tlblN0YXJ0LCB0b2tlbkVuZCAtIHRva2VuU3RhcnQgKyAxLCBzLmxlbmd0aCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKENvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXNzaW9uRW5kZWQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZ25vcmVDYXNlUHJlZml4RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyPFN0cmluZz4gewotCQlwcml2YXRlIGZpbmFsIGNoYXJbXSBwcmVmaXg7Ci0JCUlnbm9yZUNhc2VQcmVmaXhGaWx0ZXIoY2hhcltdIHByZWZpeCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucHJlZml4ID0gcHJlZml4OwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKHMudG9DaGFyQXJyYXkoKSwgcHJlZml4KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhTWFwcGluZ0ltYWdlSGVscGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFNYXBwaW5nSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkNDBhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFNYXBwaW5nSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIEpwYU1hcHBpbmdJbWFnZUhlbHBlcgotewotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgaW1hZ2VGb3JUeXBlTWFwcGluZyhTdHJpbmcgbWFwcGluZ0tleSkgewotCQlpZiAoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZID09IG1hcHBpbmdLZXkpIHsKLQkJCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLk5VTExfVFlQRV9NQVBQSU5HKTsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkVOVElUWSk7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuRU1CRUREQUJMRSk7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJbWFnZSBpbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJaWYgKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZID09IG1hcHBpbmdLZXkpIHsKLQkJCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLk5VTExfQVRUUklCVVRFX01BUFBJTkcpOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkJBU0lDKTsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5JRCk7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5WRVJTSU9OKTsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5FTUJFRERFRF9JRCk7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuRU1CRURERUQpOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuT05FX1RPX09ORSk7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuT05FX1RPX01BTlkpOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLk1BTllfVE9fT05FKTsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuTUFOWV9UT19NQU5ZKTsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuVFJBTlNJRU5UKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaUljb25zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaUljb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNWZlNjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlJY29ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLgotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6Ci0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JbWFnZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLQotcHVibGljIGNsYXNzIEpwdFVpSWNvbnMKLXsKLQlwdWJsaWMgc3RhdGljIEltYWdlIGdob3N0KEltYWdlIGltYWdlKSB7Ci0JCUNvbG9yIGxpZ2h0Z3JheSA9IG5ldyBDb2xvcihpbWFnZS5nZXREZXZpY2UoKSwgMjIzLCAyMjMsIDIyMyk7Ci0JCUltYWdlRGF0YSBpbWFnZURhdGEgPSBJbWFnZVV0aWxpdGllcy5jcmVhdGVTaGFkZWRJbWFnZShpbWFnZSwgbGlnaHRncmF5KTsKLQkJcmV0dXJuIG5ldyBJbWFnZShpbWFnZS5nZXREZXZpY2UoKSwgbmV3IEltYWdlKGltYWdlLmdldERldmljZSgpLCBpbWFnZURhdGEpLCBTV1QuSU1BR0VfR1JBWSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIEdlbmVyYWwgSlBBIGljb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0NPTlRFTlQgPSAiZnVsbC9vYmoxNi9qcGEtY29udGVudCI7ICAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0ZJTEUgPSAiZnVsbC9vYmoxNi9qcGEtZmlsZSI7ICAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTklORyA9ICJmdWxsL29iajE2L3dhcm5pbmciOyAgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vICoqKioqKioqKioqKioqKiogV2l6YXJkIGljb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfV0laX0JBTk5FUiA9ICJmdWxsL3dpemJhbi9qcGFfZmFjZXRfd2l6YmFuIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9XSVpfQkFOTkVSID0gImZ1bGwvd2l6YmFuL25ld19lbnRpdHlfd2l6YmFuIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9GSUxFX1dJWl9CQU5ORVIgPSAiZnVsbC93aXpiYW4vbmV3X2pwYV9maWxlX3dpemJhbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIFBlcnNpc3RlbmNlIGljb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRSA9ICJmdWxsL29iajE2L3BlcnNpc3RlbmNlIjsgIC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVQgPSAiZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS11bml0IjsgIC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRklMRV9SRUYgPSAiZnVsbC9vYmoxNi9qcGEtZmlsZSI7ICAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19SRUYgPSAiZnVsbC9vYmoxNi9udWxsLXR5cGUtbWFwcGluZyI7ICAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKioqKioqKiogT3JtIGljb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9NQVBQSU5HUyA9ICJmdWxsL29iajE2L2VudGl0eS1tYXBwaW5ncyI7ICAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKioqKioqKiogT3JtL0phdmEgY29tbW9uIGljb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9ICJmdWxsL29iajE2L2VudGl0eSI7ICAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFID0gImZ1bGwvb2JqMTYvZW1iZWRkYWJsZSI7ICAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfU1VQRVJDTEFTUyA9ICJmdWxsL29iajE2L21hcHBlZC1zdXBlcmNsYXNzIjsgIC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfVFlQRV9NQVBQSU5HID0gImZ1bGwvb2JqMTYvbnVsbC10eXBlLW1hcHBpbmciOyAgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUMgPSAiZnVsbC9vYmoxNi9iYXNpYyI7ICAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gImZ1bGwvb2JqMTYvdmVyc2lvbiI7ICAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJmdWxsL29iajE2L2lkIjsgIC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREVEX0lEID0gImZ1bGwvb2JqMTYvZW1iZWRkZWQtaWQiOyAgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRURERUQgPSAiZnVsbC9vYmoxNi9lbWJlZGRlZCI7ICAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfVE9fT05FID0gImZ1bGwvb2JqMTYvb25lLXRvLW9uZSI7ICAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfVE9fTUFOWSA9ICJmdWxsL29iajE2L29uZS10by1tYW55IjsgIC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTllfVE9fT05FID0gImZ1bGwvb2JqMTYvbWFueS10by1vbmUiOyAgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOWV9UT19NQU5ZID0gImZ1bGwvb2JqMTYvbWFueS10by1tYW55IjsgIC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TSUVOVCA9ICJmdWxsL29iajE2L3RyYW5zaWVudCI7ICAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX0FUVFJJQlVURV9NQVBQSU5HID0gImZ1bGwvb2JqMTYvbnVsbC1hdHRyaWJ1dGUtbWFwcGluZyI7ICAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaU1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYTQ3ODcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIFVJLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnB0VWlNZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdENob29zZXJQYW5lX2Jyb3dzZUJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX2F0dHJpYnV0ZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfbWFwcGluZ0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfbm9NYXBwaW5nS2V5RXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzTm90Rm91bmRXYXJuaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19kdXBsaWNhdGVDbGFzc1dhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX21hcHBpbmdMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbm9DbGFzc0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19ub01hcHBpbmdLZXlFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUmVtb3ZlUGFuZV9BZGRCdXR0b25UZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFJlbW92ZVBhbmVfUmVtb3ZlQnV0dG9uVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc0Nob29zZXJQYW5lX2RpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfYWRkQ29ubmVjdGlvbkxpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2Nvbm5lY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2RhdGFiYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9kYXRhYmFzZUNvbm5lY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3JlY29ubmVjdExpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3JlY29ubmVjdFRvRGF0YWJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3NjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2Vfc2NoZW1hSW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdFdpdGhEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX29wZW5pbmdFZGl0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhbF9icm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhbF9kZXNlbGVjdEFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmFsX3NlbGVjdEFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfY2hvb3NlRW50aXR5VGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfZW50aXR5TmFtZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9nZW5lcmF0ZUVudGl0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3N5bmNocm9uaXplQ2xhc3NlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV90YWJsZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV90YWJsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUNvbnRlbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRGV0YWlsc1ZpZXdfdmlld05vdEF2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdExpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2NyZWF0ZU9ybVhtbEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdFNjaGVtYUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfZGlzY292ZXJDbGFzc2VzQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9qcGFJbXBsZW1lbnRhdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9qcGFQcmVmc0xpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2xpc3RDbGFzc2VzQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRTY2hlbWFMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9zcGVjaWZ5TGliTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV91c2VyTGlic0xpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX3VzZXJTZXJ2ZXJMaWJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcmVmZXJlbmNlUGFnZV9kZWZhdWx0SnBhTGliOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByZWZlcmVuY2VQYWdlX2ludmFsaWRKcGFMaWI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhUHJlZmVyZW5jZVBhZ2VfdXNlckxpYnNMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JEZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JUb29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVN0cnVjdHVyZVZpZXdfc3RydWN0dXJlTm90QXZhaWxhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2Jhc2ljOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2Jhc2ljX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfYmFzaWNfZGVmYXVsdDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfY2hhbmdlTWFwcGluZ1R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfZGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9kaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9lbWJlZGRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2VtYmVkZGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2VtYmVkZGVkX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfZW1iZWRkZWRfZGVmYXVsdDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfZW1iZWRkZWRpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9lbnRpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfbGFiZWxUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX21hbnl0b21hbnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfbWFueXRvb25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX21hcHBlZEF0dHJpYnV0ZVRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfbWFwcGVkc3VwZXJjbGFzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9tYXBwZWRUeXBlVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9vbmV0b21hbnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfb25ldG9vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfdHJhbnNpZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX3VubWFwcGVkQXR0cmlidXRlVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV91bm1hcHBlZFR5cGVUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX3ZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfdmlydHVhbEF0dHJpYnV0ZVRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9wcm9qZWN0TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3NvdXJjZUZvbGRlckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9maWxlUGF0aExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hY2Nlc3NMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfYWRkVG9QZXJzaXN0ZW5jZVVuaXRCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3BlcnNpc3RlbmNlVW5pdExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9pbmNvcnJlY3RTb3VyY2VGb2xkZXJFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfYWNjZXNzTGFiZWxfc291cmNlRm9sZGVyRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FjY2Vzc0xhYmVsX3NvdXJjZUZvbGRlckRpYWxvZ0Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SnBhUHJvamVjdFdpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnlfZW50aXR5TWFwcGluZ3NMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdmVyd3JpdGVDb25maXJtZXJEaWFsb2dfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdmVyd3JpdGVDb25maXJtZXJEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZUNob29zZXJQYW5lX2RpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZUNob29zZXJQYW5lX2RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X3BlcnNpc3RlbmNlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfbWFwQXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudFR5cGVQYWdlX21hcEFzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0aWVzR2VuZXJhdG9yX2pvYk5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X3VpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdFVpTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjkzZDI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL1N5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIENvbW1hbmRFeGVjdXRvciBjYW4gYmUgdXNlZCBieSBhIG5vbi1VSQotICogdGhyZWFkIHRvIHN5bmNocm9ub3VzbHkgbW9kaWZ5IGEgSlBBIHByb2plY3Qgd2l0aCBhbnkgb2JqZWN0cyBhc3NvY2lhdGVkCi0gKiB3aXRoIGRvY3VtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgZGlzcGxheWVkIGluIHRoZSBVSS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IKLQlpbXBsZW1lbnRzIENvbW1hbmRFeGVjdXRvcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IFN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKTsKLQotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCXByaXZhdGUgU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzLmRpc3BsYXkoKS5zeW5jRXhlYyh0aGlzLmJ1aWxkUnVubmFibGUoY29tbWFuZCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIERpc3BsYXkgZGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCXJldHVybiAoZGlzcGxheSAhPSBudWxsKSA/IGRpc3BsYXkgOiBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL1RyYWNpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL1RyYWNpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxMzg2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9UcmFjaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgdHJhY2luZyBjbGFzcyBtYW5hZ2VzIHRvIGNvbnZlcnQgdGhlIHN0cmluZyB2YWx1ZSBpbnRvIGJvb2xlYW4gdmFsdWVzIG9yCi0gKiBpbnRlZ2VyIHZhbHVlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYWNpbmcgZGVidWcgZmxhZ3MuIFRob3NlIGZsYWdzCi0gKiBhcmUgc3BlY2lmaWVkIGluIHRoZSAub3B0aW9ucyBmaWxlLiBUaGUgc3VwcG9ydGVkIGtleXMgYXJlIGRlZmluZWQgaGVyZSBhcwotICogY29uc3RhbnRzIGZvciBxdWljayByZWZlcmVuY2UuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIFRyYWNpbmcKLXsKLQkvKioKLQkgKiBBIGNvbnN0YW50IHVzZWQgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAiL2RlYnVnIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVRyA9ICIvZGVidWciOwotCi0JLyoqCi0JICogQSBjb25zdGFudCB1c2VkIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggIi9kZWJ1Zy91aS9kYiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfREIgPSAiL2RlYnVnL3VpL2RiIjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgdXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoICIvZGVidWcvdWkvZGV0YWlsc1ZpZXciLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0RFVEFJTFNfVklFVyA9ICIvZGVidWcvdWkvZGV0YWlsc1ZpZXciOwotCi0JLyoqCi0JICogQSBjb25zdGFudCB1c2VkIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggIi9kZWJ1Zy91aS9sYXlvdXQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0xBWU9VVCA9ICIvZGVidWcvdWkvbGF5b3V0IjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgdXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoICIvdW5pdC10ZXN0cyIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5JVF9URVNUUyA9ICIvdW5pdC10ZXN0cyI7Ci0KLQkvKioKLQkgKiBDYW4ndCBpbnN0YW50aWF0ZSB0aGlzIDxjb2RlPlRyYWNpbmc8L2NvZGU+IGNsYXNzLgotCSAqLwotCXByaXZhdGUgVHJhY2luZygpCi0JewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRyYWNpbmcgY2Fubm90IGJlIGluc3RhbnRpYXRlZCIpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLiBUaGUgZGVmYXVsdAotCSAqIHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBmbGFnIFRoZSBmbGFnIHRvIHJldHJpZXZlIHRoZSBkZWJ1ZyB2YWx1ZSwgd2hpY2ggc2hvdWxkIGJlCi0JICogY29udGFpbmVkIGluIHRoZSAub3B0aW9ucyBmaWxlLCB0aGUgZmxhZyBzaG91bGQgc3RhcnQgd2l0aCAiLyIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBmbGFnIGlzIGFjdGl2ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGJvb2xlYW5EZWJ1Z09wdGlvbihTdHJpbmcgZmxhZykKLQl7Ci0JCXJldHVybiBib29sZWFuRGVidWdPcHRpb24oZmxhZywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLgotCSAqCi0JICogQHBhcmFtIGZsYWcgVGhlIGZsYWcgdG8gcmV0cmlldmUgdGhlIGRlYnVnIHZhbHVlLCB3aGljaCBzaG91bGQgYmUKLQkgKiBjb250YWluZWQgaW4gdGhlIC5vcHRpb25zIGZpbGUsIHRoZSBmbGFnIHNob3VsZCBzdGFydCB3aXRoICIvIgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiBmbGFnIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGZsYWcgaXMgYWN0aXZlOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYm9vbGVhbkRlYnVnT3B0aW9uKFN0cmluZyBmbGFnLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkKLQl7Ci0JCVN0cmluZyByZXN1bHQgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKcHRVaVBsdWdpbi5QTFVHSU5fSUQgKyBmbGFnKTsKLQotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCXsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHJlc3VsdC50cmltKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLiBUaGUgZGVmYXVsdCB2YWx1ZQotCSAqIGlzIDAuCi0JICoKLQkgKiBAcGFyYW0gZmxhZyBUaGUgZmxhZyB0byByZXRyaWV2ZSB0aGUgZGVidWcgdmFsdWUsIHdoaWNoIHNob3VsZCBiZQotCSAqIGNvbnRhaW5lZCBpbiB0aGUgLm9wdGlvbnMgZmlsZSwgdGhlIGZsYWcgc2hvdWxkIHN0YXJ0IHdpdGggIi8iCi0JICogQHJldHVybiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLCBvciB0aGUgZ2l2ZW4gZGVmYXVsdAotCSAqIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW50RGVidWdPcHRpb24oU3RyaW5nIGZsYWcpCi0JewotCQlyZXR1cm4gaW50RGVidWdPcHRpb24oZmxhZywgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZWJ1ZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcuCi0JICoKLQkgKiBAcGFyYW0gZmxhZyBUaGUgZmxhZyB0byByZXRyaWV2ZSB0aGUgZGVidWcgdmFsdWUsIHdoaWNoIHNob3VsZCBiZQotCSAqIGNvbnRhaW5lZCBpbiB0aGUgLm9wdGlvbnMgZmlsZSwgdGhlIGZsYWcgc2hvdWxkIHN0YXJ0IHdpdGggIi8iCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGdpdmVuIGZsYWcgY291bGQgbm90IGJlIGZvdW5kCi0JICogQHJldHVybiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLCBvciB0aGUgZ2l2ZW4gZGVmYXVsdAotCSAqIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW50RGVidWdPcHRpb24oU3RyaW5nIGZsYWcsIGludCBkZWZhdWx0VmFsdWUpCi0JewotCQlTdHJpbmcgcmVzdWx0ID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oSnB0VWlQbHVnaW4uUExVR0lOX0lEICsgZmxhZyk7Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQl7Ci0JCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQl9Ci0KLQkJcmV0dXJuIEludGVnZXIudmFsdWVPZihyZXN1bHQpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIG1lc3NhZ2VzLCBhcHBlbmRzIGl0IHdpdGggdGhpcyBwbHVnLWluIGlkLgotCSAqCi0JICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkKLQl7Ci0JCVN5c3RlbS5vdXQucHJpbnQoIlsiICsgSnB0VWlQbHVnaW4uUExVR0lOX0lEICsgIl0gIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlYnVnIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZy4gVGhlIGRlZmF1bHQgdmFsdWUKLQkgKiBpcyBhbiBlbXB0eSBzdHJpbmcuCi0JICoKLQkgKiBAcGFyYW0gZmxhZyBUaGUgZmxhZyB0byByZXRyaWV2ZSB0aGUgZGVidWcgdmFsdWUsIHdoaWNoIHNob3VsZCBiZQotCSAqIGNvbnRhaW5lZCBpbiB0aGUgLm9wdGlvbnMgZmlsZSwgdGhlIGZsYWcgc2hvdWxkIHN0YXJ0IHdpdGggIi8iCi0JICogQHJldHVybiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLCBvciB0aGUgZ2l2ZW4gZGVmYXVsdAotCSAqIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaW5nRGVidWdPcHRpb24oU3RyaW5nIGZsYWcpCi0JewotCQlyZXR1cm4gc3RyaW5nRGVidWdPcHRpb24oZmxhZywgIiIpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLgotCSAqCi0JICogQHBhcmFtIGZsYWcgVGhlIGZsYWcgdG8gcmV0cmlldmUgdGhlIGRlYnVnIHZhbHVlLCB3aGljaCBzaG91bGQgYmUKLQkgKiBjb250YWluZWQgaW4gdGhlIC5vcHRpb25zIGZpbGUsIHRoZSBmbGFnIHNob3VsZCBzdGFydCB3aXRoICIvIgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiBmbGFnIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZywgb3IgdGhlIGdpdmVuIGRlZmF1bHQKLQkgKiB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ0RlYnVnT3B0aW9uKFN0cmluZyBmbGFnLCBTdHJpbmcgZGVmYXVsdFZhbHVlKQotCXsKLQkJU3RyaW5nIHJlc3VsdCA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpwdFVpUGx1Z2luLlBMVUdJTl9JRCArIGZsYWcpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJewotCQkJcmVzdWx0ID0gZGVmYXVsdFZhbHVlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRERMQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRERMQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YmNlMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9HZW5lcmF0ZURETEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci0KLS8qKgotICogIEdlbmVyYXRlRERMQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZURETEFjdGlvbiBleHRlbmRzIFByb2plY3RBY3Rpb24gewotCQotCXB1YmxpYyBHZW5lcmF0ZURETEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKEpwYVByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0aGlzLmpwYVBsYXRmb3JtVWkocHJvamVjdCkuZ2VuZXJhdGVEREwocHJvamVjdCwgdGhpcy5nZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVFbnRpdGllc0FjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9HZW5lcmF0ZUVudGl0aWVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNzQ1NzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9HZW5lcmF0ZUVudGl0aWVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotCi0vKioKLSAqICBHZW5lcmF0ZUVudGl0aWVzQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUVudGl0aWVzQWN0aW9uIGV4dGVuZHMgUHJvamVjdEFjdGlvbiB7Ci0JcHVibGljIEdlbmVyYXRlRW50aXRpZXNBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShKcGFQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgdGhpcy5qcGFQbGF0Zm9ybVVpKHByb2plY3QpLmdlbmVyYXRlRW50aXRpZXMocHJvamVjdCwgdGhpcy5nZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvTWlncmF0ZUphdmFQcm9qZWN0QWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL01pZ3JhdGVKYXZhUHJvamVjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGM3ZWY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvTWlncmF0ZUphdmFQcm9qZWN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkphdmFQcm9qZWN0TWlncmF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQ7Ci0KLXB1YmxpYyBjbGFzcyBNaWdyYXRlSmF2YVByb2plY3RBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUKLXsKLQlwcml2YXRlIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQkKLQkKLQlwdWJsaWMgTWlncmF0ZUphdmFQcm9qZWN0QWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJLy8gVGhpcyBhY3Rpb24gaXMgY3VycmVudGx5IGVuYWJsZWQgb25seSBmb3IgYSBzaW5nbHkgc2VsZWN0ZWQsIGphdmEsCi0JCS8vIG5vbi1mYWNldGVkIElQcm9qZWN0Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN1cnJlbnRTZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQlleGVjdXRlKHByb2plY3QpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIGFkZCBmYWNldHMgbmF0dXJlLCBqYXZhIGZhY2V0LCBhbmQgdXRpbGl0eSBmYWNldCB0byBwcm9qZWN0Ci0JCUphdmFQcm9qZWN0TWlncmF0aW9uT3BlcmF0aW9uIG9wZXJhdGlvbiA9IAotCQkJSjJFRVByb2plY3RVdGlsaXRpZXMuY3JlYXRlRmxleEphdmFQcm9qZWN0Rm9yUHJvamVjdE9wZXJhdGlvbihwcm9qZWN0LCBmYWxzZSk7Ci0JCW9wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOwotCQkKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0OwotCQl0cnkgewotCQkJLy8gZ2V0IHRoZSBmYWNldGVkIHByb2plY3QKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlKcHRVaVBsdWdpbi5sb2coY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBsYXVuY2ggdGhlIFVJIHdpdGggSlBBIGZhY2V0IHByZXNlbGVjdGVkCi0JCWZpbmFsIE1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkIHdpemFyZCA9IG5ldyBNb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZChmYWNldGVkUHJvamVjdCk7Ci0JCUlGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgPSB3aXphcmQuZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpOwotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBqcGExXzAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSnB0Q29yZVBsdWdpbi5GQUNFVF9JRCkuZ2V0RGVmYXVsdFZlcnNpb24oKTsKLQkJZmFjZXRlZFByb2plY3RXb3JraW5nQ29weS5hZGRQcm9qZWN0RmFjZXQoanBhMV8wKTsKLQkJCi0JCWZpbmFsIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSnBhUmVzb3VyY2VBY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvT3BlbkpwYVJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOTBmM2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSnBhUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5EZWZhdWx0SnBhU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLXB1YmxpYyBjbGFzcyBPcGVuSnBhUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24KLXsKLQlwcml2YXRlIEpwYUNvbnRleHROb2RlIHNlbGVjdGVkTm9kZTsKLQkKLQkKLQlwdWJsaWMgT3BlbkpwYVJlc291cmNlQWN0aW9uKCkgewotCQlzdXBlcigiT3BlbiIpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsKLQkJc2VsZWN0ZWROb2RlID0gbnVsbDsKLQkJCi0JCWlmICghIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAocy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAocy5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEpwYVJvb3RDb250ZXh0Tm9kZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlzZWxlY3RlZE5vZGUgPSAoSnBhQ29udGV4dE5vZGUpIHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKCEgaXNFbmFibGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSVJlc291cmNlIHJlc291cmNlID0gc2VsZWN0ZWROb2RlLmdldFJlc291cmNlKCk7Ci0JCQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCW9wZW5FZGl0b3IoKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJCi0JCQkKLQkJCWlmIChzZWxlY3RlZE5vZGUgaW5zdGFuY2VvZiBKcGFTdHJ1Y3R1cmVOb2RlKSB7Ci0JCQkJSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyID0KLQkJCQkJU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLQkJCQlzZWxlY3Rpb25NYW5hZ2VyLnNlbGVjdChuZXcgRGVmYXVsdEpwYVNlbGVjdGlvbigoSnBhU3RydWN0dXJlTm9kZSkgc2VsZWN0ZWROb2RlKSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkVkaXRvcihJRmlsZSBmaWxlKSB7Ci0JCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gSURFLmdldENvbnRlbnRUeXBlKGZpbGUpOwotCQlJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3JEZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlLmdldE5hbWUoKSwgY29udGVudFR5cGUpOwotCQkKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkKLQkJdHJ5IHsKLQkJCXBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBlZGl0b3JEZXNjcmlwdG9yLmdldElkKCkpOwotCQl9IAotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgSnB0VWlNZXNzYWdlcy5FcnJvcl9vcGVuaW5nRWRpdG9yLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1Byb2plY3RBY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvUHJvamVjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDczOWVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvUHJvamVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVVpUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIE92ZXJyaWRlIGFueSBvZiB0aGUgI2V4ZWN1dGUoKSBtZXRob2RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdEFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLSAgICAKLQotCXB1YmxpYyBQcm9qZWN0QWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpIHsKLQkJaWYgKHRoaXMuY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmN1cnJlbnRTZWxlY3Rpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAodGhpcy5jdXJyZW50U2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWZvciAoSXRlcmF0b3Igc3RyZWFtID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5jdXJyZW50U2VsZWN0aW9uKS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLmV4ZWN1dGUoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHRoaXMucHJvamVjdEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJdGhpcy5leGVjdXRlKHByb2plY3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3RGcm9tU2VsZWN0aW9uKE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKElQcm9qZWN0KSBzZWxlY3Rpb247Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJcmV0dXJuICgoSUphdmFQcm9qZWN0KSBzZWxlY3Rpb24pLmdldFByb2plY3QoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpKEpwYVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmcgY29yZUpwYVBsYXRmb3JtSWQgPSBwcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKLSAgICAgICAgcmV0dXJuIEpwYVBsYXRmb3JtVWlSZWdpc3RyeS5pbnN0YW5jZSgpLmpwYVBsYXRmb3JtKGNvcmVKcGFQbGF0Zm9ybUlkKTsgCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmV4ZWN1dGUoanBhUHJvamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShKcGFQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1N5bmNocm9uaXplQ2xhc3Nlc0FjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9TeW5jaHJvbml6ZUNsYXNzZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhZGM4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1N5bmNocm9uaXplQ2xhc3Nlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5zeW5jaC5TeW5jaHJvbml6ZUNsYXNzZXNKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVDbGFzc2VzQWN0aW9uIAotCWltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIAotewotCXByaXZhdGUgSUZpbGUgZmlsZTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCS8vIG5vLW9wIGZvciBub3cKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJU3luY2hyb25pemVDbGFzc2VzSm9iIGpvYiA9IG5ldyBTeW5jaHJvbml6ZUNsYXNzZXNKb2IoZmlsZSk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIEFjdGlvbiBpcyBjb250cmlidXRlZCBmb3IgSUZpbGUncyBuYW1lZCAicGVyc2lzdGVuY2UueG1sIiBhbmQKLQkJLy8gZm9yIFBlcmlzdGVuY2VYbWwgb2JqZWN0cy4KLQkJLy8gVGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lIGVsZW1lbnQgaW4gYWN0dWFsIHNlbGVjdGlvbi4KLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCWZpbGUgPSAoSUZpbGUpIHNlbGVjdGVkT2JqZWN0OwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgUGVyc2lzdGVuY2VYbWwpIHsKLQkJCWZpbGUgPSAoSUZpbGUpICgoUGVyc2lzdGVuY2VYbWwpIHNlbGVjdGVkT2JqZWN0KS5nZXRSZXNvdXJjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwSGFuZGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGIzNzg0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGlhbG9ncy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5EZWZhdWx0SnBhU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlcgotewotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBleGVjdXRpb25FdmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gCi0JCQlIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3dDaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKLQkJCi0JCWZpbmFsIExpc3Q8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gbmV3QXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiAKLQkJCT0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uQ2hlY2tlZChleGVjdXRpb25FdmVudCk7Ci0JCQotCQkKLQkJLy8gb25seSBhcHBsaWVzIGZvciBtdWx0aXBseSBzZWxlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9iamVjdHMgaW4gYSB0cmVlCi0JCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiAoSXRlcmFibGU8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4pIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzZWxlY3Rpb24uaXRlcmF0b3IoKSkpIHsKLQkJCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBhdHRyaWJ1dGUuZ2V0T3JtUGVyc2lzdGVudFR5cGUoKTsKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCQotCQkJQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2cod2luZG93LmdldFNoZWxsKCksIGF0dHJpYnV0ZSk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJCi0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0dHJpYnV0ZSA9IHR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAobmV3QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQluZXdBdHRyaWJ1dGVzLmFkZChuZXdBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmV3QXR0cmlidXRlcy5zaXplKCkgPT0gMSkgewotCQkJd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9IFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIod2luZG93KTsKLQkJCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2VsZWN0KG5ldyBEZWZhdWx0SnBhU2VsZWN0aW9uKG5ld0F0dHJpYnV0ZXMuZ2V0KDApKSwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sSGFuZGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTBlODc5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkRlZmF1bHRKcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCi17CQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBleGVjdXRpb25FdmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gCi0JCQlIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3dDaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKLQkJCi0JCWZpbmFsIExpc3Q8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gbmV3QXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IAotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uQ2hlY2tlZChleGVjdXRpb25FdmVudCk7Ci0JCQotCQkvLyBvbmx5IGFwcGxpZXMgZm9yIG11bHRpcGx5IHNlbGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2JqZWN0cyBpbiBhIHRyZWUKLQkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IChJdGVyYWJsZTxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPikgQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHNlbGVjdGlvbi5pdGVyYXRvcigpKSkgewotCQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGF0dHJpYnV0ZS5nZXRPcm1QZXJzaXN0ZW50VHlwZSgpOwotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJYXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXR0cmlidXRlID0gdHlwZS5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChuZXdBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCW5ld0F0dHJpYnV0ZXMuYWRkKG5ld0F0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZXdBdHRyaWJ1dGVzLnNpemUoKSA9PSAxKSB7Ci0JCQl3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyID0gU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcih3aW5kb3cpOwotCQkJCQkJc2VsZWN0aW9uTWFuYWdlci5zZWxlY3QobmV3IERlZmF1bHRKcGFTZWxlY3Rpb24obmV3QXR0cmlidXRlcy5nZXQoMCkpLCBudWxsKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MWJhNGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudENsYXNzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kaWFsb2dzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkRlZmF1bHRKcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotcHVibGljIGNsYXNzIEFkZFBlcnNpc3RlbnRDbGFzc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKLXsKLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IAotCQkJSGFuZGxlclV0aWwuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93Q2hlY2tlZChleGVjdXRpb25FdmVudCk7Ci0JCQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gCi0JCQk9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOwotCQkKLQkJLy8gb25seSBhcHBsaWVzIGZvciBhIHNpbmdseSBzZWxlY3RlZCBFbnRpdHlNYXBwaW5ncyBvYmplY3QgaW4gYSB0cmVlCi0JCUVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0KLQkJCShFbnRpdHlNYXBwaW5ncykgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkKLQkJQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nIGRpYWxvZyA9IAotCQkJbmV3IEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZyh3aW5kb3cuZ2V0U2hlbGwoKSwgZW50aXR5TWFwcGluZ3MpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmluYWwgT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGRpYWxvZy5vcGVuQW5kUmV0dXJuVHlwZSgpOwotCQkKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9IFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIod2luZG93KTsKLQkJCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2VsZWN0KG5ldyBEZWZhdWx0SnBhU2VsZWN0aW9uKHR5cGUpLCBudWxsKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZmJiY2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tZW51cy5QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklFbGVtZW50VXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5VSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc2VydmljZXMuSUV2YWx1YXRpb25TZXJ2aWNlOwotCi0vKioKLSAqIFRoaXMgaGFuZGxlciBpcyByZXNwb25zaWJsZSB0byBjaGFuZ2UgdGhlIG1hcHBpbmcgdHlwZSBvZiB0aGUgc2VsZWN0ZWQKLSAqIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGU8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGhhbmRsZXIgaXMgZGVmaW5lZCBpbiB0aGUgSlBUIHBsdWdpbi54bWwuIEl0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUKLSAqIG1hcHBpbmcgYWN0aW9uIGR5bmFtaWNhbGx5IGNyZWF0ZWQgYnkgdGhlIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbjwvY29kZT4uCi0gKgotICogQHNlZSBQZXJzaXN0ZW50QXR0cmlidXRlCi0gKiBAc2VlIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCi0JaW1wbGVtZW50cyBJRWxlbWVudFVwZGF0ZXIKLXsKLQkvKioKLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIE1hcCBBcyBjb21tYW5kIHVzZWQgZm9yIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGU8L2NvZGU+Ci0JICogZGVmaW5lZCBpbiB0aGUgPGNvZGU+SnB0VWlQbHVnaW48L2NvZGU+IHBsdWdpbi54bWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9JRCA9ICJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzIjsKLQkKLQkvKioKLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIE1hcCBBcyBjb21tYW5kIHBhcmFtZXRlciB1c2VkIGZvciA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlPC9jb2RlPgotCSAqIGRlZmluZWQgaW4gdGhlIDxjb2RlPkpwdFVpUGx1Z2luPC9jb2RlPiBwbHVnaW4ueG1sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfUEFSQU1FVEVSX0lEID0gInBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBwaW5nS2V5IjsKLQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSBFeGVjdXRpb25FdmVudAotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQlIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uQ2hlY2tlZChldmVudCk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSB1bmlxdWUgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgY29tbWFuZAotCQlTdHJpbmcgbWFwcGluZ0tleSA9IGV2ZW50LmdldFBhcmFtZXRlcihDT01NQU5EX1BBUkFNRVRFUl9JRCk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSBtYXBwaW5nIGtleSBmb3IgYWxsIHRoZSBzZWxlY3RlZCBpdGVtcwotCQlmb3IgKE9iamVjdCBpdGVtIDogc2VsZWN0aW9uLnRvQXJyYXkoKSkgewotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoUGVyc2lzdGVudEF0dHJpYnV0ZSkgaXRlbTsKLQkJCWF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KG1hcHBpbmdLZXkpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoVUlFbGVtZW50IGVsZW1lbnQsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCS8vIFJldHJpZXZlIHRoZSBzZWxlY3Rpb24gZm9yIHRoZSBVSUVsZW1lbnQKLQkJCi0JCS8vIER1ZSB0byBCdWcgMjI2NzQ2LCB3ZSBoYXZlIHRvIHVzZSBBUEkgd29ya2Fyb3VuZCB0byByZXRyaWV2ZSBjdXJyZW50IAotCQkvLyBzZWxlY3Rpb24KLQkJSUV2YWx1YXRpb25TZXJ2aWNlIGVzIAotCQkJPSAoSUV2YWx1YXRpb25TZXJ2aWNlKSBlbGVtZW50LmdldFNlcnZpY2VMb2NhdG9yKCkuZ2V0U2VydmljZShJRXZhbHVhdGlvblNlcnZpY2UuY2xhc3MpOwotCQlJVmlld1BhcnQgcGFydCA9IAotCQkJKElWaWV3UGFydCkgZXMuZ2V0Q3VycmVudFN0YXRlKCkuZ2V0VmFyaWFibGUoSVNvdXJjZXMuQUNUSVZFX1BBUlRfTkFNRSk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiAKLQkJCT0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkKLQkJU3RyaW5nIGNvbW1vbk1hcHBpbmdLZXkgPSBjb21tb25NYXBwaW5nS2V5KHNlbGVjdGlvbik7Ci0JCQotCQlTdHJpbmcgaGFuZGxlck1hcHBpbmdLZXkgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChDT01NQU5EX1BBUkFNRVRFUl9JRCk7Ci0JCWlmIChoYW5kbGVyTWFwcGluZ0tleSAhPSBudWxsKSB7Ci0JCQllbGVtZW50LnNldENoZWNrZWQoaGFuZGxlck1hcHBpbmdLZXkuZXF1YWxzKGNvbW1vbk1hcHBpbmdLZXkpKTsKLQkJfQotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1vbk1hcHBpbmdLZXkoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVN0cmluZyBjb21tb25LZXkgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIHN0cmVhbSA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU9iamVjdCBvYmogPSBzdHJlYW0ubmV4dCgpOwotCQkJCi0JCQlpZiAoISAob2JqIGluc3RhbmNlb2YgUGVyc2lzdGVudEF0dHJpYnV0ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9iajsKLQkJCQotCQkJaWYgKGNvbW1vbktleSA9PSBudWxsKSB7Ci0JCQkJY29tbW9uS2V5ID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCk7Ci0JCQl9Ci0JCQllbHNlIGlmICghIGNvbW1vbktleS5lcXVhbHMocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbW1vbktleTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9QZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvUGVyc2lzdGVudFR5cGVNYXBBc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFhOTAzMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9QZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWVudXMuUGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSUVsZW1lbnRVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1lbnVzLlVJRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5zZXJ2aWNlcy5JRXZhbHVhdGlvblNlcnZpY2U7Ci0KLS8qKgotICogVGhpcyBoYW5kbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlIG9mIHRoZSBzZWxlY3RlZAotICogPGNvZGU+UGVyc2lzdGVudFR5cGU8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGhhbmRsZXIgaXMgZGVmaW5lZCBpbiB0aGUgSlBUIHBsdWdpbi54bWwuIEl0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUKLSAqIG1hcHBpbmcgYWN0aW9uIGR5bmFtaWNhbGx5IGNyZWF0ZWQgYnkgdGhlIDxjb2RlPlBlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb248L2NvZGU+LgotICoKLSAqIEBzZWUgUGVyc2lzdGVudFR5cGUKLSAqIEBzZWUgUGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlcgotCWltcGxlbWVudHMgSUVsZW1lbnRVcGRhdGVyCi17Ci0JLyoqCi0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBNYXAgQXMgY29tbWFuZCB1c2VkIGZvciB7QGxpbmsgUGVyc2lzdGVudFR5cGV9Ci0JICogZGVmaW5lZCBpbiB0aGUgPGNvZGU+SnB0VWlQbHVnaW48L2NvZGU+IHBsdWdpbi54bWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9JRCA9ICJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVudFR5cGVNYXBBcyI7Ci0JCi0JLyoqCi0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBNYXAgQXMgY29tbWFuZCBwYXJhbWV0ZXIgdXNlZCBmb3Ige0BsaW5rIFBlcnNpc3RlbnRUeXBlfQotCSAqIGRlZmluZWQgaW4gdGhlIDxjb2RlPkpwdFVpUGx1Z2luPC9jb2RlPiBwbHVnaW4ueG1sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfUEFSQU1FVEVSX0lEID0gInBlcnNpc3RlbnRUeXBlTWFwcGluZ0tleSI7Ci0JCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlcjwvY29kZT4uCi0JICovCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlTWFwQXNIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSBFeGVjdXRpb25FdmVudAotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQlIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uQ2hlY2tlZChldmVudCk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSB1bmlxdWUgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgY29tbWFuZAotCQlTdHJpbmcgbWFwcGluZ0tleSA9IGV2ZW50LmdldFBhcmFtZXRlcihDT01NQU5EX1BBUkFNRVRFUl9JRCk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSBtYXBwaW5nIGtleSBmb3IgYWxsIHRoZSBzZWxlY3RlZCBpdGVtcwotCQlmb3IgKE9iamVjdCBpdGVtIDogc2VsZWN0aW9uLnRvQXJyYXkoKSkgewotCQkJUGVyc2lzdGVudFR5cGUgdHlwZSA9IChQZXJzaXN0ZW50VHlwZSkgaXRlbTsKLQkJCXR5cGUuc2V0TWFwcGluZ0tleShtYXBwaW5nS2V5KTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50KFVJRWxlbWVudCBlbGVtZW50LCBNYXAgcGFyYW1ldGVycykgewotCQkvLyBSZXRyaWV2ZSB0aGUgc2VsZWN0aW9uIGZvciB0aGUgVUlFbGVtZW50Ci0JCQotCQkvLyBEdWUgdG8gQnVnIDIyNjc0Niwgd2UgaGF2ZSB0byB1c2UgQVBJIHdvcmthcm91bmQgdG8gcmV0cmlldmUgY3VycmVudCAKLQkJLy8gc2VsZWN0aW9uCi0JCUlFdmFsdWF0aW9uU2VydmljZSBlcyAKLQkJCT0gKElFdmFsdWF0aW9uU2VydmljZSkgZWxlbWVudC5nZXRTZXJ2aWNlTG9jYXRvcigpLmdldFNlcnZpY2UoSUV2YWx1YXRpb25TZXJ2aWNlLmNsYXNzKTsKLQkJSVZpZXdQYXJ0IHBhcnQgPSAKLQkJCShJVmlld1BhcnQpIGVzLmdldEN1cnJlbnRTdGF0ZSgpLmdldFZhcmlhYmxlKElTb3VyY2VzLkFDVElWRV9QQVJUX05BTUUpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gCi0JCQk9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCi0JCVN0cmluZyBjb21tb25NYXBwaW5nS2V5ID0gY29tbW9uTWFwcGluZ0tleShzZWxlY3Rpb24pOwotCQkKLQkJU3RyaW5nIGhhbmRsZXJNYXBwaW5nS2V5ID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQ09NTUFORF9QQVJBTUVURVJfSUQpOwotCQlpZiAoaGFuZGxlck1hcHBpbmdLZXkgIT0gbnVsbCkgewotCQkJZWxlbWVudC5zZXRDaGVja2VkKGhhbmRsZXJNYXBwaW5nS2V5LmVxdWFscyhjb21tb25NYXBwaW5nS2V5KSk7Ci0JCX0KLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFN0cmluZyBjb21tb25NYXBwaW5nS2V5KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlTdHJpbmcgY29tbW9uS2V5ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBzdHJlYW0gPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3Qgb2JqID0gc3RyZWFtLm5leHQoKTsKLQkJCQotCQkJaWYgKCEgKG9iaiBpbnN0YW5jZW9mIFBlcnNpc3RlbnRUeXBlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IChQZXJzaXN0ZW50VHlwZSkgb2JqOwotCQkJCi0JCQlpZiAoY29tbW9uS2V5ID09IG51bGwpIHsKLQkJCQljb21tb25LZXkgPSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nS2V5KCk7Ci0JCQl9Ci0JCQllbHNlIGlmICghIGNvbW1vbktleS5lcXVhbHMocGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZ0tleSgpKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb21tb25LZXk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvUmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZUZyb21YbWxIYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9SZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViZDM4ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9SZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkRlZmF1bHRKcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKLXsJCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV4ZWN1dGlvbkV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSAKLQkJCUhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOwotCQkKLQkJZmluYWwgTGlzdDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBuZXdBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQkKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gCi0JCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIEhhbmRsZXJVdGlsLmdldEN1cnJlbnRTZWxlY3Rpb25DaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKLQkJCi0JCS8vIG9ubHkgYXBwbGllcyBmb3IgbXVsdGlwbHkgc2VsZWN0ZWQgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvYmplY3RzIGluIGEgdHJlZQotCQlmb3IgKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogKEl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KSBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoc2VsZWN0aW9uLml0ZXJhdG9yKCkpKSB7Ci0JCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gYXR0cmlidXRlLmdldE9ybVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCQlhdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXR0cmlidXRlID0gdHlwZS5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChuZXdBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCW5ld0F0dHJpYnV0ZXMuYWRkKG5ld0F0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZXdBdHRyaWJ1dGVzLnNpemUoKSA9PSAxKSB7Ci0JCQl3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyID0gU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcih3aW5kb3cpOwotCQkJCQkJc2VsZWN0aW9uTWFuYWdlci5zZWxlY3QobmV3IERlZmF1bHRKcGFTZWxlY3Rpb24obmV3QXR0cmlidXRlcy5nZXQoMCkpLCBudWxsKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1JlbW92ZVBlcnNpc3RlbnRDbGFzc0hhbmRsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1JlbW92ZVBlcnNpc3RlbnRDbGFzc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2MDE5My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9SZW1vdmVQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCi17Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV4ZWN1dGlvbkV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gCi0JCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIEhhbmRsZXJVdGlsLmdldEN1cnJlbnRTZWxlY3Rpb25DaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKLQkJCi0JCS8vIG9ubHkgYXBwbGllcyBmb3IgbXVsdGlwbHkgc2VsZWN0ZWQgT3JtUGVyc2lzdGVudFR5cGUgb2JqZWN0cyBpbiBhIHRyZWUKLQkJZm9yIChJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gc3RyZWFtID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJcGVyc2lzdGVudFR5cGUuZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVPcm1QZXJzaXN0ZW50VHlwZShwZXJzaXN0ZW50VHlwZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RKcGFEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEpwYURldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYWI0MzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEpwYURldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtVWlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIHRoZSBkZXRhaWxzIHZpZXcuCi0gKgotICogQHNlZSBKcGFDb250ZXh0Tm9kZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFEZXRhaWxzUGFnZTxUIGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4KLQlleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8VD4KLQlpbXBsZW1lbnRzIEpwYURldGFpbHNQYWdlPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSnBhRGV0YWlsc1BhZ2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKcGFEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4oKSwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpKCkgewotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOwotCQlyZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuanBhUGxhdGZvcm0ocGxhdGZvcm1JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVVpRmFjdG9yeSBqcGFVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBqcGFQbGF0Zm9ybVVpKCkuZ2V0SnBhVWlGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhlcmUgaXMgYW4gaXNzdWUgd2l0aCA8Y29kZT5TY3JvbGxlZEZvcm08L2NvZGU+LCBpdCBkb2Vzbid0IHJlcGFpbnQgdGhlCi0JICogZW50aXJlIGNvbnRlbnQsIHRoaXMgd2lsbCByZXRyaWV2ZSBpdCBieSBnb2luZyB1cCB0aGUgaGllcmFyY2h5IG9mIHRoZQotCSAqIGdpdmVuIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gYW5kIGZvcmNlIGEgcmVmbG93IG9uIGl0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIHVzZWQgdG8gZmluZCB0aGUgPGNvZGU+U2Nyb2xsZWRGb3JtPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlcGFpbnREZXRhaWxzVmlldyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsICYmCi0JCSAgICAgIShjb250YWluZXIgaW5zdGFuY2VvZiBTY3JvbGxlZEZvcm0pKQotCQl7Ci0JCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCVNjcm9sbGVkRm9ybSBzY3JvbGxlZEZvcm0gPSAoU2Nyb2xsZWRGb3JtKSBjb250YWluZXI7Ci0JCQlzY3JvbGxlZEZvcm0ucmVmbG93KHRydWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0U3ViamVjdChUIHN1YmplY3QpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4pIGdldFN1YmplY3RIb2xkZXIoKTsKLQotCQkvLyBQb3B1bGF0ZSB0aGlzIHBhZ2Ugd2l0aCB0aGUgbmV3IHN1YmplY3QKLQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShzdWJqZWN0KTsKLQkJCXBvcHVsYXRlKCk7Ci0JCX0KLQkJLy8gRGlzcG9zZSB0aGlzIHBhZ2UKLQkJZWxzZSB7Ci0JCQlkaXNlbmdhZ2VMaXN0ZW5lcnMoKTsKLQkJCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNpY01hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2ljTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0MzUzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2ljTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPEJhc2ljTWFwcGluZz4KLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgQmFzaWNNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBCYXNpY01hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8QmFzaWNNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQlKcGFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQmFzaWNNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfQmFzaWNMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkYWJsZVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkYWJsZVVpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjOGZkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGFibGVVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVtYmVkZGFibGVVaVByb3ZpZGVyIGltcGxlbWVudHMgVHlwZU1hcHBpbmdVaVByb3ZpZGVyPEVtYmVkZGFibGU+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1iZWRkYWJsZVVpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRW1iZWRkYWJsZVVpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHlwZU1hcHBpbmdVaVByb3ZpZGVyPEVtYmVkZGFibGU+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRhYmxlVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50VHlwZVBhZ2VfRW1iZWRkYWJsZUxhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZFBlcnNpc3RlbnRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVFbWJlZGRhYmxlQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTFkZWRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8RW1iZWRkZWRJZE1hcHBpbmc+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPEVtYmVkZGVkSWRNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0VtYmVkZGVkSWRMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCUpwYVVpRmFjdG9yeSBmYWN0b3J5LAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTg1YjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxFbWJlZGRlZE1hcHBpbmc+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8RW1iZWRkZWRNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9FbWJlZGRlZExhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lkTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSWRNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGE0MDE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSWRNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSWRNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8SWRNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIElkTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSWRNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxJZE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBJZE1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0lkTGFiZWw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQlKcGFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YTRiYmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxNYW55VG9NYW55TWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPE1hbnlUb01hbnlNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9NYW55VG9NYW55TGFiZWw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQlKcGFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiNjNkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPE1hbnlUb09uZU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8TWFueVRvT25lTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX01hbnlUb09uZUxhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2QyMTdhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5UeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXIgaW1wbGVtZW50cyBUeXBlTWFwcGluZ1VpUHJvdmlkZXI8TWFwcGVkU3VwZXJjbGFzcz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBNYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBUeXBlTWFwcGluZ1VpUHJvdmlkZXI8TWFwcGVkU3VwZXJjbGFzcz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50VHlwZVBhZ2VfTWFwcGVkU3VwZXJjbGFzc0xhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZFBlcnNpc3RlbnRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9PbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9PbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjZlNWM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8T25lVG9NYW55TWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxPbmVUb01hbnlNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfT25lVG9NYW55TGFiZWw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQlKcGFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTVmYmM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8T25lVG9PbmVNYXBwaW5nPgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPE9uZVRvT25lTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9PbmVUb09uZUxhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BhZ2VCb29rTWFuYWdlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QYWdlQm9va01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzYjhmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BhZ2VCb29rTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgVmVyc2FudC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6IFZlcnNhbnQuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogQSB3cmFwcGVyIGZvciBhIDxjb2RlPlBhZ2VCb29rPC9jb2RlPiB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlQm9va01hbmFnZXIgZXh0ZW5kcyBQYWdlQm9vayB7Ci0KLQlwcml2YXRlIE1hcDxPYmplY3QsIENvbXBvc2l0ZT4gcGFnZVJlY29yZHM7Ci0JcHJpdmF0ZSBPYmplY3QgYWN0aXZlOwotCXByaXZhdGUgUGFnZUJvb2sgcGFnZUJvb2s7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgZGVmYXVsdENvbXBvc2l0ZTsKLQotCS8qKgotCSAqIEEgPGNvZGU+UGFnZUJvb2tNYW5hZ2VyPGNvZGU+IGlzIGEgd3JhcHBlciBmb3IgYSA8Y29kZT5QYWdlQm9vazwvY29kZT4uIEl0IHByb3ZpZGVzCi0JICogY29udmVuaWVuY2UgbWV0aG9kcyB0byBhZGQsIHJlbW92ZSwgYWN0aXZhdGUgYW5kIGluYWN0aXZlIHBhZ2VzIGluIHRoZSBpbnRlcm5hbCA8Y29kZT5QYWdlQm9vazwvY29kZT4uCi0JICogSWYgYSBwYWdlIGdldHMgZGVhY3RpdmF0ZWQsIHRoZSBtYW5hZ2VyIGFjdGl2YXRlcyBhIGRlZmF1bHQgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUgdG8gdGhpcyBtYW5hZ2VyCi0JICogQHBhcmFtIGFEZWZhdWx0TGFiZWwgVGhlIGxhYmVsIG9uIHRoZSB0aGUgZGVmYXVsdCBwYWdlLgotCSAqLwotCXB1YmxpYyBQYWdlQm9va01hbmFnZXIoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGFEZWZhdWx0TGFiZWwpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXRoaXMuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLnBhZ2VSZWNvcmRzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBDb21wb3NpdGU+KCk7Ci0JCXRoaXMucGFnZUJvb2sgPSBuZXcgUGFnZUJvb2sodGhpcywgU1dULk5PTkUpOwotCQl0aGlzLmRlZmF1bHRDb21wb3NpdGUgPSBuZXcgRGVmYXVsdENvbXBvc2l0ZShwYWdlQm9vaywgYURlZmF1bHRMYWJlbCk7Ci0JCXRoaXMucGFnZUJvb2suc2hvd1BhZ2UodGhpcy5kZWZhdWx0Q29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5PYmogQWN0aXZhdGVzIChmbGlwcyB0byB0b3AgaW4gdGhlIDxjb2RlPlBhZ2VCb29rPC9jb2RlPikgdGhlIGFzc29jaWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPgotCSAqIGZvciB0aGUgZ2l2ZW4gPGNvZGU+T2JqZWN0PC9jb2RlPi4gQWN0aXZhdGVzIHRoZSA8Y29kZT5EZWZhdWx0Q29tcG9zaXRlPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBhc3NvY2lhdGlvbgotCSAqIGZvciB0aGUgZ2l2ZW4gPGNvZGU+T2JqZWN0PC9jb2RlPi4KLQkgKiBAcmV0dXJuIFJldHVybiBmYWxzZSBpZiB0aGVyZSBpcyBubyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IGFzc29jaWF0aW9uIHRvIHRoZSBnaXZlbiA8Y29kZT5PYmplY3Q8L2NvZGU+IG9yCi0JICogdGhlIGFzc29jaWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBpcyBhbHJlYWR5IGFjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY3RpdmF0ZShPYmplY3QgYW5PYmopIHsKLQkJaWYoYW5PYmogIT0gbnVsbCAmJiAhYW5PYmouZXF1YWxzKHRoaXMuYWN0aXZlKSAmJiB0aGlzLnBhZ2VSZWNvcmRzLmNvbnRhaW5zS2V5KGFuT2JqKSkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRoaXMucGFnZVJlY29yZHMuZ2V0KGFuT2JqKTsKLQkJCXRoaXMucGFnZUJvb2suc2hvd1BhZ2UoY29tcG9zaXRlKTsKLQkJCXRoaXMuYWN0aXZlID0gYW5PYmo7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmKChhbk9iaiA9PSBudWxsIHx8ICFhbk9iai5lcXVhbHModGhpcy5hY3RpdmUpKSAmJiAhdGhpcy5wYWdlUmVjb3Jkcy5jb250YWluc0tleShhbk9iaikpIHsKLQkJCXRoaXMucGFnZUJvb2suc2hvd1BhZ2UodGhpcy5kZWZhdWx0Q29tcG9zaXRlKTsKLQkJCXRoaXMuYWN0aXZlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuT2JqCi0JICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIGFzc29jaWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBoYXMgYmVlbiBkZWFjdGl2YXRlZC4KLQkgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIG5vIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gZm9yIHRoZSBnaXZlbiA8Y29kZT5PYmplY3Q8L2NvZGU+Ci0JICogb3IgdGhlIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gaXMgYWxyZWFkeSBpbmFjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkZWFjdGl2YXRlKE9iamVjdCBhbk9iaikgewotCQlpZihhbk9iai5lcXVhbHModGhpcy5hY3RpdmUpKSB7Ci0JCQl0aGlzLnBhZ2VCb29rLnNob3dQYWdlKHRoaXMuZGVmYXVsdENvbXBvc2l0ZSk7Ci0JCQl0aGlzLmFjdGl2ZSA9IG51bGw7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotICAgICAqIEFzc29jaWF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5PYmplY3Q8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogaW4gdGhpcyA8Y29kZT5QYWdlQm9va01hbmFnZXI8L2NvZGU+LgotICAgICAqIElmIHRoaXMgbWFuYWdlciBwcmV2aW91c2x5IGNvbnRhaW5lZCBhIG1hcHBpbmcgZm9yIHRoZSA8Y29kZT5PYmplY3Q8L2NvZGU+LCB0aGUgb2xkCi0gICAgICogPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBpcyByZXBsYWNlZCBieSB0aGUgc3BlY2lmaWVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0gICAgICoKLQkgKiBAcGFyYW0gYW5PYmogPGNvZGU+T2JqZWN0PC9jb2RlPiB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBpcyB0byBiZSBhc3NvY2lhdGVkLgotCSAqIEBwYXJhbSBhQ29tcG9zaXRlIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgPGNvZGU+T2JqZWN0PC9jb2RlPi4KLQkgKgotICAgICAqIEByZXR1cm4gcHJldmlvdXMgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIDxjb2RlPk9iamVjdDwvY29kZT4sCi0gICAgICogCQkgICBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nIGZvciA8Y29kZT5PYmplY3Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgcHV0KE9iamVjdCBhbk9iaiwgQ29tcG9zaXRlIGFDb21wb3NpdGUpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRoaXMucGFnZVJlY29yZHMucHV0KGFuT2JqLCBhQ29tcG9zaXRlKTsKLQkJdGhpcy5hY3RpdmF0ZShhbk9iaik7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyBmb3IgdGhpcyA8Y29kZT5PYmplY3Q8L2NvZGU+IGZyb20gdGhpcyBwYWdlYm9va21hbmFnZXIgaWYgaXQgaXMgcHJlc2VudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhbk9iaiA8Y29kZT5PYmplY3Q8L2NvZGU+IHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoaXMgPGNvZGU+UGFnZUJvb2tNYW5hZ2VyPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIHByZXZpb3VzIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCA8Y29kZT5PYmplY3Q8L2NvZGU+LgotICAgICAqLwotCXB1YmxpYyBDb21wb3NpdGUgcmVtb3ZlKE9iamVjdCBhbk9iaikgewotCQlpZihhbk9iai5lcXVhbHModGhpcy5hY3RpdmUpKSB7Ci0JCQl0aGlzLmFjdGl2ZSA9IG51bGw7Ci0JCQl0aGlzLnBhZ2VCb29rLnNob3dQYWdlKHRoaXMuZGVmYXVsdENvbXBvc2l0ZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucGFnZVJlY29yZHMucmVtb3ZlKGFuT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5PYmogd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBtYXAgaXMgdG8gYmUgdGVzdGVkCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgPGNvZGU+UGFnZUJvb2tNYW5hZ2VyPC9jb2RlPiBjb250YWlucyBhIG1hcHBpbmcgZm9yIHRoZQotCSAqIAkJICAgZ2l2ZW4gPGNvZGU+T2JqZWN0PC9jb2RlPi4gRmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBhbk9iaikgewotCQlyZXR1cm4gdGhpcy5wYWdlUmVjb3Jkcy5jb250YWluc0tleShhbk9iaik7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBnZXQoT2JqZWN0IGtleSkgewotCQlyZXR1cm4gcGFnZVJlY29yZHMuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUaGUgY3VycmVudGx5IGFjdGl2ZSBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGdldEFjdGl2ZSgpIHsKLQkJaWYodGhpcy5hY3RpdmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuZGVmYXVsdENvbXBvc2l0ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0aGlzLnBhZ2VSZWNvcmRzLmdldCh0aGlzLmFjdGl2ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBpbnRlcm5hbCA8Y29kZT5QYWdlQm9vazwvY29kZT4gb2YgdGhpcyA8Y29kZT5QYWdlQm9va01hbmFnZXI8L2NvZGU+LgotCSAqIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT5zIHdoaWNoIHNob3VsZCB3b3JrIHdpdGggdGhpcyBtYW5hZ2VyIG5lZWRzIHRvIGJlIGNyZWF0ZWQKLQkgKiB3aXRoIHRoaXMgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBhcyB0aGVpciBwYXJlbnQgY29tcG9zaXRlLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Q29tcG9zaXRlKCkgewotCQlyZXR1cm4gdGhpcy5wYWdlQm9vazsKLQl9Ci0KLQkvLyBhIGRlZmF1bHQgY29tcG9zaXRlIHdoaWNoIGlzIHNob3cgaWYgdGhlIGFjdGl2ZSBjb21wb3NpdGUKLQkvLyBnZXRzIGRlYWN0aXZhdGVkCi0JcHJpdmF0ZSBjbGFzcyBEZWZhdWx0Q29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQkJcHVibGljIERlZmF1bHRDb21wb3NpdGUoQ29tcG9zaXRlIGFQYXJlbnQsIFN0cmluZyBhRGVmYXVsdExhYmVsKSB7Ci0JCQlzdXBlcihhUGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlzZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTEVGVCk7Ci0JCQlsYWJlbC5zZXRUZXh0KGFEZWZhdWx0TGFiZWwpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlmb3IgKENvbXBvc2l0ZSBwYW5lIDogdGhpcy5wYWdlUmVjb3Jkcy52YWx1ZXMoKSkgewotCQkJcGFuZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1ZTNmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiB0aGUgZGV0YWlscyBwYWdlIHJlc3BvbnNpYmxlIHRvIHNob3cgdGhlCi0gKiBpbmZvcm1hdGlvbiBmb3IgYW4gcGVyc2lzdGVudCBhdHRyaWJ1dGUuCi0gKgotICogQHNlZSBQZXJzaXN0ZW50QXR0cmlidXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZTxUIGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZT4gZXh0ZW5kcyBBYnN0cmFjdEpwYURldGFpbHNQYWdlPFQ+Ci17Ci0JcHJpdmF0ZSBKcGFDb21wb3NpdGUgY3VycmVudE1hcHBpbmdDb21wb3NpdGU7Ci0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudE1hcHBpbmdLZXk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBKcGFDb21wb3NpdGU+IG1hcHBpbmdDb21wb3NpdGVzOwotCXByaXZhdGUgUGFnZUJvb2sgbWFwcGluZ1BhZ2VCb29rOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW50QXR0cmlidXRlLkRFRkFVTFRfTUFQUElOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbnRBdHRyaWJ1dGUuU1BFQ0lGSUVEX01BUFBJTkdfUFJPUEVSVFkpOwotCX0KLQotCXByb3RlY3RlZCBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoU3RyaW5nIGtleSkgewotCQlmb3IgKEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gaSA9IGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gcHJvdmlkZXIgPSBpLm5leHQoKTsKLQkJCWlmIChwcm92aWRlci5nZXRNYXBwaW5nS2V5KCkgPT0ga2V5KSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGF0dHJpYnV0ZSBtYXBwaW5nIFVJIHByb3ZpZGVyIGtleTogIik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4KLQkJYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+W10KLQkJYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzRm9yKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0KLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50QXR0cmlidXRlLCBBdHRyaWJ1dGVNYXBwaW5nPiBidWlsZEdlbmVyaWNNYXBwaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50QXR0cmlidXRlLCBBdHRyaWJ1dGVNYXBwaW5nPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCVBlcnNpc3RlbnRBdHRyaWJ1dGUuREVGQVVMVF9NQVBQSU5HX1BST1BFUlRZLAotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZS5TUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQXR0cmlidXRlTWFwcGluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEpwYUNvbXBvc2l0ZSBidWlsZE1hcHBpbmdDb21wb3NpdGUoUGFnZUJvb2sgcGFnZUJvb2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQotCQlBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxBdHRyaWJ1dGVNYXBwaW5nPiB1aVByb3ZpZGVyID0KLQkJCShBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxBdHRyaWJ1dGVNYXBwaW5nPikgbWFwcGluZ1VJUHJvdmlkZXIobWFwcGluZ0tleSk7Ci0KLQkJcmV0dXJuIHVpUHJvdmlkZXIuYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJanBhVWlGYWN0b3J5KCksCi0JCQlidWlsZE1hcHBpbmdIb2xkZXIobWFwcGluZ0tleSksCi0JCQlwYWdlQm9vaywKLQkJCWdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPEF0dHJpYnV0ZU1hcHBpbmc+IGJ1aWxkTWFwcGluZ0ZpbHRlcihTdHJpbmcgbWFwcGluZ0tleSkgewotCQlyZXR1cm4gbmV3IE1hcHBpbmdGaWx0ZXIobWFwcGluZ0tleSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlTWFwcGluZz4gYnVpbGRNYXBwaW5nSG9sZGVyKGZpbmFsIFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlTWFwcGluZz4oCi0JCQlidWlsZEdlbmVyaWNNYXBwaW5nSG9sZGVyKCksCi0JCQlidWlsZE1hcHBpbmdGaWx0ZXIoa2V5KQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBidWlsZE1hcHBpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBidWlsZExhYmVsKHBhcmVudCwgSnB0VWlNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9tYXBBcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFBhZ2VCb29rIGJ1aWxkTWFwcGluZ1BhZ2VCb29rKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5tYXBwaW5nUGFnZUJvb2sgPSBuZXcgUGFnZUJvb2socGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMubWFwcGluZ1BhZ2VCb29rLnNob3dQYWdlKHRoaXMuYnVpbGRMYWJlbCh0aGlzLm1hcHBpbmdQYWdlQm9vaywgIiIpKTsKLQkJcmV0dXJuIHRoaXMubWFwcGluZ1BhZ2VCb29rOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4KLQkJZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKFN0cmluZyBrZXkpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4KLQkJZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCQlsb2coVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsICJQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuZG9EaXNwb3NlKCkiKTsKLQotCQlpZiAodGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJCXRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUgPSBudWxsOwotCQl9Ci0KLQkJdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy5jbGVhcigpOwotCQlzdXBlci5kb0Rpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXVwZGF0ZU1hcHBpbmdQYWdlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLm1hcHBpbmdDb21wb3NpdGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKcGFDb21wb3NpdGU+KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBmbGFnLCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlci5sb2coZmxhZywgbWVzc2FnZSk7Ci0KLQkJaWYgKFRyYWNpbmcuVUlfREVUQUlMU19WSUVXLmVxdWFscyhmbGFnKSAmJgotCQkgICAgVHJhY2luZy5ib29sZWFuRGVidWdPcHRpb24oVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcpKQotCQl7Ci0JCQlUcmFjaW5nLmxvZyhtZXNzYWdlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSnBhQ29tcG9zaXRlIG1hcHBpbmdDb21wb3NpdGVGb3IoU3RyaW5nIGtleSkgewotCQlKcGFDb21wb3NpdGUgY29tcG9zaXRlID0gdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy5nZXQoa2V5KTsKLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0KLQkJY29tcG9zaXRlID0gYnVpbGRNYXBwaW5nQ29tcG9zaXRlKHRoaXMubWFwcGluZ1BhZ2VCb29rLCBrZXkpOwotCi0JCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotCQkJdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy5wdXQoa2V5LCBjb21wb3NpdGUpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtYXBwaW5nUGFnZUNoYW5nZWQoSnBhQ29tcG9zaXRlIG1hcHBpbmdDb21wb3NpdGUpIHsKLQl9Ci0KLQlwcml2YXRlIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nVUlQcm92aWRlcihTdHJpbmcga2V5KSB7Ci0KLQkJaWYgKHRoaXMuc3ViamVjdCgpLmdldE1hcHBpbmcoKSA9PSBudWxsIHx8Ci0JCSAgICB0aGlzLnN1YmplY3QoKS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpIHsKLQotCQkJcmV0dXJuIGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcihrZXkpOwotCQl9Ci0KLQkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKGtleSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTWFwcGluZ1BhZ2UoU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQotCQkvLyBOb3RoaW5nIHRvIHVwZGF0ZQotCQlpZiAodGhpcy5jdXJyZW50TWFwcGluZ0tleSA9PSBtYXBwaW5nS2V5KSB7Ci0JCQl0aGlzLm1hcHBpbmdQYWdlQ2hhbmdlZCh0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlKTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBEaXNwb3NlIHRoZSBleGlzdGluZyBtYXBwaW5nIHBhbmUKLQkJZWxzZSBpZiAodGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmxvZygKLQkJCQlUcmFjaW5nLlVJX0RFVEFJTFNfVklFVywKLQkJCQkiUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLnBvcHVsYXRlTWFwcGluZ1BhZ2UoKSBkaXNwb3Npbmcgb2YgY3VycmVudCBwYWdlOiAiICsgdGhpcy5jdXJyZW50TWFwcGluZ0tleQotCQkJKTsKLQotCQkJdHJ5IHsKLQkJCQl0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJCQl0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlID0gbnVsbDsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuY3VycmVudE1hcHBpbmdLZXkgPSBtYXBwaW5nS2V5OwotCi0JCS8vIENoYW5nZSB0aGUgY3VycmVudCBtYXBwaW5nIHBhbmUgd2l0aCB0aGUgbmV3IG9uZQotCQlpZiAodGhpcy5jdXJyZW50TWFwcGluZ0tleSAhPSBudWxsKSB7Ci0JCQl0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlID0gbWFwcGluZ0NvbXBvc2l0ZUZvcihtYXBwaW5nS2V5KTsKLQotCQkJdHJ5IHsKLQkJCQl0aGlzLmxvZygKLQkJCQkJVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsCi0JCQkJCSJQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UucG9wdWxhdGVNYXBwaW5nUGFnZSgpIHBvcHVsYXRpbmcgbmV3IHBhZ2U6ICIgKyB0aGlzLmN1cnJlbnRNYXBwaW5nS2V5Ci0JCQkJKTsKLQotCQkJCXRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUucG9wdWxhdGUoKTsKLQkJCQl0aGlzLm1hcHBpbmdQYWdlQm9vay5zaG93UGFnZSh0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlLmdldENvbnRyb2woKSk7Ci0JCQkJdGhpcy5tYXBwaW5nUGFnZUNoYW5nZWQodGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0KLQkJCQl0aGlzLmxvZygKLQkJCQkJVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsCi0JCQkJCSJQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UucG9wdWxhdGVNYXBwaW5nUGFnZSgpIGVycm9yIGVuY291bnRlcmVkIgotCQkJCSk7Ci0KLQkJCQkvLyBBbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgZWl0aGVyIGR1cmluZyB0aGUgcG9wdWxhdGlvbiwgZGlzcG9zZSBpdAotCQkJCXRyeSB7Ci0JCQkJCXRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCi0JCQkJdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy5yZW1vdmUodGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSk7Ci0JCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSA9IG51bGw7Ci0KLQkJCQkvLyBTaG93IGFuIGVycm9yIG1lc3NhZ2UKLQkJCQkvLyBUT0RPOiBSZXBsYWNlIHRoZSBibGFuayBsYWJlbCB3aXRoIHRoZSBlcnJvciBwYWdlCi0JCQkJdGhpcy5tYXBwaW5nUGFnZUJvb2suc2hvd1BhZ2UodGhpcy5idWlsZExhYmVsKHRoaXMubWFwcGluZ1BhZ2VCb29rLCAiIikpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5sb2coCi0JCQkJVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsCi0JCQkJIlBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5wb3B1bGF0ZU1hcHBpbmdQYWdlKCkgbm8gcGFnZSB0byBzaG93IgotCQkJKTsKLQotCQkJdGhpcy5tYXBwaW5nUGFnZUJvb2suc2hvd1BhZ2UodGhpcy5idWlsZExhYmVsKHRoaXMubWFwcGluZ1BhZ2VCb29rLCAiIikpOwotCQl9Ci0JCXRoaXMucmVwYWludERldGFpbHNWaWV3KHRoaXMubWFwcGluZ1BhZ2VCb29rKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQotCQlpZiAocHJvcGVydHlOYW1lID09IFBlcnNpc3RlbnRBdHRyaWJ1dGUuREVGQVVMVF9NQVBQSU5HX1BST1BFUlRZIHx8Ci0JCSAgICBwcm9wZXJ0eU5hbWUgPT0gUGVyc2lzdGVudEF0dHJpYnV0ZS5TUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWSkgewotCi0JCQl1cGRhdGVNYXBwaW5nUGFnZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVwb3B1bGF0ZVdpdGhOdWxsU3ViamVjdCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVNYXBwaW5nUGFnZSgpIHsKLQkJQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gKHRoaXMuc3ViamVjdCgpICE9IG51bGwpID8gdGhpcy5zdWJqZWN0KCkuZ2V0TWFwcGluZygpIDogbnVsbDsKLQkJcG9wdWxhdGVNYXBwaW5nUGFnZShtYXBwaW5nID09IG51bGwgPyBudWxsIDogbWFwcGluZy5nZXRLZXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBNYXBwaW5nRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyPEF0dHJpYnV0ZU1hcHBpbmc+IHsKLQkJcHJpdmF0ZSBTdHJpbmcgbWFwcGluZ0tleTsKLQotCQlNYXBwaW5nRmlsdGVyKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5tYXBwaW5nS2V5ID0gbWFwcGluZ0tleTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCXJldHVybiAobWFwcGluZyA9PSBudWxsKSB8fCBtYXBwaW5nS2V5LmVxdWFscyhtYXBwaW5nLmdldEtleSgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWY1MjUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLlR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBkZWZpbml0aW9uIG9mIHRoZSBkZXRhaWxzIHBhZ2UgcmVzcG9uc2libGUgdG8gc2hvdyB0aGUKLSAqIGluZm9ybWF0aW9uIGZvciBhbiBwZXJzaXN0ZW50IHR5cGUuCi0gKgotICogQHNlZSBQZXJzaXN0ZW50VHlwZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPFQgZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZT4gZXh0ZW5kcyBBYnN0cmFjdEpwYURldGFpbHNQYWdlPFQ+Ci17Ci0JcHJpdmF0ZSBKcGFDb21wb3NpdGUgY3VycmVudE1hcHBpbmdDb21wb3NpdGU7Ci0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudE1hcHBpbmdLZXk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBKcGFDb21wb3NpdGU+IG1hcHBpbmdDb21wb3NpdGVzOwotCXByaXZhdGUgUGFnZUJvb2sgdHlwZU1hcHBpbmdQYWdlQm9vazsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVudFR5cGUuTUFQUElOR19QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVudFR5cGUsIFR5cGVNYXBwaW5nPiBidWlsZEdlbmVyaWNNYXBwaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50VHlwZSwgVHlwZU1hcHBpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVudFR5cGUuTUFQUElOR19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0TWFwcGluZygpOwotCQkJfQotCQl9OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBKcGFDb21wb3NpdGUgYnVpbGRNYXBwaW5nQ29tcG9zaXRlKFBhZ2VCb29rIHBhZ2VCb29rLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkpICB7Ci0KLQkJVHlwZU1hcHBpbmdVaVByb3ZpZGVyPFR5cGVNYXBwaW5nPiB1aVByb3ZpZGVyID0KLQkJCShUeXBlTWFwcGluZ1VpUHJvdmlkZXI8VHlwZU1hcHBpbmc+KSB0eXBlTWFwcGluZ1VpUHJvdmlkZXIoa2V5KTsKLQotCQlyZXR1cm4gdWlQcm92aWRlci5idWlsZFBlcnNpc3RlbnRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCWpwYVVpRmFjdG9yeSgpLAotCQkJYnVpbGRNYXBwaW5nSG9sZGVyKGtleSksCi0JCQlwYWdlQm9vaywKLQkJCWdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFR5cGVNYXBwaW5nPiBidWlsZE1hcHBpbmdGaWx0ZXIoZmluYWwgU3RyaW5nIGtleSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxUeXBlTWFwcGluZz4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoVHlwZU1hcHBpbmcgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlID09IG51bGwpIHx8IGtleS5lcXVhbHModmFsdWUuZ2V0S2V5KCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFR5cGVNYXBwaW5nPiBidWlsZE1hcHBpbmdIb2xkZXIoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4oCi0JCQlidWlsZEdlbmVyaWNNYXBwaW5nSG9sZGVyKCksCi0JCQlidWlsZE1hcHBpbmdGaWx0ZXIoa2V5KQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBQYWdlQm9vayBidWlsZFR5cGVNYXBwaW5nUGFnZUJvb2soQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMudHlwZU1hcHBpbmdQYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy50eXBlTWFwcGluZ1BhZ2VCb29rLnNob3dQYWdlKHRoaXMuYnVpbGRMYWJlbCh0aGlzLnR5cGVNYXBwaW5nUGFnZUJvb2ssICIiKSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICAgID0gU1dULlRPUDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOwotCi0JCXRoaXMudHlwZU1hcHBpbmdQYWdlQm9vay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlyZXR1cm4gdGhpcy50eXBlTWFwcGluZ1BhZ2VCb29rOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvRGlzcG9zZSgpIHsKLQkJbG9nKFRyYWNpbmcuVUlfREVUQUlMU19WSUVXLCAiUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5kb0Rpc3Bvc2UoKSIpOwotCi0JCWlmICh0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUuZGlzcG9zZSgpOwotCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSA9IG51bGw7Ci0JCX0KLQotCQl0aGlzLm1hcHBpbmdDb21wb3NpdGVzLmNsZWFyKCk7Ci0JCXN1cGVyLmRvRGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJdXBkYXRlTWFwcGluZ1BhZ2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpwYUNvbXBvc2l0ZT4oKTsKLQl9Ci0KLQlwcml2YXRlIEpwYUNvbXBvc2l0ZSBtYXBwaW5nQ29tcG9zaXRlRm9yKFN0cmluZyBrZXkpIHsKLQkJSnBhQ29tcG9zaXRlIG1hcHBpbmdDb21wb3NpdGUgPSB0aGlzLm1hcHBpbmdDb21wb3NpdGVzLmdldChrZXkpOwotCQlpZiAobWFwcGluZ0NvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWFwcGluZ0NvbXBvc2l0ZTsKLQkJfQotCi0JCW1hcHBpbmdDb21wb3NpdGUgPSBidWlsZE1hcHBpbmdDb21wb3NpdGUodGhpcy50eXBlTWFwcGluZ1BhZ2VCb29rLCBrZXkpOwotCi0JCWlmIChtYXBwaW5nQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMucHV0KGtleSwgbWFwcGluZ0NvbXBvc2l0ZSk7Ci0JCX0KLQotCQlyZXR1cm4gbWFwcGluZ0NvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVNYXBwaW5nUGFnZShTdHJpbmcgbWFwcGluZ0tleSkgewotCi0JCS8vIE5vdGhpbmcgdG8gdXBkYXRlCi0JCWlmICh0aGlzLmN1cnJlbnRNYXBwaW5nS2V5ID09IG1hcHBpbmdLZXkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBEaXNwb3NlIHRoZSBleGlzdGluZyBtYXBwaW5nIHBhbmUKLQkJZWxzZSBpZiAodGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmxvZygKLQkJCQlUcmFjaW5nLlVJX0RFVEFJTFNfVklFVywKLQkJCQkiUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5wb3B1bGF0ZU1hcHBpbmdQYWdlKCkgZGlzcG9zaW5nIG9mIGN1cnJlbnQgcGFnZTogIiArIHRoaXMuY3VycmVudE1hcHBpbmdLZXkKLQkJCSk7Ci0KLQkJCXRyeSB7Ci0JCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSA9IG51bGw7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmN1cnJlbnRNYXBwaW5nS2V5ID0gbWFwcGluZ0tleTsKLQotCQkvLyBDaGFuZ2UgdGhlIGN1cnJlbnQgbWFwcGluZyBwYW5lIHdpdGggdGhlIG5ldyBvbmUKLQkJaWYgKHRoaXMuY3VycmVudE1hcHBpbmdLZXkgIT0gbnVsbCkgewotCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSA9IG1hcHBpbmdDb21wb3NpdGVGb3IobWFwcGluZ0tleSk7Ci0KLQkJCS8vIFNob3cgdGhlIG5ldyBtYXBwaW5nIHBhbmUKLQkJCXRyeSB7Ci0JCQkJdGhpcy5sb2coCi0JCQkJCVRyYWNpbmcuVUlfREVUQUlMU19WSUVXLAotCQkJCQkiUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5wb3B1bGF0ZU1hcHBpbmdQYWdlKCkgcG9wdWxhdGluZyBuZXcgcGFnZTogIiArIHRoaXMuY3VycmVudE1hcHBpbmdLZXkKLQkJCQkpOwotCi0JCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCQkJCXRoaXMudHlwZU1hcHBpbmdQYWdlQm9vay5zaG93UGFnZSh0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlLmdldENvbnRyb2woKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0KLQkJCQl0aGlzLmxvZygKLQkJCQkJVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsCi0JCQkJCSJQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLnBvcHVsYXRlTWFwcGluZ1BhZ2UoKSBlcnJvciBlbmNvdW50ZXJlZCIKLQkJCQkpOwotCi0JCQkJLy8gQW4gZXJyb3Igd2FzIGVuY291bnRlcmVkIGVpdGhlciBkdXJpbmcgdGhlIHBvcHVsYXRpb24sIGRpc3Bvc2UgaXQKLQkJCQl0cnkgewotCQkJCQl0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQotCQkJCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMucmVtb3ZlKHRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUpOwotCQkJCXRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUgPSBudWxsOwotCi0JCQkJLy8gU2hvdyBhbiBlcnJvciBtZXNzYWdlCi0JCQkJLy8gVE9ETzogUmVwbGFjZSB0aGUgYmxhbmsgbGFiZWwgd2l0aCB0aGUgZXJyb3IgcGFnZQotCQkJCXRoaXMudHlwZU1hcHBpbmdQYWdlQm9vay5zaG93UGFnZSh0aGlzLmJ1aWxkTGFiZWwodGhpcy50eXBlTWFwcGluZ1BhZ2VCb29rLCAiIikpOwotCQkJfQotCQl9Ci0JCS8vIENsZWFyIHRoZSBtYXBwaW5nIHBhbmUgYW5kIHNob3cgYSBibGFuayBwYWdlCi0JCWVsc2UgewotCQkJdGhpcy5sb2coCi0JCQkJVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsCi0JCQkJIlBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UucG9wdWxhdGVNYXBwaW5nUGFnZSgpIG5vIHBhZ2UgdG8gc2hvdyIKLQkJCSk7Ci0KLQkJCXRoaXMudHlwZU1hcHBpbmdQYWdlQm9vay5zaG93UGFnZSh0aGlzLmJ1aWxkTGFiZWwodGhpcy50eXBlTWFwcGluZ1BhZ2VCb29rLCAiIikpOwotCQl9Ci0JCXRoaXMucmVwYWludERldGFpbHNWaWV3KHRoaXMudHlwZU1hcHBpbmdQYWdlQm9vayk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0KLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBQZXJzaXN0ZW50VHlwZS5NQVBQSU5HX1BST1BFUlRZKSB7Ci0JCQl1cGRhdGVNYXBwaW5nUGFnZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPiB0eXBlTWFwcGluZ1VpUHJvdmlkZXIoU3RyaW5nIGtleSkgewotCQlmb3IgKEl0ZXJhdG9yPFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBpdGVyID0gdGhpcy50eXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4gcHJvdmlkZXIgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChwcm92aWRlci5nZXRNYXBwaW5nS2V5KCkgPT0ga2V5KSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHR5cGUgbWFwcGluZyBVSSBwcm92aWRlciBrZXk6ICIgKyBrZXkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvcjxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gdHlwZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU1hcHBpbmdQYWdlKCkgewotCQlUeXBlTWFwcGluZyBtYXBwaW5nID0gKHRoaXMuc3ViamVjdCgpICE9IG51bGwpID8gdGhpcy5zdWJqZWN0KCkuZ2V0TWFwcGluZygpIDogbnVsbDsKLQkJcG9wdWxhdGVNYXBwaW5nUGFnZShtYXBwaW5nID09IG51bGwgPyBudWxsIDogbWFwcGluZy5nZXRLZXkoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5YjQ2Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1RyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPFRyYW5zaWVudE1hcHBpbmc+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxUcmFuc2llbnRNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX1RyYW5zaWVudExhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxUcmFuc2llbnRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ZlcnNpb25NYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGI0ODViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIFZlcnNpb25NYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8VmVyc2lvbk1hcHBpbmc+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPFZlcnNpb25NYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVmVyc2lvbkxhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RpYWxvZ3MvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MzlkMzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuU3RhdHVzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNpY01hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklkTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZyBleHRlbmRzIFN0YXR1c0RpYWxvZwotewotCXByaXZhdGUgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSB1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JcHJpdmF0ZSBUZXh0IGF0dHJpYnV0ZVRleHQ7Ci0JcHJpdmF0ZSBDb21ib1ZpZXdlciBtYXBwaW5nQ29tYm87Ci0KLQlwdWJsaWMgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHVubWFwcGVkUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMudW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlID0gdW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlOwotCQlzZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfdGl0bGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIDEsIEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ19hdHRyaWJ1dGVMYWJlbCk7Ci0KLQkJYXR0cmlidXRlVGV4dCA9IGNyZWF0ZVRleHQoY29tcG9zaXRlLCAxKTsKLS8vCQlhdHRyaWJ1dGVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKAotLy8JCQkJbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotLy8JCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotLy8JCQkJCQl2YWxpZGF0ZSgpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJKTsKLQkJYXR0cmlidXRlVGV4dC5zZXRUZXh0KHVubWFwcGVkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIDEsIEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX21hcHBpbmdMYWJlbCk7Ci0KLQkJbWFwcGluZ0NvbWJvID0gbmV3IENvbWJvVmlld2VyKGNyZWF0ZUNvbWJvKGNvbXBvc2l0ZSwgMSkpOwotCQltYXBwaW5nQ29tYm8uZ2V0Q29tYm8oKS5zZXRGb2N1cygpOwotCQltYXBwaW5nQ29tYm8uc2V0Q29udGVudFByb3ZpZGVyKAotCQkJbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCi0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQlCYXNpY01hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlFbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCQkJCUlkTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCQkJCU1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJCQkJTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCQkJCU9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJCQkJVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkKLQkJCQkJfTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHt9Ci0JCQl9KTsKLQkJbWFwcGluZ0NvbWJvLnNldExhYmVsUHJvdmlkZXIoCi0JCQluZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuICgoQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIpIGVsZW1lbnQpLmdldExhYmVsKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCW1hcHBpbmdDb21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQltYXBwaW5nQ29tYm8uc2V0SW5wdXQoIkZPTyIpOwotCQltYXBwaW5nQ29tYm8uZ2V0Q29tYm8oKS5zZWxlY3QoMCk7ICAvLyBzZWxlY3QgQmFzaWMgdG8gYmVnaW4KLQotCQkvLyBUT0RPIC0gRjEgSGVscAotCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBJRGFsaUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfREFUQUJBU0UpOwotCi0JCS8vZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOyAgLy8gZGlzYWJsZWQgdG8gc3RhcnQKLQkJYXBwbHlEaWFsb2dGb250KGRpYWxvZ0FyZWEpOwotCi0JCXZhbGlkYXRlKCk7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlnZC53aWR0aEhpbnQgPSAyNTA7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByaXZhdGUgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4pIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gYXR0cmlidXRlVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBtYXBwaW5nQ29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgPyBudWxsIDogKChBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKS5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgewotLy8JCWlmIChlbnRpdHlNYXBwaW5ncy5jb250YWluc1BlcnNpc3RlbnRUeXBlKHR5cGUpKSB7Ci0vLwkJCXVwZGF0ZVN0YXR1cygKLS8vCQkJCW5ldyBTdGF0dXMoCi0vLwkJCQkJSVN0YXR1cy5XQVJOSU5HLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsCi0vLwkJCQkJSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfZHVwbGljYXRlQ2xhc3NXYXJuaW5nKSk7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0vLwotCQlTdHJpbmcgbWFwcGluZ0tleSA9IGdldE1hcHBpbmdLZXkoKTsKLQkJaWYgKG1hcHBpbmdLZXkgPT0gbnVsbCkgewotCQkJdXBkYXRlU3RhdHVzKAotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX25vTWFwcGluZ0tleUVycm9yKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl1cGRhdGVTdGF0dXMoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZChnZXRNYXBwaW5nS2V5KCkpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyMGYzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5TdGF0dXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkVtYmVkZGFibGVVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlscy5Pcm1FbnRpdHlVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2cgZXh0ZW5kcyBTdGF0dXNEaWFsb2cKLXsKLQlwcml2YXRlIEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzOwotCQotCXByaXZhdGUgVGV4dCBjbGFzc1RleHQ7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY2xhc3NCcm93c2VCdXR0b247Ci0JCi0JcHJpdmF0ZSBDb21ib1ZpZXdlciBtYXBwaW5nQ29tYm87Ci0JCi0JcHJpdmF0ZSBPcm1QZXJzaXN0ZW50VHlwZSBhZGRlZFR5cGU7Ci0JCQotCQotCXB1YmxpYyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5lbnRpdHlNYXBwaW5ncyA9IGVudGl0eU1hcHBpbmdzOwotCQlzZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ190aXRsZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIDIsIEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzTGFiZWwpOwotCQkJCi0JCXRoaXMuY2xhc3NUZXh0ID0gY3JlYXRlVGV4dChjb21wb3NpdGUsIDEpOwotCQl0aGlzLmNsYXNzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcigKLQkJCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQkJdmFsaWRhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCQotCQl0aGlzLmNsYXNzQnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgMSwgSnB0VWlNZXNzYWdlcy5HZW5lcmFsX2Jyb3dzZSk7Ci0JCXRoaXMuY2xhc3NCcm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQljbGFzc1RleHQuc2V0VGV4dCh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMiwgSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbWFwcGluZ0xhYmVsKTsKLQkJCi0JCXRoaXMubWFwcGluZ0NvbWJvID0gbmV3IENvbWJvVmlld2VyKGNyZWF0ZUNvbWJvKGNvbXBvc2l0ZSwgMikpOwotCQl0aGlzLm1hcHBpbmdDb21iby5zZXRDb250ZW50UHJvdmlkZXIoCi0JCQluZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQkJCi0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQlNYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlci5pbnN0YW5jZSgpLCAKLQkJCQkJCU9ybUVudGl0eVVpUHJvdmlkZXIuaW5zdGFuY2UoKSwgCi0JCQkJCQlFbWJlZGRhYmxlVWlQcm92aWRlci5pbnN0YW5jZSgpCi0JCQkJCX07Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLQkJCX0pOwotCQl0aGlzLm1hcHBpbmdDb21iby5zZXRMYWJlbFByb3ZpZGVyKAotCQkJbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/PikgZWxlbWVudCkuZ2V0TGFiZWwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJdGhpcy5tYXBwaW5nQ29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJdGhpcy5tYXBwaW5nQ29tYm8uc2V0SW5wdXQoIkZPTyIpOwotCQl0aGlzLm1hcHBpbmdDb21iby5nZXRDb21ibygpLnNlbGVjdCgxKTsgIC8vIHNlbGVjdCBFbnRpdHkgdG8gYmVnaW4KLQkJCi0JCS8vIFRPRE8gLSBGMSBIZWxwCi0JCS8vIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIElEYWxpSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9EQVRBQkFTRSk7Ci0JCQotCQkvL2dldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsgIC8vIGRpc2FibGVkIHRvIHN0YXJ0Ci0JCWFwcGx5RGlhbG9nRm9udChkaWFsb2dBcmVhKTsJCQotCQkKLQkJdmFsaWRhdGUoKTsKLQkJCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQkKLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwcml2YXRlIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlnZC53aWR0aEhpbnQgPSAyNTA7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXByaXZhdGUgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4pIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCXByaXZhdGUgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHlNYXBwaW5ncy5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc1RleHQuZ2V0VGV4dCgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMubWFwcGluZ0NvbWJvLmdldFNlbGVjdGlvbigpOwotCQlyZXR1cm4gKHNlbGVjdGlvbi5pc0VtcHR5KCkpID8gbnVsbCA6ICgoVHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8+KSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElUeXBlIGNob29zZVR5cGUoKSB7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzPSBuZXcgSUphdmFFbGVtZW50W10geyBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKSB9OwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJCi0JCVNlbGVjdGlvbkRpYWxvZyB0eXBlU2VsZWN0aW9uRGlhbG9nOwotCQl0cnkgewotCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IAotCQkJCUphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCQkJZ2V0U2hlbGwoKSwgc2VydmljZSwgc2NvcGUsIAotCQkJCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsIAotCQkJCQkJZmFsc2UsIGdldENsYXNzTmFtZSgpKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfdGl0bGUpOyAKLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzRGlhbG9nX21lc3NhZ2UpOyAKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzc05hbWUoKTsKLQkJCi0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGNsYXNzTmFtZSkpIHsKLQkJCXVwZGF0ZVN0YXR1cygKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQlKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19ub0NsYXNzRXJyb3IpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSVR5cGUgdHlwZTsKLQkJdHJ5IHsKLQkJCXR5cGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShjbGFzc05hbWUpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQl0eXBlID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJdXBkYXRlU3RhdHVzKAotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuV0FSTklORywgSnB0VWlQbHVnaW4uUExVR0lOX0lELAotCQkJCQlKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc05vdEZvdW5kV2FybmluZykpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAodGhpcy5lbnRpdHlNYXBwaW5ncy5jb250YWluc1BlcnNpc3RlbnRUeXBlKGNsYXNzTmFtZSkpIHsKLQkJCXVwZGF0ZVN0YXR1cygKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLldBUk5JTkcsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCUpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2R1cGxpY2F0ZUNsYXNzV2FybmluZykpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdHJpbmcgbWFwcGluZ0tleSA9IGdldE1hcHBpbmdLZXkoKTsKLQkJaWYgKG1hcHBpbmdLZXkgPT0gbnVsbCkgewotCQkJdXBkYXRlU3RhdHVzKAotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbm9NYXBwaW5nS2V5RXJyb3IpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdXBkYXRlU3RhdHVzKFN0YXR1cy5PS19TVEFUVVMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXRoaXMuYWRkZWRUeXBlID0gdGhpcy5lbnRpdHlNYXBwaW5ncy5hZGRPcm1QZXJzaXN0ZW50VHlwZShnZXRNYXBwaW5nS2V5KCksIGdldENsYXNzTmFtZSgpKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBvcGVuQW5kUmV0dXJuVHlwZSgpIHsKLQkJc3VwZXIub3BlbigpOwotCQlyZXR1cm4gYWRkZWRUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2VkaXRvcnMvUGVyc2lzdGVuY2VDb250cmlidXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZWRpdG9ycy9QZXJzaXN0ZW5jZUNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MDgwM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZWRpdG9ycy9QZXJzaXN0ZW5jZUNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERUFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci0KLS8qKgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VDb250cmlidXRvciBleHRlbmRzIE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCXByaXZhdGUgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VDb250cmlidXRvcjwvY29kZT4uCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3Rpb24gcmVnaXN0ZWQgd2l0aCB0aGUgZ2l2ZW4gdGV4dCBlZGl0b3IuCi0JICogQHJldHVybiBJQWN0aW9uIG9yIG51bGwgaWYgZWRpdG9yIGlzIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gZ2V0QWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgU3RyaW5nIGFjdGlvbklEKSB7Ci0JCXJldHVybiAoZWRpdG9yID09IG51bGwgPyBudWxsIDogZWRpdG9yLmdldEFjdGlvbihhY3Rpb25JRCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkgewotCi0JCWlmIChhY3RpdmVFZGl0b3JQYXJ0ID09IHBhcnQpCi0JCQlyZXR1cm47Ci0KLQkJYWN0aXZlRWRpdG9yUGFydCA9IHBhcnQ7Ci0KLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldEFjdGlvbkJhcnMoKTsKLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkgewotCi0JCQlJVGV4dEVkaXRvciBlZGl0b3IgPSAocGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSA/IChJVGV4dEVkaXRvcikgcGFydCA6IG51bGw7Ci0KLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQlBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLAotCQkJCWdldEFjdGlvbihlZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkRFTEVURSkpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCUFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCWdldEFjdGlvbihlZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8pKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQlBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwKLQkJCQlnZXRBY3Rpb24oZWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwKLQkJCQlnZXRBY3Rpb24oZWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5DVVQpKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQlBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQlnZXRBY3Rpb24oZWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5DT1BZKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLAotCQkJCWdldEFjdGlvbihlZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlBBU1RFKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCksCi0JCQkJZ2V0QWN0aW9uKGVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU0VMRUNUX0FMTCkpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCUFjdGlvbkZhY3RvcnkuRklORC5nZXRJZCgpLAotCQkJCWdldEFjdGlvbihlZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkZJTkQpKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQlJREVBY3Rpb25GYWN0b3J5LkJPT0tNQVJLLmdldElkKCksCi0JCQkJZ2V0QWN0aW9uKGVkaXRvciwgSURFQWN0aW9uRmFjdG9yeS5CT09LTUFSSy5nZXRJZCgpKSk7Ci0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9lZGl0b3JzL1BlcnNpc3RlbmNlRWRpdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9lZGl0b3JzL1BlcnNpc3RlbmNlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YzU0NmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZWRpdG9ycy9QZXJzaXN0ZW5jZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBlZGl0b3IgZm9yIHRoZSBKUEEgUGVyc2lzdGVuY2UgQ29uZmlndXJhdGlvbiAocGVyc2lzdGVuY2UueG1sKS4KLSAqIFRoZSBwYWdlcyBzaG93biBiZWZvcmUgdGhlIFhNTCBzb3VyY2UgZWRpdG9yIGFyZSByZXRyaWV2ZWQgZnJvbSB0aGUKLSAqIDxjb2RlPkpwYVVpRmFjdG9yeTwvY29kZT4uCi0gKgotICogQHNlZSBKcGFVaUZhY3RvcnkKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VFZGl0b3IgZXh0ZW5kcyBGb3JtRWRpdG9yCi17Ci0JLyoqCi0JICogVGhlIFhNTCB0ZXh0IGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGVkaXRvcjsKLQotCS8qKgotCSAqIFRoZSByb290IG9mIHRoZSBob2xkZXJzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIGJlCi0JICogbm90aWZpZWQgd2hlbiBpdCBjaGFuZ2VzLgotCSAqLwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SUZpbGVFZGl0b3JJbnB1dD4gZWRpdG9ySW5wdXRIb2xkZXI7Ci0KLQkvKioKLQkgKiBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFyaW91cyB3aWRnZXRzLgotCSAqLwotCXByaXZhdGUgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZUVkaXRvcjwvY29kZT4uCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlRWRpdG9yKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyQ2xhc3MpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXJDbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpIHsKLQkJCWFkYXB0ZXIgPSBlZGl0b3IuZ2V0QWRhcHRlcihhZGFwdGVyQ2xhc3MpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlcygpIHsKLQkJYWRkUGVyc2lzdGVuY2VVbml0UGFnZXMoKTsKLQkJYWRkWE1MRWRpdG9yUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIHBhZ2VzIHRoYXQgc2hvdyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UgY29uZmlndXJhdGlvbgotCSAqIG9yIGl0cyBwZXJzaXN0ZW5jZSB1bml0cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUGVyc2lzdGVuY2VVbml0UGFnZXMoKSB7Ci0KLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0ganBhUHJvamVjdCgpOwotCi0JCS8vIFRoZSBwcm9qZWN0IGRvZXNuJ3QgaGF2ZSBKUEEKLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHBsYXRmb3JtSWQgPSBqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVJID0gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuanBhUGxhdGZvcm0ocGxhdGZvcm1JZCk7Ci0JCUpwYVVpRmFjdG9yeSB1aUZhY3RvcnkgPSBqcGFQbGF0Zm9ybVVJLmdldEpwYVVpRmFjdG9yeSgpOwotCi0JCUxpc3RJdGVyYXRvcjxKcGFQYWdlQ29tcG9zaXRlPiBwYWdlcyA9IHVpRmFjdG9yeS5jcmVhdGVQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKAotCQkJYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwKLQkJCWdldENvbnRhaW5lcigpLAotCQkJd2lkZ2V0RmFjdG9yeQotCQkpOwotCi0JCXdoaWxlIChwYWdlcy5oYXNOZXh0KCkpIHsKLQkJCUpwYVBhZ2VDb21wb3NpdGUgcGFnZSA9IHBhZ2VzLm5leHQoKTsKLQotCQkJdHJ5IHsKLQkJCQlGb3JtUGFnZSBmb3JtUGFnZSA9IG5ldyBQYWdlKHBhZ2UpOwotCQkJCWFkZFBhZ2UoZm9ybVBhZ2UpOwotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIFhNTCBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFhNTEVkaXRvclBhZ2UoKSB7Ci0JCXRyeSB7Ci0JCQllZGl0b3IgPSBuZXcgU3RydWN0dXJlZFRleHRFZGl0b3IoKTsKLQkJCWVkaXRvci5zZXRFZGl0b3JQYXJ0KHRoaXMpOwotCQkJaW50IGluZGV4ID0gYWRkUGFnZShlZGl0b3IsIGdldEVkaXRvcklucHV0KCkpOwotCQkJc2V0UGFnZVRleHQoaW5kZXgsIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZUVkaXRvcl9zb3VyY2VUYWIpOwotCQl9Ci0JCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPCi0JCX0KLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPElGaWxlRWRpdG9ySW5wdXQ+IGJ1aWxkRWRpdG9ySW5wdXRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPElGaWxlRWRpdG9ySW5wdXQ+KCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4gYnVpbGRKcGFQcm9qZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPElGaWxlRWRpdG9ySW5wdXQsIEpwYVByb2plY3Q+KGVkaXRvcklucHV0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IHRyYW5zZm9ybV8oSUZpbGVFZGl0b3JJbnB1dCB2YWx1ZSkgewotCQkJCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodmFsdWUuZ2V0RmlsZSgpLmdldFByb2plY3QoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2U+IGJ1aWxkUGVyc2lzdGVuY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlWG1sLCBQZXJzaXN0ZW5jZT4oYnVpbGRQZXJzaXN0ZW5jZVhtbEhvbGRlcigpLCBQZXJzaXN0ZW5jZVhtbC5QRVJTSVNURU5DRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdD4oYnVpbGRQZXJzaXN0ZW5jZVVuaXRMaXN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlKCkgewotCQkJCXJldHVybiBsaXN0SG9sZGVyLnNpemUoKSA+IDAgPyAoUGVyc2lzdGVuY2VVbml0KSBsaXN0SG9sZGVyLmdldCgwKSA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkUGVyc2lzdGVuY2VVbml0TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZSwgUGVyc2lzdGVuY2VVbml0PihidWlsZFBlcnNpc3RlbmNlSG9sZGVyKCksIFBlcnNpc3RlbmNlLlBFUlNJU1RFTkNFX1VOSVRTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxQZXJzaXN0ZW5jZVVuaXQ+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QucGVyc2lzdGVuY2VVbml0cygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QucGVyc2lzdGVuY2VVbml0c1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVhtbD4gYnVpbGRQZXJzaXN0ZW5jZVhtbEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhUm9vdENvbnRleHROb2RlLCBQZXJzaXN0ZW5jZVhtbD4oYnVpbGRSb290Q29udGV4dE5vZGVIb2xkZXIoKSwgSnBhUm9vdENvbnRleHROb2RlLlBFUlNJU1RFTkNFX1hNTF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWwgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxKcGFSb290Q29udGV4dE5vZGU+IGJ1aWxkUm9vdENvbnRleHROb2RlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEpwYVByb2plY3QsIEpwYVJvb3RDb250ZXh0Tm9kZT4oYnVpbGRKcGFQcm9qZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVJvb3RDb250ZXh0Tm9kZSB0cmFuc2Zvcm1fKEpwYVByb2plY3QgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Um9vdENvbnRleHQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdpZGdldEZhY3RvcnkgYnVpbGRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEZvcm1XaWRnZXRGYWN0b3J5KAotCQkJbmV3IFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCQllZGl0b3JJbnB1dEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0RWRpdG9yKGdldFBhZ2VDb3VudCgpIC0gMSkuZG9TYXZlKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElGaWxlRWRpdG9ySW5wdXQgZ2V0RWRpdG9ySW5wdXQoKSB7Ci0JCXJldHVybiAoSUZpbGVFZGl0b3JJbnB1dCkgc3VwZXIuZ2V0RWRpdG9ySW5wdXQoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc0xlZ2FsKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCwgIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgSUZpbGVFZGl0b3JJbnB1dCIpOwotCQlzdXBlci5pbml0KHNpdGUsIGVkaXRvcklucHV0KTsKLQotCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOwotCQllZGl0b3JJbnB1dEhvbGRlci5zZXRWYWx1ZShnZXRFZGl0b3JJbnB1dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIG11bHRpLXBhZ2UgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCi0JCXdpZGdldEZhY3RvcnkgICAgICA9IGJ1aWxkV2lkZ2V0RmFjdG9yeSgpOwotCQllZGl0b3JJbnB1dEhvbGRlciAgPSBidWlsZEVkaXRvcklucHV0SG9sZGVyKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgSlBBIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0IG93bmluZyB0aGUgZWRpdG9yCi0JICogaW50cHV0IGZpbGUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBKUEEgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGpwYVByb2plY3QoKSB7Ci0JCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QoZ2V0RWRpdG9ySW5wdXQoKS5nZXRGaWxlKCkuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGV4dGVuc2lvbiBvdmVyIDxjb2RlPkZvcm1QYWdlPC9jb2RlPiBzaW1wbHkgY29tcGxldGUgdGhlIGxheW91dCBieQotCSAqIHVzaW5nIHRoZSA8Y29kZT5KcGFQYWdlQ29tcG9zaXRlPC9jb2RlPidzIGNvbnRyb2wgYXMgaXRzIGZvcm0gY29udGVudC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFBhZ2UgZXh0ZW5kcyBGb3JtUGFnZSB7Ci0KLQkJLyoqCi0JCSAqIFRoZSB3cmFwcGVkIHBhZ2UgdGhhdCBhY3R1YWxseSBjb250YWlucyB0aGUgd2lkZ2V0cyB0byBzaG93IHdpdGggdGhpcwotCQkgKiBmb3JtIHBhZ2UuCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIEpwYVBhZ2VDb21wb3NpdGUgcGFnZTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYWdlPC9jb2RlPi4KLQkJICoKLQkJICogQHBhcmFtIHBhZ2UgVGhlIHdyYXBwZWQgPGNvZGU+SnBhUGFnZUNvbXBvc2l0ZTwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgUGFnZShKcGFQYWdlQ29tcG9zaXRlIHBhZ2UpIHsKLQotCQkJc3VwZXIoUGVyc2lzdGVuY2VFZGl0b3IudGhpcywKLQkJCSAgICAgIHBhZ2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0JCQkgICAgICBwYWdlLmdldFBhZ2VUZXh0KCkpOwotCi0JCQl0aGlzLnBhZ2UgPSBwYWdlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHtAaW5oZXJpdERvY30KLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQotCQkJU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCQltYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCkuZGVjb3JhdGVGb3JtSGVhZGluZyhmb3JtLmdldEZvcm0oKSk7Ci0KLQkJCS8vIFVwZGF0ZSB0aGUgdGV4dCBhbmQgaW1hZ2UKLQkJCXVwZGF0ZUZvcm0oZm9ybSk7Ci0KLQkJCS8vIFVwZGF0ZSB0aGUgbGF5b3V0Ci0JCQl1cGRhdGVCb2R5KGZvcm0pOwotCi0JCQkvLyBUaGlzIHdpbGwgZmluaXNoIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYnV0dG9ucwotCQkJdXBkYXRlSGVscEJ1dHRvbigpOwotCQkJZm9ybS51cGRhdGVUb29sQmFyKCk7Ci0KLQkJCS8vIFBvcHVsYXRlIHRoZSBwYWdlCi0JCQlwYWdlLnBvcHVsYXRlKCk7Ci0JCX0KLQotCQkvKioKLQkJICoge0Bpbmhlcml0RG9jfQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlwYWdlLmRpc3Bvc2UoKTsKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCS8qKgotCQkgKiB7QGluaGVyaXREb2N9Ci0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCQlwYWdlLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZHMgdGhlIHBhZ2UncyBjb250cm9sIHRvIHRoaXMgcGFnZS4KLQkJICoKLQkJICogQHBhcmFtIGZvcm0gVGhlIGZvcm0gY29udGFpbmluZyB0aGUgY29tcG9zaXRlIHdpdGggd2hpY2ggdGhlIHBhZ2UncwotCQkgKiBjb250cm9sIGlzIHBhcmVudGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgdXBkYXRlQm9keShTY3JvbGxlZEZvcm0gZm9ybSkgewotCi0JCQlDb21wb3NpdGUgYm9keSA9IGZvcm0uZ2V0Qm9keSgpOwotCi0JCQlib2R5LnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCi0JCQlUYWJsZVdyYXBEYXRhIHdyYXBEYXRhID0gbmV3IFRhYmxlV3JhcERhdGEoCi0JCQkJVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIsCi0JCQkJVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIKLQkJCSk7Ci0KLQkJCXBhZ2UuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEod3JhcERhdGEpOwotCQkJcGFnZS5nZXRDb250cm9sKCkuc2V0UGFyZW50KGJvZHkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFVwZGF0ZXMgdGhlIHRleHQgYW5kIGltYWdlIG9mIHRoZSBmb3JtLgotCQkgKgotCQkgKiBAcGFyYW0gZm9ybSBUaGUgZm9ybSB0byBoYXZlIGl0cyB0aXRsZSBiYXIgdXBkYXRlZCBieSBzZXR0aW5nIHRoZSB0ZXh0Ci0JCSAqIGFuZCBpbWFnZSwgdGhlIGltYWdlIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZUZvcm0oU2Nyb2xsZWRGb3JtIGZvcm0pIHsKLQotCQkJZm9ybS5zZXRUZXh0KHBhZ2UuZ2V0UGFnZVRleHQoKSk7Ci0KLQkJCUltYWdlIGltYWdlID0gcGFnZS5nZXRQYWdlSW1hZ2UoKTsKLQotCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQlmb3JtLnNldEltYWdlKGltYWdlKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBBZGRzIGEgaGVscCBidXR0b24gdG8gdGhlIHBhZ2UncyB0b29sYmFyIGlmIGEgaGVscCBJRCBleGlzdHMuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgdXBkYXRlSGVscEJ1dHRvbigpIHsKLQotCQkJU3RyaW5nIGhlbHBJRCA9IHBhZ2UuZ2V0SGVscElEKCk7Ci0KLQkJCWlmIChoZWxwSUQgIT0gbnVsbCkgewotCQkJCUFjdGlvbiBoZWxwQWN0aW9uID0gbmV3IEhlbHBBY3Rpb24oaGVscElEKTsKLQotCQkJCVNjcm9sbGVkRm9ybSBmb3JtID0gZ2V0TWFuYWdlZEZvcm0oKS5nZXRGb3JtKCk7Ci0JCQkJSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSBmb3JtLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQkJbWFuYWdlci5hZGQoaGVscEFjdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGNsYXNzIEhlbHBBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JCQlwcml2YXRlIGZpbmFsIFN0cmluZyBoZWxwSUQ7Ci0KLQkJCUhlbHBBY3Rpb24oU3RyaW5nIGhlbHBJRCkgewotCQkJCXN1cGVyKEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZUVkaXRvcl9wYWdlX2hlbHAsCi0JCQkJICAgICAgSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3IoRGlhbG9nLkRMR19JTUdfSEVMUCkpOwotCi0JCQkJdGhpcy5oZWxwSUQgPSBoZWxwSUQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldE1hbmFnZWRGb3JtKCkuZ2V0Rm9ybSgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscFJlc291cmNlKGhlbHBJRCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9EZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2U2N2RmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9EZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxCYXNpY01hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8QmFzaWNNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBOTFMuYmluZCgKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlcl9EZWZhdWx0LAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0Jhc2ljTGFiZWwKLQkJKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUJhc2ljTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0RlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3N2ZiODkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0RlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPEVtYmVkZGVkTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxFbWJlZGRlZE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX0RlZmF1bHQsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfRW1iZWRkZWRMYWJlbAotCQkpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YURldGFpbHNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjdmMzZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTdHJ1Y3R1cmVOb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSA8Y29kZT5JSnBhRGV0YWlsc1BhZ2U8L2NvZGU+Ci0gKiB3aGVuIHRoZSBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIHRoZSBKYXZhIHNvdXJjZSBmaWxlLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YURldGFpbHNQcm92aWRlcgotCWltcGxlbWVudHMgSnBhRGV0YWlsc1Byb3ZpZGVyCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhRGV0YWlsc1Byb3ZpZGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSmF2YURldGFpbHNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkRGV0YWlsc1BhZ2UoCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCU9iamVjdCBjb250ZW50Tm9kZUlkLAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlpZiAoY29udGVudE5vZGVJZCA9PSBKYXZhU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9UWVBFX0lEKSB7Ci0JCQlyZXR1cm4gbmV3IEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JCX0KLQotCQlpZiAoY29udGVudE5vZGVJZCA9PSBKYXZhU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSUQpIHsKLQkJCXJldHVybiBuZXcgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhRW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YUVudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzIzN2NhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhRW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkFic3RyYWN0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYSBKYXZhIGVudGl0eS4KLSAqCi0gKiBAc2VlIEphdmFFbnRpdHkKLSAqIEBzZWUgQmFzZUpwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRW50aXR5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGU8SmF2YUVudGl0eT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5KYXZhRW50aXR5PC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFFbnRpdHlDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkSW5oZXJpdGFuY2VDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhRW50aXR5VWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFFbnRpdHlVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZGY3MzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFFbnRpdHlVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLlR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW50aXR5VWlQcm92aWRlciBpbXBsZW1lbnRzIFR5cGVNYXBwaW5nVWlQcm92aWRlcjxKYXZhRW50aXR5PgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbnRpdHlVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFFbnRpdHlVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFR5cGVNYXBwaW5nVWlQcm92aWRlcjxKYXZhRW50aXR5PiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSmF2YUVudGl0eVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50VHlwZVBhZ2VfRW50aXR5TGFiZWw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yVHlwZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkUGVyc2lzdGVudFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQlKcGFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFFbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMDg3YmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFJbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgamF2YSBpbmhlcml0YW5jZS4KLSAqCi0gKiBAc2VlIEphdmFFbnRpdHkKLSAqIEBzZWUgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTxKYXZhRW50aXR5PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxKYXZhRW50aXR5PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNmNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRldGFpbHMgcGFnZSB1c2VkIGZvciB0aGUgSmF2YSBwZXJzaXN0ZW50Ci0gKiBhdHRyaWJ1dGUuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVHlwZSBtYXBwaW5nIHBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJcmV0dXJuIGpwYVBsYXRmb3JtVWkoKS5qYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlc2UgSUF0dHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMgd2lsbCBiZSB1c2VkIGFzIGVsZW1lbnRzIGluIHRoZSBhdHRyaWJ1dGVNYXBwaW5nIGNvbWJvCi0JICogVGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGNvbWJvIHdpbGwgYmUgb25lIG9mIHRoZSBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzIG9yCi0JICogaWYgbm9uZSBvZiB0aG9zZSBhcHBseSB0aGUgbnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIHdpbGwgYmUgdXNlZC4gVGhlIHJlc3Qgb2YgdGhlIGVsZW1lbnRzCi0JICogd2lsbCBiZSB0aGUgYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzLiAgVGhlIGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpcwotCSAqIGRldGVybWluZWQgYnkgbWF0Y2hpbmcgaXRzIGtleSB3aXRoIHRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgYXR0cmlidXRlTWFwcGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+W10gYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzRm9yKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBwcm92aWRlcnMgPSBuZXcgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8Pz5bQ29sbGVjdGlvblRvb2xzLnNpemUoYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkpICsgMV07Ci0JCXByb3ZpZGVyc1swXSA9ICBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJaW50IGkgPSAxOwotCQlmb3IgKEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gaXRlcmF0b3IgPSBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCXByb3ZpZGVyc1tpKytdID0gaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoU3RyaW5nIGtleSkgewotCQlmb3IgKEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gaSA9IGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IHByb3ZpZGVyID0gaS5uZXh0KCk7Ci0KLQkJCWlmIChwcm92aWRlci5nZXRNYXBwaW5nS2V5KCkgPT0ga2V5KSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRoaXMubnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJcmV0dXJuIGpwYVBsYXRmb3JtVWkoKS5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE1hcCBhcyBjb21wb3NpdGUKLQkJbmV3IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMCwgNSwgMCkKLQkJKTsKLQotCQkvLyBNYXBwaW5nIHByb3BlcnRpZXMgcGFnZQotCQlQYWdlQm9vayBtYXBwaW5nUGFuZSA9IGJ1aWxkTWFwcGluZ1BhZ2VCb29rKGNvbnRhaW5lcik7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICAgID0gU1dULlRPUDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOwotCi0JCW1hcHBpbmdQYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCXByb3RlY3RlZCBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxBdHRyaWJ1dGVNYXBwaW5nPiBudWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBOdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMWUwNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyAiTWFwIEFzIiBjb21wb3NpdGUgaXMgcmVzcG9uc2libGUgZm9yIHNob3dpbmcgdGhlIG1hcHBpbmcgbmFtZSBhbmQKLSAqIG1hcHBpbmcgdHlwZSBmb3IgYW4gYXR0cmlidXRlIGRlY2xhcmVkIGluIGEgSmF2YSB0eXBlLgotICoKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlIGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4ganBhUGxhdGZvcm1VaSgpLmphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4ganBhUGxhdGZvcm1VaSgpLmRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzMTFiOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5UeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5KYXZhUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRldGFpbHMgcGFnZSB1c2VkIGZvciB0aGUgSmF2YSBwZXJzaXN0ZW50Ci0gKiB0eXBlLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKYXZhUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFR5cGUgbWFwcGluZyBwYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEphdmFQZXJzaXN0ZW50VHlwZQotICogQHNlZSBKYXZhUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UgZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPEphdmFQZXJzaXN0ZW50VHlwZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiB0eXBlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4ganBhUGxhdGZvcm1VaSgpLmphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTWFwIEFzIGNvbXBvc2l0ZQotCQluZXcgSmF2YVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMCwgNSwgMCkKLQkJKTsKLQotCQkvLyBUeXBlIHByb3BlcnRpZXMgcGFnZQotCQlidWlsZFR5cGVNYXBwaW5nUGFnZUJvb2soY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMzhlMDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5BYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQHNlZSBKYXZhRW50aXR5Ci0gKiBAc2VlIEphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZSAtIFRoZSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU8SmF2YUVudGl0eT4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFByaW1hcnlLZXlKb2luQ29sdW1uPihidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN3aXRjaERlZmF1bHRUb1NwZWNpZmllZCgpIHsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0KLQkJaWYgKGRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCVN0cmluZyBjb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBzdWJqZWN0KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCQlwa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5OYW1lKTsKLQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0KLQkJCXRoaXMuam9pbkNvbHVtbkhvbGRlci5zZXRWYWx1ZShwa0pvaW5Db2x1bW4pOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMDUxYmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5BYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHkKLSAqIEBzZWUgRW50aXR5Q29tcG9zaXRlIC0gVGhlIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgQWRkUmVtb3ZlTGlzdFBhbmUKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPEphdmFFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgSmF2YUVudGl0eT4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U2Vjb25kYXJ5VGFibGU+KGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdEhvbGRlcigpLCAKLQkJCVRhYmxlLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZKTsKLQl9CQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTZWNvbmRhcnlUYWJsZT4gYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eSwgU2Vjb25kYXJ5VGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTZWNvbmRhcnlUYWJsZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZUhvbGRlciA9Ci0JCQlidWlsZFNlY29uZGFyeVRhYmxlSG9sZGVyKCk7Ci0KLQkJLy8gU2Vjb25kYXJ5IFRhYmxlcyBhZGQvcmVtb3ZlIGxpc3QgcGFuZQotCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PigKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZXNBZGFwdGVyKCksCi0JCQlidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RNb2RlbCgpLAotCQkJc2Vjb25kYXJ5VGFibGVIb2xkZXIsCi0JCQlidWlsZFNlY29uZGFyeVRhYmxlTGFiZWxQcm92aWRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMvL1RPRE8gbmVlZCBhIGhlbHAgY29udGV4dCBpZCBmb3IgdGhpcwotCQkpOwotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBwYW5lCi0JCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXNlY29uZGFyeVRhYmxlSG9sZGVyLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2NWIzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8QXR0cmlidXRlTWFwcGluZz4KLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8QXR0cmlidXRlTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCUpwYVVpRmFjdG9yeSBmYWN0b3J5LAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBOdWxsQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxBdHRyaWJ1dGVNYXBwaW5nPgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZXsKLQotCQlOdWxsQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JCSAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL051bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9OdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMzJhMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL051bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5UeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE51bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIgaW1wbGVtZW50cyBUeXBlTWFwcGluZ1VpUHJvdmlkZXI8VHlwZU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVsbFR5cGVNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFR5cGVNYXBwaW5nVWlQcm92aWRlcjxUeXBlTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE51bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRUeXBlUGFnZV9Vbm1hcHBlZExhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKAotCQkJTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZCi0JCSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZFBlcnNpc3RlbnRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGpwYVVpRmFjdG9yeSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFR5cGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IE51bGxDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTnVsbENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8VHlwZU1hcHBpbmc+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi0JewotCQlOdWxsQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCQkgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL0Fic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL0Fic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4NzRjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJdGVtTGFiZWxQcm92aWRlcn0gdGhhdCBwcm92aWRlcyB1cGRhdGluZwotICogbGFiZWwgaW5mb3JtYXRpb24gZm9yIGEgTW9kZWwgb2JqZWN0LgotICogCi0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqICNidWlsZFRleHRNb2RlbCgpCi0gKiAgICAgcmV0dXJuIGEge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gdGhhdCByZXByZXNlbnRzIHRoZSB0ZXh0IGZvciB0aGUgcmVwcmVzZW50ZWQKLSAqICAgICBtb2RlbCBvYmplY3QuCi0gKiAjYnVpbGRJbWFnZU1vZGVsKCkKLSAqIAkgICByZXR1cm4gYSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IHJlcHJlc2VudHMgdGhlIGltYWdlIGZvciB0aGUgcmVwcmVzZW50ZWQKLSAqIAkgICBtb2RlbCBvYmplY3QKLSAqIAotICogT3RoZXIgbWV0aG9kcyBtYXkgYmUgb3ZlcnJpZGRlbiwgYnV0IHRha2UgY2FyZSB0byBwcmVzZXJ2ZSB0aGUgbG9naWMgcHJvdmlkZWQgCi0gKiBieSB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQkKLQlwcml2YXRlIE1vZGVsIG1vZGVsOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dE1vZGVsOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZU1vZGVsOwotCQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsYWJlbENoYW5nZUxpc3RlbmVyOwotCQotCQotCXByb3RlY3RlZCBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJTW9kZWwgbW9kZWwsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLQkJdGhpcy5sYWJlbENoYW5nZUxpc3RlbmVyID0gYnVpbGRMYWJlbENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3RlbmVyIHRvIHVwZGF0ZSB0aGUgdmlld2VyICh0aHJvdWdoIHRoZSBsYWJlbCBwcm92aWRlcikKLQkgKiBpZiB0aGUgdGV4dCBvciBpbWFnZSBjaGFuZ2VzCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRMYWJlbENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWxhYmVsUHJvdmlkZXIoKS51cGRhdGVMYWJlbChtb2RlbCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHZhbHVlIG1vZGVsCi0JICogKGxhenkgYW5kIGp1c3QtaW4tdGltZSBpbml0aWFsaXplZCkKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dE1vZGVsKCkgewotCQlpZiAodGV4dE1vZGVsID09IG51bGwpIHsKLQkJCXRleHRNb2RlbCA9IGJ1aWxkVGV4dE1vZGVsKCk7Ci0JCQllbmdhZ2VUZXh0TW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gdGV4dE1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0ZXh0IHZhbHVlIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCk7Ci0JCi0JLyoqIAotCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZW5nYWdlVGV4dE1vZGVsKCkgYmVmb3JlIAotCSAqIHN1YmNsYXNzIGxvZ2ljIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVRleHRNb2RlbCgpIHsKLQkJdGV4dE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsYWJlbENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZGlzZW5nYWdlVGV4dE1vZGVsKCkgYWZ0ZXIgCi0JICogc3ViY2xhc3MgbG9naWMgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVGV4dE1vZGVsKCkgewotCQlpZiAodGV4dE1vZGVsICE9IG51bGwpIHsKLQkJCXRleHRNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGFiZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSB2YWx1ZSBtb2RlbAotCSAqIChsYXp5IGFuZCBqdXN0LWluLXRpbWUgaW5pdGlhbGl6ZWQpCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gaW1hZ2VNb2RlbCgpIHsKLQkJaWYgKGltYWdlTW9kZWwgPT0gbnVsbCkgewotCQkJaW1hZ2VNb2RlbCA9IGJ1aWxkSW1hZ2VNb2RlbCgpOwotCQkJZW5nYWdlSW1hZ2VNb2RlbCgpOwotCQl9Ci0JCXJldHVybiBpbWFnZU1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaW1hZ2UgbW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKTsKLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5lbmdhZ2VJbWFnZU1vZGVsKCkgYmVmb3JlIAotCSAqIHN1YmNsYXNzIGxvZ2ljIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUltYWdlTW9kZWwoKSB7Ci0JCWltYWdlTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxhYmVsQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5kaXNlbmdhZ2VJbWFnZU1vZGVsKCkgYWZ0ZXIgCi0JICogc3ViY2xhc3MgbG9naWMgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSW1hZ2VNb2RlbCgpIHsKLQkJaWYgKGltYWdlTW9kZWwgIT0gbnVsbCkgewotCQkJaW1hZ2VNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGFiZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtb2RlbCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBpdGVtCi0JICovCi0JcHVibGljIE1vZGVsIG1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbGFiZWwgcHJvdmlkZXIgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBpdGVtCi0JICovCi0JcHVibGljIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dE1vZGVsKCkuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2VNb2RlbCgpLmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc2VuZ2FnZVRleHRNb2RlbCgpOwotCQlkaXNlbmdhZ2VJbWFnZU1vZGVsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTQ4N2UyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL0Fic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLk51bGxMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJ9IHRoYXQgcHJvdmlkZXMgdXBkYXRpbmcKLSAqIGNoaWxkcmVuIGluZm9ybWF0aW9uIGZvciBhIE1vZGVsIG9iamVjdC4KLSAqIAotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gKiAjZ2V0UGFyZW50KCkKLSAqICAgICB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIG51bGwuICB0aGVyZSBpcyBubyAKLSAqICAgICBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBmb3IgdGhpcyBhcyB0aGlzIHNob3VsZCBub3QgYmUgY2hhbmdpbmcgZm9yIGEgZ2l2ZW4KLSAqICAgICBub2RlLiAgYWxsIHN1Y2ggY2hhbmdlcyB3aWxsIGJlIHByb3ZpZGVkIGJ5IHRoZSBwYXJlbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLgotICogI2J1aWxkQ2hpbGRyZW5Nb2RlbCgpCi0gKiAgICAgcmV0dXJuIGEge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoaWxkcmVuIGZvciB0aGUgcmVwcmVzZW50ZWQKLSAqICAgICBtb2RlbCBvYmplY3QuICAjYnVpbGRDaGlsZHJlbk1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsKSBhbmQgCi0gKiAgICAgI2J1aWxkQ2hpbGRyZW5Nb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWwpIGFyZSBwcm92aWRlZCBpZiB0aGUgY2hpbGRyZW4gYXJlIG1vcmUKLSAqICAgICBlYXNpbHkgcmVwcmVzZW50ZWQgYXMgYSBjb2xsZWN0aW9uIG9yIGFzIGEgcHJvcGVydHkgKHNpbmdsZSBjaGlsZCkKLSAqICAgICB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gYSB7QGxpbmsgTnVsbExpc3RWYWx1ZU1vZGVsfQotICogCi0gKiBPdGhlciBtZXRob2RzIG1heSBiZSBvdmVycmlkZGVuLCBidXQgdGFrZSBjYXJlIHRvIHByZXNlcnZlIHRoZSBsb2dpYyBwcm92aWRlZCAKLSAqIGJ5IHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPEU+Ci0JaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgotewotCXByaXZhdGUgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyOwotCQotCXByaXZhdGUgTW9kZWwgbW9kZWw7Ci0JCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFPiBjaGlsZHJlbk1vZGVsOwotCQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGNoaWxkcmVuTGlzdGVuZXI7Ci0JCi0JCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQlNb2RlbCBtb2RlbCwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy50cmVlQ29udGVudFByb3ZpZGVyID0gdHJlZUNvbnRlbnRQcm92aWRlcjsKLQkJdGhpcy5jaGlsZHJlbkxpc3RlbmVyID0gYnVpbGRDaGlsZHJlbkxpc3RlbmVyKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3RlbmVyIHRvIHJlZnJlc2ggdGhlIHRyZWUgKHRocm91Z2ggdGhlIHRyZWUgY29udGVudCBwcm92aWRlcikKLQkgKiBpZiB0aGUgY2hpbGRyZW4gY2hhbmdlCi0JICovCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZENoaWxkcmVuTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQl0cmVlQ29udGVudFByb3ZpZGVyKCkudXBkYXRlQ29udGVudChtb2RlbCgpKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQl0cmVlQ29udGVudFByb3ZpZGVyKCkudXBkYXRlQ29udGVudChtb2RlbCgpKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXRyZWVDb250ZW50UHJvdmlkZXIoKS51cGRhdGVDb250ZW50KG1vZGVsKCkpOwotCQkJCWZvciAoSXRlcmF0b3I8Pz4gc3RyZWFtID0gZXZlbnQuaXRlbXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJCXRyZWVDb250ZW50UHJvdmlkZXIoKS5kaXNwb3NlKHN0cmVhbS5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQl0cmVlQ29udGVudFByb3ZpZGVyKCkudXBkYXRlQ29udGVudChtb2RlbCgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IHN0cmVhbSA9IGV2ZW50LnJlcGxhY2VkSXRlbXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJCXRyZWVDb250ZW50UHJvdmlkZXIoKS5kaXNwb3NlKHN0cmVhbS5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJlZUNvbnRlbnRQcm92aWRlcigpLnVwZGF0ZUNvbnRlbnQobW9kZWwoKSk7Ci0JCQkJLy8gaW4gdGhlIGNhc2Ugb2YgYSBsaXN0IGNoYW5nZWQgZXZlbnQsIHdlIGRvbid0IGhhdmUgCi0JCQkJLy8gYWNjZXNzIHRvIHRoZSByZW1vdmVkIG9iamVjdHMsIHNvIHdlIGNhbid0IGRpc3Bvc2UgdGhlbS4KLQkJCQkvLyBrZWVwIGEgd2F0Y2ggb24gdGhpcyB0byBzZWUgaWYgdGhpcyBiZWNvbWVzIGEgcHJvYmxlbS4KLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJlZUNvbnRlbnRQcm92aWRlcigpLnVwZGF0ZUNvbnRlbnQobW9kZWwoKSk7Ci0JCQkJLy8gaW4gdGhlIGNhc2Ugb2YgYSBsaXN0IGNsZWFyZWQgZXZlbnQsIHdlIGRvbid0IGhhdmUgCi0JCQkJLy8gYWNjZXNzIHRvIHRoZSByZW1vdmVkIG9iamVjdHMsIHNvIHdlIGNhbid0IGRpc3Bvc2UgdGhlbS4KLQkJCQkvLyBrZWVwIGEgd2F0Y2ggb24gdGhpcyB0byBzZWUgaWYgdGhpcyBiZWNvbWVzIGEgcHJvYmxlbS4KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGlsZHJlbiBtb2RlbAotCSAqIChsYXp5IGFuZCBqdXN0LWluLXRpbWUgaW5pdGlhbGl6ZWQpCi0JICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEU+IGNoaWxkcmVuTW9kZWwoKSB7Ci0JCWlmIChjaGlsZHJlbk1vZGVsID09IG51bGwpIHsKLQkJCWNoaWxkcmVuTW9kZWwgPSBidWlsZENoaWxkcmVuTW9kZWwoKTsKLQkJCWVuZ2FnZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuTW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNoaWxkcmVuIG1vZGVsCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBOdWxsTGlzdFZhbHVlTW9kZWwoKTsKLQl9Ci0JCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCBpZiB0aGUgY2hpbGRyZW4gbW9kZWwgaXMgYmV0dGVyIHJlcHJlc2VudGVkCi0JICogYXMgYSBjb2xsZWN0aW9uLgotCSAqIFRoaXMgd3JhcHMgdGhlIGNoaWxkcmVuIGNvbGxlY3Rpb24gbW9kZWwgYW5kIHVzZXMgaXQgaW50ZXJuYWxseSBhcyBhIGxpc3QKLQkgKiBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8RT4gYnVpbGRDaGlsZHJlbk1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNoaWxkcmVuTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNoaWxkcmVuTW9kZWwpOwotCX0KLQkKLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIGlmIHRoZSBjaGlsZHJlbiBtb2RlbCBpcyBiZXR0ZXIgcmVwcmVzZW50ZWQKLQkgKiBhcyBhIHNpbmdsZSB2YWx1ZSBwcm9wZXJ0eS4KLQkgKiBUaGlzIHdyYXBzIHRoZSBjaGlsZHJlbiAoY2hpbGQpIHByb3BlcnR5IG1vZGVsIGFuZCB1c2VzIGl0IGludGVybmFsbHkgYXMgYSBsaXN0Ci0JICogbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gY2hpbGRyZW5Nb2RlbCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNoaWxkcmVuTW9kZWwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1vZGVsIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIG5vZGUKLQkgKi8KLQlwdWJsaWMgTW9kZWwgbW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0cmVlIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBub2RlCi0JICovCi0JcHVibGljIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIHRyZWVDb250ZW50UHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmFycmF5KGNoaWxkcmVuTW9kZWwoKS5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHdpdGggcG90ZW50aWFsbHkgbW9yZSBlZmZpY2llbnQgbG9naWMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuTW9kZWwoKS5saXN0SXRlcmF0b3IoKS5oYXNOZXh0KCk7Ci0JfQotCQotCS8qKgotCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZm9yIChPYmplY3QgY2hpbGQgOiBnZXRDaGlsZHJlbigpKSB7Ci0JCQl0cmVlQ29udGVudFByb3ZpZGVyKCkuZGlzcG9zZShjaGlsZCk7Ci0JCX0KLQkJZGlzZW5nYWdlQ2hpbGRyZW4oKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZW5nYWdlQ2hpbGRyZW4oKSBiZWZvcmUgCi0JICogc3ViY2xhc3MgbG9naWMgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlQ2hpbGRyZW4oKSB7Ci0JCWNoaWxkcmVuTW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBjaGlsZHJlbkxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZGlzZW5nYWdlQ2hpbGRyZW4oKSBhZnRlciAKLQkgKiBzdWJjbGFzcyBsb2dpYyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VDaGlsZHJlbigpIHsKLQkJaWYgKGNoaWxkcmVuTW9kZWwgIT0gbnVsbCkgewotCQkJY2hpbGRyZW5Nb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGNoaWxkcmVuTGlzdGVuZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjc0OTAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0KLS8qKgotICogRXh0ZW5zaW9uIG9mIHtAbGluayBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXJ9IHRoYXQgcHJvdmlkZXMgYW4gZXh0ZW5zaW9uCi0gKiB0byBwcm92aWRlIHRyZWUgY29udGVudAotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBleHRlbmRzIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcgotCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIKLXsKLQlwdWJsaWMgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcigKLQkJCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSB0cmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkpIHsKLQkJc3VwZXIodHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIoCi0JCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgdHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LAotCQkJSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSkgewotCQlzdXBlcih0cmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnksIGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiAoVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHN1cGVyLml0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGl0ZW1Db250ZW50UHJvdmlkZXIocGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBuZXcgT2JqZWN0WzBdIDogcHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGl0ZW1Db250ZW50UHJvdmlkZXIoZWxlbWVudCk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDogcHJvdmlkZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gaXRlbUNvbnRlbnRQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIChwcm92aWRlciA9PSBudWxsKSA/IGZhbHNlIDogcHJvdmlkZXIuaGFzQ2hpbGRyZW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9JbWFnZUltYWdlRGVzY3JpcHRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4NjQ3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9JbWFnZUltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLQotLyoqCi0gKiBJbWFnZSBkZXNjcmlwdG9yIGZvciBhbiBpbWFnZS4KLSAqLwotcHVibGljIGNsYXNzIEltYWdlSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIAotewotCQotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBJbWFnSW1hZ2VEZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBJbWFnZUltYWdlRGVzY3JpcHRvcihJbWFnZSBpbWFnZSkgewotCQlzdXBlcigpOwotCQlmSW1hZ2UgPSBpbWFnZTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gKG9iaiAhPSBudWxsKSAmJiBnZXRDbGFzcygpLmVxdWFscyhvYmouZ2V0Q2xhc3MoKSkgJiYgZkltYWdlLmVxdWFscygoKEltYWdlSW1hZ2VEZXNjcmlwdG9yKSBvYmopLmZJbWFnZSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgSW1hZ2VEZXNjcmlwdG9yI2dldEltYWdlRGF0YSgpCi0JICovCi0JcHVibGljIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoKSB7Ci0JCXJldHVybiBmSW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkltYWdlLmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvTnVsbExhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL051bGxMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ODNkMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvTnVsbExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIE51bGwgaW1wbGVtZW50YXRpb24gb2YgdGhlIElMYWJlbFByb3ZpZGVyIGludGVyZmFjZS4KLSAqIEltcGxlbWVudGVkIGFzIGEgc2luZ2xldG9uLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbExhYmVsUHJvdmlkZXIgCi0JaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciAKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE51bGxMYWJlbFByb3ZpZGVyIElOU1RBTkNFID0gbmV3IE51bGxMYWJlbFByb3ZpZGVyKCk7Ci0KLQlwdWJsaWMgc3RhdGljIElMYWJlbFByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIGEgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTnVsbExhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvTnVsbFRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL051bGxUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjdlMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvTnVsbFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBOdWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJTGFiZWxQcm92aWRlciBpbnRlcmZhY2UuCi0gKiBJbXBsZW1lbnRlZCBhcyBhIHNpbmdsZXRvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxUcmVlQ29udGVudFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciAKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBOdWxsVHJlZUNvbnRlbnRQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCi0JcHVibGljIHN0YXRpYyBJVHJlZUNvbnRlbnRQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBhIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gRU1QVFlfQVJSQVk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBFTVBUWV9BUlJBWTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL1N0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9TdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmFiNTY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL1N0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RMaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIGNhbiBiZSB1c2VkIHRvIGtlZXAgYW4gQWJzdHJhY3RMaXN0Vmlld2VyCi0gKiAoZS5nLiBhIExpc3RWaWV3ZXIgb3IgQ29tYm9WaWV3ZXIpIGluIHN5bmNoIHdpdGggYSBMaXN0VmFsdWVNb2RlbAotICogKG9yIGEgQ29sbGVjdGlvblZhbHVlTW9kZWwpLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIKLQlpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi17Ci0JLyoqIFRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsIGxpc3RIb2xkZXI7Ci0KLQkvKiogVGhlIGxpc3Qgdmlld2VyIHdlIGtlZXAgaW4gc3luY2ggd2l0aCB0aGUgbW9kZWwgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQWJzdHJhY3RMaXN0Vmlld2VyIGxpc3RWaWV3ZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBmb3J3YXJkIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIGxpc3Qgdmlld2VyIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBob2xkZXIgc28gdGhleQotCSAqIHN0YXkgaW4gc3luY2guCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlciBhZGFwdChBYnN0cmFjdExpc3RWaWV3ZXIgbGlzdFZpZXdlciwgTGlzdFZhbHVlTW9kZWwgbGlzdEhvbGRlcikgewotCQkvLyB3ZSBuZWVkIG9ubHkgY29uc3RydWN0IHRoZSBhZGFwdGVyIGFuZCBpdCB3aWxsIGhvb2sgdXAgdG8gdGhlIGxpc3Qgdmlld2VyIGV0Yy4KLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlcihsaXN0Vmlld2VyLCBsaXN0SG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIGxpc3Qgdmlld2VyIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBob2xkZXIgc28gdGhleQotCSAqIHN0YXkgaW4gc3luY2guCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlciBhZGFwdChBYnN0cmFjdExpc3RWaWV3ZXIgbGlzdFZpZXdlciwgQ29sbGVjdGlvblZhbHVlTW9kZWwgY29sbGVjdGlvbkhvbGRlcikgewotCQkvLyB3ZSBuZWVkIG9ubHkgY29uc3RydWN0IHRoZSBhZGFwdGVyIGFuZCBpdCB3aWxsIGhvb2sgdXAgdG8gdGhlIGxpc3Qgdmlld2VyIGV0Yy4KLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlcihsaXN0Vmlld2VyLCBjb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlcihBYnN0cmFjdExpc3RWaWV3ZXIgbGlzdFZpZXdlciwgTGlzdFZhbHVlTW9kZWwgbGlzdEhvbGRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0Vmlld2VyID0gbGlzdFZpZXdlcjsKLQkJdGhpcy5saXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcih0aGlzKTsKLQkJLy8gdGhlIGxpc3Qgdmlld2VyIHdpbGwgY2FsbCBiYWNrIHRvICNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJdGhpcy5saXN0Vmlld2VyLnNldElucHV0KGxpc3RIb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlcihBYnN0cmFjdExpc3RWaWV3ZXIgbGlzdFZpZXdlciwgQ29sbGVjdGlvblZhbHVlTW9kZWwgY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKGxpc3RWaWV3ZXIsIG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci50aGlzLml0ZW1zUmVwbGFjZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlpZiAoaW5wdXRFbGVtZW50ICE9IHRoaXMubGlzdEhvbGRlcikgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBpbnB1dCBlbGVtZW50OiAiICsgaW5wdXRFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgbGlzdCB2aWV3ZXIsIHNvIGRvbid0IHVwZGF0ZSB0aGUgbGlzdCB2aWV3ZXIgaGVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKHZpZXdlciAhPSB0aGlzLmxpc3RWaWV3ZXIpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgdmlld2VyOiAiICsgdmlld2VyKTsKLQkJfQotCQlpZiAob2xkSW5wdXQgIT0gdGhpcy5saXN0SG9sZGVyKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIG9sZCBpbnB1dDogIiArIG9sZElucHV0KTsKLQkJfQotCQl0aGlzLm1vZGVsQ2hhbmdlZCgoTGlzdFZhbHVlTW9kZWwpIG9sZElucHV0LCAoTGlzdFZhbHVlTW9kZWwpIG5ld0lucHV0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nIC0gbGlzdGVuZXJzIHNob3VsZCd2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBpbiAjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKExpc3RWYWx1ZU1vZGVsIG9sZE1vZGVsLCBMaXN0VmFsdWVNb2RlbCBuZXdNb2RlbCkgewotCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ld01vZGVsOwotCQlpZiAobmV3TW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3RWYWx1ZU1vZGVsIG1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKExpc3RWYWx1ZU1vZGVsIGxpc3RIb2xkZXIpIHsKLQkJLy8gdGhlIGxpc3Qgdmlld2VyIHdpbGwgY2FsbCBiYWNrIHRvICNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJdGhpcy5saXN0Vmlld2VyLnNldElucHV0KGxpc3RIb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsIGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcy5zZXRNb2RlbChuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBMaXN0SXRlcmF0b3Igc3RyZWFtID0gZS5pdGVtcygpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCXRoaXMubGlzdFZpZXdlci5pbnNlcnQoc3RyZWFtLm5leHQoKSwgaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlbW92ZShDb2xsZWN0aW9uVG9vbHMuYXJyYXkoZS5pdGVtcygpLCBlLml0ZW1zU2l6ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMubGlzdFZpZXdlci5yZW1vdmUoQ29sbGVjdGlvblRvb2xzLmFycmF5KGUucmVwbGFjZWRJdGVtcygpLCBlLml0ZW1zU2l6ZSgpKSk7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBMaXN0SXRlcmF0b3Igc3RyZWFtID0gZS5pdGVtcygpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCXRoaXMubGlzdFZpZXdlci5pbnNlcnQoc3RyZWFtLm5leHQoKSwgaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogU3luY2hyb25pemUgdGhlIGxpc3Qgdmlld2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJaW50IGxlbiA9IGUuZ2V0TW92ZUxlbmd0aCgpOwotCQlPYmplY3RbXSBpdGVtcyA9IG5ldyBPYmplY3RbbGVuXTsKLQkJaW50IG9mZnNldCA9IGUuZ2V0U291cmNlSW5kZXgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaXRlbXNbaV0gPSB0aGlzLmxpc3RIb2xkZXIuZ2V0KG9mZnNldCArIGkpOwotCQl9Ci0JCXRoaXMubGlzdFZpZXdlci5yZW1vdmUoaXRlbXMpOwotCi0JCW9mZnNldCA9IGUuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5saXN0Vmlld2VyLmluc2VydChpdGVtc1tpXSwgb2Zmc2V0ICsgaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IHdhcyBjbGVhcmVkLgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZCgpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGhhcyBjaGFuZ2VkICJkcmFtYXRpY2FsbHkiLgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTExMTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgU1dUCi0gKiBVSSB0aHJlYWQuCi0gKiBGb3J3YXJkICpldmVyeSogZXZlbnQgYXN5bmNocm9ub3VzbHkgdmlhIHRoZSBVSSB0aHJlYWQgc28gdGhlIGxpc3RlbmVyCi0gKiByZWNlaXZlcyBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgZ2VuZXJhdGVkLgotICovCi1wdWJsaWMgY2xhc3MgU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcihDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIGFkZGVkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVtb3ZlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNsZWFyZWQiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2VkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSkgc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcgI3N5bmNFeGVjKFJ1bm5hYmxlKSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKLQkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPblVJVGhyZWFkKFJ1bm5hYmxlIHIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHIpOwotLy8JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHIpOwotCX0KLQotCXZvaWQgaXRlbXNBZGRlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlbW92ZWRfKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRfKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgIikiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZmNiOTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGxpc3QgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgU1dUCi0gKiBVSSB0aHJlYWQuCi0gKiBGb3J3YXJkICpldmVyeSogZXZlbnQgYXN5bmNocm9ub3VzbHkgdmlhIHRoZSBVSSB0aHJlYWQgc28gdGhlIGxpc3RlbmVyCi0gKiByZWNlaXZlcyBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgZ2VuZXJhdGVkLgotICovCi1wdWJsaWMgY2xhc3MgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkSXRlbXNNb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkSXRlbXNSZXBsYWNlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIGFkZGVkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVtb3ZlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNNb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgbW92ZWQiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlcGxhY2VkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sbGVjdGlvbkNsZWFyZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2xlYXJlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DaGFuZ2VkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmxpc3RDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZWQiOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIERpc3BsYXkjYXN5bmNFeGVjKFJ1bm5hYmxlKSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyAjc3luY0V4ZWMoUnVubmFibGUpIGNhbiBzb210aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uVUlUaHJlYWQoUnVubmFibGUgcikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocik7Ci0vLwkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMocik7Ci0JfQotCi0Jdm9pZCBpdGVtc0FkZGVkXyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zUmVtb3ZlZF8oTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zTW92ZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZXBsYWNlZF8oTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBsaXN0Q2xlYXJlZF8oTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENoYW5nZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgIikiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmZDM0Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBTV1QKLSAqIFVJIHRocmVhZC4KLSAqIEZvcndhcmQgKmV2ZXJ5KiBldmVudCBhc3luY2hyb25vdXNseSB2aWEgdGhlIFVJIHRocmVhZCBzbyB0aGUgbGlzdGVuZXIKLSAqIHJlY2VpdmVzIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkgd2VyZSBnZW5lcmF0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMucHJvcGVydHlDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheSNhc3luY0V4ZWMoUnVubmFibGUpIHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nICNzeW5jRXhlYyhSdW5uYWJsZSkgY2FuIHNvbXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25VSVRocmVhZChSdW5uYWJsZSByKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyKTsKLS8vCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhyKTsKLQl9Ci0KLQl2b2lkIHByb3BlcnR5Q2hhbmdlZF8oUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICIpIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTIyNmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgc3RhdGUgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgU1dUCi0gKiBVSSB0aHJlYWQuCi0gKiBGb3J3YXJkICpldmVyeSogZXZlbnQgYXN5bmNocm9ub3VzbHkgdmlhIHRoZSBVSSB0aHJlYWQgc28gdGhlIGxpc3RlbmVyCi0gKiByZWNlaXZlcyBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgZ2VuZXJhdGVkLgotICovCi1wdWJsaWMgY2xhc3MgU1dUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgU1dUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnN0YXRlQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIERpc3BsYXkjYXN5bmNFeGVjKFJ1bm5hYmxlKSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyAjc3luY0V4ZWMoUnVubmFibGUpIGNhbiBzb210aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uVUlUaHJlYWQoUnVubmFibGUgcikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocik7Ci0vLwkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMocik7Ci0JfQotCi0Jdm9pZCBzdGF0ZUNoYW5nZWRfKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU1dUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAiKSI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5YTk3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBTV1QKLSAqIFVJIHRocmVhZC4KLSAqIEZvcndhcmQgKmV2ZXJ5KiBldmVudCBhc3luY2hyb25vdXNseSB2aWEgdGhlIFVJIHRocmVhZCBzbyB0aGUgbGlzdGVuZXIKLSAqIHJlY2VpdmVzIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkgd2VyZSBnZW5lcmF0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBUcmVlQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBTV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTm9kZVJlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFRyZWVDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZmluYWwgVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLm5vZGVBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibm9kZSBhZGRlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZmluYWwgVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLm5vZGVSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHJlbW92ZWQiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGZpbmFsIFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy50cmVlQ2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJlZSBjbGVhcmVkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2hhbmdlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheSNhc3luY0V4ZWMoUnVubmFibGUpIHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nICNzeW5jRXhlYyhSdW5uYWJsZSkgY2FuIHNvbXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25VSVRocmVhZChSdW5uYWJsZSByKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyKTsKLS8vCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhyKTsKLQl9Ci0KLQl2b2lkIG5vZGVBZGRlZF8oVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubm9kZUFkZGVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIG5vZGVSZW1vdmVkXyhUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5ub2RlUmVtb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCB0cmVlQ2xlYXJlZF8oVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNoYW5nZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgIikiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvSnB0VWlNYXBwaW5nc01lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9KcHRVaU1hcHBpbmdzTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0ZTU1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9KcHRVaU1hcHBpbmdzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBtYXBwaW5nIHBhbmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnB0VWlNYXBwaW5nc01lc3NhZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjY2Vzc1R5cGVDb21ib19kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX2VudW1lcmF0ZWRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX2ZldGNoTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9sb2JMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX29wdGlvbmFsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX3RlbXBvcmFsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm9vbGVhbl9GYWxzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX1RydWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9hbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9jYXNjYWRlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9tZXJnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXNjYWRlQ29tcG9zaXRlX3BlcnNpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9yZWZyZXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhc2NhZGVDb21wb3NpdGVfcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dDaG9vc2VyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9jb2x1bW5TZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2RldGFpbHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfbGVuZ3RoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfbnVsbGFibGVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfcHJlY2lzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9zY2FsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfdW5pcXVlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfdXBkYXRhYmxlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXJfRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9EZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRXaXRob3V0VmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFdpdGhWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlDb21wb3NpdGVfaW5oZXJpdGFuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5Q29tcG9zaXRlX3F1ZXJpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5Q29tcG9zaXRlX3RhYmxlRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlDb21wb3NpdGVfdGFibGVOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5R2VuZXJhbFNlY3Rpb25fbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdEVtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU5hbWVDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnVtVHlwZUNvbXBvc2l0ZV9vcmRpbmFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1UeXBlQ29tcG9zaXRlX3N0cmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZXRjaFR5cGVDb21wb3NpdGVfZWFnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmV0Y2hUeXBlQ29tcG9zaXRlX2xhenk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfYXV0bzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0ZWRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0b3JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2lkZW50aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3NlcXVlbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3N0cmF0ZWd5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3RhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvckNvbXBvc2l0ZV9hbGxvY2F0aW9uU2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0b3JDb21wb3NpdGVfaW5pdGlhbFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkQ2xhc3NDb21wb3NpdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3BrX2dlbmVyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3ByaW1hcnlLZXlHZW5lcmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZE1hcHBpbmdDb21wb3NpdGVfdGFibGVHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZV9jaGFyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluaGVyaXRhbmNlQ29tcG9zaXRlX2RldGFpbHNHcm91cEJveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yQ29sdW1uR3JvdXBCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfaW50ZWdlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX2pvaW5lZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3NpbmdsZV90YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9zdHJhdGVneTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3N0cmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3RhYmxlX3Blcl9jbGFzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZlcnNlSm9pbkNvbHVtbkRpYWxvZ19lZGl0SW52ZXJzZUpvaW5Db2x1bW5UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkNvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5Db21wb3NpdGVfam9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5Db21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5Db21wb3NpdGVfcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfYWRkSm9pbkNvbHVtbkRlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX2VkaXRKb2luQ29sdW1uRGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX2VkaXRKb2luQ29sdW1uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfcmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfY29sdW1uRGVmaW5pdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfZGVmYXVsdFdpdGhPbmVQYXJhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV9pbnNlcnRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX2luc2VydGFibGVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZVdpdGhEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX3RhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX3VuaXF1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV91bmlxdWVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV91cGRhdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdXBkYXRhYmxlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX2FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfZGVmYXVsdEVtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfam9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGFEYXRhQ29tcGxldGVDb21ib19EZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9jYXNjYWRlVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfZmV0Y2hUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9nZW5lcmFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9qb2luVGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX21hcHBlZEJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV90YXJnZXRFbnRpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeUhpbnRzR3JvdXBCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3Jlc3VsdENsYXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnlIaW50c0dyb3VwQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld05hbWVTdGF0ZU9iamVjdF9uYW1lQWxyZWFkeUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdOYW1lU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb05hbWVTZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9uZVNlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vbk93bmluZ01hcHBpbmdfbWFwcGVkQnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3B0aW9uYWxDb21wb3NpdGVfZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3B0aW9uYWxDb21wb3NpdGVfdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX2N1c3RvbU9yZGVyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyQnlDb21wb3NpdGVfbm9PcmRlcmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX29yZGVyQnlHcm91cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX29yZGVyQnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX3ByaW1hcnlLZXlPcmRlcmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfZGVmaW5lSW5YbWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX2Fzc29jaWF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX2pvaW5Db2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX25vTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9CYXNpY0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0VtYmVkZGVkSWRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9FbWJlZGRlZExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0lkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfTWFueVRvTWFueUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX01hbnlUb09uZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX09uZVRvTWFueUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX09uZVRvT25lTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVHJhbnNpZW50TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVmVyc2lvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRUeXBlUGFnZV9FbWJlZGRhYmxlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudFR5cGVQYWdlX0VudGl0eUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRUeXBlUGFnZV9NYXBwZWRTdXBlcmNsYXNzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudFR5cGVQYWdlX1VubWFwcGVkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkRGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19hZGRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZERlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2VkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZE5hdGl2ZVF1ZXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWROYXRpdmVRdWVyeURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWROYXRpdmVRdWVyeURlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZE5hdGl2ZVF1ZXJ5VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZFF1ZXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWRRdWVyeURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWRRdWVyeURlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZFF1ZXJ5VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9kaXNwbGF5U3RyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfZWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZE5hdGl2ZVF1ZXJ5RGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWROYXRpdmVRdWVyeURlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWROYXRpdmVRdWVyeVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfZWRpdE5hbWVkUXVlcnlEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZFF1ZXJ5RGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZFF1ZXJ5VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyeUhpbnRzQ29tcG9zaXRlX25hbWVDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcnlIaW50c0NvbXBvc2l0ZV92YWx1ZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFDaG9vc2VyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZFNlY29uZGFyeVRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX2NhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdENhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdFNjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0U2Vjb25kYXJ5VGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2VkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3NlY29uZGFyeVRhYmxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVDaG9vc2VyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlQ29tcG9zaXRlX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlQ29tcG9zaXRlX3RhYmxlU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3NjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZUdlbmVyYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV92YWx1ZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRFbnRpdHlDaG9vc2VyX2Jyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRFbnRpdHlDaG9vc2VyX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRFbnRpdHlDaG9vc2VyX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RW50aXR5Q2hvb3Nlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRFbnRpdHlDaG9vc2VyX3NlbGVjdFR5cGVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wb3JhbFR5cGVDb21wb3NpdGVfZGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wb3JhbFR5cGVDb21wb3NpdGVfdGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wb3JhbFR5cGVDb21wb3NpdGVfdGltZXN0YW1wOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aV9tYXBwaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpTWFwcGluZ3NNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kYi9BYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL0Fic3RyYWN0RGF0YWJhc2VPYmplY3RDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjNkMWQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL0Fic3RyYWN0RGF0YWJhc2VPYmplY3RDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24ga2VlcHMgYSBjb21ibyBpbiBzeW5jIHdpdGggdGhlIGRhdGFiYXNlIG9iamVjdHMKLSAqIHdoZW4gYSBjb25uZWN0aW9uIGlzIGFjdGl2ZS4KLSAqCi0gKiBAc2VlIENhdGFsb2dDb21ibwotICogQHNlZSBDb2x1bW5Db21ibwotICogQHNlZSBTY2hlbWFDb21ibwotICogQHNlZSBUYWJsZUNvbWJvCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0YWJhc2VPYmplY3RDb21ibzxUIGV4dGVuZHMgSnBhTm9kZT4gZXh0ZW5kcyBBYnN0cmFjdFBhbmU8VD4KLXsKLQkvKioKLQkgKiBUaGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBwYW5lLgotCSAqLwotCXByaXZhdGUgQ0NvbWJvIGNvbWJvOwotCi0JLyoqCi0JICogVGhlIGxpc3RlbmVyIGFkZGVkIHRvIHRoZSA8Y29kZT5Db25uZWN0aW9uUHJvZmlsZTwvY29kZT4gcmVzcG9uc2libGUgdG8KLQkgKiBrZWVwIHRoZSBjb21ibyBpbiBzeW5jIHdpdGggdGhlIGRhdGFiYXNlIG1ldGFkYXRhLgotCSAqLwotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm8oQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RGF0YWJhc2VPYmplY3RDb21ibyhBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm8oUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkKLQl7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkJbG9nKFRyYWNpbmcuVUlfREIsICJhYm91dFRvQ2xvc2UiKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2F0YWxvZyBjYXRhbG9nKSB7Ci0KLQkJCQlTV1RVdGlsLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxvZyhUcmFjaW5nLlVJX0RCLCAiY2F0YWxvZ0NoYW5nZWQ6ICIgKyBjYXRhbG9nLmdldE5hbWUoKSk7Ci0KLQkJCQkJCWlmICghZ2V0Q29tYm8oKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5jYXRhbG9nQ2hhbmdlZChjYXRhbG9nKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCi0JCQkJU1dUVXRpbC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsb2coVHJhY2luZy5VSV9EQiwgImNsb3NlZCIpOwotCi0JCQkJCQlpZiAoIWdldENvbWJvKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvLnRoaXMucmVwb3B1bGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbHVtbkNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb2x1bW4gY29sdW1uKSB7Ci0KLQkJCQlTV1RVdGlsLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxvZyhUcmFjaW5nLlVJX0RCLCAiY29sdW1uQ2hhbmdlZDogIiArIGNvbHVtbi5nZXROYW1lKCkpOwotCi0JCQkJCQlpZiAoIWdldENvbWJvKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvLnRoaXMuY29sdW1uQ2hhbmdlZChjb2x1bW4pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0KLQkJCQlsb2coVHJhY2luZy5VSV9EQiwgImRhdGFiYXNlQ2hhbmdlZCIpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCi0JCQkJU1dUVXRpbC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsb2coVHJhY2luZy5VSV9EQiwgImZvcmVpZ25LZXlDaGFuZ2VkOiAiICsgZm9yZWlnbktleS5nZXROYW1lKCkpOwotCi0JCQkJCQlpZiAoIWdldENvbWJvKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvLnRoaXMuZm9yZWlnbktleUNoYW5nZWQoZm9yZWlnbktleSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJCVNXVFV0aWwuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbG9nKFRyYWNpbmcuVUlfREIsICJtb2RpZmllZCIpOwotCi0JCQkJCQlpZiAoIWdldENvbWJvKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvLnRoaXMucmVwb3B1bGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkJbG9nKFRyYWNpbmcuVUlfREIsICJva1RvQ2xvc2UiKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQotCQkJCVNXVFV0aWwuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbG9nKFRyYWNpbmcuVUlfREIsICJvcGVuZWQiKTsKLQotCQkJCQkJaWYgKCFnZXRDb21ibygpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCUFic3RyYWN0RGF0YWJhc2VPYmplY3RDb21iby50aGlzLnJlcG9wdWxhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNjaGVtYSBzY2hlbWEpIHsKLQotCQkJCVNXVFV0aWwuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbG9nKFRyYWNpbmcuVUlfREIsICJzY2hlbWFDaGFuZ2VkOiAiICsgc2NoZW1hLmdldE5hbWUoKSk7Ci0KLQkJCQkJCWlmICghZ2V0Q29tYm8oKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5zY2hlbWFDaGFuZ2VkKHNjaGVtYSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2VxdWVuY2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0KLQkJCQlTV1RVdGlsLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxvZyhUcmFjaW5nLlVJX0RCLCAic2VxdWVuY2VDaGFuZ2VkOiAiICsgc2VxdWVuY2UuZ2V0TmFtZSgpKTsKLQotCQkJCQkJaWYgKCFnZXRDb21ibygpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCUFic3RyYWN0RGF0YWJhc2VPYmplY3RDb21iby50aGlzLnNlcXVlbmNlQ2hhbmdlZChzZXF1ZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGFibGUgdGFibGUpIHsKLQotCQkJCVNXVFV0aWwuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbG9nKFRyYWNpbmcuVUlfREIsICJ0YWJsZUNoYW5nZWQ6ICIgKyB0YWJsZS5nZXROYW1lKCkpOwotCi0JCQkJCQlpZiAoIWdldENvbWJvKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvLnRoaXMudGFibGVDaGFuZ2VkKHRhYmxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgYnVpbGRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmICghaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJQ0NvbWJvIGNvbWJvID0gKENDb21ibykgZS53aWRnZXQ7Ci0JCQkJCWlmIChjb21iby5nZXREYXRhKCJwb3B1bGF0aW5nIikgIT0gQm9vbGVhbi5UUlVFKSB7Ly9jaGVjayAhVFJVRSBiZWNhdXNlIG51bGwgaXMgYSBwb3NzaWJpbGl0eSBhcyB3ZWxsCi0JCQkJCQl2YWx1ZUNoYW5nZWQoY29tYm8uZ2V0VGV4dCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdmFsdWUgY2hhbmdlcyBidXQgdGhlIHN1YmplY3QgaXMgbnVsbCwgdGhlbiBpcyBpbnZva2VkIGluIG9yZGVyIHRvCi0JICogY3JlYXRlIHRoZSBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1aWxkU3ViamVjdCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGUKLQkgKgotCSAqIEBwYXJhbSBjYXRhbG9nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JfQotCi0JLyoqCi0JICogTWFrZXMgc3VyZSB0aGUgY29tYm8gc2hvd3Mgbm90aGluZyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZhbHVlIGJlY2F1c2UKLQkgKiB0aGUgZm9jdXMgaXMgc3RpbGwgb24gdGhlIGNvbWJvLiBUaGUgdXNlciBjYW4gc3RhcnQgdHlwaW5nIHNvbWV0aGluZyBhbmQKLQkgKiB3ZSBkb24ndCB3YW50IHRvIHN0YXJ0IHRoZSB0eXBpbmcgYWZ0ZXIgdGhlIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRGVmYXVsdFZhbHVlKCkgewotCi0JCWlmICh0aGlzLmNvbWJvLmlzRm9jdXNDb250cm9sKCkpIHsKLQotCQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQotCQkJdHJ5IHsKLQkJCQljb21iby5zZXRUZXh0KCIiKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlCi0JICoKLQkgKiBAcGFyYW0gY29sdW1uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sdW1uQ2hhbmdlZChDb2x1bW4gY29sdW1uKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBKUEEgcHJvamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBhY3RpdmUuCi0JICoKLQkgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIEpQQSBwcm9qZWN0J3MgY29ubmVjdGlvbiBwcm9maWxlIGlzIGFjdGl2ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSB0aGlzLmpwYVByb2plY3QoKTsKLQkJcmV0dXJuIChqcGFQcm9qZWN0ID09IG51bGwpID8gZmFsc2UgOiBqcGFQcm9qZWN0LmdldERhdGFTb3VyY2UoKS5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSlBBIHByb2plY3QncyBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBjb25uZWN0aW9uIHNldCBpbiB0aGUgcHJvamVjdCdzIHByb3BlcnRpZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBpdCBjb3VsZCBub3QgYmVpbmcgcmV0cmlldmVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSB0aGlzLmpwYVByb2plY3QoKTsKLQkJcmV0dXJuIChqcGFQcm9qZWN0ID09IG51bGwpID8gbnVsbCA6IGpwYVByb2plY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkYXRhYmFzZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjdGl2ZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBvbmxpbmUgZGF0YWJhc2Ugb3IgYSA8Y29kZT5udWxsPC9jb2RlPiBpbnN0YW5jZSBpZiBubwotCSAqIGNvbm5lY3Rpb24gcHJvZmlsZSB3YXMgc2V0IG9yIHRoZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEYXRhYmFzZSBkYXRhYmFzZSgpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCXJldHVybiAoY3AgPT0gbnVsbCkgPyBudWxsIDogY3AuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBkZWZhdWx0IGlzCi0JICogc3BlY2lmaWVkLgotCSAqCi0JICogQHJldHVybiBUaGUgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBkZWZhdWx0IHdoZW4gbm8gdmFsdWUgd2FzIHNwZWNpZmllZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZGVmYXVsdFZhbHVlKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoVCBzdWJqZWN0KSB7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZSgpOwotCQlpZiAoY3AgIT0gbnVsbCkgewotCQkJY3AucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCi0JCXN1cGVyLmRpc2VuZ2FnZUxpc3RlbmVycyhzdWJqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCi0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJcG9wdWxhdGVDb21ibygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQotCQlpZiAoIXRoaXMuY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmNvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoVCBzdWJqZWN0KSB7Ci0JCXN1cGVyLmVuZ2FnZUxpc3RlbmVycyhzdWJqZWN0KTsKLQotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUoKTsKLQkJaWYgKGNwICE9IG51bGwpIHsKLQkJCWNwLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUKLQkgKgotCSAqIEBwYXJhbSBmb3JlaWduS2V5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9yZWlnbktleUNoYW5nZWQoRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JfQotCi0JcHVibGljIGZpbmFsIENDb21ibyBnZXRDb21ibygpIHsKLQkJcmV0dXJuIHRoaXMuY29tYm87Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5jb21ibyA9IGJ1aWxkRWRpdGFibGVDQ29tYm8oY29udGFpbmVyKTsKLQkJdGhpcy5jb21iby5hZGRNb2RpZnlMaXN0ZW5lcihidWlsZE1vZGlmeUxpc3RlbmVyKCkpOwotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIodGhpcy5jb21ibyk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGUgc3ViamVjdCBzaG91bGQgYmUgY3JlYXRlZCB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzLgotCSAqCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1aWxkU3ViamVjdEFsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaXZlcyB0aGUgPGNvZGU+SUpwYVByb2plY3Q8L2NvZGU+IHRoYXQgaXMgcmVxdWlyZWQgdG8gcmVnaXN0ZXIgYQotCSAqIDxjb2RlPkNvbm5lY3Rpb25MaXN0ZW5lcjwvY29kZT4gaW4gb3JkZXIgdG8ga2VlcCB0aGUgY29tYm8gaW4gc3luYyB3aXRoCi0JICogdGhlIGFzc29jaWF0ZWQgb25saW5lIGRhdGFiYXNlLgotCSAqCi0JICogQHJldHVybiBUaGUgSlBBIHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBqcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gc3ViamVjdCgpID09IG51bGwgPyBudWxsIDogc3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIGZsYWcsIFN0cmluZyBtZXNzYWdlKSB7Ci0KLQkJc3VwZXIubG9nKGZsYWcsIG1lc3NhZ2UpOwotCi0JCWlmIChUcmFjaW5nLlVJX0RCLmVxdWFscyhmbGFnKSAmJgotCQkgICAgVHJhY2luZy5ib29sZWFuRGVidWdPcHRpb24oVHJhY2luZy5VSV9EQikpCi0JCXsKLQkJCUNsYXNzPD8+IHRoaXNDbGFzcyA9IGdldENsYXNzKCk7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gQ2xhc3NUb29scy5zaG9ydE5hbWVGb3IodGhpc0NsYXNzKTsKLQotCQkJaWYgKHRoaXNDbGFzcy5pc0Fub255bW91c0NsYXNzKCkpIHsKLQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNsYXNzTmFtZS5pbmRleE9mKCckJykpOwotCQkJCWNsYXNzTmFtZSArPSAiLT4iICsgQ2xhc3NUb29scy5zaG9ydE5hbWVGb3IodGhpc0NsYXNzLmdldFN1cGVyY2xhc3MoKSk7Ci0JCQl9Ci0KLQkJCVRyYWNpbmcubG9nKGNsYXNzTmFtZSArICI6ICIgKyBtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgY29tYm8ncyBsaXN0IGJ5IGFkZGluZyBmaXJzdCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhdmFpbGFibGUKLQkgKiBhbmQgdGhlbiB0aGUgcG9zc2libGUgY2hvaWNlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21ibygpIHsKLQotCQljb21iby5yZW1vdmVBbGwoKTsKLQkJcG9wdWxhdGVEZWZhdWx0VmFsdWUoKTsKLQotCQlpZiAodGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkpIHsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gQ29sbGVjdGlvblRvb2xzLnNvcnQodmFsdWVzKCkpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQkJY29tYm8uYWRkKGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCXVwZGF0ZVNlbGVjdGVkSXRlbSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGRlZmF1bHQgdmFsdWUgdG8gdGhlIGNvbWJvIGlmIG9uZSBleGlzdHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGVmYXVsdFZhbHVlKCkgewotCi0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSAoc3ViamVjdCgpICE9IG51bGwpID8gZGVmYXVsdFZhbHVlKCkgOiBudWxsOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJY29tYm8uYWRkKE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSkpOwotCQl9Ci0JCWVsc2UgewotCQkJY29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdEVtcHR5KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCQl1cGRhdGVTZWxlY3RlZEl0ZW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUKLQkgKgotCSAqIEBwYXJhbSBzY2hlbWEKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzY2hlbWFDaGFuZ2VkKFNjaGVtYSBzY2hlbWEpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGUKLQkgKgotCSAqIEBwYXJhbSBzZXF1ZW5jZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlQ2hhbmdlZChTZXF1ZW5jZSBzZXF1ZW5jZSkgewotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGdpdmVuIHZhbHVlIGFzIHRoZSBuZXcgdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSB0byBzZW5kIHRvIHRoZSBtb2RlbCBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogVGhlCi0JICoKLQkgKiBAcGFyYW0gdGFibGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGUgdGFibGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzZWxlY3RlZCBpdGVtIGJ5IHNlbGVjdGVkIHRoZSBjdXJyZW50IHZhbHVlLCBpZiBub3QKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgb3Igc2VsZWN0IHRoZSBkZWZhdWx0IHZhbHVlIGlmIG9uZSBpcyBhdmFpbGFibGUsCi0JICogb3RoZXJ3aXNlIHJlbW92ZSB0aGUgc2VsZWN0aW9uLgotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBJdCBzZWVtcyB0aGUgdGV4dCBjYW4gYmUgc2hvd24gYXMgdHJ1bmNhdGVkLCBjaGFuZ2luZyB0aGUKLQkgKiBzZWxlY3Rpb24gdG8gKDAsIDApIG1ha2VzIHRoZSBlbnRpcmUgdGV4dCB2aXNpYmxlLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3RlZEl0ZW0oKSB7Ci0KLQkJVCBzdWJqZWN0ID0gc3ViamVjdCgpOwotCi0JCVN0cmluZyB2YWx1ZSAgICAgICAgID0gKHN1YmplY3QgIT0gbnVsbCkgPyB2YWx1ZSgpICAgICAgICA6IG51bGw7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgID0gKHN1YmplY3QgIT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUoKSA6IG51bGw7Ci0JCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk7Ci0KLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5U3RyaW5nID0gTkxTLmJpbmQoCi0JCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZQotCQkJKTsKLQkJfQotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1cCB0byBkYXRlCi0JCWlmICghY29tYm8uZ2V0SXRlbSgwKS5lcXVhbHMoZGlzcGxheVN0cmluZykpIHsKLQkJCWNvbWJvLnJlbW92ZSgwKTsKLQkJCWNvbWJvLmFkZChkaXNwbGF5U3RyaW5nLCAwKTsKLQkJfQotCi0JCS8vIFNlbGVjdCB0aGUgbmV3IHZhbHVlCi0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAoIXZhbHVlLmVxdWFscyhjb21iby5nZXRUZXh0KCkpKSB7Ci0JCQkJLy90aGlzIHByZXZlbnRzIHRoZSBjdXJzb3IgZnJvbSBiZWluZyBzZXQgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIChidWcgMjM0NDE4KS4KLQkJCQkvL1RoZSByZWFzb24gd2UgYXJlIGhpdHRpbmcgdGhpcyB1cGRhdGVTZWxlY3RlZEl0ZW0oKSBjb2RlIGF0IGFsbAotCQkJCS8vaXMgYmVjYXVzZSB0aGUgY29udGV4dCBtb2RlbCBpcyAgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJCQkvL2luIGEgd2F5IHRoYXQgY2F1c2VzIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIGJlIGZpcmVkICh0aGUgYW5ub3RhdGlvbiBpcyBhZGRlZCAKLQkJCQkvL3RvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hhbmdlIG5vdGlmaWNhdGlvbiBvY2N1cnMgb24gdGhlIHVwZGF0ZSB0aHJlYWQsIAotCQkJCS8vYW5kIHRoZW4gdGhlIG5hbWUgaXMgc2V0LCB0aGVzZSAyIHRocmVhZHMgY2FuIGdldCBpbiB0aGUgd3Jvbmcgb3JkZXIpLgotCQkJCS8vVGhlIHZhbHVlQ2hhbmdlZCgpIG1ldGhvZCBzZXRzIHRoZSBwb3B1bGF0aW5nIGZsYWcgdG8gdHJ1ZSwgYnV0IGluIHRoaXMgY2FzZQotCQkJCS8vaXQgaXMgYWxyZWFkeSBzZXQgYmFjayB0byBmYWxzZSB3aGVuIHdlIHJlY2VpdmUgbm90aWZpY2F0aW9uIGJhY2sgZnJvbSB0aGUgbW9kZWwKLQkJCQkvL2JlY2F1c2UgaXQgaGFzIG1vdmVkIHRvIHRoZSB1cGRhdGUgdGhyZWFkIGFuZCB0aGVuIGp1bXBzIGJhY2sgb24gdGhlIFVJIHRocmVhZC4KLQkJCQljb21iby5zZXRUZXh0KHZhbHVlKTsKLQkJCX0KLQkJfQotCQkvLyBTZWxlY3QgdGhlIGRlZmF1bHQgdmFsdWUKLQkJZWxzZSB7Ci0JCQljb21iby5zZWxlY3QoMCk7Ci0JCQkKLQkJCS8vaSB0aGluayB3ZSBjYW4gcmVtb3ZlIHRoaXMsIEkgZG9uJ3QgYmVsaWV2ZSB0aGUgcHJvYmxlbSBleHBsYWluZWQKLQkJCS8vaW4gdGhlIGNvbW1lbnRzIG9mIHRoaXMgbWV0aG9kIGlzIGhhcHBlbmluZyBhbnltb3JlLiBOb3QgcmVtb3ZpbmcgaXQgbm93IGJlY2F1c2Ugd2UgYXJlIHdvcmtpbmcgb24gMi4wUkMzCi0JCQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIDApKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcXVlc3RzIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlIG1vZGVsIG9iamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIHZhbHVlKCk7Ci0KLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLCB1cGRhdGUgdGhlIG1vZGVsIGlmIHJlcXVpcmVkLgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoU3RyaW5nIHZhbHVlKSB7Ci0KLQkJSnBhTm9kZSBzdWJqZWN0ID0gc3ViamVjdCgpOwotCi0JCWlmICgoc3ViamVjdCA9PSBudWxsKSAmJiAhaXNCdWlsZFN1YmplY3RBbGxvd2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBvbGRWYWx1ZSA9IChzdWJqZWN0ICE9IG51bGwpID8gdmFsdWUoKSA6IG51bGw7Ci0KLQkJLy8gQ2hlY2sgZm9yIG51bGwgdmFsdWUKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodmFsdWUpKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0KLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KG9sZFZhbHVlKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIENvbnZlcnQgdGhlIGRlZmF1bHQgdmFsdWUgdG8gbnVsbAotCQlpZiAodmFsdWUgIT0gbnVsbCAmJgotCQkgICAgZ2V0Q29tYm8oKS5nZXRJdGVtQ291bnQoKSA+IDAgJiYKLQkJICAgIHZhbHVlLmVxdWFscyhnZXRDb21ibygpLmdldEl0ZW0oMCkpKQotCQl7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQotCQkvLyBOb3RoaW5nIHRvIGNoYW5nZQotCQlpZiAoKG9sZFZhbHVlID09IHZhbHVlKSAmJiB2YWx1ZSA9PSBudWxsKSB7Ci0JCQljbGVhckRlZmF1bHRWYWx1ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQnVpbGQgdGhlIHN1YmplY3QgYmVmb3JlIHNldHRpbmcgdGhlIHZhbHVlCi0JCWlmIChzdWJqZWN0ID09IG51bGwpIHsKLQkJCWJ1aWxkU3ViamVjdCgpOwotCQl9Ci0KLQkJLy8gU2V0IHRoZSBuZXcgdmFsdWUKLQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJiAob2xkVmFsdWUgPT0gbnVsbCkgfHwKLQkJICAgKChvbGRWYWx1ZSAhPSBudWxsKSAmJiAhb2xkVmFsdWUuZXF1YWxzKHZhbHVlKSkpIHsKLQotCQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJCWNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCBCb29sZWFuLlRSVUUpOwotCi0JCQl0cnkgewotCQkJCXNldFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJCWNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCBCb29sZWFuLkZBTFNFKTsKLQkJCX0KLQotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQljbGVhckRlZmF1bHRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBwb3NzaWJsZSB2YWx1ZXMsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbWJvIGR1cmluZwotCSAqIHBvcHVsYXRpb24uCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiBvZiB0aGUgcG9zc2libGUKLQkgKiBjaG9pY2VzIHRvIGJlIGFkZGVkIHRvIHRoZSBjb21ibwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvcjxTdHJpbmc+IHZhbHVlcygpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kYi9DYXRhbG9nQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL0NhdGFsb2dDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDRlMjcyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL0NhdGFsb2dDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgZGF0YWJhc2Ugb2JqZWN0IGNvbWJvIGhhbmRsZXMgc2hvd2luZyB0aGUgZGF0YWJhc2UncyBjYXRhbG9ncy4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENhdGFsb2dDb21ibzxUIGV4dGVuZHMgSnBhTm9kZT4gZXh0ZW5kcyBBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm88VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhdGFsb2dDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2F0YWxvZ0NvbWJvKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2F0YWxvZ0NvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDYXRhbG9nQ29tYm8oQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhdGFsb2dDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQ2F0YWxvZ0NvbWJvKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHZhbHVlcygpIHsKLQkJRGF0YWJhc2UgZGIgPSB0aGlzLmRhdGFiYXNlKCk7Ci0JCXJldHVybiAoZGIgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSA6IGRiLmNhdGFsb2dOYW1lcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGIvQ29sdW1uQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL0NvbHVtbkNvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTlkZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGIvQ29sdW1uQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgZGF0YWJhc2Ugb2JqZWN0IGNvbWJvIGhhbmRsZXMgc2hvd2luZyBhIHNpbmdsZSBvciBtdWx0aXBsZSB0YWJsZXMnCi0gKiBjb2x1bW5zLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sdW1uQ29tYm88VCBleHRlbmRzIEpwYU5vZGU+IGV4dGVuZHMgQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db2x1bW5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ29sdW1uQ29tYm8oQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbHVtbkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDb2x1bW5Db21ibyhBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbHVtbkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBDb2x1bW5Db21ibyhQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCBzdXBwbGllcyB0aGUgY29sdW1uIG5hbWVzLgotCSAqIEFzc3VtZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgc3VwcGxpZXMgdGhlIGNvbHVtbiBuYW1lcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGFibGUgZ2V0REJUYWJsZV8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgc3VwcGxpZXMgdGhlIGNvbHVtbiBuYW1lcy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgc3VwcGxpZXMgdGhlIGNvbHVtbiBuYW1lcy4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFibGUgZ2V0REJUYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnN1YmplY3QoKSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldERCVGFibGVfKCk7Ci0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGUgdGFibGUpIHsKLQkJc3VwZXIudGFibGVDaGFuZ2VkKHRhYmxlKTsKLQkJaWYgKHRoaXMuZ2V0REJUYWJsZSgpID09IHRhYmxlKSB7Ci0JCQl0aGlzLmRvUG9wdWxhdGUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHZhbHVlcygpIHsKLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERCVGFibGUoKTsKLQkJcmV0dXJuICh0YWJsZSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpIDogdGFibGUuY29sdW1uTmFtZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL1NjaGVtYUNvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kYi9TY2hlbWFDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDcxM2RmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL1NjaGVtYUNvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBkYXRhYmFzZSBvYmplY3QgY29tYm8gaGFuZGxlcyBzaG93aW5nIHRoZSBkYXRhYmFzZSdzIHNjaGVtYXMuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTY2hlbWFDb21ibzxUIGV4dGVuZHMgSnBhTm9kZT4gZXh0ZW5kcyBBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm88VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNjaGVtYUNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTY2hlbWFDb21ibyhBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2NoZW1hQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFNjaGVtYUNvbWJvKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2NoZW1hQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFNjaGVtYUNvbWJvKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KQotCXsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB2YWx1ZXMoKSB7Ci0JCURhdGFiYXNlIGRiID0gdGhpcy5kYXRhYmFzZSgpOwotCQlyZXR1cm4gKGRiID09IG51bGwpID8gRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCkgOiBkYi5zY2hlbWFOYW1lcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGIvU2VxdWVuY2VDb21iby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGIvU2VxdWVuY2VDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDRiZmNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL1NlcXVlbmNlQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgZGF0YWJhc2Ugb2JqZWN0IGNvbWJvIGhhbmRsZXMgc2hvd2luZyB0aGUgZGF0YWJhc2UncyBzZXF1ZW5jZXMgZm9yIGEKLSAqIGdpdmVuIDxjb2RlPlNjaGVtYTwvY29kZT4uCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXF1ZW5jZUNvbWJvPFQgZXh0ZW5kcyBKcGFOb2RlPiBleHRlbmRzIEFic3RyYWN0RGF0YWJhc2VPYmplY3RDb21ibzxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VxdWVuY2VDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2VxdWVuY2VDb21ibyhBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VxdWVuY2VDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2VxdWVuY2VDb21ibyhBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZXF1ZW5jZUNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBTZXF1ZW5jZUNvbWJvKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkKLQl7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFNjaGVtYSBzY2hlbWEoKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHZhbHVlcygpIHsKLQkJU2NoZW1hIHNjaGVtYSA9IHNjaGVtYSgpOwotCQlyZXR1cm4gKHNjaGVtYSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpIDogc2NoZW1hLnNlcXVlbmNlTmFtZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL1RhYmxlQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL1RhYmxlQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwNjc4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kYi9UYWJsZUNvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGRhdGFiYXNlIG9iamVjdCBjb21ibyBoYW5kbGVzIHNob3dpbmcgdGhlIGRhdGFiYXNlJ3MgdGFibGVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGFibGVDb21ibzxUIGV4dGVuZHMgSnBhTm9kZT4gZXh0ZW5kcyBBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm88VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhYmxlQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRhYmxlQ29tYm8oQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFibGVDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGFibGVDb21ibyhBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYWJsZUNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBUYWJsZUNvbWJvKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkKLQl7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBzY2hlbWEgZnJvbSB3aGVyZSB0aGUgdGFibGUgaXMgbG9jYXRlZC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHRhYmxlJ3Mgc2NoZW1hIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIHNjaGVtYU5hbWUoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRhYmxlQ2hhbmdlZChUYWJsZSB0YWJsZSkgewotCQlzdXBlci50YWJsZUNoYW5nZWQodGFibGUpOwotCi0JCWlmICh0YWJsZSA9PSB0YWJsZSgpKSB7Ci0JCQl0aGlzLmRvUG9wdWxhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIGRhdGFiYXNlIHRhYmxlLgotCSAqCi0JICogQHJldHVybiBUaGUgc2VsZWN0ZWQgdGFibGUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGFibGUgdGFibGUoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHZhbHVlcygpIHsKLQotCQlEYXRhYmFzZSBkYiA9IHRoaXMuZGF0YWJhc2UoKTsKLQkJaWYgKGRiID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQotCQlTdHJpbmcgc2NoZW1hTmFtZSA9IHRoaXMuc2NoZW1hTmFtZSgpOwotCQlpZiAoc2NoZW1hTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IGRiLmdldFNjaGVtYU5hbWVkKHNjaGVtYU5hbWUpOwotCQlyZXR1cm4gKHNjaGVtYSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpIDogc2NoZW1hLnRhYmxlTmFtZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0MGVmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBCYXNlRW1iZWRkZWRNYXBwaW5nCi0gKiBAc2VlIEJhc2VKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqIEBzZWUgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBCYXNlRW1iZWRkZWRNYXBwaW5nPiBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8VD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QmFzZUVtYmVkZGVkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQluZXcgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4MGMzMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Fic3RyYWN0RW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW50aXR5TmFtZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IElkQ2xhc3NDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSB2IEF0dHJpYnV0ZSBPdmVycmlkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gdiBTZWNvbmRhcnkgVGFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIHYgSW5oZXJpdGFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEluaGVyaXRhbmNlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSB2IFF1ZXJpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBRdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gdiBHZW5lcmF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgR2VuZXJhdG9yc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEVudGl0eU5hbWVDb21wb3NpdGUKLSAqIEBzZWUgSW5oZXJpdGFuY2VDb21wb3NpdGUKLSAqIEBzZWUgSWRDbGFzc0NvbXBvc2l0ZQotICogQHNlZSBPdmVycmlkZXNDb21wb3NpdGUKLSAqIEBzZWUgVGFibGVDb21wb3NpdGUKLSAqIEBzZWUgR2VuZXJhdG9yc0NvbXBvc2l0ZQotICoKLSAqIFRPRE8gdGFsayB0byBKYXZhRWRpdG9yIHBlb3BsZSBhYm91dCB3aGF0IHdlIGNhbiBkbyB0byBob29rIGluIFRhYmJlZFByb3BlcnRpZXMgZm9yIHRoZSBKYXZhRWRpdG9yCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTxUIGV4dGVuZHMgRW50aXR5PiBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8VD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JRW50aXR5PC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBidWlsZFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBidWlsZEluaGVyaXRhbmNlQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGU+IGJ1aWxkVGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5LCBUYWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSB0cmFuc2Zvcm1fKEVudGl0eSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRUYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplUXVlcmllc1BhbmUoY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUluaGVyaXRhbmNlUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplR2VuZXJhdG9yc1BhbmUoY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlc1BhbmUoY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdyb3VwQm94TWFyZ2luKCk7Ci0KLQkJLy8gRW50aXR5IE5hbWUgd2lkZ2V0cwotCQluZXcgRW50aXR5TmFtZUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pCi0JCSk7Ci0KLQkJLy8gVGFibGUgd2lkZ2V0cwotCQluZXcgVGFibGVDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRUYWJsZUhvbGRlcigpLAotCQkJY29udGFpbmVyCi0JCSk7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgQ2xhc3Mgd2lkZ2V0cwotCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pCi0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVF1ZXJpZXNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBidWlsZENvbGxhcHNhYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlDb21wb3NpdGVfcXVlcmllcwotCQkpOwotCi0JCW5ldyBRdWVyaWVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkQ29sbGFwc2FibGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXMKLQkJKTsKLQotCQluZXcgT3ZlcnJpZGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUluaGVyaXRhbmNlUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRW50aXR5Q29tcG9zaXRlX2luaGVyaXRhbmNlCi0JCSk7Ci0KLQkJYnVpbGRJbmhlcml0YW5jZUNvbXBvc2l0ZShjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3ByaW1hcnlLZXlHZW5lcmF0aW9uCi0JCSk7Ci0KLQkJbmV3IEdlbmVyYXRvcnNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3NlY29uZGFyeVRhYmxlcwotCQkpOwotCi0JCWJ1aWxkU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYWM4ZmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiLkNvbHVtbkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRDb250cm9sVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFN0cmF0ZWd5OiAgICAgICAgICAgIHwgRW51bUNvbWJvVmlld2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFZhbHVlOiAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ID4gRGlzY3JpbWluYXRvciBDb2x1bW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgIHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFR5cGU6ICAgICAgICAgICAgICAgIHwgRW51bUNvbWJvVmlld2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENvbHVtbiBEZWZpbml0aW9uOiAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IExlbmd0aDogICAgICAgICAgICAgIHwgSSAgICAgICB8SXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENvbHVtbkNvbWJvCi0gKiBAc2VlIEVudW1Db21ib1ZpZXdlcgotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTxUIGV4dGVuZHMgRW50aXR5PiBleHRlbmRzIEFic3RyYWN0UGFuZTxUPiB7Ci0KLQkvKioKLQkgKiBBIGtleSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhpcyBpcyByZXF1aXJlZCB0byBjb252ZXJ0Ci0JICogdGhlIHNlbGVjdGVkIGl0ZW0gZnJvbSBhIGNvbWJvIHRvIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGtleSBpcyBtb3N0Ci0JICogbGlrZWx5IG5ldmVyIHR5cGVkIHRoZSB1c2VyIGFuZCBpdCB3aWxsIGhlbHAgdG8gY29udmVydCB0aGUgdmFsdWUgdG8KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIGl0J3MgdGltZSB0byBzZXQgdGhlIG5ldyBzZWxlY3RlZCB2YWx1ZSBpbnRvIHRoZQotCSAqIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfS0VZID0gIj8hIyE/Iz8jP2RlZmF1bHQ/Iz8hIz8hIz8iOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Jbmhlcml0YW5jZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxEaXNjcmltaW5hdG9yQ29sdW1uPiBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RGlzY3JpbWluYXRvckNvbHVtbiwgU3RyaW5nPihkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyLCBEaXNjcmltaW5hdG9yQ29sdW1uLkNPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0Q29sdW1uRGVmaW5pdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JMaXN0VmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWSArIG5hbWU7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRMZW5ndGhIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPERpc2NyaW1pbmF0b3JDb2x1bW4sIEludGVnZXI+KGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpLCBEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RIX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldERlZmF1bHRMZW5ndGgoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoSW50ZWdlci5NSU5fVkFMVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkRGVmYXVsdExlbmd0aExhYmVsKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlMYWJlbCBsYWJlbCA9IGJ1aWxkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGVmYXVsdFdpdGhvdXRWYWx1ZQotCQkpOwotCi0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoCi0JCQluZXcgTGFiZWxlZExhYmVsKGxhYmVsKSwKLQkJCWJ1aWxkRGVmYXVsdExlbmd0aExhYmVsSG9sZGVyKCkKLQkJKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRMZW5ndGhMYWJlbEhvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXIsIFN0cmluZz4oYnVpbGREZWZhdWx0TGVuZ3RoSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJbnRlZ2VyIHZhbHVlKSB7Ci0KLQkJCQlJbnRlZ2VyIGRlZmF1bHRWYWx1ZSA9IChzdWJqZWN0KCkgIT0gbnVsbCkgPyBzdWJqZWN0KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSA6Ci0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSDsKLQotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsCi0JCQkJCWRlZmF1bHRWYWx1ZQotCQkJCSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5Db21ibzxEaXNjcmltaW5hdG9yQ29sdW1uPiBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5Db21ibygKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPERpc2NyaW1pbmF0b3JDb2x1bW4+IGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIpIHsKLQotCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPERpc2NyaW1pbmF0b3JDb2x1bW4+KAotCQkJdGhpcywKLQkJCWRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIsCi0JCQljb250YWluZXIpCi0JCXsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoTmFtZWRDb2x1bW4uREVGQVVMVF9OQU1FX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZE5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSBnZXREQlRhYmxlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPERpc2NyaW1pbmF0b3JDb2x1bW4+IGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHksIERpc2NyaW1pbmF0b3JDb2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvckNvbHVtbiB0cmFuc2Zvcm1fKEVudGl0eSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPERpc2NyaW1pbmF0b3JDb2x1bW4sIERpc2NyaW1pbmF0b3JUeXBlPiBidWlsZERpc2NyaW1pbmF0b3JUeXBlQ29tYm8oCi0JCUNvbXBvc2l0ZSBjb250YWluZXIsCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxEaXNjcmltaW5hdG9yQ29sdW1uPiBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPERpc2NyaW1pbmF0b3JDb2x1bW4sIERpc2NyaW1pbmF0b3JUeXBlPigKLQkJCXRoaXMsCi0JCQlkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyLAotCQkJY29udGFpbmVyKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRGlzY3JpbWluYXRvclR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhEaXNjcmltaW5hdG9yVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5jbGFzcywKLQkJCQkJQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZS5jbGFzcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRGlzY3JpbWluYXRvclR5cGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGREaXNjcmltaW5hdG9yVmFsdWVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChzdWJqZWN0KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0KLQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gREVGQVVMVF9LRVkgKyB2YWx1ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZhbHVlID0gREVGQVVMVF9LRVk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAodmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHROYW1lID0gdmFsdWUuc3Vic3RyaW5nKERFRkFVTFRfS0VZLmxlbmd0aCgpKTsKLQotCQkJCQlpZiAoZGVmYXVsdE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQl2YWx1ZSA9IE5MUy5iaW5kKAotCQkJCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aFZhbHVlLAotCQkJCQkJCWRlZmF1bHROYW1lCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdmFsdWUgPSBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGVmYXVsdFdpdGhvdXRWYWx1ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREaXNjcmltaW5hdG9yVmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5TUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCS8vIENvbnZlcnQgdGhlIGRlZmF1bHQgdmFsdWUgb3IgYW4gZW1wdHkgc3RyaW5nIHRvIG51bGwKLQkJCQlpZiAoKHZhbHVlICE9IG51bGwpICYmCi0JCQkJICAgKCh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB8fCB2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSkpIHsKLQotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCi0JCQkJc3ViamVjdC5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERpc2NyaW1pbmF0b3JWYWx1ZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBidWlsZERlZmF1bHREaXNjcmltaW5hdG9yTGlzdFZhbHVlSG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZExlbmd0aEhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RGlzY3JpbWluYXRvckNvbHVtbj4gZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcikgewotCi0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPERpc2NyaW1pbmF0b3JDb2x1bW4sIEludGVnZXI+KGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIsIERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTcGVjaWZpZWRMZW5ndGgoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0U3BlY2lmaWVkTGVuZ3RoKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RW50aXR5LCBJbmhlcml0YW5jZVR5cGU+IGJ1aWxkU3RyYXRlZ3lDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEVudGl0eSwgSW5oZXJpdGFuY2VUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnRpdHkuREVGQVVMVF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5LlNQRUNJRklFRF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZVtdIGNob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEluaGVyaXRhbmNlVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEluaGVyaXRhbmNlVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5jbGFzcywKLQkJCQkJQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZS5jbGFzcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoSW5oZXJpdGFuY2VUeXBlIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGlzY3JpbWluYXRvckNvbHVtblBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxEaXNjcmltaW5hdG9yQ29sdW1uPiBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyID0KLQkJCWJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpOwotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9uYW1lLAotCQkJYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uQ29tYm8oY29udGFpbmVyLCBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9JTkhFUklUQU5DRV9ESVNDUklNSU5BVE9SX0NPTFVNTgotCQkpOwotCi0JCS8vIERpc2NyaW1pbmF0b3IgVHlwZSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlLAotCQkJYnVpbGREaXNjcmltaW5hdG9yVHlwZUNvbWJvKGNvbnRhaW5lciwgZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9UWVBFCi0JCSk7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVN1YlNlY3Rpb24oCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAxMCksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfZGV0YWlsc0dyb3VwQm94LAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQotCQkpOwotCi0JCS8vIExlbmd0aCB3aWRnZXRzCi0JCVNwaW5uZXIgbGVuZ3RoU3Bpbm5lciA9IGJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2xlbmd0aCwKLQkJCWJ1aWxkTGVuZ3RoSG9sZGVyKGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJYnVpbGREZWZhdWx0TGVuZ3RoTGFiZWwoY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0xFTkdUSAotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lciwgbGVuZ3RoU3Bpbm5lcik7Ci0KLQkJLy8gQ29sdW1uIERlZmluaXRpb24gd2lkZ2V0cwotCQlidWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uLAotCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIpCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ3JvdXBCb3hNYXJnaW4oKTsKLQotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGJ1aWxkU3ViUGFuZSgKLQkJCWNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luCi0JCSk7Ci0KLQkJLy8gU3RyYXRlZ3kgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQlzdWJQYW5lLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkluaGVyaXRhbmNlQ29tcG9zaXRlX3N0cmF0ZWd5LAotCQkJYnVpbGRTdHJhdGVneUNvbWJvKHN1YlBhbmUpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0lOSEVSSVRBTkNFX1NUUkFURUdZCi0JCSk7Ci0KLQkJLy8gRGlzY3JpbmF0b3IgVmFsdWUgd2lkZ2V0cwotCQlDQ29tYm8gZGlzY3JpbWluYXRvclZhbHVlQ29tYm8gPSBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibygKLQkJCXN1YlBhbmUsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlLAotCQkJYnVpbGREaXNjcmltaW5hdG9yVmFsdWVMaXN0SG9sZGVyKCksCi0JCQlidWlsZERpc2NyaW1pbmF0b3JWYWx1ZUhvbGRlcigpLAotCQkJYnVpbGREaXNjcmltaW5hdG9yVmFsdWVDb252ZXJ0ZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9JTkhFUklUQU5DRV9ESVNDUklNSU5BVE9SX1ZBTFVFCi0JCSk7Ci0KLQkJLy8gRGlzY3JpbWluYXRvciBDb2x1bW4gc3ViLXBhbmUKLQkJQ29tcG9zaXRlIGRpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIgPSBidWlsZFRpdGxlZFBhbmUoCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAxMCksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvckNvbHVtbkdyb3VwQm94Ci0JCSk7Ci0KLQkJaW5pdGlhbGl6ZURpc2NyaW1pbmF0b3JDb2x1bW5QYW5lKGRpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIpOwotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyB3aWRnZXRzCi0JCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGxheW91dCBvZiB0aGUgZ2l2ZW4gY29udGFpbmVyIGJ5IGNoYW5naW5nIHdoaWNoIHdpZGdldCB3aWxsCi0JICogZ3JhYiB0aGUgZXhjZXNzIG9mIGhvcml6b250YWwgc3BhY2UuIEJ5IGRlZmF1bHQsIHRoZSBjZW50ZXIgY29udHJvbCBncmFicwotCSAqIHRoZSBleGNlc3Mgc3BhY2UsIHdlIGNoYW5nZSBpdCB0byBiZSB0aGUgcmlnaHQgY29udHJvbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBjb250YWluaW5nIHRoZSBjb250cm9scyBuZWVkaW5nIHRoZWlyCi0JICogPGNvZGU+R3JpZERhdGE8L2NvZGU+IHRvIGJlIG1vZGlmaWVkIGZyb20gdGhlIGRlZmF1bHQgdmFsdWVzCi0JICogQHBhcmFtIHNwaW5uZXIgVGhlIHNwaW5uZXIgdGhhdCBnb3QgY3JlYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyLCBTcGlubmVyIHNwaW5uZXIpIHsKLQotCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGUgc3Bpbm5lcidzIHBhcmVudCBpcyBub3QgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkJLy8gbGFiZWwsIHNwaW5uZXIgYW5kIHJpZ2h0IGNvbnRyb2wgKGEgcGFuZSBpcyBzb21ldGltZXMgcmVxdWlyZWQgZm9yCi0JCS8vIHBhaW50aW5nIHRoZSBzcGlubmVyJ3MgYm9yZGVyKQotCQlDb21wb3NpdGUgcGFuZUNvbnRhaW5lciA9IHNwaW5uZXIuZ2V0UGFyZW50KCk7Ci0KLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBwYW5lQ29udGFpbmVyLmdldFBhcmVudCgpKSB7Ci0JCQlwYW5lQ29udGFpbmVyID0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKTsKLQkJfQotCi0JCUNvbnRyb2xbXSBjb250cm9scyA9IHBhbmVDb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWNvbnRyb2xzWzFdLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNvbnRyb2xzWzJdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVBbGlnblJpZ2h0KGNvbnRyb2xzWzJdKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjcxYTFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBvc3RFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BYnN0cmFjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBKb2luIENvbHVtbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEluaGVyaXRhbmNlQ29tcG9zaXRlIC0gVGhlIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlPFQgZXh0ZW5kcyBFbnRpdHk+IGV4dGVuZHMgQWJzdHJhY3RQYW5lPFQ+Ci17Ci0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1uSG9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0KLQkJRW50aXR5IHN1YmplY3QgPSBzdWJqZWN0KCk7Ci0JCWludCBpbmRleCA9IHN1YmplY3Quc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBzdWJqZWN0LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGluZGV4KTsKLQkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nID0gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nKAotCQkJc2hlbGwoKSwKLQkJCXN1YmplY3QoKSwKLQkJCW51bGwKLQkJKTsKLQotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEFkZFByaW1hcnlLZXlKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2c+IGJ1aWxkQWRkUHJpbWFyeUtleUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCWFkZEpvaW5Db2x1bW4oZGlhbG9nLnN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpOwotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nPiBidWlsZEVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJZWRpdEpvaW5Db2x1bW4oZGlhbG9nLnN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkSm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRKb2luQ29sdW1uTGFiZWwoUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlpZiAoam9pbkNvbHVtbi5pc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdCwKLQkJCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJCSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCXJldHVybiBOTFMuYmluZCgKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXMsCi0JCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkpOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZEpvaW5Db2x1bW5zQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgewotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2VkaXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQkJCWludFtdIHNlbGVjdGVkSW5kaWNlcyA9IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKTsKLQkJCQlFbnRpdHkgZW50aXR5ID0gc3ViamVjdCgpOwotCi0JCQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJCQllbnRpdHkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBidWlsZEpvaW5Db2x1bW5MYWJlbCgoUHJpbWFyeUtleUpvaW5Db2x1bW4pIGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW4+LCBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFByaW1hcnlLZXlKb2luQ29sdW1uPigKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdEhvbGRlcigpLAotCQkJTmFtZWRDb2x1bW4uU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksCi0JCQlOYW1lZENvbHVtbi5ERUZBVUxUX05BTUVfUFJPUEVSVFksCi0JCQlCYXNlSm9pbkNvbHVtbi5TUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwKLQkJCUJhc2VKb2luQ29sdW1uLkRFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWQotCQkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eSwgUHJpbWFyeUtleUpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oc3RhdGVPYmplY3QuZ2V0Sm9pbkNvbHVtbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIGRpYWxvZyA9IG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZygKLQkJCXNoZWxsKCksCi0JCQlzdWJqZWN0KCksCi0JCQlqb2luQ29sdW1uCi0JCSk7Ci0KLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRFZGl0UHJpbWFyeUtleUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJam9pbkNvbHVtbkhvbGRlciA9IGJ1aWxkSm9pbkNvbHVtbkhvbGRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBncm91cCBwYW5lCi0JCUdyb3VwIGdyb3VwUGFuZSA9IGJ1aWxkVGl0bGVkUGFuZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW4KLQkJKTsKLQotCQkvLyBPdmVycmlkZSBEZWZhdWx0IEpvaW4gQ29sdW1ucyBjaGVjayBib3gKLQkJYnVpbGRDaGVja0JveCgKLQkJCWJ1aWxkU3ViUGFuZShncm91cFBhbmUsIDgpLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKQotCQkpOwotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBsaXN0IHBhbmUKLQkJQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PiBqb2luQ29sdW1uc0xpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4oCi0JCQl0aGlzLAotCQkJZ3JvdXBQYW5lLAotCQkJYnVpbGRKb2luQ29sdW1uc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdE1vZGVsKCksCi0JCQlqb2luQ29sdW1uSG9sZGVyLAotCQkJYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUwotCQkpOwotCi0JCWluc3RhbGxKb2luQ29sdW1uc0xpc3RQYW5lRW5hYmxlcihqb2luQ29sdW1uc0xpc3RQYW5lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbEpvaW5Db2x1bW5zTGlzdFBhbmVFbmFibGVyKEFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4gcGFuZSkgewotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSwKLQkJCXBhbmUKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbHVtbnMoYm9vbGVhbiBzZWxlY3RlZCkgewotCi0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQotCQl0cnkgewotCQkJLy8gQWRkIGEgam9pbiBjb2x1bW4gYnkgY3JlYXRpbmcgYSBzcGVjaWZpZWQgb25lIHVzaW5nIHRoZSBkZWZhdWx0Ci0JCQkvLyBvbmUgaWYgaXQgZXhpc3RzCi0JCQlpZiAoc2VsZWN0ZWQpIHsKLQotCQkJCXN3aXRjaERlZmF1bHRUb1NwZWNpZmllZCgpOwotCQkJfQotCQkJLy8gUmVtb3ZlIGFsbCB0aGUgc3BlY2lmaWVkIGpvaW4gY29sdW1ucwotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaW5kZXggPSBzdWJqZWN0KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJCQlzdWJqZWN0KCkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc3dpdGNoRGVmYXVsdFRvU3BlY2lmaWVkKCk7Ci0JCi0JcHJpdmF0ZSBjbGFzcyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyIGV4dGVuZHMgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB7Ci0KLQkJcHVibGljIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCQlzdXBlcihidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJcmV0dXJuIGxpc3RIb2xkZXIuc2l6ZSgpID4gMDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCXVwZGF0ZUpvaW5Db2x1bW5zKHZhbHVlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Fic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Fic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3Y2NjZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT3JtRW50aXR5Ci0gKiBAc2VlIE9ybUVudGl0eUNvbXBvc2l0ZSAtIFRoZSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBFbnRpdHk+IGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlY29uZGFyeVRhYmxlRnJvbURpYWxvZyhTZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJaW50IGluZGV4ID0gdGhpcy5zdWJqZWN0KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpOwotCQkJU3RyaW5nIG5hbWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWROYW1lKCk7Ci0JCQlTdHJpbmcgY2F0YWxvZyA9IGRpYWxvZy5nZXRTZWxlY3RlZENhdGFsb2coKTsKLQkJCVN0cmluZyBzY2hlbWEgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRTY2hlbWEoKTsKLQkJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gdGhpcy5zdWJqZWN0KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW5kZXgpOwotCQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZShuYW1lKTsKLQkJCWlmICghZGlhbG9nLmlzRGVmYXVsdENhdGFsb2dTZWxlY3RlZCgpKSB7Ci0JCQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhjYXRhbG9nKTsKLQkJCX0KLQkJCWlmICghZGlhbG9nLmlzRGVmYXVsdFNjaGVtYVNlbGVjdGVkKCkpIHsKLQkJCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoc2NoZW1hKTsKLQkJCX0KLQotCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoc2Vjb25kYXJ5VGFibGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBidWlsZFNlY29uZGFyeVRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTZWNvbmRhcnlUYWJsZT4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgYnVpbGRTZWNvbmRhcnlUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJLy8gVE9ETyBkaXNwbGF5IGEgcXVhbGlmaWVkIG5hbWUgaW5zdGVhZAotCQkJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlKSBlbGVtZW50OwotCQkJCWlmIChzZWNvbmRhcnlUYWJsZS5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gIiI7Ly9UT0RPCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFNlY29uZGFyeVRhYmxlRGlhbG9nIGJ1aWxkU2Vjb25kYXJ5VGFibGVEaWFsb2dGb3JBZGQoKSB7Ci0JCXJldHVybiBuZXcgU2Vjb25kYXJ5VGFibGVEaWFsb2coZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCksIHN1YmplY3QoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSwgc3ViamVjdCgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JfQotCQotCXByb3RlY3RlZCBBZGRSZW1vdmVMaXN0UGFuZS5BZGFwdGVyIGJ1aWxkU2Vjb25kYXJ5VGFibGVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZyA9IGJ1aWxkU2Vjb25kYXJ5VGFibGVEaWFsb2dGb3JBZGQoKTsKLQkJCQlhZGRTZWNvbmRhcnlUYWJsZUZyb21EaWFsb2coZGlhbG9nLCBsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgewotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2VkaXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWNvbmRhcnlUYWJsZURpYWxvZyhnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgc2Vjb25kYXJ5VGFibGUsIHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkpOwotCQkJCWVkaXRTZWNvbmRhcnlUYWJsZUZyb21EaWFsb2coZGlhbG9nLCBzZWNvbmRhcnlUYWJsZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCUVudGl0eSBlbnRpdHkgPSBzdWJqZWN0KCk7Ci0JCQkJaW50W10gc2VsZWN0ZWRJbmRpY2VzID0gbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkSW5kaWNlcygpOwotCi0JCQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJCQllbnRpdHkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGVuYWJsZU9wdGlvbk9uU2VsZWN0aW9uQ2hhbmdlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlpZiAobGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzU2l6ZSgpICE9IDEpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZSkgbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQkJCQlyZXR1cm4gIXNlY29uZGFyeVRhYmxlLmlzVmlydHVhbCgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGVuYWJsZVJlbW92ZU9uU2VsZWN0aW9uQ2hhbmdlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlpZiAobGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGUpIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7Ci0JCQkJcmV0dXJuICFzZWNvbmRhcnlUYWJsZS5pc1ZpcnR1YWwoKTsJCQkJCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRTZWNvbmRhcnlUYWJsZURpYWxvZ09rZChTZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2csIFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCVN0cmluZyBuYW1lID0gZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpOwotCQlTdHJpbmcgY2F0YWxvZyA9IGRpYWxvZy5nZXRTZWxlY3RlZENhdGFsb2coKTsKLQkJU3RyaW5nIHNjaGVtYSA9IGRpYWxvZy5nZXRTZWxlY3RlZFNjaGVtYSgpOwotCi0JCWlmIChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCB8fCAhc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpLmVxdWFscyhuYW1lKSl7Ci0JCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKG5hbWUpOwotCQl9Ci0KLQkJaWYgKGRpYWxvZy5pc0RlZmF1bHRDYXRhbG9nU2VsZWN0ZWQoKSkgewotCQkJaWYgKHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSAhPSBudWxsKSB7Ci0JCQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkgPT0gbnVsbCB8fCAhc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpLmVxdWFscyhjYXRhbG9nKSl7Ci0JCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKGNhdGFsb2cpOwotCQl9Ci0KLQkJaWYgKGRpYWxvZy5pc0RlZmF1bHRTY2hlbWFTZWxlY3RlZCgpKSB7Ci0JCQlpZiAoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkgIT0gbnVsbCkgewotCQkJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSA9PSBudWxsIHx8ICFzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKS5lcXVhbHMoc2NoZW1hKSl7Ci0JCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoc2NoZW1hKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0U2Vjb25kYXJ5VGFibGVGcm9tRGlhbG9nKFNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZywgU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQllZGl0U2Vjb25kYXJ5VGFibGVEaWFsb2dPa2QoZGlhbG9nLCBzZWNvbmRhcnlUYWJsZSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDg4M2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNlSm9pbkNvbHVtbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFZhbGlkYXRpbmdEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGRlZmluaXRpb24gdGhlIGRpYWxvZyBzaG93aW5nIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBqb2luIGNvbHVtbgotICogdG8gZWRpdCBvciB0byBjcmVhdGUuCi0gKgotICogQHNlZSBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxUIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdD4gZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpbmdEaWFsb2c8VD4gewotCi0JLyoqCi0JICogRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgc3RhdGUgb2JqZWN0Ci0JICogaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lLgotCSAqLwotCXByaXZhdGUgQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbjsKLQotCS8qKgotCSAqIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzIGxvY2F0ZWQuCi0JICovCi0JcHJpdmF0ZSBPYmplY3Qgb3duZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2VKb2luQ29sdW1uRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBvd25lciBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcyBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIEJhc2VKb2luQ29sdW1uRGlhbG9nKFNoZWxsIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG93bmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIocGFyZW50KTsKLQotCQl0aGlzLm93bmVyICAgICAgPSBvd25lcjsKLQkJdGhpcy5qb2luQ29sdW1uID0gam9pbkNvbHVtbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfZGVzY3JpcHRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvblRpdGxlKCkgewotCi0JCWlmIChqb2luQ29sdW1uID09IG51bGwpIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uRGVzY3JpcHRpb25UaXRsZTsKLQkJfQotCi0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtbkRlc2NyaXB0aW9uVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgam9pbiBjb2x1bW4gdXNlZCBieSB0aGlzIHN0YXRlIG9iamVjdCBmb3IgZWRpdGluZyBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZS4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBlZGl0ZWQgam9pbiBjb2x1bW4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQmFzZUpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3duZXIgd2hlcmUgdGhlIGpvaW4gY29sdW1uIGlzIGxvY2F0ZWQgb3Igd2hlcmUgYSBuZXcgb25lIGNhbgotCSAqIGJlIGFkZGVkLgotCSAqCi0JICogQHJldHVybiBUaGUgcGFyZW50IG9mIHRoZSBqb2luIGNvbHVtbgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlKCkgewotCi0JCWlmIChqb2luQ29sdW1uID09IG51bGwpIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uVGl0bGU7Ci0JCX0KLQotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW5UaXRsZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYTViYjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdERpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgUmVmZXJlbmNlZCBDb2x1bW4gTmFtZTogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgVGFibGU6ICAgICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ29sdW1uIERlZmluaXRpb246ICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QKLSAqIEBzZWUgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZTxUIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdD4gZXh0ZW5kcyBBYnN0cmFjdERpYWxvZ1BhbmU8VD4KLXsKLQkvKioKLQkgKiBBIGtleSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhpcyBpcyByZXF1aXJlZCB0byBjb252ZXJ0Ci0JICogdGhlIHNlbGVjdGVkIGl0ZW0gZnJvbSBhIGNvbWJvIHRvIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGtleSBpcyBtb3N0Ci0JICogbGlrZWx5IG5ldmVyIHR5cGVkIHRoZSB1c2VyIGFuZCBpdCB3aWxsIGhlbHAgdG8gY29udmVydCB0aGUgdmFsdWUgdG8KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIGl0J3MgdGltZSB0byBzZXQgdGhlIG5ldyBzZWxlY3RlZCB2YWx1ZSBpbnRvIHRoZQotCSAqIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfS0VZID0gIj8hIyE/Iz8jP2RlZmF1bHQ/Iz8hIz8hIz8iOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRDb2x1bW5EZWZpbml0aW9uKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGJ1aWxkU3ViUGFuZShwYXJlbnQsIDAsIDcsIDAsIDUpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybV8oQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCB2YWx1ZSkgewotCQkJCVN0cmluZyBuYW1lID0gdmFsdWUuZ2V0RGVmYXVsdE5hbWUoKTsKLQotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZICsgbmFtZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkRGVmYXVsdE5hbWVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm1fKEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QgdmFsdWUpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHZhbHVlLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gREVGQVVMVF9LRVk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQluYW1lID0gREVGQVVMVF9LRVkgKyBuYW1lOwotCQkJCX0KLQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtXyhCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0IHZhbHVlKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSB2YWx1ZS5nZXREZWZhdWx0VGFibGUoKTsKLQotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZICsgbmFtZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0VGFibGVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZERlZmF1bHRUYWJsZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZERpc3BsYXlhYmxlU3RyaW5nQ29udmVydGVyKGZpbmFsIERlZmF1bHRWYWx1ZUhhbmRsZXIgaGFuZGxlcikgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoc3ViamVjdCgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBoYW5kbGVyLmdldERlZmF1bHRWYWx1ZSgpOwotCi0JCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9IERFRkFVTFRfS0VZICsgdmFsdWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IERFRkFVTFRfS0VZOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0TmFtZSA9IHZhbHVlLnN1YnN0cmluZyhERUZBVUxUX0tFWS5sZW5ndGgoKSk7Ci0KLQkJCQkJaWYgKGRlZmF1bHROYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQkJdmFsdWUgPSBOTFMuYmluZCgKLQkJCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGVmYXVsdFdpdGhWYWx1ZSwKLQkJCQkJCQlkZWZhdWx0TmFtZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZhbHVlID0gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRob3V0VmFsdWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkvLyBDb252ZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyB0byBudWxsCi0JCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJgotCQkJCSAgICgodmFsdWUubGVuZ3RoKCkgPT0gMCkgfHwgdmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpKSB7Ci0KLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQotCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuTkFNRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5uYW1lcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmNvbHVtbnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZXNMaXN0SG9sZGVyKCkgewotCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkRGVmYXVsdE5hbWVMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZE5hbWVMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZE5hbWVTdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBidWlsZERpc3BsYXlhYmxlU3RyaW5nQ29udmVydGVyKG5ldyBEZWZhdWx0VmFsdWVIYW5kbGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCB2YWx1ZSBvciBhbiBlbXB0eSBzdHJpbmcgdG8gbnVsbAotCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYKLQkJCQkgICAoKHZhbHVlLmxlbmd0aCgpID09IDApIHx8IHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSkgewotCi0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlzdWJqZWN0LnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuUkVGRVJFTkNFX0NPTFVNTl9OQU1FU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnJlZmVyZW5jZUNvbHVtbk5hbWVzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QucmVmZXJlbmNlQ29sdW1uc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZXNMaXN0SG9sZGVyKCkgewotCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lTGlzdEhvbGRlcigpKTsKLQkJaG9sZGVycy5hZGQoYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUxpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihob2xkZXJzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVTdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBidWlsZERpc3BsYXlhYmxlU3RyaW5nQ29udmVydGVyKG5ldyBEZWZhdWx0VmFsdWVIYW5kbGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LlRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkvLyBDb252ZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyB0byBudWxsCi0JCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJgotCQkJCSAgICgodmFsdWUubGVuZ3RoKCkgPT0gMCkgfHwgdmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpKSB7Ci0KLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQotCQkJCXN1YmplY3Quc2V0VGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhYmxlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgIiIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudGFibGVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFibGVzTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRUYWJsZUxpc3RIb2xkZXIoKSk7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkVGFibGVMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFRhYmxlU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gYnVpbGREaXNwbGF5YWJsZVN0cmluZ0NvbnZlcnRlcihuZXcgRGVmYXVsdFZhbHVlSGFuZGxlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlDb21ibyBuYW1lQ29tYm8gPSBidWlsZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfbmFtZSwKLQkJCWJ1aWxkTmFtZXNMaXN0SG9sZGVyKCksCi0JCQlidWlsZE5hbWVIb2xkZXIoKSwKLQkJCWJ1aWxkTmFtZVN0cmluZ0NvbnZlcnRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX0NPTFVNTl9OQU1FCi0JCSk7Ci0KLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKG5hbWVDb21ibyk7Ci0KLQkJLy8gUmVmZXJlbmNlZCBDb2x1bW4gTmFtZSB3aWRnZXRzCi0JCUNvbWJvIHJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm8gPSBidWlsZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfcmVmZXJlbmNlZENvbHVtbk5hbWUsCi0JCQlidWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lc0xpc3RIb2xkZXIoKSwKLQkJCWJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVIb2xkZXIoKSwKLQkJCWJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVTdHJpbmdDb252ZXJ0ZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9SRUZFUkVOQ0VEX0NPTFVNTgotCQkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihyZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvKTsKLQotCQkvLyBUYWJsZSB3aWRnZXRzCi0JCWlmIChpc1RhYmxlRWRpdGFibGUoKSkgewotCi0JCQlDb21ibyB0YWJsZUNvbWJvID0gYnVpbGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3RhYmxlLAotCQkJCWJ1aWxkVGFibGVzTGlzdEhvbGRlcigpLAotCQkJCWJ1aWxkVGFibGVIb2xkZXIoKSwKLQkJCQlidWlsZFRhYmxlU3RyaW5nQ29udmVydGVyKCksCi0JCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1JFRkVSRU5DRURfQ09MVU1OCi0JCQkpOwotCi0JCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIodGFibGVDb21ibyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDb21ibyB0YWJsZUNvbWJvID0gYnVpbGRMYWJlbGVkQ29tYm8oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV90YWJsZSwKLQkJCQlidWlsZFRhYmxlc0xpc3RIb2xkZXIoKSwKLQkJCQlidWlsZFRhYmxlSG9sZGVyKCksCi0JCQkJYnVpbGRUYWJsZVN0cmluZ0NvbnZlcnRlcigpLAotCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9SRUZFUkVOQ0VEX0NPTFVNTgotCQkJKTsKLQotCQkJdGFibGVDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCS8vIENvbHVtbiBEZWZpbml0aW9uIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9jb2x1bW5EZWZpbml0aW9uLAotCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRhYmxlIGNvbWJvIHNob3VsZCBiZSBlZGl0YWJsZSBvciBub3QuIFRoZSBkZWZhdWx0Ci0JICogaXMgdG8ga2VlcCB0aGUgY29tYm8gcmVhZC1vbmx5LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBzdXBwb3J0IHRoZSBlZGl0aW5nIG9mIHRoZSBzZWxlY3RlZCB0YWJsZTsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZUVkaXRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnRlcmZhY2UgRGVmYXVsdFZhbHVlSGFuZGxlciB7Ci0JCVN0cmluZyBnZXREZWZhdWx0VmFsdWUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2MmYzMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuQWJzdHJhY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiBhIHN0YXRlIG9iamVjdCB1c2VkIHRvIGVkaXQgb3IgY3JlYXRlIGEgbmV3Ci0gKiBqb2luIGNvbHVtbi4KLSAqCi0gKiBAc2VlIEFic3RyYWN0Sm9pbkNvbHVtbgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3ROb2RlCi17Ci0JLyoqCi0JICogVGhlIFNRTCBmcmFnbWVudCB0aGF0IGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBEREwgZm9yIHRoZSBjb2x1bW4uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbjsKLQotCS8qKgotCSAqIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gaXMgYmVpbmcgZWRpdGVkIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBzdGF0ZQotCSAqIG9iamVjdCBpcyBiZWluZyBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbjsKLQotCS8qKgotCSAqIFRoZSBqb2luIGNvbHVtbidzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGRlZmluZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzIGxvY2F0ZWQuCi0JICovCi0JcHJpdmF0ZSBPYmplY3Qgb3duZXI7Ci0KLQkvKioKLQkgKiBUaGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZGVmaW5lZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQotCS8qKgotCSAqIFRoZSB0YWJsZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIHRhYmxlOwotCi0JLyoqCi0JICogS2VlcHMgdHJhY2sgb2YgdGhlIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4gc2luY2UgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JLyoqCi0JICogSWRlbnRpZmllcyBhIGNoYW5nZSBpbiB0aGUgY29sdW1uIGRlZmluaXRpb24gcHJvcGVydHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFkgPSAiY29sdW1uRGVmaW5pdGlvbiI7Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVzIGEgY2hhbmdlIGluIHRoZSBuYW1lIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVzIGEgY2hhbmdlIGluIHRoZSBsaXN0IG9mIG5hbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTX0xJU1QgPSAibmFtZXMiOwotCi0JLyoqCi0JICogSWRlbnRpZmllcyBhIGNoYW5nZSBpbiB0aGUgbGlzdCBvZiByZWZlcmVuY2UgY29sdW1uIG5hbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRV9DT0xVTU5fTkFNRVNfTElTVCA9ICJyZWZlcmVuY2VDb2x1bW5OYW1lcyI7Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVzIGEgY2hhbmdlIGluIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAicmVmZXJlbmNlZENvbHVtbk5hbWUiOwotCi0JLyoqCi0JICogSWRlbnRpZmllcyBhIGNoYW5nZSBpbiB0aGUgdGFibGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfUFJPUEVSVFkgPSAidGFibGUiOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEpvaW5Db2x1bW5TdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gb3duZXIgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMgbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0KE9iamVjdCBvd25lciwgQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihudWxsKTsKLQkJaW5pdGlhbGl6ZShvd25lciwgam9pbkNvbHVtbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tQYXJlbnQoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCS8vIFRoaXMgaXMgdGhlIHJvb3Qgb2YgdGhlIEpvaW4gQ29sdW1uIHN0YXRlIG9iamVjdAotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoVGFibGUgdGFibGUpIHsKLQotCQlpZiAodGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQotCQlMaXN0PFN0cmluZz4gbmFtZXMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0YWJsZS5jb2x1bW5OYW1lcygpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChuYW1lcyk7Ci0JCXJldHVybiBuYW1lcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgY29sdW1uc1NpemUoVGFibGUgdGFibGUpIHsKLQkJaWYgKHRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiB0YWJsZS5jb2x1bW5zU2l6ZSgpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTUUwgZnJhZ21lbnQgdGhhdCBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgRERMIGZvciB0aGUKLQkgKiBjb2x1bW4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBlZGl0ZWQgY29sdW1uIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHVzZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7Ci0JCXJldHVybiBjb2x1bW5EZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgbmFtZSBpZiB0aGUgam9pbiBjb2x1bW4gaXMgYmVpbmcgZWRpdGVkIG90aGVyd2lzZQotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIGRlZmF1bHQgbmFtZSBkZWZpbmVkIGJ5IHRoZSBqb2luIGNvbHVtbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCWlmICh0aGlzLmpvaW5Db2x1bW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGlmIHRoZSBqb2luIGNvbHVtbiBpcyBiZWluZwotCSAqIGVkaXRlZCBvdGhlcndpc2UgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciB0aGUgZGVmYXVsdCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGRlZmluZWQgYnkgdGhlIGpvaW4KLQkgKiBjb2x1bW4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJaWYgKHRoaXMuam9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucwotCSAqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0ZWQgam9pbiBjb2x1bW4gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBzdGF0ZSBvYmplY3QKLQkgKiBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBlZGl0ZWQgam9pbiBjb2x1bW4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQmFzZUpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBqb2luIGNvbHVtbi4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIGpvaW4gY29sdW1uJ3MgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIGRlZmF1bHQKLQkgKiBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRhdGFiYXNlIHRhYmxlIGlmIG9uZSBjYW4gYmUgZm91bmQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBkYXRhYmFzZSB0YWJsZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBUYWJsZSBnZXROYW1lVGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG93bmVyIHdoZXJlIHRoZSBqb2luIGNvbHVtbiBpcyBsb2NhdGVkIG9yIHdoZXJlIGEgbmV3IG9uZSBjYW4KLQkgKiBiZSBhZGRlZC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBhcmVudCBvZiB0aGUgam9pbiBjb2x1bW4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBvZiB0aGUgam9pbiBjb2x1bW4uCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciBqb2luIGNvbHVtbidzIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiB0byB1c2UgdGhlIGRlZmF1bHQgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMKLQkgKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgVGFibGUgZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucwotCSAqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMudmFsaWRhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdmFsaWRhdG9yID0gTlVMTF9WQUxJREFUT1I7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBzdGF0ZSBvYmplY3QuCi0JICoKLQkgKiBAcGFyYW0gb3duZXIgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMgbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoT2JqZWN0IG93bmVyLCBCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJdGhpcy5vd25lciAgICAgID0gb3duZXI7Ci0JCXRoaXMuam9pbkNvbHVtbiA9IGpvaW5Db2x1bW47Ci0JCXRoaXMudGFibGUgICAgICA9IHRoaXMuaW5pdGlhbFRhYmxlKCk7Ci0KLQkJaWYgKGpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lICAgICAgICAgICAgICAgICA9IGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uICAgICA9IGpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGluaXRpYWxUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIG5hbWVzIGlmIHRoZSBkYXRhYmFzZSB0YWJsZSBjYW4gYmUgcmVzb2x2ZWQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiB0aGUgdGFibGUncyBjb2x1bW5zIG9yIGFuIGVtcHR5IGl0ZXJhdG9yIGlmIHRoZSB0YWJsZQotCSAqIGNhbid0IGJlIHJlc29sdmVkCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKCkgewotCQlyZXR1cm4gY29sdW1uTmFtZXMoZ2V0TmFtZVRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgY29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiBjb2x1bW5zU2l6ZShnZXROYW1lVGFibGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSBjb2x1bW4gbmFtZXMgaWYgdGhlIGRhdGFiYXNlIHRhYmxlIGNhbiBiZSByZXNvbHZlZC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIG5hbWVzIG9mIHRoZSB0YWJsZSdzIGNvbHVtbnMgb3IgYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIHRhYmxlCi0JICogY2FuJ3QgYmUgcmVzb2x2ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gcmVmZXJlbmNlQ29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBjb2x1bW5OYW1lcyhnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgaW50IHJlZmVyZW5jZUNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gY29sdW1uc1NpemUoZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBTUUwgZnJhZ21lbnQgdGhhdCBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgRERMIGZvciB0aGUgY29sdW1uLgotCSAqCi0JICogQHBhcmFtIGNvbHVtbkRlZmluaXRpb24gVGhlIG5ldyBqb2luIGNvbHVtbidzIGNvbHVtbiBkZWZpbml0aW9uIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gdG8gY2xlYXIgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgY29sdW1uRGVmaW5pdGlvbikgewotCQlTdHJpbmcgb2xkQ29sdW1uRGVmaW5pdGlvbiA9IHRoaXMuY29sdW1uRGVmaW5pdGlvbjsKLQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uID0gY29sdW1uRGVmaW5pdGlvbjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSwgb2xkQ29sdW1uRGVmaW5pdGlvbiwgY29sdW1uRGVmaW5pdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgam9pbiBjb2x1bW4uCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IGpvaW4gY29sdW1uJ3MgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlCi0JICogZGVmYXVsdCBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG9mIHRoZSBqb2luIGNvbHVtbi4KLQkgKgotCSAqIEBwYXJhbSByZWZlcmVuY2VkQ29sdW1uTmFtZSBUaGUgbmV3IGpvaW4gY29sdW1uJ3MgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZQotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgZGVmYXVsdCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSByZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQlTdHJpbmcgb2xkVGFibGUgPSB0aGlzLnRhYmxlOwotCQl0aGlzLnRhYmxlID0gdGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfUFJPUEVSVFksIG9sZFRhYmxlLCB0YWJsZSk7Ci0JCXRhYmxlQ2hhbmdlZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIFRoZSB0YWJsZSBmcm9tIHdoaWNoIHRoZSBjb2x1bW4gbmFtZXMgYXJlIHVzZWQgaGFzIGNoYW5nZWQsIG5vdGlmaWVzIHRoZQotCSAqIGxpc3RlbmVycyB0aGUgbGlzdCBvZiBuYW1lcyBhbmQgcmVmZXJlbmNlIGNvbHVtbiBuYW1lcyBzaG91bGQgYmUgdXBkYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUNoYW5nZWQoKSB7Ci0JCWZpcmVMaXN0Q2hhbmdlZChOQU1FU19MSVNUKTsKLQkJZmlyZUxpc3RDaGFuZ2VkKFJFRkVSRU5DRV9DT0xVTU5fTkFNRVNfTElTVCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIGFsbCB0aGUgdGFibGUgbmFtZXMgY29udGFpbnMgaW4gdGhlIGFzc29jaWF0ZWQKLQkgKiBzY2hlbWEuIFRoZSBkZWZhdWx0IHJldHVybnMgYW4gZW1wdHkgaXRlcmF0b3IuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiB0aGUgdGFibGVzCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZ2l2ZW4gam9pbiBjb2x1bW4gd2l0aCB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIHN0YXRlCi0JICogb2JqZWN0LgotCSAqCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIHVwZGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUpvaW5Db2x1bW4oQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCS8vIE5hbWUKLQkJaWYgKHZhbHVlc0FyZURpZmZlcmVudChuYW1lLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSkpIHsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShuYW1lKTsKLQkJfQotCi0JCS8vIFJlZmVyZW5jZWQgQ29sdW1uIE5hbWUKLQkJaWYgKHZhbHVlc0FyZURpZmZlcmVudChyZWZlcmVuY2VkQ29sdW1uTmFtZSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKSkgewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCX0KLQotCQkvLyBDb2x1bW4gRGVmaW5pdGlvbgotCQlpZiAodmFsdWVzQXJlRGlmZmVyZW50KGNvbHVtbkRlZmluaXRpb24sIGpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKSkgewotCQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKGNvbHVtbkRlZmluaXRpb24pOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDc3YjcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFbnVtVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgTG9iQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKiBAc2VlIEJhc2VKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqIEBzZWUgQ29sdW1uQ29tcG9zaXRlCi0gKiBAc2VlIEVudW1UeXBlQ29tcG9zaXRlCi0gKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQotICogQHNlZSBMb2JDb21wb3NpdGUKLSAqIEBzZWUgT3B0aW9uYWxDb21wb3NpdGUKLSAqIEBzZWUgVGVtcG9yYWxUeXBlQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY01hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEJhc2ljTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklCYXNpY01hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQmFzaWNNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2ljTWFwcGluZywgQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm1fKEJhc2ljTWFwcGluZyB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCi0JCS8vIENvbHVtbiB3aWRnZXRzCi0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQkvLyBBbGlnbiB0aGUgd2lkZ2V0cyB1bmRlciB0aGUgQ29sdW1uQ29tcG9zaXRlCi0JCWNvbnRhaW5lciA9IGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0KLQkJLy8gRmV0Y2ggVHlwZSB3aWRnZXRzCi0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBUZW1wb3JhbCBUeXBlIHdpZGdldHMKLQkJbmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIEVudW1lcmF0ZWQgd2lkZ2V0cwotCQluZXcgRW51bVR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBPcHRpb25hbCB3aWRnZXRzCi0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBidWlsZFN1YlBhbmUoY29udGFpbmVyLCA0KSk7Ci0KLQkJLy8gTG9iIGNoZWNrIGJveAotCQluZXcgTG9iQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ2FzY2FkZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYXNjYWRlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDFmZjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYXNjYWRlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBDYXNjYWRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IHggQWxsICAgICAgIHggUGVyc2lzdCAgIHggTWVyZ2UgICAgIHggUmVtb3ZlICAgIHggUmVmcmVzaCAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIENhc2NhZGUKLSAqIEBzZWUgUmVsYXRpb25zaGlwTWFwcGluZwotICogQHNlZSBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXNjYWRlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDYXNjYWRlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2FzY2FkZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUNhc2NhZGU8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDYXNjYWRlQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDYXNjYWRlPiBzdWJqZWN0SG9sZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db2x1bW5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JQ2FzY2FkZTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBDYXNjYWRlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQ2FzY2FkZT4gc3ViamVjdEhvbGRlciwKLQkJICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkJICAgICAgICAgICAgICAgICAgICAgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVUeXBlQWxsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYXNjYWRlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENhc2NhZGUuQUxMX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmlzQWxsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldEFsbCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVUeXBlTWVyZ2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhc2NhZGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ2FzY2FkZS5NRVJHRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc01lcmdlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldE1lcmdlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ2FzY2FkZVR5cGVQZXJzaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYXNjYWRlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENhc2NhZGUuUEVSU0lTVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc1BlcnNpc3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0UGVyc2lzdCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVUeXBlUmVmcmVzaEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FzY2FkZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYXNjYWRlLlJFRlJFU0hfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXNSZWZyZXNoKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFJlZnJlc2godmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYXNjYWRlVHlwZVJlbW92ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FzY2FkZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYXNjYWRlLlJFTU9WRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc1JlbW92ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRSZW1vdmUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIENhc2NhZGUgZ3JvdXAKLQkJR3JvdXAgY2FzY2FkZUdyb3VwID0gYnVpbGRUaXRsZWRQYW5lKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfY2FzY2FkZVRpdGxlCi0JCSk7Ci0KLQkJLy8gQ29udGFpbmVyIG9mIHRoZSBjaGVjayBib3hlcwotCQljb250YWluZXIgPSBidWlsZFN1YlBhbmUoY2FzY2FkZUdyb3VwLCA1LCA4LCAwLCAwLCAwKTsKLQotCQkvLyBBbGwgY2hlY2sgYm94Ci0JCWJ1aWxkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ2FzY2FkZUNvbXBvc2l0ZV9hbGwsCi0JCQlidWlsZENhc2NhZGVUeXBlQWxsSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBQZXJzaXN0IGNoZWNrIGJveAotCQlidWlsZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfcGVyc2lzdCwKLQkJCWJ1aWxkQ2FzY2FkZVR5cGVQZXJzaXN0SG9sZGVyKCkKLQkJKTsKLQotCQkvLyBNZXJnZSBjaGVjayBib3gKLQkJYnVpbGRDaGVja0JveCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5DYXNjYWRlQ29tcG9zaXRlX21lcmdlLAotCQkJYnVpbGRDYXNjYWRlVHlwZU1lcmdlSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBSZW1vdmUgY2hlY2sgYm94Ci0JCWJ1aWxkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ2FzY2FkZUNvbXBvc2l0ZV9yZW1vdmUsCi0JCQlidWlsZENhc2NhZGVUeXBlUmVtb3ZlSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBSZWZyZXNoIGNoZWNrIGJveAotCQlidWlsZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfcmVmcmVzaCwKLQkJCWJ1aWxkQ2FzY2FkZVR5cGVSZWZyZXNoSG9sZGVyKCkKLQkJKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ29sdW1uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNGQwYWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYi5Db2x1bW5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuVGFibGVDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYWJsZUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ID4gRGV0YWlscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IEluc2VydGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIHggVXBkYXRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgeCBVbmlxdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IE51bGxhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICBMZW5ndGg6ICAgICAgICAgICAgfCBJICAgICAgICAgfEl8ICBEZWZhdWx0IChYWFgpICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICBQcmVjaXNpb246ICAgICAgICAgfCBJICAgICAgICAgfEl8ICBEZWZhdWx0IChYWFgpICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICBTY2FsZTogICAgICAgICAgICAgfCBJICAgICAgICAgfEl8ICBEZWZhdWx0IChYWFgpICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICBDb2x1bW4gRGVmaW5pdGlvbjogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIENvbHVtbgotICogQHNlZSBDb2x1bW5Db21ibwotICogQHNlZSBUYWJsZUNvbWJvCi0gKiBAc2VlIEJhc2ljTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBJZE1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbHVtbkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8Q29sdW1uPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbHVtbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUNvbHVtbjwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENvbHVtbkNvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIENvbHVtbj4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29sdW1uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JQ29sdW1uPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRyb2xsZXI7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICovCi0JcHVibGljIENvbHVtbkNvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIENvbHVtbj4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29sdW1uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUNvbHVtbjwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBDb2x1bW5Db21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb2x1bW4+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkNvbWJvPENvbHVtbj4gYnVpbGRDb2x1bW5Db21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDb2x1bW5Db21ibzxDb2x1bW4+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKENvbHVtbi5ERUZBVUxUX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQ29sdW1uLkRFRkFVTFRfVEFCTEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKENvbHVtbi5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0KLQkJCQlpZiAocHJvcGVydHlOYW1lID09IENvbHVtbi5ERUZBVUxUX1RBQkxFX1BST1BFUlRZIHx8Ci0JCQkJICAgIHByb3BlcnR5TmFtZSA9PSBDb2x1bW4uU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZKSB7Ci0KLQkJCQkJZG9Qb3B1bGF0ZSgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlIGdldERCVGFibGVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uLkNPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0Q29sdW1uRGVmaW5pdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRMZW5ndGhIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb2x1bW4uREVGQVVMVF9MRU5HVEhfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdExlbmd0aCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShJbnRlZ2VyLk1JTl9WQUxVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGREZWZhdWx0TGVuZ3RoTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUxhYmVsIGxhYmVsID0gYnVpbGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aG91dFZhbHVlCi0JCSk7Ci0KLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcigKLQkJCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpLAotCQkJYnVpbGREZWZhdWx0TGVuZ3RoTGFiZWxIb2xkZXIoKQotCQkpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdExlbmd0aExhYmVsSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlciwgU3RyaW5nPihidWlsZERlZmF1bHRMZW5ndGhIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQotCQkJCUludGVnZXIgZGVmYXVsdFZhbHVlID0gKHN1YmplY3QoKSAhPSBudWxsKSA/IHN1YmplY3QoKS5nZXREZWZhdWx0TGVuZ3RoKCkgOgotCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbi5ERUZBVUxUX0xFTkdUSDsKLQotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsCi0JCQkJCWRlZmF1bHRWYWx1ZQotCQkJCSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRQcmVjaXNpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb2x1bW4uREVGQVVMVF9QUkVDSVNJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdFByZWNpc2lvbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShJbnRlZ2VyLk1JTl9WQUxVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGREZWZhdWx0UHJlY2lzaW9uTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUxhYmVsIGxhYmVsID0gYnVpbGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aG91dFZhbHVlCi0JCSk7Ci0KLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcigKLQkJCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpLAotCQkJYnVpbGREZWZhdWx0UHJlY2lzaW9uTGFiZWxIb2xkZXIoKQotCQkpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFByZWNpc2lvbkxhYmVsSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlciwgU3RyaW5nPihidWlsZERlZmF1bHRQcmVjaXNpb25Ib2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQotCQkJCUludGVnZXIgZGVmYXVsdFZhbHVlID0gKHN1YmplY3QoKSAhPSBudWxsKSA/IHN1YmplY3QoKS5nZXREZWZhdWx0UHJlY2lzaW9uKCkgOgotCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTjsKLQotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsCi0JCQkJCWRlZmF1bHRWYWx1ZQotCQkJCSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRTY2FsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbHVtbi5ERUZBVUxUX1NDQUxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldERlZmF1bHRTY2FsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkRGVmYXVsdFNjYWxlTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUxhYmVsIGxhYmVsID0gYnVpbGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aG91dFZhbHVlCi0JCSk7Ci0KLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcigKLQkJCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpLAotCQkJYnVpbGREZWZhdWx0U2NhbGVMYWJlbEhvbGRlcigpCi0JCSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2NhbGVMYWJlbEhvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXIsIFN0cmluZz4oYnVpbGREZWZhdWx0U2NhbGVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQotCQkJCUludGVnZXIgZGVmYXVsdFZhbHVlID0gKHN1YmplY3QoKSAhPSBudWxsKSA/IHN1YmplY3QoKS5nZXREZWZhdWx0U2NhbGUoKSA6Ci0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uLkRFRkFVTFRfU0NBTEU7Ci0KLQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aFZhbHVlLAotCQkJCQlkZWZhdWx0VmFsdWUKLQkJCQkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJbnNlcnRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uLlNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZEluc2VydGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEluc2VydGFibGVTdHJpbmdIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkSW5zZXJ0YWJsZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0KLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdEluc2VydGFibGUoKTsKLQotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX1RydWUgOgotCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCi0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlV2l0aERlZmF1bHQsCi0JCQkJCQkJZGVmYXVsdFN0cmluZ1ZhbHVlCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkTGVuZ3RoSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uLlNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gLTEpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZExlbmd0aCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE51bGxhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEVfUFJPUEVSVFksCi0JCQlDb2x1bW4uU1BFQ0lGSUVEX05VTExBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZE51bGxhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZE51bGxhYmxlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROdWxsYWJsZVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkTnVsbGFibGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0TnVsbGFibGUoKTsKLQotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX1RydWUgOgotCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCi0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZVdpdGhEZWZhdWx0LAotCQkJCQkJCWRlZmF1bHRTdHJpbmdWYWx1ZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRQcmVjaXNpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb2x1bW4uU1BFQ0lGSUVEX1BSRUNJU0lPTl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0U3BlY2lmaWVkUHJlY2lzaW9uKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2NhbGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb2x1bW4uU1BFQ0lGSUVEX1NDQUxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZFNjYWxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gLTEpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZFNjYWxlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlQ29tYm88Q29sdW1uPiBidWlsZFRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgVGFibGVDb21ibzxDb2x1bW4+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKENvbHVtbi5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChDb2x1bW4uU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hTmFtZSgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkVGFibGUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSB0YWJsZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB2YWx1ZXMoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVW5pcXVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ29sdW1uLkRFRkFVTFRfVU5JUVVFX1BST1BFUlRZLAotCQkJQ29sdW1uLlNQRUNJRklFRF9VTklRVUVfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkVW5pcXVlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZFVuaXF1ZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5pcXVlU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZFVuaXF1ZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0KLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFVuaXF1ZSgpOwotCi0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0KLQkJCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZVdpdGhEZWZhdWx0LAotCQkJCQkJCWRlZmF1bHRTdHJpbmdWYWx1ZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXBkYXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ29sdW1uLkRFRkFVTFRfVVBEQVRBQkxFX1BST1BFUlRZLAotCQkJQ29sdW1uLlNQRUNJRklFRF9VUERBVEFCTEVfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZFVwZGF0YWJsZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXBkYXRhYmxlU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZFVwZGF0YWJsZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0KLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFVwZGF0YWJsZSgpOwotCi0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0KLQkJCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZVdpdGhEZWZhdWx0LAotCQkJCQkJCWRlZmF1bHRTdHJpbmdWYWx1ZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURldGFpbHNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBJbnNlcnRhYmxlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCA0KSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZSwKLQkJCWJ1aWxkSW5zZXJ0YWJsZUhvbGRlcigpLAotCQkJYnVpbGRJbnNlcnRhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9JTlNFUlRBQkxFCi0JCSk7Ci0KLQkJLy8gVXBkYXRhYmxlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZSwKLQkJCWJ1aWxkVXBkYXRhYmxlSG9sZGVyKCksCi0JCQlidWlsZFVwZGF0YWJsZVN0cmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVVBEQVRBQkxFCi0JCSk7Ci0KLQkJLy8gVW5pcXVlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZSwKLQkJCWJ1aWxkVW5pcXVlSG9sZGVyKCksCi0JCQlidWlsZFVuaXF1ZVN0cmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVU5JUVVFCi0JCSk7Ci0KLQkJLy8gTnVsbGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQlidWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbnVsbGFibGUsCi0JCQlidWlsZE51bGxhYmxlSG9sZGVyKCksCi0JCQlidWlsZE51bGxhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9OVUxMQUJMRQotCQkpOwotCi0JCS8vIExlbmd0aCB3aWRnZXRzCi0JCVNwaW5uZXIgbGVuZ3RoU3Bpbm5lciA9IGJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2xlbmd0aCwKLQkJCWJ1aWxkTGVuZ3RoSG9sZGVyKCksCi0JCQktMSwKLQkJCS0xLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQlidWlsZERlZmF1bHRMZW5ndGhMYWJlbChjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fTEVOR1RICi0JCSk7Ci0KLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLCBsZW5ndGhTcGlubmVyKTsKLQotCQkvLyBQcmVjaXNpb24gd2lkZ2V0cwotCQlTcGlubmVyIHByZWNpc2lvblNwaW5uZXIgPSBidWlsZExhYmVsZWRTcGlubmVyKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9wcmVjaXNpb24sCi0JCQlidWlsZFByZWNpc2lvbkhvbGRlcigpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJYnVpbGREZWZhdWx0UHJlY2lzaW9uTGFiZWwoY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX1BSRUNJU0lPTgotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lciwgcHJlY2lzaW9uU3Bpbm5lcik7Ci0KLQkJLy8gU2NhbGUgd2lkZ2V0cwotCQlTcGlubmVyIHNjYWxlU3Bpbm5lciA9IGJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3NjYWxlLAotCQkJYnVpbGRTY2FsZUhvbGRlcigpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJYnVpbGREZWZhdWx0U2NhbGVMYWJlbChjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fU0NBTEUKLQkJKTsKLQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIsIHNjYWxlU3Bpbm5lcik7Ci0KLQkJLy8gQ29sdW1uIERlZmluaXRpb24gd2lkZ2V0cwotCQlidWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uLAotCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBDb2x1bW4gZ3JvdXAgcGFuZQotCQljb250YWluZXIgPSBidWlsZFRpdGxlZFBhbmUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2NvbHVtblNlY3Rpb24KLQkJKTsKLQotCQkvLyBDb2x1bW4gd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX25hbWUsCi0JCQlidWlsZENvbHVtbkNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTgotCQkpOwotCi0JCS8vIFRhYmxlIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV90YWJsZSwKLQkJCWJ1aWxkVGFibGVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVEFCTEUKLQkJKTsKLQotCQkvLyBEZXRhaWxzIHN1Yi1wYW5lCi0JCWNvbnRhaW5lciA9IGJ1aWxkQ29sbGFwc2FibGVTdWJTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZXRhaWxzLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQotCQkpOwotCi0JCWluaXRpYWxpemVEZXRhaWxzUGFuZShidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNikpOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGxheW91dCBvZiB0aGUgZ2l2ZW4gY29udGFpbmVyIGJ5IGNoYW5naW5nIHdoaWNoIHdpZGdldCB3aWxsCi0JICogZ3JhYiB0aGUgZXhjZXNzIG9mIGhvcml6b250YWwgc3BhY2UuIEJ5IGRlZmF1bHQsIHRoZSBjZW50ZXIgY29udHJvbCBncmFicwotCSAqIHRoZSBleGNlc3Mgc3BhY2UsIHdlIGNoYW5nZSBpdCB0byBiZSB0aGUgcmlnaHQgY29udHJvbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBjb250YWluaW5nIHRoZSBjb250cm9scyBuZWVkaW5nIHRoZWlyCi0JICogPGNvZGU+R3JpZERhdGE8L2NvZGU+IHRvIGJlIG1vZGlmaWVkIGZyb20gdGhlIGRlZmF1bHQgdmFsdWVzCi0JICogQHBhcmFtIHNwaW5uZXIgVGhlIHNwaW5uZXIgdGhhdCBnb3QgY3JlYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyLCBTcGlubmVyIHNwaW5uZXIpIHsKLQotCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGUgc3Bpbm5lcidzIHBhcmVudCBpcyBub3QgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkJLy8gbGFiZWwsIHNwaW5uZXIgYW5kIHJpZ2h0IGNvbnRyb2wgKGEgcGFuZSBpcyBzb21ldGltZXMgcmVxdWlyZWQgZm9yCi0JCS8vIHBhaW50aW5nIHRoZSBzcGlubmVyJ3MgYm9yZGVyKQotCQlDb21wb3NpdGUgcGFuZUNvbnRhaW5lciA9IHNwaW5uZXIuZ2V0UGFyZW50KCk7Ci0KLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBwYW5lQ29udGFpbmVyLmdldFBhcmVudCgpKSB7Ci0JCQlwYW5lQ29udGFpbmVyID0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKTsKLQkJfQotCi0JCUNvbnRyb2xbXSBjb250cm9scyA9IHBhbmVDb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWNvbnRyb2xzWzFdLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNvbnRyb2xzWzJdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVBbGlnblJpZ2h0KGNvbnRyb2xzWzJdKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2OTk4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBkb2VzIG5vdCBoYXZlIGFueSB3aWRnZXRzLgotICoKLSAqIEBzZWUgRW1iZWRkYWJsZQotICogQHNlZSBCYXNlSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIEVtYmVkZGFibGVVaVByb3ZpZGVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbWJlZGRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxFbWJlZGRhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRW1iZWRkYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MzRjYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IE92ZXJyaWRlIERlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW1iZWRkZWRNYXBwaW5nCi0gKiBAc2VlIEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEJhc2VFbWJlZGRlZE1hcHBpbmc+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBCYXNlRW1iZWRkZWRNYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUVtYmVkZGVkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEJhc2VFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+KCk7Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gYnVpbGRPdmVycmlkZURpc3BsYXlTdHJpbmcoKEF0dHJpYnV0ZU92ZXJyaWRlKSBlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzTGlzdEhvbGRlcigpIHsKLQkJTGlzdDxMaXN0VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlPiwgQXR0cmlidXRlT3ZlcnJpZGU+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxBdHRyaWJ1dGVPdmVycmlkZT4oCi0JCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RIb2xkZXIoKSwKLQkJCUJhc2VPdmVycmlkZS5OQU1FX1BST1BFUlRZCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29sdW1uPiBidWlsZENvbHVtbkhvbGRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZSwgQ29sdW1uPihhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybV8oQXR0cmlidXRlT3ZlcnJpZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYnVpbGREZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxCYXNlRW1iZWRkZWRNYXBwaW5nLCBBdHRyaWJ1dGVPdmVycmlkZT4oCi0JCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUJhc2VFbWJlZGRlZE1hcHBpbmcuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3ZlcnJpZGVEZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVFbmFibGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlLCBCb29sZWFuPihhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oQXR0cmlidXRlT3ZlcnJpZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlLCBCb29sZWFuPihhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdXBkYXRlQXNzb2NpYXRpb25PdmVycmlkZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhBdHRyaWJ1dGVPdmVycmlkZSB2YWx1ZSkgewotCQkJCXJldHVybiAhdmFsdWUuaXNWaXJ0dWFsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRPdmVycmlkZURpc3BsYXlTdHJpbmcoQXR0cmlidXRlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQotCQlTdHJpbmcgbmFtZSA9IG92ZXJyaWRlLmdldE5hbWUoKTsKLQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgewotCQkJbmFtZSA9IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5PdmVycmlkZXNDb21wb3NpdGVfbm9OYW1lOwotCQl9Ci0JCWVsc2UgewotCQkJbmFtZSA9IG5hbWUudHJpbSgpOwotCQl9Ci0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEJhc2VFbWJlZGRlZE1hcHBpbmcsIEF0dHJpYnV0ZU92ZXJyaWRlPigKLQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQmFzZUVtYmVkZGVkTWFwcGluZy5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyID0gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpOwotCX0KLQotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8QmFzZUVtYmVkZGVkTWFwcGluZz4gaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc0xpc3QoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8QmFzZUVtYmVkZGVkTWFwcGluZz4oCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgOCksCi0JCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzTGlzdE1vZGVsKCksCi0JCQlhdHRyaWJ1dGVPdmVycmlkZUhvbGRlciwKLQkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0VNQkVEREVEX0FUVFJJQlVURV9PVkVSUklERVMKLQkJKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCdXR0b25QYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIEF0dHJpYnV0ZSBPdmVycmlkZXMgZ3JvdXAgYm94Ci0JCWNvbnRhaW5lciA9IGJ1aWxkVGl0bGVkUGFuZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5BdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlT3ZlcnJpZGVzCi0JCSk7Ci0KLQkJLy8gQXR0cmlidXRlIE92ZXJyaWRlcyBsaXN0Ci0JCWluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNMaXN0KGNvbnRhaW5lcik7Ci0KLQkJLy8gUHJvcGVydHkgcGFuZQotCQlpbml0aWFsaXplUHJvcGVydHlQYW5lKGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDUsIDApKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnR5UGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBjaGVjayBib3gKLQkJQnV0dG9uIG92ZXJyaWRlRGVmYXVsdEJ1dHRvbiA9IGJ1aWxkQ2hlY2tCb3goCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbigpKSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5BdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0LAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpCi0JCSk7Ci0KLQkJcmVtb3ZlRnJvbUVuYWJsZW1lbnRDb250cm9sKG92ZXJyaWRlRGVmYXVsdEJ1dHRvbik7Ci0JCWluc3RhbGxPdmVycmlkZURlZmF1bHRCdXR0b25FbmFibGVyKG92ZXJyaWRlRGVmYXVsdEJ1dHRvbik7Ci0KLQkJLy8gQ29sdW1uIHdpZGdldHMKLQkJQ29sdW1uQ29tcG9zaXRlIGNvbHVtbkNvbXBvc2l0ZSA9IG5ldyBDb2x1bW5Db21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRDb2x1bW5Ib2xkZXIoYXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIpLAotCQkJY29udGFpbmVyCi0JCSk7Ci0KLQkJaW5zdGFsbENvbHVtbkNvbXBvc2l0ZUVuYWJsZXIoY29sdW1uQ29tcG9zaXRlKTsKLQkJcmVtb3ZlRnJvbUVuYWJsZW1lbnRDb250cm9sKGNvbHVtbkNvbXBvc2l0ZS5nZXRDb250cm9sKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsQ29sdW1uQ29tcG9zaXRlRW5hYmxlcihDb2x1bW5Db21wb3NpdGUgY29sdW1uQ29tcG9zaXRlKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcigKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIoKSwKLQkJCWNvbHVtbkNvbXBvc2l0ZQotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsT3ZlcnJpZGVEZWZhdWx0QnV0dG9uRW5hYmxlcihCdXR0b24gb3ZlcnJpZGVEZWZhdWx0QnV0dG9uKSB7Ci0JCW5ldyBDb250cm9sRW5hYmxlcigKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVFbmFibGVySG9sZGVyKCksCi0JCQlvdmVycmlkZURlZmF1bHRCdXR0b24KLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQXNzb2NpYXRpb25PdmVycmlkZShib29sZWFuIHNlbGVjdGVkKSB7Ci0KLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQlBdHRyaWJ1dGVPdmVycmlkZSBvdmVycmlkZSA9IHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIuZ2V0VmFsdWUoKTsKLQotCQkJQXR0cmlidXRlT3ZlcnJpZGUgbmV3T3ZlcnJpZGUgPSBvdmVycmlkZS5zZXRWaXJ0dWFsKCFzZWxlY3RlZCk7Ci0JCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyLnNldFZhbHVlKG5ld092ZXJyaWRlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0YzFjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUncyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW1iZWRkZWRJZE1hcHBpbmcKLSAqIEBzZWUgQmFzZUpwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTxFbWJlZGRlZElkTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5FbWJlZGRlZElkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjMTBjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW1iZWRkZWRNYXBwaW5nCi0gKiBAc2VlIEJhc2VKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPEVtYmVkZGVkTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkVtYmVkZGVkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbnRpdHlOYW1lQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VudGl0eU5hbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyMDA1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VudGl0eU5hbWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEVudGl0eSBOYW1lOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHkKLSAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TmFtZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnRpdHlOYW1lQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFbnRpdHlOYW1lQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgRW50aXR5PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0RW50aXR5TmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LkRFRkFVTFRfTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBkZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdEVudGl0eU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZERlZmF1bHRFbnRpdHlOYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRFbnRpdHlOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIEVudGl0eS5ERUZBVUxUX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXRTcGVjaWZpZWROYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBkZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZShFbnRpdHkgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0TmFtZSgpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0RW1wdHk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDQ29tYm8gY29tYm8gPSBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlOYW1lQ29tcG9zaXRlX25hbWUsCi0JCQlidWlsZERlZmF1bHRFbnRpdHlOYW1lTGlzdEhvbGRlcigpLAotCQkJYnVpbGRFbnRpdHlOYW1lSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfTkFNRQotCQkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbnVtVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbnVtVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhhNzQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW51bVR5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEVudW0gVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBCYXNpY01hcHBpbmcKLSAqIEBzZWUgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVudW1UeXBlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxCYXNpY01hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5GZXRjaFR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVudW1UeXBlQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIEJhc2ljTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEJhc2ljTWFwcGluZywgRW51bVR5cGU+IGJ1aWxkRW51bVR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEJhc2ljTWFwcGluZywgRW51bVR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEJhc2ljTWFwcGluZy5ERUZBVUxUX0VOVU1FUkFURURfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEJhc2ljTWFwcGluZy5TUEVDSUZJRURfRU5VTUVSQVRFRF9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudW1UeXBlW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRW51bVR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudW1UeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRFbnVtZXJhdGVkKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEVudW1UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLmNsYXNzLAotCQkJCQlFbnVtVHlwZUNvbXBvc2l0ZS50aGlzLAotCQkJCQl2YWx1ZQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudW1UeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEVudW1UeXBlIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZEVudW1lcmF0ZWQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5CYXNpY0dlbmVyYWxTZWN0aW9uX2VudW1lcmF0ZWRMYWJlbCwKLQkJCWJ1aWxkRW51bVR5cGVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19FTlVNRVJBVEVECi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9GZXRjaFR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRmV0Y2hUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNzUyNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9GZXRjaFR5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBGZXRjaDogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRmV0Y2hhYmxlCi0gKiBAc2VlIEJhc2ljTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKiBAc2VlIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqIEBzZWUgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICogQHNlZSBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmV0Y2hUeXBlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxGZXRjaGFibGU+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RmV0Y2hUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGZXRjaFR5cGVDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgRmV0Y2hhYmxlPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEZldGNoYWJsZSwgRmV0Y2hUeXBlPiBidWlsZEZldGNoVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RmV0Y2hhYmxlLCBGZXRjaFR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEZldGNoYWJsZS5ERUZBVUxUX0ZFVENIX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRmV0Y2hUeXBlW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRmV0Y2hUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBGZXRjaFR5cGUgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdEZldGNoKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEZldGNoVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5jbGFzcywKLQkJCQkJRmV0Y2hUeXBlQ29tcG9zaXRlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkRmV0Y2goKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShGZXRjaFR5cGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkRmV0Y2godmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5CYXNpY0dlbmVyYWxTZWN0aW9uX2ZldGNoTGFiZWwsCi0JCQlidWlsZEZldGNoVHlwZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0ZFVENIX1RZUEUKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNDk5ZTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU3RyYXRlZ3k6ICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgR2VuZXJhdG9yIE5hbWU6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIElkTWFwcGluZwotICogQHNlZSBHZW5lcmF0ZWRWYWx1ZQotICogQHNlZSBHZW5lcmF0aW9uQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPElkTWFwcGluZz4KLXsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZ2VuZXJhdGVkVmFsdWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCXByaXZhdGUgQ0NvbWJvIGdlbmVyYXRvck5hbWVDb21ibzsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZ2VuZXJhdG9yTmFtZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgZ2VuZXJhdG9yc0xpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+R2VuZXJhdGVkVmFsdWVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIElkTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRHZW5lcmF0ZWRWYWx1ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQlidWlsZEdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlkaXNlbmdhZ2VMaXN0ZW5lcnMoKEdlbmVyYXRlZFZhbHVlKSBlLmdldE9sZFZhbHVlKCkpOwotCQkJCWVuZ2FnZUxpc3RlbmVycygoR2VuZXJhdGVkVmFsdWUpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0KLQkJCQlpZiAoIWlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCXBvcHVsYXRlR2VuZXJhdG9yTmFtZUNvbWJvKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGJ1aWxkR2VuZXJhdG9yTmFtZU1vZGlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgZ2VuZXJhdG9yTmFtZSA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSBzdWJqZWN0KCkuZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQotCQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdlbmVyYXRvck5hbWUpKSB7Ci0KLQkJCQkJaWYgKChnZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB8fAotCQkJCQkgICAgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSkpCi0JCQkJCXsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCWdlbmVyYXRvck5hbWUgPSBudWxsOwotCQkJCX0KLQotCQkJCXJldHJpZXZlR2VuZXJhdGVkVmFsdWUoKS5zZXRTcGVjaWZpZWRHZW5lcmF0b3IoZ2VuZXJhdG9yTmFtZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkR2VuZXJhdG9yTmFtZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQlidWlsZEdlbmVyYXRvck5hbWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkR2VuZXJhdG9yTmFtZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKCFpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCQkJCXRyeSB7Ci0JCQkJCQlwb3B1bGF0ZUdlbmVyYXRvck5hbWUoKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkR2VuZXJhdG9yc0xpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKAotCQkJYnVpbGRHZW5lcmF0b3JzTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZEdlbmVyYXRvcnNMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQkvLyBzaG91bGQgb25seSBoYXZlIHRvIGxpc3RlbiB0byB0aGlzIGV2ZW50IC0gb3RoZXJzIGFyZW4ndCBjcmVhdGVkCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoISBpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCQkJCXRyeSB7Ci0JCQkJCQlwb3B1bGF0ZUdlbmVyYXRvckNob2ljZXMoKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdGVkVmFsdWU+IGJ1aWxkR2VuZXJhdG9yVmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkTWFwcGluZywgR2VuZXJhdGVkVmFsdWU+KGdldFN1YmplY3RIb2xkZXIoKSwgSWRNYXBwaW5nLkdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgR2VuZXJhdGVkVmFsdWUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxHZW5lcmF0ZWRWYWx1ZSwgR2VuZXJhdGlvblR5cGU+IGJ1aWxkU3RyYXRlZ3lDb21ib1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEdlbmVyYXRlZFZhbHVlLCBHZW5lcmF0aW9uVHlwZT4odGhpcywgYnVpbGRHZW5lcmF0b3JWYWx1ZUhvbGRlcigpLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX1NUUkFURUdZX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfU1RSQVRFR1lfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZVtdIGNob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEdlbmVyYXRpb25UeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0U3RyYXRlZ3koKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoR2VuZXJhdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuY2xhc3MsCi0JCQkJCUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgR2VuZXJhdGlvblR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRTdHJhdGVneSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEdlbmVyYXRpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0cmlldmVHZW5lcmF0ZWRWYWx1ZSgpLnNldFNwZWNpZmllZFN0cmF0ZWd5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlKSB7Ci0KLQkJaWYgKGdlbmVyYXRlZFZhbHVlICE9IG51bGwpIHsKLQotCQkJZ2VuZXJhdGVkVmFsdWUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX0dFTkVSQVRPUl9QUk9QRVJUWSwKLQkJCQlnZW5lcmF0b3JOYW1lUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCQkJKTsKLQotCQkJZ2VuZXJhdGVkVmFsdWUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfR0VORVJBVE9SX1BST1BFUlRZLAotCQkJCWdlbmVyYXRvck5hbWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JCQkpOwotCi0JCQlnZW5lcmF0ZWRWYWx1ZS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUGVyc2lzdGVuY2VVbml0LkdFTkVSQVRPUlNfTElTVCwKLQkJCQlnZW5lcmF0b3JzTGlzdENoYW5nZUxpc3RlbmVyCi0JCQkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKElkTWFwcGluZyBzdWJqZWN0KSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZUxpc3RlbmVycyhzdWJqZWN0KTsKLQotCQlpZiAoc3ViamVjdCAhPSBudWxsKSB7Ci0JCQlzdWJqZWN0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJSWRNYXBwaW5nLkdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSwKLQkJCQlnZW5lcmF0ZWRWYWx1ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLQkJCSk7Ci0JCQlkaXNlbmdhZ2VMaXN0ZW5lcnMoc3ViamVjdC5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJcG9wdWxhdGVHZW5lcmF0b3JOYW1lQ29tYm8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5nYWdlTGlzdGVuZXJzKEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlKSB7Ci0KLQkJaWYgKGdlbmVyYXRlZFZhbHVlICE9IG51bGwpIHsKLQotCQkJZ2VuZXJhdGVkVmFsdWUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX0dFTkVSQVRPUl9QUk9QRVJUWSwKLQkJCQlnZW5lcmF0b3JOYW1lUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCQkJKTsKLQotCQkJZ2VuZXJhdGVkVmFsdWUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfR0VORVJBVE9SX1BST1BFUlRZLAotCQkJCWdlbmVyYXRvck5hbWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JCQkpOwotCi0JCQlnZW5lcmF0ZWRWYWx1ZS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUGVyc2lzdGVuY2VVbml0LkdFTkVSQVRPUlNfTElTVCwKLQkJCQlnZW5lcmF0b3JzTGlzdENoYW5nZUxpc3RlbmVyCi0JCQkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKElkTWFwcGluZyBzdWJqZWN0KSB7Ci0JCXN1cGVyLmVuZ2FnZUxpc3RlbmVycyhzdWJqZWN0KTsKLQotCQlpZiAoc3ViamVjdCAhPSBudWxsKSB7Ci0JCQllbmdhZ2VMaXN0ZW5lcnMoc3ViamVjdC5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCXN1YmplY3QuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlJZE1hcHBpbmcuR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZLAotCQkJCWdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCQkJKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQlnZW5lcmF0ZWRWYWx1ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBidWlsZEdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQlnZW5lcmF0b3JOYW1lUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciAgPSBidWlsZEdlbmVyYXRvck5hbWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCWdlbmVyYXRvcnNMaXN0Q2hhbmdlTGlzdGVuZXIgPSBidWlsZEdlbmVyYXRvcnNMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBTdHJhdGVneSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zdHJhdGVneSwKLQkJCWJ1aWxkU3RyYXRlZ3lDb21ib1ZpZXdlcihjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19HRU5FUkFURURfVkFMVUVfU1RSQVRFR1kKLQkJKTsKLQotCQkvLyBHZW5lcmF0b3IgTmFtZSB3aWRnZXRzCi0JCWdlbmVyYXRvck5hbWVDb21ibyA9IGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2dlbmVyYXRvck5hbWUsCi0JCQlidWlsZEdlbmVyYXRvck5hbWVNb2RpZnlMaXN0ZW5lcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19HRU5FUkFURURfVkFMVUVfU1RSQVRFR1kKLQkJKTsKLQotCQlnZW5lcmF0b3JOYW1lQ29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0RW1wdHkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUdlbmVyYXRvckNob2ljZXMoKSB7Ci0JCWlmIChzdWJqZWN0KCkgPT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1swXSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmdlbmVyYXRvck5hbWVDb21iby5zZXRJdGVtcyh0aGlzLnNvcnRlZFVuaXF1ZUdlbmVyYXRvck5hbWVzKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlR2VuZXJhdG9yTmFtZSgpIHsKLQkJaWYgKHN1YmplY3QoKSA9PSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRvck5hbWVDb21iby5zZXRUZXh0KCIiKTsKLQkJfQotCQllbHNlIHsKLQkJCUdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlID0gc3ViamVjdCgpLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0KLQkJCWlmIChnZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8uc2V0VGV4dCgiIik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgZ2VuZXJhdG9yTmFtZSA9IGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpOwotCi0JCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2VuZXJhdG9yTmFtZSkpIHsKLQkJCQkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8uc2V0VGV4dCgiIik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF0aGlzLmdlbmVyYXRvck5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKGdlbmVyYXRvck5hbWUpKSB7Ci0JCQkJCXRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLnNldFRleHQoZ2VuZXJhdG9yTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlR2VuZXJhdG9yTmFtZUNvbWJvKCkgewotCQlwb3B1bGF0ZUdlbmVyYXRvck5hbWUoKTsKLQkJcG9wdWxhdGVHZW5lcmF0b3JDaG9pY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmF0ZWRWYWx1ZSByZXRyaWV2ZUdlbmVyYXRlZFZhbHVlKCkgewotCQlHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSA9IHN1YmplY3QoKS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCi0JCWlmIChnZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCQl0cnkgewotCQkJCWdlbmVyYXRlZFZhbHVlID0gc3ViamVjdCgpLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBnZW5lcmF0ZWRWYWx1ZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIHNvcnRlZFVuaXF1ZUdlbmVyYXRvck5hbWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmFycmF5KAotCQkJQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCgKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxHZW5lcmF0b3IsIFN0cmluZz4oCi0JCQkJCQluZXcgRmlsdGVyaW5nSXRlcmF0b3I8R2VuZXJhdG9yLCBHZW5lcmF0b3I+KHN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpIAotCQkJCQkJewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChHZW5lcmF0b3IgbykgewotCQkJCQkJCQlyZXR1cm4gby5nZXROYW1lKCkgIT0gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9KQotCQkJCQl7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShHZW5lcmF0b3IgbmV4dCkgewotCQkJCQkJcmV0dXJuIG5leHQuZ2V0TmFtZSgpOwotCQkJCQl9Ci0JCQkJfSksCi0JCQluZXcgU3RyaW5nWzBdKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiYzFhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9ySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgdiBQcmltYXJ5IEtleSBHZW5lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIHggUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgfCBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB2IFRhYmxlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgeCBUYWJsZSBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgfCBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB2IFNlcXVlbmNlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgeCBTZXF1ZW5jZSBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgfCBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIElkTWFwcGluZwotICogQHNlZSBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZQotICogQHNlZSBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZQotICogQHNlZSBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZQotICogQHNlZSBJZE1hcHBpbmdDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8SWRNYXBwaW5nPgotewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gc2VxdWVuY2VHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkdlbmVyYXRpb25Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEdlbmVyYXRpb25Db21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgSWRNYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUHJpbWFyeUtleUdlbmVyYXRpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBJZE1hcHBpbmcuR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEdlbmVyYXRlZFZhbHVlKCkgIT0gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlICYmIChzdWJqZWN0LmdldEdlbmVyYXRlZFZhbHVlKCkgPT0gbnVsbCkpIHsKLQkJCQkJc3ViamVjdC5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkJCX0KLQkJCQllbHNlIGlmICghdmFsdWUgJiYgKHN1YmplY3QuZ2V0R2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKSkgewotCQkJCQlzdWJqZWN0LnJlbW92ZUdlbmVyYXRlZFZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3JIb2xkZXIuU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlICYmIChzdWJqZWN0LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgPT0gbnVsbCkpIHsKLQotCQkJCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IHN1YmplY3QuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCQkJR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSBzdWJqZWN0LmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0KLQkJCQkJaWYgKChnZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKSAmJgotCQkJCQkgICAgKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpICE9IG51bGwpKQotCQkJCQl7Ci0JCQkJCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXROYW1lKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICghdmFsdWUgJiYgKHN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSkgewotCQkJCQlzdWJqZWN0LnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotIAlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGFibGVHZW5lcmF0b3JCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxJZE1hcHBpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9ySG9sZGVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQotCQkJCWlmICh2YWx1ZSAmJiAoc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpKSB7Ci0KLQkJCQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBzdWJqZWN0LmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQkJCUdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlID0gc3ViamVjdC5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCi0JCQkJCWlmICgoZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgJiYKLQkJCQkJICAgIChnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSAhPSBudWxsKSkKLQkJCQkJewotCQkJCQkJdGFibGVHZW5lcmF0b3Iuc2V0TmFtZShnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIXZhbHVlICYmIChzdWJqZWN0LmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkpIHsKLQkJCQkJc3ViamVjdC5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkKLQl7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQotCQlzZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyLnNldFZhbHVlKHN1YmplY3QoKSAhPSBudWxsICYmIHN1YmplY3QoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpOwotCQl0YWJsZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyICAgLnNldFZhbHVlKHN1YmplY3QoKSAhPSBudWxsICYmIHN1YmplY3QoKS5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQlzZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihmYWxzZSk7Ci0JCXRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgICAgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBQcmltYXJ5IEtleSBHZW5lcmF0aW9uIHNlY3Rpb24KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3ByaW1hcnlLZXlHZW5lcmF0aW9uLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCi0JCSk7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBjaGVjayBib3gKLQkJQnV0dG9uIHByaW1hcnlLZXlHZW5lcmF0aW9uQ2hlY2tCb3ggPSBidWlsZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbiwKLQkJCWJ1aWxkUHJpbWFyeUtleUdlbmVyYXRpb25Ib2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfUFJJTUFSWV9LRVlfR0VORVJBVElPTgotCQkpOwotCi0JCS8vIEdlbmVyYXRlZCBWYWx1ZSB3aWRnZXRzCi0JCUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlIGdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlID0gbmV3IEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWNvbnRhaW5lcgotCQkpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCAgICAgICAgICA9IHByaW1hcnlLZXlHZW5lcmF0aW9uQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2OwotCi0JCWdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBUYWJsZSBHZW5lcmF0b3IgcGFuZQotCQlpbml0aWFsaXplVGFibGVHZW5lcmF0b3JQYW5lKGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDEwKSk7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIHBhbmUKLQkJaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yUGFuZShidWlsZFN1YlBhbmUoY29udGFpbmVyLCAxMCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3JQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3Igc3ViLXNlY3Rpb24KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVN1YlNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yLAotCQkJc2VxdWVuY2VHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlcgotCQkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBjaGVjayBib3gKLQkJQnV0dG9uIHNlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3ggPSBidWlsZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvciwKLQkJCWJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JCb29sZWFuSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUgotCQkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBwYW5lCi0JCW5ldyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBzZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94LmdldEJvcmRlcldpZHRoKCkgKyAxNikKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9yUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gVGFibGUgR2VuZXJhdG9yIHN1Yi1zZWN0aW9uCi0JCWNvbnRhaW5lciA9IGJ1aWxkQ29sbGFwc2FibGVTdWJTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvciwKLQkJCXRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIKLQkJKTsKLQotCQlCdXR0b24gdGFibGVHZW5lcmF0b3JDaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yLAotCQkJYnVpbGRUYWJsZUdlbmVyYXRvckJvb2xlYW5Ib2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SCi0JCSk7Ci0KLQkJbmV3IFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIHRhYmxlR2VuZXJhdG9yQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2KQotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRvckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0b3JDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3MDA0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGdlbmVyaWMgcGFuZSBmb3IgYSBnZW5lcmF0b3IuCi0gKgotICogQHNlZSBJZE1hcHBpbmcKLSAqIEBzZWUgR2VuZXJhdG9yCi0gKiBAc2VlIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlIC0gQSBzdWItcGFuZQotICogQHNlZSBUYWxiZUdlbmVyYXRvckNvbXBvc2l0ZSAtIEEgc3ViLXBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJhdG9yQ29tcG9zaXRlPFQgZXh0ZW5kcyBHZW5lcmF0b3I+IGV4dGVuZHMgQWJzdHJhY3RQYW5lPEdlbmVyYXRvckhvbGRlcj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkdlbmVyYXRvckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgR2VuZXJhdG9yQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgR2VuZXJhdG9ySG9sZGVyPiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkQWxsb2NhdGlvblNpemVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvciwgSW50ZWdlcj4oYnVpbGRHZW5lcmF0b3JIb2xkZXIoKSwgR2VuZXJhdG9yLlNQRUNJRklFRF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJSW50ZWdlciB2YWx1ZSA9IHN1YmplY3QuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJCQlzZXRWYWx1ZV8odmFsdWUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXJldHJpZXZlR2VuZXJhdG9yKHN1YmplY3QoKSkuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlID09IC0xKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRBbGxvY2F0aW9uU2l6ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yLCBJbnRlZ2VyPihidWlsZEdlbmVyYXRvckhvbGRlcigpLCBHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEludGVnZXIuTUlOX1ZBTFVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZERlZmF1bHRBbGxvY2F0aW9uU2l6ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlMYWJlbCBsYWJlbCA9IGJ1aWxkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGVmYXVsdFdpdGhvdXRWYWx1ZQotCQkpOwotCi0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoCi0JCQluZXcgTGFiZWxlZExhYmVsKGxhYmVsKSwKLQkJCWJ1aWxkRGVmYXVsdEFsbG9jYXRpb25TaXplTGFiZWxIb2xkZXIoKQotCQkpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdEFsbG9jYXRpb25TaXplTGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEFsbG9jYXRpb25TaXplSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJbnRlZ2VyIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsIHZhbHVlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRJbml0aWFsVmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvciwgSW50ZWdlcj4oYnVpbGRHZW5lcmF0b3JIb2xkZXIoKSwgR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEludGVnZXIuTUlOX1ZBTFVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZERlZmF1bHRJbml0aWFsVmFsdWVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBidWlsZExhYmVsKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRob3V0VmFsdWUKLQkJKTsKLQotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKAotCQkJbmV3IExhYmVsZWRMYWJlbChsYWJlbCksCi0JCQlidWlsZERlZmF1bHRJbml0aWFsVmFsdWVMYWJlbEhvbGRlcigpCi0JCSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0SW5pdGlhbFZhbHVlTGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEluaXRpYWxWYWx1ZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSW50ZWdlciB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aFZhbHVlLCB2YWx1ZSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuICIiOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG5ldyA8Y29kZT5JR2VuZXJhdG9yPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0IFRoZSBzdWJqZWN0IHVzZWQgdG8gcmV0cmlldmUgdGhlIGdlbmVyYXRvcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+SUdlbmVyYXRvcjwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVCBidWlsZEdlbmVyYXRvcihHZW5lcmF0b3JIb2xkZXIgc3ViamVjdCk7Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3I+IGJ1aWxkR2VuZXJhdG9ySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JIb2xkZXIsIEdlbmVyYXRvcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBwcm9wZXJ0eU5hbWUoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgR2VuZXJhdG9yIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5nZW5lcmF0b3Ioc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRHZW5lcmF0b3JOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3IsIFN0cmluZz4oYnVpbGRHZW5lcmF0b3JIb2xkZXIoKSwgR2VuZXJhdG9yLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJCQlzZXRWYWx1ZV8odmFsdWUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJcmV0cmlldmVHZW5lcmF0b3Ioc3ViamVjdCgpKS5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRJbml0aWFsVmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvciwgSW50ZWdlcj4oYnVpbGRHZW5lcmF0b3JIb2xkZXIoKSwgR2VuZXJhdG9yLlNQRUNJRklFRF9JTklUSUFMX1ZBTFVFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCUludGVnZXIgdmFsdWUgPSBzdWJqZWN0LmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpOwotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJCQlzZXRWYWx1ZV8odmFsdWUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXJldHJpZXZlR2VuZXJhdG9yKHN1YmplY3QoKSkuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgd2l0aG91dCBjcmVhdGluZyB0aGUgPGNvZGU+R2VuZXJhdG9yPC9jb2RlPiBmcm9tIHRoZSBzdWJqZWN0LgotCSAqCi0JICogQHJldHVybiBUaGUgPGNvZGU+R2VuZXJhdG9yPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2Vzbid0Ci0JICogZXhpc3RzCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFQgZ2VuZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCgpID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2VuZXJhdG9yKHRoaXMuc3ViamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgd2l0aG91dCBjcmVhdGluZyB0aGUgPGNvZGU+R2VuZXJhdG9yPC9jb2RlPiBmcm9tIHRoZSBzdWJqZWN0LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3QgVGhlIHN1YmplY3QgdXNlZCB0byByZXRyaWV2ZSB0aGUgZ2VuZXJhdG9yCi0JICogQHJldHVybiBUaGUgPGNvZGU+R2VuZXJhdG9yPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2Vzbid0Ci0JICogZXhpc3RzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFQgZ2VuZXJhdG9yKEdlbmVyYXRvckhvbGRlciBzdWJqZWN0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxhYmVsZWQgc3Bpbm5lciByZXNwb25zaWJsZSB0byBlZGl0IHRoZSBhbGxvY2F0aW9uIHNpemUuIFRoZQotCSAqIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBzaG93biBhZnRlciB0aGUgc3Bpbm5lci4gQSB2YWx1ZSBvZiAtMSBtZWFucyB0aGUKLQkgKiBkZWZhdWx0IHZhbHVlIGFuZCB0aGUgbW9kZWwgaGFzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBbGxvY2F0aW9uU2l6ZVdpZGdldHMoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IGJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuR2VuZXJhdG9yQ29tcG9zaXRlX2FsbG9jYXRpb25TaXplLAotCQkJYnVpbGRBbGxvY2F0aW9uU2l6ZUhvbGRlcigpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJYnVpbGREZWZhdWx0QWxsb2NhdGlvblNpemVMYWJlbChjb250YWluZXIpCi0JCSk7Ci0KLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLCBzcGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsYWJlbGVkIHNwaW5uZXIgcmVzcG9uc2libGUgdG8gZWRpdCB0aGUgaW5pdGlhbCB2YWx1ZS4gVGhlCi0JICogZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHNob3duIGFmdGVyIHRoZSBzcGlubmVyLiBBIHZhbHVlIG9mIC0xIG1lYW5zIHRoZQotCSAqIGRlZmF1bHQgdmFsdWUgYW5kIHRoZSBtb2RlbCBoYXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUluaXRpYWxWYWx1ZVdpZGdldHMoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IGJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuR2VuZXJhdG9yQ29tcG9zaXRlX2luaXRpYWxWYWx1ZSwKLQkJCWJ1aWxkSW5pdGlhbFZhbHVlSG9sZGVyKCksCi0JCQktMSwKLQkJCS0xLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQlidWlsZERlZmF1bHRJbml0aWFsVmFsdWVMYWJlbChjb250YWluZXIpCi0JCSk7Ci0KLQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIsIHNwaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgSlBBIHByb2plY3QuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBKUEEgcHJvamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3ViamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLnN1YmplY3QoKSA9PSBudWxsID8gbnVsbCA6IHRoaXMuc3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIHVzZWQgdG8gbGlzdGVuIHRvIHRoZSBJRCBtYXBwaW5nIHdoZW4gdGhlCi0JICogZ2VuZXJhdG9yIGNoYW5nZXMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0eSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2VuZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBwcm9wZXJ0eU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgPGNvZGU+R2VuZXJhdG9yPC9jb2RlPiBhbmQgaWYgaXQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4KLQkgKiBjcmVhdGUgaXQuCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdCBUaGUgc3ViamVjdCB1c2VkIHRvIHJldHJpZXZlIHRoZSBnZW5lcmF0b3IKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5HZW5lcmF0b3I8L2NvZGU+IHdoaWNoIHNob3VsZCBuZXZlciBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUIHJldHJpZXZlR2VuZXJhdG9yKEdlbmVyYXRvckhvbGRlciBzdWJqZWN0KSB7Ci0JCVQgZ2VuZXJhdG9yID0gdGhpcy5nZW5lcmF0b3Ioc3ViamVjdCk7Ci0KLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQlnZW5lcmF0b3IgPSB0aGlzLmJ1aWxkR2VuZXJhdG9yKHN1YmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIGdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBsYXlvdXQgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciBieSBjaGFuZ2luZyB3aGljaCB3aWRnZXQgd2lsbAotCSAqIGdyYWIgdGhlIGV4Y2VzcyBvZiBob3Jpem9udGFsIHNwYWNlLiBCeSBkZWZhdWx0LCB0aGUgY2VudGVyIGNvbnRyb2wgZ3JhYnMKLQkgKiB0aGUgZXhjZXNzIHNwYWNlLCB3ZSBjaGFuZ2UgaXQgdG8gYmUgdGhlIHJpZ2h0IGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgY29udGFpbmluZyB0aGUgY29udHJvbHMgbmVlZGluZyB0aGVpcgotCSAqIDxjb2RlPkdyaWREYXRhPC9jb2RlPiB0byBiZSBtb2RpZmllZCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlcwotCSAqIEBwYXJhbSBzcGlubmVyIFRoZSBzcGlubmVyIHRoYXQgZ290IGNyZWF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3Bpbm5lciBzcGlubmVyKSB7Ci0KLQkJLy8gSXQgaXMgcG9zc2libGUgdGhlIHNwaW5uZXIncyBwYXJlbnQgaXMgbm90IHRoZSBjb250YWluZXIgb2YgdGhlCi0JCS8vIGxhYmVsLCBzcGlubmVyIGFuZCByaWdodCBjb250cm9sIChhIHBhbmUgaXMgc29tZXRpbWVzIHJlcXVpcmVkIGZvcgotCQkvLyBwYWludGluZyB0aGUgc3Bpbm5lcidzIGJvcmRlcikKLQkJQ29tcG9zaXRlIHBhbmVDb250YWluZXIgPSBzcGlubmVyLmdldFBhcmVudCgpOwotCi0JCXdoaWxlIChjb250YWluZXIgIT0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKSkgewotCQkJcGFuZUNvbnRhaW5lciA9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlDb250cm9sW10gY29udHJvbHMgPSBwYW5lQ29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQljb250cm9sc1sxXS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljb250cm9sc1syXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlQWxpZ25SaWdodChjb250cm9sc1syXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvR2VuZXJhdG9yc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0b3JzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmN2JkYjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0b3JzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IHYgVGFibGUgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IFRhYmxlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8IFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHYgU2VxdWVuY2UgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IFNlcXVlbmNlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8IFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBHZW5lcmF0b3JIb2xkZXIKLSAqIEBzZWUgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUKLSAqIEBzZWUgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUKLSAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdG9yc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxHZW5lcmF0b3JIb2xkZXI+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBzZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdGFibGVHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+R2VuZXJhdG9yc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgR2VuZXJhdG9yc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIEdlbmVyYXRvckhvbGRlcj4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9ySG9sZGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvckhvbGRlci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUgJiYgKHN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSkgewotCQkJCQlzdWJqZWN0LmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF2YWx1ZSAmJiAoc3ViamVjdC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpKSB7Ci0JCQkJCXN1YmplY3QucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRhYmxlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9ySG9sZGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvckhvbGRlci5UQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUgJiYgKHN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSkgewotCQkJCQlzdWJqZWN0LmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF2YWx1ZSAmJiAoc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpKSB7Ci0JCQkJCXN1YmplY3QucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCi0JCXNlcXVlbmNlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIuc2V0VmFsdWUoc3ViamVjdCgpICE9IG51bGwgJiYgc3ViamVjdCgpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCk7Ci0JCXRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgICAuc2V0VmFsdWUoc3ViamVjdCgpICE9IG51bGwgJiYgc3ViamVjdCgpLmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCk7Ci0JfQotCi0gCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQlzZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihmYWxzZSk7Ci0JCXRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgICAgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KGZhbHNlKTsKLQl9Ci0KLSAJLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9yUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3JQYW5lKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvclBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBzdWItc2VjdGlvbgotCQljb250YWluZXIgPSBidWlsZENvbGxhcHNhYmxlU3ViU2VjdGlvbigKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDEwKSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3IsCi0JCQlzZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyCi0JCSk7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIGNoZWNrIGJveAotCQlCdXR0b24gc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3goCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCA1KSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3IsCi0JCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1IKLQkJKTsKLQotCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3IgcGFuZQotCQluZXcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTYpCi0JCSk7Ci0JfQotCi0gCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFibGVHZW5lcmF0b3JQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBUYWJsZSBHZW5lcmF0b3Igc3ViLXNlY3Rpb24KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVN1YlNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yLAotCQkJdGFibGVHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlcgotCQkpOwotCi0JCUJ1dHRvbiB0YWJsZUdlbmVyYXRvckNoZWNrQm94ID0gYnVpbGRDaGVja0JveCgKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDUpLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvciwKLQkJCWJ1aWxkVGFibGVHZW5lcmF0b3JCb29sZWFuSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUgotCQkpOwotCi0JCW5ldyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCB0YWJsZUdlbmVyYXRvckNoZWNrQm94LmdldEJvcmRlcldpZHRoKCkgKyAxNikKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0lkQ2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSWRDbGFzc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTcyNTI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSWRDbGFzc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZENsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQ2xhc3NDaG9vc2VyUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIElkQ2xhc3MKLSAqIEBzZWUgQ2xhc3NDaG9vc2VyUGFuZQotICogQHNlZSBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZSAtIEEgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlIC0gQSBwYXJlbnQgY29udGFpbmVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJZENsYXNzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPElkQ2xhc3M+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5JZENsYXNzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSWRDbGFzc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIElkQ2xhc3M+IHBhcmVudFBhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8SWRDbGFzcz4gaW5pdGlhbGl6ZUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPElkQ2xhc3M+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxJZENsYXNzLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgSWRDbGFzcy5JRF9DTEFTU19QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmdldElkQ2xhc3MoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCi0JCQkJCQlzdWJqZWN0LnNldElkQ2xhc3ModmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldElkQ2xhc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkQ2xhc3NDb21wb3NpdGVfbGFiZWw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJCUlKYXZhUHJvamVjdCByb290ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRUeXBlKCkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOwotCQkJCQlzdWJqZWN0KCkuc2V0SWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2RkZGJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENvbHVtbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBHZW5lcmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBJZE1hcHBpbmcKLSAqIEBzZWUgQmFzZUpwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBDb2x1bW5Db21wb3NpdGUKLSAqIEBzZWUgVGVtcG9yYWxUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIEdlbmVyYXRpb25Db21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIElkTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8SWRNYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUlkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBJZE1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29sdW1uPiBidWlsZENvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJZE1hcHBpbmcsIENvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSAgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybV8oSWRNYXBwaW5nIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGJ1aWxkUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgZ3JvdXBCb3hNYXJnaW4pIHsKLQkJcmV0dXJuIGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ3JvdXBCb3hNYXJnaW4oKTsKLQotCQkvLyBDb2x1bW4gd2lkZ2V0cwotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0KLQkJLy8gVGVtcG9yYWwgVHlwZSB3aWRnZXRzCi0JCW5ldyBUZW1wb3JhbFR5cGVDb21wb3NpdGUodGhpcywgYnVpbGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKLQotCQkvLyBHZW5lcmF0aW9uIHBhbmUKLQkJbmV3IEdlbmVyYXRpb25Db21wb3NpdGUodGhpcywgYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMTApKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9JbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViYjkyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdERpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqCi0gKiBAc2VlIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdAotICogQHNlZSBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBqb2luVGFibGUgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMKLQkgKiBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2coU2hlbGwgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5UYWJsZSBqb2luVGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIocGFyZW50LCBqb2luVGFibGUsIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogbm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0RGlhbG9nUGFuZTxJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uRGlhbG9nUGFuZTxJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q+KAotCQkJc3ViamVjdEhvbGRlcigpLAotCQkJY29udGFpbmVyCi0JCSkKLQkJCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZUVkaXRhYmxlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0IGJ1aWxkU3RhdGVPYmplY3QoKSB7Ci0JCXJldHVybiBuZXcgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0KAotCQkJZ2V0T3duZXIoKSwKLQkJCWdldEpvaW5Db2x1bW4oKQotCQkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoSm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luVGFibGUgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoSm9pblRhYmxlKSBzdXBlci5nZXRPd25lcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9JbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlMjIxYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBUaGUgc3RhdGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIG9yIGVkaXQgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBvbiBhIGpvaW4KLSAqIHRhYmxlLgotICoKLSAqIEBzZWUgSm9pbkNvbHVtbgotICogQHNlZSBKb2luVGFibGUKLSAqIEBzZWUgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0IGV4dGVuZHMgSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gam9pblRhYmxlCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdChKb2luVGFibGUgam9pblRhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIoam9pblRhYmxlLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldE5hbWVUYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0RGJUYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKb2luVGFibGUgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoSm9pblRhYmxlKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gcmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0KLQkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiB0YXJnZXRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU2NoZW1hIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBpbml0aWFsVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlRWRpdGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXBwaW5nIHdoZXJlIHRoZSBqb2luIGNvbHVtbiBpcyBsb2NhdGVkLgotCSAqCi0JICogQHJldHVybiBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB0byBlZGl0Ci0JICovCi0JcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0UGFyZW50KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4oaW5pdGlhbFRhYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0phdmFQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0phdmFQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMjdkMzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9KYXZhUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5UeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLk51bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgIk1hcCBBcyIgY29tcG9zaXRlIGlzIHJlc3BvbnNpYmxlIGZvciBzaG93aW5nIHRoZSBtYXBwaW5nIG5hbWUgYW5kCi0gKiBtYXBwaW5nIHR5cGUgZm9yIGEgdHlwZSBkZWNsYXJlZCBpbiBhIEphdmEgdHlwZS4KLSAqCi0gKiBAc2VlIEphdmFQZXJzaXN0ZW50VHlwZQotICogQHNlZSBKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZSBleHRlbmRzIFBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGU8SmF2YVBlcnNpc3RlbnRUeXBlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmF2YVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIEphdmFQZXJzaXN0ZW50VHlwZT4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1hcHBpbmdVaVByb3ZpZGVyPEphdmFQZXJzaXN0ZW50VHlwZT4gYnVpbGREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGluZ1VpUHJvdmlkZXI8SmF2YVBlcnNpc3RlbnRUeXBlPigpIHsKLQotCQkJcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQkJCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JUeXBlTWFwcGluZyhudWxsKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV9kZWZhdWx0OwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiB0eXBlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCi0JCUNvbGxlY3Rpb248VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IHByb3ZpZGVycyA9Ci0JCQlDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihqcGFQbGF0Zm9ybVVpKCkuamF2YVR5cGVNYXBwaW5nVWlQcm92aWRlcnMoKSk7Ci0KLQkJcHJvdmlkZXJzLnJlbW92ZShOdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlyZXR1cm4gcHJvdmlkZXJzLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViOWQwZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBvc3RFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIEpvaW4gQ29sdW1ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi0gKiBAc2VlIEpvaW5Db2x1bW4KLSAqIEBzZWUgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZz4KLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5Ib2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBqb2luQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEpvaW5Db2x1bW5Db21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW4oKSB7Ci0KLQkJSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZyBkaWFsb2cgPQotCQkJbmV3IEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2coc2hlbGwoKSwgc3ViamVjdCgpLCBudWxsKTsKLQotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEFkZEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uKEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCi0JCVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgc3ViamVjdCA9IHN1YmplY3QoKTsKLQkJaW50IGluZGV4ID0gc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBzdWJqZWN0LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgpOwotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nPiBidWlsZEFkZEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQlhZGRKb2luQ29sdW1uKGRpYWxvZy5zdWJqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLCBKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuREVGQVVMVF9KT0lOX0NPTFVNTikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Sm9pbkNvbHVtbj4oYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZz4gYnVpbGRFZGl0Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCXVwZGF0ZUpvaW5Db2x1bW4oZGlhbG9nLnN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4gYnVpbGRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uPigpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlpZiAoam9pbkNvbHVtbi5pc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwpIHsKLQkJCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdCwKLQkJCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJCSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQsCi0JCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zLAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSm9pbkNvbHVtblBhbmVFbmFibGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRKb2luQ29sdW1uc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlUGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZEpvaW5Db2x1bW4oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5Db21wb3NpdGVfZWRpdDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZWRpdEpvaW5Db2x1bW4obGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJcmVtb3ZlSm9pbkNvbHVtbihsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4gYnVpbGRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCWphdmEudXRpbC5MaXN0PExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+LCBKb2luQ29sdW1uPihsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbikgZWxlbWVudDsKLQkJCQlyZXR1cm4gYnVpbGRKb2luQ29sdW1uTGFiZWwoam9pbkNvbHVtbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZEpvaW5Db2x1bW5zTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKb2luQ29sdW1uPihidWlsZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpLAotCQkJTmFtZWRDb2x1bW4uU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksCi0JCQlOYW1lZENvbHVtbi5ERUZBVUxUX05BTUVfUFJPUEVSVFksCi0JCQlCYXNlSm9pbkNvbHVtbi5TUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwKLQkJCUJhc2VKb2luQ29sdW1uLkRFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZywgSm9pbkNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJdXBkYXRlSm9pbkNvbHVtblBhbmVFbmFibGVtZW50KHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKEpvaW5Db2x1bW4pIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7Ci0KLQkJSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZyBkaWFsb2cgPQotCQkJbmV3IEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2coc2hlbGwoKSwgc3ViamVjdCgpLCBqb2luQ29sdW1uKTsKLQotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEVkaXRKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCQl1cGRhdGVKb2luQ29sdW1uUGFuZUVuYWJsZW1lbnQoZW5hYmxlZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCi0JCWpvaW5Db2x1bW5Ib2xkZXIgICAgICAgICAgICA9IGJ1aWxkSm9pbkNvbHVtbkhvbGRlcigpOwotCQlqb2luQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIgPSBidWlsZEpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIEpvaW4gQ29sdW1ucyBncm91cAotCQlHcm91cCBncm91cFBhbmUgPSBidWlsZFRpdGxlZFBhbmUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9qb2luQ29sdW1uCi0JCSk7Ci0KLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBKb2luIENvbHVtbnMgY2hlY2sgYm94Ci0JCWJ1aWxkQ2hlY2tCb3goCi0JCQlidWlsZFN1YlBhbmUoZ3JvdXBQYW5lLCA4KSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zLAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBKb2luIENvbHVtbnMgbGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc+IGpvaW5Db2x1bW5zTGlzdFBhbmUgPQotCQkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc+KAotCQkJCXRoaXMsCi0JCQkJZ3JvdXBQYW5lLAotCQkJCWJ1aWxkSm9pbkNvbHVtbnNBZGFwdGVyKCksCi0JCQkJYnVpbGRKb2luQ29sdW1uc0xpc3RNb2RlbCgpLAotCQkJCWpvaW5Db2x1bW5Ib2xkZXIsCi0JCQkJYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCksCi0JCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMKLQkJCSk7Ci0KLQkJaW5zdGFsbEpvaW5Db2x1bW5zTGlzdFBhbmVFbmFibGVyKGpvaW5Db2x1bW5zTGlzdFBhbmUpOwotCQlyZW1vdmVGcm9tRW5hYmxlbWVudENvbnRyb2woam9pbkNvbHVtbnNMaXN0UGFuZS5nZXRDb250cm9sKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsSm9pbkNvbHVtbnNMaXN0UGFuZUVuYWJsZXIoQWRkUmVtb3ZlTGlzdFBhbmU8U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZz4gcGFuZSkgewotCQluZXcgUGFuZUVuYWJsZXIoam9pbkNvbHVtblBhbmVFbmFibGVySG9sZGVyLCBwYW5lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlSm9pbkNvbHVtbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJaW50W10gc2VsZWN0ZWRJbmRpY2VzID0gbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkSW5kaWNlcygpOwotCi0JCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKLQkJCXN1YmplY3QoKS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKHNlbGVjdGVkSW5kaWNlc1tpbmRleF0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUpvaW5Db2x1bW4oSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ1N0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oc3RhdGVPYmplY3QuZ2V0Sm9pbkNvbHVtbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbHVtblBhbmVFbmFibGVtZW50KGJvb2xlYW4gZW5hYmxlZCkgewotCi0JCVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgc3ViamVjdCA9IHN1YmplY3QoKTsKLQkJZW5hYmxlZCAmPSAoc3ViamVjdCAhPSBudWxsKSAmJiBzdWJqZWN0LmNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJam9pbkNvbHVtblBhbmVFbmFibGVySG9sZGVyLnNldFZhbHVlKGVuYWJsZWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1ucyhib29sZWFuIHNlbGVjdGVkKSB7Ci0KLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQlTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIHN1YmplY3QgPSBzdWJqZWN0KCk7Ci0KLQkJCS8vIEFkZCBhIGpvaW4gY29sdW1uIGJ5IGNyZWF0aW5nIGEgc3BlY2lmaWVkIG9uZSB1c2luZyB0aGUgZGVmYXVsdAotCQkJLy8gb25lIGlmIGl0IGV4aXN0cwotCQkJaWYgKHNlbGVjdGVkKSB7Ci0KLQkJCQlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gc3ViamVjdC5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOy8vVE9ETyBjb3VsZCBiZSBudWxsLCBkaXNhYmxlIG92ZXJyaWRlIGRlZmF1bHQgY2hlY2sgYm94PwotCi0JCQkJaWYgKGRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQotCQkJCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBzdWJqZWN0LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5OYW1lKTsKLQkJCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0KLQkJCQkJam9pbkNvbHVtbkhvbGRlci5zZXRWYWx1ZShqb2luQ29sdW1uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBSZW1vdmUgYWxsIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW5zCi0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBpbmRleCA9IHN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQkJCXN1YmplY3QucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbmRleCk7Ci0JCQkJfQotCQkJfQotCi0JCQl1cGRhdGVKb2luQ29sdW1uUGFuZUVuYWJsZW1lbnQoc2VsZWN0ZWQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIgZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHsKLQotCQlwdWJsaWMgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJCXN1cGVyKGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQlyZXR1cm4gbGlzdEhvbGRlci5zaXplKCkgPiAwOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJdXBkYXRlSm9pbkNvbHVtbnModmFsdWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkRpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOWIxYWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3REaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiB0aGUgZGlhbG9nIHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5JSm9pbkNvbHVtbjwvY29kZT4uCi0gKgotICogQHNlZSBKb2luQ29sdW1uCi0gKiBAc2VlIEpvaW5Db2x1bW5TdGF0ZU9iamVjdAotICogQHNlZSBKb2luQ29sdW1uRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSm9pbkNvbHVtbkRpYWxvZzxUIGV4dGVuZHMgSm9pbkNvbHVtblN0YXRlT2JqZWN0PiBleHRlbmRzIEJhc2VKb2luQ29sdW1uRGlhbG9nPFQ+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RKb2luQ29sdW1uRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBvd25lciBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcyBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIEpvaW5Db2x1bW5EaWFsb2coU2hlbGwgcGFyZW50LCBPYmplY3Qgb3duZXIsIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3REaWFsb2dQYW5lPD8+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uRGlhbG9nUGFuZTxUPihzdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChKb2luQ29sdW1uKSBzdXBlci5nZXRKb2luQ29sdW1uKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkRpYWxvZ1BhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkRpYWxvZ1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY1NTg5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5EaWFsb2dQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHggSW5zZXJ0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgeCBOdWxsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCB4IFVuaXF1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHggVXBkYXRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBKb2luQ29sdW1uU3RhdGVPYmplY3QKLSAqIEBzZWUgSm9pbkNvbHVtbkRpYWxvZyAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uRGlhbG9nUGFuZTxUIGV4dGVuZHMgSm9pbkNvbHVtblN0YXRlT2JqZWN0PiBleHRlbmRzIEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uRGlhbG9nUGFuZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJbnNlcnRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEpvaW5Db2x1bW5TdGF0ZU9iamVjdC5JTlNFUlRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEluc2VydGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0SW5zZXJ0YWJsZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkSW5zZXJ0YWJsZVN0cmluZ0hvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRJbnNlcnRhYmxlSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpOwotCi0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0KLQkJCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZVdpdGhEZWZhdWx0LAotCQkJCQkJCWRlZmF1bHRTdHJpbmdWYWx1ZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTnVsbGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJSm9pbkNvbHVtblN0YXRlT2JqZWN0Lk5VTExBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldE51bGxhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldE51bGxhYmxlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROdWxsYWJsZVN0cmluZ0hvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGROdWxsYWJsZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0KLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdE51bGxhYmxlKCk7Ci0KLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0KLQkJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0VmFsdWUgPyBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDoKLQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZVdpdGhEZWZhdWx0LAotCQkJCQkJCWRlZmF1bHRTdHJpbmdWYWx1ZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfbnVsbGFibGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVuaXF1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlKb2luQ29sdW1uU3RhdGVPYmplY3QuVU5JUVVFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFVuaXF1ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRVbmlxdWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVuaXF1ZVN0cmluZ0hvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRVbmlxdWVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCi0JCQkJCUJvb2xlYW4gZGVmYXVsdFZhbHVlID0gc3ViamVjdCgpLmdldERlZmF1bHRVbmlxdWUoKTsKLQotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX1RydWUgOgotCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCi0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3VuaXF1ZVdpdGhEZWZhdWx0LAotCQkJCQkJCWRlZmF1bHRTdHJpbmdWYWx1ZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdW5pcXVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVcGRhdGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSm9pbkNvbHVtblN0YXRlT2JqZWN0LlVQREFUQUJMRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRVcGRhdGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0VXBkYXRhYmxlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVcGRhdGFibGVTdHJpbmdIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkVXBkYXRhYmxlSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0VXBkYXRhYmxlKCk7Ci0KLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0KLQkJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0VmFsdWUgPyBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDoKLQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV91cGRhdGFibGVXaXRoRGVmYXVsdCwKLQkJCQkJCQlkZWZhdWx0U3RyaW5nVmFsdWUKLQkJCQkJCSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlci5pbml0aWFsaXplTGF5b3V0KGNvbnRhaW5lcik7Ci0KLQkJLy8gSW5zZXJ0YWJsZSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCWJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgNCksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZSwKLQkJCWJ1aWxkSW5zZXJ0YWJsZUhvbGRlcigpLAotCQkJYnVpbGRJbnNlcnRhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9JTlNFUlRBQkxFCi0JCSk7Ci0KLQkJLy8gVXBkYXRhYmxlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdXBkYXRhYmxlLAotCQkJYnVpbGRVcGRhdGFibGVIb2xkZXIoKSwKLQkJCWJ1aWxkVXBkYXRhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9VUERBVEFCTEUKLQkJKTsKLQotCQkvLyBVbmlxdWUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQlidWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfdW5pcXVlLAotCQkJYnVpbGRVbmlxdWVIb2xkZXIoKSwKLQkJCWJ1aWxkVW5pcXVlU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9VTklRVUUKLQkJKTsKLQotCQkvLyBOdWxsYWJsZSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCWJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZSwKLQkJCWJ1aWxkTnVsbGFibGVIb2xkZXIoKSwKLQkJCWJ1aWxkTnVsbGFibGVTdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX05VTExBQkxFCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZUVkaXRhYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlYzNlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyBkaWFsb2cgaXMgdXNlZCB0byBlaXRoZXIgY3JlYXRlIG9yIGVkaXQgYSBqb2luZyBjb2x1bW4gdGhhdCBpcyBsb2NhdGVkCi0gKiBvbiBhbiBhc3NvY2lhdGlvbiBvdmVycmlkZS4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW4KLSAqIEBzZWUgQXNzb2NpYXRpb25PdmVycmlkZQotICogQHNlZSBKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlU3RhdGVPYmplY3QKLSAqIEBzZWUgSm9pbkNvbHVtbkRpYWxvZ1BhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cgZXh0ZW5kcyBKb2luQ29sdW1uRGlhbG9nPEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVTdGF0ZU9iamVjdD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBhc3NvY2lhdGlvbk92ZXJyaWRlIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcwotCSAqIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nKFNoZWxsIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIocGFyZW50LCBhc3NvY2lhdGlvbk92ZXJyaWRlLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZVN0YXRlT2JqZWN0IGJ1aWxkU3RhdGVPYmplY3QoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZVN0YXRlT2JqZWN0KAotCQkJZ2V0T3duZXIoKSwKLQkJCWdldEpvaW5Db2x1bW4oKQotCQkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlIGdldE93bmVyKCkgewotCQlyZXR1cm4gKEFzc29jaWF0aW9uT3ZlcnJpZGUpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZVN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmU4NmMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZVN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVTdGF0ZU9iamVjdCBleHRlbmRzIEpvaW5Db2x1bW5TdGF0ZU9iamVjdAotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZVN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBhc3NvY2lhdGlvbk92ZXJyaWRlIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcwotCSAqIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlU3RhdGVPYmplY3QoQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKGFzc29jaWF0aW9uT3ZlcnJpZGUsIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgewotCi0JCWlmIChnZXRKb2luQ29sdW1uKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEpvaW5Db2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKTsKLQkJfQotCi0JCXJldHVybiB0eXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXROYW1lVGFibGUoKSB7Ci0JCXJldHVybiB0eXBlTWFwcGluZygpLmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGUgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoQXNzb2NpYXRpb25PdmVycmlkZSkgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpIHsKLQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBnZXRPd25lcigpOwotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE93bmVyKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZyhhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLQkJaWYgKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUVudGl0eSB0YXJnZXRFbnRpdHkgPSByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0KLQkJaWYgKHRhcmdldEVudGl0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGFyZ2V0RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIHR5cGVNYXBwaW5nKCkuZ2V0RGJTY2hlbWEoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXBwaW5nIHdoZXJlIHRoZSBqb2luIGNvbHVtbiBpcyBsb2NhdGVkLgotCSAqCi0JICogQHJldHVybiBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB0byBlZGl0Ci0JICovCi0JcHVibGljIFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTE0YzZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3REaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyB1c2VkIHRvIGVpdGhlciBjcmVhdGUgb3IgZWRpdCBhIGpvaW5nIGNvbHVtbiB0aGF0IGlzIGxvY2F0ZWQKLSAqIG9uIGEgam9pbiB0YWJsZS4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW4KLSAqIEBzZWUgSm9pblRhYmxlCi0gKiBAc2VlIEpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0Ci0gKiBAc2VlIEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5EaWFsb2c8Sm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBqb2luVGFibGUgVGhlIHBhcmVudCBvZiB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciB0byBjcmVhdGUKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nKFNoZWxsIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5UYWJsZSBqb2luVGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlzdXBlcihwYXJlbnQsIGpvaW5UYWJsZSwgam9pbkNvbHVtbik7Ci0JfQotCi0JLyoKLQkgKiBub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3REaWFsb2dQYW5lPEpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkRpYWxvZ1BhbmU8Sm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q+KAotCQkJc3ViamVjdEhvbGRlcigpLAotCQkJY29udGFpbmVyCi0JCSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlRWRpdGFibGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0KAotCQkJZ2V0T3duZXIoKSwKLQkJCWdldEpvaW5Db2x1bW4oKQotCQkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoSm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luVGFibGUgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoSm9pblRhYmxlKSBzdXBlci5nZXRPd25lcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZjVlZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIFRoZSBzdGF0ZSBvYmplY3QgdXNlZCB0byBjcmVhdGUgb3IgZWRpdCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG9uIGEKLSAqIGpvaW50IHRhYmxlLgotICoKLSAqIEBzZWUgSm9pbkNvbHVtbgotICogQHNlZSBKb2luVGFibGUKLSAqIEBzZWUgSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2cKLSAqIEBzZWUgSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2dQYW5lCi0gKiBAc2VlIEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QgZXh0ZW5kcyBKb2luQ29sdW1uU3RhdGVPYmplY3QKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBqb2luVGFibGUgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3IgdG8gZWRpdAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIFRoZSBqb2luIGNvbHVtbiB0byBlZGl0Ci0JICovCi0JcHVibGljIEpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0KEpvaW5UYWJsZSBqb2luVGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihqb2luVGFibGUsIGpvaW5Db2x1bW4pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXREYlRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpvaW5UYWJsZSBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChKb2luVGFibGUpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7Ci0JCXJldHVybiByZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTY2hlbWEgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxUYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcHBpbmcgb3duaW5nIHRoZSBqb2luIHRhYmxlLgotCSAqCi0JICogQHJldHVybiBUaGUgcGFyZW50IG9mIHRoZSBqb2luIHRhYmxlCi0JICovCi0JcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0UGFyZW50KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4oaW5pdGlhbFRhYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzg0ZDhmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyB1c2VkIHRvIGVpdGhlciBjcmVhdGUgb3IgZWRpdCBhIGpvaW5nIGNvbHVtbiB0aGF0IGlzIGxvY2F0ZWQKLSAqIG9uIGEgcmVsYXRpb25hbCBtYXBwaW5nLgotICoKLSAqIEBzZWUgSm9pbkNvbHVtbgotICogQHNlZSBSZWxhdGlvbnNoaXBNYXBwaW5nCi0gKiBAc2VlIEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdTdGF0ZU9iamVjdAotICogQHNlZSBKb2luQ29sdW1uRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZyBleHRlbmRzIEpvaW5Db2x1bW5EaWFsb2c8Sm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ1N0YXRlT2JqZWN0PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0Sm9pbkNvbHVtbkRpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gcmVsYXRpb25zaGlwTWFwcGluZyBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgdG8KLQkgKiBjcmVhdGUKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzCi0JICogdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZyhTaGVsbCBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlzdXBlcihwYXJlbnQsIHJlbGF0aW9uc2hpcE1hcHBpbmcsIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nU3RhdGVPYmplY3QoCi0JCQlnZXRPd25lcigpLAotCQkJZ2V0Sm9pbkNvbHVtbigpCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoUmVsYXRpb25zaGlwTWFwcGluZykgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ1N0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOWVlOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nU3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotCi0vKioKLSAqIFRoZSBzdGF0ZSBvYmplY3QgdXNlZCB0byBjcmVhdGUgb3IgZWRpdCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG9uIGEKLSAqIHJlbGF0aW9uc2hpcCBtYXBwaW5nLgotICoKLSAqIEBzZWUgSm9pbkNvbHVtbgotICogQHNlZSBSZWxhdGlvbnNoaXBNYXBwaW5nCi0gKiBAc2VlIEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdTdGF0ZU9iamVjdCBleHRlbmRzIEpvaW5Db2x1bW5TdGF0ZU9iamVjdAotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ1N0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSByZWxhdGlvbnNoaXBNYXBwaW5nIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcwotCSAqIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nU3RhdGVPYmplY3QoUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKHJlbGF0aW9uc2hpcE1hcHBpbmcsIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgewotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpvaW5Db2x1bW4oKTsKLQotCQlpZiAoam9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKTsKLQkJfQotCi0JCXJldHVybiBnZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldE5hbWVUYWJsZSgpIHsKLQkJU2NoZW1hIHNjaGVtYSA9IGdldFNjaGVtYSgpOwotCi0JCWlmIChzY2hlbWEgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgdGFibGUgPSBnZXRUYWJsZSgpOwotCi0JCWlmICh0YWJsZSA9PSBudWxsKSB7Ci0JCQl0YWJsZSA9IGdldERlZmF1bHRUYWJsZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHNjaGVtYS5nZXRUYWJsZU5hbWVkKHRhYmxlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChSZWxhdGlvbnNoaXBNYXBwaW5nKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0T3duZXIoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCi0JCWlmICh0YXJnZXRFbnRpdHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFNjaGVtYSBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuZ2V0RGJTY2hlbWEoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzN2YzNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIFRoZSBzdGF0ZSBvYmplY3QgdXNlZCB0byBlZGl0IGEgPGNvZGU+Sm9pbkNvbHVtbjwvY29kZT4uCi0gKgotICogQHNlZSBKb2luQ29sdW1uCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEpvaW5Db2x1bW5TdGF0ZU9iamVjdCBleHRlbmRzIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QKLXsKLQlwcml2YXRlIEJvb2xlYW4gaW5zZXJ0YWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gbnVsbGFibGU7Ci0JcHJpdmF0ZSBCb29sZWFuIHVuaXF1ZTsKLQlwcml2YXRlIEJvb2xlYW4gdXBkYXRhYmxlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUQUJMRV9QUk9QRVJUWSA9ICJpbnNlcnRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMQUJMRV9QUk9QRVJUWSA9ICJudWxsYWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5JUVVFX1BST1BFUlRZID0gInVuaXF1ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRBQkxFX1BST1BFUlRZID0gInVwZGF0YWJsZSI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5TdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gb3duZXIgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMgbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIFRoZSBqb2luIGNvbHVtbiB0byBlZGl0Ci0JICovCi0JcHVibGljIEpvaW5Db2x1bW5TdGF0ZU9iamVjdChPYmplY3Qgb3duZXIsIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihvd25lciwgam9pbkNvbHVtbik7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdEluc2VydGFibGUoKSB7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0Sm9pbkNvbHVtbigpOwotCi0JCWlmIChqb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBqb2luQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCk7Ci0JCX0KLQotCQlyZXR1cm4gQmFzZUNvbHVtbi5ERUZBVUxUX0lOU0VSVEFCTEU7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdE51bGxhYmxlKCkgewotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpvaW5Db2x1bW4oKTsKLQotCQlpZiAoam9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKTsKLQkJfQotCi0JCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEU7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFVuaXF1ZSgpIHsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7Ci0KLQkJaWYgKGpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIEJhc2VDb2x1bW4uREVGQVVMVF9VTklRVUU7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFVwZGF0YWJsZSgpIHsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7Ci0KLQkJaWYgKGpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpOwotCQl9Ci0KLQkJcmV0dXJuIEJhc2VDb2x1bW4uREVGQVVMVF9VUERBVEFCTEU7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIGluc2VydGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChKb2luQ29sdW1uKSBzdXBlci5nZXRKb2luQ29sdW1uKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0TnVsbGFibGUoKSB7Ci0JCXJldHVybiBudWxsYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU2NoZW1hIGdldFNjaGVtYSgpOwotCi0JcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgewotCQlyZXR1cm4gdW5pcXVlOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIHVwZGF0YWJsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9iamVjdCBvd25lciwgQmFzZUpvaW5Db2x1bW4gYmFzZUpvaW5Db2x1bW4pIHsKLQotCQlzdXBlci5pbml0aWFsaXplKG93bmVyLCBiYXNlSm9pbkNvbHVtbik7Ci0KLQkJaWYgKGJhc2VKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uKSBiYXNlSm9pbkNvbHVtbjsKLQotCQkJaW5zZXJ0YWJsZSAgICAgICA9IGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpOwotCQkJbnVsbGFibGUgICAgICAgICA9IGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKTsKLQkJCXVuaXF1ZSAgICAgICAgICAgPSBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpOwotCQkJdXBkYXRhYmxlICAgICAgICA9IGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxUYWJsZSgpIHsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0Sm9pbkNvbHVtbigpOwotCi0JCWlmIChqb2luQ29sdW1uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlRWRpdGFibGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc2VydGFibGUoQm9vbGVhbiBpbnNlcnRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkSW5zZXJ0YWJsZSA9IHRoaXMuaW5zZXJ0YWJsZTsKLQkJdGhpcy5pbnNlcnRhYmxlID0gaW5zZXJ0YWJsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJTlNFUlRBQkxFX1BST1BFUlRZLCBvbGRJbnNlcnRhYmxlLCBpbnNlcnRhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROdWxsYWJsZShCb29sZWFuIG51bGxhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkTnVsbGFibGUgPSB0aGlzLm51bGxhYmxlOwotCQl0aGlzLm51bGxhYmxlID0gbnVsbGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTlVMTEFCTEVfUFJPUEVSVFksIG9sZE51bGxhYmxlLCBudWxsYWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5pcXVlKEJvb2xlYW4gdW5pcXVlKSB7Ci0JCUJvb2xlYW4gb2xkVW5pcXVlID0gdGhpcy51bmlxdWU7Ci0JCXRoaXMudW5pcXVlID0gdW5pcXVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFVOSVFVRV9QUk9QRVJUWSwgb2xkVW5pcXVlLCB1bmlxdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwZGF0YWJsZShCb29sZWFuIHVwZGF0YWJsZSkgewotCQlCb29sZWFuIG9sZFVwZGF0YWJsZSA9IHRoaXMudXBkYXRhYmxlOwotCQl0aGlzLnVwZGF0YWJsZSA9IHVwZGF0YWJsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChVUERBVEFCTEVfUFJPUEVSVFksIG9sZFVwZGF0YWJsZSwgdXBkYXRhYmxlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFibGVzKCkgewotCQlTY2hlbWEgc2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0KLQkJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCi0JCUxpc3Q8U3RyaW5nPiBuYW1lcyA9IENvbGxlY3Rpb25Ub29scy5saXN0KHNjaGVtYS50YWJsZU5hbWVzKCkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KG5hbWVzKTsKLQkJcmV0dXJuIG5hbWVzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUpvaW5Db2x1bW4oQmFzZUpvaW5Db2x1bW4gYWJzdHJhY3RKb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIudXBkYXRlSm9pbkNvbHVtbihhYnN0cmFjdEpvaW5Db2x1bW4pOwotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uKSBhYnN0cmFjdEpvaW5Db2x1bW47Ci0KLQkJLy8gVGFibGUKLQkJaWYgKGlzVGFibGVFZGl0YWJsZSgpKSB7Ci0JCQlTdHJpbmcgdGFibGUgPSBnZXRUYWJsZSgpOwotCi0JCQlpZiAodmFsdWVzQXJlRGlmZmVyZW50KHRhYmxlLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpKSB7Ci0JCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSh0YWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBJbnNlcnRhYmxlCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSAhPSBpbnNlcnRhYmxlKXsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShpbnNlcnRhYmxlKTsKLQkJfQotCi0JCS8vIFVwZGF0YWJsZQotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSAhPSB1cGRhdGFibGUpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUodXBkYXRhYmxlKTsKLQkJfQotCi0JCS8vIFVuaXF1ZQotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSAhPSB1bmlxdWUpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUodW5pcXVlKTsKLQkJfQotCi0JCS8vIE51bGxhYmxlCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkgIT0gbnVsbGFibGUpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShudWxsYWJsZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDBkOTczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BYnN0cmFjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgSm9pblRhYmxlQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE92ZXJyaWRlc0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbnNDb21wb3NpdGU8VCBleHRlbmRzIEpwYU5vZGU+IGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBlZGl0b3IgdXNlZCB0byBwZXJmb3JtIHRoZSBjb21tb24gYmVoYXZpb3JzIGRlZmluZWQgaW4gdGhlIGxpc3QgcGFuZS4KLQkgKi8KLQlwcml2YXRlIElKb2luQ29sdW1uc0VkaXRvcjxUPiBqb2luQ29sdW1uc0VkaXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKiBAcGFyYW0gam9pbkNvbHVtbnNFZGl0b3IgVGhlIGVkaXRvciB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbW1vbiBiZWhhdmlvcnMKLQkgKiBkZWZpbmVkIGluIHRoZSBsaXN0IHBhbmUKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbnNDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUpvaW5Db2x1bW5zRWRpdG9yPFQ+IGpvaW5Db2x1bW5zRWRpdG9yKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRvciA9IGpvaW5Db2x1bW5zRWRpdG9yOwotCQlpbml0aWFsaXplTGF5b3V0MigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKiBAcGFyYW0gam9pbkNvbHVtbnNFZGl0b3IgVGhlIGVkaXRvciB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbW1vbiBiZWhhdmlvcnMKLQkgKiBkZWZpbmVkIGluIHRoZSBsaXN0IHBhbmUKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbnNDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIElKb2luQ29sdW1uc0VkaXRvcjxUPiBqb2luQ29sdW1uc0VkaXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRvciA9IGpvaW5Db2x1bW5zRWRpdG9yOwotCQlpbml0aWFsaXplTGF5b3V0MigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbnNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIElKb2luQ29sdW1uc0VkaXRvcjxUPiBqb2luQ29sdW1uc0VkaXRvcikgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JCXRoaXMuam9pbkNvbHVtbnNFZGl0b3IgPSBqb2luQ29sdW1uc0VkaXRvcjsKLQkJaW5pdGlhbGl6ZUxheW91dDIoKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGJ1aWxkSm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEpvaW5Db2x1bW5MYWJlbChKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlpZiAoam9pbkNvbHVtbi5pc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgewotCi0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdCwKLQkJCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJCSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCXJldHVybiBOTFMuYmluZCgKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXMsCi0JCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkpOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZEpvaW5Db2x1bW5zQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBYnN0cmFjdEFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWpvaW5Db2x1bW5zRWRpdG9yLmFkZEpvaW5Db2x1bW4oc3ViamVjdCgpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5Db21wb3NpdGVfZWRpdDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKEpvaW5Db2x1bW4pIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7Ci0JCQkJam9pbkNvbHVtbnNFZGl0b3IuZWRpdEpvaW5Db2x1bW4oc3ViamVjdCgpLCBqb2luQ29sdW1uKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJam9pbkNvbHVtbnNFZGl0b3IucmVtb3ZlSm9pbkNvbHVtbnMoc3ViamVjdCgpLCBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRJbmRpY2VzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4gYnVpbGRKb2luQ29sdW1uc0xpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Sm9pbkNvbHVtbj4oYnVpbGRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSwKLQkJCU5hbWVkQ29sdW1uLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZLAotCQkJTmFtZWRDb2x1bW4uREVGQVVMVF9OQU1FX1BST1BFUlRZLAotCQkJQmFzZUpvaW5Db2x1bW4uU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksCi0JCQlCYXNlSm9pbkNvbHVtbi5ERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4gYnVpbGRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCWphdmEudXRpbC5MaXN0PExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+LCBKb2luQ29sdW1uPihsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFQsIEpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgam9pbkNvbHVtbnNFZGl0b3Iuc3BlY2lmaWVkTGlzdFByb3BlcnR5TmFtZSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gam9pbkNvbHVtbnNFZGl0b3Iuc3BlY2lmaWVkSm9pbkNvbHVtbnMoc3ViamVjdCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gam9pbkNvbHVtbnNFZGl0b3Iuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKHN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKb2luQ29sdW1uPihidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkpOwotCi0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgSm9pbkNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBqb2luQ29sdW1uc0VkaXRvci5kZWZhdWx0UHJvcGVydHlOYW1lKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpvaW5Db2x1bW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIGpvaW5Db2x1bW5zRWRpdG9yLmRlZmF1bHRKb2luQ29sdW1uKHN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKEpvaW5Db2x1bW4pIGVsZW1lbnQ7Ci0KLQkJCQlyZXR1cm4gYnVpbGRKb2luQ29sdW1uTGFiZWwoam9pbkNvbHVtbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVMYXlvdXQyKCkgewotCi0JCS8vIEpvaW4gQ29sdW1ucyBsaXN0IHBhbmUKLQkJQWRkUmVtb3ZlTGlzdFBhbmU8VD4gbGlzdFBhbmUgPSBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8VD4oCi0JCQl0aGlzLAotCQkJZ2V0Q29udHJvbCgpLAotCQkJYnVpbGRKb2luQ29sdW1uc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkSm9pbkNvbHVtbnNMaXN0TW9kZWwoKSwKLQkJCWJ1aWxkSm9pbkNvbHVtbkhvbGRlcigpLAotCQkJYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUwotCQkpOwotCi0JCS8vIFJlbW92ZSB0aGUgbGlzdCBwYW5lIGZyb20gdGhpcyBwYW5lJ3MgZW5hYmxlbWVudCBjb250cm9sIGJlY2F1c2UgaXRzCi0JCS8vIGVuYWJsZW1lbnQgaXMgbWFuYWdlZCBieSBhIFBhbmVFbmFibGVyIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkJcmVtb3ZlRnJvbUVuYWJsZW1lbnRDb250cm9sKGxpc3RQYW5lLmdldE1haW5Db250cm9sKCkpOwotCQlyZW1vdmVGcm9tRW5hYmxlbWVudENvbnRyb2wobGlzdFBhbmUpOwotCX0KLQotCS8qKgotCSAqIFRoZSBlZGl0b3IgaXMgdXNlZCB0byBjb21wbGV0ZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBwYW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElKb2luQ29sdW1uc0VkaXRvcjxUPiB7Ci0KLQkJdm9pZCBhZGRKb2luQ29sdW1uKFQgc3ViamVjdCk7Ci0JCXZvaWQgZWRpdEpvaW5Db2x1bW4oVCBzdWJqZWN0LCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pOwotCQlib29sZWFuIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKFQgc3ViamVjdCk7Ci0JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucyhUIHN1YmplY3QpOwotCQlpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKFQgc3ViamVjdCk7Ci0JCUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4oVCBzdWJqZWN0KTsKLQkJU3RyaW5nIHNwZWNpZmllZExpc3RQcm9wZXJ0eU5hbWUoKTsKLQkJU3RyaW5nIGRlZmF1bHRQcm9wZXJ0eU5hbWUoKTsKLQkJdm9pZCByZW1vdmVKb2luQ29sdW1ucyhUIHN1YmplY3QsIGludFtdIHNlbGVjdGVkSW5kaWNlcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pblRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5UYWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTg2Yzg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pblRhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuVGFibGVDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5Kb2luQ29sdW1uc0NvbXBvc2l0ZS5JSm9pbkNvbHVtbnNFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Qb3N0RXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICB8Ci0gKiB8ICAgTmFtZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8ICAgfAotICogfCAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gSm9pbiBDb2x1bW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCB4IE92ZXJyaWRlIERlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCBKb2luQ29sdW1uc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBJbnZlcnNlIEpvaW4gQ29sdW1ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8IEpvaW5Db2x1bW5zQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgSm9pblRhYmxlCi0gKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgSm9pbkNvbHVtbnNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpvaW5UYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8Sm9pblRhYmxlPgotewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gaW52ZXJzZUpvaW5Db2x1bW5zUGFuZUVuYWJsZXJIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBqb2luQ29sdW1uc1BhbmVFbmFibGVySG9sZGVyOwotCXByaXZhdGUgQnV0dG9uIG92ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uc0NoZWNrQm94OwotCXByaXZhdGUgQnV0dG9uIG92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3g7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5UYWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSm9pblRhYmxlQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSm9pblRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pblRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUpvaW5UYWJsZTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKb2luVGFibGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKb2luVGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSW52ZXJzZUpvaW5Db2x1bW4oSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCi0JCUludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nKHNoZWxsKCksIGpvaW5UYWJsZSwgbnVsbCk7Ci0KLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRBZGRJbnZlcnNlSm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEludmVyc2VKb2luQ29sdW1uRnJvbURpYWxvZyhJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQotCQlKb2luVGFibGUgc3ViamVjdCA9IHN1YmplY3QoKTsKLQkJaW50IGluZGV4ID0gc3ViamVjdC5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3ViamVjdC5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbmRleCk7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW4oSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCi0JCUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2cgPQotCQkJbmV3IEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyhzaGVsbCgpLCBqb2luVGFibGUsIG51bGwpOwotCi0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkQWRkSm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW5Gcm9tRGlhbG9nKEpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0KLQkJSm9pblRhYmxlIHN1YmplY3QgPSBzdWJqZWN0KCk7Ci0JCWludCBpbmRleCA9IHN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3ViamVjdCgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgpOwotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nPiBidWlsZEFkZEludmVyc2VKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJYWRkSW52ZXJzZUpvaW5Db2x1bW5Gcm9tRGlhbG9nKGRpYWxvZy5zdWJqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nPiBidWlsZEFkZEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJYWRkSm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nLnN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nPiBidWlsZEVkaXRJbnZlcnNlSm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCWVkaXRJbnZlcnNlSm9pbkNvbHVtbihkaWFsb2cuc3ViamVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZz4gYnVpbGRFZGl0Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQllZGl0Sm9pbkNvbHVtbihkaWFsb2cuc3ViamVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJbnZlcnNlSm9pbkNvbHVtbnNQcm92aWRlciBidWlsZEludmVyc2VKb2luQ29sdW1uc0VkaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJbnZlcnNlSm9pbkNvbHVtbnNQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgSm9pbkNvbHVtbnNQcm92aWRlciBidWlsZEpvaW5Db2x1bW5zRWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5zUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEpvaW5Db2x1bW5zUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KCk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZE92ZXJyaWRlRGVmYXVsdEludmVyc2VTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdXBkYXRlSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZE92ZXJyaWRlRGVmYXVsdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVKb2luQ29sdW1ucygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGJ1aWxkUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgZ3JvdXBCb3hNYXJnaW4pIHsKLQkJcmV0dXJuIGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAxMCwgZ3JvdXBCb3hNYXJnaW4pOwotCX0KLQotCXByaXZhdGUgVGFibGVDb21ibzxKb2luVGFibGU+IGJ1aWxkVGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBUYWJsZUNvbWJvPEpvaW5UYWJsZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHByb3BlcnR5TmFtZSA9PSBUYWJsZS5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSAKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWQotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgKSB7Ci0JCQkJCXJlcG9wdWxhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hTmFtZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWROYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIHRhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQl1cGRhdGVKb2luQ29sdW1uUGFuZXNFbmFibGVtZW50KHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0SW52ZXJzZUpvaW5Db2x1bW4oSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oc3RhdGVPYmplY3QuZ2V0Sm9pbkNvbHVtbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdEludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCUludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nKHNoZWxsKCksIHN1YmplY3QoKSwgam9pbkNvbHVtbik7Ci0KLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRFZGl0SW52ZXJzZUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2coc2hlbGwoKSwgc3ViamVjdCgpLCBqb2luQ29sdW1uKTsKLQotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEVkaXRKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdEpvaW5Db2x1bW4oSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihzdGF0ZU9iamVjdC5nZXRKb2luQ29sdW1uKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JCXVwZGF0ZUpvaW5Db2x1bW5QYW5lc0VuYWJsZW1lbnQoZW5hYmxlZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCi0JCWpvaW5Db2x1bW5zUGFuZUVuYWJsZXJIb2xkZXIgICAgICAgID0gYnVpbGRKb2luQ29sdW1uc1BhbmVFbmFibGVySG9sZGVyKCk7Ci0JCWludmVyc2VKb2luQ29sdW1uc1BhbmVFbmFibGVySG9sZGVyID0gYnVpbGRKb2luQ29sdW1uc1BhbmVFbmFibGVySG9sZGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ3JvdXBCb3hNYXJnaW4oKTsKLQotCQkvLyBOYW1lIHdpZGdldHMKLQkJVGFibGVDb21ibzxKb2luVGFibGU+IHRhYmxlQ29tYm8gPSBidWlsZFRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQlidWlsZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbiksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX25hbWUsCi0JCQl0YWJsZUNvbWJvLmdldENvbnRyb2woKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9OQU1FCi0JCSk7Ci0KLQkJLy8gSm9pbiBDb2x1bW5zIGdyb3VwIHBhbmUKLQkJR3JvdXAgam9pbkNvbHVtbkdyb3VwUGFuZSA9IGJ1aWxkVGl0bGVkUGFuZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfam9pbkNvbHVtbgotCQkpOwotCi0JCS8vIE92ZXJyaWRlIERlZmF1bHQgSm9pbiBDb2x1bW5zIGNoZWNrIGJveAotCQlvdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94ID0gYnVpbGRDaGVja0JveCgKLQkJCWJ1aWxkU3ViUGFuZShqb2luQ29sdW1uR3JvdXBQYW5lLCA4KSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnMsCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEhvbGRlcigpCi0JCSk7Ci0KLQkJb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0U2VsZWN0aW9uTGlzdGVuZXIoKQotCQkpOwotCi0JCUpvaW5Db2x1bW5zQ29tcG9zaXRlPEpvaW5UYWJsZT4gam9pbkNvbHVtbnNDb21wb3NpdGUgPSBuZXcgSm9pbkNvbHVtbnNDb21wb3NpdGU8Sm9pblRhYmxlPigKLQkJCXRoaXMsCi0JCQlqb2luQ29sdW1uR3JvdXBQYW5lLAotCQkJYnVpbGRKb2luQ29sdW1uc0VkaXRvcigpCi0JCSk7Ci0KLQkJaW5zdGFsbEpvaW5Db2x1bW5zUGFuZUVuYWJsZXIoam9pbkNvbHVtbnNDb21wb3NpdGUpOwotCQlyZW1vdmVGcm9tRW5hYmxlbWVudENvbnRyb2woam9pbkNvbHVtbnNDb21wb3NpdGUuZ2V0Q29udHJvbCgpKTsKLQotCQkvLyBJbnZlcnNlIEpvaW4gQ29sdW1ucyBncm91cCBwYW5lCi0JCUdyb3VwIGludmVyc2VKb2luQ29sdW1uR3JvdXBQYW5lID0gYnVpbGRUaXRsZWRQYW5lKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbgotCQkpOwotCi0JCS8vIE92ZXJyaWRlIERlZmF1bHQgSW52ZXJzZSBKb2luIENvbHVtbnMgY2hlY2sgYm94Ci0JCW92ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uc0NoZWNrQm94ID0gYnVpbGRDaGVja0JveCgKLQkJCWJ1aWxkU3ViUGFuZShpbnZlcnNlSm9pbkNvbHVtbkdyb3VwUGFuZSwgOCksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1ucywKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0SG9sZGVyKCkKLQkJKTsKLQotCQlvdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0SW52ZXJzZVNlbGVjdGlvbkxpc3RlbmVyKCkKLQkJKTsKLQotCQlKb2luQ29sdW1uc0NvbXBvc2l0ZTxKb2luVGFibGU+IGludmVyc2VKb2luQ29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBKb2luQ29sdW1uc0NvbXBvc2l0ZTxKb2luVGFibGU+KAotCQkJdGhpcywKLQkJCWludmVyc2VKb2luQ29sdW1uR3JvdXBQYW5lLAotCQkJYnVpbGRJbnZlcnNlSm9pbkNvbHVtbnNFZGl0b3IoKQotCQkpOwotCi0JCWluc3RhbGxJbnZlcnNlSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihpbnZlcnNlSm9pbkNvbHVtbnNDb21wb3NpdGUpOwotCQlyZW1vdmVGcm9tRW5hYmxlbWVudENvbnRyb2woaW52ZXJzZUpvaW5Db2x1bW5zQ29tcG9zaXRlLmdldENvbnRyb2woKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxJbnZlcnNlSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihKb2luQ29sdW1uc0NvbXBvc2l0ZTxKb2luVGFibGU+IHBhbmUpIHsKLQkJbmV3IFBhbmVFbmFibGVyKGludmVyc2VKb2luQ29sdW1uc1BhbmVFbmFibGVySG9sZGVyLCBwYW5lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbEpvaW5Db2x1bW5zUGFuZUVuYWJsZXIoSm9pbkNvbHVtbnNDb21wb3NpdGU8Sm9pblRhYmxlPiBwYW5lKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcihqb2luQ29sdW1uc1BhbmVFbmFibGVySG9sZGVyLCBwYW5lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCi0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IHN1YmplY3QoKTsKLQkJYm9vbGVhbiBzZWxlY3RlZCA9IG92ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uc0NoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQkvLyBBZGQgYSBqb2luIGNvbHVtbiBieSBjcmVhdGluZyBhIHNwZWNpZmllZCBvbmUgdXNpbmcgdGhlIGRlZmF1bHQKLQkJCS8vIG9uZSBpZiBpdCBleGlzdHMKLQkJCWlmIChzZWxlY3RlZCkgewotCi0JCQkJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsgLy9UT0RPIG51bGwgY2hlY2ssIG92ZXJyaWRlIGRlZmF1bHQgYnV0dG9uIGRpc2FibGVkCi0KLQkJCQlpZiAoZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JCQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCQkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBpbmRleCA9IGpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQkJCWpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbmRleCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpbnZlcnNlSm9pbkNvbHVtbnNQYW5lRW5hYmxlckhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1uUGFuZXNFbmFibGVtZW50KGJvb2xlYW4gZ2xvYmFsRW5hYmxlbWVudCkgewotCi0JCUpvaW5UYWJsZSBzdWJqZWN0ICAgICAgPSBzdWJqZWN0KCk7Ci0JCWJvb2xlYW4gZW5hYmxlZCAgICAgICAgPSBnbG9iYWxFbmFibGVtZW50ICYmIChzdWJqZWN0ICE9IG51bGwpICYmIHN1YmplY3QuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlib29sZWFuIGludmVyc2VFbmFibGVkID0gZ2xvYmFsRW5hYmxlbWVudCAmJiAoc3ViamVjdCAhPSBudWxsKSAmJiBzdWJqZWN0LmNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0KLQkJb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveCAgICAgICAuc2V0U2VsZWN0aW9uKGVuYWJsZWQpOwotCQlvdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNDaGVja0JveC5zZXRTZWxlY3Rpb24oaW52ZXJzZUVuYWJsZWQpOwotCi0JCWpvaW5Db2x1bW5zUGFuZUVuYWJsZXJIb2xkZXIgICAgICAgLnNldFZhbHVlKGVuYWJsZWQpOwotCQlpbnZlcnNlSm9pbkNvbHVtbnNQYW5lRW5hYmxlckhvbGRlci5zZXRWYWx1ZShpbnZlcnNlRW5hYmxlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUpvaW5Db2x1bW5zKCkgewotCi0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IHN1YmplY3QoKTsKLQkJYm9vbGVhbiBzZWxlY3RlZCA9IG92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0KLQkJdHJ5IHsKLQkJCS8vIEFkZCBhIGpvaW4gY29sdW1uIGJ5IGNyZWF0aW5nIGEgc3BlY2lmaWVkIG9uZSB1c2luZyB0aGUgZGVmYXVsdAotCQkJLy8gb25lIGlmIGl0IGV4aXN0cwotCQkJaWYgKHNlbGVjdGVkKSB7Ci0KLQkJCQlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gam9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCk7IC8vVE9ETyBudWxsIGNoZWNrLCBvdmVycmlkZSBkZWZhdWx0IGJ1dHRvbiBkaXNhYmxlZAotCi0JCQkJaWYgKGRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQotCQkJCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBpbmRleCA9IGpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgpOwotCQkJCX0KLQkJCX0KLQotCQkJam9pbkNvbHVtbnNQYW5lRW5hYmxlckhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgSW52ZXJzZUpvaW5Db2x1bW5zUHJvdmlkZXIgaW1wbGVtZW50cyBJSm9pbkNvbHVtbnNFZGl0b3I8Sm9pblRhYmxlPiB7Ci0KLQkJcHVibGljIHZvaWQgYWRkSm9pbkNvbHVtbihKb2luVGFibGUgc3ViamVjdCkgewotCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuYWRkSW52ZXJzZUpvaW5Db2x1bW4oc3ViamVjdCk7Ci0JCX0KLQotCQlwdWJsaWMgSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbihKb2luVGFibGUgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gSm9pblRhYmxlLkRFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVkaXRKb2luQ29sdW1uKEpvaW5UYWJsZSBzdWJqZWN0LCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmVkaXRJbnZlcnNlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKEpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5jb250YWluc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlSm9pbkNvbHVtbnMoSm9pblRhYmxlIHN1YmplY3QsIGludFtdIHNlbGVjdGVkSW5kaWNlcykgewotCQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJCXN1YmplY3QucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKEpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKEpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHNwZWNpZmllZExpc3RQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBKb2luQ29sdW1uc1Byb3ZpZGVyIGltcGxlbWVudHMgSUpvaW5Db2x1bW5zRWRpdG9yPEpvaW5UYWJsZT4gewotCi0JCXB1YmxpYyB2b2lkIGFkZEpvaW5Db2x1bW4oSm9pblRhYmxlIHN1YmplY3QpIHsKLQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmFkZEpvaW5Db2x1bW4oc3ViamVjdCk7Ci0JCX0KLQotCQlwdWJsaWMgSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbihKb2luVGFibGUgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBKb2luVGFibGUuREVGQVVMVF9KT0lOX0NPTFVNTjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVkaXRKb2luQ29sdW1uKEpvaW5UYWJsZSBzdWJqZWN0LCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmVkaXRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoSm9pblRhYmxlIHN1YmplY3QpIHsKLQkJCXJldHVybiBzdWJqZWN0LmNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUpvaW5Db2x1bW5zKEpvaW5UYWJsZSBzdWJqZWN0LCBpbnRbXSBzZWxlY3RlZEluZGljZXMpIHsKLQkJCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQlzdWJqZWN0LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKEpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQl9Ci0KLQkJcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoSm9pblRhYmxlIHN1YmplY3QpIHsKLQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBzcGVjaWZpZWRMaXN0UHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Mb2JDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTG9iQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2ZlY2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Mb2JDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIHRoZSBMb2IgY2hlY2sgYm94LgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2JDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEJhc2ljTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxvYkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgTG9iQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIEJhc2ljTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2ljTWFwcGluZywgQm9vbGVhbj4gYnVpbGRMb2JIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzaWNNYXBwaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2ljTWFwcGluZy5MT0JfUFJPUEVSVFkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc0xvYigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRMb2IodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWJ1aWxkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQmFzaWNHZW5lcmFsU2VjdGlvbl9sb2JMYWJlbCwKLQkJCWJ1aWxkTG9iSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0xPQgotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmZWEwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5DYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9yZGVyaW5nQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBKb2luIFRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5UYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE1hbnlUb01hbnlNYXBwaW5nCi0gKiBAc2VlIEJhc2VKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqIEBzZWUgQ2FzY2FkZUNvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgSm9pblRhYmxlQ29tcG9zaXRlCi0gKiBAc2VlIE9yZGVyaW5nQ29tcG9zaXRlCi0gKiBAc2VlIFRhcmdldEVudGl0eUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPE1hbnlUb01hbnlNYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9NYW55TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhc2NhZGU+IGJ1aWxkQ2FzY2FkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxNYW55VG9NYW55TWFwcGluZywgQ2FzY2FkZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYXNjYWRlIHRyYW5zZm9ybV8oTWFueVRvTWFueU1hcHBpbmcgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q2FzY2FkZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5UYWJsZT4gYnVpbGRKb2ludFRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPE1hbnlUb01hbnlNYXBwaW5nLCBKb2luVGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSm9pblRhYmxlIHRyYW5zZm9ybV8oTWFueVRvTWFueU1hcHBpbmcgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYnVpbGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgewotCQlyZXR1cm4gYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCi0JCS8vIFRhcmdldCBFbnRpdHkgd2lkZ2V0cwotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGJ1aWxkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7Ci0KLQkJLy8gRmV0Y2ggVHlwZSB3aWRnZXRzCi0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgYnVpbGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKLQotCQkvLyBNYXBwZWQgQnkgd2lkZ2V0cwotCQluZXcgTWFwcGVkQnlDb21wb3NpdGUodGhpcywgYnVpbGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKLQotCQkvLyBDYXNjYWRlIHdpZGdldHMKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQotCQkvLyBPcmRlcmluZyB3aWRnZXRzCi0JCW5ldyBPcmRlcmluZ0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplSm9pblRhYmxlUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2pvaW5UYWJsZQotCQkpOwotCi0JCW5ldyBKb2luVGFibGVDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRKb2ludFRhYmxlSG9sZGVyKCksCi0JCQljb250YWluZXIKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBHZW5lcmFsIHN1YiBwYW5lCi0JCWluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOwotCi0JCS8vIEpvaW4gVGFibGUgc3ViIHBhbmUKLQkJaW5pdGlhbGl6ZUpvaW5UYWJsZVBhbmUoY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhYzIxMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBNYW55VG9PbmVNYXBwaW5nCi0gKiBAc2VlIEJhc2VKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqIEBzZWUgQ2FzY2FkZUNvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgSm9pbkNvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBPcHRpb25hbENvbXBvc2l0ZQotICogQHNlZSBUYXJnZXRFbnRpdHlDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPE1hbnlUb09uZU1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYXNjYWRlPiBidWlsZENhc2NhZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvT25lTWFwcGluZywgQ2FzY2FkZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYXNjYWRlIHRyYW5zZm9ybV8oTWFueVRvT25lTWFwcGluZyB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDYXNjYWRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYnVpbGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgewotCQlyZXR1cm4gYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGJ1aWxkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKTsKLQotCQkvLyBUYXJnZXQgRW50aXR5IHdpZGdldHMKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKTsKLQotCQkvLyBGZXRjaCBUeXBlIHdpZGdldHMKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKTsKLQotCQkvLyBPcHRpb25hbCBjaGVjayBib3gKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGJ1aWxkU3ViUGFuZShzdWJQYW5lLCA0KSk7Ci0KLQkJLy8gQ2FzY2FkZSB3aWRnZXRzCi0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBjb250YWluZXIpOwotCi0JCS8vIEpvaW4gQ29sdW1uIHdpZGdldHMKLQkJbmV3IEpvaW5Db2x1bW5Db21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hcEFzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hcEFzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MWI4OTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYXBBc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VDb2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsdGVyZWRJdGVtc1NlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBUaGlzIG1hcCBhcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIGEgc3R5bGVkIHRleHQgd2hlcmUgdGhlIG5hbWUgb2YgdGhlCi0gKiBtYXBwaW5nIGFuZCBpdHMgdHlwZSBhcmUgZGlzcGxheWVkLiBUaGUgbWFwcGluZyB0eXBlIGNhbiBiZSBjbGlja2VkIG9uIHRvCi0gKiBpbnZva2UgYSBkaWFsb2cgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZSB0eXBlLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBBdHRyaWJ1dGUgJ25hbWUnIGlzIG1hcHBlZCBhcyBvbmUgdG8gb25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgwq/Cr8Kvwq/Cr8Kvwq/Cr8Kvwq8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFwQXNDb21wb3NpdGU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEFic3RyYWN0UGFuZTxUPiB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZHJhZ0V2ZW50OwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkOwotCXByaXZhdGUgQ3Vyc29yIGhhbmRDdXJzb3I7Ci0JcHJpdmF0ZSBNYXBwaW5nQ2hhbmdlSGFuZGxlciBtYXBwaW5nQ2hhbmdlSGFuZGxlcjsKLQlwcml2YXRlIGludCBtYXBwaW5nVHlwZUxlbmd0aDsKLQlwcml2YXRlIGludCBtYXBwaW5nVHlwZVN0YXJ0OwotCXByaXZhdGUgYm9vbGVhbiBtb3VzZURvd247Ci0JcHJpdmF0ZSBpbnQgbmFtZUxlbmd0aDsKLQlwcml2YXRlIGludCBuYW1lU3RhcnQ7Ci0JcHJpdmF0ZSBTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RhbnQgSUQgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGlhbG9nIHNldHRpbmdzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfU0VUVElOR1MgPSAib3JnLmVjbGlwc2UuanB0LnVpLmRpYWxvZ3MuTWFwQXNEaWFsb2ciOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBBc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE1hcEFzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBwcm92aWRlciByZXNwb25zaWJsZSBmb3IgY2xlYXJpbmcgdGhlIG1hcHBpbmcgdHlwZS4KLQkgKgotCSAqIEByZXR1cm4gQSBwcm92aWRlciB0aGF0IGFjdHMgYXMgYSBkZWZhdWx0IG1hcHBpbmcgcHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwcGluZ1VpUHJvdmlkZXI8Pz4gYnVpbGREZWZhdWx0UHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGhhbmRsZXIgcmVzcG9uc2libGUgdG8gZ2l2ZSB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yCi0JICogY29tcGxldGluZyB0aGUgYmVoYXZpb3Igb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5NYXBwaW5nQ2hhbmdlSGFuZGxlcjwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwcGluZ0NoYW5nZUhhbmRsZXIgYnVpbGRNYXBwaW5nQ2hhbmdlSGFuZGxlcigpOwotCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGJ1aWxkTW91c2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmIChlLmJ1dHRvbiA9PSAxKSB7Ci0JCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCW1vdXNlRG93biA9IGZhbHNlOwotCQkJCVN0eWxlZFRleHQgdGV4dCA9IChTdHlsZWRUZXh0KSBlLndpZGdldDsKLQkJCQlpbnQgb2Zmc2V0ID0gdGV4dC5nZXRDYXJldE9mZnNldCgpOwotCi0JCQkJaWYgKGRyYWdFdmVudCkgewotCQkJCQlkcmFnRXZlbnQgPSBmYWxzZTsKLQotCQkJCQlpZiAoaXNPdmVyTGluayhvZmZzZXQpKSB7Ci0JCQkJCQl0ZXh0LnNldEN1cnNvcihoYW5kQ3Vyc29yKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChpc092ZXJMaW5rKG9mZnNldCkpIHsKLQkJCQkJdGV4dC5zZXRDdXJzb3IoaGFuZEN1cnNvcik7Ci0JCQkJCW9wZW5NYXBwaW5nU2VsZWN0aW9uRGlhbG9nKCk7Ci0JCQkJCXRleHQuc2V0Q3Vyc29yKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vdXNlTW92ZUxpc3RlbmVyIGJ1aWxkTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0JCQkJU3R5bGVkVGV4dCB0ZXh0ID0gKFN0eWxlZFRleHQpIGUud2lkZ2V0OwotCi0JCQkJaWYgKG1vdXNlRG93bikgewotCQkJCQlpZiAoIWRyYWdFdmVudCkgewotCQkJCQkJdGV4dC5zZXRDdXJzb3IobnVsbCk7Ci0JCQkJCX0KLQotCQkJCQlkcmFnRXZlbnQgPSB0cnVlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaW50IG9mZnNldCA9IC0xOwotCi0JCQkJdHJ5IHsKLQkJCQkJb2Zmc2V0ID0gdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludChlLngsIGUueSkpOwotCQkJCX0KLQkJCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCi0JCQkJaWYgKGlzT3Zlckxpbmsob2Zmc2V0KSkgewotCQkJCQl0ZXh0LnNldEN1cnNvcihoYW5kQ3Vyc29yKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRleHQuc2V0Q3Vyc29yKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248TWFwcGluZ1NlbGVjdGlvbkRpYWxvZz4gYnVpbGRQb3N0RXhlY3V0aW9uKCkgewotCi0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxNYXBwaW5nU2VsZWN0aW9uRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoTWFwcGluZ1NlbGVjdGlvbkRpYWxvZyBkaWFsb2cpIHsKLQotCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCQkJTWFwcGluZ1VpUHJvdmlkZXI8Pz4gcHJvdmlkZXIgPSAoTWFwcGluZ1VpUHJvdmlkZXI8Pz4pIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJCQltb3JwaE1hcHBpbmcocHJvdmlkZXIpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmdWxsIGxvY2FsaXplZCBzdHJpbmcgYnkgZm9ybWF0dGluZyB0aGUgbGFiZWwgdGV4dCByZXR1cm5lZAotCSAqIGJ5IHRoZSA8Y29kZT5NYXBwaW5nQ2hhbmdlSGFuZGxlcjwvY29kZT4gd2l0aCB0aGUgbWFwcGluZyBuYW1lIGFuZCB0aGUKLQkgKiBtYXBwaW5nIHR5cGUuCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgZGlzcGxheSBzdHJpbmcgb2YgdGhlIG1hcHBpbmcgYmVpbmcgZWRpdGVkCi0JICogQHBhcmFtIG1hcHBpbmdUeXBlIFRoZSBsb2NhbGl6ZWQgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBtYXBwaW5nIHR5cGUKLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIG1hcHBpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVGV4dChTdHJpbmcgbmFtZSwgU3RyaW5nIG1hcHBpbmdUeXBlKSB7Ci0JCXJldHVybiBOTFMuYmluZCgKLQkJCW1hcHBpbmdDaGFuZ2VIYW5kbGVyLmxhYmVsVGV4dCgpLAotCQkJbmFtZSwKLQkJCW1hcHBpbmdUeXBlCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbnkgc3R5bGUgYXBwbGllZCB0byB0aGUgc3R5bGVkIHRleHQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTdHlsZVJhbmdlKCkgewotCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2UobnVsbCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQl1cGRhdGVEZXNjcmlwdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0KLQkJaWYgKCFzdHlsZWRUZXh0LmlzRGlzcG9zZWQoKSkgewotCQkJc3R5bGVkVGV4dC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0JCQlpZiAoZW5hYmxlZCkgewotCQkJCXVwZGF0ZUxpbmtSYW5nZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY2xlYXJTdHlsZVJhbmdlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCi0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQl0aGlzLmVuYWJsZWQgPSB0cnVlOwotCQl0aGlzLm1hcHBpbmdDaGFuZ2VIYW5kbGVyID0gYnVpbGRNYXBwaW5nQ2hhbmdlSGFuZGxlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWhhbmRDdXJzb3IgPSBzaGVsbCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1DdXJzb3IoU1dULkNVUlNPUl9IQU5EKTsKLQotCQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoY29udGFpbmVyLCBTV1QuV1JBUCB8IFNXVC5SRUFEX09OTFkpOwotCQlzdHlsZWRUZXh0LmFkZE1vdXNlTGlzdGVuZXIoYnVpbGRNb3VzZUxpc3RlbmVyKCkpOwotCQlzdHlsZWRUZXh0LmFkZE1vdXNlTW92ZUxpc3RlbmVyKGJ1aWxkTW91c2VNb3ZlTGlzdGVuZXIoKSk7Ci0JCXN0eWxlZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmVpdmUgdGhlIDxjb2RlPk1hcHBpbmdVaVByb3ZpZGVyPC9jb2RlPiB0aGF0IHByb3ZpZGVzIHRoZSBVSSBmb3IgdGhlCi0JICogY3VycmVudCBtYXBwaW5nLgotCSAqCi0JICogQHJldHVybiBUaGUgPGNvZGU+TWFwcGluZ1VpUHJvdmlkZXI8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiB0aGUKLQkgKiBtYXBwaW5nIGJlaW5nIGVkaXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXBwaW5nVWlQcm92aWRlcjw/PiBpbml0aWFsU2VsZWN0aW9uKCkgewotCi0JCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaVByb3ZpZGVyPD8+PiBpdGVyID0gbWFwcGluZ0NoYW5nZUhhbmRsZXIucHJvdmlkZXJzKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCU1hcHBpbmdVaVByb3ZpZGVyPD8+IHByb3ZpZGVyID0gaXRlci5uZXh0KCk7Ci0KLQkJCWlmIChtYXBwaW5nS2V5KCkgPT0gcHJvdmlkZXIuZ2V0TWFwcGluZ0tleSgpKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBsb2NhdGlvbiBpcyB3aXRoaW4gdGhlIG1hcHBpbmcgdHlwZSByYW5nZS4KLQkgKgotCSAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbW91c2UgbG9jYXRpb24gaW4gY2hhcmFjdGVyIGNvb3JkaW5hdGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb3VzZSBpcyBvdmVyIHRoZSBtYXBwaW5nIHR5cGUgdGV4dDsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPdmVyTGluayhpbnQgbG9jYXRpb24pIHsKLQotCQlyZXR1cm4gKGxvY2F0aW9uID49IG1hcHBpbmdUeXBlU3RhcnQgJiYKLQkJICAgICAgICBsb2NhdGlvbiA8PSBtYXBwaW5nVHlwZVN0YXJ0ICsgbWFwcGluZ1R5cGVMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcHBpbmcga2V5IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBtYXBwaW5nIG9iamVjdC4KLQkgKgotCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHRoZSB0eXBlCi0JICogb2YgdGhlIG1hcHBpbmcgYmVpbmcgZWRpdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBtYXBwaW5nS2V5KCk7Ci0KLQkvKioKLQkgKiBBa3MgdGhlIDxjb2RlPk1hcHBpbmdDaGFuZ2VIYW5kbGVyPC9jb2RlPiB0byBjaGFuZ2UgdGhlIG1hcHBpbmcgdHlwZSB1c2luZwotCSAqIHRoZSBnaXZlbiA8Y29kZT5NYXBwaW5nVWlQcm92aWRlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtYXBwaW5nIHR5cGUgdXNlZCBmb3IKLQkgKiBtb3JwaGluZyB0aGUgbWFwcGluZyBiZWluZyBlZGl0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtb3JwaE1hcHBpbmcoTWFwcGluZ1VpUHJvdmlkZXI8Pz4gcHJvdmlkZXIpIHsKLQkJbWFwcGluZ0NoYW5nZUhhbmRsZXIubW9ycGhNYXBwaW5nKHByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgZGlhbG9nIHRoYXQgc2hvd3MgdGhlIHJlZ2lzdGVyZWQgbWFwcGluZyB0eXBlcyBpbiBvcmRlciBmb3IgdGhlCi0JICogdXNlciB0byBzZWxlY3QgYSBwcm92aWRlciBpbiBvcmRlciB0byBjaGFuZ2UgdGhlIG1hcHBpbmcgdHlwZSBvZiB0aGUKLQkgKiBtYXBwaW5nIGJlaW5nIGVkaXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuTWFwcGluZ1NlbGVjdGlvbkRpYWxvZygpIHsKLQotCQlNYXBwaW5nU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBNYXBwaW5nU2VsZWN0aW9uRGlhbG9nKCk7Ci0JCVNXVFV0aWwuc2hvdyhkaWFsb2csIGJ1aWxkUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBkZXNjcmlwdGlvbiBieSByZWNyZWF0aW5nIHRoZSBsYWJlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZXNjcmlwdGlvbigpIHsKLQotCQljbGVhclN0eWxlUmFuZ2UoKTsKLQkJdXBkYXRlVGV4dCgpOwotCi0JCWlmIChlbmFibGVkKSB7Ci0JCQl1cGRhdGVMaW5rUmFuZ2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGNvbG9ycyBvZiB0aGUgdGV4dDogKDEpIHRoZSBuYW1lIGlzIHNob3duIGluIGJvbGQgYW5kICgyKSB0aGUKLQkgKiBtYXBwaW5nIHR5cGUgaXMgc2hvd24gaW4gYm9sZCBhbmQgaW4gaHlwZXJsaW5rIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxpbmtSYW5nZSgpIHsKLQotCQlDb2xvciBsaW5rQ29sb3IgPSBKRmFjZUNvbG9ycy5nZXRIeXBlcmxpbmtUZXh0KHNoZWxsKCkuZ2V0RGlzcGxheSgpKTsKLQotCQkvLyBNYWtlIHRoZSBuYW1lIGJvbGQKLQkJU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoCi0JCQluYW1lU3RhcnQsIG5hbWVMZW5ndGgsCi0JCQludWxsLCBudWxsLAotCQkJU1dULkJPTEQKLQkJKTsKLQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlUmFuZ2UpOwotCi0JCS8vIE1ha2UgdGhlIG1hcHBpbmcgdHlwZSBzaG93biBhcyBhIGh5cGVybGluawotCQlpZiAobWFwcGluZ1R5cGVTdGFydCA+IC0xKSB7Ci0JCQlzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoCi0JCQkJbWFwcGluZ1R5cGVTdGFydCwgbWFwcGluZ1R5cGVMZW5ndGgsCi0JCQkJbGlua0NvbG9yLCBudWxsCi0JCQkpOwotCi0JCQlzdHlsZVJhbmdlLnVuZGVybGluZSAgICAgID0gdHJ1ZTsKLQkJCXN0eWxlUmFuZ2UudW5kZXJsaW5lQ29sb3IgPSBsaW5rQ29sb3I7Ci0JCQlzdHlsZVJhbmdlLnVuZGVybGluZVN0eWxlID0gU1dULlVOREVSTElORV9TSU5HTEU7Ci0JCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGVSYW5nZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzdHlsZXMgdGV4dCdzIGlucHV0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRleHQoKSB7Ci0KLQkJU3RyaW5nIG5hbWUgPSBtYXBwaW5nQ2hhbmdlSGFuZGxlci5uYW1lKCk7Ci0KLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJbmFtZSA9IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Ob05hbWVTZXQ7Ci0JCX0KLQotCQlTdHJpbmcgbWFwcGluZ1R5cGUgPSBtYXBwaW5nQ2hhbmdlSGFuZGxlci5tYXBwaW5nVHlwZSgpOwotCQlTdHJpbmcgdGV4dCA9IGJ1aWxkVGV4dChuYW1lLCBtYXBwaW5nVHlwZSk7Ci0KLQkJbWFwcGluZ1R5cGVTdGFydCAgPSB0ZXh0Lmxhc3RJbmRleE9mKG1hcHBpbmdUeXBlKTsKLQkJbWFwcGluZ1R5cGVMZW5ndGggPSBtYXBwaW5nVHlwZS5sZW5ndGgoKTsKLQotCQluYW1lU3RhcnQgID0gdGV4dC5pbmRleE9mKG5hbWUpOwotCQluYW1lTGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLQotCQlzdHlsZWRUZXh0LnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGdpdmUgdGhlIHRleHQgaW5mb3JtYXRpb24gYW5kIHRvIG9wZW4gdGhlCi0JICogbWFwcGluZyBkaWFsb2cgaWYgdGhlIHVzZXIgY2xpY2tlZCBvbiB0aGUgbWFwcGluZyB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBpbnRlcmZhY2UgTWFwcGluZ0NoYW5nZUhhbmRsZXIgewotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBlbnRpcmUgdGV4dCBkZXNjcmliaW5nIHRoZSBtYXBwaW5nIChlbnRpdHkgb3IgbWFwcGluZykgYW5kCi0JCSAqIGl0cyB0eXBlLgotCQkgKgotCQkgKiBAcmV0dXJuIEEgbG9jYWxpemVkIHRleHQgd2l0aCB0d28gYXJndW1lbnRzIHdoZXJlIHRoZSBmaXJzdCBvbmUgc2hvdWxkCi0JCSAqIGJlIHJlcGxhY2VkIGJ5IHRoZSBuYW1lIGFuZCB0aGUgc2Vjb25kIGJlIHJlcGxhY2VkIGJ5IHRoZSBtYXBwaW5nIHR5cGUKLQkJICovCi0JCVN0cmluZyBsYWJlbFRleHQoKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgdGV4dCByZXByZXNlbnRpbmcgdGhlIG1hcHBpbmcgdHlwZS4KLQkJICoKLQkJICogQHJldHVybiBBIGh1bWFuIHJlYWRhYmxlIHRleHQgZGVzY3JpYmluZyB0aGUgbWFwcGluZyB0eXBlCi0JCSAqLwotCQlTdHJpbmcgbWFwcGluZ1R5cGUoKTsKLQotCQkvKioKLQkJICogTW9ycGhlcyB0aGUgY3VycmVudCBtYXBwaW5nIGludG8gYSBuZXcgdHlwZSBieSB1c2luZyB0aGUgZ2l2ZW4gcHJvdmlkZXIuCi0JCSAqCi0JCSAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdGhhdCB3YXMgc2VsZWN0ZWQgZm9yIGNoYW5naW5nIHRoZSBtYXBwaW5nCi0JCSAqLwotCQl2b2lkIG1vcnBoTWFwcGluZyhNYXBwaW5nVWlQcm92aWRlcjw/PiBwcm92aWRlcik7Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbWFwcGluZy4KLQkJICoKLQkJICogQHJldHVybiBUaGUgZGlzcGxheWFibGUgbmFtZSBvZiB0aGUgbWFwcGluZwotCQkgKi8KLQkJU3RyaW5nIG5hbWUoKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgbGlzdCBvZiBwcm92aWRlcnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBKUFQgcGx1Z2luLgotCQkgKgotCQkgKiBAcmV0dXJuIFRoZSBzdXBwb3J0ZWQgdHlwZXMgb2YgbWFwcGluZwotCQkgKi8KLQkJSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaVByb3ZpZGVyPD8+PiBwcm92aWRlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRpYWxvZyBzaG93cyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBtYXBwaW5nIHR5cGVzIGFuZCBsZXRzIHRoZSB1c2VyCi0JICogdGhlIG9wdGlvbiB0byBmaWx0ZXIgdGhlbSB1c2luZyBhIHNlYXJjaCBmaWVsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgTWFwcGluZ1NlbGVjdGlvbkRpYWxvZyBleHRlbmRzIEZpbHRlcmVkSXRlbXNTZWxlY3Rpb25EaWFsb2cgewotCi0JCXByaXZhdGUgTWFwcGluZ1VpUHJvdmlkZXI8Pz4gZGVmYXVsdFByb3ZpZGVyOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBpbmdTZWxlY3Rpb25EaWFsb2c8L2NvZGU+LgotCQkgKi8KLQkJcHJpdmF0ZSBNYXBwaW5nU2VsZWN0aW9uRGlhbG9nKCkgewotCQkJc3VwZXIoTWFwQXNDb21wb3NpdGUudGhpcy5zaGVsbCgpLCBmYWxzZSk7Ci0JCQlzZXRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfbGFiZWxUZXh0KTsKLQkJCXNldFRpdGxlKEpwdFVpTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfZGlhbG9nVGl0bGUpOwotCQkJc2V0TGlzdExhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQkJc2V0RGV0YWlsc0xhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQotCQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCU1hcHBpbmdVaVByb3ZpZGVyPD8+IHByb3ZpZGVyID0gKE1hcHBpbmdVaVByb3ZpZGVyPD8+KSBlbGVtZW50OwotCQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0SW1hZ2UoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQotCQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gIiI7Ci0JCQkJCX0KLQotCQkJCQlNYXBwaW5nVWlQcm92aWRlcjw/PiBwcm92aWRlciA9IChNYXBwaW5nVWlQcm92aWRlcjw/PikgZWxlbWVudDsKLQkJCQkJcmV0dXJuIHByb3ZpZGVyLmdldExhYmVsKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVFeHRlbmRlZENvbnRlbnRBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVtc0ZpbHRlciBjcmVhdGVGaWx0ZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IE1hcHBpbmdUeXBlSXRlbXNGaWx0ZXIoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGVudFByb3ZpZGVyKEFic3RyYWN0Q29udGVudFByb3ZpZGVyIHByb3ZpZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1zRmlsdGVyIGl0ZW1zRmlsdGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCQltb25pdG9yLmJlZ2luVGFzayhudWxsLCAtMSk7Ci0KLQkJCXRyeSB7Ci0JCQkJLy8gQWRkIHRoZSBkZWZhdWx0IHByb3ZpZGVyCi0JCQkJZGVmYXVsdFByb3ZpZGVyID0gYnVpbGREZWZhdWx0UHJvdmlkZXIoKTsKLQotCQkJCWlmIChkZWZhdWx0UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlwcm92aWRlci5hZGQoZGVmYXVsdFByb3ZpZGVyLCBpdGVtc0ZpbHRlcik7Ci0JCQkJfQotCi0JCQkJLy8gQWRkIHRoZSByZWdpc3RlcmVkIG1hcHBpbmcgcHJvdmlkZXJzIHRvIHRoZSBkaWFsb2cKLQkJCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlQcm92aWRlcjw/Pj4gaXRlciA9IG1hcHBpbmdDaGFuZ2VIYW5kbGVyLnByb3ZpZGVycygpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQkJCU1hcHBpbmdVaVByb3ZpZGVyPD8+IG1hcHBpbmdQcm92aWRlciA9IGl0ZXIubmV4dCgpOwotCQkJCQlwcm92aWRlci5hZGQobWFwcGluZ1Byb3ZpZGVyLCBpdGVtc0ZpbHRlcik7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQotCQkJSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzID0gSnB0VWlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGRpYWxvZ1NldHRpbmdzLmdldFNlY3Rpb24oRElBTE9HX1NFVFRJTkdTKTsKLQotCQkJaWYgKHNldHRpbmdzID09IG51bGwpIHsKLQkJCQlzZXR0aW5ncyA9IGRpYWxvZ1NldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX1NFVFRJTkdTKTsKLQkJCX0KLQotCQkJcmV0dXJuIHNldHRpbmdzOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoT2JqZWN0IG9iamVjdCkgewotCQkJTWFwcGluZ1VpUHJvdmlkZXI8Pz4gcHJvdmlkZXIgPSAoTWFwcGluZ1VpUHJvdmlkZXI8Pz4pIG9iamVjdDsKLQkJCXJldHVybiBwcm92aWRlci5nZXRMYWJlbCgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb21wYXJhdG9yPE1hcHBpbmdVaVByb3ZpZGVyPD8+PiBnZXRJdGVtc0NvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8TWFwcGluZ1VpUHJvdmlkZXI8Pz4+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShNYXBwaW5nVWlQcm92aWRlcjw/PiBpdGVtMSwgTWFwcGluZ1VpUHJvdmlkZXI8Pz4gaXRlbTIpIHsKLQotCQkJCQlpZiAoaXRlbTEgPT0gZGVmYXVsdFByb3ZpZGVyKSB7Ci0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0KLQotCQkJCQlpZiAoaXRlbTIgPT0gZGVmYXVsdFByb3ZpZGVyKSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfQotCi0JCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMSA9IGl0ZW0xLmdldExhYmVsKCk7Ci0JCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMiA9IGl0ZW0yLmdldExhYmVsKCk7Ci0JCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlSXRlbShPYmplY3QgaXRlbSkgewotCi0JCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiIiwgbnVsbCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSB0aGUgZmlsdGVyIHJlc3BvbnNpYmxlIHRvIHJlbW92ZSBhbnkgbWFwcGluZyB0eXBlIGJhc2VkIG9uIHRoZQotCQkgKiBwYXR0ZXJuIGVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQuCi0JCSAqLwotCQlwcml2YXRlIGNsYXNzIE1hcHBpbmdUeXBlSXRlbXNGaWx0ZXIgZXh0ZW5kcyBJdGVtc0ZpbHRlciB7Ci0KLQkJCS8qKgotCQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwaW5nVHlwZUl0ZW1zRmlsdGVyPC9jb2RlPi4KLQkJCSAqLwotCQkJTWFwcGluZ1R5cGVJdGVtc0ZpbHRlcigpIHsKLQotCQkJCXN1cGVyKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgcGF0dGVybiBpcyBlbXB0eSwgd2Ugc3BlY2lmeSAqIGluIG9yZGVyCi0JCQkJLy8gdG8gc2hvdyBhbGwgdGhlIG1hcHBpbmcgdHlwZXMKLQkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRQYXR0ZXJuKCkpKSB7Ci0JCQkJCXBhdHRlcm5NYXRjaGVyLnNldFBhdHRlcm4oIioiKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW50SXRlbShPYmplY3QgaXRlbSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIG1hdGNoSXRlbShPYmplY3QgaXRlbSkgewotCQkJCU1hcHBpbmdVaVByb3ZpZGVyPD8+IHByb3ZpZGVyID0gKE1hcHBpbmdVaVByb3ZpZGVyPD8+KSBpdGVtOwotCQkJCXJldHVybiBtYXRjaGVzKHByb3ZpZGVyLmdldExhYmVsKCkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYXBwZWRCeUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYXBwZWRCeUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTQzYWY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFwcGVkQnlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Ob25Pd25pbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBNYXBwZWQgQnk6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgTm9uT3duaW5nTWFwcGluZwotICogQHNlZSBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYXBwZWRCeUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8Tm9uT3duaW5nTWFwcGluZz4KLXsKLQlwcml2YXRlIENDb21ibyBjb21ibzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkQnlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE1hcHBlZEJ5Q29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIE5vbk93bmluZ01hcHBpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkQnlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTm9uT3duaW5nTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBNYXBwZWRCeUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE5vbk93bmluZ01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCi0JCXByb3BlcnR5TmFtZXMuYWRkKFJlbGF0aW9uc2hpcE1hcHBpbmcuUkVTT0xWRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSk7Ci0KLQkJcHJvcGVydHlOYW1lcy5hZGQoTm9uT3duaW5nTWFwcGluZy5NQVBQRURfQllfUFJPUEVSVFkpOwotCX0KLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgYnVpbGRDb21ib01vZGlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlDQ29tYm8gY29tYm8gPSAoQ0NvbWJvKSBlLndpZGdldDsKLQkJCQkJaWYgKGNvbWJvLmdldERhdGEoInBvcHVsYXRpbmciKSAhPSBCb29sZWFuLlRSVUUpIHsvL2NoZWNrICFUUlVFIGJlY2F1c2UgbnVsbCBpcyBhIHBvc3NpYmlsaXR5IGFzIHdlbGwKLQkJCQkJCXZhbHVlQ2hhbmdlZChjb21iby5nZXRUZXh0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0KLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29tYm8gPSBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Ob25Pd25pbmdNYXBwaW5nX21hcHBlZEJ5TGFiZWwsCi0JCQlidWlsZENvbWJvTW9kaWZ5TGlzdGVuZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfTUFQUEVEX0JZCi0JCSk7Ci0KLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21ibygpIHsKLQotCQljb21iby5yZW1vdmVBbGwoKTsKLQkJY29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Ob25lU2VsZWN0ZWQpOwotCi0JCU5vbk93bmluZ01hcHBpbmcgc3ViamVjdCA9IHN1YmplY3QoKTsKLQotCQlpZiAoc3ViamVjdCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBzdWJqZWN0LmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQotCQkJZm9yIChpdGVyID0gQ29sbGVjdGlvblRvb2xzLnNvcnQoaXRlcik7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQljb21iby5hZGQoaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJdXBkYXRlU2VsZWN0ZWRJdGVtKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0KLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBOb25Pd25pbmdNYXBwaW5nLk1BUFBFRF9CWV9QUk9QRVJUWSB8fAotCQkgICAgcHJvcGVydHlOYW1lID09IFJlbGF0aW9uc2hpcE1hcHBpbmcuUkVTT0xWRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSkgewotCi0JCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzZWxlY3RlZCBpdGVtIGJ5IHNlbGVjdGVkIHRoZSBjdXJyZW50IHZhbHVlLCBpZiBub3QKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgb3Igc2VsZWN0IHRoZSBkZWZhdWx0IHZhbHVlIGlmIG9uZSBpcyBhdmFpbGFibGUsCi0JICogb3RoZXJ3aXNlIHJlbW92ZSB0aGUgc2VsZWN0aW9uLgotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBJdCBzZWVtcyB0aGUgdGV4dCBjYW4gYmUgc2hvd24gYXMgdHJ1bmNhdGVkLCBjaGFuZ2luZyB0aGUKLQkgKiBzZWxlY3Rpb24gdG8gKDAsIDApIG1ha2VzIHRoZSBlbnRpcmUgdGV4dCB2aXNpYmxlLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3RlZEl0ZW0oKSB7Ci0KLQkJTm9uT3duaW5nTWFwcGluZyBzdWJqZWN0ID0gc3ViamVjdCgpOwotCQlTdHJpbmcgdmFsdWUgPSAoc3ViamVjdCAhPSBudWxsKSA/IHN1YmplY3QuZ2V0TWFwcGVkQnkoKSA6IG51bGw7Ci0KLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWNvbWJvLnNldFRleHQodmFsdWUpOwotCQl9Ci0JCWVsc2UgewotCQkJY29tYm8uc2VsZWN0KDApOwotCQl9Ci0KLQkJY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCAwKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbHVlQ2hhbmdlZChTdHJpbmcgdmFsdWUpIHsKLQotCQlOb25Pd25pbmdNYXBwaW5nIHN1YmplY3QgPSBzdWJqZWN0KCk7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IChzdWJqZWN0ICE9IG51bGwpID8gc3ViamVjdC5nZXRNYXBwZWRCeSgpIDogbnVsbDsKLQotCQkvLyBDaGVjayBmb3IgbnVsbCB2YWx1ZQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh2YWx1ZSkpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkob2xkVmFsdWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gVGhlIGRlZmF1bHQgdmFsdWUKLQkJaWYgKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Ob25lU2VsZWN0ZWQuZXF1YWxzKHZhbHVlKSkgewotCQkJdmFsdWUgPSBudWxsOwotCQl9Ci0KLQkJLy8gTm90aGluZyB0byBjaGFuZ2UKLQkJaWYgKChvbGRWYWx1ZSA9PSB2YWx1ZSkgJiYgdmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gU2V0IHRoZSBuZXcgdmFsdWUKLQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJiAob2xkVmFsdWUgPT0gbnVsbCkgfHwKLQkJICAgKChvbGRWYWx1ZSAhPSBudWxsKSAmJiAhb2xkVmFsdWUuZXF1YWxzKHZhbHVlKSkpIHsKLQotCQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQotCQkJdHJ5IHsKLQkJCQlzdWJqZWN0LnNldE1hcHBlZEJ5KHZhbHVlKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMmNjOTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBJZENsYXNzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgTWFwcGVkU3VwZXJjbGFzcwotICogQHNlZSBCYXNlSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIElkQ2xhc3NDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPE1hcHBlZFN1cGVyY2xhc3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgQ2xhc3Mgd2lkZ2V0cwotCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL05hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyMjM4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL05hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgUmVzdWx0IENsYXNzOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgIHwKLSAqIHwgUXVlcnk6ICAgICAgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBRdWVyeSBIaW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8IFF1ZXJ5SGludHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgTmFtZWROYXRpdmVRdWVyeQotICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJpZXNDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDbGFzc0Nob29zZXJQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8TmFtZWROYXRpdmVRdWVyeT4KLXsKLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8TmFtZWROYXRpdmVRdWVyeT4gcmVzdWx0Q2xhc3NDaG9vc2VyUGFuZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE5hbWVkTmF0aXZlUXVlcnk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8TmFtZWROYXRpdmVRdWVyeT4gYnVpbGRDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxOYW1lZE5hdGl2ZVF1ZXJ5Pih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TmFtZWROYXRpdmVRdWVyeSwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIE5hbWVkTmF0aXZlUXVlcnkuUkVTVUxUX0NMQVNTX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0UmVzdWx0Q2xhc3MoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCQlzdWJqZWN0LnNldFJlc3VsdENsYXNzKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRSZXN1bHRDbGFzcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgbGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3Jlc3VsdENsYXNzOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiByb290LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvbXB0VHlwZSgpIHsKLQkJCQlJVHlwZSB0eXBlID0gY2hvb3NlVHlwZSgpOwotCi0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKTsKLQkJCQkJc3ViamVjdCgpLnNldFJlc3VsdENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFF1ZXJ5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxOYW1lZE5hdGl2ZVF1ZXJ5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUXVlcnkuUVVFUllfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRRdWVyeSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFF1ZXJ5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCQlyZXN1bHRDbGFzc0Nob29zZXJQYW5lLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gUmVzdWx0IGNsYXNzIGNob29zZXIKLQkJcmVzdWx0Q2xhc3NDaG9vc2VyUGFuZSA9IGJ1aWxkQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7Ci0KLQkJLy8gUXVlcnkgdGV4dCBhcmVhCi0JCWJ1aWxkTGFiZWxlZE11bHRpTGluZVRleHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5LAotCQkJYnVpbGRRdWVyeUhvbGRlcigpLAotCQkJNAotCQkpOwotCi0JCS8vIFF1ZXJ5IEhpbnRzIHBhbmUKLQkJY29udGFpbmVyID0gYnVpbGRUaXRsZWRQYW5lKAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5SGludHNHcm91cEJveAotCQkpOwotCi0JCW5ldyBRdWVyeUhpbnRzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL05hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGRiZjA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgUXVlcnk6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIFF1ZXJ5IEhpbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgUXVlcnlIaW50c0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBOYW1lZFF1ZXJ5Ci0gKiBAc2VlIE5hbWVkUXVlcmllc0NvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIFF1ZXJ5SGludHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxOYW1lZFF1ZXJ5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBOYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE5hbWVkUXVlcnk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRRdWVyeUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TmFtZWRRdWVyeSwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIE5hbWVkUXVlcnkuUVVFUllfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRRdWVyeSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFF1ZXJ5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBRdWVyeSB0ZXh0IGFyZWEKLQkJYnVpbGRMYWJlbGVkTXVsdGlMaW5lVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnksCi0JCQlidWlsZFF1ZXJ5SG9sZGVyKCksCi0JCQk0Ci0JCSk7Ci0KLQkJLy8gUXVlcnkgSGludHMgcGFuZQotCQljb250YWluZXIgPSBidWlsZFRpdGxlZFBhbmUoCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCA1KSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnlIaW50c0dyb3VwQm94Ci0JCSk7Ci0KLQkJbmV3IFF1ZXJ5SGludHNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiMjMxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gSm9pbiBUYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luVGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPbmVUb01hbnlNYXBwaW5nCi0gKiBAc2VlIEJhc2VKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqIEBzZWUgQ2FzY2FkZUNvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgSm9pblRhYmxlQ29tcG9zaXRlCi0gKiBAc2VlIE9yZGVyaW5nQ29tcG9zaXRlCi0gKiBAc2VlIFRhcmdldEVudGl0eUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8T25lVG9NYW55TWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU9uZVRvTWFueU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhc2NhZGU+IGJ1aWxkQ2FzY2FkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxPbmVUb01hbnlNYXBwaW5nLCBDYXNjYWRlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhc2NhZGUgdHJhbnNmb3JtXyhPbmVUb01hbnlNYXBwaW5nIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENhc2NhZGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxKb2luVGFibGU+IGJ1aWxkSm9pbnRUYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxPbmVUb01hbnlNYXBwaW5nLCBKb2luVGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSm9pblRhYmxlIHRyYW5zZm9ybV8oT25lVG9NYW55TWFwcGluZyB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRKb2luVGFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0KLQkJLy8gVGFyZ2V0IEVudGl0eSB3aWRnZXRzCi0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgc3ViUGFuZSk7Ci0KLQkJLy8gRmV0Y2ggVHlwZSB3aWRnZXRzCi0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgc3ViUGFuZSk7Ci0KLQkJLy8gTWFwcGVkIEJ5IHdpZGdldHMKLQkJbmV3IE1hcHBlZEJ5Q29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpOwotCi0JCS8vIENhc2NhZGUgd2lkZ2V0cwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgNCkpOwotCi0JCS8vIE9yZGVyaW5nIHdpZGdldHMKLQkJbmV3IE9yZGVyaW5nQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVKb2luVGFibGVQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBidWlsZENvbGxhcHNhYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfam9pblRhYmxlCi0JCSk7Ci0KLQkJbmV3IEpvaW5UYWJsZUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZEpvaW50VGFibGVIb2xkZXIoKSwKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIEdlbmVyYWwgc3ViIHBhbmUKLQkJaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKGNvbnRhaW5lcik7Ci0KLQkJLy8gSm9pbiBUYWJsZSBzdWIgcGFuZQotCQlpbml0aWFsaXplSm9pblRhYmxlUGFuZShjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjY2ZiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBNYXBwZWRCeUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPbmVUb09uZU1hcHBpbmcKLSAqIEBzZWUgQmFzZUpwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBDYXNjYWRlQ29tcG9zaXRlCi0gKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQotICogQHNlZSBKb2luQ29sdW1uQ29tcG9zaXRlCi0gKiBAc2VlIE1hcHBlZEJ5Q29tcG9zaXRlCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIFRhcmdldEVudGl0eUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxPbmVUb09uZU1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhc2NhZGU+IGJ1aWxkQ2FzY2FkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxPbmVUb09uZU1hcHBpbmcsIENhc2NhZGU+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FzY2FkZSB0cmFuc2Zvcm1fKE9uZVRvT25lTWFwcGluZyB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDYXNjYWRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ3JvdXBCb3hNYXJnaW4oKTsKLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSBidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOwotCi0JCS8vIFRhcmdldCBFbnRpdHkgd2lkZ2V0cwotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpOwotCi0JCS8vIEZldGNoIFR5cGUgd2lkZ2V0cwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpOwotCi0JCS8vIE1hcHBlZCBCeSB3aWRnZXRzCi0JCW5ldyBNYXBwZWRCeUNvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKTsKLQotCQkvLyBPcHRpb25hbCBjaGVjayBib3gKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGJ1aWxkU3ViUGFuZShzdWJQYW5lLCA0KSk7Ci0KLQkJLy8gQ2FzY2FkZSB3aWRnZXRzCi0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBjb250YWluZXIpOwotCi0JCS8vIEpvaW4gQ29sdW1uIHdpZGdldHMKLQkJbmV3IEpvaW5Db2x1bW5Db21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PcHRpb25hbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PcHRpb25hbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjRlNzkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT3B0aW9uYWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk51bGxhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgYSB0cmktc3RhdGUgY2hlY2sgYm94IGZvciB0aGUgT3B0aW9uYWwgb3B0aW9uLgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKiBAc2VlIEJhc2ljTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgT3B0aW9uYWxDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPE51bGxhYmxlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3B0aW9uYWxDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9wdGlvbmFsQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIE51bGxhYmxlPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3B0aW9uYWxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE51bGxhYmxlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIE51bGxhYmxlLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTcGVjaWZpZWRPcHRpb25hbCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRTcGVjaWZpZWRPcHRpb25hbCh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkT3B0aW9uYWxTdHJpbmdIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkT3B0aW9uYWxIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCi0JCQkJCUJvb2xlYW4gZGVmYXVsdFZhbHVlID0gc3ViamVjdCgpLmdldERlZmF1bHRPcHRpb25hbCgpOwotCi0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0KLQkJCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsRGVmYXVsdCwKLQkJCQkJCQlkZWZhdWx0U3RyaW5nVmFsdWUKLQkJCQkJCSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlidWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5CYXNpY0dlbmVyYWxTZWN0aW9uX29wdGlvbmFsTGFiZWwsCi0JCQlidWlsZE9wdGlvbmFsSG9sZGVyKCksCi0JCQlidWlsZE9wdGlvbmFsU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09QVElPTkFMCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT3JkZXJpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT3JkZXJpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3YzcyMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09yZGVyaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbEVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gT3JkZXIgQnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIE5vIE9yZGVyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gUHJpbWFyeSBLZXkgT3JkZXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBDdXN0b20gT3JkZXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKLSAqIEBzZWUgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcmRlcmluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8TXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPgotewotCXByaXZhdGUgVGV4dCBjdXN0b21PcmRlcmluZ1RleHQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9yZGVyaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcmRlcmluZ0NvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JkZXJpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9yZGVyaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLk9SREVSX0JZX1BST1BFUlRZKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGJ1aWxkQ3VzdG9tVGV4dE1vZGlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZS53aWRnZXQ7Ci0JCQkJCXZhbHVlQ2hhbmdlZCh0ZXh0LmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJcG9wdWxhdGVDdXN0b21PcmRlcmluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE9yZGVyIEJ5IGdyb3VwCi0JCUdyb3VwIG9yZGVyQnlHcm91cCA9IGJ1aWxkVGl0bGVkUGFuZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5PcmRlckJ5Q29tcG9zaXRlX29yZGVyQnlHcm91cCwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQlkpOwotCi0JCS8vIE5vIE9yZGVyaW5nIHJhZGlvIGJ1dHRvbgotCQlidWlsZFJhZGlvQnV0dG9uKAotCQkJYnVpbGRTdWJQYW5lKG9yZGVyQnlHcm91cCwgOCksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuT3JkZXJCeUNvbXBvc2l0ZV9ub09yZGVyaW5nLAotCQkJYnVpbGROb09yZGVyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZX05PX09SREVSSU5HCi0JCSk7Ci0KLQkJLy8gT3JkZXIgYnkgUHJpbWFyeSBLZXkgcmFkaW8gYnV0dG9uCi0JCWJ1aWxkUmFkaW9CdXR0b24oCi0JCQlvcmRlckJ5R3JvdXAsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuT3JkZXJCeUNvbXBvc2l0ZV9wcmltYXJ5S2V5T3JkZXJpbmcsCi0JCQlidWlsZFByaW1hcnlLZXlPcmRlcmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9CWV9QUklNQVJZX0tFWV9PUkRFUklORwotCQkpOwotCi0JCS8vIEN1c3RvbSBPcmRlcmluZyByYWRpbyBidXR0b24KLQkJYnVpbGRSYWRpb0J1dHRvbigKLQkJCW9yZGVyQnlHcm91cCwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5PcmRlckJ5Q29tcG9zaXRlX2N1c3RvbU9yZGVyaW5nLAotCQkJYnVpbGRDdXN0b21PcmRlcmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9CWV9DVVNUT01fT1JERVJJTkcKLQkJKTsKLQotCQkvLyBDdXN0b20gT3JkZXJpbmcgdGV4dCBmaWVsZAotCQljdXN0b21PcmRlcmluZ1RleHQgPSBidWlsZFRleHQoCi0JCQlidWlsZFN1YlBhbmUob3JkZXJCeUdyb3VwLCAwLCAxNiksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZCi0JCSk7Ci0KLQkJY3VzdG9tT3JkZXJpbmdUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGJ1aWxkQ3VzdG9tVGV4dE1vZGlmeUxpc3RlbmVyKCkpOwotCQlpbnN0YWxsQ3VzdG9tVGV4dEVuYWJsZXIoY3VzdG9tT3JkZXJpbmdUZXh0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbEN1c3RvbVRleHRFbmFibGVyKFRleHQgdGV4dCkgewotCQluZXcgQ29udHJvbEVuYWJsZXIoYnVpbGRDdXN0b21PcmRlcmluZ0hvbGRlcigpLCB0ZXh0KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ3VzdG9tT3JkZXJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE11bHRpUmVsYXRpb25zaGlwTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuQ1VTVE9NX09SREVSSU5HX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2Yoc3ViamVjdC5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRDdXN0b21PcmRlcmluZyh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vT3JkZXJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE11bHRpUmVsYXRpb25zaGlwTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuTk9fT1JERVJJTkdfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihzdWJqZWN0LmlzTm9PcmRlcmluZygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0Tm9PcmRlcmluZyh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFByaW1hcnlLZXlPcmRlcmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5QS19PUkRFUklOR19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHN1YmplY3QuaXNQa09yZGVyaW5nKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRQa09yZGVyaW5nKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ3VzdG9tT3JkZXJpbmcoKSB7Ci0KLQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgc3ViamVjdCgpLmdldE9yZGVyQnkoKSAhPSBudWxsKSB7Ci0JCQljdXN0b21PcmRlcmluZ1RleHQuc2V0VGV4dChzdWJqZWN0KCkuZ2V0T3JkZXJCeSgpKTsKLQkJfQotCQllbHNlICB7Ci0JCQljdXN0b21PcmRlcmluZ1RleHQuc2V0VGV4dCgiIik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQotCQlpZiAocHJvcGVydHlOYW1lID09IE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5PUkRFUl9CWV9QUk9QRVJUWSkgewotCQkJcG9wdWxhdGVDdXN0b21PcmRlcmluZygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbHVlQ2hhbmdlZChTdHJpbmcgdmFsdWUpIHsKLQotCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQlzdWJqZWN0KCkuc2V0T3JkZXJCeSh2YWx1ZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcyYzZiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyAiTWFwIEFzIiBjb21wb3NpdGUgaXMgcmVzcG9uc2libGUgZm9yIHNob3dpbmcgdGhlIG1hcHBpbmcgbmFtZSBhbmQKLSAqIG1hcHBpbmcgdHlwZSBmb3IgYW4gYXR0cmlidXRlIGRlY2xhcmVkIHdpdGhpbiBhIEpQQSBtYXBwaW5nIGRlc2NyaXB0b3IgZmlsZS4KLSAqCi0gKiBAc2VlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUKLSAqIEBzZWUgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZSBleHRlbmRzIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZTxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJcmV0dXJuIGpwYVBsYXRmb3JtVWkoKS5vcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4ganBhUGxhdGZvcm1VaSgpLmRlZmF1bHRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09ybVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT3JtUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2E2OTIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT3JtUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyAiTWFwIEFzIiBjb21wb3NpdGUgaXMgcmVzcG9uc2libGUgZm9yIHNob3dpbmcgdGhlIG1hcHBpbmcgbmFtZSBhbmQKLSAqIG1hcHBpbmcgdHlwZSBmb3IgYSB0eXBlIGRlY2xhcmVkIHdpdGhpbiBhIEpQQSBtYXBwaW5nIGRlc2NyaXB0b3IgZmlsZS4KLSAqCi0gKiBAc2VlIE9ybVBlcnNpc3RlbnRUeXBlCi0gKiBAc2VlIE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZSBleHRlbmRzIFBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGU8T3JtUGVyc2lzdGVudFR5cGU+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1QZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIE9ybVBlcnNpc3RlbnRUeXBlPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBNYXBwaW5nVWlQcm92aWRlcjw/PiBidWlsZERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiB0eXBlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4ganBhUGxhdGZvcm1VaSgpLm9ybVR5cGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PdmVycmlkZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiYzYyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkpvaW5Db2x1bW5zQ29tcG9zaXRlLklKb2luQ29sdW1uc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sU3dpdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Qb3N0RXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gQXR0cmlidXRlIE92ZXJyaWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8IFBhZ2VCb29rIChKb2luQ29sdW1uc0NvbXBvc2l0ZSBvciBDb2x1bW5Db21wb3NpdGUpICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBKb2luQ29sdW1uc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPdmVycmlkZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEVudGl0eT4KLXsKLQlwcml2YXRlIENvbXBvc2l0ZSBjb2x1bW5QYW5lOwotCXByaXZhdGUgQ29tcG9zaXRlIGpvaW5Db2x1bW5zUGFuZTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk92ZXJyaWRlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE92ZXJyaWRlc0NvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBFbnRpdHk+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PdmVycmlkZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JRW50aXR5PC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE92ZXJyaWRlc0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uKEFzc29jaWF0aW9uT3ZlcnJpZGUgc3ViamVjdCkgewotCi0JCUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nKHNoZWxsKCksIHN1YmplY3QsIG51bGwpOwotCi0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkQWRkSm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW4oSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZVN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gc3RhdGVPYmplY3QuZ2V0T3duZXIoKTsKLQkJaW50IGluZGV4ID0gYXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgpOwotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nPiBidWlsZEFkZEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQlhZGRKb2luQ29sdW1uKGRpYWxvZy5zdWJqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VPdmVycmlkZSwgQXNzb2NpYXRpb25PdmVycmlkZT4ob3ZlcnJpZGVIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGUgdHJhbnNmb3JtXyhCYXNlT3ZlcnJpZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgQXNzb2NpYXRpb25PdmVycmlkZSkgPyAoQXNzb2NpYXRpb25PdmVycmlkZSkgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGUsIEF0dHJpYnV0ZU92ZXJyaWRlPihvdmVycmlkZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQXR0cmlidXRlT3ZlcnJpZGUgdHJhbnNmb3JtXyhCYXNlT3ZlcnJpZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgQXR0cmlidXRlT3ZlcnJpZGUpID8gKEF0dHJpYnV0ZU92ZXJyaWRlKSB2YWx1ZSA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29sdW1uPiBidWlsZENvbHVtbkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGUsIENvbHVtbj4oYXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm1fKEF0dHJpYnV0ZU92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZT4gYnVpbGREZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eSwgQXNzb2NpYXRpb25PdmVycmlkZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYnVpbGREZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFbnRpdHksIEF0dHJpYnV0ZU92ZXJyaWRlPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2c+IGJ1aWxkRWRpdEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQllZGl0Sm9pbkNvbHVtbihkaWFsb2cuc3ViamVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBKb2luQ29sdW1uc1Byb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNFZGl0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbnNQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZSwgQm9vbGVhbj4oYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJCXVwZGF0ZU92ZXJyaWRlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKEFzc29jaWF0aW9uT3ZlcnJpZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gIXZhbHVlLmlzVmlydHVhbCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlLCBCb29sZWFuPihidWlsZEF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJCXVwZGF0ZU92ZXJyaWRlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKEF0dHJpYnV0ZU92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICF2YWx1ZS5pc1ZpcnR1YWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE92ZXJyaWRlRGlzcGxheVN0cmluZyhCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQkJU3RyaW5nIG92ZXJyaWRlVHlwZTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgdHlwZQotCQlpZiAob3ZlcnJpZGUgaW5zdGFuY2VvZiBBc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCQlvdmVycmlkZVR5cGUgPSBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuT3ZlcnJpZGVzQ29tcG9zaXRlX2Fzc29jaWF0aW9uOwotCQl9Ci0JCWVsc2UgewotCQkJb3ZlcnJpZGVUeXBlID0gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGU7Ci0JCX0KLQotCQkvLyBGb3JtYXQgdGhlIG5hbWUKLQkJU3RyaW5nIG5hbWUgPSBvdmVycmlkZS5nZXROYW1lKCk7Ci0KLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmFtZSkpIHsKLQkJCW5hbWUgPSBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuT3ZlcnJpZGVzQ29tcG9zaXRlX25vTmFtZTsKLQkJfQotCi0JCS8vIEZvcm1hdDogPG5hbWU+IChBdHRyaWJ1dGUvQXNzb2NpYXRpb24gT3ZlcnJpZGUpCi0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQobmFtZSk7Ci0JCXNiLmFwcGVuZCgiICgiKTsKLQkJc2IuYXBwZW5kKG92ZXJyaWRlVHlwZSk7Ci0JCXNiLmFwcGVuZCgiKSAiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGU+IGJ1aWxkT3ZlcnJpZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VPdmVycmlkZT4oKTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkT3ZlcnJpZGVMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBidWlsZE92ZXJyaWRlRGlzcGxheVN0cmluZygoQmFzZU92ZXJyaWRlKSBlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRPdmVycmlkZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8QmFzZU92ZXJyaWRlPiBidWlsZE92ZXJyaWRlc0xpc3RIb2xkZXIoKSB7Ci0JCUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+PigpOwotCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZERlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlc0xpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4sIEJhc2VPdmVycmlkZT4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGU+IGJ1aWxkT3ZlcnJpZGVzTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxCYXNlT3ZlcnJpZGU+KAotCQkJYnVpbGRPdmVycmlkZXNMaXN0SG9sZGVyKCksCi0JCQlCYXNlT3ZlcnJpZGUuTkFNRV9QUk9QRVJUWQotCQkpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8QmFzZU92ZXJyaWRlLCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxCYXNlT3ZlcnJpZGUsIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKEJhc2VPdmVycmlkZSBvdmVycmlkZSkgewotCi0JCQkJaWYgKG92ZXJyaWRlIGluc3RhbmNlb2YgQXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJCQkJcmV0dXJuIGNvbHVtblBhbmU7Ci0JCQkJfQotCi0JCQkJaWYgKG92ZXJyaWRlIGluc3RhbmNlb2YgQXNzb2NpYXRpb25PdmVycmlkZSkgewotCQkJCQlyZXR1cm4gam9pbkNvbHVtbnNQYW5lOwotCQkJCX0KLQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZT4gYnVpbGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RW50aXR5LCBBc3NvY2lhdGlvbk92ZXJyaWRlPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5TUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlPiBidWlsZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RW50aXR5LCBBdHRyaWJ1dGVPdmVycmlkZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZygKLQkJCQlzaGVsbCgpLAotCQkJCShBc3NvY2lhdGlvbk92ZXJyaWRlKSBvdmVycmlkZUhvbGRlci5nZXRWYWx1ZSgpLAotCQkJCWpvaW5Db2x1bW4KLQkJCSk7Ci0KLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRFZGl0Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uKEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKHN0YXRlT2JqZWN0LmdldEpvaW5Db2x1bW4oKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQlvdmVycmlkZUhvbGRlciA9IGJ1aWxkT3ZlcnJpZGVIb2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNvbHVtblBhbmUoUGFnZUJvb2sgcGFnZUJvb2spIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCQljb2x1bW5QYW5lID0gYnVpbGRTdWJQYW5lKHBhZ2VCb29rLCA1KTsKLQotCQkvLyBPdmVycmlkZSBEZWZhdWx0IGNoZWNrIGJveAotCQlidWlsZENoZWNrQm94KAotCQkJYnVpbGRTdWJQYW5lKGNvbHVtblBhbmUsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbiksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdCwKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIoKQotCQkpOwotCi0JCS8vIENvbHVtbiB3aWRnZXRzIChmb3IgSU92ZXJyaWRlQXR0cmlidXRlKQotCQlDb2x1bW5Db21wb3NpdGUgY29sdW1uQ29tcG9zaXRlID0gbmV3IENvbHVtbkNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZENvbHVtbkhvbGRlcihidWlsZEF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyKCkpLAotCQkJY29sdW1uUGFuZSwKLQkJCWZhbHNlCi0JCSk7Ci0KLQkJY29sdW1uUGFuZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJaW5zdGFsbENvbHVtbnNQYW5lRW5hYmxlcihjb2x1bW5Db21wb3NpdGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplSm9pbkNvbHVtbnNQYW5lKFBhZ2VCb29rIHBhZ2VCb29rKSB7Ci0KLQkJam9pbkNvbHVtbnNQYW5lID0gYnVpbGRTdWJQYW5lKHBhZ2VCb29rKTsKLQotCQkvLyBPdmVycmlkZSBEZWZhdWx0IGNoZWNrIGJveAotCQlidWlsZENoZWNrQm94KAotCQkJYnVpbGRTdWJQYW5lKGpvaW5Db2x1bW5zUGFuZSwgNSwgZ3JvdXBCb3hNYXJnaW4oKSksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdCwKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcigpCi0JCSk7Ci0KLQkJR3JvdXAgam9pbkNvbHVtbnNHcm91cFBhbmUgPSBidWlsZFRpdGxlZFBhbmUoCi0JCQlqb2luQ29sdW1uc1BhbmUsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuT3ZlcnJpZGVzQ29tcG9zaXRlX2pvaW5Db2x1bW4KLQkJKTsKLQotCQkvLyBKb2luIENvbHVtbnMgbGlzdCBwYW5lIChmb3IgSU92ZXJyaWRlQXNzb2NpYXRpb24pCi0JCUpvaW5Db2x1bW5zQ29tcG9zaXRlPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGpvaW5Db2x1bW5zQ29tcG9zaXRlID0KLQkJCW5ldyBKb2luQ29sdW1uc0NvbXBvc2l0ZTxBc3NvY2lhdGlvbk92ZXJyaWRlPigKLQkJCQl0aGlzLAotCQkJCWJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcigpLAotCQkJCWpvaW5Db2x1bW5zR3JvdXBQYW5lLAotCQkJCWJ1aWxkSm9pbkNvbHVtbnNFZGl0b3IoKSwKLQkJCQlmYWxzZQotCQkJKTsKLQotCQlqb2luQ29sdW1uc1BhbmUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWluc3RhbGxKb2luQ29sdW1uc1BhbmVFbmFibGVyKGpvaW5Db2x1bW5zQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBPdmVycmlkZXMgZ3JvdXAgcGFuZQotCQljb250YWluZXIgPSBidWlsZFRpdGxlZFBhbmUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlcwotCQkpOwotCi0JCS8vIE92ZXJyaWRlcyBsaXN0IHBhbmUKLQkJaW5pdGlhbGl6ZU92ZXJyaWRlc0xpc3QoY29udGFpbmVyKTsKLQotCQkvLyBQcm9wZXJ0eSBwYW5lCi0JCVBhZ2VCb29rIHBhZ2VCb29rID0gYnVpbGRQYWdlQm9vayhjb250YWluZXIpOwotCQlpbml0aWFsaXplSm9pbkNvbHVtbnNQYW5lKHBhZ2VCb29rKTsKLQkJaW5pdGlhbGl6ZUNvbHVtblBhbmUocGFnZUJvb2spOwotCQlpbnN0YWxsT3ZlcnJpZGVDb250cm9sU3dpdGNoZXIob3ZlcnJpZGVIb2xkZXIsIHBhZ2VCb29rKTsKLQl9Ci0KLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4gaW5pdGlhbGl6ZU92ZXJyaWRlc0xpc3QoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PigKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCA4KSwKLQkJCWJ1aWxkT3ZlcnJpZGVzQWRhcHRlcigpLAotCQkJYnVpbGRPdmVycmlkZXNMaXN0TW9kZWwoKSwKLQkJCW92ZXJyaWRlSG9sZGVyLAotCQkJYnVpbGRPdmVycmlkZUxhYmVsUHJvdmlkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9BVFRSSUJVVEVfT1ZFUlJJREVTCi0JCSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQnV0dG9uUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbENvbHVtbnNQYW5lRW5hYmxlcihDb2x1bW5Db21wb3NpdGUgcGFuZSkgewotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyKCksCi0JCQlwYW5lCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxKb2luQ29sdW1uc1BhbmVFbmFibGVyKEpvaW5Db2x1bW5zQ29tcG9zaXRlPEFzc29jaWF0aW9uT3ZlcnJpZGU+IHBhbmUpIHsKLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyKCksCi0JCQlwYW5lCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxPdmVycmlkZUNvbnRyb2xTd2l0Y2hlcihQcm9wZXJ0eVZhbHVlTW9kZWw8QmFzZU92ZXJyaWRlPiBvdmVycmlkZUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VCb29rIHBhZ2VCb29rKSB7Ci0KLQkJbmV3IENvbnRyb2xTd2l0Y2hlcigKLQkJCW92ZXJyaWRlSG9sZGVyLAotCQkJYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSwKLQkJCXBhZ2VCb29rCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU92ZXJyaWRlKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQotCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0KLQkJdHJ5IHsKLQkJCUJhc2VPdmVycmlkZSBvdmVycmlkZSA9IG92ZXJyaWRlSG9sZGVyLmdldFZhbHVlKCk7Ci0KLQkJCUJhc2VPdmVycmlkZSBuZXdPdmVycmlkZSA9IG92ZXJyaWRlLnNldFZpcnR1YWwoIXNlbGVjdGVkKTsKLQkJCW92ZXJyaWRlSG9sZGVyLnNldFZhbHVlKG5ld092ZXJyaWRlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBKb2luQ29sdW1uc1Byb3ZpZGVyIGltcGxlbWVudHMgSUpvaW5Db2x1bW5zRWRpdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGU+IHsKLQotCQlwdWJsaWMgdm9pZCBhZGRKb2luQ29sdW1uKEFzc29jaWF0aW9uT3ZlcnJpZGUgc3ViamVjdCkgewotCQkJT3ZlcnJpZGVzQ29tcG9zaXRlLnRoaXMuYWRkSm9pbkNvbHVtbihzdWJqZWN0KTsKLQkJfQotCi0JCXB1YmxpYyBKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uKEFzc29jaWF0aW9uT3ZlcnJpZGUgc3ViamVjdCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZS5ERUZBVUxUX0pPSU5fQ09MVU1OU19MSVNUOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWRpdEpvaW5Db2x1bW4oQXNzb2NpYXRpb25PdmVycmlkZSBzdWJqZWN0LCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCU92ZXJyaWRlc0NvbXBvc2l0ZS50aGlzLmVkaXRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoQXNzb2NpYXRpb25PdmVycmlkZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1ucyhBc3NvY2lhdGlvbk92ZXJyaWRlIHN1YmplY3QsIGludFtdIHNlbGVjdGVkSW5kaWNlcykgewotCQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJCXN1YmplY3QucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoQXNzb2NpYXRpb25PdmVycmlkZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQl9Ci0KLQkJcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoQXNzb2NpYXRpb25PdmVycmlkZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgc3BlY2lmaWVkTGlzdFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBBc3NvY2lhdGlvbk92ZXJyaWRlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwYjBkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtVWlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgIk1hcCBBcyIgY29tcG9zaXRlIGlzIHJlc3BvbnNpYmxlIGZvciBzaG93aW5nIHRoZSBtYXBwaW5nIG5hbWUgYW5kCi0gKiBtYXBwaW5nIHR5cGUgZm9yIGFuIGF0dHJpYnV0ZS4KLSAqCi0gKiBAc2VlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZTxUIGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZT4gZXh0ZW5kcyBNYXBBc0NvbXBvc2l0ZTxUPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVudEF0dHJpYnV0ZS5ERUZBVUxUX01BUFBJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW50QXR0cmlidXRlLlNQRUNJRklFRF9NQVBQSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVudEF0dHJpYnV0ZS5OQU1FX1BST1BFUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgSlBUIHBsdWdpbi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHN1cHBvcnRlZCB0eXBlcyBvZiBtYXBwaW5nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwcGluZ1VpUHJvdmlkZXI8VD4gYnVpbGREZWZhdWx0UHJvdmlkZXIoKSB7Ci0KLQkJaWYgKHN1YmplY3QoKS5nZXREZWZhdWx0TWFwcGluZ0tleSgpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBNYXBwaW5nVWlQcm92aWRlcjxUPigpIHsKLQotCQkJcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQkJCVN0cmluZyBtYXBwaW5nS2V5ID0gc3ViamVjdCgpLmdldERlZmF1bHRNYXBwaW5nS2V5KCk7Ci0JCQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcobWFwcGluZ0tleSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKTsKLQotCQkJCXJldHVybiBTV1RVdGlsLmJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJSnB0VWlNZXNzYWdlcy5jbGFzcywKLQkJCQkJTWFwQXNDb21wb3NpdGUuY2xhc3MsCi0JCQkJCW1hcHBpbmdLZXkgKyAiX2RlZmF1bHQyIgotCQkJCSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwcGluZ0NoYW5nZUhhbmRsZXIgYnVpbGRNYXBwaW5nQ2hhbmdlSGFuZGxlcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBwaW5nQ2hhbmdlSGFuZGxlcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBsYWJlbFRleHQoKSB7Ci0JCQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBzdWJqZWN0KCkuZ2V0TWFwcGluZ0tleSgpOwotCi0JCQkJaWYgKG1hcHBpbmdLZXkgIT0gTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCQkJcmV0dXJuIEpwdFVpTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfbWFwcGVkQXR0cmlidXRlVGV4dDsKLQkJCQl9Ci0JCQkJaWYgKHN1YmplY3QoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV92aXJ0dWFsQXR0cmlidXRlVGV4dDsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV91bm1hcHBlZEF0dHJpYnV0ZVRleHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgbWFwcGluZ1R5cGUoKSB7Ci0JCQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBzdWJqZWN0KCkuZ2V0TWFwcGluZ0tleSgpOwotCi0JCQkJaWYgKG1hcHBpbmdLZXkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV9jaGFuZ2VNYXBwaW5nVHlwZTsKLQkJCQl9Ci0KLQkJCQlpZiAoc3ViamVjdCgpLmdldFNwZWNpZmllZE1hcHBpbmcoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBTV1RVdGlsLmJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJCUpwdFVpTWVzc2FnZXMuY2xhc3MsCi0JCQkJCQlNYXBBc0NvbXBvc2l0ZS5jbGFzcywKLQkJCQkJCW1hcHBpbmdLZXkgKyAiX2RlZmF1bHQiCi0JCQkJCSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIFNXVFV0aWwuYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlKcHRVaU1lc3NhZ2VzLmNsYXNzLAotCQkJCQlNYXBBc0NvbXBvc2l0ZS5jbGFzcywKLQkJCQkJbWFwcGluZ0tleQotCQkJCSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vcnBoTWFwcGluZyhNYXBwaW5nVWlQcm92aWRlcjw/PiBwcm92aWRlcikgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KHByb3ZpZGVyLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldE5hbWUoKTsKLQkJCX0KLQotCQkJcHVibGljIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlQcm92aWRlcjw/Pj4gcHJvdmlkZXJzKCkgewotCQkJCXJldHVybiBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIEpQVCBwbHVnaW4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdXBwb3J0ZWQgZGVmYXVsdCB0eXBlcyBvZiBtYXBwaW5nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4KLQkJZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSlBUIHBsYXRmb3JtIHJlc3BvbnNibGUgdG8gbWFuYWdlIHRoZSB1c2VyIGludGVyZmFjZSBwYXJ0IG9mCi0JICogdGhlIEpQVCBwbHVnLWluLgotCSAqCi0JICogQHJldHVybiBUaGUgVUkgcGxhdGZvcm0gb2YgdGhlIEpQVCBwbHVnLWluCi0JICovCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSgpIHsKLQkJU3RyaW5nIHBsYXRmb3JtSWQgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJcmV0dXJuIEpwYVBsYXRmb3JtVWlSZWdpc3RyeS5pbnN0YW5jZSgpLmpwYVBsYXRmb3JtKHBsYXRmb3JtSWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHN1YmplY3QoKS5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0KLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBQZXJzaXN0ZW50QXR0cmlidXRlLlNQRUNJRklFRF9NQVBQSU5HX1BST1BFUlRZIHx8Ci0JCSAgICBwcm9wZXJ0eU5hbWUgPT0gUGVyc2lzdGVudEF0dHJpYnV0ZS5ERUZBVUxUX01BUFBJTkdfUFJPUEVSVFkgICB8fAotCQkgICAgcHJvcGVydHlOYW1lID09IFBlcnNpc3RlbnRBdHRyaWJ1dGUuTkFNRV9QUk9QRVJUWSkgewotCi0JCQl1cGRhdGVEZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwOWYzYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLlR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzICJNYXAgQXMiIGNvbXBvc2l0ZSBpcyByZXNwb25zaWJsZSBmb3Igc2hvd2luZyB0aGUgbWFwcGluZyBuYW1lIGFuZAotICogbWFwcGluZyB0eXBlIGZvciBhIHR5cGUuCi0gKgotICogQHNlZSBKYXZhUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZQotICogQHNlZSBPcm1QZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlPFQgZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZT4gZXh0ZW5kcyBNYXBBc0NvbXBvc2l0ZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVudFR5cGUuTUFQUElOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbnRUeXBlLk5BTUVfUFJPUEVSVFkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBNYXBwaW5nQ2hhbmdlSGFuZGxlciBidWlsZE1hcHBpbmdDaGFuZ2VIYW5kbGVyKCkgewotCQlyZXR1cm4gbmV3IE1hcHBpbmdDaGFuZ2VIYW5kbGVyKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGxhYmVsVGV4dCgpIHsKLQkJCQlTdHJpbmcgbWFwcGluZ0tleSA9IHN1YmplY3QoKS5nZXRNYXBwaW5nS2V5KCk7Ci0KLQkJCQlpZiAobWFwcGluZ0tleSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBKcHRVaU1lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX21hcHBlZFR5cGVUZXh0OwotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaU1lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX3VubWFwcGVkVHlwZVRleHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgbWFwcGluZ1R5cGUoKSB7Ci0JCQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBzdWJqZWN0KCkuZ2V0TWFwcGluZ0tleSgpOwotCi0JCQkJaWYgKG1hcHBpbmdLZXkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV9jaGFuZ2VNYXBwaW5nVHlwZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gU1dUVXRpbC5idWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpTWVzc2FnZXMuY2xhc3MsCi0JCQkJCU1hcEFzQ29tcG9zaXRlLmNsYXNzLAotCQkJCQltYXBwaW5nS2V5Ci0JCQkJKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9ycGhNYXBwaW5nKE1hcHBpbmdVaVByb3ZpZGVyPD8+IHByb3ZpZGVyKSB7Ci0JCQkJc3ViamVjdCgpLnNldE1hcHBpbmdLZXkocHJvdmlkZXIuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBuYW1lKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaVByb3ZpZGVyPD8+PiBwcm92aWRlcnMoKSB7Ci0JCQkJcmV0dXJuIHR5cGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKUFQgcGxhdGZvcm0gcmVzcG9uc2JsZSB0byBtYW5hZ2UgdGhlIHVzZXIgaW50ZXJmYWNlIHBhcnQgb2YKLQkgKiB0aGUgSlBUIHBsdWctaW4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBVSSBwbGF0Zm9ybSBvZiB0aGUgSlBUIHBsdWctaW4KLQkgKi8KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpKCkgewotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOwotCQlyZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuanBhUGxhdGZvcm0ocGxhdGZvcm1JZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gc3ViamVjdCgpLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQotCQlpZiAocHJvcGVydHlOYW1lID09IFBlcnNpc3RlbnRUeXBlLk1BUFBJTkdfUFJPUEVSVFkgfHwKLQkJICAgIHByb3BlcnR5TmFtZSA9PSBQZXJzaXN0ZW50VHlwZS5OQU1FX1BST1BFUlRZKSB7Ci0KLQkJCXVwZGF0ZURlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgSlBUIHBsdWdpbi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHN1cHBvcnRlZCB0eXBlcyBvZiBtYXBwaW5nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yPFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiB0eXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NjRlMjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdERpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoaXMgZGlhbG9nIGlzIHVzZWQgdG8gZWl0aGVyIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gdGhhdAotICogaXMgbG9jYXRlZCBvbiBhbiBlbnRpdHkuCi0gKgotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbgotICogQHNlZSBFbnRpdHkKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdAotICogQHNlZSBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5EaWFsb2c8UHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gZW50aXR5IFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzCi0JICogbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyhTaGVsbCBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eSBlbnRpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlzdXBlcihwYXJlbnQsIGVudGl0eSwgam9pbkNvbHVtbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0RGlhbG9nUGFuZTxQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lPFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3Q+KAotCQkJc3ViamVjdEhvbGRlcigpLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0KGdldE93bmVyKCksIGdldEpvaW5Db2x1bW4oKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvblRpdGxlKCkgewotCi0JCWlmIChnZXRKb2luQ29sdW1uKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19hZGREZXNjcmlwdGlvblRpdGxlOwotCQl9Ci0KLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFbnRpdHkgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoRW50aXR5KSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGUoKSB7Ci0KLQkJaWYgKGdldEpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2FkZFRpdGxlOwotCQl9Ci0KLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0VGl0bGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTUyOTExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3REaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyB1c2VkIHRvIGVpdGhlciBjcmVhdGUgb3IgZWRpdCBhIHByaW1hcnkga2V5IGpvaW5nIGNvbHVtbiB0aGF0Ci0gKiBpcyB3aXRoaW4gYSBzZWNvbmRhcnkgdGFibGUuCi0gKgotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbgotICogQHNlZSBTZWNvbmRhcnlUYWJsZQotICogQHNlZSBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBleHRlbmRzIEJhc2VKb2luQ29sdW1uRGlhbG9nPFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gc2Vjb25kYXJ5VGFibGUgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQKLQkgKiBpcyBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlzdXBlcihwYXJlbnQsIHNlY29uZGFyeVRhYmxlLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3REaWFsb2dQYW5lPFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lPFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0PigKLQkJCXN1YmplY3RIb2xkZXIoKSwKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0KAotCQkJZ2V0T3duZXIoKSwKLQkJCWdldEpvaW5Db2x1bW4oKQotCQkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb25UaXRsZSgpIHsKLQotCQlpZiAoZ2V0Sm9pbkNvbHVtbigpID09IG51bGwpIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZERlc2NyaXB0aW9uVGl0bGU7Ci0JCX0KLQotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZSBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChTZWNvbmRhcnlUYWJsZSkgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlKCkgewotCi0JCWlmIChnZXRKb2luQ29sdW1uKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfYWRkVGl0bGU7Ci0JCX0KLQotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0VGl0bGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhOTUxMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogVGhlIHN0YXRlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb24gYW4KLSAqIHNlY29uZGFyeSB0YWJsZS4KLSAqCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uCi0gKiBAc2VlIFNlY29uZGFyeVRhYmxlCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc2Vjb25kYXJ5VGFibGUgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQKLQkgKiBpcyBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgdG8KLQkgKiBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0KFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIoc2Vjb25kYXJ5VGFibGUsIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXROYW1lVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldERiVGFibGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2Vjb25kYXJ5VGFibGUgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoU2Vjb25kYXJ5VGFibGUpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRQYXJlbnQoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgaW5pdGlhbFRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4oaW5pdGlhbFRhYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDMxOWExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogVGhlIHN0YXRlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb24gYW4KLSAqIGVudGl0eS4KLSAqCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZwotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ1BhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBlbnRpdHkgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMKLQkgKiBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcwotCSAqIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0KEVudGl0eSBlbnRpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihlbnRpdHksIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXROYW1lVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudGl0eSBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChFbnRpdHkpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFBhcmVudEVudGl0eSgpLmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBpbml0aWFsVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFRhYmxlTmFtZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YWJsZXMoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxTdHJpbmc+KGluaXRpYWxUYWJsZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhMzMxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gSm9pbiBDb2x1bW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCB4IE92ZXJyaWRlIERlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFNlY29uZGFyeVRhYmxlCi0gKiBAc2VlIEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxTZWNvbmRhcnlUYWJsZT4KLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1uSG9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFNlY29uZGFyeVRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklTZWNvbmRhcnlUYWJsZTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgU2Vjb25kYXJ5VGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gc3RhdGVPYmplY3QuZ2V0T3duZXIoKTsKLQkJaW50IGluZGV4ID0gc2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbmRleCk7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2cgPQotCQkJbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyhzaGVsbCgpLCBzdWJqZWN0KCksIG51bGwpOwotCi0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkQWRkUHJpbWFyeUtleUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2c+IGJ1aWxkQWRkUHJpbWFyeUtleUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJYWRkSm9pbkNvbHVtbihkaWFsb2cuc3ViamVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDb250cm9sQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxTZWNvbmRhcnlUYWJsZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShTZWNvbmRhcnlUYWJsZSB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCF2YWx1ZS5pc1ZpcnR1YWwoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNlY29uZGFyeVRhYmxlLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBTZWNvbmRhcnlUYWJsZS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oCi0JCQlidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nPiBidWlsZEVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQllZGl0UHJpbWFyeUtleUpvaW5Db2x1bW4oZGlhbG9nLnN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKFByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlpZiAoam9pbkNvbHVtbi5pc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdCwKLQkJCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJCSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCXJldHVybiBOTFMuYmluZCgKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXMsCi0JCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkpOwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW4pIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKGpvaW5Db2x1bW4pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIEFkZFJlbW92ZVBhbmUuQWRhcHRlciBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24oKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCXJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlMaXN0PExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+PigpOwotCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkxpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+LCBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFByaW1hcnlLZXlKb2luQ29sdW1uPigKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdEhvbGRlcigpLAotCQkJTmFtZWRDb2x1bW4uU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksCi0JCQlOYW1lZENvbHVtbi5ERUZBVUxUX05BTUVfUFJPUEVSVFksCi0JCQlCYXNlSm9pbkNvbHVtbi5TUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwKLQkJCUJhc2VKb2luQ29sdW1uLkRFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWQotCQkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFNlY29uZGFyeVRhYmxlLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBTZWNvbmRhcnlUYWJsZS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2cgPQotCQkJbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZygKLQkJCQlzaGVsbCgpLAotCQkJCXN1YmplY3QoKSwKLQkJCQlqb2luQ29sdW1uCi0JCQkpOwotCi0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkRWRpdFByaW1hcnlLZXlKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oc3RhdGVPYmplY3QuZ2V0Sm9pbkNvbHVtbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCWpvaW5Db2x1bW5Ib2xkZXIgPSBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uSG9sZGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zIGdyb3VwIHBhbmUKLQkJR3JvdXAgZ3JvdXBQYW5lID0gYnVpbGRUaXRsZWRQYW5lKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9wcmltYXJ5S2V5Sm9pbkNvbHVtbgotCQkpOwotCi0JCS8vIE92ZXJyaWRlIERlZmF1bHQgY2hlY2sgYm94Ci0JCUJ1dHRvbiBidXR0b24gPSBidWlsZENoZWNrQm94KAotCQkJYnVpbGRTdWJQYW5lKGdyb3VwUGFuZSwgOCksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucywKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpCi0JCSk7Ci0KLQkJaW5zdGFsbE92ZXJyaWRlRGVmYXVsdEJ1dHRvbkVuYWJsZXIoYnV0dG9uKTsKLQotCQkvLyBQcmltYXJ5IEtleSBKb2luIENvbHVtbnMgbGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPFNlY29uZGFyeVRhYmxlPiBqb2luQ29sdW1uc1BhbmUgPSBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8U2Vjb25kYXJ5VGFibGU+KAotCQkJdGhpcywKLQkJCWdyb3VwUGFuZSwKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RNb2RlbCgpLAotCQkJam9pbkNvbHVtbkhvbGRlciwKLQkJCWJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMKLQkJKTsKLQotCQlpbnN0YWxsUHJpbWFyeUtleUpvaW5Db2x1bW5MaXN0UGFuZUVuYWJsZXIoam9pbkNvbHVtbnNQYW5lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbE92ZXJyaWRlRGVmYXVsdEJ1dHRvbkVuYWJsZXIoQnV0dG9uIG92ZXJyaWRlRGVmYXVsdEJ1dHRvbikgewotCi0JCW5ldyBDb250cm9sRW5hYmxlcigKLQkJCWJ1aWxkQ29udHJvbEJvb2xlYW5Ib2xkZXIoKSwKLQkJCW92ZXJyaWRlRGVmYXVsdEJ1dHRvbgotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUHJpbWFyeUtleUpvaW5Db2x1bW5MaXN0UGFuZUVuYWJsZXIoQWRkUmVtb3ZlTGlzdFBhbmU8U2Vjb25kYXJ5VGFibGU+IHBrSm9pbkNvbHVtbkxpc3RQYW5lKSB7Ci0KLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCksCi0JCQlwa0pvaW5Db2x1bW5MaXN0UGFuZQotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCWludFtdIHNlbGVjdGVkSW5kaWNlcyA9IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKTsKLQotCQlmb3IgKGludCBpbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQlzdWJqZWN0KCkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbHVtbnMoYm9vbGVhbiBzZWxlY3RlZCkgewotCi0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQotCQl0cnkgewotCQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBzdWJqZWN0KCk7Ci0KLQkJCS8vIEFkZCBhIGpvaW4gY29sdW1uIGJ5IGNyZWF0aW5nIGEgc3BlY2lmaWVkIG9uZSB1c2luZyB0aGUgZGVmYXVsdAotCQkJLy8gb25lIGlmIGl0IGV4aXN0cwotCQkJaWYgKHNlbGVjdGVkKSB7Ci0KLQkJCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IHNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCi0JCQkJaWYgKGRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQotCQkJCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJCQkJcGtKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoY29sdW1uTmFtZSk7Ci0JCQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0KLQkJCQkJam9pbkNvbHVtbkhvbGRlci5zZXRWYWx1ZShwa0pvaW5Db2x1bW4pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGluZGV4ID0gc2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJCQlzZWNvbmRhcnlUYWJsZS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbmRleCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIgZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHsKLQotCQlwdWJsaWMgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJCXN1cGVyKGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQlpZiAoc3ViamVjdCgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCX0KLQkJCXJldHVybiAhc3ViamVjdCgpLmlzVmlydHVhbCgpICYmIGxpc3RIb2xkZXIuc2l6ZSgpID4gMDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCXVwZGF0ZUpvaW5Db2x1bW5zKHZhbHVlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1F1ZXJpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUXVlcmllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTBjYjI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUXVlcmllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5OZXdOYW1lRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLk5ld05hbWVEaWFsb2dCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBvc3RFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBsaXN0IG9mIG5hbWVkIHF1ZXJpZXMgYW5kIG5hbWVkIG5hdGl2ZSBxdWVyaWVzLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSBvciBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBRdWVyeQotICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5Ci0gKiBAc2VlIE5hbWVkUXVlcnkKLSAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUKLSAqIEBzZWUgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWVyaWVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPFF1ZXJ5SG9sZGVyPgotewotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8UXVlcnlIb2xkZXI+IGxpc3RQYW5lOwotCXByaXZhdGUgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlIG5hbWVkTmF0aXZlUXVlcnlQYW5lOwotCXByaXZhdGUgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlIG5hbWVkUXVlcnlQYW5lOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnk+IHF1ZXJ5SG9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5RdWVyaWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUXVlcmllc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFF1ZXJ5SG9sZGVyPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGROYW1lZE5hdGl2ZVF1ZXJ5KE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlOZXdOYW1lRGlhbG9nQnVpbGRlciBidWlsZGVyID0gbmV3IE5ld05hbWVEaWFsb2dCdWlsZGVyKHNoZWxsKCkpOwotCQlidWlsZGVyLnNldERpYWxvZ1RpdGxlKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkTmF0aXZlUXVlcnlUaXRsZSk7Ci0JCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb24oSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWROYXRpdmVRdWVyeURlc2NyaXB0aW9uKTsKLQkJYnVpbGRlci5zZXREZXNjcmlwdGlvblRpdGxlKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkTmF0aXZlUXVlcnlEZXNjcmlwdGlvblRpdGxlKTsKLQkJYnVpbGRlci5zZXRMYWJlbFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJpZXNDb21wb3NpdGVfbGFiZWwpOwotCQlidWlsZGVyLnNldEV4aXN0aW5nTmFtZXMobmFtZWROYXRpdmVRdWVyeU5hbWVzKCkpOwotCi0JCU5ld05hbWVEaWFsb2cgZGlhbG9nID0gYnVpbGRlci5idWlsZERpYWxvZygpOwotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZE5ld05hbWVkTmF0aXZlUXVlcnlQb3N0RXhlY3V0aW9uKGxpc3RTZWxlY3Rpb25Nb2RlbCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGROYW1lZFF1ZXJ5KE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlOZXdOYW1lRGlhbG9nQnVpbGRlciBidWlsZGVyID0gbmV3IE5ld05hbWVEaWFsb2dCdWlsZGVyKHNoZWxsKCkpOwotCQlidWlsZGVyLnNldERpYWxvZ1RpdGxlKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkUXVlcnlUaXRsZSk7Ci0JCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb24oSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWRRdWVyeURlc2NyaXB0aW9uKTsKLQkJYnVpbGRlci5zZXREZXNjcmlwdGlvblRpdGxlKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkUXVlcnlEZXNjcmlwdGlvblRpdGxlKTsKLQkJYnVpbGRlci5zZXRMYWJlbFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJpZXNDb21wb3NpdGVfbGFiZWwpOwotCQlidWlsZGVyLnNldEV4aXN0aW5nTmFtZXMobmFtZWRRdWVyeU5hbWVzKCkpOwotCi0JCU5ld05hbWVEaWFsb2cgZGlhbG9nID0gYnVpbGRlci5idWlsZERpYWxvZygpOwotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZE5ld05hbWVkUXVlcnlQb3N0RXhlY3V0aW9uKGxpc3RTZWxlY3Rpb25Nb2RlbCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UXVlcnk+IGJ1aWxkRGlzcGxheWFibGVRdWVyaWVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UXVlcnk+KAotCQkJYnVpbGRRdWVyaWVzTGlzdEhvbGRlcigpLAotCQkJUXVlcnkuTkFNRV9QUk9QRVJUWQotCQkpOwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxOZXdOYW1lRGlhbG9nPiBidWlsZEVkaXROYW1lZFF1ZXJ5UG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPE5ld05hbWVEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShOZXdOYW1lRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJUXVlcnkgcXVlcnkgPSBxdWVyeUhvbGRlci5nZXRWYWx1ZSgpOwotCQkJCQlxdWVyeS5zZXROYW1lKGRpYWxvZy5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPFF1ZXJ5SG9sZGVyPiBidWlsZExpc3RQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFF1ZXJ5SG9sZGVyPigKLQkJCXRoaXMsCi0JCQljb250YWluZXIsCi0JCQlidWlsZFF1ZXJpZXNBZGFwdGVyKCksCi0JCQlidWlsZERpc3BsYXlhYmxlUXVlcmllc0xpc3RIb2xkZXIoKSwKLQkJCXF1ZXJ5SG9sZGVyLAotCQkJYnVpbGRRdWVyaWVzTGlzdExhYmVsUHJvdmlkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfTkFNRURfUVVFUklFUwotCQkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkQ3VzdG9tQnV0dG9uQWZ0ZXJBZGRCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQkJCUJ1dHRvbiBidXR0b24gPSBidWlsZEJ1dHRvbigKLQkJCQkJY29udGFpbmVyLAotCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZE5hdGl2ZVF1ZXJ5LAotCQkJCQloZWxwSWQsCi0JCQkJCWJ1aWxkTmV3TmFtZWROYXRpdmVRdWVyeUFjdGlvbihnZXRTZWxlY3Rpb25Nb2RlbCgpKQotCQkJCSk7Ci0KLQkJCQlhZGRBbGlnblJpZ2h0KGJ1dHRvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxOYW1lZE5hdGl2ZVF1ZXJ5PiBidWlsZE5hbWVkTmF0aXZlUXVlcmllc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UXVlcnlIb2xkZXIsIE5hbWVkTmF0aXZlUXVlcnk+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE5hbWVkTmF0aXZlUXVlcnk+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5uYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8TmFtZWROYXRpdmVRdWVyeT4gYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5LCBOYW1lZE5hdGl2ZVF1ZXJ5PihxdWVyeUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTmFtZWROYXRpdmVRdWVyeSB0cmFuc2Zvcm1fKFF1ZXJ5IHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWVkTmF0aXZlUXVlcnkpID8gKE5hbWVkTmF0aXZlUXVlcnkpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE5hbWVkUXVlcnk+IGJ1aWxkTmFtZWRRdWVyaWVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxRdWVyeUhvbGRlciwgTmFtZWRRdWVyeT4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlRdWVyeUhvbGRlci5OQU1FRF9RVUVSSUVTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxOYW1lZFF1ZXJ5PiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0Lm5hbWVkUXVlcmllcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QubmFtZWRRdWVyaWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPE5hbWVkUXVlcnk+IGJ1aWxkTmFtZWRRdWVyeUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeSwgTmFtZWRRdWVyeT4ocXVlcnlIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE5hbWVkUXVlcnkgdHJhbnNmb3JtXyhRdWVyeSB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lZFF1ZXJ5KSA/IChOYW1lZFF1ZXJ5KSB2YWx1ZSA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFJ1bm5hYmxlIGJ1aWxkTmV3TmFtZWROYXRpdmVRdWVyeUFjdGlvbihmaW5hbCBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgc2VsZWN0aW9uTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlhZGROYW1lZE5hdGl2ZVF1ZXJ5KHNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248TmV3TmFtZURpYWxvZz4gYnVpbGROZXdOYW1lZE5hdGl2ZVF1ZXJ5UG9zdEV4ZWN1dGlvbihmaW5hbCBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxOZXdOYW1lRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoTmV3TmFtZURpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IHN1YmplY3QoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KHN1YmplY3QoKS5uYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkpOwotCQkJCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoZGlhbG9nLmdldE5hbWUoKSk7Ci0JCQkJCXF1ZXJ5SG9sZGVyLnNldFZhbHVlKG5hbWVkTmF0aXZlUXVlcnkpOwotCQkJCQlsaXN0U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShuYW1lZE5hdGl2ZVF1ZXJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPE5ld05hbWVEaWFsb2c+IGJ1aWxkTmV3TmFtZWRRdWVyeVBvc3RFeGVjdXRpb24oZmluYWwgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHNlbGVjdGlvbk1vZGVsKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxOZXdOYW1lRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoTmV3TmFtZURpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCVF1ZXJ5IHF1ZXJ5ID0gc3ViamVjdCgpLmFkZE5hbWVkUXVlcnkoc3ViamVjdCgpLm5hbWVkUXVlcmllc1NpemUoKSk7Ci0JCQkJCXF1ZXJ5LnNldE5hbWUoZGlhbG9nLmdldE5hbWUoKSk7Ci0JCQkJCXF1ZXJ5SG9sZGVyLnNldFZhbHVlKHF1ZXJ5KTsKLQkJCQkJc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShxdWVyeSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8UXVlcnksIENvbnRyb2w+IGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPFF1ZXJ5LCBDb250cm9sPigpIHsKLQkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShRdWVyeSBxdWVyeSkgewotCi0JCQkJaWYgKHF1ZXJ5ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKHF1ZXJ5IGluc3RhbmNlb2YgTmFtZWROYXRpdmVRdWVyeSkgewotCQkJCQlyZXR1cm4gbmFtZWROYXRpdmVRdWVyeVBhbmUuZ2V0Q29udHJvbCgpOwotCQkJCX0KLQotCQkJCXJldHVybiBuYW1lZFF1ZXJ5UGFuZS5nZXRDb250cm9sKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCXByaXZhdGUgQWRhcHRlciBidWlsZFF1ZXJpZXNBZGFwdGVyKCkgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgYWRkQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWRRdWVyeTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkTmFtZWRRdWVyeShsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgewotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9lZGl0OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQllZGl0UXVlcnkobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgTmFtZWRRdWVyeSkgewotCQkJCQkJc3ViamVjdCgpLnJlbW92ZU5hbWVkUXVlcnkoKE5hbWVkUXVlcnkpIGl0ZW0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc3ViamVjdCgpLnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoKE5hbWVkTmF0aXZlUXVlcnkpIGl0ZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UXVlcnk+IGJ1aWxkUXVlcmllc0xpc3RIb2xkZXIoKSB7Ci0JCUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFF1ZXJ5Pj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFF1ZXJ5Pj4oKTsKLQkJbGlzdC5hZGQoYnVpbGROYW1lZFF1ZXJpZXNMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZE5hbWVkTmF0aXZlUXVlcmllc0xpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFF1ZXJ5PiwgUXVlcnk+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRRdWVyaWVzTGlzdExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJUXVlcnkgcXVlcnkgPSAoUXVlcnkpIGVsZW1lbnQ7Ci0JCQkJU3RyaW5nIG5hbWUgPSBxdWVyeS5nZXROYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCWludCBpbmRleCA9IC0xOwotCi0JCQkJCWlmIChxdWVyeSBpbnN0YW5jZW9mIE5hbWVkUXVlcnkpIHsKLQkJCQkJCWluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2Yoc3ViamVjdCgpLm5hbWVkUXVlcmllcygpLCBxdWVyeSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHN1YmplY3QoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKSwgcXVlcnkpOwotCQkJCQl9Ci0KLQkJCQkJbmFtZSA9IE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmcsIGluZGV4KTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5PiBidWlsZFF1ZXJ5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeT4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdFF1ZXJ5KE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlRdWVyeSBxdWVyeSA9IHF1ZXJ5SG9sZGVyLmdldFZhbHVlKCk7Ci0KLQkJTmV3TmFtZURpYWxvZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBOZXdOYW1lRGlhbG9nQnVpbGRlcihzaGVsbCgpKTsKLQkJYnVpbGRlci5zZXRMYWJlbFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJpZXNDb21wb3NpdGVfbGFiZWwpOwotCQlidWlsZGVyLnNldE5hbWUocXVlcnkuZ2V0TmFtZSgpKTsKLQotCQlpZiAocXVlcnkgaW5zdGFuY2VvZiBOYW1lZE5hdGl2ZVF1ZXJ5KSB7Ci0JCQlidWlsZGVyLnNldERpYWxvZ1RpdGxlKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZE5hdGl2ZVF1ZXJ5VGl0bGUpOwotCQkJYnVpbGRlci5zZXREZXNjcmlwdGlvbihKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWROYXRpdmVRdWVyeURlc2NyaXB0aW9uKTsKLQkJCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb25UaXRsZShKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWROYXRpdmVRdWVyeURlc2NyaXB0aW9uVGl0bGUpOwotCQkJYnVpbGRlci5zZXRFeGlzdGluZ05hbWVzKG5hbWVkTmF0aXZlUXVlcnlOYW1lcygpKTsKLQkJfQotCQllbHNlIHsKLQkJCWJ1aWxkZXIuc2V0RGlhbG9nVGl0bGUoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJpZXNDb21wb3NpdGVfZWRpdE5hbWVkUXVlcnlUaXRsZSk7Ci0JCQlidWlsZGVyLnNldERlc2NyaXB0aW9uKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZFF1ZXJ5RGVzY3JpcHRpb24pOwotCQkJYnVpbGRlci5zZXREZXNjcmlwdGlvblRpdGxlKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZFF1ZXJ5RGVzY3JpcHRpb25UaXRsZSk7Ci0JCQlidWlsZGVyLnNldEV4aXN0aW5nTmFtZXMobmFtZWRRdWVyeU5hbWVzKCkpOwotCQl9Ci0KLQkJTmV3TmFtZURpYWxvZyBkaWFsb2cgPSBidWlsZGVyLmJ1aWxkRGlhbG9nKCk7Ci0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkRWRpdE5hbWVkUXVlcnlQb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JCWxpc3RQYW5lLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQlxdWVyeUhvbGRlciA9IGJ1aWxkUXVlcnlIb2xkZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBMaXN0IHBhbmUKLQkJbGlzdFBhbmUgPSBidWlsZExpc3RQYW5lKGNvbnRhaW5lcik7Ci0KLQkJLy8gUHJvcGVydHkgcGFuZQotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gTmFtZWQgUXVlcnkgcHJvcGVydHkgcGFuZQotCQluYW1lZFF1ZXJ5UGFuZSA9IG5ldyBOYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGROYW1lZFF1ZXJ5SG9sZGVyKCksCi0JCQlwYWdlQm9vawotCQkpOwotCi0JCS8vIE5hbWVkIE5hdGl2ZSBRdWVyeSBwcm9wZXJ0eSBwYW5lCi0JCW5hbWVkTmF0aXZlUXVlcnlQYW5lID0gbmV3IE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZE5hbWVkTmF0aXZlUXVlcnlIb2xkZXIoKSwKLQkJCXBhZ2VCb29rCi0JCSk7Ci0KLQkJaW5zdGFsbFBhbmVTd2l0Y2hlcihwYWdlQm9vayk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lU3dpdGNoZXIoUGFnZUJvb2sgcGFnZUJvb2spIHsKLQkJbmV3IENvbnRyb2xTd2l0Y2hlcihxdWVyeUhvbGRlciwgYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSwgcGFnZUJvb2spOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBuYW1lZE5hdGl2ZVF1ZXJ5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxRdWVyeSwgU3RyaW5nPihzdWJqZWN0KCkubmFtZWROYXRpdmVRdWVyaWVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oUXVlcnkgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gbmFtZWRRdWVyeU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UXVlcnksIFN0cmluZz4oc3ViamVjdCgpLm5hbWVkUXVlcmllcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFF1ZXJ5IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUXVlcnlIaW50c0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9RdWVyeUhpbnRzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjM0NmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9RdWVyeUhpbnRzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVUYWJsZVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBBZGRSZW1vdmVUYWJsZVBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUXVlcnkKLSAqIEBzZWUgUXVlcnlIaW50Ci0gKiBAc2VlIEFkZFJlbW92ZVRhYmxlUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBRdWVyeUhpbnRzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPFF1ZXJ5PgotewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnlIaW50PiBxdWVyeUhpbnRIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlF1ZXJ5SGludHNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBRdWVyeUhpbnRzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgUXVlcnk+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5LCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFF1ZXJ5IHF1ZXJ5KSB7Ci0JCQkJcmV0dXJuIChxdWVyeSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRRdWVyeUhpbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZVRhYmxlUGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlRdWVyeUhpbnQgcXVlcnlIaW50ID0gc3ViamVjdCgpLmFkZEhpbnQoc3ViamVjdCgpLmhpbnRzU2l6ZSgpKTsKLQkJCQlxdWVyeUhpbnRIb2xkZXIuc2V0VmFsdWUocXVlcnlIaW50KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCXN1YmplY3QoKS5yZW1vdmVIaW50KChRdWVyeUhpbnQpIGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5SGludD4gYnVpbGRRdWVyeUhpbnRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5SGludD4oKTsKLQl9OwotCi0JcHJpdmF0ZSBJVGFibGVMYWJlbFByb3ZpZGVyIGJ1aWxkUXVlcnlIaW50TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFF1ZXJ5SGludD4gYnVpbGRRdWVyeUhpbnRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFF1ZXJ5LCBRdWVyeUhpbnQ+KGdldFN1YmplY3RIb2xkZXIoKSwgTmFtZWRRdWVyeS5ISU5UU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UXVlcnlIaW50PiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmhpbnRzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5oaW50c1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXF1ZXJ5SGludEhvbGRlciA9IGJ1aWxkUXVlcnlIaW50SG9sZGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJVGFibGVQYW5lIHRhYmxlUGFuZSA9IG5ldyBUYWJsZVBhbmUoY29udGFpbmVyKTsKLQkJaW5zdGFsbFBhbmVFbmFibGVyKHRhYmxlUGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSBQYW5lRW5hYmxlciBpbnN0YWxsUGFuZUVuYWJsZXIoVGFibGVQYW5lIHRhYmxlUGFuZSkgewotCQlyZXR1cm4gbmV3IFBhbmVFbmFibGVyKGJ1aWxkUGFuZUVuYWJsZUhvbGRlcigpLCB0YWJsZVBhbmUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIgaW1wbGVtZW50cyBDb2x1bW5BZGFwdGVyPFF1ZXJ5SGludD4gewotCi0JCXN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gMjsKLQkJc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTFVNTl9JTkRFWCA9IDA7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfQ09MVU1OX0lOREVYID0gMTsKLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFF1ZXJ5SGludCBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxRdWVyeUhpbnQsIFN0cmluZz4oUXVlcnlIaW50Lk5BTUVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IGJ1aWxkVmFsdWVIb2xkZXIoUXVlcnlIaW50IHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFF1ZXJ5SGludCwgU3RyaW5nPihRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRWYWx1ZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGNlbGxNb2RlbHMoUXVlcnlIaW50IHN1YmplY3QpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gbW9kZWxzID0gbmV3IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W0NPTFVNTl9DT1VOVF07Ci0JCQltb2RlbHNbTkFNRV9DT0xVTU5fSU5ERVhdICA9IGJ1aWxkTmFtZUhvbGRlcihzdWJqZWN0KTsKLQkJCW1vZGVsc1tWQUxVRV9DT0xVTU5fSU5ERVhdID0gYnVpbGRWYWx1ZUhvbGRlcihzdWJqZWN0KTsKLQkJCXJldHVybiBtb2RlbHM7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbHVtbkNvdW50KCkgewotCQkJcmV0dXJuIENPTFVNTl9DT1VOVDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgUXVlcnlIaW50Q29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTl9JTkRFWDogewotCQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJ5SGludHNDb21wb3NpdGVfbmFtZUNvbHVtbjsKLQkJCQl9Ci0KLQkJCQljYXNlIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIuVkFMVUVfQ09MVU1OX0lOREVYOiB7Ci0JCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcnlIaW50c0NvbXBvc2l0ZV92YWx1ZUNvbHVtbjsKLQkJCQl9Ci0KLQkJCQlkZWZhdWx0OiB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQotCQkJUXVlcnlIaW50IHF1ZXJ5SGludCA9IChRdWVyeUhpbnQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgdmFsdWUgPSAiIjsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgUXVlcnlIaW50Q29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTl9JTkRFWDogewotCQkJCQl2YWx1ZSA9IHF1ZXJ5SGludC5nZXROYW1lKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWNhc2UgUXVlcnlIaW50Q29sdW1uQWRhcHRlci5WQUxVRV9DT0xVTU5fSU5ERVg6IHsKLQkJCQkJdmFsdWUgPSBxdWVyeUhpbnQuZ2V0VmFsdWUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCXZhbHVlID0gIiI7Ci0JCQl9Ci0KLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVQYW5lIGV4dGVuZHMgQWRkUmVtb3ZlVGFibGVQYW5lPFF1ZXJ5PiB7Ci0KLQkJcHJpdmF0ZSBUYWJsZVBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoUXVlcnlIaW50c0NvbXBvc2l0ZS50aGlzLAotCQkJICAgICAgcGFyZW50LAotCQkJICAgICAgYnVpbGRRdWVyeUhpbnRBZGFwdGVyKCksCi0JCQkgICAgICBidWlsZFF1ZXJ5SGludExpc3RIb2xkZXIoKSwKLQkJCSAgICAgIHF1ZXJ5SGludEhvbGRlciwKLQkJCSAgICAgIGJ1aWxkUXVlcnlIaW50TGFiZWxQcm92aWRlcigpKTsKLQkJfQotCi0JCXByaXZhdGUgQ2VsbEVkaXRvcltdIGJ1aWxkQ2VsbEVkaXRvcnMoVGFibGUgdGFibGUpIHsKLQkJCXJldHVybiBuZXcgQ2VsbEVkaXRvcltdIHsKLQkJCQluZXcgVGV4dENlbGxFZGl0b3IodGFibGUpLAotCQkJCW5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSkKLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIElDZWxsTW9kaWZpZXIgYnVpbGRDZWxsTW9kaWZpZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IElDZWxsTW9kaWZpZXIoKSB7Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkJUXVlcnlIaW50IHF1ZXJ5SGludCA9IChRdWVyeUhpbnQpIGVsZW1lbnQ7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9ICIiOwotCi0JCQkJCWlmIChwcm9wZXJ0eSA9PSBRdWVyeUhpbnQuTkFNRV9QUk9QRVJUWSkgewotCQkJCQkJdmFsdWUgPSBxdWVyeUhpbnQuZ2V0TmFtZSgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHByb3BlcnR5ID09IFF1ZXJ5SGludC5WQUxVRV9QUk9QRVJUWSkgewotCQkJCQkJdmFsdWUgPSBxdWVyeUhpbnQuZ2V0VmFsdWUoKTsKLQkJCQkJfQotCi0JCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9ICIiOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJCQkJUXVlcnlIaW50IHF1ZXJ5SGludDsKLQotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotCQkJCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IChUYWJsZUl0ZW0pIGVsZW1lbnQ7Ci0JCQkJCQlxdWVyeUhpbnQgPSAoUXVlcnlIaW50KSB0YWJsZUl0ZW0uZ2V0RGF0YSgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcXVlcnlIaW50ID0gKFF1ZXJ5SGludCkgZWxlbWVudDsKLQkJCQkJfQotCi0JCQkJCWlmIChwcm9wZXJ0eSA9PSBRdWVyeUhpbnQuTkFNRV9QUk9QRVJUWSkgewotCQkJCQkJIHF1ZXJ5SGludC5zZXROYW1lKHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHByb3BlcnR5ID09IFF1ZXJ5SGludC5WQUxVRV9QUk9QRVJUWSkgewotCQkJCQkJIHF1ZXJ5SGludC5zZXRWYWx1ZSh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbHVtbkFkYXB0ZXI8Pz4gYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQkJcmV0dXJuIG5ldyBRdWVyeUhpbnRDb2x1bW5BZGFwdGVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkQ29sdW1uUHJvcGVydGllcygpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJCVF1ZXJ5SGludC5OQU1FX1BST1BFUlRZLAotCQkJCVF1ZXJ5SGludC5WQUxVRV9QUk9QRVJUWQotCQkJfTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFpbkNvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQkJc3VwZXIuaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoCi0JCQkJY29udGFpbmVyLAotCQkJCWFkYXB0ZXIsCi0JCQkJbGlzdEhvbGRlciwKLQkJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQkJbGFiZWxQcm92aWRlciwKLQkJCQloZWxwSWQKLQkJCSk7Ci0KLQkJCVRhYmxlIHRhYmxlID0gZ2V0TWFpbkNvbnRyb2woKTsKLQotCQkJVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQkJdGFibGVWaWV3ZXIuc2V0Q2VsbEVkaXRvcnMoYnVpbGRDZWxsRWRpdG9ycyh0YWJsZSkpOwotCQkJdGFibGVWaWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKGJ1aWxkQ2VsbE1vZGlmaWVyKCkpOwotCQkJdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhidWlsZENvbHVtblByb3BlcnRpZXMoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDhiYjNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgU2Vjb25kYXJ5VGFibGVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLy9pZiBjcmVhdGluZyBhIG5ldyBTZWNvbmRhcnlUYWJsZSwgdGhpcyB3aWxsIGJlIG51bGwsCi0JLy9zcGVjaWZ5ICdkZWZhdWx0U2NoZW1hJyBhbmQgJ2RlZmF1bHRDYXRhbG9nJyBpbnN0ZWFkIGluIHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvcgotCXByaXZhdGUgU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGU7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFNjaGVtYTsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKLQkKLQlwcm90ZWN0ZWQgQ29tYm8gbmFtZUNvbWJvOwotCXByb3RlY3RlZCBDb21ibyBjYXRhbG9nQ29tYm87Ci0JcHJvdGVjdGVkIENvbWJvIHNjaGVtYUNvbWJvOwotCi0JcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWROYW1lOwotCXByaXZhdGUgU3RyaW5nIHNlbGVjdGVkU2NoZW1hOwotCXByaXZhdGUgU3RyaW5nIHNlbGVjdGVkQ2F0YWxvZzsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0U2NoZW1hU2VsZWN0ZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRDYXRhbG9nU2VsZWN0ZWQ7Ci0KLQlwdWJsaWMgU2Vjb25kYXJ5VGFibGVEaWFsb2coU2hlbGwgcGFyZW50LCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIFN0cmluZyBkZWZhdWx0U2NoZW1hLCBTdHJpbmcgZGVmYXVsdENhdGFsb2cpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gZGVmYXVsdFNjaGVtYTsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IGRlZmF1bHRDYXRhbG9nOwotCX0KLQotCXB1YmxpYyBTZWNvbmRhcnlUYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsIFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlLCBKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlOwotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpIHsKLQkJUG9pbnQgc2l6ZSA9IHN1cGVyLmdldEluaXRpYWxTaXplKCk7Ci0JCXNpemUueCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRUaXRsZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCQlpZiAodGhpcy5zZWNvbmRhcnlUYWJsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2VkaXRTZWNvbmRhcnlUYWJsZTsKLQkJfQotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZFNlY29uZGFyeVRhYmxlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCi0JCUxhYmVsIG5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJbmFtZUxhYmVsLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX25hbWUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5uYW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMubmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlwb3B1bGF0ZU5hbWVDb21ibygpOwotCi0JCUxhYmVsIGNhdGFsb2dMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJY2F0YWxvZ0xhYmVsLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2NhdGFsb2cpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQljYXRhbG9nTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5jYXRhbG9nQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMuY2F0YWxvZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlwb3B1bGF0ZUNhdGFsb2dDb21ibygpOwotCi0JCUxhYmVsIHNjaGVtYUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlzY2hlbWFMYWJlbC5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19zY2hlbWEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlzY2hlbWFMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLnNjaGVtYUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLnNjaGVtYUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlwb3B1bGF0ZVNjaGVtYUNvbWJvKCk7Ci0KLQkJCi0JCXRoaXMuc2NoZW1hQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVwb3B1bGF0ZU5hbWVDb21ibygpOwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVwb3B1bGF0ZU5hbWVDb21ibygpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCXJldHVybiAoY3AgPT0gbnVsbCkgPyBudWxsIDogY3AuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXRTY2hlbWFOYW1lZChTdHJpbmcgbmFtZSkgewotCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJcmV0dXJuIChkYiA9PSBudWxsKSA/IG51bGwgOiBkYi5nZXRTY2hlbWFOYW1lZChuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2NoZW1hIGdldERlZmF1bHRUYWJsZVNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hTmFtZWQodGhpcy5nZXREZWZhdWx0VGFibGVTY2hlbWFOYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlU2NoZW1hTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNlY29uZGFyeVRhYmxlICE9IG51bGwpID8gdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkgOiB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JfQotCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXRUYWJsZVNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hTmFtZWQodGhpcy5nZXRUYWJsZVNjaGVtYU5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJsZVNjaGVtYU5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5zZWNvbmRhcnlUYWJsZSAhPSBudWxsKSA/IHRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkgOiB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOYW1lQ29tYm8oKSB7Ci0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFRhYmxlU2NoZW1hKCk7Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJZm9yIChTdHJpbmcgbmFtZSA6IENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQoc2NoZW1hLnRhYmxlTmFtZXMoKSkpIHsKLQkJCQl0aGlzLm5hbWVDb21iby5hZGQobmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGhpcy5zZWNvbmRhcnlUYWJsZSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCXRoaXMubmFtZUNvbWJvLnNldFRleHQodGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVwb3B1bGF0ZU5hbWVDb21ibygpIHsKLQkJU3RyaW5nIG5hbWVUZXh0ID0gdGhpcy5uYW1lQ29tYm8uZ2V0VGV4dCgpOwotCQl0aGlzLm5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQkJCi0JCVNjaGVtYSBzY2hlbWEgPSBudWxsOwotCQlpZiAodGhpcy5zY2hlbWFDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDApIHsKLQkJCXNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdFRhYmxlU2NoZW1hKCk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5zY2hlbWFDb21iby5nZXRUZXh0KCkgIT0gbnVsbCkgewotCQkJc2NoZW1hID0gdGhpcy5nZXRTY2hlbWFOYW1lZCh0aGlzLnNjaGVtYUNvbWJvLmdldFRleHQoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzY2hlbWEgPSB0aGlzLmdldFRhYmxlU2NoZW1hKCk7Ci0JCX0KLQkJCi0JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJZm9yIChTdHJpbmcgbmFtZSA6IENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQoc2NoZW1hLnRhYmxlTmFtZXMoKSkpIHsKLQkJCQl0aGlzLm5hbWVDb21iby5hZGQobmFtZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXRoaXMubmFtZUNvbWJvLnNldFRleHQobmFtZVRleHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNjaGVtYUNvbWJvKCkgewotCQlTdHJpbmcgZGVmYXVsdFNjaGVtYU5hbWUgPSB0aGlzLmdldERlZmF1bHRUYWJsZVNjaGVtYU5hbWUoKTsKLQkJaWYgKGRlZmF1bHRTY2hlbWFOYW1lICE9IG51bGwpIHsKLQkJCXRoaXMuc2NoZW1hQ29tYm8uYWRkKE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19kZWZhdWx0U2NoZW1hLCBkZWZhdWx0U2NoZW1hTmFtZSkpOwotCQl9Ci0JCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCi0JCWlmIChkYXRhYmFzZSAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0cmluZyBuYW1lIDogQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldChkYXRhYmFzZS5zY2hlbWFOYW1lcygpKSkgewotCQkJCXRoaXMuc2NoZW1hQ29tYm8uYWRkKG5hbWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRoaXMuc2Vjb25kYXJ5VGFibGUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuc2NoZW1hQ29tYm8uc2V0VGV4dCh0aGlzLnNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuc2NoZW1hQ29tYm8uc2VsZWN0KDApOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zY2hlbWFDb21iby5zZWxlY3QoMCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRUYWJsZUNhdGFsb2dOYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuc2Vjb25kYXJ5VGFibGUgIT0gbnVsbCkgPyB0aGlzLnNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRDYXRhbG9nKCkgOiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQ2F0YWxvZ0NvbWJvKCkgewotCQlTdHJpbmcgZGVmYXVsdENhdGFsb2dOYW1lID0gdGhpcy5nZXREZWZhdWx0VGFibGVDYXRhbG9nTmFtZSgpOwotCQlpZiAoZGVmYXVsdENhdGFsb2dOYW1lICE9IG51bGwpIHsKLQkJCXRoaXMuY2F0YWxvZ0NvbWJvLmFkZChOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdENhdGFsb2csIGRlZmF1bHRDYXRhbG9nTmFtZSkpOwotCQl9Ci0KLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmdldERhdGFiYXNlKCk7Ci0KLQkJaWYgKGRhdGFiYXNlICE9IG51bGwpIHsKLQkJCWZvciAoU3RyaW5nIG5hbWUgOiBDb2xsZWN0aW9uVG9vbHMuc29ydGVkU2V0KGRhdGFiYXNlLmNhdGFsb2dOYW1lcygpKSkgewotCQkJCXRoaXMuY2F0YWxvZ0NvbWJvLmFkZChuYW1lKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0aGlzLnNlY29uZGFyeVRhYmxlICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jYXRhbG9nQ29tYm8uc2V0VGV4dCh0aGlzLnNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNhdGFsb2dDb21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNhdGFsb2dDb21iby5zZWxlY3QoMCk7CQkJCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gZ2V0TmFtZUNvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lQ29tYm87Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGdldFNjaGVtYUNvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFDb21ibzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gZ2V0Q2F0YWxvZ0NvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nQ29tYm87Ci0JfQotCi0JcHJvdGVjdGVkIFNlY29uZGFyeVRhYmxlIGdldFNlY29uZGFyeVRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkQ2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZFNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRTY2hlbWFTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYVNlbGVjdGVkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdENhdGFsb2dTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENhdGFsb2dTZWxlY3RlZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJdGhpcy5zZWxlY3RlZE5hbWUgPSB0aGlzLm5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCXRoaXMuc2VsZWN0ZWRTY2hlbWEgPSB0aGlzLnNjaGVtYUNvbWJvLmdldFRleHQoKTsKLQkJaWYgKHRoaXMuc2VsZWN0ZWRTY2hlbWEuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnNlbGVjdGVkU2NoZW1hID0gbnVsbDsKLQkJfQotCQl0aGlzLnNlbGVjdGVkQ2F0YWxvZyA9IHRoaXMuY2F0YWxvZ0NvbWJvLmdldFRleHQoKTsKLQkJaWYgKHRoaXMuc2VsZWN0ZWRDYXRhbG9nLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5zZWxlY3RlZENhdGFsb2cgPSBudWxsOwotCQl9Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYVNlbGVjdGVkID0gdGhpcy5zY2hlbWFDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDA7Ci0JCXRoaXMuZGVmYXVsdENhdGFsb2dTZWxlY3RlZCA9IHRoaXMuY2F0YWxvZ0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMDsKLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWEwMzM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9ySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuU2VxdWVuY2VDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICAgICAgICAgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU2VxdWVuY2UgR2VuZXJhdG9yOiB8IFNlcXVlbmNlQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQWxsb2NhdGlvbiBTaXplOiAgICB8IEkgICAgICAgfEl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgSW5pdGlhbCBWYWx1ZTogICAgICB8ICAgICAgICAgfEl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIElkTWFwcGluZwotICogQHNlZSBTZXF1ZW5jZUdlbmVyYXRvcgotICogQHNlZSBHZW5lcmF0aW9uQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgU2VxdWVuY2VDb21ibwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUgZXh0ZW5kcyBHZW5lcmF0b3JDb21wb3NpdGU8U2VxdWVuY2VHZW5lcmF0b3I+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBHZW5lcmF0b3JIb2xkZXI+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTZXF1ZW5jZUdlbmVyYXRvciBidWlsZEdlbmVyYXRvcihHZW5lcmF0b3JIb2xkZXIgc3ViamVjdCkgewotCQlyZXR1cm4gc3ViamVjdC5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JIb2xkZXIsIFNlcXVlbmNlR2VuZXJhdG9yPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvckhvbGRlci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZXF1ZW5jZUNvbWJvPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlTmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IFNlcXVlbmNlQ29tYm88U2VxdWVuY2VHZW5lcmF0b3I+KHRoaXMsIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoKSwgcGFyZW50KSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9TRVFVRU5DRV9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTZXF1ZW5jZUdlbmVyYXRvci5TUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYnVpbGRTdWJqZWN0KCkgewotCQkJCVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuYnVpbGRHZW5lcmF0b3IoCi0JCQkJCVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuc3ViamVjdCgpCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1aWxkU3ViamVjdEFsbG93ZWQoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QganBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5qcGFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNjaGVtYSBzY2hlbWEoKSB7Ci0JCQkJLy8gVE9ETwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJU2VxdWVuY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZ2VuZXJhdG9yKCk7Ci0KLQkJCQlpZiAoZ2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGdlbmVyYXRvci5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3IgZ2VuZXJhdG9yKEdlbmVyYXRvckhvbGRlciBzdWJqZWN0KSB7Ci0JCXJldHVybiBzdWJqZWN0LmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTmFtZSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfbmFtZSwKLQkJCWJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfTkFNRQotCQkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZSwKLQkJCWJ1aWxkU2VxdWVuY2VOYW1lQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SX1NFUVVFTkNFCi0JCSk7Ci0KLQkJLy8gQWxsb2NhdGlvbiBTaXplIHdpZGdldHMKLQkJaW5pdGlhbGl6ZUFsbG9jYXRpb25TaXplV2lkZ2V0cyhjb250YWluZXIpOwotCi0JCS8vIEluaXRpYWwgVmFsdWUgd2lkZ2V0cwotCQlpbml0aWFsaXplSW5pdGlhbFZhbHVlV2lkZ2V0cyhjb250YWluZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgcHJvcGVydHlOYW1lKCkgewotCQlyZXR1cm4gR2VuZXJhdG9ySG9sZGVyLlNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmJkY2FkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYi5DYXRhbG9nQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiLlNjaGVtYUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYi5UYWJsZUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIFRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgVGFibGU6ICAgfCBUYWJsZUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8ICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgQ2F0YWxvZzogfCBDYXRhbG9nQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8ICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgU2NoZW1hOiAgfCBTY2hlbWFDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8ICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgVGFibGUKLSAqIEBzZWUgRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgVGFibGVDb21ibwotICogQHNlZSBDYXRhbG9nQ29tYm8KLSAqIEBzZWUgU2NoZW1hQ29tYm8KLSAqCi0gKiBAVE9ETyByZXBvcHVsYXRlIHRoaXMgcGFuZWwgYmFzZWQgb24gdGhlIEVudGl0eSB0YWJsZSBjaGFuZ2luZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFibGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPFRhYmxlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUYWJsZUNvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JVGFibGU8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgVGFibGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUYWJsZT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIENhdGFsb2dDb21ibzxUYWJsZT4gYnVpbGRDYXRhbG9nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2F0YWxvZ0NvbWJvPFRhYmxlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZENhdGFsb2codmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTY2hlbWFDb21ibzxUYWJsZT4gYnVpbGRTY2hlbWFDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBTY2hlbWFDb21ibzxUYWJsZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRTY2hlbWEodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlQ29tYm88VGFibGU+IGJ1aWxkVGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBUYWJsZUNvbWJvPFRhYmxlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCQlpZiAocHJvcGVydHlOYW1lID09IFRhYmxlLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZIAotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGUuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWQotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGUuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSApIHsKLQkJCQkJcmVwb3B1bGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBzY2hlbWFOYW1lKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZE5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgdGFibGUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBUYWJsZSBncm91cCBwYW5lCi0JCUdyb3VwIHRhYmxlR3JvdXBQYW5lID0gYnVpbGRUaXRsZWRQYW5lKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX3RhYmxlU2VjdGlvbgotCQkpOwotCi0JCS8vIFRhYmxlIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJdGFibGVHcm91cFBhbmUsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVDaG9vc2VyX2xhYmVsLAotCQkJYnVpbGRUYWJsZUNvbWJvKHRhYmxlR3JvdXBQYW5lKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9UQUJMRQotCQkpOwotCi0JCS8vIENhdGFsb2cgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQl0YWJsZUdyb3VwUGFuZSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5DYXRhbG9nQ2hvb3Nlcl9sYWJlbCwKLQkJCWJ1aWxkQ2F0YWxvZ0NvbWJvKHRhYmxlR3JvdXBQYW5lKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9DQVRBTE9HCi0JCSk7Ci0KLQkJLy8gU2NoZW1hIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJdGFibGVHcm91cFBhbmUsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2NoZW1hQ2hvb3Nlcl9sYWJlbCwKLQkJCWJ1aWxkU2NoZW1hQ29tYm8odGFibGVHcm91cFBhbmUpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX1NDSEVNQQotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3M2U0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiLkNhdGFsb2dDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuQ29sdW1uQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiLlNjaGVtYUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYi5UYWJsZUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBOYW1lOiAgICAgICAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBUYWJsZTogICAgICAgICAgICAgICAgICAgIHwgVGFibGVDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBDYXRhbG9nOiAgICAgICAgICAgICAgICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBTY2hlbWE6ICAgICAgICAgICAgICAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBQcmltYXJ5IEtleSBDb2x1bW46ICAgICAgIHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBWYWx1ZSBDb2x1bW46ICAgICAgICAgICAgIHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBQcmltYXJ5IEtleSBDb2x1bW4gVmFsdWU6IHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBBbGxvY2F0aW9uIFNpemU6ICAgICAgICAgIHwgSSAgICAgICB8SXwgIERlZmF1bHQgKFhYWCkgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBJbml0aWFsIFZhbHVlOiAgICAgICAgICAgIHwgSSAgICAgICB8SXwgIERlZmF1bHQgKFhYWCkgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgSWRNYXBwaW5nCi0gKiBAc2VlIFRhYmxlR2VuZXJhdG9yCi0gKiBAc2VlIEdlbmVyYXRpb25Db21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDYXRhbG9nQ29tYm8KLSAqIEBzZWUgQ29sdW1uQ29tYm8KLSAqIEBzZWUgU2NoZW1hQ29tYm8KLSAqIEBzZWUgVGFibGVDb21ibwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUgZXh0ZW5kcyBHZW5lcmF0b3JDb21wb3NpdGU8VGFibGVHZW5lcmF0b3I+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBHZW5lcmF0b3JIb2xkZXI+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQ2F0YWxvZ0NvbWJvPFRhYmxlR2VuZXJhdG9yPiBidWlsZENhdGFsb2dDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDYXRhbG9nQ29tYm88VGFibGVHZW5lcmF0b3I+KHRoaXMsIGJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKSwgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYnVpbGRTdWJqZWN0KCkgewotCQkJCVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuYnVpbGRHZW5lcmF0b3IoCi0JCQkJCVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuc3ViamVjdCgpCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNCdWlsZFN1YmplY3RBbGxvd2VkKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuanBhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUYWJsZUdlbmVyYXRvciBidWlsZEdlbmVyYXRvcihHZW5lcmF0b3JIb2xkZXIgc3ViamVjdCkgewotCQlyZXR1cm4gc3ViamVjdC5hZGRUYWJsZUdlbmVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgQ29sdW1uQ29tYm88VGFibGVHZW5lcmF0b3I+IGJ1aWxkUGtDb2x1bW5OYW1lQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXJldHVybiBuZXcgQ29sdW1uQ29tYm88VGFibGVHZW5lcmF0b3I+KHRoaXMsIGJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKSwgcGFyZW50KSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBidWlsZFN1YmplY3QoKSB7Ci0JCQkJVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5idWlsZEdlbmVyYXRvcigKLQkJCQkJVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5zdWJqZWN0KCkKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGlzQnVpbGRTdWJqZWN0QWxsb3dlZCgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBqcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmpwYVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgZ2V0REJUYWJsZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sdW1uQ29tYm88VGFibGVHZW5lcmF0b3I+IGJ1aWxkUGtDb2x1bW5WYWx1ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPFRhYmxlR2VuZXJhdG9yPih0aGlzLCBidWlsZFRhYmxlR2VuZXJhdG9ySG9sZGVyKCksIHBhcmVudCkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBidWlsZFN1YmplY3QoKSB7Ci0JCQkJVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5idWlsZEdlbmVyYXRvcigKLQkJCQkJVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5zdWJqZWN0KCkKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1aWxkU3ViamVjdEFsbG93ZWQoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QganBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5qcGFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSBnZXREQlRhYmxlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2NoZW1hQ29tYm88VGFibGVHZW5lcmF0b3I+IGJ1aWxkU2NoZW1hQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgU2NoZW1hQ29tYm88VGFibGVHZW5lcmF0b3I+KHRoaXMsIGJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKSwgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGJ1aWxkU3ViamVjdCgpIHsKLQkJCQlUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmJ1aWxkR2VuZXJhdG9yKAotCQkJCQlUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLnN1YmplY3QoKQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNCdWlsZFN1YmplY3RBbGxvd2VkKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuanBhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRTY2hlbWEodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxUYWJsZUdlbmVyYXRvcj4gYnVpbGRUYWJsZUdlbmVyYXRvckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9ySG9sZGVyLCBUYWJsZUdlbmVyYXRvcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3JIb2xkZXIuVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZUdlbmVyYXRvciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVGFibGVDb21ibzxUYWJsZUdlbmVyYXRvcj4gYnVpbGRUYWJsZU5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBUYWJsZUNvbWJvPFRhYmxlR2VuZXJhdG9yPih0aGlzLCBidWlsZFRhYmxlR2VuZXJhdG9ySG9sZGVyKCksIHBhcmVudCkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfVEFCTEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSAKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWQotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgKSB7Ci0JCQkJCXJlcG9wdWxhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYnVpbGRTdWJqZWN0KCkgewotCQkJCVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuYnVpbGRHZW5lcmF0b3IoCi0JCQkJCVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuc3ViamVjdCgpCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGlzQnVpbGRTdWJqZWN0QWxsb3dlZCgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBqcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmpwYVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHNjaGVtYU5hbWUoKSB7Ci0JCQkJaWYgKHN1YmplY3QoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U2NoZW1hKCk7Ci0JCQkJfQotCQkJCWlmIChUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLnN1YmplY3QoKS5nZXRFbnRpdHlNYXBwaW5ncygpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuc3ViamVjdCgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCk7Ci0JCQkJfQotCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLnN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZFRhYmxlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgdGFibGUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZFRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5Db21ibzxUYWJsZUdlbmVyYXRvcj4gYnVpbGRWYWx1ZUNvbHVtbkNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPFRhYmxlR2VuZXJhdG9yPih0aGlzLCBidWlsZFRhYmxlR2VuZXJhdG9ySG9sZGVyKCksIHBhcmVudCkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYnVpbGRTdWJqZWN0KCkgewotCQkJCVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuYnVpbGRHZW5lcmF0b3IoCi0JCQkJCVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuc3ViamVjdCgpCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1aWxkU3ViamVjdEFsbG93ZWQoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QganBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5qcGFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlIGdldERCVGFibGVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGFibGVHZW5lcmF0b3IgZ2VuZXJhdG9yKEdlbmVyYXRvckhvbGRlciBzdWJqZWN0KSB7Ci0JCXJldHVybiAoc3ViamVjdCAhPSBudWxsKSA/IHN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTmFtZSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfbmFtZSwKLQkJCWJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfTkFNRQotCQkpOwotCi0JCS8vIFRhYmxlIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlLAotCQkJYnVpbGRUYWJsZU5hbWVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfVEFCTEUKLQkJKTsKLQotCQkvLyBTY2hlbWEgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfc2NoZW1hLAotCQkJYnVpbGRTY2hlbWFDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfU0NIRU1BCi0JCSk7Ci0KLQkJLy8gQ2F0YWxvZyB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9jYXRhbG9nLAotCQkJYnVpbGRDYXRhbG9nQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX0NBVEFMT0cKLQkJKTsKLQotCQkvLyBQcmltYXJ5IEtleSBDb2x1bW4gd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfcGtDb2x1bW4sCi0JCQlidWlsZFBrQ29sdW1uTmFtZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9QUklNQVJZX0tFWV9DT0xVTU4KLQkJKTsKLQotCQkvLyBWYWx1ZSBDb2x1bW4gd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdmFsdWVDb2x1bW4sCi0JCQlidWlsZFZhbHVlQ29sdW1uQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1ZBTFVFX0NPTFVNTgotCQkpOwotCi0JCS8vIFByaW1hcnkgS2V5IENvbHVtbiBWYWx1ZSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlLAotCQkJYnVpbGRQa0NvbHVtblZhbHVlQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1BSSU1BUllfS0VZX0NPTFVNTl9WQUxVRQotCQkpOwotCi0JCS8vIEFsbG9jYXRpb24gU2l6ZSB3aWRnZXRzCi0JCWluaXRpYWxpemVBbGxvY2F0aW9uU2l6ZVdpZGdldHMoY29udGFpbmVyKTsKLQotCQkvLyBJbml0aWFsIFZhbHVlIHdpZGdldHMKLQkJaW5pdGlhbGl6ZUluaXRpYWxWYWx1ZVdpZGdldHMoY29udGFpbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuIEdlbmVyYXRvckhvbGRlci5UQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGFyZ2V0RW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhcmdldEVudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGYwM2Q4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGFyZ2V0RW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBUYXJnZXQgRW50aXR5OiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgwq/Cr8Kvwq/Cr8Kvwq/Cr8Kvwq/Cr8Kvwq/CryAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBSZWxhdGlvbnNoaXBNYXBwaW5nCi0gKiBAc2VlIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFyZ2V0RW50aXR5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxSZWxhdGlvbnNoaXBNYXBwaW5nPgotewotCXByaXZhdGUgQ0NvbWJvIGNvbWJvOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYXJnZXRFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRhcmdldEVudGl0eUNvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYXJnZXRFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JUmVsYXRpb25zaGlwTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBUYXJnZXRFbnRpdHlDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWxhdGlvbnNoaXBNYXBwaW5nLkRFRkFVTFRfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFJlbGF0aW9uc2hpcE1hcHBpbmcuU1BFQ0lGSUVEX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRPcGVuVGFyZ2V0RW50aXR5QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRhcmdldEVudGl0eUNvbXBvc2l0ZS50aGlzLm9wZW5FZGl0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkT3BlblR5cGVBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoY29tYm8uZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWRvT3BlblNlbGVjdGlvbkRpYWxvZygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBidWlsZFRhcmdldEVudGl0eU1vZGlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlDQ29tYm8gY29tYm8gPSAoQ0NvbWJvKSBlLndpZGdldDsKLQkJCQkJaWYgKGNvbWJvLmdldERhdGEoInBvcHVsYXRpbmciKSAhPSBCb29sZWFuLlRSVUUpIHsvL2NoZWNrICFUUlVFIGJlY2F1c2UgbnVsbCBpcyBhIHBvc3NpYmlsaXR5IGFzIHdlbGwKLQkJCQkJCXZhbHVlQ2hhbmdlZChjb21iby5nZXRUZXh0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkVGFyZ2V0RW50aXR5U2VsZWN0aW9uQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGJ1aWxkUHVzaEJ1dHRvbigKLQkJCXBhcmVudCwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYXJnZXRFbnRpdHlDaG9vc2VyX2Jyb3dzZSwKLQkJCWJ1aWxkT3BlblR5cGVBY3Rpb24oKQotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb09wZW5TZWxlY3Rpb25EaWFsb2coKSB7Ci0JCVNlbGVjdGlvbkRpYWxvZyBkaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCWRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCWdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCksCi0JCQkJU2VhcmNoRW5naW5lLmNyZWF0ZVdvcmtzcGFjZVNjb3BlKCksCi0JCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0FMTF9UWVBFUywKLQkJCQlmYWxzZQotCQkJKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWRpYWxvZy5zZXRUaXRsZShKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9zZWxlY3RUeXBlVGl0bGUpOwotCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJSVR5cGUgdHlwZSA9IChJVHlwZSkgZGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQkJdGhpcy5jb21iby5zZXRUZXh0KHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb21ibyA9IGJ1aWxkRWRpdGFibGVDQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYXJnZXRFbnRpdHlDaG9vc2VyX2RlZmF1bHRFbXB0eSk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGJ1aWxkVGFyZ2V0RW50aXR5TW9kaWZ5TGlzdGVuZXIoKSk7Ci0KLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQotCQlIeXBlcmxpbmsgbGFiZWxMaW5rID0gYnVpbGRIeXBlckxpbmsoY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhcmdldEVudGl0eUNob29zZXJfbGFiZWwsCi0JCQlidWlsZE9wZW5UYXJnZXRFbnRpdHlBY3Rpb24oKQotCQkpOwotCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsTGluaywKLQkJCWNvbWJvLAotCQkJYnVpbGRUYXJnZXRFbnRpdHlTZWxlY3Rpb25CdXR0b24oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFSR0VUX0VOVElUWQotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKCkgewotCi0JCVN0cmluZyB0YXJnZXRFbnRpdHkgPSBzdWJqZWN0KCkuZ2V0VGFyZ2V0RW50aXR5KCk7Ci0KLQkJaWYgKHRhcmdldEVudGl0eSAhPSBudWxsKSB7Ci0KLQkJCXRyeSB7Ci0JCQkJSVR5cGUgdHlwZSA9IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh0YXJnZXRFbnRpdHkpOwotCi0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSB0eXBlLmdldFBhcmVudCgpOwotCQkJCQlKYXZhVUkub3BlbkluRWRpdG9yKGphdmFFbGVtZW50LCB0cnVlLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbWJvKCkgewotCi0JCWNvbWJvLnJlbW92ZUFsbCgpOwotCQlwb3B1bGF0ZURlZmF1bHRWYWx1ZSgpOwotCQkvLyBUT0RPIEFkZCBwb3NzaWJsZSB0YXJnZXQgZW50aXR5IG5hbWVzCi0JCXVwZGF0ZVNlbGVjdGVkSXRlbSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGRlZmF1bHQgdmFsdWUgdG8gdGhlIGNvbWJvIGlmIG9uZSBleGlzdHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGVmYXVsdFZhbHVlKCkgewotCi0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgZW50aXR5ID0gc3ViamVjdCgpOwotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gKGVudGl0eSAhPSBudWxsKSA/IGVudGl0eS5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkgOiBudWxsOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJY29tYm8uYWRkKE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYXJnZXRFbnRpdHlDaG9vc2VyX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpKTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbWJvLmFkZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9kZWZhdWx0RW1wdHkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0KLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBSZWxhdGlvbnNoaXBNYXBwaW5nLkRFRkFVTFRfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSB8fAotCQkgICAgcHJvcGVydHlOYW1lID09IFJlbGF0aW9uc2hpcE1hcHBpbmcuU1BFQ0lGSUVEX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFkpIHsKLQotCQkJcG9wdWxhdGVDb21ibygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc2VsZWN0ZWQgaXRlbSBieSBzZWxlY3RlZCB0aGUgY3VycmVudCB2YWx1ZSwgaWYgbm90Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIG9yIHNlbGVjdCB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBvbmUgaXMgYXZhaWxhYmxlLAotCSAqIG90aGVyd2lzZSByZW1vdmUgdGhlIHNlbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gSXQgc2VlbXMgdGhlIHRleHQgY2FuIGJlIHNob3duIGFzIHRydW5jYXRlZCwgY2hhbmdpbmcgdGhlCi0JICogc2VsZWN0aW9uIHRvICgwLCAwKSBtYWtlcyB0aGUgZW50aXJlIHRleHQgdmlzaWJsZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0ZWRJdGVtKCkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHN1YmplY3QgPSBzdWJqZWN0KCk7Ci0JCVN0cmluZyB2YWx1ZSA9IChzdWJqZWN0ICE9IG51bGwpID8gc3ViamVjdC5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSA6IG51bGw7Ci0KLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWNvbWJvLnNldFRleHQodmFsdWUpOwotCQkJY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCAwKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gKHN1YmplY3QgIT0gbnVsbCkgPyBzdWJqZWN0LmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSA6IG51bGw7Ci0JCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYXJnZXRFbnRpdHlDaG9vc2VyX2RlZmF1bHRFbXB0eTsKLQotCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJZGlzcGxheVN0cmluZyA9IE5MUy5iaW5kKAotCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJCWRlZmF1bHRWYWx1ZQotCQkJCSk7Ci0JCQl9Ci0KLQkJCS8vIFNlbGVjdGVkIHRoZSBkZWZhdWx0IHZhbHVlCi0JCQlpZiAoZGlzcGxheVN0cmluZyAhPSBudWxsKSB7Ci0JCQkJY29tYm8uc2VsZWN0KDApOwotCQkJCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgMCkpOwotCQkJfQotCQkJLy8gUmVtb3ZlIHRoZSBzZWxlY3Rpb24KLQkJCWVsc2UgewotCQkJCWNvbWJvLnNlbGVjdCgtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyB2YWx1ZSkgewotCi0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgc3ViamVjdCA9IHN1YmplY3QoKTsKLQkJU3RyaW5nIG9sZFZhbHVlID0gKHN1YmplY3QgIT0gbnVsbCkgPyBzdWJqZWN0LmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpIDogbnVsbDsKLQotCQkvLyBDaGVjayBmb3IgbnVsbCB2YWx1ZQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh2YWx1ZSkpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkob2xkVmFsdWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gVGhlIGRlZmF1bHQgdmFsdWUKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYKLQkJICAgIGNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCAmJgotCQkgICAgdmFsdWUuZXF1YWxzKGNvbWJvLmdldEl0ZW0oMCkpKQotCQl7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQotCQkvLyBOb3RoaW5nIHRvIGNoYW5nZQotCQlpZiAoKG9sZFZhbHVlID09IHZhbHVlKSAmJiB2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBTZXQgdGhlIG5ldyB2YWx1ZQotCQlpZiAoKHZhbHVlICE9IG51bGwpICYmIChvbGRWYWx1ZSA9PSBudWxsKSB8fAotCQkgICAoKG9sZFZhbHVlICE9IG51bGwpICYmICFvbGRWYWx1ZS5lcXVhbHModmFsdWUpKSkgewotCi0JCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCQl0cnkgewotCQkJCXN1YmplY3Quc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KHZhbHVlKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGVtcG9yYWxUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RlbXBvcmFsVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWYzZTBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGVtcG9yYWxUeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgVGVtcG9yYWw6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIENvbHVtbk1hcHBpbmcKLSAqIEBzZWUgVGVtcG9yYWxUeXBlCi0gKiBAc2VlIEJhc2ljTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBJZE1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8Q29sdW1uTWFwcGluZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZW1wb3JhbFR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBDb2x1bW5NYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUZW1wb3JhbFR5cGU+IGJ1aWxkU29ydGVkVGVtcG9yYWxUeXBlTGlzdEhvbGRlcigpIHsKLQkJTGlzdDxUZW1wb3JhbFR5cGU+IHR5cGVzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoVGVtcG9yYWxUeXBlLnZhbHVlcygpKTsKLQkJQ29sbGVjdGlvbnMuc29ydCh0eXBlcywgYnVpbGRUZW1wb3JhbFR5cGVDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFRlbXBvcmFsVHlwZT4odHlwZXMpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxUZW1wb3JhbFR5cGU+IGJ1aWxkVGVtcG9yYWxUeXBlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFRlbXBvcmFsVHlwZT4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVGVtcG9yYWxUeXBlIHR5cGUxLCBUZW1wb3JhbFR5cGUgdHlwZTIpIHsKLQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzEgPSBkaXNwbGF5U3RyaW5nKHR5cGUxKTsKLQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzIgPSBkaXNwbGF5U3RyaW5nKHR5cGUyKTsKLQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGRpc3BsYXlTdHJpbmcxLCBkaXNwbGF5U3RyaW5nMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8VGVtcG9yYWxUeXBlPiBidWlsZFRlbXBvcmFsVHlwZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8VGVtcG9yYWxUeXBlPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFRlbXBvcmFsVHlwZSB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBKcHRVaU1lc3NhZ2VzLkVudW1Db21ib1ZpZXdlcl9kZWZhdWx0OwotCQkJCX0KLQkJCQlyZXR1cm4gZGlzcGxheVN0cmluZyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZW1wb3JhbFR5cGU+IGJ1aWxkVGVtcG9yYWxUeXBlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW5NYXBwaW5nLCBUZW1wb3JhbFR5cGU+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uTWFwcGluZy5URU1QT1JBTF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFRlbXBvcmFsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFRlbXBvcmFsVHlwZSB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0VGVtcG9yYWwodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGVtcG9yYWxUeXBlPiBidWlsZFRlbXBvcmFsVHlwZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VGVtcG9yYWxUeXBlPigKLQkJCShUZW1wb3JhbFR5cGUpIG51bGwsCi0JCQlidWlsZFNvcnRlZFRlbXBvcmFsVHlwZUxpc3RIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRpc3BsYXlTdHJpbmcoVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSkgewotCQlyZXR1cm4gU1dUVXRpbC5idWlsZERpc3BsYXlTdHJpbmcoCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuY2xhc3MsCi0JCQlUZW1wb3JhbFR5cGVDb21wb3NpdGUudGhpcywKLQkJCXRlbXBvcmFsVHlwZS5uYW1lKCkKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlidWlsZExhYmVsZWRDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQmFzaWNHZW5lcmFsU2VjdGlvbl90ZW1wb3JhbExhYmVsLAotCQkJYnVpbGRUZW1wb3JhbFR5cGVMaXN0SG9sZGVyKCksCi0JCQlidWlsZFRlbXBvcmFsVHlwZUhvbGRlcigpLAotCQkJYnVpbGRUZW1wb3JhbFR5cGVDb252ZXJ0ZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEVNUE9SQUwKLQkJKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0MjA2Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBkb2VzIG5vdCBoYXZlIGFueSB3aWRnZXRzLgotICoKLSAqIEBzZWUgVHJhbnNpZW50TWFwcGluZwotICogQHNlZSBCYXNlSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxUcmFuc2llbnRNYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JVHJhbnNpZW50TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0OGU0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUZW1wb3JhbFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBWZXJzaW9uTWFwcGluZwotICogQHNlZSBCYXNlSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBUZW1wb3JhbFR5cGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxWZXJzaW9uTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JVmVyc2lvbk1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFZlcnNpb25NYXBwaW5nLCBDb2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybV8oVmVyc2lvbk1hcHBpbmcgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ3JvdXBCb3hNYXJnaW4oKTsKLQotCQkvLyBDb2x1bW4gd2lkZ2V0cwotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0KLQkJLy8gVGVtcG9yYWwgVHlwZSB3aWRnZXRzCi0JCW5ldyBUZW1wb3JhbFR5cGVDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKQotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tZW51cy9NYXBBc0NvbnRyaWJ1dGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvTWFwQXNDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY1NGQxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tZW51cy9NYXBBc0NvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWVudXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuSW1hZ2VJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29tcG91bmRDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLklIYW5kbGVyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5Db21tYW5kQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5Db21tYW5kQ29udHJpYnV0aW9uSXRlbVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5JV29ya2JlbmNoQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzLklTZXJ2aWNlTG9jYXRvcjsKLQotLyoqCi0gKiBUaGlzIG1lbnUgY29udHJpYnV0aW9uIGlzIHJlc3BvbnNpYmxlIHRvIHBvcHVsYXRlIHRoZSBNYXAgQXMgbWVudSB3aXRoIHRoZQotICogcmVnaXN0ZXJlZCBtYXBwaW5nIHR5cGVzIGRlZmluZWQgaW4gdGhlIDxjb2RlPkpwdFBsYXRmb3JtVWk8L2NvZGU+LgotICoKLSAqIEBzZWUgSnBhUGxhdGZvcm0KLSAqIEBzZWUgSnBhUGxhdGZvcm1VaQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNYXBBc0NvbnRyaWJ1dGlvbiBleHRlbmRzIENvbXBvdW5kQ29udHJpYnV0aW9uSXRlbQotCWltcGxlbWVudHMgSVdvcmtiZW5jaENvbnRyaWJ1dGlvbgotewotCS8qKgotCSAqIEtlZXBzIHRyYWNrIG9mIHRoZSA8Y29kZT5JU2VydmljZUxvY2F0b3I8L2NvZGU+IHdoaWNoIGlzIHVzZWQgdG8gcmV0cmlldmUKLQkgKiB2YXJpb3VzIHNlcnZpY2VzIHJlcXVpcmVkIGZvciBpbnZva2luZyB0aGUgPGNvZGU+UGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlcjwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBJU2VydmljZUxvY2F0b3Igc2VydmljZUxvY2F0b3I7Ci0JCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb250cmlidXRpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyBNYXBBc0NvbnRyaWJ1dGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJU2VydmljZUxvY2F0b3Igc2VydmljZUxvY2F0b3IpIHsKLQkJdGhpcy5zZXJ2aWNlTG9jYXRvciA9IHNlcnZpY2VMb2NhdG9yOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtW10gZ2V0Q29udHJpYnV0aW9uSXRlbXMoKSB7Ci0JCS8vIFJldHJpZXZlIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUgaGFuZGxlciBzZXJ2aWNlCi0JCS8vIHdoaWNoIHNob3VsZCBiZSBhbiBJU3RydWN0dXJlZFNlbGVjdGlvbiBvZiBKcGFTdHJ1Y3R1cmVOb2RlcwotCQlJSGFuZGxlclNlcnZpY2UgaGFuZGxlclNlcnZpY2UgPSAKLQkJCShJSGFuZGxlclNlcnZpY2UpIHNlcnZpY2VMb2NhdG9yLmdldFNlcnZpY2UoSUhhbmRsZXJTZXJ2aWNlLmNsYXNzKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IAotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBoYW5kbGVyU2VydmljZS5nZXRDdXJyZW50U3RhdGUoKS5nZXRWYXJpYWJsZShJU291cmNlcy5BQ1RJVkVfQ1VSUkVOVF9TRUxFQ1RJT05fTkFNRSk7Ci0JCQotCQkvLyBBc3N1bWUgdGhhdCBhbGwgbm9kZXMgYXJlIGluIHRoZSBzYW1lIHByb2plY3QgKHdoaWNoIGlzIHZlcnkgc2FmZSkKLQkJLy8gYW5kIHJldHJpZXZlIHRoZSBtYXBwaW5nIFVJIHByb3ZpZGVycyBqdXN0IGZyb20gdGhlIGZpcnN0IGl0ZW0KLQkJSnBhU3RydWN0dXJlTm9kZSBub2RlID0gKEpwYVN0cnVjdHVyZU5vZGUpIGN1cnJlbnRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmFycmF5KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8TWFwcGluZ1VpUHJvdmlkZXI8Pz4sIElDb250cmlidXRpb25JdGVtPihtYXBwaW5nVWlQcm92aWRlcnMobm9kZSkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW0gdHJhbnNmb3JtKE1hcHBpbmdVaVByb3ZpZGVyPD8+IG5leHQpIHsKLQkJCQkJcmV0dXJuIGNvbnRyaWJ1dGlvbkl0ZW0obmV4dCk7Ci0JCQkJfQotCQkJfSwKLQkJCW5ldyBJQ29udHJpYnV0aW9uSXRlbVswXSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgcmVnaXN0ZXJlZCB7QGxpbmsgTWFwcGluZ1VpUHJvdmlkZXJ9cyBmcm9tIHRoZSBnaXZlbiBub2RlLCAKLQkgKiB1c2luZyBpdHMge0BsaW5rIEpwYVBsYXRmb3JtVWl9LgotCSAqCi0JICogQHBhcmFtIG5vZGUgQSB0ZXN0IG5vZGUgdG8gZGV0ZXJtaW5lIHRoZSB7QGxpbmsgSnBhUGxhdGZvcm1VaX0gYW5kIHR5cGUgCi0JICogb2YgcHJvdmlkZXJzIHRvIHJldHVybgotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCB7QGxpbmsgTWFwcGluZ1VpUHJvdmlkZXJ9cwotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpUHJvdmlkZXI8Pz4+IAotCQkJbWFwcGluZ1VpUHJvdmlkZXJzKEpwYVN0cnVjdHVyZU5vZGUgbm9kZSkgewotCQlKcGFQbGF0Zm9ybSBqcGFQbGF0Zm9ybSA9IG5vZGUuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCk7Ci0JCUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSA9IEpwdFVpUGx1Z2luLmdldFBsdWdpbigpLmpwYVBsYXRmb3JtVWkoanBhUGxhdGZvcm0pOwotCQlyZXR1cm4gbWFwcGluZ1VpUHJvdmlkZXJzKGpwYVBsYXRmb3JtVWksIG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHJlZ2lzdGVyZWQge0BsaW5rIE1hcHBpbmdVaVByb3ZpZGVyfXMgZnJvbSB0aGUgZ2l2ZW4gCi0JICoge0BsaW5rIEpwYVBsYXRmb3JtVWl9IGFuZCB7QGxpbmsgSnBhU3RydWN0dXJlTm9kZX0gKHRvIGRldGVybWluZSB0eXBlIG9mIAotCSAqIG1hcHBpbmcgcHJvdmlkZXJzIHRvIHJldHJpZXZlKS4KLQkgKgotCSAqIEBwYXJhbSBqcGFQbGF0Zm9ybVVpIFRoZSBhY3RpdmUge0BsaW5rIEpwYVBsYXRmb3JtVWl9IGZyb20gd2hlcmUgdGhlCi0JICogcHJvdmlkZXIgY2FuIGJlIHJldHJpZXZlZAotCSAqIEBwYXJhbSBub2RlIEEgdGVzdCBub2RlIHRvIGRldGVybWluZSB0eXBlIG9mIHByb3ZpZGVycyB0byByZXR1cm4KLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQge0BsaW5rIE1hcHBpbmdVaVByb3ZpZGVyfXMKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaVByb3ZpZGVyPD8+PiAKLQkJCW1hcHBpbmdVaVByb3ZpZGVycyhKcGFQbGF0Zm9ybVVpIHBsYXRmb3JtVWksIEpwYVN0cnVjdHVyZU5vZGUgbm9kZSk7Ci0JCi0JcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0oTWFwcGluZ1VpUHJvdmlkZXI8Pz4gbWFwcGluZ1VpUHJvdmlkZXIpIHsKLQkJQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IAotCQkJbmV3IENvbW1hbmRDb250cmlidXRpb25JdGVtKHBhcmFtZXRlcihtYXBwaW5nVWlQcm92aWRlcikpOwotCQlyZXR1cm4gaXRlbTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbW1hbmRDb250cmlidXRpb25JdGVtUGFyYW1ldGVyIHBhcmFtZXRlcihNYXBwaW5nVWlQcm92aWRlcjw/PiBtYXBwaW5nVWlQcm92aWRlcikgewotCQlDb21tYW5kQ29udHJpYnV0aW9uSXRlbVBhcmFtZXRlciBwYXJhbWV0ZXIgPQotCQkJbmV3IENvbW1hbmRDb250cmlidXRpb25JdGVtUGFyYW1ldGVyKAotCQkJCQlzZXJ2aWNlTG9jYXRvciwgCi0JCQkJCWNyZWF0ZUNvbW1hbmRDb250cmlidXRpb25JdGVtSWQobWFwcGluZ1VpUHJvdmlkZXIpLAotCQkJCQljb21tYW5kSWQoKSwKLQkJCQkJQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW0uU1RZTEVfQ0hFQ0spOwotCQlwYXJhbWV0ZXIubGFiZWwgPSBtYXBwaW5nVWlQcm92aWRlci5nZXRMYWJlbCgpOwotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJcGFyYW1ldGVycy5wdXQoY29tbWFuZFBhcmFtZXRlcklkKCksIG1hcHBpbmdVaVByb3ZpZGVyLmdldE1hcHBpbmdLZXkoKSk7Ci0JCXBhcmFtZXRlci5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLQkJcGFyYW1ldGVyLmljb24gPSBuZXcgSW1hZ2VJbWFnZURlc2NyaXB0b3IobWFwcGluZ1VpUHJvdmlkZXIuZ2V0SW1hZ2UoKSk7Ci0JCXBhcmFtZXRlci52aXNpYmxlRW5hYmxlZCA9IHRydWU7Ci0JCXJldHVybiBwYXJhbWV0ZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvbW1hbmQgdGhhdCB3aWxsIGJlIGludm9rZWQgZm9yCi0JICogY2hhbmdpbmcgdGhlIG1hcHBpbmcgdHlwZSBvZiB0aGUgc2VsZWN0ZWQgbm9kZXMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgIm1hcCBhcyIgY29tbWFuZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgY29tbWFuZElkKCk7Ci0JCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgbWFwcGluZyBrZXkgY29tbWFuZCBwYXJhbWV0ZXIgdGhhdCAKLQkgKiB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuZXcgbWFwcGluZyB0eXBlIG9mIHRoZSBzZWxlY3RlZCBub2Rlcy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSAibWFwIGFzIiBjb21tYW5kIHBhcmFtZXRlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgY29tbWFuZFBhcmFtZXRlcklkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBpZCBmb3IgYSB7QGxpbmsgQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW19IGluIHRoZSBmb3JtIG9mIAotCSAqICI8Y29tbWFuZElkPi48bWFwcGluZ0tleT4iICAKLQkgKiAoZm9yIGV4YW1wbGUgIm9yZy5lY2xpcHNlLmpwdC5jb3JlLnVpLnBlcnNpc3RlbnRUeXBlTWFwQXMuZW50aXR5IikKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUNvbW1hbmRDb250cmlidXRpb25JdGVtSWQoTWFwcGluZ1VpUHJvdmlkZXI8Pz4gbWFwcGluZ1VpUHJvdmlkZXIpIHsKLQkJcmV0dXJuIGNvbW1hbmRJZCgpICsgIi4iICsgbWFwcGluZ1VpUHJvdmlkZXIuZ2V0TWFwcGluZ0tleSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21lbnVzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NDdmOWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1lbnVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmNvbW1hbmRzLlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyBtZW51IGNvbnRyaWJ1dGlvbiBpcyByZXNwb25zaWJsZSB0byBwb3B1bGF0ZSB0aGUgTWFwIEFzIG1lbnUgd2l0aCB0aGUKLSAqIHJlZ2lzdGVyZWQgYXR0cmlidXRlIG1hcHBpbmcgdHlwZXMgZGVmaW5lZCBpbiB0aGUgPGNvZGU+SnB0UGxhdGZvcm1VaTwvY29kZT4KLSAqIGZvciA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlPC9jb2RlPiBvYmplY3RzLgotICoKLSAqIEBzZWUgUGVyc2lzdGVudEF0dHJpYnV0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29udHJpYnV0aW9uIGV4dGVuZHMgTWFwQXNDb250cmlidXRpb24KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1hbmRJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXIuQ09NTUFORF9JRDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb21tYW5kUGFyYW1ldGVySWQoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyLkNPTU1BTkRfUEFSQU1FVEVSX0lEOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpUHJvdmlkZXI8Pz4+IAotCQkJbWFwcGluZ1VpUHJvdmlkZXJzKEpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSwgSnBhU3RydWN0dXJlTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiBqcGFQbGF0Zm9ybVVpLmphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkJcmV0dXJuIGpwYVBsYXRmb3JtVWkub3JtQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODNhOWEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21lbnVzL1BlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWVudXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kcy5QZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotLyoqCi0gKiBUaGlzIG1lbnUgY29udHJpYnV0aW9uIGlzIHJlc3BvbnNpYmxlIHRvIHBvcHVsYXRlIHRoZSBNYXAgQXMgbWVudSB3aXRoIHRoZQotICogcmVnaXN0ZXJlZCBtYXBwaW5nIHR5cGVzIGRlZmluZWQgaW4gdGhlIDxjb2RlPkpwdFBsYXRmb3JtVWk8L2NvZGU+IGZvcgotICogPGNvZGU+UGVyc2lzdGVudFR5cGU8L2NvZGU+IG9iamVjdHMuCi0gKgotICogQHNlZSBKcGFQbGF0Zm9ybQotICogQHNlZSBKcGFQbGF0Zm9ybVVpCi0gKiBAc2VlIFBlcnNpc3RlbnRUeXBlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50VHlwZU1hcEFzQ29udHJpYnV0aW9uIGV4dGVuZHMgTWFwQXNDb250cmlidXRpb24KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZU1hcEFzQ29udHJpYnV0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1hbmRJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbnRUeXBlTWFwQXNIYW5kbGVyLkNPTU1BTkRfSUQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29tbWFuZFBhcmFtZXRlcklkKCkgewotCQlyZXR1cm4gUGVyc2lzdGVudFR5cGVNYXBBc0hhbmRsZXIuQ09NTUFORF9QQVJBTUVURVJfSUQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlQcm92aWRlcjw/Pj4gCi0JCQltYXBwaW5nVWlQcm92aWRlcnMoSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpLCBKcGFTdHJ1Y3R1cmVOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCXJldHVybiBqcGFQbGF0Zm9ybVVpLmphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE9ybVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlyZXR1cm4ganBhUGxhdGZvcm1VaS5vcm1UeXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckFjdGlvblByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjMGFiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnMuT3BlbkpwYVJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25BY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTWVudUNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEpwYU5hdmlnYXRvckFjdGlvblByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uQWN0aW9uUHJvdmlkZXIKLXsKLQlwcml2YXRlIE9wZW5KcGFSZXNvdXJjZUFjdGlvbiBvcGVuQWN0aW9uOwotCQotCXB1YmxpYyBKcGFOYXZpZ2F0b3JBY3Rpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBhQ29uZmlnKSB7Ci0JCW9wZW5BY3Rpb24gPSBuZXcgT3BlbkpwYVJlc291cmNlQWN0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbnRleHQoQWN0aW9uQ29udGV4dCBhQ29udGV4dCkgewotCQlpZiAoYUNvbnRleHQgIT0gbnVsbCAmJiBhQ29udGV4dC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFDb250ZXh0LmdldFNlbGVjdGlvbigpOwotCQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCX0KLQkJCi0JCXN1cGVyLnNldENvbnRleHQoYUNvbnRleHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyB0aGVBY3Rpb25CYXJzKSB7Ci0JCWlmIChvcGVuQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQl0aGVBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSUNvbW1vbkFjdGlvbkNvbnN0YW50cy5PUEVOLCBvcGVuQWN0aW9uKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIGFNZW51KSB7Ci0JCWlmIChnZXRDb250ZXh0KCkgPT0gbnVsbCB8fCBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChvcGVuQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQlhTWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBvcGVuQWN0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZGEyYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlciBleHRlbmRzIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgSnBhTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKG5ldyBKcGFOYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSwgbmV3IEpwYU5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODg3MzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByb2plY3RGYWNldEFjdGlvbkV2ZW50OwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIG5hdmlnYXRvciBjb250ZW50IHByb3ZpZGVyIGRlbGVnYXRlcyB0byB0aGUgcGxhdGZvcm0gVUkKLSAqIChzZWUgdGhlIG9yZy5lY2xpcHNlLmpwdC51aS5qcGFQbGF0Zm9ybSBleHRlbnNpb24gcG9pbnQpIGZvciBuYXZpZ2F0b3IgY29udGVudC4KLSAqIAotICogSWYgdGhlcmUgaXMgYSBwbGF0Zm9ybSBVSSBmb3IgdGhlIGdpdmVuIHByb2plY3QsIHRoaXMgY29udGVudCBwcm92aWRlciB3aWxsCi0gKiBwcm92aWRlIGEgcm9vdCAiSlBBIENvbnRlbnQiIG5vZGUgKGNoaWxkIG9mIHRoZSBwcm9qZWN0KSwgb3RoZXJ3aXNlIHRoZXJlCi0gKiB3aWxsIGJlIG5vIGNvbnRlbnQuICBGb3IgY2hpbGRyZW4gb2YgdGhlICJKUEEgQ29udGVudCIgbm9kZSAob3IgZm9yIGFueSBvdGhlcgotICogc3ViLW5vZGUpLCB0aGlzIHByb3ZpZGVyIHdpbGwgZGVsZWdhdGUgdG8gdGhlIGNvbnRlbnQgcHJvdmlkZXIgcmV0dXJuZWQgYnkgdGhlIAotICogcGxhdGZvcm0gVUkgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIKLQlpbXBsZW1lbnRzIElDb21tb25Db250ZW50UHJvdmlkZXIKLXsKLQlwcml2YXRlIEpwYU5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGRlbGVnYXRlOwotCQotCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgZmFjZXRMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyOwotCQotCQotCXB1YmxpYyBKcGFOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZhY2V0TGlzdGVuZXIgPSBuZXcgRmFjZXRMaXN0ZW5lcigpOwotCQlGYWNldGVkUHJvamVjdEZyYW1ld29yay5hZGRMaXN0ZW5lcigKLQkJCQlmYWNldExpc3RlbmVyLCAKLQkJCQlJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBPU1RfSU5TVEFMTCwKLQkJCQlJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBPU1RfVU5JTlNUQUxMLAotCQkJCUlGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9NT0RJRklFRCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlciBkZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJRmFjZXRlZFByb2plY3RGcmFtZXdvcmsucmVtb3ZlTGlzdGVuZXIoZmFjZXRMaXN0ZW5lcik7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5pbnB1dENoYW5nZWQodmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCQl9Ci0JCXRoaXMudmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcjsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgZWxlbWVudCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCQkKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCQkJaWYgKGpwYVByb2plY3QgIT0gbnVsbCkgewotCQkJCQlKcGFQbGF0Zm9ybVVpIHBsYXRmb3JtVWkgPSBKcHRVaVBsdWdpbi5nZXRQbHVnaW4oKS5qcGFQbGF0Zm9ybVVpKGpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKSk7Ci0JCQkJCQotCQkJCQlyZXR1cm4gcGxhdGZvcm1VaSAhPSBudWxsOwotCQkJCX0JCi0JCQl9Ci0JCX0KLQkJCi0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGUuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBwYXJlbnRFbGVtZW50KS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCQotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQkJCQlpZiAoanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCUpwYVBsYXRmb3JtVWkgcGxhdGZvcm1VaSA9IEpwdFVpUGx1Z2luLmdldFBsdWdpbigpLmpwYVBsYXRmb3JtVWkoanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpKTsKLQkJCQkJCi0JCQkJCWlmIChwbGF0Zm9ybVVpICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgT2JqZWN0W10ge2pwYVByb2plY3QuZ2V0Um9vdENvbnRleHQoKX07Ci0JCQkJCX0KLQkJCQl9CQotCQkJfQotCQl9Ci0JCQotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCQl9Ci0JCQkKLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSU1lbWVudG9Bd2FyZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkvLyBubyBvcAotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkvLyBubyBvcAotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElDb21tb25Db250ZW50UHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGUgY29uZmlnKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQlKcGFOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSnBhTmF2aWdhdG9yTGFiZWxQcm92aWRlcikgY29uZmlnLmdldEV4dGVuc2lvbigpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwgJiYgbGFiZWxQcm92aWRlci5kZWxlZ2F0ZSgpICE9IG51bGwpIHsKLQkJCQlkZWxlZ2F0ZSA9IGxhYmVsUHJvdmlkZXIuZGVsZWdhdGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWRlbGVnYXRlID0gbmV3IEpwYU5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByaXZhdGUgY2xhc3MgRmFjZXRMaXN0ZW5lcgotCQlpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdExpc3RlbmVyCi0JewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBST0pFQ1RfTU9ESUZJRUQpIHsKLQkJCQlyZWZyZXNoVmlld2VyKGV2ZW50LmdldFByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQkJfQotCQkJZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUE9TVF9JTlNUQUxMCi0JCQkJCXx8IGV2ZW50LmdldFR5cGUoKSA9PSBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBPU1RfVU5JTlNUQUxMKSB7Ci0JCQkJSVByb2plY3RGYWNldEFjdGlvbkV2ZW50IGlwYUV2ZW50ID0gKElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCkgZXZlbnQ7Ci0JCQkJaWYgKGlwYUV2ZW50LmdldFByb2plY3RGYWNldCgpLmVxdWFscygKLQkJCQkJCVByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChKcHRDb3JlUGx1Z2luLkZBQ0VUX0lEKSkpIHsKLQkJCQkJcmVmcmVzaFZpZXdlcihpcGFFdmVudC5nZXRQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCByZWZyZXNoVmlld2VyKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAKLQkJCQkJJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsIAotCQkJCQkmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkvLyBVc2luZyBqb2IgaGVyZSBzbyB0aGF0IHByb2plY3QgbW9kZWwgdXBkYXRlICh3aGljaCBhbHNvIHVzZXMKLQkJCQkvLyAgYSBqb2IpIHdpbGwgY29tcGxldGUgZmlyc3QKLQkJCQlKb2IgcmVmcmVzaEpvYiA9IG5ldyBKb2IoIlJlZnJlc2ggdmlld2VyIikgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJLy8gVXNpbmcgcnVubmFibGUgaGVyZSBzbyB0aGF0IHJlZnJlc2ggd2lsbCBnbyBvbiBjb3JyZWN0IHRocmVhZAotCQkJCQkJdmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXZpZXdlci5yZWZyZXNoKHByb2plY3QpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXJlZnJlc2hKb2Iuc2V0UnVsZShwcm9qZWN0KTsKLQkJCQlyZWZyZXNoSm9iLnNjaGVkdWxlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZDFiMTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgSnBhTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLXsKLQkvKioKLQkgKiBFeGFjdGx5ICpvbmUqIG9mIHRoZXNlIGZhY3RvcmllcyBpcyBjcmVhdGVkIGZvciBlYWNoIHZpZXcgdGhhdCB1dGlsaXplcyBpdC4gIAotCSAqIFRoZXJlZm9yZSwgYXMgd2UgZGVsZWdhdGUgdG8gdGhlIHBsYXRmb3JtIFVJIGZvciBlYWNoIHByb2plY3QsIHdlIHNob3VsZCAKLQkgKiBtYWludGFpbiB0aGUgc2FtZSBtdWx0aXBsaWNpdHkuICBUaGF0IGlzLCBpZiB0aGVyZSBpcyBhIGRlbGVnYXRlIGZvciBlYWNoIAotCSAqIHBsYXRmb3JtIFVJLCB3ZSBzaG91bGQgbWFpbnRhaW4gKm9uZSogZGVsZWdhdGUgZm9yIGVhY2ggdmlldy4KLQkgKiAKLQkgKiBLZXk6IHBsYXRmb3JtIGlkLCAgVmFsdWU6IGRlbGVnYXRlIGNvbnRlbnQgcHJvdmlkZXIgZmFjdG9yeQotCSAqLwotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5PiBkZWxlZ2F0ZXM7Ci0JCi0JCi0JcHVibGljIEpwYU5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeT4oKTsKLQl9Ci0JCi0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQlJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZGVsZWdhdGUgPSBnZXREZWxlZ2F0ZShpdGVtKTsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5idWlsZEl0ZW1MYWJlbFByb3ZpZGVyKGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0RGVsZWdhdGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCEgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUpwYUNvbnRleHROb2RlIGNvbnRleHROb2RlID0gKEpwYUNvbnRleHROb2RlKSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoSnBhQ29udGV4dE5vZGUuY2xhc3MpOwotCQkKLQkJaWYgKGNvbnRleHROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlKcGFQbGF0Zm9ybSBwbGF0Zm9ybSA9IGNvbnRleHROb2RlLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpOwotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IHBsYXRmb3JtLmdldElkKCk7Ci0JCWlmIChkZWxlZ2F0ZXMuY29udGFpbnNLZXkocGxhdGZvcm1JZCkpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZXMuZ2V0KHBsYXRmb3JtSWQpOwotCQl9Ci0JCUpwYU5hdmlnYXRvclByb3ZpZGVyIG5hdmlnYXRvclByb3ZpZGVyID0gSnBhTmF2aWdhdG9yUHJvdmlkZXJMb29rdXAucHJvdmlkZXIocGxhdGZvcm0uZ2V0SWQoKSk7Ci0JCUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBkZWxlZ2F0ZSA9IG51bGw7Ci0JCWlmIChuYXZpZ2F0b3JQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZSA9IG5hdmlnYXRvclByb3ZpZGVyLmdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCQl9Ci0JCWRlbGVnYXRlcy5wdXQocGxhdGZvcm1JZCwgZGVsZWdhdGUpOwotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTJiYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBvZiBuYXZpZ2F0b3IgbGFiZWwgcHJvdmlkZXIgZGVsZWdhdGVzIHRvIHRoZSBwbGF0Zm9ybSBVSQotICogKHNlZSB0aGUgb3JnLmVjbGlwc2UuanB0LnVpLmpwYVBsYXRmb3JtIGV4dGVuc2lvbiBwb2ludCkgZm9yIG5hdmlnYXRvciBsYWJlbHMuCi0gKiAKLSAqIFRoaXMgbGFiZWwgcHJvdmlkZXIgcHJvdmlkZXMgYSBsYWJlbCBmb3IgdGhlIHJvb3QgIkpQQSBDb250ZW50IiBub2RlIHByb3ZpZGVkCi0gKiBieSB0aGUgY29udGVudCBwcm92aWRlciAoc2VlIHtAbGluayBKcGFOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXJ9KSBhbmQgZGVsZWdhdGVzCi0gKiB0byB0aGUgbGFiZWwgcHJvdmlkZXIgcmV0dXJuZWQgYnkgdGhlIHBsYXRmb3JtIFVJIGltcGxlbWVudGF0aW9uIGZvciBsYWJlbHMKLSAqIGZvciBjaGlsZHJlbiBvZiB0aGUgIkpQQSBDb250ZW50IiBub2RlIChvciBmb3IgYW55IG90aGVyIHN1Yi1ub2RlKS4KLSAqLwotcHVibGljIGNsYXNzIEpwYU5hdmlnYXRvckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJQ29tbW9uTGFiZWxQcm92aWRlcgotewotCXByaXZhdGUgSnBhTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIgZGVsZWdhdGU7Ci0JCi0JCi0JcHVibGljIEpwYU5hdmlnYXRvckxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlciBkZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElCYXNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5pc0xhYmVsUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuaXNMYWJlbFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5nZXRJbWFnZShlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0KGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJRGVzY3JpcHRpb25Qcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJLy8gbm8gb3AgLSBkZWZlciB0byBnZXRUZXh0KGVsZW1lbnQpCi0JCXJldHVybiBnZXRUZXh0KGVsZW1lbnQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElNZW1lbnRvQXdhcmUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJLy8gbm8gb3AKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJLy8gbm8gb3AKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJQ29tbW9uTGFiZWxQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlIGNvbmZpZykgewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJSnBhTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IChKcGFOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIpIGNvbmZpZy5nZXRFeHRlbnNpb24oKS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCAmJiBjb250ZW50UHJvdmlkZXIuZGVsZWdhdGUoKSAhPSBudWxsKSB7Ci0JCQkJZGVsZWdhdGUgPSBjb250ZW50UHJvdmlkZXIuZGVsZWdhdGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWRlbGVnYXRlID0gbmV3IEpwYU5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yUHJvdmlkZXJMb29rdXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JQcm92aWRlckxvb2t1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzlhMDI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JQcm92aWRlckxvb2t1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtVWlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgb25seSBwcm92aWRlZCB0byBtaW5pbWl6ZSBvYmplY3QgY29uc3RydWN0aW9uLiAgT25seSBvbmUKLSAqIHtAbGluayBKcGFOYXZpZ2F0b3JQcm92aWRlcn0gaXMgcmVxdWlyZWQgdG8gYmUgY29uc3RydWN0ZWQgZm9yIGVhY2ggcGxhdGZvcm0gVUkuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFOYXZpZ2F0b3JQcm92aWRlckxvb2t1cAotewotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEpwYU5hdmlnYXRvclByb3ZpZGVyPiBwcm92aWRlcnM7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBKcGFOYXZpZ2F0b3JQcm92aWRlciBwcm92aWRlcihTdHJpbmcgcGxhdGZvcm1JZCkgewotCQlpZiAocHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSnBhTmF2aWdhdG9yUHJvdmlkZXI+KCk7Ci0JCX0KLQkJaWYgKHByb3ZpZGVycy5jb250YWluc0tleShwbGF0Zm9ybUlkKSkgewotCQkJcmV0dXJuIHByb3ZpZGVycy5nZXQocGxhdGZvcm1JZCk7Ci0JCX0KLQkJSnBhUGxhdGZvcm1VaSBwbGF0Zm9ybSA9IEpwYVBsYXRmb3JtVWlSZWdpc3RyeS5pbnN0YW5jZSgpLmpwYVBsYXRmb3JtKHBsYXRmb3JtSWQpOwotCQlpZiAocGxhdGZvcm0gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSnBhTmF2aWdhdG9yUHJvdmlkZXIgcHJvdmlkZXIgPSBwbGF0Zm9ybS5idWlsZE5hdmlnYXRvclByb3ZpZGVyKCk7Ci0JCXByb3ZpZGVycy5wdXQocGxhdGZvcm1JZCwgcHJvdmlkZXIpOwotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCQotCS8vIHByZXZlbnQgY29uc3RydWN0aW9uCi0JcHJpdmF0ZSBKcGFOYXZpZ2F0b3JQcm92aWRlckxvb2t1cCgpIHsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvclRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvclRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDgxYjU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLm5hdmlnYXRvci5KcGFOYXZpZ2F0b3JQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEpwYU5hdmlnYXRvclRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JLyoqCi0JICogRXhhY3RseSAqb25lKiBvZiB0aGVzZSBmYWN0b3JpZXMgaXMgY3JlYXRlZCBmb3IgZWFjaCB2aWV3IHRoYXQgdXRpbGl6ZXMgaXQuICAKLQkgKiBUaGVyZWZvcmUsIGFzIHdlIGRlbGVnYXRlIHRvIHRoZSBwbGF0Zm9ybSBVSSBmb3IgZWFjaCBwcm9qZWN0LCB3ZSBzaG91bGQgCi0JICogbWFpbnRhaW4gdGhlIHNhbWUgbXVsdGlwbGljaXR5LiAgVGhhdCBpcywgaWYgdGhlcmUgaXMgYSBkZWxlZ2F0ZSBmb3IgZWFjaCAKLQkgKiBwbGF0Zm9ybSBVSSwgd2Ugc2hvdWxkIG1haW50YWluICpvbmUqIGRlbGVnYXRlIGZvciBlYWNoIHZpZXcuCi0JICogCi0JICogS2V5OiBwbGF0Zm9ybSBpZCwgIFZhbHVlOiBkZWxlZ2F0ZSBjb250ZW50IHByb3ZpZGVyIGZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeT4gZGVsZWdhdGVzOwotCQotCQotCXB1YmxpYyBKcGFOYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVsZWdhdGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk+KCk7Ci0JfQotCQotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZGVsZWdhdGUgPSBnZXREZWxlZ2F0ZShpdGVtKTsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5idWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwcml2YXRlIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXREZWxlZ2F0ZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoISAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSnBhQ29udGV4dE5vZGUgY29udGV4dE5vZGUgPSAoSnBhQ29udGV4dE5vZGUpICgoSUFkYXB0YWJsZSkgZWxlbWVudCkuZ2V0QWRhcHRlcihKcGFDb250ZXh0Tm9kZS5jbGFzcyk7Ci0JCQotCQlpZiAoY29udGV4dE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUpwYVBsYXRmb3JtIHBsYXRmb3JtID0gY29udGV4dE5vZGUuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCk7Ci0JCVN0cmluZyBwbGF0Zm9ybUlkID0gcGxhdGZvcm0uZ2V0SWQoKTsKLQkJaWYgKGRlbGVnYXRlcy5jb250YWluc0tleShwbGF0Zm9ybUlkKSkgewotCQkJcmV0dXJuIGRlbGVnYXRlcy5nZXQocGxhdGZvcm1JZCk7Ci0JCX0KLQkJSnBhTmF2aWdhdG9yUHJvdmlkZXIgbmF2aWdhdG9yUHJvdmlkZXIgPSBKcGFOYXZpZ2F0b3JQcm92aWRlckxvb2t1cC5wcm92aWRlcihwbGF0Zm9ybS5nZXRJZCgpKTsKLQkJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGRlbGVnYXRlID0gbnVsbDsKLQkJaWYgKG5hdmlnYXRvclByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlID0gbmF2aWdhdG9yUHJvdmlkZXIuZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JCX0KLQkJZGVsZWdhdGVzLnB1dChwbGF0Zm9ybUlkLCBkZWxlZ2F0ZSk7Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vSnB0VWlPcm1NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL0pwdFVpT3JtTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmNmFlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vSnB0VWlPcm1NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIE9STSB3aWRnZXRzLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnB0VWlPcm1NZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY2Nlc3NUeXBlQ29tcG9zaXRlX2FjY2VzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY2Nlc3NUeXBlQ29tcG9zaXRlX2ZpZWxkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjY2Vzc1R5cGVDb21wb3NpdGVfcHJvcGVydHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm9vbGVhbl9GYWxzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX1RydWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9hY2Nlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfZmllbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wYWNrYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfcHJvcGVydHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NQYWdlX2NhdGFsb2dEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzUGFnZV9jYXRhbG9nTm9EZWZhdWx0U3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzUGFnZV9zY2hlbWFEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzUGFnZV9zY2hlbWFOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2FkZFNlcXVlbmNlR2VuZXJhdG9yRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvckRlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkVGFibGVHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRUYWJsZUdlbmVyYXRvckRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkVGFibGVHZW5lcmF0b3JEZXNjcmlwdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkVGFibGVHZW5lcmF0b3JUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZWRpdFNlcXVlbmNlR2VuZXJhdG9yRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0U2VxdWVuY2VHZW5lcmF0b3JEZXNjcmlwdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZWRpdFNlcXVlbmNlR2VuZXJhdG9yVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0VGFibGVHZW5lcmF0b3JEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRUYWJsZUdlbmVyYXRvckRlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0VGFibGVHZW5lcmF0b3JUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2dyb3VwQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtSmF2YUF0dHJpYnV0ZUNob29zZXJfamF2YUF0dHJpYnV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1KYXZhQ2xhc3NDaG9vc2VyX2phdmFDbGFzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlX21ldGFkYXRhQ29tcGxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZV9tZXRhZGF0YUNvbXBsZXRlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtUXVlcmllc0NvbXBvc2l0ZV9ncm91cEJveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3ZhbHVlQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2FjY2VzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9jYXNjYWRlUGVyc2lzdENoZWNrQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2NhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfZmllbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfcGVyc2lzdGVuY2VVbml0U2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9wcm9wZXJ0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fY2F0YWxvZ0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uX3NjaGVtYURlZmF1bHQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X3VpX29ybSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRVaU9ybU1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaU9ybU1lc3NhZ2VzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL0FjY2Vzc1R5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL0FjY2Vzc1R5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0NGJlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9BY2Nlc3NUeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLkpwdFVpT3JtTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFhtbFR5cGVNYXBwaW5nCi0gKiBAc2VlIE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc1R5cGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPE9ybVR5cGVNYXBwaW5nPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFjY2Vzc1R5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEFjY2Vzc1R5cGVDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtVHlwZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPE9ybVR5cGVNYXBwaW5nLCBBY2Nlc3NUeXBlPiBidWlsZEFjY2Vzc1R5cGVDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPE9ybVR5cGVNYXBwaW5nLCBBY2Nlc3NUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChPcm1UeXBlTWFwcGluZy5ERUZBVUxUX0FDQ0VTU19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoT3JtVHlwZU1hcHBpbmcuU1BFQ0lGSUVEX0FDQ0VTU19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGVbXSBjaG9pY2VzKCkgewotCQkJCXJldHVybiBBY2Nlc3NUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRBY2Nlc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpT3JtTWVzc2FnZXMuY2xhc3MsCi0JCQkJCUFjY2Vzc1R5cGVDb21wb3NpdGUudGhpcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRBY2Nlc3ModmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUVudW1Gb3JtQ29tYm9WaWV3ZXI8T3JtVHlwZU1hcHBpbmcsIEFjY2Vzc1R5cGU+IGNvbWJvVmlld2VyID0KLQkJCWJ1aWxkQWNjZXNzVHlwZUNvbWJvVmlld2VyKGNvbnRhaW5lcik7Ci0KLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlPcm1NZXNzYWdlcy5BY2Nlc3NUeXBlQ29tcG9zaXRlX2FjY2VzcywKLQkJCWNvbWJvVmlld2VyLmdldENvbnRyb2woKQotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOTFjYWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0SnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiLkNhdGFsb2dDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuU2NoZW1hQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5KcHRVaU9ybU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBYbWxQYWNrYWdlQ2hvb3NlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFNjaGVtYTogICAgICB8IFNjaGVtYUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENhdGFsb2c6ICAgICB8IENhdGFsb2dDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEFjY2VzcyBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybUdlbmVyYXRvcnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtUXVlcmllc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3MKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENhdGFsb2dDb21ibwotICogQHNlZSBFbnVtRm9ybUNvbWJvVmlld2VyCi0gKiBAc2VlIE9ybUdlbmVyYXRvcnNDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGFja2FnZUNob29zZXIKLSAqIEBzZWUgT3JtUXVlcmllc0NvbXBvc2l0ZQotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZQotICogQHNlZSBTY2hlbWFDb21ibwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSBleHRlbmRzIEFic3RyYWN0SnBhRGV0YWlsc1BhZ2U8RW50aXR5TWFwcGluZ3M+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5YbWxFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFbnRpdHlNYXBwaW5ncywgQWNjZXNzVHlwZT4gYnVpbGRBY2Nlc3NUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFbnRpdHlNYXBwaW5ncywgQWNjZXNzVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5TWFwcGluZ3MuREVGQVVMVF9BQ0NFU1NfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eU1hcHBpbmdzLlNQRUNJRklFRF9BQ0NFU1NfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gQWNjZXNzVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0QWNjZXNzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlKcHRVaU9ybU1lc3NhZ2VzLmNsYXNzLAotCQkJCQlFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldEFjY2VzcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkQWNjZXNzKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENhdGFsb2dDb21ibzxFbnRpdHlNYXBwaW5ncz4gYnVpbGRDYXRhbG9nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2F0YWxvZ0NvbWJvPEVudGl0eU1hcHBpbmdzPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnRpdHlNYXBwaW5ncy5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eU1hcHBpbmdzLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZENhdGFsb2codmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0TWV0YWRhdGE+IGJ1aWxkUGVyc2lzdGVudFVuaXRNZXRhZGFIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5TWFwcGluZ3MsIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHRyYW5zZm9ybV8oRW50aXR5TWFwcGluZ3MgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNjaGVtYUNvbWJvPEVudGl0eU1hcHBpbmdzPiBidWlsZFNjaGVtYUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IFNjaGVtYUNvbWJvPEVudGl0eU1hcHBpbmdzPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnRpdHlNYXBwaW5ncy5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5TWFwcGluZ3MuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZFNjaGVtYSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFBhY2thZ2Ugd2lkZ2V0cwotCQluZXcgT3JtUGFja2FnZUNob29zZXIodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBTY2hlbWEgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLkVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2Vfc2NoZW1hLAotCQkJYnVpbGRTY2hlbWFDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9TQ0hFTUEKLQkJKTsKLQotCQkvLyBDYXRhbG9nIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlPcm1NZXNzYWdlcy5FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX2NhdGFsb2csCi0JCQlidWlsZENhdGFsb2dDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9DQVRBTE9HCi0JCSk7Ci0KLQkJLy8gQWNjZXNzIFR5cGUgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLkVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfYWNjZXNzLAotCQkJYnVpbGRBY2Nlc3NUeXBlQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fQUNDRVNTCi0JCSk7Ci0KLQkJLy8gUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YSB3aWRnZXRzCi0JCW5ldyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZFBlcnNpc3RlbnRVbml0TWV0YWRhSG9sZGVyKCksCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCA1KQotCQkpOwotCi0JCS8vIEdlbmVyYXRvcnMgcGFuZQotCQluZXcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCA1KQotCQkpOwotCi0JCS8vIFF1ZXJpZXMgcGFuZQotCQluZXcgT3JtUXVlcmllc0NvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCA1KQotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1EZXRhaWxzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybURldGFpbHNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTU2ZTdjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybURldGFpbHNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUge0BsaW5rIEpwYURldGFpbHNQYWdlfQotICogd2hlbiB0aGUgaW5mb3JtYXRpb24gY29tZXMgZnJvbSB0aGUgWE1MIGZpbGUgKGVpdGhlciBmcm9tIHRoZSBwZXJzaXN0ZW5jZQotICogY29uZmlndXJhdGlvbiBvciBmcm9tIHRoZSBNYXBwaW5ncyBEZXNjcmlwdG9yKS4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybURldGFpbHNQcm92aWRlcgotCWltcGxlbWVudHMgSnBhRGV0YWlsc1Byb3ZpZGVyCi17Ci0JcHVibGljIE9ybURldGFpbHNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkRGV0YWlsc1BhZ2UoCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCU9iamVjdCBjb250ZW50Tm9kZUlkLAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlpZiAoY29udGVudE5vZGVJZCA9PSBPcm1TdHJ1Y3R1cmVOb2Rlcy5FTlRJVFlfTUFQUElOR1NfSUQpIHsKLQkJCXJldHVybiBuZXcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnROb2RlSWQgPT0gT3JtU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9UWVBFX0lEKSB7Ci0JCQlyZXR1cm4gbmV3IE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQkJfQotCi0JCWlmIChjb250ZW50Tm9kZUlkID09IE9ybVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lEKSB7Ci0JCQlyZXR1cm4gbmV3IE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUVudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtRW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNGRmMTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtRW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkFic3RyYWN0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gT1JNIGVudGl0eS4KLSAqCi0gKiBAc2VlIE9ybUVudGl0eQotICogQHNlZSBCYXNlSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIE9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtRW50aXR5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGU8T3JtRW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtRW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+T3JtRW50aXR5PC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVudGl0eUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEluaGVyaXRhbmNlQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybUluaGVyaXRhbmNlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUVudGl0eVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUVudGl0eVVpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1YjdhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1FbnRpdHlVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLlR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FbnRpdHlVaVByb3ZpZGVyIGltcGxlbWVudHMgVHlwZU1hcHBpbmdVaVByb3ZpZGVyPE9ybUVudGl0eT4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FbnRpdHlVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9ybUVudGl0eVVpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHlwZU1hcHBpbmdVaVByb3ZpZGVyPE9ybUVudGl0eT4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE9ybUVudGl0eVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50VHlwZVBhZ2VfRW50aXR5TGFiZWw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yVHlwZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkUGVyc2lzdGVudFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQlKcGFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGFhNDQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUdlbmVyYXRvcnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5KcHRVaU9ybU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuTmV3TmFtZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5OZXdOYW1lRGlhbG9nQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Qb3N0RXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIFRoaXMgcGFuZSBzaG93cyB0aGUgbGlzdCBvZiBuYW1lZCBxdWVyaWVzIGFuZCBuYW1lZCBuYXRpdmUgcXVlcmllcy4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSBvciBPcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHlNYXBwaW5ncwotICogQHNlZSBPcm1HZW5lcmF0b3IKLSAqIEBzZWUgT3JtU2VxdWVuY2VHZW5lcmF0b3IKLSAqIEBzZWUgT3JtVGFibGVHZW5lcmF0b3IKLSAqIEBzZWUgRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgT3JtU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUKLSAqIEBzZWUgT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybUdlbmVyYXRvcnNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8RW50aXR5TWFwcGluZ3M+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPcm1HZW5lcmF0b3I+IGdlbmVyYXRvckhvbGRlcjsKLQlwcml2YXRlIE9ybVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlIHNlcXVlbmNlR2VuZXJhdG9yUGFuZTsKLQlwcml2YXRlIE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlIHRhYmxlR2VuZXJhdG9yUGFuZTsKLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eU1hcHBpbmdzPiBsaXN0UGFuZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtR2VuZXJhdG9yc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIEVudGl0eU1hcHBpbmdzPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTZXF1ZW5jZUdlbmVyYXRvcihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJTmV3TmFtZURpYWxvZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBOZXdOYW1lRGlhbG9nQnVpbGRlcihzaGVsbCgpKTsKLQkJYnVpbGRlci5zZXREaWFsb2dUaXRsZShKcHRVaU9ybU1lc3NhZ2VzLk9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkU2VxdWVuY2VHZW5lcmF0b3JUaXRsZSk7Ci0JCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb24oSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2FkZFNlcXVlbmNlR2VuZXJhdG9yRGVzY3JpcHRpb24pOwotCQlidWlsZGVyLnNldERlc2NyaXB0aW9uVGl0bGUoSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2FkZFNlcXVlbmNlR2VuZXJhdG9yRGVzY3JpcHRpb25UaXRsZSk7Ci0JCWJ1aWxkZXIuc2V0TGFiZWxUZXh0KEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9sYWJlbCk7Ci0JCWJ1aWxkZXIuc2V0RXhpc3RpbmdOYW1lcyhzZXF1ZW5jZUdlbmVyYXRvck5hbWVzKCkpOwotCi0JCU5ld05hbWVEaWFsb2cgZGlhbG9nID0gYnVpbGRlci5idWlsZERpYWxvZygpOwotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZE5ld1NlcXVlbmNlR2VuZXJhdG9yUG9zdEV4ZWN1dGlvbihsaXN0U2VsZWN0aW9uTW9kZWwpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVGFibGVHZW5lcmF0b3IoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCU5ld05hbWVEaWFsb2dCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTmV3TmFtZURpYWxvZ0J1aWxkZXIoc2hlbGwoKSk7Ci0JCWJ1aWxkZXIuc2V0RGlhbG9nVGl0bGUoSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2FkZFRhYmxlR2VuZXJhdG9yVGl0bGUpOwotCQlidWlsZGVyLnNldERlc2NyaXB0aW9uKEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRUYWJsZUdlbmVyYXRvckRlc2NyaXB0aW9uKTsKLQkJYnVpbGRlci5zZXREZXNjcmlwdGlvblRpdGxlKEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRUYWJsZUdlbmVyYXRvckRlc2NyaXB0aW9uVGl0bGUpOwotCQlidWlsZGVyLnNldExhYmVsVGV4dChKcHRVaU9ybU1lc3NhZ2VzLk9ybUdlbmVyYXRvcnNDb21wb3NpdGVfbGFiZWwpOwotCQlidWlsZGVyLnNldEV4aXN0aW5nTmFtZXModGFibGVHZW5lcmF0b3JOYW1lcygpKTsKLQotCQlOZXdOYW1lRGlhbG9nIGRpYWxvZyA9IGJ1aWxkZXIuYnVpbGREaWFsb2coKTsKLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGROZXdUYWJsZUdlbmVyYXRvclBvc3RFeGVjdXRpb24obGlzdFNlbGVjdGlvbk1vZGVsKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPcm1HZW5lcmF0b3I+IGJ1aWxkRGlzcGxheWFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxPcm1HZW5lcmF0b3I+KAotCQkJYnVpbGRHZW5lcmF0b3JzTGlzdEhvbGRlcigpLAotCQkJR2VuZXJhdG9yLk5BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248TmV3TmFtZURpYWxvZz4gYnVpbGRFZGl0R2VuZXJhdG9yUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPE5ld05hbWVEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShOZXdOYW1lRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJT3JtR2VuZXJhdG9yIGdlbmVyYXRvciA9IGdlbmVyYXRvckhvbGRlci5nZXRWYWx1ZSgpOwotCQkJCQlnZW5lcmF0b3Iuc2V0TmFtZShkaWFsb2cuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkR2VuZXJhdG9yQWRhcHRlcigpIHsKLQotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGFkZEJ1dHRvblRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvcjsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkU2VxdWVuY2VHZW5lcmF0b3IobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWVkaXRHZW5lcmF0b3IobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgT3JtU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJCQkJCXN1YmplY3QoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigoT3JtU2VxdWVuY2VHZW5lcmF0b3IpIGl0ZW0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc3ViamVjdCgpLnJlbW92ZVRhYmxlR2VuZXJhdG9yKChPcm1UYWJsZUdlbmVyYXRvcikgaXRlbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPcm1HZW5lcmF0b3I+IGJ1aWxkR2VuZXJhdG9ySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPcm1HZW5lcmF0b3I+KCk7Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZEdlbmVyYXRvckxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJT3JtR2VuZXJhdG9yIGdlbmVyYXRvciA9IChPcm1HZW5lcmF0b3IpIGVsZW1lbnQ7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZW5lcmF0b3IuZ2V0TmFtZSgpOwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQlpbnQgaW5kZXggPSAtMTsKLQotCQkJCQlpZiAoZ2VuZXJhdG9yIGluc3RhbmNlb2YgT3JtU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJCQkJCWluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2Yoc3ViamVjdCgpLnNlcXVlbmNlR2VuZXJhdG9ycygpLCBnZW5lcmF0b3IpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihzdWJqZWN0KCkudGFibGVHZW5lcmF0b3JzKCksIGdlbmVyYXRvcik7Ci0JCQkJCX0KLQotCQkJCQluYW1lID0gTkxTLmJpbmQoSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmcsIGluZGV4KTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE9ybUdlbmVyYXRvcj4gYnVpbGRHZW5lcmF0b3JzTGlzdEhvbGRlcigpIHsKLQkJTGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtR2VuZXJhdG9yPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUdlbmVyYXRvcj4+KCk7Ci0JCWxpc3QuYWRkKGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZFRhYmxlR2VuZXJhdG9yTGlzdEhvbGRlcigpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtR2VuZXJhdG9yPiwgT3JtR2VuZXJhdG9yPihsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248TmV3TmFtZURpYWxvZz4gYnVpbGROZXdTZXF1ZW5jZUdlbmVyYXRvclBvc3RFeGVjdXRpb24oZmluYWwgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248TmV3TmFtZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKE5ld05hbWVEaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBzdWJqZWN0KCkuYWRkU2VxdWVuY2VHZW5lcmF0b3Ioc3ViamVjdCgpLnNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCQkJCWdlbmVyYXRvci5zZXROYW1lKGRpYWxvZy5nZXROYW1lKCkpOwotCQkJCQlnZW5lcmF0b3JIb2xkZXIuc2V0VmFsdWUoZ2VuZXJhdG9yKTsKLQkJCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoZ2VuZXJhdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5ld1RhYmxlR2VuZXJhdG9yQWN0aW9uKGZpbmFsIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBzZWxlY3Rpb25Nb2RlbCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFkZFRhYmxlR2VuZXJhdG9yKHNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248TmV3TmFtZURpYWxvZz4gYnVpbGROZXdUYWJsZUdlbmVyYXRvclBvc3RFeGVjdXRpb24oZmluYWwgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248TmV3TmFtZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKE5ld05hbWVEaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQlPcm1UYWJsZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBzdWJqZWN0KCkuYWRkVGFibGVHZW5lcmF0b3Ioc3ViamVjdCgpLnRhYmxlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCQkJCWdlbmVyYXRvci5zZXROYW1lKGRpYWxvZy5nZXROYW1lKCkpOwotCQkJCQlnZW5lcmF0b3JIb2xkZXIuc2V0VmFsdWUoZ2VuZXJhdG9yKTsKLQkJCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoZ2VuZXJhdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlNYXBwaW5ncywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShFbnRpdHlNYXBwaW5ncyB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgIT0gbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxPcm1HZW5lcmF0b3IsIENvbnRyb2w+IGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPE9ybUdlbmVyYXRvciwgQ29udHJvbD4oKSB7Ci0JCQlwdWJsaWMgQ29udHJvbCB0cmFuc2Zvcm0oT3JtR2VuZXJhdG9yIGdlbmVyYXRvcikgewotCi0JCQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCWlmIChnZW5lcmF0b3IgaW5zdGFuY2VvZiBPcm1TZXF1ZW5jZUdlbmVyYXRvcikgewotCQkJCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3JQYW5lLmdldENvbnRyb2woKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdGFibGVHZW5lcmF0b3JQYW5lLmdldENvbnRyb2woKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxPcm1HZW5lcmF0b3IsIE9ybVNlcXVlbmNlR2VuZXJhdG9yPihnZW5lcmF0b3JIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ybVNlcXVlbmNlR2VuZXJhdG9yIHRyYW5zZm9ybV8oT3JtR2VuZXJhdG9yIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIE9ybVNlcXVlbmNlR2VuZXJhdG9yKSA/IChPcm1TZXF1ZW5jZUdlbmVyYXRvcikgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1TZXF1ZW5jZUdlbmVyYXRvcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFbnRpdHlNYXBwaW5ncy5TRVFVRU5DRV9HRU5FUkFUT1JTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zZXF1ZW5jZUdlbmVyYXRvcnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1UYWJsZUdlbmVyYXRvcj4gYnVpbGRUYWJsZUdlbmVyYXRvckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxPcm1HZW5lcmF0b3IsIE9ybVRhYmxlR2VuZXJhdG9yPihnZW5lcmF0b3JIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ybVRhYmxlR2VuZXJhdG9yIHRyYW5zZm9ybV8oT3JtR2VuZXJhdG9yIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIE9ybVRhYmxlR2VuZXJhdG9yKSA/IChPcm1UYWJsZUdlbmVyYXRvcikgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtVGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1UYWJsZUdlbmVyYXRvcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFbnRpdHlNYXBwaW5ncy5UQUJMRV9HRU5FUkFUT1JTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1UYWJsZUdlbmVyYXRvcj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC50YWJsZUdlbmVyYXRvcnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnRhYmxlR2VuZXJhdG9yc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdEdlbmVyYXRvcihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJT3JtR2VuZXJhdG9yIGdlbmVyYXRvciA9IGdlbmVyYXRvckhvbGRlci5nZXRWYWx1ZSgpOwotCi0JCU5ld05hbWVEaWFsb2dCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTmV3TmFtZURpYWxvZ0J1aWxkZXIoc2hlbGwoKSk7Ci0JCWJ1aWxkZXIuc2V0TGFiZWxUZXh0KEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9sYWJlbCk7Ci0JCWJ1aWxkZXIuc2V0TmFtZShnZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQotCQlpZiAoZ2VuZXJhdG9yIGluc3RhbmNlb2YgT3JtU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJCWJ1aWxkZXIuc2V0RGlhbG9nVGl0bGUoSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRTZXF1ZW5jZUdlbmVyYXRvclRpdGxlKTsKLQkJCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb24oSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRTZXF1ZW5jZUdlbmVyYXRvckRlc2NyaXB0aW9uKTsKLQkJCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb25UaXRsZShKcHRVaU9ybU1lc3NhZ2VzLk9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZWRpdFNlcXVlbmNlR2VuZXJhdG9yRGVzY3JpcHRpb25UaXRsZSk7Ci0JCQlidWlsZGVyLnNldEV4aXN0aW5nTmFtZXMoc2VxdWVuY2VHZW5lcmF0b3JOYW1lcygpKTsKLQkJfQotCQllbHNlIHsKLQkJCWJ1aWxkZXIuc2V0RGlhbG9nVGl0bGUoSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRUYWJsZUdlbmVyYXRvclRpdGxlKTsKLQkJCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb24oSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRUYWJsZUdlbmVyYXRvckRlc2NyaXB0aW9uKTsKLQkJCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb25UaXRsZShKcHRVaU9ybU1lc3NhZ2VzLk9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZWRpdFRhYmxlR2VuZXJhdG9yRGVzY3JpcHRpb25UaXRsZSk7Ci0JCQlidWlsZGVyLnNldEV4aXN0aW5nTmFtZXModGFibGVHZW5lcmF0b3JOYW1lcygpKTsKLQkJfQotCi0JCU5ld05hbWVEaWFsb2cgZGlhbG9nID0gYnVpbGRlci5idWlsZERpYWxvZygpOwotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEVkaXRHZW5lcmF0b3JQb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJZ2VuZXJhdG9ySG9sZGVyID0gYnVpbGRHZW5lcmF0b3JIb2xkZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBidWlsZENvbGxhcHNhYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9ncm91cEJveAotCQkpOwotCi0JCS8vIExpc3QgcGFuZQotCQlsaXN0UGFuZSA9IGJ1aWxkTGlzdFBhbmUoY29udGFpbmVyKTsKLQkJaW5zdGFsbFBhbmVFbmFibGVyKCk7Ci0KLQkJLy8gUHJvcGVydHkgcGFuZQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyID0KLQkJCWJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoKTsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvckhvbGRlciA9Ci0JCQlidWlsZFRhYmxlR2VuZXJhdG9ySG9sZGVyKCk7Ci0KLQkJUGFnZUJvb2sgcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBwcm9wZXJ0eSBwYW5lCi0JCXNlcXVlbmNlR2VuZXJhdG9yUGFuZSA9IG5ldyBPcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlzZXF1ZW5jZUdlbmVyYXRvckhvbGRlciwKLQkJCXBhZ2VCb29rCi0JCSk7Ci0KLQkJLy8gVGFibGUgR2VuZXJhdG9yIHByb3BlcnR5IHBhbmUKLQkJdGFibGVHZW5lcmF0b3JQYW5lID0gbmV3IE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXRhYmxlR2VuZXJhdG9ySG9sZGVyLAotCQkJcGFnZUJvb2sKLQkJKTsKLQotCQlhZGRBbGlnblJpZ2h0KHNlcXVlbmNlR2VuZXJhdG9yUGFuZSk7Ci0JCWFkZEFsaWduUmlnaHQodGFibGVHZW5lcmF0b3JQYW5lKTsKLQkJaW5zdGFsbFBhbmVTd2l0Y2hlcihwYWdlQm9vayk7Ci0JfQotCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHlNYXBwaW5ncz4gYnVpbGRMaXN0UGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHlNYXBwaW5ncz4oCi0JCQl0aGlzLAotCQkJY29udGFpbmVyLAotCQkJYnVpbGRHZW5lcmF0b3JBZGFwdGVyKCksCi0JCQlidWlsZERpc3BsYXlhYmxlR2VuZXJhdG9yTGlzdEhvbGRlcigpLAotCQkJZ2VuZXJhdG9ySG9sZGVyLAotCQkJYnVpbGRHZW5lcmF0b3JMYWJlbFByb3ZpZGVyKCkKLQkJKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZEN1c3RvbUJ1dHRvbkFmdGVyQWRkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJCQlCdXR0b24gYnV0dG9uID0gYnVpbGRCdXR0b24oCi0JCQkJCWNvbnRhaW5lciwKLQkJCQkJSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2FkZFRhYmxlR2VuZXJhdG9yLAotCQkJCQloZWxwSWQsCi0JCQkJCWJ1aWxkTmV3VGFibGVHZW5lcmF0b3JBY3Rpb24oZ2V0U2VsZWN0aW9uTW9kZWwoKSkKLQkJCQkpOwotCi0JCQkJYWRkQWxpZ25SaWdodChidXR0b24pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcigKLQkJCWJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSwKLQkJCWxpc3RQYW5lCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lU3dpdGNoZXIoUGFnZUJvb2sgcGFnZUJvb2spIHsKLQkJbmV3IENvbnRyb2xTd2l0Y2hlcihnZW5lcmF0b3JIb2xkZXIsIGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksIHBhZ2VCb29rKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gc2VxdWVuY2VHZW5lcmF0b3JOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE9ybVNlcXVlbmNlR2VuZXJhdG9yLCBTdHJpbmc+KHN1YmplY3QoKS5zZXF1ZW5jZUdlbmVyYXRvcnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShPcm1TZXF1ZW5jZUdlbmVyYXRvciBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiB0YWJsZUdlbmVyYXRvck5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8T3JtVGFibGVHZW5lcmF0b3IsIFN0cmluZz4oc3ViamVjdCgpLnRhYmxlR2VuZXJhdG9ycygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKE9ybVRhYmxlR2VuZXJhdG9yIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtSW5oZXJpdGFuY2VDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MmEyOTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtSW5oZXJpdGFuY2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGphdmEgaW5oZXJpdGFuY2UuCi0gKgotICogQHNlZSBPcm1FbnRpdHkKLSAqIEBzZWUgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1Jbmhlcml0YW5jZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGU8T3JtRW50aXR5PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybUluaGVyaXRhbmNlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcm1Jbmhlcml0YW5jZUNvbXBvc2l0ZShBYnN0cmFjdFBhbmU8T3JtRW50aXR5PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtSmF2YUF0dHJpYnV0ZUNob29zZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUphdmFBdHRyaWJ1dGVDaG9vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNGIzMmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtSmF2YUF0dHJpYnV0ZUNob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uSnB0VWlPcm1NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQHNlZSBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtSmF2YUF0dHJpYnV0ZUNob29zZXIgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPE9ybUF0dHJpYnV0ZU1hcHBpbmc+Ci17Ci0JcHJpdmF0ZSBUZXh0IHRleHQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlhtbEphdmFBdHRyaWJ1dGVDaG9vc2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcm1KYXZhQXR0cmlidXRlQ2hvb3NlcihBYnN0cmFjdEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1BdHRyaWJ1dGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1BdHRyaWJ1dGVNYXBwaW5nLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgT3JtQXR0cmlidXRlTWFwcGluZy5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAoc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQotCQlpZiAoIXRleHQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0ZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0ZXh0ID0gYnVpbGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtSmF2YUF0dHJpYnV0ZUNob29zZXJfamF2YUF0dHJpYnV0ZSwKLQkJCWJ1aWxkTmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUphdmFDbGFzc0Nob29zZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUphdmFDbGFzc0Nob29zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkZWM3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1KYXZhQ2xhc3NDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uSnB0VWlPcm1NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQ2xhc3NDaG9vc2VyUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBUT0RPIHBvc3NpYmx5IGhlbHAgdGhlIHVzZXIgYW5kIGlmIHRoZXkgaGF2ZSBjaG9zZW4gYSBwYWNrYWdlIGF0IHRoZQotICogZW50aXR5LW1hcHBpbmdzIGxldmVsIG9ubHkgaW5zZXJ0IHRoZSBjbGFzcyBuYW1lIGluIHRoZSB4bWwgZmlsZSBpZiB0aGV5Ci0gKiBjaG9vc2UgYSBjbGFzcyBmcm9tIHRoZSBwYWNrYWdlLgotICogTm90IHN1cmUgaWYgdGhpcyBzaG91bGQgYmUgZHJpdmVuIGJ5IHRoZSBVSSBvciBieSB1aSBhcGkgaW4gdGhlIG1vZGVsCi0gKgotICogQHNlZSBPcm1UeXBlTWFwcGluZwotICogQHNlZSBPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ2xhc3NDaG9vc2VyUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtSmF2YUNsYXNzQ2hvb3NlciBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8T3JtVHlwZU1hcHBpbmc+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+WG1sSmF2YUNsYXNzQ2hvb3NlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybUphdmFDbGFzc0Nob29zZXIoQWJzdHJhY3RGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtVHlwZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5YbWxKYXZhQ2xhc3NDaG9vc2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUphdmFDbGFzc0Nob29zZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1UeXBlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxPcm1UeXBlTWFwcGluZz4gaW5pdGlhbGl6ZUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPE9ybVR5cGVNYXBwaW5nPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtVHlwZU1hcHBpbmcsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBPcm1UeXBlTWFwcGluZy5DTEFTU19QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmdldENsYXNzXygpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJCXN1YmplY3Quc2V0Q2xhc3ModmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldENsYXNzXygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgbGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBKcHRVaU9ybU1lc3NhZ2VzLk9ybUphdmFDbGFzc0Nob29zZXJfamF2YUNsYXNzOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiByb290LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvbXB0VHlwZSgpIHsKLQkJCQlJVHlwZSB0eXBlID0gY2hvb3NlVHlwZSgpOwotCi0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKTsKLQkJCQkJc3ViamVjdCgpLnNldENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVBhY2thZ2VDaG9vc2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1QYWNrYWdlQ2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWI1NTVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVBhY2thZ2VDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5KcHRVaU9ybU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFja2FnZUNob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgUGFja2FnZUNob29zZXJQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBQYWNrYWdlQ2hvb3NlclBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybVBhY2thZ2VDaG9vc2VyIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxFbnRpdHlNYXBwaW5ncz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlhtbFBhY2thZ2VDaG9vc2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtUGFja2FnZUNob29zZXIoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgRW50aXR5TWFwcGluZ3M+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWluaXRpYWxpemVQYWNrYWdlQ2hvb3NlclBhbmUoY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDaG9vc2VyUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJbmV3IFBhY2thZ2VDaG9vc2VyUGFuZTxFbnRpdHlNYXBwaW5ncz4odGhpcywgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHlNYXBwaW5ncywgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eU1hcHBpbmdzLlBBQ0tBR0VfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQYWNrYWdlKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQkJc3ViamVjdC5zZXRQYWNrYWdlKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBsYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wYWNrYWdlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiByb290LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlTmFtZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFBhY2thZ2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRQYWNrYWdlKCkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gY2hvb3NlUGFja2FnZSgpOwotCi0JCQkJaWYgKHBhY2thZ2VGcmFnbWVudCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCQkJCQlzdWJqZWN0KCkuc2V0UGFja2FnZShwYWNrYWdlTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDA3MmY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRldGFpbHMgcGFnZSB1c2VkIGZvciB0aGUgWE1MIHBlcnNpc3RlbnQKLSAqIGF0dHJpYnV0ZS4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBdHRyaWJ1dGUgbWFwcGluZyBwYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPcm1QZXJzaXN0ZW50QXR0cmlidXRlCi0gKiBAc2VlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4ganBhUGxhdGZvcm1VaSgpLm9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnNGb3IoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCS8vYnVnIDE5MjAzNSAtIG5vIGRlZmF1bHQgbWFwcGluZyBvcHRpb24gaW4geG1sCi0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuYXJyYXkoYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCksIG5ldyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcltDb2xsZWN0aW9uVG9vbHMuc2l6ZShhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKSldKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gIXZhbHVlLmlzVmlydHVhbCgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxBdHRyaWJ1dGVNYXBwaW5nPiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoU3RyaW5nIGtleSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlhtbCBhdHRyaWJ1dGVNYXBwaW5ncyBzaG91bGQgbm90IGJlIGRlZmF1bHQiKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4ganBhUGxhdGZvcm1VaSgpLmRlZmF1bHRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1BdHRyaWJ1dGVNYXBwaW5nPiBnZXRNYXBwaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybUF0dHJpYnV0ZU1hcHBpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZyB0cmFuc2Zvcm1fKFBlcnNpc3RlbnRBdHRyaWJ1dGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU1hcHBpbmcpIHZhbHVlLmdldE1hcHBpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlBcnJheUxpc3Q8QWJzdHJhY3RQYW5lPD8+PiBwYW5lcyA9IG5ldyBBcnJheUxpc3Q8QWJzdHJhY3RQYW5lPD8+PigyKTsKLQotCQkvLyBNYXAgQXMgY29tcG9zaXRlCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZSBtYXBBc1BhbmUgPSBuZXcgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIDAsIDUsIDApCi0JCSk7Ci0KLQkJcGFuZXMuYWRkKG1hcEFzUGFuZSk7Ci0KLQkJLy8gRW50aXR5IHR5cGUgd2lkZ2V0cwotCQlPcm1KYXZhQXR0cmlidXRlQ2hvb3NlciBqYXZhQXR0cmlidXRlUGFuZSA9Ci0JCQluZXcgT3JtSmF2YUF0dHJpYnV0ZUNob29zZXIodGhpcywgZ2V0TWFwcGluZ0hvbGRlcigpLCBjb250YWluZXIpOwotCi0JCXBhbmVzLmFkZChqYXZhQXR0cmlidXRlUGFuZSk7Ci0KLQkJLy8gTWFwcGluZyBwcm9wZXJ0aWVzIHBhbmUKLQkJUGFnZUJvb2sgYXR0cmlidXRlUGFuZSA9IGJ1aWxkTWFwcGluZ1BhZ2VCb29rKGNvbnRhaW5lcik7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICAgID0gU1dULlRPUDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOwotCi0JCWF0dHJpYnV0ZVBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJaW5zdGFsbFBhbmVFbmFibGVyKHBhbmVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKEFycmF5TGlzdDxBYnN0cmFjdFBhbmU8Pz4+IHBhbmVzKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcihidWlsZFBhbmVFbmFibGVySG9sZGVyKCksIHBhbmVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBtYXBwaW5nUGFnZUNoYW5nZWQoSnBhQ29tcG9zaXRlIG1hcHBpbmdDb21wb3NpdGUpIHsKLQkJaWYgKG1hcHBpbmdDb21wb3NpdGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCi0JCWlmIChzdWJqZWN0KCkgIT0gbnVsbCAmJiBzdWJqZWN0KCkuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQkJZW5hYmxlZCA9ICFzdWJqZWN0KCkuaXNWaXJ0dWFsKCk7Ci0JCX0KLQotCQltYXBwaW5nQ29tcG9zaXRlLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5ZmFmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuT3JtUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLkpwdFVpT3JtTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGV0YWlscyBwYWdlIHVzZWQgZm9yIHRoZSBYTUwgcGVyc2lzdGVudAotICogYXR0cmlidXRlLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1KYXZhQ2xhc3NDaG9vc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgWCBNZXRhZGF0YSBDb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtSmF2YUNsYXNzQ2hvb3NlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUeXBlIG1hcHBpbmcgcGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPcm1QZXJzaXN0ZW50VHlwZQotICogQHNlZSBPcm1KYXZhQ2xhc3NDaG9vc2VyCi0gKiBAc2VlIEFjY2Vzc1R5cGVDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZSBleHRlbmRzIFBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2U8T3JtUGVyc2lzdGVudFR5cGU+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVR5cGVNYXBwaW5nPiBidWlsZE1hcHBpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybVBlcnNpc3RlbnRUeXBlLCAgT3JtVHlwZU1hcHBpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVudFR5cGUuTUFQUElOR19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0TWFwcGluZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRNZXRhZGF0YUNvbXBsZXRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1UeXBlTWFwcGluZywgQm9vbGVhbj4oCi0JCQlidWlsZE1hcHBpbmdIb2xkZXIoKSwKLQkJCU9ybVR5cGVNYXBwaW5nLkRFRkFVTFRfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFksCi0JCQlPcm1UeXBlTWFwcGluZy5TUEVDSUZJRURfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRNZXRhZGF0YUNvbXBsZXRlU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZE1ldGFkYXRhQ29tcGxldGVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCi0JCQkJCWJvb2xlYW4gZGVmYXVsdFZhbHVlID0gc3ViamVjdCgpLmdldE1hcHBpbmcoKS5pc0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0VmFsdWUgPyBKcHRVaU9ybU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlPcm1NZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCi0JCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZV9tZXRhZGF0YUNvbXBsZXRlV2l0aERlZmF1bHQsCi0JCQkJCQlkZWZhdWx0U3RyaW5nVmFsdWUKLQkJCQkJKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gSnB0VWlPcm1NZXNzYWdlcy5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlX21ldGFkYXRhQ29tcGxldGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gVHlwZSBNYXBwaW5nIHdpZGdldHMKLQkJbmV3IE9ybVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMCwgNSwgMCkKLQkJKTsKLQotCQkvLyBKYXZhIGNsYXNzIHdpZGdldHMKLQkJbmV3IE9ybUphdmFDbGFzc0Nob29zZXIodGhpcywgYnVpbGRNYXBwaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0KLQkJLy8gQWNjZXNzIHdpZGdldHMKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRNYXBwaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0KLQkJLy8gTWV0YWRhdGEgY29tcGxldGUgd2lkZ2V0cwotCQlidWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZV9tZXRhZGF0YUNvbXBsZXRlLAotCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlSG9sZGVyKCksCi0JCQlidWlsZE1ldGFkYXRhQ29tcGxldGVTdHJpbmdIb2xkZXIoKQotCQkpOwotCi0JCS8vIFR5cGUgbWFwcGluZyBwYW5lCi0JCVBhZ2VCb29rIHR5cGVNYXBwaW5nUGFnZUJvb2sgPSBidWlsZFR5cGVNYXBwaW5nUGFnZUJvb2soY29udGFpbmVyKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ICAgICAgICAgPSBTV1QuVE9QOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgICA9IHRydWU7Ci0KLQkJdHlwZU1hcHBpbmdQYWdlQm9vay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IHR5cGVNYXBwaW5nVWlQcm92aWRlcnMoKSB7Ci0JCXJldHVybiBqcGFQbGF0Zm9ybVVpKCkub3JtVHlwZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzdhNTFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBAc2VlIE9ybUVudGl0eQotICogQHNlZSBPcm1Jbmhlcml0YW5jZUNvbXBvc2l0ZSAtIFRoZSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZTxPcm1FbnRpdHk+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxPcm1FbnRpdHksIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCU9ybUVudGl0eS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQkJfQotLy9UT0RPIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplIHdoZW4gSSBjYW4gY2hhbmdlIHRoZSBBUEkKLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0vLwkJCQlyZXR1cm4gc3ViamVjdC5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotLy8JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN3aXRjaERlZmF1bHRUb1NwZWNpZmllZCgpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBkZWZhdWx0Sm9pbkNvbHVtbnMgPSBzdWJqZWN0KCkuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCi0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlIChkZWZhdWx0Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRKb2luQ29sdW1ucy5uZXh0KCk7Ci0JCQlTdHJpbmcgY29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKTsKLQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0KLQkJCVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IHN1YmplY3QoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbmRleCsrKTsKLQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJcGtKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1RdWVyaWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1RdWVyaWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNWU2NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtUXVlcmllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLlF1ZXJpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5KcHRVaU9ybU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFF1ZXJpZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBRdWVyaWVzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1RdWVyaWVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPEVudGl0eU1hcHBpbmdzPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybVF1ZXJpZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybVF1ZXJpZXNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBFbnRpdHlNYXBwaW5ncz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eU1hcHBpbmdzLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVudGl0eU1hcHBpbmdzIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBidWlsZENvbGxhcHNhYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtUXVlcmllc0NvbXBvc2l0ZV9ncm91cEJveAotCQkpOwotCi0JCVF1ZXJpZXNDb21wb3NpdGUgcXVlcmllc0NvbXBvc2l0ZSA9IG5ldyBRdWVyaWVzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWNvbnRhaW5lcgotCQkpOwotCi0JCWluc3RhbGxQYW5lRW5hYmxlcihxdWVyaWVzQ29tcG9zaXRlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKFF1ZXJpZXNDb21wb3NpdGUgcXVlcmllc0NvbXBvc2l0ZSkgewotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQlidWlsZFBhbmVFbmFibGVySG9sZGVyKCksCi0JCQlxdWVyaWVzQ29tcG9zaXRlCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2OWQ1OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5TZWNvbmRhcnlUYWJsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT3JtRW50aXR5Ci0gKiBAc2VlIE9ybUVudGl0eUNvbXBvc2l0ZSAtIFRoZSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPE9ybUVudGl0eT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIE9ybUVudGl0eT4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmluZUluWG1sSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IERlZmluZUluWG1sSG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPcm1TZWNvbmRhcnlUYWJsZT4gYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkgewotCQlMaXN0PExpc3RWYWx1ZU1vZGVsPE9ybVNlY29uZGFyeVRhYmxlPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8T3JtU2Vjb25kYXJ5VGFibGU+PigpOwotCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8T3JtU2Vjb25kYXJ5VGFibGU+LCBPcm1TZWNvbmRhcnlUYWJsZT4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPcm1TZWNvbmRhcnlUYWJsZT4gYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPE9ybVNlY29uZGFyeVRhYmxlPihidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSwKLQkJCVRhYmxlLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE9ybVNlY29uZGFyeVRhYmxlPiBidWlsZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8T3JtRW50aXR5LCBPcm1TZWNvbmRhcnlUYWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE9ybVNlY29uZGFyeVRhYmxlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtU2Vjb25kYXJ5VGFibGU+IGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8T3JtRW50aXR5LCBPcm1TZWNvbmRhcnlUYWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBPcm1FbnRpdHkuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdyb3VwQm94TWFyZ2luKCk7Ci0KLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlSG9sZGVyID0KLQkJCWJ1aWxkU2Vjb25kYXJ5VGFibGVIb2xkZXIoKTsKLQotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBkZWZpbmVJblhtbEhvbGRlciA9Ci0JCQlidWlsZERlZmluZUluWG1sSG9sZGVyKCk7Ci0KLQkJLy8gT3ZlcnJpZGUgRGVmaW5lIEluIFhNTCBjaGVjayBib3gKLQkJYnVpbGRDaGVja0JveCgKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luKSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Pcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfZGVmaW5lSW5YbWwsCi0JCQlkZWZpbmVJblhtbEhvbGRlcgotCQkpOwotCi0JCS8vIFNlY29uZGFyeSBUYWJsZXMgYWRkL3JlbW92ZSBsaXN0IHBhbmUKLQkJQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PiBsaXN0UGFuZSA9IG5ldyBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHk+KAotCQkJdGhpcywKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbiksCi0JCQlidWlsZFNlY29uZGFyeVRhYmxlc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdE1vZGVsKCksCi0JCQlzZWNvbmRhcnlUYWJsZUhvbGRlciwKLQkJCWJ1aWxkU2Vjb25kYXJ5VGFibGVMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUy8vVE9ETyBuZWVkIGEgaGVscCBjb250ZXh0IGlkIGZvciB0aGlzCi0JCSk7Ci0KLQkJaW5zdGFsbExpc3RQYW5lRW5hYmxlcihkZWZpbmVJblhtbEhvbGRlciwgbGlzdFBhbmUpOwotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBwYW5lCi0JCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXNlY29uZGFyeVRhYmxlSG9sZGVyLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxMaXN0UGFuZUVuYWJsZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZGVmaW5lSW5YbWxIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PiBsaXN0UGFuZSkgewotCi0JCW5ldyBQYW5lRW5hYmxlcihkZWZpbmVJblhtbEhvbGRlciwgbGlzdFBhbmUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZURpYWxvZyBidWlsZFNlY29uZGFyeVRhYmxlRGlhbG9nRm9yQWRkKCkgewotCQkvL2RlZmF1bHRTY2hlbWEgYW5kIGRlZmF1bHRDYXRhbG9nIHNob3VsZCBub3QgYmUgdGFrZW4gZnJvbSB0aGUgVGFibGUgaW4gdGhpcyBjYXNlLiAgVGhlIHRhYmxlIGRlZmF1bHQgc2NoZW1hIGNvdWxkIGJlIHdoYXQgaXMgdGhlIHNwZWNpZmllZCBzY2hlbWEgb24gdGhlIGphdmEgdGFibGUuCi0JCXJldHVybiBuZXcgU2Vjb25kYXJ5VGFibGVEaWFsb2coZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCksIHN1YmplY3QoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSwgc3ViamVjdCgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBEZWZpbmVJblhtbEhvbGRlciBleHRlbmRzIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+Ci0JCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gewotCi0JCXB1YmxpYyBEZWZpbmVJblhtbEhvbGRlcigpIHsKLQkJCXN1cGVyKGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCWlmIChzdWJqZWN0KCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJfQotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihzdWJqZWN0KCkuc2Vjb25kYXJ5VGFibGVzRGVmaW5lZEluWG1sKCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJc3ViamVjdCgpLnNldFNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbCh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTg0MjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuU2VxdWVuY2VDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLkpwdFVpT3JtTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFNlcXVlbmNlIEdlbmVyYXRvcjogfCBTZXF1ZW5jZUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPcm1TZXF1ZW5jZUdlbmVyYXRvcgotICogQHNlZSBFbnRpdHlNYXBwaW5ncwotICogQHNlZSBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgU2VxdWVuY2VDb21ibwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8T3JtU2VxdWVuY2VHZW5lcmF0b3I+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRHZW5lcmF0b3JOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1TZXF1ZW5jZUdlbmVyYXRvciwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIE9ybVNlcXVlbmNlR2VuZXJhdG9yLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZXF1ZW5jZUNvbWJvPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlTmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IFNlcXVlbmNlQ29tYm88T3JtU2VxdWVuY2VHZW5lcmF0b3I+KHRoaXMsIHBhcmVudCkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKE9ybVNlcXVlbmNlR2VuZXJhdG9yLkRFRkFVTFRfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoT3JtU2VxdWVuY2VHZW5lcmF0b3IuU1BFQ0lGSUVEX1NFUVVFTkNFX05BTUVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfZGVmYXVsdDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hIHNjaGVtYSgpIHsKLQkJCQkvLyBUT0RPCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlPcm1NZXNzYWdlcy5Pcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lLAotCQkJYnVpbGRHZW5lcmF0b3JOYW1lSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9OQU1FCi0JCSk7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlPcm1NZXNzYWdlcy5Pcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZSwKLQkJCWJ1aWxkU2VxdWVuY2VOYW1lQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SX1NFUVVFTkNFCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMGYyNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYi5Db2x1bW5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuVGFibGVDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLkpwdFVpT3JtTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFRhYmxlOiAgICAgICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFByaW1hcnkgS2V5IENvbHVtbjogICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFZhbHVlIENvbHVtbjogICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFByaW1hcnkgS2V5IENvbHVtbiBWYWx1ZTogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPcm1UYWJsZUdlbmVyYXRvcgotICogQHNlZSBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPE9ybVRhYmxlR2VuZXJhdG9yPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVRhYmxlR2VuZXJhdG9yPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtVGFibGVHZW5lcmF0b3IsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3IuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkNvbWJvPE9ybVRhYmxlR2VuZXJhdG9yPiBidWlsZFBrQ29sdW1uTmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPE9ybVRhYmxlR2VuZXJhdG9yPih0aGlzLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfUEtfQ09MVU1OX05BTUVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSBnZXREQlRhYmxlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5Db21ibzxPcm1UYWJsZUdlbmVyYXRvcj4gYnVpbGRQa0NvbHVtblZhbHVlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXJldHVybiBuZXcgQ29sdW1uQ29tYm88T3JtVGFibGVHZW5lcmF0b3I+KHRoaXMsIHBhcmVudCkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRQa0NvbHVtblZhbHVlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSBnZXREQlRhYmxlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVGFibGVDb21ibzxPcm1UYWJsZUdlbmVyYXRvcj4gYnVpbGRUYWJsZU5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBUYWJsZUNvbWJvPE9ybVRhYmxlR2VuZXJhdG9yPih0aGlzLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCQkJCWlmIChwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZICkgewotCQkJCQlyZXBvcHVsYXRlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBzY2hlbWFOYW1lKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZFRhYmxlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgdGFibGUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZFRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5Db21ibzxPcm1UYWJsZUdlbmVyYXRvcj4gYnVpbGRWYWx1ZUNvbHVtbkNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPE9ybVRhYmxlR2VuZXJhdG9yPih0aGlzLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSBnZXREQlRhYmxlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTmFtZSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLk9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWUsCi0JCQlidWlsZEdlbmVyYXRvck5hbWVIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX05BTUUKLQkJKTsKLQotCQkvLyBUYWJsZSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGUsCi0JCQlidWlsZFRhYmxlTmFtZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9UQUJMRQotCQkpOwotCi0JCS8vIFByaW1hcnkgS2V5IENvbHVtbiB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfcGtDb2x1bW4sCi0JCQlidWlsZFBrQ29sdW1uTmFtZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9QUklNQVJZX0tFWV9DT0xVTU4KLQkJKTsKLQotCQkvLyBWYWx1ZSBDb2x1bW4gd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLk9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3ZhbHVlQ29sdW1uLAotCQkJYnVpbGRWYWx1ZUNvbHVtbkNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9WQUxVRV9DT0xVTU4KLQkJKTsKLQotCQkvLyBQcmltYXJ5IEtleSBDb2x1bW4gVmFsdWUgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLk9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uVmFsdWUsCi0JCQlidWlsZFBrQ29sdW1uVmFsdWVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfUFJJTUFSWV9LRVlfQ09MVU1OX1ZBTFVFCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZDMzMDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLkpwdFVpT3JtTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gUGVyc2lzdGVuY2UgVW5pdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgeCBYTUwgTWFwcGluZyBNZXRhZGF0YSBDb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCB4IENhc2NhZGUgUGVyc2lzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBTY2hlbWE6ICAgICAgfCBTY2hlbWFDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBDYXRhbG9nOiAgICAgfCBDYXRhbG9nQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBBY2Nlc3MgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENhdGFsb2dDb21ibwotICogQHNlZSBTY2hlbWFDb21ibwotICogQHNlZSBFbnVtRm9ybUNvbWJvVmlld2VyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cywgQWNjZXNzVHlwZT4gYnVpbGRBY2Nlc3NUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cywgQWNjZXNzVHlwZT4odGhpcywgYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcigpLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5BQ0NFU1NfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gQWNjZXNzVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlKcHRVaU9ybU1lc3NhZ2VzLmNsYXNzLAotCQkJCQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZS50aGlzLAotCQkJCQl2YWx1ZQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRBY2Nlc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldEFjY2Vzcyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVQZXJzaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cywgQm9vbGVhbj4oYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5DQVNDQURFX1BFUlNJU1RfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXNDYXNjYWRlUGVyc2lzdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRDYXNjYWRlUGVyc2lzdCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDYXRhbG9nQ29tYm88UGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+IGJ1aWxkQ2F0YWxvZ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENhdGFsb2dDb21ibzxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cz4odGhpcywgYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcigpLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZENhdGFsb2codmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+IGJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEsIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHRyYW5zZm9ybV8oUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNjaGVtYUNvbWJvPFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPiBidWlsZFNjaGVtYUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IFNjaGVtYUNvbWJvPFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPih0aGlzLCBidWlsZFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzSG9sZGVyKCksIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkU2NoZW1hKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBTZWN0aW9uCi0JCWNvbnRhaW5lciA9IGJ1aWxkQ29sbGFwc2FibGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlPcm1NZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9wZXJzaXN0ZW5jZVVuaXRTZWN0aW9uCi0JCSk7Ci0KLQkJLy8gWE1MIG1hcHBpbmcgbWV0YWRhdGEgY29tcGxldGUgY2hlY2sgYm94Ci0JCWJ1aWxkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3gsCi0JCQlidWlsZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX1hNTAotCQkpOwotCi0JCS8vIENhc2NhZGUgUGVyc2lzdCB3aWRnZXRzCi0JCWJ1aWxkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2Nhc2NhZGVQZXJzaXN0Q2hlY2tCb3gsCi0JCQlidWlsZENhc2NhZGVQZXJzaXN0SG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX0NBU0NBREUKLQkJKTsKLQotCQkvLyBTY2hlbWEgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3NjaGVtYSwKLQkJCWJ1aWxkU2NoZW1hQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fU0NIRU1BCi0JCSk7Ci0KLQkJLy8gQ2F0YWxvZyB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfY2F0YWxvZywKLQkJCWJ1aWxkQ2F0YWxvZ0NvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX0NBVEFMT0cKLQkJKTsKLQotCQkvLyBBY2Nlc3MgVHlwZSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfYWNjZXNzLAotCQkJYnVpbGRBY2Nlc3NUeXBlQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fQUNDRVNTCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwZDNjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIHBlcnNpc3RlbmNlIGVkaXRvci4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX0ZhbHNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvb2xlYW5fVHJ1ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlRWRpdG9yX3BhZ2VfaGVscDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZUVkaXRvcl9zb3VyY2VUYWI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3NlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2V4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX21hcHBlZENsYXNzZXNOb05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9vcGVuOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZV9jb25uZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfZGF0YWJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZV9nZW5lcmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlX2p0YURhdGFzb3VyY2VOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZV9ub25KdGFEYXRhc291cmNlTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGVfanRhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX3Jlc291cmNlX2xvY2FsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX3RyYW5zYWN0aW9uVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfZ2VuZXJhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2phdmFBcmNoaXZlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9yc19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX21hcHBlZENsYXNzZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfcGVyc2lzdGVuY2VQcm92aWRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX21hcHBpbmdGaWxlRGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX21hcHBpbmdGaWxlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9vcm1Ob05hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX25hbWVDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV9wcm9wZXJ0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGVfcHJvcGVydGllc19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX3ZhbHVlQ29sdW1uOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aV9wZXJzaXN0ZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTFlNjFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgeCBFeGNsdWRlIFVubGlzdGVkIE1hcHBlZCBDbGFzc2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdAotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQWRkUmVtb3ZlTGlzdFBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxQZXJzaXN0ZW5jZVVuaXQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRNYXBwZWRDbGFzc2VzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTWFwcGVkQ2xhc3MoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBzdWJqZWN0KCkuYWRkU3BlY2lmaWVkQ2xhc3NSZWYoKTsKLQkJCWNsYXNzUmVmLnNldENsYXNzTmFtZSh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKTsKLQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNsYXNzUmVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkTWFwcGVkQ2xhc3MobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBlbmFibGVPcHRpb25PblNlbGVjdGlvbkNoYW5nZShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJaWYgKCFzdXBlci5lbmFibGVPcHRpb25PblNlbGVjdGlvbkNoYW5nZShsaXN0U2VsZWN0aW9uTW9kZWwpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gZmluZFR5cGUoKENsYXNzUmVmKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpKSAhPSBudWxsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgewotCQkJCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9vcGVuOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlvcGVuTWFwcGVkQ2xhc3MoKENsYXNzUmVmKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCXN1YmplY3QoKS5yZW1vdmVTcGVjaWZpZWRDbGFzc1JlZigoQ2xhc3NSZWYpIGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCVBlcnNpc3RlbmNlVW5pdC5ERUZBVUxUX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFRF9QUk9QRVJUWSwKLQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VEX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlc1N0cmluZ0hvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRFeGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpOwotCi0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0KLQkJCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzV2l0aERlZmF1bHQsCi0JCQkJCQkJZGVmYXVsdFN0cmluZ1ZhbHVlCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2V4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXM7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSAoQ2xhc3NSZWYpIGVsZW1lbnQ7Ci0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkJaW1hZ2UgPSBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JUeXBlTWFwcGluZyhwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkJCX0KLQotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBpbWFnZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5XQVJOSU5HKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlDbGFzc1JlZiBjbGFzc1JlZiA9IChDbGFzc1JlZikgZWxlbWVudDsKLQkJCQlTdHJpbmcgbmFtZSA9IGNsYXNzUmVmLmdldENsYXNzTmFtZSgpOwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfbWFwcGVkQ2xhc3Nlc05vTmFtZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPENsYXNzUmVmPiBidWlsZEl0ZW1MaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxDbGFzc1JlZj4oCi0JCQlidWlsZExpc3RIb2xkZXIoKSwKLQkJCUNsYXNzUmVmLkpBVkFfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZLAotCQkJQ2xhc3NSZWYuQ0xBU1NfTkFNRV9QUk9QRVJUWQotCQkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Q2xhc3NSZWY+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIENsYXNzUmVmPihnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfQ0xBU1NfUkVGX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxDbGFzc1JlZj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZENsYXNzUmVmc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENsYXNzUmVmPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2xhc3NSZWY+KCk7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciB0aGUgT3BlbiBUeXBlIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBzZWxlY3RlZCB0eXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyCi0JICogY2FuY2VsbGVkIHRoZSBkaWFsb2cKLQkgKi8KLQlwcml2YXRlIElUeXBlIGNob29zZVR5cGUoKSB7Ci0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHsgcm9vdC5nZXRKYXZhUHJvamVjdCgpIH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKLQkJCQlzaGVsbCgpLAotCQkJCXNlcnZpY2UsCi0JCQkJc2NvcGUsCi0JCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsCi0JCQkJZmFsc2UsCi0JCQkJIiIKLQkJCSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ1RpdGxlKTsKLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlKTsKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZSBmaW5kVHlwZShDbGFzc1JlZiBjbGFzc1JlZikgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCk7Ci0KLQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoY2xhc3NOYW1lKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIERlc2NyaXB0aW9uCi0JCWJ1aWxkTXVsdGlMaW5lTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9kZXNjcmlwdGlvbgotCQkpOwotCi0JCS8vIExpc3QgcGFuZQotCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8UGVyc2lzdGVuY2VVbml0PigKLQkJCXRoaXMsCi0JCQljb250YWluZXIsCi0JCQlidWlsZEFkYXB0ZXIoKSwKLQkJCWJ1aWxkSXRlbUxpc3RIb2xkZXIoKSwKLQkJCWJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZVRhYmxlKHRhYmxlKTsKLQotCQkJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0YWJsZS5nZXRQYXJlbnQoKTsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSAgID0gKEdyaWREYXRhKSBjb250YWluZXIuZ2V0TGF5b3V0RGF0YSgpOwotCQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA3NTsKLQkJCX0KLQkJfTsKLQotCQlidWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2V4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXMsCi0JCQlidWlsZEV4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNIb2xkZXIoKSwKLQkJCWJ1aWxkRXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlc1N0cmluZ0hvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5NYXBwZWRDbGFzcyhDbGFzc1JlZiBjbGFzc1JlZikgewotCi0JCUlUeXBlIHR5cGUgPSBmaW5kVHlwZShjbGFzc1JlZik7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSB0eXBlLmdldFBhcmVudCgpOwotCQkJCUphdmFVSS5vcGVuSW5FZGl0b3IoamF2YUVsZW1lbnQsIHRydWUsIHRydWUpOwotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJSUphdmFQcm9qZWN0IHJvb3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiByb290LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2OWFlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIEdlbmVyYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXQKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGUKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxQZXJzaXN0ZW5jZVVuaXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ICAgID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICAgICA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgICAgICAgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCAgICAgID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSAgICA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCAgICAgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7Ci0KLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGJ1aWxkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1VOSVRfQ09OTkVDVElPTjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURhdGFiYXNlUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfZGF0YWJhc2UKLQkJKTsKLQotCQluZXcgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVHZW5lcmFsUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfZ2VuZXJhbAotCQkpOwotCi0JCW5ldyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplRGF0YWJhc2VQYW5lKGNvbnRhaW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIEltYWdlIGdldFBhZ2VJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKLQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlX2Nvbm5lY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgICA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgICAgICAgICA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjM2EzYWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEpUQSBEYXRhc291cmNlIE5hbWU6ICAgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5vbi1KVEEgRGF0YXNvdXJjZSBOYW1lOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXQKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8UGVyc2lzdGVuY2VVbml0PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEpUQURhdGFzb3VyY2VOYW1lQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUsIEJvb2xlYW4+KGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLkpUQTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRKVEFEYXRhc291cmNlTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0LkpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEp0YURhdGFTb3VyY2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldEp0YURhdGFTb3VyY2UodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTm9uSlRBRGF0YXNvdXJjZU5hbWVCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSwgQm9vbGVhbj4oYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTm9uSlRBRGF0YXNvdXJjZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5OT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0Tm9uSnRhRGF0YVNvdXJjZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPiBidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJUGVyc2lzdGVuY2VVbml0LkRFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwKLQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIEpUQSBEYXRhc291cmNlIE5hbWUgd2lkZ2V0cwotCQlUZXh0IHRleHQgPSBidWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZV9qdGFEYXRhc291cmNlTmFtZSwKLQkJCWJ1aWxkSlRBRGF0YXNvdXJjZU5hbWVIb2xkZXIoKQotCQkpOwotCi0JCWluc3RhbGxKVEFEYXRhc291cmNlTmFtZUVuYWJsZXIodGV4dCk7Ci0KLQkJLy8gTm9uLUpUQSBEYXRhc291cmNlIE5hbWUgd2lkZ2V0cwotCQl0ZXh0ID0gYnVpbGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGVfbm9uSnRhRGF0YXNvdXJjZU5hbWUsCi0JCQlidWlsZE5vbkpUQURhdGFzb3VyY2VOYW1lSG9sZGVyKCkKLQkJKTsKLQotCQlpbnN0YWxsTm9uSlRBRGF0YXNvdXJjZU5hbWVFbmFibGVyKHRleHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsSlRBRGF0YXNvdXJjZU5hbWVFbmFibGVyKFRleHQgdGV4dCkgewotCQluZXcgQ29udHJvbEVuYWJsZXIoYnVpbGRKVEFEYXRhc291cmNlTmFtZUJvb2xlYW5Ib2xkZXIoKSwgdGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxOb25KVEFEYXRhc291cmNlTmFtZUVuYWJsZXIoVGV4dCB0ZXh0KSB7Ci0JCW5ldyBDb250cm9sRW5hYmxlcihidWlsZE5vbkpUQURhdGFzb3VyY2VOYW1lQm9vbGVhbkhvbGRlcigpLCB0ZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTQ5YWJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBUcmFuc2FjdGlvbiBUeXBlOiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Ci0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8UGVyc2lzdGVuY2VVbml0PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZShBYnN0cmFjdFBhbmU8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXQuREVGQVVMVF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuY2xhc3MsCi0JCQkJCVBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gVHJhbnNhY3Rpb24gVHlwZSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZV90cmFuc2FjdGlvblR5cGUsCi0JCQlidWlsZFRyYW5zYWN0aW9uVHlwZUNvbWJvKGNvbnRhaW5lcikuZ2V0Q29udHJvbCgpCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxZjA2Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBHZW5lcmFsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIE5hbWU6ICAgICAgICAgICAgICAgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIFBlcnNpc3RlbmNlIFByb3ZpZGVyOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBNYXBwZWQgQ2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8IFBlcnNpc3RlbmNlVW5pdE1hcHBlZENsYXNzZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIFhNTCBNYXBwaW5nIEZpbGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdAotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZQotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNYXBwZWRDbGFzc2VzQ29tcG9zaXRlCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8UGVyc2lzdGVuY2VVbml0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0vLwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUphdmFBcmNoaXZlc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotLy8KLS8vCQljb250YWluZXIgPSBidWlsZFNlY3Rpb24oCi0vLwkJCWNvbnRhaW5lciwKLS8vCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZV9qYXZhQXJjaGl2ZXMKLS8vCQkpOwotLy8KLS8vCQluZXcgUGVyc2lzdGVuY2VVbml0SmF2YUFyY2hpdmVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0vLwl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ICAgID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICAgICA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgICAgICAgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCAgICAgID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSAgICA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCAgICAgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7Ci0KLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGJ1aWxkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQZXJzaXN0ZW5jZVByb3ZpZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuUFJPVklERVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQcm92aWRlcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0UHJvdmlkZXIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFBlcnNpc3RlbmNlVW5pdE5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFBlcnNpc3RlbmNlVW5pdERlc2NyaXB0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuREVTQ1JJUFRJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0RGVzY3JpcHRpb24odmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfVU5JVF9HRU5FUkFMOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRQYWdlSW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9nZW5lcmFsOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2dlbmVyYWwKLQkJKTsKLQotCQkvLyBOYW1lIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX25hbWUsCi0JCQlidWlsZFBlcnNpc3RlbmNlVW5pdE5hbWVIb2xkZXIoKQotCQkpOwotCi0JCS8vIFBlcnNpc3RlbmNlIFByb3ZpZGVyIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX3BlcnNpc3RlbmNlUHJvdmlkZXIsCi0JCQlidWlsZFBlcnNpc3RlbmNlUHJvdmlkZXJIb2xkZXIoKQotCQkpOwotCi0JCS8vIERlc2NyaXB0aW9uIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2Rlc2NyaXB0aW9uLAotCQkJYnVpbGRQZXJzaXN0ZW5jZVVuaXREZXNjcmlwdGlvbkhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVKUEFNYXBwaW5nRGVzY3JpcHRvcnNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBidWlsZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qcGFNYXBwaW5nRGVzY3JpcHRvcnMsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qcGFNYXBwaW5nRGVzY3JpcHRvcnNfZGVzY3JpcHRpb24KLQkJKTsKLQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIuZ2V0UGFyZW50KCkpOwotCi0JCW5ldyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbml0aWFsaXplR2VuZXJhbFBhbmUoY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZU1hcHBlZENsYXNzZXNQYW5lKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVKUEFNYXBwaW5nRGVzY3JpcHRvcnNQYW5lKGNvbnRhaW5lcik7Ci0vLwkJaW5pdGlhbGl6ZUphdmFBcmNoaXZlc1BhbmUoY29udGFpbmVyKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplTWFwcGVkQ2xhc3Nlc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX21hcHBlZENsYXNzZXMKLQkJKTsKLQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIuZ2V0UGFyZW50KCkpOwotCi0JCW5ldyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgICA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgICAgICAgICA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTI0NzEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Ci0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8UGVyc2lzdGVuY2VVbml0PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0SlBBTWFwcGluZ0Rlc2NyaXB0b3JzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNWIwYjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBvc3RFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Ci0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8UGVyc2lzdGVuY2VVbml0PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0cyBhIGRpYWxvZyBzaG93aW5nIGEgdHJlZSBzdHJ1Y3R1cmUgb2YgdGhlIHNvdXJjZSBwYXRocyB3aGVyZSB0aGUKLQkgKiBvbmx5IGZpbGVzIHNob3duIGFyZSBKUEEgbWFwcGluZyBkZXNjcmlwdG9ycyBmaWxlLiBUaGUgWE1MIGZpbGUgaGFzIHRvIGJlCi0JICogYW4gWE1MIGZpbGUgd2l0aCB0aGUgcm9vdCB0YWc6ICZsdDtlbnRpdHktbWFwcGluZ3MmZ3Q7LgotCSAqCi0JICogQHBhcmFtIGxpc3RTZWxlY3Rpb25Nb2RlbCBUaGUgc2VsZWN0aW9uIG1vZGVsIHVzZWQgdG8gc2VsZWN0IHRoZSBuZXcgZmlsZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSlBBTWFwcGluZ0Rlc2NyaXB0b3IoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQotCQlFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coCi0JCQlzaGVsbCgpLAotCQkJbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwKLQkJCW5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKQotCQkpOwotCi0JCWRpYWxvZy5zZXRIZWxwQXZhaWxhYmxlKGZhbHNlKTsKLQkJZGlhbG9nLnNldFZhbGlkYXRvcihidWlsZFZhbGlkYXRvcigpKTsKLQkJZGlhbG9nLnNldFRpdGxlKEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfbWFwcGluZ0ZpbGVEaWFsb2dfdGl0bGUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX21hcHBpbmdGaWxlRGlhbG9nX21lc3NhZ2UpOwotCQlkaWFsb2cuYWRkRmlsdGVyKG5ldyBYbWxGaWxlVmlld2VyRmlsdGVyKHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKSkpOwotCQlkaWFsb2cuc2V0SW5wdXQocHJvamVjdCk7Ci0JCWRpYWxvZy5zZXRDb21wYXJhdG9yKG5ldyBSZXNvdXJjZUNvbXBhcmF0b3IoUmVzb3VyY2VDb21wYXJhdG9yLk5BTUUpKTsKLQotCQlTV1RVdGlsLnNob3coCi0JCQlkaWFsb2csCi0JCQlidWlsZFNlbGVjdGlvbkRpYWxvZ1Bvc3RFeGVjdXRpb24obGlzdFNlbGVjdGlvbk1vZGVsKQotCQkpOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkSlBBTWFwcGluZ0Rlc2NyaXB0b3IobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCXN1YmplY3QoKS5yZW1vdmVTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZigoTWFwcGluZ0ZpbGVSZWYpIGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgICAgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCAgID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCAgPSAwOwotCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBidWlsZFBhbmUocGFyZW50LCBsYXlvdXQpOwotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxNYXBwaW5nRmlsZVJlZj4gYnVpbGRJdGVtTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWY+KAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlNYXBwaW5nRmlsZVJlZi5GSUxFX05BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5NQVBQSU5HX0ZJTEVfUkVGKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IChNYXBwaW5nRmlsZVJlZikgZWxlbWVudDsKLQkJCQlTdHJpbmcgbmFtZSA9IG1hcHBpbmdGaWxlUmVmLmdldEZpbGVOYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX29ybU5vTmFtZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX01BUFBJTkdfRklMRV9SRUZfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TWFwcGluZ0ZpbGVSZWY+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxNYXBwaW5nRmlsZVJlZj4oKTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248RWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c+IGJ1aWxkU2VsZWN0aW9uRGlhbG9nUG9zdEV4ZWN1dGlvbihmaW5hbCBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZykgewotCi0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWludCBpbmRleCA9IHN1YmplY3QoKS5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCk7Ci0KLQkJCQlmb3IgKE9iamVjdCByZXN1bHQgOiBkaWFsb2cuZ2V0UmVzdWx0KCkpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzdWx0OwotCQkJCQlJUGF0aCBmaWxlUGF0aCA9IHJlbW92ZVNvdXJjZVBhdGgoZmlsZSk7Ci0KLQkJCQkJTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBzdWJqZWN0KCkuYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoaW5kZXgrKyk7Ci0JCQkJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKGZpbGVQYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0KLQkJCQkJbGlzdFNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkVmFsdWUobWFwcGluZ0ZpbGVSZWYpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotCi0JCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsKLQkJCQl9Ci0KLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogc2VsZWN0aW9uKSB7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCAiIik7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBMaXN0IHBhbmUKLQkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFBlcnNpc3RlbmNlVW5pdD4oCi0JCQl0aGlzLAotCQkJY29udGFpbmVyLAotCQkJYnVpbGRBZGFwdGVyKCksCi0JCQlidWlsZEl0ZW1MaXN0SG9sZGVyKCksCi0JCQlidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCXBhcmVudCA9IHN1cGVyLmJ1aWxkQ29udGFpbmVyKHBhcmVudCk7Ci0JCQkJdXBkYXRlR3JpZERhdGEocGFyZW50KTsKLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJCXN1cGVyLmluaXRpYWxpemVMYXlvdXQoY29udGFpbmVyKTsKLQkJCQl1cGRhdGVHcmlkRGF0YShnZXRDb250YWluZXIoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZ2l2ZW4gZmlsZSBleGNsdWRpbmcgdGhlIHNvdXJjZSBmb2xkZXIuCi0JICoKLQkgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byByZXRyaWV2ZSBpdHMgcGF0aCBtaW51cyB0aGUgc291cmNlIGZvbGRlcgotCSAqIEByZXR1cm4gVGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGdpdmVuIHBhdGgsIHRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAqIHNvdXJjZSBwYXRoCi0JICovCi0JcHJpdmF0ZSBJUGF0aCByZW1vdmVTb3VyY2VQYXRoKElGaWxlIGZpbGUpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gc3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQlJUGF0aCBmaWxlUGF0aCA9IGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCi0JCXRyeSB7Ci0JCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpKSB7Ci0KLQkJCQkvLyBPbmx5IGNoZWNrIGZvciBzb3VyY2UgcGF0aHMKLQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQotCQkJCQkvLyBSZXRyaWV2ZSB0aGUgc291cmNlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHByb2plY3QKLQkJCQkJSVBhdGggc291cmNlUGF0aCA9IGVudHJ5LmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCi0JCQkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZSBwYXRoIHN0YXJ0cyB3aXRoIHRoZSBzb3VyY2UgcGF0aAotCQkJCQlpZiAoc291cmNlUGF0aC5pc1ByZWZpeE9mKGZpbGVQYXRoKSkgewotCQkJCQkJaW50IGNvdW50ID0gc291cmNlUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQkJCWZpbGVQYXRoID0gZmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjb3VudCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJfQotCi0JCXJldHVybiBmaWxlUGF0aDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSAgID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICAgID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQkvL1RPRE8gbWlnaHQgd2Ugd2FudCB0byBkbyB0aGlzIHdpdGggY29udGVudC10eXBlcyBpbnN0ZWFkPyAgaXMgdGhlcmUKLQkvL3RoZSBwb3RlbnRpYWwgdGhhdCBhbiBleHRlbmRlciBjb3VsZCBoYWUgYSBtYXBwaW5nIGZpbGUgdGhhdCBkb2Vzbid0IGhhdmUKLQkvL2VudGl0eS1tYXBwaW5ncyBhcyB0aGUgcm9vdCBub2RlPz8KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgdG8gcGFyc2UgdGhlIHJvb3QgdGFnIChsb2NhbCBuYW1lKSBvbmx5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFNBWEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgcm9vdFRhZ05hbWU7Ci0KLQkJcHVibGljIFN0cmluZyBnZXRSb290VGFnTmFtZSgpIHsKLQkJCXJldHVybiByb290VGFnTmFtZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCi0JCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSgpOwotCQkJaW5wdXRTb3VyY2Uuc2V0Qnl0ZVN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKLQkJCXJldHVybiBpbnB1dFNvdXJjZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJCXRoaXMucm9vdFRhZ05hbWUgPSBuYW1lOwotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmaWx0ZXIgd2lsbCBkZW55IHNob3dpbmcgYW55IGZpbGUgdGhhdCBhcmUgbm90IFhNTCBmaWxlcyBvciBmb2xkZXJzCi0JICogdGhhdCBkb24ndCBjb250YWluIGFueSBYTUwgZmlsZXMgaW4gaXRzIHN1Yi1oaWVyYXJjaHkuIFRoZSBYTUwgZmlsZXMgYXJlCi0JICogcGFydGlhbGx5IHBhcnNlZCB0byBvbmx5IGFjY2VwdCBKUEEgbWFwcGluZyBkZXNjcmlwdG9ycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxGaWxlVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQotCQlwcml2YXRlIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQotCQlYbWxGaWxlVmlld2VyRmlsdGVyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQkJfQotCi0JCS8qKgotCQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgKGFuIFhNTCBmaWxlKSBpcyBhIEpQQSBtYXBwaW5nCi0JCSAqIGRlc2NyaXB0b3IgZmlsZS4gSXQgaGFzIHRvIGJlIGEgdmFsaWQgWE1MIGZpbGUgd2l0aCBhIHJvb3QgZWxlbWVudAotCQkgKiBuYW1lZCAiZW50aXR5LW1hcHBpbmdzIi4KLQkJICoKLQkJICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gcGFyc2UgYW5kIHNlZSBpZiBpdCdzIGEgbWFwcGluZyBkZXNjcmlwdG9yIGZpbGUKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhIHZhbGlkIFhNTCBmaWxlIHdpdGggYQotCQkgKiByb290IGVsZW1lbnQgbmFtZWQgImVudGl0eS1tYXBwaW5ncyI7IDxjb2RlPmZhbHNlPC9jb2RlPiBpbiBhbnkgb3RoZXIKLQkJICogY2FzZQotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGlzTWFwcGluZ0ZpbGUoSUZpbGUgZmlsZSkgewotCQkJdHJ5IHsKLQkJCQlTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQkJU0FYUGFyc2VyIHNheFBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCQkJU0FYSGFuZGxlciBoYW5kbGVyID0gbmV3IFNBWEhhbmRsZXIoKTsKLQkJCQl0cnkgewotCQkJCQlzYXhQYXJzZXIucGFyc2UoZmlsZS5nZXRSYXdMb2NhdGlvblVSSSgpLnRvVVJMKCkub3BlblN0cmVhbSgpLCBoYW5kbGVyKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIElnbm9yZSBzaW5jZSBpdCdzIGNhdXNlZCBieSBTQVhIYW5kbGVyIHRvIHN0b3AgdGhlIHBhcnNpbmcKLQkJCQkJLy8gdGhlIG1vbWVudCB0aGUgbG9jYWwgbmFtZSBpcyByZXRyaWV2ZWQKLQkJCQl9Ci0JCQkJcmV0dXJuIE9ybVhtbE1hcHBlci5FTlRJVFlfTUFQUElOR1MuZXF1YWxzSWdub3JlQ2FzZShoYW5kbGVyLmdldFJvb3RUYWdOYW1lKCkpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1htbEZpbGUoSUZpbGUgZmlsZSkgewotCQkJcmV0dXJuICJ4bWwiLmVxdWFsc0lnbm9yZUNhc2UoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLAotCQkgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHBhcmVudEVsZW1lbnQsCi0JCSAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCkgewotCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gaXNYbWxGaWxlKGZpbGUpICYmIGlzTWFwcGluZ0ZpbGUoZmlsZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpIGVsZW1lbnQ7Ci0KLQkJCQl0cnkgewotCQkJCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpKSB7Ci0JCQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQkJCQlpZiAoIWVudHJ5LmdldFBhdGgoKS5pc1ByZWZpeE9mKGZvbGRlci5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKSkKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBmb2xkZXIubWVtYmVycygpKSB7Ci0JCQkJCQlpZiAoc2VsZWN0KHZpZXdlciwgZm9sZGVyLCByZXNvdXJjZSkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJSnB0VWlQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpwdFVpUGx1Z2luLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTJkN2EwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVUYWJsZVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIFByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgQWRkUmVtb3ZlVGFibGVQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdAotICogQHNlZSBCYXNlSnBhVWlGYWN0b3J5IC0gVGhlIGludm9rZXIKLSAqIEBzZWUgQWRkUmVtb3ZlVGFibGVQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8UGVyc2lzdGVuY2VVbml0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlIb2xkZXI7Ci0JcHJpdmF0ZSBUYWJsZVBhbmUgdGFibGVQYW5lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gYnVpbGRQcm9wZXJ0aWVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFByb3BlcnR5PihnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5QUk9QRVJUSUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxQcm9wZXJ0eT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5wcm9wZXJ0aWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5wcm9wZXJ0aWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBidWlsZFByb3BlcnR5TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIEFkZFJlbW92ZVRhYmxlUGFuZS5BZGFwdGVyIGJ1aWxkVGFibGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZVRhYmxlUGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gc3ViamVjdCgpLmFkZFByb3BlcnR5KCk7Ci0JCQkJcHJvcGVydHlIb2xkZXIuc2V0VmFsdWUocHJvcGVydHkpOwotCi0JCQkJaW50IGluZGV4ID0gc3ViamVjdCgpLnByb3BlcnRpZXNTaXplKCkgLSAxOwotCQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZVBhbmUuZ2V0TWFpbkNvbnRyb2woKS5nZXRJdGVtKGluZGV4KTsKLQkJCQl0YWJsZVBhbmUuZ2V0TWFpbkNvbnRyb2woKS5zaG93SXRlbSh0YWJsZUl0ZW0pOwotCi0JCQkJdGFibGVQYW5lLmdldFRhYmxlVmlld2VyKCkuZWRpdEVsZW1lbnQoCi0JCQkJCXByb3BlcnR5LAotCQkJCQlQcm9wZXJ0eUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4KLQkJCQkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJc3ViamVjdCgpLnJlbW92ZVByb3BlcnR5KChQcm9wZXJ0eSkgaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1VOSVRfUFJPUEVSVElFUzsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEltYWdlIGdldFBhZ2VJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV9wcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXByb3BlcnR5SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQcm9wZXJ0eT4oKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYnVpbGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX3Byb3BlcnRpZXNfZGVzY3JpcHRpb24KLQkJKTsKLQotCQl0YWJsZVBhbmUgPSBuZXcgVGFibGVQYW5lKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvcGVydHlDb2x1bW5BZGFwdGVyIGltcGxlbWVudHMgQ29sdW1uQWRhcHRlcjxQcm9wZXJ0eT4gewotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DT1VOVCA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfQ09MVU1OID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OX0NPTFVNTiA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX0NPTFVNTiA9IDI7Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcihQcm9wZXJ0eSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQcm9wZXJ0eSwgU3RyaW5nPihQcm9wZXJ0eS5OQU1FX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVmFsdWVIb2xkZXIoUHJvcGVydHkgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UHJvcGVydHksIFN0cmluZz4oUHJvcGVydHkuVkFMVUVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRWYWx1ZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGNlbGxNb2RlbHMoUHJvcGVydHkgc3ViamVjdCkgewotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBob2xkZXJzID0gbmV3IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W0NPTFVNTl9DT1VOVF07Ci0JCQlob2xkZXJzW1NFTEVDVElPTl9DT0xVTU5dID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JCQlob2xkZXJzW05BTUVfQ09MVU1OXSAgICAgID0gYnVpbGROYW1lSG9sZGVyKHN1YmplY3QpOwotCQkJaG9sZGVyc1tWQUxVRV9DT0xVTU5dICAgICA9IGJ1aWxkVmFsdWVIb2xkZXIoc3ViamVjdCk7Ci0JCQlyZXR1cm4gaG9sZGVyczsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQlyZXR1cm4gQ09MVU1OX0NPVU5UOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSBQcm9wZXJ0eUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU46IHsKLQkJCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX25hbWVDb2x1bW47Ci0JCQkJfQotCi0JCQkJY2FzZSBQcm9wZXJ0eUNvbHVtbkFkYXB0ZXIuVkFMVUVfQ09MVU1OOiB7Ci0JCQkJCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV92YWx1ZUNvbHVtbjsKLQkJCQl9Ci0KLQkJCQlkZWZhdWx0OiB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQotCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSBQcm9wZXJ0eUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU46IHsKLQkJCQkJdmFsdWUgPSBwcm9wZXJ0eS5nZXROYW1lKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWNhc2UgUHJvcGVydHlDb2x1bW5BZGFwdGVyLlZBTFVFX0NPTFVNTjogewotCQkJCQl2YWx1ZSA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQl2YWx1ZSA9ICIiOwotCQkJfQotCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlUGFuZSBleHRlbmRzIEFkZFJlbW92ZVRhYmxlUGFuZTxQZXJzaXN0ZW5jZVVuaXQ+IHsKLQotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBTRUxFQ1RJT05fQ09MVU1OID0gInNlbGVjdGlvbiI7Ci0KLQkJcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQotCQlwcml2YXRlIFRhYmxlUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlLnRoaXMsCi0JCQkgICAgICBwYXJlbnQsCi0JCQkJCWJ1aWxkVGFibGVBZGFwdGVyKCksCi0JCQkJCWJ1aWxkUHJvcGVydGllc0xpc3RIb2xkZXIoKSwKLQkJCQkJcHJvcGVydHlIb2xkZXIsCi0JCQkJCWJ1aWxkUHJvcGVydHlMYWJlbFByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBDZWxsRWRpdG9yW10gYnVpbGRDZWxsRWRpdG9ycyhUYWJsZSB0YWJsZSkgewotCQkJcmV0dXJuIG5ldyBDZWxsRWRpdG9yW10gewotCQkJCW51bGwsCi0JCQkJbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKSwKLQkJCQluZXcgVGV4dENlbGxFZGl0b3IodGFibGUpCi0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBJQ2VsbE1vZGlmaWVyIGJ1aWxkQ2VsbE1vZGlmaWVyKCkgewotCQkJcmV0dXJuIG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkJcmV0dXJuICFTRUxFQ1RJT05fQ09MVU1OLmVxdWFscyhwcm9wZXJ0eSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJCVByb3BlcnR5IHByb3BlcnR5TW9kZWwgPSAoUHJvcGVydHkpIGVsZW1lbnQ7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLQkJCQkJaWYgKHByb3BlcnR5ID09IFByb3BlcnR5Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJCXZhbHVlID0gcHJvcGVydHlNb2RlbC5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocHJvcGVydHkgPT0gUHJvcGVydHkuVkFMVUVfUFJPUEVSVFkpIHsKLQkJCQkJCXZhbHVlID0gcHJvcGVydHlNb2RlbC5nZXRWYWx1ZSgpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gIiI7Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eU1vZGVsOwotCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLQkJCQkJCXByb3BlcnR5TW9kZWwgPSAoUHJvcGVydHkpIHRhYmxlSXRlbS5nZXREYXRhKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwcm9wZXJ0eU1vZGVsID0gKFByb3BlcnR5KSBlbGVtZW50OwotCQkJCQl9Ci0KLQkJCQkJaWYgKHByb3BlcnR5ID09IFByb3BlcnR5Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJCXByb3BlcnR5TW9kZWwuc2V0TmFtZSh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwcm9wZXJ0eSA9PSBQcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSkgewotCQkJCQkJcHJvcGVydHlNb2RlbC5zZXRWYWx1ZSh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbHVtbkFkYXB0ZXI8Pz4gYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNvbHVtbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nW10gYnVpbGRDb2x1bW5Qcm9wZXJ0aWVzKCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQkJU0VMRUNUSU9OX0NPTFVNTiwKLQkJCQlQcm9wZXJ0eS5OQU1FX1BST1BFUlRZLAotCQkJCVByb3BlcnR5LlZBTFVFX1BST1BFUlRZCi0JCQl9OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHN1cGVyLmJ1aWxkQ29udGFpbmVyKHBhcmVudCk7Ci0JCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0KLQkJVGFibGVWaWV3ZXIgZ2V0VGFibGVWaWV3ZXIoKSB7Ci0JCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJCXN1cGVyLmluaXRpYWxpemVNYWluQ29tcG9zaXRlKAotCQkJCWNvbnRhaW5lciwKLQkJCQlhZGFwdGVyLAotCQkJCWxpc3RIb2xkZXIsCi0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJaGVscElkCi0JCQkpOwotCi0JCQlUYWJsZSB0YWJsZSA9IGdldE1haW5Db250cm9sKCk7Ci0KLQkJCS8vIE1ha2UgdGhlIHNlbGVjdGlvbiBjb2x1bW4gbm9uLXJlc2l6YWJsZSBzaW5jZSBpdCdzIG9ubHkgdXNlZCB0bwotCQkJLy8gZWFzZSB0aGUgc2VsZWN0aW9uIG9mIHJvd3MKLQkJCVRhYmxlQ29sdW1uIHNlbGVjdGlvbkNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihQcm9wZXJ0eUNvbHVtbkFkYXB0ZXIuU0VMRUNUSU9OX0NPTFVNTik7Ci0JCQlzZWxlY3Rpb25Db2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLQkJCXNlbGVjdGlvbkNvbHVtbi5zZXRXaWR0aCgyMCk7Ci0KLQkJCS8vIEluc3RhbGwgdGhlIGVkaXRvcnMKLQkJCXRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJCXRhYmxlVmlld2VyLnNldENlbGxFZGl0b3JzKGJ1aWxkQ2VsbEVkaXRvcnModGFibGUpKTsKLQkJCXRhYmxlVmlld2VyLnNldENlbGxNb2RpZmllcihidWlsZENlbGxNb2RpZmllcigpKTsKLQkJCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMoYnVpbGRDb2x1bW5Qcm9wZXJ0aWVzKCkpOwotCi0JCQlnZXRDb250YWluZXIoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNwZWN0aXZlL0pwYVBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc3BlY3RpdmUvSnBhUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4Yzc0NmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc3BlY3RpdmUvSnBhUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAgICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuUHJvamVjdEV4cGxvcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc0NvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEpwYVBlcnNwZWN0aXZlRmFjdG9yeSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJU3RyaW5nIGVkaXRvckFyZWEgPSBsYXlvdXQuZ2V0RWRpdG9yQXJlYSgpOwotCi0JCS8vUGFja2FnZSBhcmVhCi0JCUlGb2xkZXJMYXlvdXQgZm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigKLQkJCQkibGVmdCIsIElQYWdlTGF5b3V0LkxFRlQsIChmbG9hdCkgMC4yNSwgZWRpdG9yQXJlYSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9sZGVyLmFkZFZpZXcoUHJvamVjdEV4cGxvcmVyLlZJRVdfSUQpOwotCQlmb2xkZXIuYWRkUGxhY2Vob2xkZXIoSmF2YVVJLklEX1RZUEVfSElFUkFSQ0hZKTsKLQkJZm9sZGVyLmFkZFBsYWNlaG9sZGVyKElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCi0JCS8vRGF0YWJhc2UgRXhwbG9yZXIgYXJlYQotCQlsYXlvdXQuYWRkVmlldygib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5EYXRhU291cmNlRXhwbG9yZXJOYXZpZ2F0b3IiLCAvLyROT04tTkxTLTEkCi0JCQlJUGFnZUxheW91dC5CT1RUT00sIChmbG9hdCkgMC42MCwgUHJvamVjdEV4cGxvcmVyLlZJRVdfSUQpOwotCi0JCS8vUHJvYmxlbXMvQ29uc29sZSBhcmVhCi0JCUlGb2xkZXJMYXlvdXQgb3V0cHV0Rm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigKLQkJCQkiYm90dG9tIiwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAoZmxvYXQpIDAuNjAsIGVkaXRvckFyZWEpOyAvLyROT04tTkxTLTEkCi0JCW91dHB1dEZvbGRlci5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotCQlvdXRwdXRGb2xkZXIuYWRkUGxhY2Vob2xkZXIoSVByb2dyZXNzQ29uc3RhbnRzLlBST0dSRVNTX1ZJRVdfSUQpOwotCi0JCS8vSlBBIERldGFpbHMgKFNwbGl0IHdpdGggUHJvYmxlbXMvQ29uc29sZSBhcmVhKQotCQlsYXlvdXQuYWRkVmlldygib3JnLmVjbGlwc2UuanB0LnVpLmpwYURldGFpbHNWaWV3IiwKLQkJCQlJUGFnZUxheW91dC5SSUdIVCwgKGZsb2F0KSAuNjAsICJib3R0b20iKTsKLQkJCi0JCS8vSlBBIFN0cnVjdHVyZSBhcmVhCi0JCUlGb2xkZXJMYXlvdXQgb3V0bGluZUZvbGRlciA9IGxheW91dC5jcmVhdGVGb2xkZXIoCi0JCQkJInJpZ2h0IiwgSVBhZ2VMYXlvdXQuUklHSFQsIChmbG9hdCkgMC43NSwgZWRpdG9yQXJlYSk7IC8vJE5PTi1OTFMtMSQKLQkJb3V0bGluZUZvbGRlci5hZGRWaWV3KCJvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlldyIpOwotCQlvdXRsaW5lRm9sZGVyLmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0KLQkJbGF5b3V0LmFkZEFjdGlvblNldChKYXZhVUkuSURfQUNUSU9OX1NFVCk7Ci0JCWxheW91dC5hZGRBY3Rpb25TZXQoSmF2YVVJLklEX0VMRU1FTlRfQ1JFQVRJT05fQUNUSU9OX1NFVCk7Ci0JCWxheW91dC5hZGRBY3Rpb25TZXQoSVBhZ2VMYXlvdXQuSURfTkFWSUdBVEVfQUNUSU9OX1NFVCk7Ci0KLQkJLy8gdmlld3MgLSBqYXZhCi0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KEphdmFVSS5JRF9QQUNLQUdFUyk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KEphdmFVSS5JRF9UWVBFX0hJRVJBUkNIWSk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KEphdmFVSS5JRF9TT1VSQ0VfVklFVyk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KEphdmFVSS5JRF9KQVZBRE9DX1ZJRVcpOwotCi0JCS8vIHZpZXdzIC0gc3RhbmRhcmQgd29ya2JlbmNoCi0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KFByb2plY3RFeHBsb3Jlci5WSUVXX0lEKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCi0JCS8vIG5ldyBhY3Rpb25zIC0gSmF2YSBwcm9qZWN0IGNyZWF0aW9uIHdpemFyZAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3SnBhUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3UGFja2FnZUNyZWF0aW9uV2l6YXJkIik7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdDbGFzc0NyZWF0aW9uV2l6YXJkIik7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdJbnRlcmZhY2VDcmVhdGlvbldpemFyZCIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3RW51bUNyZWF0aW9uV2l6YXJkIik7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdBbm5vdGF0aW9uQ3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld1NvdXJjZUZvbGRlckNyZWF0aW9uV2l6YXJkIik7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdTbmlwcGV0RmlsZUNyZWF0aW9uV2l6YXJkIik7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5mb2xkZXIiKTsvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXcuZmlsZSIpOy8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLndpemFyZHMuVW50aXRsZWRUZXh0RmlsZVdpemFyZCIpOy8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVVpUmVnaXN0cnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVWlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjk0MzczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVWlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkgCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IEpwYVBsYXRmb3JtVWlSZWdpc3RyeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0lEID0gCi0JCSJqcGFQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUExBVEZPUk0gPQotCQkianBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUX0lEID0KLQkJImlkIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVF9DTEFTUyA9Ci0JCSJjbGFzcyI7IC8vJE5PTi1OTFMtMSQJCi0JCQotCS8vIGtleTogU3RyaW5nIGpwYVBsYXRmb3JtIGlkICB2YWx1ZTogSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNsYXNzIGRlc2NyaXB0b3IKLQlwcml2YXRlIE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4ganBhUGxhdGZvcm1zOwotCQotCQotCS8qIChub24gSmF2YSBkb2MpCi0JICogcmVzdHJpY3QgYWNjZXNzCi0JICovCi0JcHJpdmF0ZSBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkoKSB7Ci0JCWJ1aWxkSnBhUGxhdGZvcm1zKCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZEpwYVBsYXRmb3JtcygpIHsKLQkJdGhpcy5qcGFQbGF0Zm9ybXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBzdHJlYW0gPSBhbGxDb25maWdFbGVtZW50cygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWJ1aWxkSnBhUGxhdGZvcm0oc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSnBhUGxhdGZvcm0oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJaWYgKCEgY29uZmlnRWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMX1BMQVRGT1JNKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0lEKTsKLQkJU3RyaW5nIHBsYXRmb3JtQ2xhc3MgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9DTEFTUyk7Ci0JCQotCQlpZiAoKHBsYXRmb3JtSWQgPT0gbnVsbCkgfHwgKHBsYXRmb3JtQ2xhc3MgPT0gbnVsbCkpIHsKLQkJCWlmIChwbGF0Zm9ybUlkID09IG51bGwpIHsKLQkJCQlyZXBvcnRNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0lEKTsKLQkJCX0KLQkJCWlmIChwbGF0Zm9ybUNsYXNzID09IG51bGwpIHsKLQkJCQlyZXBvcnRNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0NMQVNTKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKHRoaXMuanBhUGxhdGZvcm1zLmNvbnRhaW5zS2V5KHBsYXRmb3JtSWQpKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgb3RoZXJDb25maWdFbGVtZW50ID0gdGhpcy5qcGFQbGF0Zm9ybXMuZ2V0KHBsYXRmb3JtSWQpOwotCQkJcmVwb3J0RHVwbGljYXRlUGxhdGZvcm0oY29uZmlnRWxlbWVudCwgb3RoZXJDb25maWdFbGVtZW50KTsKLQkJfQotCQkKLQkJdGhpcy5qcGFQbGF0Zm9ybXMucHV0KHBsYXRmb3JtSWQsIGNvbmZpZ0VsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybShTdHJpbmcgcGxhdGZvcm1JZCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQgPSB0aGlzLmpwYVBsYXRmb3Jtcy5nZXQocGxhdGZvcm1JZCk7Ci0JCQotCQlpZiAocmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKEpwYVBsYXRmb3JtVWkpIHJlZ2lzdGVyZWRDb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRfQ0xBU1MpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXBvcnRGYWlsZWRJbnN0YW50aWF0aW9uKHJlZ2lzdGVyZWRDb25maWdFbGVtZW50KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBhbGxDb25maWdFbGVtZW50cygpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gCi0JCQlyZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChKcHRVaVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9JRCk7Ci0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPElFeHRlbnNpb24sIEl0ZXJhdG9yPElDb25maWd1cmF0aW9uRWxlbWVudD4+KENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihleHRlbnNpb25zKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPElDb25maWd1cmF0aW9uRWxlbWVudD4gdHJhbnNmb3JtKElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCX0KLQkKLQkvLyBUT0RPIGV4dGVybmFsaXplIHN0cmluZ3MKLQlwcml2YXRlIHZvaWQgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSAKLQkJCSJBbiBleHRlbnNpb24gZWxlbWVudCBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXROYW1lKCkKLQkJCSsgIlwiIGluIHBsdWdpbiBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKQotCQkJKyAiXCIgaXMgbWlzc2luZyBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBcIiIKLQkJCSsgYXR0cmlidXRlTmFtZQotCQkJKyAiXCIuIjsKLQkJSnB0VWlQbHVnaW4ubG9nKG1lc3NhZ2UpOwotCX0KLQkKLQkvLyBUT0RPIGV4dGVybmFsaXplIHN0cmluZ3MKLQlwcml2YXRlIHZvaWQgcmVwb3J0RHVwbGljYXRlUGxhdGZvcm0oCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgb25lQ29uZmlnRWxlbWVudCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IG90aGVyQ29uZmlnRWxlbWVudCkgewotCQlTdHJpbmcgbWVzc2FnZSA9Ci0JCQkiVGhlIHBsdWdpbnMgXCIiCi0JCQkrIG9uZUNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkKLQkJCSsgIlwiIGFuZCBcIiIKLQkJCSsgb3RoZXJDb25maWdFbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpCi0JCQkrICJcIiBoYXZlIHJlZ2lzdGVyZWQgYSBkdXBsaWNhdGUgYXR0cmlidXRlIFwiaWRcIiAiCi0JCQkrICJmb3IgdGhlIGV4dGVuc2lvbiBlbGVtZW50IFwianBhUGxhdGZvcm1cIi4iOwotCQlKcHRVaVBsdWdpbi5sb2cobWVzc2FnZSk7Ci0JfQotCQkKLQkvLyBUT0RPIGV4dGVybmFsaXplIHN0cmluZ3MKLQlwcml2YXRlIHZvaWQgcmVwb3J0RmFpbGVkSW5zdGFudGlhdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkgewotCQlTdHJpbmcgbWVzc2FnZSA9Ci0JCQkiQ291bGQgbm90IGluc3RhbnRpYXRlIHRoZSBjbGFzcyBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfQ0xBU1MpCi0JCQkrICJcIiBmb3IgdGhlIGV4dGVuc2lvbiBlbGVtZW50IFwiIgotCQkJKyBjb25maWdFbGVtZW50LmdldE5hbWUoKQotCQkJKyAiXCIgaW4gdGhlIHBsdWdpbiBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKQotCQkJKyAiXCIuIjsKLQkJSnB0VWlQbHVnaW4ubG9nKG1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2Jhc2UvQmFzZUpwYVBsYXRmb3JtVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2Jhc2UvQmFzZUpwYVBsYXRmb3JtVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExMzUxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9iYXNlL0Jhc2VKcGFQbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5iYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1SZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5UeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzaWNNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRhYmxlVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JZE1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9PbmVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlZlcnNpb25NYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLkRlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5KYXZhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSmF2YUVudGl0eVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5OdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlscy5Pcm1EZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzLk9ybUVudGl0eVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5KYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSnBhUGxhdGZvcm1VaSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWkKLXsKLQkvLyBUT0RPOiBUcmFuc2Zvcm1lZCBpbnRvIGEgTGlzdCBmb3IgdGVzdGluZwotCXByaXZhdGUgTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IGRldGFpbHNQcm92aWRlcnM7Ci0KLQlwcml2YXRlIExpc3Q8VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzOwotCXByaXZhdGUgTGlzdDxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnM7Ci0JcHJpdmF0ZSBMaXN0PEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnM7Ci0KLQlwcml2YXRlIExpc3Q8VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IG9ybVR5cGVNYXBwaW5nVWlQcm92aWRlcnM7Ci0JcHJpdmF0ZSBMaXN0PEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gb3JtQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzOwotCXByaXZhdGUgTGlzdDxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmF1bHRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnM7Ci0KLQlwcml2YXRlIEpwYVVpRmFjdG9yeSBqcGFVaUZhY3Rvcnk7Ci0KLQotCXByb3RlY3RlZCBCYXNlSnBhUGxhdGZvcm1VaSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFVaUZhY3RvcnkgPSBjcmVhdGVKcGFVaUZhY3RvcnkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogc3RydWN0dXJlIHZpZXcgY29udGVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBidWlsZFN0cnVjdHVyZVByb3ZpZGVyKEpwYUZpbGUganBhRmlsZSkgewotCQlSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwgPSBqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKTsKLQkJU3RyaW5nIHJlc291cmNlVHlwZSA9IHJlc291cmNlTW9kZWwuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0KLQkJaWYgKHJlc291cmNlVHlwZSA9PSBSZXNvdXJjZU1vZGVsLkpBVkFfUkVTT1VSQ0VfVFlQRSkgewotCQkJcmV0dXJuIG5ldyBKYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKChKYXZhUmVzb3VyY2VNb2RlbCkgcmVzb3VyY2VNb2RlbCk7Ci0JCX0KLQkJZWxzZSBpZiAocmVzb3VyY2VUeXBlID09IFJlc291cmNlTW9kZWwuT1JNX1JFU09VUkNFX1RZUEUpIHsKLQkJCXJldHVybiBuZXcgT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKChPcm1SZXNvdXJjZU1vZGVsKSByZXNvdXJjZU1vZGVsKTsKLQkJfQotCQllbHNlIGlmIChyZXNvdXJjZVR5cGUgPT0gUmVzb3VyY2VNb2RlbC5QRVJTSVNURU5DRV9SRVNPVVJDRV9UWVBFKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKChQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWwpIHJlc291cmNlTW9kZWwpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBKcGFVaUZhY3RvcnkgY3JlYXRlSnBhVWlGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgSnBhVWlGYWN0b3J5IGdldEpwYVVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhVWlGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxKcGFEZXRhaWxzUHJvdmlkZXI+IGRldGFpbHNQcm92aWRlcnMoKSB7Ci0JCWlmICh0aGlzLmRldGFpbHNQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJdGhpcy5kZXRhaWxzUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+KCk7Ci0JCQl0aGlzLmFkZERldGFpbHNQcm92aWRlcnNUbyh0aGlzLmRldGFpbHNQcm92aWRlcnMpOwotCQl9Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxKcGFEZXRhaWxzUHJvdmlkZXI+KHRoaXMuZGV0YWlsc1Byb3ZpZGVycyk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzcGVjaWZ5IG1vcmUgb3IgZGlmZmVyZW50IGRldGFpbHMgcHJvdmlkZXJzLgotCSAqIFRoZSBkZWZhdWx0IGluY2x1ZGVzIHRoZSBKUEEgc3BlYy1kZWZpbmVkIGphdmEgYW5kIG9ybS54bWwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oQ29sbGVjdGlvbjxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKG5ldyBKYXZhRGV0YWlsc1Byb3ZpZGVyKCkpOwotCQlwcm92aWRlcnMuYWRkKG5ldyBPcm1EZXRhaWxzUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHVibGljIEpwYURldGFpbHNQcm92aWRlciBkZXRhaWxzUHJvdmlkZXIoSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlKSB7Ci0JCS8vIFRPRE86IFRvIGltcGxlbWVudCwgdGhpcyBpcyB3cml0dGVuIG9ubHkgZm9yIHRlc3RpbmcKLQkJZGV0YWlsc1Byb3ZpZGVycygpOwotCQlpZiAoc3RydWN0dXJlTm9kZSBpbnN0YW5jZW9mIEphdmFKcGFDb250ZXh0Tm9kZSkgewotCQkJcmV0dXJuIGRldGFpbHNQcm92aWRlcnMuZ2V0KDApOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGRldGFpbHNQcm92aWRlcnMuZ2V0KDEpOwotCQl9Ci0vLwkJZm9yIChJdGVyYXRvcjxJSnBhRGV0YWlsc1Byb3ZpZGVyPiBpID0gdGhpcy5kZXRhaWxzUHJvdmlkZXJzKCk7IGkuaGFzTmV4dCgpOyApIHsKLS8vCQkJSUpwYURldGFpbHNQcm92aWRlciBwcm92aWRlciA9IGkubmV4dCgpOwotLy8JCQlpZiAocHJvdmlkZXIuZmlsZUNvbnRlbnRUeXBlKCkuZXF1YWxzKGZpbGVDb250ZW50VHlwZSkpIHsKLS8vCQkJCXJldHVybiBwcm92aWRlcjsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBqYXZhVHlwZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJaWYgKHRoaXMuamF2YVR5cGVNYXBwaW5nVWlQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJdGhpcy5qYXZhVHlwZU1hcHBpbmdVaVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+KCk7Ci0JCQl0aGlzLmFkZEphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzVG8odGhpcy5qYXZhVHlwZU1hcHBpbmdVaVByb3ZpZGVycyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4oCi0JCQl0aGlzLmphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzcGVjaWZ5IG1vcmUgb3IgZGlmZmVyZW50IHR5cGUgbWFwcGluZyB1aSBwcm92aWRlcnMKLQkgKiBUaGUgZGVmYXVsdCBpbmNsdWRlcyB0aGUgSlBBIHNwZWMtZGVmaW5lZCBlbnRpdHksIG1hcHBlZCBzdXBlcmNsYXNzLCBlbWJlZGRhYmxlLAotCSAqIGFuZCBudWxsICh3aGVuIHRoZSBvdGhlcnMgZG9uJ3QgYXBwbHkpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVR5cGVNYXBwaW5nVWlQcm92aWRlcnNUbyhMaXN0PFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBwcm92aWRlcnMpIHsKLQkJcHJvdmlkZXJzLmFkZChOdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFFbnRpdHlVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVtYmVkZGFibGVVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBqYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlpZiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigpOwotCQkJdGhpcy5hZGRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzVG8odGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKTsKLQkJfQotCi0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigKLQkJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycwotCQkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIHVpIHByb3ZpZGVycy4KLQkgKiBUaGUgZGVmYXVsdCBpbmNsdWRlcyB0aGUgSlBBIHNwZWMtZGVmaW5lZCBiYXNpYywgZW1iZWRkZWQsIGVtYmVkZGVkSWQsIGlkLAotCSAqIG1hbnlUb01hbnksIG1hbnlUb09uZSwgb25lVG9NYW55LCBvbmVUb09uZSwgdHJhbnNpZW50LCBhbmQgdmVyc2lvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnNUbyhMaXN0PEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoQmFzaWNNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChJZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChNYW55VG9PbmVNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChOdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChWZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlpZiAodGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQl0aGlzLmRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+KCk7Ci0JCQl0aGlzLmFkZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzVG8odGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycyk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4oCi0JCQl0aGlzLmRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzcGVjaWZ5IG1vcmUgb3IgZGlmZmVyZW50IGRlZmF1bHQgamF2YSBhdHRyaWJ1dGUgbWFwcGluZyB1aSBwcm92aWRlcnMuCi0JICogVGhlIGRlZmF1bHQgaW5jbHVkZXMgdGhlIEpQQSBzcGVjLWRlZmluZWQgYmFzaWMsIGVtYmVkZGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnNUbyhMaXN0PEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVFbnRpdGllcyhKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlFbnRpdGllc0dlbmVyYXRvci5nZW5lcmF0ZShwcm9qZWN0LCBzZWxlY3Rpb24pOwotCX0KLQotCS8vICoqKioqKioqKioqKioqKiBPUk0gbWFwcGluZyBVSSBwcm92aWRlcnMgKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZhdWx0T3JtQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlpZiAodGhpcy5kZWZhdWx0T3JtQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXRoaXMuZGVmYXVsdE9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigpOwotCQkJdGhpcy5hZGREZWZhdWx0T3JtQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzVG8odGhpcy5kZWZhdWx0T3JtQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKTsKLQkJfQotCi0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigKLQkJCXRoaXMuZGVmYXVsdE9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycwotCQkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCBkZWZhdWx0IE9STSBhdHRyaWJ1dGUgbWFwcGluZwotCSAqIHVpIHByb3ZpZGVycy4gVGhlIGRlZmF1bHQgaGFzIG5vIHNwZWNpZmljIG1hcHBpbmdzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnNUbyhMaXN0PEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gcHJvdmlkZXJzKSB7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gb3JtQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlpZiAodGhpcy5vcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJdGhpcy5vcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4oKTsKLQkJCXRoaXMuYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzVG8odGhpcy5vcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+KAotCQkJdGhpcy5vcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgT1JNIGF0dHJpYnV0ZSBtYXBwaW5nIHVpCi0JICogcHJvdmlkZXJzLiBUaGUgZGVmYXVsdCBpbmNsdWRlcyB0aGUgSlBBIHNwZWMtZGVmaW5lZCBiYXNpYywgZW1iZWRkZWQsCi0JICogZW1iZWRkZWRJZCwgaWQsIG1hbnlUb01hbnksIG1hbnlUb09uZSwgb25lVG9NYW55LCBvbmVUb09uZSwgdHJhbnNpZW50LAotCSAqIGFuZCB2ZXJzaW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyc1RvKExpc3Q8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBwcm92aWRlcnMpIHsKLQkJcHJvdmlkZXJzLmFkZChCYXNpY01hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKElkTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gb3JtVHlwZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJaWYgKHRoaXMub3JtVHlwZU1hcHBpbmdVaVByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQl0aGlzLm9ybVR5cGVNYXBwaW5nVWlQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PigpOwotCQkJdGhpcy5hZGRPcm1UeXBlTWFwcGluZ1VpUHJvdmlkZXJzVG8odGhpcy5vcm1UeXBlTWFwcGluZ1VpUHJvdmlkZXJzKTsKLQkJfQotCi0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+KAotCQkJdGhpcy5vcm1UeXBlTWFwcGluZ1VpUHJvdmlkZXJzCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzcGVjaWZ5IG1vcmUgb3IgZGlmZmVyZW50IE9STSB0eXBlIG1hcHBpbmcgdWkgcHJvdmlkZXJzLgotCSAqIFRoZSBkZWZhdWx0IGluY2x1ZGVzIHRoZSBKUEEgc3BlYy1kZWZpbmVkIGVudGl0eSwgbWFwcGVkIHN1cGVyY2xhc3MsCi0JICogZW1iZWRkYWJsZSwgYW5kIG51bGwgKHdoZW4gdGhlIG90aGVycyBkb24ndCBhcHBseSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaVByb3ZpZGVyc1RvKExpc3Q8VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKE9ybUVudGl0eVVpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW1iZWRkYWJsZVVpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2Jhc2UvRW50aXRpZXNHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2Jhc2UvRW50aXRpZXNHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg1OTg3OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9iYXNlL0VudGl0aWVzR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uYmFzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnN5bmNoLlN5bmNocm9uaXplQ2xhc3Nlc0pvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLkVudGl0eUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLlBhY2thZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuR2VuZXJhdGVFbnRpdGllc1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiAgRW50aXRpZXNHZW5lcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEVudGl0aWVzR2VuZXJhdG9yIHsKLQlwcml2YXRlIEpwYVByb2plY3QgcHJvamVjdDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGdlbmVyYXRlKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCW5ldyBFbnRpdGllc0dlbmVyYXRvcihwcm9qZWN0LCBzZWxlY3Rpb24pLmdlbmVyYXRlKCk7Ci0JfQotCQotCXByaXZhdGUgRW50aXRpZXNHZW5lcmF0b3IoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIHByb21wdCB0aGUgdXNlciB3aXRoIGEgd2l6YXJkOwotCSAqIHNjaGVkdWxlIGEgam9iIHRvIGdlbmVyYXRlIHRoZSBlbnRpdGllczsKLQkgKiBvcHRpb25hbGx5IHNjaGVkdWxlIGEgam9iIHRvIHN5bmNocm9uaXplIHBlcnNpc3RlbmNlLnhtbCB0bwotCSAqIHJ1biBhZnRlcndhcmRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGUoKSB7Ci0JCUdlbmVyYXRlRW50aXRpZXNXaXphcmQgd2l6YXJkID0gbmV3IEdlbmVyYXRlRW50aXRpZXNXaXphcmQodGhpcy5wcm9qZWN0LCB0aGlzLnNlbGVjdGlvbik7Ci0JCQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyh0aGlzLmdldEN1cnJlbnRTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWludCByZXR1cm5Db2RlID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJldHVybkNvZGUgIT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlQYWNrYWdlR2VuZXJhdG9yLkNvbmZpZyBwQ29uZmlnID0gd2l6YXJkLmdldFBhY2thZ2VHZW5lcmF0b3JDb25maWcoKTsKLQkJRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlQ29uZmlnID0gd2l6YXJkLmdldEVudGl0eUdlbmVyYXRvckNvbmZpZygpOwotCQllQ29uZmlnLnNldE92ZXJ3cml0ZUNvbmZpcm1lcihuZXcgT3ZlcndyaXRlQ29uZmlybWVyKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCkpKTsKLQotCQlXb3Jrc3BhY2VKb2IgZ2VuRW50aXRpZXNKb2IgPSBuZXcgR2VuZXJhdGVFbnRpdGllc0pvYihwQ29uZmlnLCBlQ29uZmlnKTsKLQkJCi0JCVdvcmtzcGFjZUpvYiBzeW5jaENsYXNzZXNKb2IgPSBudWxsOwotCQkKLQkJaWYgKHdpemFyZC5zeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKCkpIHsKLQkJCS8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgKm9uZSogcGVyc2lzdGVuY2UueG1sIGZpbGUgcGVyIHByb2plY3QKLQkJCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0gdGhpcy5wcm9qZWN0LmdldFJvb3RDb250ZXh0KCkuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQkJCWlmIChwZXJzaXN0ZW5jZVhtbCAhPSBudWxsKSB7Ci0JCQkJLy8gVE9ETyBjYXN0aW5nIHRvIElGaWxlIC0ganVzdCB0cnlpbmcgdG8gZ2V0IHJpZCBvZiBhbGwgY29tcGlsZXIgZXJyb3JzIGZvciBub3cKLQkJCQlzeW5jaENsYXNzZXNKb2IgPSBuZXcgU3luY2hyb25pemVDbGFzc2VzSm9iKChJRmlsZSkgcGVyc2lzdGVuY2VYbWwuZ2V0UmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQlnZW5FbnRpdGllc0pvYi5zY2hlZHVsZSgpOwotCQlpZiAoc3luY2hDbGFzc2VzSm9iICE9IG51bGwpIHsKLQkJCXN5bmNoQ2xhc3Nlc0pvYi5zY2hlZHVsZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU2hlbGwgZ2V0Q3VycmVudFNoZWxsKCkgewotCSAgICByZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQl9Ci0JICAKLQotCS8vICoqKioqKioqKiogZ2VuZXJhdGUgZW50aXRpZXMgam9iICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBHZW5lcmF0ZUVudGl0aWVzSm9iIGV4dGVuZHMgV29ya3NwYWNlSm9iIHsKLQkJcHJpdmF0ZSBmaW5hbCBQYWNrYWdlR2VuZXJhdG9yLkNvbmZpZyBwYWNrYWdlQ29uZmlnOwotCQlwcml2YXRlIGZpbmFsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnOwotCQkKLQkJR2VuZXJhdGVFbnRpdGllc0pvYigKLQkJCQlQYWNrYWdlR2VuZXJhdG9yLkNvbmZpZyBwYWNrYWdlQ29uZmlnLAotCQkJCUVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnCi0JCSkgewotCQkJc3VwZXIoSnB0VWlNZXNzYWdlcy5FbnRpdGllc0dlbmVyYXRvcl9qb2JOYW1lKTsKLQkJCXRoaXMucGFja2FnZUNvbmZpZyA9IHBhY2thZ2VDb25maWc7Ci0JCQl0aGlzLmVudGl0eUNvbmZpZyA9IGVudGl0eUNvbmZpZzsKLQkJCXRoaXMuc2V0UnVsZShwYWNrYWdlQ29uZmlnLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVBhY2thZ2VHZW5lcmF0b3IuZ2VuZXJhdGVFbnRpdGllcyh0aGlzLnBhY2thZ2VDb25maWcsIHRoaXMuZW50aXR5Q29uZmlnLCBtb25pdG9yKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcndyaXRlIGNvbmZpcm1lciAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgT3ZlcndyaXRlQ29uZmlybWVyIGltcGxlbWVudHMgRW50aXR5R2VuZXJhdG9yLk92ZXJ3cml0ZUNvbmZpcm1lciB7Ci0JCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JCXByaXZhdGUgYm9vbGVhbiBvdmVyd3JpdGVBbGwgPSBmYWxzZTsKLQkJcHJpdmF0ZSBib29sZWFuIHNraXBBbGwgPSBmYWxzZTsKLQotCQlPdmVyd3JpdGVDb25maXJtZXIoU2hlbGwgc2hlbGwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBvdmVyd3JpdGUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJaWYgKHRoaXMub3ZlcndyaXRlQWxsKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAodGhpcy5za2lwQWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRoaXMucHJvbXB0VXNlcihjbGFzc05hbWUpOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHByb21wdFVzZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nIGRpYWxvZyA9IG5ldyBPdmVyd3JpdGVDb25maXJtZXJEaWFsb2codGhpcy5zaGVsbCwgY2xhc3NOYW1lKTsKLQkJCS8vIGdldCBvbiB0aGUgVUkgdGhyZWFkIHN5bmNocm9ub3VzbHksIG5lZWQgZmVlZGJhY2sgYmVmb3JlIGNvbnRpbnVpbmcKLQkJCXRoaXMuc2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoZGlhbG9nLnllcygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAoZGlhbG9nLnllc1RvQWxsKCkpIHsKLQkJCQl0aGlzLm92ZXJ3cml0ZUFsbCA9IHRydWU7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAoZGlhbG9nLm5vKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoZGlhbG9nLm5vVG9BbGwoKSkgewotCQkJCXRoaXMuc2tpcEFsbCA9IHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcndyaXRlIGRpYWxvZyAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lOwotCQlwcml2YXRlIGJvb2xlYW4geWVzID0gZmFsc2U7Ci0JCXByaXZhdGUgYm9vbGVhbiB5ZXNUb0FsbCA9IGZhbHNlOwotCQlwcml2YXRlIGJvb2xlYW4gbm8gPSBmYWxzZTsKLQkJcHJpdmF0ZSBib29sZWFuIG5vVG9BbGwgPSBmYWxzZTsKLQotCQlPdmVyd3JpdGVDb25maXJtZXJEaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQlzdXBlcihwYXJlbnQpOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJCXNoZWxsLnNldFRleHQoSnB0VWlNZXNzYWdlcy5PdmVyd3JpdGVDb25maXJtZXJEaWFsb2dfdGl0bGUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCi0JCQlMYWJlbCB0ZXh0ID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQkJdGV4dC5zZXRUZXh0KE5MUy5iaW5kKEpwdFVpTWVzc2FnZXMuT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RleHQsIHRoaXMuY2xhc3NOYW1lKSk7Ci0JCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIGZhbHNlKTsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lELCBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfTEFCRUwsIGZhbHNlKTsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5OT19JRCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgdHJ1ZSk7Ci0JCQl0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuTk9fVE9fQUxMX0lELCBJRGlhbG9nQ29uc3RhbnRzLk5PX1RPX0FMTF9MQUJFTCwgZmFsc2UpOwotCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQkJc3dpdGNoIChidXR0b25JZCkgewotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQgOgotCQkJCQl0aGlzLnllc1ByZXNzZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQgOgotCQkJCQl0aGlzLnllc1RvQWxsUHJlc3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuTk9fSUQgOgotCQkJCQl0aGlzLm5vUHJlc3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuTk9fVE9fQUxMX0lEIDoKLQkJCQkJdGhpcy5ub1RvQWxsUHJlc3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEIDoKLQkJCQkJdGhpcy5jYW5jZWxQcmVzc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCB5ZXNQcmVzc2VkKCkgewotCQkJdGhpcy55ZXMgPSB0cnVlOwotCQkJdGhpcy5zZXRSZXR1cm5Db2RlKE9LKTsKLQkJCXRoaXMuY2xvc2UoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB5ZXNUb0FsbFByZXNzZWQoKSB7Ci0JCQl0aGlzLnllc1RvQWxsID0gdHJ1ZTsKLQkJCXRoaXMuc2V0UmV0dXJuQ29kZShPSyk7Ci0JCQl0aGlzLmNsb3NlKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgbm9QcmVzc2VkKCkgewotCQkJdGhpcy5ubyA9IHRydWU7Ci0JCQl0aGlzLnNldFJldHVybkNvZGUoT0spOwotCQkJdGhpcy5jbG9zZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIG5vVG9BbGxQcmVzc2VkKCkgewotCQkJdGhpcy5ub1RvQWxsID0gdHJ1ZTsKLQkJCXRoaXMuc2V0UmV0dXJuQ29kZShPSyk7Ci0JCQl0aGlzLmNsb3NlKCk7Ci0JCX0KLQotCQlib29sZWFuIHllcygpIHsKLQkJCXJldHVybiB0aGlzLnllczsKLQkJfQotCi0JCWJvb2xlYW4geWVzVG9BbGwoKSB7Ci0JCQlyZXR1cm4gdGhpcy55ZXNUb0FsbDsKLQkJfQotCi0JCWJvb2xlYW4gbm8oKSB7Ci0JCQlyZXR1cm4gdGhpcy5ubzsKLQkJfQotCi0JCWJvb2xlYW4gbm9Ub0FsbCgpIHsKLQkJCXJldHVybiB0aGlzLm5vVG9BbGw7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9DbGFzc1JlZkl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0NsYXNzUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2MWFlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0NsYXNzUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NSZWZJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgQ2xhc3NSZWZJdGVtTGFiZWxQcm92aWRlcigKLQkJCUNsYXNzUmVmIGNsYXNzUmVmLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihjbGFzc1JlZiwgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2xhc3NSZWYsIFN0cmluZz4oQ2xhc3NSZWYuQ0xBU1NfTkFNRV9QUk9QRVJUWSwgKENsYXNzUmVmKSBtb2RlbCgpKSB7Ci0JCQkgQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldENsYXNzTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCUltYWdlIGltYWdlID0gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5DTEFTU19SRUYpOwotCQlpZiAoKChDbGFzc1JlZikgbW9kZWwoKSkuaXNWaXJ0dWFsKCkpIHsKLQkJCWltYWdlID0gSnB0VWlJY29ucy5naG9zdChpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KGltYWdlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9FbnRpdHlNYXBwaW5nc0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0VudGl0eU1hcHBpbmdzSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0NWE4ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0VudGl0eU1hcHBpbmdzSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgRW50aXR5TWFwcGluZ3NJdGVtTGFiZWxQcm92aWRlcigKLQkJCUVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihlbnRpdHlNYXBwaW5ncywgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihKcHRVaU1lc3NhZ2VzLk9ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeV9lbnRpdHlNYXBwaW5nc0xhYmVsKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5FTlRJVFlfTUFQUElOR1MpKTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmIzNmEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLXsKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgPSAoRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgY29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci0JCQotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEpwYVJvb3RDb250ZXh0Tm9kZSkgewotCQkJcmV0dXJuIG5ldyBSb290Q29udGV4dEl0ZW1Db250ZW50UHJvdmlkZXIoKEpwYVJvb3RDb250ZXh0Tm9kZSkgaXRlbSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VYbWwpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW5jZVhtbCkgaXRlbSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW5jZVVuaXQpIGl0ZW0sIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBPcm1YbWwpIHsKLQkJCXJldHVybiBuZXcgT3JtWG1sSXRlbUNvbnRlbnRQcm92aWRlcigoT3JtWG1sKSBpdGVtLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgT3JtUGVyc2lzdGVudFR5cGUpIHsKLQkJCXJldHVybiBuZXcgT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKChPcm1QZXJzaXN0ZW50VHlwZSkgaXRlbSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJcmV0dXJuIG5ldyBKYXZhUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKChKYXZhUGVyc2lzdGVudFR5cGUpIGl0ZW0sIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW50QXR0cmlidXRlKSBpdGVtLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxKcGFDb250ZXh0Tm9kZT4KLQl7Ci0JCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihwZXJzaXN0ZW5jZVVuaXQsIGNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IG1vZGVsKCkgewotCQkJcmV0dXJuIChQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLm1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgUGVyc2lzdGVuY2VYbWwgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIChQZXJzaXN0ZW5jZVhtbCkgbW9kZWwoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQYXJlbnQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxKcGFDb250ZXh0Tm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJTGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+PigpOwotCQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRPcm1YbWxMdm0oKSk7Ci0JCQlsaXN0LmFkZChidWlsZEltcGxpZWRPcm1YbWxMdm0oKSk7Ci0JCQlsaXN0LmFkZChidWlsZFBlcnNpc3RlbnRUeXBlTHZtKCkpOwotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+LCBKcGFDb250ZXh0Tm9kZT4obGlzdCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8SnBhQ29udGV4dE5vZGU+IGJ1aWxkU3BlY2lmaWVkT3JtWG1sTHZtKCkgewotCQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEpwYUNvbnRleHROb2RlPigKLQkJCQluZXcgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8T3JtWG1sPigKLQkJCQkJbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8T3JtWG1sPigKLQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxNYXBwaW5nRmlsZVJlZiwgT3JtWG1sPigKLQkJCQkJCQluZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlUmVmPigKLQkJCQkJCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KAotCQkJCQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRl9MSVNULAotCQkJCQkJCQkJCW1vZGVsKCkpIHsKLQkJCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJCQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJCQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0sIE1hcHBpbmdGaWxlUmVmLk9STV9YTUxfUFJPUEVSVFkpKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIE9ybVhtbCB0cmFuc2Zvcm1JdGVtKE1hcHBpbmdGaWxlUmVmIGl0ZW0pIHsKLQkJCQkJCQkJcmV0dXJuIGl0ZW0uZ2V0T3JtWG1sKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxPcm1YbWw+IGZpbHRlcihJdGVyYXRvcjw/IGV4dGVuZHMgT3JtWG1sPiBpdGVtcykgewotCQkJCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxPcm1YbWwsIE9ybVhtbD4oaXRlbXMpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT3JtWG1sIG8pIHsKLQkJCQkJCQkJcmV0dXJuIG8gIT0gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtWG1sPiBidWlsZEltcGxpZWRPcm1YbWxMdm0oKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPE9ybVhtbD4oCi0JCQkJbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYXBwaW5nRmlsZVJlZiwgT3JtWG1sPigKLQkJCQkJCW5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oCi0JCQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5JTVBMSUVEX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksCi0JCQkJCQkJCW1vZGVsKCkpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQkJCXJldHVybiBzdWJqZWN0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpOwotCQkJCQkJCX0KLQkJCQkJCX0sCi0JCQkJCQlNYXBwaW5nRmlsZVJlZi5PUk1fWE1MX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgT3JtWG1sIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0T3JtWG1sKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQl9Ci0JCQotCQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEpwYUNvbnRleHROb2RlPiBidWlsZFBlcnNpc3RlbnRUeXBlTHZtKCkgewotCQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEpwYUNvbnRleHROb2RlPigKLQkJCQluZXcgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8UGVyc2lzdGVudFR5cGU+KAotCQkJCQluZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxQZXJzaXN0ZW50VHlwZT4oCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Q2xhc3NSZWYsIFBlcnNpc3RlbnRUeXBlPigKLQkJCQkJCQluZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPENsYXNzUmVmPihidWlsZENsYXNzUmVmTHZtKCksIENsYXNzUmVmLkpBVkFfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSB0cmFuc2Zvcm1JdGVtKENsYXNzUmVmIGl0ZW0pIHsKLQkJCQkJCQkJcmV0dXJuIGl0ZW0uZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gZmlsdGVyKEl0ZXJhdG9yPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZT4gaXRlbXMpIHsKLQkJCQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8UGVyc2lzdGVudFR5cGUsIFBlcnNpc3RlbnRUeXBlPihpdGVtcykgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChQZXJzaXN0ZW50VHlwZSBvKSB7Ci0JCQkJCQkJCXJldHVybiBvICE9IG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JCQotCQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPENsYXNzUmVmPiBidWlsZENsYXNzUmVmTHZtKCkgewotCQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPENsYXNzUmVmPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8Q2xhc3NSZWY+PigyKTsKLQkJCWhvbGRlcnMuYWRkKGJ1aWxkU3BlY2lmaWVkQ2xhc3NSZWZMdm0oKSk7Ci0JCQlob2xkZXJzLmFkZChidWlsZEltcGxpZWRDbGFzc1JlZkx2bSgpKTsKLQkJCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8Q2xhc3NSZWY+LCBDbGFzc1JlZj4oaG9sZGVycyk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Q2xhc3NSZWY+IGJ1aWxkU3BlY2lmaWVkQ2xhc3NSZWZMdm0oKSB7Ci0JCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgQ2xhc3NSZWY+KAotCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfQ0xBU1NfUkVGX0xJU1QsIG1vZGVsKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJCQkJfQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZENsYXNzUmVmc1NpemUoKTsKLQkJCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxDbGFzc1JlZj4gYnVpbGRJbXBsaWVkQ2xhc3NSZWZMdm0oKSB7Ci0JCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgQ2xhc3NSZWY+KAotCQkJCVBlcnNpc3RlbmNlVW5pdC5JTVBMSUVEX0NMQVNTX1JFRl9MSVNULCBtb2RlbCgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuaW1wbGllZENsYXNzUmVmcygpOwotCQkJCQl9Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuaW1wbGllZENsYXNzUmVmc1NpemUoKTsKLQkJCQkJfQotCQkJfTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjk3NGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotCWltcGxlbWVudHMgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci17Ci0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEpwYVJvb3RDb250ZXh0Tm9kZSkgewotCQkJcmV0dXJuIG5ldyBSb290Q29udGV4dEl0ZW1MYWJlbFByb3ZpZGVyKChKcGFSb290Q29udGV4dE5vZGUpIGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VYbWwpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxJdGVtTGFiZWxQcm92aWRlcigoUGVyc2lzdGVuY2VYbWwpIGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlcigoUGVyc2lzdGVuY2VVbml0KSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBPcm1YbWwpIHsKLQkJCXJldHVybiBuZXcgT3JtWG1sSXRlbUxhYmVsUHJvdmlkZXIoKE9ybVhtbCkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVudFR5cGUpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVudFR5cGVJdGVtTGFiZWxQcm92aWRlcigoUGVyc2lzdGVudFR5cGUpIGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyKChQZXJzaXN0ZW50QXR0cmlidXRlKSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNOYXZpZ2F0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmI5MjVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLm5hdmlnYXRvci5KcGFOYXZpZ2F0b3JQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNOYXZpZ2F0b3JQcm92aWRlciBpbXBsZW1lbnRzIEpwYU5hdmlnYXRvclByb3ZpZGVyCi17Ci0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljUGxhdGZvcm1VaS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljUGxhdGZvcm1VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzQwODJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY1BsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuR2VuZXJpY0pwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uYmFzZS5CYXNlSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGxhdGZvcm1VaSBleHRlbmRzIEJhc2VKcGFQbGF0Zm9ybVVpCi17Ci0JcHVibGljIEdlbmVyaWNQbGF0Zm9ybVVpKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG5hdmlnYXRvciBjb250ZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEpwYU5hdmlnYXRvclByb3ZpZGVyIGJ1aWxkTmF2aWdhdG9yUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFVaUZhY3RvcnkgY3JlYXRlSnBhVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFVaUZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZURETChKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLmRpc3BsYXlOb3RTdXBwb3J0ZWRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRpdGxlLCBKcHRVaU1lc3NhZ2VzLkdlbmVyaWNQbGF0Zm9ybVVpRGlhbG9nX25vdFN1cHBvcnRlZE1lc3NhZ2VUZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5Tm90U3VwcG9ydGVkTWVzc2FnZShTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JICAgIFNoZWxsIGN1cnJlbnRTaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGN1cnJlbnRTaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvSmF2YVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9KYXZhUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNTE1ZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9KYXZhUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPgotewotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW50VHlwZSwgY29udGVudFByb3ZpZGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBtb2RlbCgpIHsKLQkJcmV0dXJuIChKYXZhUGVyc2lzdGVudFR5cGUpIHN1cGVyLm1vZGVsKCk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbW9kZWwoKS5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8SmF2YVBlcnNpc3RlbnRUeXBlLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oUGVyc2lzdGVudFR5cGUuU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCwgbW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmF0dHJpYnV0ZXMoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmF0dHJpYnV0ZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvTWFwcGluZ0ZpbGVSZWZJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9NYXBwaW5nRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YzE4YzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9NYXBwaW5nRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIE1hcHBpbmdGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIE1hcHBpbmdGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJc3VwZXIobWFwcGluZ0ZpbGVSZWYsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hcHBpbmdGaWxlUmVmLCBTdHJpbmc+KE1hcHBpbmdGaWxlUmVmLkZJTEVfTkFNRV9QUk9QRVJUWSwgKE1hcHBpbmdGaWxlUmVmKSBtb2RlbCgpKSB7Ci0JCQkgQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEZpbGVOYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLk1BUFBJTkdfRklMRV9SRUYpOwotCQlpZiAoKChNYXBwaW5nRmlsZVJlZikgbW9kZWwoKSkuaXNWaXJ0dWFsKCkpIHsKLQkJCWltYWdlID0gSnB0VWlJY29ucy5naG9zdChpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KGltYWdlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1QZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMTU3ODkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1QZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotcHVibGljIGNsYXNzIE9ybVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4KLQl7Ci0JCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihwZXJzaXN0ZW50VHlwZSwgY29udGVudFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBtb2RlbCgpIHsKLQkJCXJldHVybiAoT3JtUGVyc2lzdGVudFR5cGUpIHN1cGVyLm1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBtb2RlbCgpLmdldFBhcmVudCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCUxpc3Q8TGlzdFZhbHVlTW9kZWw8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+PigyKTsKLQkJCWxpc3QuYWRkKGJ1aWxkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXNMaXN0SG9sZGVyKCkpOwotCQkJbGlzdC5hZGQoYnVpbGRWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXNMaXN0SG9sZGVyKCkpOwotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4obGlzdCk7Ci0JCX0KLQkJCi0KLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGJ1aWxkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXNMaXN0SG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxPcm1QZXJzaXN0ZW50VHlwZSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oUGVyc2lzdGVudFR5cGUuU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCwgbW9kZWwoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQXR0cmlidXRlcygpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBidWlsZFZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlc0xpc3RIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybVBlcnNpc3RlbnRUeXBlLCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlPihPcm1QZXJzaXN0ZW50VHlwZS5WSVJUVUFMX0FUVFJJQlVURVNfTElTVCwgbW9kZWwoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QudmlydHVhbEF0dHJpYnV0ZXMoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QudmlydHVhbEF0dHJpYnV0ZXNTaXplKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1YbWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMTM0MDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1YbWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBPcm1YbWxJdGVtQ29udGVudFByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPE9ybVBlcnNpc3RlbnRUeXBlPgotewotCXB1YmxpYyBPcm1YbWxJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJT3JtWG1sIG9ybVhtbCwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJc3VwZXIob3JtWG1sLCBjb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtWG1sIG1vZGVsKCkgewotCQlyZXR1cm4gKE9ybVhtbCkgc3VwZXIubW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBtb2RlbCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8T3JtUGVyc2lzdGVudFR5cGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFbnRpdHlNYXBwaW5ncywgT3JtUGVyc2lzdGVudFR5cGU+KAotCQkJCWJ1aWxkRW50aXR5TWFwcGluZ3NIb2xkZXIoKSwKLQkJCQlFbnRpdHlNYXBwaW5ncy5QRVJTSVNURU5UX1RZUEVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5vcm1QZXJzaXN0ZW50VHlwZXMoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5vcm1QZXJzaXN0ZW50VHlwZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5TWFwcGluZ3M+IGJ1aWxkRW50aXR5TWFwcGluZ3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybVhtbCwgRW50aXR5TWFwcGluZ3M+KAotCQkJCU9ybVhtbC5FTlRJVFlfTUFQUElOR1NfUFJPUEVSVFksIG1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudGl0eU1hcHBpbmdzIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1YbWxJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1YbWxJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzE1MWE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIE9ybVhtbEl0ZW1MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcgotewotCXB1YmxpYyBPcm1YbWxJdGVtTGFiZWxQcm92aWRlcigKLQkJCU9ybVhtbCBvcm1YbWwsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKG9ybVhtbCwgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigoKE9ybVhtbCkgbW9kZWwoKSkuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPihKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9GSUxFKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5MTNhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcgotewotCXB1YmxpYyBQZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbmNlLCBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KEpwdFVpTWVzc2FnZXMuUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlckZhY3RvcnlfcGVyc2lzdGVuY2VMYWJlbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuUEVSU0lTVEVOQ0UpKTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVuY2VVbml0SXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVuY2VVbml0SXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlYTEyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlVW5pdEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0SXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0LCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW5jZVVuaXQsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihQZXJzaXN0ZW5jZVVuaXQuTkFNRV9QUk9QRVJUWSwgKFBlcnNpc3RlbmNlVW5pdCkgbW9kZWwoKSkgewotCQkJIEBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuUEVSU0lTVEVOQ0VfVU5JVCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZVhtbEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2Yjc5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbEl0ZW1Db250ZW50UHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8UGVyc2lzdGVuY2VVbml0PgotewotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJc3VwZXIocGVyc2lzdGVuY2VYbWwsIGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFSb290Q29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEpwYVJvb3RDb250ZXh0Tm9kZSkgKChQZXJzaXN0ZW5jZVhtbCkgbW9kZWwoKSkuZ2V0UGFyZW50KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZSwgUGVyc2lzdGVuY2VVbml0PigKLQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlWG1sLCBQZXJzaXN0ZW5jZT4oCi0JCQkJCQlQZXJzaXN0ZW5jZVhtbC5QRVJTSVNURU5DRV9QUk9QRVJUWSwgKFBlcnNpc3RlbmNlWG1sKSBtb2RlbCgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQZXJzaXN0ZW5jZSgpOwotCQkJCQl9Ci0JCQkJfSwKLQkJCQlQZXJzaXN0ZW5jZS5QRVJTSVNURU5DRV9VTklUU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnBlcnNpc3RlbmNlVW5pdHMoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVuY2VYbWxJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDM3NGY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVuY2VYbWxJdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sSXRlbUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJc3VwZXIocGVyc2lzdGVuY2VYbWwsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKChQZXJzaXN0ZW5jZVhtbCkgbW9kZWwoKSkuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPihKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9GSUxFKSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4NzgyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi17Ci0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCBjb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuICgoUGVyc2lzdGVudEF0dHJpYnV0ZSkgbW9kZWwoKSkuZ2V0UGFyZW50KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWRiNDIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcgotewotCXB1YmxpYyBQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZz4oUGVyc2lzdGVudEF0dHJpYnV0ZS5OQU1FX1BST1BFUlRZLCAoUGVyc2lzdGVudEF0dHJpYnV0ZSkgbW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50QXR0cmlidXRlLCBJbWFnZT4oCi0JCQkJbmV3IFN0cmluZ1tdIHtQZXJzaXN0ZW50QXR0cmlidXRlLkRFRkFVTFRfTUFQUElOR19QUk9QRVJUWSwgUGVyc2lzdGVudEF0dHJpYnV0ZS5TUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWX0sIAotCQkJCShQZXJzaXN0ZW50QXR0cmlidXRlKSBtb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbWFnZSBidWlsZFZhbHVlXygpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoc3ViamVjdC5nZXRNYXBwaW5nS2V5KCkpOwotCQkJCWlmICgoKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIG1vZGVsKCkpLmlzVmlydHVhbCgpKSB7Ci0JCQkJCXJldHVybiBKcHRVaUljb25zLmdob3N0KGltYWdlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9OwotCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW50VHlwZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbnRUeXBlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2YjQ1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbnRUeXBlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudFR5cGVJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgUGVyc2lzdGVudFR5cGVJdGVtTGFiZWxQcm92aWRlcigKLQkJCVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW50VHlwZSwgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVudFR5cGUsIFN0cmluZz4oUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgKFBlcnNpc3RlbnRUeXBlKSBtb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbnRUeXBlLCBJbWFnZT4oUGVyc2lzdGVudFR5cGUuTUFQUElOR19QUk9QRVJUWSwgKFBlcnNpc3RlbnRUeXBlKSBtb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbWFnZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yVHlwZU1hcHBpbmcoc3ViamVjdC5nZXRNYXBwaW5nS2V5KCkpOwotCQkJfQotCQl9OwotCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Sb290Q29udGV4dEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUm9vdENvbnRleHRJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTEzMTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Sb290Q29udGV4dEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBSb290Q29udGV4dEl0ZW1Db250ZW50UHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8UGVyc2lzdGVuY2VYbWw+Ci17Ci0JcHVibGljIFJvb3RDb250ZXh0SXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCUpwYVJvb3RDb250ZXh0Tm9kZSByb290Q29udGV4dCwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJc3VwZXIocm9vdENvbnRleHQsIGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFSb290Q29udGV4dE5vZGUgbW9kZWwoKSB7Ci0JCXJldHVybiAoSnBhUm9vdENvbnRleHROb2RlKSBzdXBlci5tb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVByb2plY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbW9kZWwoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8UGVyc2lzdGVuY2VYbWw+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxQZXJzaXN0ZW5jZVhtbD4oCi0JCQkJbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFSb290Q29udGV4dE5vZGUsIFBlcnNpc3RlbmNlWG1sPigKLQkJCQkJCUpwYVJvb3RDb250ZXh0Tm9kZS5QRVJTSVNURU5DRV9YTUxfUFJPUEVSVFksCi0JCQkJCQltb2RlbCgpKSB7Ci0JCQkJCSBAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUm9vdENvbnRleHRJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Sb290Q29udGV4dEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YWRmNWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Sb290Q29udGV4dEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFJvb3RDb250ZXh0SXRlbUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIFJvb3RDb250ZXh0SXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlKcGFSb290Q29udGV4dE5vZGUgcm9vdENvbnRleHROb2RlLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihyb290Q29udGV4dE5vZGUsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oSnB0VWlNZXNzYWdlcy5KcGFDb250ZW50X2xhYmVsKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfQ09OVEVOVCkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcmVmcy9KcGFQcmVmZXJlbmNlUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJlZnMvSnBhUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzNjFlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcmVmcy9KcGFQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByZWZzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVBlcnNpc3RlbnRQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wcmVmcy5KcGFQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuU2NvcGVkUHJlZmVyZW5jZVN0b3JlOwotCi1wdWJsaWMgY2xhc3MgSnBhUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSAKLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpwdC51aS5qcGFQcmVmZXJlbmNlUGFnZSI7Ci0JCi0JCi0JcHJpdmF0ZSBJUGVyc2lzdGVudFByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlczsKLQkKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgdXNlckxpYlByZWZlcmVuY2VzOwotCQotCXByaXZhdGUgTGFiZWwganBhTGliTGFiZWw7Ci0JCQotCXByaXZhdGUgQ29tYm8ganBhTGliQ29tYm87Ci0JCi0JcHJpdmF0ZSBMaW5rIHVzZXJMaWJzTGluazsKLQkJCi0JCi0JcHVibGljIEpwYVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCQlwcmVmZXJlbmNlcyA9IAotCQkJbmV3IFNjb3BlZFByZWZlcmVuY2VTdG9yZSgKLQkJCQluZXcgSW5zdGFuY2VTY29wZSgpLAotCQkJCUpwdENvcmVQbHVnaW4uaW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCXVzZXJMaWJQcmVmZXJlbmNlcyA9Ci0JCQluZXcgU2NvcGVkUHJlZmVyZW5jZVN0b3JlKAotCQkJCW5ldyBJbnN0YW5jZVNjb3BlKCksCi0JCQkJSmF2YUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7fQotCQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJanBhTGliTGFiZWwgPSBjcmVhdGVMYWJlbChjb250YWluZXIsIDEsIEpwdFVpTWVzc2FnZXMuSnBhUHJlZmVyZW5jZVBhZ2VfZGVmYXVsdEpwYUxpYik7Ci0JCQkKLQkJanBhTGliQ29tYm8gPSBjcmVhdGVDb21ibyhjb250YWluZXIsIHRydWUpOwotCQkKLQkJdXNlckxpYnNMaW5rID0gIG5ldyBMaW5rKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdXNlckxpYnNMaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXVzZXJMaWJzTGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhUHJlZmVyZW5jZVBhZ2VfdXNlckxpYnNMaW5rKTsKLQkJdXNlckxpYnNMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkoKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSkKLQkJCQkJCS5vcGVuUGFnZShKYXZhVUkuSURfVVNFUl9MSUJSQVJZX1BSRUZFUkVOQ0VfUEFHRSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQkJCi0JCXBlcmZvcm1EZWZhdWx0cygpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQkKLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsIGJvb2xlYW4gZmlsbEhvcml6b250YWwpIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQlpZiAoZmlsbEhvcml6b250YWwpIHsKLQkJCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl9Ci0JCWVsc2UgewotCQkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlsbEpwYUxpYnMoKSB7Ci0JCWludCBpbmRleCA9IGpwYUxpYkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCVN0cmluZyBzZWxlY3RlZEpwYUxpYiA9IG51bGw7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQlzZWxlY3RlZEpwYUxpYiA9IGpwYUxpYkNvbWJvLmdldEl0ZW0oanBhTGliQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCX0KLQkJCi0JCWpwYUxpYkNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCWpwYUxpYkNvbWJvLnNldEl0ZW1zKEphdmFDb3JlLmdldFVzZXJMaWJyYXJ5TmFtZXMoKSk7Ci0JCQotCQlpZiAoc2VsZWN0ZWRKcGFMaWIgIT0gbnVsbCkgewotCQkJaW50IG5ld0luZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoanBhTGliQ29tYm8uZ2V0SXRlbXMoKSwgc2VsZWN0ZWRKcGFMaWIpOwotCQkJaWYgKG5ld0luZGV4ID49IDApIHsKLQkJCQlqcGFMaWJDb21iby5zZWxlY3QobmV3SW5kZXgpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQlmaWxsSnBhTGlicygpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJZmlsbEpwYUxpYnMoKTsKLQkJU3RyaW5nIGRlZmF1bHRMaWIgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSnBhUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfSlBBX0xJQik7Ci0JCWludCBpbmRleCA9IC0xOwotCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGRlZmF1bHRMaWIpKSB7Ci0JCQlpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGpwYUxpYkNvbWJvLmdldEl0ZW1zKCksIGRlZmF1bHRMaWIpOwotCQl9Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQlqcGFMaWJDb21iby5zZWxlY3QoaW5kZXgpOwotCQl9Ci0JCQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWludCBpbmRleCA9IGpwYUxpYkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCVN0cmluZyBkZWZhdWx0TGliID0gKGluZGV4ID49IDApID8ganBhTGliQ29tYm8uZ2V0SXRlbShpbmRleCkgOiBudWxsOwotCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGRlZmF1bHRMaWIpKSB7Ci0JCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShKcGFQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9KUEFfTElCLCBkZWZhdWx0TGliKTsKLQkJfQotCQl0cnkgewotCQkJcHJlZmVyZW5jZXMuc2F2ZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCUpwdENvcmVQbHVnaW4ubG9nKGlvZSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGwgcG9pbnRlciBjaGVjayAtIGJ1ZyAxNjgzMzcKLQkJaWYgKGpwYUxpYkxhYmVsICE9IG51bGwpIGpwYUxpYkxhYmVsLmRpc3Bvc2UoKTsKLQkJaWYgKGpwYUxpYkNvbWJvICE9IG51bGwpIGpwYUxpYkNvbWJvLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkKLQkJCi0vLwkJcHJpdmF0ZSBib29sZWFuIGxpYkNvbnRhaW5zSnBhQ2xhc3NlcygpIHsKLS8vCQkJcmV0dXJuIHRydWU7Ci0vLwkJCVN0cmluZyBqYXJMb2NhdGlvbiA9IGdldFN0cmluZ1ZhbHVlKCk7Ci0vLwkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBKcHRVaU1lc3NhZ2VzLkpwYVByZWZlcmVuY2VQYWdlX2ludmFsaWRKcGFMaWI7Ci0vLwkJCWJvb2xlYW4gaGFzRXJyb3IgPSBmYWxzZTsKLS8vCQkJCi0vLwkJCXRyeSB7Ci0vLwkJCQlKYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZShqYXJMb2NhdGlvbik7Ci0vLwkJCQloYXNFcnJvciA9IGphckZpbGUuZ2V0RW50cnkoImphdmF4L3BlcnNpc3RlbmNlL0VudGl0eU1hbmFnZXIuY2xhc3MiKSA9PSBudWxsOwotLy8JCQl9Ci0vLwkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLS8vCQkJCWhhc0Vycm9yID0gdHJ1ZTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJaWYgKGhhc0Vycm9yKSB7Ci0vLwkJCQlzaG93RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQljbGVhckVycm9yTWVzc2FnZSgpOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlyZXR1cm4gISBoYXNFcnJvcjsKLS8vCQl9Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0RhdGFNb2RlbFByb3BlcnR5UGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9EYXRhTW9kZWxQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwYjY0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0RhdGFNb2RlbFByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFN5bmNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5WYWxpZGF0aW9uU3RhdHVzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YU1vZGVsUHJvcGVydHlQYWdlIAotCWV4dGVuZHMgUHJvcGVydHlQYWdlCi0JaW1wbGVtZW50cyBMaXN0ZW5lciwgSURhdGFNb2RlbExpc3RlbmVyCi17Ci0JcHJvdGVjdGVkIElEYXRhTW9kZWwgbW9kZWw7Ci0JCi0JcHJpdmF0ZSBWYWxpZGF0aW9uU3RhdHVzIHN0YXR1cyA9IG5ldyBWYWxpZGF0aW9uU3RhdHVzKCk7Ci0JcHJpdmF0ZSBNYXAgdmFsaWRhdGlvbk1hcDsKLQlwcml2YXRlIFN0cmluZ1tdIHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzOwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpbmcgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY2hIZWxwZXI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgaW5mb3BvcElEOwotCQotCQotCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eVBhZ2UoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCW1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQlzeW5jaEhlbHBlciA9IGluaXRpYWxpemVTeW5jaEhlbHBlcihtb2RlbCk7Ci0JfQotCQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxTeW5jaEhlbHBlciBpbml0aWFsaXplU3luY2hIZWxwZXIoSURhdGFNb2RlbCBkbSkgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbFN5bmNoSGVscGVyKGRtKTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSB0b3AgPSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQlzZXR1cEluZm9wb3AodG9wKTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWluaXRpYWxpemVWYWxpZGF0aW9uUHJvcGVydGllcygpOwotCQlyZXR1cm4gdG9wOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCkgewotCQl2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9IGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0JCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9PSBudWxsIHx8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aCA9PSAwKQotCQkJdmFsaWRhdGlvbk1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJZWxzZSB7Ci0JCQl2YWxpZGF0aW9uTWFwID0gbmV3IEhhc2hNYXAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspCi0JCQkJdmFsaWRhdGlvbk1hcC5wdXQodmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV0sIG5ldyBJbnRlZ2VyKGkpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIHNob3VsZCByZXR1cm4gdGhlIG1vZGVsIHByb3BlcnR5IG5hbWVzIHRoYXQgbmVlZCB0byBiZSB2YWxpZGF0ZWQgb24gdGhpcyBwYWdlIGluIHRoZQotCSAqIG9yZGVyIHRoYXQgdGhleSBzaG91bGQgcHJlc2VudCB0aGVpciBtZXNzYWdlcy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRvcCBsZXZlbCBDb21wb3NpdGUgZm9yIHRoaXMgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogU2V0IHVwIGluZm8gcG9wIGhvb2tzIGlmIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEluZm9wb3AoQ29udHJvbCBwYXJlbnQpIHsKLQkJaWYgKGdldEluZm9wb3BJRCgpICE9IG51bGwpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgZ2V0SW5mb3BvcElEKCkpOwotCX0KLQotCS8qKgotCSAqIFNldHVwIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhpcyBwYWdlLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBwcm92aWRlIGFwcHJvcHJpYXRlCi0JICogZGVmYXVsdHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0JCXJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgaWYgdGhleSBoYXZlIGRlZmF1bHQgc2V0dGluZ3MgdGhhdCBoYXZlIGJlZW4gc3RvcmVkCi0JICogYW5kIG5lZWQgdG8gYmUgcmVzdG9yZWQuCi0JICogCi0JICogQHNlZSBzdG9yZURlZmF1bHRTZXR0aW5ncygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgTGlzdGVuZXJzIHRvIGNvbnRyb2xzIGF0IHRoaXMgcG9pbnQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZXZlbnRzLiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRvIGFkZCBsaXN0ZW5lcnMgdG8gaXRzIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQl9Ci0KLQkvKioKLQkgKiBFeGl0aW5nIHRoZSBwYWdlLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhpdCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRTdGF0dXMoSW50ZWdlciBrZXkpIHsKLQkJcmV0dXJuIHN0YXR1cy5oYXNFcnJvcihrZXkpOwotCX0KLQotCS8qKgotCSAqIFNlbnQgd2hlbiBhbiBldmVudCB0aGF0IHRoZSByZWNlaXZlciBoYXMgcmVnaXN0ZXJlZCBmb3Igb2NjdXJzLiBJZiBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGlzCi0JICogbWV0aG9kLCBpdCBtdXN0IGNhbGwgc3VwZXIuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZXZlbnQgd2hpY2ggb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBwYWdlIGJhc2VkIG9uIHRoZSBsYXN0IGVycm9yIGluIHRoZSBWYWxpZGF0aW9uU3RhdHVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZSgpIHsKLQkJU3RyaW5nIGVycm9yID0gc3RhdHVzLmdldExhc3RFcnJNc2coKTsKLQkJaWYgKGVycm9yID09IG51bGwpIHsKLQkJCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJCXNldEVycm9yTWVzc2FnZSgoU3RyaW5nKSBudWxsKTsKLQkJCVN0cmluZyB3YXJuaW5nID0gc3RhdHVzLmdldExhc3RXYXJuaW5nTXNnKCk7Ci0JCQlpZiAod2FybmluZyA9PSBudWxsKSB7Ci0JCQkJaWYgKGdldE1lc3NhZ2UoKSAhPSBudWxsICYmIGdldE1lc3NhZ2VUeXBlKCkgPT0gSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKQotCQkJCQlzZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBpbmZvID0gc3RhdHVzLmdldExhc3RJbmZvTXNnKCk7Ci0JCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJCWlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBnZXRNZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pCi0JCQkJCQkJc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJCQkJfSBlbHNlIGlmICghaW5mby5lcXVhbHMoZ2V0TWVzc2FnZSgpKSkgewotCQkJCQkJc2V0TWVzc2FnZShpbmZvLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIXdhcm5pbmcuZXF1YWxzKGdldE1lc3NhZ2UoKSkpCi0JCQkJc2V0TWVzc2FnZSh3YXJuaW5nLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQl9IGVsc2UgaWYgKCFlcnJvci5lcXVhbHMoZ2V0RXJyb3JNZXNzYWdlKCkpKQotCQkJCQkJCXNldEVycm9yTWVzc2FnZShlcnJvcik7Ci0JCQkJCQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvclN0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0RXJyb3JTdGF0dXMoa2V5LCBlcnJvck1lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdhcm5pbmdTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyB3YXJuaW5nTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0V2FybmluZ1N0YXR1cyhrZXksIHdhcm5pbmdNZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5mb1N0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIGluZm9NZXNzYWdlKSB7Ci0JCXN0YXR1cy5zZXRJbmZvU3RhdHVzKGtleSwgaW5mb01lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9LU3RhdHVzKEludGVnZXIga2V5KSB7Ci0JCXN0YXR1cy5zZXRPS1N0YXR1cyhrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgV2l6YXJkIGp1c3QgcHJpb3IgdG8gcnVubmluZyB0aGUgcGVyZm9ybUZpbmlzaCBvcGVyYXRpb24uCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gc3RvcmUgdGhlaXIgZGVmYXVsdCBzZXR0aW5ncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFnZSBpcyBub3cgYmVpbmcgdmFsaWRhdGVkLiBBdCB0aGlzIHRpbWUsIGVhY2ggY29udHJvbCBpcyB2YWxpZGF0ZWQgYW5kIHRoZW4gdGhlCi0JICogY29udHJvbHMgYXJlIHVwZGF0ZWQgYmFzZWQgb24gdGhlIHJlc3VsdHMgaW4gdGhlIFZhbGlkYXRpb25TdGF0dXMgd2hpY2ggd2FzIHVwZGF0ZWQgZHVyaW5nCi0JICogPGNvZGU+dmFsaWRhdGVDb250cm9scygpPC9jb2RlPi4gRmluYWxseSwgaXQgd2lsbCBkaXNwbGF5IHRoZSBsYXN0IGVycm9yIG1lc3NhZ2UgYW5kIGl0Ci0JICogd2lsbCBzZXQgdGhlIHBhZ2UgY29tcGxldGUuIFN1YmNsYXNzZXMgd2lsbCBub3QgdHlwaWNhbGx5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKLQkJaWYgKCFpc1ZhbGlkYXRpbmcpIHsKLQkJCWlzVmFsaWRhdGluZyA9IHRydWU7Ci0JCQl0cnkgewotCQkJCXZhbGlkYXRlQ29udHJvbHNCYXNlKCk7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQlzZXRWYWxpZChzdGF0dXMuZ2V0TGFzdEVyck1zZygpID09IG51bGwpOwotCQkJfSAKLQkJCWZpbmFsbHkgewotCQkJCWlzVmFsaWRhdGluZyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgaW5kaXZpZHVhbCBjb250cm9scy4gVXNlIHZhbGlkYXRpb24ga2V5cyB0byBrZWVwIHRyYWNrIG9mIGVycm9ycy4KLQkgKiAKLQkgKiBAc2VlIHNldE9LU3RhdHVzKEludGVnZXIpIGFuZCBzZXRFcnJvck1lc3NhZ2UoSW50ZWdlciwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdmFsaWRhdGVDb250cm9sc0Jhc2UoKSB7Ci0JCWlmICghdmFsaWRhdGlvbk1hcC5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZyBwcm9wTmFtZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwcm9wTmFtZSA9IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzW2ldOwotCQkJCUludGVnZXIgdmFsS2V5ID0gKEludGVnZXIpIHZhbGlkYXRpb25NYXAuZ2V0KHByb3BOYW1lKTsKLQkJCQlpZiAodmFsS2V5ICE9IG51bGwpCi0JCQkJCXZhbGlkYXRlUHJvcGVydHkocHJvcE5hbWUsIHZhbEtleSk7Ci0JCQkJaWYgKCFnZXRTdGF0dXModmFsS2V5KSkKLQkJCQkJcmV0dXJuIHByb3BOYW1lOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcGFyYW0gdmFsaWRhdGlvbmtleQotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIEludGVnZXIgdmFsaWRhdGlvbktleSkgewotCQlzZXRPS1N0YXR1cyh2YWxpZGF0aW9uS2V5KTsKLQkJSVN0YXR1cyBzdGF0dXMxID0gbW9kZWwudmFsaWRhdGVQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoIXN0YXR1czEuaXNPSygpKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IHN0YXR1czEuaXNNdWx0aVN0YXR1cygpID8gc3RhdHVzMS5nZXRDaGlsZHJlbigpWzBdLmdldE1lc3NhZ2UoKSA6IHN0YXR1czEuZ2V0TWVzc2FnZSgpOwotCQkJc3dpdGNoIChzdGF0dXMxLmdldFNldmVyaXR5KCkpIHsKLQkJCQljYXNlIElTdGF0dXMuRVJST1IgOgotCQkJCQlzZXRFcnJvclN0YXR1cyh2YWxpZGF0aW9uS2V5LCBtZXNzYWdlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJU3RhdHVzLldBUk5JTkcgOgotCQkJCQlzZXRXYXJuaW5nU3RhdHVzKHZhbGlkYXRpb25LZXksIG1lc3NhZ2UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElTdGF0dXMuSU5GTyA6Ci0JCQkJCXNldEluZm9TdGF0dXModmFsaWRhdGlvbktleSwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBlbmFibGVtZW50IG9mIGNvbnRyb2xzIGFmdGVyIHZhbGlkYXRpb24uIFN1YmxjYXNzZXMgc2hvdWxkIGNoZWNrIHRoZSBzdGF0dXMgb2YKLQkgKiB2YWxpZGF0aW9uIGtleXMgdG8gZGV0ZXJtaW5lIGVuYWJsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JfQotCQotCQotCS8qCi0JICogSWYgYSBwcm9wZXJ0eSBjaGFuZ2VzIHRoYXQgd2Ugd2FudCB0byB2YWxpZGF0ZSwgZm9yY2UgdmFsaWRhdGlvbiBvbiB0aGlzIHBhZ2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbkRhdGFNb2RlbExpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlZChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQlpZiAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMgIT0gbnVsbCAmJiAoZXZlbnQuZ2V0RmxhZygpID09IERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyB8fCAoIWlzVmFsaWQoKSAmJiBldmVudC5nZXRGbGFnKCkgPT0gRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRykpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzW2ldLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJCXZhbGlkYXRlUGFnZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHN5bmNoSGVscGVyICE9IG51bGwpIHsKLQkJCXN5bmNoSGVscGVyLmRpc3Bvc2UoKTsKLQkJCXN5bmNoSGVscGVyID0gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5mb3BvcElEKCkgewotCQlyZXR1cm4gaW5mb3BvcElEOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZm9wb3BJRChTdHJpbmcgaW5mb3BvcElEKSB7Ci0JCXRoaXMuaW5mb3BvcElEID0gaW5mb3BvcElEOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTBkNDFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuSnB0RGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLnVpLmludGVybmFsLkRUUFVpVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlCi0JZXh0ZW5kcyBEYXRhTW9kZWxQcm9wZXJ0eVBhZ2UKLQlpbXBsZW1lbnRzIEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcwotewotCXByaXZhdGUgUGxhdGZvcm1Hcm91cCBwbGF0Zm9ybUdyb3VwOwotCi0JcHJpdmF0ZSBDb25uZWN0aW9uR3JvdXAgY29ubmVjdGlvbkdyb3VwOwotCi0JcHJpdmF0ZSBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAgcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2FtcGxlUHJvcGVydHlQYWdlLgotCSAqLwotCXB1YmxpYyBKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UoKSB7Ci0JCXN1cGVyKERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKcGFGYWNldERhdGFNb2RlbFByb3ZpZGVyKCkpKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJcGxhdGZvcm1Hcm91cCA9IG5ldyBQbGF0Zm9ybUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNvbm5lY3Rpb25Hcm91cCA9IG5ldyBDb25uZWN0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQkJcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwID0gbmV3IFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cChjb21wb3NpdGUpOwotCi0JCXNldFJ1bnRpbWUoKTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5QUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0UpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJ1bnRpbWUoKSB7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGNlKTsKLQkJCXJldHVybjsKLQkJfQotCQlJUnVudGltZSBydW50aW1lID0gZmFjZXRlZFByb2plY3QuZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUUsIHJ1bnRpbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQlKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk1fSUQsCi0JCQlKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuQ09OTkVDVElPTiwKLQkJCUpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5VU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLAotCQkJSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsCi0JCQlKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gKEpwYVByb2plY3QpIHRoaXMuZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSnBhUHJvamVjdC5jbGFzcyk7Ci0JfQotCi0JQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIGJvb2xlYW4gZmlsbEhvcml6b250YWwpIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZDsKLQkJaWYgKGZpbGxIb3Jpem9udGFsKSB7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQl9Ci0JCWVsc2UgewotCQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJfQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5OT05FIHwgc3R5bGUpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlwbGF0Zm9ybUdyb3VwLnBlcmZvcm1EZWZhdWx0cygpOwotCQljb25uZWN0aW9uR3JvdXAucGVyZm9ybURlZmF1bHRzKCk7Ci0JCXBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cC5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpOwotCQlpZiAoanBhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgIC8vIHRoZSBmYWNldCBoYXMgYmVlbiB1bmluc3RhbGxlZCBkdXJpbmcgb3VyIHRyaXAgdG8gdGhlIHByb3BlcnRpZXMKLQkJfQotCi0JCWJvb2xlYW4gY2hhbmdlID0gZmFsc2U7Ci0JCWJvb2xlYW4gcGxhdGZvcm1DaGFuZ2UgPSBmYWxzZTsKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0ganBhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0KLQkJU3RyaW5nIHBsYXRmb3JtID0gdGhpcy5tb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk1fSUQpOwotCQlpZiAoICEgcGxhdGZvcm0uZXF1YWxzKGpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpKSkgewotCQkJY2hhbmdlID0gdHJ1ZTsKLQkJCXBsYXRmb3JtQ2hhbmdlID0gdHJ1ZTsKLQkJCUpwdENvcmVQbHVnaW4uc2V0SnBhUGxhdGZvcm1JZChwcm9qZWN0LCBwbGF0Zm9ybSk7Ci0JCX0KLQotCQlTdHJpbmcgY29ubmVjdGlvbiA9IHRoaXMubW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTk5FQ1RJT04pOwotCQlpZiAoICEgY29ubmVjdGlvbi5lcXVhbHMoanBhUHJvamVjdC5nZXREYXRhU291cmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCkpKSB7Ci0JCQljaGFuZ2UgPSB0cnVlOwotCQkJanBhUHJvamVjdC5nZXREYXRhU291cmNlKCkuc2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKGNvbm5lY3Rpb24pOwotCQkJSnB0Q29yZVBsdWdpbi5zZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUocHJvamVjdCwgY29ubmVjdGlvbik7Ci0JCX0KLQkJCi0JCVN0cmluZyB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hID0gbnVsbDsKLQkJaWYgKHRoaXMubW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5VU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkgewotCQkJdXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSA9IHRoaXMubW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpOwotCQl9Ci0JCVN0cmluZyBwcm9qZWN0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSA9IGpwYVByb2plY3QuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUoKTsKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSh1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hLCBwcm9qZWN0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSkpIHsKLQkJCWNoYW5nZSA9IHRydWU7Ci0JCQlqcGFQcm9qZWN0LnNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEpOwotCQkJSnB0Q29yZVBsdWdpbi5zZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZShwcm9qZWN0LCB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKTsKLQkJfQotCi0JCWJvb2xlYW4gZGlzY292ZXIgPSB0aGlzLm1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMpOwotCQlpZiAoZGlzY292ZXIgIT0ganBhUHJvamVjdC5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkpIHsKLQkJCWNoYW5nZSA9IHRydWU7Ci0JCQlqcGFQcm9qZWN0LnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoZGlzY292ZXIpOwotCQkJSnB0Q29yZVBsdWdpbi5zZXREaXNjb3ZlckFubm90YXRlZENsYXNzZXMocHJvamVjdCwgZGlzY292ZXIpOwotCQl9Ci0KLQkJaWYgKHBsYXRmb3JtQ2hhbmdlKSB7Ci0JCQlKcGFNb2RlbE1hbmFnZXIuaW5zdGFuY2UoKS5yZWJ1aWxkSnBhUHJvamVjdChwcm9qZWN0KTsKLQkJfQotCQlpZiAoY2hhbmdlKSB7Ci0JCQlidWlsZFByb2plY3QocHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBidWlsZFByb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgcj0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvamVjdC5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIHBtKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJSnB0VWlQbHVnaW4ubG9nKGNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bih0cnVlLCBmYWxzZSwgcik7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7IC8qIG5vdGhpbmcgdG8gZG8gKi8gfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpZSkgeyAvKiBub3RoaW5nIHRvIGRvICovIH0KLQl9Ci0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgUGxhdGZvcm1Hcm91cAotCXsKLQkJZmluYWwgQ29tYm8gcGxhdGZvcm1Db21ibzsKLQkJCi0JCQotCQlwdWJsaWMgUGxhdGZvcm1Hcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfcGxhdGZvcm1MYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCS8vIFRPRE8KLQkJCS8vIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIElEYWxpSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9EQVRBQkFTRSk7Ci0JCQkKLQkJCXBsYXRmb3JtQ29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgMSwgdHJ1ZSk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHBsYXRmb3JtQ29tYm8sIFBMQVRGT1JNX0lELCBudWxsKTsKLQkJCQotCQkJcGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQkJCi0JCXZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQkJU3RyaW5nIHBsYXRmb3JtSWQgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoUExBVEZPUk1fSUQsIHBsYXRmb3JtSWQpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgQ29ubmVjdGlvbkdyb3VwCi0JewotCQlmaW5hbCBDb21ibyBjb25uZWN0aW9uQ29tYm87Ci0KLQkJcHJpdmF0ZSBMaW5rIGNvbm5lY3Rpb25MaW5rOwotCQkKLQkJcHJpdmF0ZSBMaW5rIGNvbm5lY3RMaW5rOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBMYWJlbCBkZWZhdWx0U2NoZW1hTGFiZWw7Ci0JCQotCQlwcml2YXRlIGZpbmFsIENvbWJvIGRlZmF1bHRTY2hlbWFDb21ibzsKLQkJCi0JCQotCQlwdWJsaWMgQ29ubmVjdGlvbkdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGFiZWwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJY29ubmVjdGlvbkNvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIDMsIHRydWUpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSnBhSGVscENvbnRleHRJZHMuUFJPUEVSVElFU19KQVZBX1BFUlNJU1RFTkNFX0NPTk5FQ1RJT04pOwotCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhjb25uZWN0aW9uQ29tYm8sIENPTk5FQ1RJT04sIG51bGwpOwotCQkJY29ubmVjdGlvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJdXBkYXRlQ29ubmVjdExpbmsoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCi0JCQljb25uZWN0aW9uTGluayA9IG5ldyBMaW5rKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQljb25uZWN0aW9uTGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJY29ubmVjdGlvbkxpbmsuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGluayk7Ci0JCQljb25uZWN0aW9uTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCW9wZW5OZXdDb25uZWN0aW9uV2l6YXJkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQkJCi0JCQljb25uZWN0TGluayA9IG5ldyBMaW5rKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQljb25uZWN0TGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJY29ubmVjdExpbmsuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0TGluayk7Ci0JCQljb25uZWN0TGluay5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWNvbm5lY3RMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJb3BlbkNvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQotCQkJb3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAzLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRTY2hlbWFMYWJlbCwgU1dULkNIRUNLKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gob3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uLCBVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBuZXcgQ29udHJvbFswXSk7Ci0JCQkKLQkJCWRlZmF1bHRTY2hlbWFMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULkxFRlQpOwotCQkJZGVmYXVsdFNjaGVtYUxhYmVsLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdFNjaGVtYUxhYmVsKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlkZWZhdWx0U2NoZW1hTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkKLQkJCWRlZmF1bHRTY2hlbWFDb21ibyA9IGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oCi0JCQkJZGVmYXVsdFNjaGVtYUNvbWJvLCBVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCAKLQkJCQluZXcgQ29udHJvbFtdIHtkZWZhdWx0U2NoZW1hTGFiZWx9KTsKLQkJCQotCQkJcGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQkJCi0JCXZvaWQgb3Blbk5ld0Nvbm5lY3Rpb25XaXphcmQoKSB7Ci0JCQlTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBEVFBVaVRvb2xzLmNyZWF0ZU5ld0Nvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCQlpZiAoY29ubmVjdGlvbk5hbWUgIT0gbnVsbCkgewotCQkJCW1vZGVsLnNldFByb3BlcnR5KENPTk5FQ1RJT04sIGNvbm5lY3Rpb25OYW1lKTsKLQkJCX0KLQkJfQotCQkKLQkJdm9pZCBvcGVuQ29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJCWlmIChjcCAhPSBudWxsKSB7Ci0JCQkJY3AuY29ubmVjdCgpOwotCQkJfQotCQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KENPTk5FQ1RJT05fQUNUSVZFLCAoY3AgIT0gbnVsbCkgJiYgY3AuaXNBY3RpdmUoKSk7Ci0JCQl0aGlzLnVwZGF0ZUNvbm5lY3RMaW5rKGNwKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdm9pZCB1cGRhdGVDb25uZWN0TGluayhDb25uZWN0aW9uUHJvZmlsZSBjcCkgewotCQkJY29ubmVjdExpbmsuc2V0RW5hYmxlZCgoY3AgIT0gbnVsbCkgJiYgY3AuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JCX0KLQkJCi0JCXZvaWQgdXBkYXRlQ29ubmVjdExpbmsoKSB7Ci0JCQl0aGlzLnVwZGF0ZUNvbm5lY3RMaW5rKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCQkvLyB3ZSBqdXN0IHVzZSB0aGUgY29ubmVjdGlvbiBwcm9maWxlIHRvIGxvZyBpbiwgc28gZ28gdG8gdGhlIGRiIHBsdWctaW4KLQkJCXJldHVybiBKcHREYlBsdWdpbi5pbnN0YW5jZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoQ09OTkVDVElPTikpOwotCQl9Ci0KLQkJdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCQlTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0RGF0YVNvdXJjZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OTkVDVElPTiwgY29ubmVjdGlvbk5hbWUpOwotCQkJCi0JCQlTdHJpbmcgZGVmYXVsdFNjaGVtYSA9IGdldEpwYVByb2plY3QoKS5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSgpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgQm9vbGVhbi52YWx1ZU9mKGRlZmF1bHRTY2hlbWEgIT0gbnVsbCkpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgZGVmYXVsdFNjaGVtYSk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwCi0JewotCQlmaW5hbCBCdXR0b24gZGlzY292ZXJDbGFzc2VzQnV0dG9uOwotCi0JCWZpbmFsIEJ1dHRvbiBsaXN0Q2xhc3Nlc0J1dHRvbjsKLQotCi0JCXB1YmxpYyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3BlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRMYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfQ0xBU1NQQVRIKTsKLQotCQkJZGlzY292ZXJDbGFzc2VzQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kaXNjb3ZlckNsYXNzZXNCdXR0b24sIFNXVC5SQURJTyk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGRpc2NvdmVyQ2xhc3Nlc0J1dHRvbiwgRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIG51bGwpOwotCQkJCi0JCQlsaXN0Q2xhc3Nlc0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfbGlzdENsYXNzZXNCdXR0b24sIFNXVC5SQURJTyk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGxpc3RDbGFzc2VzQnV0dG9uLCBMSVNUX0FOTk9UQVRFRF9DTEFTU0VTLCBudWxsKTsKLQkJCQotCQkJcGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQkJCi0JCXZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQkJYm9vbGVhbiBkaXNjb3ZlckNsYXNzZXMgPSBnZXRKcGFQcm9qZWN0KCkuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcygpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIEJvb2xlYW4udmFsdWVPZihkaXNjb3ZlckNsYXNzZXMpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vRGVmYXVsdEpwYVNlbGVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0RlZmF1bHRKcGFTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2NGE2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vRGVmYXVsdEpwYVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSnBhU2VsZWN0aW9uIGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRKcGFTZWxlY3Rpb24KLQlpbXBsZW1lbnRzIEpwYVNlbGVjdGlvbgotewotCXByaXZhdGUgZmluYWwgSnBhU3RydWN0dXJlTm9kZSBzZWxlY3RlZE5vZGU7Ci0KLQotCXB1YmxpYyBEZWZhdWx0SnBhU2VsZWN0aW9uKEpwYVN0cnVjdHVyZU5vZGUgc2VsZWN0ZWROb2RlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzZWxlY3RlZE5vZGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJBICdzZWxlY3RlZE5vZGUnIGlzIHJlcXVpcmVkOyBvdGhlcndpc2UgdXNlIE5VTExfU0VMRUNUSU9OLiIpOwotCQl9Ci0JCXRoaXMuc2VsZWN0ZWROb2RlID0gc2VsZWN0ZWROb2RlOwotCX0KLQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFNlbGVjdGVkTm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWROb2RlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCS8vIGJ5IGRlZmluaXRpb24sIHRoaXMgc2VsZWN0aW9uIGlzIG5ldmVyIGVtcHR5Ci0JCS8vIHVzZSBJSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OIGZvciBlbXB0eSBzZWxlY3Rpb25zCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoISAob2JqIGluc3RhbmNlb2YgSnBhU2VsZWN0aW9uKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUpwYVNlbGVjdGlvbiBvdGhlciA9IChKcGFTZWxlY3Rpb24pIG9iajsKLQkJcmV0dXJuICggISBvdGhlci5pc0VtcHR5KCkpICYmIHRoaXMuc2VsZWN0ZWROb2RlLmVxdWFscyhvdGhlci5nZXRTZWxlY3RlZE5vZGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWROb2RlLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWROb2RlLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9EZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODNiY2E2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9EZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotLyoqCi0gKiBBIHtAbGluayBKcGFTZWxlY3Rpb25NYW5hZ2VyfSBzdG9yZXMgdGhlIGN1cnJlbnQge0BsaW5rIEpwYVNlbGVjdGlvbn0gYW5kIAotICogbm90aWZpZXMgPGNvZGU+SVNlbGVjdGlvbkxpc3RlbmVyPC9jb2RlPnMgd2hlbiB0aGUgc2VsZWN0aW9uIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlcgotCWltcGxlbWVudHMgSnBhU2VsZWN0aW9uTWFuYWdlcgotewotCS8qIFRoZSB3aW5kb3cgZm9yIHdoaWNoIHRoaXMgb2JqZWN0IG1hbmFnZXMgc2VsZWN0aW9ucyAqLwotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0JCi0JLyogVGhlIHNldCBvZiBwYWdlcyBmb3Igd2hpY2ggdGhpcyBvYmplY3QgaXMgbWFuYWdpbmcgc2VsZWN0aW9ucyAqLwotCXByaXZhdGUgU2V0PElXb3JrYmVuY2hQYWdlPiBwYWdlczsKLQkKLQkvKiBUaGUgYWN0aXZlIGVkaXRvciBwYXJ0ICovCi0JcHJpdmF0ZSBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3I7Ci0JCi0JcHJpdmF0ZSBKcGFTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQkKLQkvKiBUaGUgbWFwIG9mIDxjb2RlPklKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudDwvY29kZT5zIChrZXllZCBieSBwYXJ0KSAqLwotCXByaXZhdGUgTWFwPElXb3JrYmVuY2hQYXJ0LCBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudD4gc2VsZWN0aW9uUGFydGljaXBhbnRzOwotCQotCXByaXZhdGUgSVBhZ2VMaXN0ZW5lciBwYWdlTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBJUGFydExpc3RlbmVyMiBwYXJ0TGlzdGVuZXI7Ci0JCi0JCi0JcHVibGljIERlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlwYWdlcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldChuZXcgSGFzaFNldDxJV29ya2JlbmNoUGFnZT4oKSk7Ci0JCXNlbGVjdGlvblBhcnRpY2lwYW50cyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcDxJV29ya2JlbmNoUGFydCwgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQ+KCkpOwotCQlwYWdlTGlzdGVuZXIgPSBuZXcgUGFnZUxpc3RlbmVyKCk7Ci0JCXBhcnRMaXN0ZW5lciA9IG5ldyBQYXJ0TGlzdGVuZXIoKTsKLQkJY3VycmVudFNlbGVjdGlvbiA9IERlZmF1bHRKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JfQotCQotCXZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IGFXaW5kb3cpIHsKLQkJd2luZG93ID0gYVdpbmRvdzsKLQkJYVdpbmRvdy5hZGRQYWdlTGlzdGVuZXIocGFnZUxpc3RlbmVyKTsKLQkJaW5pdFBhZ2UoYVdpbmRvdy5nZXRBY3RpdmVQYWdlKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdFBhZ2UoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlpZiAoKHBhZ2UgIT0gbnVsbCkgJiYgKCEgcGFnZXMuY29udGFpbnMocGFnZSkpKSB7Ci0JCQlwYWdlLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCQkJcGFnZXMuYWRkKHBhZ2UpOwotCQkJYWN0aXZhdGVFZGl0b3IocGFnZS5nZXRBY3RpdmVFZGl0b3IoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VQYWdlKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJaWYgKChwYWdlICE9IG51bGwpICYmIChwYWdlcy5jb250YWlucyhwYWdlKSkpIHsKLQkJCXBhZ2UucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JCQlwYWdlcy5yZW1vdmUocGFnZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlRWRpdG9yKElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlpZiAoZWRpdG9yID09IGFjdGl2ZUVkaXRvcikgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotCQkJaW5hY3RpdmF0ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQl9Ci0JCWluaXRQYXJ0KGVkaXRvcik7Ci0JCWFjdGl2ZUVkaXRvciA9IGVkaXRvcjsKLQkJc2VsZWN0RWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbmFjdGl2YXRlRWRpdG9yKElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQkKLQl9Ci0JCi0Jdm9pZCBpbml0UGFydChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25QYXJ0aWNpcGFudHMuZ2V0KHBhcnQpID09IG51bGwpIHsKLQkJCQlKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBzZWxlY3Rpb25QYXJ0aWNpcGFudCA9IAotCQkJCQkoSnBhU2VsZWN0aW9uUGFydGljaXBhbnQpIHBhcnQuZ2V0QWRhcHRlcihKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudC5jbGFzcyk7Ci0JCQkJaWYgKHNlbGVjdGlvblBhcnRpY2lwYW50ICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uUGFydGljaXBhbnRzLnB1dChwYXJ0LCBzZWxlY3Rpb25QYXJ0aWNpcGFudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZWxlY3RFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCXNlbGVjdFBhcnQoZWRpdG9yKTsKLQl9Ci0JCi0Jdm9pZCBzZWxlY3RQYXJ0KElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgc2VsZWN0aW9uUGFydGljaXBhbnQgPSBnZXRTZWxlY3Rpb25QYXJ0aWNpcGFudChwYXJ0KTsKLQkJaWYgKHNlbGVjdGlvblBhcnRpY2lwYW50ICE9IG51bGwpIHsKLQkJCXNlbGVjdChzZWxlY3Rpb25QYXJ0aWNpcGFudC5nZXRTZWxlY3Rpb24oKSwgc2VsZWN0aW9uUGFydGljaXBhbnQpOwotCQl9Ci0JfQotCQotCXZvaWQgaGlkZVBhcnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBzZWxlY3Rpb25QYXJ0aWNpcGFudCA9IGdldFNlbGVjdGlvblBhcnRpY2lwYW50KHBhcnQpOwotCQlpZiAoKHNlbGVjdGlvblBhcnRpY2lwYW50ICE9IG51bGwpICYmIChzZWxlY3Rpb25QYXJ0aWNpcGFudC5kaXNwb3NlT25IaWRlKCkpKSB7Ci0JCQljbG9zZVBhcnQocGFydCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBjbG9zZVBhcnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBzZWxlY3Rpb25QYXJ0aWNpcGFudCA9IGdldFNlbGVjdGlvblBhcnRpY2lwYW50KHBhcnQpOwotCQlpZiAoc2VsZWN0aW9uUGFydGljaXBhbnQgIT0gbnVsbCkgewotCQkJZGlzcG9zZVBhcnQocGFydCk7Ci0JCQljaGVja0Zvck5vRWRpdG9ycygpOwotCQl9Ci0JfQotCQotCXZvaWQgZGlzcG9zZVBhcnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAoKHBhcnQgIT0gbnVsbCkgJiYgKHNlbGVjdGlvblBhcnRpY2lwYW50cy5jb250YWluc0tleShwYXJ0KSkpIHsKLQkJCXNlbGVjdGlvblBhcnRpY2lwYW50cy5yZW1vdmUocGFydCkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXZvaWQgY2hlY2tGb3JOb0VkaXRvcnMoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoKGFjdGl2ZVBhZ2UgPT0gbnVsbCkKLQkJCQl8fCAoYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSA9PSBudWxsKSkgewotCQkJc2VsZWN0KERlZmF1bHRKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT04sIG51bGwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJaW5pdFBhcnQocGFydCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUmVnaXN0ZXJlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXJldHVybiBzZWxlY3Rpb25QYXJ0aWNpcGFudHMuZ2V0KHBhcnQpICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdChKcGFTZWxlY3Rpb24gbmV3U2VsZWN0aW9uLCBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBzb3VyY2UpIHsKLQkJaWYgKGN1cnJlbnRTZWxlY3Rpb24uZXF1YWxzKG5ld1NlbGVjdGlvbikpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJY3VycmVudFNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLQkJT2JqZWN0IG5vbk51bGxTb3VyY2UgPSAoc291cmNlID09IG51bGwpID8gdGhpcyA6IHNvdXJjZTsKLQkJZmlyZVNlbGVjdGlvbkNoYW5nZSgKLQkJCW5ldyBKcGFTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIEpwYVNlbGVjdGlvbkV2ZW50LlNFTEVDVElPTiwgbm9uTnVsbFNvdXJjZSkKLQkJKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGVzZWxlY3QoSnBhU2VsZWN0aW9uIG9sZFNlbGVjdGlvbiwgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgc291cmNlKSB7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uLmVxdWFscyhvbGRTZWxlY3Rpb24pKSB7Ci0JCQljdXJyZW50U2VsZWN0aW9uID0gRGVmYXVsdEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQkJCU9iamVjdCBub25OdWxsU291cmNlID0gKHNvdXJjZSA9PSBudWxsKSA/IHRoaXMgOiBzb3VyY2U7Ci0JCQlmaXJlU2VsZWN0aW9uQ2hhbmdlKAotCQkJCW5ldyBKcGFTZWxlY3Rpb25FdmVudChvbGRTZWxlY3Rpb24sIEpwYVNlbGVjdGlvbkV2ZW50LkRFU0VMRUNUSU9OLCBub25OdWxsU291cmNlKQotCQkJKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZShKcGFTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlmb3IgKEpwYVNlbGVjdGlvblBhcnRpY2lwYW50IHNwIDogc2VsZWN0aW9uUGFydGljaXBhbnRzLnZhbHVlcygpKSB7Ci0JCQlzcC5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIEpwYVNlbGVjdGlvblBhcnRpY2lwYW50IGdldFNlbGVjdGlvblBhcnRpY2lwYW50KElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJcmV0dXJuIHNlbGVjdGlvblBhcnRpY2lwYW50cy5nZXQocGFydCk7Ci0JfQotCQkKLQlwdWJsaWMgSnBhU2VsZWN0aW9uIGdldEN1cnJlbnRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl3aW5kb3cucmVtb3ZlUGFnZUxpc3RlbmVyKHBhZ2VMaXN0ZW5lcik7Ci0JCXNlbGVjdGlvblBhcnRpY2lwYW50cy5jbGVhcigpOwotCQkKLQkJZm9yIChJdGVyYXRvcjxJV29ya2JlbmNoUGFnZT4gc3RyZWFtID0gbmV3IENsb25lSXRlcmF0b3I8SVdvcmtiZW5jaFBhZ2U+KHRoaXMucGFnZXMpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuZGlzcG9zZVBhZ2Uoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yPElXb3JrYmVuY2hQYXJ0PiBzdHJlYW0gPSBuZXcgQ2xvbmVJdGVyYXRvcjxJV29ya2JlbmNoUGFydD4oc2VsZWN0aW9uUGFydGljaXBhbnRzLmtleVNldCgpKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmRpc3Bvc2VQYXJ0KHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgY2xhc3MgUGFnZUxpc3RlbmVyIGltcGxlbWVudHMgSVBhZ2VMaXN0ZW5lcgotCXsKLQkJcHVibGljIHZvaWQgcGFnZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCQkvLyBub3AKLQkJfQotCQkKLQkJUGFnZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGFnZUNsb3NlZChJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci50aGlzLmRpc3Bvc2VQYWdlKHBhZ2UpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYWdlT3BlbmVkKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJCURlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyLnRoaXMuaW5pdFBhZ2UocGFnZSk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBQYXJ0TGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyMgotCXsKLQkJUGFydExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFydFJlZi5nZXRQYXJ0KGZhbHNlKTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci50aGlzLmluaXRQYXJ0KHBhcnQpOwotCQkJCURlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyLnRoaXMuc2VsZWN0UGFydChwYXJ0KTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkvLyBub3AKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFydFJlZi5nZXRQYXJ0KGZhbHNlKTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci50aGlzLmNsb3NlUGFydChwYXJ0KTsKLQkJCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci50aGlzLmRpc3Bvc2VQYXJ0KHBhcnQpOwotCQkJCURlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyLnRoaXMuY2hlY2tGb3JOb0VkaXRvcnMoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCS8vIG5vcAotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0SGlkZGVuKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCURlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyLnRoaXMuaGlkZVBhcnQocGFydCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRJbnB1dENoYW5nZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJLy8gbm9wCi0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRSZWYuZ2V0UGFydChmYWxzZSk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJaW5pdFBhcnQocGFydCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRWaXNpYmxlKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCWluaXRQYXJ0KHBhcnQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYThlZWY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFEZXRhaWxzU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3cy5KcGFEZXRhaWxzVmlldzsKLQotCi1wdWJsaWMgY2xhc3MgSnBhRGV0YWlsc1NlbGVjdGlvblBhcnRpY2lwYW50Ci0JaW1wbGVtZW50cyBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCAKLXsKLQlwcml2YXRlIGZpbmFsIEpwYURldGFpbHNWaWV3IGRldGFpbHNWaWV3OwotCQotCQotCXB1YmxpYyBKcGFEZXRhaWxzU2VsZWN0aW9uUGFydGljaXBhbnQoSnBhRGV0YWlsc1ZpZXcgZGV0YWlsc1ZpZXcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kZXRhaWxzVmlldyA9IGRldGFpbHNWaWV3OwotCX0KLQotCXB1YmxpYyBKcGFTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5kZXRhaWxzVmlldy5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKEpwYVNlbGVjdGlvbkV2ZW50IGV2dCkgewotCQl0aGlzLmRldGFpbHNWaWV3LnNlbGVjdChldnQuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRpc3Bvc2VPbkhpZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBOT1AKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTZWxlY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1NTY1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczoKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgSnBhU2VsZWN0aW9uIGV4dGVuZHMgSVNlbGVjdGlvbgotewotCXN0YXRpYyBKcGFTZWxlY3Rpb24gTlVMTF9TRUxFQ1RJT04gPQotCQluZXcgSnBhU2VsZWN0aW9uKCkgewotCQkJcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U2VsZWN0ZWROb2RlKCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJOVUxMIFNFTEVDVElPTiI7Ci0JCQl9Ci0JCX07Ci0KLQotCUpwYVN0cnVjdHVyZU5vZGUgZ2V0U2VsZWN0ZWROb2RlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTZWxlY3Rpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjhiYWZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTZWxlY3Rpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBKcGFTZWxlY3Rpb25FdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IAotewotCS8qKgotCSAqIFNlcmlhbGl6YWJsZSB1aWQKLQkgKiBAc2luY2UgMC41Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoYXQgdGhlIHNlbGVjdGlvbiBvYmplY3QgaXMgbm93IHNlbGVjdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgU0VMRUNUSU9OID0gMTsKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc2VsZWN0aW9uIG9iamVjdCBoYXMgbm93IGJlZW4gZGVzZWxlY3RlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IERFU0VMRUNUSU9OID0gMjsKLQkKLQkKLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIG9iamVjdCB3aG9zZSBzZWxlY3Rpb24gc3RhdHVzIGhhcyBjaGFuZ2VkCi0JICovCi0JcHJpdmF0ZSBKcGFTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBzZWxlY3Rpb24gZXZlbnQsIGVpdGhlciBhIFNFTEVDVElPTiBvciBhIERFU0VMRUNUSU9OCi0JICovCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQkKLQkKLQlwdWJsaWMgSnBhU2VsZWN0aW9uRXZlbnQoSnBhU2VsZWN0aW9uIHRoZVNlbGVjdGlvbiwgaW50IHRoZVR5cGUsIE9iamVjdCBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJc2VsZWN0aW9uID0gdGhlU2VsZWN0aW9uOwotCQl0eXBlID0gdGhlVHlwZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZWxlY3Rpb24gb2JqZWN0IHdob3NlIHNlbGVjdGlvbiBzdGF0dXMgaGFzIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgSnBhU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG9mIHNlbGVjdGlvbiBldmVudCwgZWl0aGVyIGEgU0VMRUNUSU9OIG9yIGEgREVTRUxFQ1RJT04KLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTZWxlY3Rpb25NYW5hZ2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWUzZTMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTZWxlY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotcHVibGljIGludGVyZmFjZSBKcGFTZWxlY3Rpb25NYW5hZ2VyIAotewkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiAgCi0JICogVGhpcyB3aWxsIG5ldmVyIGJlIG51bGwsIGJ1dCBpdCBtYXkgYmUgZW1wdHkuCi0JICovCi0JcHVibGljIEpwYVNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCk7Ci0JCi0JLyoqCi0JICogTm90IHRvIGJlIGNhbGxlZCBsaWdodGx5LCB0aGlzIHdpbGwgYWZmZWN0IHRoZSBzZWxlY3Rpb24gZm9yIGFsbCBpbnRlcmVzdGVkCi0JICogb2JqZWN0cyBpbiBhIHdpbmRvdy4KLQkgKiBAcGFyYW0gbmV3U2VsZWN0aW9uICBUaGUgbmV3IHNlbGVjdGlvbiBmb3IgdGhlIGN1cnJlbnQgd2luZG93LgotCSAqIEBwYXJhbSBzb3VyY2UgIFRoZSBzZWxlY3Rpb24gcGFydGljaXBhbnQgKGlmIGFueSkgdGhhdCBpcyBjYXVzaW5nIHRoZSAKLQkgKiBzZWxlY3Rpb24uICBNYXkgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3QoSnBhU2VsZWN0aW9uIG5ld1NlbGVjdGlvbiwgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgc291cmNlKTsKLQkKLQkvKioKLQkgKiBOb3QgdG8gYmUgY2FsbGVkIGxpZ2h0bHksIHRoaXMgd2lsbCBhZmZlY3QgdGhlIHNlbGVjdGlvbiBmb3IgYWxsIGludGVyZXN0ZWQKLQkgKiBvYmplY3RzIGluIGEgd2luZG93LgotCSAqIEBwYXJhbSBvbGRTZWxlY3Rpb24gIFRoZSBvbGRTZWxlY3Rpb24gd2lsbCBiZSBkZXNlbGVjdGVkLCBpZmYgaXQgbWF0Y2hlcyAKLQkgKiB0aGUgY3VycmVudCBzZWxlY3Rpb24uICBJZiBzbywgdGhlIG5ldyBzZWxlY3Rpb24gd2lsbCBiZSBhbiBlbXB0eSBKcGFTZWxlY3Rpb24uCi0JICogQHBhcmFtIHNvdXJjZSAgVGhlIHNlbGVjdGlvbiBwYXJ0aWNpcGFudCAoaWYgYW55KSB0aGF0IGlzIGNhdXNpbmcgdGhlIAotCSAqIHNlbGVjdGlvbi4gIE1heSBiZSBudWxsLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXNlbGVjdChKcGFTZWxlY3Rpb24gb2xkU2VsZWN0aW9uLCBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBzb3VyY2UpOwotCQotCS8qKgotCSAqIFRoaXMgbWF5IGJlIHVzZWQgdG8gcmVnaXN0ZXIgYSBwYXJ0IHdpdGggdGhlIHNlbGVjdGlvbiBtYW5hZ2VyIGlmIHRoZSBwYXJ0Ci0JICogaXMga25vd24gdG8gbmVlZCBhY2Nlc3MgdG8gdGhlIHNlbGVjdGlvbiBtYW5hZ2VyIGJlZm9yZSBpdCBpcyBldmVyIGFjdGl2YXRlZAotCSAqIG9yIGluIHRoZSBjYXNlIGl0IG1heSBiZSBhY3RpdmF0ZWQgcHJpb3IgdG8gdGhlIHNlbGVjdGlvbiBtYW5hZ2VyIGJlaW5nIAotCSAqIGNyZWF0ZWQuCi0JICogCi0JICogSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gZGVyZWdpc3RlciBhIHBhcnQsIGFzIHRoYXQgaGFwcGVucyB3aGVuIHRoZSAKLQkgKiBwYXJ0IGlzIGNsb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlcihJV29ya2JlbmNoUGFydCBwYXJ0KTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhcnQgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgdG8gcmVzcG9uZCB0byBzZWxlY3Rpb25zCi0JICogZnJvbSB0aGlzIHNlbGVjdGlvbiBtYW5hZ2VyCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWdpc3RlcmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjZjExZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCAKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9mIHRoZSBwYXJ0aWNpcGFudAotCSAqLwotCUpwYVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKTsKLQkKLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGluIHRoZSBjZW50cmFsIHNlbGVjdGlvbiBtYW5hZ2VyLgotCSAqIFVwZGF0ZSB0aGlzIHBhcnRpY2lwYW50IGFjY29yZGluZ2x5LgotCSAqLwotCXZvaWQgc2VsZWN0aW9uQ2hhbmdlZChKcGFTZWxlY3Rpb25FdmVudCBldnQpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgc2VsZWN0aW9uIHBhcnRpY2lwYW50IHNob3VsZCBkaXNjb25uZWN0IGl0c2VsZiBmcm9tCi0JICogaXRzIHBhcnQgd2hlbiBpdHMgcGFydCBpcyBoaWRkZW4gZnJvbSB2aWV3LgotCSAqIDxiPlR5cGljYWxseTwvYj4gZWRpdG9yIHBhcnRpY2lwYW50cyB3aWxsIHJldHVybiB0cnVlIGFuZCB2aWV3IHBhcnRpY2lwYW50cyB3aWxsCi0JICogcmV0dXJuIGZhbHNlLgotCSAqLwotCWJvb2xlYW4gZGlzcG9zZU9uSGlkZSgpOwotCQotCS8qKgotCSAqIFRoaXMgcGFydGljaXBhbnQgaXMgbm8gbG9uZ2VyIG5lZWRlZCAobW9zdCBsaWtlbHkgYmVjYXVzZSBpdHMgcGFydCBoYXMgCi0JICogY2xvc2VkKS4gIERpc3Bvc2Ugb2YgaXQuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU3RydWN0dXJlU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTNhMzY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3cy5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlVmlldzsKLQotcHVibGljIGNsYXNzIEpwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50Ci0JaW1wbGVtZW50cyBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCAKLXsKLQlmaW5hbCBKcGFTdHJ1Y3R1cmVWaWV3IHN0cnVjdHVyZVZpZXc7Ci0JCi0JCi0JcHVibGljIEpwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50KEpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciwgSnBhU3RydWN0dXJlVmlldyBzdHJ1Y3R1cmVWaWV3KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RydWN0dXJlVmlldyA9IHN0cnVjdHVyZVZpZXc7Ci0JCXN0cnVjdHVyZVZpZXcuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBTdHJ1Y3R1cmVWaWV3U2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTWFuYWdlciwgc3RydWN0dXJlVmlldykpOwotCX0KLQotCXB1YmxpYyBKcGFTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5zdHJ1Y3R1cmVWaWV3LmdldEpwYVNlbGVjdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKEpwYVNlbGVjdGlvbkV2ZW50IGV2dCkgewotCQlpZiAoZXZ0LmdldFNvdXJjZSgpICE9IHRoaXMpIHsKLQkJCXRoaXMuc3RydWN0dXJlVmlldy5zZWxlY3QoZXZ0LmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGRpc3Bvc2VPbkhpZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gTk9QCi0JfQotCQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIFN0cnVjdHVyZVZpZXdTZWxlY3Rpb25MaXN0ZW5lciAKLQkJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0JewotCQlwcml2YXRlIGZpbmFsIEpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlcjsKLQotCQlTdHJ1Y3R1cmVWaWV3U2VsZWN0aW9uTGlzdGVuZXIoSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyLCBKcGFTdHJ1Y3R1cmVWaWV3IHN0cnVjdHVyZVZpZXcpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNlbGVjdGlvbk1hbmFnZXIgPSBzZWxlY3Rpb25NYW5hZ2VyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChzdHJ1Y3R1cmVWaWV3LmdldFZpZXdTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5nZXRBY3RpdmVQYXJ0KCkgPT0gc3RydWN0dXJlVmlldykgewotCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2VsZWN0KHRoaXMuc3RydWN0dXJlVmlld1NlbGVjdGlvbigpLCBKcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudC50aGlzKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgSnBhU2VsZWN0aW9uIHN0cnVjdHVyZVZpZXdTZWxlY3Rpb24oKSB7Ci0JCQlyZXR1cm4gSnBhU3RydWN0dXJlU2VsZWN0aW9uUGFydGljaXBhbnQudGhpcy5zdHJ1Y3R1cmVWaWV3LmdldEpwYVNlbGVjdGlvbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjMGQ2Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotcHVibGljIGNsYXNzIFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkgSU5TVEFOQ0U7Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgTVVURVggPSBuZXcgT2JqZWN0KCk7Ci0KLQotCS8qKgotCSAqIEVhY2ggPGNvZGU+SVdvcmtiZW5jaFdpbmRvdzwvY29kZT4gaGFzIGl0cyBvd24gPGNvZGU+SnBhU2VsZWN0aW9uTWFuYWdlcjwvY29kZT4KLQkgKiB0byB0cmFjayB0aGUgc2VsZWN0aW9uIGV2ZW50cyBpbiB0aGUgPGNvZGU+SVdvcmtiZW5jaFdpbmRvdzwvY29kZT4uIEFsbAotCSAqIDxjb2RlPklTZWxlY3Rpb25MaXN0ZW5lcjwvY29kZT5zIGluIHRoZSBzYW1lIDxjb2RlPklXb3JrYmVuY2hXaW5kb3c8L2NvZGU+Ci0JICogc2hhcmUgdGhlIHNhbWUgPGNvZGU+SnBhU2VsZWN0aW9uTWFuYWdlcjwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5KcGFTZWxlY3Rpb25NYW5hZ2VyPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQKLQkgKiA8Y29kZT5JV29ya2JlbmNoV2luZG93PC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhU2VsZWN0aW9uTWFuYWdlciBnZXRTZWxlY3Rpb25NYW5hZ2VyKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQkvLyB0aGlzIGlzIHRocmVhZCBzYWZlIGZvciBub3cuIHlvdSBuZXZlciBrbm93IHdoYXRzIGNvbW1pbmcKLQkJCXN5bmNocm9uaXplZCAoTVVURVgpIHsKLQkJCQlpZihJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQkJCUlOU1RBTkNFID0gbmV3IFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5KCk7Ci0JCQkJCS8vIGlmIHdlIGRvIHRoZSBpbml0IGluc2lkZSB0aGUgY29uc3RydWN0b3Igd2UgZW5kIHVwIGluIGEgbG9vcAotCQkJCQkvLyBiZWNhdXNlIHRoZSBhZGRXaW5kb3dMaXN0ZW5lcih0aGlzKSBkb2VzIGEgY2FsbGJhY2sgdG8gdXMKLQkJCQkJSU5TVEFOQ0UuaW5pdCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0UuaW50ZXJuYWxHZXRTZWxlY3Rpb25NYW5hZ2VyKHdpbmRvdyk7Ci0JfQotCi0KLQlwcml2YXRlIE1hcDxJV29ya2JlbmNoV2luZG93LCBEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlcj4gbWFuYWdlcnM7Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIHdpbmRvd0xpc3RlbmVyOwotCi0KLQlwcml2YXRlIFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5KCkgewotCQltYW5hZ2VycyA9IG5ldyBIYXNoTWFwPElXb3JrYmVuY2hXaW5kb3csIERlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyPigpOwotCQl3aW5kb3dMaXN0ZW5lciA9IG5ldyBXaW5kb3dMaXN0ZW5lcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCXdvcmtiZW5jaC5hZGRXaW5kb3dMaXN0ZW5lcih3aW5kb3dMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSnBhU2VsZWN0aW9uTWFuYWdlciBmb3IgdGhlIElXb3JrYmVuY2hXaW5kb3cuCi0JICogQ3JlYXRlcyBhIG5ldyBvbmUgaWYgbm9uZSBleGlzdHMgeWV0LgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIgaW50ZXJuYWxHZXRTZWxlY3Rpb25NYW5hZ2VyKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIElXb3JrYmVuY2hXaW5kb3cgY2Fubm90IGJlIG51bGwiKTsKLQkJfQotCi0JCWlmICghIG1hbmFnZXJzLmNvbnRhaW5zS2V5KHdpbmRvdykpIHsKLQkJCURlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyIG1hbmFnZXIgPSBuZXcgRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIoKTsKLQkJCXRoaXMubWFuYWdlcnMucHV0KHdpbmRvdywgbWFuYWdlcik7Ci0JCQltYW5hZ2VyLmluaXQod2luZG93KTsKLQkJfQotCi0JCXJldHVybiBtYW5hZ2Vycy5nZXQod2luZG93KTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgV2luZG93TGlzdGVuZXIgaW1wbGVtZW50cyBJV2luZG93TGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IGFXaW5kb3cpIHt9Ci0KLQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKElXb3JrYmVuY2hXaW5kb3cgYVdpbmRvdykgewotCQkJRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIgbWFuYWdlciA9IGludGVybmFsR2V0U2VsZWN0aW9uTWFuYWdlcihhV2luZG93KTsKLQkJCW1hbmFnZXIuZGlzcG9zZSgpOwotCQkJbWFuYWdlcnMucmVtb3ZlKGFXaW5kb3cpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgYVdpbmRvdykge30KLQotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IGFXaW5kb3cpIHt9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvblBhcnRpY2lwYW50RmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvblBhcnRpY2lwYW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTljYzQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25QYXJ0aWNpcGFudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLkpwYURldGFpbHNWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3cy5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uUGFydGljaXBhbnRGYWN0b3J5IAotCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci17Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX0xJU1QgPSBuZXcgQ2xhc3NbXSB7IEpwYVNlbGVjdGlvblBhcnRpY2lwYW50LmNsYXNzIH07Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBBREFQVEVSX0xJU1Q7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmICghIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJV29ya2JlbmNoUGFydCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIgPSAKLQkJCVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIoKChJV29ya2JlbmNoUGFydCkgYWRhcHRhYmxlT2JqZWN0KS5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkpOwotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCXJldHVybiBuZXcgVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50KHNlbGVjdGlvbk1hbmFnZXIsIChJVGV4dEVkaXRvcikgYWRhcHRhYmxlT2JqZWN0KTsKLQkJfQotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSnBhU3RydWN0dXJlVmlldykgewotCQkJcmV0dXJuIG5ldyBKcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudChzZWxlY3Rpb25NYW5hZ2VyLCAoSnBhU3RydWN0dXJlVmlldykgYWRhcHRhYmxlT2JqZWN0KTsKLQkJfQotCQllbHNlIGlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBKcGFEZXRhaWxzVmlldykgewotCQkJcmV0dXJuIG5ldyBKcGFEZXRhaWxzU2VsZWN0aW9uUGFydGljaXBhbnQoKEpwYURldGFpbHNWaWV3KSBhZGFwdGFibGVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9UZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9UZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4MGI3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQKLQlpbXBsZW1lbnRzIEpwYVNlbGVjdGlvblBhcnRpY2lwYW50Ci17Ci0JcHJpdmF0ZSBmaW5hbCBKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXI7Ci0KLQlmaW5hbCBJVGV4dEVkaXRvciB0ZXh0RWRpdG9yOwotCi0JcHJpdmF0ZSBmaW5hbCBJUHJvcGVydHlMaXN0ZW5lciBlZGl0b3JJbnB1dExpc3RlbmVyOwotCi0JcHJpdmF0ZSBmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGVkaXRvclNlbGVjdGlvbkxpc3RlbmVyOwotCi0JcHJpdmF0ZSBKcGFTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBmb3J3YXJkU2VsZWN0aW9uID0gdHJ1ZTsgIC8vIFRPRE8gdGhpcyBqdXN0IHNtZWxscyB3cm9uZyAgfmJqdgotCi0KLQlwdWJsaWMgVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50KEpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciwgSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLnNlbGVjdGlvbk1hbmFnZXIgPSBzZWxlY3Rpb25NYW5hZ2VyOwotCQl0aGlzLnRleHRFZGl0b3IgPSB0ZXh0RWRpdG9yOwotCQl0aGlzLmVkaXRvcklucHV0TGlzdGVuZXIgPSBuZXcgRWRpdG9ySW5wdXRMaXN0ZW5lcigpOwotCQl0aGlzLnRleHRFZGl0b3IuYWRkUHJvcGVydHlMaXN0ZW5lcih0aGlzLmVkaXRvcklucHV0TGlzdGVuZXIpOwotCQl0aGlzLmVkaXRvclNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuZ2V0UG9zdFNlbGVjdGlvblByb3ZpZGVyKCkuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzLmVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gdGhpcy5jYWxjdWxhdGVTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIElKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSnBhU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKEpwYVNlbGVjdGlvbkV2ZW50IGV2dCkgewotCQlKcGFTZWxlY3Rpb24gbmV3U2VsZWN0aW9uID0gZXZ0LmdldFNlbGVjdGlvbigpOwotCi0JCWlmICgobmV3U2VsZWN0aW9uID09IEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTikKLQkJCXx8IG5ld1NlbGVjdGlvbi5lcXVhbHModGhpcy5jdXJyZW50U2VsZWN0aW9uKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGdldEFjdGl2ZVRleHRFZGl0b3IoKSAhPSB0aGlzLnRleHRFZGl0b3IpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRoaXMuZm9yd2FyZFNlbGVjdGlvbiA9IGZhbHNlOwotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gbmV3U2VsZWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOwotCQlpZiAodGV4dFJhbmdlICE9IG51bGwpIHsKLQkJCXRoaXMudGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwodGV4dFJhbmdlLmdldE9mZnNldCgpLCB0ZXh0UmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCQl9Ci0JCXRoaXMuZm9yd2FyZFNlbGVjdGlvbiA9IHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZGlzcG9zZU9uSGlkZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy50ZXh0RWRpdG9yLnJlbW92ZVByb3BlcnR5TGlzdGVuZXIodGhpcy5lZGl0b3JJbnB1dExpc3RlbmVyKTsKLQkJdGhpcy5nZXRQb3N0U2VsZWN0aW9uUHJvdmlkZXIoKS5yZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMuZWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBKcGFTZWxlY3Rpb24gY2FsY3VsYXRlU2VsZWN0aW9uKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRoaXMudGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoISAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pKSB7Ci0JCQlyZXR1cm4gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQl9Ci0KLQkJSnBhRmlsZSBqcGFGaWxlID0gdGhpcy5nZXRKcGFGaWxlKCk7Ci0JCWlmIChqcGFGaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5idWlsZFNlbGVjdGlvbihqcGFGaWxlLmdldFN0cnVjdHVyZU5vZGUoKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRPZmZzZXQoKSkpOwotCX0KLQotCXByb3RlY3RlZCBKcGFTZWxlY3Rpb24gYnVpbGRTZWxlY3Rpb24oSnBhU3RydWN0dXJlTm9kZSBzZWxlY3RlZE5vZGUpIHsKLQkJcmV0dXJuIChzZWxlY3RlZE5vZGUgPT0gbnVsbCkgPyBKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT04gOiBuZXcgRGVmYXVsdEpwYVNlbGVjdGlvbihzZWxlY3RlZE5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotCQlyZXR1cm4gdGhpcy50ZXh0RWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCBnZXRBY3RpdmVQYXJ0KCkgewotCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gZ2V0QWN0aXZlUGFnZSgpOwotCQlyZXR1cm4gKGFjdGl2ZVBhZ2UgPT0gbnVsbCkgPyBudWxsOiBhY3RpdmVQYWdlLmdldEFjdGl2ZVBhcnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvcigpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJcmV0dXJuIChhY3RpdmVQYWdlID09IG51bGwpID8gbnVsbDogYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElUZXh0RWRpdG9yIGdldEFjdGl2ZVRleHRFZGl0b3IoKSB7Ci0JCXJldHVybiBnZXRUZXh0RWRpdG9yKGdldEFjdGl2ZUVkaXRvcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElUZXh0RWRpdG9yIGdldFRleHRFZGl0b3IoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlyZXR1cm4gKHBhcnQgPT0gbnVsbCkgPyBudWxsIDogKElUZXh0RWRpdG9yKSBwYXJ0LmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhRmlsZSBnZXRKcGFGaWxlKCkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSB0aGlzLnRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKCAhIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKCgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldEZpbGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIgZ2V0UG9zdFNlbGVjdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHRoaXMudGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciBjYWxsYmFja3MgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdG9ySW5wdXRDaGFuZ2VkKCkgewotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0b3JTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBUaGlzIGlzIGEgYml0IGtsdWRnZXkuICBXZSBjaGVjayB0byBzZWUgaWYgdGhlIHNlbGVjdGlvbiBldmVudCAKLQkJLy8gb2NjdXJyZWQgd2hlbiBhIHBhcnRpY2lwYXRpbmcgcGFydCBpcyBhY3RpdmUgKGFuZCBzbywgb3N0ZW5zaWJseSwKLQkJLy8gKmJlY2F1c2UqIG9mIHRoZSBwYXJ0aWNpcGF0aW5nIHBhcnQpLiAgSWYgc28sIHdlIHJlc2VsZWN0IHRoZSB2YWxpZCAKLQkJLy8gdGV4dC4KLQkJSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IGdldEFjdGl2ZVBhcnQoKTsKLQkJaWYgKGdldFRleHRFZGl0b3IoYWN0aXZlUGFydCkgIT0gdGhpcy50ZXh0RWRpdG9yICYmIHRoaXMuc2VsZWN0aW9uTWFuYWdlci5pc1JlZ2lzdGVyZWQoYWN0aXZlUGFydCkpIHsKLQkJCWlmICh0aGlzLmN1cnJlbnRTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQl0aGlzLmZvcndhcmRTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb24uZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JCQlpZiAodGV4dFJhbmdlICE9IG51bGwpIHsKLQkJCQl0aGlzLnRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKHRleHRSYW5nZS5nZXRPZmZzZXQoKSwgdGV4dFJhbmdlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCXRoaXMuZm9yd2FyZFNlbGVjdGlvbiA9IHRydWU7Ci0JCQkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJSnBhU2VsZWN0aW9uIG5ld1NlbGVjdGlvbiA9IHRoaXMuY2FsY3VsYXRlU2VsZWN0aW9uKCk7Ci0JCWlmIChuZXdTZWxlY3Rpb24uZXF1YWxzKHRoaXMuY3VycmVudFNlbGVjdGlvbikpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0JCQotCQlpZiAodGhpcy5mb3J3YXJkU2VsZWN0aW9uKSB7Ci0JCQl0aGlzLnNlbGVjdGlvbk1hbmFnZXIuc2VsZWN0KG5ld1NlbGVjdGlvbiwgdGhpcyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBFZGl0b3JJbnB1dExpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5TGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgRWRpdG9ySW5wdXRMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLQkJCWlmICgoc291cmNlID09IFRleHRFZGl0b3JTZWxlY3Rpb25QYXJ0aWNpcGFudC50aGlzLnRleHRFZGl0b3IpCi0JCQkJCQkmJiAocHJvcElkID09IElFZGl0b3JQYXJ0LlBST1BfSU5QVVQpKSB7Ci0JCQkJVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50LnRoaXMuZWRpdG9ySW5wdXRDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCBjbGFzcyBFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlUZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQudGhpcy5lZGl0b3JTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0dlbmVyYWxKcGFNYXBwaW5nSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9HZW5lcmFsSnBhTWFwcGluZ0l0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjMxNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0dlbmVyYWxKcGFNYXBwaW5nSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYWxKcGFNYXBwaW5nSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotewotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQlPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciA9IChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBQZXJzaXN0ZW50VHlwZSkgewotCQkJcmV0dXJuIGJ1aWxkUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW50VHlwZSkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIoKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvR2VuZXJhbEpwYU1hcHBpbmdJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9HZW5lcmFsSnBhTWFwcGluZ0l0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmMwZTk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9HZW5lcmFsSnBhTWFwcGluZ0l0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLlBlcnNpc3RlbnRUeXBlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYWxKcGFNYXBwaW5nSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLXsKLQlwdWJsaWMgSXRlbUxhYmVsUHJvdmlkZXIgYnVpbGRJdGVtTGFiZWxQcm92aWRlcigKLQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbnRUeXBlSXRlbUxhYmVsUHJvdmlkZXIoKFBlcnNpc3RlbnRUeXBlKSBpdGVtLCBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIoKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIGl0ZW0sIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5ZjAzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSmF2YUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5KYXZhUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZXh0ZW5kcyBHZW5lcmFsSnBhTWFwcGluZ0l0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JQE92ZXJyaWRlCi0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciA9IChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXI7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgSmF2YVJlc291cmNlTW9kZWwpIHsKLQkJCXJldHVybiBuZXcgUmVzb3VyY2VNb2RlbEl0ZW1Db250ZW50UHJvdmlkZXIoKEphdmFSZXNvdXJjZU1vZGVsKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlcikgewotCQlyZXR1cm4gbmV3IEphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIoKEphdmFQZXJzaXN0ZW50VHlwZSkgcGVyc2lzdGVudFR5cGUsIHRyZWVDb250ZW50UHJvdmlkZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSmF2YUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmJjNTJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLQotcHVibGljIGNsYXNzIEphdmFJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZXh0ZW5kcyBHZW5lcmFsSnBhTWFwcGluZ0l0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotewotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0phdmFSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYmNmOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0phdmFSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyCi0JZXh0ZW5kcyBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIKLXsKLQlwdWJsaWMgSmF2YVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcihKYXZhUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7Ci0JCXN1cGVyKHJlc291cmNlTW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBKYXZhSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9Pcm1JdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTY0Y2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgT3JtSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZXh0ZW5kcyBHZW5lcmFsSnBhTWFwcGluZ0l0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JQE92ZXJyaWRlCi0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciA9IChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXI7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgT3JtUmVzb3VyY2VNb2RlbCkgewotCQkJcmV0dXJuIG5ldyBSZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlcigoT3JtUmVzb3VyY2VNb2RlbCkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFbnRpdHlNYXBwaW5ncykgewotCQkJcmV0dXJuIG5ldyBFbnRpdHlNYXBwaW5nc0l0ZW1Db250ZW50UHJvdmlkZXIoKEVudGl0eU1hcHBpbmdzKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlcikgewotCQlyZXR1cm4gbmV3IE9ybVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlcigoT3JtUGVyc2lzdGVudFR5cGUpIHBlcnNpc3RlbnRUeXBlLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFbnRpdHlNYXBwaW5nc0l0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPE9ybVBlcnNpc3RlbnRUeXBlPgotCXsKLQkJcHVibGljIEVudGl0eU1hcHBpbmdzSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncywgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJCXN1cGVyKGVudGl0eU1hcHBpbmdzLCBjb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJLy8gSSdkIGxpa2UgdG8gcmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCBoZXJlLCBidXQgdGhhdCBpbnZvbHZlcyBhIGhlZnR5IAotCQkJLy8gQVBJIGNoYW5nZSAtIHdlJ2xsIHNlZSB3aGF0IGhhcHBlbnMgd2l0aCB0aGlzIGNvZGUgZmlyc3QKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRUeXBlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1QZXJzaXN0ZW50VHlwZT4oCi0JCQkJCUVudGl0eU1hcHBpbmdzLlBFUlNJU1RFTlRfVFlQRVNfTElTVCwgKEVudGl0eU1hcHBpbmdzKSBtb2RlbCgpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3Qub3JtUGVyc2lzdGVudFR5cGVzKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxZjUxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5FbnRpdHlNYXBwaW5nc0l0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGV4dGVuZHMgR2VuZXJhbEpwYU1hcHBpbmdJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLXsKLQlwdWJsaWMgSXRlbUxhYmVsUHJvdmlkZXIgYnVpbGRJdGVtTGFiZWxQcm92aWRlcigKLQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEVudGl0eU1hcHBpbmdzKSB7Ci0JCQlyZXR1cm4gbmV3IEVudGl0eU1hcHBpbmdzSXRlbUxhYmVsUHJvdmlkZXIoKEVudGl0eU1hcHBpbmdzKSBpdGVtLCBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIHJldHVybiBzdXBlci5idWlsZEl0ZW1MYWJlbFByb3ZpZGVyKGl0ZW0sIGxhYmVsUHJvdmlkZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9Pcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9Pcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3NWE3OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1SZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE9ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcgotCWV4dGVuZHMgUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyCi17Ci0JcHVibGljIE9ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcihPcm1SZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwpIHsKLQkJc3VwZXIocmVzb3VyY2VNb2RlbCk7Ci0JfQotCQotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IE9ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IE9ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9QZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmMzMTE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9QZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyID0gKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbCkgewotCQkJcmV0dXJuIG5ldyBSZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlcigoUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVuY2UpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW5jZSkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW5jZVVuaXQpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgTWFwcGluZ0ZpbGVSZWYpIHsKLQkJCXJldHVybiBuZXcgTWFwcGluZ0ZpbGVSZWZJdGVtQ29udGVudFByb3ZpZGVyKChNYXBwaW5nRmlsZVJlZikgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDbGFzc1JlZikgewotCQkJcmV0dXJuIG5ldyBDbGFzc1JlZkl0ZW1Db250ZW50UHJvdmlkZXIoKENsYXNzUmVmKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsJCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxQZXJzaXN0ZW5jZVVuaXQ+Ci0JewotCQlwdWJsaWMgUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkJc3VwZXIocGVyc2lzdGVuY2UsIGNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFBlcnNpc3RlbmNlIG1vZGVsKCkgewotCQkJcmV0dXJuIChQZXJzaXN0ZW5jZSkgc3VwZXIubW9kZWwoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJLy8gSSdkIGxpa2UgdG8gcmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCBoZXJlLCBidXQgdGhhdCBpbnZvbHZlcyBhIGhlZnR5IAotCQkJLy8gQVBJIGNoYW5nZSAtIHdlJ2xsIHNlZSB3aGF0IGhhcHBlbnMgd2l0aCB0aGlzIGNvZGUgZmlyc3QKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZSwgUGVyc2lzdGVuY2VVbml0PigKLQkJCQkJUGVyc2lzdGVuY2UuUEVSU0lTVEVOQ0VfVU5JVFNfTElTVCwgbW9kZWwoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5wZXJzaXN0ZW5jZVVuaXRzKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LnBlcnNpc3RlbmNlVW5pdHNTaXplKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPEpwYVN0cnVjdHVyZU5vZGU+Ci0JewotCQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0LCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkJc3VwZXIocGVyc2lzdGVuY2VVbml0LCBjb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFBlcnNpc3RlbmNlVW5pdCBtb2RlbCgpIHsKLQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0KSBzdXBlci5tb2RlbCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFBlcnNpc3RlbmNlIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBtb2RlbCgpLmdldFBhcmVudCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCUxpc3RWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBzcGVjaWZpZWRNYXBwaW5nRmlsZUx2bSA9IAotCQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIE1hcHBpbmdGaWxlUmVmPigKLQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRl9MSVNULAotCQkJCQkJbW9kZWwoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpOwotCQkJCQl9Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQotCQkJTGlzdFZhbHVlTW9kZWw8TWFwcGluZ0ZpbGVSZWY+IGltcGxpZWRNYXBwaW5nRmlsZUx2bSA9IAotCQkJCW5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxNYXBwaW5nRmlsZVJlZj4oCi0JCQkJCW5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oCi0JCQkJCQkJUGVyc2lzdGVuY2VVbml0LklNUExJRURfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSwKLQkJCQkJCQltb2RlbCgpKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBidWlsZFZhbHVlXygpIHsKLQkJCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQlMaXN0VmFsdWVNb2RlbDxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NMdm0gPSAKLQkJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oCi0JCQkJCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX0NMQVNTX1JFRl9MSVNULAotCQkJCQkJbW9kZWwoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxDbGFzc1JlZj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZENsYXNzUmVmcygpOwotCQkJCQl9Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCUxpc3RWYWx1ZU1vZGVsPENsYXNzUmVmPiBpbXBsaWVkQ2xhc3NMdm0gPSAKLQkJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oCi0JCQkJCQlQZXJzaXN0ZW5jZVVuaXQuSU1QTElFRF9DTEFTU19SRUZfTElTVCwKLQkJCQkJCW1vZGVsKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5pbXBsaWVkQ2xhc3NSZWZzKCk7Ci0JCQkJCX0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5pbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+KDQpOwotCQkJbGlzdC5hZGQoc3BlY2lmaWVkTWFwcGluZ0ZpbGVMdm0pOwotCQkJbGlzdC5hZGQoaW1wbGllZE1hcHBpbmdGaWxlTHZtKTsKLQkJCWxpc3QuYWRkKHNwZWNpZmllZENsYXNzTHZtKTsKLQkJCWxpc3QuYWRkKGltcGxpZWRDbGFzc0x2bSk7Ci0JCQkKLQkJCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+LCBKcGFTdHJ1Y3R1cmVOb2RlPihsaXN0KTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE1hcHBpbmdGaWxlUmVmSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8TWFwcGluZ0ZpbGVSZWY+Ci0JewotCQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWZJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkJc3VwZXIobWFwcGluZ0ZpbGVSZWYsIGNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiAoKE1hcHBpbmdGaWxlUmVmKSBtb2RlbCgpKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xhc3NSZWZJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxDbGFzc1JlZj4KLQl7Ci0JCXB1YmxpYyBDbGFzc1JlZkl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJQ2xhc3NSZWYgY2xhc3NSZWYsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihjbGFzc1JlZiwgY29udGVudFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuICgoQ2xhc3NSZWYpIG1vZGVsKCkpLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODE5NmNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuQ2xhc3NSZWZJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5NYXBwaW5nRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLlBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuUGVyc2lzdGVuY2VVbml0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLXsKLQlwdWJsaWMgSXRlbUxhYmVsUHJvdmlkZXIgYnVpbGRJdGVtTGFiZWxQcm92aWRlcigKLQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZSkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyKChQZXJzaXN0ZW5jZSkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VVbml0SXRlbUxhYmVsUHJvdmlkZXIoKFBlcnNpc3RlbmNlVW5pdCkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgTWFwcGluZ0ZpbGVSZWYpIHsKLQkJCXJldHVybiBuZXcgTWFwcGluZ0ZpbGVSZWZJdGVtTGFiZWxQcm92aWRlcigoTWFwcGluZ0ZpbGVSZWYpIGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENsYXNzUmVmKSB7Ci0JCQlyZXR1cm4gbmV3IENsYXNzUmVmSXRlbUxhYmVsUHJvdmlkZXIoKENsYXNzUmVmKSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTBlMGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcgotCWV4dGVuZHMgUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7Ci0JCXN1cGVyKHJlc291cmNlTW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1Jlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUmVzb3VyY2VNb2RlbEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRiNDk5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUmVzb3VyY2VNb2RlbEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VNb2RlbEl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPEpwYVN0cnVjdHVyZU5vZGU+Ci17Ci0JcHVibGljIFJlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsLCAKLQkJCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHJlc291cmNlTW9kZWwsIGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTW9kZWwgbW9kZWwoKSB7Ci0JCXJldHVybiAoUmVzb3VyY2VNb2RlbCkgc3VwZXIubW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEpwYVN0cnVjdHVyZU5vZGU+KGJ1aWxkQ2hpbGRyZW5Db2xsZWN0aW9uTW9kZWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkQ2hpbGRyZW5Db2xsZWN0aW9uTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8SnBhRmlsZSwgSnBhU3RydWN0dXJlTm9kZT4oCi0JCQlidWlsZEpwYUZpbGVWYWx1ZU1vZGVsKCksIEpwYUZpbGUuUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8SnBhU3RydWN0dXJlTm9kZT4gaXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnJvb3RTdHJ1Y3R1cmVOb2RlcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEpwYUZpbGU+IGJ1aWxkSnBhRmlsZVZhbHVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UmVzb3VyY2VNb2RlbCwgSnBhRmlsZT4oCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFJlc291cmNlTW9kZWw+KG1vZGVsKCkpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEpwYUZpbGUgdHJhbnNmb3JtXyhSZXNvdXJjZU1vZGVsIHZhbHVlKSB7Ci0JCQkJCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUodmFsdWUuZ2V0RmlsZSgpKTsKLQkJCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjMmU1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYVN0cnVjdHVyZVByb3ZpZGVyCi17Ci0JcHJvdGVjdGVkIFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbDsKLQkKLQkKLQlwdWJsaWMgUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCkgewotCQl0aGlzLnJlc291cmNlTW9kZWwgPSByZXNvdXJjZU1vZGVsOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewotCQlyZXR1cm4gcmVzb3VyY2VNb2RlbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkOTg0Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBwcm92aWRlcyBhIG1vcmUgb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZSB0byB0aGUgaXRlbXMgYW5kCi0gKiBzZWxlY3RlZCBpdGVtIGluIGEgY29tYm8uCi0gKiA8cD4KLSAqIDxiPmxpc3RIb2xkZXI8L2I+IGNvbnRhaW5zIHRoZSBpdGVtcyBpbiB0aGUgY29tYm8uPGJyPgotICogPGI+c2VsZWN0ZWRJdGVtSG9sZGVyPC9iPiBjb250YWlucyB0aGUgaXRlbXMgaW4gJ2xpc3RIb2xkZXInIHRoYXQgYXJlCi0gKiBzZWxlY3RlZCBpbiB0aGUgY29tYm8uCi0gKgotICogQHBhcmFtIDxFPiBUaGUgdHlwZSBvZiB0aGUgaXRlbXMgaW4gPGI+bGlzdEhvbGRlcjwvYj4KLSAqIEBzZWUgQ29tYm9Nb2RlbEFkYXB0ZXIKLSAqIEBzZWUgQ0NvbWJvTW9kZWxBZGFwdGVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4gewotCi0JLy8gKioqKioqKioqKiBtb2RlbCAqKioqKioqKioqCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgY29tYm8ncyBjb250ZW50cyB3aXRoCi0JICogdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgY29tYm8ncyBzZWxlY3Rpb24gd2l0aCB0aGUKLQkgKiBtb2RlbCBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGNvbnZlcnRlciB0aGF0IGNvbnZlcnRzIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0Ci0JICogdG8gc3RyaW5ncyB0aGF0IGNhbiBiZSBwdXQgaW4gdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyOwotCi0JLy8gKioqKioqKioqKiBVSSAqKioqKioqKioqCi0JLyoqCi0JICogVGhlIGNvbWJvIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvSG9sZGVyIGNvbWJvSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIGxpc3QgaG9sZGVyCi0JICogd2l0aCB0aGUgY29tYm8ncyB0ZXh0LgotCSAqLwotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBjb21ib01vZGlmeUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIGxpc3QgaG9sZGVyCi0JICogd2l0aCB0aGUgY29tYm8ncyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGNvbWJvU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gc2VsZWN0aW9uIGNoYW5nZSBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+W10gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzOwotCi0JLyoqCi0JICogQ2xpZW50cyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIGRvdWJsZSBjbGljayBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZUNsaWNrTGlzdGVuZXI8RT5bXSBkb3VibGVDbGlja0xpc3RlbmVyczsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgY29tYm8KLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGNvbWJvRGlzcG9zZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciwgc2VsZWN0aW9ucyBob2xkZXIsIGNvbWJvLCBhbmQKLQkgKiBzdHJpbmcgY29udmVydGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcigKLQkJCUxpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlDb21ib0hvbGRlciBjb21ib0hvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIpCi0JewotCQlzdXBlcigpOwotCi0JCUFzc2VydC5pc05vdE51bGwobGlzdEhvbGRlciwgICAgICAgICAiVGhlIGhvbGRlciBvZiB0aGUgaXRlbXMiKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChzZWxlY3RlZEl0ZW1Ib2xkZXIsICJUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtIGNhbm5vdCBiZSBudWxsIik7Ci0JCUFzc2VydC5pc05vdE51bGwoY29tYm9Ib2xkZXIsICAgICAgICAiVGhlIGhvbGRlciBvZiB0aGUgY29tYm8gd2lkZ2V0IGNhbm5vdCBiZSBudWxsIik7Ci0JCUFzc2VydC5pc05vdE51bGwoc3RyaW5nQ29udmVydGVyLCAgICAiVGhlIHN0cmluZyBjb252ZXJ0ZXIgY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIgICAgICAgICA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyID0gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCQl0aGlzLmNvbWJvSG9sZGVyICAgICAgICA9IGNvbWJvSG9sZGVyOwotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciAgICA9IHN0cmluZ0NvbnZlcnRlcjsKLQotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIpOwotCi0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRWRpdGFibGUoKSkgewotCQkJdGhpcy5jb21ib01vZGlmeUxpc3RlbmVyID0gdGhpcy5idWlsZENvbWJvTW9kaWZ5TGlzdGVuZXIoKTsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcy5jb21ib01vZGlmeUxpc3RlbmVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29tYm9TZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21ib1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuY29tYm9TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycyA9IHRoaXMuYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVycyA9IHRoaXMuYnVpbGREb3VibGVDbGlja0xpc3RlbmVycygpOwotCi0JCXRoaXMuY29tYm9EaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29tYm9EaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21ib0hvbGRlci5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5jb21ib0Rpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zeW5jaHJvbml6ZUNvbWJvKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgYnVpbGRDb21ib01vZGlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5jb21ib1NlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21ibyBtb2RpZnkgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENvbWJvU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMuY29tYm9TZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29tYm8gbW9kaWZ5IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPltdIGJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBuZXcgRG91YmxlQ2xpY2tMaXN0ZW5lclswXTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT5bXSBidWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lclswXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkQ29tYm9EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmNvbWJvRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21ibyBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZUNvbWJvKCkgewotCQl0aGlzLnN5bmNocm9uaXplQ29tYm9JdGVtcygpOwotCQl0aGlzLnN5bmNocm9uaXplQ29tYm9TZWxlY3Rpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RyaW5nIGNvbnZlcnRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdDb252ZXJ0ZXIoU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKHN0cmluZ0NvbnZlcnRlciwgIlRoZSBTdHJpbmdDb252ZXJ0ZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBzdHJpbmdDb252ZXJ0ZXI7Ci0JCXRoaXMuc3luY2hyb25pemVDb21ibygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZSB0aGUgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgaXRlbSB0byBhCi0JICogc3RyaW5nIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnQoRSBpdGVtKSB7Ci0JCXJldHVybiB0aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcoaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQnJ1dGUgZm9yY2Ugc3luY2hyb25pemF0aW9uIG9mIGNvbWJvIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVDb21ib0l0ZW1zKCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbGVuID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW2xlbl07Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW47IGluZGV4KyspIHsKLQkJCWl0ZW1zW2luZGV4XSA9IHRoaXMuY29udmVydCh0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4KSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0SXRlbXMoaXRlbXMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0aGlzLmNvbWJvSG9sZGVyLmdldEl0ZW1Db3VudCgpOwotCQlpbnQgaW5kZXggPSBldmVudC5nZXRJbmRleCgpOwotCi0JCWZvciAoTGlzdEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuaXRlbXMoZXZlbnQpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuYWRkKHRoaXMuY29udmVydChzdHJlYW0ubmV4dCgpKSwgaW5kZXgrKyk7Ci0JCX0KLQotCQkvLyBXaGVuIHRoZSBjb21ibyBpcyBwb3B1bGF0ZWQsIGl0J3MgcG9zc2libGUgdGhlIHNlbGVjdGlvbiB3YXMgYWxyZWFkeQotCQkvLyBzZXQgYnV0IG5vIGl0ZW1zIHdhcyBmb3VuZCwgcmVzeW5jIHRoZSBzZWxlY3RlZCBpdGVtCi0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlzeW5jaHJvbml6ZUNvbWJvU2VsZWN0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgY29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jb21ib0hvbGRlci5yZW1vdmUoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0SW5kZXgoKSArIGV2ZW50Lml0ZW1zU2l6ZSgpIC0gMSk7Ci0JCXRoaXMuc3luY2hyb25pemVDb21ib1NlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IHRhcmdldCA9IGV2ZW50LmdldFRhcmdldEluZGV4KCk7Ci0JCWludCBzb3VyY2UgPSBldmVudC5nZXRTb3VyY2VJbmRleCgpOwotCQlpbnQgbGVuID0gZXZlbnQuZ2V0TW92ZUxlbmd0aCgpOwotCQlpbnQgbG9TdGFydCA9IE1hdGgubWluKHRhcmdldCwgc291cmNlKTsKLQkJaW50IGhpU3RhcnQgPSBNYXRoLm1heCh0YXJnZXQsIHNvdXJjZSk7Ci0JCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBhZmZlY3RlZCBpdGVtcy4uLgotCQlTdHJpbmdbXSBzdWJBcnJheSA9IENvbGxlY3Rpb25Ub29scy5zdWJBcnJheSh0aGlzLmNvbWJvSG9sZGVyLmdldEl0ZW1zKCksIGxvU3RhcnQsIGhpU3RhcnQgKyBsZW4gLSBsb1N0YXJ0KTsKLQkJLy8gLi4ubW92ZSB0aGVtIGFyb3VuZC4uLgotCQlzdWJBcnJheSA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKHN1YkFycmF5LCB0YXJnZXQgLSBsb1N0YXJ0LCBzb3VyY2UgLSBsb1N0YXJ0LCBsZW4pOwotCQkvLyAuLi5hbmQgdGhlbiBwdXQgdGhlbSBiYWNrCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzdWJBcnJheS5sZW5ndGg7IGluZGV4KyspIHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0SXRlbShsb1N0YXJ0ICsgaW5kZXgsIHN1YkFycmF5W2luZGV4XSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgY29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBpbmRleCA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuaXRlbXMoZXZlbnQpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0SXRlbShpbmRleCsrLCB0aGlzLmNvbnZlcnQoc3RyZWFtLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmNvbWJvSG9sZGVyLnJlbW92ZUFsbCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUNvbWJvSXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgdW5jaGVja2VkIGNvZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IGl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKChMaXN0SXRlcmF0b3I8RT4pIGV2ZW50Lml0ZW1zKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZWxlY3RlZCBpdGVtcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgaW50IGluZGV4T2YoRSBpdGVtKSB7Ci0JCWludCBsZW5ndGggPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlpZiAodmFsdWVzQXJlRXF1YWwodGhpcy5saXN0SG9sZGVyLmdldChpbmRleCksIGl0ZW0pKSB7Ci0JCQkJcmV0dXJuIGluZGV4OwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZUNvbWJvU2VsZWN0aW9uKCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkgfHwgdGhpcy5jb21ib0hvbGRlci5pc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRSBzZWxlY3RlZFZhbHVlID0gdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuZ2V0VmFsdWUoKTsKLQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLmRlc2VsZWN0QWxsKCk7Ci0JCQlTdHJpbmcgc2VsZWN0ZWRJdGVtID0gdGhpcy5jb252ZXJ0KHNlbGVjdGVkVmFsdWUpOwotCQkJaWYgKHNlbGVjdGVkSXRlbSA9PSBudWxsKSB7Ci0JCQkJc2VsZWN0ZWRJdGVtID0gIiI7Ci0JCQl9Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldFRleHQoc2VsZWN0ZWRJdGVtKTsKLQkJCXRoaXMubm90aWZ5TGlzdGVuZXJzKHNlbGVjdGVkVmFsdWUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplQ29tYm9TZWxlY3Rpb24oKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgdW5jaGVja2VkIGNvZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8RT4gaXRlbXMoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoKEl0ZXJhdG9yPEU+KSBldmVudC5pdGVtcygpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZXMgYXJlIGVxdWFsLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudWxsIGNoZWNrcy4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gYXR0cmlidXRlIHZhbHVlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHZhbHVlc0FyZUVxdWFsKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJaWYgKCh2YWx1ZTEgPT0gbnVsbCkgJiYgKHZhbHVlMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIHRydWU7CS8vIGJvdGggYXJlIG51bGwKLQkJfQotCQlpZiAoKHZhbHVlMSA9PSBudWxsKSB8fCAodmFsdWUyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CS8vIG9uZSBpcyBudWxsIGJ1dCB0aGUgb3RoZXIgaXMgbm90Ci0JCX0KLQkJcmV0dXJuIHZhbHVlMS5lcXVhbHModmFsdWUyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbWJvIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb21ib1NlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tYm9TZWxlY3Rpb25DaGFuZ2VkKE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCWlmICghdGhpcy5jb21ib0hvbGRlci5pc1BvcHVsYXRpbmcoKSkgewotCQkJRSBzZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbSgpOwotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKHRydWUpOwotCQkJdHJ5IHsKLQkJCQl0aGlzLnNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCQkJCXRoaXMubm90aWZ5TGlzdGVuZXJzKHNlbGVjdGVkSXRlbSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUxpc3RlbmVycyhFIHNlbGVjdGVkSXRlbSkgewotCQlpZiAodGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoID4gMCkgewotCQkJU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4gc2NFdmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPih0aGlzLCBzZWxlY3RlZEl0ZW0pOwotCQkJZm9yIChTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA6IHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChzY0V2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBFIHNlbGVjdGVkSXRlbSgpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRWRpdGFibGUoKSkgewotCQkJU3RyaW5nIHRleHQgPSB0aGlzLmNvbWJvSG9sZGVyLmdldFRleHQoKTsKLQotCQkJaWYgKHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlmb3IgKGludCBpbmRleCA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQkJRSBpdGVtID0gdGhpcy5saXN0SG9sZGVyLmdldChpbmRleCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gdGhpcy5jb252ZXJ0KGl0ZW0pOwotCQkJCWlmICh2YWx1ZXNBcmVFcXVhbCh0ZXh0LCB2YWx1ZSkpIHsKLQkJCQkJcmV0dXJuIGl0ZW07Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIHByZXZlbnQgdGhpcyB0eXBlIGNhc3QgKGl0J2xsIHdvcmsgaWYgRSBpcwotCQkJLy8gU3RyaW5nIGJ1dCBpdCB3b24ndCB3b3JrIGlmIEUgaXMgc29tZXRoaW5nIGVsc2UpLCBtYXliZSB1c2UgYQotCQkJLy8gQmlkaVN0cmluZ0NvbnZlcnRlciBpbnN0ZWFkIG9mIFN0cmluZ0NvbnZlcnRlcgotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKEUpIHRleHQ7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCWludCBpbmRleCA9IHRoaXMuY29tYm9Ib2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbWJvRG91YmxlQ2xpY2tlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5kb3VibGVDbGlja0xpc3RlbmVycy5sZW5ndGggPiAwKSB7Ci0JCQkvLyB0aGVyZSBzaG91bGQgYmUgb25seSBhIHNpbmdsZSBpdGVtIHNlbGVjdGVkIGR1cmluZyBhIGRvdWJsZS1jbGljayg/KQotCQkJRSBzZWxlY3Rpb24gPSB0aGlzLmxpc3RIb2xkZXIuZ2V0KHRoaXMuY29tYm9Ib2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQlEb3VibGVDbGlja0V2ZW50PEU+IGRjRXZlbnQgPSBuZXcgRG91YmxlQ2xpY2tFdmVudDxFPih0aGlzLCBzZWxlY3Rpb24pOwotCQkJZm9yIChEb3VibGVDbGlja0xpc3RlbmVyPEU+IGRvdWJsZUNsaWNrTGlzdGVuZXIgOiB0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJzKSB7Ci0JCQkJZG91YmxlQ2xpY2tMaXN0ZW5lci5kb3VibGVDbGljayhkY0V2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGNvbWJvRGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBjb21ibyBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMuY29tYm9Ib2xkZXIucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMuY29tYm9EaXNwb3NlTGlzdGVuZXIpOwotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0VkaXRhYmxlKCkpIHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcy5jb21ib01vZGlmeUxpc3RlbmVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5jb21ib1NlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCQl0aGlzLnNlbGVjdGVkSXRlbUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkb3VibGUgY2xpY2sgc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGREb3VibGVDbGlja0xpc3RlbmVyKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVycyA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5kb3VibGVDbGlja0xpc3RlbmVycywgbGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJzID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZSh0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBEb3VibGVDbGlja0xpc3RlbmVyPEU+IHsKLQkJdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50PEU+IGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERvdWJsZUNsaWNrRXZlbnQ8RT4gZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCXByaXZhdGUgZmluYWwgRSBzZWxlY3Rpb247Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXByb3RlY3RlZCBEb3VibGVDbGlja0V2ZW50KEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4gc291cmNlLCBFIHNlbGVjdGlvbikgewotCQkJc3VwZXIoc291cmNlKTsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPEU+IGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiAoQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPikgc3VwZXIuZ2V0U291cmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRSBzZWxlY3Rpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zZWxlY3Rpb247Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlKHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiB7Ci0JCXZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBldmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkJcHJpdmF0ZSBmaW5hbCBFIHNlbGVjdGVkSXRlbTsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUV2ZW50KEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4gc291cmNlLCBFIHNlbGVjdGVkSXRlbSkgewotCQkJc3VwZXIoc291cmNlKTsKLQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0gc2VsZWN0ZWRJdGVtOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPiBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gKEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4pIHN1cGVyLmdldFNvdXJjZSgpOwotCQl9Ci0KLQkJcHVibGljIEUgc2VsZWN0ZWRJdGVtKCkgewotCQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBJbnRlcm5hbCBtZW1iZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBob2xkZXIgaXMgcmVxdWlyZWQgZm9yIHN1cHBvcnRpbmcgPGNvZGU+Q29tYm88L2NvZGU+IGFuZAotCSAqIDxjb2RlPkNDb21ibzwvY29kZT4gdHJhbnNwYXJlbnRseS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludGVyZmFjZSBDb21ib0hvbGRlciB7Ci0JCXZvaWQgYWRkKFN0cmluZyBpdGVtLCBpbnQgaW5kZXgpOwotCQl2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgZGlzcG9zZUxpc3RlbmVyKTsKLQkJdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcik7Ci0JCXZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl2b2lkIGRlc2VsZWN0QWxsKCk7Ci0JCWludCBnZXRJdGVtQ291bnQoKTsKLQkJU3RyaW5nW10gZ2V0SXRlbXMoKTsKLQkJaW50IGdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCVN0cmluZyBnZXRUZXh0KCk7Ci0JCWJvb2xlYW4gaXNEaXNwb3NlZCgpOwotCQlib29sZWFuIGlzRWRpdGFibGUoKTsKLQkJYm9vbGVhbiBpc1BvcHVsYXRpbmcoKTsKLQkJdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGRpc3Bvc2VMaXN0ZW5lcik7Ci0JCXZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIpOwotCQl2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdm9pZCBzZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIGl0ZW0pOwotCQl2b2lkIHNldEl0ZW1zKFN0cmluZ1tdIGl0ZW1zKTsKLQkJdm9pZCBzZXRQb3B1bGF0aW5nKGJvb2xlYW4gcG9wdWxhdGluZyk7Ci0JCXZvaWQgc2V0VGV4dChTdHJpbmcgaXRlbSk7Ci0JCXZvaWQgcmVtb3ZlKGludCBzdGFydCwgaW50IGVuZCk7Ci0JCXZvaWQgcmVtb3ZlQWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0Jvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9Cb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZDBmZmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0Jvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBjaGVjayBib3ggb3IgdG9nZ2xlIGJ1dHRvbiBpbiBzeW5jaCB3aXRoCi0gKiBhIG1vZGVsIGJvb2xlYW4uCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIgewotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgYm9vbGVhbi4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGJ1dHRvbidzIHNlbGVjdGlvbiBzdGF0ZSB3aXRoCi0JICogdGhlIG1vZGVsIGJvb2xlYW4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0JLyoqIFRoZSBjaGVjayBib3gvdG9nZ2xlIGJ1dHRvbiB3ZSBzeW5jaHJvbml6ZSB3aXRoIHRoZSBtb2RlbCBib29sZWFuLiAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYnV0dG9uOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbW9kZWwgYm9vbGVhbiB3aXRoCi0JICogdGhlIGJ1dHRvbidzIHNlbGVjdGlvbiBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2VsZWN0aW9uTGlzdGVuZXIgYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIGJ1dHRvbgotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgYnV0dG9uRGlzcG9zZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIGNoZWNrIGJveC90b2dnbGUgYnV0dG9uOyBmb3Igd2hlbiB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsIGlzIG51bGwuCi0JICogVGhlIGRlZmF1bHQgW2RlZmF1bHQgdmFsdWVdIGlzIGZhbHNlIChpLmUuIHRoZSBidXR0b24gaXMgY2hlY2tlZC9wb3BwZWQgb3V0KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBib29sZWFuIHRvIHRoZSBzcGVjaWZpZWQgYnV0dG9uLgotCSAqIElmIHRoZSBib29sZWFuIGlzIG51bGwsIHRoZSBidXR0b24ncyB2YWx1ZSB3aWxsIGJlICJ1bnNlbGVjdGVkIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIgYWRhcHQoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwgQnV0dG9uIGJ1dHRvbikgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIoYm9vbGVhbkhvbGRlciwgYnV0dG9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gdG8gdGhlIHNwZWNpZmllZCBidXR0b24uCi0JICogSWYgdGhlIGJvb2xlYW4gaXMgbnVsbCwgdGhlIGJ1dHRvbidzIHZhbHVlIHdpbGwgYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbkJ1dHRvbk1vZGVsQWRhcHRlciBhZGFwdChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBCdXR0b24gYnV0dG9uLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIoYm9vbGVhbkhvbGRlciwgYnV0dG9uLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgYW5kIGJ1dHRvbiBhcmUgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBmYWxzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbkJ1dHRvbk1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBCdXR0b24gYnV0dG9uKSB7Ci0JCXRoaXMoYm9vbGVhbkhvbGRlciwgYnV0dG9uLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgYW5kIGJ1dHRvbiBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwgQnV0dG9uIGJ1dHRvbiwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChib29sZWFuSG9sZGVyID09IG51bGwpIHx8IChidXR0b24gPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYm9vbGVhbkhvbGRlciA9IGJvb2xlYW5Ib2xkZXI7Ci0JCXRoaXMuYnV0dG9uID0gYnV0dG9uOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQotCQl0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idXR0b25EaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnV0dG9uRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMuYnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLmJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idXR0b25TZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQl0aGlzLnNldEJ1dHRvblNlbGVjdGlvbih0aGlzLmJvb2xlYW5Ib2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlCb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyLnRoaXMuYm9vbGVhbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYm9vbGVhbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlCb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyLnRoaXMuYnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYnV0dG9uIHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIERpc3Bvc2VMaXN0ZW5lciBidWlsZEJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlCb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyLnRoaXMuYnV0dG9uRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYnV0dG9uIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgYnV0dG9uLgotCSAqIElmIHRoZSBuZXcgbW9kZWwgdmFsdWUgaXMgbnVsbCwgdXNlIHRoZSBhZGFwdGVyJ3MgZGVmYXVsdCB2YWx1ZQotCSAqICh3aGljaCBpcyB0eXBpY2FsbHkgZmFsc2UpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJvb2xlYW5DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRCdXR0b25TZWxlY3Rpb24oKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEJ1dHRvblNlbGVjdGlvbihCb29sZWFuIGIpIHsKLQkJaWYgKHRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuYnV0dG9uLnNldFNlbGVjdGlvbih0aGlzLmJvb2xlYW5WYWx1ZShiKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYm9vbGVhblZhbHVlKEJvb2xlYW4gYikgewotCQlyZXR1cm4gKGIgIT0gbnVsbCkgPyBiLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYnV0dG9uIGhhcyBiZWVuICJzZWxlY3RlZCIgLSBzeW5jaHJvbml6ZSB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShCb29sZWFuLnZhbHVlT2YodGhpcy5idXR0b24uZ2V0U2VsZWN0aW9uKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25EaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGJ1dHRvbiBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMuYnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLmJ1dHRvbi5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy5idXR0b25EaXNwb3NlTGlzdGVuZXIpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmJvb2xlYW5Ib2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0NDb21ib01vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0NDb21ib01vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE4ZDEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9DQ29tYm9Nb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIHByb3ZpZGVzIGEgbW9yZSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHRvIHRoZSBpdGVtcyBhbmQKLSAqIHNlbGVjdGVkIGl0ZW0gaW4gYSA8Y29kZT5DQ29tYm88L2NvZGU+LgotICogPHA+Ci0gKiA8Yj5saXN0SG9sZGVyPC9iPiBjb250YWlucyB0aGUgaXRlbXMgaW4gdGhlIDxjb2RlPkNDb21ibzwvY29kZT4uPGJyPgotICogPGI+c2VsZWN0ZWRJdGVtSG9sZGVyPC9iPiBjb250YWlucyB0aGUgaXRlbXMgaW4gJ2xpc3RIb2xkZXInIHRoYXQgYXJlCi0gKiBzZWxlY3RlZCBpbiB0aGUgPGNvZGU+Q0NvbWJvPC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0gPEU+IFRoZSB0eXBlIG9mIHRoZSBpdGVtcyBpbiA8Yj5saXN0SG9sZGVyPC9iPgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENDb21ib01vZGVsQWRhcHRlcjxFPiBleHRlbmRzIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4gewotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciwgc2VsZWN0aW9ucyBob2xkZXIsIGNvbWJvLCBhbmQKLQkgKiBzdHJpbmcgY29udmVydGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ0NvbWJvTW9kZWxBZGFwdGVyKAotCQkJTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCUNDb21ibyBjb21ibywKLQkJCVN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIpCi0JewotCQlzdXBlcihsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIG5ldyBDQ29tYm9Ib2xkZXIoY29tYm8pLAotCQkgICAgICBzdHJpbmdDb252ZXJ0ZXIpOwotCX0KLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgY29tYm8uCi0JICogVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY29tYm8sIHdoaWNoIGNhbGxzICN0b1N0cmluZygpIG9uIHRoZQotCSAqIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENDb21ib01vZGVsQWRhcHRlcjxUPiBhZGFwdCgKLQkJCUxpc3RWYWx1ZU1vZGVsPFQ+IGxpc3RIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlDQ29tYm8gY29tYm8pCi0JewotCQlyZXR1cm4gYWRhcHQoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48VD5pbnN0YW5jZSgpCi0JCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGNvbWJvLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY29tYm8uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ0NvbWJvTW9kZWxBZGFwdGVyPFQ+IGFkYXB0KAotCQkJTGlzdFZhbHVlTW9kZWw8VD4gbGlzdEhvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCUNDb21ibyBjb21ibywKLQkJCVN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIpCi0JewotCQlyZXR1cm4gbmV3IENDb21ib01vZGVsQWRhcHRlcjxUPigKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQljb21ibywKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJbnRlcm5hbCBtZW1iZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NvbWJvSG9sZGVyIGltcGxlbWVudHMgQ29tYm9Ib2xkZXIgewotCQlwcml2YXRlIGZpbmFsIENDb21ibyBjb21ibzsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVkaXRhYmxlOwotCQlwcml2YXRlIFN0cmluZyBzZWxlY3RlZEl0ZW07Ci0KLQkJQ0NvbWJvSG9sZGVyKENDb21ibyBjb21ibykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29tYm8gICAgPSBjb21ibzsKLQkJCXRoaXMuZWRpdGFibGUgPSBjb21iby5nZXRFZGl0YWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKFN0cmluZyBpdGVtLCBpbnQgaW5kZXgpIHsKLQkJCXRoaXMuY29tYm8uYWRkKGl0ZW0sIGluZGV4KTsKLQotCQkJLy8gSXQgaXMgcG9zc2libGUgdGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHNldCBiZWZvcmUgdGhlIGNvbWJvIGlzIGJlaW5nCi0JCQkvLyBwb3B1bGF0ZWQsIHVwZGF0ZSB0aGUgc2VsZWN0ZWQgaXRlbSBpZiBpdCdzIG1hdGNoZXMgdGhlIGl0ZW0gYmVpbmcKLQkJCS8vIGFkZGVkCi0JCQlpZiAoKHRoaXMuc2VsZWN0ZWRJdGVtICE9IG51bGwpICYmIHRoaXMuc2VsZWN0ZWRJdGVtLmVxdWFscyhpdGVtKSkgewotCQkJCXRoaXMuc2V0VGV4dCh0aGlzLnNlbGVjdGVkSXRlbSk7Ci0JCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpIHsKLQkJCXRoaXMuY29tYm8uYWRkRGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcikgewotCQkJdGhpcy5jb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotCQkJdGhpcy5jb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkZXNlbGVjdEFsbCgpIHsKLQkJCXRoaXMuY29tYm8uZGVzZWxlY3RBbGwoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0SXRlbUNvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uZ2V0SXRlbUNvdW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21iby5nZXRJdGVtcygpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRTZWxlY3Rpb25JbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLmNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21iby5nZXRUZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uaXNEaXNwb3NlZCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJCXJldHVybiBlZGl0YWJsZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUG9wdWxhdGluZygpIHsKLQkJCXJldHVybiB0aGlzLmNvbWJvLmdldERhdGEoInBvcHVsYXRpbmciKSA9PSBCb29sZWFuLlRSVUU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZShzdGFydCwgZW5kKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGRpc3Bvc2VMaXN0ZW5lcikgewotCQkJdGhpcy5jb21iby5yZW1vdmVEaXNwb3NlTGlzdGVuZXIoZGlzcG9zZUxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgaXRlbSkgewotCQkJdGhpcy5jb21iby5zZXRJdGVtKGluZGV4LCBpdGVtKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEl0ZW1zKFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCQl0aGlzLmNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFBvcHVsYXRpbmcoYm9vbGVhbiBwb3B1bGF0aW5nKSB7Ci0JCQl0aGlzLmNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCBCb29sZWFuLnZhbHVlT2YocG9wdWxhdGluZykpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgaXRlbSkgewotCi0JCQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBzZWxlY3RlZCBpdGVtIHNpbmNlIGl0J3MgcG9zc2libGUgdGhlIHNlbGVjdGVkCi0JCQkvLyBpdGVtIGlzIGJlZm9yZSB0aGUgY29tYm8gaXMgcG9wdWxhdGVkCi0JCQlpZiAodGhpcy5jb21iby5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsOwotCQkJfQotCi0JCQl0aGlzLmNvbWJvLnNldFRleHQoaXRlbSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0NvbHVtbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9Db2x1bW5BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjFlZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0NvbHVtbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIGlzIHVzZWQgYnkgdGhlIHRhYmxlIG1vZGVsIGFkYXB0ZXIgdG8gY29udmVydCBhIG1vZGVsIG9iamVjdAotICogaW50byB0aGUgbW9kZWxzIHVzZWQgZm9yIGVhY2ggb2YgdGhlIGNlbGxzIGZvciB0aGUgb2JqZWN0J3MgY29ycmVzcG9uZGluZyByb3cKLSAqIGluIHRoZSB0YWJsZS4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBDb2x1bW5BZGFwdGVyPFY+IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCBtb2RlbHMgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgcm93IGluIHRoZSB0YWJsZS4KLQkgKi8KLQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGNlbGxNb2RlbHMoViBzdWJqZWN0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS4gVHlwaWNhbGx5IHRoaXMgaXMgc3RhdGljLgotCSAqCi0JICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMKLQkgKi8KLQlpbnQgY29sdW1uQ291bnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqCi0JICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHJldHJpZXZlIGl0cyBkaXNwbGF5IHRleHQKLQkgKiBAcmV0dXJuIFRoZSBkaXNwbGF5IHRleHQgb2YgdGhlIGNvbHVtbgotCSAqLwotCVN0cmluZyBjb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2x1bW4gaXMgZWRpdGFibGUuIFR5cGljYWxseSB0aGlzIGlzIHRoZQotCSAqIHNhbWUgZm9yIGV2ZXJ5IHJvdy4KLQkgKgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbHVtbiBmb3Igd2hpY2ggd2UgZGV0ZXJtaW5lIGlmCi0JICogdGhlIGNvbnRlbnQgY2FuIGJlIG1vZGlmaWVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBhbGxvdyBlZGl0aW5nIG9mIHRoZSBjZWxsIGF0IHRoZSBnaXZlbgotCSAqIGNvbHVtbiBpbmRleDsgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGtlZXAgaXQgbm90IGVkaXRhYmxlCi0JICovCi0vLwlib29sZWFuIGNvbHVtbklzRWRpdGFibGUoaW50IGNvbHVtbkluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9Db21ib01vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDc4OGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIHByb3ZpZGVzIGEgbW9yZSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHRvIHRoZSBpdGVtcyBhbmQKLSAqIHNlbGVjdGVkIGl0ZW0gaW4gYSA8Y29kZT5Db21ibzwvY29kZT4uCi0gKiA8cD4KLSAqIDxiPmxpc3RIb2xkZXI8L2I+IGNvbnRhaW5zIHRoZSBpdGVtcyBpbiB0aGUgPGNvZGU+Q29tYm88L2NvZGU+Ljxicj4KLSAqIDxiPnNlbGVjdGVkSXRlbUhvbGRlcjwvYj4gY29udGFpbnMgdGhlIGl0ZW1zIGluICdsaXN0SG9sZGVyJyB0aGF0IGFyZQotICogc2VsZWN0ZWQgaW4gdGhlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0gPEU+IFRoZSB0eXBlIG9mIHRoZSBpdGVtcyBpbiA8Yj5saXN0SG9sZGVyPC9iPgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbWJvTW9kZWxBZGFwdGVyPEU+IGV4dGVuZHMgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPiB7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgY29tYm8uCi0JICogVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY29tYm8sIHdoaWNoIGNhbGxzICN0b1N0cmluZygpIG9uIHRoZQotCSAqIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbWJvTW9kZWxBZGFwdGVyPFQ+IGFkYXB0KAotCQkJTGlzdFZhbHVlTW9kZWw8VD4gbGlzdEhvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCUNvbWJvIGNvbWJvKQotCXsKLQkJcmV0dXJuIGFkYXB0KAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWNvbWJvLAotCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFQ+aW5zdGFuY2UoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgY29tYm8uCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjb21iby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb21ib01vZGVsQWRhcHRlcjxUPiBhZGFwdCgKLQkJCUxpc3RWYWx1ZU1vZGVsPFQ+IGxpc3RIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlDb21ibyBjb21ibywKLQkJCVN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIpCi0JewotCQlyZXR1cm4gbmV3IENvbWJvTW9kZWxBZGFwdGVyPFQ+KAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWNvbWJvLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciwgc2VsZWN0aW9ucyBob2xkZXIsIGNvbWJvLCBhbmQKLQkgKiBzdHJpbmcgY29udmVydGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm9Nb2RlbEFkYXB0ZXIoCi0JCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLAotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJQ29tYm8gY29tYm8sCi0JCQlTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKQotCXsKLQkJc3VwZXIobGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBuZXcgU1dUQ29tYm9Ib2xkZXIoY29tYm8pLAotCQkgICAgICBzdHJpbmdDb252ZXJ0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJbnRlcm5hbCBtZW1iZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU1dUQ29tYm9Ib2xkZXIgaW1wbGVtZW50cyBDb21ib0hvbGRlciB7Ci0JCXByaXZhdGUgZmluYWwgQ29tYm8gY29tYm87Ci0JCXByaXZhdGUgZmluYWwgYm9vbGVhbiBlZGl0YWJsZTsKLQkJcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRJdGVtOwotCi0JCVNXVENvbWJvSG9sZGVyKENvbWJvIGNvbWJvKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb21ibyAgICA9IGNvbWJvOwotCQkJdGhpcy5lZGl0YWJsZSA9IChjb21iby5nZXRTdHlsZSgpICYgU1dULlJFQURfT05MWSkgPT0gMDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgaXRlbSwgaW50IGluZGV4KSB7Ci0JCQl0aGlzLmNvbWJvLmFkZChpdGVtLCBpbmRleCk7Ci0KLQkJCS8vIEl0IGlzIHBvc3NpYmxlIHRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzZXQgYmVmb3JlIHRoZSBjb21ibyBpcyBiZWluZwotCQkJLy8gcG9wdWxhdGVkLCB1cGRhdGUgdGhlIHNlbGVjdGVkIGl0ZW0gaWYgaXQncyBtYXRjaGVzIHRoZSBpdGVtIGJlaW5nCi0JCQkvLyBhZGRlZAotCQkJaWYgKCh0aGlzLnNlbGVjdGVkSXRlbSAhPSBudWxsKSAmJiB0aGlzLnNlbGVjdGVkSXRlbS5lcXVhbHMoaXRlbSkpIHsKLQkJCQl0aGlzLnNldFRleHQodGhpcy5zZWxlY3RlZEl0ZW0pOwotCQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgZGlzcG9zZUxpc3RlbmVyKSB7Ci0JCQl0aGlzLmNvbWJvLmFkZERpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlTGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIpIHsKLQkJCXRoaXMuY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpIHsKLQkJCXRoaXMuY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGVzZWxlY3RBbGwoKSB7Ci0JCQl0aGlzLmNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEl0ZW1Db3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmNvbWJvLmdldEl0ZW1Db3VudCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZ1tdIGdldEl0ZW1zKCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uZ2V0SXRlbXMoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uZ2V0VGV4dCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJCXJldHVybiB0aGlzLmNvbWJvLmlzRGlzcG9zZWQoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lZGl0YWJsZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUG9wdWxhdGluZygpIHsKLQkJCXJldHVybiB0aGlzLmNvbWJvLmdldERhdGEoInBvcHVsYXRpbmciKSA9PSBCb29sZWFuLlRSVUU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZShzdGFydCwgZW5kKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGRpc3Bvc2VMaXN0ZW5lcikgewotCQkJdGhpcy5jb21iby5yZW1vdmVEaXNwb3NlTGlzdGVuZXIoZGlzcG9zZUxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgaXRlbSkgewotCQkJdGhpcy5jb21iby5zZXRJdGVtKGluZGV4LCBpdGVtKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEl0ZW1zKFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCQl0aGlzLmNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFBvcHVsYXRpbmcoYm9vbGVhbiBwb3B1bGF0aW5nKSB7Ci0JCQl0aGlzLmNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCBCb29sZWFuLnZhbHVlT2YocG9wdWxhdGluZykpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgaXRlbSkgewotCi0JCQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBzZWxlY3RlZCBpdGVtIHNpbmNlIGl0J3MgcG9zc2libGUgdGhlIHNlbGVjdGVkCi0JCQkvLyBpdGVtIGlzIGJlZm9yZSB0aGUgY29tYm8gaXMgcG9wdWxhdGVkCi0JCQlpZiAodGhpcy5jb21iby5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsOwotCQkJfQotCi0JCQl0aGlzLmNvbWJvLnNlbGVjdCh0aGlzLmNvbWJvLmluZGV4T2YoaXRlbSkpOwotCQkJdGhpcy5jb21iby5zZXRUZXh0KGl0ZW0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0xpc3RCb3hNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9MaXN0Qm94TW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZjFhMjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0xpc3RCb3hNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIHByb3ZpZGVzIGEgbW9yZSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHRvIHRoZSBpdGVtcyBhbmQKLSAqIHNlbGVjdGVkIGl0ZW1zIGluIGEgbGlzdCBib3guCi0gKiAnbGlzdEhvbGRlcicgY29udGFpbnMgdGhlIGl0ZW1zIGluIHRoZSBsaXN0IGJveC4KLSAqICdzZWxlY3RlZEl0ZW1zSG9sZGVyJyBjb250YWlucyB0aGUgaXRlbXMgaW4gJ2xpc3RIb2xkZXInIHRoYXQgYXJlIHNlbGVjdGVkCi0gKiBpbiB0aGUgbGlzdCBib3guCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RCb3hNb2RlbEFkYXB0ZXI8RT4gewotCi0JLy8gKioqKioqKioqKiBtb2RlbCAqKioqKioqKioqCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbGlzdCBib3gncyBjb250ZW50cyB3aXRoCi0JICogdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHNlbGVjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBsaXN0IGJveCdzIHNlbGVjdGlvbiB3aXRoCi0JICogdGhlIG1vZGVsIHNlbGVjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBzZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGNvbnZlcnRlciB0aGF0IGNvbnZlcnRzIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0Ci0JICogdG8gc3RyaW5ncyB0aGF0IGNhbiBiZSBwdXQgaW4gdGhlIGxpc3QgYm94LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyOwotCi0JLy8gKioqKioqKioqKiBVSSAqKioqKioqKioqCi0JLyoqCi0JICogVGhlIGxpc3QgYm94IHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgbGlzdEJveDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgb3VyIHNlbGVjdGlvbiBsaXN0IGhvbGRlcgotCSAqIHdpdGggdGhlIGxpc3QgYm94J3Mgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gc2VsZWN0aW9uIGNoYW5nZSBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+W10gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzOwotCi0JLyoqCi0JICogQ2xpZW50cyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIGRvdWJsZSBjbGljayBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZUNsaWNrTGlzdGVuZXI8RT5bXSBkb3VibGVDbGlja0xpc3RlbmVyczsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgbGlzdCBib3gKLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGxpc3RCb3hEaXNwb3NlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb25zIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3gsIHdoaWNoIGNhbGxzICN0b1N0cmluZygpIG9uIHRoZQotCSAqIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3RCb3hNb2RlbEFkYXB0ZXI8VD4gYWRhcHQoCi0JCQlMaXN0VmFsdWVNb2RlbDxUPiBsaXN0SG9sZGVyLAotCQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8VD4gc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCUxpc3QgbGlzdEJveCkKLQl7Ci0JCXJldHVybiBhZGFwdChsaXN0SG9sZGVyLCBzZWxlY3RlZEl0ZW1zSG9sZGVyLCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48VD5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBsaXN0IGJveC4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3RCb3hNb2RlbEFkYXB0ZXI8VD4gYWRhcHQoCi0JCQlMaXN0VmFsdWVNb2RlbDxUPiBsaXN0SG9sZGVyLAotCQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8VD4gc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCUxpc3QgbGlzdEJveCwKLQkJCVN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIpCi0JewotCQlyZXR1cm4gbmV3IExpc3RCb3hNb2RlbEFkYXB0ZXI8VD4obGlzdEhvbGRlciwgc2VsZWN0ZWRJdGVtc0hvbGRlciwgbGlzdEJveCwgc3RyaW5nQ29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFVzZSB0aGUgZGVmYXVsdCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LCB3aGljaCBjYWxscyAjdG9TdHJpbmcoKSBvbiB0aGUKLQkgKiBpdGVtcyBpbiB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBMaXN0Qm94TW9kZWxBZGFwdGVyPFQ+IGFkYXB0KAotCQkJTGlzdFZhbHVlTW9kZWw8VD4gbGlzdEhvbGRlciwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlMaXN0IGxpc3RCb3gpCi0JewotCQlyZXR1cm4gYWRhcHQobGlzdEhvbGRlciwgc2VsZWN0ZWRJdGVtSG9sZGVyLCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48VD5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gTGlzdEJveE1vZGVsQWRhcHRlcjxUPiBhZGFwdCgKLQkJCUxpc3RWYWx1ZU1vZGVsPFQ+IGxpc3RIb2xkZXIsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJTGlzdCBsaXN0Qm94LAotCQkJU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcikKLQl7Ci0JCXJldHVybiBuZXcgTGlzdEJveE1vZGVsQWRhcHRlcjxUPihsaXN0SG9sZGVyLCBuZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8VD4oc2VsZWN0ZWRJdGVtSG9sZGVyKSwgbGlzdEJveCwgc3RyaW5nQ29udmVydGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyLCBzZWxlY3Rpb25zIGhvbGRlciwgbGlzdCBib3gsIGFuZAotCSAqIHN0cmluZyBjb252ZXJ0ZXIgYXJlIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Qm94TW9kZWxBZGFwdGVyKAotCQkJTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwKLQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNIb2xkZXIsCi0JCQlMaXN0IGxpc3RCb3gsCi0JCQlTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKQotCXsKLQkJc3VwZXIoKTsKLQkJaWYgKChsaXN0SG9sZGVyID09IG51bGwpIHx8IChzZWxlY3RlZEl0ZW1zSG9sZGVyID09IG51bGwpIHx8IChsaXN0Qm94ID09IG51bGwpIHx8IChzdHJpbmdDb252ZXJ0ZXIgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtc0hvbGRlciA9IHNlbGVjdGVkSXRlbXNIb2xkZXI7Ci0JCXRoaXMubGlzdEJveCA9IGxpc3RCb3g7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gc3RyaW5nQ29udmVydGVyOwotCi0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtc0hvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5saXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMubGlzdEJveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMgPSB0aGlzLmJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lcnMoKTsKLQotCQl0aGlzLmxpc3RCb3hEaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdEJveERpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RCb3guYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMubGlzdEJveERpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RCb3goKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94TW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94TW9kZWxBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlci50aGlzLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXIudGhpcy5zZWxlY3RlZEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXIudGhpcy5zZWxlY3RlZEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94TW9kZWxBZGFwdGVyLnRoaXMuc2VsZWN0ZWRJdGVtc0NsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInNlbGVjdGVkIGl0ZW1zIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRMaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXIudGhpcy5saXN0Qm94U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94TW9kZWxBZGFwdGVyLnRoaXMubGlzdEJveERvdWJsZUNsaWNrZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBib3ggc2VsZWN0aW9uIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPltdIGJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBuZXcgRG91YmxlQ2xpY2tMaXN0ZW5lclswXTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT5bXSBidWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lclswXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkTGlzdEJveERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94TW9kZWxBZGFwdGVyLnRoaXMubGlzdEJveERpc3Bvc2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgYm94IGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplTGlzdEJveCgpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RCb3hJdGVtcygpOwotCQl0aGlzLnN5bmNocm9uaXplTGlzdEJveFNlbGVjdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdHJpbmcgY29udmVydGVyICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFN0cmluZ0NvbnZlcnRlcihTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCWlmIChzdHJpbmdDb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBzdHJpbmdDb252ZXJ0ZXI7Ci0JCXRoaXMuc3luY2hyb25pemVMaXN0Qm94KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlIHRoZSBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIGEKLQkgKiBzdHJpbmcgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYm94LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydChFIGl0ZW0pIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nQ29udmVydGVyLmNvbnZlcnRUb1N0cmluZyhpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBCcnV0ZSBmb3JjZSBzeW5jaHJvbml6YXRpb24gb2YgbGlzdCBib3ggd2l0aCB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZUxpc3RCb3hJdGVtcygpIHsKLQkJaWYgKHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbGVuID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW2xlbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWl0ZW1zW2ldID0gdGhpcy5jb252ZXJ0KHRoaXMubGlzdEhvbGRlci5nZXQoaSkpOwotCQl9Ci0JCXRoaXMubGlzdEJveC5zZXRJdGVtcyhpdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3QgYm94LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8RT4gc3RyZWFtID0gdGhpcy5pdGVtcyhldmVudCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5saXN0Qm94LmFkZCh0aGlzLmNvbnZlcnQoc3RyZWFtLm5leHQoKSksIGkrKyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCBib3guCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmxpc3RCb3gucmVtb3ZlKGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEluZGV4KCkgKyBldmVudC5pdGVtc1NpemUoKSAtIDEpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgdGFyZ2V0ID0gZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJaW50IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZUluZGV4KCk7Ci0JCWludCBsZW4gPSBldmVudC5nZXRNb3ZlTGVuZ3RoKCk7Ci0JCWludCBsb1N0YXJ0ID0gTWF0aC5taW4odGFyZ2V0LCBzb3VyY2UpOwotCQlpbnQgaGlTdGFydCA9IE1hdGgubWF4KHRhcmdldCwgc291cmNlKTsKLQkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIGFmZmVjdGVkIGl0ZW1zLi4uCi0JCVN0cmluZ1tdIHN1YkFycmF5ID0gQ29sbGVjdGlvblRvb2xzLnN1YkFycmF5KHRoaXMubGlzdEJveC5nZXRJdGVtcygpLCBsb1N0YXJ0LCBoaVN0YXJ0ICsgbGVuIC0gbG9TdGFydCk7Ci0JCS8vIC4uLm1vdmUgdGhlbSBhcm91bmQuLi4KLQkJc3ViQXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShzdWJBcnJheSwgdGFyZ2V0IC0gbG9TdGFydCwgc291cmNlIC0gbG9TdGFydCwgbGVuKTsKLQkJLy8gLi4uYW5kIHRoZW4gcHV0IHRoZW0gYmFjawotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YkFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQl0aGlzLmxpc3RCb3guc2V0SXRlbShsb1N0YXJ0ICsgaSwgc3ViQXJyYXlbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3QgYm94LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8RT4gc3RyZWFtID0gdGhpcy5pdGVtcyhldmVudCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5saXN0Qm94LnNldEl0ZW0oaSsrLCB0aGlzLmNvbnZlcnQoc3RyZWFtLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3QgYm94LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMubGlzdEJveC5yZW1vdmVBbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCBib3guCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVMaXN0Qm94SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgdW5jaGVja2VkIGNvZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IGl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKChMaXN0SXRlcmF0b3I8RT4pIGV2ZW50Lml0ZW1zKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZWxlY3RlZCBpdGVtcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgaW50IGluZGV4T2YoRSBpdGVtKSB7Ci0JCWludCBsZW4gPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAodGhpcy5saXN0SG9sZGVyLmdldChpKSA9PSBpdGVtKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplTGlzdEJveFNlbGVjdGlvbigpIHsKLQkJaWYgKHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFt0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIuc2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuc2VsZWN0ZWRJdGVtc0hvbGRlci5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWluZGljZXNbaSsrXSA9IHRoaXMuaW5kZXhPZihzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQl0aGlzLmxpc3RCb3guZGVzZWxlY3RBbGwoKTsKLQkJdGhpcy5saXN0Qm94LnNlbGVjdChpbmRpY2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbZXZlbnQuaXRlbXNTaXplKCldOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8RT4gc3RyZWFtID0gdGhpcy5pdGVtcyhldmVudCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaW5kaWNlc1tpKytdID0gdGhpcy5pbmRleE9mKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXRoaXMubGlzdEJveC5zZWxlY3QoaW5kaWNlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRJdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbZXZlbnQuaXRlbXNTaXplKCldOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8RT4gc3RyZWFtID0gdGhpcy5pdGVtcyhldmVudCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaW5kaWNlc1tpKytdID0gdGhpcy5pbmRleE9mKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXRoaXMubGlzdEJveC5kZXNlbGVjdChpbmRpY2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmxpc3RCb3guZGVzZWxlY3RBbGwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RCb3hTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgdW5jaGVja2VkIGNvZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8RT4gaXRlbXMoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoKEl0ZXJhdG9yPEU+KSBldmVudC5pdGVtcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBib3ggZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycy5sZW5ndGggPiAwKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCVNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+IHNjRXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcywgdGhpcy5zZWxlY3RlZEl0ZW1zKCkpOwotCQkJZm9yIChTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA6IHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChzY0V2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPEU+IHNlbGVjdGVkSXRlbXMoKSB7Ci0JCWlmICh0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQXJyYXlMaXN0PEU+IHNlbGVjdGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KHRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkJZm9yIChpbnQgc2VsZWN0aW9uSW5kZXggOiB0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uSW5kaWNlcygpKSB7Ci0JCQlzZWxlY3RlZEl0ZW1zLmFkZCh0aGlzLmxpc3RIb2xkZXIuZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkSXRlbXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEJveERvdWJsZUNsaWNrZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5kb3VibGVDbGlja0xpc3RlbmVycy5sZW5ndGggPiAwKSB7Ci0JCQkvLyB0aGVyZSBzaG91bGQgYmUgb25seSBhIHNpbmdsZSBpdGVtIHNlbGVjdGVkIGR1cmluZyBhIGRvdWJsZS1jbGljayg/KQotCQkJRSBzZWxlY3Rpb24gPSB0aGlzLmxpc3RIb2xkZXIuZ2V0KHRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJRG91YmxlQ2xpY2tFdmVudDxFPiBkY0V2ZW50ID0gbmV3IERvdWJsZUNsaWNrRXZlbnQodGhpcywgc2VsZWN0aW9uKTsKLQkJCWZvciAoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBkb3VibGVDbGlja0xpc3RlbmVyIDogdGhpcy5kb3VibGVDbGlja0xpc3RlbmVycykgewotCQkJCWRvdWJsZUNsaWNrTGlzdGVuZXIuZG91YmxlQ2xpY2soZGNFdmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Qm94RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBsaXN0IGJveCBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMubGlzdEJveC5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy5saXN0Qm94RGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy5saXN0Qm94LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMubGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRvdWJsZSBjbGljayBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZERvdWJsZUNsaWNrTGlzdGVuZXIoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJzID0gQ29sbGVjdGlvblRvb2xzLmFkZCh0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihEb3VibGVDbGlja0xpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlKHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gewotCQl2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQ8RT4gZXZlbnQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRG91YmxlQ2xpY2tFdmVudDxFPiBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkJcHJpdmF0ZSBmaW5hbCBFIHNlbGVjdGlvbjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHJvdGVjdGVkIERvdWJsZUNsaWNrRXZlbnQoTGlzdEJveE1vZGVsQWRhcHRlcjxFPiBzb3VyY2UsIEUgc2VsZWN0aW9uKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIExpc3RCb3hNb2RlbEFkYXB0ZXI8RT4gZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIChMaXN0Qm94TW9kZWxBZGFwdGVyPEU+KSBzdXBlci5nZXRTb3VyY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBFIHNlbGVjdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLnNlbGVjdGlvbjsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGlvbiBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzID0gQ29sbGVjdGlvblRvb2xzLmFkZCh0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycywgbGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZSh0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycywgbGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gewotCQl2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4gZXZlbnQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4gZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxFPiBzZWxlY3Rpb247Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXByb3RlY3RlZCBTZWxlY3Rpb25DaGFuZ2VFdmVudChMaXN0Qm94TW9kZWxBZGFwdGVyPEU+IHNvdXJjZSwgQ29sbGVjdGlvbjxFPiBzZWxlY3Rpb24pIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgTGlzdEJveE1vZGVsQWRhcHRlcjxFPiBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gKExpc3RCb3hNb2RlbEFkYXB0ZXI8RT4pIHN1cGVyLmdldFNvdXJjZSgpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPEU+IHNlbGVjdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLnNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjk5N2VkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci0KLS8qKgotICoKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3Bpbm5lck1vZGVsQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIHNwaW5uZXIncyBjb250ZW50cyB3aXRoCi0JICogdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSBzcGlubmVyIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIHN0cmluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBzcGlubmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIG51bWJlciBob2xkZXIKLQkgKiB3aXRoIHRoZSBzcGlubmVyJ3MgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGlmeUxpc3RlbmVyIHNwaW5uZXJNb2RpZnlMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgc3Bpbm5lcgotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgc3Bpbm5lckRpc3Bvc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGludCBkZWZhdWx0VmFsdWU7Ci0KLQkvKioKLQkgKiBUaGlzIGxvY2sgaXMgdXNlZCB0byBwcmV2ZW50IHRoZSBsaXN0ZW5lcnMgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGUgdmFsdWUKLQkgKiBjaGFuZ2VzIGZyb20gdGhlIHNwaW5uZXIgb3IgZnJvbSB0aGUgaG9sZGVyLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIHNwaW5uZXIuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBzcGlubmVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3Bpbm5lck1vZGVsQWRhcHRlciBhZGFwdCgKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKLQkJCVNwaW5uZXIgc3Bpbm5lciwKLQkJCWludCBkZWZhdWx0VmFsdWUpCi0JewotCQlyZXR1cm4gbmV3IFNwaW5uZXJNb2RlbEFkYXB0ZXIobnVtYmVySG9sZGVyLCBzcGlubmVyLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIsIHNlbGVjdGlvbnMgaG9sZGVyLCBsaXN0IGJveCwgYW5kCi0JICogc3RyaW5nIGNvbnZlcnRlciBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwaW5uZXIgc3Bpbm5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgobnVtYmVySG9sZGVyID09IG51bGwpIHx8IChzcGlubmVyID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm51bWJlckhvbGRlciA9IG51bWJlckhvbGRlcjsKLQkJdGhpcy5zcGlubmVyID0gc3Bpbm5lcjsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5udW1iZXJIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kaWZ5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkU3Bpbm5lck1vZGlmeUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lci5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzLnNwaW5uZXJNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zcGlubmVyRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZFNwaW5uZXJEaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5zcGlubmVyLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLnNwaW5uZXJEaXNwb3NlTGlzdGVuZXIpOwotCi0JCXRoaXMudXBkYXRlU3Bpbm5lcihudW1iZXJIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMudmFsdWVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInNwaW5uZXIgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBidWlsZFNwaW5uZXJNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5zcGlubmVyTW9kaWZpZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzcGlubmVyIHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIERpc3Bvc2VMaXN0ZW5lciBidWlsZFNwaW5uZXJEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnNwaW5uZXJEaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzcGlubmVyIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCF0aGlzLmxvY2tlZCkgewotCQkJdGhpcy51cGRhdGVTcGlubmVyKChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGlubmVyIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBzcGlubmVyTW9kaWZpZWQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJaWYgKCF0aGlzLmxvY2tlZCkgewotCQkJdGhpcy5sb2NrZWQgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQl0aGlzLm51bWJlckhvbGRlci5zZXRWYWx1ZSh0aGlzLnNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNwaW5uZXJEaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIHNwaW5uZXIgaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLnNwaW5uZXIucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMuc3Bpbm5lckRpc3Bvc2VMaXN0ZW5lcik7Ci0JCXRoaXMuc3Bpbm5lci5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzLnNwaW5uZXJNb2RpZnlMaXN0ZW5lcik7Ci0JCXRoaXMubnVtYmVySG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogdXBkYXRlICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwaW5uZXIoSW50ZWdlciB2YWx1ZSkgewotCQlpZiAodGhpcy5zcGlubmVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIHRoZSBtb2RlbCBjYW4gYmUgbnVsbCwgYnV0IHRoZSBzcGlubmVyIGNhbm5vdAotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCX0KLQkJdGhpcy5sb2NrZWQgPSB0cnVlOwotCQl0cnkgewotCQkJdGhpcy5zcGlubmVyLnNldFNlbGVjdGlvbih2YWx1ZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmxvY2tlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubnVtYmVySG9sZGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvVGFibGVJdGVtTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvVGFibGVJdGVtTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjc1ODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L1RhYmxlSXRlbU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBrZWVwIGEgdGFibGUgaXRlbSBpbiBzeW5jaCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mCi0gKiBhIG1vZGVsLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgewotCi0JLyoqIFRoZSB0YWJsZSBpdGVtIHdlIHN5bmNocm9uaXplIHdpdGggdGhlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUYWJsZUl0ZW0gdGFibGVJdGVtOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBidXR0b24KLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIHRhYmxlSXRlbURpc3Bvc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIENsaWVudC1zdXBwbGllZCBhZGFwdGVyIHRoYXQgcHJvdmlkZXMgd2l0aCB0aGUgdmFyaW91cyBjb2x1bW4gc2V0dGluZ3MgYW5kCi0JICogY29udmVydHMgdGhlIG9iamVjdHMgaW4gdGhlIExWTSBpbnRvIGFuIGFycmF5IG9mIGNlbGwgbW9kZWxzLgotCSAqLwotCXByaXZhdGUgQ29sdW1uQWRhcHRlcjxPYmplY3Q+IGNvbHVtbkFkYXB0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgbW9kZWxzIHVzZWQgdG8gbGlzdGVuIHRvIGVhY2ggcHJvcGVydHkgdGhhdCBhcmUgZGlzcGxheSBieSB0aGUKLQkgKiB0YWJsZSBpdGVtLgotCSAqLwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSB2YWx1ZUhvbGRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBvZiA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPC9jb2RlPnMgdXNlZCB0byBiZSBub3RpZmllZCB3aGVuCi0JICogdGhlIHByb3BlcnRpZXMgb2YgdGhlIG1vZGVsIGJlaW5nIGRpc3BsYXkgaW50byBhIHJvdyBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBUaGUgbGFiZWwgdXNlZCB0byBmb3JtYXQgdGhlIG9iamVjdHMgaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKi8KLQlwcml2YXRlIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBib29sZWFuIHRvIHRoZSBzcGVjaWZpZWQgYnV0dG9uLgotCSAqIElmIHRoZSBib29sZWFuIGlzIG51bGwsIHRoZSBidXR0b24ncyB2YWx1ZSB3aWxsIGJlICJ1bnNlbGVjdGVkIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRhYmxlSXRlbU1vZGVsQWRhcHRlciBhZGFwdChUYWJsZUl0ZW0gdGFibGVJdGVtLCBDb2x1bW5BZGFwdGVyPD8+IGNvbHVtbkFkYXB0ZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlyZXR1cm4gbmV3IFRhYmxlSXRlbU1vZGVsQWRhcHRlcih0YWJsZUl0ZW0sIGNvbHVtbkFkYXB0ZXIsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgYW5kIGJ1dHRvbiBhcmUgcmVxdWlyZWQuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFRhYmxlSXRlbU1vZGVsQWRhcHRlcihUYWJsZUl0ZW0gdGFibGVJdGVtLCBDb2x1bW5BZGFwdGVyPD8+IGNvbHVtbkFkYXB0ZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcigpOwotCQlpZiAodGFibGVJdGVtID09IG51bGwgfHwgY29sdW1uQWRhcHRlciA9PSBudWxsIHx8IGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50YWJsZUl0ZW0gPSB0YWJsZUl0ZW07Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0JCXRoaXMuY29sdW1uQWRhcHRlciA9IChDb2x1bW5BZGFwdGVyPE9iamVjdD4pIGNvbHVtbkFkYXB0ZXI7Ci0KLQkJdGhpcy50YWJsZUl0ZW1EaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGFibGVJdGVtRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMudGFibGVJdGVtLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLnRhYmxlSXRlbURpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy52YWx1ZUhvbGRlcnMgPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY2VsbE1vZGVscyh0YWJsZUl0ZW0uZ2V0RGF0YSgpKTsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpOwotCi0JCWZvciAoaW50IGluZGV4ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCk7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQl0YWJsZUl0ZW1DaGFuZ2VkKGluZGV4LCB0YWJsZUl0ZW0uZ2V0RGF0YSgpLCBmYWxzZSk7Ci0JCQl2YWx1ZUhvbGRlcnNbaW5kZXhdLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyc1tpbmRleF0pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltjb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCldOwotCQlmb3IgKGludCBpbmRleCA9IGxpc3RlbmVycy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaW5kZXhdID0gYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGluZGV4KTsKLQkJfQotCQlyZXR1cm4gbGlzdGVuZXJzOwotCX0KLQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKAotCQkJdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKGluZGV4KQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgVGFibGVJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIERpc3Bvc2VMaXN0ZW5lciBidWlsZFRhYmxlSXRlbURpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIudGhpcy50YWJsZUl0ZW1EaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0JCSAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJUYWJsZUl0ZW0gZGlzcG9zZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHRhYmxlSXRlbUNoYW5nZWQoaW50IGluZGV4LCBPYmplY3Qgc3ViamVjdCwgYm9vbGVhbiByZXZhbGlkYXRlKSB7Ci0KLQkJaWYgKCF0aGlzLnRhYmxlSXRlbS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMudXBkYXRlVGFibGVJdGVtVGV4dChpbmRleCwgc3ViamVjdCk7Ci0JCQl0aGlzLnVwZGF0ZVRhYmxlSXRlbUltYWdlKGluZGV4LCBzdWJqZWN0KTsKLQotCQkJaWYgKHJldmFsaWRhdGUpIHsKLQkJCQl0aGlzLmxheW91dFRhYmxlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGFibGVJdGVtVGV4dChpbnQgaW5kZXgsIE9iamVjdCBzdWJqZWN0KSB7Ci0JCVN0cmluZyB0ZXh0ID0gdGhpcy5sYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoc3ViamVjdCwgaW5kZXgpOwotCQlpZiAodGV4dCA9PSBudWxsKSB7Ci0JCQl0ZXh0ID0gIiI7Ci0JCX0KLQkJdGhpcy50YWJsZUl0ZW0uc2V0VGV4dChpbmRleCwgdGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhYmxlSXRlbUltYWdlKGludCBpbmRleCwgT2JqZWN0IHN1YmplY3QpIHsKLQkJSW1hZ2UgaW1hZ2UgPSB0aGlzLmxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2Uoc3ViamVjdCwgaW5kZXgpOwotCQl0aGlzLnRhYmxlSXRlbS5zZXRJbWFnZShpbmRleCwgaW1hZ2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRUYWJsZSgpIHsKLQkJLy8gUmVmcmVzaCB0aGUgdGFibGUgaW4gb3JkZXIgdG8gc2hvdyB0aGUgc2Nyb2xsYmFyIGlmIHJlcXVpcmVkCi0JCVBvaW50IHNpemUgPSB0aGlzLnRhYmxlSXRlbS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQl0aGlzLnRhYmxlSXRlbS5nZXRQYXJlbnQoKS5zZXRTaXplKHNpemUpOwotCX0KLQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUl0ZW1EaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGJ1dHRvbiBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMudGFibGVJdGVtLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLnRhYmxlSXRlbURpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSB2YWx1ZUhvbGRlcnMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJdmFsdWVIb2xkZXJzW2luZGV4XS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnNbaW5kZXhdKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotICAgcHJpdmF0ZSBjbGFzcyBUYWJsZUl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLSAgIAlwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLQotICAgCVRhYmxlSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoaW50IGluZGV4KSB7Ci0gICAJCXN1cGVyKCk7Ci0gICAJCXRoaXMuaW5kZXggPSBpbmRleDsKLSAgIAl9Ci0KLSAgIAlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgCQlpZiAoIXRhYmxlSXRlbS5pc0Rpc3Bvc2VkKCkpIHsKLSAgIAkJCVRhYmxlIHRhYmxlID0gdGFibGVJdGVtLmdldFBhcmVudCgpOwotICAgCQkJdGFibGVJdGVtQ2hhbmdlZChpbmRleCwgdGFibGVJdGVtLmdldERhdGEoKSwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSA9PSAwKTsKLSAgIAkJfQotICAgCX0KLSAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI5Yzg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgcHJvdmlkZXMgYSBtb3JlIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2UgdG8gdGhlIGl0ZW1zIGFuZAotICogc2VsZWN0ZWQgaXRlbXMgaW4gYSB0YWJsZS4KLSAqICdsaXN0SG9sZGVyJyBjb250YWlucyB0aGUgZGF0YSBvZiBhIHNpbmdsZSBjb2x1bW4gaW4gdGhlIGNvbHVtbi4KLSAqICdzZWxlY3RlZEl0ZW1zSG9sZGVyJyBjb250YWlucyB0aGUgZGF0YSBvZiBhIHNpbmdsZSBjb2x1bW4gaW4gJ2xpc3RIb2xkZXInCi0gKiB0aGF0IGFyZSBzZWxlY3RlZCBpbiB0aGUgdGFibGUuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxBZGFwdGVyPEU+IHsKLQotCS8vICoqKioqKioqKiogbW9kZWwgKioqKioqKioqKgotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIHRhYmxlJ3MgY29udGVudHMgd2l0aAotCSAqIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBzZWxlY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgdGFibGUncyBzZWxlY3Rpb24gd2l0aAotCSAqIHRoZSBtb2RlbCBzZWxlY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIHRhYmxlIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRhYmxlIHRhYmxlOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIGxpc3QgaG9sZGVyCi0JICogd2l0aCB0aGUgdGFibGUncyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIHRhYmxlU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gc2VsZWN0aW9uIGNoYW5nZSBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+W10gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzOwotCi0JLyoqCi0JICogQ2xpZW50cyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIGRvdWJsZSBjbGljayBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZUNsaWNrTGlzdGVuZXI8RT5bXSBkb3VibGVDbGlja0xpc3RlbmVyczsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgdGFibGUKLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIHRhYmxlRGlzcG9zZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhpcyBsYWJlbCBwcm92aWRlciBpcyByZXNwb25zaWJsZSB0byBjb252ZXJ0IGEgcHJvcGVydHkgYXQgYSBjb2x1bW4gaW5kZXgKLQkgKiB0byBhIHN0cmluZyB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhlIGNvbHVtbiBhZGFwdGVyIGlzIHJlc3BvbnNpYmxlIHRvIHJldHVybiB0aGUgY291bnQgb2YgY29sdW1ucyBhbmQgdG8KLQkgKiBjcmVhdGUgdGhlIHZhbHVlIGhvbGRlcnMgZm9yIGFsbCB0aGUgcHJvcGVydGllcy4KLQkgKi8KLQlwcml2YXRlIENvbHVtbkFkYXB0ZXI8RT4gY29sdW1uQWRhcHRlcjsKLQotCS8qKgotCSAqIEtlZXBzIHRyYWNrIG9mIHRoZSA8Y29kZT5UYWJsZUl0ZW1Nb2RlbEFkYXB0ZXI8L2NvZGU+cyB0aGF0IHdlcmUgY3JlYXRlZAotCSAqIGZvciBlYWNoIGl0ZW0gb2YgdGhlIGxpc3QgaG9sZGVyLgotCSAqLwotCXByaXZhdGUgTGlzdDxUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXI+IHRhYmxlSXRlbU1vZGVsQWRhcHRlcnM7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCB0YWJsZS4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFRhYmxlTW9kZWxBZGFwdGVyPFQ+IGFkYXB0KAotCQkJTGlzdFZhbHVlTW9kZWw8VD4gbGlzdEhvbGRlciwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlUYWJsZSB0YWJsZSwKLQkJCUNvbHVtbkFkYXB0ZXI8VD4gY29sdW1uQWRhcHRlciwKLQkJCUlUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikKLQl7Ci0JCXJldHVybiBuZXcgVGFibGVNb2RlbEFkYXB0ZXI8VD4oCi0JCQlsaXN0SG9sZGVyLAotCQkJbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFQ+KHNlbGVjdGVkSXRlbUhvbGRlciksCi0JCQl0YWJsZSwKLQkJCWNvbHVtbkFkYXB0ZXIsCi0JCQlsYWJlbFByb3ZpZGVyCi0JCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciwgc2VsZWN0aW9ucyBob2xkZXIsIHRhYmxlLCBhbmQKLQkgKiBzdHJpbmcgY29udmVydGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFibGVNb2RlbEFkYXB0ZXIoCi0JCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLAotCQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCVRhYmxlIHRhYmxlLAotCQkJQ29sdW1uQWRhcHRlcjxFPiBjb2x1bW5BZGFwdGVyLAotCQkJSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKQotCXsKLQkJc3VwZXIoKTsKLQkJaWYgKChsaXN0SG9sZGVyID09IG51bGwpIHx8IChzZWxlY3RlZEl0ZW1zSG9sZGVyID09IG51bGwpIHx8ICh0YWJsZSA9PSBudWxsKSB8fCAobGFiZWxQcm92aWRlciA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyID0gc2VsZWN0ZWRJdGVtc0hvbGRlcjsKLQkJdGhpcy50YWJsZSA9IHRhYmxlOwotCQl0aGlzLmNvbHVtbkFkYXB0ZXIgPSBjb2x1bW5BZGFwdGVyOwotCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotCQl0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMgPSBuZXcgQXJyYXlMaXN0PFRhYmxlSXRlbU1vZGVsQWRhcHRlcj4oY29sdW1uQWRhcHRlci5jb2x1bW5Db3VudCgpKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMudGFibGVTZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZVNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMudGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy50YWJsZVNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycyA9IHRoaXMuYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVycyA9IHRoaXMuYnVpbGREb3VibGVDbGlja0xpc3RlbmVycygpOwotCi0JCXRoaXMudGFibGVEaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGFibGVEaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy50YWJsZS5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy50YWJsZURpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zeW5jaHJvbml6ZVRhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5zZWxlY3RlZEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbXNDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic2VsZWN0ZWQgaXRlbXMgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFRhYmxlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMudGFibGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMudGFibGVEb3VibGVDbGlja2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRhYmxlIHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIERvdWJsZUNsaWNrTGlzdGVuZXI8RT5bXSBidWlsZERvdWJsZUNsaWNrTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbmV3IERvdWJsZUNsaWNrTGlzdGVuZXJbMF07Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+W10gYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbMF07Ci0JfQotCi0JcHJvdGVjdGVkIERpc3Bvc2VMaXN0ZW5lciBidWlsZFRhYmxlRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMudGFibGVEaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0YWJsZSBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZVRhYmxlKCkgewotCQl0aGlzLnN5bmNocm9uaXplVGFibGVDb2x1bW5zKCk7Ci0JCXRoaXMuc3luY2hyb25pemVUYWJsZUl0ZW1zKCk7Ci0JCXRoaXMuc3luY2hyb25pemVUYWJsZVNlbGVjdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYmxlIGNvbHVtcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZVRhYmxlQ29sdW1ucygpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgY29sdW1uQ291bnQgPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY29sdW1uQ291bnQoKTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY29sdW1uQ291bnQ7IGluZGV4KyspIHsKLQkJCVRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRoaXMudGFibGUsIFNXVC5OVUxMLCBpbmRleCk7Ci0JCQl0YWJsZUNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0JCQl0YWJsZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQl0YWJsZUNvbHVtbi5zZXRXaWR0aCgxMDApOwotCi0JCQlTdHJpbmcgY29sdW1uTmFtZSA9IHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5OYW1lKGluZGV4KTsKLQotCQkJaWYgKGNvbHVtbk5hbWUgPT0gbnVsbCkgewotCQkJCWNvbHVtbk5hbWUgPSAiIjsKLQkJCX0KLQotCQkJdGFibGVDb2x1bW4uc2V0VGV4dChjb2x1bW5OYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJydXRlIGZvcmNlIHN5bmNocm9uaXphdGlvbiBvZiB0YWJsZSB3aXRoIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplVGFibGVJdGVtcygpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpbmRleCA9IHRhYmxlLmdldEl0ZW1Db3VudCgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJdGhpcy50YWJsZS5yZW1vdmUoaW5kZXgpOwotCQkJdGhpcy50YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzLnJlbW92ZShpbmRleCk7Ci0JCX0KLQotCQlpbnQgaXRlbUNvdW50ID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgaXRlbUNvdW50OyBpbmRleCsrKSB7Ci0KLQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHRoaXMudGFibGUsIFNXVC5OVUxMLCBpbmRleCk7Ci0JCQl0YWJsZUl0ZW0uc2V0RGF0YSh0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4KSk7Ci0KLQkJCVRhYmxlSXRlbU1vZGVsQWRhcHRlciBhZGFwdGVyID0gYnVpbGRJdGVtTW9kZWwodGFibGVJdGVtKTsKLQkJCXRhYmxlSXRlbU1vZGVsQWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCi0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IGluZGV4ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQotCQlmb3IgKExpc3RJdGVyYXRvcjxFPiBzdHJlYW0gPSB0aGlzLml0ZW1zKGV2ZW50KTsgc3RyZWFtLmhhc05leHQoKTsgaW5kZXgrKykgewotCi0JCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0aGlzLnRhYmxlLCBTV1QuTlVMTCwgaW5kZXgpOwotCQkJdGFibGVJdGVtLnNldERhdGEoc3RyZWFtLm5leHQoKSk7Ci0KLQkJCVRhYmxlSXRlbU1vZGVsQWRhcHRlciBhZGFwdGVyID0gdGhpcy5idWlsZEl0ZW1Nb2RlbCh0YWJsZUl0ZW0pOwotCQkJdGFibGVJdGVtTW9kZWxBZGFwdGVycy5hZGQoaW5kZXgsIGFkYXB0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0aGlzLnRhYmxlLnJlbW92ZShldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJbmRleCgpICsgZXZlbnQuaXRlbXNTaXplKCkgLSAxKTsKLQotCQlmb3IgKGludCBpbmRleCA9IGV2ZW50LmdldEluZGV4KCkgKyBldmVudC5pdGVtc1NpemUoKTsgLS1pbmRleCA+PSBldmVudC5nZXRJbmRleCgpOyApIHsKLQkJCXRhYmxlSXRlbU1vZGVsQWRhcHRlcnMucmVtb3ZlKGluZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSB0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBsZW5ndGggICAgICAgID0gZXZlbnQuZ2V0TW92ZUxlbmd0aCgpOwotCQlpbnQgc291cmNlSW5kZXggICA9IGV2ZW50LmdldFNvdXJjZUluZGV4KCk7Ci0JCWludCB0YXJnZXRJbmRleCAgID0gZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJaW50IGxvd1N0YXJ0SW5kZXggPSBNYXRoLm1pbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlpbnQgaGlTdGFydEluZGV4ICA9IE1hdGgubWF4KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0KLQkJT2JqZWN0W10gaXRlbXMgPSBuZXcgT2JqZWN0W2hpU3RhcnRJbmRleCAtIGxvd1N0YXJ0SW5kZXggKyBsZW5ndGhdOwotCQlpbnQgaXRlbXNJbmRleCA9IGl0ZW1zLmxlbmd0aDsKLQotCQkvLyBSZW1vdmUgdGhlIFRhYmxlSXRlbXMgd3JhcHBpbmcgdGhlIG1vdmVkIGl0ZW1zCi0JCWZvciAoaW50IGluZGV4ID0gaGlTdGFydEluZGV4ICsgbGVuZ3RoOyAtLWluZGV4ID49IGxvd1N0YXJ0SW5kZXg7ICkgewotCi0JCQlUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgdGFibGVJdGVtTW9kZWwgPSB0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMuZ2V0KGluZGV4KTsKLQkJCWl0ZW1zWy0taXRlbXNJbmRleF0gPSB0YWJsZUl0ZW1Nb2RlbC50YWJsZUl0ZW0uZ2V0RGF0YSgpOwotCi0JCQkvLyBSZW1vdmUgdGhlIFRhYmxlSXRlbSwgd2hpY2ggd2lsbCBhbHNvIGRpc3Bvc2UgVGFibGVJdGVtTW9kZWxBZGFwdGVyCi0JCQl0aGlzLnRhYmxlLnJlbW92ZShpbmRleCk7Ci0JCX0KLQotCQkvLyBNb3ZlIHRoZSBpdGVtcyBzbyB0aGV5IGNhbiByZXRyaWV2ZWQgaW4gdGhlIHJpZ2h0IG9yZGVyIHdoZW4KLQkJLy8gcmUtY3JlYXRpbmcgdGhlIFRhYmxlSXRlbXMKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUoCi0JCQlpdGVtcywKLQkJCXRhcmdldEluZGV4IC0gbG93U3RhcnRJbmRleCwKLQkJCXNvdXJjZUluZGV4IC0gbG93U3RhcnRJbmRleCwKLQkJCWxlbmd0aAotCQkpOwotCi0JCWl0ZW1zSW5kZXggPSAwOwotCi0JCS8vIEFkZCBUYWJsZUl0ZW1zIGZvciB0aGUgbW92ZWQgaXRlbXMKLQkJZm9yIChpbnQgaW5kZXggPSBsb3dTdGFydEluZGV4OyBpbmRleCA8PSBoaVN0YXJ0SW5kZXggKyBsZW5ndGggLSAxOyBpbmRleCsrKSB7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgbmV3IFRhYmxlSXRlbQotCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGhpcy50YWJsZSwgU1dULk5VTEwsIGluZGV4KTsKLQkJCXRhYmxlSXRlbS5zZXREYXRhKGl0ZW1zW2l0ZW1zSW5kZXgrK10pOwotCi0JCQkvLyBBZGFwdCBpdCB3aXRoIGEgbW9kZWwgYWRhcHRlcgotCQkJVGFibGVJdGVtTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSB0aGlzLmJ1aWxkSXRlbU1vZGVsKHRhYmxlSXRlbSk7Ci0JCQl0YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzLnNldChpbmRleCwgYWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgVGFibGVJdGVtTW9kZWxBZGFwdGVyIGJ1aWxkSXRlbU1vZGVsKFRhYmxlSXRlbSB0YWJsZUl0ZW0pIHsKLQkJcmV0dXJuIFRhYmxlSXRlbU1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCXRhYmxlSXRlbSwKLQkJCWNvbHVtbkFkYXB0ZXIsCi0JCQlsYWJlbFByb3ZpZGVyCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCByb3dJbmRleCA9IGV2ZW50LmdldEluZGV4KCk7Ci0KLQkJZm9yIChMaXN0SXRlcmF0b3I8RT4gc3RyZWFtID0gdGhpcy5pdGVtcyhldmVudCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRoaXMudGFibGUuZ2V0SXRlbShyb3dJbmRleCk7Ci0JCQl0YWJsZUl0ZW0uc2V0RGF0YShzdHJlYW0ubmV4dCgpKTsKLQotCQkJVGFibGVJdGVtTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSB0YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzLmdldChyb3dJbmRleCk7Ci0KLQkJCWludCBjb2x1bW5Db3VudCA9IHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5Db3VudCgpOwotCQkJYm9vbGVhbiByZXZhbGlkYXRlID0gKGNvbHVtbkNvdW50ID09IDEpOwotCi0JCQlmb3IgKGludCBjb2x1bW5JbmRleCA9IGNvbHVtbkNvdW50OyAtLWNvbHVtbkluZGV4ID49IDA7ICkgewotCQkJCWFkYXB0ZXIudGFibGVJdGVtQ2hhbmdlZChjb2x1bW5JbmRleCwgdGFibGVJdGVtLmdldERhdGEoKSwgcmV2YWxpZGF0ZSk7Ci0JCQl9Ci0KLQkJCXJvd0luZGV4Kys7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMudGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplVGFibGVJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCB1bmNoZWNrZWQgY29kZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gaXRlbXMoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoKExpc3RJdGVyYXRvcjxFPikgZXZlbnQuaXRlbXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGVkIGl0ZW1zICoqKioqKioqKioKLQotCXByb3RlY3RlZCBpbnQgaW5kZXhPZihFIGl0ZW0pIHsKLQkJaW50IGxlbiA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICh0aGlzLmxpc3RIb2xkZXIuZ2V0KGkpID09IGl0ZW0pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVUYWJsZVNlbGVjdGlvbigpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyLnNpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxFPiBzdHJlYW0gPSB0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpbmRpY2VzW2krK10gPSB0aGlzLmluZGV4T2Yoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJdGhpcy50YWJsZS5kZXNlbGVjdEFsbCgpOwotCQl0aGlzLnRhYmxlLnNlbGVjdChpbmRpY2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2V2ZW50Lml0ZW1zU2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuaXRlbXMoZXZlbnQpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWluZGljZXNbaSsrXSA9IHRoaXMuaW5kZXhPZihzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQl0aGlzLnRhYmxlLnNlbGVjdChpbmRpY2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbZXZlbnQuaXRlbXNTaXplKCldOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8RT4gc3RyZWFtID0gdGhpcy5pdGVtcyhldmVudCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaW5kaWNlc1tpKytdID0gdGhpcy5pbmRleE9mKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXRoaXMudGFibGUuZGVzZWxlY3QoaW5kaWNlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRJdGVtc0NsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMudGFibGUuZGVzZWxlY3RBbGwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZVRhYmxlU2VsZWN0aW9uKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHVuY2hlY2tlZCBjb2RlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZW1zKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKChJdGVyYXRvcjxFPikgZXZlbnQuaXRlbXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgYm94IGV2ZW50cyAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZVNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKLQkJCVNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+IHNjRXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcywgdGhpcy5zZWxlY3RlZEl0ZW1zKCkpOwotCQkJZm9yIChTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA6IHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChzY0V2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPEU+IHNlbGVjdGVkSXRlbXMoKSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0KLQkJQXJyYXlMaXN0PEU+IHNlbGVjdGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KHRoaXMudGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCWZvciAoaW50IHNlbGVjdGlvbkluZGV4IDogdGhpcy50YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpIHsKLQkJCXNlbGVjdGVkSXRlbXMuYWRkKHRoaXMubGlzdEhvbGRlci5nZXQoc2VsZWN0aW9uSW5kZXgpKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRJdGVtczsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZURvdWJsZUNsaWNrZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMubGVuZ3RoID4gMCkgewotCQkJLy8gdGhlcmUgc2hvdWxkIGJlIG9ubHkgYSBzaW5nbGUgaXRlbSBzZWxlY3RlZCBkdXJpbmcgYSBkb3VibGUtY2xpY2soPykKLQkJCUUgc2VsZWN0aW9uID0gdGhpcy5saXN0SG9sZGVyLmdldCh0aGlzLnRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJRG91YmxlQ2xpY2tFdmVudDxFPiBkY0V2ZW50ID0gbmV3IERvdWJsZUNsaWNrRXZlbnQodGhpcywgc2VsZWN0aW9uKTsKLQkJCWZvciAoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBkb3VibGVDbGlja0xpc3RlbmVyIDogdGhpcy5kb3VibGVDbGlja0xpc3RlbmVycykgewotCQkJCWRvdWJsZUNsaWNrTGlzdGVuZXIuZG91YmxlQ2xpY2soZGNFdmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZURpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgdGFibGUgaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLnRhYmxlLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLnRhYmxlRGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy50YWJsZS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLnRhYmxlU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZG91YmxlIGNsaWNrIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihEb3VibGVDbGlja0xpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVycyA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmUodGhpcy5kb3VibGVDbGlja0xpc3RlbmVycywgbGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiB7Ci0JCXZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudDxFPiBldmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEb3VibGVDbGlja0V2ZW50PEU+IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCQlwcml2YXRlIGZpbmFsIEUgc2VsZWN0aW9uOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwcm90ZWN0ZWQgRG91YmxlQ2xpY2tFdmVudChUYWJsZU1vZGVsQWRhcHRlcjxFPiBzb3VyY2UsIEUgc2VsZWN0aW9uKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFRhYmxlTW9kZWxBZGFwdGVyPEU+IGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiAoVGFibGVNb2RlbEFkYXB0ZXI8RT4pIHN1cGVyLmdldFNvdXJjZSgpOwotCQl9Ci0KLQkJcHVibGljIEUgc2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuc2VsZWN0aW9uOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlKHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiB7Ci0JCXZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBldmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPEU+IHNlbGVjdGlvbjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUV2ZW50KFRhYmxlTW9kZWxBZGFwdGVyPEU+IHNvdXJjZSwgQ29sbGVjdGlvbjxFPiBzZWxlY3Rpb24pIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgVGFibGVNb2RlbEFkYXB0ZXI8RT4gZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIChUYWJsZU1vZGVsQWRhcHRlcjxFPikgc3VwZXIuZ2V0U291cmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gc2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvVGV4dEZpZWxkTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvVGV4dEZpZWxkTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Nzg5ZGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L1RleHRGaWVsZE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGV4dEZpZWxkTW9kZWxBZGFwdGVyIHsKLQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgdGV4dCBmaWVsZCdzIGNvbnRlbnRzIHdpdGgKLQkgKiB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIHRleHQgZmllbGQgd2Uga2VlcCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IHRleHRGaWVsZDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgb3VyIHNlbGVjdGlvbiBsaXN0IGhvbGRlcgotCSAqIHdpdGggdGhlIGxpc3QgYm94J3Mgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBNb2RpZnlMaXN0ZW5lciB0ZXh0RmllbGRNb2RpZnlMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgbGlzdCBib3gKLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIHRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEZsYWcgdG8gcHJldmVudCBzZXR0aW5nIHRoZSBtb2RlbCBkdXJpbmcgdGV4dCBmaWVsZCBwb3B1bGF0aW9uLgotCSAqIFRoaXMgY2FuIGJlIGEgcHJvYmxlbSBmb3IgdmlydHVhbCBtb2RlbCBvYmplY3RzIHdoZXJlIHdlIG5ldmVyCi0JICogd2FudCB0byBjYWxsIHRoZSBzZXR0ZXIgYW5kIGNhbid0IGRlcGVuZCBvbiB0aGUgc2V0dGVyIGNoYW5nZQotCSAqIG5vdGlmaWNhdGlvbiB0byBzdG9wIHRoZSBub3RpZmljYXRpb24gY3ljbGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcG9wdWxhdGluZzsKLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0RmllbGRNb2RlbEFkYXB0ZXIgYWRhcHQoCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JCQlUZXh0IHRleHRGaWVsZCkKLQl7Ci0JCXJldHVybiBuZXcgVGV4dEZpZWxkTW9kZWxBZGFwdGVyKHRleHRIb2xkZXIsIHRleHRGaWVsZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciwgc2VsZWN0aW9ucyBob2xkZXIsIGxpc3QgYm94LCBhbmQKLQkgKiBzdHJpbmcgY29udmVydGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dEZpZWxkTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwgVGV4dCB0ZXh0RmllbGQpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKCh0ZXh0SG9sZGVyID09IG51bGwpIHx8ICh0ZXh0RmllbGQgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudGV4dEhvbGRlciA9IHRleHRIb2xkZXI7Ci0JCXRoaXMudGV4dEZpZWxkID0gdGV4dEZpZWxkOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMudGV4dEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLnRleHRGaWVsZE1vZGlmeUxpc3RlbmVyID0gdGhpcy5idWlsZFRleHRGaWVsZE1vZGlmeUxpc3RlbmVyKCk7Ci0JCXRoaXMudGV4dEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMudGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIpOwotCi0JCXRoaXMudGV4dEZpZWxkRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZFRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLnRleHRGaWVsZC5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy50ZXh0RmllbGREaXNwb3NlTGlzdGVuZXIpOwotCi0JCVN0cmluZyB0ZXh0ID0gdGV4dEhvbGRlci5nZXRWYWx1ZSgpOwotCQlzZXRUZXh0KCh0ZXh0ID09IG51bGwpID8gIiIgOiB0ZXh0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRleHRGaWVsZE1vZGVsQWRhcHRlci50aGlzLnRleHRDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRleHQgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBidWlsZFRleHRGaWVsZE1vZGlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJCVRleHRGaWVsZE1vZGVsQWRhcHRlci50aGlzLnRleHRGaWVsZE1vZGlmaWVkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRleHQgZmllbGQgbW9kaWZ5IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkVGV4dEZpZWxkRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCVRleHRGaWVsZE1vZGVsQWRhcHRlci50aGlzLnRleHRGaWVsZERpc3Bvc2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRleHQgZmllbGQgZGlzcG9zZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vZGVsIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB0ZXh0Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnRleHRGaWVsZC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCS8vIHRoZSBtb2RlbCBjYW4gYmUgbnVsbCwgYnV0IHRoZSB0ZXh0IGZpZWxkIGNhbm5vdAotCQlpZiAodGV4dCA9PSBudWxsKSB7Ci0JCQl0ZXh0ID0gIiI7Ci0JCX0KLQkJaWYgKCAhIHRleHQuZXF1YWxzKHRoaXMudGV4dEZpZWxkLmdldFRleHQoKSkpIHsgIC8vID8/PwotCQkJc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy5wb3B1bGF0aW5nID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGV4dEZpZWxkLnNldFRleHQodGV4dCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLnBvcHVsYXRpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogdGV4dCBmaWVsZCBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdGV4dEZpZWxkTW9kaWZpZWQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMucG9wdWxhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMudGV4dEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRleHRGaWVsZC5nZXRUZXh0KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRleHRGaWVsZERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgdGV4dCBmaWVsZCBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMudGV4dEZpZWxkLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLnRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcik7Ci0JCXRoaXMudGV4dEZpZWxkLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMudGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIpOwotCQl0aGlzLnRleHRIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy50ZXh0SG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2E4YmU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuVHJpU3RhdGVDaGVja0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSB0cmktc3RhdGUgY2hlY2sgYm94IGluIHN5bmNoIHdpdGgKLSAqIGEgbW9kZWwgQm9vbGVhbiB3aGVyZSB0aGUgdmFsdWUgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyIHsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGJvb2xlYW4uICovCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBidXR0b24ncyBzZWxlY3Rpb24gc3RhdGUgd2l0aAotCSAqIHRoZSBtb2RlbCBib29sZWFuLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJvb2xlYW5DaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKiBUaGUgY2hlY2sgYm94L3RvZ2dsZSBidXR0b24gd2Ugc3luY2hyb25pemUgd2l0aCB0aGUgbW9kZWwgYm9vbGVhbi4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgVHJpU3RhdGVDaGVja0JveCBidXR0b247Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBtb2RlbCBib29sZWFuIHdpdGgKLQkgKiB0aGUgYnV0dG9uJ3Mgc2VsZWN0aW9uIHN0YXRlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTZWxlY3Rpb25MaXN0ZW5lciBidXR0b25TZWxlY3Rpb25MaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgYnV0dG9uCi0JICogaXMgZGlzcG9zZWQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIERpc3Bvc2VMaXN0ZW5lciBidXR0b25EaXNwb3NlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBib29sZWFuIHRvIHRoZSBzcGVjaWZpZWQgYnV0dG9uLgotCSAqIElmIHRoZSBib29sZWFuIGlzIG51bGwsIHRoZSBidXR0b24ncyB2YWx1ZSB3aWxsIGJlICJwYXJ0aWFsbHkgY2hlY2tlZCIKLQkgKiAoaS5lLiB0aGUgYnV0dG9uIHdpbGwgYmUgY2hlY2tlZCBidXQgZ3JheWVkIG91dCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyIGFkYXB0KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIFRyaVN0YXRlQ2hlY2tCb3ggYnV0dG9uKSB7Ci0JCXJldHVybiBuZXcgVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlcihib29sZWFuSG9sZGVyLCBidXR0b24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgYW5kIGJ1dHRvbiBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwgVHJpU3RhdGVDaGVja0JveCBidXR0b24pIHsKLQkJc3VwZXIoKTsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGJvb2xlYW5Ib2xkZXIsICJUaGUgYm9vbGVhbiBob2xkZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChidXR0b24sICJUaGUgY2hlY2sgYm94IGNhbm5vdCBiZSBudWxsIik7Ci0KLQkJdGhpcy5ib29sZWFuSG9sZGVyID0gYm9vbGVhbkhvbGRlcjsKLQkJdGhpcy5idXR0b24gPSBidXR0b247Ci0KLQkJdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZEJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLmJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5idXR0b25EaXNwb3NlTGlzdGVuZXIpOwotCi0JCXRoaXMuYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZXRCdXR0b25TZWxlY3Rpb24odGhpcy5ib29sZWFuSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci50aGlzLmJvb2xlYW5DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyaS1zdGF0ZSBib29sZWFuIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIudGhpcy5idXR0b25TZWxlY3RlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmktc3RhdGUgYnV0dG9uIHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIERpc3Bvc2VMaXN0ZW5lciBidWlsZEJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLnRoaXMuYnV0dG9uRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJpLXN0YXRlIGJ1dHRvbiBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGJ1dHRvbi4KLQkgKiBJZiB0aGUgbmV3IG1vZGVsIHZhbHVlIGlzIG51bGwsIHVzZSB0aGUgYWRhcHRlcidzIGRlZmF1bHQgdmFsdWUKLQkgKiAod2hpY2ggaXMgdHlwaWNhbGx5IGZhbHNlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBib29sZWFuQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2V0QnV0dG9uU2VsZWN0aW9uKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCdXR0b25TZWxlY3Rpb24oQm9vbGVhbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuYnV0dG9uLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFRoZSBidXR0b24gaGFzIGJlZW4gInNlbGVjdGVkIiAtIHN5bmNocm9uaXplIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAodGhpcy5idXR0b24uaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5ib29sZWFuSG9sZGVyLnNldFZhbHVlKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc3Bvc2UgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uRGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBidXR0b24gaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLmJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy5idXR0b24ucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5ib29sZWFuSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvQ29udHJvbEFsaWduZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvQ29udHJvbEFsaWduZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiY2I2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIHRvIHNldCBhIHByZWZlcnJlZCB3aWR0aCBvbiB0aGUgcmVnaXN0ZXJlZCB3aWRnZXRzCi0gKiAoZWl0aGVyIDxjb2RlPkNvbnRyb2w8L2NvZGU+IG9yIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgYmFzZWQgb24gdGhlCi0gKiB3aWRlc3Qgd2lkZ2V0LgotICogPHA+Ci0gKiBJbXBvcnRhbnQ6IFRoZSBsYXlvdXQgZGF0YSBoYXMgdG8gYmUgYSA8Y29kZT5HcmlkRGF0YTwvY29kZT4uIElmIG5vbmUgaXMgc2V0LAotICogdGhlbiBhIG5ldyA8Y29kZT5HcmlkRGF0YTwvY29kZT4gaXMgYXV0b21hdGljYWxseSBjcmVhdGVkLgotICogPHA+Ci0gKiBIZXJlIGFuIGV4YW1wbGUgb2YgdGhlIHJlc3VsdCBpZiB0aGlzIGFsaWduZXIgaXMgdXNlZCB0byBhbGlnbiBjb250cm9scwotICogd2l0aGluIGVpdGhlciBvbmUgb3IgdHdvIGdyb3VwIGJveGVzLCB0aGUgY29udHJvbHMgYWRkZWQgYXJlIHRoZSBsYWJlbHMgaW4KLSAqIHRoaXMgY2FzZS4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhbGlnbiBjb250cm9scyBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUKLSAqIG1haW4gY29tcG9uZW50LCBhIHNwYWNlciBjYW4gYmUgdXNlZCBmb3IgZXh0cmEgc3BhY2UuCi0gKiA8cD4KLSAqIEhlcmUncyBhbiBleGFtcGxlOgotICogPHByZT4KLSAqIC0gR3JvdXAgQm94IDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0gfAotICogfCBOYW1lOiAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQnJvd3NzZS4uLiB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBQcmVhbGxvY2F0aW9uIFNpemU6IHwgICAgIHxJfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgfAotICogfCBEZXNjcmlwdG9yOiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8ICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIC0gR3JvdXAgQm94IDIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgfAotICogfCBNYXBwaW5nIFR5cGU6ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFZ8ICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgfAotICogfCBDaGVjayBpbiBTY3JpcHQ6ICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sQWxpZ25lcgotewotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBwcmV2ZW50IGEgdmFsaWRhdGlvbiBzbyBpdCBjYW4gYmUgZG9uZSBhZnRlciBhbiBvcGVyYXRpb24KLQkgKiBjb21wbGV0ZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGF1dG9WYWxpZGF0ZTsKLQotCS8qKgotCSAqIFRoZSB1dGlsaXR5IGNsYXNzIHVzZWQgdG8gc3VwcG9ydCBib3VuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxMaXN0ZW5lcj4gY2hhbmdlU3VwcG9ydDsKLQotCS8qKgotCSAqIFRoZSBsaXN0ZW5lciBhZGRlZCB0byBlYWNoIG9mIHRoZSBjb250cm9scyB0aGF0IGxpc3RlbnMgb25seSB0byBhIHRleHQKLQkgKiBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qKgotCSAqIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiB3aGVuIHJlY2FsY3VsYXRpbmcgdGhlIHByZWZlcnJlZCB3aWR0aC4KLQkgKiBUaGlzIGhhcHBlbnMgaW4gYW4gaGllcmFyY2h5IG9mIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPnMuIFRoZSBsb2NrCi0JICogaGFzIHRvIGJlIHBsYWNlZCBoZXJlIGFuZCBub3QgaW4gdGhlIHtAbGluayBDb250cm9sQWxpZ25lcldyYXBwZXJ9LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkvKioKLQkgKiBUaGUgbGVuZ3RoIG9mIHRoZSB3aWRlc3QgY29udHJvbC4gSWYgdGhlIGxlbmd0aCB3YXMgbm90IGNhbGN1bGF0ZWQsIHRoZW4KLQkgKiB0aGlzIHZhbHVlIGlzIDAuCi0JICovCi0JcHJpdmF0ZSBpbnQgbWF4aW11bVdpZHRoOwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFdyYXBwZXJ9cyBlbmNhcHN1bGF0aW5nIGVpdGhlciA8Y29kZT5Db250cm9sPC9jb2RlPnMKLQkgKiBvciB7QGxpbmsgQ29udHJvbEFsaWduZXJ9cy4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248V3JhcHBlcj4gd3JhcHBlcnM7Ci0KLQkvKioKLQkgKiBBIG51bGwtPGNvZGU+UG9pbnQ8L2NvZGU+IG9iamVjdCB1c2VkIHRvIGNsZWFyIHRoZSBwcmVmZXJyZWQgc2l6ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQb2ludCBERUZBVUxUX1NJWkUgPSBuZXcgUG9pbnQoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCS8qKgotCSAqIFRoZSB0eXBlcyBvZiBldmVudHMgdG8gbGlzdGVuIGluIG9yZGVyIHRvIHByb3Blcmx5IGFkanVzdCB0aGUgc2l6ZSBvZiBhbGwKLQkgKiB0aGUgd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBFVkVOVF9UWVBFUyA9IHsKLQkJU1dULkRpc3Bvc2UsCi0JCVNXVC5IaWRlLAotCQlTV1QuUmVzaXplLAotCQlTV1QuU2hvdwotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbEFsaWduZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9scyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sPC9jb2RlPnMKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEFsaWduZXIoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMpIHsKLQkJdGhpcygpOwotCQlhZGRBbGxDb250cm9scyhjb250cm9scyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29udHJvbC4gSXRzIHdpZHRoIHdpbGwgYmUgdXNlZCBhbG9uZyB3aXRoIHRoZSB3aWR0aCBvZiBhbGwKLQkgKiB0aGUgb3RoZXIgcmVnaXN0ZXJlZCBjb250cm9scyBpbiBvcmRlciB0byBnZXQgdGhlIGdyZWF0ZXIgd2l0ZGggYW5kIHVzZQotCSAqIGl0IGFzIHRoZSB3aWR0aCBmb3IgYWxsIHRoZSBjb250cm9scy4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9sIFRoZSA8Y29kZT5Db250cm9sPC9jb2RlPiB0byBiZSBhZGRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChDb250cm9sIGNvbnRyb2wpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRyb2wsICJDYW4ndCBhZGQgbnVsbCB0byB0aGlzIENvbnRyb2xBbGlnbmVyIik7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gYnVpbGRXcmFwcGVyKGNvbnRyb2wpOwotCQl3cmFwcGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotCi0JCXJldmFsaWRhdGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbnRyb2wuIEl0cyB3aWR0aCB3aWxsIGJlIHVzZWQgYWxvbmcgd2l0aCB0aGUgd2lkdGggb2YgYWxsCi0JICogdGhlIG90aGVyIHJlZ2lzdGVyZWQgY29udHJvbHMgaW4gb3JkZXIgdG8gZ2V0IHRoZSBncmVhdGVyIHdpdGRoIGFuZCB1c2UKLQkgKiBpdCBhcyB0aGUgd2lkdGggZm9yIGFsbCB0aGUgY29udHJvbHMuCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZSBhZGRlZAotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIENhbid0IGFkZCB0aGUgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+Ci0JICogdG8gaXRzZWxmCi0JICovCi0JcHVibGljIHZvaWQgYWRkKENvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sQWxpZ25lciwgIkNhbid0IGFkZCBudWxsIHRvIHRoaXMgQ29udHJvbEFsaWduZXIiKTsKLQkJQXNzZXJ0LmlzTGVnYWwoY29udHJvbEFsaWduZXIgIT0gdGhpcywgIkNhbid0IGFkZCB0aGUgQ29udHJvbEFsaWduZXIgdG8gaXRzZWxmIik7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gYnVpbGRXcmFwcGVyKGNvbnRyb2xBbGlnbmVyKTsKLQkJd3JhcHBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLQotCQlpZiAoIWNvbnRyb2xBbGlnbmVyLndyYXBwZXJzLmlzRW1wdHkoKSkgewotCQkJcmV2YWxpZGF0ZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBpdGVtcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gaW50byB0aGlzCi0JICogPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LiBUaGUgcHJlZmVycmVkIHdpZHRoIG9mIGVhY2ggaXRlbSB3aWxsIGJlCi0JICogdXNlZCBhbG9uZyB3aXRoIHRoZSB3aWR0aCBvZiBhbGwgdGhlIG90aGVyIGl0ZW1zIGluIG9yZGVyIHRvIGdldCB0aGUKLQkgKiB3aWRlc3QgY29udHJvbCBhbmQgdXNlIGl0cyB3aWR0aCBhcyB0aGUgd2lkdGggZm9yIGFsbCB0aGUgY29udHJvbHMuCi0JICoKLQkgKiBAcGFyYW0gYWxpZ25lcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+cwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbENvbnRyb2xBbGlnbmVycyhDb2xsZWN0aW9uPENvbnRyb2xBbGlnbmVyPiBhbGlnbmVycykgewotCi0JCS8vIERlYWN0aXZhdGUgdGhlIGF1dG8gdmFsaWRhdGlvbiB3aGlsZSBhZGRpbmcgYWxsIHRoZSBDb250cm9scyBhbmQvb3IKLQkJLy8gQ29udHJvbEFsaWduZXJzIGluIG9yZGVyIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLQkJYm9vbGVhbiBvbGRBdXRvVmFsaWRhdGUgPSBhdXRvVmFsaWRhdGU7Ci0JCWF1dG9WYWxpZGF0ZSA9IGZhbHNlOwotCi0JCWZvciAoQ29udHJvbEFsaWduZXIgYWxpZ25lciA6IGFsaWduZXJzKSB7Ci0JCQlhZGQoYWxpZ25lcik7Ci0JCX0KLQotCQlhdXRvVmFsaWRhdGUgPSBvbGRBdXRvVmFsaWRhdGU7Ci0JCXJldmFsaWRhdGUoZmFsc2UpOwotCX0KLQotICAgLyoqCi0JICogQWRkcyB0aGUgaXRlbXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGludG8gdGhpcwotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4gVGhlIHByZWZlcnJlZCB3aWR0aCBvZiBlYWNoIGl0ZW0gd2lsbCBiZQotCSAqIHVzZWQgYWxvbmcgd2l0aCB0aGUgd2lkdGggb2YgYWxsIHRoZSBvdGhlciBpdGVtcyBpbiBvcmRlciB0byBnZXQgdGhlCi0JICogd2lkZXN0IGNvbnRyb2wgYW5kIHVzZSBpdHMgd2lkdGggYXMgdGhlIHdpZHRoIGZvciBhbGwgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIGNvbnRyb2xzIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2w8L2NvZGU+cwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbENvbnRyb2xzKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzKSB7Ci0KLQkJLy8gRGVhY3RpdmF0ZSB0aGUgYXV0byB2YWxpZGF0aW9uIHdoaWxlIGFkZGluZyBhbGwgdGhlIENvbnRyb2xzIGFuZC9vcgotCQkvLyBDb250cm9sQWxpZ25lcnMgaW4gb3JkZXIgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCQlib29sZWFuIG9sZEF1dG9WYWxpZGF0ZSA9IGF1dG9WYWxpZGF0ZTsKLQkJYXV0b1ZhbGlkYXRlID0gZmFsc2U7Ci0KLQkJZm9yIChDb250cm9sIGNvbnRyb2wgOiBjb250cm9scykgewotCQkJYWRkKGNvbnRyb2wpOwotCQl9Ci0KLQkJYXV0b1ZhbGlkYXRlID0gb2xkQXV0b1ZhbGlkYXRlOwotCQlyZXZhbGlkYXRlKGZhbHNlKTsKLQl9Ci0KLSAgIC8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb0xpc3RlbmVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIGJlIGFkZGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJaWYgKGNoYW5nZVN1cHBvcnQgPT0gbnVsbCkgewotCQkgICAgY2hhbmdlU3VwcG9ydCA9IG5ldyBBcnJheUxpc3Q8TGlzdGVuZXI+KCk7Ci0JCX0KLQotCQljaGFuZ2VTdXBwb3J0LmFkZChsaXN0ZW5lcik7Ci0gICB9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPldyYXBwZXI8L2NvZGU+IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBnaXZlbiBzb3VyY2UuCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB0byBiZSB3cmFwcGVkCi0JICogQHJldHVybiBBIG5ldyB7QGxpbmsgV3JhcHBlcn0KLQkgKi8KLQlwcml2YXRlIFdyYXBwZXIgYnVpbGRXcmFwcGVyKENvbnRyb2wgY29udHJvbCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2xXcmFwcGVyKGNvbnRyb2wpOwotCX0KLQotICAgLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XcmFwcGVyPC9jb2RlPiB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgZ2l2ZW4gc291cmNlLgotCSAqCi0JICogQHBhcmFtIENvbnRyb2xBbGlnbmVyIFRoZSA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gdG8gYmUgd3JhcHBlZAotCSAqIEByZXR1cm4gQSBuZXcge0BsaW5rIENvbnRyb2xBbGlnbmVyV3JhcHBlcn0KLQkgKi8KLQlwcml2YXRlIFdyYXBwZXIgYnVpbGRXcmFwcGVyKENvbnRyb2xBbGlnbmVyIENvbnRyb2xBbGlnbmVyKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbEFsaWduZXJXcmFwcGVyKENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCB0YWtlbiBieSB0aGUgd2lkZ2V0cyBhbmQgcmV0dXJucyB0aGUgbWF4aW11bSB3aWR0aC4KLQkgKgotCSAqIEBwYXJhbSByZWNhbGN1bGF0ZVNpemUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplCi0JICogb2YgYWxsIHRoZSB3cmFwcGVycyBjb250YWluZWQgd2l0aGluIHRoZW0gcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGNhY2hlZAotCSAqIHNpemU7IDxjb2RlPmZhbHNlPC9jb2RlPiB0byB1c2UgdGhlIGNhY2hlZCBzaXplCi0JICovCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlV2lkdGgoYm9vbGVhbiByZWNhbGN1bGF0ZVNpemUpIHsKLQotCQlpbnQgd2lkdGggPSAwOwotCi0JCWZvciAoV3JhcHBlciB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCVBvaW50IHNpemUgPSB3cmFwcGVyLmNhY2hlZFNpemUoKTsKLQotCQkJLy8gVGhlIHNpemUgaGFzIG5vdCBiZWVuIGNhbGN1bGF0ZWQgeWV0Ci0JCQlpZiAocmVjYWxjdWxhdGVTaXplIHx8IChzaXplLnggPT0gMCkpIHsKLQkJCQlzaXplID0gd3JhcHBlci5jYWxjdWxhdGVTaXplKCk7Ci0JCQl9Ci0KLQkJCS8vIE9ubHkga2VlcCB0aGUgZ3JlYXRlc3Qgd2lkdGgKLQkJCXdpZHRoID0gTWF0aC5tYXgoc2l6ZS54LCB3aWR0aCk7Ci0JCX0KLQotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0cyBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZS4KLQkgKgotCSAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAoYXMgYW4gaW50KQotCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAoYXMgYW4gaW50KQotCSAqLwotCXByaXZhdGUgdm9pZCBjb250cm9sUmVzaXplZChpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCi0JCWlmICgoY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpKSB7Ci0JCQlFdmVudCBldmVudCAgPSBuZXcgRXZlbnQoKTsKLQkJCWV2ZW50LndpZGdldCA9IFNXVFV0aWwuZ2V0U2hlbGwoKTsKLQkJCWV2ZW50LmRhdGEgICA9IHRoaXM7Ci0KLQkJCWZvciAoTGlzdGVuZXIgbGlzdGVuZXIgOiBjaGFuZ2VTdXBwb3J0KSB7Ci0JCQkJbGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhpcyA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4sIHRoaXMgY2FuIGltcHJvdmUgdGhlIHNwZWVkIG9mCi0JICogZGlzcG9zaW5nIGEgcGFuZS4gV2hlbiBhIHBhbmUgaXMgZGlzcG9zZWQsIHRoaXMgYWxpZ25lciBkb2Vzbid0IG5lZWQgdG8KLQkgKiByZXZhbGlkYXRlIGl0cyBzaXplIHVwb24gZGlzcG9zZSBvZiBpdHMgd2lkZ2V0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JCWZvciAoSXRlcmF0b3I8V3JhcHBlcj4gaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCVdyYXBwZXIgd3JhcHBlciA9IGl0ZXIubmV4dCgpOwotCQkJd3JhcHBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlpdGVyLnJlbW92ZSgpOwotCQl9Ci0KLQkJdGhpcy53cmFwcGVycy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgd2lkZXN0IGNvbnRyb2wuIElmIHRoZSBsZW5ndGggd2FzIG5vdAotCSAqIGNhbGN1bGF0ZWQsIHRoZW4gdGhpcyB2YWx1ZSBpcyAwLgotCSAqCi0JICogQHJldHVybiBUaGUgd2lkdGggb2YgdGhlIHdpZGVzdCBjb250cm9sIG9yIDAgaWYgdGhlIGxlbmd0aCBoYXMgbm90IGJlZW4KLQkgKiBjYWxjdWxhdGVkIHlldAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4aW11bVdpZHRoKCkgewotCQlyZXR1cm4gbWF4aW11bVdpZHRoOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCi0JCXRoaXMuYXV0b1ZhbGlkYXRlID0gdHJ1ZTsKLQkJdGhpcy5tYXhpbXVtV2lkdGggPSAwOwotCQl0aGlzLmxpc3RlbmVyICAgICA9IG5ldyBMaXN0ZW5lckhhbmRsZXIoKTsKLQkJdGhpcy53cmFwcGVycyAgICAgPSBuZXcgQXJyYXlMaXN0PFdyYXBwZXI+KCk7Ci0JfQotCi0JLyoqCi0JICogSW52YWxpZGF0ZXMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgdG8gYmUgaW52YWxpZGF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW52YWxpZGF0ZShPYmplY3Qgc291cmNlKSB7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gcmV0cmlldmVXcmFwcGVyKHNvdXJjZSk7Ci0KLQkJaWYgKCF3cmFwcGVyLmxvY2tlZCgpKSB7Ci0JCQlQb2ludCBzaXplID0gd3JhcHBlci5jYWNoZWRTaXplKCk7Ci0JCQlzaXplLnggPSBzaXplLnkgPSAwOwotCQkJd3JhcHBlci5zZXRTaXplKERFRkFVTFRfU0laRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBtYXhpbXVtIGxlbmd0aCBiYXNlZCBvbiB0aGUgd2lkZXN0IGNvbnRyb2wuIFRoaXMgbWV0aG9kcwotCSAqIGRvZXMgbm90IHVwZGF0ZSB0aGUgd2lkdGggb2YgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIHJlY2FsY3VsYXRlU2l6ZSA8Y29kZT50cnVlPC9jb2RlPiB0byByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUKLQkgKiBvZiBhbGwgdGhlIHdyYXBwZXJzIGNvbnRhaW5lZCB3aXRoaW4gdGhlbSByYXRoZXIgdGhhbiB1c2luZyB0aGUgY2FjaGVkCi0JICogc2l6ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSB0aGUgY2FjaGVkIHNpemUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVjYWxjdWxhdGVXaWR0aChib29sZWFuIHJlY2FsY3VsYXRlU2l6ZSkgewotCi0JCWludCB3aWR0aCA9IGNhbGN1bGF0ZVdpZHRoKHJlY2FsY3VsYXRlU2l6ZSk7Ci0KLQkJdHJ5IHsKLQkJCWxvY2tlZCA9IHRydWU7Ci0JCQlzZXRNYXhpbXVtV2lkdGgod2lkdGgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbG9ja2VkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb250cm9sLiBJdHMgcHJlZmVycmVkIHdpZHRoIHdpbGwgbm90IGJlIHVzZWQgd2hlbgotCSAqIGNhbGN1bGF0aW5nIHRoZSBwcmVmZXJyZWQgd2lkdGguCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB0byBiZSByZW1vdmVkCi0JICogQGV4Y2VwdGlvbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb2w8L2NvZGU+IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoQ29udHJvbCBjb250cm9sKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sLCAiVGhlIENvbnRyb2wgdG8gcmVtb3ZlIGNhbm5vdCBiZSBudWxsIik7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gcmV0cmlldmVXcmFwcGVyKGNvbnRyb2wpOwotCQl3cmFwcGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMucmVtb3ZlKHdyYXBwZXIpOwotCi0JCXJldmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LiBJdHMgcHJlZmVycmVkIHdpZHRoCi0JICogd2lsbCBub3QgYmUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBwcmVmZXJyZWQgd2l0ZGguCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZSByZW1vdmVkCi0JICogQGV4Y2VwdGlvbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPgotCSAqIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKENvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sQWxpZ25lciwgIlRoZSBDb250cm9sQWxpZ25lciB0byByZW1vdmUgY2Fubm90IGJlIG51bGwiKTsKLQotCQlXcmFwcGVyIHdyYXBwZXIgPSByZXRyaWV2ZVdyYXBwZXIoY29udHJvbEFsaWduZXIpOwotCQl3cmFwcGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMucmVtb3ZlKHdyYXBwZXIpOwotCi0JCXJldmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+TGlzdGVuZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIFRoZSA8Y29kZT5MaXN0ZW5lcjwvY29kZT4gdG8gYmUgcmVtb3ZlZAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCWNoYW5nZVN1cHBvcnQucmVtb3ZlKGxpc3RlbmVyKTsKLQotCQlpZiAoY2hhbmdlU3VwcG9ydC5pc0VtcHR5KCkpIHsKLQkJCWNoYW5nZVN1cHBvcnQgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSA8Y29kZT5XcmFwcGVyPC9jb2RlPiB0aGF0IGlzIGVuY2Fwc3VsYXRpbmcgdGhlIGdpdmVuIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgRWl0aGVyIGEgPGNvZGU+Q29udHJvbDwvY29kZT4gb3IgYSA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4KLQkgKiBAcmV0dXJuIEl0cyA8Y29kZT5XcmFwcGVyPC9jb2RlPgotCSAqLwotCXByaXZhdGUgV3JhcHBlciByZXRyaWV2ZVdyYXBwZXIoT2JqZWN0IHNvdXJjZSkgewotCi0JCWZvciAoV3JhcHBlciB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCWlmICh3cmFwcGVyLnNvdXJjZSgpID09IHNvdXJjZSkgewotCQkJCXJldHVybiB3cmFwcGVyOwotCQkJfQotCQl9Ci0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgcmV0cmlldmUgdGhlIFdyYXBwZXIgZm9yICIgKyBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBjb3VudCBvZiBjb250cm9sIGlzIGdyZWF0ZXIgdGhhbiBvbmUgYW5kIHtAbGluayAjaXNBdXRvVmFsaWRhdGUoKX0KLQkgKiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSBzaXplIG9mIGFsbCB0aGUgcmVnaXN0ZXJlZAotCSAqIDxjb2RlPkNvbnRyb2w8L2NvZGU+cyB3aWxsIGJlIHVkcGF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gcmVjYWxjdWxhdGVTaXplIDxjb2RlPnRydWU8L2NvZGU+IHRvIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZQotCSAqIG9mIGFsbCB0aGUgd3JhcHBlcnMgY29udGFpbmVkIHdpdGhpbiB0aGVtIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBjYWNoZWQKLQkgKiBzaXplOyA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdXNlIHRoZSBjYWNoZWQgc2l6ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZXZhbGlkYXRlKGJvb2xlYW4gcmVjYWxjdWxhdGVTaXplKSB7Ci0KLQkJaWYgKGF1dG9WYWxpZGF0ZSkgewotCQkJcmVjYWxjdWxhdGVXaWR0aChyZWNhbGN1bGF0ZVNpemUpOwotCQkJdXBkYXRlV3JhcHBlclNpemUocmVjYWxjdWxhdGVTaXplKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJhc2VzIG9uIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIGdpdmVuIDxjb2RlPkV2ZW50PC9jb2RlPiwKLQkgKiByZXNpemUgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIGV2ZW50IFRoZSA8Y29kZT5FdmVudDwvY29kZT4gc2VudCBieSB0aGUgVUkgdGhyZWFkIHdoZW4gdGhlIHN0YXRlCi0JICogb2YgYSB3aWRnZXQgY2hhbmdlZAotCSAqLwotCXByaXZhdGUgdm9pZCByZXZhbGlkYXRlKEV2ZW50IGV2ZW50KSB7Ci0KLQkJLy8gV2UgZG9uJ3QgbmVlZCB0byByZXZhbGlkYXRlIGR1cmluZyBhIHJldmFsaWRhdGlvbiBwcm9jZXNzCi0JCWlmIChsb2NrZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCU9iamVjdCBzb3VyY2U7Ci0KLQkJaWYgKGV2ZW50LndpZGdldCAhPSBTV1RVdGlsLmdldFNoZWxsKCkpIHsKLQkJCXNvdXJjZSA9IGV2ZW50LndpZGdldDsKLQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBzb3VyY2U7Ci0KLQkJCS8vIFdoZW4gYSBkaWFsb2cgaXMgb3BlbmVkLCB3ZSBuZWVkIHRvIGFjdHVhbGx5IGZvcmNlIGEgbGF5b3V0IG9mCi0JCQkvLyB0aGUgY29udHJvbHMsIHRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgY29udHJvbCBpcyBhY3R1YWxseQotCQkJLy8gbm90IHZpc2libGUgd2hlbiB0aGUgcHJlZmVycmVkIHdpZHRoIGlzIGNhY3VsYXRlZAotCQkJaWYgKGNvbnRyb2wgPT0gY29udHJvbC5nZXRTaGVsbCgpKSB7Ci0JCQkJaWYgKGV2ZW50LnR5cGUgPT0gU1dULkRpc3Bvc2UpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCXNvdXJjZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzb3VyY2UgPSBldmVudC5kYXRhOwotCQl9Ci0KLQkJLy8gRWl0aGVyIHJlbW92ZSB0aGUgQ29udHJvbFdyYXBwZXIgaWYgdGhlIHdpZGdldCB3YXMgZGlzcG9zZWQgb3IKLQkJLy8gaW52YWxpZGF0ZSB0aGUgd2lkZ2V0IGluIG9yZGVyIHRvIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZQotCQlpZiAoc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChldmVudC50eXBlID09IFNXVC5EaXNwb3NlKSB7Ci0JCQkJV3JhcHBlciB3cmFwcGVyID0gcmV0cmlldmVXcmFwcGVyKHNvdXJjZSk7Ci0JCQkJd3JhcHBlcnMucmVtb3ZlKHdyYXBwZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW52YWxpZGF0ZShzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gTm93IHJldmFsaWRhdGUgYWxsIHRoZSBDb250cm9scyBhbmQgQ29udHJvbEFsaWduZXJzCi0JCXJldmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSB3aWRlc3QgY29udHJvbC4gSWYgdGhlIGxlbmd0aCB3YXMgbm90IGNhbHVsY2F0ZWQsCi0JICogdGhlbiB0aGlzIHZhbHVlIGlzIDAuCi0JICoKLQkgKiBAcGFyYW0gbWF4aW11bVdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TWF4aW11bVdpZHRoKGludCBtYXhpbXVtV2lkdGgpIHsKLQotCQlpbnQgb2xkTWF4aW11bVdpZHRoID0gdGhpcy5tYXhpbXVtV2lkdGg7Ci0JCXRoaXMubWF4aW11bVdpZHRoID0gbWF4aW11bVdpZHRoOwotCQljb250cm9sUmVzaXplZChvbGRNYXhpbXVtV2lkdGgsIG1heGltdW1XaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvYmplY3QKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJtYXhpbXVtV2lkdGg9Iik7Ci0JCXNiLmFwcGVuZChtYXhpbXVtV2lkdGgpOwotCQlzYi5hcHBlbmQoIiwgd3JhcHBlcnM9Iik7Ci0JCXNiLmFwcGVuZCh3cmFwcGVycyk7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzaXplIG9mIGV2ZXJ5IDxjb2RlPldyYXBwZXI8L2NvZGU+IGJhc2VkIG9uIHRoZSBtYXhpbXVtIHdpZHRoLgotCSAqCi0JICogQHBhcmFtIGZvcmNlUmV2YWxpZGF0ZSA8Y29kZT50cnVlPC9jb2RlPiB0byByZXZhbGlkYXRlIHRoZSB3cmFwcGVyJ3Mgc2l6ZQotCSAqIGV2ZW4gdGhvdWdoIGl0cyBjdXJyZW50IHNpemUgbWlnaHQgYmUgdGhlIHNhbWUgYXMgdGhlIG1heGltdW0gd2lkdGg7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG9ubHkgcmV2YWxpZGF0ZSB0aGUgd3JhcHBlcnMgd2l0aCBhIGRpZmZlcmVudCB3aWR0aAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVXcmFwcGVyU2l6ZShib29sZWFuIGZvcmNlUmV2YWxpZGF0ZSkgewotCi0JCWZvciAoV3JhcHBlciB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCVBvaW50IGNhY2hlZFNpemUgPSB3cmFwcGVyLmNhY2hlZFNpemUoKTsKLQotCQkJLy8gTm8gbmVlZCB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIHdyYXBwZXIgc2luY2UgaXQncyBhbHdheXMgdXNpbmcKLQkJCS8vIHRoZSBtYXhpbXVtIHdpZHRoCi0JCQlpZiAoZm9yY2VSZXZhbGlkYXRlIHx8IChjYWNoZWRTaXplLnggIT0gbWF4aW11bVdpZHRoKSkgewotCQkJCVBvaW50IHNpemUgPSBuZXcgUG9pbnQobWF4aW11bVdpZHRoLCBjYWNoZWRTaXplLnkpOwotCQkJCXdyYXBwZXIuc2V0U2l6ZShzaXplKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgPGNvZGU+V3JhcHBlcjwvY29kZT4gZW5jYXBzdWxhdGVzIGEge0BsaW5rIENvbnRyb2xBbGlnbmVyfS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRyb2xBbGlnbmVyV3JhcHBlciBpbXBsZW1lbnRzIFdyYXBwZXIgewotCQkvKioKLQkJICogVGhlIGNhY2hlZCBzaXplLCB3aGljaCBpcyB7QGxpbmsgQ29udHJvbEFsaWduZXIjbWF4aW11bVdpZHRofS4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgUG9pbnQgY2FjaGVkU2l6ZTsKLQotCQkvKioKLQkJICogVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBlbmNhcHN1bGF0ZWQgYnkgdGhpcwotCQkgKiA8Y29kZT5XcmFwcGVyPC9jb2RlPi4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXI7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbEFsaWduZXJXcmFwcGVyPC9jb2RlPiB0aGF0IGVuY2Fwc3VsYXRlcwotCQkgKiB0aGUgZ2l2ZW4gPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LgotCQkgKgotCQkgKiBAcGFyYW0gY29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZQotCQkgKiBlbmNhcHN1bGF0ZWQgYnkgdGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBDb250cm9sQWxpZ25lcldyYXBwZXIoQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbnRyb2xBbGlnbmVyID0gY29udHJvbEFsaWduZXI7Ci0JCQl0aGlzLmNhY2hlZFNpemUgICAgID0gbmV3IFBvaW50KGNvbnRyb2xBbGlnbmVyLm1heGltdW1XaWR0aCwgMCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJY29udHJvbEFsaWduZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIFBvaW50IGNhY2hlZFNpemUoKSB7Ci0JCQljYWNoZWRTaXplLnggPSBjb250cm9sQWxpZ25lci5tYXhpbXVtV2lkdGg7Ci0JCQlyZXR1cm4gY2FjaGVkU2l6ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBQb2ludCBjYWxjdWxhdGVTaXplKCkgewotCi0JCQlQb2ludCBzaXplID0gbmV3IFBvaW50KGNvbnRyb2xBbGlnbmVyLmNhbGN1bGF0ZVdpZHRoKGZhbHNlKSwgMCk7Ci0KLQkJCWlmIChzaXplLnggIT0gU1dULkRFRkFVTFQpIHsKLQkJCQljYWNoZWRTaXplLnggPSBzaXplLng7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljYWNoZWRTaXplLnggPSAwOwotCQkJfQotCi0JCQlpZiAoc2l6ZS55ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJY2FjaGVkU2l6ZS55ID0gc2l6ZS55OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY2FjaGVkU2l6ZS55ID0gMDsKLQkJCX0KLQotCQkJcmV0dXJuIHNpemU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBsb2NrZWQoKSB7Ci0JCQlyZXR1cm4gY29udHJvbEFsaWduZXIubG9ja2VkOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWNvbnRyb2xBbGlnbmVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCi0JCQlpZiAoc2l6ZSA9PSBERUZBVUxUX1NJWkUpIHsKLQkJCQljb250cm9sQWxpZ25lci5tYXhpbXVtV2lkdGggPSAwOwotCQkJfQotCQkJZWxzZSBpZiAoY29udHJvbEFsaWduZXIubWF4aW11bVdpZHRoICE9IHNpemUueCkgewotCQkJCWNvbnRyb2xBbGlnbmVyLm1heGltdW1XaWR0aCA9IHNpemUueDsKLQkJCQljb250cm9sQWxpZ25lci51cGRhdGVXcmFwcGVyU2l6ZSh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBPYmplY3Qgc291cmNlKCkgewotCQkJcmV0dXJuIGNvbnRyb2xBbGlnbmVyOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNiLmFwcGVuZCgiQ2FjaGVkIHNpemU9Iik7Ci0JCQlzYi5hcHBlbmQoY2FjaGVkU2l6ZSk7Ci0JCQlzYi5hcHBlbmQoIiwgQ29udHJvbEFsaWduZXI9Iik7Ci0JCQlzYi5hcHBlbmQoY29udHJvbEFsaWduZXIpOwotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBlbmNhcHN1bGF0ZXMgYSB7QGxpbmsgQ29udHJvbH0uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb250cm9sV3JhcHBlciBpbXBsZW1lbnRzIFdyYXBwZXIgewotCQkvKioKLQkJICogVGhlIGNhY2hlZCBzaXplLCB3aGljaCBpcyBjb250cm9sJ3Mgc2l6ZS4KLQkJICovCi0JCXByaXZhdGUgUG9pbnQgY2FjaGVkU2l6ZTsKLQotCQkvKioKLQkJICogVGhlIGNvbnRyb2wgdG8gYmUgZW5jYXBzdWxhdGVkIGJ5IHRoaXMgPGNvZGU+V3JhcHBlcjwvY29kZT4uCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIENvbnRyb2wgY29udHJvbDsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5jb250cm9sV3JhcHBlcjwvY29kZT4gdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGdpdmVuCi0JCSAqIGNvbnRyb2wuCi0JCSAqCi0JCSAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIHRvIGJlIGVuY2Fwc3VsYXRlZCBieSB0aGlzIDxjb2RlPldyYXBwZXI8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIENvbnRyb2xXcmFwcGVyKENvbnRyb2wgY29udHJvbCkgewotCQkJc3VwZXIoKTsKLQotCQkJdGhpcy5jb250cm9sICAgID0gY29udHJvbDsKLQkJCXRoaXMuY2FjaGVkU2l6ZSA9IG5ldyBQb2ludCgwLCAwKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJCWZvciAoaW50IGV2ZW50VHlwZSA6IEVWRU5UX1RZUEVTKSB7Ci0JCQkJY29udHJvbC5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBQb2ludCBjYWNoZWRTaXplKCkgewotCQkJcmV0dXJuIGNhY2hlZFNpemU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgUG9pbnQgY2FsY3VsYXRlU2l6ZSgpIHsKLQotCQkJY2FjaGVkU2l6ZSA9IGNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQotCQkJLy8gVXBkYXRlIHJpZ2h0IGF3YXkgdGhlIGNvbnRyb2wncyBHcmlkRGF0YQotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpOwotCi0JCQlpZiAoZ3JpZERhdGEgPT0gbnVsbCkgewotCQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJfQotCi0JCQlncmlkRGF0YS53aWR0aEhpbnQgID0gY2FjaGVkU2l6ZS54OwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGNhY2hlZFNpemUueTsKLQotCQkJLy8gTWFrZSBzdXJlIHRoZSBzaXplIGlzIG5vdCAtMQotCQkJaWYgKGNhY2hlZFNpemUueCA9PSBTV1QuREVGQVVMVCkgewotCQkJCWNhY2hlZFNpemUueCA9IDA7Ci0JCQl9Ci0KLQkJCWlmIChjYWNoZWRTaXplLnkgPT0gU1dULkRFRkFVTFQpIHsKLQkJCQljYWNoZWRTaXplLnkgPSAwOwotCQkJfQotCi0JCQlyZXR1cm4gY2FjaGVkU2l6ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGxvY2tlZCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJCWZvciAoaW50IGV2ZW50VHlwZSA6IEVWRU5UX1RZUEVTKSB7Ci0JCQkJY29udHJvbC5yZW1vdmVMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCi0JCQlpZiAoY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIFVwZGF0ZSB0aGUgR3JpZERhdGEgd2l0aCB0aGUgbmV3IHNpemUKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBjb250cm9sLmdldExheW91dERhdGEoKTsKLQotCQkJaWYgKGdyaWREYXRhID09IG51bGwpIHsKLQkJCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCX0KLQotCQkJZ3JpZERhdGEud2lkdGhIaW50ICA9IHNpemUueDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSBzaXplLnk7Ci0KLQkJCS8vIEZvcmNlIHRoZSBjb250cm9sIHRvIGJlIHJlc2l6ZWQsIGFuZCB0ZWxsIGl0cyBwYXJlbnQgdG8gbGF5b3V0Ci0JCQkvLyBpdHMgd2lkZ2V0cwotCQkJaWYgKHNpemUueCA+IDApIHsKLS8vCQkJCWxvY2tlZCA9IHRydWU7Ci0vLwkJCQl0cnkgIHsKLS8vLy8JCQkJCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KG5ldyBDb250cm9sW10geyBjb250cm9sIH0pOwotLy8JCQkJCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotLy8JCQkJfQotLy8JCQkJZmluYWxseSB7Ci0vLwkJCQkJbG9ja2VkID0gZmFsc2U7Ci0vLwkJCQl9Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNvbnRyb2wuZ2V0Qm91bmRzKCk7Ci0KLQkJCQkvLyBPbmx5IHVwZGF0ZSB0aGUgY29udHJvbCdzIHdpZHRoIGlmIGl0J3MKLQkJCQkvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzaXplCi0JCQkJaWYgKGJvdW5kcy53aWR0aCAhPSBzaXplLngpIHsKLQkJCQkJbG9ja2VkID0gdHJ1ZTsKLQotCQkJCQl0cnkgewotLy8JCQkJCQljb250cm9sLnNldEJvdW5kcyhib3VuZHMueCwgYm91bmRzLnksIHNpemUueCwgc2l6ZS55KTsKLQkJCQkJCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkKLQkJCQkJewotCQkJCQkJbG9ja2VkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgQ29udHJvbCBzb3VyY2UoKSB7Ci0JCQlyZXR1cm4gY29udHJvbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzYi5hcHBlbmQoIkNhY2hlZCBzaXplPSIpOwotCQkJc2IuYXBwZW5kKGNhY2hlZFNpemUpOwotCQkJc2IuYXBwZW5kKCIsIENvbnRyb2w9Iik7Ci0JCQlzYi5hcHBlbmQoY29udHJvbCk7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgYWRkZWQgdG8gZWFjaCBvZiB0aGUgY29udHJvbCB0aGF0IGlzIG5vdGlmaWVkIGluIG9yZGVyIHRvCi0JICogcmV2YWxpZGF0ZSB0aGUgcHJlZmVycmVkIHNpemUuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMaXN0ZW5lckhhbmRsZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlDb250cm9sQWxpZ25lci50aGlzLnJldmFsaWRhdGUoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBoZWxwcyB0byBlbmNhcHN1bGF0ZSBoZXRlcm9nZW5lb3VzIG9iamVjdHMgYW5kCi0JICogYXBwbHkgdGhlIHNhbWUgYmVoYXZpb3Igb24gdGhlbS4KLQkgKi8KLQlwcml2YXRlIGludGVyZmFjZSBXcmFwcGVyIHsKLQkgICAvKioKLQkJICogQWRkcyB0aGUgZ2l2ZW4gPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIHdyYXBwZWQgb2JqZWN0IGluIG9yZGVyIHRvCi0JCSAqIHJlY2VpdmUgbm90aWZpY2F0aW9uIHdoZW4gaXRzIHByb3BlcnR5IGNoYW5nZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIGJlIGFkZGVkCi0JCSAqLwotCQl2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgY2FjaGVkIHNpemUgb2YgdGhlIGVuY2Fwc3VsYXRlZCBzb3VyY2UuCi0JCSAqCi0JCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gPGNvZGU+UG9pbnQ8L2NvZGU+IHdoZXJlIHRoZSB4IGlzIHRoZQotCQkgKiB3aWR0aCBhbmQgdGhlIHkgaXMgdGhlIGhlaWdodCBvZiB0aGUgd2lkZ2V0Ci0JCSAqLwotCQlQb2ludCBjYWNoZWRTaXplKCk7Ci0KLQkJLyoqCi0JCSAqIENhbGN1bGF0ZXMgdGhlIHByZWZlcnJlZCBzaXplIHRoZSB3cmFwcGVkIG9iamVjdCB3b3VsZCB0YWtlIGJ5IGl0c2VsZi4KLQkJICoKLQkJICogQHJldHVybiBUaGUgY2FsY3VsYXRlZCBzaXplCi0JCSAqLwotCQlQb2ludCBjYWxjdWxhdGVTaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiB3aGVuIHJlY2FsY3VsYXRpbmcgdGhlIHByZWZlcnJlZCB3aWR0aC4KLQkJICogVGhpcyBoYXBwZW5zIGluIGFuIGhpZXJhcmNoeSBvZiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT5zLgotCQkgKgotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIHByZXZlbnQgdGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBmcm9tCi0JCSAqIGJlaW5nIGludmFsaWRhdGVkOyBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JCSAqLwotCQlib29sZWFuIGxvY2tlZCgpOwotCi0JCS8qKgotCQkgKiBSZW1vdmVzIHRoZSBnaXZlbiA8Y29kZT5MaXN0ZW5lcjwvY29kZT4uCi0JCSAqCi0JCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIGJlIHJlbW92ZWQKLQkJICovCi0JCXZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBzaXplIG9uIHRoZSBlbmNhcHN1bGF0ZWQgc291cmNlLgotCQkgKgotCQkgKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IHNpemUKLQkJICovCi0JCXZvaWQgc2V0U2l6ZShQb2ludCBzaXplKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgZW5jYXBzdWxhdGVkIG9iamVjdC4KLQkJICoKLQkJICogQHJldHVybiBUaGUgb2JqZWN0IHRoYXQgaXMgYmVlbiB3cmFwcGVkCi0JCSAqLwotCQlPYmplY3Qgc291cmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvQ29udHJvbEVuYWJsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvQ29udHJvbEVuYWJsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyOTE4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5Db250cm9sRW5hYmxlcjwvY29kZT4ga2VlcHMgdGhlICJlbmFibGVkIiBzdGF0ZSBvZiBhIGNvbGxlY3Rpb24gb2YKLSAqIGNvbnRyb2xzIGluIHN5bmNoIHdpdGggdGhlIHByb3ZpZGVkIGJvb2xlYW4gaG9sZGVyLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEVuYWJsZXIgZXh0ZW5kcyBTdGF0ZUNvbnRyb2xsZXIKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbHMgVGhlIGNvbGxlY3Rpb24gb2YgY29udHJvbHMgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzCi0JICoga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9scywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbEVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xzIFRoZSBjb2xsZWN0aW9uIG9mIGNvbnRyb2xzIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcwotCSAqIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb250cm9sRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMsCi0JICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9scy5pdGVyYXRvcigpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbEVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIGRpc2FibGVkKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcwotCSAqIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIENvbnRyb2xFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNvbnRyb2wpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIGNvbnRyb2wsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbHMgVGhlIGNvbGxlY3Rpb24gb2YgY29udHJvbHMgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzCi0JICoga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wuLi4gY29udHJvbHMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihjb250cm9scyksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcwotCSAqIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb250cm9sRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKGNvbnRyb2wpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db250cm9sRW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbHMgVGhlIGNvbGxlY3Rpb24gb2YgY29udHJvbHMgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzCi0JICoga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIENvbnRyb2xFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sW10gY29udHJvbHMsCi0JICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoY29udHJvbHMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbEVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIGRpc2FibGVkKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9scyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZiBjb250cm9scyB3aG9zZQotCSAqICJlbmFibGVkIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBDb250cm9sRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9scywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbEVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mIGNvbnRyb2xzIHdob3NlCi0JICogImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb250cm9sRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzLAotCSAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXN1cGVyKGJvb2xlYW5Ib2xkZXIsIHdyYXAoY29udHJvbHMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248SUNvbnRyb2xIb2xkZXI+IHdyYXAoSXRlcmF0b3I8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxDb250cm9sLCBJQ29udHJvbEhvbGRlcj4oY29udHJvbHMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElDb250cm9sSG9sZGVyIHRyYW5zZm9ybShDb250cm9sIGNvbnRyb2wpIHsKLQkJCQlyZXR1cm4gbmV3IENvbnRyb2xIb2xkZXIoY29udHJvbCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaG9sZGVyIGhvbGRzIG9udG8gYSA8Y29kZT5Db250cm9sPC9jb2RlPiBhbmQgdXBkYXRlIGl0cyBlbmFibGVkIHN0YXRlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRyb2xIb2xkZXIgaW1wbGVtZW50cyBJQ29udHJvbEhvbGRlciB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBDb250cm9sIGNvbnRyb2w7Ci0KLQkJQ29udHJvbEhvbGRlcihDb250cm9sIGNvbnRyb2wpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlU3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotCQkJaWYgKCF0aGlzLmNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJdGhpcy5jb250cm9sLnNldEVuYWJsZWQoc3RhdGUpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xTd2l0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWZiNzdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIFRoaXMgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSB0byBzd2l0Y2ggdGhlIGFjdGl2ZSBwYWdlIGJhc2VkIG9uIGEgdmFsdWUuIEEKLSAqIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiBpcyB1c2VkIHRvIHRyYW5zZm9ybWVkIHRoYXQgdmFsdWUgaW50byBhCi0gKiA8Y29kZT5Db250cm9sPC9jb2RlPi4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xTd2l0Y2hlcgotewotCS8qKgotCSAqIFRoZSB3aWRnZXQgdGhhdCBpcyB1c2VkIHRvIHNob3cgdGhlIGFjdGl2ZSA8Y29kZT5Db250cm9sPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgaW50byBhCi0JICogPGNvZGU+Q29udHJvbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjw/LCBDb250cm9sPiBwYW5lVHJhbnNmb3JtZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xTd2l0Y2hlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3dpdGNoSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJldHJpZXZlCi0JICogdGhlIHJpZ2h0IDxjb2RlPkNvbnRyb2w8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIHRoZSBnaXZlbiB0cmFuc2Zvcm1lcgotCSAqIEBwYXJhbSBwYW5lVHJhbnNmb3JtZXIgVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgaW50byBhCi0JICogPGNvZGU+Q29udHJvbDwvY29kZT4KLQkgKiBAcGFyYW0gcGFnZUJvb2sgVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUKLQkgKiBpbnRvIGEgPGNvZGU+Q29udHJvbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgPFQ+IENvbnRyb2xTd2l0Y2hlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN3aXRjaEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lcjxULCBDb250cm9sPiBwYW5lVHJhbnNmb3JtZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZUJvb2sgcGFnZUJvb2spCi0JewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKHN3aXRjaEhvbGRlciwgcGFuZVRyYW5zZm9ybWVyLCBwYWdlQm9vayk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCWJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJc3dpdGNoUGFuZXMoZS5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIDxjb2RlPkNvbnRyb2xTd2l0Y2hlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3dpdGNoSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJldHJpZXZlCi0JICogdGhlIHJpZ2h0IDxjb2RlPkNvbnRyb2w8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIHRoZSBnaXZlbiB0cmFuc2Zvcm1lcgotCSAqIEBwYXJhbSBwYW5lVHJhbnNmb3JtZXIgVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgaW50byBhCi0JICogPGNvZGU+Q29udHJvbDwvY29kZT4KLQkgKiBAcGFyYW0gcGFnZUJvb2sgVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUKLQkgKiBpbnRvIGEgPGNvZGU+Q29udHJvbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc3dpdGNoSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyPD8sIENvbnRyb2w+IHBhbmVUcmFuc2Zvcm1lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQYWdlQm9vayBwYWdlQm9vaykKLQl7Ci0JCXRoaXMucGFnZUJvb2sgICAgICAgID0gcGFnZUJvb2s7Ci0JCXRoaXMucGFuZVRyYW5zZm9ybWVyID0gcGFuZVRyYW5zZm9ybWVyOwotCi0JCXN3aXRjaEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKLQkJKTsKLQotCQlzd2l0Y2hQYW5lcyhzd2l0Y2hIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogU3dpdGNoZXMgdGhlIGFjdGl2ZSBwYWdlIGJ5IHRyYW5zZm9ybWluZyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBpdHMKLQkgKiBjb3JyZXNwb25kaW5nIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgdHJhbnNmb3JtZXIgaW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlCi0JICogbmV3IHBhbmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3dpdGNoUGFuZXMoT2JqZWN0IHZhbHVlKSB7Ci0KLQkJaWYgKHBhZ2VCb29rLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gUmV0cmlldmUgdGhlIENvbnRyb2wgZm9yIHRoZSBuZXcgdmFsdWUKLQkJQ29udHJvbCBwYW5lID0gdHJhbnNmb3JtKHZhbHVlKTsKLQkJYm9vbGVhbiB2aXNpYmxlID0gKHBhbmUgIT0gbnVsbCk7Ci0KLQkJLy8gU2hvdyB0aGUgbmV3IHBhZ2UKLQkJaWYgKHZpc2libGUpIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKHBhbmUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTm90ZTogV2UgY2FuJ3QgbnVsbCBkdWUgdG8gYSBidWcgaW4gUGFnZUJvb2sKLQkJCXBhZ2VCb29rLnNob3dQYWdlKG5ldyBMYWJlbChwYWdlQm9vaywgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKSk7Ci0JCX0KLQotCQlpZiAocGFnZUJvb2suaXNWaXNpYmxlKCkgIT0gdmlzaWJsZSkgewotCQkJcGFnZUJvb2suc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJfQotCi0JCS8vIFJldmFsaWRhdGUgdGhlIHBhcmVudHMgaW4gb3JkZXIgdG8gdXBkYXRlIHRoZSBsYXlvdXQKLQkJU1dUVXRpbC5yZWZsb3cocGFnZUJvb2spOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgQ29udHJvbCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiAoKFRyYW5zZm9ybWVyPE9iamVjdCwgQ29udHJvbD4pIHBhbmVUcmFuc2Zvcm1lcikudHJhbnNmb3JtKHZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvQ29udHJvbFZpc2liaWxpdHlFbmFibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGFiNmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIFRoaXMgPGNvZGU+Q29udHJvbFZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiBrZWVwcyB0aGUgInZpc2libGUiIHN0YXRlIG9mIGEKLSAqIGNvbGxlY3Rpb24gb2YgY29udHJvbHMgaW4gc3luY2ggd2l0aCB0aGUgcHJvdmlkZWQgYm9vbGVhbiBob2xkZXIuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sVmlzaWJpbGl0eUVuYWJsZXIgZXh0ZW5kcyBTdGF0ZUNvbnRyb2xsZXIKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUKLQkgKiBvZiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gbm90IHZpc2libGUpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xzIFRoZSBjb2xsZWN0aW9uIG9mIGNvbnRyb2xzIHdob3NlICJ2aXNpYmxlIiBzdGF0ZSBpcwotCSAqIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9scywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbFZpc2liaWxpdHlFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9scyBUaGUgY29sbGVjdGlvbiBvZiBjb250cm9scyB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMKLQkgKiBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbFZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgY29udHJvbHMuaXRlcmF0b3IoKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gbm90IHZpc2libGUpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzCi0JICoga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgQ29udHJvbFZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjb250cm9sKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9sLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db250cm9sVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIG5vdCB2aXNpYmxlKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9scyBUaGUgY29sbGVjdGlvbiBvZiBjb250cm9scyB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMKLQkgKiBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBDb250cm9sVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sLi4uIGNvbnRyb2xzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoY29udHJvbHMpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db250cm9sVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZQotCSAqIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3IoY29udHJvbCksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbHMgVGhlIGNvbGxlY3Rpb24gb2YgY29udHJvbHMgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQKLQkgKiBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xbXSBjb250cm9scywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoY29udHJvbHMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbFZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZQotCSAqIG9mIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBub3QgdmlzaWJsZSkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbHMgQW4gaXRlcmF0b3Igb24gdGhlIGNvbGxlY3Rpb24gb2YgY29udHJvbHMgd2hvc2UgInZpc2libGUiCi0JICogc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgQ29udHJvbFZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9scywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbFZpc2liaWxpdHlFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9scyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZiBjb250cm9scyB3aG9zZSAidmlzaWJsZSIKLQkgKiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbFZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQlzdXBlcihib29sZWFuSG9sZGVyLCB3cmFwKGNvbnRyb2xzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPElDb250cm9sSG9sZGVyPiB3cmFwKEl0ZXJhdG9yPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Q29udHJvbCwgSUNvbnRyb2xIb2xkZXI+KGNvbnRyb2xzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJQ29udHJvbEhvbGRlciB0cmFuc2Zvcm0oQ29udHJvbCBjb250cm9sKSB7Ci0JCQkJcmV0dXJuIG5ldyBDb250cm9sSG9sZGVyKGNvbnRyb2wpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhvbGRlciBob2xkcyBvbnRvIGEgPGNvZGU+Q29udHJvbDwvY29kZT4gYW5kIHVwZGF0ZSBpdHMgdmlzaWJsZSBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250cm9sSG9sZGVyIGltcGxlbWVudHMgSUNvbnRyb2xIb2xkZXIgewotCQlwcml2YXRlIGZpbmFsIENvbnRyb2wgY29udHJvbDsKLQotCQlDb250cm9sSG9sZGVyKENvbnRyb2wgY29udHJvbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29udHJvbCA9IGNvbnRyb2w7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZShib29sZWFuIHN0YXRlKSB7Ci0JCQlpZiAoIXRoaXMuY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQl0aGlzLmNvbnRyb2wuc2V0VmlzaWJsZShzdGF0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmViYjMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLQotLyoqCi0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+TGFiZWxlZENvbnRyb2w8L2NvZGU+IHRoYXQgdXBkYXRlcyBhCi0gKiA8Y29kZT5CdXR0b248L2NvZGU+IHdoZW4gcmVxdWlyZWQuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRCdXR0b24gaW1wbGVtZW50cyBMYWJlbGVkQ29udHJvbAotewotCS8qKgotCSAqIFRoZSBidXR0b24gdG8gYmUgdXBkYXRlZCB3aXRoIGEgZGlmZmVyZW50IGljb24gYW5kIHRleHQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBCdXR0b24gYnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5MYWJlbGVkQnV0dG9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiB0aGF0IHdpbGwgaGF2ZSBpdHMgdGV4dCBhbmQgaWNvbiB1cGRhdGVkIHdoZW4KLQkgKiByZXF1aXJlZAotCSAqIEBleGNlcHRpb24gQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIElmIHRoZSBnaXZlbiA8Y29kZT5CdXR0b248L2NvZGU+IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGFiZWxlZEJ1dHRvbihCdXR0b24gYnV0dG9uKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChidXR0b24sICJUaGUgYnV0dG9uIGNhbm5vdCBiZSBudWxsIik7Ci0JCXRoaXMuYnV0dG9uID0gYnV0dG9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCWlmICghdGhpcy5idXR0b24uaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCQl0aGlzLmJ1dHRvbi5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICghdGhpcy5idXR0b24uaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQkJdGhpcy5idXR0b24uZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTk3MTZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5MYWJlbGVkQ29udHJvbDwvY29kZT4gaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSBhIHdpZGdldCBhbmQgdXBkYXRlCi0gKiBpdHMgcHJvcGVydGllcyAoaWNvbiBhbmQgdGV4dCkuCi0gKgotICogQHNlZSBMYWJlbGVkQnV0dG9uCi0gKiBAc2VlIExhYmVsZWRMYWJlbAotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExhYmVsZWRDb250cm9sIHsKLQkvKioKLQkgKiBQYXNzZXMgdGhlIGltYWdlIHNvIHRoZSB3cmFwcGVkIGNvbXBvbmVudCBjYW4gcmVjZWl2ZSBpdC4KLQkgKgotCSAqIEBwYXJhbSBpbWFnZSBUaGUgbmV3IDxjb2RlPkltYWdlPC9jb2RlPgotCSAqLwotCXZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpOwotCi0JLyoqCi0JICogUGFzc2VzIHRoZSB0ZXh0IHNvIHRoZSB3cmFwcGVkIGNvbXBvbmVudCBjYW4gcmVjZWl2ZSBpdC4KLQkgKgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBuZXcgdGV4dAotCSAqLwotCXZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbFVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzMzNhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGhpcyB1cGRhdGVyIGlzIHJlc3BvbnNpYmxlIHRvIHVwZGF0ZSB0aGUgPGNvZGU+TGFiZWxlZENvbnRyb2w8L2NvZGU+IHdoZW4KLSAqIHRoZSB0ZXh0IGFuZCB0aGUgaWNvbiBuZWVkIHRvIGNoYW5nZS4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZENvbnRyb2xVcGRhdGVyIHsKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVyIGFyb3VuZCBhIGNvbnRyb2wgdGhhdCBoYXMgdGV4dCBhbmQgaWNvbi4KLQkgKi8KLQlwcml2YXRlIExhYmVsZWRDb250cm9sIGxhYmVsZWRDb250cm9sOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5MYWJlbGVkQ29udHJvbFVwZGF0ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGxhYmVsZWRDb250cm9sIFRoZSB3cmFwcGVyIGFyb3VuZCB0aGUgY29udHJvbCB0aGF0IG5lZWRzIHRvCi0JICogaGF2ZSBpdHMgdGV4dCB1cGRhdGVkCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciB0aGlzIGNsYXNzIHdpbGwgbGlzdGVuIGZvciBjaGFuZ2VzCi0JICovCi0JcHVibGljIExhYmVsZWRDb250cm9sVXBkYXRlcihMYWJlbGVkQ29udHJvbCBsYWJlbGVkQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIpCi0JewotCQl0aGlzKGxhYmVsZWRDb250cm9sLCB0ZXh0SG9sZGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxhYmVsZWRDb250cm9sVXBkYXRlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbGFiZWxlZENvbnRyb2wgVGhlIHdyYXBwZXIgYXJvdW5kIHRoZSBjb250cm9sIHRoYXQgbmVlZHMgdG8KLQkgKiBoYXZlIGl0cyBpbWFnZSBhbmQgdGV4dCB1cGRhdGVkCi0JICogQHBhcmFtIGltYWdlSG9sZGVyIFRoZSBob2xkZXIgdGhpcyBjbGFzcyB3aWxsIGxpc3RlbiBmb3IgY2hhbmdlcyBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB0ZXh0IG5ldmVyIGNoYW5nZXMKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIHRoaXMgY2xhc3Mgd2lsbCBsaXN0ZW4gZm9yIGNoYW5nZXMgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW1hZ2UgbmV2ZXIgY2hhbmdlcwotCSAqLwotCXB1YmxpYyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoTGFiZWxlZENvbnRyb2wgbGFiZWxlZENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZUhvbGRlcikKLQl7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUobGFiZWxlZENvbnRyb2wsIHRleHRIb2xkZXIsIGltYWdlSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJY29uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoYnVpbGRJY29uTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEljb25MaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlMYWJlbGVkQ29udHJvbFVwZGF0ZXIudGhpcy5zZXRJbWFnZSgoSW1hZ2UpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkxhYmVsZWRDb250cm9sVXBkYXRlci5pbWFnZUxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXh0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoYnVpbGRUZXh0TGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRleHRMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlMYWJlbGVkQ29udHJvbFVwZGF0ZXIudGhpcy5zZXRUZXh0KChTdHJpbmcpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkxhYmVsZWRDb250cm9sVXBkYXRlci50ZXh0TGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKExhYmVsZWRDb250cm9sIGxhYmVsZWRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZUhvbGRlcikKLQl7Ci0JCUFzc2VydC5pc05vdE51bGwobGFiZWxlZENvbnRyb2wsICJUaGUgTGFiZWxlZENvbnRyb2wgY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLmxhYmVsZWRDb250cm9sID0gbGFiZWxlZENvbnRyb2w7Ci0KLQkJaWYgKHRleHRIb2xkZXIgIT0gbnVsbCkgewotCQkJdGV4dEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVpbGRUZXh0TGlzdGVuZXIoKSk7Ci0JCQlzZXRUZXh0KHRleHRIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQotCQlpZiAoaW1hZ2VIb2xkZXIgIT0gbnVsbCkgewotCQkJaW1hZ2VIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1aWxkSWNvbkxpc3RlbmVyKCkpOwotCQkJc2V0SW1hZ2UoaW1hZ2VIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaWNvbikgewotCQlsYWJlbGVkQ29udHJvbC5zZXRJbWFnZShpY29uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCi0JCWlmICh0ZXh0ID09IG51bGwpIHsKLQkJCXRleHQgPSAiIjsKLQkJfQotCi0JCWxhYmVsZWRDb250cm9sLnNldFRleHQodGV4dCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDQwMzBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkxhYmVsZWRDb250cm9sPC9jb2RlPiB0aGF0IHVwZGF0ZXMgYW4KLSAqIDxjb2RlPkxhYmVsPC9jb2RlPiB3aGVuIHJlcXVpcmVkLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYWJlbGVkTGFiZWwgaW1wbGVtZW50cyBMYWJlbGVkQ29udHJvbAotewotCS8qKgotCSAqIFRoZSBsYWJlbCB0byBiZSB1cGRhdGVkIHdpdGggYSBkaWZmZXJlbnQgaWNvbiBhbmQgdGV4dC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExhYmVsIGxhYmVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5MYWJlbGVkQnV0dG9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdGhhdCB3aWxsIGhhdmUgaXRzIHRleHQgYW5kIGljb24gdXBkYXRlZCB3aGVuCi0JICogcmVxdWlyZWQKLQkgKiBAZXhjZXB0aW9uIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBJZiB0aGUgZ2l2ZW4gPGNvZGU+TGFiZWw8L2NvZGU+IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGFiZWxlZExhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChsYWJlbCwgIlRoZSBsYWJlbCBjYW5ub3QgYmUgbnVsbCIpOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJaWYgKCF0aGlzLmxhYmVsLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5sYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0JCQl0aGlzLmxhYmVsLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKCF0aGlzLmxhYmVsLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5sYWJlbC5zZXRUZXh0KHRleHQpOwotCQkJdGhpcy5sYWJlbC5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjg1YjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5QYW5lRW5hYmxlcjwvY29kZT4ga2VlcHMgdGhlICJlbmFibGVkIiBzdGF0ZSBvZiBhIGNvbGxlY3Rpb24gb2YKLSAqIGNvbnRyb2xzIGluIHN5bmNoIHdpdGggdGhlIHByb3ZpZGVkIGJvb2xlYW4gaG9sZGVyLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUGFuZUVuYWJsZXIgZXh0ZW5kcyBTdGF0ZUNvbnRyb2xsZXIKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlCi0JICogYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQYW5lPD8+IHBhbmUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGFuZTw/Pi4uLiBwYW5lcykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24ocGFuZXMpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lRW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlCi0JICogYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGFuZTw/PiBwYW5lLAotCSAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKHBhbmUpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lRW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBhbmU8Pz5bXSBwYW5lcywKLQkgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihwYW5lcyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSnBhQ29udHJvbGxlckVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlCi0JICogb2YqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSnBhQ29udHJvbGxlckVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIFRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMKLQkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWJzdHJhY3RQYW5lPD8+PiBwYW5lcywKLQkgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLml0ZXJhdG9yKCksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSnBhQ29udHJvbGxlckVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIGRpc2FibGVkKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAiZW5hYmxlZCIgc3RhdGUKLQkgKiBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSnBhQ29udHJvbGxlckVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJlbmFibGVkIiBzdGF0ZQotCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMsCi0JICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJc3VwZXIoYm9vbGVhbkhvbGRlciwgd3JhcChwYW5lcyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxJQ29udHJvbEhvbGRlcj4gd3JhcChJdGVyYXRvcjw/IGV4dGVuZHMgQWJzdHJhY3RQYW5lPD8+PiBwYW5lcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8QWJzdHJhY3RQYW5lPD8+LCBJQ29udHJvbEhvbGRlcj4ocGFuZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElDb250cm9sSG9sZGVyIHRyYW5zZm9ybShBYnN0cmFjdFBhbmU8Pz4gcGFuZSkgewotCQkJCXJldHVybiBuZXcgUGFuZUhvbGRlcihwYW5lKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBob2xkZXIgaG9sZHMgb250byBhbiA8Y29kZT5BYnN0cmFjdFBhbmU8L2NvZGU+IGFuZCB1cGRhdGUgaXRzIGVuYWJsZWQKLQkgKiBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYW5lSG9sZGVyIGltcGxlbWVudHMgSUNvbnRyb2xIb2xkZXIgewotCQlwcml2YXRlIGZpbmFsIEFic3RyYWN0UGFuZTw/PiBwYW5lOwotCi0JCVBhbmVIb2xkZXIoQWJzdHJhY3RQYW5lPD8+IHBhbmUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBhbmUgPSBwYW5lOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlU3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotCi0JCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy5wYW5lLmdldENvbnRyb2woKTsKLQotCQkJaWYgKCFjb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0KLQkJCQkvLyBSZW1vdmUgdGhlIGVuYWJsZW1lbnQgZnJvbSB0aGUgcGFuZSdzIGNvbnRyb2wgc2luY2UgdGhpcyBlbmFibGVyCi0JCQkJLy8gaXMgcmVzcG9uc2libGUgdG8gbWFuYWdlIGl0cyBlbmFibGVtZW50IHN0YXRlCi0JCQkJYm9vbGVhbiBlbmFibGVtZW50TWFuYWdlZCA9IHRoaXMucGFuZS5pc0VuYWJsZW1lbnRNYW5hZ2VkKGNvbnRhaW5lcik7Ci0JCQkJdGhpcy5wYW5lLmFkZFRvRW5hYmxlbWVudENvbnRyb2woY29udGFpbmVyKTsKLQotCQkJCS8vIE5vdyB3ZSBjYW4gY2hhbmdlIHRoZSBlbmFibGVtZW50IHN0YXRlIG9mIHRoZSBwYW5lJ3Mgd2lkZ2V0cwotCQkJCXRoaXMucGFuZS5lbmFibGVXaWRnZXRzKHN0YXRlKTsKLQotCQkJCS8vIFJlc3RvcmUgdGhlIGVuYWJsZW1lbnQgc3RhdGUKLQkJCQlpZiAoZW5hYmxlbWVudE1hbmFnZWQpIHsKLQkJCQkJdGhpcy5wYW5lLnJlbW92ZUZyb21FbmFibGVtZW50Q29udHJvbChjb250YWluZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVlNzU4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+IGtlZXBzIHRoZSAidmlzaWJsZSIgc3RhdGUgb2YgYQotICogY29sbGVjdGlvbiBvZiBjb250cm9scyBpbiBzeW5jaCB3aXRoIHRoZSBwcm92aWRlZCBib29sZWFuIGhvbGRlci4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFBhbmVWaXNpYmlsaXR5RW5hYmxlciBleHRlbmRzIFN0YXRlQ29udHJvbGxlcgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBub3QgdmlzaWJsZSkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlCi0JICogYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBhbmU8Pz4gcGFuZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBub3QgdmlzaWJsZSkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQYW5lPD8+Li4uIHBhbmVzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihwYW5lcyksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlCi0JICogYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQYW5lPD8+IHBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKHBhbmUpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIFRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJ2aXNpYmxlIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMKLQkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBhbmU8Pz5bXSBwYW5lcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IocGFuZXMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBub3QgdmlzaWJsZSkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWJzdHJhY3RQYW5lPD8+PiBwYW5lcykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZXMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZXMuaXRlcmF0b3IoKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gbm90IHZpc2libGUpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJ2aXNpYmxlIiBzdGF0ZQotCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBBYnN0cmFjdFBhbmU8Pz4+IHBhbmVzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lcywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAidmlzaWJsZSIgc3RhdGUKLQkgKiBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXN1cGVyKGJvb2xlYW5Ib2xkZXIsIHdyYXAocGFuZXMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248SUNvbnRyb2xIb2xkZXI+IHdyYXAoSXRlcmF0b3I8PyBleHRlbmRzIEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEFic3RyYWN0UGFuZTw/PiwgSUNvbnRyb2xIb2xkZXI+KHBhbmVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJQ29udHJvbEhvbGRlciB0cmFuc2Zvcm0oQWJzdHJhY3RQYW5lPD8+IHBhbmUpIHsKLQkJCQlyZXR1cm4gbmV3IFBhbmVIb2xkZXIocGFuZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaG9sZGVyIGhvbGRzIG9udG8gYW4gPGNvZGU+QWJzdHJhY3RQYW5lPC9jb2RlPiBhbmQgdXBkYXRlIGl0cyB2aXNpYmxlCi0JICogc3RhdGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFuZUhvbGRlciBpbXBsZW1lbnRzIElDb250cm9sSG9sZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFBhbmU8Pz4gcGFuZTsKLQotCQlQYW5lSG9sZGVyKEFic3RyYWN0UGFuZTw/PiBwYW5lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYW5lID0gcGFuZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlKGJvb2xlYW4gc3RhdGUpIHsKLQkJCXRoaXMucGFuZS5zZXRWaXNpYmxlKHN0YXRlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvU1dUVXRpbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9TV1RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWZhMDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuTnVsbFBvc3RFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotCi0vKioKLSAqIEEgc3VpdGUgb2YgdXRpbGl0eSBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIHVzZXIgaW50ZXJmYWNlLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQotCS8qKgotCSAqIENhdXNlcyB0aGUgPGNvZGU+cnVuKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgZ2l2ZW4gcnVubmFibGUgdG8gYmUgaW52b2tlZAotCSAqIGJ5IHRoZSB1c2VyLWludGVyZmFjZSB0aHJlYWQgYXQgdGhlIG5leHQgcmVhc29uYWJsZSBvcHBvcnR1bml0eS4gVGhlIGNhbGxlcgotCSAqIG9mIHRoaXMgbWV0aG9kIGNvbnRpbnVlcyB0byBydW4gaW4gcGFyYWxsZWwsIGFuZCBpcyBub3Qgbm90aWZpZWQgd2hlbiB0aGUKLQkgKiBydW5uYWJsZSBoYXMgY29tcGxldGVkLgotCSAqCi0JICogQHBhcmFtIHJ1bm5hYmxlIENvZGUgdG8gcnVuIG9uIHRoZSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkgKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24KLQkgKiA8dWw+Ci0JICogPGxpPkVSUk9SX0RFVklDRV9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0JICogPC91bD4KLQkgKiBAc2VlICNzeW5jRXhlYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKLQkJZ2V0U3RhbmRhcmREaXNwbGF5KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBUd2Vha3MgdGhlIGdpdmVuIDxjb2RlPkNDb21ibzwvY29kZT4gdG8gcmVtb3ZlIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlCi0JICogd2lkZ2V0IHJlY2VpdmVzIHRoZSBmb2N1cyBhbmQgdG8gc2hvdyB0aGUgZGVmYXVsdCB3aGVuIHRoZSB3aWRnZXQgbG9zZXMKLQkgKiB0aGUgZm9jdXMuCi0JICoKLQkgKiBAcGFyYW0gY29tYm8gVGhlIHdpZGdldCBoYXZpbmcgYSBkZWZhdWx0IHZhbHVlIHRoYXQgaXMgYWx3YXlzIGF0IHRoZQotCSAqIGJlZ2lubmluZyBvZiB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKENDb21ibyBjb21ibykgewotCQlDQ29tYm9IYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ0NvbWJvSGFuZGxlcigpOwotCQljb21iby5hZGRGb2N1c0xpc3RlbmVyKGhhbmRsZXIpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihoYW5kbGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUd2Vha3MgdGhlIGdpdmVuIDxjb2RlPkNvbWJvPC9jb2RlPiB0byByZW1vdmUgdGhlIGRlZmF1bHQgdmFsdWUgd2hlbiB0aGUKLQkgKiB3aWRnZXQgcmVjZWl2ZXMgdGhlIGZvY3VzIGFuZCB0byBzaG93IHRoZSBkZWZhdWx0IHdoZW4gdGhlIHdpZGdldCBsb3NlcwotCSAqIHRoZSBmb2N1cy4KLQkgKgotCSAqIEBwYXJhbSBjb21ibyBUaGUgd2lkZ2V0IGhhdmluZyBhIGRlZmF1bHQgdmFsdWUgdGhhdCBpcyBhbHdheXMgYXQgdGhlCi0JICogYmVnaW5uaW5nIG9mIHRoZSBsaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoQ29tYm8gY29tYm8pIHsKLQkJQ29tYm9IYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ29tYm9IYW5kbGVyKCk7Ci0JCWNvbWJvLmFkZEZvY3VzTGlzdGVuZXIoaGFuZGxlcik7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGhhbmRsZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgbG9jYWxpemVkIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBOTFMgY2xhc3MgYnkgY3JlYXRpbmcgdGhlCi0JICoga2V5LiBUaGF0IGtleSBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgY29tcG9zaXRlJ3Mgc2hvcnQgY2xhc3MgbmFtZQotCSAqIHdpdGggdGhlIHRvU3RyaW5nKCkgb2YgdGhlIGdpdmVuIHZhbHVlIHNlcGFyYXRlZCBieSBhbiB1bmRlcnNjb3JlLgotCSAqCi0JICogQHBhcmFtIG5sc0NsYXNzIFRoZSBOTFMgY2xhc3MgdXNlZCB0byByZXRyaWV2ZSB0aGUgbG9jYWxpemVkIHRleHQKLQkgKiBAcGFyYW0gY29tcG9zaXRlQ2xhc3MgVGhlIGNsYXNzIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBrZXksIGl0cyBzaG9ydCBjbGFzcwotCSAqIG5hbWUgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB1c2VkIHRvIGFwcGVuZCBpdHMgdG9TdHJpbmcoKSB0byB0aGUgZ2VuZXJhdGVkIGtleQotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoQ2xhc3M8Pz4gbmxzQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGNvbXBvc2l0ZUNsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKLQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKENsYXNzVG9vbHMuc2hvcnROYW1lRm9yKGNvbXBvc2l0ZUNsYXNzKSk7Ci0JCXNiLmFwcGVuZCgiXyIpOwotCQlzYi5hcHBlbmQodmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpOy8vYnVnIDIzNDk1MwotCQkvL1RPRE8gaW4gYSBmdXR1cmUgcmVsZWFzZSB3ZSBzaG91bGQgbm90IGJlIGNvbnZlcnRpbmcgdGhlIGtleSB1c2luZyB0b0xvd2VyQ2FzZSgpCi0KLQkJcmV0dXJuIChTdHJpbmcpIENsYXNzVG9vbHMuc3RhdGljRmllbGRWYWx1ZShubHNDbGFzcywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGZyb20gdGhlIGdpdmVuIE5MUyBjbGFzcyBieSBjcmVhdGluZyB0aGUKLQkgKiBrZXkuIFRoYXQga2V5IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjb21wb3NpdGUncyBzaG9ydCBjbGFzcyBuYW1lCi0JICogd2l0aCB0aGUgdG9TdHJpbmcoKSBvZiB0aGUgZ2l2ZW4gdmFsdWUgc2VwYXJhdGVkIGJ5IGFuIHVuZGVyc2NvcmUuCi0JICoKLQkgKiBAcGFyYW0gbmxzQ2xhc3MgVGhlIE5MUyBjbGFzcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBsb2NhbGl6ZWQgdGV4dAotCSAqIEBwYXJhbSBjb21wb3NpdGUgVGhlIG9iamVjdCB1c2VkIHRvIHJldHJpZXZlIHRoZSBzaG9ydCBjbGFzcyBuYW1lIHRoYXQgaXMKLQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHVzZWQgdG8gYXBwZW5kIGl0cyB0b1N0cmluZygpIHRvIHRoZSBnZW5lcmF0ZWQga2V5Ci0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhDbGFzczw/PiBubHNDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7Ci0KLQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZyhubHNDbGFzcywgY29tcG9zaXRlLmdldENsYXNzKCksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5SdW5uYWJsZTwvY29kZT4gdGhhdCB3aWxsIGludm9rZSB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5Qb3N0RXhlY3V0aW9uPC9jb2RlPiBpbiBvcmRlciB0byBpdHMgZXhlY3V0aW9uIHRvIGJlIGRvbmUgaW4gdGhlCi0JICogVUkgdGhyZWFkLgotCSAqCi0JICogQHBhcmFtIGRpYWxvZyBUaGUgZGlhbG9nIHRoYXQgd2FzIGp1c3QgZGlwb3NlZAotCSAqIEBwYXJhbSBwb3N0RXhlY3V0aW9uIFRoZSBwb3N0IGV4ZWN1dGlvbiBvbmNlIHRoZSBkaWFsb2cgaXMgZGlzcG9zZWQKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5SdW5uYWJsZTwvY29kZT4gdGhhdCB3aWxsIGludm9rZQotCSAqIHtAbGluayBQb3N0RXhlY3V0aW9uI2V4ZWN1dGUoRGlhbG9nKX0KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyA8RDEgZXh0ZW5kcyBEaWFsb2csIEQyIGV4dGVuZHMgRDE+Ci0JCVJ1bm5hYmxlIGJ1aWxkUG9zdEV4ZWN1dGlvblJ1bm5hYmxlKAotCQkJZmluYWwgRDEgZGlhbG9nLAotCQkJZmluYWwgUG9zdEV4ZWN1dGlvbjxEMj4gcG9zdEV4ZWN1dGlvbikgewotCi0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2V0VXNlckludGVyZmFjZUFjdGl2ZShmYWxzZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcG9zdEV4ZWN1dGlvbi5leGVjdXRlKChEMikgZGlhbG9nKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXNldFVzZXJJbnRlcmZhY2VBY3RpdmUodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBzaGVsbC4gSWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzCi0JICogbm90IHRoZSBVSSB0aHJlYWQsIHRoZW4gYW4gaW52YWxpZCB0aHJlYWQgYWNjZXNzIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHNoZWxsLCBuZXZlciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIGFjdGl2ZSBzaGVsbCwgd2hpY2ggY2FuIGJlIHRoZSBzaGVsbCBmcm9tIGFueSB3aW5kb3cKLQkJU2hlbGwgc2hlbGwgPSBnZXRTdGFuZGFyZERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCi0JCS8vIE5vIHNoZWxsIGNvdWxkIGJlIGZvdW5kLCByZXZlcnQgYmFjayB0byB0aGUgYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3cKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXNoZWxsID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJfQotCi0JCS8vIE1ha2Ugc3VyZSBpdCdzIG5ldmVyIG51bGwKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXNoZWxsID0gbmV3IFNoZWxsKGdldFN0YW5kYXJkRGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmIHRoZQotCSAqIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc3BsYXkuIElmIHNvLCB0aGlzIGRpc3BsYXkKLQkgKiBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgotCSAqCi0JICogQHJldHVybiBUaGUgY3VycmVudCBkaXNwbGF5IGlmIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UgdGhlIGRlZmF1bHQKLQkgKiBkaXNwbGF5IGlzIHJldHVybmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpCi0JewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQotCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCX0KLQotCQlyZXR1cm4gZGlzcGxheTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRUYWJsZUhlaWdodEhpbnQoVGFibGUgdGFibGUsIGludCByb3dzKSB7Ci0JCWlmICh0YWJsZS5nZXRGb250KCkuZXF1YWxzKEpGYWNlUmVzb3VyY2VzLmdldERlZmF1bHRGb250KCkpKQotCQkJdGFibGUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlpbnQgcmVzdWx0PSB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgKiByb3dzICsgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCk7Ci0JCWlmICh0YWJsZS5nZXRMaW5lc1Zpc2libGUoKSkKLQkJCXJlc3VsdCs9IHRhYmxlLmdldEdyaWRMaW5lV2lkdGgoKSAqIChyb3dzIC0gMSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0gICAvKioKLQkgKiBSZXR1cm5zIHRoZSBQbGF0Zm9ybSBVSSB3b3JrYmVuY2guCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB3b3JrYmVuY2ggZm9yIHRoaXMgcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCX0KLQotCS8qKgotCSAqIFJlbGF5cyBvdXQgdGhlIHBhcmVudHMgb2YgdGhlIDxjb2RlPkNvbnRyb2w8L2NvZGU+LiBUaGlzIHdhcyB0YWtlbiBmcm9tCi0JICogdGhlIHdpZGdldCA8Y29kZT5TZWN0aW9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIHJldmFsaWRhdGUgYXMgd2VsbCBhcyBpdHMgcGFyZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZsb3coQ29tcG9zaXRlIHBhbmUpIHsKLQotCQlmb3IgKENvbXBvc2l0ZSBjb21wb3NpdGUgPSBwYW5lOyBjb21wb3NpdGUgIT0gbnVsbDsgKSB7Ci0JCQljb21wb3NpdGUuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCWNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQotCQkJaWYgKGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNjcm9sbGVkRm9ybSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJZm9yIChDb21wb3NpdGUgY29tcG9zaXRlID0gcGFuZTsgY29tcG9zaXRlICE9IG51bGw7ICkgewotCQkJY29tcG9zaXRlLmxheW91dCh0cnVlKTsKLQkJCWNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQotCQkJaWYgKGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNjcm9sbGVkRm9ybSkgewotCQkJCSgoU2Nyb2xsZWRGb3JtKSBjb21wb3NpdGUpLnJlZmxvdyh0cnVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWZvciAoQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHBhbmU7IGNvbXBvc2l0ZSAhPSBudWxsOyApIHsKLQkJCWNvbXBvc2l0ZS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQljb21wb3NpdGUgPSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0KLQkJCWlmIChjb21wb3NpdGUgaW5zdGFuY2VvZiBTY3JvbGxlZEZvcm0pIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgZW50aXJlIHNoZWxsIGFuZCBpdHMgd2lkZ2V0cyBzaG91bGQgYmUgZW5hYmxlZCBvcgotCSAqIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIHVuYWNjZXNzaWJsZS4KLQkgKgotCSAqIEBwYXJhbSBhY3RpdmUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSBhbGwgdGhlIFVJIGFjdGl2ZSBvdGhlcndpc2UKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZGVhY3RpdmF0ZSBpdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVc2VySW50ZXJmYWNlQWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7Ci0JCVNoZWxsW10gc2hlbGxzID0gZ2V0U3RhbmRhcmREaXNwbGF5KCkuZ2V0U2hlbGxzKCk7Ci0KLQkJZm9yIChTaGVsbCBzaGVsbCA6IHNoZWxscykgewotCQkJc2hlbGwuc2V0RW5hYmxlZChhY3RpdmUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgbGF1bmNoZXMgdGhlIHNwZWNpZmllZCBkaWFsb2cgaW4gdGhlIFVJIHRocmVhZC4KLQkgKgotCSAqIEBwYXJhbSBkaWFsb2cgVGhlIGRpYWxvZyB0byBzaG93IG9uIHNjcmVlbgotCSAqIEBwYXJhbSBwb3N0RXhlY3V0aW9uIFRoaXMgaW50ZXJmYWNlIGxldCB0aGUgY2FsbGVyIHRvIGludm9rZSBhIHBpZWNlIG9mCi0JICogY29kZSBvbmNlIHRoZSBkaWFsb2cgaXMgZGlzcG9zZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxEMSBleHRlbmRzIERpYWxvZywgRDIgZXh0ZW5kcyBEMT4KLQkJdm9pZCBzaG93KGZpbmFsIEQxIGRpYWxvZywgZmluYWwgUG9zdEV4ZWN1dGlvbjxEMj4gcG9zdEV4ZWN1dGlvbikgewotCi0JCXRyeSB7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGRpYWxvZywgICAgICAgICJUaGUgZGlhbG9nIGNhbm5vdCBiZSBudWxsIik7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKHBvc3RFeGVjdXRpb24sICJUaGUgUG9zdEV4ZWN1dGlvbiBjYW5ub3QgYmUgbnVsbCIpOwotCQl9Ci0JCWNhdGNoIChBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZSkgewotCQkJLy8gTWFrZSBzdXJlIHRoZSBVSSBpcyBpbnRlcmFjdGl2ZQotCQkJc2V0VXNlckludGVyZmFjZUFjdGl2ZSh0cnVlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQotCQluZXcgVGhyZWFkKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYXN5bmNFeGVjKAotCQkJCQluZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNob3dJbXAoZGlhbG9nLCBwb3N0RXhlY3V0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCX19LnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgbGF1bmNoZXMgdGhlIHNwZWNpZmllZCBkaWFsb2cgaW4gdGhlIFVJIHRocmVhZC4KLQkgKgotCSAqIEBwYXJhbSBkaWFsb2cgVGhlIGRpYWxvZyB0byBzaG93IG9uIHNjcmVlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93KERpYWxvZyBkaWFsb2cpIHsKLQkJc2hvdyhkaWFsb2csIE51bGxQb3N0RXhlY3V0aW9uLjxEaWFsb2c+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgbGF1bmNoZXMgdGhlIHNwZWNpZmllZCBkaWFsb2cgaW4gdGhlIFVJIHRocmVhZC4KLQkgKgotCSAqIEBwYXJhbSBkaWFsb2cgVGhlIGRpYWxvZyB0byBzaG93IG9uIHNjcmVlbgotCSAqIEBwYXJhbSBwb3N0RXhlY3V0aW9uIFRoaXMgaW50ZXJmYWNlIGxldCB0aGUgY2FsbGVyIHRvIGludm9rZSBhIHBpZWNlIG9mCi0JICogY29kZSBvbmNlIHRoZSBkaWFsb2cgaXMgZGlzcG9zZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RDEgZXh0ZW5kcyBEaWFsb2csIEQyIGV4dGVuZHMgRDE+Ci0JCXZvaWQgc2hvd0ltcChEMSBkaWFsb2csIFBvc3RFeGVjdXRpb248RDI+IHBvc3RFeGVjdXRpb24pIHsKLQotCQlzZXRVc2VySW50ZXJmYWNlQWN0aXZlKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCWlmIChwb3N0RXhlY3V0aW9uICE9IE51bGxQb3N0RXhlY3V0aW9uLjxEMj5pbnN0YW5jZSgpKSB7Ci0JCQlhc3luY0V4ZWMoYnVpbGRQb3N0RXhlY3V0aW9uUnVubmFibGUoZGlhbG9nLCBwb3N0RXhlY3V0aW9uKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYXVzZXMgdGhlIDxjb2RlPnJ1bigpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIGdpdmVuIHJ1bm5hYmxlIHRvIGJlIGludm9rZWQKLQkgKiBieSB0aGUgdXNlci1pbnRlcmZhY2UgdGhyZWFkIGF0IHRoZSBuZXh0IHJlYXNvbmFibGUgb3Bwb3J0dW5pdHkuIFRoZQotCSAqIHRocmVhZCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZCBpcyBzdXNwZW5kZWQgdW50aWwgdGhlIHJ1bm5hYmxlIGNvbXBsZXRlcy4KLQkgKgotCSAqIEBwYXJhbSBydW5uYWJsZSBjb2RlIHRvIHJ1biBvbiB0aGUgdXNlci1pbnRlcmZhY2UgdGhyZWFkLgotCSAqIEBzZWUgI2FzeW5jRXhlYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzeW5jRXhlYyhSdW5uYWJsZSBydW5uYWJsZSkgewotCQlnZXRTdGFuZGFyZERpc3BsYXkoKS5zeW5jRXhlYyhydW5uYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgdGhlIFVJIGV2ZW50IHRocmVhZC4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQncyB0aGUgVUkgZXZlbnQgdGhyZWFkLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdWlUaHJlYWQoKSB7Ci0JCXJldHVybiBnZXRTdGFuZGFyZERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBVSSBldmVudCB0aHJlYWQgYnkgdXNpbmcgdGhlCi0JICogdGhyZWFkIGZyb20gd2hpY2ggdGhlIGdpdmVuIHZpZXdlcidzIGRpc3BsYXkgd2FzIGluc3RhbnRpYXRlZC4KLQkgKgotCSAqIEBwYXJhbSB2aWV3ZXIgVGhlIHZpZXdlciB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY3VycmVudCB0aHJlYWQKLQkgKiBpcyB0aGUgVUkgZXZlbnQgdGhyZWFkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgdGhlIFVJIGV2ZW50IHRocmVhZDsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHVpVGhyZWFkKFZpZXdlciB2aWV3ZXIpIHsKLQkJcmV0dXJuIHVpVGhyZWFkKHZpZXdlci5nZXRDb250cm9sKCkpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBVSSBldmVudCB0aHJlYWQgYnkgdXNpbmcgdGhlCi0JICogdGhyZWFkIGZyb20gd2hpY2ggdGhlIGdpdmVuIHdpZGdldCdzIGRpc3BsYXkgd2FzIGluc3RhbnRpYXRlZC4KLQkgKgotCSAqIEBwYXJhbSB3aWRnZXQgVGhlIHdpZGdldCB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY3VycmVudCB0aHJlYWQKLQkgKiBpcyB0aGUgVUkgZXZlbnQgdGhyZWFkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgdGhlIFVJIGV2ZW50IHRocmVhZDsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHVpVGhyZWFkKFdpZGdldCB3aWRnZXQpIHsKLQkJcmV0dXJuIHdpZGdldC5nZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlIGNvbWJvCi0JICogaGFzIHRoZSBmb2N1cyBvciB3aGVuIHRoZSBzZWxlY3RlZCBpdGVtIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCB0byBzZWxlY3QKLQkgKiBpdCB3aGVuIHRoZSBjb21ibyBsb3NlcyB0aGUgZm9jdXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NvbWJvSGFuZGxlciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2N1c0xpc3RlbmVyIHsKLQotCQkvKioKLQkJICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gcHJldmVudCB0aGUgbWV0aG9kcyBvZiB0aGlzIGhhbmRsZXIgZnJvbQotCQkgKiBpbnRlcmFjdGluZyB3aXRoIGVhY2ggb3RoZXIuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkOwotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCi0JCQlpZiAobG9ja2VkKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlDQ29tYm8gY29tYm8gPSAoQ0NvbWJvKSBlLndpZGdldDsKLQotCQkJaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkgewotCQkJCWNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCBCb29sZWFuLlRSVUUpOwotCQkJCWxvY2tlZCA9IHRydWU7Ci0KLQkJCQkvLyBUaGUgdGV4dCBoYXMgdG8gYmUgY2hhbmdlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIHRoaXMKLQkJCQkvLyBsaXN0ZW5lciBvdGhlcndpc2UgdGhlIGNvbWJvIHdvbid0IHVwZGF0ZSBiZWNhdXNlIGl0J3MgY3VycmVudGx5Ci0JCQkJLy8gbm90aWZ5aW5nIGl0cyBsaXN0ZW5lcnMKLQkJCQlhc3luY0V4ZWMobmV3IFJlbW92ZURlZmF1bHQoY29tYm8sIEJvb2xlYW4uRkFMU0UpKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQotCQkJaWYgKGxvY2tlZCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJQ0NvbWJvIGNvbWJvID0gKENDb21ibykgZS53aWRnZXQ7Ci0KLQkJCWlmIChjb21iby5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCBCb29sZWFuLlRSVUUpOwotCQkJCWxvY2tlZCA9IHRydWU7Ci0KLQkJCQl0cnkgewotCQkJCQljb21iby5zZXRUZXh0KGNvbWJvLmdldEl0ZW0oMCkpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJY29tYm8uc2V0RGF0YSgicG9wdWxhdGluZyIsIEJvb2xlYW4uRkFMU0UpOwotCQkJCQlsb2NrZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQotCQkJaWYgKGxvY2tlZCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJQ0NvbWJvIGNvbWJvID0gKENDb21ibykgZS53aWRnZXQ7Ci0KLQkJCWlmIChjb21iby5pc0ZvY3VzQ29udHJvbCgpICYmCi0JCQkgICAgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA8PSAwKSB7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGN1cnJlbnQgdGV4dCBpcyB0aGUgZGVmYXVsdCB2YWx1ZQotCQkJCVN0cmluZyBjdXJyZW50VmFsdWUgPSBjb21iby5nZXRUZXh0KCk7Ci0KLQkJCQlpZiAoY3VycmVudFZhbHVlLmxlbmd0aCgpID4gMCAmJgotCQkJCSAgICBjb21iby5nZXRJdGVtQ291bnQoKSAgPiAwICYmCi0JCQkJICAgICFjdXJyZW50VmFsdWUuZXF1YWxzKGNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIFJlbW92ZSB0aGUgZGVmYXVsdCB2YWx1ZQotCQkJCU9iamVjdCBwb3B1bGF0aW5nID0gY29tYm8uZ2V0RGF0YSgicG9wdWxhdGluZyIpOwotCQkJCWNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCBCb29sZWFuLlRSVUUpOwotCQkJCWxvY2tlZCA9IHRydWU7Ci0KLQkJCQkvLyBUaGUgdGV4dCBoYXMgdG8gYmUgY2hhbmdlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIHRoaXMKLQkJCQkvLyBsaXN0ZW5lciBvdGhlcndpc2UgdGhlIGNvbWJvIHdvbid0IHVwZGF0ZSBiZWNhdXNlIGl0J3MgY3VycmVudGx5Ci0JCQkJLy8gbm90aWZ5aW5nIGl0cyBsaXN0ZW5lcnMKLQkJCQlhc3luY0V4ZWMobmV3IE1vZGlmeVRleHQoY29tYm8sIHBvcHVsYXRpbmcpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgY2xhc3MgTW9kaWZ5VGV4dCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJCXByaXZhdGUgZmluYWwgQ0NvbWJvIGNvbWJvOwotCQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgcG9wdWxhdGluZzsKLQotCQkJcHVibGljIE1vZGlmeVRleHQoQ0NvbWJvIGNvbWJvLCBPYmplY3QgcG9wdWxhdGluZykgewotCQkJCXN1cGVyKCk7Ci0JCQkJdGhpcy5jb21ibyAgICAgID0gY29tYm87Ci0JCQkJdGhpcy5wb3B1bGF0aW5nID0gcG9wdWxhdGluZzsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICh0aGlzLmNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJCQlDQ29tYm9IYW5kbGVyLnRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHRleHQgPSB0aGlzLmNvbWJvLmdldFRleHQoKTsKLQotCQkJCQkJaWYgKHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXRleHQgPSB0aGlzLmNvbWJvLmdldEl0ZW0oMCk7Ci0JCQkJCQkJdGhpcy5jb21iby5zZXRUZXh0KHRleHQpOwotCQkJCQkJfQotCi0JCQkJCQl0aGlzLmNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgdGV4dC5sZW5ndGgoKSkpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJdGhpcy5jb21iby5zZXREYXRhKCJwb3B1bGF0aW5nIiwgdGhpcy5wb3B1bGF0aW5nKTsKLQkJCQkJCUNDb21ib0hhbmRsZXIudGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgY2xhc3MgUmVtb3ZlRGVmYXVsdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJCXByaXZhdGUgZmluYWwgQ0NvbWJvIGNvbWJvOwotCQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgcG9wdWxhdGluZzsKLQotCQkJcHVibGljIFJlbW92ZURlZmF1bHQoQ0NvbWJvIGNvbWJvLCBPYmplY3QgcG9wdWxhdGluZykgewotCQkJCXN1cGVyKCk7Ci0JCQkJdGhpcy5jb21ibyAgICAgID0gY29tYm87Ci0JCQkJdGhpcy5wb3B1bGF0aW5nID0gcG9wdWxhdGluZzsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICh0aGlzLmNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJCQlDQ29tYm9IYW5kbGVyLnRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0cnkgewotCQkJCQkJdGhpcy5jb21iby5zZXRUZXh0KCIiKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCXRoaXMuY29tYm8uc2V0RGF0YSgicG9wdWxhdGluZyIsIHRoaXMucG9wdWxhdGluZyk7Ci0JCQkJCQlDQ29tYm9IYW5kbGVyLnRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlIGNvbWJvCi0JICogaGFzIHRoZSBmb2N1cyBvciB3aGVuIHRoZSBzZWxlY3RlZCBpdGVtIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCB0byBzZWxlY3QKLQkgKiBpdCB3aGVuIHRoZSBjb21ibyBsb3NlcyB0aGUgZm9jdXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tYm9IYW5kbGVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9jdXNMaXN0ZW5lciB7Ci0KLQkJLyoqCi0JCSAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIHByZXZlbnQgdGhlIG1ldGhvZHMgb2YgdGhpcyBoYW5kbGVyIGZyb20KLQkJICogaW50ZXJhY3Rpbmcgd2l0aCBlYWNoIG90aGVyLgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGxvY2tlZDsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQotCQkJaWYgKGxvY2tlZCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUud2lkZ2V0OwotCi0JCQlpZiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwKSB7Ci0JCQkJY29tYm8uc2V0RGF0YSgicG9wdWxhdGluZyIsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJbG9ja2VkID0gdHJ1ZTsKLQotCQkJCS8vIFRoZSB0ZXh0IGhhcyB0byBiZSBjaGFuZ2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgdGhpcwotCQkJCS8vIGxpc3RlbmVyIG90aGVyd2lzZSB0aGUgY29tYm8gd29uJ3QgdXBkYXRlIGJlY2F1c2UgaXQncyBjdXJyZW50bHkKLQkJCQkvLyBub3RpZnlpbmcgaXRzIGxpc3RlbmVycwotCQkJCWFzeW5jRXhlYyhuZXcgUmVtb3ZlRGVmYXVsdChjb21ibywgQm9vbGVhbi5GQUxTRSkpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCi0JCQlpZiAobG9ja2VkKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlDb21ibyBjb21ibyA9IChDb21ibykgZS53aWRnZXQ7Ci0KLQkJCWlmIChjb21iby5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCBCb29sZWFuLlRSVUUpOwotCQkJCWxvY2tlZCA9IHRydWU7Ci0KLQkJCQl0cnkgewotCQkJCQljb21iby5zZWxlY3QoMCk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQljb21iby5zZXREYXRhKCJwb3B1bGF0aW5nIiwgQm9vbGVhbi5GQUxTRSk7Ci0JCQkJCWxvY2tlZCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCi0JCQlpZiAobG9ja2VkKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlDb21ibyBjb21ibyA9IChDb21ibykgZS53aWRnZXQ7Ci0KLQkJCWlmIChjb21iby5pc0ZvY3VzQ29udHJvbCgpICYmCi0JCQkgICAgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwKSB7Ci0KLQkJCQlPYmplY3QgcG9wdWxhdGluZyA9IGNvbWJvLmdldERhdGEoInBvcHVsYXRpbmciKTsKLQkJCQljb21iby5zZXREYXRhKCJwb3B1bGF0aW5nIiwgQm9vbGVhbi5UUlVFKTsKLQkJCQlsb2NrZWQgPSB0cnVlOwotCi0JCQkJLy8gVGhlIHRleHQgaGFzIHRvIGJlIGNoYW5nZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiB0aGlzCi0JCQkJLy8gbGlzdGVuZXIgb3RoZXJ3aXNlIHRoZSBjb21ibyB3b24ndCB1cGRhdGUgYmVjYXVzZSBpdCdzIGN1cnJlbnRseQotCQkJCS8vIG5vdGlmeWluZyBpdHMgbGlzdGVuZXJzCi0JCQkJYXN5bmNFeGVjKG5ldyBNb2RpZnlUZXh0KGNvbWJvLCBwb3B1bGF0aW5nKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGNsYXNzIE1vZGlmeVRleHQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbWJvOwotCQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgcG9wdWxhdGluZzsKLQotCQkJcHVibGljIE1vZGlmeVRleHQoQ29tYm8gY29tYm8sIE9iamVjdCBwb3B1bGF0aW5nKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCQl0aGlzLmNvbWJvICAgICAgPSBjb21ibzsKLQkJCQl0aGlzLnBvcHVsYXRpbmcgPSBwb3B1bGF0aW5nOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKHRoaXMuY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCUNvbWJvSGFuZGxlci50aGlzLmxvY2tlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyB0ZXh0ID0gdGhpcy5jb21iby5nZXRUZXh0KCk7Ci0KLQkJCQkJCWlmICh0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl0ZXh0ID0gdGhpcy5jb21iby5nZXRJdGVtKDApOwotCQkJCQkJCXRoaXMuY29tYm8uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJCX0KLQotCQkJCQkJdGhpcy5jb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIHRleHQubGVuZ3RoKCkpKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCXRoaXMuY29tYm8uc2V0RGF0YSgicG9wdWxhdGluZyIsIHRoaXMucG9wdWxhdGluZyk7Ci0JCQkJCQlDb21ib0hhbmRsZXIudGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgY2xhc3MgUmVtb3ZlRGVmYXVsdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJCXByaXZhdGUgZmluYWwgQ29tYm8gY29tYm87Ci0JCQlwcml2YXRlIGZpbmFsIE9iamVjdCBwb3B1bGF0aW5nOwotCi0JCQlwdWJsaWMgUmVtb3ZlRGVmYXVsdChDb21ibyBjb21ibywgT2JqZWN0IHBvcHVsYXRpbmcpIHsKLQkJCQlzdXBlcigpOwotCQkJCXRoaXMuY29tYm8gICAgICA9IGNvbWJvOwotCQkJCXRoaXMucG9wdWxhdGluZyA9IHBvcHVsYXRpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodGhpcy5jb21iby5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJQ29tYm9IYW5kbGVyLnRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0cnkgewotCQkJCQkJdGhpcy5jb21iby5zZXRUZXh0KCIiKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCXRoaXMuY29tYm8uc2V0RGF0YSgicG9wdWxhdGluZyIsIHRoaXMucG9wdWxhdGluZyk7Ci0JCQkJCQlDb21ib0hhbmRsZXIudGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1N0YXRlQ29udHJvbGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9TdGF0ZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjMzM0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1N0YXRlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IGtlZXBzIHRoZSBzdGF0ZSBvZiBhIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyBpbgotICogc3luY2ggd2l0aCB0aGUgcHJvdmlkZWQgYm9vbGVhbiBob2xkZXIuCi0gKgotICogQHNlZSBDb250cm9sRW5hYmxlcgotICogQHNlZSBDb250cm9sVmlzaWJpbGl0eUVuYWJsZXIKLSAqIEBzZWUgUGFuZUVuYWJsZXIKLSAqIEBzZWUgUGFuZVZpc2liaWxpdHlFbmFibGVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotYWJzdHJhY3QgY2xhc3MgU3RhdGVDb250cm9sbGVyCi17Ci0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgY29udHJvbEhvbGRlcnMgd2l0aCBjaGFuZ2VzCi0JICogbWFkZSB0byB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsLgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBib29sZWFuQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+SUNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZSBzdGF0ZSBpcyBrZXB0IGluIHN5bmMKLQkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxJQ29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc3RhdGU7IGZvciB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uIFRoZSBkZWZhdWx0IFtkZWZhdWx0IHZhbHVlXSBpcyA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdFZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+LgotCSAqLwotCVN0YXRlQ29udHJvbGxlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5JQ29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlCi0JICogc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SUNvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9sSG9sZGVycywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5JQ29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlCi0JICogc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPElDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycywKLQkgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKCk7Ci0JCWluaXRpYWxpemUoYm9vbGVhbkhvbGRlciwgY29udHJvbEhvbGRlcnMsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXIgVGhlIDxjb2RlPklDb250cm9sSG9sZGVyPC9jb2RlPiB3aG9zZSBzdGF0ZSBpcyBrZXB0Ci0JICogaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBJQ29udHJvbEhvbGRlciBjb250cm9sSG9sZGVyKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9sSG9sZGVyLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXJzIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPklDb250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UKLQkgKiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgSUNvbnRyb2xIb2xkZXIuLi4gY29udHJvbEhvbGRlcnMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGNvbnRyb2xIb2xkZXJzKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVyIFRoZSA8Y29kZT5JQ29udHJvbEhvbGRlcjwvY29kZT4gd2hvc2Ugc3RhdGUgaXMga2VwdAotCSAqIGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIElDb250cm9sSG9sZGVyIGNvbnRyb2xIb2xkZXIsCi0JICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBuZXcgSUNvbnRyb2xIb2xkZXJbXSB7IGNvbnRyb2xIb2xkZXIgfSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5JQ29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlCi0JICogc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBJQ29udHJvbEhvbGRlcltdIGNvbnRyb2xIb2xkZXJzLAotCSAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoKTsKLQkJdGhpcy5pbml0aWFsaXplKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGNvbnRyb2xIb2xkZXJzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgQW4gaXRlcmF0b3Igb24gdGhlIGNvbGxlY3Rpb24gb2YKLQkgKiA8Y29kZT5JQ29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuCi0JICogaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIEl0ZXJhdG9yPElDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29udHJvbEhvbGRlcnMpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXJzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mCi0JICogPGNvZGU+SUNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZSBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbgotCSAqIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgSXRlcmF0b3I8SUNvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzLAotCSAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoKTsKLQkJaW5pdGlhbGl6ZShib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihjb250cm9sSG9sZGVycyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYm9vbGVhbiBwcmltaXRpdmUgb2YgdGhlIGdpdmVuIDxjb2RlPkJvb2xlYW48L2NvZGU+IHZhbHVlIGJ1dAotCSAqIGFsc28gY2hlY2tzIGZvciA8Y29kZT5udWxsPC9jb2RlPiwgaWYgdGhhdCBpcyB0aGUgY2FzZSwgdGhlbgotCSAqIHtAbGluayAjZGVmYXVsdFZhbHVlfSBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4gdmFsdWUgdG8gYmUgcmV0dXJuZWQgYXMgYSBwcmltaXRpdmUKLQkgKiBAcmV0dXJuIFRoZSBwcmltaXRpdmUgb2YgdGhlIGdpdmVuIHZhbHVlIG9yIHtAbGluayAjZGVmYXVsdFZhbHVlfXdoZW4gdGhlCi0JICogdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBib29sZWFuVmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGlzdGVuZXIgZm9yIHRoZSBib29sZWFuIGhvbGRlci4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQlidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKQotCQkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlN0YXRlQ29udHJvbGxlci5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3RlbmVyIGZvciB0aGUgYm9vbGVhbiBob2xkZXIuCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVTdGF0ZShib29sZWFuVmFsdWUoYm9vbGVhbkhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlN0YXRlQ29udHJvbGxlci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiBvdmVyIHRoZSBjb2xsZWN0aW9uIG9mCi0JICogPGNvZGU+SUNvbnRyb2xIb2xkZXI8L2NvZGU+cy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGl0ZXJhdGlvbiBvZiA8Y29kZT5JQ29udHJvbEhvbGRlcjwvY29kZT5zCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEl0ZXJhdG9yPElDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPElDb250cm9sSG9sZGVyPih0aGlzLmNvbnRyb2xIb2xkZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gYnkgYnVpbGRpbmcgdGhlIGFwcHJvcHJpYXRlCi0JICogbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBBIDxjb2RlPklDb250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UgZW5hYmxlbWVudCBzdGF0ZQotCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JCQkJCQkJCQkgIENvbGxlY3Rpb248SUNvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzLAotCQkJCQkJCQkJICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCUFzc2VydC5pc05vdE51bGwoYm9vbGVhbkhvbGRlciwgICJUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHZhbHVlIGNhbm5vdCBiZSBudWxsIik7Ci0JCUFzc2VydC5pc05vdE51bGwoY29udHJvbEhvbGRlcnMsICJUaGUgY29sbGVjdGlvbiBvZiBDb250cm9sSG9sZGVycyBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCXRoaXMuY29udHJvbEhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PElDb250cm9sSG9sZGVyPihjb250cm9sSG9sZGVycyk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlICAgPSBkZWZhdWx0VmFsdWU7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlciAgPSBib29sZWFuSG9sZGVyOwotCi0JCXRoaXMuYm9vbGVhbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIKLQkJKTsKLQotCQl0aGlzLnVwZGF0ZVN0YXRlKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wgaG9sZGVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0ZSgpIHsKLQkJdGhpcy51cGRhdGVTdGF0ZShib29sZWFuVmFsdWUoYm9vbGVhbkhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIDxjb2RlPkNvbnRyb2w8L2NvZGU+cy4KLQkgKgotCSAqIEBwYXJhbSBzdGF0ZSBUaGUgbmV3IHN0YXRlIHRoZSB3aWRnZXRzIG5lZWQgdG8gaGF2ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXRlKGJvb2xlYW4gc3RhdGUpIHsKLQkJZm9yIChJQ29udHJvbEhvbGRlciBjb250cm9sSG9sZGVyIDogdGhpcy5jb250cm9sSG9sZGVycykgewotCQkJY29udHJvbEhvbGRlci51cGRhdGVTdGF0ZShzdGF0ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgaG9sZGVyIG9mIHRoZSBhY3R1YWwgd2lkZ2V0LgotCSAqLwotCXN0YXRpYyBpbnRlcmZhY2UgSUNvbnRyb2xIb2xkZXIgewotCi0JCS8qKgotCQkgKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgd3JhcHBlZCBjb250cm9sLgotCQkgKgotCQkgKiBAcGFyYW0gc3RhdGUgVGhlIG5ldyBzdGF0ZSB0aGUgY29udHJvbCBzaG91bGQgaGF2ZQotCQkgKi8KLQkJdm9pZCB1cGRhdGVTdGF0ZShib29sZWFuIHN0YXRlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzdiMTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9UYWJsZUxheW91dENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGF5b3V0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtblBpeGVsRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLQotLyoqCi0gKiBBIHNwZWNpYWwgY29tcG9zaXRlIHRvIGxheW91dCBjb2x1bW5zIGluc2lkZSBhIHRhYmxlLiBUaGUgY29tcG9zaXRlIGlzIG5lZWRlZCBzaW5jZSB3ZSBoYXZlCi0gKiB0byBsYXlvdXQgdGhlIGNvbHVtbnMgImJlZm9yZSIgdGhlIGFjdHVhbCB0YWJsZSBnZXRzIGxheW91dGVkLiBIZW5jZSB3ZSBjYW4ndCB1c2UgYSBub3JtYWwKLSAqIGxheW91dCBtYW5hZ2VyLgotICoKLSAqIGNvcGllZCBmcm9tIGpkdC5pbnRlcm5hbC51aS51dGlsCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUxheW91dENvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIGV4dHJhIHBpeGVscyB0YWtlbiBhcyBob3Jpem9udGFsIHRyaW0gYnkgdGhlIHRhYmxlIGNvbHVtbi4KLQkgKiBUbyBlbnN1cmUgdGhlcmUgYXJlIE4gcGl4ZWxzIGF2YWlsYWJsZSBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiwKLQkgKiBhc3NpZ24gTitDT0xVTU5fVFJJTSBmb3IgdGhlIGNvbHVtbiB3aWR0aC4KLQkgKgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgQ09MVU1OX1RSSU0gPSAiY2FyYm9uIi5lcXVhbHMoU1dULmdldFBsYXRmb3JtKCkpID8gMjQgOiAzOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIExpc3Q8Q29sdW1uTGF5b3V0RGF0YT4gY29sdW1ucz0gbmV3IEFycmF5TGlzdDxDb2x1bW5MYXlvdXREYXRhPigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYWJsZUxheW91dENvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIFRhYmxlTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGFyZWE9IGdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgICAgICBUYWJsZSB0YWJsZT0gKFRhYmxlKWdldENoaWxkcmVuKClbMF07Ci0gICAgICAgICAgICAgICAgUG9pbnQgcHJlZmVycmVkU2l6ZT0gY29tcHV0ZVRhYmxlU2l6ZSh0YWJsZSk7Ci0gICAgICAgICAgICAgICAgaW50IHdpZHRoPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgd2lkdGggLT0gdkJhclNpemUueDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGF5b3V0VGFibGUodGFibGUsIHdpZHRoLCBhcmVhLCB0YWJsZS5nZXRTaXplKCkueCA8IGFyZWEud2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IGNvbHVtbiBvZiBkYXRhIHRvIHRoaXMgdGFibGUgbGF5b3V0LgotCSAqCi0JICogQHBhcmFtIGRhdGEgdGhlIGNvbHVtbiBsYXlvdXQgZGF0YQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbHVtbkRhdGEoQ29sdW1uTGF5b3V0RGF0YSBkYXRhKSB7Ci0JCWNvbHVtbnMuYWRkKGRhdGEpOwotCX0KLQotCS8vLS0tLSBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZVRhYmxlU2l6ZShUYWJsZSB0YWJsZSkgewotCQlQb2ludCByZXN1bHQ9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJaW50IHdpZHRoPSAwOwotCQlpbnQgc2l6ZT0gY29sdW1ucy5zaXplKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCUNvbHVtbkxheW91dERhdGEgbGF5b3V0RGF0YT0gY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAobGF5b3V0RGF0YSBpbnN0YW5jZW9mIENvbHVtblBpeGVsRGF0YSkgewotCQkJCUNvbHVtblBpeGVsRGF0YSBjb2w9IChDb2x1bW5QaXhlbERhdGEpIGxheW91dERhdGE7Ci0JCQkJd2lkdGggKz0gY29sLndpZHRoOwotCQkJCWlmIChjb2wuYWRkVHJpbSkgewotCQkJCQl3aWR0aCArPSBDT0xVTU5fVFJJTTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGxheW91dERhdGEgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJQ29sdW1uV2VpZ2h0RGF0YSBjb2w9IChDb2x1bW5XZWlnaHREYXRhKSBsYXlvdXREYXRhOwotCQkJCXdpZHRoICs9IGNvbC5taW5pbXVtV2lkdGg7Ci0JCQl9IGVsc2UgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGNvbHVtbiBsYXlvdXQgZGF0YSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKHdpZHRoID4gcmVzdWx0LngpCi0JCQlyZXN1bHQueD0gd2lkdGg7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxheW91dFRhYmxlKFRhYmxlIHRhYmxlLCBpbnQgd2lkdGgsIFJlY3RhbmdsZSBhcmVhLCBib29sZWFuIGluY3JlYXNlKSB7Ci0JCS8vIFhYWDogTGF5b3V0IGlzIGJlaW5nIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgdmFsdWUgdGhlIGZpcnN0IHRpbWUKLQkJLy8gaXQgaXMgYmVpbmcgY2FsbGVkIG9uIExpbnV4LiBUaGlzIG1ldGhvZCByZXNldHMgdGhlCi0JCS8vIExheW91dCB0byBudWxsIHNvIHdlIG1ha2Ugc3VyZSB3ZSBydW4gaXQgb25seSB3aGVuCi0JCS8vIHRoZSB2YWx1ZSBpcyBPSy4KLQkJaWYgKHdpZHRoIDw9IDEpCi0JCQlyZXR1cm47Ci0KLQkJVGFibGVDb2x1bW5bXSB0YWJsZUNvbHVtbnM9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJaW50IHNpemU9IE1hdGgubWluKGNvbHVtbnMuc2l6ZSgpLCB0YWJsZUNvbHVtbnMubGVuZ3RoKTsKLQkJaW50W10gd2lkdGhzPSBuZXcgaW50W3NpemVdOwotCQlpbnQgZml4ZWRXaWR0aD0gMDsKLQkJaW50IG51bWJlck9mV2VpZ2h0Q29sdW1ucz0gMDsKLQkJaW50IHRvdGFsV2VpZ2h0PSAwOwotCi0JCS8vIEZpcnN0IGNhbGMgc3BhY2Ugb2NjdXBpZWQgYnkgZml4ZWQgY29sdW1ucwotCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uUGl4ZWxEYXRhKSB7Ci0JCQkJQ29sdW1uUGl4ZWxEYXRhIGNwZD0gKENvbHVtblBpeGVsRGF0YSkgY29sOwotCQkJCWludCBwaXhlbHM9IGNwZC53aWR0aDsKLQkJCQlpZiAoY3BkLmFkZFRyaW0pIHsKLQkJCQkJcGl4ZWxzICs9IENPTFVNTl9UUklNOwotCQkJCX0KLQkJCQl3aWR0aHNbaV09IHBpeGVsczsKLQkJCQlmaXhlZFdpZHRoICs9IHBpeGVsczsKLQkJCX0gZWxzZSBpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCUNvbHVtbldlaWdodERhdGEgY3c9IChDb2x1bW5XZWlnaHREYXRhKSBjb2w7Ci0JCQkJbnVtYmVyT2ZXZWlnaHRDb2x1bW5zKys7Ci0JCQkJLy8gZmlyc3QgdGltZSwgdXNlIHRoZSB3ZWlnaHQgc3BlY2lmaWVkIGJ5IHRoZSBjb2x1bW4gZGF0YSwgb3RoZXJ3aXNlIHVzZSB0aGUgYWN0dWFsIHdpZHRoIGFzIHRoZSB3ZWlnaHQKLQkJCQkvLyBpbnQgd2VpZ2h0ID0gZmlyc3RUaW1lID8gY3cud2VpZ2h0IDogdGFibGVDb2x1bW5zW2ldLmdldFdpZHRoKCk7Ci0JCQkJaW50IHdlaWdodD0gY3cud2VpZ2h0OwotCQkJCXRvdGFsV2VpZ2h0ICs9IHdlaWdodDsKLQkJCX0gZWxzZSB7Ci0JCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVua25vd24gY29sdW1uIGxheW91dCBkYXRhIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8vIERvIHdlIGhhdmUgY29sdW1ucyB0aGF0IGhhdmUgYSB3ZWlnaHQKLQkJaWYgKG51bWJlck9mV2VpZ2h0Q29sdW1ucyA+IDApIHsKLQkJCS8vIE5vdyBkaXN0cmlidXRlIHRoZSByZXN0IHRvIHRoZSBjb2x1bW5zIHdpdGggd2VpZ2h0LgotCQkJaW50IHJlc3Q9IHdpZHRoIC0gZml4ZWRXaWR0aDsKLQkJCWludCB0b3RhbERpc3RyaWJ1dGVkPSAwOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJCUNvbHVtbkxheW91dERhdGEgY29sPSBjb2x1bW5zLmdldChpKTsKLQkJCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCQlDb2x1bW5XZWlnaHREYXRhIGN3PSAoQ29sdW1uV2VpZ2h0RGF0YSkgY29sOwotCQkJCQkvLyBjYWxjdWxhdGUgd2VpZ2h0IGFzIGFib3ZlCi0JCQkJCS8vIGludCB3ZWlnaHQgPSBmaXJzdFRpbWUgPyBjdy53ZWlnaHQgOiB0YWJsZUNvbHVtbnNbaV0uZ2V0V2lkdGgoKTsKLQkJCQkJaW50IHdlaWdodD0gY3cud2VpZ2h0OwotCQkJCQlpbnQgcGl4ZWxzPSB0b3RhbFdlaWdodCA9PSAwID8gMCA6IHdlaWdodCAqIHJlc3QgLyB0b3RhbFdlaWdodDsKLQkJCQkJaWYgKHBpeGVscyA8IGN3Lm1pbmltdW1XaWR0aCkKLQkJCQkJCXBpeGVscz0gY3cubWluaW11bVdpZHRoOwotCQkJCQl0b3RhbERpc3RyaWJ1dGVkICs9IHBpeGVsczsKLQkJCQkJd2lkdGhzW2ldPSBwaXhlbHM7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBEaXN0cmlidXRlIGFueSByZW1haW5pbmcgcGl4ZWxzIHRvIGNvbHVtbnMgd2l0aCB3ZWlnaHQuCi0JCQlpbnQgZGlmZj0gcmVzdCAtIHRvdGFsRGlzdHJpYnV0ZWQ7Ci0JCQlmb3IgKGludCBpPSAwOyBkaWZmID4gMDsgKytpKSB7Ci0JCQkJaWYgKGkgPT0gc2l6ZSkKLQkJCQkJaT0gMDsKLQkJCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gY29sdW1ucy5nZXQoaSk7Ci0JCQkJaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQkJKyt3aWR0aHNbaV07Ci0JCQkJCS0tZGlmZjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5jcmVhc2UpIHsKLQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotCQl9Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRhYmxlQ29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aHNbaV0pOwotCQl9Ci0JCWlmICghaW5jcmVhc2UpIHsKLQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvQWJzdHJhY3RKcGFWaWV3LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9BYnN0cmFjdEpwYVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0NDk5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9BYnN0cmFjdEpwYVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBWZXJzYW50LiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczogVmVyc2FudCBhbmQgT3RoZXJzLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkpwYVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkpwYVNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5TZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Qcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpQQSB2aWV3LiBUaGUgc2VsZWN0aW9uIGlzIGNoYW5nZWQKLSAqIGJ5IHJlY2VpdmluZyBhIDxjb2RlPklKcGFTZWxlY3Rpb248L2NvZGU+LgotICoKLSAqIEBzZWUgSnBhU2VsZWN0aW9uCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpwYVZpZXcgZXh0ZW5kcyBWaWV3UGFydAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHBhZ2UgdXNlZCB3aGVuIG5vdGhpbmcgY2FuIGJlIHNob3duLgotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGRlZmF1bHRDb21wb3NpdGU7Ci0KLQkvKioKLQkgKiBUaGUgc3RyaW5nIHRvIGRpc3BsYXkgd2hlbiB0aGVyZSBpcyBubyB2aWV3IGNvbnRlbnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0TGFiZWw7Ci0KLQkvKioKLQkgKiBUaGUgY29udGFpbmVyIG9mIHRoZSBjdXJyZW50IHBhZ2UuCi0JICovCi0JcHJpdmF0ZSBQYWdlQm9vayBwYWdlQm9vazsKLQotCS8qKgotCSAqIFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB2YXJpb3VzIHdpZGdldHMuCi0JICovCi0JcHJpdmF0ZSBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0SnBhVmlldzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gZGVmYXVsdExhYmVsCi0JICovCi0JcHVibGljIEFic3RyYWN0SnBhVmlldyhTdHJpbmcgZGVmYXVsdExhYmVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVmYXVsdExhYmVsID0gZGVmYXVsdExhYmVsOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZERlZmF1bHRDb21wb3NpdGUoKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYWdlQm9vayk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIGRlZmF1bHRMYWJlbCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlkZWZhdWx0Q29tcG9zaXRlID0gYnVpbGREZWZhdWx0Q29tcG9zaXRlKCk7Ci0JCXBhZ2VCb29rLnNob3dQYWdlKGRlZmF1bHRDb21wb3NpdGUpOwotCi0JCXN1YmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0KLQkJSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyID0KLQkJCVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIoZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0KLQkJc2VsZWN0aW9uTWFuYWdlci5yZWdpc3Rlcih0aGlzKTsKLQkJc2VsZWN0KHNlbGVjdGlvbk1hbmFnZXIuZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUGFnZUJvb2sgZ2V0UGFnZUJvb2soKSB7Ci0JCXJldHVybiBwYWdlQm9vazsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgV2lkZ2V0RmFjdG9yeSBnZXRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy53aWRnZXRGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgSlBBIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy53aWRnZXRGYWN0b3J5ID0gbmV3IFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KAotCQkJbmV3IFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IGdldEZvcm1XaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gKChGb3JtV2lkZ2V0RmFjdG9yeSkgd2lkZ2V0RmFjdG9yeSkuZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQsIHVwZGF0ZSB0aGUgY3VycmVudCBwYWdlIGJ5IHVzaW5nIHRoZSBnaXZlbgotCSAqIHNlbGVjdGlvbiBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBqcGFTZWxlY3Rpb24gVGhlIG5ldyBzZWxlY3Rpb24gdXNlZCB0byB1cGRhdGUgdGhpcyBKUEEgdmlldwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbGVjdChKcGFTZWxlY3Rpb24ganBhU2VsZWN0aW9uKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlwYWdlQm9vay5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGN1cnJlbnQgcGFnZSBhbmQgc2hvdyB0aGUgZGVmYXVsdCBvbmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0RlZmF1bHRQYWdlKCkgewotCQlzaG93UGFnZShkZWZhdWx0Q29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBjdXJyZW50IHBhZ2UgYW5kIHNob3cgdGhlIGdpdmVuIG9uZS4KLQkgKgotCSAqIEBwYXJhbSBwYWdlIFRoZSBuZXcgcGFnZSB0byBzaG93LCA8Y29kZT5udWxsPC9jb2RlPiBjYW4ndCBiZSBwYXNzZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzaG93UGFnZShDb250cm9sIHBhZ2UpIHsKLQkJcGFnZUJvb2suZ2V0UGFyZW50KCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJdHJ5IHsKLQkJCS8vIEl0IHNlZW1zIHRoZSBzY3JvbGwgcGFuZSBoYXMgdG8gYmUgaW5zdGFsbGVkIHJpZ2h0IGJlZm9yZSBzaG93aW5nCi0JCQkvLyB0aGUgcGFnZSwgaWYgaXQgaXMgaW5zdGFsbGVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgdGhlIHBhbmUgdGhlbgotCQkJLy8gaXRzIGxheW91dCB3aWxsIG5vdCBhbHdheXMgcmV2YWxpZGF0ZSBjb3JyZWN0bHksIGkuZS4gd2lsbCBub3Qgc2hvdwotCQkJLy8gYWxsIHRoZSB0aW1lIHRoZSB2ZXJ0aWNhbCBzY3JvbGwgYmFyCi0JCQlTY3JvbGxlZEZvcm0gc2Nyb2xsZWRGb3JtID0gZ2V0Rm9ybVdpZGdldEZhY3RvcnkoKS5jcmVhdGVTY3JvbGxlZEZvcm0ocGFnZUJvb2spOwotCQkJc2Nyb2xsZWRGb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJCXBhZ2Uuc2V0UGFyZW50KHNjcm9sbGVkRm9ybS5nZXRCb2R5KCkpOwotCi0JCQlwYWdlQm9vay5zaG93UGFnZShzY3JvbGxlZEZvcm0pOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJcGFnZUJvb2suZ2V0UGFyZW50KCkuc2V0UmVkcmF3KHRydWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3ViY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBubyBvcCAtIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIGlmIHdpc2hlZAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9KcGFEZXRhaWxzVmlldy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvSnBhRGV0YWlsc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwMTkwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9KcGFEZXRhaWxzVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVVpUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBKUEEgdmlldyB0aGF0IHNob3dzIHRoZSBkZXRhaWxzIGEgbWFwcGluZyAoZWl0aGVyIHR5cGUgb3IgYXR0cmlidXRlKS4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnBhRGV0YWlsc1ZpZXcgZXh0ZW5kcyBBYnN0cmFjdEpwYVZpZXcKLXsKLQkvKioKLQkgKiBUaGUgY3VycmVudCA8Y29kZT5JSnBhRGV0YWlsc1BhZ2U8L2NvZGU+IHRoYXQgd2FzIHJldHJpZXZlIGJhc2VkIG9uIHRoZQotCSAqIGN1cnJlbnQgc2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgSnBhRGV0YWlsc1BhZ2U8SnBhU3RydWN0dXJlTm9kZT4gY3VycmVudFBhZ2U7Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCBzZWxlY3Rpb24gdXNlZCB0byBzaG93IHRoZSByaWdodCA8Y29kZT5JSnBhRGV0YWlsc1BhZ2U8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgSnBhU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBrZXk6IE9iamVjdCBjb250ZW50IG5vZGUgaWQsICB2YWx1ZTogQ29tcG9zaXRlIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSBNYXA8T2JqZWN0LCBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+IGRldGFpbHNQYWdlczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhRGV0YWlsc1ZpZXc8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBKcGFEZXRhaWxzVmlldygpIHsKLQkJc3VwZXIoSnB0VWlNZXNzYWdlcy5KcGFEZXRhaWxzVmlld192aWV3Tm90QXZhaWxhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBidWlsZERldGFpbHNQYWdlKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCQlKcGFEZXRhaWxzUHJvdmlkZXIgZGV0YWlsc1Byb3ZpZGVyID0gZ2V0RGV0YWlsc1Byb3ZpZGVyKHN0cnVjdHVyZU5vZGUpOwotCi0JCWlmIChkZXRhaWxzUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgaWQgPSBzdHJ1Y3R1cmVOb2RlLmdldElkKCk7Ci0KLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoZ2V0UGFnZUJvb2soKSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULkhPUklaT05UQUwpKTsKLQotCQlKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gcGFnZSA9IGRldGFpbHNQcm92aWRlci5idWlsZERldGFpbHNQYWdlKAotCQkJY29udGFpbmVyLAotCQkJaWQsCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmRldGFpbHNQYWdlcy5wdXQoaWQsIHBhZ2UpOwotCQl9Ci0KLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCQlkZXRhaWxzUGFnZXMuY2xlYXIoKTsKLQotCQljdXJyZW50U2VsZWN0aW9uID0gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQljdXJyZW50UGFnZSA9IG51bGw7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGdldERldGFpbHNQYWdlKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCQlpZiAoZGV0YWlsc1BhZ2VzLmNvbnRhaW5zS2V5KHN0cnVjdHVyZU5vZGUuZ2V0SWQoKSkpIHsKLQkJCUpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBwYWdlID0gIGRldGFpbHNQYWdlcy5nZXQoc3RydWN0dXJlTm9kZS5nZXRJZCgpKTsKLQotCQkJaWYgKChwYWdlICE9IG51bGwpICYmCi0JCQkJCShwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJZGV0YWlsc1BhZ2VzLnJlbW92ZShzdHJ1Y3R1cmVOb2RlLmdldElkKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHBhZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1aWxkRGV0YWlsc1BhZ2Uoc3RydWN0dXJlTm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBKcGFEZXRhaWxzUHJvdmlkZXIgZ2V0RGV0YWlsc1Byb3ZpZGVyKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCi0JCVN0cmluZyBwbGF0Zm9ybUlkID0gc3RydWN0dXJlTm9kZS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOwotCQlKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVUkgPSBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkuaW5zdGFuY2UoKS5qcGFQbGF0Zm9ybShwbGF0Zm9ybUlkKTsKLQkJcmV0dXJuIGpwYVBsYXRmb3JtVUkuZGV0YWlsc1Byb3ZpZGVyKHN0cnVjdHVyZU5vZGUpOwotCi0JCS8vVE9ETyB0aGlzIHZpZXcgYW5kIHRoZSBkZXRhaWxzUHJvdmlkZXJzIE1hcCBpcyBub3QgY3JlYXRlZCBvbiBhIHBlciBwcm9qZWN0IGJhc2lzLgotCQkvL3RoZSBkZXRhaWxzUHJvdmlkZXJzIGFuZCB0aGVpciBmaWxlQ29udGVudFR5cGVzIGNvdWxkIG92ZXJsYXAgYWNyb3NzIHByb2plY3QsIHRoaXMgd291bGQgY2F1c2UgcHJvYmxlbXMgd2l0aCBzdG9yaW5nIHRoaXMgbWFwLgotCX0KLQotCXB1YmxpYyBKcGFTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0KLQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQl0aGlzLmRldGFpbHNQYWdlcyAgICAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChUcmFjaW5nLmJvb2xlYW5EZWJ1Z09wdGlvbihUcmFjaW5nLlVJX0RFVEFJTFNfVklFVykpIHsKLQkJCVRyYWNpbmcubG9nKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2VsZWN0KEpwYVNlbGVjdGlvbiBqcGFTZWxlY3Rpb24pIHsKLQkJaWYgKGpwYVNlbGVjdGlvbi5lcXVhbHMoY3VycmVudFNlbGVjdGlvbikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWN1cnJlbnRTZWxlY3Rpb24gPSBqcGFTZWxlY3Rpb247Ci0KLQkJaWYgKGpwYVNlbGVjdGlvbiAhPSBKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT04pIHsKLQkJCUpwYVN0cnVjdHVyZU5vZGUgbmV3Tm9kZSA9IGpwYVNlbGVjdGlvbi5nZXRTZWxlY3RlZE5vZGUoKTsKLQkJCUpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBuZXdQYWdlID0gZ2V0RGV0YWlsc1BhZ2UobmV3Tm9kZSk7Ci0JCQlzZXRDdXJyZW50UGFnZShuZXdQYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEN1cnJlbnRQYWdlKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgY3VycmVudCBwYWdlIGFuZCBzaG93cyB0aGUgZ2l2ZW4gcGFnZS4KLQkgKgotCSAqIEBwYXJhbSBuZXdQYWdlIFRoZSBuZXcgcGFnZSB0byBkaXNwbGF5Ci0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRQYWdlKEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBwYWdlKSB7Ci0KLQkJLy8gVW5wb3B1bGF0ZSBvbGQgcGFnZQotCQlpZiAoY3VycmVudFBhZ2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlsb2coIkpwYURldGFpbHNWaWV3LnNldEN1cnJlbnRQYWdlKCkgOiBkaXNwb3Npbmcgb2YgY3VycmVudCBwYWdlIik7Ci0KLQkJCQljdXJyZW50UGFnZS5zZXRTdWJqZWN0KG51bGwpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0KLQkJSnBhRGV0YWlsc1BhZ2U8SnBhU3RydWN0dXJlTm9kZT4gbmV3UGFnZSA9IChKcGFEZXRhaWxzUGFnZTxKcGFTdHJ1Y3R1cmVOb2RlPikgcGFnZTsKLQotCQkvLyBQb3B1bGF0ZSBuZXcgcGFnZQotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWxvZygiSnBhRGV0YWlsc1ZpZXcuc2V0Q3VycmVudFBhZ2UoKSA6IHBvcHVsYXRpbmcgbmV3IHBhZ2UiKTsKLQkJCQluZXdQYWdlLnNldFN1YmplY3QoY3VycmVudFNlbGVjdGlvbi5nZXRTZWxlY3RlZE5vZGUoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBTaG93IGVycm9yIHBhZ2UKLQkJCQlwYWdlID0gbnVsbDsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsb2coIkpwYURldGFpbHNWaWV3LnNldEN1cnJlbnRQYWdlKCkgOiBObyBwYWdlIHRvIHBvcHVsYXRlIik7Ci0JCX0KLQotCQkvL25vIG5lZWQgdG8gc2hvdyB0aGUgcGFnZSBhZ2FpbiBpZiBpdCBpcyBzdGlsbCB0aGUgc2FtZQotCQlpZiAobmV3UGFnZSAhPSBudWxsICYmIGN1cnJlbnRQYWdlID09IG5ld1BhZ2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQljdXJyZW50UGFnZSA9IG5ld1BhZ2U7Ci0KLQkJLy8gU2hvdyBuZXcgcGFnZQotCQlpZiAocGFnZSA9PSBudWxsKSB7Ci0JCQlzaG93RGVmYXVsdFBhZ2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXNob3dQYWdlKHBhZ2UuZ2V0Q29udHJvbCgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3Mvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcyZmZjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uRGVmYXVsdEpwYVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkpwYVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKcGFTdHJ1Y3R1cmVQYWdlIGV4dGVuZHMgUGFnZQotCWltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi17Ci0JcHJpdmF0ZSBKcGFTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlcjsKLQkKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzOwotCQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRyb2w7Ci0JCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdlcjsKLQkKLQlwcml2YXRlIEpwYVN0cnVjdHVyZVZpZXcganBhU3RydWN0dXJlVmlldzsKLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlUGFnZShKcGFTdHJ1Y3R1cmVWaWV3IGpwYVN0cnVjdHVyZVZpZXcsIEpwYVN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyKSB7Ci0JCXRoaXMuanBhU3RydWN0dXJlVmlldyA9IGpwYVN0cnVjdHVyZVZpZXc7Ci0JCXRoaXMuc3RydWN0dXJlUHJvdmlkZXIgPSBzdHJ1Y3R1cmVQcm92aWRlcjsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KElQYWdlU2l0ZSBwYWdlU2l0ZSkgewotCQlzdXBlci5pbml0KHBhZ2VTaXRlKTsKLQkJcGFnZVNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29udHJvbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7CQkKLQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29udHJvbCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJdmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgyKTsKLQkJRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcgotCQkJPSBuZXcgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcigKLQkJCQlzdHJ1Y3R1cmVQcm92aWRlci5nZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSwKLQkJCQlzdHJ1Y3R1cmVQcm92aWRlci5nZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQkvLyBUT0RPIFVzZSBwcm9ibGVtIGRlY29yYXRvcgotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRJbnB1dChzdHJ1Y3R1cmVQcm92aWRlci5nZXRJbnB1dCgpKTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJaW5pdENvbnRleHRNZW51KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCXN0cnVjdHVyZVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvL1RPRE8gdGhpcyBpc24ndCByZWFsbHkgd29ya2luZy4gIG91ciBqcGEgYWN0aW9ucyBhcHBlYXIsIGJ1dCBhbG9uZyB3aXRoIGEgYnVuY2ggb2Ygb3RoZXIgYWN0aW9ucyEhCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRNZW51KCkgewotICAgICAgICAvLyBDcmVhdGUgZHluYW1pYyBtZW51IG1nci4gIER5bmFtaWMgaXMgY3VycmVudGx5IHJlcXVpcmVkIHRvCi0gICAgICAgIC8vIHN1cHBvcnQgYWN0aW9uIGNvbnRyaWJ1dGlvbnMuCi0gICAgICAgIE1lbnVNYW5hZ2VyIG1nciA9IG5ldyBNZW51TWFuYWdlcigpOwotICAgICAgICBtZ3Iuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotICAgICAgICBtZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZ3IpIHsKLSAgICAgICAgICAgICAgICBmaWxsQ29udGV4dE1lbnUobWdyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIE1lbnUgbWVudSA9IG1nci5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotICAgICAgICB0aGlzLmpwYVN0cnVjdHVyZVZpZXcuZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWdyLCB2aWV3ZXIpOwotICAgIH0JCi0JCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbnRleHQgbWVudSBpcyBhYm91dCB0byBvcGVuLgotICAgICAqIERlbGVnYXRlcyB0byB0aGUgYWN0aW9uIGdyb3VwIHVzaW5nIHRoZSB2aWV3ZXIncyBzZWxlY3Rpb24gYXMgdGhlIGFjdGlvbiBjb250ZXh0LgotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotICAgIH0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWNvbnRyb2wuc2V0Rm9jdXMoKTsKLQl9Ci0JCi0JCi0JCi0Jdm9pZCBzZWxlY3QoSnBhU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJdmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJfQotCQllbHNlIHsKLQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJU2VsZWN0aW9uUHJvdmlkZXIgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgSVRyZWVTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKElUcmVlU2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBKcGFTZWxlY3Rpb24gZ2V0SnBhU2VsZWN0aW9uKCkgewotCQlJVHJlZVNlbGVjdGlvbiB2aWV3ZXJTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLQkJCi0JCWlmICh2aWV3ZXJTZWxlY3Rpb24uaXNFbXB0eSgpIHx8IHZpZXdlclNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQlyZXR1cm4gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQl9Ci0JCXJldHVybiBuZXcgRGVmYXVsdEpwYVNlbGVjdGlvbigoSnBhU3RydWN0dXJlTm9kZSkgdmlld2VyU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl9Ci0JfQotCQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZChldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpcmVTZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGNyZWF0ZSBhbiBldmVudAotCQlmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSAKLQkJCQluZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbik7Ci0JCQotCQkvLyBmaXJlIHRoZSBldmVudAotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCVNhZmVSdW5uZXIucnVuKAotCQkJCQluZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWwuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL3N0cnVjdHVyZS9KcGFTdHJ1Y3R1cmVWaWV3LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWIxYWRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL3N0cnVjdHVyZS9KcGFTdHJ1Y3R1cmVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3cy5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk1lc3NhZ2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9va1ZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBKcGFTdHJ1Y3R1cmVWaWV3IGV4dGVuZHMgUGFnZUJvb2tWaWV3Ci17Ci0JcHVibGljIEpwYVN0cnVjdHVyZVZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLQkJCi0JCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9Ci0JCQlTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5nZXRTZWxlY3Rpb25NYW5hZ2VyKGdldFZpZXdTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkpOwotCQkKLQkJc2VsZWN0aW9uTWFuYWdlci5yZWdpc3Rlcih0aGlzKTsKLQkJc2VsZWN0KHNlbGVjdGlvbk1hbmFnZXIuZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbXBvcnRhbnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlyZXR1cm4gcGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgZ2V0Qm9vdHN0cmFwUGFydCgpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldFNpdGUoKS5nZXRQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQl9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUGFnZSBjcmVhdGVEZWZhdWx0UGFnZShQYWdlQm9vayBib29rKSB7Ci0JCU1lc3NhZ2VQYWdlIHBhZ2UgPSBuZXcgTWVzc2FnZVBhZ2UoKTsKLSAgICAgICAgaW5pdFBhZ2UocGFnZSk7Ci0gICAgICAgIHBhZ2UuY3JlYXRlQ29udHJvbChib29rKTsKLSAgICAgICAgcGFnZS5zZXRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuSnBhU3RydWN0dXJlVmlld19zdHJ1Y3R1cmVOb3RBdmFpbGFibGUpOwotICAgICAgICByZXR1cm4gcGFnZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBhZ2VSZWMgZG9DcmVhdGVQYWdlKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJSnBhU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIgPSAKLQkJCXN0cnVjdHVyZVByb3ZpZGVyKHBhcnQpOwotCQlpZiAoc3RydWN0dXJlUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJSnBhU3RydWN0dXJlUGFnZSBwYWdlID0gbmV3IEpwYVN0cnVjdHVyZVBhZ2UodGhpcywgc3RydWN0dXJlUHJvdmlkZXIpOwotCQkJaW5pdFBhZ2UocGFnZSk7Ci0JCQlwYWdlLmNyZWF0ZUNvbnRyb2woZ2V0UGFnZUJvb2soKSk7Ci0JCQlyZXR1cm4gbmV3IFBhZ2VSZWMocGFydCwgcGFnZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSnBhU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlKcGFGaWxlIGpwYUZpbGUgPSAKLQkJCShKcGFGaWxlKSBwYXJ0LmdldEFkYXB0ZXIoSnBhRmlsZS5jbGFzcyk7Ci0JCQotCQlpZiAoanBhRmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSnBhUGxhdGZvcm1VaSBwbGF0Zm9ybVVpID0gSnB0VWlQbHVnaW4uZ2V0UGx1Z2luKCkuanBhUGxhdGZvcm1VaShqcGFGaWxlLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpKTsKLQkJcmV0dXJuIHBsYXRmb3JtVWkuYnVpbGRTdHJ1Y3R1cmVQcm92aWRlcihqcGFGaWxlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9EZXN0cm95UGFnZShJV29ya2JlbmNoUGFydCBwYXJ0LCBQYWdlUmVjIHBhZ2VSZWNvcmQpIHsKLQkJSnBhU3RydWN0dXJlUGFnZSBwYWdlID0gKEpwYVN0cnVjdHVyZVBhZ2UpIHBhZ2VSZWNvcmQucGFnZTsKLQkJcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHBhZ2UpOwotICAgICAgICBwYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgcGFnZVJlY29yZC5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyBKcGFTZWxlY3Rpb24gZ2V0SnBhU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0Q3VycmVudFBhZ2UoKSAhPSBnZXREZWZhdWx0UGFnZSgpKSB7Ci0JCQlyZXR1cm4gKChKcGFTdHJ1Y3R1cmVQYWdlKSBnZXRDdXJyZW50UGFnZSgpKS5nZXRKcGFTZWxlY3Rpb24oKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0KEpwYVNlbGVjdGlvbiBuZXdTZWxlY3Rpb24pIHsKLQkJLy8gY29ycmVjdCBwYWdlIHNob3VsZCBiZSBzaG93bgotCQlpZiAoZ2V0Q3VycmVudFBhZ2UoKSAhPSBnZXREZWZhdWx0UGFnZSgpKSB7Ci0JCQkoKEpwYVN0cnVjdHVyZVBhZ2UpIGdldEN1cnJlbnRQYWdlKCkpLnNlbGVjdChuZXdTZWxlY3Rpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldFNlbGVjdGlvblByb3ZpZGVyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3RDaG9vc2VyUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdENob29zZXJQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjhhYzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdENob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIEEgY2hvb3NlciBpcyBzaW1wbHkgYSBwYW5lIHdpdGggdGhyZWUgd2lkZ2V0cywgdGhlIGxhYmVsIG9uIHRoZSBsZWZ0LCBhIG1haW4KLSAqIHdpZGdldCwgdXN1YWxseSBhIHRleHQgZmllbGQsIGFuZCBhIHJpZ2h0IHdpZGdldCB3aGljaCBpcyB1c3VhbGx5IGEgYnJvd3NlCi0gKiBidXR0b24uCi0gKgotICogQHNlZSBDbGFzc0Nob29zZXJQYW5lCi0gKiBAc2VlIFBhY2thZ2VDaG9vc2VyUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDaG9vc2VyUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQWJzdHJhY3RQYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIGNvbnRyb2wgc2hvd24gYWZ0ZXIgdGhlIGxhYmVsIChsZWZ0IGNvbnRyb2wpLgotCSAqLwotCXByaXZhdGUgQ29udHJvbCBtYWluQ29udHJvbDsKLQotCS8qKgotCSAqIFRoZSBjb250cm9sIHNob3duIGFmdGVyIHRoZSBtYWluIGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIHJpZ2h0Q29udHJvbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEFic3RyYWN0Q2hvb3NlclBhbmUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RDaG9vc2VyUGFuZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgYnJvd3NlIGJ1dHRvbi4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5Ci0JICoge0BsaW5rICNidWlsZFJpZ2h0Q29udHJvbChDb21wb3NpdGUpfS4KLQkgKgotCSAqIEByZXR1cm4gIkJyb3dzZS4uLiIKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyb3dzZUJ1dHRvblRleHQoKSB7Ci0JCXJldHVybiBKcHRVaU1lc3NhZ2VzLkFic3RyYWN0Q2hvb3NlclBhbmVfYnJvd3NlQnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGFjdGlvbiByZXNwb25zaWJsZSB0byBwZXJmb3JtIHRoZSBhY3Rpb24gd2hlbiB0aGUgQnJvd3NlIGlzCi0JICogY2xpY2tlZC4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+UnVubmFibGU8L2NvZGU+IHBlcmZvcm1pbmcgdGhlIGFjdHVhbCBhY3Rpb24gb2YgdGhlCi0JICogYnV0dG9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFJ1bm5hYmxlIGJ1aWxkQnJvd3NlQWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsZWZ0IGNvbnRyb2wuIEJ5IGRlZmF1bHQgYSBsYWJlbCBpcyBjcmVhdGVkIGFuZCBpdHMgdGV4dCBpcwotCSAqIHJldHJpZXZlZCBieSB7QGxpbmsgI2xhYmVsVGV4dCgpfS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGxlZnQgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGJ1aWxkTGVmdENvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gYnVpbGRMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtYWluIGNvbnRyb2wgb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgbWFpbiBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgYnVpbGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHJpZ2h0IGNvbnRyb2wuIEJ5IGRlZmF1bHQgYSBicm93c2UgYnV0dG9uIGlzIGNyZWF0ZWQgYW5kIGl0cwotCSAqIGFjdGlvbiBpcyBwZXJmb3JtZWQgYnkge0BsaW5rICNidWlsZEJyb3dzZUFjdGlvbigpfSBhbmQgaXRzIHRleHQgaXMKLQkgKiByZXRyaWV2ZWQgYnkge0BsaW5rICNicm93c2VCdXR0b25UZXh0KCl9LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgcmlnaHQgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGJ1aWxkUmlnaHRDb250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIGJ1aWxkQnV0dG9uKAotCQkJY29udGFpbmVyLAotCQkJYnJvd3NlQnV0dG9uVGV4dCgpLAotCQkJYnVpbGRCcm93c2VBY3Rpb24oKQotCQkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQotCQlpZiAoIW1haW5Db250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJbWFpbkNvbnRyb2wuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCi0JCWlmICghcmlnaHRDb250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJcmlnaHRDb250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoZWxwIHRvcGljIElEIGZvciB0aGUgY29udHJvbHMgb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCBvdGhlcndpc2UgdGhlIHN1YmNsYXNzIGNhbiByZXR1cm4gYW4gSUQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGhlbHBJZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJbWFpbkNvbnRyb2wgID0gYnVpbGRNYWluQ29udHJvbChjb250YWluZXIpOwotCQlyaWdodENvbnRyb2wgPSBidWlsZFJpZ2h0Q29udHJvbChjb250YWluZXIpOwotCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWJ1aWxkTGVmdENvbnRyb2woY29udGFpbmVyKSwKLQkJCW1haW5Db250cm9sLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBvZiB0aGUgbGFiZWwuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieQotCSAqIHtAbGluayAjYnVpbGRMZWZ0Q29udHJvbChDb21wb3NpdGUpfS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCB0ZXh0IG9mIHRoZSBsZWZ0IGNvbnRyb2wgKHdoaWNoIGlzIGEgbGFiZWwgYnkKLQkgKiBkZWZhdWx0KQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgbGFiZWxUZXh0KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0RGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjY5ZTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgZGlhbG9nIHVzaW5nIGEgInN0YXRlIG9iamVjdCIgKG1vZGVsIG9iamVjdCkKLSAqIGZvciBiZWhhdmlvci4KLSAqIDxwPgotICogVGhlIG1haW4gcGFuZSBvZiB0aGlzIGRpYWxvZyBzaG91bGQgYmUgZXh0ZW5kaW5nIDxjb2RlPkFic3RyYWN0RGlhbG9nUGFuZTwvY29kZT4KLSAqIGZvciBjcmVhdGluZyB0aGUgcmlnaHQgdHlwZSBvZiB3aWRnZXRzIGFuZCBpdCBoYXMgdGhlICJzdGF0ZSBvYmplY3QiIChzdWJqZWN0KQotICogYmVoYXZpb3IgYnVpbHQtaW4uCi0gKgotICogQHNlZSBOb2RlCi0gKiBAc2VlIEFic3RyYWN0RGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpYWxvZzxUIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cKLXsKLQkvKioKLQkgKiBUaGUgbWFpbiBjb250ZW50IHBhbmUgb2YgdGhpcyBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBBYnN0cmFjdERpYWxvZ1BhbmU8Pz4gcGFuZTsKLQotCS8qKgotCSAqIFRoZSBob2xkZXIgb2YgdGhlICJzdGF0ZSBvYmplY3QiIHVzZWQgYnkgdGhpcyBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyOwotCi0JLyoqCi0JICogQ2FjaGVzIHRoZSB0aXRsZSB0ZXh0IHVudGlsIHRoZSBkaWFsb2cgaXMgY3JlYXRlZCBhbmQgdGhlIGRpYWxvZydzIHNoZWxsCi0JICogbmVlZHMgdG8gYmUgY29uZmlndXJlZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3REaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQl0aGlzKHBhcmVudCwgIiIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3REaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIHRpdGxlIFRoZSBkaWFsb2cncyB0aXRsZQotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdERpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgbWFpbiBwYW5lIG9mIHRoaXMgZGlhbG9nLiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIG9ubHkKLQkgKiB3aGVuIHRoZSBkaWFsb2cgaXMgcmVxdWVzdGVkIHRvIHNob3cgb24gc2NyZWVuIGFuZCBub3QgZHVyaW5nCi0JICogaW5pdGlhbGl6YXRpb24uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgdG8gd2hpY2ggdGhlIHdpZGdldHMgc2hvdWxkIGJlIGFkZGVkIHRvLAotCSAqIHRoZSBsYXlvdXQgaXMgYWxyZWFkeSBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQWJzdHJhY3REaWFsb2dQYW5lPD8+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgc3RhdGUgb2JqZWN0IChtb2RlbCBvYmplY3QpIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGtlZXAgdHJhY2sKLQkgKiBvZiB0aGUgaW5mb3JtYXRpb24gZW50ZXJlZCBpbiB0aGlzIGRpYWxvZy4gVGhlIHN0YXRlIG9iamVjdCB3aWxsIGJlIHN0b3JlZAotCSAqIGluIHRoZSBzdWJqZWN0IGhvbGRlciBhbmQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB7QGxpbmsgI3N1YmplY3QoKX0uCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IHN0YXRlIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBUIGJ1aWxkU3RhdGVPYmplY3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4gdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gY2hhbmdlcyBhcmUKLQkgKiBtYWRlIHRvIHRoZSBzdGF0ZSBvYmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIHNldCBvbiB0aGUgc3RhdGUgb2JqZWN0Ci0JICovCi0JTm9kZS5WYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBOb2RlLk5VTExfVkFMSURBVE9SOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCi0JCS8vIERpc3Bvc2UgdGhlIHBhbmUgaW4gb3JkZXIgdG8gcmVtb3ZlIGFueSBsaXN0ZW5lcnMgdGhhdCBjb3VsZAotCQkvLyBoYXZlIGJlZW4gaW5zdGFsbGVkIG91dHNpZGUgdGhlIHNjcm9wZSBvZiB0aGUgc3RhdGUgb2JqZWN0Ci0JCWlmIChwYW5lICE9IG51bGwpIHsKLQkJCXBhbmUuZGlzcG9zZSgpOwotCQkJcGFuZSA9IG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KHRpdGxlKCkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQlpbnN0YWxsU3ViamVjdCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGhhc1RpdGxlQXJlYSgpKSB7Ci0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJfQotCi0JCXJldHVybiBjcmVhdGVEZWZhdWx0Q29udGVudChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgbWFpbiBjb250YWluZXIgb2YgdGhpcyBkaWFsb2cgd2hlbiB0aGUgdGl0bGUgYXJlYSBpcwotCSAqIG5vdCByZXF1aXJlZC4gVGhlIHRvcCBwYXJ0IGlzIHRoZSBkaWFsb2cgYXJlYSBwb3B1bGF0ZWQgYnkgdGhlIHN1YmNsYXNzCi0JICogYW5kIHRoZSBsb3dlciBwYXJ0IGlzIHRoZSBidXR0b24gcGFuZSBoYXZpbmcgdGhlIE9LIGFuZCBDYW5jZWwgYnV0dG9ucy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZQotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZURlZmF1bHRDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCAgICAgID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ICAgID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICAgICA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXBvc2l0ZSk7Ci0JCWRpYWxvZ0FyZWEgPSBjcmVhdGVEaWFsb2dBcmVhKGNvbXBvc2l0ZSk7Ci0JCWJ1dHRvbkJhciAgPSBjcmVhdGVCdXR0b25CYXIoY29tcG9zaXRlKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gSWYgdGhlIHRpdGxlIGFyZWEgbmVlZHMgdG8gYmUgc2hvd24sIHRoZW4gbGVhdmUgdGhlIHN1cGVyY2xhc3MgdG8KLQkJLy8gY3JlYXRlIHRoZSBuZWNlc3Nhcnkgd2lkZ2V0cwotCQlpZiAoaGFzVGl0bGVBcmVhKCkpIHsKLQkJCXBhcmVudCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgbWFpbiBhcmVhJ3MgY29udGFpbmVyCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ICAgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgICA9IHRydWU7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBJbml0aWFsaXplIHRoZSBjb250ZW50IHBhbmUKLQkJcGFuZSA9IGJ1aWxkTGF5b3V0KGNvbnRhaW5lcik7Ci0JCXBhbmUucG9wdWxhdGUoKTsKLQotCQkvLyBJbml0aWFsaXplIHRoZSBVSSBwYXJ0LCB3aGljaCByZXF1aXJlcyB0aGUgd2lkZ2V0cyBiZWluZyBjcmVhdGVkCi0JCWluaXRpYWxpemVVSSgpOwotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXNjcmlwdGlvbiBhcmVhICh3aGVyZSBhIHRpdGxlLCBkZXNjcmlwdGlvbiBhbmQKLQkgKiBpbWFnZSkgc2hvdWxkIGJlIHZpc2libGUgb3IgaGlkZGVuLiA8Y29kZT5BYnN0cmFjdFZhbGlkYXRpbmdEaWFsb2c8L2NvZGU+Ci0JICogYXV0b21hdGljYWxseSBzaG93IHRoZSBkZXNjcmlwdGlvbiBhcmVhIGluIG9yZGVyIHRvIHNob3cgcHJvYmxlbXMuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBieSBkZWZhdWx0LCB3aGljaCBtZWFucyB0aGUgbWV0aG9kcyB1c2VkIHRvCi0JICogdXBkYXRlIHRoZSB0aXRsZSwgZGVzY3JpcHRpb24gYW5kIGltYWdlIHNob3VsZG4ndCBiZSBjYWxsZWQ7IDxjb2RlPnRydWU8L2NvZGU+Ci0JICogdG8gbWFrZSB0aGUgZGVzY3JpcHRpb24gcGFuZSB2aXNpYmxlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzVGl0bGVBcmVhKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVscHMgc3lzdGVtLgotCSAqCi0JICogQHJldHVybiBUaGUgcGxhdGZvcm0ncyBoZWxwIHN5c3RlbQotCSAqCi0JICogQGNhdGVnb3J5IEhlbHBlcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBkaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUPigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBVSSBwYXJ0IG9mIHRoaXMgZGlhbG9nLCB0aGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgd2lkZ2V0cwotCSAqIGhhdmUgYmVlbiBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVVSSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzdGF0ZSBvYmplY3QsIGlmIG9uZSBpcyBuZWVkZWQgYW5kIGluc3RhbGwgYSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+Ci0JICogaW4gb3JkZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgY2hhbmdlcyBkb25lIHRvIHRoYXQgc3RhdGUgb2JqZWN0LiBUaGUKLQkgKiBzdWJqZWN0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgc3ViamVjdCBob2xkZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxTdWJqZWN0KCkgewotCi0JCVQgc3ViamVjdCA9IGJ1aWxkU3RhdGVPYmplY3QoKTsKLQotCQlpZiAoc3ViamVjdCAhPSBudWxsKSB7Ci0JCQlzdWJqZWN0LnNldFZhbGlkYXRvcihidWlsZFZhbGlkYXRvcigpKTsKLQkJfQotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUoc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgbGF1bmNoZXMgdGhpcyBkaWFsb2cgaW4gdGhlIFVJIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBvcGVuRGlhbG9nKCkgewotCQlTV1RVdGlsLnNldFVzZXJJbnRlcmZhY2VBY3RpdmUoZmFsc2UpOwotCQlTV1RVdGlsLnNob3codGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgbGF1bmNoZXMgdGhpcyBkaWFsb2cgaW4gdGhlIFVJIHRocmVhZCBhbmQgaW52b2tlIHRoZSBnaXZlbgotCSAqIDxjb2RlPlBvc3RFeGVjdXRpb248L2NvZGU+IHRvIHBlcmZvcm0gYW55IHBvc3QtdGFzay4KLQkgKgotCSAqIEBwYXJhbSBwb3N0RXhlY3V0aW9uIFRoaXMgaW50ZXJmYWNlIGxldCB0aGUgY2FsbGVyIHRvIGludm9rZSBhIHBpZWNlIG9mCi0JICogY29kZSBvbmNlIHRoZSBkaWFsb2cgaXMgZGlzcG9zZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBvcGVuRGlhbG9nKFBvc3RFeGVjdXRpb248PyBleHRlbmRzIEFic3RyYWN0RGlhbG9nPFQ+PiBleGVjdXRpb24pIHsKLQkJU1dUVXRpbC5zZXRVc2VySW50ZXJmYWNlQWN0aXZlKGZhbHNlKTsKLQkJU1dUVXRpbC5zaG93KHRoaXMsIGV4ZWN1dGlvbik7Ci0JfQotCi0JLyoqCi0JICogR2l2ZXMgYWNjZXNzIHRvIHRoZSBkaWFsb2cncyBtYWluIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwYW5lIHNob3dpbmcgdGhlIGN1c3RvbSB3aWRnZXRzCi0JICovCi0JQWJzdHJhY3REaWFsb2dQYW5lPD8+IHBhbmUoKSB7Ci0JCXJldHVybiBwYW5lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN1YmplY3Qgb2YgdGhpcyBkaWFsb2cuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0IG9mIHRoaXMgZGlhbG9nIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1YmplY3Qgd2FzCi0JICogdXNlZAotCSAqLwotCXB1YmxpYyBUIHN1YmplY3QoKSB7Ci0JCXJldHVybiBzdWJqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0LgotCSAqCi0JICogQHJldHVybiBUaGUgc3ViamVjdCBob2xkZXIgdXNlZCB0byBiZSBwYXNzZWQgdG8gdGhlIGRpYWxvZyBwYW5lLCB3aGljaCBpcwotCSAqIGFuIGluc3RhbmNlIG9mIDxjb2RlPkFic3RyYWN0RGlhbG9nUGFuZTwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBzdWJqZWN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGlhbG9nJ3MgdGl0bGUuIFRoZSB0aXRsZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUKLQkgKiByZXR1cm5lZCBieSBkZWZhdWx0IGJ1dCBpZiBpdCB3YXNuJ3Qgc3BlY2lmaWVkLCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZAotCSAqIHRvIHJldHVybiBpdC4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSB0aXRsZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG9yIGEgZGlmZmVyZW50IHRpdGxlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGlhbG9nIHdhcyBjYW5jZWxsZWQgb3Igbm90LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGlhbG9nIHdhcyBjYW5jZWxsZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGl0IHdhcyBjb25maXJtZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiB3YXNDYW5jZWxsZWQoKSB7Ci0JCXJldHVybiBnZXRSZXR1cm5Db2RlKCkgPT0gQ0FOQ0VMOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGlhbG9nIHdhcyBjb25maXJtZWQgb3Igbm90LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGlhbG9nIHdhcyBjb25maXJtZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGl0IHdhcyBjYW5jZWxsZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiB3YXNDb25maXJtZWQoKSB7Ci0JCXJldHVybiBnZXRSZXR1cm5Db2RlKCkgPT0gT0s7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3REaWFsb2dQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0RGlhbG9nUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGJmNWE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3REaWFsb2dQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IHBhbmUgdG8gdXNlIHdoZW4gdGhlIHBhbmUgaXMgc2hvd24gaW4gYW4gPGNvZGU+QWJzdHJhY3REaWFsb2c8L2NvZGU+LgotICoKLSAqIEBzZWUgQWJzdHJhY3REaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGlhbG9nUGFuZTxUIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBBYnN0cmFjdFBhbmU8VD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdERpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3REaWFsb2dQYW5lKEFic3RyYWN0RGlhbG9nUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3REaWFsb2dQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbGxlcjsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdERpYWxvZ1BhbmUoQWJzdHJhY3REaWFsb2dQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdERpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3REaWFsb2dQYW5lKEFic3RyYWN0RGlhbG9nUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdERpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBjb250cm9sbGVyOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RGlhbG9nUGFuZShBYnN0cmFjdERpYWxvZ1BhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3REaWFsb2dQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdERpYWxvZ1BhbmUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgRGVmYXVsdFdpZGdldEZhY3RvcnkuaW5zdGFuY2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3RFbnVtQ29tYm9WaWV3ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3RFbnVtQ29tYm9WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3ZmYwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0RW51bUNvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNpbXBseSBzaG93cyBhIGNvbWJvIHdoZXJlIGl0cyBkYXRhIGlzIHBvcHVsYXRpbmcgdGhyb3VnaAotICoge0BsaW5rICNjaG9pY2VzKCl9IGFuZCBhIGRlZmF1bHQgdmFsdWUgY2FuIGFsc28gYmUgYWRkZWQuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbnVtQ29tYm9WaWV3ZXI8VCBleHRlbmRzIE1vZGVsLCBWPiBleHRlbmRzIEFic3RyYWN0UGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBtYWluIHdpZGdldCBvZiB0aGlzIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBDb21ib1ZpZXdlciBjb21ib1ZpZXdlcjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgdXNlZCB0byByZXByZXNlbnQgdGhlIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfVkFMVUUgPSAibnVsbCI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0RW51bUNvbWJvVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCUFic3RyYWN0RW51bUNvbWJvVmlld2VyKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0RW51bUNvbWJvVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCUFic3RyYWN0RW51bUNvbWJvVmlld2VyKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0RW51bUNvbWJvVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKi8KLQlBYnN0cmFjdEVudW1Db21ib1ZpZXdlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxpc3Qgb2YgY2hvaWNlcyBhbmQgYWRkIGFuIGV4dHJhIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZQotCSAqIGRlZmF1bHQgdmFsdWUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBjb21ibydzIGNob2ljZXMgaW5jbHVkaW5nIHRoZSBkZWZhdWx0IHZhbHVlCi0JICovCi0JcHJpdmF0ZSBPYmplY3RbXSBidWlsZENob2ljZXMoKSB7Ci0JCVZbXSBjaG9pY2VzID0gY2hvaWNlcygpOwotCQlpZiAoc29ydENob2ljZXMoKSkgewotCQkJQXJyYXlzLnNvcnQoY2hvaWNlcywgYnVpbGRDb21wYXJhdG9yKCkpOwotCQl9Ci0KLQkJT2JqZWN0W10gZXh0ZW5kZWRDaG9pY2VzID0gbmV3IE9iamVjdFtjaG9pY2VzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNob2ljZXMsIDAsIGV4dGVuZGVkQ2hvaWNlcywgMSwgY2hvaWNlcy5sZW5ndGgpOwotCQlleHRlbmRlZENob2ljZXNbMF0gPSBOVUxMX1ZBTFVFOwotCi0JCXJldHVybiBleHRlbmRlZENob2ljZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgdG8gc29ydCB0aGUgY2hvaWNlcyBpbiBhbHBoYWJldGljYWwgb3JkZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4gd2l0aCB0aGUgcmlnaHQgY29tYm8gd2lkZ2V0cy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgY29tYm8KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiBjb250YWluaW5nIHRoZSByaWdodCBjb21ibyB3aWRnZXQKLQkgKi8KLQlhYnN0cmFjdCBDb21ib1ZpZXdlciBidWlsZENvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIpOwotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPE9iamVjdD4gYnVpbGRDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQkJCWZpbmFsIExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IGJ1aWxkTGFiZWxQcm92aWRlcigpOwotCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMSA9IGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh2YWx1ZTEpOwotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMiA9IGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh2YWx1ZTIpOwotCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGxvY2FsaXplZCBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gTkxTIGNsYXNzIGJ5IGNyZWF0aW5nIHRoZQotCSAqIGtleS4gVGhhdCBrZXkgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGNvbXBvc2l0ZSdzIHNob3J0IGNsYXNzIG5hbWUKLQkgKiB3aXRoIHRoZSB0b1N0cmluZygpIG9mIHRoZSBnaXZlbiB2YWx1ZSBzZXBhcmF0ZWQgYnkgYW4gdW5kZXJzY29yZS4KLQkgKgotCSAqIEBwYXJhbSBubHNDbGFzcyBUaGUgTkxTIGNsYXNzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGxvY2FsaXplZCB0ZXh0Ci0JICogQHBhcmFtIGNvbXBvc2l0ZUNsYXNzIFRoZSBjbGFzcyB1c2VkIGZvciBjcmVhdGluZyB0aGUga2V5LCBpdHMgc2hvcnQgY2xhc3MKLQkgKiBuYW1lIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdXNlZCB0byBhcHBlbmQgaXRzIHRvU3RyaW5nKCkgdG8gdGhlIGdlbmVyYXRlZCBrZXkKLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoQ2xhc3M8Pz4gbmxzQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY29tcG9zaXRlQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7Ci0KLQkJcmV0dXJuIFNXVFV0aWwuYnVpbGREaXNwbGF5U3RyaW5nKG5sc0NsYXNzLCBjb21wb3NpdGVDbGFzcywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgbG9jYWxpemVkIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBOTFMgY2xhc3MgYnkgY3JlYXRpbmcgdGhlCi0JICoga2V5LiBUaGF0IGtleSBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgY29tcG9zaXRlJ3Mgc2hvcnQgY2xhc3MgbmFtZQotCSAqIHdpdGggdGhlIHRvU3RyaW5nKCkgb2YgdGhlIGdpdmVuIHZhbHVlIHNlcGFyYXRlZCBieSBhbiB1bmRlcnNjb3JlLgotCSAqCi0JICogQHBhcmFtIG5sc0NsYXNzIFRoZSBOTFMgY2xhc3MgdXNlZCB0byByZXRyaWV2ZSB0aGUgbG9jYWxpemVkIHRleHQKLQkgKiBAcGFyYW0gY29tcG9zaXRlIFRoZSBvYmplY3QgdXNlZCB0byByZXRyaWV2ZSB0aGUgc2hvcnQgY2xhc3MgbmFtZSB0aGF0IGlzCi0JICogdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB1c2VkIHRvIGFwcGVuZCBpdHMgdG9TdHJpbmcoKSB0byB0aGUgZ2VuZXJhdGVkIGtleQotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhDbGFzczw/PiBubHNDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkgewotCi0JCXJldHVybiBTV1RVdGlsLmJ1aWxkRGlzcGxheVN0cmluZyhubHNDbGFzcywgY29tcG9zaXRlLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlzcGxheSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCBpcyB0aGUKLQkgKiB2aXJ0dWFsIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIHRoZW4gaXRzIGRpc3BsYXkgc3RyaW5nIHdpbGwgYmUgIkRlZmF1bHQiCi0JICogYXBwZW5kZWQgYnkgdGhlIGFjdHVhbCBkZWZhdWx0IHZhbHVlLCBpZiBpdCBleGlzdHMuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQgaW50byBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZwotCSAqIEByZXR1cm4gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IE5VTExfVkFMVUUpIHsKLQkJCVYgZGVmYXVsdFZhbHVlID0gKHN1YmplY3QoKSAhPSBudWxsKSA/IGRlZmF1bHRWYWx1ZSgpIDogbnVsbDsKLQotCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBkaXNwbGF5U3RyaW5nKGRlZmF1bHRWYWx1ZSk7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWVzc2FnZXMuRW51bUNvbWJvVmlld2VyX2RlZmF1bHRXaXRoRGVmYXVsdCwgZGlzcGxheVN0cmluZyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBkaXNwbGF5U3RyaW5nKChWKSB2YWx1ZSk7Ci0JfQotCi0JZmluYWwgTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZyhlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gYnVpbGRTZWxlY3Rpb24oKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IChzdWJqZWN0KCkgIT0gbnVsbCkgPyBnZXRWYWx1ZSgpIDogbnVsbDsKLQotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBOVUxMX1ZBTFVFOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQlpZiAoIWlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCXZhbHVlQ2hhbmdlZChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3NzaWJsZSBjaG9pY2VzIHRvIHNob3cgaW4gdGhlIHZpZXdlci4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGl0ZW1zIHRvIHNob3cgaW4gdGhlIGNvbWJvcwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBWW10gY2hvaWNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZCBpZiB0aGUgc3ViamVjdCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBUaGUgdmFsdWUgdGhhdCBpcyBkZWNsYXJlZCBhcyBiZWluZyB0aGUgZGVmYXVsdCB3aGVuIGl0IGlzIG5vdAotCSAqIGRlZmluZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBWIGRlZmF1bHRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRyYW5zbGF0ZSBpbnRvIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZGlzcGxheVN0cmluZyhWIHZhbHVlKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucwotCSAqCi0JICogQHJldHVybgotCSAqLwotCWZpbmFsIENvbWJvVmlld2VyIGdldENvbWJvVmlld2VyKCkgewotCQlyZXR1cm4gY29tYm9WaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBzdWJqZWN0J3MgdmFsdWUuIFRoZSBzdWJqZWN0IGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBUaGUgc3ViamVjdCcgdmFsdWUsIHdoaWNoIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBWIGdldFZhbHVlKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmNvbWJvVmlld2VyID0gdGhpcy5idWlsZENvbWJvVmlld2VyKGNvbnRhaW5lcik7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGJ1aWxkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgY29tYm8gYnkgcmUtYWRkaW5nIGFsbCB0aGUgaXRlbXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0KLQkJcmVtb3ZlQWxsKCk7Ci0JCWNvbWJvVmlld2VyLmFkZChidWlsZENob2ljZXMoKSk7Ci0JCXVwZGF0ZVNlbGVjdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLnBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCB0aGUgaXRlbXMgZnJvbSB0aGUgY29tYm8uCi0JICovCi0JYWJzdHJhY3Qgdm9pZCByZW1vdmVBbGwoKTsKLQotCS8qKgotCSAqIFJlcXVlc3RzIHRoZSBnaXZlbiBuZXcgdmFsdWUgYmUgc2V0IG9uIHRoZSBzdWJqZWN0LgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0VmFsdWUoViB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjdXJzb3IsIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHNob3cgdGhlIGVudGlyZSBzZWxlY3RlZCBpdGVtCi0JICogd2l0aGluIHRoZSBjb21ibydzIGFyZWEuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCB1cGRhdGVDdXJzb3IoKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGNvbWJvJ3Mgc2VsZWN0ZWQgaXRlbS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uKCkgewotCQljb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24oYnVpbGRTZWxlY3Rpb24oKSk7Ci0JCXVwZGF0ZUN1cnNvcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZWxlY3Rpb24gY2hhbmdlcywgbm90aWZ5IHRoZSBzdWJjbGFzcyB0byBzZXQgdGhlIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgc2VsZWN0ZWQgaXRlbQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgdm9pZCB2YWx1ZUNoYW5nZWQoT2JqZWN0IHZhbHVlKSB7Ci0KLQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCAibnVsbCIgdmFsdWUgdG8gYSByZWFsIG51bGwKLQkJaWYgKHZhbHVlID09IE5VTExfVkFMVUUpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCi0JCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0KLQkJdHJ5IHsKLQkJCXNldFZhbHVlKChWKSB2YWx1ZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3RGb3JtUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdEZvcm1QYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOTM3YTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdEZvcm1QYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBwYW5lIHRvIHVzZSB3aGVuIHRoZSBwYW5lIGlzIHNob3duIHVzaW5nIHRoZSBmb3JtIGxvb2sgYW5kIGZlZWwsCi0gKiB3aGljaCBpcyBoYW5kbGVkIGJ5IDxjb2RlPlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5PC9jb2RlPi4KLSAqCi0gKiBAc2VlIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZvcm1QYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBBYnN0cmFjdFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0Rm9ybVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0Rm9ybVBhbmUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0Rm9ybVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBjb250cm9sbGVyOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0Rm9ybVBhbmUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEZvcm1QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0Rm9ybVBhbmUoQWJzdHJhY3RGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0Rm9ybVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBjb250cm9sbGVyOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0Rm9ybVBhbmUoQWJzdHJhY3RGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEZvcm1QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RGb3JtUGFuZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RGb3JtUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0Rm9ybVBhbmUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybVRvb2xraXQgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXRoaXMoc3ViamVjdEhvbGRlciwgcGFyZW50LCBuZXcgRm9ybVdpZGdldEZhY3Rvcnkod2lkZ2V0RmFjdG9yeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdHVhbCB3aWRnZXQgZmFjdG9yeSB3cmFwcGVkIGJ5IHRoZSA8Y29kZT5JV2lkZ2V0RmFjdG9yeTwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzIHdpdGggdGhlIGZvcm0gc3R5bGUKLQkgKiAoZmxhdC1zdHlsZSkgbG9vayBhbmQgZmVlbAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBGb3JtVG9vbGtpdCBnZXRGb3JtV2lkZ2V0RmFjdG9yeSgpIHsKLQkJRm9ybVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSA9IChGb3JtV2lkZ2V0RmFjdG9yeSkgZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5nZXRXaWRnZXRGYWN0b3J5KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3RQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0UGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzcwNTAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3RQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5DQ29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Db21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UZXh0RmllbGRNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xBbGlnbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRCdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZENvbnRyb2xVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiBhIHBhbmUgd2hpY2ggaG9sZHMgb250byBhIDxjb2RlPlByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4KLSAqIHRoYXQgY29udGFpbnMgdGhlIHN1YmplY3Qgb2YgdGhpcyBwYW5lLgotICogPHA+Ci0gKiBJdCBhbHNvIGNvbnRhaW5zIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGJ1aWxkaW5nIGJ1dHRvbnMsIGxhYmVscywgY2hlY2sKLSAqIGJveGVzLCBhbmQgcmFkaW8gYnV0dG9ucywgZXRjLgotICogPHA+Ci0gKiBJdCBpcyBwb3NzaWJsZSB0byBlYXNpbHkgbGlzdGVuIHRvIGFueSBwcm9wZXJ0eSBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQotICogc3ViamVjdCwge0BsaW5rICNhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb24pfSBpcyBzcGVjaWZ5IHdoaWNoIHByb3BlcnRpZXMKLSAqIGFyZSBvZiBpbnRlcmVzdCBhbmQge0BsaW5rICNwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nKX0gaXMgdXNlZCB0byBub3RpZnkgdGhlCi0gKiBwYW5lIHdoZW4gdGhlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotICoKLSAqIEBzZWUgQWJzdHJhY3RGb3JtUGFuZQotICogQHNlZSBBYnN0cmFjdERpYWxvZ1BhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYW5lPFQgZXh0ZW5kcyBNb2RlbD4KLXsKLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzdWJqZWN0IGluIG9yZGVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gYQotCSAqIHByb3BlcnR5IGhhcyBjaGFuZ2VkLCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIGRldGVybWluZWQgYnkKLQkgKiB7QGxpbmsgI3Byb3BlcnR5TmFtZXMoKX0uCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGFzcGVjdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIGNvbnRhaW5lciBvZiB0aGlzIGNvbXBvc2l0ZS4KLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7Ci0KLQkvKioKLQkgKgotCSAqLwotCXByaXZhdGUgQXJyYXlMaXN0PEFic3RyYWN0UGFuZTw/Pj4gaW50ZXJuYWxQYW5lc0ZvckVuYWJsZW1lbnRDb250cm9sOwotCi0JLyoqCi0JICogVGhlIGFsaWduZXIgcmVzcG9uc2libGUgdG8gYWxpZ24gdGhlIGxlZnQgY29udHJvbHMuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sQWxpZ25lciBsZWZ0Q29udHJvbEFsaWduZXI7Ci0KLQkvKioKLQkgKiBGbGFnIHVzZWQgdG8gc3RvcCB0aGUgY2lyY3VsYXIgcG9wdWxhdGlvbiBvZiB3aWRnZXRzLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBwb3B1bGF0aW5nOwotCi0JLyoqCi0JICogVGhlIGFsaWduZXIgcmVzcG9uc2libGUgdG8gYWxpZ24gdGhlIGxlZnQgY29udHJvbHMuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sQWxpZ25lciByaWdodENvbnRyb2xBbGlnbmVyOwotCi0JLyoqCi0JICogVGhpcyBsaXN0ZW5lciBpcyByZWdpc3RlcmVkIHdpdGggdGhlIHN1YmplY3QgaG9sZGVyIGluIG9yZGVyIHRvCi0JICogYXV0b21hdGljYWxseSByZXBvcHVsYXRlIHRoaXMgcGFuZSB3aXRoIHRoZSBuZXcgc3ViamVjdC4KLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc3ViamVjdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIHN1YmplY3Qgb2YgdGhpcyBwYW5lLgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXI7Ci0KLQkvKioKLQkgKiBUaGUgY29sbGVjdGlvbiBvZiByZWdpc3RlcmVkIHN1Yi1wYW5lcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbm90aWZpZWQKLQkgKiB3aGVuIGxpc3RlbmVycyBuZWVkIHRvIGJlIGVuZ2FnZWQgb3IgZGlzZW5nYWdlZCBvciB3aGVuIHRvIHBvcHVsYXRlIGl0cwotCSAqIHdpZGdldHMuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEFic3RyYWN0UGFuZTw/Pj4gc3ViUGFuZXM7Ci0KLQkvKioKLQkgKiBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzLgotCSAqLwotCXByaXZhdGUgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5OwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbDwvY29kZT5zIHRoYXQgYXJlIGRpc3BsYXllZCBpbiB0aGlzIHBhbmUsCi0JICogd2hpY2ggd2lsbCBoYXZlIHRoZWlyIGVuYWJsZW1lbnQgc3RhdGUgdXBkYXRlZCB3aGVuCi0JICoge0BsaW5rICNlbmFibGVXaWRnZXRzKGJvb2xlYW4pfSBpcyBjYWxsZWQuCi0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3Q8Q29udHJvbD4gd2lkZ2V0czsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RTdWJqZWN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIEFic3RyYWN0UGFuZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0U3ViamVjdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0UGFuZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLCBwYXJlbnQsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RTdWJqZWN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IHBhbmU7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQYW5lKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQl0aGlzKHBhcmVudFBhbmUsCi0JCSAgICAgcGFyZW50UGFuZS5nZXRTdWJqZWN0SG9sZGVyKCksCi0JCSAgICAgcGFyZW50LAotCQkgICAgIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RTdWJqZWN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFBhbmUoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RTdWJqZWN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IHBhbmU7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQYW5lKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCi0JCXRoaXMoc3ViamVjdEhvbGRlciwKLQkJICAgICBwYXJlbnQsCi0JCSAgICAgcGFyZW50UGFuZS5nZXRXaWRnZXRGYWN0b3J5KCkpOwotCi0JCWluaXRpYWxpemUocGFyZW50UGFuZSwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdFN1YmplY3RQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQYW5lKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcigpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZShzdWJqZWN0SG9sZGVyLCB3aWRnZXRGYWN0b3J5KTsKLQotCQl0cnkgewotCQkJdGhpcy5wb3B1bGF0aW5nID0gdHJ1ZTsKLQotCQkJdGhpcy5jb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udGFpbmVyKHBhcmVudCk7Ci0JCQl0aGlzLmluaXRpYWxpemVMYXlvdXQodGhpcy5jb250YWluZXIpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5wb3B1bGF0aW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBwYW5lJ3Mgd2lkZ2V0cyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgd2l0aCBpdHMKLQkgKiBsZWZ0IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgdG8gdGhpcyBwYW5lJ3MgbGVmdAotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBzbyB0aGF0IHRoZWlyIHdpZHRoIGNhbiBiZSBhZGp1c3RlZCB0byBoYXZlCi0JICogdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0byBhZGQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRBbGlnbkxlZnQoQWJzdHJhY3RQYW5lPD8+IGNvbnRhaW5lcikgewotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lci5hZGQoY29udGFpbmVyLmxlZnRDb250cm9sQWxpZ25lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29udHJvbCB0byB0aGUgY29sbGVjdGlvbiBvZiB3aWRnZXRzIHRoYXQgaGF2ZSB0aGVpciB3aWR0aAotCSAqIGFkanVzdCB3aXRoIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4gVGhlIGxlZnQgYWxpZ25tZW50IGlzIHVzdWFsbHkKLQkgKiB1c2VkIGZvciBsYWJlbHMuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB0byBhZGQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRBbGlnbkxlZnQoQ29udHJvbCBjb250cm9sKSB7Ci0JCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBwYW5lJ3Mgd2lkZ2V0cyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgd2l0aCBpdHMKLQkgKiByaWdodCA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4pIHRvIHRoaXMgcGFuZSdzIHJpZ2h0Ci0JICogPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+IHNvIHRoYXQgdGhlaXIgd2lkdGggY2FuIGJlIGFkanVzdGVkIHRvIGhhdmUKLQkgKiB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRvIGFkZAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZEFsaWduUmlnaHQoQWJzdHJhY3RQYW5lPD8+IGNvbnRhaW5lcikgewotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIuYWRkKGNvbnRhaW5lci5yaWdodENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb250cm9sIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHdpZGdldHMgdGhhdCBoYXZlIHRoZWlyIHdpZHRoCi0JICogYWRqdXN0IHdpdGggdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LiBUaGUgbGVmdCBhbGlnbm1lbnQgaXMgdXN1YWxseQotCSAqIHVzZWQgZm9yIGJ1dHRvbnMuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB0byBhZGQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRBbGlnblJpZ2h0KENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2wpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIHBhbmUncyBjb250cm9scyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgZm9yCi0JICogYWxpZ25tZW50KSBmcm9tIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdG8gYWRkIGZvcgotCSAqIGFsaWdubWVudAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFBhbmVGb3JBbGlnbm1lbnQoQWJzdHJhY3RQYW5lPD8+IGNvbnRhaW5lcikgewotCQlhZGRBbGlnbkxlZnQoY29udGFpbmVyKTsKLQkJYWRkQWxpZ25SaWdodChjb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYW55IHByb3BlcnR5IG5hbWVzIHRvIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGluIG9yZGVyIHRvIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGUgYWN0dWFsIHByb3BlcnR5IGNoYW5nZXMgaW4gdGhlIHN1YmplY3QuCi0JICoKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBwcm9wZXJ0eSBuYW1lcyB0byByZWdpc3RlciB3aXRoIHRoZQotCSAqIHN1YmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoYXQgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb2w8L2NvZGU+IGhhcyBpdHMgZW5hYmxlbWVudCBzdGF0ZQotCSAqIG1hbmFnZWQgYnkgdGhpcyBwYW5lLCBpLmUuIHRocm91Z2gge0BsaW5rICNlbmFibGVXaWRnZXRzKGJvb2xlYW4pfS4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9sIFRoZSA8Y29kZT5Db250cm9sPC9jb2RlPiB0byBtYW5hZ2UgaXRzIGVuYWJsZW1lbnQgc3RhdGUKLQkgKiBhdXRvbWF0aWNhbGx5Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkVG9FbmFibGVtZW50Q29udHJvbChDb250cm9sIGNvbnRyb2wpIHsKLQkJY29udHJvbC5zZXREYXRhKCJlbmFibGVtZW50IiwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoYnVpbGRBc3BlY3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJLy9zdWJqZWN0KCkgY291bGQgaGF2ZSBjaGFuZ2VkIG9yIGlzIG51bGwgYmVjYXVzZSBvZiB0aGUgcG9zc2liaWxpdHkgb2YKLQkJCQkvLyJqdW1waW5nIiBvbiB0aGUgVUkgdGhyZWFkIGhlcmUgYW5kIGEgc2VsZWN0aW9uIGNoYW5nZSBvY2N1cmluZwotCQkJCWlmIChlLmdldFNvdXJjZSgpID09IHN1YmplY3QoKSkgewotCQkJCQl1cGRhdGVQYW5lKGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGJ1dHRvbiB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYnVpbGRCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRCdXR0b24oY29udGFpbmVyLCB0ZXh0LCBudWxsLCBidXR0b25BY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYnV0dG9uIHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYnVpbGRCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgewotCi0JCUJ1dHRvbiBidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQnV0dG9uKGNvbnRhaW5lciwgdGV4dCk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVNXVFV0aWwuYXN5bmNFeGVjKGJ1dHRvbkFjdGlvbik7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJaGVscFN5c3RlbSgpLnNldEhlbHAoYnV0dG9uLCBoZWxwSWQpOwotCQl9Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuRklMTDsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q0NvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDQ29tYm8gYnVpbGRDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUNDb21ibyBjb21ibyA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5DQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDQ29tYm8gYnVpbGRDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5DQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDQ29tYm8gYnVpbGRDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyKSB7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gdGhpcy5idWlsZENDb21ibyhjb250YWluZXIpOwotCi0JCUNDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQljb21ibywKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB1c2luZyBhIDxjb2RlPkNDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHByb3ZpZGVyIHJlc3BvbnNpYmxlIHRvIGNvbnZlcnQgdGhlIGNvbWJvJ3MgaXRlbXMKLQkgKiBpbnRvIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ib1ZpZXdlciBidWlsZENDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCUNDb21ibyBjb21ibyA9IHRoaXMuYnVpbGRDQ29tYm8oY29udGFpbmVyKTsKLQkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGVjayBib3ggdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0aW9uIHN0YXRlCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBidWlsZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRDaGVja0JveChwYXJlbnQsIGJ1dHRvblRleHQsIGJvb2xlYW5Ib2xkZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGJ1aWxkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZFRvZ2dsZUJ1dHRvbigKLQkJCXBhcmVudCwKLQkJCWJ1dHRvblRleHQsCi0JCQlib29sZWFuSG9sZGVyLAotCQkJaGVscElkLAotCQkJU1dULkNIRUNLCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPiB0aGF0IGNhbiBiZSBjb2xsYXBzZWQuIEEgc3ViLXBhbmUgaXMKLQkgKiBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkQ29sbGFwc2FibGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZENvbGxhcHNhYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHNlY3Rpb24gdG8gY3JlYXRlCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGJ1aWxkQ29sbGFwc2FibGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBleHBhbmRlZFN0YXRlSG9sZGVyKSB7Ci0KLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSB0aGlzLmJ1aWxkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgdHlwZQotCQkpOwotCi0JCVNlY3Rpb24gc2VjdGlvbiA9IChTZWN0aW9uKSBzdWJQYW5lLmdldFBhcmVudCgpOwotCi0JCWV4cGFuZGVkU3RhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCWJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyKHNlY3Rpb24pCi0JCSk7Ci0KLQkJc2VjdGlvbi5zZXRFeHBhbmRlZCgKLQkJCWV4cGFuZGVkU3RhdGVIb2xkZXIuZ2V0VmFsdWUoKSAhPSBudWxsID8gZXhwYW5kZWRTdGF0ZUhvbGRlci5nZXRWYWx1ZSgpIDogdHJ1ZQotCQkpOwotCi0JCXJldHVybiBzdWJQYW5lOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKLQkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkQ29sbGFwc2FibGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhwYW5kZWRTdGF0ZUhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkQ29sbGFwc2FibGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJc2VjdGlvblRleHQsCi0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSwKLQkJCWV4cGFuZGVkU3RhdGVIb2xkZXIKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IHdoaWNoIGNhbiBiZSB0eXBlZCBjYXN0IGRpcmVjdGx5IGFzIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gZXhwYW5kZWRTdGF0ZUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHRoYXQgd2lsbCBkaWN0YXRlCi0JICogd2hlbiB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZENvbGxhcHNhYmxlU3ViU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhwYW5kZWRTdGF0ZUhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkQ29sbGFwc2FibGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJc2VjdGlvblRleHQsCi0JCQlTV1QuTlVMTCwKLQkJCWV4cGFuZGVkU3RhdGVIb2xkZXIKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYnVpbGRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYnVpbGRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZENvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYnVpbGRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYnVpbGRDb21ibyhjb250YWluZXIpOwotCi0JCUNvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWNvbWJvLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+IHVzaW5nIGEgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSBwcm92aWRlciByZXNwb25zaWJsZSB0byBjb252ZXJ0IHRoZSBjb21ibydzIGl0ZW1zCi0JICogaW50byBodW1hbiByZWFkYWJsZSBzdHJpbmdzCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm9WaWV3ZXIgYnVpbGRDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmJ1aWxkQ29tYm8oY29udGFpbmVyKTsKLQkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWFpbiBjb250YWluZXIgb2YgdGhpcyBwYW5lLiBUaGUgbGF5b3V0IGFuZCBsYXlvdXQgZGF0YSBhcmUKLQkgKiBhdXRvbWF0aWNhbGx5IHNldC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdGhhdCB3aWxsIGhvbGRzIGFsbCB0aGUKLQkgKiB3aWRnZXRzIGNyZWF0ZWQgYnkgdGhpcyBwYW5lIHRocm91Z2gge0BsaW5rICNpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSl9Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBidWlsZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3ViUGFuZShwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q0NvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ0NvbWJvIGJ1aWxkRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUNDb21ibyBjb21ibyA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVFZGl0YWJsZUNDb21ibyhjb250YWluZXIpOwotCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q0NvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGJ1aWxkRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZEVkaXRhYmxlQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENDb21ibyBidWlsZEVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlcikgewotCi0JCUNDb21ibyBjb21ibyA9IHRoaXMuYnVpbGRFZGl0YWJsZUNDb21ibyhjb250YWluZXIpOwotCi0JCUNDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQljb21ibywKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB1c2luZyBhIDxjb2RlPkNDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHByb3ZpZGVyIHJlc3BvbnNpYmxlIHRvIGNvbnZlcnQgdGhlIGNvbWJvJ3MgaXRlbXMKLQkgKiBpbnRvIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ib1ZpZXdlciBidWlsZEVkaXRhYmxlQ0NvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlDQ29tYm8gY29tYm8gPSB0aGlzLmJ1aWxkRWRpdGFibGVDQ29tYm8oY29udGFpbmVyKTsKLQkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYnVpbGRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVFZGl0YWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYnVpbGRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFY+aW5zdGFuY2UoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGJ1aWxkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYnVpbGRFZGl0YWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0KLQkJQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4gdXNpbmcgYSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHByb3ZpZGVyIHJlc3BvbnNpYmxlIHRvIGNvbnZlcnQgdGhlIGNvbWJvJ3MgaXRlbXMKLQkgKiBpbnRvIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ib1ZpZXdlciBidWlsZEVkaXRhYmxlQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmJ1aWxkRWRpdGFibGVDb21ibyhjb250YWluZXIpOwotCQlDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tYm8pOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRFeHBhbmRlZFN0YXRlQ2hhbmdlTGlzdGVuZXIoZmluYWwgU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoYnVpbGRFeHBhbmRlZFN0YXRlQ2hhbmdlTGlzdGVuZXJfKHNlY3Rpb24pKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRFeHBhbmRlZFN0YXRlQ2hhbmdlTGlzdGVuZXJfKGZpbmFsIFNlY3Rpb24gc2VjdGlvbikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQm9vbGVhbiB2YWx1ZSA9IChCb29sZWFuKSBlLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBCb29sZWFuLlRSVUU7Ci0JCQkJfQotCQkJCXNlY3Rpb24uc2V0RXhwYW5kZWQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SHlwZXJsaW5rPC9jb2RlPiB0aGF0IHdpbGwgaW52b2tlZCB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5SdW5uYWJsZTwvY29kZT4gd2hlbiBzZWxlY3RlZC4gVGhlIGdpdmVuIGFjdGlvbiBpcyBhbHdheXMgaW52b2tlZAotCSAqIGZyb20gdGhlIFVJIHRocmVhZC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgaHlwZXJsaW5rJ3MgdGV4dAotCSAqIEBwYXJhbSBoeXBlckxpbmtBY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGxpbmsgd2FzIHNlbGVjdGVkCi0JICogcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkh5cGVybGluazwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSHlwZXJsaW5rIGJ1aWxkSHlwZXJMaW5rKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGh5cGVyTGlua0FjdGlvbikgewotCi0JCUh5cGVybGluayBsaW5rID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUh5cGVybGluayhwYXJlbnQsIHRleHQpOwotCQl0aGlzLndpZGdldHMuYWRkKGxpbmspOwotCi0JCWxpbmsuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCi0JCQkJSHlwZXJsaW5rIGh5cGVyTGluayA9IChIeXBlcmxpbmspIGUud2lkZ2V0OwotCi0JCQkJaWYgKGh5cGVyTGluay5pc0VuYWJsZWQoKSkgewotCQkJCQlTV1RVdGlsLmFzeW5jRXhlYyhoeXBlckxpbmtBY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYWJsZSB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExhYmVsIGJ1aWxkTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0KLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGJ1aWxkTGFiZWxlZENDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFY+aW5zdGFuY2UoKSwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgbm9uLWVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aAotCSAqIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDQ29tYm8gYnVpbGRMYWJlbGVkQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlDQ29tYm8gY29tYm8gPSB0aGlzLmJ1aWxkQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgbm9uLWVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aAotCSAqIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDQ29tYm8gYnVpbGRMYWJlbGVkQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlzdHJpbmdDb252ZXJ0ZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSBub24tZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoCi0JICogdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gY29tYm9MaXN0ZW5lciBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNlbGVjdGlvbgotCSAqIGNoYW5nZXMKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENDb21ibyBidWlsZExhYmVsZWRDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUNDb21ibyBjb21ibyA9IHRoaXMuYnVpbGRDQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoY29tYm9MaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQkoY29tYm8uZ2V0UGFyZW50KCkgIT0gY29udGFpbmVyKSA/IGNvbWJvLmdldFBhcmVudCgpIDogY29tYm8sCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGVmdENvbnRyb2wgVGhlIHdpZGdldCBzaG93biB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENDb21ibyBidWlsZExhYmVsZWRDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWNvbWJvTGlzdGVuZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSBub24tZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoCi0JICogdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGJ1aWxkTGFiZWxlZENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCksCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBidWlsZExhYmVsZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFY+aW5zdGFuY2UoKSwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgbm9uLWVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aAotCSAqIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBidWlsZExhYmVsZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmJ1aWxkQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0KLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQkoY29tYm8uZ2V0UGFyZW50KCkgIT0gY29udGFpbmVyKSA/IGNvbWJvLmdldFBhcmVudCgpIDogY29tYm8sCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSBub24tZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoCi0JICogdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGJ1aWxkTGFiZWxlZENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJc3RyaW5nQ29udmVydGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgbm9uLWVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aAotCSAqIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGNvbWJvTGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBzZWxlY3Rpb24KLQkgKiBjaGFuZ2VzCi0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBidWlsZExhYmVsZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5idWlsZENvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxlZnRDb250cm9sIFRoZSB3aWRnZXQgc2hvd24gdG8gdGhlIGxlZnQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBidWlsZExhYmVsZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljb21ib0xpc3RlbmVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxlZnRDb250cm9sIFRoZSB3aWRnZXQgc2hvd24gdG8gdGhlIGxlZnQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBsZWZ0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNlbnRlckNvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCS8vIENvbnRhaW5lciBmb3IgdGhlIGxhYmVsIGFuZCBtYWluIGNvbXBvc2l0ZQotCQljb250YWluZXIgPSB0aGlzLmJ1aWxkU3ViUGFuZShjb250YWluZXIsIDMsIDUsIDAsIDAsIDApOwotCi0JCS8vIExlZnQgY29udHJvbAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWxlZnRDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIFJlLXBhcmVudCB0aGUgbGVmdCBjb250cm9sIHRvIHRoZSBuZXcgc3ViIHBhbmUKLQkJbGVmdENvbnRyb2wuc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0JCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLmFkZChsZWZ0Q29udHJvbCk7Ci0JCXRoaXMud2lkZ2V0cy5hZGQobGVmdENvbnRyb2wpOwotCi0JCS8vIENlbnRlciBjb250cm9sCi0JCWNlbnRlckNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRoaXMud2lkZ2V0cy5hZGQoY2VudGVyQ29udHJvbCk7Ci0KLQkJLy8gUmUtcGFyZW50IHRoZSBjZW50ZXIgY29udHJvbCB0byB0aGUgbmV3IHN1YiBwYW5lCi0JCWNlbnRlckNvbnRyb2wuc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0KLQkJLy8gUmVnaXN0ZXIgdGhlIGhlbHAgaWQgZm9yIHRoZSBjZW50ZXIgY29udHJvbAotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNlbnRlckNvbnRyb2wsIGhlbHBJZCk7Ci0JCX0KLQotCQkvLyBSaWdodCBjb250cm9sCi0JCWlmIChyaWdodENvbnRyb2wgPT0gbnVsbCkgewotCQkJQ29tcG9zaXRlIHNwYWNlciA9IHRoaXMuYnVpbGRQYW5lKGNvbnRhaW5lcik7Ci0JCQlzcGFjZXIuc2V0TGF5b3V0KHRoaXMuYnVpbGRTcGFjZXJMYXlvdXQoKSk7Ci0JCQlyaWdodENvbnRyb2wgPSBzcGFjZXI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyaWdodENvbnRyb2wuc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0KLQkJCS8vIFJlZ2lzdGVyIHRoZSBoZWxwIGlkIGZvciB0aGUgcmlnaHQgY29udHJvbAotCQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQkJaGVscFN5c3RlbSgpLnNldEhlbHAocmlnaHRDb250cm9sLCBoZWxwSWQpOwotCQkJfQotCQl9Ci0KLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0JCXJpZ2h0Q29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLmFkZChyaWdodENvbnRyb2wpOwotCQl0aGlzLndpZGdldHMuYWRkKHJpZ2h0Q29udHJvbCk7Ci0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdXNlZCB0byBkZXNjcmliZSB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb250cm9sCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGxhYmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWwsCi0JCQljZW50ZXJDb250cm9sLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB1c2VkIHRvIGRlc2NyaWJlIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWwgbGFiZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWwsCi0JCQljZW50ZXJDb250cm9sLAotCQkJbnVsbAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29tcG9zaXRlIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbCB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgdG8gbGFiZWwgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNlbnRlclBhbmUgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBhbmU8Pz4gY2VudGVyUGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q2VudHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJY2VudGVyUGFuZS5nZXRDb250cm9sKCksCi0JCQlyaWdodENlbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbXBvc2l0ZSBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IHRvIGxhYmVsIHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjZW50ZXJQYW5lIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQYW5lPD8+IGNlbnRlclBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWNlbnRlclBhbmUuZ2V0Q29udHJvbCgpLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb21wb3NpdGUgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCB0byBsYWJlbCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sKSB7Ci0KLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljZW50ZXJDb250cm9sLAotCQkJbnVsbCwKLQkJCW51bGwKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbXBvc2l0ZSBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IHRvIGxhYmVsIHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNlbnRlckNvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wpIHsKLQotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWNlbnRlckNvbnRyb2wsCi0JCQlyaWdodENvbnRyb2wsCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb21wb3NpdGUgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCB0byBsYWJlbCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q2VudHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZExhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0KSwKLQkJCWNlbnRlckNvbnRyb2wsCi0JCQlyaWdodENlbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbXBvc2l0ZSBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IHRvIGxhYmVsIHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlMYWJlbCBsYWJlbCA9IHRoaXMuYnVpbGRMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCk7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWwsCi0JCQljZW50ZXJDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFY+aW5zdGFuY2UoKSwKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDQ29tYm8gYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48Vj5pbnN0YW5jZSgpLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENDb21ibyBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gdGhpcy5idWlsZEVkaXRhYmxlQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDQ29tYm8gYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsZWZ0Q29udHJvbCBUaGUgd2lkZ2V0IHNob3duIHRvIHRoZSBsZWZ0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ0NvbWJvIGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZ5TGlzdGVuZXIgY29tYm9MaXN0ZW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUNDb21ibyBjb21ibyA9IHRoaXMuYnVpbGRFZGl0YWJsZUNDb21ibyhjb250YWluZXIpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhbiBlZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBjb21ib0xpc3RlbmVyIFRoZSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgc2VsZWN0aW9uCi0JICogY2hhbmdlcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ0NvbWJvIGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZ5TGlzdGVuZXIgY29tYm9MaXN0ZW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWNvbWJvTGlzdGVuZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGVmdENvbnRyb2wgVGhlIHdpZGdldCBzaG93biB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcwotCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncwotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ0NvbWJvIGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZ5TGlzdGVuZXIgY29tYm9MaXN0ZW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlDb21ib1ZpZXdlciBjb21ib1ZpZXdlciA9IHRoaXMuYnVpbGRFZGl0YWJsZUNDb21ib1ZpZXdlcigKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsUHJvdmlkZXIKLQkJKTsKLQotCQlDQ29tYm8gY29tYm8gPSBjb21ib1ZpZXdlci5nZXRDQ29tYm8oKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoY29tYm9MaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQkoY29tYm8uZ2V0UGFyZW50KCkgIT0gY29udGFpbmVyKSA/IGNvbWJvLmdldFBhcmVudCgpIDogY29tYm8sCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYW4gZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoIHRoZQotCSAqIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gY29tYm9MaXN0ZW5lciBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNlbGVjdGlvbgotCSAqIGNoYW5nZXMKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcwotCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ0NvbWJvIGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZ5TGlzdGVuZXIgY29tYm9MaXN0ZW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm9WaWV3ZXIoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljb21ib0xpc3RlbmVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYnVpbGRMYWJlbGVkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48Vj5pbnN0YW5jZSgpLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYW4gZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoIHRoZQotCSAqIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYnVpbGRMYWJlbGVkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCksCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBidWlsZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYnVpbGRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlzdHJpbmdDb252ZXJ0ZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGVmdENvbnRyb2wgVGhlIHdpZGdldCBzaG93biB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5idWlsZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoY29tYm9MaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQkoY29tYm8uZ2V0UGFyZW50KCkgIT0gY29udGFpbmVyKSA/IGNvbWJvLmdldFBhcmVudCgpIDogY29tYm8sCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYW4gZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoIHRoZQotCSAqIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gY29tYm9MaXN0ZW5lciBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNlbGVjdGlvbgotCSAqIGNoYW5nZXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljb21ib0xpc3RlbmVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgYXJlYSdzIGxhYmVsCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkTGFiZWxlZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRNdWx0aUxpbmVUZXh0KAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dEhvbGRlciwKLQkJCW51bGwKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGFyZWEncyBsYWJlbAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIHdpZGdldCB0byBiZSBwbGFjZWQgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0IGFyZWEKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkTGFiZWxlZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmJ1aWxkTXVsdGlMaW5lVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dCwKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgYXJlYSdzIGxhYmVsCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGxpbmVDb3VudCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRMYWJlbGVkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRNdWx0aUxpbmVUZXh0KAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dEhvbGRlciwKLQkJCWxpbmVDb3VudCwKLQkJCW51bGwKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGFyZWEncyBsYWJlbAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBsaW5lQ291bnQgVGhlIG51bWJlciBvZiBsaW5lcyB0aGUgdGV4dCBhcmVhIHNob3VsZCBkaXNwbGF5Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZExhYmVsZWRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmJ1aWxkTXVsdGlMaW5lVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIsIGxpbmVDb3VudCk7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0LAotCQkJaGVscElkCi0JCSk7Ci0KLQkJaW50IHRleHRIZWlnaHQgPSB0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLQotCQkvLyBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgdGV4dC5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIGxpbmVDb3VudDsKLQotCQkvLyBNb3ZlIHRoZSBsYWJlbCB0byB0aGUgdG9wIG9mIGl0cyBjZWxsCi0JCUNvbnRyb2wgbGFiZWwgPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKVswXTsKLQkJaW50IGxhYmVsSGVpZ2h0ID0gbGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotCi0JCWdyaWREYXRhID0gKEdyaWREYXRhKSBsYWJlbC5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgICArPSAoTWF0aC5hYnModGV4dEhlaWdodCAtIGxhYmVsSGVpZ2h0KSAvIDIpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgYXJlYSdzIGxhYmVsCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZExhYmVsZWRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZE11bHRpTGluZVRleHQoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0SG9sZGVyLAotCQkJMywKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZExhYmVsZWRQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkUGFzc3dvcmRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dEhvbGRlciwKLQkJCW51bGwKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGZpZWxkJ3MgbGFiZWwKLQkgKiBAcGFyYW0gcmlnaHRDb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byBiZSBwbGFjZWQgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0Ci0JICogZmllbGQKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkTGFiZWxlZFBhc3N3b3JkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb21wb25lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmJ1aWxkUGFzc3dvcmRUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlcik7Ci0KLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0LAotCQkJcmlnaHRDb21wb25lbnQsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkTGFiZWxlZFBhc3N3b3JkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRQYXNzd29yZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0SG9sZGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRMYWJlbGVkUGF3b3JkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRQYXNzd29yZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0SG9sZGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3Bpbm5lci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcGFyYW0gbnVtYmVySG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBob2xkZXIgaGFzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyIGJ1aWxkTGFiZWxlZFNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkU3Bpbm5lcigKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCW51bWJlckhvbGRlciwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCTAsCi0JCQlJbnRlZ2VyLk1BWF9WQUxVRSwKLQkJCW51bGwsCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzcGlubmVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqIEBwYXJhbSBudW1iZXJIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHNob3duIHdoZW4gdGhlIGhvbGRlciBoYXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSB3aWRnZXQgdG8gYmUgcGxhY2VkIHRvIHRoZSByaWdodCBvZiBzcGlubmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyIGJ1aWxkTGFiZWxlZFNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRTcGlubmVyKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbnVtYmVySG9sZGVyLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJMCwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJcmlnaHRDb250cm9sLAotCQkJbnVsbAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3Bpbm5lci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcGFyYW0gbnVtYmVySG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBob2xkZXIgaGFzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIG1pbmltdW1WYWx1ZSBUaGUgbWluaW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcGFyYW0gbWF4aW11bVZhbHVlIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIHdpZGdldCB0byBiZSBwbGFjZWQgdG8gdGhlIHJpZ2h0IG9mIHNwaW5uZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlNwaW5uZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNwaW5uZXIgYnVpbGRMYWJlbGVkU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluaW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkU3Bpbm5lcigKLQkJCXBhcmVudCwKLQkJCWxhYmVsVGV4dCwKLQkJCW51bWJlckhvbGRlciwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCW1pbmltdW1WYWx1ZSwKLQkJCW1heGltdW1WYWx1ZSwKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCW51bGwKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNwaW5uZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICogQHBhcmFtIG51bWJlckhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgc2hvd24gd2hlbiB0aGUgaG9sZGVyIGhhcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBtaW5pbXVtVmFsdWUgVGhlIG1pbmltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIG1heGltdW1WYWx1ZSBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSB3aWRnZXQgdG8gYmUgcGxhY2VkIHRvIHRoZSByaWdodCBvZiBzcGlubmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgc3Bpbm5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBidWlsZExhYmVsZWRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4aW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy5idWlsZFNwaW5uZXIoCi0JCQlwYXJlbnQsCi0JCQludW1iZXJIb2xkZXIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQltaW5pbXVtVmFsdWUsCi0JCQltYXhpbXVtVmFsdWUKLQkJKTsKLQotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQlwYXJlbnQsCi0JCQlsYWJlbFRleHQsCi0JCQkoc3Bpbm5lci5nZXRQYXJlbnQoKSAhPSBwYXJlbnQpID8gc3Bpbm5lci5nZXRQYXJlbnQoKSA6IHNwaW5uZXIsCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgc3Bpbm5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0KLQkJcmV0dXJuIHNwaW5uZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzcGlubmVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqIEBwYXJhbSBudW1iZXJIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHNob3duIHdoZW4gdGhlIGhvbGRlciBoYXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbWluaW11bVZhbHVlIFRoZSBtaW5pbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSBtYXhpbXVtVmFsdWUgVGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgc3Bpbm5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBidWlsZExhYmVsZWRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4aW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQlwYXJlbnQsCi0JCQlsYWJlbFRleHQsCi0JCQludW1iZXJIb2xkZXIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQkwLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzcGlubmVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqIEBwYXJhbSBudW1iZXJIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHNob3duIHdoZW4gdGhlIGhvbGRlciBoYXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBzcGlubmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyIGJ1aWxkTGFiZWxlZFNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQlwYXJlbnQsCi0JCQlsYWJlbFRleHQsCi0JCQludW1iZXJIb2xkZXIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQkwLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQludWxsLAotCQkJbnVsbAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkVGV4dChjb250YWluZXIsIGxhYmVsVGV4dCwgdGV4dEhvbGRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBmaWVsZCdzIGxhYmVsCi0JICogQHBhcmFtIHJpZ2h0Q29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gYmUgcGxhY2VkIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dAotCSAqIGZpZWxkCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbXBvbmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmJ1aWxkVGV4dChjb250YWluZXIpOwotCQlUZXh0RmllbGRNb2RlbEFkYXB0ZXIuYWRhcHQodGV4dEhvbGRlciwgdGV4dCk7Ci0KLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0LAotCQkJcmlnaHRDb21wb25lbnQsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkTGFiZWxlZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHRIb2xkZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsaXN0IGFuZCBub3RpZnkgdGhlIGdpdmVuIHNlbGVjdGlvbiBob2xkZXIgd2hlbiB0aGUKLQkgKiBzZWxlY3Rpb24gY2hhbmdlcy4gSWYgdGhlIHNlbGVjdGlvbiBjb3VudCBpcyBkaWZmZXJlbnQgdGhhbiBvbmUgdGhhbiB0aGUKLQkgKiBob2xkZXIgd2lsbCByZWNlaXZlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+TGlzdDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBidWlsZExpc3QoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QoY29udGFpbmVyLCAoU3RyaW5nKSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpc3QgYW5kIG5vdGlmeSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhvbGRlciB3aGVuIHRoZQotCSAqIHNlbGVjdGlvbiBjaGFuZ2VzLiBJZiB0aGUgc2VsZWN0aW9uIGNvdW50IGlzIGRpZmZlcmVudCB0aGFuIG9uZSB0aGFuIHRoZQotCSAqIGhvbGRlciB3aWxsIHJlY2VpdmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+TGlzdDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBidWlsZExpc3QoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdCgKLQkJCWNvbnRhaW5lciwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsaXN0IGFuZCBub3RpZnkgdGhlIGdpdmVuIHNlbGVjdGlvbiBob2xkZXIgd2hlbiB0aGUKLQkgKiBzZWxlY3Rpb24gY2hhbmdlcy4gSWYgdGhlIHNlbGVjdGlvbiBjb3VudCBpcyBkaWZmZXJlbnQgdGhhbiBvbmUgdGhhbiB0aGUKLQkgKiBob2xkZXIgd2lsbCByZWNlaXZlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzZWxlY3Rpb25Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdW5pcXVlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkxpc3Q8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgYnVpbGRMaXN0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0KGNvbnRhaW5lciwgc2VsZWN0aW9uSG9sZGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpc3QgYW5kIG5vdGlmeSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhvbGRlciB3aGVuIHRoZQotCSAqIHNlbGVjdGlvbiBjaGFuZ2VzLiBJZiB0aGUgc2VsZWN0aW9uIGNvdW50IGlzIGRpZmZlcmVudCB0aGFuIG9uZSB0aGFuIHRoZQotCSAqIGhvbGRlciB3aWxsIHJlY2VpdmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHNlbGVjdGlvbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB1bmlxdWUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkxpc3Q8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgYnVpbGRMaXN0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc2VsZWN0aW9uSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJTGlzdCBsaXN0ID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUxpc3QoCi0JCQljb250YWluZXIsCi0JCQlTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk1VTFRJCi0JCSk7Ci0KLQkJbGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidWlsZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkhvbGRlcikpOwotCQlsaXN0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0aGlzLndpZGdldHMuYWRkKGxpc3QpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJaGVscFN5c3RlbSgpLnNldEhlbHAobGlzdCwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGFibGUgZXhwYW5kaW5nIG9uIG11bHRpcGxlIGxpbmVzLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGJ1aWxkTXVsdGlMaW5lTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQpIHsKLQotCQl0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IHRoYXQgaGFzIG11bHRpcGxlIGxpbmVzLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgMywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQgdGhhdCBoYXMgbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpbmVDb3VudCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhICAgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IHRleHQuZ2V0TGluZUhlaWdodCgpICogbGluZUNvdW50OwotCQl0ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJaGVscFN5c3RlbSgpLnNldEhlbHAodGV4dCwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IHRoYXQgaGFzIG11bHRpcGxlIGxpbmVzLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTXVsdGlMaW5lVGV4dChjb250YWluZXIsIDMsIGhlbHBJZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQgdGhhdCBoYXMgbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQgdGhhdCBoYXMgbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGxpbmVDb3VudCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZE11bHRpTGluZVRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyLCBsaW5lQ291bnQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IHRoYXQgaGFzIG11bHRpcGxlIGxpbmVzLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5idWlsZE11bHRpTGluZVRleHQoY29udGFpbmVyLCBsaW5lQ291bnQsIGhlbHBJZCk7Ci0JCVRleHRGaWVsZE1vZGVsQWRhcHRlci5hZGFwdCh0ZXh0SG9sZGVyLCB0ZXh0KTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQgdGhhdCBoYXMgbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRleHQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZE11bHRpTGluZVRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyLCAzLCBoZWxwSWQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFnZUJvb2s8L2NvZGU+IGFuZCBzZXQgdGhlIHByb3BlciBsYXlvdXQgYW5kIGxheW91dAotCSAqIGRhdGEuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5QYWdlQm9vazwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUGFnZUJvb2sgYnVpbGRQYWdlQm9vayhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJUGFnZUJvb2sgcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gcGFnZUJvb2s7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgd2l0aG91dCBzcGVjaWZ5aW5nIGFueSBsYXlvdXQgbWFuYWdlci4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBvZiB0aGUgbmV3IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB1c2luZyB0aGUgZ2l2ZW4gbGF5b3V0IG1hbmFnZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhlIG5ldyBjb250YWluZXIKLQkgKiBAcGFyYW0gbGF5b3V0IFRoZSBsYXlvdXQgbWFuYWdlciBvZiB0aGUgbmV3IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgTGF5b3V0IGxheW91dCkgewotCi0JCWNvbnRhaW5lciA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUoY29udGFpbmVyKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZFBhc3N3b3JkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgewotCi0JCVRleHQgdGV4dCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVQYXNzd29yZFRleHQoY29udGFpbmVyKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlUZXh0RmllbGRNb2RlbEFkYXB0ZXIuYWRhcHQodGV4dEhvbGRlciwgdGV4dCk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwdXNoIGJ1dHRvbiB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYnVpbGRQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRQdXNoQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCwgbnVsbCwgYnV0dG9uQWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHB1c2ggYnV0dG9uIHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBidXR0b25BY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYnVpbGRQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBidXR0b25BY3Rpb24pIHsKLQotCQlCdXR0b24gYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVB1c2hCdXR0b24ocGFyZW50LCBidXR0b25UZXh0KTsKLQotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTV1RVdGlsLmFzeW5jRXhlYyhidXR0b25BY3Rpb24pOwotCQkJfQotCQl9KTsKLQotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQloZWxwU3lzdGVtKCkuc2V0SGVscChidXR0b24sIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcmFkaW8gYnV0dG9uIHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYnVpbGRSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkUmFkaW9CdXR0b24ocGFyZW50LCBidXR0b25UZXh0LCBib29sZWFuSG9sZGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgcmFkaW8gYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBidWlsZFJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRUb2dnbGVCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlidXR0b25UZXh0LAotCQkJYm9vbGVhbkhvbGRlciwKLQkJCWhlbHBJZCwKLQkJCVNXVC5SQURJTwotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBzZWN0aW9uIHRvIGNyZWF0ZQotCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKLQkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkU2VjdGlvbihjb250YWluZXIsIHNlY3Rpb25UZXh0LCBudWxsLCB0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHNlY3Rpb24ncyBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCWRlc2NyaXB0aW9uLAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHNlY3Rpb24ncyBkZXNjcmlwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogd2FzIHByb3ZpZGVyCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2Ygc2VjdGlvbiB0byBjcmVhdGUKLQkgKiBAcGFyYW0gZXhwYW5kZWRTdGF0ZUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHRoYXQgd2lsbCBkaWN0YXRlCi0JICogd2hlbiB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgYnVpbGRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSkgewotCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVTZWN0aW9uKGNvbnRhaW5lciwgdHlwZSB8ICgoZGVzY3JpcHRpb24gIT0gbnVsbCkgPyBTZWN0aW9uLkRFU0NSSVBUSU9OIDogU1dULk5VTEwpKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc2VjdGlvbi5zZXRUZXh0KHNlY3Rpb25UZXh0KTsKLQkJc2VjdGlvbi5tYXJnaW5XaWR0aCAgPSAwOwotCQlzZWN0aW9uLm1hcmdpbkhlaWdodCA9IDA7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQl9Ci0KLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSB0aGlzLmJ1aWxkU3ViUGFuZShzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoc3ViUGFuZSk7Ci0KLQkJcmV0dXJuIHN1YlBhbmU7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBlLndpZGdldDsKLQkJCQlTdHJpbmdbXSBzZWxlY3RlZEl0ZW1zID0gbGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGVkSXRlbXMgPT0gbnVsbCkgfHwgKHNlbGVjdGVkSXRlbXMubGVuZ3RoICE9IDEpKSB7Ci0JCQkJCXNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW1zWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGF5b3V0IHJlc3BvbnNpYmxlIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHNwYWNlciBjcmVhdGVkCi0JICogZm9yIHRoZSByaWdodCBjb250cm9sIHdoZW4gbm9uZSB3YXMgZ2l2ZW4uIFRoZSBzcGFjZXIgaGVscHMgdG8gYWxpZ24gYWxsCi0JICogdGhlIHJpZ2h0IGNvbnRyb2xzLgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgTGF5b3V0IGJ1aWxkU3BhY2VyTGF5b3V0KCkgewotCQlyZXR1cm4gbmV3IExheW91dCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoSGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0SGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQotCQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJCQljb21wb3NpdGUuc2V0Qm91bmRzKDAsIDAsIGRhdGEud2lkdGhIaW50LCBkYXRhLmhlaWdodEhpbnQpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3Bpbm5lci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbnVtYmVySG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBob2xkZXIgaGFzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyIGJ1aWxkU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZFNwaW5uZXIoCi0JCQlwYXJlbnQsCi0JCQludW1iZXJIb2xkZXIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQkwLAotCQkJSW50ZWdlci5NQVhfVkFMVUUKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNwaW5uZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIG51bWJlckhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgc2hvd24gd2hlbiB0aGUgaG9sZGVyIGhhcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBtaW5pbXVtVmFsdWUgVGhlIG1pbmltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIG1heGltdW1WYWx1ZSBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlNwaW5uZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNwaW5uZXIgYnVpbGRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbmltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGltdW1WYWx1ZSkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkU3Bpbm5lcigKLQkJCXBhcmVudCwKLQkJCW51bWJlckhvbGRlciwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCW1pbmltdW1WYWx1ZSwKLQkJCW1heGltdW1WYWx1ZSwKLQkJCW51bGwKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNwaW5uZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIG51bWJlckhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgc2hvd24gd2hlbiB0aGUgaG9sZGVyIGhhcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBtaW5pbXVtVmFsdWUgVGhlIG1pbmltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIG1heGltdW1WYWx1ZSBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyIGJ1aWxkU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhpbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlU3Bpbm5lcihwYXJlbnQpOwotCQlzcGlubmVyLnNldE1pbmltdW0obWluaW11bVZhbHVlKTsKLQkJc3Bpbm5lci5zZXRNYXhpbXVtKG1heGltdW1WYWx1ZSk7Ci0JCXNwaW5uZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKSk7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdChudW1iZXJIb2xkZXIsIHNwaW5uZXIsIGRlZmF1bHRWYWx1ZSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQloZWxwU3lzdGVtKCkuc2V0SGVscChzcGlubmVyLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHNwaW5uZXI7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUFic3RyYWN0UGFuZS50aGlzLnN1YmplY3RDaGFuZ2VkKChUKSBlLmdldE9sZFZhbHVlKCksIChUKSBlLmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdG9wTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCB0b3BNYXJnaW4pIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgdG9wTWFyZ2luLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0b3BNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gbGVmdE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIGxlZnQgb2YgdGhlIHBhbmUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZFN1YlBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wTWFyZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0TWFyZ2luKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgdG9wTWFyZ2luLCBsZWZ0TWFyZ2luLCAwLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lLCB0aGUgbmV3IHdpZGdldAotCSAqIHdpbGwgaGF2ZSBpdHMgbGF5b3V0IGFuZCBsYXlvdXQgZGF0YSBhbHJlYWR5IGluaXRpYWxpemVkLCB0aGUgbGF5b3V0IHdpbGwKLQkgKiBiZSBhIDxjb2RlPkdyaWRMYXlvdXQ8L2NvZGU+IHdpdGggMSBjb2x1bW4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRvcE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIHRvcCBvZiB0aGUgcGFuZQotCSAqIEBwYXJhbSBsZWZ0TWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCB0byB0aGUgbGVmdCBvZiB0aGUgcGFuZQotCSAqIEBwYXJhbSBib3R0b21NYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gcmlnaHRNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIHRvIHRoZSByaWdodCBvZiB0aGUgcGFuZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkU3ViUGFuZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3BNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbU1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmlnaHRNYXJnaW4pIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZFN1YlBhbmUoCi0JCQljb250YWluZXIsCi0JCQkxLAotCQkJdG9wTWFyZ2luLAotCQkJbGVmdE1hcmdpbiwKLQkJCWJvdHRvbU1hcmdpbiwKLQkJCXJpZ2h0TWFyZ2luKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lLCB0aGUgbmV3IHdpZGdldAotCSAqIHdpbGwgaGF2ZSBpdHMgbGF5b3V0IGFuZCBsYXlvdXQgZGF0YSBhbHJlYWR5IGluaXRpYWxpemVkLCB0aGUgbGF5b3V0IHdpbGwKLQkgKiBiZSBhIDxjb2RlPkdyaWRMYXlvdXQ8L2NvZGU+IHdpdGggMSBjb2x1bW4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRvcE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIHRvcCBvZiB0aGUgcGFuZQotCSAqIEBwYXJhbSBsZWZ0TWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCB0byB0aGUgbGVmdCBvZiB0aGUgcGFuZQotCSAqIEBwYXJhbSBib3R0b21NYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gcmlnaHRNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIHRvIHRoZSByaWdodCBvZiB0aGUgcGFuZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkU3ViUGFuZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW5Db3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wTWFyZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0TWFyZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBib3R0b21NYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJpZ2h0TWFyZ2luKSB7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dChjb2x1bW5Db3VudCwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgICAgPSB0b3BNYXJnaW47Ci0JCWxheW91dC5tYXJnaW5MZWZ0ICAgPSBsZWZ0TWFyZ2luOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gYm90dG9tTWFyZ2luOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgID0gcmlnaHRNYXJnaW47Ci0KLQkJY29udGFpbmVyID0gdGhpcy5idWlsZFBhbmUoY29udGFpbmVyLCBsYXlvdXQpOwotCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCB3aGljaCBjYW4gYmUgdHlwZWQgY2FzdCBkaXJlY3RseSBhcyBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRTdWJTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0KSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRDb2xsYXBzYWJsZVN1YlNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdGFibGUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UYWJsZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGUgYnVpbGRUYWJsZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGFibGUoY29udGFpbmVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIHRhYmxlCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UYWJsZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGUgYnVpbGRUYWJsZShDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUYWJsZShjb250YWluZXIsIHN0eWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIHRhYmxlCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRhYmxlIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaGVscCBJRCBpcyByZXF1aXJlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGFibGU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRhYmxlIGJ1aWxkVGFibGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVRhYmxlKGNvbnRhaW5lciwgc3R5bGUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgICA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gdGFibGUuZ2V0SXRlbUhlaWdodCgpICogNDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRoaXMud2lkZ2V0cy5hZGQodGFibGUpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJaGVscFN5c3RlbSgpLnNldEhlbHAodGFibGUsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGFibGUgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBoZWxwIElEIGlzIHJlcXVpcmVkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UYWJsZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGUgYnVpbGRUYWJsZShDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRUYWJsZSgKLQkJCWNvbnRhaW5lciwKLQkJCVNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVUZXh0KGNvbnRhaW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRleHQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVRleHQoY29udGFpbmVyKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRleHQsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRleHQgdGV4dCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVUZXh0KGNvbnRhaW5lcik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyLmFkYXB0KHRleHRIb2xkZXIsIHRleHQpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJaGVscFN5c3RlbSgpLnNldEhlbHAodGV4dCwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHdpdGggYSB0aXRsZWQgYm9yZGVyLgotCSAqCi0JICogQHBhcmFtIHRpdGxlIFRoZSB0ZXh0IG9mIHRoZSB0aXRsZWQgYm9yZGVyCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoIGEgdGl0bGVkIGJvcmRlcgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBHcm91cCBidWlsZFRpdGxlZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIHRpdGxlKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGl0bGVkUGFuZShjb250YWluZXIsIHRpdGxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB3aXRoIGEgdGl0bGVkIGJvcmRlci4KLQkgKgotCSAqIEBwYXJhbSB0aXRsZSBUaGUgdGV4dCBvZiB0aGUgdGl0bGVkIGJvcmRlcgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgZ3JvdXAKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gd2l0aCBhIHRpdGxlZCBib3JkZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgR3JvdXAgYnVpbGRUaXRsZWRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJR3JvdXAgZ3JvdXAgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlR3JvdXAoY29udGFpbmVyLCB0aXRsZSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgICAgPSA1OwotCQlsYXlvdXQubWFyZ2luTGVmdCAgID0gNTsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDU7Ci0JCWxheW91dC5tYXJnaW5SaWdodCAgPSA1OwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdG9nZ2xlIGJ1dHRvbiAocmFkaW8gYnV0dG9uIG9yIGNoZWNrIGJveCkgdXNpbmcgdGhlIGdpdmVuCi0JICogaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRUb2dnbGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvZ2dsZUJ1dHRvblR5cGUpIHsKLQotCQlCdXR0b24gYnV0dG9uOwotCi0JCWlmICh0b2dnbGVCdXR0b25UeXBlID09IFNXVC5QVVNIKSB7Ci0JCQlidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQpOwotCQl9Ci0JCWVsc2UgaWYgKHRvZ2dsZUJ1dHRvblR5cGUgPT0gU1dULlJBRElPKSB7Ci0JCQlidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlUmFkaW9CdXR0b24ocGFyZW50LCBidXR0b25UZXh0KTsKLQkJfQotCQllbHNlIGlmICh0b2dnbGVCdXR0b25UeXBlID09IFNXVC5DSEVDSykgewotCQkJYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUNoZWNrQm94KHBhcmVudCwgYnV0dG9uVGV4dCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCk7Ci0JCX0KLQotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCUJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIuYWRhcHQoYm9vbGVhbkhvbGRlciwgYnV0dG9uKTsKLQkJdGhpcy53aWRnZXRzLmFkZChidXR0b24pOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJaGVscFN5c3RlbSgpLnNldEhlbHAoYnV0dG9uLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB0aGF0IGNhbiBoYXZlIDMgc2VsZWN0aW9uIHN0YXRlcyAoc2VsZWN0ZWQsCi0JICogdW5zZWxlY3RlZCBhbmQgcGFydGlhbGx5IHNlbGVjdGVkLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB2YWx1ZSB3aGVyZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIG1lYW5zIHBhcnRpYWxseSBzZWxlY3RlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VHJpU3RhdGVDaGVja0JveDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVHJpU3RhdGVDaGVja0JveCBidWlsZFRyaVN0YXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCB0ZXh0LCBib29sZWFuSG9sZGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB0aGF0IGNhbiBoYXZlIDMgc2VsZWN0aW9uIHN0YXRlcyAoc2VsZWN0ZWQsCi0JICogdW5zZWxlY3RlZCBhbmQgcGFydGlhbGx5IHNlbGVjdGVkLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB2YWx1ZSB3aGVyZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIG1lYW5zIHBhcnRpYWxseSBzZWxlY3RlZAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRyaVN0YXRlQ2hlY2tCb3g8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyaVN0YXRlQ2hlY2tCb3ggYnVpbGRUcmlTdGF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94KAotCQkJcGFyZW50LAotCQkJdGV4dCwKLQkJCXRoaXMuZ2V0V2lkZ2V0RmFjdG9yeSgpCi0JCSk7Ci0KLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWJvb2xlYW5Ib2xkZXIsCi0JCQljaGVja0JveAotCQkpOwotCi0JCXRoaXMud2lkZ2V0cy5hZGQoY2hlY2tCb3guZ2V0Q2hlY2tCb3goKSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQloZWxwU3lzdGVtKCkuc2V0SGVscChjaGVja0JveC5nZXRDaGVja0JveCgpLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IHRoYXQgY2FuIGhhdmUgMyBzZWxlY3Rpb24gc3RhdGVzIChzZWxlY3RlZCwKLQkgKiB1bnNlbGVjdGVkIGFuZCBwYXJ0aWFsbHkgc2VsZWN0ZWQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHZhbHVlIHdoZXJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogbWVhbnMgcGFydGlhbGx5IHNlbGVjdGVkCi0JICogQHBhcmFtIHN0cmluZ0hvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdHJpbmcgdG8gcHV0IGluIHBhcmVudGhlc2lzIGFmdGVyCi0JICogdGhlIGNoZWNrIGJveCdzIHRleHQgd2hlbiBpdCBpcyBwYXJ0aWFsbHkgc2VsZWN0ZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRyaVN0YXRlQ2hlY2tCb3g8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyaVN0YXRlQ2hlY2tCb3ggYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJcGFyZW50LAotCQkJdGV4dCwKLQkJCWJvb2xlYW5Ib2xkZXIsCi0JCQlzdHJpbmdIb2xkZXIsCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGVjayBib3ggdGhhdCBjYW4gaGF2ZSAzIHNlbGVjdGlvbiBzdGF0ZXMgKHNlbGVjdGVkLAotCSAqIHVuc2VsZWN0ZWQgYW5kIHBhcnRpYWxseSBzZWxlY3RlZC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdmFsdWUgd2hlcmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBtZWFucyBwYXJ0aWFsbHkgc2VsZWN0ZWQKLQkgKiBAcGFyYW0gc3RyaW5nSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN0cmluZyB0byBwdXQgaW4gcGFyZW50aGVzaXMgYWZ0ZXIKLQkgKiB0aGUgY2hlY2sgYm94J3MgdGV4dCB3aGVuIGl0IGlzIHBhcnRpYWxseSBzZWxlY3RlZAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRyaVN0YXRlQ2hlY2tCb3g8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyaVN0YXRlQ2hlY2tCb3ggYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IHRoaXMuYnVpbGRUcmlTdGF0ZUNoZWNrQm94KAotCQkJcGFyZW50LAotCQkJdGV4dCwKLQkJCWJvb2xlYW5Ib2xkZXIsCi0JCQloZWxwSWQKLQkJKTsKLQotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKAotCQkJbmV3IExhYmVsZWRCdXR0b24oY2hlY2tCb3guZ2V0Q2hlY2tCb3goKSksCi0JCQlzdHJpbmdIb2xkZXIKLQkJKTsKLQotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JLyoqCi0JICogVW5pbnN0YWxscyBhbnkgbGlzdGVuZXJzIGZyb20gdGhlIHN1YmplY3QgaW4gb3JkZXIgdG8gc3RvcCBiZWluZyBub3RpZmllZAotCSAqIGZvciBjaGFuZ2VzIG1hZGUgb3V0c2lkZSBvZiB0aGlzIHBhbmVzLgotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCi0JCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAiICAgLT5kaXNlbmdhZ2VMaXN0ZW5lcnMoKSIpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIKLQkJKTsKLQotCQl0aGlzLmRpc2VuZ2FnZUxpc3RlbmVycyh0aGlzLnN1YmplY3QoKSk7Ci0KLQkJZm9yIChBYnN0cmFjdFBhbmU8Pz4gc3ViUGFuZSA6IHRoaXMuc3ViUGFuZXMpIHsKLQkJCXN1YlBhbmUuZGlzZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFueSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIGZyb20gdGhlIGdpdmVuIHN1YmplY3QuCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdCBUaGUgb2xkIHN1YmplY3QKLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycyhUIHN1YmplY3QpIHsKLQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotLy8JCQl0aGlzLmxvZygiICAgLT5kaXNlbmdhZ2VMaXN0ZW5lcnMoKSBmcm9tICIgKyBzdWJqZWN0KTsKLQotCQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKCkpIHsKLQkJCQlzdWJqZWN0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLmFzcGVjdENoYW5nZUxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgcGFuZSBpcyBzaG91bGQgZGlzcG9zZSBpdHNlbGYuCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoIXRoaXMuY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICJkaXNwb3NlKCkiKTsKLQkJCXRoaXMucGVyZm9ybURpc3Bvc2UoKTsKLQkJCXRoaXMuZGlzZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyB0aGlzIHBhbmUgdG8gZGlzcG9zZSBpdHNlbGYuCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0Rpc3Bvc2UoKSB7Ci0JCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAiICAgLT5kb0Rpc3Bvc2UoKSIpOwotCi0JCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLmRpc3Bvc2UoKTsKLQkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyB0aGlzIHBhbmUgdG8gcG9wdWxhdGUgaXRzIHdpZGdldHMgd2l0aCB0aGUgc3ViamVjdCdzIHZhbHVlcy4KLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAiICAgLT5kb1BvcHVsYXRlKCkiKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBlbmFibGVtZW50IHN0YXRlIG9mIHRoZSBjaGlsZHJlbiA8Y29kZT5Db250cm9sPC9jb2RlPnMuCi0JICoKLQkgKiBAcGFyYW0gZW5hYmxlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBlbmFibGUgdGhlIHdpZGdldHMgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogdG8gZGlzYWJsZSB0aGVtCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUNoaWxkcmVuKGJvb2xlYW4gZW5hYmxlZCkgewotCi0JCS8vIE9ubHkgdXBkYXRlIHRoZSBlbmFibGVtZW50IHN0YXRlIG9mIHRoZSBjaGlsZCB3aWRnZXRzIGlmIHRoaXMgcGFuZQotCQkvLyBoYXMgaXRzIGVuYWJsZW1lbnQgbWFuYWdlZCBieSBlbmFibGVXaWRnZXRzKCkgKGkuZS4gbm90IGRvbmUgbWFudWFsbHkpCi0JCWlmICh0aGlzLmlzRW5hYmxlbWVudE1hbmFnZWQoY29udGFpbmVyKSkgewotCi0JCQlmb3IgKENvbnRyb2wgY29udHJvbCA6IHRoaXMud2lkZ2V0cykgewotCi0JCQkJLy8gTWFrZSBzdXJlIHRvIGNoZWNrIGlmIHRoZSBjaGlsZCBjb250cm9sIGRvZXNuJ3QgaGF2ZSBpdHMKLQkJCQkvLyBlbmFibGVtZW50IHN0YXRlIG1hbnVhbGx5IG1hbmFnZWQKLQkJCQlpZiAodGhpcy5pc0VuYWJsZW1lbnRNYW5hZ2VkKGNvbnRyb2wpKSB7Ci0JCQkJCWNvbnRyb2wuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBlbmFibGVtZW50IHN0YXRlIG9mIHRoZSB3aWRnZXRzIG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGVuYWJsZSB0aGUgd2lkZ2V0cyBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiB0byBkaXNhYmxlIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCi0JCWlmICghY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5lbmFibGVDaGlsZHJlbihlbmFibGVkKTsKLQotCQkJZm9yIChBYnN0cmFjdFBhbmU8Pz4gc3ViUGFuZSA6IHRoaXMuc3ViUGFuZXMpIHsKLQkJCQlpZiAodGhpcy5pc1BhbmVFbmFibGVtZW50TWFuYWdlZChzdWJQYW5lKSkgewotCQkJCQlzdWJQYW5lLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zdGFsbHMgdGhlIGxpc3RlbmVycyBvbiB0aGUgc3ViamVjdCBpbiBvcmRlciB0byBiZSBub3RpZmllZCBmcm9tIGNoYW5nZXMKLQkgKiBtYWRlIG91dHNpZGUgb2YgdGhpcyBwYW5lcyBhbmQgbm90aWZpZXMgdGhlIHN1Yi1wYW5lcyB0byBkbyB0aGUgc2FtZS4KLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+ZW5nYWdlTGlzdGVuZXJzKCkiKTsKLQotCQl0aGlzLmVuZ2FnZVN1YmplY3RIb2xkZXIoKTsKLQkJdGhpcy5lbmdhZ2VMaXN0ZW5lcnModGhpcy5zdWJqZWN0KCkpOwotCi0JCWZvciAoQWJzdHJhY3RQYW5lPD8+IHN1YlBhbmUgOiB0aGlzLnN1YlBhbmVzKSB7Ci0JCQlzdWJQYW5lLmVuZ2FnZUxpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVE9ETwotCSAqCi0JICogQHBhcmFtIHN1YmplY3QKLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycyhUIHN1YmplY3QpIHsKLQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCi0vLwkJCXRoaXMubG9nKCIgICAtPmVuZ2FnZUxpc3RlbmVycygpIG9uICIgKyBzdWJqZWN0KTsKLQotCQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKCkpIHsKLQkJCQlzdWJqZWN0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLmFzcGVjdENoYW5nZUxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBlbmdhZ2VTdWJqZWN0SG9sZGVyKCkgewotCQl0aGlzLnN1YmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCXRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFpbiA8Y29kZT5Db250cm9sPC9jb2RlPiBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBtYWluIGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN1YmplY3QgaG9sZGVyIHVzZWQgYnkgdGhpcyBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IGdldFN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnN1YmplY3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHdpZGdldHMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBmYWN0b3J5IHVzZWQgYnkgdGhpcyBwYW5lIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldEZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFyZ2luIHRha2VuIGJ5IGEgZ3JvdXAgYm94LCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHBpeGVsIHRoZQotCSAqIGdyb3VwIGJveCBib3JkZXIgYW5kIGl0cyBtYXJnaW4gdGFrZXMgYmVmb3JlIGRpc3BsYXlpbmcgaXRzIHdpZGdldHMgcGx1cwotCSAqIDUgcGl4ZWxzIHNpbmNlIHRoZSB3aWRnZXRzIGluc2lkZSBvZiB0aGUgZ3JvdXAgYm94IGFuZCB0aGUgYm9yZGVyIHNob3VsZAotCSAqIGhhdmUgdGhhdCBleHRyYSA1IHBpeGVscy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHdpZHRoIHRha2VuIGJ5IHRoZSBncm91cCBib3ggYm9yZGVyIHdpdGggaXRzIG1hcmdpbgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZ3JvdXBCb3hNYXJnaW4oKSB7Ci0JCUdyb3VwIGdyb3VwID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUdyb3VwKFNXVFV0aWwuZ2V0U2hlbGwoKSwgIiIpOwotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGdyb3VwLmdldENsaWVudEFyZWEoKTsKLQkJZ3JvdXAuZGlzcG9zZSgpOwotCQlyZXR1cm4gY2xpZW50QXJlYS54ICsgNTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoZWxwcyBzeXN0ZW0uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwbGF0Zm9ybSdzIGhlbHAgc3lzdGVtCi0JICoKLQkgKiBAY2F0ZWdvcnkgSGVscGVyCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0oKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIDxjb2RlPkFic3RyYWN0U3ViamVjdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQGNhdGVnb3J5IEluaXRpYWxpemF0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgdGhpcyBwYW5lIHdpdGggdGhlIHBhcmVudCBwYW5lLgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBwYW5lOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IEluaXRpYWxpemF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJLy8gUmVnaXN0ZXIgdGhpcyBwYW5lIHdpdGggdGhlIHBhcmVudCBwYW5lLCBpdCB3aWxsIGNhbGwgdGhlIG1ldGhvZHMKLQkJLy8gYXV0b21hdGljYWxseSAoZW5nYWdlTGlzdGVuZXJzKCksIGRpc2VuZ2FnZUxpc3RlbmVycygpLCBwb3B1bGF0ZSgpLAotCQkvLyBkaXNwb3NlKCksIGV0YykKLQkJcGFyZW50UGFuZS5yZWdpc3RlclN1YlBhbmUodGhpcyk7Ci0KLQkJLy8gQWxpZ24gdGhlIGxlZnQgYW5kIHJpZ2h0IGNvbnRyb2xzIHdpdGggdGhlIGNvbnRyb2xzIGZyb20gdGhlIHBhcmVudAotCQkvLyBwYW5lCi0JCWlmIChhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0JCQlwYXJlbnRQYW5lLmxlZnRDb250cm9sQWxpZ25lciAuYWRkKHRoaXMubGVmdENvbnRyb2xBbGlnbmVyKTsKLQkJCXBhcmVudFBhbmUucmlnaHRDb250cm9sQWxpZ25lci5hZGQodGhpcy5yaWdodENvbnRyb2xBbGlnbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgPGNvZGU+QWJzdHJhY3RTdWJqZWN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKgotCSAqIEBjYXRlZ29yeSBJbml0aWFsaXphdGlvbgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpCi0JewotCQlBc3NlcnQuaXNOb3ROdWxsKHN1YmplY3RIb2xkZXIsICJUaGUgc3ViamVjdCBob2xkZXIgY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIgICAgICAgICA9IChQcm9wZXJ0eVZhbHVlTW9kZWw8VD4pIHN1YmplY3RIb2xkZXI7Ci0JCXRoaXMud2lkZ2V0RmFjdG9yeSAgICAgICAgID0gd2lkZ2V0RmFjdG9yeTsKLQkJdGhpcy5zdWJQYW5lcyAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PEFic3RyYWN0UGFuZTw/Pj4oKTsKLQkJdGhpcy53aWRnZXRzICAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2w+KCk7Ci0JCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyICAgID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCXRoaXMucmlnaHRDb250cm9sQWxpZ25lciAgID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCXRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmFzcGVjdENoYW5nZUxpc3RlbmVyICA9IHRoaXMuYnVpbGRBc3BlY3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmludGVybmFsUGFuZXNGb3JFbmFibGVtZW50Q29udHJvbCA9IG5ldyBBcnJheUxpc3Q8QWJzdHJhY3RQYW5lPD8+PigpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGVuYWJsZW1lbnQgc3RhdGUgaXMgbWFuYWdlZCBieSB0aGlzIHBhbmUgb3IgaXMKLQkgKiBtYW51YWxseSBtYW5hZ2VkLgotCSAqCi0JICogQHBhcmFtIGNvbnRyb2wgVGhlIDxjb2RlPkNvbnRyb2w8L2NvZGU+IHRvIHZlcmlmeSBob3cgaXRzIGVuYWJsZW1lbnQgc3RhdGUKLQkgKiBpcyBtYW5hZ2VkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZW5hYmxlbWVudCBzdGF0ZSBjYW4gYmUgY2hhbmdlZCB3aGVuCi0JICoge0BsaW5rICNlbmFibGVXaWRnZXRzKGJvb2xlYW4pfSBpcyBjYWxsZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdHMKLQkgKiBlbmFibGVtZW50IHN0YXRlIGlzIG1hbnVhbGx5IGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VuYWJsZW1lbnRNYW5hZ2VkKENvbnRyb2wgY29udHJvbCkgewotCQlyZXR1cm4gY29udHJvbC5nZXREYXRhKCJlbmFibGVtZW50IikgIT0gQm9vbGVhbi5GQUxTRTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIHBhbmUgaGFzIGl0cyBlbmFibGVtZW50IHN0YXRlIG1hbmFnZWQgYnkgdGhpcwotCSAqIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gc3ViUGFuZSBUaGUgc3ViLXBhbmUgdG8gdmVyaWZ5IGhvdyBpdHMgZW5hYmxlbWVudCBzdGF0ZSBpcyBiZWluZwotCSAqIG1hbmFnZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdWItcGFuZSdzIGVuYWJsZW1lbnQgc3RhdGUgaXMgbWFuYWdlZCBieQotCSAqIHRoaXMgc3RhdGU7IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCdzIG1hbnVhbGx5IG1hbmFnZWQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQYW5lRW5hYmxlbWVudE1hbmFnZWQoQWJzdHJhY3RQYW5lPD8+IHN1YlBhbmUpIHsKLQotCQlyZXR1cm4gLy8gVGVzdCAxOiBUaGlzIHBhbmUgaXMgYmVpbmcgYXV0b21hdGljYWxseSBtYW5hZ2VkIGFuZCB0aGUKLQkJICAgICAgIC8vIHN1Yi1wYW5lIHdhcyByZWdpc3RlcmVkIGhhcyBhbiBpbnRlcm5hbCBwYW5lLCB3aGljaCBtZWFucyBpdHMKLQkJICAgICAgIC8vIGVuYWJsZW1lbnQgc3RhdGUgaXMgYmVpbmcgbWFuYWdlZCBhdXRvbWF0aWNhbGx5IGFzIHdlbGwuIEEKLQkJICAgICAgIC8vIHN1Yi1wYW5lIGlzIG1hbmFnZWQgYXV0b21hdGljYWxseSBvbmx5IHdoZW4gUGFuZUVuYWJsZXIgY2hhbmdlcwotCQkgICAgICAgLy8gdGhlIGVuYWJsZW1lbnQgbWFuYWdlbWVudCBjaGVja3MKLQkJICAgICAgIHRoaXMuaXNFbmFibGVtZW50TWFuYWdlZChjb250YWluZXIpICYmCi0JCSAgICAgICB0aGlzLmludGVybmFsUGFuZXNGb3JFbmFibGVtZW50Q29udHJvbC5jb250YWlucyhzdWJQYW5lKSB8fAotCi0JCSAgICAgICAvLyBUZXN0IDI6IENoZWNrIHRvIHNlZSBpZiB0aGUgcGFuZSBpcyBhdXRvbWF0aWNhbGx5IG1hbmFnZWQKLQkJICAgICAgIHRoaXMuaXNFbmFibGVtZW50TWFuYWdlZChzdWJQYW5lLmdldENvbnRyb2woKSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyCi0JICoKLQkgKiBAcmV0dXJuCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1BvcHVsYXRpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnBvcHVsYXRpbmc7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gbWVzc2FnZSBpZiB0aGUgPGNvZGU+VHJhY2luZy5ERUJVR19MQVlPVVQ8L2NvZGU+IGlzIGVuYWJsZWQuCi0JICoKLQkgKiBAcGFyYW0gZmxhZwotCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBsb2dnaW5nIG1lc3NhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIGZsYWcsIFN0cmluZyBtZXNzYWdlKSB7Ci0KLQkJaWYgKFRyYWNpbmcuVUlfTEFZT1VULmVxdWFscyhmbGFnKSAmJgotCQkgICAgVHJhY2luZy5ib29sZWFuRGVidWdPcHRpb24oVHJhY2luZy5VSV9MQVlPVVQpKSB7Ci0KLQkJCUNsYXNzPD8+IHRoaXNDbGFzcyA9IGdldENsYXNzKCk7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gQ2xhc3NUb29scy5zaG9ydE5hbWVGb3IodGhpc0NsYXNzKTsKLQotCQkJaWYgKHRoaXNDbGFzcy5pc0Fub255bW91c0NsYXNzKCkpIHsKLQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNsYXNzTmFtZS5pbmRleE9mKCckJykpOwotCQkJCWNsYXNzTmFtZSArPSAiLT4iICsgQ2xhc3NUb29scy5zaG9ydE5hbWVGb3IodGhpc0NsYXNzLmdldFN1cGVyY2xhc3MoKSk7Ci0JCQl9Ci0KLQkJCVRyYWNpbmcubG9nKGNsYXNzTmFtZSArICI6ICIgKyBtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgcGFuZSBpcyBzaG91bGQgZGlzcG9zZSBpdHNlbGYuCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlzcG9zZSgpIHsKLQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICIgICAtPnBlcmZvcm1EaXNwb3NlKCkiKTsKLQotCQkvLyBEaXNwb3NlIHRoaXMgcGFuZQotCQlkb0Rpc3Bvc2UoKTsKLQotCQkvLyBBc2sgdGhlIHN1Yi1wYW5lcyB0byBwZXJmb3JtIHRoZSBkaXNwb3NlIHRoZW1zZWx2ZXMKLQkJZm9yIChBYnN0cmFjdFBhbmU8Pz4gc3ViUGFuZSA6IHRoaXMuc3ViUGFuZXMpIHsKLQkJCXN1YlBhbmUucGVyZm9ybURpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgcGFuZSB0byBwb3B1bGF0ZSBpdHNlbGYgdXNpbmcgdGhlIHN1YmplY3QncyBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHBvcHVsYXRlKCkgewotCQlpZiAoIXRoaXMuY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICJwb3B1bGF0ZSgpIik7Ci0JCQl0aGlzLmVuZ2FnZUxpc3RlbmVycygpOwotCQkJdGhpcy5yZXBvcHVsYXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgc3ViamVjdCdzIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZQotCSAqIGhhcyBjaGFuZ2VkLgotCSAqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IGNoYW5nZQotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIG5hbWVzIHRvIGxpc3RlbiBmb3IgcHJvcGVydGllcyBjaGFuZ2luZyBmcm9tIHRoZQotCSAqIHN1YmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMKLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcygpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gcHJvcGVydHlOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYW5vdGhlciA8Y29kZT5BYnN0cmFjdFN1YmplY3RQYW5lPC9jb2RlPiB3aXRoIHRoaXMgb25lIHNvIGl0IGNhbgotCSAqIGJlIGF1dG9tYXRpY2FsbHkgbm90aWZpZWQgYWJvdXQgY2VydGFpbiBldmVudHMgc3VjaCBhcyBlbmdhZ2luZyBvcgotCSAqIGRpc2VuZ2FnaW5nIHRoZSBsaXN0ZW5lcnMsIGV0Yy4KLQkgKgotCSAqIEBwYXJhbSBzdWJQYW5lIFRoZSBzdWItcGFuZSB0byByZWdpc3RlcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnRyb2xsZXIKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWdpc3RlclN1YlBhbmUoQWJzdHJhY3RQYW5lPD8+IHN1YlBhbmUpIHsKLQkJdGhpcy5zdWJQYW5lcy5hZGQoc3ViUGFuZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcGFuZSdzIHdpZGdldHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIHdpdGgKLQkgKiBpdHMgbGVmdCA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4pIGZyb20gdGhpcyBwYW5lJ3MgbGVmdAotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBzbyB0aGF0IHRoZWlyIHdpZHRoIHdpbGwgbm8gbG9uZ2VyIGJlIGFkanVzdGVkCi0JICogd2l0aCB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRvIHJlbW92ZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZUFsaWduTGVmdChBYnN0cmFjdFBhbmU8Pz4gcGFuZSkgewotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lci5yZW1vdmUocGFuZS5sZWZ0Q29udHJvbEFsaWduZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbnRyb2wgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiB3aWRnZXRzIHRoYXQgYXJlIGFsaWduZWQKLQkgKiB0byBoYXZlIHRoZSBzYW1lIHdpZHRoIHdoZW4gdGhleSBhcmUgc2hvd24gdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgMwotCSAqIHdpZGdldCBjb2x1bXMuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB0byByZW1vdmUsIGl0cyB3aWR0aCB3aWxsIG5vIGxvbmdlciBiZQotCSAqIGFqdXN0ZWQgdG8gYmUgdGhlIHdpZHRoIG9mIHRoZSBsb25nZXN0IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZUFsaWduTGVmdChDb250cm9sIGNvbnRyb2wpIHsKLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIucmVtb3ZlKGNvbnRyb2wpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHBhbmUncyB3aWRnZXRzICh0aG9zZSB0aGF0IHdlcmUgcmVnaXN0ZXJlZCB3aXRoCi0JICogaXRzIHJpZ2h0IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgZnJvbSB0aGlzIHBhbmUncyByaWdodAotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBzbyB0aGF0IHRoZWlyIHdpZHRoIHdpbGwgbm8gbG9uZ2VyIGJlIGFkanVzdGVkCi0JICogd2l0aCB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRvIHJlbW92ZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZUFsaWduUmlnaHQoQWJzdHJhY3RQYW5lPD8+IHBhbmUpIHsKLQkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLnJlbW92ZShwYW5lLnJpZ2h0Q29udHJvbEFsaWduZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbnRyb2wgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiB3aWRnZXRzIHRoYXQgYXJlIGFsaWduZWQKLQkgKiB0byBoYXZlIHRoZSBzYW1lIHdpZHRoIHdoZW4gdGhleSBhcmUgc2hvd24gdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIDMKLQkgKiB3aWRnZXQgY29sdW1zLgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgdG8gcmVtb3ZlLCBpdHMgd2lkdGggd2lsbCBubyBsb25nZXIgYmUKLQkgKiBhanVzdGVkIHRvIGJlIHRoZSB3aWR0aCBvZiB0aGUgbG9uZ2VzdCB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1vdmVBbGlnblJpZ2h0KENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIucmVtb3ZlKGNvbnRyb2wpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIDxjb2RlPkFic3RyYWN0UGFuZTwvY29kZT4ncyA8Y29kZT5Db250cm9sPC9jb2RlPiBmcm9tCi0JICogaGF2aW5nIGl0cyBlbmFibGVtZW50IHN0YXRlIG1hbmFnZWQgYnkgdGhpcyBwYW5lLiBIb3dldmVyLCBpZiB0aGlzIHBhbmUKLQkgKiBoYXMgaXRzIGVuYWJsZW1lbnQgc3RhdGUgbW9kaWZpZWQsIHRoZSBnaXZlbiBwYW5lIHdpbGwgcmVjZWl2ZSB0aGF0Ci0JICogbm90aWZpY2F0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgdG8gaGF2ZSBpdHMgZW5hYmxlbWVudCBzdGF0ZSBub3QgbWFuYWdlZCBieSB0aGlzIHBhbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tRW5hYmxlbWVudENvbnRyb2woQWJzdHJhY3RQYW5lPD8+IHBhbmUpIHsKLQkJdGhpcy5yZW1vdmVGcm9tRW5hYmxlbWVudENvbnRyb2wocGFuZS5nZXRDb250cm9sKCkpOwotCQl0aGlzLmludGVybmFsUGFuZXNGb3JFbmFibGVtZW50Q29udHJvbC5hZGQocGFuZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+Q29udHJvbDwvY29kZT4gZnJvbSBoYXZpbmcgaXRzIGVuYWJsZW1lbnQgc3RhdGUKLQkgKiBiZWluZyBtYW5hZ2VkIGJ5IHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9sIFRoZSA8Y29kZT5Db250cm9sPC9jb2RlPiB0aGF0IGhhcyBpdHMgZW5hYmxlbWVudCBzdGF0ZQotCSAqIG1hbnVhbGx5IGNvbnRyb2xsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tRW5hYmxlbWVudENvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCWNvbnRyb2wuc2V0RGF0YSgiZW5hYmxlbWVudCIsIEJvb2xlYW4uRkFMU0UpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHBhbmUncyBjb250cm9scyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgZm9yCi0JICogYWxpZ25tZW50KSBmcm9tIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdGhhdCBubyBsb25nZXIKLQkgKiByZXF1aXJlcyB0aGVpciB3aWR0aCBhZGp1c3RlZCB3aXRoIHRoZSB3aWR0aCBvZiB0aGUgbG9uZ2VzdCB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1vdmVQYW5lRm9yQWxpZ25tZW50KEFic3RyYWN0UGFuZTw/PiBwYW5lKSB7Ci0JCXJlbW92ZUFsaWduTGVmdChwYW5lKTsKLQkJcmVtb3ZlQWxpZ25SaWdodChwYW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgKHBlcmhhcHMgaW50ZXJuYWxseSkgd2hlbiB0aGlzIG5lZWRzIHRvIHJlcG9wdWxhdGUKLQkgKiBidXQgdGhlIG9iamVjdCBvZiBpbnRlcmVzdCBoYXMgbm90IGNoYW5nZWQuCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZXBvcHVsYXRlKCkgewotCi0JCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAiICAgLT5yZXBvcHVsYXRlKCkiKTsKLQotCQkvLyBQb3B1bGF0ZSB0aGlzIHBhbmUKLQkJdHJ5IHsKLQkJCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCQlkb1BvcHVsYXRlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCi0JCS8vIEFzayB0aGUgc3ViLXBhbmVzIHRvIHJlcG9wdWxhdGUgdGhlbXNlbHZlcwotCQlmb3IgKEFic3RyYWN0UGFuZTw/PiBzdWJQYW5lIDogdGhpcy5zdWJQYW5lcykgewotCQkJc3ViUGFuZS5yZXBvcHVsYXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBwYW5lIHNob3VsZCBiZSByZXBvcHVsYXRlIGV2ZW4gaWYgdGhlIHN1YmplY3QgaWYKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaXMgcmV0dXJuZWQgYnkgZGVmYXVsdAotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlcG9wdWxhdGVXaXRoTnVsbFN1YmplY3QoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGludGVybmFsIGZsYWcgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBwYW5lIGlzIGJlaW5nCi0JICogcG9wdWxhdGVkIG9yIG5vdC4gRHVyaW5nIHBvcHVsYXRpb24sIGl0IGlzIHJlcXVpcmVkIHRvIG5vdCB1cGRhdGUgdGhlCi0JICogd2lkZ2V0cyB3aGVuIHRoZSBtb2RlbCBpcyB1cGRhdGVkIG5vciB0byB1cGRhdGUgdGhlIG1vZGVsIHdoZW4gdGhlIHdpZGdldHMKLQkgKiBhcmUgYmVpbmcgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsJ3MgdmFsdWVzLgotCSAqCi0JICogQHBhcmFtIHBvcHVsYXRpbmcKLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFBvcHVsYXRpbmcoYm9vbGVhbiBwb3B1bGF0aW5nKSB7Ci0JCXRoaXMucG9wdWxhdGluZyA9IHBvcHVsYXRpbmc7Ci0JfQotCi0JLyoqCi0JICogRWl0aGVyIHNob3cgb3IgaGlkZXMgdGhpcyBwYW5lLgotCSAqCi0JICogQHBhcmFtIHZpc2libGUgVGhlIG5ldyB2aXNpYmlsaXR5IHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKCF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuY29udGFpbmVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZWFyZXN0IDxjb2RlPlNoZWxsPC9jb2RlPiBkaXNwbGF5aW5nIHRoZSBtYWluIHdpZGdldCBvZiB0aGlzCi0JICogcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIG5lYXJlc3Qgd2luZG93IGRpc3BsYXlpbmcgdGhpcyBwYW5lCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNoZWxsIHNoZWxsKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluZXIuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWJqZWN0IG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHN1YmplY3QgaWYgdGhpcyBwYW5lIHdhcyBub3QgZGlzcG9zZWQ7IDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgaXQgd2FzCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgVCBzdWJqZWN0KCkgewotCQlyZXR1cm4gdGhpcy5zdWJqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaGFzIGNoYW5nZWQsIGRpc2Nvbm5lY3RzIGFueSBsaXN0ZW5lcnMgZnJvbSB0aGUgb2xkIHN1YmplY3QKLQkgKiBhbmQgY29ubmVjdHMgdGhvc2UgbGlzdGVuZXJzIG9udG8gdGhlIG5ldyBzdWJqZWN0LgotCSAqCi0JICogQHBhcmFtIG9sZHN1YmplY3QgVGhlIG9sZCBzdWJqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgd2FzIHNldAotCSAqIEBwYXJhbSBuZXdTdWJqZWN0IFRoZSBuZXcgc3ViamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIG5lZWRzIHRvIGJlCi0JICogc2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzdWJqZWN0Q2hhbmdlZChUIG9sZFN1YmplY3QsIFQgbmV3U3ViamVjdCkgewotCQlpZiAoIXRoaXMuY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCi0JCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgInN1YmplY3RDaGFuZ2VkKCkiKTsKLQkJCXRoaXMuZGlzZW5nYWdlTGlzdGVuZXJzKG9sZFN1YmplY3QpOwotCi0JCQkvLyBPbmx5IHJlcG9wdWxhdGUgaWYgaXQgaXMgYWxsb3dlZCB3aGVuIHRoZSBzdWJqZWN0IGlzIG51bGwKLQkJCWlmIChuZXdTdWJqZWN0ICE9IG51bGwgfHwKLQkJCSAgIChuZXdTdWJqZWN0ID09IG51bGwgJiYgcmVwb3B1bGF0ZVdpdGhOdWxsU3ViamVjdCgpKSkKLQkJCXsKLQkJCQl0aGlzLnJlcG9wdWxhdGUoKTsKLQkJCX0KLQotCQkJdGhpcy5lbmdhZ2VMaXN0ZW5lcnMobmV3U3ViamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbnJlZ2lzdGVycyB0aGUgZ2l2ZW4gPGNvZGU+QWJzdHJhY3RTdWJqZWN0UGFuZTwvY29kZT4gZnJvbSB0aGlzIG9uZSBzbyBpdAotCSAqIGNhbiBubyBsb25nZXIgYmUgYXV0b21hdGljYWxseSBub3RpZmllZCBhYm91dCBjZXJ0YWluIGV2ZW50cyBzdWNoIGFzCi0JICogZW5nYWdpbmcgb3IgZGlzZW5nYWdpbmcgdGhlIGxpc3RlbmVycywgZXRjLgotCSAqCi0JICogQHBhcmFtIHN1YlBhbmUgVGhlIHN1Yi1wYW5lIHRvIHVucmVnaXN0ZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb250cm9sbGVyCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdW5yZWdpc3RlclN1YlBhbmUoQWJzdHJhY3RQYW5lPD8+IHN1YlBhbmUpIHsKLQkJdGhpcy5zdWJQYW5lcy5yZW1vdmUoc3ViUGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhbmUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoIWlzUG9wdWxhdGluZygpICYmICFjb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlwb3B1bGF0aW5nID0gdHJ1ZTsKLQotCQkJdHJ5IHsKLQkJCQlwcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXBvcHVsYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0VmFsaWRhdGluZ0RpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdFZhbGlkYXRpbmdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3MGZjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0VmFsaWRhdGluZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLlByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyBkaWFsb2cgaXMgc2ltaWxhciB0byBpdCBzdXBlcmNsYXNzLCA8Y29kZT5BYnN0cmFjdERpYWxvZzwvY29kZT4sIHdpdGgKLSAqIHRoZSBhZGRlZCB2YWx1ZSBvZiBhbiBlcnJvciBtZXNzYWdlIGxhYmVsIGJlbG93IHRoZSBtYWluIHBhbmVsLiBBIHN1YmNsYXNzCi0gKiBjYW4gc2V0IHRoaXMgZXJyb3IgbWVzc2FnZSBhcyBuZWVkZWQgc28gdGhhdCBpdCBjYW4gaW5mb3JtIHRoZSB1c2VyIHNvbWV0aGluZwotICogaW5jb3JyZWN0IGhhcyBiZWVuIGVudGVyZWQuCi0gKiA8cD4KLSAqIElmIHRoZXJlIGlzIGFuIGVycm9yIG1lc3NhZ2UsIGl0IHdpbGwgYmUgc2hvd24uIElmIHRoZXJlIGlzIGEgd2FybmluZwotICogbWVzc2FnZSwgaXQgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuIFdhcm5pbmcgbWVzc2FnZXMKLSAqIGhhdmUgYSBkaWZmZXJlbnQgaWNvbiB0aGFuIGVycm9yIG1lc3NhZ2VzLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW5nRGlhbG9nPFQgZXh0ZW5kcyBOb2RlPiBleHRlbmRzIEFic3RyYWN0RGlhbG9nPFQ+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RWYWxpZGF0aW5nRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpbmdEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdFZhbGlkYXRpbmdEaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIHRpdGxlIFRoZSBkaWFsb2cncyB0aXRsZQotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpbmdEaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIocGFyZW50LCB0aXRsZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JZmluYWwgTm9kZS5WYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTm9kZS5WYWxpZGF0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYXVzZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVzdW1lKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJCQlBYnN0cmFjdFZhbGlkYXRpbmdEaWFsb2cudGhpcy52YWxpZGF0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBkZXNjcmlwdGlvbiBwYW5lLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGNsZWFyRXJyb3JNZXNzYWdlKCkgewotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gc2hvd24gaW4gdGhlIGRlc2NyaXB0aW9uIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdGlvbiB1bmRlciB0aGUgZGVzY3JpcHRpb24ncyB0aXRsZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgaW1hZ2Ugb2YgdGhlIGRlc2NyaXB0aW9uIHBhbmUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcwotCSAqIHJlcXVpcmVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGRlc2NyaXB0aW9uSW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSBkZXNjcmlwdGlvbiBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgdGl0bGUgc2hvd24gaW4gdGhlIGRlc2NyaXB0aW9uIHBhbmUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpIHsKLQkJUG9pbnQgcmVzdWx0ID0gZ2V0U2hlbGwoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlQb2ludCBwYW5lU2l6ZSA9IHBhbmUoKS5nZXRDb250cm9sKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJaW50IHdpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNDAwKTsKLQkJcmVzdWx0LnggPSBNYXRoLm1heCh3aWR0aCwgcGFuZVNpemUueCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzVGl0bGVBcmVhKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVUkoKSB7Ci0KLQkJc3VwZXIuaW5pdGlhbGl6ZVVJKCk7Ci0KLQkJLy8gVXBkYXRlIHRoZSBkZXNjcmlwdGlvbiB0aXRsZQotCQlTdHJpbmcgZGVzY3JpcHRpb25UaXRsZSA9IGRlc2NyaXB0aW9uVGl0bGUoKTsKLQotCQlpZiAoZGVzY3JpcHRpb25UaXRsZSAhPSBudWxsKSB7Ci0JCQlzZXRUaXRsZShkZXNjcmlwdGlvblRpdGxlKTsKLQkJfQotCi0JCS8vIFVwZGF0ZSB0aGUgZGVzY3JpcHRpb24gdGl0bGUKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24oKTsKLQotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJc2V0TWVzc2FnZShkZXNjcmlwdGlvbik7Ci0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIGRlc2NyaXB0aW9uIGltYWdlCi0JCUltYWdlIGltYWdlID0gZGVzY3JpcHRpb25JbWFnZSgpOwotCi0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlzZXRUaXRsZUltYWdlKGltYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGRlc2NyaXB0aW9uIHBhbmUgYnkgc2hvd2luZyB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSBhbmQgZm9ybWF0Ci0JICogdGhlIHRleHQgd2l0aCB0aGUgZ2l2ZW4gbGlzdCBvZiBhcmd1bWVudHMgaWYgYW55IGV4aXN0cy4KLQkgKgotCSAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gcGFuZQotCSAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGxpc3Qgb2YgYXJndW1lbnRzIHVzZWQgdG8gZm9ybWF0IHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UsIE9iamVjdC4uLiBhcmd1bWVudHMpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKGVycm9yTWVzc2FnZSwgYXJndW1lbnRzKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSwgZWl0aGVyIHNob3dzIHRoZSBmaXJzdCBlcnJvciBwcm9ibGVtIG9yIGhpZGVzCi0JICogdGhlIGVycm9yIHBhbmUuIElmIHRoZSBwcm9ncmVzcyBiYXIgaXMgc2hvd24sIHRoZW4gdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbAotCSAqIG5vdCBiZSBzaG93bi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgewotCQlpZiAoc3ViamVjdCgpLmhhc0JyYW5jaFByb2JsZW1zKCkpIHsKLQkJCVByb2JsZW0gcHJvYmxlbSA9IHN1YmplY3QoKS5icmFuY2hQcm9ibGVtcygpLm5leHQoKTsKLQkJCXNldEVycm9yTWVzc2FnZShwcm9ibGVtLm1lc3NhZ2VLZXkoKSwgcHJvYmxlbS5tZXNzYWdlQXJndW1lbnRzKCkpOwotCQl9Ci0JCS8vIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gYWRkIHdhcm5pbmdzIHRvIHRoZSBtb2RlbAotLy8JCWVsc2UgaWYgKHRoaXMuc3ViamVjdCgpLmhhc0JyYW5jaFdhcm5pbmdzKCkpIHsKLS8vCQkJUHJvYmxlbSBwcm9ibGVtID0gdGhpcy5zdWJqZWN0KCkuYnJhbmNoV2FybmluZ3MoKS5uZXh0KCk7Ci0vLwkJCXRoaXMuc2V0V2FybmluZ01lc3NhZ2VLZXkocHJvYmxlbS5nZXRNZXNzYWdlS2V5KCksIHByb2JsZW0uZ2V0TWVzc2FnZUFyZ3VtZW50cygpKTsKLS8vCQl9Ci0JCWVsc2UgewotCQkJY2xlYXJFcnJvck1lc3NhZ2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgc3RhdGUgb2JqZWN0IGFuZCBiYXNlZCBvbiBpdHMgc3RhdHVzLCB1cGRhdGUgdGhlIGRlc2NyaXB0aW9uCi0JICogcGFuZSB0byBzaG93IHRoZSBmaXJzdCBlcnJvciBpZiBhbnkgZXhpc3RzIGFuZCB1cGRhdGUgdGhlIGVuYWJsZW1lbnQgb2YKLQkgKiB0aGUgT0sgYnV0dG9uLgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJc3ViamVjdCgpLnZhbGlkYXRlQnJhbmNoKCk7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoIXN1YmplY3QoKS5oYXNCcmFuY2hQcm9ibGVtcygpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVMaXN0UGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVMaXN0UGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGY1MzBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlTGlzdFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gdXNlcyBhIDxjb2RlPlRhYmxlPC9jb2RlPgotICogYXMgaXRzIG1haW4gd2lkZ2V0LCBhIDxjb2RlPkxpc3Q8L2NvZGU+IGNhbid0IGJlIHVzZWQgYmVjYXVzZSBpdCBkb2Vzbid0Ci0gKiBzdXBwb3J0IHNob3dpbmcgaW1hZ2VzLiBIb3dldmVyLCB0aGUgdGFibGUgaXMgZGlzcGxheWVkIGxpa2UgYSBsaXN0LgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwgSXRlbSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBBZGQuLi4gIHwgfAotICogfCB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0tLS0tLS0tLS0tIHwKLSAqIHwgfCBJdGVtIG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBFZGl0Li4uIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBSZW1vdmUgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBZGRSZW1vdmVMaXN0UGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQWRkUmVtb3ZlUGFuZTxUPgotewotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBwcmV2ZW50IGNpcmN1bGFyCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGxvY2tlZDsKLQotCS8qKgotCSAqIFRoZSBtYWluIHdpZGdldCBvZiB0aGlzIGFkZC9yZW1vdmUgcGFuZS4KLQkgKi8KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgdGFibGUgaG9sZGVyJ3MgaXRlbXMKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlTGlzdFBhbmUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZUxpc3RQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSB0YWJsZSBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwKLQkJICAgICAgcGFyZW50LAotCQkgICAgICBhZGFwdGVyLAotCQkgICAgICBsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgIGhlbHBJZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIHRhYmxlIGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHVibGljIEFkZFJlbW92ZUxpc3RQYW5lKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwKLQkJICAgICAgc3ViamVjdEhvbGRlciwKLQkJICAgICAgcGFyZW50LAotCQkgICAgICBhZGFwdGVyLAotCQkgICAgICBsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIGxhYmVsUHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlTGlzdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSB0YWJsZSBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHN1YmplY3RIb2xkZXIsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgICBoZWxwSWQpOwotCX0KLQotCXByaXZhdGUgQ29sdW1uQWRhcHRlcjxPYmplY3Q+IGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb2x1bW5BZGFwdGVyPE9iamVjdD4oKSB7Ci0JCQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzKE9iamVjdCBzdWJqZWN0KSB7Ci0JCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSB2YWx1ZUhvbGRlcnMgPSBuZXcgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bMV07Ci0JCQkJdmFsdWVIb2xkZXJzWzBdID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KHN1YmplY3QpOwotCQkJCXJldHVybiB2YWx1ZUhvbGRlcnM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoIXRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQl0YWJsZS5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoIXRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQl0YWJsZS5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCWlmICghdGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXRhYmxlLmdldFBhcmVudCgpLmxheW91dCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCWlmICghdGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXRhYmxlLmdldFBhcmVudCgpLmxheW91dCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoIXRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQl0YWJsZS5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKCF0YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJdGFibGUuZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAoIWxvY2tlZCkgewotCQkJCQlsb2NrZWQgPSB0cnVlOwotCi0JCQkJCXRyeSB7Ci0JCQkJCQlPYmplY3QgdmFsdWUgPSBlLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlnZXRTZWxlY3Rpb25Nb2RlbCgpLnNldFNlbGVjdGVkVmFsdWUoZS5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCWludCBpbmRleCA9IC0xOwotCi0JCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCWluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoZ2V0TGlzdEhvbGRlcigpLml0ZXJhdG9yKCksIHZhbHVlKTsKLQkJCQkJCX0KLQotCQkJCQkJdGFibGUuc2VsZWN0KGluZGV4KTsKLQkJCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCWxvY2tlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8T2JqZWN0PiBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPE9iamVjdD4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PE9iamVjdD4gZSkgewotCQkJCUFkZFJlbW92ZUxpc3RQYW5lLnRoaXMuc2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGJ1aWxkVGFibGVDb250YWluZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkUGFuZShjb250YWluZXIsIGJ1aWxkVGFibGVDb250YWluZXJMYXlvdXQoKSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIExheW91dCBidWlsZFRhYmxlQ29udGFpbmVyTGF5b3V0KCkgewotCQlyZXR1cm4gbmV3IExheW91dCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoSGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0SGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQotCQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKVswXTsKLQkJCQlwYWNrQ29sdW1uKHRhYmxlKTsKLQotCQkJCS8vIENhbGN1bGF0ZSB0aGUgdGFibGUgc2l6ZSBhbmQgYWRqdXN0IGl0IHdpdGggdGhlIGhpbnRzCi0JCQkJUG9pbnQgc2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJCQlpZiAod2lkdGhIaW50ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJCXNpemUueCA9IHdpZHRoSGludDsKLQkJCQl9Ci0KLQkJCQlpZiAoaGVpZ2h0SGludCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQlzaXplLnkgPSBoZWlnaHRIaW50OwotCQkJCX0KLQotCQkJCXJldHVybiBzaXplOwotCQkJfQotCi0JCQlwcml2YXRlIGJvb2xlYW4gaXNWZXJ0aWNhbFNjcm9sbGJhckJhclZpc2libGUoVGFibGUgdGFibGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEpIHsKLQotCQkJCS8vIEdldCB0aGUgaGVpZ2h0IG9mIGFsbCB0aGUgcm93cwotCQkJCWludCBoZWlnaHQgPSB0YWJsZS5nZXRJdGVtQ291bnQoKSAqIHRhYmxlLmdldEl0ZW1IZWlnaHQoKTsKLQotCQkJCS8vIFJlbW92ZSB0aGUgYm9yZGVyIGZyb20gdGhlIGhlaWdodAotCQkJCWhlaWdodCArPSAodGFibGUuZ2V0Qm9yZGVyV2lkdGgoKSAqIDIpOwotCi0JCQkJcmV0dXJuIChjbGllbnRBcmVhLmhlaWdodCA8IGhlaWdodCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCi0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0KLQkJCQlpZiAoYm91bmRzLndpZHRoID4gMCkgewotCi0JCQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKVswXTsKLQkJCQkJdGFibGUuc2V0Qm91bmRzKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0KLQkJCQkJdXBkYXRlVGFibGVDb2x1bW5XaWR0aCgKLQkJCQkJCXRhYmxlLAotCQkJCQkJYm91bmRzLndpZHRoLAotCQkJCQkJaXNWZXJ0aWNhbFNjcm9sbGJhckJhclZpc2libGUodGFibGUsIGJvdW5kcykKLQkJCQkJKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCBwYWNrQ29sdW1uKFRhYmxlIHRhYmxlKSB7Ci0KLQkJCQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IHRhYmxlLmdldENvbHVtbigwKTsKLQotCQkJCXRhYmxlLnNldFJlZHJhdyhmYWxzZSk7Ci0JCQkJdGFibGUuc2V0TGF5b3V0RGVmZXJyZWQodHJ1ZSk7Ci0JCQkJdGFibGVDb2x1bW4ucGFjaygpOwotCQkJCXRhYmxlLnNldExheW91dERlZmVycmVkKGZhbHNlKTsKLQkJCQl0YWJsZS5zZXRSZWRyYXcodHJ1ZSk7Ci0KLQkJCQkvLyBDYWNoZSB0aGUgY29sdW1uIHdpZHRoIHNvIGl0IGNhbiBiZSB1c2VkIGluCi0JCQkJLy8gdXBkYXRlVGFibGVDb2x1bW5XaWR0aCgpIHdoZW4gZGV0ZXJtaW5lIHdoaWNoIHdpZHRoIHRvIHVzZQotCQkJCXRhYmxlLnNldERhdGEoCi0JCQkJCSJjb2x1bW4ud2lkdGgiLAotCQkJCQlJbnRlZ2VyLnZhbHVlT2YodGFibGVDb2x1bW4uZ2V0V2lkdGgoKSkKLQkJCQkpOwotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgdXBkYXRlVGFibGVDb2x1bW5XaWR0aChUYWJsZSB0YWJsZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdmVydGljYWxTY3JvbGxiYXJCYXJWaXNpYmxlKSB7Ci0KLQkJCQkvLyBSZW1vdmUgdGhlIGJvcmRlciBmcm9tIHRoZSB3aWR0aAotCQkJCXdpZHRoIC09ICh0YWJsZS5nZXRCb3JkZXJXaWR0aCgpICogMik7Ci0KLQkJCQkvLyBSZW1vdmUgdGhlIHNjcm9sbGJhciBmcm9tIHRoZSB3aWR0aCBpZiBpdCBpcyBzaG93bgotCQkJCWlmICh2ZXJ0aWNhbFNjcm9sbGJhckJhclZpc2libGUpIHsKLQkJCQkJd2lkdGggLT0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCkueDsKLQkJCQl9Ci0KLQkJCQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IHRhYmxlLmdldENvbHVtbigwKTsKLQotCQkJCS8vIFJldHJpZXZlIHRoZSBjYWNoZWQgY29sdW1uIHdpZHRoLCB3aGljaCBpcyByZXF1aXJlZCBmb3IKLQkJCQkvLyBkZXRlcm1pbmluZyB3aGljaCB3aWR0aCB0byB1c2UgKHRoZSBjb2x1bW4gd2lkdGggb3IgdGhlCi0JCQkJLy8gY2FsY3VsYXRlZCB3aWR0aCkKLQkJCQlJbnRlZ2VyIGNvbHVtbldpdGRoID0gKEludGVnZXIpIHRhYmxlLmdldERhdGEoImNvbHVtbi53aWR0aCIpOwotCi0JCQkJLy8gVXNlIHRoZSBjYWxjdWxhdGVkIHdpZHRoIGlmIHRoZSBjb2x1bW4gaXMgc21hbGxlciwgb3RoZXJ3aXNlCi0JCQkJLy8gdXNlIHRoZSBjb2x1bW4gd2lkdGggYW5kIGEgaG9yaXpvbnRhbCBzY3JvbGwgYmFyIHdpbGwgc2hvdyB1cAotCQkJCXdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGNvbHVtbldpdGRoKTsKLQotCQkJCS8vIEFkanVzdCB0aGUgY29sdW1uIHdpZHRoCi0JCQkJdGFibGVDb2x1bW4uc2V0V2lkdGgod2lkdGgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBidWlsZFRhYmxlTGFiZWxQcm92aWRlcihJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlyZXR1cm4gbmV3IFRhYmxlTGFiZWxQcm92aWRlcigoSUxhYmVsUHJvdmlkZXIpIGxhYmVsUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXRNYWluQ29udHJvbCgpIHsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYWluQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQl0YWJsZSA9IGJ1aWxkVGFibGUoCi0JCQlidWlsZFRhYmxlQ29udGFpbmVyKGNvbnRhaW5lciksCi0JCQlTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEksCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZW1vdmVGcm9tRW5hYmxlbWVudENvbnRyb2wodGFibGUpOwotCi0JCVRhYmxlTW9kZWxBZGFwdGVyIG1vZGVsID0gVGFibGVNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQkoTGlzdFZhbHVlTW9kZWw8T2JqZWN0PikgbGlzdEhvbGRlciwKLQkJCWJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRUYWJsZUxhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcikKLQkJKTsKLQotCQltb2RlbC5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCXNlbGVjdGVkSXRlbUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKLQkJKTsKLQotCQlsaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigKLQkJCUxpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLAotCQkJYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKQotCQkpOwotCi0JCWluaXRpYWxpemVUYWJsZSh0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIHRhYmxlLCB3aGljaCBhY3RzIGxpa2UgYSBsaXN0IGluIG91ciBjYXNlLgotCSAqCi0JICogQHBhcmFtIHRhYmxlIFRoZSBtYWluIHdpZGdldCBvZiB0aGlzIHBhbmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGUoVGFibGUgdGFibGUpIHsKLQotCQl0YWJsZS5zZXREYXRhKCJjb2x1bW4ud2lkdGgiLCBuZXcgSW50ZWdlcigwKSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQsIHVwZGF0ZSAoMSkgdGhlIHNlbGVjdGVkIGl0ZW0gaG9sZGVyLCAoMikgdGhlCi0JICogc2VsZWN0aW9uIG1vZGVsIGFuZCAoMykgdGhlIGJ1dHRvbnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0KLQkJaWYgKGxvY2tlZCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbG9ja2VkID0gdHJ1ZTsKLQotCQl0cnkgewotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBnZXRTZWxlY3RlZEl0ZW1Ib2xkZXIoKTsKLQkJCU9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBzZWxlY3Rpb25Nb2RlbCA9IGdldFNlbGVjdGlvbk1vZGVsKCk7Ci0JCQlpbnQgc2VsZWN0aW9uQ291bnQgPSB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpOwotCi0JCQlpZiAoc2VsZWN0aW9uQ291bnQgPT0gMCkgewotCQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJCQlzZWxlY3Rpb25Nb2RlbC5jbGVhclNlbGVjdGlvbigpOwotCQkJfQotCQkJZWxzZSBpZiAoc2VsZWN0aW9uQ291bnQgIT0gMSkgewotCQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJCQlzZWxlY3Rpb25Nb2RlbC5jbGVhclNlbGVjdGlvbigpOwotCi0JCQkJZm9yIChpbnQgaW5kZXggOiB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpIHsKLQkJCQkJc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW5kZXgsIGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgc2VsZWN0ZWRJbmRleCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkSXRlbSA9IGdldExpc3RIb2xkZXIoKS5nZXQoc2VsZWN0ZWRJbmRleCk7Ci0KLQkJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUoc2VsZWN0ZWRJdGVtKTsKLQkJCQlzZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKHNlbGVjdGVkSXRlbSk7Ci0JCQl9Ci0KLQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWxvY2tlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBsYWJlbCBwcm92aWRlciBzaW1wbHkgZGVsZWdhdGVzIHRoZSByZW5kZXJpbmcgdG8gdGhlIHByb3ZpZGVkCi0JICogPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JCVRhYmxlTGFiZWxQcm92aWRlcihJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMWRmOTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBkZWZpbml0aW9uIG9mIGEgcGFuZSB0aGF0IGhhcyBidXR0b25zIGZvciBhZGRpbmcsIHJlbW92aW5nIGFuZAotICogcG9zc2libHkgZWRpdGluZyB0aGUgaXRlbXMuCi0gKgotICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQotICoKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWRkUmVtb3ZlUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQWJzdHJhY3RQYW5lPFQ+Ci17Ci0JcHJpdmF0ZSBBZGFwdGVyIGFkYXB0ZXI7Ci0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZDsKLQlwcml2YXRlIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIEJ1dHRvbiBvcHRpb25hbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGVkSXRlbUhvbGRlcjsKLQlwcml2YXRlIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBzZWxlY3Rpb25Nb2RlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLAotCQkgICAgIHBhcmVudCwKLQkJICAgICBhZGFwdGVyLAotCQkgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkgKi8KLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlUGFuZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0KLQkJaW5pdGlhbGl6ZSgKLQkJCWFkYXB0ZXIsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJbGFiZWxQcm92aWRlcgotCQkpOwotCi0JCWluaXRpYWxpemVMYXlvdXQoCi0JCQlhZGFwdGVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWxhYmVsUHJvdmlkZXIsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIGFkYXB0ZXIgVGhpcyA8Y29kZT5BZGFwdGVyPC9jb2RlPiBpcyB1c2VkIHRvIGRpY3RhY3RlIHRoZSBiZWhhdmlvcgotCSAqIG9mIHRoaXMgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gYW5kIGJ5IGRlbGVnYXRpbmcgdG8gaXQgc29tZSBvZiB0aGUKLQkgKiBiZWhhdmlvcgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlUGFuZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQl0aGlzKHBhcmVudFBhbmUsCi0JCSAgICAgc3ViamVjdEhvbGRlciwKLQkJICAgICBwYXJlbnQsCi0JCSAgICAgYWRhcHRlciwKLQkJICAgICBsaXN0SG9sZGVyLAotCQkgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqLwotCXByb3RlY3RlZCBBZGRSZW1vdmVQYW5lKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQotCQlpbml0aWFsaXplKAotCQkJYWRhcHRlciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlsYWJlbFByb3ZpZGVyCi0JCSk7Ci0KLQkJaW5pdGlhbGl6ZUxheW91dCgKLQkJCWFkYXB0ZXIsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJbGFiZWxQcm92aWRlciwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIEdpdmVzIHRoZSBwb3NzaWJpbGl0eSB0byBhZGQgYnV0dG9ucyBhZnRlciB0aGUgQWRkIGJ1dHRvbiBhbmQgYmVmb3JlIHRoZQotCSAqIG9wdGlvbmFsIGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYnV0dG9ucwotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEN1c3RvbUJ1dHRvbkFmdGVyQWRkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCX0KLQotCS8qKgotCSAqIEdpdmVzIHRoZSBwb3NzaWJpbGl0eSB0byBhZGQgYnV0dG9ucyBhZnRlciB0aGUgb3B0aW9uYWwgYnV0dG9uIGFuZCBiZWZvcmUKLQkgKiB0aGUgUmVtb3ZlIGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYnV0dG9ucwotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEN1c3RvbUJ1dHRvbkFmdGVyT3B0aW9uYWxCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgQWRkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbSgpIHsKLQkJYWRhcHRlci5hZGROZXdJdGVtKHNlbGVjdGlvbk1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgSW5pdGlhbGl6ZQotCSAqLwotCXByb3RlY3RlZCBBZGFwdGVyIGJ1aWxkQWRhcHRlcigpIHsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IEFkZAotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gYnVpbGRBZGRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gYnVpbGRCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlhZGFwdGVyLmFkZEJ1dHRvblRleHQoKSwKLQkJCWJ1aWxkQWRkSXRlbUFjdGlvbigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IEFkZAotCSAqLwotCXByaXZhdGUgUnVubmFibGUgYnVpbGRBZGRJdGVtQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5hZGRJdGVtKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCU9iamVjdCBzZWxlY3RlZEl0ZW0gPSBzZWxlY3RlZEl0ZW1Ib2xkZXIuZ2V0VmFsdWUoKTsKLQotCQkJCWlmIChzZWxlY3RlZEl0ZW0gPT0gbnVsbCkgewotCQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGUuaXRlbXMoKSwgc2VsZWN0ZWRJdGVtKSkgewotCQkJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQkJdXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBPcHRpb24KLQkgKi8KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkT3B0aW9uYWxBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLmVkaXRJdGVtKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IE9wdGlvbgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gYnVpbGRPcHRpb25hbEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBidWlsZEJ1dHRvbigKLQkJCWNvbnRhaW5lciwKLQkJCWFkYXB0ZXIub3B0aW9uYWxCdXR0b25UZXh0KCksCi0JCQlidWlsZE9wdGlvbmFsQWN0aW9uKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgQWRkCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBidWlsZFJlbW92ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBidWlsZEJ1dHRvbigKLQkJCXBhcmVudCwKLQkJCWFkYXB0ZXIucmVtb3ZlQnV0dG9uVGV4dCgpLAotCQkJYnVpbGRSZW1vdmVJdGVtc0FjdGlvbigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IFJlbW92ZQotCSAqLwotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSZW1vdmVJdGVtc0FjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBZGRSZW1vdmVQYW5lLnRoaXMucmVtb3ZlSXRlbXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGJ1aWxkUm93U2VsZWN0aW9uTW9kZWwoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdE1vZGVsKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKG5ldyBMaXN0TW9kZWxBZGFwdGVyKGxpc3RNb2RlbCkpOwotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBPcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0SXRlbSgpIHsKLQkJdGhpcy5hZGFwdGVyLm9wdGlvbk9uU2VsZWN0aW9uKGdldFNlbGVjdGlvbk1vZGVsKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQotCQlpZiAoIXRoaXMuZ2V0TWFpbkNvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuZ2V0TWFpbkNvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0KLQkJdGhpcy51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIElCYXNlTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8Pz4gZ2V0TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIGxpc3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucwotCSAqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBDb21wb3NpdGUgZ2V0TWFpbkNvbnRyb2woKTsKLQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGdldFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIHNlbGVjdGVkSXRlbUhvbGRlcjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGdldFNlbGVjdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICoKLQkgKiBAY2F0ZWdvcnkgSW5pdGlhbGl6YXRpb24KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikKLQl7Ci0JCXRoaXMubGlzdEhvbGRlciAgICAgICAgID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyICAgICAgPSBsYWJlbFByb3ZpZGVyOwotCQl0aGlzLmFkYXB0ZXIgICAgICAgICAgICA9IChhZGFwdGVyID09IG51bGwpID8gYnVpbGRBZGFwdGVyKCkgOiBhZGFwdGVyOwotCQl0aGlzLnNlbGVjdGVkSXRlbUhvbGRlciA9IChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KSBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwgICAgID0gbmV3IE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbChuZXcgTGlzdE1vZGVsQWRhcHRlcihsaXN0SG9sZGVyKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigKLQkJCUxpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLAotCQkJYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIGJ1dHRvbnMgKEFkZCwgb3B0aW9uYWwgKGlmIHJlcXVpcmVkKQotCSAqIGFuZCBSZW1vdmUpLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBidXR0b25zCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJ1dHRvblBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkU3ViUGFuZShjb250YWluZXIpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgICAgICAgPSBTV1QuVE9QOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gQWRkIGJ1dHRvbgotCQlhZGRCdXR0b24gPSBidWlsZEFkZEJ1dHRvbihjb250YWluZXIpOwotCQlhZGRBbGlnblJpZ2h0KGFkZEJ1dHRvbik7Ci0JCXJlbW92ZUZyb21FbmFibGVtZW50Q29udHJvbChhZGRCdXR0b24pOwotCi0JCS8vIEN1c3RvbSBidXR0b24KLQkJYWRkQ3VzdG9tQnV0dG9uQWZ0ZXJBZGRCdXR0b24oY29udGFpbmVyLCBoZWxwSWQpOwotCi0JCS8vIE9wdGlvbmFsIGJ1dHRvbgotCQlpZiAoYWRhcHRlci5oYXNPcHRpb25hbEJ1dHRvbigpKSB7Ci0JCQlvcHRpb25hbEJ1dHRvbiA9IGJ1aWxkT3B0aW9uYWxCdXR0b24oY29udGFpbmVyKTsKLQkJCXJlbW92ZUZyb21FbmFibGVtZW50Q29udHJvbChvcHRpb25hbEJ1dHRvbik7Ci0JCQlhZGRBbGlnblJpZ2h0KG9wdGlvbmFsQnV0dG9uKTsKLQkJfQotCi0JCS8vIEN1c3RvbSBidXR0b24KLQkJYWRkQ3VzdG9tQnV0dG9uQWZ0ZXJPcHRpb25hbEJ1dHRvbihjb250YWluZXIsIGhlbHBJZCk7Ci0KLQkJLy8gUmVtb3ZlIGJ1dHRvbgotCQlyZW1vdmVCdXR0b24gPSBidWlsZFJlbW92ZUJ1dHRvbihjb250YWluZXIpOwotCQlyZW1vdmVGcm9tRW5hYmxlbWVudENvbnRyb2wocmVtb3ZlQnV0dG9uKTsKLQkJYWRkQWxpZ25SaWdodChyZW1vdmVCdXR0b24pOwotCi0JCS8vIFVwZGF0ZSB0aGUgaGVscCB0b3BpYyBJRAotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKGFkZEJ1dHRvbiwgaGVscElkKTsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJlbW92ZUJ1dHRvbiwgaGVscElkKTsKLQotCQkJaWYgKG9wdGlvbmFsQnV0dG9uICE9IG51bGwpIHsKLQkJCQloZWxwU3lzdGVtKCkuc2V0SGVscChvcHRpb25hbEJ1dHRvbiwgaGVscElkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgYWRkL3JlbW92ZSBwYW5lIGJ5IGNyZWF0aW5nIHRoZSB3aWRnZXRzLiBUaGUgc3ViY2xhc3MgaXMKLQkgKiByZXF1aXJlZCB0byBidWlsZCB0aGUgbWFpbiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChBZGFwdGVyIGFkYXB0ZXIsCi0gICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLSAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLSAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCWluaXRpYWxpemVNYWluQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJYWRhcHRlciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlsYWJlbFByb3ZpZGVyLAotCQkJaGVscElkKTsKLQotCQlpbml0aWFsaXplQnV0dG9uUGFuZShjb250YWluZXIsIGhlbHBJZCk7Ci0JCWVuYWJsZVdpZGdldHMoc3ViamVjdCgpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5jb250YWluZXIgPSBidWlsZFN1YlBhbmUoY29udGFpbmVyLCAyLCAwLCAwLCAwLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGFkYXB0ZXIgVGhpcyA8Y29kZT5BZGFwdGVyPC9jb2RlPiBpcyB1c2VkIHRvIGRpY3RhY3RlIHRoZSBiZWhhdmlvcgotCSAqIG9mIHRoaXMgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gYW5kIGJ5IGRlbGVnYXRpbmcgdG8gaXQgc29tZSBvZiB0aGUKLQkgKiBiZWhhdmlvcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IHdhcyBub3Qgc3BlY2lmaWVkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKTsKLQotCS8qKgotCSAqIEBjYXRlZ29yeSBSZW1vdmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtcygpIHsKLQotCQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBzZWxlY3RlZCBpbmRpY2VzIHNvIHdlIGNhbiBzZWxlY3QgYW4gaXRlbQotCQkvLyBiZWZvcmUgdGhlIGxvd2VzdCBpbmRleAotCQlpbnRbXSBpbmRpY2VzID0gc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRJbmRpY2VzKCk7Ci0JCUFycmF5cy5zb3J0KGluZGljZXMpOwotCi0JCS8vIE5vdGlmeSB0aGUgYWRhcHRlciB0byByZW1vdmUgdGhlIHNlbGVjdGVkIGl0ZW1zCi0JCWFkYXB0ZXIucmVtb3ZlU2VsZWN0ZWRJdGVtcyhzZWxlY3Rpb25Nb2RlbCk7Ci0KLQkJLy8gU2VsZWN0IGEgbmV3IGl0ZW0KLQkJaWYgKGdldExpc3RIb2xkZXIoKS5zaXplKCkgPiAwKSB7Ci0JCQlpbnQgaW5kZXggPSBNYXRoLm1pbihpbmRpY2VzWzBdLCBnZXRMaXN0SG9sZGVyKCkuc2l6ZSgpIC0gMSk7Ci0JCQlPYmplY3QgaXRlbSA9IGdldExpc3RIb2xkZXIoKS5nZXQoaW5kZXgpOwotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKGl0ZW0pOwotCQl9Ci0JCS8vIFRoZSBsaXN0IGlzIGVtcHR5LCBjbGVhciB0aGUgdmFsdWUKLQkJZWxzZSB7Ci0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIHRoZSBnaXZlbiB2YWx1ZSwgd2hpY2ggY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgc2VsZWN0ZWQgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEl0ZW0oT2JqZWN0IHZhbHVlKSB7Ci0JCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IFVwZGF0ZUJ1dHRvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBZGRCdXR0b24oQnV0dG9uIGFkZEJ1dHRvbikgewotCQlhZGRCdXR0b24uc2V0RW5hYmxlZCgKLQkJCWVuYWJsZWQgJiYKLQkJCXN1YmplY3QoKSAhPSBudWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IFVwZGF0ZUJ1dHRvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQlpZiAoIWNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXVwZGF0ZUFkZEJ1dHRvbihhZGRCdXR0b24pOwotCQkJdXBkYXRlUmVtb3ZlQnV0dG9uKHJlbW92ZUJ1dHRvbik7Ci0JCQl1cGRhdGVPcHRpb25hbEJ1dHRvbihvcHRpb25hbEJ1dHRvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgVXBkYXRlQnV0dG9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9wdGlvbmFsQnV0dG9uKEJ1dHRvbiBvcHRpb25hbEJ1dHRvbikgewotCQlpZiAob3B0aW9uYWxCdXR0b24gIT0gbnVsbCkgewotCQkJb3B0aW9uYWxCdXR0b24uc2V0RW5hYmxlZCgKLQkJCQllbmFibGVkICYmCi0JCQkJYWRhcHRlci5lbmFibGVPcHRpb25PblNlbGVjdGlvbkNoYW5nZShzZWxlY3Rpb25Nb2RlbCkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgVXBkYXRlQnV0dG9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlbW92ZUJ1dHRvbihCdXR0b24gcmVtb3ZlQnV0dG9uKSB7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKAotCQkJZW5hYmxlZCAmJgotCQkJYWRhcHRlci5lbmFibGVSZW1vdmVPblNlbGVjdGlvbkNoYW5nZShzZWxlY3Rpb25Nb2RlbCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBBbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5BZGFwdGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBUaGUgdGV4dCBvZiB0aGUgYWRkIGJ1dHRvbi4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGFkZEJ1dHRvblRleHQ7Ci0KLQkJLyoqCi0JCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgb3B0aW9uYWwgYnV0dG9uIHNob3VsZCBiZSBzaG93biBvciBub3QuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b247Ci0KLQkJLyoqCi0JCSAqIFRoZSB0ZXh0IG9mIHRoZSBvcHRpb25hbCBidXR0b24sIGlmIHVzZWQuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQ7Ci0KLQkJLyoqCi0JCSAqIFRoZSB0ZXh0IG9mIHRoZSByZW1vdmUgYnV0dG9uLgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlQnV0dG9uVGV4dDsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEFkYXB0ZXI8L2NvZGU+IHdpdGggZGVmYXVsdCB0ZXh0IGZvciB0aGUKLQkJICogYWRkIGFuZCByZW1vdmUgYnV0dG9ucy4KLQkJICovCi0JCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQl0aGlzKEpwdFVpTWVzc2FnZXMuQWRkUmVtb3ZlUGFuZV9BZGRCdXR0b25UZXh0LAotCQkJICAgICBKcHRVaU1lc3NhZ2VzLkFkZFJlbW92ZVBhbmVfUmVtb3ZlQnV0dG9uVGV4dCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEFkYXB0ZXI8L2NvZGU+IHdpdGggZGVmYXVsdCB0ZXh0IGZvciB0aGUKLQkJICogYWRkIGFuZCByZW1vdmUgYnV0dG9ucy4KLQkJICoKLQkJICogQHBhcmFtIGhhc09wdGlvbmFsQnV0dG9uIDxjb2RlPnRydWU8L2NvZGU+IHRvIHNob3cgYW4gb3B0aW9uYWwgYnV0dG9uCi0JCSAqIGFuZCB0byB1c2UgdGhlIGJlaGF2aW9yIHJlbGF0ZWQgdG8gdGhlIG9wdGlvbmFsIGJ1dHRvbjsKLQkJICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCB1c2UgaXQKLQkJICovCi0JCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXIoYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbikgewotCQkJdGhpcygpOwotCQkJdGhpcy5zZXRIYXNPcHRpb25hbEJ1dHRvbihoYXNPcHRpb25hbEJ1dHRvbik7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEFkYXB0ZXI8L2NvZGU+IHdpdGggZGVmYXVsdCB0ZXh0IGZvciB0aGUKLQkJICogYWRkIGFuZCByZW1vdmUgYnV0dG9ucy4KLQkJICoKLQkJICogQHBhcmFtIG9wdGlvbmFsQnV0dG9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgb3B0aW9uYWwgYnV0dG9uLCB3aGljaCBtZWFucwotCQkgKiB0aGUgb3B0aW9uYWwgYnV0dG9uIHdpbGwgYmUgc2hvd24KLQkJICovCi0JCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXIoU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCkgewotCQkJdGhpcyh0cnVlKTsKLQkJCXRoaXMuc2V0T3B0aW9uYWxCdXR0b25UZXh0KG9wdGlvbmFsQnV0dG9uVGV4dCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEFkYXB0ZXI8L2NvZGU+LgotCQkgKgotCQkgKiBAcGFyYW0gYWRkQnV0dG9uVGV4dCBUaGUgYWRkIGJ1dHRvbidzIHRleHQKLQkJICogQHBhcmFtIHJlbW92ZUJ1dHRvblRleHQgVGhlIHJlbW92ZSBidXR0b24ncyB0ZXh0Ci0JCSAqLwotCQlwdWJsaWMgQWJzdHJhY3RBZGFwdGVyKFN0cmluZyBhZGRCdXR0b25UZXh0LAotCQkgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZW1vdmVCdXR0b25UZXh0KSB7Ci0KLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmFkZEJ1dHRvblRleHQgICAgPSBhZGRCdXR0b25UZXh0OwotCQkJdGhpcy5yZW1vdmVCdXR0b25UZXh0ID0gcmVtb3ZlQnV0dG9uVGV4dDsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0QWRhcHRlcjwvY29kZT4uCi0JCSAqCi0JCSAqIEBwYXJhbSBhZGRCdXR0b25UZXh0IFRoZSBhZGQgYnV0dG9uJ3MgdGV4dAotCQkgKiBAcGFyYW0gcmVtb3ZlQnV0dG9uVGV4dCBUaGUgcmVtb3ZlIGJ1dHRvbidzIHRleHQKLQkJICogQHBhcmFtIG9wdGlvbmFsQnV0dG9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgb3B0aW9uYWwgYnV0dG9uLCB3aGljaCBtZWFucwotCQkgKiB0aGUgb3B0aW9uYWwgYnV0dG9uIHdpbGwgYmUgc2hvd24KLQkJICovCi0JCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXIoU3RyaW5nIGFkZEJ1dHRvblRleHQsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbW92ZUJ1dHRvblRleHQsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCkgewotCi0JCQl0aGlzKG9wdGlvbmFsQnV0dG9uVGV4dCk7Ci0JCQl0aGlzLnNldEFkZEJ1dHRvblRleHQoYWRkQnV0dG9uVGV4dCk7Ci0JCQl0aGlzLnNldFJlbW92ZUJ1dHRvblRleHQocmVtb3ZlQnV0dG9uVGV4dCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGFkZEJ1dHRvblRleHQoKSB7Ci0JCQlyZXR1cm4gYWRkQnV0dG9uVGV4dDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGVuYWJsZU9wdGlvbk9uU2VsZWN0aW9uQ2hhbmdlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCXJldHVybiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXNTaXplKCkgPT0gMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVuYWJsZVJlbW92ZU9uU2VsZWN0aW9uQ2hhbmdlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCXJldHVybiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpICE9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCXJldHVybiBoYXNPcHRpb25hbEJ1dHRvbjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgewotCQkJcmV0dXJuIG9wdGlvbmFsQnV0dG9uVGV4dDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlQnV0dG9uVGV4dCgpIHsKLQkJCXJldHVybiByZW1vdmVCdXR0b25UZXh0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoYW5nZXMgdGhlIHRleHQgb2YgdGhlIGFkZCBidXR0b24uIFRoaXMgbWV0aG9kIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlCi0JCSAqIHRoZSA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4gaXMgaW5pdGlhbGl6ZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSBhZGRCdXR0b25UZXh0IFRoZSBhZGQgYnV0dG9uJ3MgdGV4dAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0QWRkQnV0dG9uVGV4dChTdHJpbmcgYWRkQnV0dG9uVGV4dCkgewotCQkJdGhpcy5hZGRCdXR0b25UZXh0ID0gYWRkQnV0dG9uVGV4dDsKLQkJfQotCi0JCS8qKgotCQkgKiBDaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgb3B0aW9uYWwgYnV0dG9uLCBtZWFuaW5nIGlmIGl0IHNob3VsZCBiZSBzaG93bgotCQkgKiBiZXR3ZWVuIHRoZSBhZGQgYW5kIHJlbW92ZSBidXR0b25zIG9yIG5vdC4KLQkJICoKLQkJICogQHBhcmFtIGhhc09wdGlvbmFsQnV0dG9uIDxjb2RlPnRydWU8L2NvZGU+IHRvIHNob3cgYW4gb3B0aW9uYWwgYnV0dG9uCi0JCSAqIGFuZCB0byB1c2UgdGhlIGJlaGF2aW9yIHJlbGF0ZWQgdG8gdGhlIG9wdGlvbmFsIGJ1dHRvbjsKLQkJICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCB1c2UgaXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEhhc09wdGlvbmFsQnV0dG9uKGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24pIHsKLQkJCXRoaXMuaGFzT3B0aW9uYWxCdXR0b24gPSBoYXNPcHRpb25hbEJ1dHRvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBDaGFuZ2VzIHRoZSB0ZXh0IG9mIHRoZSBvcHRpb25hbCBidXR0b24uIFRoaXMgbWV0aG9kIGhhcyB0byBiZSBjYWxsZWQKLQkJICogYmVmb3JlIHRoZSA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4gaXMgaW5pdGlhbGl6ZWQuIFRoaXMgZG9lcyBub3QKLQkJICogbWFrZSB0aGUgb3B0aW9uYWwgYnV0dG9uIHZpc2libGUuCi0JCSAqCi0JCSAqIEBwYXJhbSBvcHRpb25hbEJ1dHRvblRleHQgVGhlIG9wdGlvbmFsIGJ1dHRvbidzIHRleHQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsQnV0dG9uVGV4dChTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KSB7Ci0JCQl0aGlzLm9wdGlvbmFsQnV0dG9uVGV4dCA9IG9wdGlvbmFsQnV0dG9uVGV4dDsKLQkJfQotCi0JCS8qKgotCQkgKiBDaGFuZ2VzIHRoZSB0ZXh0IG9mIHRoZSByZW1vdmUgYnV0dG9uLiBUaGlzIG1ldGhvZCBoYXMgdG8gYmUgY2FsbGVkCi0JCSAqIGJlZm9yZSB0aGUgPGNvZGU+QWRkUmVtb3ZlTGlzdFBhbmU8L2NvZGU+IGlzIGluaXRpYWxpemVkLgotCQkgKgotCQkgKiBAcGFyYW0gcmVtb3ZlQnV0dG9uVGV4dCBUaGUgcmVtb3ZlIGJ1dHRvbidzIHRleHQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFJlbW92ZUJ1dHRvblRleHQoU3RyaW5nIHJlbW92ZUJ1dHRvblRleHQpIHsKLQkJCXRoaXMucmVtb3ZlQnV0dG9uVGV4dCA9IHJlbW92ZUJ1dHRvblRleHQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkYXB0ZXIgaXMgdXNlZCB0byBwZXJmb3JtIHRoZSBhY3R1YWwgYWN0aW9uIHdoZW4gYWRkaW5nIGEgbmV3IGl0ZW0KLQkgKiBvciByZW1vdmluZyB0aGUgc2VsZWN0ZWQgaXRlbXMuIEl0IGlzIHBvc3NpYmxlIHRvIGFkZCBhbiBvcHRpb25hbCBidXR0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQWRhcHRlciB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBhZGQgYnV0dG9uJ3MgdGV4dC4KLQkJICoKLQkJICogQHJldHVybiBUaGUgdGV4dCBzaG93biBvbiB0aGUgYWRkIGJ1dHRvbgotCQkgKi8KLQkJU3RyaW5nIGFkZEJ1dHRvblRleHQoKTsKLQotCQkvKioKLQkJICogSW52b2tlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhlIEFkZCBidXR0b24uCi0JCSAqLwotCQl2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIEludm9rZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcy4gSW1wbGVtZW50YXRpb24gZGljdGF0ZXMgd2hldGhlciBidXR0b24KLQkJICogc2hvdWxkIGJlIGVuYWJsZWQuCi0JCSAqLwotCQlib29sZWFuIGVuYWJsZU9wdGlvbk9uU2VsZWN0aW9uQ2hhbmdlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpOwotCi0JCS8qKgotCQkgKiBJbnZva2VkIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMuIEltcGxlbWVudGF0aW9uIGRpY3RhdGVzIHdoZXRoZXIgcmVtb3ZlIGJ1dHRvbgotCQkgKiBzaG91bGQgYmUgZW5hYmxlZC4KLQkJICovCi0JCWJvb2xlYW4gZW5hYmxlUmVtb3ZlT25TZWxlY3Rpb25DaGFuZ2UoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIERldGVybWluZXMgd2hldGhlciBhbiBvcHRpb25hbCBidXR0b24gc2hvdWxkIGJlIGFkZGVkIGJldHdlZW4gdGhlIGFkZAotCQkgKiBhbmQgcmVtb3ZlIGJ1dHRvbnMuCi0JCSAqCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc2hvdyBhbiBvcHRpb25hbCBidXR0b24gYW5kIHRvIHVzZSB0aGUKLQkJICogYmVoYXZpb3IgcmVsYXRlZCB0byB0aGUgb3B0aW9uYWwgYnV0dG9uOyA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IHVzZQotCQkgKiBpdAotCQkgKi8KLQkJYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpOwotCi0JCS8qKgotCQkgKiBSZXNvdXJjZSBzdHJpbmcga2V5IGZvciB0aGUgb3B0aW9uYWwgYnV0dG9uLgotCQkgKi8KLQkJU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpOwotCi0JCS8qKgotCQkgKiBJbnZva2VkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGUgb3B0aW9uYWwgYnV0dG9uCi0JCSAqLwotCQl2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpOwotCi0JCS8qKgotCQkgKiBUaGUgcmVtb3ZlIGJ1dHRvbidzIHRleHQuCi0JCSAqCi0JCSAqIEByZXR1cm4gVGhlIHRleHQgc2hvd24gb24gdGhlIHJlbW92ZSBidXR0b24KLQkJICovCi0JCVN0cmluZyByZW1vdmVCdXR0b25UZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIEludm9rZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoZSBSZW1vdmUgYnV0dG9uLgotCQkgKi8KLQkJdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVRhYmxlUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVUYWJsZVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxNjY3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVRhYmxlUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiB1c2VzIGEgPGNvZGU+VGFibGU8L2NvZGU+Ci0gKiBhcyBpdHMgbWFpbiB3aWRnZXQuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW90IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tIHwKLSAqIHwgfCBDb2x1bW4gMSB8IENvbHVtbiAyIHwgLi4uICAgfCBDb2x1bW4gaSB8IC4uLiAgIHwgQ29sdW5tIG4gfCB8IEFkZC4uLiAgfCB8Ci0gKiB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICB8IC0tLS0tLS0tLS0tIHwKLSAqIHwgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IEVkaXQuLi4gfCB8Ci0gKiB8IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgIHwgLS0tLS0tLS0tLS0gfAotICogfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IC0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgfCB8IFJlbW92ZSAgfCB8Ci0gKiB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRSZW1vdmVUYWJsZVBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEFkZFJlbW92ZVBhbmU8VD4KLXsKLQkvKioKLQkgKiBGbGFnIHVzZWQgdG8gcHJldmVudCBjaXJjdWxhcgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkvKioKLQkgKiBUaGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlVGFibGVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlVGFibGVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLAotCQkgICAgICBwYXJlbnQsCi0JCSAgICAgIGFkYXB0ZXIsCi0JCSAgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbGFiZWxQcm92aWRlciwKLQkJICAgICAgaGVscElkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZVRhYmxlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlVGFibGVQYW5lKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLAotCQkgICAgICBzdWJqZWN0SG9sZGVyLAotCQkgICAgICBwYXJlbnQsCi0JCSAgICAgIGFkYXB0ZXIsCi0JCSAgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbGFiZWxQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVUYWJsZVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHN1YmplY3RIb2xkZXIsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgICBoZWxwSWQpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb2x1bW5BZGFwdGVyPD8+IGJ1aWxkQ29sdW1uQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCWJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKCFsb2NrZWQpIHsKLQkJCQkJbG9ja2VkID0gdHJ1ZTsKLQotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IHZhbHVlID0gZS5nZXROZXdWYWx1ZSgpOwotCQkJCQkJZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRTZWxlY3RlZFZhbHVlKGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlpbnQgaW5kZXggPSAtMTsKLQotCQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGdldExpc3RIb2xkZXIoKS5pdGVyYXRvcigpLCB2YWx1ZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRhYmxlLnNlbGVjdChpbmRleCk7Ci0JCQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlsb2NrZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPE9iamVjdD4gYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxPYmplY3Q+KCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxPYmplY3Q+IGUpIHsKLQkJCQlBZGRSZW1vdmVUYWJsZVBhbmUudGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldE1haW5Db250cm9sKCkgewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkKLQl7Ci0JCXRhYmxlID0gYnVpbGRUYWJsZShjb250YWluZXIsIGhlbHBJZCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLQkJcmVtb3ZlRnJvbUVuYWJsZW1lbnRDb250cm9sKHRhYmxlKTsKLQotCQlUYWJsZU1vZGVsQWRhcHRlcjxPYmplY3Q+IHRhYmxlTW9kZWwgPSBUYWJsZU1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCShMaXN0VmFsdWVNb2RlbDxPYmplY3Q+KSBsaXN0SG9sZGVyLAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCXRhYmxlLAotCQkJKENvbHVtbkFkYXB0ZXI8T2JqZWN0PikgYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQkoSVRhYmxlTGFiZWxQcm92aWRlcikgbGFiZWxQcm92aWRlcgotCQkpOwotCi0JCXRhYmxlTW9kZWwuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCWJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCwgdXBkYXRlICgxKSB0aGUgc2VsZWN0ZWQgaXRlbSBob2xkZXIsICgyKSB0aGUKLQkgKiBzZWxlY3Rpb24gbW9kZWwgYW5kICgzKSB0aGUgYnV0dG9ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQotCQlpZiAobG9ja2VkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlsb2NrZWQgPSB0cnVlOwotCi0JCXRyeSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGdldFNlbGVjdGVkSXRlbUhvbGRlcigpOwotCQkJT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHNlbGVjdGlvbk1vZGVsID0gZ2V0U2VsZWN0aW9uTW9kZWwoKTsKLQkJCWludCBzZWxlY3Rpb25Db3VudCA9IHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCk7Ci0KLQkJCWlmIChzZWxlY3Rpb25Db3VudCA9PSAwKSB7Ci0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkJCXNlbGVjdGlvbk1vZGVsLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzZWxlY3Rpb25Db3VudCAhPSAxKSB7Ci0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkJCXNlbGVjdGlvbk1vZGVsLmNsZWFyU2VsZWN0aW9uKCk7Ci0KLQkJCQlmb3IgKGludCBpbmRleCA6IHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSkgewotCQkJCQlzZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3Rpb25JbnRlcnZhbChpbmRleCwgaW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCBzZWxlY3RlZEluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRJdGVtID0gZ2V0TGlzdEhvbGRlcigpLmdldChzZWxlY3RlZEluZGV4KTsKLQotCQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCQkJCXNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoc2VsZWN0ZWRJdGVtKTsKLQkJCX0KLQotCQkJdXBkYXRlQnV0dG9ucygpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbG9ja2VkID0gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0NsYXNzQ2hvb3NlclBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ2xhc3NDaG9vc2VyUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTE4MTAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ2xhc3NDaG9vc2VyUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5Db250cm9sQ29udGVudEFzc2lzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5KYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgdHlwZSB3aGVuIGJyb3dzaW5nIGFuZCBpdCBhZGRzIGNvZGUKLSAqIGNvbXBsZXRpb24gc3VwcG9ydCB0byB0aGUgdGV4dCBmaWVsZCwgd2hpY2ggaXMgdGhlIG1haW4gY29tcG9uZW50LgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc0Nob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBBYnN0cmFjdENob29zZXJQYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIGNvZGUgY29tcGxldGlvbiBtYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yIGphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2xhc3NDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENsYXNzQ2hvb3NlclBhbmUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2xhc3NDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2xhc3NDaG9vc2VyUGFuZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBSdW5uYWJsZSBidWlsZEJyb3dzZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcm9tcHRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGJ1aWxkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVRleHQgdGV4dCA9IGJ1aWxkVGV4dChjb250YWluZXIsIGJ1aWxkVGV4dEhvbGRlcigpKTsKLQotCQlDb250cm9sQ29udGVudEFzc2lzdEhlbHBlci5jcmVhdGVUZXh0Q29udGVudEFzc2lzdGFudCgKLQkJCXRleHQsCi0JCQlqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IKLQkJKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWx1ZSBob2xkZXIgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgY2xhc3MgbmFtZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpOwotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciB0aGUgT3BlbiBUeXBlIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBzZWxlY3RlZCB0eXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyCi0JICogY2FuY2VsbGVkIHRoZSBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgY2hvb3NlVHlwZSgpIHsKLQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcGFja2FnZUZyYWdtZW50Um9vdCgpOwotCi0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10geyByb290LmdldEphdmFQcm9qZWN0KCkgfTsKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQlTZWxlY3Rpb25EaWFsb2cgdHlwZVNlbGVjdGlvbkRpYWxvZzsKLQotCQl0cnkgewotCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCXNoZWxsKCksCi0JCQkJc2VydmljZSwKLQkJCQlzY29wZSwKLQkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywKLQkJCQlmYWxzZSwKLQkJCQljbGFzc05hbWUoKSAhPSBudWxsID8gQ2xhc3NUb29scy5zaG9ydE5hbWVGb3JDbGFzc05hbWVkKGNsYXNzTmFtZSgpKSA6ICIiCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEpwdFVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZSk7Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRVaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgZnJvbSBpdHMgc3ViamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNsYXNzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBkZWZpbmVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBjbGFzc05hbWUoKTsKLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXVwZGF0ZVBhY2thZ2VGcmFnbWVudCgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0KLQkJLy8gVE9ETyBidWcgMTU2MTg1IC0gd2hlbiB0aGlzIGlzIGZpeGVkIHRoZXJlIHNob3VsZCBiZSBhcGkgZm9yIHRoaXMKLQkJdGhpcy5qYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IgPSBuZXcgSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yKGZhbHNlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSA/PwotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIHJvb3Qgb2YgdGhlIHBhY2thZ2UgZnJhZ21lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQKLQkgKiBjYW4ndCBiZSByZXRyaWV2ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCgpOwotCi0JLyoqCi0JICogVGhlIGJyb3dzZSBidXR0b24gd2FzIGNsaWNrZWQsIGl0cyBhY3Rpb24gaW52b2tlcyB0aGlzIGFjdGlvbiB3aGljaCBzaG91bGQKLQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgY2xhc3MgYW5kIHNldCBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9tcHRUeXBlKCk7Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlUGFja2FnZUZyYWdtZW50KCkgewotCi0JCWlmIChzdWJqZWN0KCkgIT0gbnVsbCkgewotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQotCQkJaWYgKHJvb3QgIT0gbnVsbCkgewotCQkJCWphdmFUeXBlQ29tcGxldGlvblByb2Nlc3Nvci5zZXRQYWNrYWdlRnJhZ21lbnQocm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3Iuc2V0UGFja2FnZUZyYWdtZW50KG51bGwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0RlZmF1bHRXaWRnZXRGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0RlZmF1bHRXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYjc1YTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9EZWZhdWx0V2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0vKioKLSAqIFRoaXMgPGNvZGU+V2lkZ2V0RmFjdG9yeTwvY29kZT4gc2ltcGx5IGNyZWF0ZXMgcGxhaW4gU1dUIHdpZGdldHMuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0V2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIFdpZGdldEZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPklXaWRnZXRGYWN0b3J5PC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFdpZGdldEZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdFdpZGdldEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGVmYXVsdFdpZGdldEZhY3Rvcnk8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgRGVmYXVsdFdpZGdldEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+SVdpZGdldEZhY3Rvcnk8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+SVdpZGdldEZhY3Rvcnk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBXaWRnZXRGYWN0b3J5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQsIFNXVC5OVUxMKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIGJ1dHRvbiwgd2hpY2ggZGV0ZXJtaW5lcyBpdHMgdHlwZToKLQkgKiB0b2dnbGUsIHB1c2gsIGNoZWNrIGJveCwgcmFkaW8KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIHN0eWxlKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBDQ29tYm8gY3JlYXRlQ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULkNIRUNLKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIENDb21ibyBjcmVhdGVFZGl0YWJsZUNDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgQ0NvbWJvKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBDb21ibyBjcmVhdGVFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlncm91cC5zZXRUZXh0KHRpdGxlKTsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlIeXBlcmxpbmsgaHlwZXJsaW5rID0gbmV3IEh5cGVybGluayhwYXJlbnQsIFNXVC5OVUxMKTsKLQkJaHlwZXJsaW5rLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBoeXBlcmxpbms7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KGxhYmVsVGV4dCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIExpc3QgY3JlYXRlTGlzdChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIG5ldyBMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEZvcm1UZXh0IGNyZWF0ZU11bHRpTGluZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQpIHsKLQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlUYWJsZVdyYXBMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlV3JhcExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyAgID0gMTsKLQkJbGF5b3V0LmJvdHRvbU1hcmdpbiA9IDA7Ci0JCWxheW91dC5sZWZ0TWFyZ2luICAgPSAwOwotCQlsYXlvdXQucmlnaHRNYXJnaW4gID0gMDsKLQkJbGF5b3V0LnRvcE1hcmdpbiAgICA9IDA7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlGb3JtVG9vbGtpdCB3aWRnZXRGYWN0b3J5ID0gbmV3IEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwotCQlGb3JtVGV4dCB0ZXh0ID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVGb3JtVGV4dChjb250YWluZXIsIHRydWUpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJdGV4dC5zZXRUZXh0KGxhYmVsVGV4dCwgZmFsc2UsIGZhbHNlKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFRleHQgY3JlYXRlTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVQYXNzd29yZFRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlBBU1NXT1JEKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQsIFNXVC5QVVNIKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuUkFESU8pOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gbmV3IFNlY3Rpb24ocGFyZW50LCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTcGlubmVyIGNyZWF0ZVNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFNwaW5uZXIocGFyZW50LCBTV1QuTlVMTCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBUYWJsZSBjcmVhdGVUYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZShwYXJlbnQsIFNXVC5CT1JERVIgfCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVUcmlTdGF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsIHRleHQsIHRoaXMpOwotCQlyZXR1cm4gY2hlY2tCb3guZ2V0Q2hlY2tCb3goKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtRGlhbG9nQ29tYm9WaWV3ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRW51bURpYWxvZ0NvbWJvVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTAxMzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtRGlhbG9nQ29tYm9WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5FbnVtQ29tYm9WaWV3ZXI8L2NvZGU+IHNob3VsZCBiZSB1c2VkIHdpdGhpbiBhIGRpYWxvZyBwYW5lLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW51bURpYWxvZ0NvbWJvVmlld2VyPFQgZXh0ZW5kcyBNb2RlbCwgVj4gZXh0ZW5kcyBBYnN0cmFjdEVudW1Db21ib1ZpZXdlcjxULCBWPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bURpYWxvZ0NvbWJvVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBFbnVtRGlhbG9nQ29tYm9WaWV3ZXIoQWJzdHJhY3REaWFsb2dQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtRGlhbG9nQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEVudW1EaWFsb2dDb21ib1ZpZXdlcihBYnN0cmFjdERpYWxvZ1BhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCUNvbWJvVmlld2VyIGJ1aWxkQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21ib1ZpZXdlciBjb21ib1ZpZXdlciA9IGJ1aWxkQ29tYm9WaWV3ZXIoY29udGFpbmVyLCBidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0VmlzaWJsZUl0ZW1Db3VudChJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCXJldHVybiBjb21ib1ZpZXdlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCi0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0KLQkJQ29tYm8gY29tYm8gPSBnZXRDb21ibygpOwotCi0JCWlmIChjb21iby5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWNvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gZ2V0Q29tYm8oKSB7Ci0JCXJldHVybiBnZXRDb21ib1ZpZXdlcigpLmdldENvbWJvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0Jdm9pZCByZW1vdmVBbGwoKSB7Ci0JCWdldENvbWJvKCkucmVtb3ZlQWxsKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0Jdm9pZCB1cGRhdGVDdXJzb3IoKSB7Ci0JCWdldENvbWJvKCkuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCAwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtRm9ybUNvbWJvVmlld2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1Gb3JtQ29tYm9WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzODdhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1Gb3JtQ29tYm9WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5FbnVtQ29tYm9WaWV3ZXI8L2NvZGU+IHNob3VsZCBiZSB1c2VkIHdpdGhpbiBhIGZvcm0gcGFuZS4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVudW1Gb3JtQ29tYm9WaWV3ZXI8VCBleHRlbmRzIE1vZGVsLCBWPiBleHRlbmRzIEFic3RyYWN0RW51bUNvbWJvVmlld2VyPFQsIFY+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtRm9ybUNvbWJvVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBFbnVtRm9ybUNvbWJvVmlld2VyKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1Gb3JtQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEVudW1Gb3JtQ29tYm9WaWV3ZXIoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCUNvbWJvVmlld2VyIGJ1aWxkQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21ib1ZpZXdlciBjb21ib1ZpZXdlciA9IGJ1aWxkQ0NvbWJvVmlld2VyKGNvbnRhaW5lciwgYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQljb21ib1ZpZXdlci5nZXRDQ29tYm8oKS5zZXRWaXNpYmxlSXRlbUNvdW50KEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJcmV0dXJuIGNvbWJvVmlld2VyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQotCQlDQ29tYm8gY29tYm8gPSBnZXRDb21ibygpOwotCi0JCWlmIChjb21iby5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWNvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ0NvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb21ib1ZpZXdlcigpLmdldENDb21ibygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXZvaWQgcmVtb3ZlQWxsKCkgewotCQlnZXRDb21ibygpLnJlbW92ZUFsbCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXZvaWQgdXBkYXRlQ3Vyc29yKCkgewotCQlnZXRDb21ibygpLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgMCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0ZpbGVDaG9vc2VyUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjRhYTAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VDb21wYXJhdG9yOwotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZmlsZSB3aGVuIGJyb3dzaW5nLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWxlQ2hvb3NlclBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEFic3RyYWN0Q2hvb3NlclBhbmU8VD4KLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RmlsZUNob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRmlsZUNob29zZXJQYW5lKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RmlsZUNob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGaWxlQ2hvb3NlclBhbmUoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUnVubmFibGUgYnVpbGRCcm93c2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJvbXB0RmlsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIDxjb2RlPlZpZXdlckZpbHRlcjwvY29kZT4gdGhhdCB3aWxsIGZpbHRlciB0aGUgY29udGVudCBvZiB0aGUKLQkgKiBkaWFsb2cgYW5kIG9ubHkgZGlzcGxheXMgd2hhdCBpcyB2YWxpZC4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Vmlld2VyRmlsdGVyPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBWaWV3ZXJGaWx0ZXIgYnVpbGRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwKLQkJCSAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcGFyZW50RWxlbWVudCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCkgewotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYnVpbGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBidWlsZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248RWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c+IGJ1aWxkU2VsZWN0aW9uRGlhbG9nUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQl0ZXh0SG9sZGVyLnNldFZhbHVlKGRpYWxvZy5nZXRSZXN1bHQoKVswXS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmFsdWUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0J3MgcHJvcGVydHkuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBob2xkZXIgb2YgdGhlIGNsYXNzIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZhbGlkYXRvciB0aGF0IHdpbGwgc2hvdyBhIHN0YXR1cyBtZXNzYWdlIGJhc2VkIG9uIHdoYXQgaXMKLQkgKiBzZWxlY3RlZCBpbiB0aGUgc2VsZWN0aW9uIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciBidWlsZFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkgewotCQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0KLQkJCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCAhPSAxKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgIiIpOwotCQkJCX0KLQotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgIiIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2UgdG8gYmUgc2hvd24gaW4gdGhlIHNlbGVjdGlvbiBkaWFsb2cuCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHN0cmluZyBzaG93biBhYm92ZSB0aGUgdGV4dCBmaWVsZCBvZiB0aGUKLQkgKiBzZWxlY3Rpb24gZGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkaWFsb2dNZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gZGlhbG9nJ3MgdGl0bGUuCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHN0cmluZwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZGlhbG9nVGl0bGUoKTsKLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgcm9vdCBpbnB1dCB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgc2VsZWN0aW9uIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGlucHV0IHVzZWQgdG8gZGlzcGxheSBpdHMgY29udGVudCBpbiBhIHNlbGVjdGlvbiBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVJlc291cmNlIGdldERpYWxvZ0lucHV0KCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRleHRIb2xkZXIgPSBidWlsZFRleHRIb2xkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYnJvd3NlIGJ1dHRvbiB3YXMgY2xpY2tlZCwgaXRzIGFjdGlvbiBpbnZva2VzIHRoaXMgYWN0aW9uIHdoaWNoIHNob3VsZAotCSAqIHByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBmaWxlIGFuZCBzZXQgaXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvbXB0RmlsZSgpIHsKLQotCQlFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coCi0JCQlzaGVsbCgpLAotCQkJbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwKLQkJCW5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKQotCQkpOwotCi0JCWRpYWxvZy5zZXRIZWxwQXZhaWxhYmxlKGZhbHNlKTsKLQkJZGlhbG9nLnNldFZhbGlkYXRvcihidWlsZFZhbGlkYXRvcigpKTsKLQkJZGlhbG9nLnNldFRpdGxlKGRpYWxvZ1RpdGxlKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShkaWFsb2dNZXNzYWdlKCkpOwotCQlkaWFsb2cuYWRkRmlsdGVyKGJ1aWxkRmlsdGVyKCkpOwotCQlkaWFsb2cuc2V0SW5wdXQoZ2V0RGlhbG9nSW5wdXQoKSk7Ci0JCWRpYWxvZy5zZXRDb21wYXJhdG9yKG5ldyBSZXNvdXJjZUNvbXBhcmF0b3IoUmVzb3VyY2VDb21wYXJhdG9yLk5BTUUpKTsKLQotCQlTV1RVdGlsLnNob3coZGlhbG9nLCBidWlsZFNlbGVjdGlvbkRpYWxvZ1Bvc3RFeGVjdXRpb24oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb2xkZXJDaG9vc2VyUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb2xkZXJDaG9vc2VyUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTg1NzhiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRm9sZGVyQ2hvb3NlclBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZm9sZGVyIHdoZW4gYnJvd3NpbmcuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb2xkZXJDaG9vc2VyUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQWJzdHJhY3RDaG9vc2VyUGFuZTxUPgotewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Gb2xkZXJDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZvbGRlckNob29zZXJQYW5lKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Gb2xkZXJDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRm9sZGVyQ2hvb3NlclBhbmUoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSdW5uYWJsZSBidWlsZEJyb3dzZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcm9tcHRGb2xkZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYnVpbGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBidWlsZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWx1ZSBob2xkZXIgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgY2xhc3MgbmFtZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZSB0byBiZSBzaG93biBpbiB0aGUgc2VsZWN0aW9uIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gc3RyaW5nIHNob3duIGFib3ZlIHRoZSB0ZXh0IGZpZWxkIG9mIHRoZQotCSAqIHNlbGVjdGlvbiBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRpYWxvZ01lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGlvbiBkaWFsb2cncyB0aXRsZS4KLQkgKgotCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gc3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkaWFsb2dUaXRsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCB0aGF0IHRoZSBkaWFsb2cgd2lsbCB1c2UgdG8gZmlsdGVyIHRoZSBkaXJlY3RvcmllcyBpdAotCSAqIHNob3dzIHRvIHRoZSBhcmd1bWVudCwgd2hpY2ggbWF5IGJlIG51bGwuIElmIHRoZSBzdHJpbmcgaXMgbnVsbCwgdGhlbiB0aGUKLQkgKiBvcGVyYXRpbmcgc3lzdGVtJ3MgZGVmYXVsdCBmaWx0ZXIgcGF0aCB3aWxsIGJlIHVzZWQuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoZSBwYXRoIHN0cmluZyBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQuIEZvciBjb252ZW5pZW5jZSwgZWl0aGVyCi0JICogJy8nIG9yICdcJyBjYW4gYmUgdXNlZCBhcyBhIHBhdGggc2VwYXJhdG9yLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGZpbHRlciBwYXRoCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWx0ZXJQYXRoKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0ZXh0SG9sZGVyID0gYnVpbGRUZXh0SG9sZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGJyb3dzZSBidXR0b24gd2FzIGNsaWNrZWQsIGl0cyBhY3Rpb24gaW52b2tlcyB0aGlzIGFjdGlvbiB3aGljaCBzaG91bGQKLQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZm9sZGVyIGFuZCBzZXQgaXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvbXB0Rm9sZGVyKCkgewotCi0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShkaWFsb2dNZXNzYWdlKCkpOwotCQlkaWFsb2cuc2V0VGV4dChkaWFsb2dUaXRsZSgpKTsKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZmlsdGVyUGF0aCgpKTsKLQkJU3RyaW5nIGRpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKGRpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQl0ZXh0SG9sZGVyLnNldFZhbHVlKGRpcmVjdG9yeSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Zvcm1XaWRnZXRGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Zvcm1XaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMzFjMTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb3JtV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0vKioKLSAqIFRoaXMgPGNvZGU+V2lkZ2V0RmFjdG9yeTwvY29kZT4gaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0gKiB1c2luZyB0aGUgPGNvZGU+Rm9ybVRvb2xraXQ8L2NvZGU+IGluIG9yZGVyIHVzZSB0aGUgZm9ybSBzdHlsZSAoZmxhdC1zdHlsZSkKLSAqIGxvb2sgYW5kIGZlZWwuCi0gKgotICogQHNlZSBGb3JtVG9vbGtpdAotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGb3JtV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIFdpZGdldEZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGFjdHVhbCBmYWN0b3J5IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbmV3IHdpZGdldHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBGb3JtVG9vbGtpdCB3aWRnZXRGYWN0b3J5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Gb3JtV2lkZ2V0RmFjdG9yeTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgYWN0dWFsIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBuZXcKLQkgKiB3aWRnZXRzCi0JICovCi0JcHVibGljIEZvcm1XaWRnZXRGYWN0b3J5KEZvcm1Ub29sa2l0IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKHdpZGdldEZhY3RvcnksICJUaGUgd2lkZ2V0IGZhY3RvcnkgY2Fubm90IGJlIG51bGwiKTsKLQkJdGhpcy53aWRnZXRGYWN0b3J5ID0gd2lkZ2V0RmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwcyB0aGUgZ2l2ZW4gPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBpbnRvIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KLQkgKiBpbiBvcmRlciB0byBoYXZlIHRoZSB3aWRnZXRzJyBib3JkZXIgcGFpbnRlZC4gRXhjZXB0IGZvciA8Y29kZT5DQ29tYm88L2NvZGU+LAotCSAqIHRoZSB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zIGhhdmUgdG8gYmUgMiBwaXhlbCBhbmQgdGhlIGxlZnQgYW5kIHJpZ2h0Ci0JICogbWFyZ2lucyBoYXZlIHRvIGJlIDEgcGl4ZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgb2YgdGhlIHN1Yi1wYW5lCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHRoYXQgaGFzIHRoZSBuZWNlc3Nhcnkgc3BhY2UgdG8gcGFpbnQKLQkgKiB0aGUgYm9yZGVyCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVCb3JkZXJDb250YWluZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgICAgPSAyOwotCQlsYXlvdXQubWFyZ2luTGVmdCAgID0gMTsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDI7Ci0JCWxheW91dC5tYXJnaW5SaWdodCAgPSAxOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQotCQljb250YWluZXIgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShjb250YWluZXIpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULk5VTEwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYnV0dG9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBhcHBseSB0byB0aGUgYnV0dG9uLCB3aGljaCBkZXRlcm1pbmVzIGl0cyB0eXBlOgotCSAqIHRvZ2dsZSwgcHVzaCwgY2hlY2sgYm94LCByYWRpbwotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULkZMQVQgfCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBDQ29tYm8gY3JlYXRlQ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZUNDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29tYm8uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBhcHBseSB0byB0aGUgY29tYm8sIHVzdWFsbHkgcmVhZC1vbmx5LCBmbGF0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIENDb21ibyBjcmVhdGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXBhcmVudCA9IGNyZWF0ZUJvcmRlckNvbnRhaW5lcihwYXJlbnQpOwotCi0JCUNDb21ibyBjb21ibyA9IG5ldyBDQ29tYm8ocGFyZW50LCBzdHlsZSk7Ci0JCXdpZGdldEZhY3RvcnkuYWRhcHQoY29tYm8sIHRydWUsIGZhbHNlKTsKLQotCQkvLyBCdWd6aWxsYSAxNDU4MzcgLSB3b3JrYXJvdW5kIGZvciBubyBib3JkZXJzIG9uIFdpbmRvd3MgWFAKLQkJaWYgKHdpZGdldEZhY3RvcnkuZ2V0Qm9yZGVyU3R5bGUoKSA9PSBTV1QuQk9SREVSKSB7Ci0JCQljb21iby5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwgRm9ybVRvb2xraXQuVEVYVF9CT1JERVIpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuQ0hFQ0spOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0gICAgICB3aWRnZXRGYWN0b3J5LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQ0NvbWJvIGNyZWF0ZUVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZUNDb21ibyhwYXJlbnQsIFNXVC5OVUxMKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIENvbWJvIGNyZWF0ZUVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5GTEFUKTsKLQkJY29tYm8uc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULlNIQURPV19OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dCh0aXRsZSk7Ci0JCWdyb3VwLnNldEJhY2tncm91bmQod2lkZ2V0RmFjdG9yeS5nZXRDb2xvcnMoKS5nZXRCYWNrZ3JvdW5kKCkpOwotCQlncm91cC5zZXRGb3JlZ3JvdW5kKHdpZGdldEZhY3RvcnkuZ2V0Q29sb3JzKCkuZ2V0Rm9yZWdyb3VuZCgpKTsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVIeXBlcmxpbmsocGFyZW50LCB0ZXh0LCBTV1QuRkxBVCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0LCBTV1QuV1JBUCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBMaXN0IGNyZWF0ZUxpc3QoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHN0eWxlKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBMaXN0KGNvbnRhaW5lciwgU1dULkZMQVQgfCBzdHlsZSk7Ci0JCWxpc3Quc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBGb3JtVGV4dCBjcmVhdGVNdWx0aUxpbmVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zICAgPSAxOwotCQlsYXlvdXQuYm90dG9tTWFyZ2luID0gMDsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gICA9IDA7Ci0JCWxheW91dC5yaWdodE1hcmdpbiAgPSAwOwotCQlsYXlvdXQudG9wTWFyZ2luICAgID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCUZvcm1UZXh0IHRleHQgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUZvcm1UZXh0KGNvbnRhaW5lciwgdHJ1ZSk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQl0ZXh0LnNldFRleHQobGFiZWxUZXh0LCBmYWxzZSwgZmFsc2UpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVRleHQocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVQYXNzd29yZFRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlVGV4dChwYXJlbnQsIFNXVC5QQVNTV09SRCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULlBVU0gpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuUkFESU8pOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU1dULkZMQVQgfCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTcGlubmVyIGNyZWF0ZVNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlwYXJlbnQgPSBjcmVhdGVCb3JkZXJDb250YWluZXIocGFyZW50KTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihwYXJlbnQsIFNXVC5GTEFUKTsKLQkJc3Bpbm5lci5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwgRm9ybVRvb2xraXQuVEVYVF9CT1JERVIpOwotCQl3aWRnZXRGYWN0b3J5LmFkYXB0KHNwaW5uZXIsIHRydWUsIGZhbHNlKTsKLQotCQlyZXR1cm4gc3Bpbm5lcjsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFRhYmxlIGNyZWF0ZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVUYWJsZShwYXJlbnQsIFNXVC5CT1JERVIgfCBzdHlsZSk7Ci0JCXRhYmxlLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLCBGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0KHBhcmVudCwgU1dULk5VTEwpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZVRleHQocGFyZW50LCBudWxsLCBTV1QuRkxBVCB8IHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVUcmlTdGF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsIHRleHQsIHRoaXMpOwotCQlyZXR1cm4gY2hlY2tCb3guZ2V0Q2hlY2tCb3goKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3R1YWwgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG5ldyB3aWRnZXRzLgotCSAqCi0JICogQHJldHVybiBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGUgd2lkZ2V0cyB3aXRoIHRoZSBmb3JtIHN0eWxlIChmbGF0LXN0eWxlKQotCSAqLwotCXB1YmxpYyBGb3JtVG9vbGtpdCBnZXRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYzMmJhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSBkaWFsb2cgdXNlZCB0byByZXF1ZXN0cyBhIG5hbWUgZnJvbSB0aGUgdXNlci4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld05hbWVEaWFsb2cgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpbmdEaWFsb2c8TmV3TmFtZVN0YXRlT2JqZWN0PgotewotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgSW1hZ2UgZGVzY3JpcHRpb25JbWFnZTsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvblRpdGxlOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsVGV4dDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OZXdOYW1lRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvblRpdGxlCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uSW1hZ2UKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gbmFtZXMKLQkgKi8KLQlOZXdOYW1lRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLAotCSAgICAgICAgICAgICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCSAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uVGl0bGUsCi0JICAgICAgICAgICAgICBJbWFnZSBkZXNjcmlwdGlvbkltYWdlLAotCSAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAotCSAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAotCSAgICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKQotCXsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlKTsKLQotCQl0aGlzLm5hbWUgICAgICAgICAgICAgPSBuYW1lOwotCQl0aGlzLm5hbWVzICAgICAgICAgICAgPSBuYW1lczsKLQkJdGhpcy5sYWJlbFRleHQgICAgICAgID0gbGFiZWxUZXh0OwotCQl0aGlzLmRlc2NyaXB0aW9uICAgICAgPSBkZXNjcmlwdGlvbjsKLQkJdGhpcy5kZXNjcmlwdGlvbkltYWdlID0gZGVzY3JpcHRpb25JbWFnZTsKLQkJdGhpcy5kZXNjcmlwdGlvblRpdGxlID0gZGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3REaWFsb2dQYW5lPE5ld05hbWVTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IERpYWxvZ1BhbmUoY29udGFpbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmV3TmFtZVN0YXRlT2JqZWN0IGJ1aWxkU3RhdGVPYmplY3QoKSB7Ci0JCXJldHVybiBuZXcgTmV3TmFtZVN0YXRlT2JqZWN0KG5hbWUsIG5hbWVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCi0JCURpYWxvZ1BhbmUgcGFuZSA9IChEaWFsb2dQYW5lKSBwYW5lKCk7Ci0JCXBhbmUuc2VsZWN0QWxsKCk7Ci0KLQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEltYWdlIGRlc2NyaXB0aW9uSW1hZ2UoKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbkltYWdlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvblRpdGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZmllbGQncyBpbnB1dCwgd2hpY2ggaXMgdGhlIG5ldyBuYW1lIHRoZSB1c2VyIGVudGVyZWQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBuYW1lIHRoZSB1c2VyIGVudGVyZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBzdWJqZWN0KCkuZ2V0TmFtZSgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgRGlhbG9nUGFuZSBleHRlbmRzIEFic3RyYWN0RGlhbG9nUGFuZTxOZXdOYW1lU3RhdGVPYmplY3Q+IHsKLQotCQlwcml2YXRlIFRleHQgdGV4dDsKLQotCQlEaWFsb2dQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKE5ld05hbWVEaWFsb2cudGhpcy5zdWJqZWN0SG9sZGVyKCksIHBhcmVudCk7Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TmV3TmFtZVN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgTmV3TmFtZVN0YXRlT2JqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJCXRleHQgPSBidWlsZExhYmVsZWRUZXh0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlsYWJlbFRleHQsCi0JCQkJYnVpbGROYW1lSG9sZGVyKCkKLQkJCSk7Ci0JCX0KLQotCQl2b2lkIHNlbGVjdEFsbCgpIHsKLQkJCXRleHQuc2VsZWN0QWxsKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2dCdWlsZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2dCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNDAyNGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lRGlhbG9nQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoaXMgYnVpbGRlciBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSBmdWxseSBpbml0aWFsaXplZAotICogPGNvZGU+TmV3TmFtZURpYWxvZzwvY29kZT4gb25jZSBhbGwgdGhlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNldC4KLSAqCi0gKiBAc2VlIE5ld05hbWVEaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTmV3TmFtZURpYWxvZ0J1aWxkZXIgewotCi0JLyoqCi0JICogVGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIFRoZSBpbWFnZSBvZiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKi8KLQlwcml2YXRlIEltYWdlIGRlc2NyaXB0aW9uSW1hZ2U7Ci0KLQkvKioKLQkgKiBUaGUgdGl0bGUgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvblRpdGxlOwotCi0JLyoqCi0JICogVGhlIHRpdGxlIG9mIHRoZSBuZXcgbmFtZSBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGlhbG9nVGl0bGU7Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBmaWVsZCdzIGxhYmVsLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGxhYmVsVGV4dDsKLQotCS8qKgotCSAqIFRoZSBpbml0aWFsIGlucHV0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGluaXRpYWwgdmFsdWUgY2FuIGJlCi0JICogc3BlY2lmaWVkLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lCi0JICogYXJlIGF2YWlsYWJsZS4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBuYW1lczsKLQotCS8qKgotCSAqIFRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIG5ldyBuYW1lIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIFNoZWxsIHBhcmVudFNoZWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OZXdOYW1lRGlhbG9nQnVpbGRlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwgVGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgbmV3IG5hbWUgZGlhbG9nCi0JICovCi0JcHVibGljIE5ld05hbWVEaWFsb2dCdWlsZGVyKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUocGFyZW50U2hlbGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyB0aGF0IHdpbGwgYmUgdXNlZCB0byByZXF1ZXN0IGEgbmV3IG5hbWUgZnJvbSB0aGUgdXNlci4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGluaXRpYWxpemVkIGRpYWxvZwotCSAqLwotCXB1YmxpYyBOZXdOYW1lRGlhbG9nIGJ1aWxkRGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IE5ld05hbWVEaWFsb2coCi0JCQlwYXJlbnRTaGVsbCwKLQkJCWRpYWxvZ1RpdGxlLAotCQkJZGVzY3JpcHRpb25UaXRsZSwKLQkJCWRlc2NyaXB0aW9uSW1hZ2UsCi0JCQlkZXNjcmlwdGlvbiwKLQkJCWxhYmVsVGV4dCwKLQkJCW5hbWUsCi0JCQluYW1lcwotCQkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgYnVpbGRlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsIG9mIHRoZSBuZXcgbmFtZSBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChwYXJlbnRTaGVsbCwgIlRoZSBwYXJlbnQgc2hlbGwgY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLnBhcmVudFNoZWxsID0gcGFyZW50U2hlbGw7Ci0JCXRoaXMubmFtZXMgICAgICAgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiB0byBiZSBzaG93biBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYSB1bmRlciB0aGUgdGl0bGUuCi0JICoKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgdG8gYmUgc2hvd24gdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRlc2NyaXB0aW9uIGFyZWEuCi0JICoKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb25JbWFnZSBUaGUgaW1hZ2Ugb2YgdGhlIGRlc2NyaXB0aW9uIGFyZWEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbkltYWdlKEltYWdlIGRlc2NyaXB0aW9uSW1hZ2UpIHsKLQkJdGhpcy5kZXNjcmlwdGlvbkltYWdlID0gZGVzY3JpcHRpb25JbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0aXRsZSB0byBiZSBzaG93biBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvblRpdGxlIFRoZSB0aXRsZSB0byBzaG93IGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25UaXRsZShTdHJpbmcgZGVzY3JpcHRpb25UaXRsZSkgewotCQl0aGlzLmRlc2NyaXB0aW9uVGl0bGUgPSBkZXNjcmlwdGlvblRpdGxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRpYWxvZydzIHRpdGxlLgotCSAqCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlIFRoZSB0aXRsZSBvZiB0aGUgbmV3IG5hbWUgZGlhbG9nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlhbG9nVGl0bGUoU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0JCXRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleGlzdGluZyBuYW1lcyB0aGF0IHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgdGV4dCBmaWVsZCdzCi0JICogaW5wdXQgYW5kIHByZXZlbnQgdGhlIHVzZXIgZnJvbSB1c2luZyBpdC4KLQkgKgotCSAqIEBwYXJhbSBuYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ05hbWVzKEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMpIHsKLQkJdGhpcy5uYW1lcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZXh0IHRvIGxhYmVsIHRoZSB0ZXh0IGZpZWxkLgotCSAqCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBmaWVsZCdzIGxhYmVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbFRleHQpIHsKLQkJdGhpcy5sYWJlbFRleHQgPSBsYWJlbFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5pdGlhbCBuYW1lIGlmIG9uZSBleGlzdHMuIEl0IGlzIHZhbGlkIHRvIGxlYXZlIHRoaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHRoZSB1c2VyIGhhcyB0byBlbnRlciBzb21ldGhpbmcuCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgaW5pdGlhbCBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVTdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1OTIzMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVTdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5BYnN0cmFjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuUHJvYmxlbTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBzdGF0ZSBvYmplY3QgdXNlZCBieSB0aGUgPGNvZGU+TmV3TmFtZURpYWxvZzwvY29kZT4sIHdoaWNoIHN0b3JlcwotICogdGhlIGN1cnJlbnQgbmFtZSBhbmQgdmFsaWRhdGVzIGl0IHdoZW4gaXQgaXMgbW9kaWZpZWQuCi0gKgotICogQHNlZSBOZXdOYW1lRGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotZmluYWwgY2xhc3MgTmV3TmFtZVN0YXRlT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3ROb2RlCi17Ci0JLyoqCi0JICogVGhlIGluaXRpYWwgaW5wdXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW5pdGlhbCB2YWx1ZSBjYW4gYmUKLQkgKiBzcGVjaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIG5hbWVzIHRoYXQgY2FuJ3QgYmUgdXNlZCBvciBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIG5vbmUKLQkgKiBhcmUgYXZhaWxhYmxlLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4gdXNlZCB0byB2YWxpZGF0ZSB0aGlzIHN0YXRlIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgbmFtZSBwcm9wZXJ0eS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5ld05hbWVTdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgaW5pdGlhbCBpbnB1dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbml0aWFsIHZhbHVlIGNhbgotCSAqIGJlIHNwZWNpZmllZAotCSAqIEBwYXJhbSBuYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkKLQkgKiBjb2xsZWN0aW9uIGlmIG5vbmUgYXJlIGF2YWlsYWJsZQotCSAqLwotCU5ld05hbWVTdGF0ZU9iamVjdChTdHJpbmcgbmFtZSwgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKSB7Ci0JCXN1cGVyKG51bGwpOwotCi0JCXRoaXMubmFtZSAgPSBuYW1lOwotCQl0aGlzLm5hbWVzID0gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBuYW1lIHByb3BlcnR5LgotCSAqCi0JICogQHBhcmFtIGN1cnJlbnRQcm9ibGVtcyBUaGUgbGlzdCB0byB3aGljaCA8Y29kZT5Qcm9ibGVtPC9jb2RlPnMgY2FuIGJlCi0JICogYWRkZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTmFtZVByb2JsZW1zKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0KLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmFtZSkpIHsKLQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5OZXdOYW1lU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZCkpOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWVzLmNvbnRhaW5zKG5hbWUudHJpbSgpKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk5ld05hbWVTdGF0ZU9iamVjdF9uYW1lQWxyZWFkeUV4aXN0cykpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykKLQl7Ci0JCXN1cGVyLmFkZFByb2JsZW1zVG8oY3VycmVudFByb2JsZW1zKTsKLQkJYWRkTmFtZVByb2JsZW1zKGN1cnJlbnRQcm9ibGVtcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoTm9kZSBwYXJlbnROb2RlKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG5hbWUgc3RvcmVkIGluIHRoaXMgc3RhdGUgb2JqZWN0LgotCSAqCi0JICogQHJldHVybiBUaGUgY3VycmVudCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgbmFtZSBzdG9yZWQgaW4gdGhpcyBzdGF0ZSBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiBjbGVhciBpdC4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OdWxsUG9zdEV4ZWN1dGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OdWxsUG9zdEV4ZWN1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjVlZGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTnVsbFBvc3RFeGVjdXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotCi0vKioKLSAqIEEgPGNvZGU+bnVsbDwvY29kZT4gaW5zdGFuY2Ugb2YgPGNvZGU+UG9zdEV4ZWN1dGlvbjwvY29kZT4uCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsUG9zdEV4ZWN1dGlvbiBpbXBsZW1lbnRzIFBvc3RFeGVjdXRpb248RGlhbG9nPiB7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+TnVsbFBvc3RFeGVjdXRpb248L2NvZGU+LgotCSAqLwotCXByaXZhdGUgc3RhdGljIFBvc3RFeGVjdXRpb248RGlhbG9nPiBJTlNUQU5DRTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TnVsbFBvc3RFeGVjdXRpb248L2NvZGU+LgotCSAqLwotCXByaXZhdGUgTnVsbFBvc3RFeGVjdXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+TnVsbFBvc3RFeGVjdXRpb248L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIDxUPiBUaGUgZGlhbG9nIHdoZXJlIHRoaXMgPGNvZGU+UG9zdEV4ZWN1dGlvbjwvY29kZT4gd2lsbCBiZSB1c2VkCi0JICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIHdpdGggdGhlIHByb3BlciB0eXBlCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgPFQgZXh0ZW5kcyBEaWFsb2c+IFBvc3RFeGVjdXRpb248VD4gaW5zdGFuY2UoKSB7Ci0KLQkJaWYgKElOU1RBTkNFID09IG51bGwpIHsKLQkJCUlOU1RBTkNFID0gbmV3IE51bGxQb3N0RXhlY3V0aW9uKCk7Ci0JCX0KLQotCQlyZXR1cm4gKFBvc3RFeGVjdXRpb248VD4pIElOU1RBTkNFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoRGlhbG9nIGRpYWxvZykgewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYWNrYWdlQ2hvb3NlclBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvUGFja2FnZUNob29zZXJQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMWNiMTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYWNrYWdlQ2hvb3NlclBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5Db250cm9sQ29udGVudEFzc2lzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5KYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgcGFja2FnZSB3aGVuIGJyb3dzaW5nIGFuZCBpdCBhZGRzCi0gKiBjb2RlIGNvbXBsZXRpb24gc3VwcG9ydCB0byB0aGUgdGV4dCBmaWVsZCwgd2hpY2ggaXMgdGhlIG1haW4gY29tcG9uZW50LgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFja2FnZUNob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBBYnN0cmFjdENob29zZXJQYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIGNvZGUgY29tcGxldGlvbiBtYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgSmF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yIGphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3NvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFja2FnZUNob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGFja2FnZUNob29zZXJQYW5lKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFja2FnZUNob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQYWNrYWdlQ2hvb3NlclBhbmUoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgUnVubmFibGUgYnVpbGRCcm93c2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJvbXB0UGFja2FnZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGJ1aWxkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciA9IGJ1aWxkVGV4dEhvbGRlcigpOwotCi0JCXRleHRIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCWJ1aWxkVGV4dENoYW5nZUxpc3RlbmVyKCkKLQkJKTsKLQotCQlUZXh0IHRleHQgPSBidWlsZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKLQotCQlDb250cm9sQ29udGVudEFzc2lzdEhlbHBlci5jcmVhdGVUZXh0Q29udGVudEFzc2lzdGFudCgKLQkJCXRleHQsCi0JCQlqYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3IKLQkJKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXh0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoYnVpbGRUZXh0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRleHRDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoc3ViamVjdCgpICE9IG51bGwpIHsKLQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQotCQkJCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQkJCQlqYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3Iuc2V0UGFja2FnZUZyYWdtZW50Um9vdChyb290KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWx1ZSBob2xkZXIgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgcGFja2FnZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCk7Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRoZSBPcGVuIFBhY2thZ2UgZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIHNlbGVjdGVkIHBhY2thZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHVzZXIKLQkgKiBjYW5jZWxsZWQgdGhlIGRpYWxvZwotCSAqLwotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IGNob29zZVBhY2thZ2UoKSB7Ci0KLQkJU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZzsKLQotCQl0cnkgewotCQkJc2VsZWN0aW9uRGlhbG9nID0gSmF2YVVJLmNyZWF0ZVBhY2thZ2VEaWFsb2coCi0JCQkJc2hlbGwoKSwKLQkJCQlwYWNrYWdlRnJhZ21lbnRSb290KCkKLQkJCSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nVGl0bGUpOwotCQlzZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRVaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gcGFja2FnZUZyYWdtZW50KCk7Ci0KLQkJaWYgKHBhY2sgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uRGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb25zKG5ldyBPYmplY3RbXSB7IHBhY2sgfSk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudCkgc2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCi0JCS8vIFRPRE8gYnVnIDE1NjE4NSAtIHdoZW4gdGhpcyBpcyBmaXhlZCB0aGVyZSBzaG91bGQgYmUgYXBpIGZvciB0aGlzCi0JCXRoaXMuamF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yID0gbmV3IEphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3NvcigKLQkJCW5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfUk9PVCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KCkgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZSgpOwotCi0JCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290KCkuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlID8/Ci0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciB0aGUgcm9vdCBvZiB0aGUgcGFja2FnZSBmcmFnbWVudCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdAotCSAqIGNhbid0IGJlIHJldHJpZXZlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgZnJvbSBpdHMgc3ViamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBhY2thZ2UgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIGRlZmluZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIHBhY2thZ2VOYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgYnJvd3NlIGJ1dHRvbiB3YXMgY2xpY2tlZCwgaXRzIGFjdGlvbiBpbnZva2VzIHRoaXMgYWN0aW9uIHdoaWNoIHNob3VsZAotCSAqIHByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBwYWNrYWdlIGFuZCBzZXQgaXQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvbXB0UGFja2FnZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Qb3N0RXhlY3V0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1Bvc3RFeGVjdXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI2YjkyMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1Bvc3RFeGVjdXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotCi0vKioKLSAqIFRoaXMgPGNvZGU+UG9zdEV4ZWN1dGlvbjwvY29kZT4gaXMgdXNlZCB0byBwb3N0IGV4ZWN1dGUgYSBwb3J0aW9uIG9mIGNvZGUKLSAqIG9uY2UgYSBkaWFsb2csIHRoYXQgd2FzIGxhdW5jaGVkIGludG8gYSBkaWZmZXJlbnQgVUkgdGhyZWFkLCBoYXMgYmVlbgotICogZGlzcG9zZWQuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9zdEV4ZWN1dGlvbjxUIGV4dGVuZHMgRGlhbG9nPiB7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIHBvc3QgZXhlY3Rpb24gdGhlIGRpYWxvZyB0aGF0IHdhcyBsYXVuY2hlZCBpbnRvIGEgZGlmZmVyZW50Ci0JICogVUkgdGhyZWFkIGhhcyBiZWVuIGRpc3Bvc2VkLgotCSAqCi0JICogQHBhcmFtIGRpYWxvZyBUaGUgZGlhbG9nIHRoYXQgd2FzIGxhdW5jaGVkIGludG8gYSBkaWZmZXJlbnQgdGhyZWFkCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShUIGRpYWxvZyk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNTRmODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Qcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIDxjb2RlPldpZGdldEZhY3Rvcnk8L2NvZGU+IGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cyB1c2luZwotICogPGNvZGU+VGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk8L2NvZGU+IGluIG9yZGVyIHVzZSB0aGUgZm9ybSBzdHlsZQotICogKGZsYXQtc3R5bGUpIGxvb2sgYW5kIGZlZWwuCi0gKgotICogQHNlZSBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZXh0ZW5kcyBGb3JtV2lkZ2V0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBhY3R1YWwgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG5ldwotCSAqIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkoVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcih3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENDb21ibyBjcmVhdGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXBhcmVudCA9IGNyZWF0ZUJvcmRlckNvbnRhaW5lcihwYXJlbnQpOwotCQlyZXR1cm4gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXJldHVybiBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlR3JvdXAocGFyZW50LCB0aXRsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXBhcmVudCA9IGNyZWF0ZUJvcmRlckNvbnRhaW5lcihwYXJlbnQpOwotCQlyZXR1cm4gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQocGFyZW50LCBudWxsLCBTV1QuRkxBVCB8IHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpIHN1cGVyLmdldFdpZGdldEZhY3RvcnkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9UcmlTdGF0ZUNoZWNrQm94LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1RyaVN0YXRlQ2hlY2tCb3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmNGM3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1RyaVN0YXRlQ2hlY2tCb3guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgPGNvZGU+VHJpU3RhdGVDaGVja0JveDwvY29kZT4gY2FuIGRpc3BsYXkgb25lIG9mIHRocmVlIHN0YXRlczoKLSAqIHVuY2hlY2tlZCwgY2hlY2tlZCwgb3IgcGFydGlhbGx5IGNoZWNrZWQuIEl0IGNhbiBiZSBtb2RpZmllZCB2aWEgYSBtb3VzZQotICogc2VsZWN0aW9uLCB2aWEgYSBrZXlib2FyZCBzZWxlY3Rpb24sIG9yIHByb2dyYW1tYXRpY2FsbHkuIFRoZSBzZWxlY3Rpb24gc3RhdGUgaXMKLSAqIHJlcHJlc2VudGVkIGJ5IGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4gdmFsdWUgd2hlcmUgYSA8Y29kZT5udWxsPC9jb2RlPgotICogdmFsdWUgbWVhbnMgcGFydGlhbGx5IGNoZWNrZWQuCi0gKiA8cD4KLSAqIFRoZSBvcmRlciBvZiBzdGF0ZSBjaGFuZ2VzIGlzOiB1bmNoZWNrZWQgLT4gcGFydGlhbGx5IGNoZWNrZWQgLT4gY2hlY2tlZC4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJpU3RhdGVDaGVja0JveAotewotCS8qKgotCSAqIEEgY2hlY2sgYm94IGJ1dHRvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBidXR0b247Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCBzZWxlY3Rpb24gc3RhdGUuCi0JICovCi0JcHJpdmF0ZSBUcmlTdGF0ZSBzdGF0ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VHJpU3RhdGVDaGVja0JveDwvY29kZT4gd2l0aCBubyB0ZXh0LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSBjaGVjayBib3gKLQkgKi8KLQlwdWJsaWMgVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJdGhpcyhwYXJlbnQsIG51bGwsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VHJpU3RhdGVDaGVja0JveDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQgVGhlIGNoZWNrIGJveCdzIHRleHQKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgY2hlY2sgYm94Ci0JICovCi0JcHVibGljIFRyaVN0YXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGF0ZSA9IFRyaVN0YXRlLlVOQ0hFQ0tFRDsKLQkJdGhpcy5idXR0b24gPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUNoZWNrQm94KHBhcmVudCwgdGV4dCk7Ci0JCXRoaXMuYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2Q6IEFkZHMgYSBkaXNwb3NlIGxpc3RlbmVyIHRvIHRoZSBjaGVjayBib3guCi0JICogVGhlIHNvdXJjZSBvZiBhbnkgZXZlbnRzIHNlbnQgdG8gdGhlIGxpc3RlbmVyIHdpbGwgYmUgdGhlIGNoZWNrIGJveCB3aWRnZXQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpIHsKLQkJdGhpcy5idXR0b24uYWRkRGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBBZGRzIGEgc2VsZWN0aW9uIGxpc3RlbmVyIHRvIHRoZSBjaGVjayBib3guCi0JICogVGhlIHNvdXJjZSBvZiBhbnkgZXZlbnRzIHNlbnQgdG8gdGhlIGxpc3RlbmVyIHdpbGwgYmUgdGhlIGNoZWNrIGJveCB3aWRnZXQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpIHsKLQkJdGhpcy5idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveC50aGlzLmNoZWNrQm94Q2xpY2tlZCgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFRoZSBjaGVjayBib3ggd2FzIGNsaWNrZWQsIGNoYW5nZSB0aGUgdHJpLXN0YXRlIHRvIHRoZSBuZXh0IHZhbHVlIGFuZAotCSAqIHVwZGF0ZSB0aGUgY2hlY2sgYm94J3Mgc3RhdGUuCi0JICovCi0Jdm9pZCBjaGVja0JveENsaWNrZWQoKSB7Ci0JCXRoaXMuc3RhdGUgPSB0aGlzLm5leHRTdGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUNoZWNrQm94KCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIGNoZWNrIGJveCB3aWRnZXQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5idXR0b24uZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkJ1dHRvbjwvY29kZT4gdXNlZCB0byBzaG93IGEgdHJpLXN0YXRlIGNoZWNrIGJveC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPkJ1dHRvbjwvY29kZT4gdXNlZCB0byBzaG93IGEgdHJpLXN0YXRlIGNoZWNrIGJveAotCSAqLwotCXB1YmxpYyBCdXR0b24gZ2V0Q2hlY2tCb3goKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGVjayBib3gncyBpbWFnZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNoZWNrIGJveCdzIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnV0dG9uLmdldEltYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hlY2sgYm94J3Mgc2VsZWN0aW9uIHN0YXRlLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBjaGVja2VkIG9yCi0JICogdW5jaGVja2VkOyBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgcGFydGlhbGx5IHNlbGVjdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKHRoaXMuc3RhdGUgPT0gVHJpU3RhdGUuUEFSVElBTExZX0NIRUNLRUQpID8gbnVsbCA6IEJvb2xlYW4udmFsdWVPZih0aGlzLnN0YXRlID09IFRyaVN0YXRlLkNIRUNLRUQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoZWNrIGJveCdzIHRleHQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB0ZXh0IG9mIHRoZSBjaGVjayBib3gKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbi5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGVjayBib3ggaXMgZGlzcG9zZWQuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBib3ggaXMgZGlzcG9zZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGVjayBib3ggaXMgZW5hYmxlZC4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIGJveCBpcyBlbmFibGVkOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbi5pc0VuYWJsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IHN0YXRlOgotCSAqICAgICBVTkNIRUNLRUQgLT4gUEFSVElBTExZX0NIRUNLRUQKLQkgKiAgICAgUEFSVElBTExZX0NIRUNLRUQgLT4gQ0hFQ0tFRAotCSAqICAgICBDSEVDS0VEIC0+IFVOQ0hFQ0tFRAotCSAqLwotCXByaXZhdGUgVHJpU3RhdGUgbmV4dFN0YXRlKCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUpIHsKLQkJCWNhc2UgVU5DSEVDS0VEOgotCQkJCXJldHVybiBUcmlTdGF0ZS5QQVJUSUFMTFlfQ0hFQ0tFRDsKLQkJCWNhc2UgUEFSVElBTExZX0NIRUNLRUQ6Ci0JCQkJcmV0dXJuIFRyaVN0YXRlLkNIRUNLRUQ7Ci0JCQljYXNlIENIRUNLRUQ6Ci0JCQkJcmV0dXJuIFRyaVN0YXRlLlVOQ0hFQ0tFRDsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBzdGF0ZTogIiArIHRoaXMuc3RhdGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBSZW1vdmVzIGEgZGlzcG9zZSBsaXN0ZW5lciBmcm9tIHRoZSBjaGVjayBib3guCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpIHsKLQkJdGhpcy5idXR0b24ucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBSZW1vdmVzIGEgc2VsZWN0aW9uIGxpc3RlbmVyIGZyb20gdGhlIGNoZWNrIGJveC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotCQl0aGlzLmJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgY2hlY2sgYm94J3MgZW5hYmxlbWVudCBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGVuYWJsZSB0aGUgY2hlY2sgYm94IG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIHRvIGRpc2FibGUgaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNoZWNrIGJveCdzIGltYWdlLgotCSAqCi0JICogQHBhcmFtIGltYWdlIFRoZSBuZXcgaW1hZ2Ugb2YgdGhlIGNoZWNrIGJveAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCXRoaXMuYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBjaGVjayBib3gncyBzZWxlY3Rpb24gc3RhdGUuCi0JICoKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIEVpdGhlciA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4gZm9yCi0JICogY2hlY2tlZCBhbmQgdW5jaGVja2VkOyBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgcGFydGlhbGx5IHNlbGVjdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKEJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0JCVRyaVN0YXRlIG9sZCA9IHRoaXMuc3RhdGU7Ci0JCXRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlRm9yQm9vbGVhbihzZWxlY3Rpb24pOwotCQlpZiAob2xkICE9IHRoaXMuc3RhdGUpIHsKLQkJCXRoaXMudXBkYXRlQ2hlY2tCb3goKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNoZWNrIGJveCdzIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gdGV4dCBUaGUgbmV3IHRleHQgb2YgdGhlIGNoZWNrIGJveAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy5idXR0b24uc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0cmktc3RhdGUgY29ycmVzcG9uZGluZyB0byB0aGUgYm9vbGVhbi4KLQkgKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24gVGhlIGJvb2xlYW4gdG8gYmUgY29udmVydGVkIHRvIGEgdHJpLXN0YXRlCi0JICovCi0JcHJpdmF0ZSBUcmlTdGF0ZSBzdGF0ZUZvckJvb2xlYW4oQm9vbGVhbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIChzZWxlY3Rpb24gPT0gbnVsbCkgPyBUcmlTdGF0ZS5QQVJUSUFMTFlfQ0hFQ0tFRCA6Ci0JCQlzZWxlY3Rpb24uYm9vbGVhblZhbHVlKCkgPyBUcmlTdGF0ZS5DSEVDS0VEIDogVHJpU3RhdGUuVU5DSEVDS0VEOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGUgb2YgdGhlIGNoZWNrIGJveCBiYXNlZCBvbiB0aGUgdHJpLXN0YXRlCi0JICogdmFsdWUuCi0JICovCi0Jdm9pZCB1cGRhdGVDaGVja0JveCgpIHsKLQkJc3dpdGNoICh0aGlzLnN0YXRlKSB7Ci0JCQljYXNlIFVOQ0hFQ0tFRDoKLQkJCQl0aGlzLmJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXRoaXMuYnV0dG9uLnNldEdyYXllZChmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBBUlRJQUxMWV9DSEVDS0VEOgotCQkJCXRoaXMuYnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl0aGlzLmJ1dHRvbi5zZXRHcmF5ZWQodHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENIRUNLRUQ6Ci0JCQkJdGhpcy5idXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCXRoaXMuYnV0dG9uLnNldEdyYXllZChmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gc3RhdGU6ICIgKyB0aGlzLnN0YXRlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFuIGVudW0gY29udGFpbmluZyB0aGUgcG9zc2libGUgc2VsZWN0aW9ucy4KLQkgKi8KLQllbnVtIFRyaVN0YXRlIHsKLQkJQ0hFQ0tFRCwKLQkJUEFSVElBTExZX0NIRUNLRUQsCi0JCVVOQ0hFQ0tFRAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9EYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0RhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwZDNkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0RhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLnVpLmludGVybmFsLkRUUFVpVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogTW9zdCBvZiB0aGUgYmVoYXZpb3IgaXMgaW4gRGF0YWJhc2VHcm91cC4uLi4KLSAqIAotICogV2Ugb3BlbiB0aGUgd2l6YXJkIHBhZ2Ugd2l0aCB0aGUgSlBBIHByb2plY3QncyBjb25uZWN0aW9uIHByb2ZpbGUgYW5kCi0gKiBkZWZhdWx0IHNjaGVtYSBzZWxlY3RlZCAoaWYgcG9zc2libGUpLCBidXQgdGhlbiB0aGUgc2VsZWN0aW9ucyBhcmUgZHJpdmVuCi0gKiBieSB0aGUgdXNlci4gSWYgdGhlIHVzZXIgcmUtc2VsZWN0cyB0aGUgSlBBIHByb2plY3QncyBjb25uZWN0aW9uIHByb2ZpbGUsCi0gKiB3ZSB3aWxsIHByZS1zZWxlY3QgdGhlIHByb2plY3QncyBkZWZhdWx0IHNjaGVtYSBpZiBwb3NzaWJsZS4KLSAqLwotcHVibGljIGNsYXNzIERhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCWZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCXByaXZhdGUgZmluYWwgU2V0PExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQobmV3IEhhc2hTZXQ8TGlzdGVuZXI+KCkpOwotCi0JcHJpdmF0ZSBEYXRhYmFzZUdyb3VwIGRhdGFiYXNlR3JvdXA7Ci0KLQlzdGF0aWMgZmluYWwgU29ydGVkU2V0PFN0cmluZz4gRU1QVFlfU0NIRU1BX05BTUVTID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCi0KLQlwdWJsaWMgRGF0YWJhc2VDb25uZWN0aW9uV2l6YXJkUGFnZShKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIoIkRhdGFiYXNlIFNldHRpbmdzIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5zZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkRhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9kYXRhYmFzZUNvbm5lY3Rpb24pOwotCQl0aGlzLnNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfcmVjb25uZWN0VG9EYXRhYmFzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJdGhpcy5zZXRDb250cm9sKHRoaXMuYnVpbGRUb3BMZXZlbENvbnRyb2wocGFyZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVG9wTGV2ZWxDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXRoaXMuZGF0YWJhc2VHcm91cCA9IG5ldyBEYXRhYmFzZUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLlBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRV9DT05ORUNUSU9OKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgZ2V0U2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2VHcm91cC5nZXRTZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCi0JcHVibGljIFNjaGVtYSBnZXRTZWxlY3RlZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2VHcm91cC5nZXRTZWxlY3RlZFNjaGVtYSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuZGF0YWJhc2VHcm91cC5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICggISB0aGlzLmxpc3RlbmVycy5hZGQobGlzdGVuZXIpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkdXBsaWNhdGUgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICggISB0aGlzLmxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtaXNzaW5nIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPExpc3RlbmVyPiBsaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxMaXN0ZW5lcj4odGhpcy5saXN0ZW5lcnMpOwotCX0KLQotCXZvaWQgZmlyZUNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSkgewotCQlmb3IgKEl0ZXJhdG9yPExpc3RlbmVyPiBzdHJlYW0gPSB0aGlzLmxpc3RlbmVycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCkuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZUNoYW5nZWQoY29ubmVjdGlvblByb2ZpbGUpOwotCQl9Ci0JfQotCi0Jdm9pZCBmaXJlU2NoZW1hQ2hhbmdlZChTY2hlbWEgc2NoZW1hKSB7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKHNjaGVtYSAhPSBudWxsKTsKLQkJZm9yIChJdGVyYXRvcjxMaXN0ZW5lcj4gc3RyZWFtID0gdGhpcy5saXN0ZW5lcnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLnNlbGVjdGVkU2NoZW1hQ2hhbmdlZChzY2hlbWEpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGxvd3MgY2xpZW50cyB0byBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZQotCSAqIGFuZCBzY2hlbWEuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCQl2b2lkIHNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlKTsKLQkJdm9pZCBzZWxlY3RlZFNjaGVtYUNoYW5nZWQoU2NoZW1hIHNjaGVtYSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGFiYXNlIGdyb3VwICoqKioqKioqKioKLQotCS8qKgotCSAqIGNvbm5lY3Rpb24gY29tYm8tYm94Ci0JICogc2NoZW1hIGNvbWJvLWJveAotCSAqIGFkZCBjb25uZWN0aW9uIGxpbmsKLQkgKiByZWNvbm5lY3QgbGluawotCSAqLwotCWNsYXNzIERhdGFiYXNlR3JvdXAgewotCi0JCS8vIHRoZXNlIGFyZSBrZXB0IGluIHN5bmNoIHdpdGggdGhlIHNlbGVjdGlvbgotCQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIHNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGU7Ci0JCXByaXZhdGUgU2NoZW1hIHNlbGVjdGVkU2NoZW1hOwotCi0JCXByaXZhdGUgZmluYWwgQ29tYm8gY29ubmVjdGlvbkNvbWJvQm94OwotCi0JCXByaXZhdGUgZmluYWwgQ29tYm8gc2NoZW1hQ29tYm9Cb3g7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBMaW5rIHJlY29ubmVjdExpbms7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCi0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JCURhdGFiYXNlR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJc3VwZXIoKTsKLQotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsgIC8vIGZhbHNlID0gZG8gbm90IG1ha2UgY29sdW1ucyBlcXVhbCB3aWR0aAotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2RhdGFiYXNlKTsKLQkJCS8vIFRPRE8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmdyb3VwLCBKcGFIZWxwQ29udGV4dElkcy5YWFgpOwotCi0JCQkvLyBjb25uZWN0aW9uIGNvbWJvLWJveAotCQkJdGhpcy5idWlsZExhYmVsKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkRhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9jb25uZWN0aW9uKTsKLQkJCXRoaXMuY29ubmVjdGlvbkNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KGdyb3VwLCB0aGlzLmJ1aWxkQ29ubmVjdGlvbkNvbWJvQm94U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLQkJCS8vIHNjaGVtYSBjb21iby1ib3gKLQkJCXRoaXMuYnVpbGRMYWJlbChncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2Vfc2NoZW1hKTsKLQkJCXRoaXMuc2NoZW1hQ29tYm9Cb3ggPSB0aGlzLmJ1aWxkQ29tYm9Cb3goZ3JvdXAsIHRoaXMuYnVpbGRTY2hlbWFDb21ib0JveFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJdGhpcy5idWlsZExhYmVsKGdyb3VwLCAyLCBKcHRVaU1lc3NhZ2VzLkRhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9zY2hlbWFJbmZvKTsKLQotCQkJLy8gYWRkIGNvbm5lY3Rpb24gbGluawotCQkJdGhpcy5idWlsZExpbmsoZ3JvdXAsIEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2FkZENvbm5lY3Rpb25MaW5rLCB0aGlzLmJ1aWxkQWRkQ29ubmVjdGlvbkxpbmtTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQkJLy8gcmVjb25uZWN0IGxpbmsKLQkJCXRoaXMucmVjb25uZWN0TGluayA9IHRoaXMuYnVpbGRMaW5rKGdyb3VwLCBKcHRVaU1lc3NhZ2VzLkRhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9yZWNvbm5lY3RMaW5rLCB0aGlzLmJ1aWxkUmVjb25uZWN0TGlua1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQotCQkJLy8gaW5pdGlhbGl6ZSBzdGF0ZSwgYmFzZWQgb24gSlBBIHByb2plY3QKLQkJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCQl0aGlzLnNlbGVjdGVkU2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJCWlmICh0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG51bGwpIHsKLQkJCQlEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlLnRoaXMuZmlyZVNjaGVtYUNoYW5nZWQodGhpcy5zZWxlY3RlZFNjaGVtYSk7Ci0JCQl9Ci0JCQlpZiAodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpIHsKLQkJCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJCQlEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlLnRoaXMuZmlyZUNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZCh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUpOwotCQkJfQotCi0JCQl0aGlzLnVwZGF0ZUNvbm5lY3Rpb25Db21ib0JveCgpOwotCQkJdGhpcy51cGRhdGVTY2hlbWFDb21ib0JveCgpOwotCQkJdGhpcy51cGRhdGVSZWNvbm5lY3RMaW5rKCk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JCUNvbm5lY3Rpb25Qcm9maWxlIGdldFNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlOwotCQl9Ci0KLQkJU2NoZW1hIGdldFNlbGVjdGVkU2NoZW1hKCkgewotCQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWRTY2hlbWE7Ci0JCX0KLQotCQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpIHsKLQkJCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCQkvKioKLQkJICogdGhpcyBjYW4gcmV0dXJuIG51bGw7Ci0JCSAqIGNhbGxlZCBhdCBzdGFydC11cCBhbmQgd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKLQkJICovCi0JCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQkJcmV0dXJuIERhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2UudGhpcy5qcGFQcm9qZWN0LmdldERhdGFTb3VyY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRoaXMgY2FuIHJldHVybiBudWxsOwotCQkgKiBjYWxsZWQgYXQgc3RhcnQtdXAgYW5kIHdoZW4gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZSBjaGFuZ2VzCi0JCSAqLwotCQlwcml2YXRlIFNjaGVtYSBnZXREZWZhdWx0U2NoZW1hKCkgewotCQkJcmV0dXJuICh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgPT0gdGhpcy5nZXRKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKSkgPwotCQkJCQkJCURhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2UudGhpcy5qcGFQcm9qZWN0LmdldERlZmF1bHRTY2hlbWEoKQotCQkJCQkJOgotCQkJCQkJCW51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIGNvbm5lY3Rpb24gY29tYm8tYm94IGlzIHVwZGF0ZWQgYXQgc3RhcnQtdXAgYW5kIHdoZW4gdGhlIHVzZXIKLQkJICogYWRkcyBhIGNvbm5lY3Rpb24gcHJvZmlsZQotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbm5lY3Rpb25Db21ib0JveCgpIHsKLQkJCXRoaXMuY29ubmVjdGlvbkNvbWJvQm94LnJlbW92ZUFsbCgpOwotCQkJZm9yIChTdHJpbmcgY3BOYW1lIDogdGhpcy5idWlsZFNvcnRlZENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSkgewotCQkJCXRoaXMuY29ubmVjdGlvbkNvbWJvQm94LmFkZChjcE5hbWUpOwotCQkJfQotCQkJaWYgKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb25uZWN0aW9uQ29tYm9Cb3guc2VsZWN0KHRoaXMuY29ubmVjdGlvbkNvbWJvQm94LmluZGV4T2YodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLmdldE5hbWUoKSkpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBTb3J0ZWRTZXQ8U3RyaW5nPiBidWlsZFNvcnRlZENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldChKcHREYlBsdWdpbi5pbnN0YW5jZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmNvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogY2FsbGVkIGF0IHN0YXJ0LXVwIGFuZCB3aGVuIHRoZSBzZWxlY3RlZCBjb25uZWN0aW9uIHByb2ZpbGUgY2hhbmdlcwotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlY29ubmVjdExpbmsoKSB7Ci0JCQl0aGlzLnJlY29ubmVjdExpbmsuc2V0RW5hYmxlZCh0aGlzLnJlY29ubmVjdExpbmtDYW5CZUVuYWJsZWQoKSk7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gcmVjb25uZWN0TGlua0NhbkJlRW5hYmxlZCgpIHsKLQkJCXJldHVybiAodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpICYmIHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5pc0luYWN0aXZlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIHNjaGVtYSBjb21iby1ib3ggaXMgdXBkYXRlZCBhdCBzdGFydC11cCBhbmQKLQkJICogd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKLQkJICovCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVTY2hlbWFDb21ib0JveCgpIHsKLQkJCXRoaXMuc2NoZW1hQ29tYm9Cb3gucmVtb3ZlQWxsKCk7Ci0JCQlmb3IgKFN0cmluZyBzY2hlbWFOYW1lIDogdGhpcy5idWlsZFNvcnRlZFNjaGVtYU5hbWVzKCkpIHsKLQkJCQl0aGlzLnNjaGVtYUNvbWJvQm94LmFkZChzY2hlbWFOYW1lKTsKLQkJCX0KLQkJCS8vIHRoZSBjdXJyZW50IHNjaGVtYSAqc2hvdWxkKiBiZSBpbiB0aGUgY3VycmVudCBjb25uZWN0aW9uIHByb2ZpbGUKLQkJCWlmICh0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG51bGwpIHsKLQkJCQl0aGlzLnNjaGVtYUNvbWJvQm94LnNlbGVjdCh0aGlzLnNjaGVtYUNvbWJvQm94LmluZGV4T2YodGhpcy5zZWxlY3RlZFNjaGVtYS5nZXROYW1lKCkpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgU29ydGVkU2V0PFN0cmluZz4gYnVpbGRTb3J0ZWRTY2hlbWFOYW1lcygpIHsKLQkJCWlmICh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJCXJldHVybiBFTVBUWV9TQ0hFTUFfTkFNRVM7Ci0JCQl9Ci0JCQlEYXRhYmFzZSBkYiA9IHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpOwotCQkJaWYgKGRiID09IG51bGwpIHsgIC8vIHRoZSBkYXRhYmFzZSBpcyBudWxsIHdoZW4gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBpbmFjdGl2ZQotCQkJCXJldHVybiBFTVBUWV9TQ0hFTUFfTkFNRVM7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldChkYi5zY2hlbWFOYW1lcygpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiB0aGUgc3BlY2lmaWVkIG5hbWUgbWF0Y2hlcyB0aGUgbmFtZSBvZiB0aGUgSlBBIHByb2plY3QncwotCQkgKiBjb25uZWN0aW9uIHByb2ZpbGUsIHJldHVybiBpdDsgb3RoZXJ3aXNlLCBidWlsZCBhIG5ldyBjb25uZWN0aW9uCi0JCSAqIHByb2ZpbGUuCi0JCSAqLwotCQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGNoZWNrSnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBjcE5hbWUpIHsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIGpwYVByb2plY3RDUCA9IHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCQlpZiAoKGpwYVByb2plY3RDUCAhPSBudWxsKSAmJiBqcGFQcm9qZWN0Q1AuZ2V0TmFtZSgpLmVxdWFscyhjcE5hbWUpKSB7Ci0JCQkJcmV0dXJuIGpwYVByb2plY3RDUDsKLQkJCX0KLQkJCXJldHVybiB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoY3BOYW1lKTsKLQkJfQotCi0JCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIEpwdERiUGx1Z2luLmluc3RhbmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShuYW1lKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBsaXN0ZW5lciBjYWxsYmFja3MgKioqKioqKioqKgotCi0JCXZvaWQgc2VsZWN0ZWRDb25uZWN0aW9uQ2hhbmdlZCgpIHsKLQkJCVN0cmluZyB0ZXh0ID0gdGhpcy5jb25uZWN0aW9uQ29tYm9Cb3guZ2V0VGV4dCgpOwotCQkJaWYgKHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCWlmICh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47ICAvLyBubyBjaGFuZ2UKLQkJCQl9Ci0JCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlID0gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuY2hlY2tKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUodGV4dCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHRleHQuZXF1YWxzKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQlyZXR1cm47ICAvLyBubyBjaGFuZ2UKLQkJCQkJfQotCQkJCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5jaGVja0pwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSh0ZXh0KTsKLQkJCQl9Ci0JCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCQl9Ci0JCQl0aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKCk7Ci0JCQlEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlLnRoaXMuZmlyZUNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZCh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUpOwotCQl9Ci0KLQkJdm9pZCBzZWxlY3RlZFNjaGVtYUNoYW5nZWQoKSB7Ci0JCQlTY2hlbWEgb2xkID0gdGhpcy5zZWxlY3RlZFNjaGVtYTsKLQkJCXRoaXMuc2VsZWN0ZWRTY2hlbWEgPSB0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCh0aGlzLnNjaGVtYUNvbWJvQm94LmdldFRleHQoKSk7Ci0JCQlpZiAodGhpcy5zZWxlY3RlZFNjaGVtYSAhPSBvbGQpIHsKLQkJCQlEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlLnRoaXMuZmlyZVNjaGVtYUNoYW5nZWQodGhpcy5zZWxlY3RlZFNjaGVtYSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogT3BlbiB0aGUgRFRQIE5ldyBDb25uZWN0aW9uIFByb2ZpbGUgd2l6YXJkLgotCQkgKiBJZiB0aGUgdXNlciBjcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24gcHJvZmlsZSwgc3RhcnQgdXNpbmcgaXQgYW5kCi0JCSAqIGNvbm5lY3QgaXQKLQkJICovCi0JCXZvaWQgYWRkQ29ubmVjdGlvbigpIHsKLQkJCVN0cmluZyBhZGRlZFByb2ZpbGVOYW1lID0gRFRQVWlUb29scy5jcmVhdGVOZXdDb25uZWN0aW9uUHJvZmlsZSgpOwotCQkJaWYgKGFkZGVkUHJvZmlsZU5hbWUgPT0gbnVsbCkgewotCQkJCXJldHVybjsgIC8vIHVzZXIgcHJlc3NlZCAiQ2FuY2VsIgotCQkJfQotCQkJaWYgKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCQl9Ci0JCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoYWRkZWRQcm9maWxlTmFtZSk7Ci0JCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJCXRoaXMudXBkYXRlQ29ubmVjdGlvbkNvbWJvQm94KCk7Ci0JCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQkJLy8gZXZlcnl0aGluZyBlbHNlIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQgd2hlbiB3ZSBnZXQgdGhlIHJlc3VsdGluZyBvcGVuIGV2ZW50Ci0JCQlEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlLnRoaXMuZmlyZUNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZCh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUpOwotCQl9Ci0KLQkJdm9pZCByZWNvbm5lY3QoKSB7Ci0JCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQkJLy8gZXZlcnl0aGluZyBzaG91bGQgYmUgc3luY2hyb25pemVkIHdoZW4gd2UgZ2V0IHRoZSByZXN1bHRpbmcgb3BlbiBldmVudAotCQl9Ci0KLQkJLyoqCi0JCSAqIGNhbGxlZCB3aGVuCi0JCSAqICAgICAtIHRoZSB1c2VyIHNlbGVjdHMgYSBuZXcgY29ubmVjdGlvbgotCQkgKiAgICAgLSB0aGUgY29ubmVjdGlvbiB3YXMgb3BlbmVkCi0JCSAqICAgICAtIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgKG5ldmVyIGhhcHBlbnM/KQotCQkgKiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc2NoZW1hIHN0dWZmIGFuZCB0aGUgcmVjb25uZWN0IGxpbmsKLQkJICovCi0JCXZvaWQgY29ubmVjdGlvbkNoYW5nZWQoKSB7Ci0JCQlTY2hlbWEgb2xkID0gdGhpcy5zZWxlY3RlZFNjaGVtYTsKLQkJCXRoaXMuc2VsZWN0ZWRTY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJCWlmICh0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG9sZCkgewotCQkJCURhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2UudGhpcy5maXJlU2NoZW1hQ2hhbmdlZCh0aGlzLnNlbGVjdGVkU2NoZW1hKTsKLQkJCX0KLQkJCXRoaXMudXBkYXRlU2NoZW1hQ29tYm9Cb3goKTsKLQkJCXRoaXMudXBkYXRlUmVjb25uZWN0TGluaygpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25Db21ib0JveFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gbm90aGluZyBzcGVjaWFsIGZvciAiZGVmYXVsdCIgKGRvdWJsZS1jbGljaz8pCi0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlEYXRhYmFzZUdyb3VwLnRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uQ2hhbmdlZCgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkRhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2UgY29ubmVjdGlvbiBjb21iby1ib3ggc2VsZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU2NoZW1hQ29tYm9Cb3hTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBmb3IgImRlZmF1bHQiIChkb3VibGUtY2xpY2s/KQotCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJRGF0YWJhc2VHcm91cC50aGlzLnNlbGVjdGVkU2NoZW1hQ2hhbmdlZCgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkRhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2Ugc2NoZW1hIGNvbWJvLWJveCBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRBZGRDb25uZWN0aW9uTGlua1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCURhdGFiYXNlR3JvdXAudGhpcy5hZGRDb25uZWN0aW9uKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGF0YWJhc2VDb25uZWN0aW9uV2l6YXJkUGFnZSBhZGQgY29ubmVjdGlvbiBsaW5rIHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFJlY29ubmVjdExpbmtTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlEYXRhYmFzZUdyb3VwLnRoaXMucmVjb25uZWN0KCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGF0YWJhc2VDb25uZWN0aW9uV2l6YXJkUGFnZSByZWNvbm5lY3QgbGluayBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJCQkJdGhpcy5jb25uZWN0aW9uQ2hhbmdlZCgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUgIC8vIHRoaXMgcHJvYmFibHkgd29uJ3QgZXZlciBnZXQgY2FsbGVkLi4uCi0JCQkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb25Qcm9maWxlIGNwKSB7Ci0JCQkJCXRoaXMuY29ubmVjdGlvbkNoYW5nZWQoKTsKLQkJCQl9Ci0JCQkJcHJpdmF0ZSB2b2lkIGNvbm5lY3Rpb25DaGFuZ2VkKCkgewotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlEYXRhYmFzZUdyb3VwLnRoaXMuY29ubmVjdGlvbkNoYW5nZWQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCSk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGF0YWJhc2VDb25uZWN0aW9uV2l6YXJkUGFnZSBjb25uZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX07Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBsYWJlbAotCQkgKi8KLQkJcHJpdmF0ZSBMYWJlbCBidWlsZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzcGFuLCBTdHJpbmcgdGV4dCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdkLmhvcml6b250YWxJbmRlbnQgPSAzMDsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBjb21iby1ib3gKLQkJICovCi0JCXByaXZhdGUgQ29tYm8gYnVpbGRDb21ib0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXJldHVybiBjb21ibzsKLQkJfQotCi0JCS8qKgotCQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgbGluawotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rIGJ1aWxkTGluayhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCUxpbmsgbGluayA9IG5ldyBMaW5rKHBhcmVudCwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJbGluay5zZXRUZXh0KHRleHQpOwotCQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlyZXR1cm4gbGluazsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0dlbmVyYXRlRW50aXRpZXNXaXphcmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvR2VuZXJhdGVFbnRpdGllc1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Q1MWFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvR2VuZXJhdGVFbnRpdGllc1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5FbnRpdHlHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5QYWNrYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiB0d28gcGFnZXM6Ci0gKiAgIC0gYSBEYXRhYmFzZSBDb25uZWN0aW9uIHBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGEgY29ubmVjdGlvbgotICogICAgIGFuZCBhIHNjaGVtYQotICogICAtIGEgR2VuZXJhdGUgRW50aXRpZXMgcGFnZSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBzZWxlY3Qgd2hpY2ggdGFibGVzIGluCi0gKiAgICAgdGhlIHNlbGVjdGVkIHNjaGVtYSBhcmUgdG8gYmUgdXNlZCBhbmQgdG8gY29uZmlndXJlIEVudGl0eSBuYW1lcwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVFbnRpdGllc1dpemFyZCBleHRlbmRzIFdpemFyZCB7CQotCi0JcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQlwcml2YXRlIGZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXByaXZhdGUgRGF0YWJhc2VDb25uZWN0aW9uV2l6YXJkUGFnZSBkYlNldHRpbmdzUGFnZTsKLQotCXByaXZhdGUgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UgZ2VuZXJhdGVFbnRpdGllc1BhZ2U7Ci0KLQlwcml2YXRlIGZpbmFsIFBhY2thZ2VHZW5lcmF0b3IuQ29uZmlnIHBhY2thZ2VHZW5lcmF0b3JDb25maWc7Ci0KLQlwcml2YXRlIGZpbmFsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5R2VuZXJhdG9yQ29uZmlnOwotCi0JcHJpdmF0ZSBib29sZWFuIHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWw7Ci0KLQotCXB1YmxpYyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkKEpwYVByb2plY3QganBhUHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQl0aGlzLnBhY2thZ2VHZW5lcmF0b3JDb25maWcgPSBuZXcgUGFja2FnZUdlbmVyYXRvci5Db25maWcoKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcgPSBuZXcgRW50aXR5R2VuZXJhdG9yLkNvbmZpZygpOwotCQl0aGlzLnNldFdpbmRvd1RpdGxlKEpwdFVpTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQkJdGhpcy5kYlNldHRpbmdzUGFnZSA9IG5ldyBEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlKHRoaXMuanBhUHJvamVjdCk7Ci0JCXRoaXMuZGJTZXR0aW5nc1BhZ2UuYWRkTGlzdGVuZXIobmV3IERhdGFiYXNlUGFnZUxpc3RlbmVyKCkpOwotCQl0aGlzLmFkZFBhZ2UodGhpcy5kYlNldHRpbmdzUGFnZSk7Ci0JCXRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UgPSBuZXcgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UoKTsKLQkJdGhpcy5hZGRQYWdlKHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UpOwotCQl0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmluaXQodGhpcy5zZWxlY3Rpb24pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnLnNldFBhY2thZ2VGcmFnbWVudCh0aGlzLmJ1aWxkUGFja2FnZUZyYWdtZW50KCkpOwotCi0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldENvbnZlcnRUb0phdmFTdHlsZUlkZW50aWZpZXJzKHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuY29udmVydFRvSmF2YVN0eWxlSWRlbnRpZmllcnMoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEZpZWxkQWNjZXNzVHlwZSh0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmZpZWxkQWNjZXNzVHlwZSgpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0Q29sbGVjdGlvblR5cGVOYW1lKHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRDb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeCh0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldENvbGxlY3Rpb25BdHRyaWJ1dGVOYW1lU3VmZml4KCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRGaWVsZFZpc2liaWxpdHkodGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRGaWVsZFZpc2liaWxpdHkoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldE1ldGhvZFZpc2liaWxpdHkodGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRNZXRob2RWaXNpYmlsaXR5KCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRHZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycygpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IodGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcigpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0U2VyaWFsaXphYmxlKHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2Uuc2VyaWFsaXphYmxlKCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRHZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQodGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsodGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRFbWJlZGRlZElkQXR0cmlidXRlTmFtZSh0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldEVtYmVkZGVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRQcmltYXJ5S2V5TWVtYmVyQ2xhc3NOYW1lKHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0UHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZSgpKTsKLQkJZm9yIChNYXAuRW50cnk8VGFibGUsIFN0cmluZz4gZW50cnkgOiB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldFNlbGVjdGVkVGFibGVzKCkuZW50cnlTZXQoKSkgewotCQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuYWRkVGFibGUoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotCQl9Ci0JCS8vIHRoZSBuYW1lIGJ1aWxkZXIgY29tZXMgZnJvbSB0aGUgSlBBIHBsYXRmb3JtCi0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKHRoaXMuYnVpbGREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpKTsKLQotCQl0aGlzLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwgPSB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwoKTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgRW50aXR5R2VuZXJhdG9yLkRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGJ1aWxkRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcih0aGlzLmpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgYnVpbGRQYWNrYWdlRnJhZ21lbnQoKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldFBhY2thZ2VGcmFnbWVudCgpOwotCQkKLQkJaWYgKHBhY2thZ2VGcmFnbWVudCA9PSBudWxsKSB7Ci0JCQlwYWNrYWdlRnJhZ21lbnQ9IHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlpZiAocGFja2FnZUZyYWdtZW50LmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50OwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290LmNyZWF0ZVBhY2thZ2VGcmFnbWVudChwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSwgdHJ1ZSwgbnVsbCk7Ci0JCX0gCi0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRyYS13aXphcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlDb2xsZWN0aW9uPFRhYmxlPiBnZXRQb3NzaWJsZVRhYmxlcygpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUYWJsZXModGhpcy5kYlNldHRpbmdzUGFnZS5nZXRTZWxlY3RlZFNjaGVtYSgpKTsKLQl9Ci0KLQlKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKXsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdDsKLQl9Ci0KLQl2b2lkIHNlbGVjdGVkU2NoZW1hQ2hhbmdlZChTY2hlbWEgc2NoZW1hKSB7Ci0JCXRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2Uuc2V0UG9zc2libGVUYWJsZXModGhpcy5idWlsZFRhYmxlcyhzY2hlbWEpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248VGFibGU+IGJ1aWxkVGFibGVzKFNjaGVtYSBzY2hlbWEpIHsKLQkJcmV0dXJuIChzY2hlbWEgPT0gbnVsbCkgPwotCQkJCQkJQ29sbGVjdGlvbnMuPFRhYmxlPmVtcHR5U2V0KCkKLQkJCQkJOgotCQkJCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc2NoZW1hLnRhYmxlcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgLSBzZXR0aW5ncyAqKioqKioqKioqCi0KLQlwdWJsaWMgUGFja2FnZUdlbmVyYXRvci5Db25maWcgZ2V0UGFja2FnZUdlbmVyYXRvckNvbmZpZygpIHsKLQkJcmV0dXJuIHRoaXMucGFja2FnZUdlbmVyYXRvckNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBnZXRFbnRpdHlHZW5lcmF0b3JDb25maWcoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKCl7Ci0JCXJldHVybiB0aGlzLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5hbWUgYnVpbGRlciBhZGFwdGVyICoqKioqKioqKioKLQotCS8qKgotCSAqIGFkYXB0IHRoZSBKUEEgcGxhdGZvcm0tc3VwcGxpZWQgYnVpbGRlciB0byB0aGUgYnVpbGRlciBpbnRlcmZhY2UKLQkgKiBleHBlY3RlZCBieSB0aGUgZW50aXR5IGdlbmVyYXRvcgotCSAqLwotCXN0YXRpYyBjbGFzcyBMb2NhbERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGltcGxlbWVudHMgRW50aXR5R2VuZXJhdG9yLkRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIHsKLQkJcHJpdmF0ZSBFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBidWlsZGVyOwotCQlMb2NhbERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKEVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGJ1aWxkZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1aWxkZXIgPSBidWlsZGVyOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBlbnRpdHlOYW1lLCBUYWJsZSB0YWJsZSkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoZW50aXR5TmFtZSwgdGFibGUpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZENvbHVtbkFubm90YXRpb25OYW1lKGF0dHJpYnV0ZU5hbWUsIGNvbHVtbik7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZGVyLmJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKGF0dHJpYnV0ZU5hbWUsIGZvcmVpZ25LZXkpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShjb2x1bW4pOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZShUYWJsZSB0YWJsZSkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKHRhYmxlKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSBwYWdlIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIGxpc3RlbiBmb3Igd2hlbiB0aGUgRGF0YWJhc2UgQ29ubmVjdGlvbiBwYWdlIGNoYW5nZXMgaXRzIHNlbGVjdGVkIHNjaGVtYQotCSAqIHNvIHdlIGNhbiBrZWVwIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBwYWdlIGluIHN5bmNoCi0JICovCi0JY2xhc3MgRGF0YWJhc2VQYWdlTGlzdGVuZXIgaW1wbGVtZW50cyBEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlLkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGVkU2NoZW1hQ2hhbmdlZChTY2hlbWEgc2NoZW1hKSB7Ci0JCQlHZW5lcmF0ZUVudGl0aWVzV2l6YXJkLnRoaXMuc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKHNjaGVtYSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVjZDkyYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0dlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdUeXBlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuRW50aXR5R2VuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5FbnRpdHlHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuVGFibGVMYXlvdXRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vLyBUT0RPIGFkZCBudW1lcm91cyBzZXR0aW5ncyB0byBVSS4uLgotLy8gVE9ETyB2YWxpZGF0ZSBsaXN0IG9mIHVzZXItYXBwcm92ZWQgZW50aXR5IG5hbWVzOgotLy8gICAgIG5vIGR1cGxpY2F0ZXMgKGNhc2Utc2Vuc2l0aXZlKQotLy8gICAgIHZhbGlkIEphdmEgaWRlbnRpZmllcnMgQHNlZSBOYW1lVG9vbHMuc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVycyhTdHJpbmcpCi0vLyAgICAgbm8gSmF2YSByZXNlcnZlZCB3b3JkcyBAc2VlIE5hbWVUb29scy5KQVZBX1JFU0VSVkVEX1dPUkRTX1NFVAotY2xhc3MgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UgZXh0ZW5kcyBOZXdUeXBlV2l6YXJkUGFnZSB7Ci0KLQlDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVGFibGU7Ci0JQnV0dG9uIHN5bmNocm9uaXplQ2xhc3Nlc0NoZWNrQm94OwotCi0JLy8gVE9ETyBpZiB0aGlzIGZsYWcgY2hhbmdlcyB3ZSBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGUgZW50aXR5IG5hbWVzLi4uCi0JLy8gKGF0IHRoZSBtb21lbnQsIGl0IGRvZXMgbm90IGNoYW5nZSBiZWNhdXNlIGl0IGlzIG5vdCB2aXNpYmxlIHRvIHRoZSB1c2VyLi4uKQotCXByaXZhdGUgYm9vbGVhbiBjb252ZXJ0VG9KYXZhU3R5bGVJZGVudGlmaWVycyA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZpZWxkQWNjZXNzVHlwZSA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgY29sbGVjdGlvblR5cGVOYW1lID0gU2V0LmNsYXNzLmdldE5hbWUoKTsKLQlwcml2YXRlIFN0cmluZyBjb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeCA9ICJfY29sbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGludCBmaWVsZFZpc2liaWxpdHkgPSBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnLlBSSVZBVEU7Ci0JcHJpdmF0ZSBpbnQgbWV0aG9kVmlzaWJpbGl0eSA9IEVudGl0eUdlbmVyYXRvci5Db25maWcuUFVCTElDOwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBzZXJpYWxpemFibGUgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBlbWJlZGRlZElkQXR0cmlidXRlTmFtZSA9ICJwayI7ICAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgcHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZSA9ICJQSyI7ICAvLyROT04tTkxTLTEkCi0KLQkvLyBrZXkgPSB0YWJsZTsgdmFsdWUgPSBlbnRpdHkgbmFtZQotCXByaXZhdGUgSGFzaE1hcDxUYWJsZSwgU3RyaW5nPiBlbnRpdHlOYW1lczsKLQkKLQlwcml2YXRlIGJvb2xlYW4gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCA9IGZhbHNlOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRBQkxFX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTID0geyAidGFibGUiLCAiZW50aXR5TmFtZSIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0NPTFVNTl9JTkRFWCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9OQU1FX0NPTFVNTl9JTkRFWCA9IDE7Ci0JCi0KLQlHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZSgpIHsKLQkJc3VwZXIodHJ1ZSwgIkdlbmVyYXRlIEVudGl0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9nZW5lcmF0ZUVudGl0aWVzKTsKLQkJc2V0TWVzc2FnZShKcHRVaU1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2Nob29zZUVudGl0eVRhYmxlKTsKLQl9Ci0JCi0JLy8gLS0tLS0tLS0gSW5pdGlhbGl6YXRpb24gLS0tLS0tLS0tCi0JLyoqCi0JICogVGhlIHdpemFyZCBvd25pbmcgdGhpcyBwYWdlIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggdGhlCi0JICogY3VycmVudCBzZWxlY3Rpb24uIFRoZSBzZWxlY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMgb2YgdGhlIHdpemFyZCAKLQkgKiBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMKLQkgKi8KLQl2b2lkIGluaXQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhRWxlbWVudCBqZWxlbT0gZ2V0SW5pdGlhbEphdmFFbGVtZW50KHNlbGVjdGlvbik7Ci0JCWluaXRDb250YWluZXJQYWdlKGplbGVtKTsKLQkJaW5pdFR5cGVQYWdlKGplbGVtKTsKLQkJZG9TdGF0dXNVcGRhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWludCBuQ29sdW1ucz0gNDsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG5Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5ESUFMT0dfR0VORVJBVEVfRU5USVRJRVMpOwotCQkKLQkJY3JlYXRlQ29udGFpbmVyQ29udHJvbHMoY29tcG9zaXRlLCBuQ29sdW1ucyk7CQotCQljcmVhdGVQYWNrYWdlQ29udHJvbHMoY29tcG9zaXRlLCBuQ29sdW1ucyk7CQotCQkKLQkJdGhpcy5zeW5jaHJvbml6ZUNsYXNzZXNDaGVja0JveCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlzeW5jaHJvbml6ZUNsYXNzZXNDaGVja0JveC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2Vfc3luY2hyb25pemVDbGFzc2VzKTsKLQkJc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFN5bmNoQ2xhc3Nlc1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkKLQkJR3JvdXAgdGFibGVzR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0JCXRhYmxlc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQl0YWJsZXNHcm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfdGFibGVzKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXRhYmxlc0dyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljcmVhdGVUYWJsZXNTZWxlY3Rpb25Db250cm9sKHRhYmxlc0dyb3VwKTsKLQkJY3JlYXRlQnV0dG9uQ29tcG9zaXRlKHRhYmxlc0dyb3VwKTsKLQkJCi0JCXRoaXMuaW5pdFRhYmxlc1NlbGVjdGlvbkNvbnRyb2woKTsKLQkJCi0JCS8vc2V0IGluaXRpYWwgc2VsZWN0aW9uIHN0YXRlIG9mIHRoZSBzeW5jaHJvbml6ZSBjbGFzc2VzIGNoZWNrYm94Ci0JCXN5bmNocm9uaXplQ2xhc3Nlc0NoZWNrQm94LnNldFNlbGVjdGlvbiggISB0aGlzLmdldEdlbkVudGl0aWVzV2l6YXJkKCkuZ2V0SnBhUHJvamVjdCgpLmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoKSk7Ci0JCXNldFN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwoc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnRhYmxlVGFibGUuZ2V0Q29udHJvbCgpLCBKcGFIZWxwQ29udGV4dElkcy5ESUFMT0dfR0VORVJBVEVfRU5USVRJRVNfVEFCTEVTKTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgR2VuZXJhdGVFbnRpdGllc1dpemFyZCBnZXRHZW5FbnRpdGllc1dpemFyZCgpIHsKLQkJcmV0dXJuIChHZW5lcmF0ZUVudGl0aWVzV2l6YXJkKSB0aGlzLmdldFdpemFyZCgpOwotCX0KLQotCXZvaWQgc2VsZWN0QWxsVGFibGVzKCl7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRBbGxDaGVja2VkKHRydWUpOwotCQlkb1N0YXR1c1VwZGF0ZSgpOwotCX0KLQkKLQl2b2lkIGRlc2VsZWN0QWxsVGFibGVzKCl7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJZG9TdGF0dXNVcGRhdGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRUYWJsZXNTZWxlY3Rpb25Db250cm9sKCkgewotCQl0aGlzLnNldFBvc3NpYmxlVGFibGVzKHRoaXMuZ2V0R2VuRW50aXRpZXNXaXphcmQoKS5nZXRQb3NzaWJsZVRhYmxlcygpKTsKLQl9Ci0KLQl2b2lkIHNldFBvc3NpYmxlVGFibGVzKENvbGxlY3Rpb248VGFibGU+IHBvc3NpYmxlVGFibGVzKSB7Ci0JCWlmICh0aGlzLnRhYmxlVGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOyAgLy8gdGhlIHdpemFyZCBoYXMgY2FsbGVkIHRoaXMgbWV0aG9kIGJlZm9yZSBvdXIgd2lkZ2V0cyBhcmUgYnVpbHQKLQkJfQotCQl0aGlzLmVudGl0eU5hbWVzID0gbmV3IEhhc2hNYXA8VGFibGUsIFN0cmluZz4ocG9zc2libGVUYWJsZXMuc2l6ZSgpKTsKLQkJZm9yIChUYWJsZSB0YWJsZSA6IHBvc3NpYmxlVGFibGVzKSB7Ci0JCQlTdHJpbmcgdGFibGVOYW1lID0gdGFibGUuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGVudGl0eU5hbWUgPSAodGhpcy5jb252ZXJ0VG9KYXZhU3R5bGVJZGVudGlmaWVycykgPwotCQkJCQkJCUVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSh0YWJsZU5hbWUsIGVudGl0eU5hbWVzLnZhbHVlcygpKQotCQkJCQkJOgotCQkJCQkJCU5hbWVUb29scy51bmlxdWVOYW1lRm9yKHRhYmxlTmFtZSwgZW50aXR5TmFtZXMudmFsdWVzKCkpOwotCQkJdGhpcy5lbnRpdHlOYW1lcy5wdXQodGFibGUsIGVudGl0eU5hbWUpOwotCQl9Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRJbnB1dChwb3NzaWJsZVRhYmxlcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlc1NlbGVjdGlvbkNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlUYWJsZUxheW91dENvbXBvc2l0ZSBsYXlvdXQ9IG5ldyBUYWJsZUxheW91dENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJYWRkQ29sdW1uTGF5b3V0RGF0YShsYXlvdXQpOwotCQkKLQkJZmluYWwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGUgdGFibGUgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGUobGF5b3V0LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUiB8IFNXVC5DSEVDSyk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJCi0JCVRhYmxlQ29sdW1uIHRhYmxlTmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIFRBQkxFX0NPTFVNTl9JTkRFWCk7Ci0JCXRhYmxlTmFtZUNvbHVtbi5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfdGFibGVDb2x1bW4pOwotCQl0YWJsZU5hbWVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIGVudGl0eU5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCBFTlRJVFlfTkFNRV9DT0xVTU5fSU5ERVgpOwotCQllbnRpdHlOYW1lQ29sdW1uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9lbnRpdHlOYW1lQ29sdW1uKTsKLQkJZW50aXR5TmFtZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQ9IFNXVFV0aWwuZ2V0VGFibGVIZWlnaHRIaW50KHRhYmxlLCAyMCk7Ci0JCWdkLndpZHRoSGludCA9IDYwMDsKLQkJbGF5b3V0LnNldExheW91dERhdGEoZ2QpOwotCi0JCXRoaXMudGFibGVUYWJsZSA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdGhpcy50YWJsZVRhYmxlLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRMYWJlbFByb3ZpZGVyKHRoaXMuYnVpbGRUYWJsZVRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJdGhpcy50YWJsZVRhYmxlLnNldENvbnRlbnRQcm92aWRlcih0aGlzLmJ1aWxkVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdGhpcy50YWJsZVRhYmxlLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQlyZXR1cm4gKChUYWJsZSkgZTEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChUYWJsZSkgZTIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGhpcy50YWJsZVRhYmxlLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVRhYmxlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGFibGUuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkYyICYmIGUuc3RhdGVNYXNrID09IFNXVC5OT05FKSB7Ci0JCQkJCWVkaXRFbnRpdHlOYW1lSWZQb3NzaWJsZSgpOwotCQkJCQllLmRvaXQ9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLmFkZENlbGxFZGl0b3JzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25Db21wb3NpdGUoR3JvdXAgdGFibGVzR3JvdXApewotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJsZXNHcm91cCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGJ1dHRvbkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25MYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCUJ1dHRvbiBzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkdlbmVyYWxfc2VsZWN0QWxsKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkU2VsZWN0QWxsQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQotCQlCdXR0b24gZGVzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuR2VuZXJhbF9kZXNlbGVjdEFsbCk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGREZXNlbGVjdEFsbEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkQ29sdW1uTGF5b3V0RGF0YShUYWJsZUxheW91dENvbXBvc2l0ZSBsYXlvdXQpIHsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQl9Ci0KLQl2b2lkIGVkaXRFbnRpdHlOYW1lSWZQb3NzaWJsZSgpewotCQlPYmplY3RbXSBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMudGFibGVUYWJsZS5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOwotCQlpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHsKLQkJCXRoaXMudGFibGVUYWJsZS5lZGl0RWxlbWVudChzZWxlY3RlZFswXSwgRU5USVRZX05BTUVfQ09MVU1OX0lOREVYKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQ2VsbEVkaXRvcnMoKSB7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRDb2x1bW5Qcm9wZXJ0aWVzKFRBQkxFX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTKTsKLQkJCi0JCVRleHRDZWxsRWRpdG9yW10gZWRpdG9ycyA9IG5ldyBUZXh0Q2VsbEVkaXRvcltUQUJMRV9UQUJMRV9DT0xVTU5fUFJPUEVSVElFUy5sZW5ndGhdOwotCQllZGl0b3JzW0VOVElUWV9OQU1FX0NPTFVNTl9JTkRFWF09IG5ldyBUZXh0Q2VsbEVkaXRvcih0aGlzLnRhYmxlVGFibGUuZ2V0VGFibGUoKSwgU1dULlNJTkdMRSk7Ci0JCQotCQl0aGlzLnRhYmxlVGFibGUuc2V0Q2VsbEVkaXRvcnMoZWRpdG9ycyk7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRDZWxsTW9kaWZpZXIodGhpcy5idWlsZFRhYmxlVGFibGVDZWxsTW9kaWZpZXIoKSk7Ci0JfQotCi0Jdm9pZCBoYW5kbGVUYWJsZXNMaXN0U2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCWlmICh0aGlzLm5vVGFibGVzQXJlU2VsZWN0ZWQoKSkgewotCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0JfQotCQotCXByaXZhdGUgSUNlbGxNb2RpZmllciBidWlsZFRhYmxlVGFibGVDZWxsTW9kaWZpZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVUYWJsZUNlbGxNb2RpZmllcigpOwotCX0KLQkKLQlNYXA8VGFibGUsIFN0cmluZz4gZ2V0U2VsZWN0ZWRUYWJsZXMoKSB7Ci0JCU9iamVjdFtdIGNoZWNrZWRFbGVtZW50cyA9IHRoaXMudGFibGVUYWJsZS5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJSGFzaE1hcDxUYWJsZSwgU3RyaW5nPiBzZWxlY3RlZFRhYmxlcyA9IG5ldyBIYXNoTWFwPFRhYmxlLCBTdHJpbmc+KGNoZWNrZWRFbGVtZW50cy5sZW5ndGgpOwotCQlmb3IgKE9iamVjdCBjaGVja2VkRWxlbWVudCA6IGNoZWNrZWRFbGVtZW50cykgewotCQkJVGFibGUgdGFibGUgPSAoVGFibGUpIGNoZWNrZWRFbGVtZW50OwotCQkJc2VsZWN0ZWRUYWJsZXMucHV0KHRhYmxlLCB0aGlzLmVudGl0eU5hbWVzLmdldCh0YWJsZSkpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZFRhYmxlczsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9UYWJsZXNBcmVTZWxlY3RlZCgpIHsKLQkJcmV0dXJuICh0aGlzLnRhYmxlVGFibGUgPT0gbnVsbCkgPyB0cnVlIDogKHRoaXMudGFibGVUYWJsZS5nZXRDaGVja2VkRWxlbWVudHMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZpZWxkQ2hhbmdlZChTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXN1cGVyLmhhbmRsZUZpZWxkQ2hhbmdlZChmaWVsZE5hbWUpOwotCQkKLQkJZG9TdGF0dXNVcGRhdGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvU3RhdHVzVXBkYXRlKCkgewotCQkvLyBzdGF0dXMgb2YgYWxsIHVzZWQgY29tcG9uZW50cwotCQlJU3RhdHVzW10gc3RhdHVzPSBuZXcgSVN0YXR1c1tdIHsKLQkJCWZDb250YWluZXJTdGF0dXMsCi0JCQlmUGFja2FnZVN0YXR1cwotCQl9OwotCQkvLyB0aGUgbW9kZSBzZXZlcmUgc3RhdHVzIHdpbGwgYmUgZGlzcGxheWVkIGFuZCB0aGUgT0sgYnV0dG9uIGVuYWJsZWQvZGlzYWJsZWQuCi0JCXRoaXMudXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc3RhdHVzIGxpbmUgYW5kIHRoZSBPSyBidXR0b24gYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzdGF0dXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJc3VwZXIudXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0JCWlmICh0aGlzLmlzUGFnZUNvbXBsZXRlKCkgJiYgdGhpcy5ub1RhYmxlc0FyZVNlbGVjdGVkKCkpIHsKLQkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJfQotCX0KLQotCVN0cmluZyBnZXRFbnRpdHlOYW1lKFRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eU5hbWVzLmdldCh0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHdoZXRoZXIgdGhlIG5ldyBlbnRpdHkgbmFtZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGVudGl0eSBuYW1lCi0JICovCi0JYm9vbGVhbiBzZXRFbnRpdHlOYW1lKFRhYmxlIHRhYmxlLCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5lbnRpdHlOYW1lcy5wdXQodGFibGUsIGVudGl0eU5hbWUpOwotCQlyZXR1cm4gISBlbnRpdHlOYW1lLmVxdWFscyhvbGQpOwotCX0KLQotCWJvb2xlYW4gY29udmVydFRvSmF2YVN0eWxlSWRlbnRpZmllcnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRUb0phdmFTdHlsZUlkZW50aWZpZXJzOwotCX0KLQotCWJvb2xlYW4gZmllbGRBY2Nlc3NUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5maWVsZEFjY2Vzc1R5cGU7Ci0JfQotCi0JU3RyaW5nIGdldENvbGxlY3Rpb25UeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvblR5cGVOYW1lOwotCX0KLQotCVN0cmluZyBnZXRDb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeCgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbkF0dHJpYnV0ZU5hbWVTdWZmaXg7Ci0JfQotCi0JaW50IGdldEZpZWxkVmlzaWJpbGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZmllbGRWaXNpYmlsaXR5OwotCX0KLQotCWludCBnZXRNZXRob2RWaXNpYmlsaXR5KCkgewotCQlyZXR1cm4gdGhpcy5tZXRob2RWaXNpYmlsaXR5OwotCX0KLQotCWJvb2xlYW4gZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycygpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVyczsKLQl9Ci0KLQlib29sZWFuIGdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcjsKLQl9Ci0KLQlib29sZWFuIHNlcmlhbGl6YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2VyaWFsaXphYmxlOwotCX0KLQotCWJvb2xlYW4gZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQ7Ci0JfQotCi0JYm9vbGVhbiBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLOwotCX0KLQotCWJvb2xlYW4gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCgpIHsKLQkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbDsKLQl9Ci0JCi0Jdm9pZCBzZXRTeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKGJvb2xlYW4gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCl7Ci0JCXRoaXMuc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCA9IHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWw7Ci0JfQotCi0JU3RyaW5nIGdldEVtYmVkZGVkSWRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbWJlZGRlZElkQXR0cmlidXRlTmFtZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0UHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFNlbGVjdEFsbEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gbm90aGluZyBzcGVjaWFsIGZvciAiZGVmYXVsdCIgKGRvdWJsZS1jbGljaz8pCi0JCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNlbGVjdEFsbFRhYmxlcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkRGVzZWxlY3RBbGxCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBmb3IgImRlZmF1bHQiIChkb3VibGUtY2xpY2s/KQotCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlkZXNlbGVjdEFsbFRhYmxlcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU3luY2hDbGFzc2VzU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBub3RoaW5nIHNwZWNpYWwgZm9yICJkZWZhdWx0IiAoZG91YmxlLWNsaWNrPykKLQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0U3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbChzeW5jaHJvbml6ZUNsYXNzZXNDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JY2xhc3MgVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoVGFibGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSBUQUJMRV9DT0xVTU5fSU5ERVg6Ci0JCQkJCXJldHVybiAoKFRhYmxlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0KLQkJCQljYXNlIEVOVElUWV9OQU1FX0NPTFVNTl9JTkRFWDoKLQkJCQkJcmV0dXJuIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlLnRoaXMuZ2V0RW50aXR5TmFtZSgoVGFibGUpIGVsZW1lbnQpOwotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBjb2x1bW4gaW5kZXg6ICIgKyBjb2x1bW5JbmRleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi0KLQlzdGF0aWMgY2xhc3MgVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQlUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOwotCQl9Ci0KLQl9Ci0KLQotCWNsYXNzIFRhYmxlVGFibGVDZWxsTW9kaWZpZXIgaW1wbGVtZW50cyBJQ2VsbE1vZGlmaWVyIHsKLQotCQlUYWJsZVRhYmxlQ2VsbE1vZGlmaWVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gcHJvcGVydHkuZXF1YWxzKFRBQkxFX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTW0VOVElUWV9OQU1FX0NPTFVNTl9JTkRFWF0pOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlpZiAocHJvcGVydHkuZXF1YWxzKFRBQkxFX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTW0VOVElUWV9OQU1FX0NPTFVNTl9JTkRFWF0pKSB7Ci0JCQkJcmV0dXJuIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlLnRoaXMuZ2V0RW50aXR5TmFtZSgoVGFibGUpIGVsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotCQkJCWVsZW1lbnQ9ICgoVGFibGVJdGVtKSBlbGVtZW50KS5nZXREYXRhKCk7Ci0JCQl9Ci0JCQlpZiAoICEgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlUYWJsZSB0YWJsZSA9IChUYWJsZSkgZWxlbWVudDsKLQotCQkJYm9vbGVhbiBjaGFuZ2VkID0gdHJ1ZTsKLQkJCWlmIChwcm9wZXJ0eS5lcXVhbHMoVEFCTEVfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVNbRU5USVRZX05BTUVfQ09MVU1OX0lOREVYXSkpIHsKLQkJCQljaGFuZ2VkID0gR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UudGhpcy5zZXRFbnRpdHlOYW1lKHRhYmxlLCAoU3RyaW5nKSB2YWx1ZSk7Ci0JCQl9Ci0JCQlpZiAoY2hhbmdlZCkgewotCQkJCUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlLnRoaXMudGFibGVUYWJsZS51cGRhdGUodGFibGUsIG5ldyBTdHJpbmdbXSB7IHByb3BlcnR5IH0pOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRXaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYUZhY2V0V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGY4OGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbC5EVFBVaVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByZWZzLkpwYVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5Nb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuRGF0YU1vZGVsRmFjZXRJbnN0YWxsUGFnZTsKLQotcHVibGljIGNsYXNzIEpwYUZhY2V0V2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbEZhY2V0SW5zdGFsbFBhZ2UKLQlpbXBsZW1lbnRzIEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcwotewotCXB1YmxpYyBKcGFGYWNldFdpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJqcHQuanBhLmZhY2V0Lmluc3RhbGwucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGVzY3JpcHRpb24pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSnB0VWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdFVpSWNvbnMuSlBBX1dJWl9CQU5ORVIpKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJbmV3IFBsYXRmb3JtR3JvdXAoY29tcG9zaXRlKTsKLQkJbmV3IENvbm5lY3Rpb25Hcm91cChjb21wb3NpdGUpOwotCQluZXcgQ2xhc3NwYXRoQ29uZmlnR3JvdXAoY29tcG9zaXRlKTsKLQkJbmV3IFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cChjb21wb3NpdGUpOwotCQluZXcgT3JtWG1sR3JvdXAoY29tcG9zaXRlKTsKLQotCQlzZXRVcFJ1bnRpbWVMaXN0ZW5lcigpOwotCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIEpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19KUEFfRkFDRVQpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFVwUnVudGltZUxpc3RlbmVyKCkgewotCSAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSB3YyA9ICggKE1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkKSBnZXRXaXphcmQoKSApLmdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKTsKLQkJLy8gbXVzdCBkbyBpdCBtYW51YWxseSB0aGUgZmlyc3QgdGltZQotCQltb2RlbC5zZXRQcm9wZXJ0eShSVU5USU1FLCB3Yy5nZXRQcmltYXJ5UnVudGltZSgpKTsKLQkJd2MuYWRkTGlzdGVuZXIoCi0JCQluZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkgewotCQkJCQltb2RlbC5zZXRQcm9wZXJ0eShSVU5USU1FLCB3Yy5nZXRQcmltYXJ5UnVudGltZSgpKTsKLQkJCQl9Ci0JCQl9LAotCQkJSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRAotCQkpOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5OT05FIHwgc3R5bGUpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JcHJpdmF0ZSBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgYm9vbGVhbiBmaWxsSG9yaXpvbnRhbCkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkOwotCQlpZiAoZmlsbEhvcml6b250YWwpIHsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQl9Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJUExBVEZPUk1fSUQsCi0JCQlDT05ORUNUSU9OLAotCQkJVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwKLQkJCVVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsCi0JCQlVU0VfU0VSVkVSX0pQQV9JTVBMRU1FTlRBVElPTiwKLQkJCUpQQV9MSUJSQVJZLAotCQkJRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMKLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKCEgc3VwZXIuaXNQYWdlQ29tcGxldGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIChtb2RlbC52YWxpZGF0ZSgpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgUGxhdGZvcm1Hcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBwbGF0Zm9ybUNvbWJvOwotCQkKLQkJCi0JCXB1YmxpYyBQbGF0Zm9ybUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSnBhSGVscENvbnRleHRJZHMuRElBTE9HX0pQQV9QTEFURk9STSk7Ci0KLQkJCXBsYXRmb3JtQ29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgMSwgdHJ1ZSk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHBsYXRmb3JtQ29tYm8sIFBMQVRGT1JNX0lELCBudWxsKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb25uZWN0aW9uR3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQ29tYm8gY29ubmVjdGlvbkNvbWJvOwotCQkKLQkJcHJpdmF0ZSBMaW5rIGNvbm5lY3Rpb25MaW5rOwotCQkKLQkJcHJpdmF0ZSBMaW5rIGNvbm5lY3RMaW5rOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBMYWJlbCBkZWZhdWx0U2NoZW1hTGFiZWw7Ci0JCQotCQlwcml2YXRlIGZpbmFsIENvbWJvIGRlZmF1bHRTY2hlbWFDb21ibzsKLQkJCi0JCQotCQlwdWJsaWMgQ29ubmVjdGlvbkdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGFiZWwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfREFUQUJBU0UpOwotCQkJCi0JCQljb25uZWN0aW9uQ29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgMywgdHJ1ZSk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKGNvbm5lY3Rpb25Db21ibywgQ09OTkVDVElPTiwgbnVsbCk7Ci0JCQljb25uZWN0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQl1cGRhdGVDb25uZWN0TGluaygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkKLQkJCWNvbm5lY3Rpb25MaW5rID0gbmV3IExpbmsoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWNvbm5lY3Rpb25MaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQljb25uZWN0aW9uTGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MaW5rKTsKLQkJCWNvbm5lY3Rpb25MaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJb3Blbk5ld0Nvbm5lY3Rpb25XaXphcmQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCQkKLQkJCWNvbm5lY3RMaW5rID0gbmV3IExpbmsoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWNvbm5lY3RMaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQljb25uZWN0TGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3RMaW5rKTsKLQkJCWNvbm5lY3RMaW5rLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY29ubmVjdExpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlvcGVuQ29ubmVjdGlvblByb2ZpbGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCi0JCQlvdmVycmlkZURlZmF1bHRTY2hlbWFCdXR0b24gPSBjcmVhdGVCdXR0b24oZ3JvdXAsIDMsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX292ZXJyaWRlRGVmYXVsdFNjaGVtYUxhYmVsLCBTV1QuQ0hFQ0spOwotCQkJb3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KG92ZXJyaWRlRGVmYXVsdFNjaGVtYUJ1dHRvbiwgVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgbnVsbCk7Ci0JCQkKLQkJCWRlZmF1bHRTY2hlbWFMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULkxFRlQpOwotCQkJZGVmYXVsdFNjaGVtYUxhYmVsLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdFNjaGVtYUxhYmVsKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlkZWZhdWx0U2NoZW1hTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkKLQkJCWRlZmF1bHRTY2hlbWFDb21ibyA9IGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oCi0JCQkJZGVmYXVsdFNjaGVtYUNvbWJvLCBVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCAKLQkJCQluZXcgQ29udHJvbFtdIHtkZWZhdWx0U2NoZW1hTGFiZWx9KTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIG9wZW5OZXdDb25uZWN0aW9uV2l6YXJkKCkgewotCQkJU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gRFRQVWlUb29scy5jcmVhdGVOZXdDb25uZWN0aW9uUHJvZmlsZSgpOwotCQkJaWYgKGNvbm5lY3Rpb25OYW1lICE9IG51bGwpIHsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShDT05ORUNUSU9OLCBjb25uZWN0aW9uTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBvcGVuQ29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IGdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCQlpZiAoY3AgIT0gbnVsbCkgewotCQkJCWNwLmNvbm5lY3QoKTsKLQkJCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoQ09OTkVDVElPTl9BQ1RJVkUsIGNwLmlzQWN0aXZlKCkpOwotCQkJCXVwZGF0ZUNvbm5lY3RMaW5rKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVDb25uZWN0TGluaygpIHsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCQkJY29ubmVjdExpbmsuc2V0RW5hYmxlZCgoY3AgIT0gbnVsbCkgJiYgY3AuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCQkvLyB3ZSBqdXN0IHVzZSB0aGUgY29ubmVjdGlvbiBwcm9maWxlIHRvIGxvZyBpbiwgc28gZ28gdGhlIHRoZSBkYiBwbHVnLWluCi0JCQlyZXR1cm4gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KENPTk5FQ1RJT04pKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGFzc3BhdGhDb25maWdHcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gdXNlU2VydmVyTGliQnV0dG9uOwotCi0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHNwZWNpZnlMaWJCdXR0b247Ci0KLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBqcGFMaWJDb21ibzsKLQotCQlwcml2YXRlIGZpbmFsIExpbmsganBhUHJlZnNMaW5rOwotCi0JCXByaXZhdGUgZmluYWwgTGluayB1c2VyTGlic0xpbms7Ci0JCQotCQkKLQkJcHVibGljIENsYXNzcGF0aENvbmZpZ0dyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9qcGFJbXBsZW1lbnRhdGlvbkxhYmVsKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBKcGFIZWxwQ29udGV4dElkcy5ORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX0NMQVNTUEFUSCk7Ci0JCQkKLQkJCXVzZVNlcnZlckxpYkJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMiwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfdXNlclNlcnZlckxpYkxhYmVsLCBTV1QuUkFESU8pOwotCQkJc3luY2hIZWxwZXIuc3luY2hSYWRpbyh1c2VTZXJ2ZXJMaWJCdXR0b24sIFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OLCBudWxsKTsKLQkJCQotCQkJc3BlY2lmeUxpYkJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2Vfc3BlY2lmeUxpYkxhYmVsLCBTV1QuUkFESU8pOwotCQkJc3luY2hIZWxwZXIuc3luY2hSYWRpbyhzcGVjaWZ5TGliQnV0dG9uLCBVU0VfVVNFUl9KUEFfTElCUkFSWSwgbnVsbCk7Ci0JCQkKLQkJCWpwYUxpYkNvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIDEsIHRydWUpOwotCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhqcGFMaWJDb21ibywgSlBBX0xJQlJBUlksIG51bGwpOwotCQkJCi0JCQlqcGFQcmVmc0xpbmsgPSBuZXcgTGluayhncm91cCwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJanBhUHJlZnNMaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlqcGFQcmVmc0xpbmsuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9qcGFQcmVmc0xpbmspOwotCQkJanBhUHJlZnNMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJcHJvbXB0VG9Db25maWdKcGFQcmVmcygpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJCQotCQkJdXNlckxpYnNMaW5rID0gbmV3IExpbmsoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCXVzZXJMaWJzTGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJdXNlckxpYnNMaW5rLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfdXNlckxpYnNMaW5rKTsKLQkJCXVzZXJMaWJzTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXByb21wdFRvQ29uZmlnVXNlckxpYnJhcmllcygpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHByb21wdFRvQ29uZmlnSnBhUHJlZnMoKSB7Ci0JCQlQcmVmZXJlbmNlRGlhbG9nIGRsZyA9Ci0JCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbigKLQkJCQkJZ2V0U2hlbGwoKSwKLQkJCQkJSnBhUHJlZmVyZW5jZVBhZ2UuSUQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7SnBhUHJlZmVyZW5jZVBhZ2UuSUR9LAotCQkJCQludWxsKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShKUEFfTElCUkFSWSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEpQQV9MSUJSQVJZLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHByb21wdFRvQ29uZmlnVXNlckxpYnJhcmllcygpIHsKLQkJCVByZWZlcmVuY2VEaWFsb2cgZGxnID0KLQkJCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKAotCQkJCQlnZXRTaGVsbCgpLAotCQkJCQlKYXZhVUkuSURfVVNFUl9MSUJSQVJZX1BSRUZFUkVOQ0VfUEFHRSwKLQkJCQkJbmV3IFN0cmluZ1tdIHtKYXZhVUkuSURfVVNFUl9MSUJSQVJZX1BSRUZFUkVOQ0VfUEFHRX0sCi0JCQkJCW51bGwpOwotCQkJZGxnLm9wZW4oKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEpQQV9MSUJSQVJZLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gZGlzY292ZXJDbGFzc2VzQnV0dG9uOwotCi0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGxpc3RDbGFzc2VzQnV0dG9uOwotCi0KLQkJcHVibGljIFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudExhYmVsKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9DTEFTU1BBVEgpOwotCQkJCi0JCQlkaXNjb3ZlckNsYXNzZXNCdXR0b24gPSBjcmVhdGVCdXR0b24oZ3JvdXAsIDEsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Rpc2NvdmVyQ2xhc3Nlc0J1dHRvbiwgU1dULlJBRElPKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoUmFkaW8oZGlzY292ZXJDbGFzc2VzQnV0dG9uLCBESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUywgbnVsbCk7Ci0JCQkKLQkJCWxpc3RDbGFzc2VzQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9saXN0Q2xhc3Nlc0J1dHRvbiwgU1dULlJBRElPKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoUmFkaW8obGlzdENsYXNzZXNCdXR0b24sIExJU1RfQU5OT1RBVEVEX0NMQVNTRVMsIG51bGwpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIE9ybVhtbEdyb3VwCi0JewotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBjcmVhdGVPcm1YbWxCdXR0b247Ci0KLQotCQlwdWJsaWMgT3JtWG1sR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSnBhSGVscENvbnRleHRJZHMuRElBTE9HX0NSRUFURV9PUk0pOwotCi0JCQljcmVhdGVPcm1YbWxCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQkJY3JlYXRlT3JtWG1sQnV0dG9uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY3JlYXRlT3JtWG1sQnV0dG9uKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goY3JlYXRlT3JtWG1sQnV0dG9uLCBDUkVBVEVfT1JNX1hNTCwgbnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL05ld0pwYVByb2plY3RGaXJzdFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvTmV3SnBhUHJvamVjdEZpcnN0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzdhMmM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvTmV3SnBhUHJvamVjdEZpcnN0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuVXRpbGl0eVByb2plY3RGaXJzdFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmV3SnBhUHJvamVjdEZpcnN0UGFnZSBleHRlbmRzIFV0aWxpdHlQcm9qZWN0Rmlyc3RQYWdlIAotewotCXB1YmxpYyBOZXdKcGFQcm9qZWN0Rmlyc3RQYWdlKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIoZGF0YU1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEpwdFVpTWVzc2FnZXMuTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihKcHRVaU1lc3NhZ2VzLk5ld0pwYVByb2plY3RXaXphcmRfZmlyc3RQYWdlX2Rlc2NyaXB0aW9uKTsKLQkJc2V0SW5mb3BvcElEKEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdKcGFQcm9qZWN0V2l6YXJkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL05ld0pwYVByb2plY3RXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkMzQ5NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL05ld0pwYVByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuVXRpbGl0eVByb2plY3RXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgTmV3SnBhUHJvamVjdFdpemFyZCBleHRlbmRzIFV0aWxpdHlQcm9qZWN0V2l6YXJkIHsKLQotCXB1YmxpYyBOZXdKcGFQcm9qZWN0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShKcHRVaU1lc3NhZ2VzLk5ld0pwYVByb2plY3RXaXphcmRfdGl0bGUpOwotCX0KLQotCXB1YmxpYyBOZXdKcGFQcm9qZWN0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShKcHRVaU1lc3NhZ2VzLk5ld0pwYVByb2plY3RXaXphcmRfdGl0bGUpOwotCX0KLQkKLQkvLyBUT0RPIC0gd2hlbiB3ZSBoYXZlIGEgZGF0YSBtb2RlbCB0byBhZGQKLS8vCXByb3RlY3RlZCBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbCgpIHsKLS8vCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLS8vCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdFVpSWNvbnMuSlBBX1dJWl9CQU5ORVIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSgianB0LmpwYS50ZW1wbGF0ZSIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVdpemFyZFBhZ2UgY3JlYXRlRmlyc3RQYWdlKCkgewotCQlyZXR1cm4gbmV3IE5ld0pwYVByb2plY3RGaXJzdFBhZ2UobW9kZWwsICJmaXJzdC5wYWdlIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpwdC51aS5qcGFQZXJzcGVjdGl2ZSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5Q2xhc3NXaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlDbGFzc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhN2VhNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlDbGFzc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERpbWl0ZXIgRGltaXRyb3YsIGQuZGltaXRyb3ZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLk5ld0phdmFDbGFzc1dpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5Q2xhc3NXaXphcmRQYWdlIGV4dGVuZHMgTmV3SmF2YUNsYXNzV2l6YXJkUGFnZXsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfRkFDRVQgPSAianB0LmpwYSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRVhURU5TSU9OID0gIi54bWwiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MID0gInBlcnNpc3RlbmNlLnhtbCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX0lORiA9ICJNRVRBLUlORiI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNMQVNIID0gJy8nOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9UQUJMRSA9ICJTSU5HTEVfVEFCTEUiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfUEVSX0NMQVNTID0gIlRBQkxFX1BFUl9DTEFTUyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lORUQgPSAiSk9JTkVEIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSU5IRVJJVEFOQ0VfU1RSQVRFR0lFUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkJCUVNUFRZLCAKLQkJCQkJCQkJCQkJU0lOR0xFX1RBQkxFLAotCQkJCQkJCQkJCQlUQUJMRV9QRVJfQ0xBU1MsCi0JCQkJCQkJCQkJCUpPSU5FRCB9OwotCXByaXZhdGUgQ29tYm8gaW5oZXJpdGFuY2VTdHJhdGVneUNvbWJvOwotCXByaXZhdGUgQnV0dG9uIGVudGl0eUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBtYXBlZEFzU3VwZXJjbGFzc0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBpbmhlcml0YW5jZUJ1dHRvbjsKLQlwcml2YXRlIExhYmVsIGRpc3BsYXlOYW1lTGFiZWw7Ci0JcHJpdmF0ZSBCdXR0b24geG1sU3VwcG9ydEJ1dHRvbjsJCi0JcHJpdmF0ZSBib29sZWFuIGlzRmlyc3RDaGVjayA9IHRydWU7Ci0JcHJpdmF0ZSBUZXh0IG9ybVhtbE5hbWU7Ci0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwkKLQkKLQlwdWJsaWMgRW50aXR5Q2xhc3NXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwKLQkJCVN0cmluZyBwYWdlRGVzYywgU3RyaW5nIHBhZ2VUaXRsZSwgU3RyaW5nIG1vZHVsZVR5cGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBwYWdlRGVzYywgcGFnZVRpdGxlLCBtb2R1bGVUeXBlKTsKLQl9Ci0KLQkvKiBDcmVhdGUgdG9wIGxldmVsIGNvbXBvc2l0ZSAoY2xhc3MgcHJvcGVydGllcykgYW5kIGFkZCB0aGUgZW50aXR5J3Mgc3BlY2lmaWMgaW5oZXJpdGFuY2UgZ3JvdXAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5OZXdKYXZhQ2xhc3NXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNyZWF0ZUluaGVyaXRhbmNlQ29udHJvbChjb21wb3NpdGUpOwotCQlpbmhlcml0YW5jZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gaXNDaGVja2VkID0gaW5oZXJpdGFuY2VCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGlzQ2hlY2tlZCkgewotCQkJCQllbnRpdHlCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQltYXBlZEFzU3VwZXJjbGFzc0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCX0KLQkJCQlpbmhlcml0YW5jZVN0cmF0ZWd5Q29tYm8uc2V0RW5hYmxlZChpc0NoZWNrZWQpOwotCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFksIHRydWUpOwotCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5NQVBQRURfQVNfU1VQRVJDTEFTUywgZmFsc2UpOwkJCQkKLQkJCQllbnRpdHlCdXR0b24uc2V0RW5hYmxlZCghaXNDaGVja2VkKTsKLQkJCQltYXBlZEFzU3VwZXJjbGFzc0J1dHRvbi5zZXRFbmFibGVkKCFpc0NoZWNrZWQpOwkJCQkKLQkJCX0KLQkJfSk7CQkKLQkJY3JlYXRlWE1Mc3RvcmFnZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJeG1sU3VwcG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gaXNDaGVja2VkID0geG1sU3VwcG9ydEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCQlvcm1YbWxOYW1lLnNldEVuYWJsZWQoaXNDaGVja2VkKTsJCi0JCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoaXNDaGVja2VkKTsKLQkJCQlpZiAoaXNGaXJzdENoZWNrKSB7Ci0JCQkJCW9ybVhtbE5hbWUuc2V0VGV4dChKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQkJCQlpc0ZpcnN0Q2hlY2sgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJLy9EaXNhYmxlIHRoZSBjaG9vc2UgYWx0ZXJuYXRpdmUgWE1MIDogc2VlIGVuaGFuY2VtZW50IHJlcXVlc3QgMTUyNDYxCi0JCQkJLy9UaGUgY3JlYXRpb24gb2YgYWx0ZXJuYXRpdmUgbWFwcGluZyBpcyBwcm9ibGVtYXRpYyAKLQkJCQlkaXNhYmxlTWFwcGluZ1hNTENob29zZUdyb3VwKCk7Ci0JCQl9Ci0JCX0pOwkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW5oZXJpdGFuY2UgZ3JvdXAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVJbmhlcml0YW5jZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgRW50aXR5V2l6YXJkTXNnLklOSEVSSVRBTkNFX0dST1VQKTsKLQkJZW50aXR5QnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oZ3JvdXAsIEVudGl0eVdpemFyZE1zZy5FTlRJVFksIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWSk7Ci0JCW1hcGVkQXNTdXBlcmNsYXNzQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oZ3JvdXAsIEVudGl0eVdpemFyZE1zZy5NQVBQRURfQVNfU1VQRVJDTEFTUywgSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuTUFQUEVEX0FTX1NVUEVSQ0xBU1MpOwotCQlpbmhlcml0YW5jZUJ1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKGdyb3VwLCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwsIDEvKmhvcml6b250YWwgc3BhbiovLCBFbnRpdHlXaXphcmRNc2cuSU5IRVJJVEFOQ0VfQ0hFQ0tfQk9YLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5JTkhFUklUQU5DRSk7Ci0JCWNyZWF0ZUNvbWJvQm94KGdyb3VwLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5JTkhFUklUQU5DRV9TVFJBVEVHWSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZ3JvdXAsIHdoaWNoIG1hbmFnZSBlbnRpdHkgbWFwcGluZyByZWdpc3RyYXRpb24KLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVYTUxzdG9yYWdlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCBFbnRpdHlXaXphcmRNc2cuWE1MX1NUT1JBR0VfR1JPVVApOwotCQl4bWxTdXBwb3J0QnV0dG9uID0gY3JlYXRlQ2hlY2tCdXR0b24oZ3JvdXAsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgMy8qaG9yaXpvbnRhbCBzcGFuKi8sIEVudGl0eVdpemFyZE1zZy5YTUxfU1VQUE9SVCwgSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX1NVUFBPUlQpOwkJCQkKLQkJY3JlYXRlQnJvd3NlR3JvdXAoZ3JvdXAsIEVudGl0eVdpemFyZE1zZy5DSE9PU0VfWE1MLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5YTUxfTkFNRSk7Ci0JCW9ybVhtbE5hbWUuc2V0RW5hYmxlZChmYWxzZSk7CQkKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQgdGhlIG5hbWUvdGl0bGUgb2YgdGhlIGdyb3VwCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBncm91cAotCSAqLwotCXByaXZhdGUgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7CQkKLQkJR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncm91cEdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShncm91cEdyaWREYXRhKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWdyb3VwLnNldFRleHQodGV4dCk7CQkKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgcmFkaW8gYnV0dG9uCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUgLSBpbmhlcml0YW5jZSBncm91cAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSByZWxhdGVkIHByb3BlcnR5IHRvIHdoaWNoIHRoaXMgYnV0dG9uIHdpbGwgYmUgc3luY2hyb25pemVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBidXR0b24KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsJCQotCQlHcmlkRGF0YSBncm91cEdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyb3VwR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShncm91cEdyaWREYXRhKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoUmFkaW8oYnV0dG9uLCBwcm9wZXJ0eSwgLypkZXBlbmRlbnRDb250cm9scyovIG51bGwpOwkJCi0JCXJldHVybiBidXR0b247Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBjaGVjayBidXR0b24KLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZSAtIGluaGVyaXRhbmNlIGdyb3VwCi0JICogQHBhcmFtIHRleHQgdGhlIGxhYmVsIG9mIHRoZSBidXR0b24KLQkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHJlbGF0ZWQgcHJvcGVydHkgdG8gd2hpY2ggdGhpcyBidXR0b24gd2lsbCBiZSBzeW5jaHJvbml6ZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGJ1dHRvbgotCSAqLwotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUNoZWNrQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBmaWxsU3RyYXRlZ3ksIGludCBob3Jpem9udGFsU3BhbiwgU3RyaW5nIHRleHQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7CQkKLQkJR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShmaWxsU3RyYXRlZ3kpOwotCQlncm91cEdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyb3VwR3JpZERhdGEpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsJCQotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGJ1dHRvbiwgcHJvcGVydHksIC8qZGVwZW5kZW50Q29udHJvbHMqLyBudWxsKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgY29tYm8gYm94LCB3aGljaCBwcmVzZW50cyB0aGUgc2V0IG9mIHBvc3NpYmxlIGluaGVyaXRhbmNlIHN0cmF0ZWdpZXMKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZSAtIGluaGVyaXRhbmNlIGdyb3VwCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSByZWxhdGVkIHByb3BlcnR5IHRvIHdoaWNoIHRoaXMgYnV0dG9uIHdpbGwgYmUgc3luY2hyb25pemVkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29tYm8gY3JlYXRlQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWluaGVyaXRhbmNlU3RyYXRlZ3lDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwkJCi0JCWdyb3VwR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlpbmhlcml0YW5jZVN0cmF0ZWd5Q29tYm8uc2V0TGF5b3V0RGF0YShncm91cEdyaWREYXRhKTsKLQkJaW5oZXJpdGFuY2VTdHJhdGVneUNvbWJvLnNldEl0ZW1zKElOSEVSSVRBTkNFX1NUUkFURUdJRVMpOwkJCi0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oaW5oZXJpdGFuY2VTdHJhdGVneUNvbWJvLCBwcm9wZXJ0eSwgLypkZXBlbmRlbnRDb250cm9scyovIG51bGwpOwotCQlpbmhlcml0YW5jZVN0cmF0ZWd5Q29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJldHVybiBpbmhlcml0YW5jZVN0cmF0ZWd5Q29tYm87CQkKLQkJCi0JfQkKLQkKLQkvKioKLQkgKiBDcmVhdGUgWE1MIGdyb3VwCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gbGFiZWwgdGhlIG5hbWUgb2YgdGhlIGdyb3VwCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSByZWxhdGVkIHByb3BlcnR5IHRvIHdoaWNoIHRoaXMgZ3JvdXAgd2lsbCBiZSBzeW5jaHJvbml6ZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGdyb3VwCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJyb3dzZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsJCi0JCWRpc3BsYXlOYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWRpc3BsYXlOYW1lTGFiZWwuc2V0VGV4dChsYWJlbCk7Ci0JCWRpc3BsYXlOYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJb3JtWG1sTmFtZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlvcm1YbWxOYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuQlJPV1NFX0JVVFRPTl9MQUJFTCk7Ci0JCUdyaWREYXRhIGJyb3dzZUJ1dHRvbkRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJYnJvd3NlQnV0dG9uRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJyb3dzZUJ1dHRvbkRhdGEpOwkJCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQ2hvb3NlWG1sQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIERvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChvcm1YbWxOYW1lLCBwcm9wZXJ0eSwgLypkZXBlbmRlbnRDb250cm9scyovbnVsbCk7Ci0JCW9ybVhtbE5hbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCS8vRGlzYWJsZSB0aGUgY2hvb3NlIGFsdGVybmF0aXZlIFhNTCA6IHNlZSBlbmhhbmNlbWVudCByZXF1ZXN0IDE1MjQ2MQotCQkvL1RoZSBjcmVhdGlvbiBvZiBhbHRlcm5hdGl2ZSBtYXBwaW5nIGlzIHByb2JsZW1hdGljCi0JCWRpc2FibGVNYXBwaW5nWE1MQ2hvb3NlR3JvdXAoKTsJCQotCX0KLQkKLQkvKioKLQkgKiBQcm9jZXNzIGJyb3dzaW5nIHdoZW4gdGhlIEJyb3dzZS4uLiBidXR0b24gaGF2ZSBiZWVuIHByZXNzZWQuIEFsbG93IGNob29zaW5nIG9mIAotCSAqIFhNTCBmb3IgZW50aXR5IG1hcHBpbmcgcmVnaXN0cmF0aW9uCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDaG9vc2VYbWxCdXR0b25QcmVzc2VkKCkgewkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXREaWFsb2dTZWxlY3Rpb25WYWxpZGF0b3IoKTsJCQotCQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gZ2V0RGlhbG9nVmlld2VyRmlsdGVyKCk7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpKTsKLQkJU2VsZWN0TWFwcGluZ1hNTERpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0TWFwcGluZ1hNTERpYWxvZyhnZXRTaGVsbCgpLCBsYWJlbFByb3ZpZGVyLCBjb250ZW50UHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCWRpYWxvZy5zZXRUaXRsZShFbnRpdHlXaXphcmRNc2cuTUFQUElOR19YTUxfVElUTEUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShFbnRpdHlXaXphcmRNc2cuQ0hPT1NFX01BUFBJTkdfWE1MX01FU1NBR0UpOwotCQlkaWFsb2cuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCQkJCi0JCUlGaWxlIHJvb3RGb2xkZXIgPSBwcm9qZWN0LmdldEZpbGUoSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U291cmNlQ29udGFpbmVycyhwcm9qZWN0KVswXS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSArIFNMQVNIICsgb3JtWG1sTmFtZS5nZXRUZXh0KCkudHJpbSgpKTsvL1RPRE8gCi0JCWRpYWxvZy5zZXRJbnB1dChKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRNYW5pZmVzdEZpbGUocHJvamVjdCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkpOwotCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpCi0JCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihyb290Rm9sZGVyKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlvcm1YbWxOYW1lLnNldFRleHQoZGlhbG9nLmdldENob3Nlbk5hbWUoKSk7Ci0JCQltb2RlbC52YWxpZGF0ZVByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FKTsKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBleHRlbmRlZCBieSBzdWJjbGFzc2VzLCBhcyBpdCBkb2VzIHNvbWUgYmFzaWMgdmFsaWRhdGlvbi4gCi0JICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgdGhlIFNlbGVjdGlvbiB2YWxpZGF0b3IgZm9yIHRoZSBTZWxlY3RNYXBwaW5nWE1MRGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgZ2V0RGlhbG9nU2VsZWN0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uWzBdICE9IG51bGwgJiYgIShzZWxlY3Rpb25bMF0gaW5zdGFuY2VvZiBJUHJvamVjdCkpCi0JCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoRW50aXR5V2l6YXJkTXNnLklOQ09SUkVDVF9YTUxfTkFNRSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNyZWF0ZSBmaWx0ZXIgZm9yIHRoZSBicm93c2UvYWRkIGFsdGVybmF0aXZlIG1hcHBpbmcgWE1MIAotCSAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIHZpZXdlciBmaWx0ZXIgZm9yIHRoZSBTZWxlY3RNYXBwaW5nWE1MRGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBnZXREaWFsb2dWaWV3ZXJGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVCk7Ci0JCQkJCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpZWxlbWVudDsKLQkJCQkJaWYgKGZvbGRlci5jb250YWlucyhKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRNYW5pZmVzdEZpbGUocHJvamVjdCkpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgZWxlbWVudDsKLQkJCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKFhNTF9FWFRFTlNJT04pICYmICFmaWxlLmdldE5hbWUoKS5lcXVhbHMoUEVSU0lTVEVOQ0VfWE1MKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzYWJsZU1hcHBpbmdYTUxDaG9vc2VHcm91cCgpIHsKLQkJLy9EaXNhYmxlIHRoZSBjaG9vc2UgYWx0ZXJuYXRpdmUgWE1MIDogc2VlIGVuaGFuY2VtZW50IHJlcXVlc3QgMTUyNDYxCi0JCS8vVGhlIGNyZWF0aW9uIG9mIGFsdGVybmF0aXZlIG1hcHBpbmcgaXMgcHJvYmxlbWF0aWMKLQkJZGlzcGxheU5hbWVMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJb3JtWG1sTmFtZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHByb2plY3QgbGlzdCBpbml0aWFsaXplci4gVGhlIG1ldGhvZCBjaGVja3MgCi0JICogaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIHZhbGlkIHRvIGluY2x1ZGUgaXQgaW4gdGhlIHByb2plY3QgbGlzdC4KLQkgKiAKLQkgKiA8cD5TdWJjbGFzc2VzIG9mIHRoaXMgd2l6YXJkIHBhZ2Ugc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIAotCSAqIGFkanVzdCBmaWx0ZXJpbmcgb2YgdGhlIHByb2plY3RzIHRvIHRoZWlyIG5lZWRzLiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QgcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0IHRvIGJlIGNoZWNrZWQKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGlzIHZhbGlkIHRvIGJlIGluY2x1ZGVkIGluIAotCSAqIAkJICAgdGhlIHByb2plY3QgbGlzdCwgPGNvZGU+ZmFsc2U8L2NvZGU+IC0gb3RoZXJ3aXNlLiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Byb2plY3RWYWxpZChJUHJvamVjdCBwcm9qZWN0KSB7CQkKLQkJSVByb2plY3RGYWNldCBqcGFGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChKUEFfRkFDRVQpOwotCQlJRmFjZXRlZFByb2plY3QgZlByb2plY3QgPSBudWxsOyAKLQkJdHJ5IHsKLQkJCWZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCi0JCXJldHVybiAocHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJiBmUHJvamVjdCAhPSBudWxsICYmIGZQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChqcGFGYWNldCkpOwkKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBTZWxlY3RNYXBwaW5nWE1MRGlhbG9nIGV4dGVuZHMgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2d7Ci0JCQotCQlwcml2YXRlIFRleHQgbmV3WG1sTmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmcgeG1sTmFtZSA9IEVNUFRZOwotCQlwcml2YXRlIElTdGF0dXMgY3VycmVudFN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUGxhdGZvcm1VSS5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIEVNUFRZLCBudWxsKTsKLQkJCi0JCXB1YmxpYyBTZWxlY3RNYXBwaW5nWE1MRGlhbG9nKFNoZWxsIHBhcmVudCwgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihwYXJlbnQsIGxhYmVsUHJvdmlkZXIsIGNvbnRlbnRQcm92aWRlcik7CQkJCi0JCX0JCQotCQkKLQkgICAgLyoKLQkgICAgICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUpCi0JICAgICAqLwotCSAgICBAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JICAgIAlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CSAgICAJCi0JCQlMYWJlbCBmaWxlTmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQkJZmlsZU5hbWVMYWJlbC5zZXRUZXh0KEVudGl0eVdpemFyZE1zZy5YTUxfTkFNRV9USVRMRSk7Ci0JCQlmaWxlTmFtZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQluZXdYbWxOYW1lID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQluZXdYbWxOYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwkJCQotCQkJbmV3WG1sTmFtZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7CQkJCQkKLQkJCQkJc3VwZXIua2V5UmVsZWFzZWQoZSk7CQkJCQkKLQkJCQkJeG1sTmFtZSA9IG5ld1htbE5hbWUuZ2V0VGV4dCgpOwotCQkJCQlUcmVlU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChUcmVlU2VsZWN0aW9uKWdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsJCi0JCQkJCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSlzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCWlmIChzZWxlY3RlZFJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCWdldFRyZWVWaWV3ZXIoKS5zZXRTZWxlY3Rpb24obmV3IFRyZWVTZWxlY3Rpb24obmV3IFRyZWVQYXRoKGdldFNlZ21lbnRzKHNlbGVjdGVkUmVzb3VyY2UuZ2V0UGFyZW50KCkpKSkpOwotCQkJCQl9Ci0JCQkJCXVwZGF0ZU9LU3RhdHVzKCk7Ci0JCQkJfQotCQkJCQotCQkJfSk7CQkJCi0JICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotCSAgICB9CQkKLQkgICAgCi0JICAgIC8qKgotCSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhbHRlcm5hdGl2ZSBtYXBwaW5nIFhNTAotCSAgICAgKi8KLQkgICAgcHVibGljIFN0cmluZyBnZXRDaG9zZW5OYW1lKCkgewotCSAgICAJU3RyaW5nIHJlc3VsdCA9IEVNUFRZOwotCQkJT2JqZWN0IGVsZW1lbnQgPSBnZXRGaXJzdFJlc3VsdCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgZWxlbWVudDsKLQkJCQlyZXN1bHQgPSBjb250YWluZXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgeG1sTmFtZTsJCQkJCQotCQkJfSBlbHNlIHsKLQkJCQlJRmlsZSBmID0gKElGaWxlKSBlbGVtZW50OwotCQkJCXJlc3VsdCA9IGYuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSByZW1vdmVSZWR1bmRhbnRTZWdtZW50RnJvbU5hbWUocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JICAgIH0KLQotCQlAT3ZlcnJpZGUKLQkgICAgLyoKLQkgICAgICogQHNlZSBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyN1cGRhdGVPS1N0YXR1cyhDb21wb3NpdGUpCi0JICAgICAqLwotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPS1N0YXR1cygpIHsKLQkJCXN1cGVyLnVwZGF0ZU9LU3RhdHVzKCk7Ci0JCQlUcmVlU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChUcmVlU2VsZWN0aW9uKWdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsJCi0JCQlJUmVzb3VyY2Ugc2VsZWN0ZWRSZXNvdXJjZSA9IChJUmVzb3VyY2Upc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGVkUmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpc2VsZWN0ZWRSZXNvdXJjZTsKLQkJCQl4bWxOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCQkJbmV3WG1sTmFtZS5zZXRUZXh0KHhtbE5hbWUpOwkJCQkJCQkJCQkJCQotCQkJCWN1cnJlbnRTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBsYXRmb3JtVUkuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBFTVBUWSwgbnVsbCk7CQkJCQotCQkJfQotCQkJaWYgKCF4bWxOYW1lLmVuZHNXaXRoKFhNTF9FWFRFTlNJT04pKSB7Ci0JCQkJY3VycmVudFN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUGxhdGZvcm1VSS5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIEVudGl0eVdpemFyZE1zZy5JTkNPUlJFQ1RfWE1MX05BTUUsIG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQljdXJyZW50U3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQbGF0Zm9ybVVJLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgRU1QVFksIG51bGwpOwotCQkJfQkJCi0JCQl1cGRhdGVTdGF0dXMoY3VycmVudFN0YXR1cyk7CSAgICAKLQkJfQotCQkKLQkJLyoqIAotCQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgcHVycG9zZXMgb25seQotCQkgKiBAcGFyYW0gaW5wdXQgbm9uIGZvcm1hdGVkIHBhdGggdG8gdGhlIG1hcHBpbmcgWE1MCi0JCSAqIEByZXR1cm4gdGhlIGZvcm1hdGVkIHBhdGggdG8gdGhlIG1hcHBpbmcgWE1MCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyByZW1vdmVSZWR1bmRhbnRTZWdtZW50RnJvbU5hbWUoU3RyaW5nIGlucHV0KSB7Ci0JCQlTdHJpbmcgb3V0cHV0ID0gaW5wdXQuc3Vic3RyaW5nKGlucHV0LmluZGV4T2YoTUVUQV9JTkYpKTsJCQkgCi0JCQlvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsIFNMQVNIKTsKLQkJCXJldHVybiBvdXRwdXQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgcHVycG9zZXMgb25seS4gSXQgaXMgaW50ZW5kZWQgdG8gY3JlYXRlIGNvcnJlY3QKLQkJICogc2VsZWN0aW9uIG9mIHRoZSByZXNvdXJjZSByZXNvdXJjZQotCQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkJICogQHJldHVybiB0aGUgc2VnbWVudHMgb2YgdGhlIHJlc291cmNlCi0JCSAqLwotCQlwcml2YXRlIE9iamVjdFtdIGdldFNlZ21lbnRzKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJT2JqZWN0W10gc2VnbWVudHMgPSBuZXcgT2JqZWN0W3Jlc291cmNlLmdldEZ1bGxQYXRoKCkuc2VnbWVudHMoKS5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IHNlZ21lbnRzLmxlbmd0aCAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJc2VnbWVudHNbaV0gPSByZXNvdXJjZTsKLQkJCQlyZXNvdXJjZSA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQkJfQotCQkJcmV0dXJuIHNlZ21lbnRzOwotCQl9CSAgICAKLQl9CQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5RmllbGRzV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5RmllbGRzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2YzMDFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eUZpZWxkc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERpbWl0ZXIgRGltaXRyb3YsIGQuZGltaXRyb3ZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC5JRW50aXR5RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotcHVibGljIGNsYXNzIEVudGl0eUZpZWxkc1dpemFyZFBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgVGV4dCBlbnRpdHlOYW1lVGV4dDsKLQlwcml2YXRlIFRleHQgdGFibGVOYW1lVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiB0YWJsZU5hbWVDaGVja0J1dHRvbjsJCi0JcHJpdmF0ZSBCdXR0b24gZmllbGRBY2Nlc3NCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcHJvcGVydHlBY2Nlc3NCdXR0b247Ci0JcHJpdmF0ZSBib29sZWFuIGlzTm9uRW50aXR5ID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNCdXR0b25zQ3JlYXRlZCA9IGZhbHNlOwotCi0JcHVibGljIEVudGl0eUZpZWxkc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldERlc2NyaXB0aW9uKEVudGl0eVdpemFyZE1zZy5BRERfRU5USVRZX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OKTsKLQkJdGhpcy5zZXRUaXRsZShFbnRpdHlXaXphcmRNc2cuRU5USVRZX1BST1BFUlRJRVNfVElUTEUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfRklFTERTfTsKLQl9Ci0JCi0JLyogQ3JlYXRlIHRoZSBtYWluIGNvbXBvc2l0ZSBhbmQgYWRkIHRvIGl0IHRoZSBlbnRpdHkgcHJvcGVydGllcwotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDQ1MDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNvbXBvc2l0ZS5wYWNrKCk7Ci0JCQkJCi0JCWVudGl0eU5hbWVUZXh0ID0gY3JlYXRlTmFtZUdyb3VwKGNvbXBvc2l0ZSwgRW50aXR5V2l6YXJkTXNnLkVOVElUWV9OQU1FLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfTkFNRSk7CQkKLQkJR3JvdXAgZ3JvdXAgPSBjcmVhdGVHcm91cChjb21wb3NpdGUsIEVudGl0eVdpemFyZE1zZy5UQUJMRV9OQU1FX0dST1VQKTsKLQkJdGFibGVOYW1lQ2hlY2tCdXR0b249IGNyZWF0ZUNoZWNrQnV0dG9uKGdyb3VwLCBFbnRpdHlXaXphcmRNc2cuVVNFX0RFRkFVTFQsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBQkxFX05BTUVfREVGQVVMVCk7CQkKLQkJdGFibGVOYW1lVGV4dCA9IGNyZWF0ZU5hbWVHcm91cChncm91cCwgRW50aXR5V2l6YXJkTXNnLlRBQkxFX05BTUUsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBQkxFX05BTUUpOwotCQl0YWJsZU5hbWVUZXh0LnNldEVuYWJsZWQoIXRhYmxlTmFtZUNoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJaXNCdXR0b25zQ3JlYXRlZCA9IHRydWU7Ci0JCWluaXROYW1lR3JvdXAoKTsKLQkJRW50aXR5Um93VGFibGVXaXphcmRTZWN0aW9uIGluaXRTZWN0aW9uID0gbmV3IEVudGl0eVJvd1RhYmxlV2l6YXJkU2VjdGlvbihjb21wb3NpdGUsIG1vZGVsLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfRklFTERTKTsKLQotCQlHcm91cCBhY2Nlc3NUeXBlR3JvdXAgPSBjcmVhdGVHcm91cChjb21wb3NpdGUsIEVudGl0eVdpemFyZE1zZy5BQ0NFU1NfVFlQRSk7Ci0JCWZpZWxkQWNjZXNzQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oYWNjZXNzVHlwZUdyb3VwLCBFbnRpdHlXaXphcmRNc2cuRklFTERfQkFTRUQsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkZJRUxEX0FDQ0VTU19UWVBFKTsKLQkJcHJvcGVydHlBY2Nlc3NCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihhY2Nlc3NUeXBlR3JvdXAsIEVudGl0eVdpemFyZE1zZy5QUk9QRVJUWV9CQVNFRCwgSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuUFJPUEVSVFlfQUNDRVNTX1RZUEUpOwotCQkKLQkJCi0JCUlTdGF0dXMgcHJvamVjdFN0YXR1cyA9IHZhbGlkYXRlUHJvamVjdE5hbWUoKTsKLQkJaWYgKCFwcm9qZWN0U3RhdHVzLmlzT0soKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKHByb2plY3RTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCWNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBwcm9qZWN0IG5hbWUgY29ycmVjdG5lc3MKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVByb2plY3ROYW1lKCkgewotCQkvLyBjaGVjayBmb3IgZW1wdHkKLQkJaWYgKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkgPT0gbnVsbCB8fCBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKEVudGl0eVdpemFyZE1zZy5OT19KUEFfUFJPSkVDVFMpOwotCQl9Ci0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBuYW1lZCBncm91cAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGxhYmVsIHRoZSBuYW1lIG9mIHRoZSBncm91cAotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcmVsYXRlZCBwcm9wZXJ0eSB0byB3aGljaCB0aGlzIGdyb3VwIHdpbGwgYmUgc3luY2hyb25pemVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBncm91cAotCSAqLwotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZU5hbWVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CQotCQlMYWJlbCBkaXNwbGF5TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlkaXNwbGF5TmFtZUxhYmVsLnNldFRleHQobGFiZWwpOwotCQlkaXNwbGF5TmFtZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCVRleHQgbmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChuYW1lVGV4dCwgcHJvcGVydHksIC8qZGVwZW5kZW50Q29udHJvbHMqL251bGwpOwkJCi0JCXJldHVybiBuYW1lVGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGdyb3VwCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dCB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAJIAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZ3JvdXAKLQkgKi8JCi0JcHJpdmF0ZSBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsJCQotCQlHcmlkRGF0YSBncm91cEdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyb3VwR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdyb3VwR3JpZERhdGEpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJZ3JvdXAuc2V0VGV4dCh0ZXh0KTsJCQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBjaGVjayBidXR0b24KLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZSAtIGluaGVyaXRhbmNlIGdyb3VwCi0JICogQHBhcmFtIHRleHQgdGhlIGxhYmVsIG9mIHRoZSBidXR0b24KLQkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHJlbGF0ZWQgcHJvcGVydHkgdG8gd2hpY2ggdGhpcyBidXR0b24gd2lsbCBiZSBzeW5jaHJvbml6ZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGJ1dHRvbgotCSAqLwkKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVDaGVja0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncm91cEdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JvdXBHcmlkRGF0YSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlib29sZWFuIGlzQ2hlY2tlZCA9IGJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAodGFibGVOYW1lVGV4dCAhPSBudWxsKSB7Ci0JCQkJCXRhYmxlTmFtZVRleHQuc2V0RW5hYmxlZCghaXNDaGVja2VkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwkJCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goYnV0dG9uLCBwcm9wZXJ0eSwgLypkZXBlbmRlbnRDb250cm9scyovIG51bGwpOwkJCi0JCXJldHVybiBidXR0b247Ci0JfQkJCi0JCi0JLyoqCi0JICogQ3JlYXRlIHJhZGlvIGJ1dHRvbgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlIC0gaW5oZXJpdGFuY2UgZ3JvdXAKLQkgKiBAcGFyYW0gdGV4dCB0aGUgbGFiZWwgb2YgdGhlIGJ1dHRvbgotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcmVsYXRlZCBwcm9wZXJ0eSB0byB3aGljaCB0aGlzIGJ1dHRvbiB3aWxsIGJlIHN5bmNocm9uaXplZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgYnV0dG9uCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7CQkKLQkJR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncm91cEdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JvdXBHcmlkRGF0YSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGJ1dHRvbiwgcHJvcGVydHksIC8qZGVwZW5kZW50Q29udHJvbHMqLyBudWxsKTsJCQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qCi0JICogSWYgYSBwcm9wZXJ0eSBjaGFuZ2VzIHRoYXQgd2Ugd2FudCB0byB2YWxpZGF0ZSwgZm9yY2UgdmFsaWRhdGlvbiBvbiB0aGlzIHBhZ2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbkRhdGFNb2RlbExpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlZChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQlpZiAoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuTUFQUEVEX0FTX1NVUEVSQ0xBU1MuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCWluaXROYW1lR3JvdXAoKTsKLQkJfQkJCi0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBtZXRob2RzIGlzIGZvciB0aGUgaW50ZXJuYWwgdXNlIG9ubHkuIEl0IHdpbGwgc2V0IHRoZSBlbnRpdHkgYW5kIHRhYmxlIG5hbWUKLQkgKiBncm91cCB0byBiZSBkaXNhYmxlZCBpZiB0aGUgY3JlYXRlZCBhcnRpZmFjdCBpcyBub3QgZW50aXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXROYW1lR3JvdXAoKSB7CQkKLQkJaXNOb25FbnRpdHkgPSBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuTUFQUEVEX0FTX1NVUEVSQ0xBU1MpOwkJCi0JCWlmIChpc0J1dHRvbnNDcmVhdGVkKSB7Ci0JCQllbnRpdHlOYW1lVGV4dC5zZXRFbmFibGVkKCFpc05vbkVudGl0eSk7Ci0JCQl0YWJsZU5hbWVDaGVja0J1dHRvbi5zZXRFbmFibGVkKCFpc05vbkVudGl0eSk7Ci0JCQl0YWJsZU5hbWVUZXh0LnNldEVuYWJsZWQoIXRhYmxlTmFtZUNoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJfQkJCi0JfQkKLX0KLQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlSb3dUYWJsZVdpemFyZFNlY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVJvd1RhYmxlV2l6YXJkU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDcyNWY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVJvd1RhYmxlV2l6YXJkU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGltaXRlciBEaW1pdHJvdiwgZC5kaW1pdHJvdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmRpYWxvZ3MuRmlsdGVyZWRUeXBlc1NlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuRW50aXR5Um93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuVHlwZVNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIFRoZSBjbGFzcyBwcmVzZW50cyB0aGUgdGFibGUgd2l0aCBlbnRpdHkgZmllbGRzLiBJbiB0aGUgamF2YSBmaWxlIGFyZSBpbmNsdWRlZCBhbHNvIGNvbnRlbnQKLSAqIGFuZCBsYWJlbCBwcm92aWRlciwgYWRkIGFuZCBlZGl0IGVudGl0eSBkaWFsb2dzIGFzIHdlbGwgYXMgaGVscCBpbnRlcm5hbCBvYmplY3RzIC0gbGlzdGVuZXIgCi0gKiBhbmQgY2FsbGJhY2sgZnJvbSB0aGUgZGlhbG9nIHRvIHRoZSBtYWluIGNvbXBvc2l0ZSAodGFibGUpLiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlSb3dUYWJsZVdpemFyZFNlY3Rpb24gZXh0ZW5kcyBDb21wb3NpdGUgewotCQotCS8qKgotCSAqIFRoZSBwb3NzaWJsZSBlbnRpdHkgdHlwZXMsIG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiAoQ2hhcHRlciAyLjEuMSBQZXJzaXN0ZW50IEZpZWxkcyBhbmQgUHJvcGVydGllcyBwLjIwKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nW10gVkFMSURfVFlQRVMgPSB7ImludCIsICJsb25nIiwgInNob3J0IiwgImNoYXIiLCAiYm9vbGVhbiIsICJieXRlIiwgImRvdWJsZSIsICJmbG9hdCIsICJqYXZhLmxhbmcuU3RyaW5nIiwKLQkJImJ5dGVbXSIsICJjaGFyW10iLAkiamF2YS5sYW5nLkJ5dGVbXSIsICJqYXZhLmxhbmcuQ2hhcmFjdGVyW10iLCAiamF2YS5tYXRoLkJpZ0RlY2ltYWwiLCAiamF2YS5tYXRoLkJpZ0ludGVnZXIiLCAiamF2YS5zcWwuRGF0ZSIsICJqYXZhLnNxbC5UaW1lIiwgImphdmEuc3FsLlRpbWVzdGFtcCIsCi0JCSJqYXZhLnV0aWwuRGF0ZSIsICJqYXZhLnV0aWwuQ2FsZW5kYXIifTsKLQkKLQkgIHByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBtVGFibGVWaWV3ZXIgPSBudWxsOwotCSAgcHJpdmF0ZSBUYWJsZSBtVGFibGVXaWRnZXQgPSBudWxsOwotCSAgcHJpdmF0ZSBmaW5hbCBpbnQgUEtfQ09MVU1OID0gMDsKLQkgIHByaXZhdGUgZmluYWwgaW50IE5BTUVfQ09MVU1OID0gMTsKLQkgIHByaXZhdGUgZmluYWwgaW50IFRZUEVfQ09MVU1OID0gMjsKLQkKLQkgIAotCi0JCi0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGVkaXRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCXByaXZhdGUgU3RyaW5nIHRpdGxlID0gRW50aXR5V2l6YXJkTXNnLkVOVElUWV9GSUVMRFM7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBsYWJlbHNGb3JDb21ibyA9IFZBTElEX1RZUEVTOwotCXByaXZhdGUgU3RyaW5nW10gbGFiZWxzRm9yVGV4dCA9IG5ldyBTdHJpbmdbXXtFbnRpdHlXaXphcmRNc2cuVFlQRV9URVhUX0ZJRUxELCBFbnRpdHlXaXphcmRNc2cuTkFNRV9URVhUX0ZJRUxEfTsKLQlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlOYW1lOwotCXByaXZhdGUgSW1hZ2UgbGFiZWxQcm92aWRlckltYWdlID0gbnVsbDsKLQlwcml2YXRlIERpYWxvZ0NhbGxiYWNrIGNhbGxiYWNrOwkKLQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUgLSBFbnRpdHkgZmllbGRzIHBhZ2UKLQkgKiBAcGFyYW0gbW9kZWwgdGhlIGRhdGEgbW9kZWwgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIGRhdGEgcHJvcGVydHkgbmFtZQotCSAqLwotCXB1YmxpYyBFbnRpdHlSb3dUYWJsZVdpemFyZFNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsJCi0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CQkKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDQ7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXRoaXMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRoaXMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgdGl0bGVMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTEVGVCk7Ci0JCXRpdGxlTGFiZWwuc2V0VGV4dCh0aXRsZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRpdGxlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQltVGFibGVXaWRnZXQgPSBuZXcgVGFibGUodGhpcywgU1dULkNIRUNLIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIG1UYWJsZVdpZGdldC5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBtVGFibGVXaWRnZXQuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIG1UYWJsZVZpZXdlciA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKG1UYWJsZVdpZGdldCk7Ci0gICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZGF0YS52ZXJ0aWNhbFNwYW4gPSAyOwotCQltVGFibGVXaWRnZXQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbVRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRW50aXR5Um93Q29udGVudFByb3ZpZGVyKCkpOwotCQltVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRW50aXR5Um93TGFiZWxQcm92aWRlcigpKTsKLQkJCi0JCWZpbmFsIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGlvbiA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5VTEwpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJYnV0dG9uQ29tcG9zaXRpb24uc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkNvbXBvc2l0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQlhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0aW9uLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KEVudGl0eVdpemFyZE1zZy5BRERfQlVUVE9OX0xBQkVMKTsgCi0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQllZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGlvbiwgU1dULlBVU0gpOwotCQllZGl0QnV0dG9uLnNldFRleHQoRW50aXR5V2l6YXJkTXNnLkVESVRfQlVUVE9OX0xBQkVMKTsKLQkJZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWhhbmRsZUVkaXRCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQltVGFibGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlRWRpdEJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRpb24sIFNXVC5QVVNIKTsKLQkJcmVtb3ZlQnV0dG9uLnNldFRleHQoRW50aXR5V2l6YXJkTXNnLlJFTU9WRV9CVVRUT05fTEFCRUwpOwotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQltVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChlZGl0QnV0dG9uICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiBlbmFibGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPT0gMTsKLQkJCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCX0KLQkJCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJCi0JCWZpbmFsIFRhYmxlQ29sdW1uIHBrQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1UYWJsZVdpZGdldCwgU1dULkNIRUNLKTsKLSAgICAgICAgcGtDb2x1bW4uc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuS0VZKTsKLQkJcGtDb2x1bW4ucGFjaygpOwotCQlwa0NvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIG5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obVRhYmxlV2lkZ2V0LCBTV1QuTk9ORSk7Ci0gICAgICAgIG5hbWVDb2x1bW4uc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuTkFNRV9DT0xVTU4pOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIHR5cGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obVRhYmxlV2lkZ2V0LCBTV1QuTk9ORSk7Ci0gICAgICAgIHR5cGVDb2x1bW4uc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuVFlQRV9DT0xVTU4pOwotCi0gICAgICAgIHRoaXMuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgCQlUYWJsZSB0YWJsZSA9IG1UYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICAgICAgICAgICAgICBUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCQkJUG9pbnQgYnV0dG9uQXJlYSA9IGJ1dHRvbkNvbXBvc2l0aW9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSB0YWJsZS5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IG1UYWJsZVZpZXdlci5nZXRUYWJsZSgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpLSBidXR0b25BcmVhLnggLSBjb2x1bW5zLmxlbmd0aCAqIDIgLSBwa0NvbHVtbi5nZXRXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKSB7Ci0JCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0JCQkJCS8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLQkJCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCQl9Ci0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpbnQgY29uc3VtZVdpZHRoID0gMDsKLQkJCQlpbnQgY29sID0gY29sdW1ucy5sZW5ndGggLSAxOwotCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAob2xkU2l6ZS54ID4gYXJlYS53aWR0aCkgewotCQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkJLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCQljb25zdW1lV2lkdGggPSBzZXRDb2x1bW50V2lkdGgod2lkdGgsIGNvbHVtbnMsIGNvbnN1bWVXaWR0aCwgaSk7Ci0JCQkJCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGggLSBidXR0b25BcmVhLngJLSAoY29sICogMiArIHBrQ29sdW1uLmdldFdpZHRoKCkpLCBhcmVhLmhlaWdodCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZQotCQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQkJY29uc3VtZVdpZHRoID0gc2V0Q29sdW1udFdpZHRoKHdpZHRoLCBjb2x1bW5zLCAJY29uc3VtZVdpZHRoLCBpKTsKLQkJCQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCAtIGJ1dHRvbkFyZWEueCAtIChjb2wgKiAyICsgcGtDb2x1bW4uZ2V0V2lkdGgoKSksIGFyZWEuaGVpZ2h0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBpbnQgc2V0Q29sdW1udFdpZHRoKGludCB3aWR0aCwgVGFibGVDb2x1bW5bXSBjb2x1bW5zLAotCQkJCQlpbnQgY29uc3VtZVdpZHRoLCBpbnQgaSkgewotCQkJCWlmIChpIDwgY29sdW1ucy5sZW5ndGggLSAxKSB7Ci0JCQkJCWNvbHVtbnNbaV0uc2V0V2lkdGgod2lkdGggLyAoY29sdW1ucy5sZW5ndGggLSAxKSk7Ci0JCQkJCWNvbnN1bWVXaWR0aCArPSBjb2x1bW5zW2ldLmdldFdpZHRoKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aCAtIGNvbnN1bWVXaWR0aCk7Ci0JCQkJfQotCQkJCXJldHVybiBjb25zdW1lV2lkdGg7Ci0JCQl9Ci0JCX0pOwotICAgICAgICAKLQkJbVRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgUEtGaWVsZENoZWNrU3RhdGVMaXN0ZW5lcigpKTsKLQkJY2FsbGJhY2sgPSBuZXcgRmllbGREaWFsb2dDYWxsYmFjaygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHByb2Nlc3MgdGhlIEFkZC4uLiBidXR0b24gcHJlc3NlZCBldmVudC4gSXQgb3BlbnMgZGlhbG9nIHRvCi0JICogYWRkIG5ldyBlbnRpdHkgZmllbGQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUFkZEZpZWxkRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRGaWVsZERpYWxvZyhnZXRTaGVsbCgpLCB0aXRsZSwgbGFiZWxzRm9yQ29tYm8sIGxhYmVsc0ZvclRleHQpOwotCQlpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJlc3VsdCA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRW50aXR5Um93IGVudGl0eVJvdyA9IGRpYWxvZy5nZXRFbnRpdHlSb3coKTsKLQkJYWRkRW50aXR5Um93KGVudGl0eVJvdyk7Ci0JCWlmICghZW50aXR5Um93LmNvdWxkQmVLZXkoKSkgewotCQkJbVRhYmxlVmlld2VyLnNldEdyYXllZChlbnRpdHlSb3csIHRydWUpOwotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogQWRkIG5ldyBlbnRpdHkgdG8gdGhlIHRhYmxlIGlucHV0Ci0JICogCi0JICogQHBhcmFtIGVudGl0eQotCSAqICAgICAgICAgICAgdGhlIGVudGl0eSB3aGljaCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoZSB0YWJsZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRFbnRpdHlSb3coRW50aXR5Um93IGVudGl0eSkgewotCQlpZiAoZW50aXR5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3Q8RW50aXR5Um93PiB2YWx1ZUxpc3QgPSAoQXJyYXlMaXN0PEVudGl0eVJvdz4pIG1UYWJsZVZpZXdlci5nZXRJbnB1dCgpOwkJCi0JCWlmICh2YWx1ZUxpc3QgPT0gbnVsbCkKLQkJCXZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8RW50aXR5Um93PigpOwkJCi0JCXZhbHVlTGlzdC5hZGQoZW50aXR5KTsKLQkJc2V0SW5wdXQodmFsdWVMaXN0KTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcHJvY2VzcyB0aGUgRWRpdC4uLiBidXR0b24gcHJlc3NlZCBldmVudC4gSXQgb3BlbnMgZGlhbG9nIHRvIGVkaXQgY2hvc2VuIGVudGl0eSBmaWVsZAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVFZGl0QnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUlTZWxlY3Rpb24gcyA9IG1UYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCEocyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuOwotCQkKLQkJT2JqZWN0IHNlbGVjdGVkT2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlFbnRpdHlSb3cgZW50aXR5Rm9yRWRpdCA9IChFbnRpdHlSb3cpIHNlbGVjdGVkT2JqOwotCQlpbnQgaW5kZXggPSBtVGFibGVXaWRnZXQuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJYm9vbGVhbiBpc0NoZWNrZWQgPSBtVGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZChlbnRpdHlGb3JFZGl0KTsKLQkJCi0JCUVkaXRGaWVsZERpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdEZpZWxkRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCBsYWJlbHNGb3JDb21ibywgbGFiZWxzRm9yVGV4dCwgZW50aXR5Rm9yRWRpdCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCUVudGl0eVJvdyBlbnRpdHlSb3cgPSBkaWFsb2cuZ2V0RW50aXR5Um93KCk7Ci0JCWlmIChlbnRpdHlSb3cgIT0gbnVsbCkgewkJCQotCQkJZWRpdEVudGl0eVJvdyhpbmRleCwgZW50aXR5Um93KTsKLQkJCW1UYWJsZVZpZXdlci5zZXRDaGVja2VkKGVudGl0eVJvdywgaXNDaGVja2VkKTsKLQkJCWlmICghZW50aXR5Um93LmNvdWxkQmVLZXkoKSkgewotCQkJCW1UYWJsZVZpZXdlci5zZXRDaGVja2VkKGVudGl0eVJvdywgZmFsc2UpOwotCQkJCW1UYWJsZVZpZXdlci5zZXRHcmF5ZWQoZW50aXR5Um93LCB0cnVlKTsKLQkJCX0gZWxzZSB7CQkJCQotCQkJCW1UYWJsZVZpZXdlci5zZXRHcmF5ZWQoZW50aXR5Um93LCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRWRpdCBjaG9zZW4gZW50aXR5IGZyb20gdGhlIHRhYmxlCi0JICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgZW50aXR5IGluIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBuZXdFbnRpdHkgdGhlIGVkaXRlZCBlbnRpdHkgZmllbGQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZWRpdEVudGl0eVJvdyhpbnQgaW5kZXgsIEVudGl0eVJvdyBuZXdFbnRpdHkpIHsKLQkJaWYgKG5ld0VudGl0eSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJTGlzdDxFbnRpdHlSb3c+IHZhbHVlTGlzdCA9IChBcnJheUxpc3Q8RW50aXR5Um93PikgbVRhYmxlVmlld2VyLmdldElucHV0KCk7CQkKLQkJaWYgKHZhbHVlTGlzdCA9PSBudWxsKSB7Ci0JCQl2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJCQkKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl2YWx1ZUxpc3QuYWRkKG5ld0VudGl0eSk7Ci0JCX0gZWxzZSB7Ci0JCQl2YWx1ZUxpc3Quc2V0KGluZGV4LCBuZXdFbnRpdHkpOwotCQl9Ci0JCQotCQlzZXRJbnB1dCh2YWx1ZUxpc3QpOwkJCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcHJvY2VzcyB0aGUgUmVtb3ZlIGJ1dHRvbiBwcmVzc2VkIGV2ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBtVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuOwotCQlMaXN0IHNlbGVjdGVkT2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKTsKLQkJcmVtb3ZlRW50aXR5Um93KHNlbGVjdGVkT2JqZWN0KTsJCQotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBzZWxlY3RlZCBlbnRpdGllcyBmcm9tIHRoZSB0YWJsZSAKLQkgKiBAcGFyYW0gZW50aXRpZXMgbGlzdCB3aXRoIGVudGl0aWVzLCB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVFbnRpdHlSb3coQ29sbGVjdGlvbiBlbnRpdGllcykgewotCQlMaXN0PEVudGl0eVJvdz4gdmFsdWVMaXN0ID0gKEFycmF5TGlzdDxFbnRpdHlSb3c+KSBtVGFibGVWaWV3ZXIuZ2V0SW5wdXQoKTsKLQkJdmFsdWVMaXN0LnJlbW92ZUFsbChlbnRpdGllcyk7Ci0JCXNldElucHV0KHZhbHVlTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBpbnB1dCBvZiB0aGUgdGFibGUKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGxpc3Qgd2l0aCBlbnRpdGllcyB3aGljaCBoYXZlIHRvIGJlIHByZXNlbnRlZCBpbiB0aGUgdGFibGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0SW5wdXQoTGlzdCBpbnB1dCkgewotCQltVGFibGVWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQkvLyBDcmVhdGUgYSBuZXcgbGlzdCB0byB0cmlnZ2VyIHByb3BlcnR5IGNoYW5nZQotCQlBcnJheUxpc3Q8RW50aXR5Um93PiBuZXdJbnB1dCA9IG5ldyBBcnJheUxpc3Q8RW50aXR5Um93PigpOwotCQluZXdJbnB1dC5hZGRBbGwoaW5wdXQpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG5ld0lucHV0KTsJCQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIFRhYmxlVmlld2VyIG9mIHRoZSB0YWJsZQotCSAqLwotCXB1YmxpYyBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKLQkJcmV0dXJuIG1UYWJsZVZpZXdlcjsKLQl9Ci0JCi0JLy8gUFJPVklERVJTIEZPUiBUSEUgRklFTEQgVEFCTEUKLQkKLQkvKioKLQkgKiBUaGUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIHRhYmxlIGl0ZW1zCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEVudGl0eVJvd0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlyZXR1cm4gKChMaXN0KSBlbGVtZW50KS50b0FycmF5KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFWaWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkvL0RlZmF1bHQgbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkvL0RlZmF1bHQgbm90aGluZwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoZSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIHRhYmxlIGl0ZW1zCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEVudGl0eVJvd0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCSAgICBpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkgICAgICAgIHJldHVybiBsYWJlbFByb3ZpZGVySW1hZ2U7ICAgICAgIAotCQkgICAgfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlFbnRpdHlSb3cgZW50aXR5ID0gKEVudGl0eVJvdykgZWxlbWVudDsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSBOQU1FX0NPTFVNTikgewotCQkJCXJldHVybiBlbnRpdHkuZ2V0TmFtZSgpOwotCQkJfQotCQkJaWYgKGNvbHVtbkluZGV4ID09IFRZUEVfQ09MVU1OKSB7Ci0JCQkJcmV0dXJuIGVudGl0eS5nZXRUeXBlKCk7Ci0JCQl9CQkKLQkJCWlmIChlbnRpdHkuY291bGRCZUtleSgpKSB7Ci0JCQkJbVRhYmxlVmlld2VyLnNldENoZWNrZWQoZW50aXR5LCBlbnRpdHkuaXNLZXkoKSk7Ci0JCQl9IAotCQkJcmV0dXJuICIiOwotCQl9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXJJbWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCVN0cmluZ1tdIGFycmF5ID0gKFN0cmluZ1tdKSBlbGVtZW50OwotCQkJaWYgKGFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQlyZXR1cm4gYXJyYXlbMF07Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQkKLQkvLyBFTkQgLSBQUk9WSURFUlMgRk9SIFRIRSBGSUVMRCBUQUJMRQkKLQotCS8qKgotCSAqIExpc3RlbmVyIGZvciB0aGUgUHJpbWFyeSBLZXkgY2hlY2sgYm94IGluIHRoZSB0YWJsZSBpdGVtCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQS0ZpZWxkQ2hlY2tTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0KLQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJT2JqZWN0W10gY2hlY2tlZEVsZW1lbnRzID0gbVRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQkJTGlzdDxTdHJpbmc+IHBrRmllbGRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlmb3IgKE9iamVjdCBvYmplY3QgOiBjaGVja2VkRWxlbWVudHMpIHsKLQkJCQlFbnRpdHlSb3cgZW50aXR5ID0gKEVudGl0eVJvdylvYmplY3Q7Ci0JCQkJaWYgKGVudGl0eS5jb3VsZEJlS2V5KCkpIHsJCQkJCQotCQkJCQlwa0ZpZWxkcy5hZGQoZW50aXR5LmdldE5hbWUoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbVRhYmxlVmlld2VyLnNldENoZWNrZWQoZW50aXR5LCBmYWxzZSk7Ci0JCQkJfQotCQkJfQkJCQotCQkJbW9kZWwuc2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuUEtfRklFTERTLCBwa0ZpZWxkcyk7CQkJCi0JCX0KLQkJCi0JfQotCQotCS8vIENBTExCQUNLIE1FQ0hBTklTTQotCS8qKgotCSAqIENhbGxiYWNrIGludGVyZmFjZSB1c2VkIGJ5IHRoZSBBZGQvRWRpdC1GaWVsZERpYWxvZyBjbGFzc2VzLiAKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIERpYWxvZ0NhbGxiYWNrIHsKLQkJCi0JCS8qKgkKLQkJICogVmFsaWRhdGVzIHRoZSB0ZXh0IGZpZWxkcy4gCi0JCSAqIDxwPlVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSBPSyBidXR0b24gb2YgdGhlIGRpYWxvZy4gCi0JCSAqIElmIHRoZSBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiB0aGUgT0sgYnV0dG9uIGlzIGVuYWJsZWQsIAotCQkgKiBvdGhlcndpc2UgdGhlIE9LIGJ1dHRvbiBpcyBkaXNhYmxlZC48L3A+IAotCQkgKiBAcGFyYW0gY29tYm8gY29udGFpbnMgdGhlIHByZWRlZmluZWQgdHlwZXMKLQkJICogQHBhcmFtIHRleHRzCXRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgZmllbGQJCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHZhbHVlcyBpbiB0aGUgdGV4dCBmaWVsZHMgYXJlIAotCQkgKiAgICAgICAgIHZhbGlkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgkgCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShDb21ibyBjb21ibywgVGV4dFtdIHRleHRzKTsKLQkJCi0JCS8qKgotCQkgKiBSZXRyaWV2ZXMgdGhlIGVudGl0eSBwcmVzZW50YXRpb24gb2JqZWN0IGZyb20gdGhlIGZpZWxkcyBvZiB0aGUgZGlhbG9nLiAKLQkJICogPHA+SW1wbGVtZW50ZXJzIG9mIHRoZSBjYWxsYmFjayBjYW4gdXNlIHRoZXNlIG1ldGhvZCB0byBkbyBzb21lIAotCQkgKiBwcmVwcm9jZXNzaW5nIChsaWtlIHRyaW1taW5nKSBvZiB0aGUgZGF0YSBpbiB0aGUgdGV4dCBmaWVsZHMgYmVmb3JlIAotCQkgKiB1c2luZyBpdC4gVGhlIHJldHVybmVkIHZhbHVlcyB3aWxsIGJlIHRoZSBhY3R1YWwgZGF0YSB0aGF0IHdpbGwgYmUgCi0JCSAqIHB1dCBpbiB0aGUgdGFibGUgdmlld2VyLjwvcD4gCi0JCSAqIEBwYXJhbSBjb21ibyBjb250YWlucyB0aGUgcHJlZGVmaW5lZCB0eXBlcwotCQkgKiBAcGFyYW0gdGV4dHMJdGhlIG5hbWUgb2YgdGhlIGVudGl0eSBmaWVsZAkKLQkJICogQHJldHVybiB0aGUgZW50aXR5IHByZXNlbnRhdGlvbiBvYmplY3QgcmV0cmlldmVkIGZyb20gdGhlIGRpYWxvZwotCQkgKi8KLQkJcHVibGljIEVudGl0eVJvdyByZXRyaWV2ZVJlc3VsdFN0cmluZ3MoQ29tYm8gY29tYm8sIFRleHRbXSB0ZXh0cyk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+RmllbGREaWFsb2dDYWxsYmFjazwvY29kZT4gaW50ZXJmYWNlIGZvciAKLQkgKiBib3RoICJOYW1lIiBhbmQgIlR5cGVzIiB0YWJsZSBjb2x1bW5zLiAKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRmllbGREaWFsb2dDYWxsYmFjayBpbXBsZW1lbnRzIERpYWxvZ0NhbGxiYWNrIHsKLQotCQkvKioKLQkJICogVGhlIGZpcnN0IHRleHQgZmllbGQgc2hvdWxkIG5vdCBiZSBlbXB0eS4gCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShDb21ibyBjb21ibywgVGV4dFtdIHRleHRzKSB7Ci0JCQlpZiAodGV4dHMubGVuZ3RoID4gMCkgewotCQkJCXJldHVybiB0ZXh0c1swXS5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMDsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQkvKioKLQkJICogSnVzdCByZXRyaWV2ZXMgdGhlIHVubW9kaWZpZWQgdmFsdWVzIG9mIHRoZSB0ZXh0IGZpZWxkcyBhcyBhIAotCQkgKiBlbnRpdHkgZmllbGQgcHJlc2VudGF0aW9uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuRW50aXR5Um93Ci0JCSAqLwotCQlwdWJsaWMgRW50aXR5Um93IHJldHJpZXZlUmVzdWx0U3RyaW5ncyhDb21ibyBjb21ibywgVGV4dFtdIHRleHRzKSB7Ci0JCQlFbnRpdHlSb3cgZW50aXR5ID0gbmV3IEVudGl0eVJvdygpOwkJCQotCQkJZW50aXR5LnNldEZxblR5cGVOYW1lKGNvbWJvLmdldFRleHQoKSk7Ci0JCQllbnRpdHkuc2V0TmFtZSh0ZXh0c1swXS5nZXRUZXh0KCkpOwotCQkJcmV0dXJuIGVudGl0eTsKLQkJfQotCX0KLQkKLQkvLyBUSEUgRElBTE9HUyBVU0VEIEZPUiBBREQvRURJVCBPRiBFTlRJVFkgRklFTERTIC0gQkVHSU4KLQkKLQkvKioKLQkgKiBUaGUgZGlhbG9nIHdoaWNoIGNvbGxlY3QgdGhlIGluZm9ybWF0aW9uIChuYW1lIGFuZCB0eXBlKSBmb3IgdGhlIG5ldyBlbnRpdHkgZmllbGQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIEFkZEZpZWxkRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIFN0cmluZyB3aW5kb3dUaXRsZTsKLQkJcHJvdGVjdGVkIFN0cmluZ1tdIGxhYmVsc0ZvckNvbWJvOwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gbGFiZWxzRm9yVGV4dDsKLQkJcHJvdGVjdGVkIFRleHRbXSB0ZXh0czsJCQotCQlwcm90ZWN0ZWQgRW50aXR5Um93IGVudGl0eVJvdzsKLQkJcHJvdGVjdGVkIENvbWJvIGNvbWJvOwotCQkKLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgQWRkRmllbGREaWFsb2cKLQkJICogQHBhcmFtIHNoZWxsCi0JCSAqIEBwYXJhbSB3aW5kb3dUaXRsZSBkaWFsb2cgbGFiZWwKLQkJICogQHBhcmFtIGxhYmVsc0ZvckNvbWJvIHRoZSBlbGVtZW50cyBmb3IgdGhlIGNvbWJvCi0JCSAqIEBwYXJhbSBsYWJlbHNGb3JUZXh0IG5hbWUgdGV4dAotCQkgKi8KLQkJcHVibGljIEFkZEZpZWxkRGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgd2luZG93VGl0bGUsIFN0cmluZ1tdIGxhYmVsc0ZvckNvbWJvLCBTdHJpbmdbXSBsYWJlbHNGb3JUZXh0KSB7Ci0JCQlzdXBlcihzaGVsbCk7Ci0JCQl0aGlzLndpbmRvd1RpdGxlID0gd2luZG93VGl0bGU7Ci0JCQl0aGlzLmxhYmVsc0ZvckNvbWJvID0gbGFiZWxzRm9yQ29tYm87Ci0JCQl0aGlzLmxhYmVsc0ZvclRleHQgID0gbGFiZWxzRm9yVGV4dDsKLQkJfQotCQkKLQkJLyogQ3JlYXRlIHRoZSBhcmVhIG9mIGRpYWxvZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJZ2V0U2hlbGwoKS5zZXRUZXh0KHdpbmRvd1RpdGxlKTsKLQotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCQlsYWJlbC5zZXRUZXh0KGxhYmVsc0ZvclRleHRbMF0pOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJCQotCQkJCi0JCQljb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsvLyB8IFNXVC5SRUFEX09OTFkpOwkJCQotCQkJY29tYm8uc2V0SXRlbXMobGFiZWxzRm9yQ29tYm8pOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CQkJCi0JCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEVudGl0eVdpemFyZE1zZy5CUk9XU0VfQlVUVE9OX0xBQkVMKTsKLQkJCUdyaWREYXRhIGJyb3dzZUJ1dHRvbkRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJCWJyb3dzZUJ1dHRvbkRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoYnJvd3NlQnV0dG9uRGF0YSk7Ci0JCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaGFuZGxlQ2hvb3NlRW50aXR5VHlwZUJ1dHRvblByZXNzZWQoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkvLyBEbyBub3RoaW5nCi0JCQkJfQotCQkJfSk7Ci0KLQkJCWludCBuID0gbGFiZWxzRm9yVGV4dC5sZW5ndGg7Ci0JCQl0ZXh0cyA9IG5ldyBUZXh0W24tMV07Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykgewotCQkJCUxhYmVsIGxhYmVsSSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJCQlsYWJlbEkuc2V0VGV4dChsYWJlbHNGb3JUZXh0W2ldKTsKLQkJCQlsYWJlbEkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJCQl0ZXh0c1tpLTFdID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJCWRhdGEud2lkdGhIaW50ID0gMTAwOwotCQkJCXRleHRzW2ktMV0uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCX0KLQotCQkJY29tYm8uc2V0Rm9jdXMoKTsKLQkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQotCQkvKioKLQkJICogUHJvY2VzcyBicm93c2luZyB3aGVuIHRoZSBCcm93c2UuLi4gYnV0dG9uIGhhdmUgYmVlbiBwcmVzc2VkLiBBbGxvdyBhZGRpbmcgb2YgZW50aXR5IGZpZWxkCi0JCSAqIHdpdGggYXJiaXRyYXJ5IHR5cGUuCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmRpYWxvZ3MuRmlsdGVyZWRUeXBlc1NlbGVjdGlvbkRpYWxvZwotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZUNob29zZUVudGl0eVR5cGVCdXR0b25QcmVzc2VkKCkgewotCQkJLy9nZXRDb250cm9sKCkuc2V0Q3Vyc29yKG5ldyBDdXJzb3IoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfV0FJVCkpOwotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja1Jvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIG1vZGVsLmdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQkJCWlmIChwYWNrUm9vdCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyB0aGlzIGVsaW1pbmF0ZXMgdGhlIG5vbi1leHBvcnRlZCBjbGFzc3BhdGggZW50cmllcwotCQkJZmluYWwgSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFR5cGVTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlRm9yQVByb2plY3QocGFja1Jvb3QuZ2V0SmF2YVByb2plY3QoKSwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJCS8vIFRoaXMgaW5jbHVkZXMgYWxsIGVudHJpZXMgb24gdGhlIGNsYXNzcGF0aC4KLQkJCUZpbHRlcmVkVHlwZXNTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEZpbHRlcmVkVHlwZXNTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgZmFsc2UsIG51bGwvKmdldFdpemFyZCgpLmdldENvbnRhaW5lcigpKi8sIHNjb3BlLCBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFKTsKLQkJCWRpYWxvZy5zZXRUaXRsZShFbnRpdHlXaXphcmRNc2cuVFlQRV9ESUFMT0dfVElUTEUpOwotCQkJZGlhbG9nLnNldE1lc3NhZ2UoRW50aXR5V2l6YXJkTXNnLlRZUEVfRElBTE9HX0RFU0NSSVBUSU9OKTsKLQotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJSVR5cGUgdHlwZSA9IChJVHlwZSkgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCQkJU3RyaW5nIHN1cGVyY2xhc3NGdWxsUGF0aCA9IElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVNUFRZX1NUUklORzsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCXN1cGVyY2xhc3NGdWxsUGF0aCA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJfQotCQkJCWNvbWJvLnNldFRleHQoc3VwZXJjbGFzc0Z1bGxQYXRoKTsKLQkJCQkvL2dldENvbnRyb2woKS5zZXRDdXJzb3IobnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy9nZXRDb250cm9sKCkuc2V0Q3Vyc29yKG51bGwpOwotCQl9Ci0JCQotCQkKLQkJLyogQ3JlYXRlIHRoZSBjb250ZW50IG9mIHRoZSBkaWFsb2cKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCQkKLQkJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJCXRleHRzW2ldLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQkJCi0JCQl1cGRhdGVPS0J1dHRvbigpOwotCQkJCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0KLQkJLyogUHJvY2Vzc2VzIE9LIGJ1dHRvbiBwcmVzc2VkIGV2ZW50LgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQkJZW50aXR5Um93ID0gY2FsbGJhY2sucmV0cmlldmVSZXN1bHRTdHJpbmdzKGNvbWJvLCB0ZXh0cyk7Ci0JCQlzdXBlci5va1ByZXNzZWQoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBlbnRpdHkgcmVwcmVzZW50YXRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIGRpYWxvZwotCQkgKi8KLQkJcHVibGljIEVudGl0eVJvdyBnZXRFbnRpdHlSb3coKSB7Ci0JCQlyZXR1cm4gZW50aXR5Um93OwotCQl9Ci0JCQotCQkvKiBQcm9jZXNzZXMgdGV4dCBtb2RpZnlpbmcgZXZlbnQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJdXBkYXRlT0tCdXR0b24oKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNldHMgc3RhdGUgb2YgdGhlIE9LIGJ1dHRvbiBpbiBhY2NvcmRhbmNlIHdpdGggdmFsaWRhdGUgbWV0aG9kIG9mIHRoZSBjYWxsYmFjayBvYmplY3QKLQkJICogQHNlZSBEaWFsb2dDYWxsYmFjawotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZU9LQnV0dG9uKCkgewotCQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoY2FsbGJhY2sudmFsaWRhdGUoY29tYm8sIHRleHRzKSk7Ci0JCX0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCi0JCX0KLQkJLyogVXBkYXRlIE9LIGJ1dHRvbiB3aGVuIHRoZSBhcHByb3ByaWF0ZSBldmVudCBvY2N1cnMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl1cGRhdGVPS0J1dHRvbigpOwkJCQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgRWRpdEZpZWxkRGlhbG9nCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBFZGl0RmllbGREaWFsb2cgZXh0ZW5kcyBBZGRGaWVsZERpYWxvZyB7Ci0JCXByb3RlY3RlZCBFbnRpdHlSb3cgZW50aXR5Um93OwotCQkvKioKLQkJICogRWRpdEZpZWxkRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgRWRpdEZpZWxkRGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgd2luZG93VGl0bGUsIFN0cmluZ1tdIGxhYmVsc0ZvckNvbWJvLCBTdHJpbmdbXSBsYWJlbHNGb3JUZXh0LCBFbnRpdHlSb3cgZW50aXR5KSB7Ci0JCQlzdXBlcihzaGVsbCwgd2luZG93VGl0bGUsIGxhYmVsc0ZvckNvbWJvLCBsYWJlbHNGb3JUZXh0KTsKLQkJCXRoaXMuZW50aXR5Um93ID0gZW50aXR5OwkJCi0JCX0KLQotCQkvKiBDcmVhdGUgdGhlIGFyZWEgb2YgdGhlIGRpYWxvZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5FbnRpdHlSb3dUYWJsZVdpemFyZFNlY3Rpb24uQWRkRmllbGREaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJCWNvbWJvLnNldFRleHQoZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCkpOwotCQkJdGV4dHNbMF0uc2V0VGV4dChlbnRpdHlSb3cuZ2V0TmFtZSgpKTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTJkYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC5FbnRpdHlEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLQotcHVibGljIGNsYXNzIEVudGl0eVdpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfT05FID0gInBhZ2VPbmUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfVFdPID0gInBhZ2VUd28iOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyB0aGUgRW50aXR5IHdpemFyZAotICAgICAqIEBwYXJhbSBtb2RlbCB0aGUgZGF0YSBtb2RlbAotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdHlXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0gICAgICAgIHNldFdpbmRvd1RpdGxlKEVudGl0eVdpemFyZE1zZy5FTlRJVFlfV0laQVJEX1RJVExFKTsKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSnB0VWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdFVpSWNvbnMuRU5USVRZX1dJWl9CQU5ORVIpKTsgICAgICAgIAotCX0gICAgCi0gCi0JLyoqCi0JICogRW1wdHkgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRW50aXR5V2l6YXJkKCl7Ci0gICAgCXRoaXMobnVsbCk7Ci0gICAgfQotCQotCS8qIEFkZHMgdGhlIHR3byBwYWdlcyBvZiB0aGUgZW50aXR5IHdpemFyZCAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkI2RvQWRkUGFnZXMoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCUVudGl0eUNsYXNzV2l6YXJkUGFnZSBwYWdlMSA9IG5ldyBFbnRpdHlDbGFzc1dpemFyZFBhZ2UoCi0JCSAgICAgICAgZ2V0RGF0YU1vZGVsKCksCi0JCSAgICAgICAgUEFHRV9PTkUsCi0JCSAgICAgICAgRW50aXR5V2l6YXJkTXNnLkFERF9FTlRJVFlfV0laQVJEX1BBR0VfREVTQ1JJUFRJT04sCi0JCSAgICAgICAgRW50aXR5V2l6YXJkTXNnLkFERF9FTlRJVFlfV0laQVJEX1BBR0VfVElUTEUsIAotCQkJCUoyRUVQcm9qZWN0VXRpbGl0aWVzLkVKQik7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCQlFbnRpdHlGaWVsZHNXaXphcmRQYWdlIHBhZ2UyID0gbmV3IEVudGl0eUZpZWxkc1dpemFyZFBhZ2UoZ2V0RGF0YU1vZGVsKCksIFBBR0VfVFdPKTsKLQkJYWRkUGFnZShwYWdlMik7Ci0JfQotCi0JLyogUmV0dXJuIHRoZSBkZWZhdWx0IGRhdGEgbW9kZWwgcHJvdmlkZXIgKEVudGl0eURhdGFNb2RlbFByb3ZpZGVyIGluIG91ciBjYXNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQjZ2V0RGVmYXVsdFByb3ZpZGVyKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnRpdHlEYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQotCS8qIENoZWNrIHdoZXRoZXIgdGhlIG1hbmRhdG9yeSBpbmZvcm1hdGlvbiBpcyBzZXQgYW5kIHdpemFyZCBjb3VsZCBmaW5pc2gKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQkgcmV0dXJuIGdldERhdGFNb2RlbCgpLmlzVmFsaWQoKTsKLQl9Ci0JCi0JLyogCi0JICogT3ZlcnJpZGUgdGhlIHBhcmVudCBtZXRob2QgaW4gb3JkZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGVudGl0eSBjbGFzcyBpbiBqYXZhIGVkaXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQjcG9zdFBlcmZvcm1GaW5pc2goKQotCSAqLwotCUBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBvc3RQZXJmb3JtRmluaXNoKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geyAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KFFVQUxJRklFRF9DTEFTU19OQU1FKTsKLSAgICAgICAgICAgIElQcm9qZWN0IHAgPSAoSVByb2plY3QpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KFBST0pFQ1QpOwotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSjJFRUVkaXRvclV0aWxpdHkuZ2V0SmF2YVByb2plY3QocCk7Ci0gICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBqYXZhUHJvamVjdC5maW5kVHlwZShjbGFzc05hbWUpLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICBvcGVuRWRpdG9yKGZpbGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gY2FudE9wZW4pIHsKLSAgICAgICAgCUpwdFVpUGx1Z2luLmxvZyhjYW50T3Blbik7Ci0gICAgICAgIH0gCi0gICAgfQotCQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gSXQgd2lsbCBvcGVuIHRoZSBmaWxlLCBzZW50IGFzIHBhcmFtZXRlcgotICAgICAqIGluIGl0cyBvd24gamF2YSBlZGl0b3IKLSAgICAgKiBAcGFyYW0gZmlsZSB3aG8gc2hvdWxkIGJlIG9wZW5lZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKGZpbmFsIElGaWxlIGZpbGUpIHsKLSAgICAJaWYgKGdldERhdGFNb2RlbCgpLmdldEJvb2xlYW5Qcm9wZXJ0eShPUEVOX0lOX0VESVRPUikpIHsKLSAgICAJCWlmIChmaWxlICE9IG51bGwpIHsKLSAgICAJCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgIAkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgCQkJCQl0cnkgewotICAgIAkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAJCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLSAgICAJCQkJCX0KLSAgICAJCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQkJCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotICAgIAkJCQkJfQotICAgIAkJCQl9Ci0gICAgCQkJfSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgLyogSW1wbGVtZW50IHRoZSBhYnN0cmFjdCBtZXRob2QgZnJvbSBJV29ya2JlbmNoV2l6YXJkCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZ2V0RGF0YU1vZGVsKCk7Ci0JfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5V2l6YXJkTXNnLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlXaXphcmRNc2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlNjk4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlXaXphcmRNc2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERpbWl0ZXIgRGltaXRyb3YsIGQuZGltaXRyb3ZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEVudGl0eVdpemFyZE1zZyBleHRlbmRzIE5MUyB7CQotCQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfdWlfZW50aXR5X3dpemFyZCI7Ly8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX1dJWkFSRF9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfRU5USVRZX1dJWkFSRF9QQUdFX1RJVExFOyAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfRU5USVRZX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUEFDS0FHRV9XQVJOSU5HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9QUk9QRVJUSUVTX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9QUk9QRVJUSUVTX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBQRURfQVNfU1VQRVJDTEFTUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTkhFUklUQU5DRV9HUk9VUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTkhFUklUQU5DRV9DSEVDS19CT1g7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX1NUT1JBR0VfR1JPVVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX1NVUFBPUlQ7ICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENIT09TRV9YTUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElOR19YTUxfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX05BTUVfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5DT1JSRUNUX1hNTF9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENIT09TRV9NQVBQSU5HX1hNTF9NRVNTQUdFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfRElBTE9HX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfRElBTE9HX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBQkxFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEFCTEVfTkFNRV9HUk9VUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVU0VfREVGQVVMVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfRklFTERTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOQU1FX0NPTFVNTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX0NPTFVNTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOQU1FX1RFWFRfRklFTEQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9URVhUX0ZJRUxEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJST1dTRV9CVVRUT05fTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0JVVFRPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFRElUX0JVVFRPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVkVfQlVUVE9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERVUExJQ0FURURfRU5USVRZX05BTUVTX01FU1NBR0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUNDRVNTX1RZUEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRklFTERfQkFTRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfQkFTRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTk9fSlBBX1BST0pFQ1RTOyAgICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFQUExZX0NIQU5HRVNfVE9fUEVSU0lTVEVOQ0VfWE1MOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9NQVBQRURfU1VQRVJDTEFTU19UT19YTUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0VOVElUWV9UT19YTUw7Ci0gICAgcHJpdmF0ZSBFbnRpdHlXaXphcmRNc2coKSB7Ci0gICAgICAgIC8vIHByZXZlbnQgaW5zdGFudGlhdGlvbiBvZiBjbGFzcwotICAgIH0gICAgCi0gICAgCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRW50aXR5V2l6YXJkTXNnLmNsYXNzKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQgZ2V0U3RyaW5nKFN0cmluZykgd2lsbCByZXR1cm4gCi0gICAgICAgIAkvLyB0aGUga2V5IGl0IHdhcyBjYWxsZWQgd2l0aAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGV4dGVybmFsaXplZCBzdHJpbmcsIG1hcHBlZCB0byB0aGlzIGtleQotICAgICAqIEBwYXJhbSBrZXkgCi0gICAgICogQHJldHVybiB0aGUgdGV4dCBtYXBwZWQgdG8gdGhlIGtleSBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAkvL2V4Y2VwdGlvbiBkdXJpbmcgc3RyaW5nIG9idGFpbmluZwotICAgICAgICAgICAgICAgIHJldHVybiAiLSIgKyBrZXkgKyAiLSI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL3JldHVybiBrZXksIGJlY2F1c2UgdGhlIHJlbGV2YW50IHN0cmluZyBtaXNzaW5nIGluIHRoZSBidW5kbGUKLSAgICAgICAgcmV0dXJuICIrIiArIGtleSArICIrIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZvcm1hdGVkIHN0cmluZywgbWFwcGVkIHRvIHRoaXMga2V5Ci0gICAgICogQHBhcmFtIGtleQotICAgICAqIEBwYXJhbSBhcmd1bWVudHMKLSAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXRlZCB0ZXh0LCBtYXBwZWQgdG8gdGhpcyBrZXksIHdpdGggc3Vic3RpdHV0ZWQgYXJndW1lbnRzIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJndW1lbnRzKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5KTsKLSAgICAgICAgfQotICAgIH0gCi0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL21vZGVsL0NyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTVlYjdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGltaXRlciBEaW1pdHJvdiwgZC5kaW1pdHJvdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgewotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UID0gIi4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJSQUNLRVQgPSAiWyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtfU1VGRklYID0gIlBLIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfU0VSSUFMSVpBQkxFID0gImphdmEuaW8uU2VyaWFsaXphYmxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9QQUNLQUdFID0gImphdmF4LnBlcnNpc3RlbmNlLioiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9BTk5PVEFUSU9OID0gIkBFbnRpdHkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9BU19TVVBFUkNMQVNTX1RZUEUgPSAiQE1hcHBlZFN1cGVyY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOSEVSSVRBTkNFX1RZUEUgPSAiQEluaGVyaXRhbmNlIjsgLy8kTk9OLU5MUy0xJAkKLQkJCi0JLyoqCi0JICogQ29uc3RydWN0cyBlbnRpdHkgbW9kZWwgYXMgZXhwYW5zaW9uIG9mIHRoZSBkYXRhIG1vZGVsCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZWNlc3NhcnkgaW1wb3J0cyBvbiBkZXBlbmRzIG9mIGVudGl0eSAocHJpbWFyeSBrZXlzKSBmaWVsZHMuIEl0IGlzIHVzZWQgZnJvbSAKLQkgKiBKRVQgZW1taXRlciB3aGVuIGl0IGdlbmVyYXRlcyBlbnRpdHkgKElkQ2xhc3MpCi0JICogQHBhcmFtIGlzSWRDbGFzcyBmbGFnLCB3aGljaCBpbmRpY2F0ZXMgdGhlIGNhc2UuIFdoZW4gaXQgaXMgZmFsc2UsIHRoZSByZXN1bHQgaXMgCi0JICogdGhlIGltcG9ydCBsaXN0IGZvciB0aGUgZW50aXR5IGNsYXNzLCBpbiBvdGhlciBjYXNlIHRoZSByZXN1bHRzIGlzIHRoZSBzZXQgZm9yIHRoZSBJZENsYXNzIAotCSAqIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBpbXBvcnRzIGNvbGxlY3Rpb24gd2l0aCB0aGUgaW1wb3J0cyBmb3IgdGhlIGdlbmVyYXRlZCBqYXZhIGNsYXNzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbXBvcnRzKGJvb2xlYW4gaXNJZENsYXNzKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQkKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZSgpOwotCQlTdHJpbmcgc3VwZXJjbGFzc05hbWUgPSBnZXRRdWFsaWZpZWRTdXBlcmNsYXNzTmFtZSgpOwotCi0JCWlmIChzdXBlcmNsYXNzTmFtZSAhPSBudWxsICYmIHN1cGVyY2xhc3NOYW1lLmxlbmd0aCgpID4gMCAmJiAKLQkJCQkhZXF1YWxTaW1wbGVOYW1lcyhjbGFzc05hbWUsIHN1cGVyY2xhc3NOYW1lKSkgewotCQkJY29sbGVjdGlvbi5hZGQoc3VwZXJjbGFzc05hbWUpOwotCQl9Ci0JCQotCQlMaXN0IGludGVyZmFjZXMgPSBnZXRRdWFsaWZpZWRJbnRlcmZhY2VzKCk7Ci0JCWlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gaW50ZXJmYWNlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBpZmFjZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoIWVxdWFsU2ltcGxlTmFtZXMoZ2V0Q2xhc3NOYW1lKCksIGlmYWNlKSkgewotCQkJCQljb2xsZWN0aW9uLmFkZChpZmFjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpc0lkQ2xhc3MpIHsKLQkJCWNvbGxlY3Rpb24uYWRkQWxsKGdldElkQ2xhc3NJbXBvcnRMaXN0KCkpOwotCQl9IGVsc2UgewkJCQotCQkJY29sbGVjdGlvbi5hZGQoUEVSU0lTVEVOQ0VfUEFDS0FHRSk7Ci0JCQljb2xsZWN0aW9uLmFkZEFsbChnZXRGaWVsZEltcG9ydExpc3QoKSk7Ci0JCQkKLQkJfQotCQlyZXR1cm4gY29sbGVjdGlvbjsKLQl9CQotCi0JLyoqCi0JICogQHJldHVybiBjbGFzcyBuYW1lIG9mIHRoZSBlbnRpdHkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUUpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHBhY2thZ2UgbmFtZSB3aGVuIHRoZSBlbnRpdHkgd2lsbCBiZSBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFQYWNrYWdlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRSkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gZnVsbHkgcXVhbGlmaWVkIGphdmEgY2xhc3MgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpIHsKLQkJaWYgKCFnZXRKYXZhUGFja2FnZU5hbWUoKS5lcXVhbHMoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU1QVFlfU1RSSU5HKSkgewotCQkJcmV0dXJuIGdldEphdmFQYWNrYWdlTmFtZSgpICsgRE9UICsgZ2V0Q2xhc3NOYW1lKCk7Ci0JCX0gCi0JCXJldHVybiBnZXRDbGFzc05hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3VwZXJjbGFzc05hbWUoKSB7Ci0JCVN0cmluZyBxdWFsaWZpZWQgPSBnZXRRdWFsaWZpZWRTdXBlcmNsYXNzTmFtZSgpOwotCQlpZiAoZXF1YWxTaW1wbGVOYW1lcyhnZXRDbGFzc05hbWUoKSwgcXVhbGlmaWVkKSkgewotCQkJcmV0dXJuIHF1YWxpZmllZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShxdWFsaWZpZWQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGl0eSdzIHN1cGVyIGNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRTdXBlcmNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNVUEVSQ0xBU1MpLnRyaW0oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBsaXN0IHdpdGggdGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgZnJvbSBlbnRpdHkgY2xhc3MgCi0JICovCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJbnRlcmZhY2VzKCkgewotCQlMaXN0IHF1YWxpZmllZEludGVyZmFjZXMgPSBnZXRRdWFsaWZpZWRJbnRlcmZhY2VzKCk7Ci0JCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHF1YWxpZmllZEludGVyZmFjZXMuc2l6ZSgpKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXIgPSBxdWFsaWZpZWRJbnRlcmZhY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHF1YWxpZmllZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVxdWFsU2ltcGxlTmFtZXMoZ2V0Q2xhc3NOYW1lKCksIHF1YWxpZmllZCkpIHsKLQkJCQlpbnRlcmZhY2VzLmFkZChxdWFsaWZpZWQpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnRlcmZhY2VzLmFkZChTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShxdWFsaWZpZWQpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGludGVyZmFjZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBsaXN0IHdpdGggdGhlIGludGVyZmFjZXMgKGZ1bGx5IHF1YWxpZmllZCBuYW1lZCkgaW1wbGVtZW50ZWQgZnJvbSBlbnRpdHkgY2xhc3MKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRRdWFsaWZpZWRJbnRlcmZhY2VzKCkgewotCQlMaXN0IGludGVyZmFjZXMgPSAoTGlzdCkgdGhpcy5kYXRhTW9kZWwuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUyk7CQkKLQkJaWYgKGludGVyZmFjZXMgPT0gbnVsbCl7Ci0JCQlpbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IAotCQlpbnRlcmZhY2VzLmFkZChRVUFMSUZJRURfU0VSSUFMSVpBQkxFKTsKLQkJcmV0dXJuIGludGVyZmFjZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcgcHJvcGVydHkKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHJldHVybiBzdHJpbmcgdmFsdWUgb2YgdGVoIHNwZWNpZmllZCBwcm9wZXJ0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2RzIGlzIHVzZWQgZm9yIHRoZSBjb21wYXJpc29uIG9mIGZ1bGx5IHF1YWxpZmllZCB0eXBlcyAKLQkgKiBAcGFyYW0gbmFtZTEgZmlyc3QgdHlwZSBuYW1lCi0JICogQHBhcmFtIG5hbWUyIHNlY29uZCB0eXBlIG5hbWUKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHNpbXBsZSBuYW1lcyBvZiB0aGUgdHlwZXMgYXJlIGVxdWFsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxTaW1wbGVOYW1lcyhTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQlTdHJpbmcgc2ltcGxlTmFtZTEgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShuYW1lMSk7Ci0JCVN0cmluZyBzaW1wbGVOYW1lMiA9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKG5hbWUyKTsKLQkJcmV0dXJuIHNpbXBsZU5hbWUxLmVxdWFscyhzaW1wbGVOYW1lMik7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGFydGlmYWN0IC0gRW50aXR5IG9yIE1hcHBlZCBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdFR5cGUoKSB7Ci0JCWlmKGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuTUFQUEVEX0FTX1NVUEVSQ0xBU1MpKSB7Ci0JCQlyZXR1cm4gTUFQUEVEX0FTX1NVUEVSQ0xBU1NfVFlQRTsKLQkJfSAKLQkJcmV0dXJuIEVOVElUWV9BTk5PVEFUSU9OOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciBlbnRpdHkgc2V0IGluaGVyaXRhbmNlIHN0cmF0ZWd5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0YW5jZVNldCgpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuSU5IRVJJVEFOQ0UpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBpbmhlcml0YW5jZSBzdHJhdGVneSwgYXMgaXQgaXMgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5oZXJpdGFuY2VTdHJhdGVneU5hbWUoKSB7CQkKLQkJcmV0dXJuIGdldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSEVSSVRBTkNFX1NUUkFURUdZKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgY29uc3RydWN0ZWQgQEluaGVyaXRhbmNlIGFubm90YXRpb24gd2l0aCB0aGUgcmVsZXZhbnQgc3RyYXRlZ3kKLQkgKiBpZiBpdCBpcyBjaG9zZW4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTVBUWV9TVFJJTkc7Ci0JCWlmIChpc0luaGVyaXRhbmNlU2V0KCkpIHsJCi0JCQlyZXN1bHQgPSBJTkhFUklUQU5DRV9UWVBFOwotCQkJaWYgKCFnZXRQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5JTkhFUklUQU5DRV9TVFJBVEVHWSkuZXF1YWxzKElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVNUFRZX1NUUklORykpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCArPSAiKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS4iICsgZ2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuSU5IRVJJVEFOQ0VfU1RSQVRFR1kpICsgIikiOyAvLyROT04tTkxTLTEkICROT04tTkxTLTIkCi0JCQkKLQkJCX0JCQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQkKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBhcnRpZmFjdCBpcyBub3QgZW50aXR5IAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9uRW50aXR5U3VwZXJjbGFzcygpIHsKLQkJcmV0dXJuICFkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIHRoZSBjcmVhdGVkIGFydGlmYWN0IHdpbGwgYmUgYW5ub3RhdGVkCi0JICogQHJldHVybiBmYWxzZSB0aGUgZW50aXR5IG1hcHBpbmdzIHdpbGwgYmUgcmVnaXN0ZXJlZCBpbiBYTUwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FydGlmYWN0c0Fubm90YXRlZCgpIHsKLQkJcmV0dXJuICFkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9TVVBQT1JUKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYXBwaW5nWE1MRGVmYXVsdCgpIHsKLQkJaWYgKGdldE1hcHBpbmdYTUxOYW1lKCkuZXF1YWxzKElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVNUFRZX1NUUklORykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBnZXRNYXBwaW5nWE1MTmFtZSgpLmVxdWFscyhKcHRDb3JlUGx1Z2luLmdldERlZmF1bHRPcm1YbWxEZXBsb3ltZW50VVJJKGdldFByb2plY3QoKSkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdYTUxOYW1lKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FKS50cmltKCk7Ci0JfQotCQotCXB1YmxpYyBJRmlsZSBnZXRNYXBwaW5nWG1sRmlsZSgpIHsKLQkJSUZpbGUgb3JtRmlsZSA9IG51bGw7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gc291cmNlRnJhZ21lbnRzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U291cmNlQ29udGFpbmVycyhwcm9qZWN0KTsKLQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290IDogc291cmNlRnJhZ21lbnRzKSB7Ci0JCQlvcm1GaWxlID0gcHJvamVjdC5nZXRGaWxlKHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArIGdldE1hcHBpbmdYTUxOYW1lKCkpOwotCQkJaWYgKG9ybUZpbGUuZXhpc3RzKCkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBvcm1GaWxlOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBlbnRpdHkgbmFtZSAoY291bGQgYmUgZGlmZmVyZW50IGZyb20gdGhlIGNsYXNzIG5hbWUpCi0JICogU2VlIDxjb2RlPmlzRW50aXR5TmFtZVNldCgpPGNvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU5USVRZX05BTUUpLnRyaW0oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkgbmFtZSBpcyBkaWZmZXJlbnQgdGhhbiBjbGFzcyBuYW1lCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbnRpdHlOYW1lU2V0KCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoIWdldENsYXNzTmFtZSgpLmVxdWFscyhnZXRFbnRpdHlOYW1lKCkpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdGFibGUgbmFtZSBpcyBzcGVjaWZpZWQgZXhwbGljaXRseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGFibGVOYW1lU2V0KCkgewotCQlyZXR1cm4gIWRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuVEFCTEVfTkFNRV9ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgdGFibGUgbmFtZSAoaWYgaXQgaXMgc3BlY2lmaWVkKQotCSAqIFNlZSA8Y29kZT5pc1RhYmxlTmFtZVNldCgpPGNvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5UQUJMRV9OQU1FKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBsaXN0IHdpdGggdGhlIGVudGl0eSBmaWVsZHMKLQkgKi8KLQlwdWJsaWMgTGlzdDxFbnRpdHlSb3c+IGdldEVudGl0eUZpZWxkcygpIHsKLQkJQXJyYXlMaXN0PEVudGl0eVJvdz4gZmllbGRzID0gKEFycmF5TGlzdDxFbnRpdHlSb3c+KSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU5USVRZX0ZJRUxEUyk7Ci0JCWlmIChmaWVsZHMgPT0gbnVsbCl7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxFbnRpdHlSb3c+KCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGxpc3Qgd2l0aCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRoZSBlbnRpdHkgKGJhc2VkIG9uIGl0cyBmaWVsZHMpCi0JICovCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRGaWVsZEltcG9ydExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBpbXBvcnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUxpc3Q8RW50aXR5Um93PiBlbnRpdGllcyA9IGdldEVudGl0eUZpZWxkcygpOwotCQlmb3IgKEVudGl0eVJvdyBlbnRpdHlSb3cgOiBlbnRpdGllcykgewotCQkJaWYgKCFpbXBvcnRzLmNvbnRhaW5zKGVudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpKSAmJiAhZW50aXR5Um93LmdldFR5cGUoKS5lcXVhbHMoZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCkpKSB7Ci0JCQkJU3RyaW5nIGZxblR5cGVOYW1lID0gZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCk7Ci0JCQkJLy9yZW1vdmUgdGhlIGFycmF5IGJyYWNrZXRzIFtdIGZvciB0aGUgamF2YS5sYW5nLkJ5dGVbXSAmIGphdmEubGFuZy5DaGFyYWN0ZXJbXQotCQkJCWlmIChmcW5UeXBlTmFtZS5pbmRleE9mKEJSQUNLRVQpICE9IC0xKSB7Ci0JCQkJCWZxblR5cGVOYW1lID0gZnFuVHlwZU5hbWUuc3Vic3RyaW5nKDAsIGZxblR5cGVOYW1lLmluZGV4T2YoIlsiKSk7Ci0JCQkJfQotCQkJCWltcG9ydHMuYWRkKGZxblR5cGVOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1wb3J0czsJCQotCX0KLQkvKioKLQkgKiBAcmV0dXJuIGxpc3Qgd2l0aCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRoZSBpZCBjbGFzcyAoYmFzZWQgb24gaXRzIGZpZWxkcyAtIHByaW1hcnkga2V5cyBvZiB0aGUgZW50aXR5KQotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SWRDbGFzc0ltcG9ydExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBpbXBvcnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUxpc3Q8RW50aXR5Um93PiBlbnRpdGllcyA9IGdldEVudGl0eUZpZWxkcygpOwotCQlMaXN0PFN0cmluZz4gcGtGaWVsZHMgPSBnZXRQS0ZpZWxkcygpOwotCQlmb3IgKEVudGl0eVJvdyBlbnRpdHlSb3cgOiBlbnRpdGllcykgewotCQkJU3RyaW5nIG5hbWUgPSBlbnRpdHlSb3cuZ2V0TmFtZSgpOwotCQkJaWYgKHBrRmllbGRzLmNvbnRhaW5zKG5hbWUpKSB7CQkJCi0JCQkJaWYgKCFpbXBvcnRzLmNvbnRhaW5zKGVudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpKSAmJiAhZW50aXR5Um93LmdldFR5cGUoKS5lcXVhbHMoZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCkpKSB7Ci0JCQkJCWltcG9ydHMuYWRkKGVudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltcG9ydHM7CQkKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBhY2Nlc3MgdHlwZSBpcyBmaWVsZCBiYXNlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmllbGRBY2Nlc3MoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkZJRUxEX0FDQ0VTU19UWVBFKTsKLQl9CQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHByaW1hcnkga2V5IGlzIGNvbXBvc2l0ZSAobW9yZSB0aGFuIG9uZSBhbm5vdGF0ZWQgYXMgcHJpbWFyeSBrZXkgZmllbGQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wb3NpdGVQSygpIHsKLQkJcmV0dXJuIGdldFBLRmllbGRzKCkuc2l6ZSgpID4gMTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGxpc3Qgd2l0aCBwcmltYXJ5IGtleSBuYW1lKHMpCi0JICovCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQS0ZpZWxkcygpIHsKLQkJcmV0dXJuIChBcnJheUxpc3Q8U3RyaW5nPilkYXRhTW9kZWwuZ2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuUEtfRklFTERTKTsKLQl9CQotCQotCS8qKgotCSAqIEByZXR1cm4gY29uc3RydWN0ZWQgbmFtZSBvZiB0aGUgaWQgY2xhc3MgKGVudGl0eSBuYW1lICsgUEsgYXMgc3VmZml4KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRDbGFzc05hbWUoKSArIFBLX1NVRkZJWDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBJUHJvamVjdCBwcmVzZW50YXRpb24gb2YgSlBBIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCX0JCi0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlMjU2Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL21vZGVsL0VudGl0eURhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LkVudGl0eVdpemFyZE1zZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5vcGVyYXRpb24uTmV3RW50aXR5Q2xhc3NPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVDb21tb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5OZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXN7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IE5ld0VudGl0eUNsYXNzT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogRXh0ZW5kczogPGNvZGU+SURhdGFNb2RlbFByb3ZpZGVyI2dldFByb3BlcnR5TmFtZXMoKTwvY29kZT4KLQkgKiBhbmQgYWRkIG93biBkYXRhIG1vZGVsJ3MgcHJvcGVydGllcyBzcGVjaWZpYyBmb3IgdGhlIGVudGl0eSBtb2RlbAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpCi0JICovCi0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewkJCi0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChJTkhFUklUQU5DRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEVOVElUWSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE1BUFBFRF9BU19TVVBFUkNMQVNTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoSU5IRVJJVEFOQ0VfU1RSQVRFR1kpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChYTUxfU1VQUE9SVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFhNTF9OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRU5USVRZX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChUQUJMRV9OQU1FX0RFRkFVTFQpOwkJCi0JCXByb3BlcnR5TmFtZXMuYWRkKFRBQkxFX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChFTlRJVFlfRklFTERTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUEtfRklFTERTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRklFTERfQUNDRVNTX1RZUEUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9QRVJUWV9BQ0NFU1NfVFlQRSk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgKHdoaWNoIHNob3VsZCBwcmVzZW50IGEgdmFsaWQgZGF0YSBtb2RlbCBwcm9wZXJ0eSkuICAKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gSXQgbWF5IHJldHVybiBudWxsLiAKLQkgKiAKLQkgKiBAc2VlIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcpCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHJldHVybiBPYmplY3QgZGVmYXVsdCB2YWx1ZSBvZiBwcm9wZXJ0eQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU5IRVJJVEFOQ0UpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVOVElUWSkpIHsKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhNQVBQRURfQVNfU1VQRVJDTEFTUykpIHsKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoWE1MX1NVUFBPUlQpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFhNTF9OQU1FKSkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsJCQkKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVOVElUWV9OQU1FKSkgewotCQkJcmV0dXJuIGdldFN0cmluZ1Byb3BlcnR5KENMQVNTX05BTUUpOwkJCQotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVEFCTEVfTkFNRV9ERUZBVUxUKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFRBQkxFX05BTUUpKSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nUHJvcGVydHkoQ0xBU1NfTkFNRSk7CQkJCi0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTkhFUklUQU5DRV9TVFJBVEVHWSkpIHsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7IAotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU1VQRVJDTEFTUykpIHsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFTlRJVFlfRklFTERTKSkgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8RW50aXR5Um93PigpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEtfRklFTERTKSkgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRklFTERfQUNDRVNTX1RZUEUpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQUNDRVNTX1RZUEUpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsJCQkKLQkJfSAKLQkJLy8gT3RoZXJ3aXNlIGNoZWNrIHN1cGVyIGZvciBkZWZhdWx0IHZhbHVlIGZvciBwcm9wZXJ0eQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyogQWRkcyBhZGRpdGlvbmFsIGNoZWNrIHRvIHRoZSBtb2RlbCB2YWxpZGF0aW9uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5OZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSVN0YXR1cyByZXN1bHQgPSBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKQVZBX1BBQ0tBR0UpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVKYXZhUGFja2FnZShnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTVVBFUkNMQVNTKSAmJiBFTVBUWV9TVFJJTkcuZXF1YWxzKGdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSkpKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhYTUxfTkFNRSkpIHsKLS8vCQkJU3RyaW5nIHhtbE5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotLy8JCQl4bWxOYW1lID0geG1sTmFtZS5zdWJzdHJpbmcoeG1sTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikgKyAxKTsKLS8vCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZU5hbWUoeG1sTmFtZSwgSVJlc291cmNlLkZJTEUpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVOVElUWV9GSUVMRFMpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVGaWVsZHNMaXN0KChBcnJheUxpc3Q8RW50aXR5Um93PikgZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsJCQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEl0IHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29ycmVjdG5lc3Mgb2YgZW50aXR5IHBhY2thZ2UKLQkgKiBpbiBhY2NvcmRhbmNlIHdpdGggSmF2YSBjb252ZW50aW9uIHJlcXVpcmVtZW50cy4gVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gCi0JICogCi0JICogQHNlZSBOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlKFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gcGFja05hbWUKLQkgKiBAcmV0dXJuIElTdGF0dXMgaXMgdGhlIHBhY2thZ2UgbmFtZSBzYXRpc2ZpZXMgSmF2YSBjb252ZW50aW9uIHJlcXVpcmVtZW50cwotCSAqLwotCQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUphdmFQYWNrYWdlKFN0cmluZyBwYWNrTmFtZSkgewkJCi0JCWlmIChwYWNrTmFtZSA9PSBudWxsIHx8IHBhY2tOYW1lLmVxdWFscyhFTVBUWV9TVFJJTkcpKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZVdhcm5pbmdTdGF0dXMoRW50aXR5V2l6YXJkTXNnLkRFRkFVTFRfUEFDS0FHRV9XQVJOSU5HKTsKLQkJfQkJCQotCQkvLyBVc2Ugc3RhbmRhcmQgamF2YSBjb252ZW50aW9ucyB0byB2YWxpZGF0ZSB0aGUgcGFja2FnZSBuYW1lCi0JCUlTdGF0dXMgamF2YVN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKHBhY2tOYW1lKTsKLQkJaWYgKGphdmFTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQlTdHJpbmcgbXNnID0gSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9KQVZBX1BBQ0FLR0VfTkFNRV9JTlZBTElEICsgamF2YVN0YXR1cy5nZXRNZXNzYWdlKCk7CQkJCQotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9IGVsc2UgaWYgKGphdmFTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCVN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfUEFDS0FHRV9OQU1FX1dBUk5JTkcgKyBqYXZhU3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlV2FybmluZ1N0YXR1cyhtc2cpOwotCQl9CQkKLQkJLy8gamF2YSBwYWNrYWdlIG5hbWUgaXMgdmFsaWQKLQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JfQotCQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gSXQgd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBlbnRpdHkgZmllbGRzCi0JICogbGlzdCB0byBlbnN1cmUgdGhlcmUgYXJlIG5vdCBhbnkgZHVwbGljYXRlcy4gVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gCi0JICogCi0JICogQHNlZSBOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlKFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gZW50aXRpZXMKLQkgKiBAcmV0dXJuIElTdGF0dXMgaXMgdGhlIGZpZWxkcyBuYW1lcyBhcmUgdW5pcXVlCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlRmllbGRzTGlzdChBcnJheUxpc3Q8RW50aXR5Um93PiBlbnRpdGllcykgewotCQlpZiAoZW50aXRpZXMgIT0gbnVsbCAmJiAhZW50aXRpZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBFbnN1cmUgdGhlcmUgYXJlIG5vdCBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUgbGlzdAotCQkJYm9vbGVhbiBkdXAgPSBoYXNEdXBsaWNhdGVzSW5FbnRpdHlGaWVsZHMoZW50aXRpZXMpOwotCQkJaWYgKGR1cCkgewotCQkJCVN0cmluZyBtc2cgPSBFbnRpdHlXaXphcmRNc2cuRFVQTElDQVRFRF9FTlRJVFlfTkFNRVNfTUVTU0FHRTsJCQkJCi0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQkJfQotCQl9Ci0JCS8vIFJldHVybiBPSwotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCBwcm92aWRlcyBhIHNpbXBsZSBhbGdvcml0aG0gZm9yIGRldGVjdGluZwotCSAqIGlmIHRoZXJlIGFyZSBkdXBsaWNhdGUgZW50cmllcyBpbiBhIGxpc3QuIEl0IHdpbGwgYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgcmV0dXJuCi0JICogYm9vbGVhbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcmV0dXJuIGJvb2xlYW4gYXJlIHRoZXJlIGR1cGxpY2F0aW9ucyBpbiB0aGUgbGlzdAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNEdXBsaWNhdGVzSW5FbnRpdHlGaWVsZHMoQXJyYXlMaXN0PEVudGl0eVJvdz4gaW5wdXQpIHsKLQkJaWYgKGlucHV0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgbiA9IGlucHV0LnNpemUoKTsKLQkJLy8gbmVzdGVkIGZvciBsb29wcyB0byBjaGVjayBlYWNoIGVsZW1lbnQgdG8gc2VlIGlmIG90aGVyIGVsZW1lbnRzIGFyZSB0aGUgc2FtZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJRW50aXR5Um93IGVudGl0eSA9IGlucHV0LmdldChpKTsKLQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IG47IGorKykgewotCQkJCUVudGl0eVJvdyBpbnRFbnRpdHkgPSBpbnB1dC5nZXQoaik7Ci0JCQkJaWYgKGludEVudGl0eS5nZXROYW1lKCkuZXF1YWxzKGVudGl0eS5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBmYWxzZTsKLQl9CQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvRW50aXR5Um93LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL21vZGVsL0VudGl0eVJvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmQ3YjBkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvRW50aXR5Um93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRW50aXR5Um93IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1QgPSAiLiI7Ci0JcHJpdmF0ZSBib29sZWFuIGtleSA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSAiIjsKLQlwcml2YXRlIFN0cmluZyB0eXBlID0gIiI7Ci0JcHJpdmF0ZSBTdHJpbmcgZnFuVHlwZU5hbWUgPSAiIjsKLQlwcml2YXRlIGJvb2xlYW4gaXNTaW1wbGVUeXBlID0gZmFsc2U7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBQS19UWVBFUyA9IHsiaW50IiwgImxvbmciLCAic2hvcnQiLCAiY2hhciIsICJib29sZWFuIiwgImJ5dGUiLCAiZG91YmxlIiwgImZsb2F0IiwgCi0JCSJqYXZhLmxhbmcuU3RyaW5nIiwgImphdmEuc3FsLkRhdGUiLCAiamF2YS51dGlsLkRhdGUiLCAiamF2YS5sYW5nLkludGVnZXIiLCAiamF2YS5sYW5nLkxvbmciLCAiamF2YS5sYW5nLlNob3J0IiwKLQkJImphdmEubGFuZy5DaGFyYWN0ZXIiLCAiamF2YS5sYW5nLkJvb2xlYW4iLCAiamF2YS5sYW5nLkJ5dGUiLCAiamF2YS5sYW5nLkRvdWJsZSIsICJqYXZhLmxhbmcuRmxvYXQifTsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBMaXN0PFN0cmluZz4gVkFMSURfUEtfVFlQRVMgPSBBcnJheXMuYXNMaXN0KFBLX1RZUEVTKTsKLQkKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIDxjb2RlPkVudGl0eUNvbHVtbjwvY29kZT4uCi0JICovCi0JcHVibGljIEVudGl0eVJvdygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiAKLQkgKiBDb25zdHJ1Y3RzIDxjb2RlPkVudGl0eUNvbHVtbjwvY29kZT4gd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMKLQkgKiAKLQkgKiBAcGFyYW0gZnFuVHlwZU5hbWUgLSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50aXR5IGZpZWxkIHR5cGUKLQkgKiBAcGFyYW0gbmFtZSAtIG5hbWUgb2YgdGhlIGVudGl0eSBmaWVsZAotCSAqIEBwYXJhbSBpc0tleSAtIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudGl0eSBmaWVsZCBpcyBwcmltYXJ5IGtleSBvciBwYXJ0IG9mIGNvbXBvc2l0ZSBwcmltYXJ5IGtleQotCSAqLwotCXB1YmxpYyBFbnRpdHlSb3coU3RyaW5nIGZxblR5cGVOYW1lLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0tleSkgewotCQlzdXBlcigpOwotCQl0aGlzLmZxblR5cGVOYW1lID0gdHlwZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5rZXkgPSBpc0tleTsKLQkJaWYgKGZxblR5cGVOYW1lLmluZGV4T2YoRE9UKSA9PSAtMSkgewotCQkJdHlwZSA9IGZxblR5cGVOYW1lOwotCQkJaXNTaW1wbGVUeXBlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXR5cGUgPSBnZXRTaW1wbGVOYW1lKGZxblR5cGVOYW1lKTsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHByZXNlbnRlZCBlbnRpdHkgZmllbGQgaXMgcHJpbWFyeSBrZXkgb3IgcGFydCBvZiBjb21wb3NpdGUgcHJpbWFyeSBrZXkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0tleSgpIHsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcmVzZW50ZWQgZW50aXR5IGZpZWxkIHRvIGJlIHByaW1hcnkga2V5IChvciBwYXJ0IG9mIGNvbXBvc2l0ZSBwcmltYXJpIGtleSkKLQkgKiAKLQkgKiBAcGFyYW0ga2V5IAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleShib29sZWFuIGtleSkgewotCQl0aGlzLmtleSA9IGtleTsKLQl9Ci0JCQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIHR5cGUgb2YgdGhlIGVudGl0eSBpcyBhbGxvd2VkIHRvIGJlIHByaW1hcnkga2V5LgotCSAqIFRoZSBsaW1pdGF0aW9uIGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHRoYXQgRW1iZWRkZWQgUEsgYXJlIG5vdCBjaGVja2VkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSB0eXBlIG9mIGZpZWxkIGNvdWxkIGJlIHVzZWQgYXMgcHJpbWFyeSBrZXkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb3VsZEJlS2V5KCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXN1bHQgPSBWQUxJRF9QS19UWVBFUy5jb250YWlucyhnZXRGcW5UeXBlTmFtZSgpKTsJCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVudGl0eSBmaWVsZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJlc2VudGVkIGVudGl0eSBmaWVsZAotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHR5cGUgKGFzIGEgc2ltcGxlIG5hbWUpIG9mIHRoZSBlbnRpdHkgZmllbGQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHR5cGUgKGFzIGEgc2ltcGxlIG5hbWUpIG9mIHRoZSBlbnRpdHkgZmllbGQKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIChhcyBmdWxseSBxdWFsaWZpZWQgbmFtZSkgb2YgdGhlIGVudGl0eSBmaWVsZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnFuVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBmcW5UeXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIG9mIHRoZSBlbnRpdHkgZmllbGQKLQkgKiAKLQkgKiBAcGFyYW0gZnFuVHlwZU5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcW5UeXBlTmFtZShTdHJpbmcgZnFuVHlwZU5hbWUpIHsKLQkJdGhpcy5mcW5UeXBlTmFtZSA9IGZxblR5cGVOYW1lOwotCQlpZiAoZnFuVHlwZU5hbWUuaW5kZXhPZihET1QpID09IC0xKSB7Ci0JCQlzZXRUeXBlKGZxblR5cGVOYW1lKTsKLQkJCXNldFNpbXBsZVR5cGUodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRUeXBlKGdldFNpbXBsZU5hbWUoZnFuVHlwZU5hbWUpKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGlzIHRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgZmllbGQgaXMgcHJpbWl0aXZlIHR5cGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZVR5cGUoKSB7Ci0JCXJldHVybiBpc1NpbXBsZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZSB0aGUgdHlwZSBvZiB0aGUgZW50aXR5IGZpZWxkIGFzIHByaW1pdGl2ZSB0eXBlCi0JICogCi0JICogQHBhcmFtIGlzU2ltcGxlVHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpbXBsZVR5cGUoYm9vbGVhbiBpc1NpbXBsZVR5cGUpIHsKLQkJdGhpcy5pc1NpbXBsZVR5cGUgPSBpc1NpbXBsZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgZmllbGQgaXMgYm9vbGVhbi4gVGhlIGluZm9ybWF0aW9uIGNvdWxkIGJlIHVzZWQgCi0JICogd2hlbiB0aGUgbmFtZSBvZiBnZXR0ZXIgc2hvdWxkIGJlIGNvbnN0cnVjdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCb29sZWFuKCkgewotCQlyZXR1cm4gImJvb2xlYW4iLmVxdWFscyhnZXRUeXBlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgaW50ZXJuYWwgcHVycG9zZSBvbmx5Ci0JICogQ29udmVydCBmdWxseSBxdWFsaWZpZWQgbmFtZSB0byB0aGUgc2ltcGxlIG9uZQotCSAqIEBwYXJhbSBmdWxseU5hbWUKLQkgKiBAcmV0dXJuIHRoZSBzaW1wbGUgbmFtZSBmb3JtIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBwYXJhbWV0ZXIobGFzdCBzZWdtZW50KQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNpbXBsZU5hbWUoU3RyaW5nIGZ1bGx5TmFtZSkgewotCQlyZXR1cm4gZnVsbHlOYW1lLnN1YnN0cmluZyhmdWxseU5hbWUubGFzdEluZGV4T2YoRE9UKSArIDEpOwotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCWludCByZXN1bHQgPSAxOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdAotCQkJCSsgKChmcW5UeXBlTmFtZSA9PSBudWxsKSA/IDAgOiBmcW5UeXBlTmFtZS5oYXNoQ29kZSgpKTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG5hbWUgPT0gbnVsbCkgPyAwIDogbmFtZS5oYXNoQ29kZSgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEltcGxlbWVudCBlcXVhbHMsIGRlcGVuZGluZyBmcm9tIG5hbWUgb2YgdGhlIGVudGl0eSBmaWVsZCBhbmQgaXRzIHR5cGUuCi0JICogVGhlIHR5cGUgaXMgcHJlc2VudGVkIGZyb20gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmaW5hbCBFbnRpdHlSb3cgb3RoZXIgPSAoRW50aXR5Um93KSBvYmo7Ci0JCWlmIChmcW5UeXBlTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIuZnFuVHlwZU5hbWUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIWZxblR5cGVOYW1lLmVxdWFscyhvdGhlci5mcW5UeXBlTmFtZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCWlmIChvdGhlci5uYW1lICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhvdGhlci5uYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9JRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9JRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTAzZGFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGltaXRlciBEaW1pdHJvdiwgZC5kaW1pdHJvdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLCBJQW5ub3RhdGlvbnNEYXRhTW9kZWwgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX0FTX1NVUEVSQ0xBU1MgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuTUFQUEVEX0FTX1NVUEVSQ0xBU1MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5IRVJJVEFOQ0UgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuSU5IRVJJVEFOQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5IRVJJVEFOQ0VfU1RSQVRFR1kgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuSU5IRVJJVEFOQ0VfU1RSQVRFR1kiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NVUFBPUlQgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX1NVUFBPUlQiOyAvLyROT04tTkxTLTEkWE1MX1NVUFBPUlQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX05BTUUgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX05BTUUiOyAvLyROT04tTkxTLTEkWE1MX1NVUFBPUlQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTkFNRSA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FX0RFRkFVTFQgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuVEFCTEVfTkFNRV9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuVEFCTEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfRklFTERTID0gIklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWV9GSUVMRFMiOyAvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBLX0ZJRUxEUyA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5QS19GSUVMRFMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfQUNDRVNTX1RZUEUgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRklFTERfQUNDRVNTX1RZUEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQUNDRVNTX1RZUEUgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuUFJPUEVSVFlfQUNDRVNTX1RZUEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQJCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL29wZXJhdGlvbi9OZXdFbnRpdHlDbGFzc09wZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9vcGVyYXRpb24vTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzYWIzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL29wZXJhdGlvbi9OZXdFbnRpdHlDbGFzc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGltaXRlciBEaW1pdHJvdiwgZC5kaW1pdHJvdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmpldC5KRVRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5FbnRpdHlXaXphcmRNc2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXIuQW5ub3RhdGlvbnNDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuV1RQSkVURW1pdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLldGVFdyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogVGhlIE5ld0VudGl0eUNsYXNzT3BlcmF0aW9uIGlzIElEYXRhTW9kZWxPcGVyYXRpb24gZm9sbG93aW5nIHRoZQotICogSURhdGFNb2RlbCB3aXphcmQgYW5kIG9wZXJhdGlvbiBmcmFtZXdvcmsuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgdG8gZ2VuZXJhdGUgamF2YSBjbGFzc2VzIGZvciB0aGUgbmV3IEpQQSBlbnRpdHkuIEl0IHVzZXMgCi0gKiBFbnRpdHlEYXRhTW9kZWxQcm92aWRlciB0byBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGUgbmV3IGVudGl0eS4gCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIKLSAqIAotICogQSBXVFBKZXRFbWl0dGVyIGVudGl0eSB0ZW1wbGF0ZSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY2xhc3Mgd2l0aCB0aGUgZW50aXR5IHRlbXBsYXRlLiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5XVFBKRVRFbWl0dGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLkNyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwKLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0pBVkEgPSAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUiA9ICIvIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fU1RSSU5HID0gIjEuMCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRCA9ICJGSUVMRCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWSA9ICJQUk9QRVJUWSI7Ly8kTk9OLU5MUy0xJAkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXVFBfQ1VTVE9NSVpBVElPTl9QTFVHSU4gPSAiV1RQX0NVU1RPTUlaQVRJT05fUExVR0lOIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRFRF9FTlRJVFlfVEVNUExBVEVfRklMRSA9ICIvdGVtcGxhdGVzL2Fubm90YXRlZF9lbnRpdHkuamF2YWpldCI7IC8vJE5PTi1OTFMtMSQJCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RFTVBMQVRFX0ZJTEUgPSAiL3RlbXBsYXRlcy9lbnRpdHkuamF2YWpldCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRENMQVNTX1RFTVBMQVRFX0ZJTEUgPSAiL3RlbXBsYXRlcy9pZENsYXNzLmphdmFqZXQiOyAvLyROT04tTkxTLTEkCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERVJfSUQgPSAiYnVpbGRlcklkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9UQUJMRSA9ICJTSU5HTEVfVEFCTEUiOy8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY29uc3RydWN0b3Igd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIE5ld0VudGl0eUNsYXNzT3BlcmF0aW9uLiAKLQkgKiBBbiBpbnN0YW5jZSBvZiB0aGUgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBzaG91bGQgYmUgcGFzc2VkIGluLiBUaGlzIGRvZXMgbm90IGFjY2VwdAotCSAqIG51bGwgcGFyYW1ldGVyLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIEFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uI0FydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uKElEYXRhTW9kZWwpCi0JICogQHNlZSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsCi0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqIEByZXR1cm4gTmV3RmlsdGVyQ2xhc3NPcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGV4ZWN1dGUgbWV0aG9kIGRyaXZlcyB0aGUgcnVubmluZyBvZiB0aGUgb3BlcmF0aW9uLiAKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHdpbGwgY3JlYXRlIHRoZSBqYXZhIHNvdXJjZSBmb2xkZXIsIGNyZWF0ZSB0aGUgamF2YSBwYWNrYWdlLCBhbmQgdGhlbiAKLQkgKiB0aGUgZW50aXR5IChvciBtYXBwZWQgYXMgc3VwZXJjbGFzcykgYW5kIElEIGNsYXNzIGZpbGVzIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0ZW1wbGF0ZXMuIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5XVFBPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiBAc2VlIE5ld0VudGl0eUNsYXNzT3BlcmF0aW9uI2dlbmVyYXRlVXNpbmdUZW1wbGF0ZXMoSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIElQYWNrYWdlRnJhZ21lbnQpCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gQ3JlYXRlIHNvdXJjZSBmb2xkZXIgaWYgaXQgZG9lcyBub3QgZXhpc3QKLQkJY3JlYXRlSmF2YVNvdXJjZUZvbGRlcigpOwotCQkvLyBDcmVhdGUgamF2YSBwYWNrYWdlIGlmIGl0IGRvZXMgbm90IGV4aXN0Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IGNyZWF0ZUphdmFQYWNrYWdlKCk7Ci0JCS8vIEdlbmVyYXRlIGZpbHRlciBjbGFzcyB1c2luZyB0ZW1wbGF0ZXMKLQkJdHJ5IHsKLQkJCWdlbmVyYXRlVXNpbmdUZW1wbGF0ZXMobW9uaXRvciwgcGFjayk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgamF2YSBwYWNrYWdlIGFzIHNwZWNpZmllZCBieSB0aGUgbmV3IGphdmEKLQkgKiBjbGFzcyBkYXRhIG1vZGVsLiBJZiB0aGUgcGFja2FnZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBjcmVhdGUgdGhlCi0JICogcGFja2FnZS4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzI0pBVkFfUEFDS0FHRQotCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QjY3JlYXRlUGFja2FnZUZyYWdtZW50KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBib29sZWFuLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiAKLQkgKiBAcmV0dXJuIElQYWNrYWdlRnJhZ21lbnQgdGhlIGphdmEgcGFja2FnZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJUGFja2FnZUZyYWdtZW50IGNyZWF0ZUphdmFQYWNrYWdlKCkgewotCQkvLyBSZXRyaWV2ZSB0aGUgcGFja2FnZSBuYW1lIGZyb20gdGhlIGphdmEgY2xhc3MgZGF0YSBtb2RlbAotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0UpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrUm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgbW9kZWwKLQkJCQkuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOwotCQlJUGFja2FnZUZyYWdtZW50IHBhY2sgPSBwYWNrUm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpOwotCQkvLyBIYW5kbGUgZGVmYXVsdCBwYWNrYWdlCi0JCWlmIChwYWNrID09IG51bGwpIHsKLQkJCXBhY2sgPSBwYWNrUm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0JCQotCQkKLQkJLy8gQ3JlYXRlIHRoZSBwYWNrYWdlIGZyYWdtZW50IGlmIGl0IGRvZXMgbm90IGV4aXN0Ci0JCWlmICghcGFjay5leGlzdHMoKSkgewotCQkJU3RyaW5nIHBhY2tOYW1lID0gcGFjay5nZXRFbGVtZW50TmFtZSgpOwotCQkJdHJ5IHsKLQkJCQlwYWNrID0gcGFja1Jvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2tOYW1lLCB0cnVlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCX0KLQkJfQotCQkvLyBSZXR1cm4gdGhlIHBhY2thZ2UKLQkJcmV0dXJuIHBhY2s7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBjcmVhdGlvbiBvZiBhIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgYW5kIHRoZSBXVFBKRVRFbWl0dGVyCi0JICogdG8gY3JlYXRlIHRoZSBqYXZhIGNsYXNzIHdpdGggdGhlIGFubm90YXRlZCB0YWdzLiBUaGlzIG1ldGhvZCBhY2NlcHRzIG51bGwgZm9yIG1vbml0b3IsIGl0IGRvZXMgbm90IGFjY2VwdCBudWxsIAotCSAqIGZvciBmcmFnbWVudC4gSWYgYW5ub3RhdGlvbnMgYXJlIG5vdCBiZWluZyB1c2VkIHRoZSB0YWdzIHdpbGwgYmUgb21pdHRlZCBmcm9tIHRoZSBjbGFzcy4KLQkgKiAKLQkgKiBAc2VlIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwKLQkgKiBAc2VlIE5ld0VudGl0eUNsYXNzT3BlcmF0aW9uI2dlbmVyYXRlVGVtcGxhdGVTb3VyY2UoQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCwKLQkgKiAgICAgIElQcm9ncmVzc01vbml0b3IpCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gZnJhZ21lbnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFdGVFdyYXBwZWRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVVzaW5nVGVtcGxhdGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCkgdGhyb3dzIFdGVFdyYXBwZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCSAgICAvLyBDcmVhdGUgdGhlIGZpbHRlciB0ZW1wbGF0ZSBtb2RlbAotCSAgICBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIHRlbXBNb2RlbCA9IGNyZWF0ZVRlbXBsYXRlTW9kZWwoKTsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFRhcmdldFByb2plY3QoKTsKLSAgICAgICAgU3RyaW5nIGVudGl0eUNsYXNzU291cmNlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGlkQ2xhc3NTb3VyY2UgPSBudWxsOwotICAgICAgICAvLyBVc2luZyB0aGUgV1RQSmV0RW1pdHRlciwgZ2VuZXJhdGUgdGhlIGphdmEgc291cmNlIGJhc2VkIG9uIHRoZSBmaWx0ZXIgdGVtcGxhdGUgbW9kZWwKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCWlmICh0ZW1wTW9kZWwuaXNBcnRpZmFjdHNBbm5vdGF0ZWQoKSkgewotICAgICAgICAJCWVudGl0eUNsYXNzU291cmNlID0gZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZSh0ZW1wTW9kZWwsIG1vbml0b3IsIEFOTk9UQVRFRF9FTlRJVFlfVEVNUExBVEVfRklMRSk7Ci0gICAgICAgIAl9IGVsc2UgewotICAgICAgICAJCWVudGl0eUNsYXNzU291cmNlID0gZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZSh0ZW1wTW9kZWwsIG1vbml0b3IsIEVOVElUWV9URU1QTEFURV9GSUxFKTsKLSAgICAgICAgCX0KLSAgICAgICAgICAgIGlmICh0ZW1wTW9kZWwuaXNDb21wb3NpdGVQSygpKSB7Ci0gICAgICAgICAgICAJaWRDbGFzc1NvdXJjZSA9IGdlbmVyYXRlVGVtcGxhdGVTb3VyY2UodGVtcE1vZGVsLCBtb25pdG9yLCBJRENMQVNTX1RFTVBMQVRFX0ZJTEUpOwotICAgICAgICAgICAgCQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdGVFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZyYWdtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgamF2YSBmaWxlCi0gICAgICAgICAgICBTdHJpbmcgamF2YUZpbGVOYW1lID0gdGVtcE1vZGVsLmdldENsYXNzTmFtZSgpICsgRE9UX0pBVkE7Ci0gICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGN1ID0gZnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0KGphdmFGaWxlTmFtZSk7Ci0gICAgICAgICAgICAvLyBBZGQgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdG8gdGhlIGphdmEgZmlsZQotICAgICAgICAgICAgaWYgKGN1ID09IG51bGwgfHwgIWN1LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgY3UgPSBmcmFnbWVudC5jcmVhdGVDb21waWxhdGlvblVuaXQoamF2YUZpbGVOYW1lLCBlbnRpdHlDbGFzc1NvdXJjZSwgdHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJRmlsZSBhRmlsZSA9IChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgIC8vIExldCB0aGUgYW5ub3RhdGlvbnMgY29udHJvbGxlciBwcm9jZXNzIHRoZSBhbm5vdGF0ZWQgcmVzb3VyY2UKLSAgICAgICAgICAgIGlmICh0ZW1wTW9kZWwuaXNBcnRpZmFjdHNBbm5vdGF0ZWQoKSkgewotICAgICAgICAgICAgCUFubm90YXRpb25zQ29udHJvbGxlciBjb250cm9sbGVyID0gQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlci5JTlNUQU5DRS5nZXRBbm5vdGF0aW9uc0NvbnRyb2xsZXIocHJvamVjdCk7Ci0gICAgICAgICAgICAJaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgCQljb250cm9sbGVyLnByb2Nlc3MoYUZpbGUpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQ3JlYXRlIElkQ2xhc3MgaWYgdGhlIHByaW1hcnkga2V5IGlzIGNvbXBsZXgKLSAgICAgICAgICAgIGlmIChpZENsYXNzU291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5UEtOYW1lID0gdGVtcE1vZGVsLmdldElkQ2xhc3NOYW1lKCkgKyBET1RfSkFWQTsKLSAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGN1MSA9IGZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdChlbnRpdHlQS05hbWUpOwotICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgY29tcGlsYXRpb24gdW5pdCB0byB0aGUgamF2YSBmaWxlCi0gICAgICAgICAgICAgICAgaWYgKGN1MSA9PSBudWxsIHx8ICFjdTEuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3UxID0gZnJhZ21lbnQuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGVudGl0eVBLTmFtZSwgaWRDbGFzc1NvdXJjZSwgdHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgCQotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoIXRlbXBNb2RlbC5pc0FydGlmYWN0c0Fubm90YXRlZCgpKSB7Ci0gICAgICAgIAlpZiAodGVtcE1vZGVsLmlzTm9uRW50aXR5U3VwZXJjbGFzcygpKSB7IAotICAgICAgICAJCWFkZE1hcHBlZFN1cGVyY2xhc3NUb1hMTSh0ZW1wTW9kZWwsIHByb2plY3QpLnNjaGVkdWxlKCk7Ci0gICAgICAgIAl9IGVsc2UgewotICAgICAgICAJCWFkZEVudGl0eVRvWE1MKHRlbXBNb2RlbCwgcHJvamVjdCkuc2NoZWR1bGUoKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICBpZiAoIXRlbXBNb2RlbC5pc01hcHBpbmdYTUxEZWZhdWx0KCkgfHwgIUpwdENvcmVQbHVnaW4uZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKHByb2plY3QpKSB7Ci0gICAgICAgIAlyZWdpc3Rlck1hcHBpbmdYTUwodGVtcE1vZGVsLCBwcm9qZWN0KS5zY2hlZHVsZSgpOwotICAgICAgICB9Ci0JfQotCi0JLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBhbgotICAgICAqIGluc3RhbmNlIG9mIHRoZSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24KLSAgICAgKiB3aXRoIHRoZSBXVFBKRVRFbWl0dGVyLiBUaGlzIG1ldGhvZCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwKLSAgICAgKiBAc2VlIE5ld0VudGl0eUNsYXNzT3BlcmF0aW9uI2dlbmVyYXRlVXNpbmdUZW1wbGF0ZXMoSVByb2dyZXNzTW9uaXRvciwKLSAgICAgKiAgICAgIElQYWNrYWdlRnJhZ21lbnQpCi0gICAgICogCi0gICAgICogQHJldHVybiBDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsCi0gICAgICovCi0gICAgcHJpdmF0ZSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIGNyZWF0ZVRlbXBsYXRlTW9kZWwoKSB7Ci0gICAgICAgIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgdGVtcGxhdGVNb2RlbCA9IG5ldyBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsKG1vZGVsKTsKLSAgICAgICAgcmV0dXJuIHRlbXBsYXRlTW9kZWw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gVGhpcyB3aWxsIHVzZSB0aGUKLSAgICAgKiBXVFBKRVRFbWl0dGVyIHRvIGNyZWF0ZSBhbiBhbm5vdGF0ZWQgamF2YSBmaWxlIGJhc2VkIG9uIHRoZSBwYXNzZWQgdGVtcGxhdGUgbW9kZWwuIAotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCBudWxsIHBhcmFtZXRlcnMuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLiAKLSAgICAgKiBJZiBhbm5vdGF0aW9ucyBhcmUgbm90IHVzZWQsIGl0IHdpbGwgdXNlIHRoZSBub24gYW5ub3RhdGVkIHRlbXBsYXRlIHRvIG9taXQgdGhlIGFubm90YXRlZCB0YWdzLgotICAgICAqIAotICAgICAqIEBzZWUgTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24jZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yLAotICAgICAqICAgICAgSVBhY2thZ2VGcmFnbWVudCkKLSAgICAgKiBAc2VlIEpFVEVtaXR0ZXIjZ2VuZXJhdGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0gICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0W10pCi0gICAgICogQHNlZSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlbXBNb2RlbAotICAgICAqIEBwYXJhbSBtb25pdG9yCi0gICAgICogQHBhcmFtIHRlbXBsYXRlX2ZpbGUgCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIHNvdXJjZSBmb3IgdGhlIGphdmEgZmlsZQotICAgICAqIEB0aHJvd3MgSkVURXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZShDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIHRlbXBNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgdGVtcGxhdGVfZmlsZSkgdGhyb3dzIEpFVEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCB0ZW1wbGF0ZVVSTCA9IEZpbGVMb2NhdG9yLmZpbmQoSnB0VWlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCksIG5ldyBQYXRoKHRlbXBsYXRlX2ZpbGUpLCBudWxsKTsKLSAgICAgICAgY2xlYW5VcE9sZEVtaXR0ZXJQcm9qZWN0KCk7Ci0gICAgICAgIFdUUEpFVEVtaXR0ZXIgZW1pdHRlciA9IG5ldyBXVFBKRVRFbWl0dGVyKHRlbXBsYXRlVVJMLnRvU3RyaW5nKCksIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgZW1pdHRlci5zZXRJbnRlbGxpZ2VudExpbmtpbmdFbmFibGVkKHRydWUpOwotICAgICAgICBlbWl0dGVyLmFkZFZhcmlhYmxlKFdUUF9DVVNUT01JWkFUSU9OX1BMVUdJTiwgSnB0VWlQbHVnaW4uUExVR0lOX0lEKTsKLSAgICAgICAgcmV0dXJuIGVtaXR0ZXIuZ2VuZXJhdGUobW9uaXRvciwgbmV3IE9iamVjdFtdIHsgdGVtcE1vZGVsIH0pOwotICAgIH0KLSAgICAKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEl0IHdpbGwgY2xlYW4gdXAgdGhlIG9sZCBlbW1pdGVyIHByb2plY3QgCi0JICogaW4gb3JkZXIgdG8gcHJldmVudCBnZW5lcmF0aW9uIGlzc3VlcyAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW5VcE9sZEVtaXR0ZXJQcm9qZWN0KCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFdUUEpFVEVtaXR0ZXIuUFJPSkVDVF9OQU1FKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5leGlzdHMoKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcHJvamVjdC5maW5kTWFya2VycyhJSmF2YU1vZGVsTWFya2VyLkJVSUxEUEFUSF9QUk9CTEVNX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCWZvciAoaW50IGkgPSAwLCBsID0gbWFya2Vycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKLQkJCQlpZiAoKChJbnRlZ2VyKSBtYXJrZXJzW2ldLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSkuaW50VmFsdWUoKSA9PSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKSB7Ci0JCQkJCXByb2plY3QuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGphdmEgc291cmNlIGZvbGRlciBhcyBzcGVjaWZpZWQgaW4gdGhlIGphdmEKLQkgKiBjbGFzcyBkYXRhIG1vZGVsLiBJdCB3aWxsIGNyZWF0ZSB0aGUgamF2YSBzb3VyY2UgZm9sZGVyIGlmIGl0IGRvZXMgbm90Ci0JICogZXhpc3QuIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAc2VlIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzI1NPVVJDRV9GT0xERVIKLQkgKiBAc2VlIElGb2xkZXIjY3JlYXRlKGJvb2xlYW4sIGJvb2xlYW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiAKLQkgKiBAcmV0dXJuIElGb2xkZXIgdGhlIGphdmEgc291cmNlIGZvbGRlcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJRm9sZGVyIGNyZWF0ZUphdmFTb3VyY2VGb2xkZXIoKSB7Ci0JCS8vIEdldCB0aGUgc291cmNlIGZvbGRlciBuYW1lIGZyb20gdGhlIGRhdGEgbW9kZWwKLQkJU3RyaW5nIGZvbGRlckZ1bGxQYXRoID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUik7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRm9sZGVyIGZvbGRlciA9IHJvb3QuZ2V0Rm9sZGVyKG5ldyBQYXRoKGZvbGRlckZ1bGxQYXRoKSk7Ci0JCS8vIElmIGZvbGRlciBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIHRoZSBmb2xkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGgKLQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gUmV0dXJuIHRoZSBzb3VyY2UgZm9sZGVyCi0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZG9FeGVjdXRlKG1vbml0b3IsIGluZm8pOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQkKLQkJCi0JLyoqCi0JICogQWRkcyBlbnRpdHkgdG8gT1JNIFhNTCBpbiBzZXBhcmF0ZSBqb2IKLQkgKiBAcGFyYW0gbW9kZWwgZW50aXR5IGRhdGEgbW9kZWwKLQkgKiBAcGFyYW0gcHJvamVjdCBKUEEgcHJvamVjdCBpbiB3aGljaCB0aGUgZW50aXR5IHdpbGwgYmUgY3JlYXRlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEpvYiBhZGRFbnRpdHlUb1hNTChmaW5hbCBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUpvYiBqb2IgPSBuZXcgSm9iKEVudGl0eVdpemFyZE1zZy5BRERfRU5USVRZX1RPX1hNTCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJT3JtQXJ0aWZhY3RFZGl0IG9hZSA9IE9ybUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCQl0cnkgewkJCQkJCi0JCQkJCVN0cmluZyB4bWxVcmkgPSBKcHRDb3JlUGx1Z2luLmdldERlZmF1bHRPcm1YbWxEZXBsb3ltZW50VVJJKHByb2plY3QpOwotCQkJCQlPcm1SZXNvdXJjZSByZXNvdXJjZSA9IG9hZS5nZXRSZXNvdXJjZSh4bWxVcmkpOwotCQkJCQlpZiAoIW1vZGVsLmlzTWFwcGluZ1hNTERlZmF1bHQoKSkgewotCQkJCQkJcmVzb3VyY2UgPSBvYWUuZ2V0UmVzb3VyY2UobW9kZWwuZ2V0TWFwcGluZ1htbEZpbGUoKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCVhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gcmVzb3VyY2UuZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJCQkJaWYgKGVudGl0eU1hcHBpbmdzID09IG51bGwpIHsKLQkJCQkJCWVudGl0eU1hcHBpbmdzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJCQkJCWVudGl0eU1hcHBpbmdzLnNldFZlcnNpb24oVkVSU0lPTl9TVFJJTkcpOwotCQkJCQl9Ci0KLQkJCQkJWG1sRW50aXR5IHhtbEVudGl0eSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVudGl0eSgpOwotCQkJCQl4bWxFbnRpdHkuc2V0Q2xhc3NOYW1lKG1vZGVsLmdldFF1YWxpZmllZEphdmFDbGFzc05hbWUoKSk7Ci0JCQkJCWlmIChtb2RlbC5pc0luaGVyaXRhbmNlU2V0KCkpIHsKLQkJCQkJCUluaGVyaXRhbmNlIGluaGVyaXRhbmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5oZXJpdGFuY2UoKTsKLQkJCQkJCVN0cmluZyBpbmhlcml0YW5jZVN0cmF0ZWd5ID0gbW9kZWwuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneU5hbWUoKTsKLQkJCQkJCWlmIChpbmhlcml0YW5jZVN0cmF0ZWd5LmVxdWFscyhFTVBUWV9TVFJJTkcpKSB7Ci0JCQkJCQkJaW5oZXJpdGFuY2VTdHJhdGVneSA9IFNJTkdMRV9UQUJMRTsKLQkJCQkJCX0KLQkJCQkJCUluaGVyaXRhbmNlVHlwZSBpbmhlcml0YW5jZVR5cGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbmhlcml0YW5jZVR5cGVGcm9tU3RyaW5nKG51bGwsIGluaGVyaXRhbmNlU3RyYXRlZ3kpOy8vIFRPRE8KLQkJCQkJCWluaGVyaXRhbmNlLnNldFN0cmF0ZWd5KGluaGVyaXRhbmNlVHlwZSk7Ci0JCQkJCQl4bWxFbnRpdHkuc2V0SW5oZXJpdGFuY2UoaW5oZXJpdGFuY2UpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKG1vZGVsLmlzRW50aXR5TmFtZVNldCgpKSB7Ci0JCQkJCQl4bWxFbnRpdHkuc2V0TmFtZShtb2RlbC5nZXRFbnRpdHlOYW1lKCkpOwotCQkJCQl9Ci0JCQkJCWlmIChtb2RlbC5pc1RhYmxlTmFtZVNldCgpKSB7Ci0JCQkJCQlYbWxUYWJsZSB4bWxUYWJsZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlKCk7Ci0JCQkJCQl4bWxUYWJsZS5zZXROYW1lKG1vZGVsLmdldFRhYmxlTmFtZSgpKTsKLQkJCQkJCXhtbEVudGl0eS5zZXRUYWJsZSh4bWxUYWJsZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKG1vZGVsLmlzQ29tcG9zaXRlUEsoKSkgewotCQkJCQkJWG1sSWRDbGFzcyBpZENsYXNzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSWRDbGFzcygpOwotCQkJCQkJaWRDbGFzcy5zZXRDbGFzc05hbWUobW9kZWwuZ2V0SWRDbGFzc05hbWUoKSk7Ci0JCQkJCQl4bWxFbnRpdHkuc2V0SWRDbGFzcyhpZENsYXNzKTsKLQkJCQkJfQotCQkJCQlMaXN0PFN0cmluZz4gcGtGaWVsZHMgPSBtb2RlbC5nZXRQS0ZpZWxkcygpOwotCQkJCQlpZiAocGtGaWVsZHMuc2l6ZSgpID4gMCkgewotCQkJCQkJQXR0cmlidXRlcyBlbnRpdHlBdHRyaWJ1dGVzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlcygpOwotCQkJCQkJTGlzdDxYbWxJZEltcGw+IGlkcyA9IG5ldyBBcnJheUxpc3Q8WG1sSWRJbXBsPigpOwotCQkJCQkJZm9yIChTdHJpbmcgZmllbGROYW1lIDogcGtGaWVsZHMpIHsKLQkJCQkJCQlYbWxJZEltcGwgaWRJbXBsID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSWRJbXBsKCk7Ci0JCQkJCQkJaWRJbXBsLnNldE5hbWUoZmllbGROYW1lKTsKLQkJCQkJCQlpZHMuYWRkKGlkSW1wbCk7Ci0JCQkJCQl9Ci0JCQkJCQllbnRpdHlBdHRyaWJ1dGVzLmVTZXQoT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFMsIGlkcyk7Ci0JCQkJCQl4bWxFbnRpdHkuc2V0QXR0cmlidXRlcyhlbnRpdHlBdHRyaWJ1dGVzKTsKLQkJCQkJfQotCi0JCQkJCVN0cmluZyBhY2Nlc3NUeXBlU3RyaW5nID0gRklFTEQ7Ci0JCQkJCWlmICghbW9kZWwuaXNGaWVsZEFjY2VzcygpKSB7Ci0JCQkJCQlhY2Nlc3NUeXBlU3RyaW5nID0gUFJPUEVSVFk7Ci0JCQkJCX0KLQkJCQkJQWNjZXNzVHlwZSBhY2Nlc3NUeXBlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWNjZXNzVHlwZUZyb21TdHJpbmcobnVsbCwgYWNjZXNzVHlwZVN0cmluZyk7Ly8gVE9ETwotCQkJCQl4bWxFbnRpdHkuc2V0QWNjZXNzKGFjY2Vzc1R5cGUpOwotCQkJCQlFTGlzdDxYbWxFbnRpdHk+IGVudGl0aWVzID0gZW50aXR5TWFwcGluZ3MuZ2V0RW50aXRpZXMoKTsKLQkJCQkJZW50aXRpZXMuYWRkKHhtbEVudGl0eSk7Ci0JCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGVudGl0eU1hcHBpbmdzKTsKLQkJCQkJb2FlLnNhdmUobnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJCQlvYWUuZGlzcG9zZSgpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW9hZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQlyZXR1cm4gam9iOwotCX0KLQotCS8qKgotCSAqIEFkZHMgbWFwcGVkIHN1cGVyY2xhc3MgdG8gT1JNIFhNTCBpbiBzZXBhcmF0ZSBqb2IKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwgZW50aXR5IGRhdGEgbW9kZWwKLQkgKiBAcGFyYW0gcHJvamVjdCBKUEEgcHJvamVjdCBpbiB3aGljaCB0aGUgZW50aXR5IHdpbGwgYmUgY3JlYXRlZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgam9iCi0JICovCi0JcHJpdmF0ZSBKb2IgYWRkTWFwcGVkU3VwZXJjbGFzc1RvWExNKGZpbmFsIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwsIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJSm9iIGpvYiA9IG5ldyBKb2IoRW50aXR5V2l6YXJkTXNnLkFERF9NQVBQRURfU1VQRVJDTEFTU19UT19YTUwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCU9ybUFydGlmYWN0RWRpdCBvYWUgPSBPcm1BcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQkJdHJ5IHsKLQkJCQkJLy9Pcm1SZXNvdXJjZSByZXNvdXJjZSA9IG9hZS5nZXRSZXNvdXJjZShKcHRDb3JlUGx1Z2luLm9ybVhtbERlcGxveW1lbnRVUkkocHJvamVjdCkpOwotCQkJCQlTdHJpbmcgeG1sVXJpID0gSnB0Q29yZVBsdWdpbi5nZXREZWZhdWx0T3JtWG1sRGVwbG95bWVudFVSSShwcm9qZWN0KTsKLQkJCQkJaWYgKCFtb2RlbC5pc01hcHBpbmdYTUxEZWZhdWx0KCkpIHsKLQkJCQkJCXhtbFVyaSA9IG1vZGVsLmdldE1hcHBpbmdYTUxOYW1lKCk7Ci0JCQkJCX0KLQkJCQkJT3JtUmVzb3VyY2UgcmVzb3VyY2UgPSBvYWUuZ2V0UmVzb3VyY2UoeG1sVXJpKTsKLQkJCQkJWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSByZXNvdXJjZS5nZXRFbnRpdHlNYXBwaW5ncygpOwotCQkJCQlpZiAoZW50aXR5TWFwcGluZ3MgPT0gbnVsbCkgewotCQkJCQkJZW50aXR5TWFwcGluZ3MgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOwotCQkJCQkJZW50aXR5TWFwcGluZ3Muc2V0VmVyc2lvbihWRVJTSU9OX1NUUklORyk7Ci0JCQkJCX0KLQotCQkJCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHhtbE1hcHBlZFN1cGVyY2xhc3MgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCQkJCXhtbE1hcHBlZFN1cGVyY2xhc3Muc2V0Q2xhc3NOYW1lKG1vZGVsLmdldFF1YWxpZmllZEphdmFDbGFzc05hbWUoKSk7Ci0JCQkJCQotCQkJCQlpZiAobW9kZWwuaXNDb21wb3NpdGVQSygpKSB7Ci0JCQkJCQlYbWxJZENsYXNzIGlkQ2xhc3MgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxJZENsYXNzKCk7Ci0JCQkJCQlpZENsYXNzLnNldENsYXNzTmFtZShtb2RlbC5nZXRJZENsYXNzTmFtZSgpKTsKLQkJCQkJCXhtbE1hcHBlZFN1cGVyY2xhc3Muc2V0SWRDbGFzcyhpZENsYXNzKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJTGlzdDxTdHJpbmc+IHBrRmllbGRzID0gbW9kZWwuZ2V0UEtGaWVsZHMoKTsKLQkJCQkJaWYgKHBrRmllbGRzLnNpemUoKSA+IDApIHsKLQkJCQkJCUF0dHJpYnV0ZXMgZW50aXR5QXR0cmlidXRlcyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF0dHJpYnV0ZXMoKTsKLQkJCQkJCUxpc3Q8WG1sSWRJbXBsPiBpZHMgPSBuZXcgQXJyYXlMaXN0PFhtbElkSW1wbD4oKTsKLQkJCQkJCWZvciAoU3RyaW5nIGZpZWxkTmFtZSA6IHBrRmllbGRzKSB7Ci0JCQkJCQkJWG1sSWRJbXBsIGlkSW1wbCA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbElkSW1wbCgpOwotCQkJCQkJCWlkSW1wbC5zZXROYW1lKGZpZWxkTmFtZSk7Ci0JCQkJCQkJaWRzLmFkZChpZEltcGwpOwotCQkJCQkJfQotCQkJCQkJZW50aXR5QXR0cmlidXRlcy5lU2V0KE9ybVBhY2thZ2UuQVRUUklCVVRFU19fSURTLCBpZHMpOwotCQkJCQkJeG1sTWFwcGVkU3VwZXJjbGFzcy5zZXRBdHRyaWJ1dGVzKGVudGl0eUF0dHJpYnV0ZXMpOwotCQkJCQl9Ci0KLQkJCQkJU3RyaW5nIGFjY2Vzc1R5cGVTdHJpbmcgPSBGSUVMRDsKLQkJCQkJaWYgKCFtb2RlbC5pc0ZpZWxkQWNjZXNzKCkpIHsKLQkJCQkJCWFjY2Vzc1R5cGVTdHJpbmcgPSBQUk9QRVJUWTsKLQkJCQkJfQotCQkJCQlBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY2Nlc3NUeXBlRnJvbVN0cmluZyhudWxsLCBhY2Nlc3NUeXBlU3RyaW5nKTsKLQkJCQkJeG1sTWFwcGVkU3VwZXJjbGFzcy5zZXRBY2Nlc3MoYWNjZXNzVHlwZSk7Ci0JCQkJCWVudGl0eU1hcHBpbmdzLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmFkZCh4bWxNYXBwZWRTdXBlcmNsYXNzKTsKLQkJCQkJCi0JCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGVudGl0eU1hcHBpbmdzKTsKLQkJCQkJb2FlLnNhdmUobnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW9hZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQlyZXR1cm4gam9iOwkJCi0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIGFsdGVybmF0aXZlIG1hcHBpbmcgWE1MIGFuZC9vciBjbGFzc2VzIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwgZW50aXR5IGRhdGEgbW9kZWwKLQkgKiBAcGFyYW0gcHJvamVjdCBKUEEgcHJvamVjdCBpbiB3aGljaCB0aGUgZW50aXR5IHdpbGwgYmUgY3JlYXRlZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgam9iCi0JICovCi0JcHJpdmF0ZSBKb2IgcmVnaXN0ZXJNYXBwaW5nWE1MKGZpbmFsIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwsIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJSm9iIGpvYiA9IG5ldyBKb2IoRW50aXR5V2l6YXJkTXNnLkFQUExZX0NIQU5HRVNfVE9fUEVSU0lTVEVOQ0VfWE1MKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRMYXN0U2VnbWVudChtb2RlbC5nZXRNYXBwaW5nWE1MTmFtZSgpKTsKLQkJCQlQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBwYWUgPSBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCQl0cnkgewotCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlIHBlcnNpc3RlbmNlUmVzb3VyY2UgPSBwYWUuZ2V0UmVzb3VyY2UoSnB0Q29yZVBsdWdpbi5nZXRQZXJzaXN0ZW5jZVhtbERlcGxveW1lbnRVUkkocHJvamVjdCkpOwotCQkJCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJCQkJRUxpc3Q8WG1sUGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRzID0geG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpOwotCQkJCQlYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0cy5nZXQoMCk7Ly8gTXVsdGlwbHkgcGVyc2lzdGVuY2UgdW5pdCBzdXBwb3J0Ci0JCQkJCWlmICghbW9kZWwuaXNNYXBwaW5nWE1MRGVmYXVsdCgpKSB7Ci0JCQkJCQlib29sZWFuIG5ld1htbE1hcHBpbmdGaWxlID0gdHJ1ZTsKLQkJCQkJCUVMaXN0PFhtbE1hcHBpbmdGaWxlUmVmPiB4bWxNYXBwaW5nRmlsZXMgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCk7Ci0JCQkJCQlmb3IgKFhtbE1hcHBpbmdGaWxlUmVmIGZpbGVSZWYgOiB4bWxNYXBwaW5nRmlsZXMpIHsKLQkJCQkJCQlpZiAoZmlsZU5hbWUuZXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSkpIHsKLQkJCQkJCQkJbmV3WG1sTWFwcGluZ0ZpbGUgPSBmYWxzZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQkJCQkJCQotCQkJCQkJaWYgKG5ld1htbE1hcHBpbmdGaWxlKSB7Ci0JCQkJCQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCQkJCQkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCQkJCQkJCXBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghbW9kZWwuaXNOb25FbnRpdHlTdXBlcmNsYXNzKCkgJiYgIUpwdENvcmVQbHVnaW4uZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKHByb2plY3QpKSB7Ci0JCQkJCQlYbWxKYXZhQ2xhc3NSZWYgY2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQkJCQkJY2xhc3NSZWYuc2V0SmF2YUNsYXNzKG1vZGVsLmdldFF1YWxpZmllZEphdmFDbGFzc05hbWUoKSk7Ci0JCQkJCQlwZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZChjbGFzc1JlZik7Ci0JCQkJCX0KLQkJCQkJcGVyc2lzdGVuY2VSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZCh4bWxQZXJzaXN0ZW5jZSk7Ci0JCQkJCXBhZS5zYXZlKG51bGwpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwYWUuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGpvYjsKLQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIG5hbWUgb2YgbWFwcGluZyBYTUwgZnJvbSB0aGUgY2xhc3Mgd2l6YXJkIHBhZ2UuIEl0IGlzIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgc291cmNlIGZvbGRlcgotCSAqIGFuZCBpbmNsdWRlcyBNRVRBLUlORiBmb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWFwcGluZyBYTUwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMYXN0U2VnbWVudChTdHJpbmcgaW5wdXQpIHsKLQkJU3RyaW5nIG91dHB1dCA9IGlucHV0OwotCQlpZiAoaW5wdXQuaW5kZXhPZihTRVBBUkFUT1IpICE9IC0xKSB7Ci0JCQlvdXRwdXQgPSBpbnB1dC5zdWJzdHJpbmcoaW5wdXQubGFzdEluZGV4T2YoU0VQQVJBVE9SKSArIDEpOwotCQl9Ci0JCXJldHVybiBvdXRwdXQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVXaXphcmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvb3JtL01hcHBpbmdGaWxlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTE5ODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5vcm07Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLQotcHVibGljIGNsYXNzIE1hcHBpbmdGaWxlV2l6YXJkIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkIAotCWltcGxlbWVudHMgSU5ld1dpemFyZCAKLXsKLQlwcml2YXRlIE1hcHBpbmdGaWxlV2l6YXJkUGFnZSBwYWdlOwotCQotCQotCXB1YmxpYyBNYXBwaW5nRmlsZVdpemFyZCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0JCi0JcHVibGljIE1hcHBpbmdGaWxlV2l6YXJkKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JCXNldFdpbmRvd1RpdGxlKEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRfdGl0bGUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKcHRVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSnB0VWlJY29ucy5KUEFfRklMRV9XSVpfQkFOTkVSKSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmRvQWRkUGFnZXMoKTsKLQkJcGFnZSA9IG5ldyBNYXBwaW5nRmlsZVdpemFyZFBhZ2UoZ2V0RGF0YU1vZGVsKCksICJQYWdlXzEiKTsKLQkJYWRkUGFnZShwYWdlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGNoZWNrIGZvciBwcm9qZWN0LCBzb3VyY2UgZm9sZGVyLCBwZXJzaXN0ZW5jZSB1bml0PwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlPYmplY3QgZmlyc3RTZWxlY3Rpb24gPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQgcFVuaXQgPSBleHRyYWN0UGVyc2lzdGVuY2VVbml0KGZpcnN0U2VsZWN0aW9uKTsKLQkJSUZvbGRlciBzb3VyY2VGb2xkZXIgPSBleHRyYWN0U291cmNlRm9sZGVyKHBVbml0LCBmaXJzdFNlbGVjdGlvbik7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBleHRyYWN0UHJvamVjdChwVW5pdCwgc291cmNlRm9sZGVyLCBmaXJzdFNlbGVjdGlvbik7Ci0JCQotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlnZXREYXRhTW9kZWwoKS5zZXRTdHJpbmdQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdC5nZXROYW1lKCkpOwotCQl9Ci0JCWlmIChzb3VyY2VGb2xkZXIgIT0gbnVsbCkgewotCQkJZ2V0RGF0YU1vZGVsKCkuc2V0U3RyaW5nUHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSLCBzb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChwVW5pdCAhPSBudWxsKSB7Ci0JCQlnZXREYXRhTW9kZWwoKS5zZXRCb29sZWFuUHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCwgdHJ1ZSk7Ci0JCQlnZXREYXRhTW9kZWwoKS5zZXRTdHJpbmdQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBFUlNJU1RFTkNFX1VOSVQsIHBVbml0LmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXQgZXh0cmFjdFBlcnNpc3RlbmNlVW5pdChPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0KSBzZWxlY3Rpb247Ci0JCX0KLQkJUGVyc2lzdGVuY2VVbml0IHBVbml0ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEpwYUNvbnRleHROb2RlKSB7Ci0JCQl0cnkgewotCQkJCXBVbml0ID0gKChKcGFDb250ZXh0Tm9kZSkgc2VsZWN0aW9uKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgeyAvKiBkbyBub3RoaW5nLCBqdXN0IGNvbnRpbnVlICovIH0KLQkJfQotCQlpZiAocFVuaXQgPT0gbnVsbCAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlwVW5pdCA9IChQZXJzaXN0ZW5jZVVuaXQpICgoSUFkYXB0YWJsZSkgc2VsZWN0aW9uKS5nZXRBZGFwdGVyKFBlcnNpc3RlbmNlVW5pdC5jbGFzcyk7Ci0JCQkKLQkJfQotCQlyZXR1cm4gcFVuaXQ7Ci0JfQotCQotCXByaXZhdGUgSUZvbGRlciBleHRyYWN0U291cmNlRm9sZGVyKFBlcnNpc3RlbmNlVW5pdCBwVW5pdCwgT2JqZWN0IHNlbGVjdGlvbikgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQlJRm9sZGVyIHNyY0ZvbGRlciA9IG51bGw7Ci0JCWlmIChwVW5pdCAhPSBudWxsKSB7Ci0JCQlqYXZhUHJvamVjdCA9IHBVbml0LmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQkJc3JjRm9sZGVyID0gZmluZFNvdXJjZUZvbGRlcihqYXZhUHJvamVjdCwgcFVuaXQuZ2V0UmVzb3VyY2UoKSk7Ci0JCQlpZiAoc3JjRm9sZGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc3JjRm9sZGVyOwotCQkJfQotCQkJCi0JCX0KLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoKChJUmVzb3VyY2UpIHNlbGVjdGlvbikuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChqYXZhUHJvamVjdC5leGlzdHMoKSkgewotCQkJCXNyY0ZvbGRlciA9IGZpbmRTb3VyY2VGb2xkZXIoamF2YVByb2plY3QsIChJUmVzb3VyY2UpIHNlbGVjdGlvbik7Ci0JCQkJaWYgKHNyY0ZvbGRlciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBzcmNGb2xkZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBzZWxlY3Rpb24pLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoKHJlc291cmNlKS5nZXRQcm9qZWN0KCkpOwotCQkJCWlmIChqYXZhUHJvamVjdC5leGlzdHMoKSkgewotCQkJCQlzcmNGb2xkZXIgPSBmaW5kU291cmNlRm9sZGVyKGphdmFQcm9qZWN0LCByZXNvdXJjZSk7CQotCQkJCQlpZiAoc3JjRm9sZGVyICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBzcmNGb2xkZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSUZvbGRlciBmaW5kU291cmNlRm9sZGVyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSA9PSBudWxsKSB7Ci0JCQkvLyBub3QgZXZlbiBhIGpwYSBwcm9qZWN0Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl3aGlsZSAocmVzb3VyY2UgIT0gbnVsbCAmJiAhIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpKSB7Ci0JCQlyZXNvdXJjZSA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQl9Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSByZXNvdXJjZTsKLQkJdHJ5IHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSBudWxsOwotCQkJd2hpbGUgKHBhY2thZ2VGcmFnbWVudFJvb3QgPT0gbnVsbCAmJiBmb2xkZXIgIT0gbnVsbCkgewotCQkJCXBhY2thZ2VGcmFnbWVudFJvb3QgPSBqYXZhUHJvamVjdC5maW5kUGFja2FnZUZyYWdtZW50Um9vdChmb2xkZXIuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJaWYgKHBhY2thZ2VGcmFnbWVudFJvb3QgPT0gbnVsbCkgewotCQkJCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IGphdmFQcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnQoZm9sZGVyLmdldEZ1bGxQYXRoKCkpOwotCQkJCQlpZiAocGFja2FnZUZyYWdtZW50ICE9IG51bGwpIHsKLQkJCQkJCXBhY2thZ2VGcmFnbWVudFJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHBhY2thZ2VGcmFnbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocGFja2FnZUZyYWdtZW50Um9vdCA9PSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb2xkZXIgPSAoSUZvbGRlcikgZm9sZGVyLmdldFBhcmVudCgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKSB7Ci0JCQkJCQlmb2xkZXIgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHBhY2thZ2VGcmFnbWVudFJvb3QgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYgKHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSB7Ci0JCQkJcmV0dXJuIChJRm9sZGVyKSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFJlc291cmNlKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsgLyogZG8gbm90aGluZywgcmV0dXJuIG51bGwgKi8gfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBleHRyYWN0UHJvamVjdChQZXJzaXN0ZW5jZVVuaXQgcFVuaXQsIElGb2xkZXIgc291cmNlRm9sZGVyLCBPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChwVW5pdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcFVuaXQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJfQotCQlpZiAoc291cmNlRm9sZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBzb3VyY2VGb2xkZXIuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcHJvamVjdCA9ICgoSVJlc291cmNlKSBzZWxlY3Rpb24pLmdldFByb2plY3QoKTsKLQkJfQotCQlpZiAocHJvamVjdCA9PSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotCQkJcHJvamVjdCA9ICgoSUphdmFFbGVtZW50KSBzZWxlY3Rpb24pLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSnBhQ29udGV4dE5vZGUpIHsKLQkJCXByb2plY3QgPSAoKEpwYUNvbnRleHROb2RlKSBzZWxlY3Rpb24pLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJaWYgKHByb2plY3QgPT0gbnVsbCAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIHNlbGVjdGlvbikuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBzZWxlY3Rpb24pLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSAoSUphdmFFbGVtZW50KSAoKElBZGFwdGFibGUpIHNlbGVjdGlvbikuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpOwotCQkJCWlmIChqYXZhRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXByb2plY3QgPSBqYXZhRWxlbWVudC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpICE9IG51bGwpIHsKLQkJCXJldHVybiBwcm9qZWN0OwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFBlcmZvcm1GaW5pc2goKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7ICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgIAlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0gICAgICAgIAlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgCVN0cmluZyBzb3VyY2VGb2xkZXIgPSBnZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIpOwotICAgICAgICAJU3RyaW5nIGZpbGVQYXRoID0gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX1BBVEgpOwotICAgICAgICAJCi0gICAgICAgIAlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChzb3VyY2VGb2xkZXIpLmFwcGVuZChmaWxlUGF0aCkpOwotICAgICAgICAgICAgb3BlbkVkaXRvcihmaWxlKTsKLSAgICAgICAgfSAKLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBjYW50T3BlbikgewotICAgICAgICAJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oY2FudE9wZW4pOwotICAgICAgICB9IAotICAgIH0KLQkKLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgCUpwdFVpUGx1Z2luLmxvZyhlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVXaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL29ybS9NYXBwaW5nRmlsZVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxYjMxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL29ybS9NYXBwaW5nRmlsZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotCi1wdWJsaWMgY2xhc3MgTWFwcGluZ0ZpbGVXaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZQotCWltcGxlbWVudHMgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcwotewotCXByaXZhdGUgTGFiZWwgcHJvamVjdE5hbWVMYWJlbDsKLQkJCi0JcHJpdmF0ZSBDb21ibyBwcm9qZWN0TmFtZUNvbWJvOwkKLQkKLQlwcml2YXRlIExhYmVsIHNvdXJjZUZvbGRlckxhYmVsOwotCQotCXByaXZhdGUgVGV4dCBzb3VyY2VGb2xkZXJUZXh0OwotCQotCXByaXZhdGUgTGFiZWwgZmlsZVBhdGhMYWJlbDsKLQkKLQlwcml2YXRlIFRleHQgZmlsZVBhdGhUZXh0OwotCQotCXByaXZhdGUgTGFiZWwgYWNjZXNzTGFiZWw7Ci0JCi0JcHJpdmF0ZSBDb21ibyBhY2Nlc3NDb21ibzsKLQkKLQlwcml2YXRlIEJ1dHRvbiBhZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbjsKLQkKLQlwcml2YXRlIExhYmVsIHBlcnNpc3RlbmNlVW5pdExhYmVsOwotCQotCXByaXZhdGUgQ29tYm8gcGVyc2lzdGVuY2VVbml0Q29tYm87Ci0JCi0JCi0JcHVibGljIE1hcHBpbmdGaWxlV2l6YXJkUGFnZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2Rlc2MpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJUFJPSkVDVF9OQU1FLAotCQkJU09VUkNFX0ZPTERFUiwKLQkJCUZJTEVfUEFUSCwKLQkJCURFRkFVTFRfQUNDRVNTLAotCQkJQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQsCi0JCQlQRVJTSVNURU5DRV9VTklUCi0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJcHJvamVjdE5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3Byb2plY3RMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlwcm9qZWN0TmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlwcm9qZWN0TmFtZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJcHJvamVjdE5hbWVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHByb2plY3ROYW1lQ29tYm8sIFBST0pFQ1RfTkFNRSwgbnVsbCk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCi0JCXNvdXJjZUZvbGRlckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzb3VyY2VGb2xkZXJMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3NvdXJjZUZvbGRlckxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXNvdXJjZUZvbGRlckxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlzb3VyY2VGb2xkZXJUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCXNvdXJjZUZvbGRlclRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHNvdXJjZUZvbGRlclRleHQsIFNPVVJDRV9GT0xERVIsIG51bGwpOwotCQkKLQkJQnV0dG9uIHNvdXJjZUZvbGRlckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCXNvdXJjZUZvbGRlckJ1dHRvbi5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuR2VuZXJhbF9icm93c2UpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlzb3VyY2VGb2xkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaGFuZGxlU291cmNlRm9sZGVyQnV0dG9uUHJlc3NlZCgpOwotCQkJCX0KLQkJCX0pOwotCQkKLQkJZmlsZVBhdGhMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmlsZVBhdGhMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2ZpbGVQYXRoTGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZmlsZVBhdGhMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZmlsZVBhdGhUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlmaWxlUGF0aFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGZpbGVQYXRoVGV4dCwgRklMRV9QQVRILCBudWxsKTsKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkKLQkJYWNjZXNzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWFjY2Vzc0xhYmVsLnNldFRleHQoSnB0VWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZFBhZ2VfYWNjZXNzTGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJYWNjZXNzTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWFjY2Vzc0NvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJYWNjZXNzQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhhY2Nlc3NDb21ibywgREVGQVVMVF9BQ0NFU1MsIG51bGwpOwotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQotCQlhZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0sgfCBTV1QuQkVHSU5OSU5HKTsKLQkJYWRkVG9QZXJzaXN0ZW5jZVVuaXRCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWFkZFRvUGVyc2lzdGVuY2VVbml0QnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goYWRkVG9QZXJzaXN0ZW5jZVVuaXRCdXR0b24sIEFERF9UT19QRVJTSVNURU5DRV9VTklULCBudWxsKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwZXJzaXN0ZW5jZVVuaXRMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3BlcnNpc3RlbmNlVW5pdExhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXBlcnNpc3RlbmNlVW5pdExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXRDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCXBlcnNpc3RlbmNlVW5pdENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8ocGVyc2lzdGVuY2VVbml0Q29tYm8sIFBFUlNJU1RFTkNFX1VOSVQsIG51bGwpOwotCQkKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkKLS8vCQljbGFzc1RleHQuc2V0Rm9jdXMoKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIGdldEluZm9wb3BJRCgpKTsKLQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlU291cmNlRm9sZGVyQnV0dG9uUHJlc3NlZCgpIHsKLQkJSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXRTb3VyY2VGb2xkZXJEaWFsb2dTZWxlY3Rpb25WYWxpZGF0b3IoKTsKLQkJVmlld2VyRmlsdGVyIGZpbHRlciA9IGdldFNvdXJjZUZvbGRlckRpYWxvZ1ZpZXdlckZpbHRlcigpOwotCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIoCi0JCQkJbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgCi0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSk7Ci0JCUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBsYWJlbFByb3ZpZGVyLCBjb250ZW50UHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCWRpYWxvZy5zZXRUaXRsZShKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hY2Nlc3NMYWJlbF9zb3VyY2VGb2xkZXJEaWFsb2dUaXRsZSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FjY2Vzc0xhYmVsX3NvdXJjZUZvbGRlckRpYWxvZ0Rlc2MpOwotCQlkaWFsb2cuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCWlmIChwcm9qZWN0TmFtZT09bnVsbCB8fCBwcm9qZWN0TmFtZS5sZW5ndGgoKT09MCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlkaWFsb2cuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0KLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb24ocHJvamVjdCk7Ci0JCX0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgZWxlbWVudDsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShTT1VSQ0VfRk9MREVSLCBjb250YWluZXIuZ2V0RnVsbFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciBnZXRTb3VyY2VGb2xkZXJEaWFsb2dTZWxlY3Rpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb25bMF0gIT0gbnVsbCAmJiAhIChzZWxlY3Rpb25bMF0gaW5zdGFuY2VvZiBJUHJvamVjdCkpIHsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCBKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9pbmNvcnJlY3RTb3VyY2VGb2xkZXJFcnJvcik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgVmlld2VyRmlsdGVyIGdldFNvdXJjZUZvbGRlckRpYWxvZ1ZpZXdlckZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGVsZW1lbnQ7Ci0JCQkJCXJldHVybiBwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHMobW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0JCQkJfSAKLQkJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBlbGVtZW50OwotCQkJCQkvLyBvbmx5IHNob3cgc291cmNlIGZvbGRlcnMKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpKTsKLQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VGb2xkZXJzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U291cmNlQ29udGFpbmVycyhwcm9qZWN0KTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VGb2xkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoc291cmNlRm9sZGVyc1tpXS5nZXRSZXNvdXJjZSgpIT0gbnVsbCAmJiBzb3VyY2VGb2xkZXJzW2ldLmdldFJlc291cmNlKCkuZXF1YWxzKGZvbGRlcikpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0RlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDFlNDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5CYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyfSBhbmQge0BsaW5rIElMYWJlbFByb3ZpZGVyfSB0aGF0IAotICogbWFpbnRhaW5zIGEgY29sbGVjdGlvbiAoTWFwLCBhY3R1YWxseSkgb2Yge0BsaW5rIEl0ZW1Db250ZW50UHJvdmlkZXJ9IAotICogZGVsZWdhdGVzIHRoYXQgcGVyZm9ybSB0aGUgZnVuY3Rpb24gb2YgcHJvdmlkaW5nIGNvbnRlbnQgYW5kIGxhYmVsIGluZm9ybWF0aW9uCi0gKiBmb3IgZWFjaCByZXByZXNlbnRlZCBpdGVtCi0gKiAKLSAqIE5COiBUaGlzIGNsYXNzLCBpZiB1c2VkIGFzIGEgbGFiZWwgcHJvdmlkZXIgKk1VU1QqIGJlIHVzZWQgYXMgYSBjb250ZW50IHByb3ZpZGVyCi0gKiBmb3IgdGhlIHNhbWUgdmlld2VyLiAgSXQgbWF5IGJlIHVzZWQgYXMgYSBjb250ZW50IHByb3ZpZGVyIHdpdGggYSBkaWZmZXJlbnQKLSAqIGxhYmVsIHByb3ZpZGVyLCBob3dldmVyLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJTGFiZWxQcm92aWRlcgotewotCXByaXZhdGUgZmluYWwgSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgaXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgaXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotCQotCXByaXZhdGUgZmluYWwgTWFwPE9iamVjdCwgSXRlbUNvbnRlbnRQcm92aWRlcj4gaXRlbUNvbnRlbnRQcm92aWRlcnM7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBNYXA8T2JqZWN0LCBJdGVtTGFiZWxQcm92aWRlcj4gaXRlbUxhYmVsUHJvdmlkZXJzOwotCQotCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyOwotCQotCQotCXByb3RlY3RlZCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIoCi0JCQlJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBpdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSkgewotCQl0aGlzKGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LCBudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcigKLQkJCUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LAotCQkJSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5ID0gaXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0JCXRoaXMuaXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5ID0gaXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotCQl0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBJdGVtQ29udGVudFByb3ZpZGVyPigpOwotCQl0aGlzLml0ZW1MYWJlbFByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgSXRlbUxhYmVsUHJvdmlkZXI+KCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0pIHsKLQkJSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtQ29udGVudFByb3ZpZGVyID0gaXRlbUNvbnRlbnRQcm92aWRlcnMuZ2V0KGl0ZW0pOwotCQlpZiAoaXRlbUNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXRlbUNvbnRlbnRQcm92aWRlcjsKLQkJfQotCQlpdGVtQ29udGVudFByb3ZpZGVyID0gaXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKGl0ZW0sIHRoaXMpOwotCQlpZiAoaXRlbUNvbnRlbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpdGVtQ29udGVudFByb3ZpZGVycy5wdXQoaXRlbSwgaXRlbUNvbnRlbnRQcm92aWRlcik7Ci0JCXJldHVybiBpdGVtQ29udGVudFByb3ZpZGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlbUxhYmVsUHJvdmlkZXIgaXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGl0ZW0pIHsKLQkJaWYgKHZpZXdlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotCQkJCQkiVGhpcyBwcm92aWRlciBtdXN0IGJlIHVzZWQgYXMgYSBjb250ZW50IiArCi0JCQkJCSJwcm92aWRlciAqYXMgd2VsbCBhcyogYSBsYWJlbCBwcm92aWRlci4iKTsKLQkJfQotCQlJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlciA9IGl0ZW1MYWJlbFByb3ZpZGVycy5nZXQoaXRlbSk7Ci0JCWlmIChpdGVtTGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXRlbUxhYmVsUHJvdmlkZXI7Ci0JCX0KLQkJaXRlbUxhYmVsUHJvdmlkZXIgPSBpdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuYnVpbGRJdGVtTGFiZWxQcm92aWRlcihpdGVtLCB0aGlzKTsKLQkJaWYgKGl0ZW1MYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWl0ZW1MYWJlbFByb3ZpZGVycy5wdXQoaXRlbSwgaXRlbUxhYmVsUHJvdmlkZXIpOwotCQlyZXR1cm4gaXRlbUxhYmVsUHJvdmlkZXI7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBpdGVtQ29udGVudFByb3ZpZGVyKGlucHV0RWxlbWVudCkuZ2V0RWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUl0ZW1MYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gaXRlbUxhYmVsUHJvdmlkZXIoZWxlbWVudCk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDpwcm92aWRlci5nZXRJbWFnZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSXRlbUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBpdGVtTGFiZWxQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIChwcm92aWRlciA9PSBudWxsKSA/IG51bGwgOiBwcm92aWRlci5nZXRUZXh0KCk7Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCBpdGVtcwotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc3Bvc2VQcm92aWRlcnMoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VQcm92aWRlcnMoKSB7Ci0JCS8vIGNvZGVkIHRoaXMgd2F5IHRvIGFsbG93IHNvbWUgaXRlbSBwcm92aWRlcnMgdG8gZGlzcG9zZSBvZiB0aGVpciBjaGlsZCAKLQkJLy8gZWxlbWVudHMgd2l0aG91dCBkaXNydXB0aW5nIHRoZSBlbnRpcmUgcHJvY2VzcwotCQl3aGlsZSAoISBpdGVtQ29udGVudFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCWRpc3Bvc2UoaXRlbUNvbnRlbnRQcm92aWRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JCS8vIHRoaXMgY2F0Y2hlcyBhbnkgaXRlbXMgdGhhdCB3ZXJlbid0IGRpc3Bvc2VkIGZyb20gdGhlIGNvbnRlbnQgcHJvdmlkZXJzLAotCQkvLyB0aG91Z2ggdGhlcmUgbW9zdCBsaWtlbHkgd29uJ3QgYmUgYW55IGl0ZW1zIHJlcHJlc2VudGVkIGhlcmUgdGhhdCAKLQkJLy8gaGF2ZW4ndCBhbHJlYWR5IGJlZW4gZGlzcG9zZWQKLQkJd2hpbGUgKCEgaXRlbUxhYmVsUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJZGlzcG9zZShpdGVtTGFiZWxQcm92aWRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKE9iamVjdCBpdGVtKSB7Ci0JCWlmIChpdGVtQ29udGVudFByb3ZpZGVycy5jb250YWluc0tleShpdGVtKSkgewotCQkJaXRlbUNvbnRlbnRQcm92aWRlcnMuZ2V0KGl0ZW0pLmRpc3Bvc2UoKTsKLQkJCWl0ZW1Db250ZW50UHJvdmlkZXJzLnJlbW92ZShpdGVtKTsKLQkJfQotCQlpZiAoaXRlbUxhYmVsUHJvdmlkZXJzLmNvbnRhaW5zS2V5KGl0ZW0pKSB7Ci0JCQlpdGVtTGFiZWxQcm92aWRlcnMuZ2V0KGl0ZW0pLmRpc3Bvc2UoKTsKLQkJCWl0ZW1MYWJlbFByb3ZpZGVycy5yZW1vdmUoaXRlbSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBzdHJ1Y3R1cmVkVmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAob2xkSW5wdXQgIT0gbmV3SW5wdXQpIHsKLQkJCWRpc3Bvc2VQcm92aWRlcnMoKTsKLQkJfQotCQl0aGlzLnZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBzdHJ1Y3R1cmVkVmlld2VyOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIGNvbnRlbnQgZm9yIHRoZSBnaXZlbiBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udGVudChmaW5hbCBPYmplY3QgaXRlbSkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQl2aWV3ZXIucmVmcmVzaChpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JfQotCQotCS8vIG9wZW4gdXAgdmlzaWJpbGl0eSBhIGJpdCBmb3IgaW5uZXIgY2xhc3NlcwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgbGFiZWwgZm9yIHRoZSBnaXZlbiBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTGFiZWwoZmluYWwgT2JqZWN0IGl0ZW0pIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKG5ldyBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50KERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlci50aGlzLCBpdGVtKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0l0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0l0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyZjcxMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9JdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlOwotCi0vKioKLSAqIE1hcmtlciBpbnRlcmZhY2UgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIERlbGVnYXRpbmdDb250ZW50UHJvdmlkZXIgdG8gcmV0dXJuIAotICogY29udGVudCBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGl0ZW0uCi0gKiBAc2VlIERlbGVnYXRpbmdDb250ZW50UHJvdmlkZXIKLSAqIEBzZWUgSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbUNvbnRlbnRQcm92aWRlcgotewotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHJlcHJlc2VudGVkIGl0ZW0uCi0JICogTm90ZSB0aGF0IHdoZW4gdGhpcyBpcyBjYWxsZWQsIHRoZSByZXByZXNlbnRlZCBpdGVtIGlzIGFuIGlucHV0IGVsZW1lbnQuCi0JICovCi0JT2JqZWN0W10gZ2V0RWxlbWVudHMoKTsKLQkKLQkvKioKLQkgKiBEaXNwb3NlIG9mIHRoaXMgY29udGVudCBwcm92aWRlciwgY2xlYW5pbmcgdXAgYWxsIHJlZmVyZW5jZXMsIGxpc3RlbmVycywgZXRjLgotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0l0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmRkMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2U7Ci0KLS8qKgotICogRmFjdG9yeSBpbnRlcmZhY2UgdXNlZCB0byBkZXNjcmliZSBob3cgdG8gYnVpbGQge0BsaW5rIEl0ZW1Db250ZW50UHJvdmlkZXJ9cwotICogZm9yIGEge0BsaW5rIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcn0KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLXsKLQlJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihPYmplY3QgaXRlbSwgCi0JCQlEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNWRmM2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBEZWxlZ2F0aW5nTGFiZWxQcm92aWRlciB0byByZXR1cm4gCi0gKiBsYWJlbCBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGl0ZW0uCi0gKiBAc2VlIERlbGVnYXRpbmdMYWJlbFByb3ZpZGVyCi0gKiBAc2VlIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJdGVtTGFiZWxQcm92aWRlcgotewotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2UgZm9yIHRoZSBpdGVtCi0JICovCi0JSW1hZ2UgZ2V0SW1hZ2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgZm9yIHRoZSBpdGVtCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCk7Ci0JCi0JLyoqCi0JICogRGlzcG9zZSBvZiB0aGlzIGxhYmVsIHByb3ZpZGVyLCBjbGVhbmluZyB1cCBhbGwgcmVmZXJlbmNlcywgbGlzdGVuZXJzLCBldGMuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0l0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2NjMzU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0l0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZTsKLQotLyoqCi0gKiBGYWN0b3J5IGludGVyZmFjZSB1c2VkIHRvIGRlc2NyaWJlIGhvdyB0byBidWlsZCBJSXRlbUxhYmVsUHJvdmlkZXJzCi0gKiBmb3IgYSBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci17Ci0JSXRlbUxhYmVsUHJvdmlkZXIgYnVpbGRJdGVtTGFiZWxQcm92aWRlcigKLQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL1RyZWVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTg1MDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlciB0byByZXR1cm4gCi0gKiB0cmVlIGluZm9ybWF0aW9uIGZvciBhIHBhcnRpY3VsYXIgaXRlbS4KLSAqIEBzZWUgRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXIKLSAqIEBzZWUgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgSXRlbUNvbnRlbnRQcm92aWRlcgotewotCS8qKgotCSAqIFJldHVybiB0aGUgcGFyZW50IG9mIHRoZSByZXByZXNlbnRlZCBpdGVtCi0JICovCi0JT2JqZWN0IGdldFBhcmVudCgpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByZXByZXNlbnRlZCBpdGVtIGhhcyBjaGlsZHJlbgotCSAqLwotCWJvb2xlYW4gaGFzQ2hpbGRyZW4oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoaWxkcmVuIG9mIHRoZSByZXByZXNlbnRlZCBpdGVtCi0JICovCi0JT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL1RyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzVlYjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlOwotCi0vKioKLSAqIEV4dGVuc2lvbiBvZiB7QGxpbmsgSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnl9IHRoYXQgZXh0ZW5kcyBmdW5jdGlvbmFsaXR5Ci0gKiBmb3IgdHJlZSBjb250ZW50Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBleHRlbmRzIEl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihPYmplY3QgaXRlbSwgCi0JCQlEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvbmF2aWdhdG9yL0pwYU5hdmlnYXRvclByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRjN2I3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSBQcm9qZWN0IE5hdmlnYXRvciB2aWV3IGNvbnRlbnRzIGFuZCAKLSAqIGxhYmVscyBmb3IgYSBnaXZlbiBKUEEgcHJvamVjdC4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhTmF2aWdhdG9yUHJvdmlkZXIKLXsKLQkvKioKLQkgKiBCdWlsZCBhbiBmYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJ9cwotCSAqLwotCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKLQkKLQkvKioKLQkgKiBCdWlsZCBhIGZhY3RvcnkgdG8gY3JlYXRlIHtAbGluayBJdGVtTGFiZWxQcm92aWRlcn1zCi0JICovCi0JSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCQotCXZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjODcyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcgY29udGVudHMgYW5kIAotICogbGFiZWxzIGZvciBhIGdpdmVuIEpQQSByZXNvdXJjZS4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhU3RydWN0dXJlUHJvdmlkZXIKLXsKLQkvLyBUT0RPIC0gY2hhbmdlIHRoaXMKLQlPYmplY3QgZ2V0SW5wdXQoKTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuIGZhY3RvcnkgdG8gY3JlYXRlIHtAbGluayBUcmVlSXRlbUNvbnRlbnRQcm92aWRlcn1zCi0JICovCi0JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQnVpbGQgYSBmYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgSXRlbUxhYmVsUHJvdmlkZXJ9cwotCSAqLwotCUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKTsKLQotCXZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3RlbXBsYXRlcy9hbm5vdGF0ZWRfZW50aXR5LmphdmFqZXQgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2Fubm90YXRlZF9lbnRpdHkuamF2YWpldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjNjE1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2Fubm90YXRlZF9lbnRpdHkuamF2YWpldAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwlQCBqZXQgcGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LnVpIiAKLQlpbXBvcnRzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC4qIGphdmEudXRpbC4qICIgCi0JY2xhc3M9IkFubm90YXRlZEVudGl0eVRlbXBsYXRlIiAKLSU+Ci08JSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwpIGFyZ3VtZW50OyAKLWlmIChtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9bnVsbCAmJiBtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9IiIpIHsgJT5wYWNrYWdlIDwlPW1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpJT47PCV9JT4KLQotPCUgQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKGZhbHNlKTsKLWZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAlPgotaW1wb3J0IDwlPWFuSW1wb3J0JT47Ci08JSB9ICU+Ci0KLS8qKgotICogRW50aXR5IGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBFbnRpdHk6IDwlPW1vZGVsLmdldEVudGl0eU5hbWUoKSU+Ci0gKgotICovCi08JT1tb2RlbC5nZXRBcnRpZmFjdFR5cGUoKSU+PCVTdHJpbmcgRU5USVRZX05BTUUgPSBtb2RlbC5nZXRFbnRpdHlOYW1lKCk7Ci1pZiAobW9kZWwuaXNFbnRpdHlOYW1lU2V0KCkpIHslPihuYW1lPSI8JT1FTlRJVFlfTkFNRSU+Iik8JX0lPgotPCVpZiAobW9kZWwuaXNUYWJsZU5hbWVTZXQoKSkgeyU+Ci1AVGFibGUobmFtZT0iPCU9bW9kZWwuZ2V0VGFibGVOYW1lKCklPiIpPCV9JT4KLTwlPW1vZGVsLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSU+Ci08JWlmIChtb2RlbC5pc0NvbXBvc2l0ZVBLKCkpIHslPgotQElkQ2xhc3MoPCU9bW9kZWwuZ2V0SWRDbGFzc05hbWUoKSU+LmNsYXNzKTwlfSU+Ci1wdWJsaWMgY2xhc3MgPCU9bW9kZWwuZ2V0Q2xhc3NOYW1lKCklPjwlU3RyaW5nIHN1cGVyQ2xhc3MgPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpOwotCWlmICghICIiLmVxdWFscyhzdXBlckNsYXNzKSkgeyU+IGV4dGVuZHMgPCU9c3VwZXJDbGFzcyU+PCV9JT48JQotCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gbW9kZWwuZ2V0SW50ZXJmYWNlcygpOyAKLQlpZiAoaW50ZXJmYWNlcy5zaXplKCk+MCkgeyU+IGltcGxlbWVudHMgPCUgfQotCWZvciAoaW50IGk9MDsgaTxpbnRlcmZhY2VzLnNpemUoKTsgaSsrKSB7Ci0gCQlTdHJpbmcgSU5URVJGQUNFID0gKFN0cmluZykgaW50ZXJmYWNlcy5nZXQoaSk7Ci0JCWlmIChpPjApIHsgJT4sIDwlfSU+PCU9SU5URVJGQUNFJT48JX0lPiB7Ci0KLQk8JSBMaXN0PEVudGl0eVJvdz4gZmllbGRzID0gbW9kZWwuZ2V0RW50aXR5RmllbGRzKCk7Ci0JTGlzdDxTdHJpbmc+IHBrRmllbGRzID0gbW9kZWwuZ2V0UEtGaWVsZHMoKTsgCi0gCWZvciAoRW50aXR5Um93IGVudGl0eSA6IGZpZWxkcykgewotCQlTdHJpbmcgTkFNRSA9IGVudGl0eS5nZXROYW1lKCk7Ci0JCWlmIChwa0ZpZWxkcy5jb250YWlucyhOQU1FKSAmJiBtb2RlbC5pc0ZpZWxkQWNjZXNzKCkpIHsKLSAgICAlPiAgIAotCUBJZDwlfSU+Ci0JcHJpdmF0ZSA8JT1lbnRpdHkuZ2V0VHlwZSgpJT4gPCU9ZW50aXR5LmdldE5hbWUoKSU+OzwlfSU+Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwdWJsaWMgPCU9bW9kZWwuZ2V0Q2xhc3NOYW1lKCklPigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0gICA8JQotCWZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCWlmIChmaWVsZHMgIT0gbnVsbCkgZm9yIChpbnQgaT0wOyBpPGZpZWxkcy5zaXplKCk7IGkrKykgewotCQlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOwotCQlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCVN0cmluZyBNRVRIT0QgPSBOQU1FLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBOQU1FLnN1YnN0cmluZygxKTsKLQlpZiAocGtGaWVsZHMuY29udGFpbnMoTkFNRSkgJiYgIW1vZGVsLmlzRmllbGRBY2Nlc3MoKSkgewotICAgICU+ICAgCi0JQElkIDwlfSU+ICAgCi0JcHVibGljIDwlPVRZUEUlPiBnZXQ8JT1NRVRIT0QlPigpIHsKLQkJcmV0dXJuIHRoaXMuPCU9TkFNRSU+OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldDwlPU1FVEhPRCU+KDwlPVRZUEUlPiA8JT1OQU1FJT4pIHsKLQkJdGhpcy48JT1OQU1FJT4gPSA8JT1OQU1FJT47Ci0JfQotICAgPCV9JT4KLSAgIAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3RlbXBsYXRlcy9lbnRpdHkuamF2YWpldCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS90ZW1wbGF0ZXMvZW50aXR5LmphdmFqZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Y2I2ZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3RlbXBsYXRlcy9lbnRpdHkuamF2YWpldAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwlQCBqZXQgcGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LnVpIiAKLQlpbXBvcnRzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC4qIGphdmEudXRpbC4qICIgCi0JY2xhc3M9IkVudGl0eVRlbXBsYXRlIiAKLSU+Ci08JSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwpIGFyZ3VtZW50OyAKLWlmIChtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9bnVsbCAmJiBtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9IiIpIHsgJT5wYWNrYWdlIDwlPW1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpJT47PCV9JT4KLQotPCUgQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKGZhbHNlKTsKLWZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAlPgotaW1wb3J0IDwlPWFuSW1wb3J0JT47Ci08JSB9ICU+Ci0KLS8qKgotICogRW50aXR5IGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBFbnRpdHk6IDwlPW1vZGVsLmdldEVudGl0eU5hbWUoKSU+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgPCU9bW9kZWwuZ2V0Q2xhc3NOYW1lKCklPjwlU3RyaW5nIHN1cGVyQ2xhc3MgPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpOwotCWlmICghICIiLmVxdWFscyhzdXBlckNsYXNzKSkgeyU+IGV4dGVuZHMgPCU9c3VwZXJDbGFzcyU+PCV9JT48JQotCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gbW9kZWwuZ2V0SW50ZXJmYWNlcygpOyAKLQlpZiAoaW50ZXJmYWNlcy5zaXplKCk+MCkgeyU+IGltcGxlbWVudHMgPCUgfQotCWZvciAoaW50IGk9MDsgaTxpbnRlcmZhY2VzLnNpemUoKTsgaSsrKSB7Ci0JCVN0cmluZyBJTlRFUkZBQ0UgPSAoU3RyaW5nKSBpbnRlcmZhY2VzLmdldChpKTsKLQkJaWYgKGk+MCkgeyAlPiwgPCV9JT48JT1JTlRFUkZBQ0UlPjwlfSU+IHsKLQotCTwlIExpc3Q8RW50aXR5Um93PiBmaWVsZHMgPSBtb2RlbC5nZXRFbnRpdHlGaWVsZHMoKTsgCi0JZm9yIChFbnRpdHlSb3cgZW50aXR5IDogZmllbGRzKSB7ICAgICAKLQklPiAKLQlwcml2YXRlIDwlPWVudGl0eS5nZXRUeXBlKCklPiA8JT1lbnRpdHkuZ2V0TmFtZSgpJT47PCV9JT4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsJCi0JcHVibGljIDwlPW1vZGVsLmdldENsYXNzTmFtZSgpJT4oKSB7Ci0JCXN1cGVyKCk7Ci0JfSAKLQk8JQotCWZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCWlmIChmaWVsZHMgIT0gbnVsbCkgZm9yIChpbnQgaT0wOyBpPGZpZWxkcy5zaXplKCk7IGkrKykgewotCQlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOwotCQlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCVN0cmluZyBNRVRIT0QgPSBOQU1FLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBOQU1FLnN1YnN0cmluZygxKTsKLQklPiAgIAotCXB1YmxpYyA8JT1UWVBFJT4gZ2V0PCU9TUVUSE9EJT4oKSB7Ci0gCQlyZXR1cm4gdGhpcy48JT1OQU1FJT47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0PCU9TUVUSE9EJT4oPCU9VFlQRSU+IDwlPU5BTUUlPikgewotCQl0aGlzLjwlPU5BTUUlPiA9IDwlPU5BTUUlPjsKLQl9Ci0JPCV9JT4KLSAgIAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3RlbXBsYXRlcy9pZENsYXNzLmphdmFqZXQgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2lkQ2xhc3MuamF2YWpldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJhYWRkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2lkQ2xhc3MuamF2YWpldAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08JUAgamV0CXBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC51aSIgCi0JaW1wb3J0cz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuKiBqYXZhLnV0aWwuKiAiIAotCWNsYXNzPSJJZENsYXNzVGVtcGxhdGUiIAotJT4KLTwlIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwgPSAoQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCkgYXJndW1lbnQ7IAotaWYgKG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpIT1udWxsICYmIG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpIT0iIikgeyAlPnBhY2thZ2UgPCU9bW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCklPjs8JX0lPgotCi08JSBDb2xsZWN0aW9uPFN0cmluZz4gaW1wb3J0cyA9IG1vZGVsLmdldEltcG9ydHModHJ1ZSk7Ci1mb3IgKFN0cmluZyBhbkltcG9ydCA6IGltcG9ydHMpIHsgJT4KLWltcG9ydCA8JT1hbkltcG9ydCU+OwotPCUgfSAlPgotCi0vKioKLSAqIElEIGNsYXNzIGZvciBlbnRpdHk6IDwlPW1vZGVsLmdldENsYXNzTmFtZSgpJT4KLSAqCi0gKi8gCi1wdWJsaWMgY2xhc3MgPCU9bW9kZWwuZ2V0SWRDbGFzc05hbWUoKSU+IAotPCUgTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBtb2RlbC5nZXRJbnRlcmZhY2VzKCk7IAotCWlmIChpbnRlcmZhY2VzLnNpemUoKT4wKSB7JT4gaW1wbGVtZW50cyA8JSB9Ci0JZm9yIChpbnQgaT0wOyBpPGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLQkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotCQlpZiAoaT4wKSB7ICU+LCA8JX0lPjwlPUlOVEVSRkFDRSU+PCV9JT4geyAgIAotICAgCi0JPCUgTGlzdDxFbnRpdHlSb3c+IGZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCUxpc3Q8U3RyaW5nPiBwa0ZpZWxkcyA9IG1vZGVsLmdldFBLRmllbGRzKCk7IAotCWZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJRW50aXR5Um93IGVudGl0eSA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7Ci0JCWlmICghcGtGaWVsZHMuY29udGFpbnMoZW50aXR5LmdldE5hbWUoKSkpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JJT4gICAgICAgICAKLQlwcml2YXRlIDwlPWVudGl0eS5nZXRUeXBlKCklPiA8JT1lbnRpdHkuZ2V0TmFtZSgpJT47PCV9JT4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCXB1YmxpYyA8JT1tb2RlbC5nZXRJZENsYXNzTmFtZSgpJT4oKSB7fQotCi0JPCUKLQlmaWVsZHMgPSBtb2RlbC5nZXRFbnRpdHlGaWVsZHMoKTsKLQlpZiAoZmllbGRzICE9IG51bGwpIGZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJRW50aXR5Um93IGZpZWxkID0gKEVudGl0eVJvdykgZmllbGRzLmdldChpKTsKLQkJU3RyaW5nIFRZUEUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0JCVN0cmluZyBOQU1FID0gZmllbGQuZ2V0TmFtZSgpOwotCQlpZiAoIXBrRmllbGRzLmNvbnRhaW5zKE5BTUUpKSB7Ci0JCQljb250aW51ZTsKLQkJfSAJCQotCQlTdHJpbmcgTUVUSE9EID0gTkFNRS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgTkFNRS5zdWJzdHJpbmcoMSk7ICAgICAgICAKLQklPgotCi0JcHVibGljIDwlPVRZUEUlPiBnZXQ8JT1NRVRIT0QlPigpIHsKLQkJcmV0dXJuIHRoaXMuPCU9TkFNRSU+OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldDwlPU1FVEhPRCU+KDwlPVRZUEUlPiA8JT1OQU1FJT4pIHsKLQkJdGhpcy48JT1OQU1FJT4gPSA8JT1OQU1FJT47Ci0JfQotCTwlfSU+Ci0gICAKLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCEobyBpbnN0YW5jZW9mIDwlPW1vZGVsLmdldElkQ2xhc3NOYW1lKCklPikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQk8JT1tb2RlbC5nZXRJZENsYXNzTmFtZSgpJT4gb3RoZXIgPSAoPCU9bW9kZWwuZ2V0SWRDbGFzc05hbWUoKSU+KSBvOwotCQlyZXR1cm4gdHJ1ZQotPCUgaWYgKGZpZWxkcyAhPSBudWxsKSBmb3IgKGludCBpPTA7IGk8ZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JRW50aXR5Um93IGZpZWxkID0gKEVudGl0eVJvdykgZmllbGRzLmdldChpKTsgCi0JU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JaWYgKCFwa0ZpZWxkcy5jb250YWlucyhOQU1FKSkgewotICAgICAgIAljb250aW51ZTsKLSAgICB9JT4KLTwlIAlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsgCi0JU3RyaW5nIEdFVF9NRVRIT0QgPSAiZ2V0IiArIE5BTUUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIE5BTUUuc3Vic3RyaW5nKDEpOyAlPgotPCUJaWYgKFRZUEUuZXF1YWxzKCJib29sZWFuIikgfHwgVFlQRS5lcXVhbHMoImJ5dGUiKSB8fCBUWVBFLmVxdWFscygiY2hhciIpIHx8IFRZUEUuZXF1YWxzKCJzaG9ydCIpIHx8IFRZUEUuZXF1YWxzKCJpbnQiKSB8fCBUWVBFLmVxdWFscygibG9uZyIpKSB7ICU+Ci0JCQkmJiA8JT1HRVRfTUVUSE9EJT4oKSA9PSBvdGhlci48JT1HRVRfTUVUSE9EJT4oKQotPCUgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImRvdWJsZSIpKSB7ICU+Ci0JCQkmJiAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoPCU9R0VUX01FVEhPRCU+KCkpID09IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKG90aGVyLjwlPUdFVF9NRVRIT0QlPigpKSkKLTwlIAl9IGVsc2UgaWYgKFRZUEUuZXF1YWxzKCJmbG9hdCIpKSB7ICU+Ci0JCQkmJiAoRmxvYXQuZmxvYXRUb0ludEJpdHMoPCU9R0VUX01FVEhPRCU+KCkpID09IEZsb2F0LmZsb2F0VG9JbnRCaXRzKG90aGVyLjwlPUdFVF9NRVRIT0QlPigpKSkKLTwlIAl9IGVsc2UgeyAlPgotCQkJJiYgKDwlPUdFVF9NRVRIT0QlPigpID09IG51bGwgPyBvdGhlci48JT1HRVRfTUVUSE9EJT4oKSA9PSBudWxsIDogPCU9R0VUX01FVEhPRCU+KCkuZXF1YWxzKG90aGVyLjwlPUdFVF9NRVRIT0QlPigpKSkKLTwlIAl9ICU+Ci08JSB9ICU+OwotCX0KLQkKLQkvKgkgCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCWludCByZXN1bHQgPSAxOwotPCUgaWYgKGZpZWxkcyAhPSBudWxsKSBmb3IgKGludCBpPTA7IGk8ZmllbGRzLnNpemUoKTsgaSsrKSB7IAotCUVudGl0eVJvdyBmaWVsZCA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7Ci0JU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JaWYgKCFwa0ZpZWxkcy5jb250YWlucyhOQU1FKSkgewotICAgICAgIAljb250aW51ZTsKLSAgICB9JT4KLTwlIAlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsgCi0JU3RyaW5nIEdFVF9NRVRIT0QgPSAiZ2V0IiArIE5BTUUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIE5BTUUuc3Vic3RyaW5nKDEpOyAlPgotPCUJaWYgKFRZUEUuZXF1YWxzKCJib29sZWFuIikpIHsgJT4KLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoPCU9R0VUX01FVEhPRCU+KCkgPyAxIDogMCk7Ci08JSAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygiaW50IikpIHsgJT4KLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyA8JT1HRVRfTUVUSE9EJT4oKTsKLTwlIAl9IGVsc2UgaWYgKFRZUEUuZXF1YWxzKCJieXRlIikgfHwgVFlQRS5lcXVhbHMoImNoYXIiKSB8fCBUWVBFLmVxdWFscygic2hvcnQiKSkgeyAlPgotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoaW50KSA8JT1HRVRfTUVUSE9EJT4oKSk7Ci08JSAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygibG9uZyIpKSB7ICU+Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpbnQpICg8JT1HRVRfTUVUSE9EJT4oKSBeICg8JT1HRVRfTUVUSE9EJT4oKSA+Pj4gMzIpKSk7Ci08JSAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygiZG91YmxlIikpIHsgJT4KLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGludCkgKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKDwlPUdFVF9NRVRIT0QlPigpICkgXiAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoPCU9R0VUX01FVEhPRCU+KCkpID4+PiAzMikpKTsKLTwlIAl9IGVsc2UgaWYgKFRZUEUuZXF1YWxzKCJmbG9hdCIpKSB7ICU+Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgRmxvYXQuZmxvYXRUb0ludEJpdHMoPCU9R0VUX01FVEhPRCU+KCkpOwotPCUgCX0gZWxzZSB7ICU+Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKDwlPUdFVF9NRVRIT0QlPigpID09IG51bGwgPyAwIDogPCU9R0VUX01FVEhPRCU+KCkuaGFzaENvZGUoKSk7Ci08JSAJfSAlPgotPCUgfSAlPgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLSAgIAotICAgCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTI4NjA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjM4OWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudXRpbGl0eTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNWIyYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEphbiAxNSAxMToxMjoyMiBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MzgyNjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDo1NTozNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjIyZjJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ci1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhYjhkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZT0xLjUKLWphdmFjVGFyZ2V0PTEuNQotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjEwYjI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ij48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjMDI5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBVdGlsaXR5Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhYmYxMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTsKLQotLyoqCi0gKiBTaW1wbGUgaW50ZXJmYWNlIGZvciBpbXBsZW1lbnRpbmcgdGhlIEdPRiBDb21tYW5kIGRlc2lnbiBwYXR0ZXJuLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kIHsKLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGNvbW1hbmQKLQkgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4KLQkgKi8KLQl2b2lkIGV4ZWN1dGUoKTsKLQotCWZpbmFsIGNsYXNzIE51bGwgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJcHVibGljIHN0YXRpYyBDb21tYW5kIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJDb21tYW5kLk51bGwiOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkNvbW1hbmQuRGlzYWJsZWQiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OGRiZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L0NvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgY2xpZW50cyB0byBjb250cm9sIGhvdyBhIGNvbW1hbmQgaXMgZXhlY3V0ZWQKLSAqIChlLmcuIGRpc3BhdGNoaW5nIHRoZSBjb21tYW5kIHRvIHRoZSBVSSB0aHJlYWQpLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kRXhlY3V0b3IgewotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuCi0JICovCi0Jdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCk7Ci0KLQotCS8qKgotCSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBleGVjdXRvciBpbnRlcmZhY2UKLQkgKiB0aGF0IHNpbXBseSBleGVjdXRlcyB0aGUgY29tbWFuZCB3aXRob3V0IGFueSBzb3J0IG9mIGVuaGFuY2VtZW50LgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBDb21tYW5kRXhlY3V0b3IgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmRFeGVjdXRvciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCXB1YmxpYyBzdGF0aWMgQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkNvbW1hbmRFeGVjdXRvci5EZWZhdWx0IjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L0NvbW1hbmRFeGVjdXRvclByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExZjVjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7Ci0KLS8qKgotICogWWV0IGFub3RoZXIgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gdG8gYWxsb3cgY2xpZW50cyB0byBjb250cm9sCi0gKiBob3cgYSBjb21tYW5kIGlzIGV4ZWN1dGVkIGJ5IHRoZSBzZXJ2ZXIKLSAqIChlLmcuIGRpc3BhdGNoaW5nIHRoZSBjb21tYW5kIHRvIHRoZSBVSSB0aHJlYWQpLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kRXhlY3V0b3JQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQgZXhlY3V0b3IuCi0JICovCi0JQ29tbWFuZEV4ZWN1dG9yIGdldENvbW1hbmRFeGVjdXRvcigpOwotCi0KLQkvKioKLQkgKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgZXhlY3V0b3IgcHJvdmlkZXIKLQkgKiBpbnRlcmZhY2UgdGhlIHJldHVybnMgdGhlIGRlZmF1bHQgY29tbWFuZCBleGVjdXRvci4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmRFeGVjdXRvclByb3ZpZGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIENvbW1hbmRFeGVjdXRvciBnZXRDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCQlyZXR1cm4gQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIuRGVmYXVsdCI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9GaWx0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyNmI3Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5OwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIGZpbHRlciBvYmplY3RzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXI8VD4gewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgImFjY2VwdGVkIiBieSB0aGUKLQkgKiBmaWx0ZXIuIFRoZSBzZW1hbnRpY3Mgb2YgImFjY2VwdCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JYm9vbGVhbiBhY2NlcHQoVCBvKTsKLQotCi0JZmluYWwgY2xhc3MgTnVsbDxTPiBpbXBsZW1lbnRzIEZpbHRlcjxTPiB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbHRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIG5vdGhpbmcgaXMgZmlsdGVyZWQgLSBldmVyeXRoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG5leHQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJGaWx0ZXIuTnVsbCI7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIEZpbHRlcjxTPiB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbHRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG5leHQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJGaWx0ZXIuRGlzYWJsZWQiOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvSmF2YVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9KYXZhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzQ3ZGJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9KYXZhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlc2NyaWJlcyBhIEphdmEgdHlwZTsgaS5lLiBpdHMgImVsZW1lbnQgdHlwZSIKLSAqIGFuZCBpdHMgImFycmF5IGRlcHRoIi4gVGhlIGVsZW1lbnQgdHlwZSBpcyByZWZlcmVuY2VkIGJ5IG5hbWUsCi0gKiBhbGxvd2luZyB1cyB0byByZWZlcmVuY2UgY2xhc3NlcyB0aGF0IGFyZSBub3QgKG9yIGNhbm5vdCBiZSkgbG9hZGVkLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVR5cGUKLQlleHRlbmRzIENvbXBhcmFibGU8SmF2YVR5cGU+Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHR5cGUncyAiZWxlbWVudCB0eXBlIi4KLQkgKiBBIG1lbWJlciB0eXBlIHdpbGwgaGF2ZSBvbmUgb3IgbW9yZSAnJCcgY2hhcmFjdGVycyBpbiBpdHMgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyAiYXJyYXkgZGVwdGgiLgotCSAqLwotCWludCBnZXRBcnJheURlcHRoKCk7Ci0KLQlib29sZWFuIGlzQXJyYXkoKTsKLQotCS8qKgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCWJvb2xlYW4gaXNQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCWJvb2xlYW4gaXNQcmltaXRpdmVXcmFwcGVyKCk7Ci0KLQkvKioKLQkgKiBOQjogdmFyaWFibGVzIGNhbm5vdCBiZSBkZWNsYXJlZCAndm9pZCcKLQkgKi8KLQlib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIE5COiB2YXJpYWJsZXMgY2Fubm90IGJlIGRlY2xhcmVkICd2b2lkJwotCSAqLwotCWJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSdzIGVsZW1lbnQgdHlwZSBhbmQgYXJyYXkgZGVwdGguCi0JICovCi0JQ2xhc3M8Pz4gZ2V0SmF2YUNsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgbWF0Y2hlcyB0aGF0Ci0JICogcmV0dXJuZWQgYnkgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqIChlLmcuICJbW0oiLCAiW0xqYXZhLmxhbmcuT2JqZWN0OyIsICJqYXZhLnV0aWwuTWFwJEVudHJ5IikuCi0JICovCi0JU3RyaW5nIGdldEphdmFDbGFzc05hbWUoKTsKLQotCWJvb2xlYW4gZXF1YWxzKFN0cmluZyBvdGhlckVsZW1lbnRUeXBlTmFtZSwgaW50IG90aGVyQXJyYXlEZXB0aCk7Ci0KLQlib29sZWFuIGRlc2NyaWJlcyhTdHJpbmcgY2xhc3NOYW1lKTsKLQotCWJvb2xlYW4gZGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcyk7Ci0KLQlib29sZWFuIGVxdWFscyhKYXZhVHlwZSBvdGhlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgaW4gc291cmNlIGNvZGU6Ci0JICogICAgICJbW0oiID0+ICJsb25nW11bXSIKLQkgKiAgICAgImphdmEudXRpbC5NYXAkRW50cnkiID0+ICJqYXZhLnV0aWwuTWFwLkVudHJ5IgotCSAqLwotCVN0cmluZyBkZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogQXBwZW5kIHRoZSB2ZXJzaW9uIG9mIHRoZSB0eXBlJ3MgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHNvdXJjZSBjb2RlOgotCSAqICAgICAiW1tKIiA9PiAibG9uZ1tdW10iCi0JICogICAgICJqYXZhLnV0aWwuTWFwJEVudHJ5IiA9PiAiamF2YS51dGlsLk1hcC5FbnRyeSIKLQkgKi8KLQl2b2lkIGFwcGVuZERlY2xhcmF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZToKLQkgKiAgICAgIltbSiIgPT4gImxvbmdbXVtdIgotCSAqICAgICAiamF2YS51dGlsLk1hcCRFbnRyeSIgPT4gImphdmEudXRpbC5NYXAuRW50cnkiCi0JICovCi0Jdm9pZCBwcmludERlY2xhcmF0aW9uT24oUHJpbnRXcml0ZXIgcHcpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvTWV0aG9kU2lnbmF0dXJlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvTWV0aG9kU2lnbmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZmNiYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L01ldGhvZFNpZ25hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVzY3JpYmVzIGEgSmF2YSBtZXRob2Qgc2lnbmF0dXJlOyBpLmUuIGl0cyAibmFtZSIKLSAqIGFuZCBpdHMgInBhcmFtZXRlciB0eXBlcyIuIFRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIHJlZmVyZW5jZWQgYnkgbmFtZSwKLSAqIGFsbG93aW5nIHVzIHRvIHJlZmVyZW5jZSBjbGFzc2VzIHRoYXQgYXJlIG5vdCAob3IgY2Fubm90IGJlKSBsb2FkZWQuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RTaWduYXR1cmUKLQlleHRlbmRzIENvbXBhcmFibGU8TWV0aG9kU2lnbmF0dXJlPgotewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QncyBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCdzIHBhcmFtZXRlciB0eXBlcy4KLQkgKi8KLQlKYXZhVHlwZVtdIGdldFBhcmFtZXRlclR5cGVzKCk7Ci0KLQlib29sZWFuIGVxdWFscyhTdHJpbmcgb3RoZXJOYW1lLCBKYXZhVHlwZVtdIG90aGVyUGFyYW1ldGVyVHlwZXMpOwotCi0JYm9vbGVhbiBlcXVhbHMoTWV0aG9kU2lnbmF0dXJlIG90aGVyKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kIHNpZ25hdHVyZToKLQkgKiAgICAgImZvbyhpbnQsIGphdmEubGFuZy5TdHJpbmcpIgotCSAqLwotCVN0cmluZyBnZXRTaWduYXR1cmUoKTsKLQotCS8qKgotCSAqIEFwcGVuZCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kIHNpZ25hdHVyZToKLQkgKiAgICAgImZvbyhpbnQsIGphdmEubGFuZy5TdHJpbmcpIgotCSAqLwotCXZvaWQgYXBwZW5kU2lnbmF0dXJlVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0KLQkvKioKLQkgKiBQcmludCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kIHNpZ25hdHVyZToKLQkgKiAgICAgImZvbyhpbnQsIGphdmEubGFuZy5TdHJpbmcpIgotCSAqLwotCXZvaWQgcHJpbnRTaWduYXR1cmVPbihQcmludFdyaXRlciBwdyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9BYnN0cmFjdEFzc29jaWF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQWJzdHJhY3RBc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmZhNjFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9BYnN0cmFjdEFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEltcGxlbWVudCBzb21lIG9mIHRoZSBtZXRob2RzIGluIEFzc29jaWF0aW9uIHRoYXQgY2FuCi0gKiBiZSBkZWZpbmVkIGluIHRlcm1zIG9mIHRoZSBvdGhlciBtZXRob2RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBc3NvY2lhdGlvbjxLLCBWPgotCWltcGxlbWVudHMgQXNzb2NpYXRpb248SywgVj4KLXsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0QXNzb2NpYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBBc3NvY2lhdGlvbikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlBc3NvY2lhdGlvbjw/LCA/PiBvdGhlciA9IChBc3NvY2lhdGlvbjw/LCA/PikgbzsKLQkJcmV0dXJuICh0aGlzLmtleSgpID09IG51bGwgPwotCQkJCQlvdGhlci5rZXkoKSA9PSBudWxsIDogdGhpcy5rZXkoKS5lcXVhbHMob3RoZXIua2V5KCkpKQotCQkJJiYgKHRoaXMudmFsdWUoKSA9PSBudWxsID8KLQkJCQkJb3RoZXIudmFsdWUoKSA9PSBudWxsIDogdGhpcy52YWx1ZSgpLmVxdWFscyhvdGhlci52YWx1ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAodGhpcy5rZXkoKSA9PSBudWxsID8gMCA6IHRoaXMua2V5KCkuaGFzaENvZGUoKSkKLQkJCV4gKHRoaXMudmFsdWUoKSA9PSBudWxsID8gMCA6IHRoaXMudmFsdWUoKS5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMua2V5KCkgKyAiID0+ICIgKyB0aGlzLnZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQXNzb2NpYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzEzMGU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgZGVmaW5pdGlvbiBvZiBhbiBvYmplY3QgcGFpcmluZy4KLSAqIFRoZSBrZXkgaXMgaW1tdXRhYmxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFzc29jaWF0aW9uPEssIFY+IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNzb2NpYXRpb24ncyBrZXkuCi0JICovCi0JSyBrZXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNzb2NpYXRpb24ncyB2YWx1ZS4KLQkgKi8KLQlWIHZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGFzc29jaWF0aW9uJ3MgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlWIHNldFZhbHVlKFYgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYm90aCB0aGUgYXNzb2NpYXRpb25zJyBrZXlzIGFuZCB2YWx1ZXMKLQkgKiBhcmUgZXF1YWwuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pOwotCi0JLyoqCi0JICogUmV0dXJuIGEgaGFzaCBjb2RlIGJhc2VkIG9uIHRoZSBhc3NvY2lhdGlvbidzCi0JICoga2V5IGFuZCB2YWx1ZS4KLQkgKi8KLQlpbnQgaGFzaENvZGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JhZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTdmNDhiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotLyoqCi0gKiBBIGNvbGxlY3Rpb24gdGhhdCBhbGxvd3MgZHVwbGljYXRlIGVsZW1lbnRzLgotICogPHA+Ci0gKiBUaGUgPGNvZGU+QmFnPC9jb2RlPiBpbnRlcmZhY2UgcGxhY2VzIGFkZGl0aW9uYWwgc3RpcHVsYXRpb25zLAotICogYmV5b25kIHRob3NlIGluaGVyaXRlZCBmcm9tIHRoZSA8Y29kZT5qYXZhLnV0aWwuQ29sbGVjdGlvbjwvY29kZT4gaW50ZXJmYWNlLAotICogb24gdGhlIGNvbnRyYWN0cyBvZiB0aGUgPGNvZGU+ZXF1YWxzPC9jb2RlPiBhbmQgPGNvZGU+aGFzaENvZGU8L2NvZGU+IG1ldGhvZHMuCi0gKiAKLSAqIEBzZWUgSGFzaEJhZwotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQmFnPEU+IGV4dGVuZHMgamF2YS51dGlsLkNvbGxlY3Rpb248RT4gewotCi0JLyoqCi0JICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIGJhZyBmb3IgZXF1YWxpdHkuIFJldHVybnMKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhbHNvIGEgYmFnLCB0aGUgdHdvIGJhZ3MKLQkgKiBoYXZlIHRoZSBzYW1lIHNpemUsIGFuZCBldmVyeSBtZW1iZXIgb2YgdGhlIHNwZWNpZmllZCBiYWcgaXMKLQkgKiBjb250YWluZWQgaW4gdGhpcyBiYWcgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgKG9yIGVxdWl2YWxlbnRseSwKLQkgKiBldmVyeSBtZW1iZXIgb2YgdGhpcyBiYWcgaXMgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgYmFnIHdpdGggdGhlIHNhbWUKLQkgKiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMpLiBUaGlzIGRlZmluaXRpb24gZW5zdXJlcyB0aGF0IHRoZQotCSAqIGVxdWFscyBtZXRob2Qgd29ya3MgcHJvcGVybHkgYWNyb3NzIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCi0JICogYmFnIGludGVyZmFjZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgYmFnLiBUaGUgaGFzaCBjb2RlIG9mIGEgYmFnIGlzCi0JICogZGVmaW5lZCB0byBiZSB0aGUgc3VtIG9mIHRoZSBoYXNoIGNvZGVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgYmFnLAotCSAqIHdoZXJlIHRoZSBoYXNoY29kZSBvZiBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQgaXMgZGVmaW5lZCB0byBiZSB6ZXJvLgotCSAqIFRoaXMgZW5zdXJlcyB0aGF0IDxjb2RlPmIxLmVxdWFscyhiMik8L2NvZGU+IGltcGxpZXMgdGhhdAotCSAqIDxjb2RlPmIxLmhhc2hDb2RlKCkgPT0gYjIuaGFzaENvZGUoKTwvY29kZT4gZm9yIGFueSB0d28gYmFncwotCSAqIDxjb2RlPmIxPC9jb2RlPiBhbmQgPGNvZGU+YjI8L2NvZGU+LCBhcyByZXF1aXJlZCBieSB0aGUgZ2VuZXJhbAotCSAqIGNvbnRyYWN0IG9mIHRoZSA8Y29kZT5PYmplY3QuaGFzaENvZGU8L2NvZGU+IG1ldGhvZC4KLQkgKi8KLQlpbnQgaGFzaENvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG9jY3VycyBpbiB0aGUgYmFnLgotCSAqLwotCWludCBjb3VudChPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMgdG8gdGhlIGJhZy4KLQkgKi8KLQlib29sZWFuIGFkZChFIG8sIGludCBjb3VudCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBmcm9tIHRoZSBiYWcuIFJldHVybiB3aGV0aGVyIHRoZSBiYWcgY2hhbmdlZC4KLQkgKi8KLQlib29sZWFuIHJlbW92ZShPYmplY3QgbywgaW50IGNvdW50KTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgZWFjaCBpdGVtIGluIHRoZSBiYWcKLQkgKiBvbmNlIGFuZCBvbmx5IG9uY2UsIGlycmVzcGVjdGl2ZSBvZiBob3cgbWFueSB0aW1lcwotCSAqIHRoZSBpdGVtIHdhcyBhZGRlZCB0byB0aGUgYmFnLgotCSAqLwotCWphdmEudXRpbC5JdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBhbiBlbnRyeSBmb3IgZWFjaCBpdGVtIGluIHRoZSBiYWcKLQkgKiBvbmNlIGFuZCBvbmx5IG9uY2UsIGlycmVzcGVjdGl2ZSBvZiBob3cgbWFueSB0aW1lcwotCSAqIHRoZSBpdGVtIHdhcyBhZGRlZCB0byB0aGUgYmFnLiBUaGUgZW50cnkgd2lsbCBpbmRpY2F0ZSB0aGUgaXRlbSdzCi0JICogY291bnQuCi0JICovCi0JamF2YS51dGlsLkl0ZXJhdG9yPEVudHJ5PEU+PiBlbnRyaWVzKCk7Ci0KLQotCS8qKgotCSAqIEEgYmFnIGVudHJ5IChlbGVtZW50LWNvdW50IHBhaXIpLgotCSAqIFRoZSA8Y29kZT5CYWcuZW50cmllczwvY29kZT4gbWV0aG9kIHJldHVybnMgYW4gaXRlcmF0b3Igd2hvc2UKLQkgKiBlbGVtZW50cyBhcmUgb2YgdGhpcyBjbGFzcy4gVGhlIDxpPm9ubHk8L2k+IHdheSB0byBvYnRhaW4gYSByZWZlcmVuY2UKLQkgKiB0byBhIGJhZyBlbnRyeSBpcyBmcm9tIHRoZSBpdGVyYXRvciByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC4gVGhlc2UKLQkgKiA8Y29kZT5CYWcuRW50cnk8L2NvZGU+IG9iamVjdHMgYXJlIHZhbGlkIDxpPm9ubHk8L2k+IGZvciB0aGUgZHVyYXRpb24KLQkgKiBvZiB0aGUgaXRlcmF0aW9uOyBtb3JlIGZvcm1hbGx5LCB0aGUgYmVoYXZpb3Igb2YgYSBiYWcgZW50cnkgaXMKLQkgKiB1bmRlZmluZWQgaWYgdGhlIGJhY2tpbmcgYmFnIGhhcyBiZWVuIG1vZGlmaWVkIGFmdGVyIHRoZSBlbnRyeSB3YXMKLQkgKiByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IsIGV4Y2VwdCB0aHJvdWdoIHRoZSA8Y29kZT5zZXRDb3VudDwvY29kZT4KLQkgKiBvcGVyYXRpb24gb24gdGhlIGJhZyBlbnRyeS4KLQkgKi8KLQlpbnRlcmZhY2UgRW50cnk8RT4gewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGVudHJ5J3MgZWxlbWVudC4KLQkJICovCi0JCUUgZ2V0RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gZW50cnkncyBjb3VudDsgaS5lLiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBlbnRyeSdzIGVsZW1lbnQKLQkJICogb2NjdXJzIGluIHRoZSBiYWcuCi0JCSAqIEBzZWUgQmFnI2NvdW50KE9iamVjdCkKLQkJICovCi0JCWludCBnZXRDb3VudCgpOwotCi0JCS8qKgotCQkgKiBTZXQgdGhlIGVudHJ5J3MgY291bnQ7IGkuZS4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZW50cnkncyBlbGVtZW50Ci0JCSAqIG9jY3VycyBpbiB0aGUgYmFnLiBUaGUgbmV3IGNvdW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIuCi0JCSAqIFJldHVybiB0aGUgcHJldmlvdXMgY291bnQgb2YgdGhlIGVudHJ5J3MgZWxlbWVudC4KLQkJICogTkI6IFVzZSB0aGUgaXRlcmF0b3IncyA8Y29kZT5yZW1vdmU8L2NvZGU+IG1ldGhvZCB0byBzZXQgdGhlCi0JCSAqIGNvdW50IHRvIHplcm8uCi0JCSAqLwotCQlpbnQgc2V0Q291bnQoaW50IGNvdW50KTsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0OwotCQkgKiBpLmUuIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgPGNvZGU+QmFnLkVudHJ5PC9jb2RlPiBhbmQgaXRzCi0JCSAqIGVsZW1lbnQgYW5kIGNvdW50IGFyZSB0aGUgc2FtZSBhcyB0aGUgZW50cnkncy4KLQkJICovCi0JCWJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGVudHJ5J3MgaGFzaCBjb2RlLgotCQkgKi8KLQkJaW50IGhhc2hDb2RlKCk7Ci0KLQl9Ci0KLQotCWZpbmFsIGNsYXNzIEVtcHR5PEU+IGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uPEU+IGltcGxlbWVudHMgQmFnPEU+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCYWcgSU5TVEFOQ0UgPSBuZXcgRW1wdHkoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFQ+IEJhZzxUPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRW1wdHkoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCXB1YmxpYyBpbnQgY291bnQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxCYWcuRW50cnk8RT4+IGVudHJpZXMoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbywgaW50IGNvdW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gYWRkKEUgbywgaW50IGNvdW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAobyA9PSB0aGlzKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBCYWcpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuICgoQmFnPD8+KSBvKS5zaXplKCkgPT0gMDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpZGlGaWx0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaWRpRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDJmOWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpZGlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci0KLS8qKgotICogVXNlZCBieSB2YXJpb3VzICJwbHVnZ2FibGUiIGNsYXNzZXMgdG8gZmlsdGVyIG9iamVjdHMKLSAqIGluIGJvdGggZGlyZWN0aW9ucy4KLSAqIAotICogSWYgYW55b25lIGNhbiBjb21lIHVwIHdpdGggYSBiZXR0ZXIgY2xhc3MgbmFtZQotICogYW5kL29yIG1ldGhvZCBuYW1lLCBJIHdvdWxkIGxvdmUgdG8gaGVhciBpdC4gIH5ianYKLSAqLwotcHVibGljIGludGVyZmFjZSBCaWRpRmlsdGVyPFQ+IGV4dGVuZHMgRmlsdGVyPFQ+IHsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzICJhY2NlcHRlZCIgYnkgdGhlCi0JICogInJldmVyc2UiIGZpbHRlci4gV2hhdCB0aGF0IG1lYW5zIGlzIGRldGVybWluZWQgYnkgdGhlIGNsaWVudC4KLQkgKi8KLQlib29sZWFuIHJldmVyc2VBY2NlcHQoVCBvKTsKLQotCi0JZmluYWwgY2xhc3MgTnVsbDxTPiBpbXBsZW1lbnRzIEJpZGlGaWx0ZXI8Uz4gewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpRmlsdGVyIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEJpZGlGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIG5vdGhpbmcgaXMgZmlsdGVyZWQgLSBldmVyeXRoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG5leHQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIG5vdGhpbmcgaXMgInJldmVyc2UtZmlsdGVyZWQiIC0gZXZlcnl0aGluZyBpcyBhY2NlcHRlZAotCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KFMgbykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlGaWx0ZXIuTnVsbCI7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIEJpZGlGaWx0ZXI8Uz4gewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpRmlsdGVyIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBCaWRpRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG5leHQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KFMgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlGaWx0ZXIuRGlzYWJsZWQiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaVN0cmluZ0NvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpZGlTdHJpbmdDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkOGY0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaVN0cmluZ0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogVXNlZCBieSB2YXJpb3VzICJwbHVnZ2FibGUiIGNsYXNzZXMgdG8gdHJhbnNmb3JtIG9iamVjdHMKLSAqIGludG8gc3RyaW5ncyBhbmQgdmljZSB2ZXJzYS4KLSAqIAotICogSWYgYW55b25lIGNhbiBjb21lIHVwIHdpdGggYSBiZXR0ZXIgY2xhc3MgbmFtZQotICogYW5kL29yIG1ldGhvZCBuYW1lLCBJIHdvdWxkIGxvdmUgdG8gaGVhciBpdC4gIH5ianYKLSAqLwotcHVibGljIGludGVyZmFjZSBCaWRpU3RyaW5nQ29udmVydGVyPFQ+IGV4dGVuZHMgU3RyaW5nQ29udmVydGVyPFQ+IHsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgaW50byBhbiBvYmplY3QuCi0JICogVGhlIHNlbWFudGljcyBvZiAiY29udmVydCB0byBvYmplY3QiIGlzIGRldGVybWluZWQgYnkgdGhlCi0JICogY29udHJhY3QgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqIFR5cGljYWxseSwgaWYgdGhlIHN0cmluZyBpcyBudWxsLCBudWxsIGlzIHJldHVybmVkLgotCSAqLwotCVQgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKTsKLQotCi0JZmluYWwgY2xhc3MgRGVmYXVsdDxTPiBpbXBsZW1lbnRzIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Uz4gewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEJpZGlTdHJpbmdDb252ZXJ0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERlZmF1bHQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCdzICN0b1N0cmluZygpIHJlc3VsdAotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTIG8pIHsKLQkJCXJldHVybiAobyA9PSBudWxsKSA/IG51bGwgOiBvLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gc2ltcGx5IHJldHVybiB0aGUgc3RyaW5nCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUyBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpIHsKLQkJCXJldHVybiAoUykgczsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0IjsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+IGltcGxlbWVudHMgQmlkaVN0cmluZ0NvbnZlcnRlcjxTPiB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlTdHJpbmdDb252ZXJ0ZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEJpZGlTdHJpbmdDb252ZXJ0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoUyBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIFMgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQmlkaVN0cmluZ0NvbnZlcnRlci5EaXNhYmxlZCI7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBCb29sZWFuQ29udmVydGVyIGltcGxlbWVudHMgQmlkaVN0cmluZ0NvbnZlcnRlcjxCb29sZWFuPiB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVN0cmluZ0NvbnZlcnRlcjxCb29sZWFuPiBJTlNUQU5DRSA9IG5ldyBCb29sZWFuQ29udmVydGVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQmlkaVN0cmluZ0NvbnZlcnRlcjxCb29sZWFuPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgQm9vbGVhbkNvbnZlcnRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLyoqIFJldHVybiAidHJ1ZSIgaWYgdGhlIEJvb2xlYW4gaXMgdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiAiZmFsc2UiLiAqLwotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhCb29sZWFuIGIpIHsKLQkJCXJldHVybiAoYiA9PSBudWxsKSA/IG51bGwgOiBiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLyoqIFJldHVybiBCb29sZWFuLlRSVUUgaWYgdGhlIHN0cmluZyBpcyAidHJ1ZSIgKGNhc2UtaW5zZW5zaXRpdmUpLCBvdGhlcndpc2UgcmV0dXJuIEJvb2xlYW4uRkFMU0UuICovCi0JCXB1YmxpYyBCb29sZWFuIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcykgewotCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IEJvb2xlYW4udmFsdWVPZihzKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyIjsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIEludGVnZXJDb252ZXJ0ZXIgaW1wbGVtZW50cyBCaWRpU3RyaW5nQ29udmVydGVyPEludGVnZXI+IHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyPEludGVnZXI+IElOU1RBTkNFID0gbmV3IEludGVnZXJDb252ZXJ0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBCaWRpU3RyaW5nQ29udmVydGVyPEludGVnZXI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBJbnRlZ2VyQ29udmVydGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvKiogSW50ZWdlcidzICN0b1N0cmluZygpIHdvcmtzIHdlbGwuICovCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEludGVnZXIgaW50ZWdlcikgewotCQkJcmV0dXJuIChpbnRlZ2VyID09IG51bGwpID8gbnVsbCA6IGludGVnZXIudG9TdHJpbmcoKTsKLQkJfQotCQkvKiogQ29udmVydCB0aGUgc3RyaW5nIHRvIGFuIEludGVnZXIsIGlmIHBvc3NpYmxlLiAqLwotCQlwdWJsaWMgSW50ZWdlciBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpIHsKLQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBJbnRlZ2VyLnZhbHVlT2Yocyk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlciI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaWRpVHJhbnNmb3JtZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaWRpVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2ZDNkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzCi0gKiBpbiBib3RoIGRpcmVjdGlvbnMuCi0gKiAKLSAqIElmIGFueW9uZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIGNsYXNzIG5hbWUKLSAqIGFuZC9vciBtZXRob2QgbmFtZSwgSSB3b3VsZCBsb3ZlIHRvIGhlYXIgaXQuICB+Ymp2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4gZXh0ZW5kcyBUcmFuc2Zvcm1lcjxUMSwgVDI+IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgInJldmVyc2UtdHJhbnNmb3JtZWQiIG9iamVjdC4KLQkgKiBUaGUgc2VtYW50aWNzIG9mICJyZXZlcnNlLXRyYW5zZm9ybSIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JVDEgcmV2ZXJzZVRyYW5zZm9ybShUMiBvKTsKLQotCi0JZmluYWwgY2xhc3MgTnVsbDxTMSwgUzI+IGltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPFMxLCBTMj4gewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpVHJhbnNmb3JtZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8UjEsIFIyPiBCaWRpVHJhbnNmb3JtZXI8UjEsIFIyPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gc2ltcGx5IHJldHVybiB0aGUgb2JqZWN0LCB1bmNoYW5nZWQKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBTMiB0cmFuc2Zvcm0oUzEgbykgewotCQkJcmV0dXJuIChTMikgbzsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QsIHVuY2hhbmdlZAotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFMxIHJldmVyc2VUcmFuc2Zvcm0oUzIgbykgewotCQkJcmV0dXJuIChTMSkgbzsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQmlkaVRyYW5zZm9ybWVyLk51bGwiOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQ8UzEsIFMyPiBpbXBsZW1lbnRzIEJpZGlUcmFuc2Zvcm1lcjxTMSwgUzI+IHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVRyYW5zZm9ybWVyIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSMSwgUjI+IEJpZGlUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTMiB0cmFuc2Zvcm0oUzEgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTMSByZXZlcnNlVHJhbnNmb3JtKFMyIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpVHJhbnNmb3JtZXIuRGlzYWJsZWQiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQml0VG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaXRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDRmNWJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaXRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogQXNzb3J0ZWQgYml0IHRvb2xzCi0gKi8KLXB1YmxpYyBjbGFzcyBCaXRUb29scyB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmxhZ0lzU2V0KGludCBmbGFncywgaW50IGZsYWdUb0NoZWNrKSB7Ci0JCXJldHVybiBhbGxGbGFnc0FyZVNldChmbGFncywgZmxhZ1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmxhZ0lzT2ZmKGludCBmbGFncywgaW50IGZsYWdUb0NoZWNrKSB7Ci0JCXJldHVybiBhbGxGbGFnc0FyZU9mZihmbGFncywgZmxhZ1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnSXNTZXQoaW50IGZsYWdzLCBpbnQgZmxhZ1RvQ2hlY2spIHsKLQkJcmV0dXJuIG9ubHlGbGFnc0FyZVNldChmbGFncywgZmxhZ1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ0lzT2ZmKGludCBmbGFncywgaW50IGZsYWdUb0NoZWNrKSB7Ci0JCXJldHVybiBvbmx5RmxhZ3NBcmVPZmYoZmxhZ3MsIGZsYWdUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFsbCB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIChmbGFncyAmIGZsYWdzVG9DaGVjaykgPT0gZmxhZ3NUb0NoZWNrOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYWxsIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIChmbGFncyAmIGZsYWdzVG9DaGVjaykgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdzQXJlU2V0KGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gYWxsRmxhZ3NBcmVTZXQoZmxhZ3MsIGZsYWdzVG9DaGVjaykgJiYgYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIH5mbGFnc1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIGZsYWdzVG9DaGVjaykgJiYgYWxsRmxhZ3NBcmVTZXQoZmxhZ3MsIH5mbGFnc1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYW55IG9uZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnlGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIChmbGFncyAmIGZsYWdzVG9DaGVjaykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFueSBvbmUgb2YgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gKGZsYWdzICYgZmxhZ3NUb0NoZWNrKSAhPSBmbGFnc1RvQ2hlY2s7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbGwgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsRmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnRbXSBmbGFnc1RvQ2hlY2spIHsKLQkJZm9yIChpbnQgaSA9IGZsYWdzVG9DaGVjay5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCBmbGFnc1RvQ2hlY2tbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYWxsIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludFtdIGZsYWdzVG9DaGVjaykgewotCQlmb3IgKGludCBpID0gZmxhZ3NUb0NoZWNrLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIGZsYWdzVG9DaGVja1tpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBPTkxZIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludFtdIGZsYWdzVG9DaGVjaykgewotCQlpbnQgY29tYmluZWRGbGFncyA9IG9yRmxhZ3MoZmxhZ3NUb0NoZWNrKTsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCBjb21iaW5lZEZsYWdzKSAmJiBhbGxGbGFnc0FyZU9mZihmbGFncywgfmNvbWJpbmVkRmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50W10gZmxhZ3NUb0NoZWNrKSB7Ci0JCWludCBjb21iaW5lZEZsYWdzID0gb3JGbGFncyhmbGFnc1RvQ2hlY2spOwotCQlyZXR1cm4gYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIGNvbWJpbmVkRmxhZ3MpICYmIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCB+Y29tYmluZWRGbGFncyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbnkgb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUZsYWdzQXJlU2V0KGludCBmbGFncywgaW50W10gZmxhZ3NUb0NoZWNrKSB7Ci0JCWZvciAoaW50IGkgPSBmbGFnc1RvQ2hlY2subGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhbnlGbGFnc0FyZVNldChmbGFncywgZmxhZ3NUb0NoZWNrW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFueSBvbmUgb2YgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50W10gZmxhZ3NUb0NoZWNrKSB7Ci0JCWZvciAoaW50IGkgPSBmbGFnc1RvQ2hlY2subGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhbnlGbGFnc0FyZU9mZihmbGFncywgZmxhZ3NUb0NoZWNrW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBPUiBhbGwgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIHRvZ2V0aGVyIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBvckZsYWdzKGludFtdIGZsYWdzKSB7Ci0JCWludCBsYXN0ID0gZmxhZ3MubGVuZ3RoIC0gMTsKLQkJaW50IHJlc3VsdCA9IGZsYWdzW2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHQgfD0gZmxhZ3NbaV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBTkQgYWxsIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyB0b2dldGhlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYW5kRmxhZ3MoaW50W10gZmxhZ3MpIHsKLQkJaW50IGxhc3QgPSBmbGFncy5sZW5ndGggLSAxOwotCQlpbnQgcmVzdWx0ID0gZmxhZ3NbbGFzdF07Ci0JCWZvciAoaW50IGkgPSBsYXN0OyBpLS0gPiAwOyApIHsKLQkJCXJlc3VsdCAmPSBmbGFnc1tpXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFhPUiBhbGwgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIHRvZ2V0aGVyIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCB4b3JGbGFncyhpbnRbXSBmbGFncykgewotCQlpbnQgbGFzdCA9IGZsYWdzLmxlbmd0aCAtIDE7Ci0JCWludCByZXN1bHQgPSBmbGFnc1tsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0IF49IGZsYWdzW2ldOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBCaXRUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQm9vbGVhbkhvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0Jvb2xlYW5Ib2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxNGU0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQm9vbGVhbkhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBQcm92aWRlIGEgY29udGFpbmVyIGZvciBwYXNzaW5nIGEgZmxhZyB0aGF0IGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSByZWNpcGllbnQuCi0gKiBAc2VlIFN5bmNocm9uaXplZEJvb2xlYW4KLSAqLwotcHVibGljIGNsYXNzIEJvb2xlYW5Ib2xkZXIKLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgYm9vbGVhbi4gKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgYm9vbGVhbiBob2xkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIEJvb2xlYW5Ib2xkZXIoYm9vbGVhbiB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgYm9vbGVhbiBob2xkZXIgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIGZhbHNlLgotCSAqLwotCXB1YmxpYyBCb29sZWFuSG9sZGVyKCkgewotCQl0aGlzKGZhbHNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBib29sZWFuIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCBib29sZWFuIHZhbHVlIGlzIHRydWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcnVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCBib29sZWFuIHZhbHVlIGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFsc2UoKSB7Ci0JCXJldHVybiAhIHRoaXMudmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgYm9vbGVhbiB2YWx1ZSBpcyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzKGJvb2xlYW4gdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSB2OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYm9vbGVhbiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGJvb2xlYW4gdmFsdWUgdG8gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcnVlKCkgewotCQl0aGlzLnZhbHVlID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGJvb2xlYW4gdmFsdWUgdG8gZmFsc2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmFsc2UoKSB7Ci0JCXRoaXMudmFsdWUgPSBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgQm9vbGVhbkhvbGRlcikgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gKChCb29sZWFuSG9sZGVyKSBvKS52YWx1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPyAxIDogMDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSkgKyAnXSc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NsYXNzVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiN2M1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIGphdmEubGFuZy5yZWZsZWN0IHBhY2thZ2UuCi0gKiBUaGVzZSBtZXRob2RzIHByb3ZpZGUgc2hvcnRjdXRzIGZvciBtYW5pcHVsYXRpbmcgb2JqZWN0cyB2aWEKLSAqIHJlZmxlY3Rpb247IHBhcnRpY3VsYXJseSB3aGVuIGRlYWxpbmcgd2l0aCBmaWVsZHMgYW5kL29yIG1ldGhvZHMgdGhhdAotICogYXJlIG5vdCBwdWJsaWNseSBhY2Nlc3NpYmxlIG9yIGFyZSBpbmhlcml0ZWQuCi0gKiAKLSAqIEluIG1vc3QgY2FzZXMsIGFsbCB0aGUgZXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBhbmQKLSAqIHdyYXBwZWQgaW4gamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb25zOyBzbyB0aGVzZSBtZXRob2RzIHNob3VsZAotICogYmUgdXNlZCB3aGVuIHlvdSBhcmUgY29uZmlkZW50IHRoYXQgeW91IHdpbGwgbm90IGhhdmluZyBhbnkgcHJvYmxlbXMKLSAqIHVzaW5nIHJlZmxlY3Rpb24uCi0gKiAKLSAqIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mIG1ldGhvZHMgd2hvc2UgbmFtZXMKLSAqIGJlZ2luIHdpdGggImF0dGVtcHQiLiBUaGVzZSBtZXRob2RzIHdpbGwgdGhyb3cgYSBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAqIG9yIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHdoZW4gYXBwcm9wcmlhdGUsIGFsbG93aW5nIHlvdSB0byBwcm9iZQotICogZm9yIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgcHJlc2VudCBidXQgbWlnaHQgbm90LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NUb29scyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gWkVST19QQVJBTUVURVJfVFlQRVMgPSBuZXcgQ2xhc3NbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBaRVJPX1BBUkFNRVRFUlMgPSBuZXcgT2JqZWN0WzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN0cmluZ1Rvb2xzLkNSOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUiA9ICckJzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBBUlJBWV9JTkRJQ0FUT1IgPSAnWyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFRZUEVfREVDTEFSQVRJT05fQVJSQVlfT1BFTiA9ICdbJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgVFlQRV9ERUNMQVJBVElPTl9BUlJBWV9DTE9TRSA9ICddJzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBSRUZFUkVOQ0VfQ0xBU1NfQ09ERSA9ICdMJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUkVGRVJFTkNFX0NMQVNTX05BTUVfREVMSU1JVEVSID0gJzsnOwotCQotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVtdIFBSSU1JVElWRVM7ICAvLyBwc2V1ZG8tJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQllURV9DT0RFID0gJ0InOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDSEFSX0NPREUgPSAnQyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9DT0RFID0gJ0QnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBGTE9BVF9DT0RFID0gJ0YnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBJTlRfQ09ERSA9ICdJJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTE9OR19DT0RFID0gJ0onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTSE9SVF9DT0RFID0gJ1MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBCT09MRUFOX0NPREUgPSAnWic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFZPSURfQ09ERSA9ICdWJzsKLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCA9IC0xOyAgLy8gcHNldWRvLSdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSCA9IC0xOyAgLy8gcHNldWRvLSdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEX0NMQVNTX05BTUUgPSB2b2lkLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEX1dSQVBQRVJfQ0xBU1NfTkFNRSA9IGphdmEubGFuZy5Wb2lkLmNsYXNzLmdldE5hbWUoKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgZmllbGRzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MsIGluY2x1ZGluZyBpbmhlcml0ZWQgZmllbGRzLgotCSAqIENsYXNzI2FsbEZpZWxkcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZFtdIGFsbEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RhY2s8RmllbGQ+IHN0YWNrID0gbmV3IFN0YWNrPEZpZWxkPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCXB1c2hEZWNsYXJlZEZpZWxkcyh0ZW1wQ2xhc3MsIHN0YWNrKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHN0YWNrKTsKLQkJcmV0dXJuIHN0YWNrLnRvQXJyYXkobmV3IEZpZWxkW3N0YWNrLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBtZXRob2RzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MsIGluY2x1ZGluZyBpbmhlcml0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNhbGxNZXRob2RzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFtdIGFsbE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVN0YWNrPE1ldGhvZD4gc3RhY2sgPSBuZXcgU3RhY2s8TWV0aG9kPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCXB1c2hEZWNsYXJlZE1ldGhvZHModGVtcENsYXNzLCBzdGFjayk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShzdGFjayk7Ci0JCXJldHVybiBzdGFjay50b0FycmF5KG5ldyBNZXRob2Rbc3RhY2suc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBhdHRlbXB0TmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHROZXdJbnN0YW5jZShqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29uc3RydWN0b3IgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgYXR0ZW1wdE5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY29uc3RydWN0b3IoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcykubmV3SW5zdGFuY2UocGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGllICsgQ1IgKyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBpZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIGlhZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpICsgQ1IgKyBpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGl0ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29uc3RydWN0b3IgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgYXR0ZW1wdE5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0TmV3SW5zdGFuY2UoamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZ2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogT2JqZWN0I2dldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZpZWxkKG9iamVjdCwgZmllbGROYW1lKS5nZXQob2JqZWN0KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZ2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI2dldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvR2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmllbGQoamF2YUNsYXNzLCBmaWVsZE5hbWUpLmdldChudWxsKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgcmVjZWl2ZXIgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChtZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogSWYgdGhlIGV4ZWN1dGVkIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSAKLQkJdGhyb3dzIFRocm93YWJsZSwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIAotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKG1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCByZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IHN0YXRpYyBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIGNsYXNzIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZChzdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gc2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZQotCSAqIGNvbnRhaW5pbmcgb2JqZWN0LCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBPYmplY3Qjc2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGF0dGVtcHRUb1NldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlmaWVsZChvYmplY3QsIGZpZWxkTmFtZSkuc2V0KG9iamVjdCwgZmllbGRWYWx1ZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgaWFlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIHNldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlCi0JICogY29udGFpbmluZyBjbGFzcywgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3Mjc2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGF0dGVtcHRUb1NldFN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWZpZWxkKGphdmFDbGFzcywgZmllbGROYW1lKS5zZXQobnVsbCwgZmllbGRWYWx1ZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgaWFlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3RvcgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNjb25zdHJ1Y3RvcigpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gY29uc3RydWN0b3IoamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMuCi0JICogQ2xhc3MjY29uc3RydWN0b3IoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCUNvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yID0gamF2YUNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IocGFyYW1ldGVyVHlwZXMpOwotCQljb25zdHJ1Y3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gY29uc3RydWN0b3I7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMuCi0JICogQ2xhc3MjY29uc3RydWN0b3IoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgZmllbGRzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNhY2Nlc3NpYmxlRGVjbGFyZWRGaWVsZHMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGRbXSBkZWNsYXJlZEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgewotCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJfQotCQlyZXR1cm4gZmllbGRzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIG1ldGhvZHMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2FjY2Vzc2libGVEZWNsYXJlZE1ldGhvZHMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kW10gZGVjbGFyZWRNZXRob2RzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlNZXRob2RbXSBtZXRob2RzID0gamF2YUNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0JCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3RvcgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNkZWZhdWx0Q29uc3RydWN0b3IoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGRlZmF1bHRDb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gY29uc3RydWN0b3IoamF2YUNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgYW5kIGZpZWxkIG5hbWUuCi0JICogSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogZGVmaW5lIHRoZSBmaWVsZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkIGZpZWxkKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJRmllbGQgZmllbGQgPSBudWxsOwotCQl0cnkgewotCQkJZmllbGQgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZChmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJQ2xhc3M8Pz4gc3VwZXJjbGFzcyA9IGphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCQkvLyByZWN1cnNlCi0JCQlyZXR1cm4gZmllbGQoc3VwZXJjbGFzcywgZmllbGROYW1lKTsKLQkJfQotCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gZmllbGQ7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogZGVmaW5lIHRoZSBmaWVsZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkIGZpZWxkKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBmaWVsZChvYmplY3QuZ2V0Q2xhc3MoKSwgZmllbGROYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShDbGFzczw/PiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbnVsbCwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJc2IuYXBwZW5kKCcuJyk7Ci0JCXNiLmFwcGVuZChmaWVsZE5hbWUpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LmdldENsYXNzKCksIGZpZWxkTmFtZSk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JCS8vIHRoaXMgY2hlY2sgYWxsb3dzIHVzIHRvIHVzZSB0aGlzIGNvZGUgZm9yIGNvbnN0cnVjdG9ycywgd2hlcmUgdGhlIG1ldGhvZE5hbWUgaXMgbnVsbAotCQlpZiAobWV0aG9kTmFtZSAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoJy4nKTsKLQkJCXNiLmFwcGVuZChtZXRob2ROYW1lKTsKLQkJfQotCQlzYi5hcHBlbmQoJygnKTsKLQkJaW50IG1heCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aCAtIDE7Ci0JCWlmIChtYXggIT0gLTEpIHsKLQkJCS8vIHN0b3Agb25lIHNob3J0IG9mIHRoZSBlbmQgb2YgdGhlIGFycmF5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJc2IuYXBwZW5kKHBhcmFtZXRlclR5cGVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOwotCQkJfQotCQkJc2IuYXBwZW5kKHBhcmFtZXRlclR5cGVzW21heF0uZ2V0TmFtZSgpKTsKLQkJfQotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShyZWNlaXZlci5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBPYmplY3QjZ2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0dldEZpZWxkVmFsdWUob2JqZWN0LCBmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNnZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3Qgc3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9HZXRTdGF0aWNGaWVsZFZhbHVlKGphdmFDbGFzcywgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBvbmUtYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkgCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgb25lLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSAKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSAKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBDb252ZXJ0IGV4Y2VwdGlvbnMgdG8gUnVudGltZUV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3QgcmVjZWl2ZXIsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBtZXRob2QuaW52b2tlKHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgbWV0aG9kLCBpYWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWV0aG9kICsgQ1IgKyBpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGl0ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogQ29udmVydCBhbGwgb3RoZXIgZXhjZXB0aW9ucyB0byBSdW50aW1lRXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihNZXRob2QgbWV0aG9kLCBPYmplY3QgcmVjZWl2ZXIsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWV0aG9kLmludm9rZShyZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIG1ldGhvZCwgaWFlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCVRocm93YWJsZSBjYXVzZSA9IGl0ZS5nZXRDYXVzZSgpOwotCQkJaWYgKGNhdXNlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXRob2QudG9TdHJpbmcoKSwgaXRlKTsKLQkJCX0KLQkJCXRocm93IGNhdXNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgc3RhdGljIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBDb252ZXJ0IGV4Y2VwdGlvbnMgdG8gUnVudGltZUV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKG1ldGhvZCwgbnVsbCwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltZXRob2QgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzPD8+IHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJLy8gcmVjdXJzZQotCQkJcmV0dXJuIG1ldGhvZChzdXBlcmNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0KLQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBtZXRob2Q7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzICh3aXRob3V0IHRoZSBjaGVja2VkIGV4Y2VwdGlvbikuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY2xhc3NOYW1lLCBleCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIENsYXNzI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIENsYXNzI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgY2xhc3NMb2FkZXIpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycywgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBjbGFzc0xvYWRlciksIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgcGFyYW1ldGVyVHlwZSwgcGFyYW1ldGVyLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGZhbHNlLCBjbGFzc0xvYWRlciksIHBhcmFtZXRlclR5cGUsIHBhcmFtZXRlcik7Ci0JfQotCQotCS8qCi0JICogUHVzaCB0aGUgZGVjbGFyZWQgZmllbGRzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogb250byB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHB1c2hEZWNsYXJlZEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0YWNrPEZpZWxkPiBzdGFjaykgewotCQlGaWVsZFtdIGZpZWxkcyA9IGRlY2xhcmVkRmllbGRzKGphdmFDbGFzcyk7Ci0JCWZvciAoaW50IGkgPSBmaWVsZHMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXN0YWNrLnB1c2goZmllbGRzW2ldKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIFB1c2ggdGhlIGRlY2xhcmVkIG1ldGhvZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHVzaERlY2xhcmVkTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0YWNrPE1ldGhvZD4gc3RhY2spIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGRlY2xhcmVkTWV0aG9kcyhqYXZhQ2xhc3MpOwotCQlmb3IgKGludCBpID0gbWV0aG9kcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJc3RhY2sucHVzaChtZXRob2RzW2ldKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0LCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogT2JqZWN0I3NldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWF0dGVtcHRUb1NldEZpZWxkVmFsdWUob2JqZWN0LCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNzZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWF0dGVtcHRUb1NldFN0YXRpY0ZpZWxkVmFsdWUoamF2YUNsYXNzLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydENsYXNzTmFtZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzaG9ydE5hbWVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJPYmplY3QiKS4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0TmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJPYmplY3QiKS4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0TmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHNob3J0TmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGVkIG5hbWUgb2YgdGhlIG9iamVjdCdzIGNsYXNzLgotCSAqIENsYXNzI2dldE5lc3RlZE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZENsYXNzTmFtZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBuZXN0ZWROYW1lRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0ZWQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIkVudHJ5IikuCi0JICogQ2xhc3MjZ2V0TmVzdGVkTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmVzdGVkTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKSArIDEpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiRW50cnkiKS4KLQkgKiBDbGFzcyNnZXROZXN0ZWROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXN0ZWROYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmVzdGVkTmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgInRvU3RyaW5nKCkiIG5hbWUgb2YgdGhlIG9iamVjdCdzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRvU3RyaW5nTmFtZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgInRvU3RyaW5nKCkiIG5hbWUgb2YgdGhlIGNsYXNzLgotCSAqICJNZW1iZXIiIGNsYXNzZXMgd2lsbCByZXR1cm4gb25seSB0aGUgZmluYWwgbmFtZToKLQkgKiAgICAgImNvbS5mb28uYmFyLlRvcExldmVsQ2xhc3MkTWVtYmVyQ2xhc3MkTmVzdGVkTWVtYmVyQ2xhc3MiCi0JICogICAgICAgICA9PiAiTmVzdGVkTWVtYmVyQ2xhc3MiCi0JICogIkxvY2FsIiBhbmQgImFub255bW91cyIgY2xhc3NlcyB3aWxsIHN0aWxsIHJldHVybiB0aGUgZW1iZWRkZWQgJyQnczoKLQkgKiAgICAgImNvbS5mb28uYmFyLlRvcExldmVsQ2xhc3MkMUxvY2FsQ2xhc3MiCi0JICogICAgICAgICA9PiAiVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyIKLQkgKiAgICAgImNvbS5mb28uYmFyLlRvcExldmVsQ2xhc3MkMSIKLQkgKiAgICAgICAgID0+ICJUb3BMZXZlbENsYXNzJDEiCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdOYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWVkSXNNZW1iZXIoY2xhc3NOYW1lKSA/Ci0JCQljbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpICsgMSkKLQkJOgotCQkJY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJ0b1N0cmluZygpIiBuYW1lIG9mIHRoZSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ05hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiB0b1N0cmluZ05hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gImphdmEubGFuZyIpLgotCSAqIENsYXNzI2dldFBhY2thZ2VOYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrYWdlTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHBhY2thZ2VOYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJqYXZhLmxhbmciKS4KLQkgKiBDbGFzcyNnZXRQYWNrYWdlTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnZU5hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGxhc3RQZXJpb2QgPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGxhc3RQZXJpb2QgPT0gLTEpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBsYXN0UGVyaW9kKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBjbGFzcywKLQkgKiBmb2xsb3dlZCBieSBpdHMgcGFja2FnZSBuYW1lIChlLmcuICJPYmplY3QgKGphdmEubGFuZykiKS4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWVXaXRoUGFja2FnZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnROYW1lV2l0aFBhY2thZ2UoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoc2hvcnROYW1lRm9yKGphdmFDbGFzcykpOwotCQlpZiAoICEgamF2YUNsYXNzLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXNiLmFwcGVuZCgiICgiKTsKLQkJCXNiLmFwcGVuZChwYWNrYWdlTmFtZUZvcihqYXZhQ2xhc3MpKTsKLQkJCXNiLmFwcGVuZCgnKScpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCwgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIHN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBzdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCWlmIChNb2RpZmllci5pc1N0YXRpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0JCQlyZXR1cm4gbWV0aG9kOwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcykpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIHN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZXN9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNhbiBiZSAiZGVjbGFyZWQiIGluIGNvZGU7Ci0JICogaS5lLiBpdCBpcyBlaXRoZXIgYSAidG9wLWxldmVsIiBjbGFzcyBvciBhICJtZW1iZXIiIGNsYXNzLCBidXQgaXQKLQkgKiBpcyBub3QgYW4gImFycmF5IiBjbGFzcy4gVGhpcyBtZXRob2Qgcm9sbHMgdG9nZXRoZXIgYWxsIHRoZSBjaGVja3MKLQkgKiBmcm9tIHRoZSBvdGhlciBtZXRob2RzIGZvciBhIGJpdCBvZiBhIHBlcmZvcm1hbmNlIHR3ZWFrLgotCSAqIENsYXNzI2lzRGVjbGFyYWJsZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0RlY2xhcmFibGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lLmNoYXJBdCgwKSA9PSBBUlJBWV9JTkRJQ0FUT1IpIHsKLQkJCXJldHVybiBmYWxzZTsJCS8vIGl0IGlzIGFuICJhcnJheSIgY2xhc3MKLQkJfQotCQlpbnQgaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiB0cnVlOwkJLy8gaXQgaXMgYSAidG9wLWxldmVsIiBjbGFzcwotCQl9Ci0JCWRvIHsKLQkJCS8vIHRoZSBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCBkb2xsYXIgc2lnbiBjYW5ub3QgYmUgYSBkaWdpdAotCQkJaW5kZXgrKzsKLQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc05hbWUuY2hhckF0KGluZGV4KSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUiwgaW5kZXgpOwotCQl9IHdoaWxlIChpbmRleCAhPSAtMSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInRvcC1sZXZlbCIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJtZW1iZXIiLCAibG9jYWwiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIG5hbWluZyBjb252ZW50aW9ucyAoaS5lLiB0aGUgY2xhc3MKLQkgKiBuYW1lIGRvZXMgTk9UIGNvbnRhaW4gYSAnJCc6ICJUb3BMZXZlbENsYXNzIikuCi0JICogQ2xhc3MjaXNUb3BMZXZlbCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1RvcExldmVsKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKSA9PSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgIm1lbWJlciIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibG9jYWwiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIG5hbWluZyBjb252ZW50aW9ucyAoaS5lLiB0aGUgY2xhc3MKLQkgKiBuYW1lIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSAnJCcgYW5kIGFsbCB0aGUgbmFtZXMgYmV0d2VlbgotCSAqIGVhY2ggJyQnIGFyZSBsZWdhbCBjbGFzcyBuYW1lczoKLQkgKiAiVG9wTGV2ZWxDbGFzcyRNZW1iZXJDbGFzcyROZXN0ZWRNZW1iZXJDbGFzcyIpLgotCSAqIENsYXNzI2lzTWVtYmVyKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzTWVtYmVyKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsJLy8gaXQgaXMgYSAidG9wLWxldmVsIiBjbGFzcwotCQl9Ci0JCWRvIHsKLQkJCS8vIHRoZSBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCBkb2xsYXIgc2lnbiBjYW5ub3QgYmUgYSBkaWdpdAotCQkJaW5kZXgrKzsKLQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc05hbWUuY2hhckF0KGluZGV4KSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUiwgaW5kZXgpOwotCQl9IHdoaWxlIChpbmRleCAhPSAtMSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAibG9jYWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgIm1lbWJlciIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgKG9yIEVjbGlwc2UpIG5hbWluZyBjb252ZW50aW9ucy4KLQkgKiBJbiB0aGUgamRrLCB0aGUgY2xhc3MgbmFtZSBlbmRzIHdpdGggJyRubm5YWFgnIHdoZXJlIHRoZSAnJCcgaXMKLQkgKiBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiBudW1lcmljIGRpZ2l0cyB3aGljaCBhcmUgZm9sbG93ZWQgYnkgdGhlCi0JICogbG9jYWwgY2xhc3MgbmFtZTogIlRvcExldmVsQ2xhc3MkMUxvY2FsQ2xhc3MiLgotCSAqIEluIEVjbGlwc2UsIHRoZSBjbGFzcyBuYW1lIGVuZHMgd2l0aCAnJG5ubiRYWFgnIHdoZXJlIHRoZSAnJCcgaXMKLQkgKiBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiBudW1lcmljIGRpZ2l0cyB3aGljaCBhcmUgc2VwYXJhdGVkIGZyb20KLQkgKiB0aGUgbG9jYWwgY2xhc3MgbmFtZSBieSBhbm90aGVyICckJzogIlRvcExldmVsQ2xhc3MkMSRMb2NhbENsYXNzIi4KLQkgKiBDbGFzcyNpc0xvY2FsKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzTG9jYWwoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBkb2xsYXIgPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpOwotCQlpZiAoZG9sbGFyID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCAhIENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoZG9sbGFyICsgMSkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGxlbiA9IGNsYXNzTmFtZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IGRvbGxhciArIDI7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUgJCBhcmUgZGlnaXRzIChhbm9ueW1vdXMpCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGFuICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgIm1lbWJlciIsIG9yICJsb2NhbCIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBlbmRzIHdpdGggJyRubm4nIHdoZXJlIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZQotCSAqIGxhc3QgJyQnIGFyZSBudW1lcmljIGRpZ2l0czogIlRvcExldmVsQ2xhc3MkMSIpLgotCSAqIENsYXNzI2lzQW5vbnltb3VzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzQW5vbnltb3VzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgZG9sbGFyID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGRvbGxhciA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBzdGFydCA9IGRvbGxhciArIDE7Ci0JCWZvciAoaW50IGkgPSBjbGFzc05hbWUubGVuZ3RoKCk7IGktLSA+IHN0YXJ0OyApIHsKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc05hbWUuY2hhckF0KGkpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLyBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUgJCBhcmUgZGlnaXRzCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImFycmF5IGRlcHRoIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBkZXB0aCBpcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIGhhdmUgYSBkZXB0aCBvZiB6ZXJvLgotCSAqIENsYXNzI2dldEFycmF5RGVwdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCXdoaWxlIChqYXZhQ2xhc3MuaXNBcnJheSgpKSB7Ci0JCQlkZXB0aCsrOwotCQkJamF2YUNsYXNzID0gamF2YUNsYXNzLmdldENvbXBvbmVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgImFycmF5IGRlcHRoIiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheS4KLQkgKiBOb24tYXJyYXlzIGhhdmUgYSBkZXB0aCBvZiB6ZXJvLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gYXJyYXlEZXB0aEZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgImFycmF5IGRlcHRoIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBkZXB0aCBpcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIGhhdmUgYSBkZXB0aCBvZiB6ZXJvLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqIENsYXNzI2dldEFycmF5RGVwdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJd2hpbGUgKGNsYXNzTmFtZS5jaGFyQXQoZGVwdGgpID09IEFSUkFZX0lORElDQVRPUikgewotCQkJZGVwdGgrKzsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbiBhcnJheSB0eXBlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNBcnJheShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuY2hhckF0KDApID09IEFSUkFZX0lORElDQVRPUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkgdHlwZS4KLQkgKiBBIG5vbi1hcnJheSB0eXBlIHNpbXBseSByZXR1cm5zIGl0c2VsZi4KLQkgKiBDbGFzcyNnZXRFbGVtZW50VHlwZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBlbGVtZW50VHlwZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJd2hpbGUgKGphdmFDbGFzcy5pc0FycmF5KCkpIHsKLQkJCWphdmFDbGFzcyA9IGphdmFDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGphdmFDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5LgotCSAqIEEgbm9uLWFycmF5IHNpbXBseSByZXR1cm5zIGl0cyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGVsZW1lbnRUeXBlRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUeXBlRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgc2ltcGx5IHJldHVybiB0aGVtc2VsdmVzLgotCSAqIENsYXNzI2dldEVsZW1lbnRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VHlwZU5hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBlbGVtZW50VHlwZUZvcihqYXZhQ2xhc3MpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgc2ltcGx5IHJldHVybiB0aGVtc2VsdmVzLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqIENsYXNzI2dldEVsZW1lbnRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGRlcHRoID0gYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoY2xhc3NOYW1lKTsKLQkJaWYgKGRlcHRoID09IDApIHsKLQkJCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiamF2YS5sYW5nLk9iamVjdCIgb3IgImludCIKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCX0KLQkJaW50IGxhc3QgPSBjbGFzc05hbWUubGVuZ3RoKCkgLSAxOwotCQlpZiAoY2xhc3NOYW1lLmNoYXJBdChkZXB0aCkgPT0gUkVGRVJFTkNFX0NMQVNTX0NPREUpIHsKLQkJCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiW1tbTGphdmEubGFuZy5PYmplY3Q7IgotCQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoZGVwdGggKyAxLCBsYXN0KTsJLy8gZHJvcCB0aGUgdHJhaWxpbmcgJzsnCi0JCX0KLQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJbW1tJIgotCQlyZXR1cm4gY2xhc3NOYW1lRm9yQ29kZShjbGFzc05hbWUuY2hhckF0KGxhc3QpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJyZWZlcmVuY2UiCi0JICogY2xhc3MgKGkuZS4gbmVpdGhlciAndm9pZCcgbm9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIGNsYXNzZXMsCi0JICogWydib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzUmVmZXJlbmNlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuICEgY2xhc3NOYW1lZElzUHJpbWl0aXZlKGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICd2b2lkJyBvciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSBjbGFzc2VzLAotCSAqIFsnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuXSkuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpIHx8IChjbGFzc05hbWUubGVuZ3RoKCkgPiBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLiwgYnV0IG5vdCAndm9pZCcpLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWVkSXNQcmltaXRpdmUoY2xhc3NOYW1lKQotCQkJJiYgKCAhIGNsYXNzTmFtZS5lcXVhbHMoVk9JRF9DTEFTU19OQU1FKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHByaW1pdGl2ZSB3cmFwcGVyCi0JICogY2xhc3MgKGkuZS4gJ2phdmEubGFuZy5Wb2lkJyBvciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSB3cmFwcGVyIGNsYXNzZXMsCi0JICogWydqYXZhLmxhbmcuQm9vbGVhbicsICdqYXZhLmxhbmcuSW50ZWdlcicsICdqYXZhLmxhbmcuRmxvYXQnLCBldGMuXSkuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpIHx8IChjbGFzc05hbWUubGVuZ3RoKCkgPiBtYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS53cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICdib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy4sIGJ1dCBub3QgJ3ZvaWQnKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lZElzUHJpbWl0aXZlV3JhcHBlckNsYXNzKGNsYXNzTmFtZSkKLQkJCSYmICggISBjbGFzc05hbWUuZXF1YWxzKFZPSURfV1JBUFBFUl9DTEFTU19OQU1FKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHByaW1pdGl2ZSB3cmFwcGVyCi0JICogY2xhc3MgKGkuZS4gJ2phdmEubGFuZy5Wb2lkJyBvciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSB3cmFwcGVyIGNsYXNzZXMsCi0JICogWydqYXZhLmxhbmcuQm9vbGVhbicsICdqYXZhLmxhbmcuSW50ZWdlcicsICdqYXZhLmxhbmcuRmxvYXQnLCBldGMuXSkuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCWlmIChqYXZhQ2xhc3MuaXNBcnJheSgpIHx8IChqYXZhQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpID4gbWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoY29kZXNbaV0ud3JhcHBlckNsYXNzID09IGphdmFDbGFzcykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuLCBidXQgbm90ICd2b2lkJykuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YUNsYXNzKQotCQkJJiYgKGphdmFDbGFzcyAhPSBqYXZhLmxhbmcuVm9pZC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lRm9yQ29kZShjaGFyIGNsYXNzQ29kZSkgewotCQlyZXR1cm4gY2xhc3NGb3JDb2RlKGNsYXNzQ29kZSkuZ2V0TmFtZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JDb2RlKGludCBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZUZvckNvZGUoKGNoYXIpIGNsYXNzQ29kZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yQ29kZShjaGFyIGNsYXNzQ29kZSkgewotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoY29kZXNbaV0uY29kZSA9PSBjbGFzc0NvZGUpIHsKLQkJCQlyZXR1cm4gY29kZXNbaV0uamF2YUNsYXNzOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YoY2xhc3NDb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JDb2RlKGludCBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGNsYXNzRm9yQ29kZSgoY2hhcikgY2xhc3NDb2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBjb2RlRm9yQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCWlmICgoICEgamF2YUNsYXNzLmlzQXJyYXkoKSkgJiYgKGphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCkgPD0gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MgPT0gamF2YUNsYXNzKSB7Ci0JCQkJCXJldHVybiBjb2Rlc1tpXS5jb2RlOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGphdmFDbGFzcy5nZXROYW1lKCkpOwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgY29kZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoKCAhIGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpICYmIChjbGFzc05hbWUubGVuZ3RoKCkgPD0gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJCXJldHVybiBjb2Rlc1tpXS5jb2RlOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNsYXNzTmFtZSk7CQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NUb29scy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIsCi0JICogdXNpbmcgdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlUeXBlRGVjbGFyYXRpb24gdGQgPSB0eXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHRkLmVsZW1lbnRUeXBlTmFtZSwgdGQuYXJyYXlEZXB0aCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXR5cGVEZWNsYXJhdGlvbiA9IFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2UodHlwZURlY2xhcmF0aW9uKTsKLQkJaW50IGFycmF5RGVwdGggPSBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uXyh0eXBlRGVjbGFyYXRpb24pOwotCQlTdHJpbmcgZWxlbWVudFR5cGVOYW1lID0gdHlwZURlY2xhcmF0aW9uLnN1YnN0cmluZygwLCB0eXBlRGVjbGFyYXRpb24ubGVuZ3RoKCkgLSAoYXJyYXlEZXB0aCAqIDIpKTsKLQkJcmV0dXJuIG5ldyBUeXBlRGVjbGFyYXRpb24oZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihlbGVtZW50VHlwZU5hbWUsIGFycmF5RGVwdGgsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQkvLyBzZWUgdGhlICJFdmFsdWF0aW9uIiBvZiBqZGsgYnVnIDY0NDY2MjcgZm9yIGEgZGlzY3Vzc2lvbiBvZiBsb2FkaW5nIGNsYXNzZXMKLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyBwcmltaXRpdmVzIGNhbm5vdCBiZSBsb2FkZWQgdmlhIENsYXNzI2Zvck5hbWUoKSwKLQkJLy8gc28gY2hlY2sgZm9yIGEgcHJpbWl0aXZlIGNsYXNzIG5hbWUgZmlyc3QKLQkJUHJpbWl0aXZlIHBjYyA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgPD0gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpIHsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50VHlwZU5hbWUpKSB7Ci0JCQkJCXBjYyA9IGNvZGVzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBub24tYXJyYXkKLQkJaWYgKGFycmF5RGVwdGggPT0gMCkgewotCQkJcmV0dXJuIChwY2MgPT0gbnVsbCkgPyBDbGFzcy5mb3JOYW1lKGVsZW1lbnRUeXBlTmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyKSA6IHBjYy5qYXZhQ2xhc3M7Ci0JCX0KLQotCQkvLyBhcnJheQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwKTsKLQkJZm9yIChpbnQgaSA9IGFycmF5RGVwdGg7IGktLSA+IDA7ICkgewotCQkJc2IuYXBwZW5kKEFSUkFZX0lORElDQVRPUik7Ci0JCX0KLQkJaWYgKHBjYyA9PSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX0NPREUpOwotCQkJc2IuYXBwZW5kKGVsZW1lbnRUeXBlTmFtZSk7Ci0JCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX05BTUVfREVMSU1JVEVSKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChwY2MuY29kZSk7Ci0JCX0KLQkJcmV0dXJuIENsYXNzLmZvck5hbWUoc2IudG9TdHJpbmcoKSwgZmFsc2UsIGNsYXNzTG9hZGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIjsgZS5nLgotCSAqICAgICAiaW50W10iIC0+ICJbSSIKLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlUeXBlRGVjbGFyYXRpb24gdGQgPSB0eXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIGNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbih0ZC5lbGVtZW50VHlwZU5hbWUsIHRkLmFycmF5RGVwdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgZGVwdGggZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuCi0JICogICAgICJpbnRbXSIgLT4gMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlyZXR1cm4gYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pKTsKLQl9Ci0KLQkvKgotCSAqIEFzc3VtZSBubyB3aGl0ZXNwYWNlIGluIHRoZSB0eXBlIGRlY2xhcmF0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCWludCBsYXN0ID0gdHlwZURlY2xhcmF0aW9uLmxlbmd0aCgpIC0gMTsKLQkJaW50IGRlcHRoID0gMDsKLQkJaW50IGNsb3NlID0gbGFzdDsKLQkJd2hpbGUgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQoY2xvc2UpID09IFRZUEVfREVDTEFSQVRJT05fQVJSQVlfQ0xPU0UpIHsKLQkJCWlmICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KGNsb3NlIC0gMSkgPT0gVFlQRV9ERUNMQVJBVElPTl9BUlJBWV9PUEVOKSB7Ci0JCQkJZGVwdGgrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCB0eXBlIGRlY2xhcmF0aW9uOiAiICsgdHlwZURlY2xhcmF0aW9uKTsKLQkJCX0KLQkJCWNsb3NlID0gbGFzdCAtIChkZXB0aCAqIDIpOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJLy8gbm9uLWFycmF5Ci0JCWlmIChhcnJheURlcHRoID09IDApIHsKLQkJCXJldHVybiBlbGVtZW50VHlwZU5hbWU7Ci0JCX0KLQotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmVxdWFscyhWT0lEX0NMQVNTX05BTUUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCInIiArIFZPSURfQ0xBU1NfTkFNRSArICInIG11c3QgaGF2ZSBhbiBhcnJheSBkZXB0aCBvZiB6ZXJvOiAiICsgYXJyYXlEZXB0aCArICcuJyk7Ci0JCX0KLQkJLy8gYXJyYXkKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZChBUlJBWV9JTkRJQ0FUT1IpOwotCQl9Ci0KLQkJLy8gbG9vayBmb3IgYSBwcmltaXRpdmUgZmlyc3QKLQkJUHJpbWl0aXZlIHBjYyA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgPD0gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpIHsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50VHlwZU5hbWUpKSB7Ci0JCQkJCXBjYyA9IGNvZGVzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfQ09ERSk7Ci0JCQlzYi5hcHBlbmQoZWxlbWVudFR5cGVOYW1lKTsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfTkFNRV9ERUxJTUlURVIpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKHBjYy5jb2RlKTsKLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWlmIChNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIID09IC0xKSB7Ci0JCQlNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIID0gY2FsY3VsYXRlTWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEg7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZU1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaW50IG1heCA9IC0xOwotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpbnQgbGVuID0gY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPiBtYXgpIHsKLQkJCQltYXggPSBsZW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaWYgKE1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSCA9PSAtMSkgewotCQkJTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIID0gY2FsY3VsYXRlTWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpOwotCQl9Ci0JCXJldHVybiBNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEg7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZU1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWludCBtYXggPSAtMTsKLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaW50IGxlbiA9IGNvZGVzW2ldLndyYXBwZXJDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlpZiAobGVuID4gbWF4KSB7Ci0JCQkJbWF4ID0gbGVuOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbWl0aXZlW10gcHJpbWl0aXZlcygpIHsKLQkJaWYgKFBSSU1JVElWRVMgPT0gbnVsbCkgewotCQkJUFJJTUlUSVZFUyA9IGJ1aWxkUHJpbWl0aXZlcygpOwotCQl9Ci0JCXJldHVybiBQUklNSVRJVkVTOwotCX0KLQkKLQkvKioKLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVbXSBidWlsZFByaW1pdGl2ZXMoKSB7Ci0JCVByaW1pdGl2ZVtdIHJlc3VsdCA9IG5ldyBQcmltaXRpdmVbOV07Ci0JCXJlc3VsdFswXSA9IG5ldyBQcmltaXRpdmUoQllURV9DT0RFLCBqYXZhLmxhbmcuQnl0ZS5jbGFzcyk7Ci0JCXJlc3VsdFsxXSA9IG5ldyBQcmltaXRpdmUoQ0hBUl9DT0RFLCBqYXZhLmxhbmcuQ2hhcmFjdGVyLmNsYXNzKTsKLQkJcmVzdWx0WzJdID0gbmV3IFByaW1pdGl2ZShET1VCTEVfQ09ERSwgamF2YS5sYW5nLkRvdWJsZS5jbGFzcyk7Ci0JCXJlc3VsdFszXSA9IG5ldyBQcmltaXRpdmUoRkxPQVRfQ09ERSwgamF2YS5sYW5nLkZsb2F0LmNsYXNzKTsKLQkJcmVzdWx0WzRdID0gbmV3IFByaW1pdGl2ZShJTlRfQ09ERSwgamF2YS5sYW5nLkludGVnZXIuY2xhc3MpOwotCQlyZXN1bHRbNV0gPSBuZXcgUHJpbWl0aXZlKExPTkdfQ09ERSwgamF2YS5sYW5nLkxvbmcuY2xhc3MpOwotCQlyZXN1bHRbNl0gPSBuZXcgUHJpbWl0aXZlKFNIT1JUX0NPREUsIGphdmEubGFuZy5TaG9ydC5jbGFzcyk7Ci0JCXJlc3VsdFs3XSA9IG5ldyBQcmltaXRpdmUoQk9PTEVBTl9DT0RFLCBqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcyk7Ci0JCXJlc3VsdFs4XSA9IG5ldyBQcmltaXRpdmUoVk9JRF9DT0RFLCBqYXZhLmxhbmcuVm9pZC5jbGFzcyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIENsYXNzVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcmltaXRpdmUgewotCQlmaW5hbCBjaGFyIGNvZGU7Ci0JCWZpbmFsIENsYXNzPD8+IGphdmFDbGFzczsKLQkJZmluYWwgQ2xhc3M8Pz4gd3JhcHBlckNsYXNzOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBFUl9DTEFTU19UWVBFX0ZJRUxEX05BTUUgPSAiVFlQRSI7Ci0JCS8vIGUuZy4gamF2YS5sYW5nLkJvb2xlYW4uVFlQRSA9PiBib29sZWFuLmNsYXNzCi0JCVByaW1pdGl2ZShjaGFyIGNvZGUsIENsYXNzPD8+IHdyYXBwZXJDbGFzcykgewotCQkJdGhpcy5jb2RlID0gY29kZTsKLQkJCXRoaXMud3JhcHBlckNsYXNzID0gd3JhcHBlckNsYXNzOwotCQkJdGhpcy5qYXZhQ2xhc3MgPSAoQ2xhc3M8Pz4pIHN0YXRpY0ZpZWxkVmFsdWUod3JhcHBlckNsYXNzLCBXUkFQUEVSX0NMQVNTX1RZUEVfRklFTERfTkFNRSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUeXBlRGVjbGFyYXRpb24gewotCQlmaW5hbCBTdHJpbmcgZWxlbWVudFR5cGVOYW1lOwotCQlmaW5hbCBpbnQgYXJyYXlEZXB0aDsKLQkJVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCQl0aGlzLmVsZW1lbnRUeXBlTmFtZSA9IGVsZW1lbnRUeXBlTmFtZTsKLQkJCXRoaXMuYXJyYXlEZXB0aCA9IGFycmF5RGVwdGg7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9DbGFzc3BhdGguamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9DbGFzc3BhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4ZjNkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NwYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIFRPRE8KLSAqLwotcHVibGljIGNsYXNzIENsYXNzcGF0aAotCWltcGxlbWVudHMgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBlbnRyaWVzIGluIHRoZSBjbGFzc3BhdGggKi8KLQlwcml2YXRlIGZpbmFsIEVudHJ5W10gZW50cmllczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8vICoqKioqIGZhY3RvcnkgbWV0aG9kcyBmb3IgInN0YW5kYXJkIiBjbGFzc3BhdGhzICoqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgImJvb3QiIGNsYXNzcGF0aC4gVGhpcyBpbmNsdWRlcyBydC5qYXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggYm9vdENsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJzdW4uYm9vdC5jbGFzcy5wYXRoIikpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSAidmlydHVhbCBjbGFzc3BhdGgiIHRoYXQgY29udGFpbnMgYWxsIHRoZSBqYXJzCi0JICogdGhhdCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBKYXZhIEV4dGVuc2lvbiBNZWNoYW5pc20uCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggamF2YUV4dGVuc2lvbkNsYXNzcGF0aCgpIHsKLQkJRmlsZVtdIGRpcnMgPSBqYXZhRXh0ZW5zaW9uRGlyZWN0b3JpZXMoKTsKLQkJTGlzdDxTdHJpbmc+IGphckZpbGVOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKEZpbGUgZGlyIDogZGlycykgewotCQkJaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJYWRkSmFyRmlsZU5hbWVzVG8oZGlyLCBqYXJGaWxlTmFtZXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoKGphckZpbGVOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhICJzeXN0ZW0iIGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aCBqYXZhQ2xhc3NwYXRoKCkgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVucmV0b3VjaGVkICJjb21wbGV0ZSIgY2xhc3NwYXRoLgotCSAqIFRoaXMgaW5jbHVkZXMgdGhlIGJvb3QgY2xhc3NwYXRoLCB0aGUgSmF2YSBFeHRlbnNpb24KLQkgKiBNZWNoYW5pc20gY2xhc3NwYXRoLCBhbmQgdGhlIG5vcm1hbCAic3lzdGVtIiBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggY29tcGxldGVDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoKG5ldyBDbGFzc3BhdGhbXSB7Ci0JCQkJYm9vdENsYXNzcGF0aCgpLAotCQkJCWphdmFFeHRlbnNpb25DbGFzc3BhdGgoKSwKLQkJCQlqYXZhQ2xhc3NwYXRoKCkKLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY2xhc3NwYXRoIHRoYXQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggY2xhc3NwYXRoRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChsb2NhdGlvbkZvcihqYXZhQ2xhc3MpKTsKLQl9Ci0KLQotCS8vICoqKioqIGZpbGUgPT4gY2xhc3MgKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgYSByZWxhdGl2ZSBmaWxlIG5hbWUgdG8gYSBjbGFzcyBuYW1lOyB0aGlzIHdpbGwgd29yayBmb3IKLQkgKiBhbnkgZmlsZSB0aGF0IGhhcyBhIHNpbmdsZSBleHRlbnNpb24gYmV5b25kIHRoZSBiYXNlCi0JICogY2xhc3MgbmFtZS4KLQkgKiBlLmcuICJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIiBpcyBjb252ZXJ0ZWQgdG8gImphdmEubGFuZy5TdHJpbmciCi0JICogZS5nLiAiamF2YS9sYW5nL1N0cmluZy5qYXZhIiBpcyBjb252ZXJ0ZWQgdG8gImphdmEubGFuZy5TdHJpbmciCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQ2xhc3NOYW1lKFN0cmluZyBjbGFzc0ZpbGVOYW1lKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oY2xhc3NGaWxlTmFtZSk7Ci0JCS8vIGRvIHRoaXMgZm9yIGFyY2hpdmUgZW50cnkgbmFtZXMKLQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoJy8nLCAnLicpOwotCQkvLyBkbyB0aGlzIGZvciBPL1Mtc3BlY2lmaWMgZmlsZSBuYW1lcwotCQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgewotCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLicpOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGZpbGUgdG8gYSBjbGFzcyBuYW1lOwotCSAqIGUuZy4gRmlsZShqYXZhL2xhbmcvU3RyaW5nLmNsYXNzKSBpcyBjb252ZXJ0ZWQgdG8gImphdmEubGFuZy5TdHJpbmciCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQ2xhc3NOYW1lKEZpbGUgY2xhc3NGaWxlKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9DbGFzc05hbWUoY2xhc3NGaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIHJlbGF0aXZlIGZpbGUgbmFtZSB0byBhIGNsYXNzOwotCSAqIGUuZy4gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiIGlzIGNvbnZlcnRlZCB0byBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjb252ZXJ0VG9DbGFzcyhTdHJpbmcgY2xhc3NGaWxlTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjb252ZXJ0VG9DbGFzc05hbWUoY2xhc3NGaWxlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSByZWxhdGl2ZSBmaWxlIHRvIGEgY2xhc3M7Ci0JICogZS5nLiBGaWxlKGphdmEvbGFuZy9TdHJpbmcuY2xhc3MpIGlzIGNvbnZlcnRlZCB0byBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjb252ZXJ0VG9DbGFzcyhGaWxlIGNsYXNzRmlsZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3MoY2xhc3NGaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0KLQkvLyAqKioqKiBjbGFzcyA9PiBKQVIgZW50cnkgKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGFuIGFyY2hpdmUgZW50cnkgbmFtZSBiYXNlOwotCSAqIGUuZy4gImphdmEubGFuZy5TdHJpbmciIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUucmVwbGFjZSgnLicsICcvJyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhbiBhcmNoaXZlIGVudHJ5IG5hbWUgYmFzZTsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQXJjaGl2ZUVudHJ5TmFtZUJhc2UoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGFuIGFyY2hpdmUgY2xhc3MgZmlsZSBlbnRyeSBuYW1lOwotCSAqIGUuZy4gImphdmEubGFuZy5TdHJpbmciIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKGNsYXNzTmFtZSkgKyAiLmNsYXNzIjsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGFuIGFyY2hpdmUgY2xhc3MgZmlsZSBlbnRyeSBuYW1lOwotCSAqIGUuZy4gamF2YS5sYW5nLlN0cmluZy5jbGFzcyBpcyBjb252ZXJ0ZWQgdG8gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCi0JLy8gKioqKiogY2xhc3MgPT4gZmlsZSAoLmNsYXNzIG9yIC5qYXZhKSAqKioqKgotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBmaWxlIG5hbWUgYmFzZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gImphdmEubGFuZy5TdHJpbmciIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZyIgb24gVW5peAotCSAqIGFuZCAiamF2YVxcbGFuZ1xcU3RyaW5nIiBvbiBXaW5kb3dzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvRmlsZU5hbWVCYXNlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgZmlsZSBuYW1lIGJhc2UgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nIiBvbiBVbml4Ci0JICogYW5kICJqYXZhXFxsYW5nXFxTdHJpbmciIG9uIFdpbmRvd3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGEgY2xhc3MgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiAiamF2YS5sYW5nLlN0cmluZyIgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIiBvbiBVbml4Ci0JICogYW5kICJqYXZhXFxsYW5nXFxTdHJpbmcuY2xhc3MiIG9uIFdpbmRvd3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShjbGFzc05hbWUpICsgIi5jbGFzcyI7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGNsYXNzIGZpbGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gamF2YS5sYW5nLlN0cmluZy5jbGFzcyBpcyBjb252ZXJ0ZWQgdG8gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiIG9uIFVuaXgKLQkgKiBhbmQgImphdmFcXGxhbmdcXFN0cmluZy5jbGFzcyIgb24gV2luZG93cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGNsYXNzIGZpbGUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuICJqYXZhLmxhbmcuU3RyaW5nIiBpcyBjb252ZXJ0ZWQgdG8gRmlsZShqYXZhL2xhbmcvU3RyaW5nLmNsYXNzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9DbGFzc0ZpbGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gbmV3IEZpbGUoY29udmVydFRvQ2xhc3NGaWxlTmFtZShjbGFzc05hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgY2xhc3MgZmlsZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gamF2YS5sYW5nLlN0cmluZy5jbGFzcyBpcyBjb252ZXJ0ZWQgdG8gRmlsZShqYXZhL2xhbmcvU3RyaW5nLmNsYXNzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9DbGFzc0ZpbGUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9DbGFzc0ZpbGUoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGEgamF2YSBmaWxlIG5hbWUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuICJqYXZhLmxhbmcuU3RyaW5nIiBpcyBjb252ZXJ0ZWQgdG8gImphdmEvbGFuZy9TdHJpbmcuamF2YSIgb24gVW5peAotCSAqIGFuZCAiamF2YVxcbGFuZ1xcU3RyaW5nLmphdmEiIG9uIFdpbmRvd3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9KYXZhRmlsZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY29udmVydFRvRmlsZU5hbWVCYXNlKGNsYXNzTmFtZSkgKyAiLmphdmEiOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGphdmEgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZy5qYXZhIiBvbiBVbml4Ci0JICogYW5kICJqYXZhXFxsYW5nXFxTdHJpbmcuamF2YSIgb24gV2luZG93cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFGaWxlTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFGaWxlTmFtZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGphdmEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gImphdmEubGFuZy5TdHJpbmciIGlzIGNvbnZlcnRlZCB0byBGaWxlKGphdmEvbGFuZy9TdHJpbmcuamF2YSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvSmF2YUZpbGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gbmV3IEZpbGUoY29udmVydFRvSmF2YUZpbGVOYW1lKGNsYXNzTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGphdmEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gamF2YS5sYW5nLlN0cmluZy5jbGFzcyBpcyBjb252ZXJ0ZWQgdG8gRmlsZShqYXZhL2xhbmcvU3RyaW5nLmphdmEpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0phdmFGaWxlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvSmF2YUZpbGUoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKiBjbGFzcyA9PiByZXNvdXJjZSAqKioqKgotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgcmVzb3VyY2UgbmFtZTsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvICIvamF2YS9sYW5nL1N0cmluZy5jbGFzcyIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvUmVzb3VyY2VOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gJy8nICsgY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShqYXZhQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIHJlc291cmNlOwotCSAqIGUuZy4gamF2YS5sYW5nLlN0cmluZy5jbGFzcyBpcyBjb252ZXJ0ZWQgdG8KLQkgKiBVUkwoamFyOmZpbGU6L0M6L2pkay8xLjQuMl8wNC9qcmUvbGliL3J0LmphciEvamF2YS9sYW5nL1N0cmluZy5jbGFzcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgY29udmVydFRvUmVzb3VyY2UoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBqYXZhQ2xhc3MuZ2V0UmVzb3VyY2UoY29udmVydFRvUmVzb3VyY2VOYW1lKGphdmFDbGFzcykpOwotCX0KLQotCi0JLy8gKioqKiogdXRpbGl0aWVzICoqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgaXMgYW4gYXJjaGl2ZSBmaWxlOwotCSAqIGkuZS4gaXRzIG5hbWUgZW5kcyB3aXRoICIuemlwIiBvciAiLmphciIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc0FyY2hpdmUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVN0cmluZyBleHQgPSBGaWxlVG9vbHMuZXh0ZW5zaW9uKGZpbGVOYW1lKS50b0xvd2VyQ2FzZSgpOwotCQlyZXR1cm4gZXh0LmVxdWFscygiLmphciIpIHx8IGV4dC5lcXVhbHMoIi56aXAiKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIGlzIGFuIGFyY2hpdmUgZmlsZTsKLQkgKiBpLmUuIGl0cyBuYW1lIGVuZHMgd2l0aCAiLnppcCIgb3IgIi5qYXIiCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVJc0FyY2hpdmUoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmaWxlTmFtZUlzQXJjaGl2ZShmaWxlLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGF0IHNob3VsZCBiZSB0aGUgZnVsbHktcXVhbGlmaWVkIGZpbGUgbmFtZQotCSAqIGZvciB0aGUgSlJFIHJ1bnRpbWUgSkFSOwotCSAqIGUuZy4gIkM6XGpkazEuNC4yXzA0XGpyZVxsaWJccnQuamFyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydEphck5hbWUoKSB7Ci0JCXJldHVybiBsb2NhdGlvbkZvcihqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsb2NhdGlvbiBmcm9tIHdoZXJlIHRoZSBzcGVjaWZpZWQgY2xhc3Mgd2FzIGxvYWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhdGlvbkZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJVVJMIHVybCA9IGNvbnZlcnRUb1Jlc291cmNlKGphdmFDbGFzcyk7Ci0JCVN0cmluZyBwYXRoOwotCQl0cnkgewotCQkJcGF0aCA9IEZpbGVUb29scy5idWlsZEZpbGUodXJsKS5nZXRQYXRoKCk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JCVN0cmluZyBwcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpLnRvTG93ZXJDYXNlKCk7Ci0JCWlmIChwcm90b2NvbC5lcXVhbHMoImphciIpKSB7Ci0JCQkvLyBpZiB0aGUgY2xhc3MgaXMgaW4gYSBKQVIsIHRoZSBVUkwgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0JCQkvLyAgICAgamFyOmZpbGU6L0M6L2pkay8xLjQuMl8wNC9qcmUvbGliL3J0LmphciEvamF2YS9sYW5nL1N0cmluZy5jbGFzcwotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGguaW5kZXhPZignIScpKTsKLQkJfSBlbHNlIGlmIChwcm90b2NvbC5lcXVhbHMoImZpbGUiKSkgewotCQkJLy8gaWYgdGhlIGNsYXNzIGlzIGluIGEgZGlyZWN0b3J5LCB0aGUgVVJMIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgotCQkJLy8gICAgIGZpbGU6L0M6L2Rldi9tYWluL213ZGV2L2NsYXNzL29yZy9lY2xpcHNlL2RhbGkvdXRpbGl0eS9DbGFzc3BhdGguY2xhc3MKLQkJCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhQ2xhc3MpLmxlbmd0aCgpIC0gMSk7Ci0JCX0gZWxzZSBpZiAocHJvdG9jb2wuZXF1YWxzKCJidW5kbGVyZXNvdXJjZSIpKSB7Ci0JCQkvLyBpZiB0aGUgY2xhc3MgaXMgaW4gYSBidW5kbGUgcmVzb3VyY2UgKEVjbGlwc2U/KSwgdGhlIFVSTCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKLQkJCS8vICAgICBidW5kbGVyZXNvdXJjZTovLzQzL29yZy9lY2xpcHNlL2RhbGkvdXRpbGl0eS9DbGFzc3BhdGguY2xhc3MKLQkJCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhQ2xhc3MpLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHVybC50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXJlY3RvcmllcyB1c2VkIGJ5IHRoZSBKYXZhIEV4dGVuc2lvbiBNZWNoYW5pc20uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlW10gamF2YUV4dGVuc2lvbkRpcmVjdG9yaWVzKCkgewotCQlyZXR1cm4gY29udmVydFRvRmlsZXMoamF2YUV4dGVuc2lvbkRpcmVjdG9yeU5hbWVzKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGlyZWN0b3J5IG5hbWVzIHVzZWQgYnkgdGhlIEphdmEgRXh0ZW5zaW9uIE1lY2hhbmlzbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5leHQuZGlycyIpLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcik7Ci0JfQotCi0KLQkvLyAqKioqKiBpbnRlcm5hbCAqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIGNvbnZlcnRUb0ZpbGVzKFN0cmluZ1tdIGZpbGVOYW1lcykgewotCQlGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVtmaWxlTmFtZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IGZpbGVOYW1lcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJZmlsZXNbaV0gPSBuZXcgRmlsZShmaWxlTmFtZXNbaV0pOwotCQl9Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphckZpbGVOYW1lc1RvKEZpbGUgZGlyLCBMaXN0PFN0cmluZz4gamFyRmlsZU5hbWVzKSB7Ci0JCUZpbGVbXSBqYXJGaWxlcyA9IGphckZpbGVzSW4oZGlyKTsKLQkJZm9yIChGaWxlIGphckZpbGUgOiBqYXJGaWxlcykgewotCQkJamFyRmlsZU5hbWVzLmFkZChGaWxlVG9vbHMuY2Fub25pY2FsRmlsZShqYXJGaWxlKS5nZXRQYXRoKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIGphckZpbGVzSW4oRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeS5saXN0RmlsZXMoamFyRmlsZUZpbHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlRmlsdGVyIGphckZpbGVGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLQkJCQlyZXR1cm4gRmlsZVRvb2xzLmV4dGVuc2lvbihmaWxlLmdldE5hbWUoKSkudG9Mb3dlckNhc2UoKS5lcXVhbHMoIi5qYXIiKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNsYXNzcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgZW50cmllcy4KLQkgKi8KLQlwcml2YXRlIENsYXNzcGF0aChFbnRyeVtdIGVudHJpZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbnRyaWVzID0gZW50cmllczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjbGFzc3BhdGggd2l0aCB0aGUgc3BlY2lmaWVkIGVudHJpZXMuCi0JICovCi0JcHVibGljIENsYXNzcGF0aChTdHJpbmdbXSBmaWxlTmFtZXMpIHsKLQkJdGhpcyhidWlsZEVudHJpZXMoZmlsZU5hbWVzKSk7Ci0JfQotCi0JLyoqCi0JICogU2tpcCBlbXB0eSBmaWxlIG5hbWVzIGJlY2F1c2UgdGhleSB3aWxsIGVuZCB1cCBleHBhbmRpbmcgdG8gdGhlIGN1cnJlbnQKLQkgKiB3b3JraW5nIGRpcmVjdG9yeSwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudC4gRW1wdHkgZmlsZSBuYW1lcyBhY3R1YWxseQotCSAqIG9jY3VyIHdpdGggc29tZSBmcmVxdWVuY3k7IHN1Y2ggYXMgd2hlbiB0aGUgY2xhc3NwYXRoIGhhcyBiZWVuIGJ1aWx0IHVwCi0JICogZHluYW1pY2FsbHkgd2l0aCB0b28gbWFueSBzZXBhcmF0b3JzLiBGb3IgZXhhbXBsZToKLQkgKiAgICAgIkM6XGRldlxmb28uamFyOztDOlxkZXZcYmFyLmphciIKLQkgKiB3aWxsIGJlIHBhcnNlZCBpbnRvIHRocmVlIGZpbGUgbmFtZXM6Ci0JICogICAgIHsgIkM6XGRldlxmb28uamFyIiwgIiIsICJDOlxkZXZcYmFyLmphciIgfQotCSAqLwotCXByaXZhdGUgc3RhdGljIEVudHJ5W10gYnVpbGRFbnRyaWVzKFN0cmluZ1tdIGZpbGVOYW1lcykgewotCQlMaXN0PEVudHJ5PiBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDxFbnRyeT4oKTsKLQkJZm9yIChTdHJpbmcgZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKLQkJCWlmICgoZmlsZU5hbWUgIT0gbnVsbCkgJiYgKGZpbGVOYW1lLmxlbmd0aCgpICE9IDApKSB7Ci0JCQkJZW50cmllcy5hZGQobmV3IEVudHJ5KGZpbGVOYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVudHJpZXMudG9BcnJheShuZXcgRW50cnlbZW50cmllcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjbGFzc3BhdGggd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGguCi0JICovCi0JcHVibGljIENsYXNzcGF0aChTdHJpbmcgcGF0aCkgewotCQl0aGlzKHBhdGguc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2xhc3NwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBlbnRyaWVzLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGgoTGlzdDxTdHJpbmc+IGZpbGVOYW1lcykgewotCQl0aGlzKGZpbGVOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbZmlsZU5hbWVzLnNpemUoKV0pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zb2xpZGF0ZSB0aGUgc3BlY2lmaWVkIGNsYXNzcGF0aHMgaW50byBhIHNpbmdsZSBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIENsYXNzcGF0aChDbGFzc3BhdGhbXSBjbGFzc3BhdGhzKSB7Ci0JCXRoaXMoY29uc29saWRhdGVFbnRyaWVzKGNsYXNzcGF0aHMpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFbnRyeVtdIGNvbnNvbGlkYXRlRW50cmllcyhDbGFzc3BhdGhbXSBjbGFzc3BhdGhzKSB7Ci0JCUxpc3Q8RW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PEVudHJ5PigpOwotCQlmb3IgKENsYXNzcGF0aCBjbGFzc3BhdGggOiBjbGFzc3BhdGhzKSB7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGVudHJpZXMsIGNsYXNzcGF0aC5lbnRyaWVzKCkpOwotCQl9Ci0JCXJldHVybiBlbnRyaWVzLnRvQXJyYXkobmV3IEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzc3BhdGgncyBlbnRyaWVzLgotCSAqLwotCXB1YmxpYyBFbnRyeVtdIGVudHJpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmVudHJpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzc3BhdGgncyBwYXRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcGF0aCgpIHsKLQkJRW50cnlbXSBsb2NhbEVudHJpZXMgPSB0aGlzLmVudHJpZXM7Ci0JCWludCBtYXggPSBsb2NhbEVudHJpZXMubGVuZ3RoIC0gMTsKLQkJaWYgKG1heCA9PSAtMSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDAwKTsKLQkJLy8gc3RvcCBvbmUgc2hvcnQgb2YgdGhlIGVuZCBvZiB0aGUgYXJyYXkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJc2IuYXBwZW5kKGxvY2FsRW50cmllc1tpXS5maWxlTmFtZSgpKTsKLQkJCXNiLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsKLQkJfQotCQlzYi5hcHBlbmQobG9jYWxFbnRyaWVzW21heF0uZmlsZU5hbWUoKSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaCB0aGUgY2xhc3NwYXRoIGZvciB0aGUgc3BlY2lmaWVkICh1bnF1YWxpZmllZCkgZmlsZQotCSAqIGFuZCByZXR1cm4gaXRzIGVudHJ5LiBSZXR1cm4gbnVsbCBpZiBhbiBlbnRyeSBpcyBub3QgZm91bmQuCi0JICogRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgdGhpcyBtZXRob2QgdG8gZmluZCB0aGUgZW50cnkKLQkgKiBmb3IgInJ0LmphciIgb3IgInRvcGxpbmsuamFyIi4KLQkgKi8KLQlwdWJsaWMgRW50cnkgZW50cnlGb3JGaWxlTmFtZWQoU3RyaW5nIHNob3J0RmlsZU5hbWUpIHsKLQkJRW50cnlbXSBsb2NhbEVudHJpZXMgPSB0aGlzLmVudHJpZXM7Ci0JCWZvciAoRW50cnkgZW50cnkgOiBsb2NhbEVudHJpZXMpIHsKLQkJCWlmIChlbnRyeS5maWxlKCkuZ2V0TmFtZSgpLmVxdWFscyhzaG9ydEZpbGVOYW1lKSkgewotCQkJCXJldHVybiBlbnRyeTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVudHJ5IGZpbGUgaW4gdGhlIGNsYXNzcGF0aAotCSAqIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBSZXR1cm4gbnVsbCBpZiBhbiBlbnRyeSBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIEVudHJ5IGVudHJ5Rm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVN0cmluZyByZWxhdGl2ZUNsYXNzRmlsZU5hbWUgPSBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGNsYXNzTmFtZSk7Ci0JCVN0cmluZyBhcmNoaXZlRW50cnlOYW1lID0gY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShjbGFzc05hbWUpOwotCQlFbnRyeVtdIGxvY2FsRW50cmllcyA9IHRoaXMuZW50cmllczsKLQkJZm9yIChFbnRyeSBlbnRyeSA6IGxvY2FsRW50cmllcykgewotCQkJaWYgKGVudHJ5LmNvbnRhaW5zKHJlbGF0aXZlQ2xhc3NGaWxlTmFtZSwgYXJjaGl2ZUVudHJ5TmFtZSkpIHsKLQkJCQlyZXR1cm4gZW50cnk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoLAotCSAqIHdpdGggZHVwbGljYXRlcyByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBjbGFzc05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVzKEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JICogYW5kIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLCB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gY2xhc3NOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KDEwMDAwKTsKLQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJcmV0dXJuIGNsYXNzTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2NsYXNzTmFtZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENsYXNzTmFtZXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcykgewotCQl0aGlzLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2xhc3NOYW1lc1RvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJRW50cnlbXSBsb2NhbEVudHJpZXMgPSB0aGlzLmVudHJpZXM7Ci0JCWZvciAoRW50cnkgZW50cnkgOiBsb2NhbEVudHJpZXMpIHsKLQkJCWVudHJ5LmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBmaWx0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoLgotCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4gI2NsYXNzTmFtZXMoKS4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzU3RyZWFtKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVzU3RyZWFtKEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JICogdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JICogSnVzdCBhIGJpdCBtb3JlIHBlcmZvcm1hbnQgdGhhbiAjY2xhc3NOYW1lcyhGaWx0ZXIpLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNTdHJlYW0oRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPih0aGlzLmVudHJ5Q2xhc3NOYW1lc1N0cmVhbXMoZmlsdGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJdGVyYXRvcjxTdHJpbmc+PiBlbnRyeUNsYXNzTmFtZXNTdHJlYW1zKGZpbmFsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RW50cnksIEl0ZXJhdG9yPFN0cmluZz4+KG5ldyBBcnJheUl0ZXJhdG9yPEVudHJ5Pih0aGlzLmVudHJpZXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHRyYW5zZm9ybShFbnRyeSBlbnRyeSkgewotCQkJCXJldHVybiBlbnRyeS5jbGFzc05hbWVzU3RyZWFtKGZpbHRlcik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgImNvbXByZXNzZWQiIHZlcnNpb24gb2YgdGhlIGNsYXNzcGF0aCB3aXRoIGl0cwotCSAqIGR1cGxpY2F0ZSBlbnRyaWVzIGVsaW1pbmF0ZWQuCi0JICovCi0JcHVibGljIENsYXNzcGF0aCBjb21wcmVzc2VkKCkgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHModGhpcy5lbnRyaWVzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgY2xhc3NwYXRoIHRvIGFuIGFycmF5IG9mIFVSTHMKLQkgKiAodGhhdCBjYW4gYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBhIFVSTENsYXNzTG9hZGVyKS4KLQkgKi8KLQlwdWJsaWMgVVJMW10gdXJscygpIHsKLQkJRW50cnlbXSBsb2NhbEVudHJpZXMgPSB0aGlzLmVudHJpZXM7Ci0JCWludCBsZW4gPSBsb2NhbEVudHJpZXMubGVuZ3RoOwotCQlVUkxbXSB1cmxzID0gbmV3IFVSTFtsZW5dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQl1cmxzW2ldID0gbG9jYWxFbnRyaWVzW2ldLnVybCgpOwotCQl9Ci0JCXJldHVybiB1cmxzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucGF0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JLyoqCi0JICogVE9ETwotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRW50cnkgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlTmFtZTsKLQkJcHJpdmF0ZSBmaW5hbCBGaWxlIGZpbGU7Ci0JCXByaXZhdGUgZmluYWwgRmlsZSBjYW5vbmljYWxGaWxlOwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCUVudHJ5KFN0cmluZyBmaWxlTmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCWlmICgoZmlsZU5hbWUgPT0gbnVsbCkgfHwgKGZpbGVOYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ2ZpbGVOYW1lJyBtdXN0IGJlIG5vbi1lbXB0eSIpOwotCQkJfQotCQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCQkJdGhpcy5maWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQkJdGhpcy5jYW5vbmljYWxGaWxlID0gRmlsZVRvb2xzLmNhbm9uaWNhbEZpbGUodGhpcy5maWxlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZmlsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5maWxlTmFtZTsKLQkJfQotCi0JCXB1YmxpYyBGaWxlIGZpbGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5maWxlOwotCQl9Ci0KLQkJcHVibGljIEZpbGUgY2Fub25pY2FsRmlsZSgpIHsKLQkJCXJldHVybiB0aGlzLmNhbm9uaWNhbEZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGNhbm9uaWNhbEZpbGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuY2Fub25pY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmICggISAobyBpbnN0YW5jZW9mIEVudHJ5KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiAoKEVudHJ5KSBvKS5jYW5vbmljYWxGaWxlLmVxdWFscyh0aGlzLmNhbm9uaWNhbEZpbGUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBlbnRyeSdzICJjYW5vbmljYWwiIFVSTC4KLQkJICovCi0JCXB1YmxpYyBVUkwgdXJsKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlLnRvVVJMKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50cnkgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKENsYXNzPD8+IGphdmFDbGFzcykgewotCQkJcmV0dXJuIHRoaXMuY29udGFpbnMoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250YWlucyhjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGNsYXNzTmFtZSksIGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoY2xhc3NOYW1lKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGNvbnRhaW5zIGVpdGhlciB0aGUgc3BlY2lmaWVkIHJlbGF0aXZlCi0JCSAqIGNsYXNzIGZpbGUgb3IgdGhlIHNwZWNpZmllZCBhcmNoaXZlIGVudHJ5LgotCQkgKiBOb3QgdGhlIHByZXR0aWVzdCBzaWduYXR1cmUsIGJ1dCBpdCdzIGludGVybmFsLi4uLgotCQkgKi8KLQkJYm9vbGVhbiBjb250YWlucyhTdHJpbmcgcmVsYXRpdmVDbGFzc0ZpbGVOYW1lLCBTdHJpbmcgYXJjaGl2ZUVudHJ5TmFtZSkgewotCQkJaWYgKCAhIHRoaXMuY2Fub25pY2FsRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuaXNEaXJlY3RvcnkoKSAmJiAobmV3IEZpbGUodGhpcy5jYW5vbmljYWxGaWxlLCByZWxhdGl2ZUNsYXNzRmlsZU5hbWUpKS5leGlzdHMoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIChmaWxlSXNBcmNoaXZlKHRoaXMuY2Fub25pY2FsRmlsZSkgJiYgdGhpcy5hcmNoaXZlQ29udGFpbnNFbnRyeShhcmNoaXZlRW50cnlOYW1lKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5J3MgYXJjaGl2ZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVudHJ5LgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGFyY2hpdmVDb250YWluc0VudHJ5KFN0cmluZyB6aXBFbnRyeU5hbWUpIHsKLQkJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCQlaaXBFbnRyeSB6aXBFbnRyeSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZSh0aGlzLmNhbm9uaWNhbEZpbGUpOwotCQkJCXppcEVudHJ5ID0gemlwRmlsZS5nZXRFbnRyeSh6aXBFbnRyeU5hbWUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzb21ldGhpbmcgaXMgd3JvbmcsIGxlYXZlIHRoZSBlbnRyeSBudWxsCi0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmICh6aXBGaWxlICE9IG51bGwpIHsKLQkJCQkJCXppcEZpbGUuY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXppcEVudHJ5ID0gbnVsbDsJLy8gc29tZXRoaW5nIGlzIHdyb25nLCBjbGVhciBvdXQgdGhlIGVudHJ5Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHppcEVudHJ5ICE9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBpbiB0aGUgZW50cnkuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nW10gY2xhc3NOYW1lcygpIHsKLQkJCXJldHVybiB0aGlzLmNsYXNzTmFtZXMoRmlsdGVyLk51bGwuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIGluIHRoZSBlbnRyeQotCQkgKiBhbmQgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nW10gY2xhc3NOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDIwMDApOwotCQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJCXJldHVybiBjbGFzc05hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tjbGFzc05hbWVzLnNpemUoKV0pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgaW4gdGhlIGVudHJ5Ci0JCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZENsYXNzTmFtZXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcykgewotCQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgRmlsdGVyLk51bGwuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIGluIHRoZSBlbnRyeQotCQkgKiBhbmQgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkQ2xhc3NOYW1lc1RvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJdGhpcy5hZGRDbGFzc05hbWVzRm9yRGlyZWN0b3J5VG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJCQl9IGVsc2UgaWYgKGZpbGVJc0FyY2hpdmUodGhpcy5jYW5vbmljYWxGaWxlKSkgewotCQkJCQl0aGlzLmFkZENsYXNzTmFtZXNGb3JBcmNoaXZlVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZAotCQkgKiB1bmRlciB0aGUgZW50cnkncyBkaXJlY3RvcnkgYW5kIGFjY2VwdGVkIGJ5Ci0JCSAqIHRoZSBzcGVjaWZpZWQgZmlsdGVyIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBhZGRDbGFzc05hbWVzRm9yRGlyZWN0b3J5VG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJaW50IHN0YXJ0ID0gdGhpcy5jYW5vbmljYWxGaWxlLmdldEFic29sdXRlUGF0aCgpLmxlbmd0aCgpICsgMTsKLQkJCWZvciAoSXRlcmF0b3I8RmlsZT4gc3RyZWFtID0gdGhpcy5jbGFzc0ZpbGVzRm9yRGlyZWN0b3J5KCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb252ZXJ0VG9DbGFzc05hbWUoc3RyZWFtLm5leHQoKS5nZXRBYnNvbHV0ZVBhdGgoKS5zdWJzdHJpbmcoc3RhcnQpKTsKLQkJCQlpZiAoZmlsdGVyLmFjY2VwdChjbGFzc05hbWUpKSB7Ci0JCQkJCWNsYXNzTmFtZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGNsYXNzIGZpbGVzIGRpc2NvdmVyZWQKLQkJICogdW5kZXIgdGhlIGVudHJ5J3MgZGlyZWN0b3J5LgotCQkgKi8KLQkJcHJpdmF0ZSBJdGVyYXRvcjxGaWxlPiBjbGFzc0ZpbGVzRm9yRGlyZWN0b3J5KCkgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxGaWxlLCBGaWxlPihGaWxlVG9vbHMuZmlsZXNJblRyZWUodGhpcy5jYW5vbmljYWxGaWxlKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChGaWxlIG5leHQpIHsKLQkJCQkJcmV0dXJuIEVudHJ5LnRoaXMuZmlsZU5hbWVNaWdodEJlRm9yQ2xhc3NGaWxlKG5leHQuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQKLQkJICogaW4gdGhlIGVudHJ5J3MgYXJjaGl2ZSBmaWxlIGFuZCBhY2NlcHRlZCBieSB0aGUKLQkJICogc3BlY2lmaWVkIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NOYW1lc0ZvckFyY2hpdmVUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlID0gbmV3IFppcEZpbGUodGhpcy5jYW5vbmljYWxGaWxlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZm9yIChFbnVtZXJhdGlvbjw/IGV4dGVuZHMgWmlwRW50cnk+IHN0cmVhbSA9IHppcEZpbGUuZW50cmllcygpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotCQkJCVppcEVudHJ5IHppcEVudHJ5ID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIHppcEVudHJ5TmFtZSA9IHppcEVudHJ5LmdldE5hbWUoKTsKLQkJCQlpZiAodGhpcy5maWxlTmFtZU1pZ2h0QmVGb3JDbGFzc0ZpbGUoemlwRW50cnlOYW1lKSkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29udmVydFRvQ2xhc3NOYW1lKHppcEVudHJ5TmFtZSk7Ci0JCQkJCWlmIChmaWx0ZXIuYWNjZXB0KGNsYXNzTmFtZSkpIHsKLQkJCQkJCWNsYXNzTmFtZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXppcEZpbGUuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBtaWdodCBiZSBhIEphdmEgY2xhc3MgZmlsZS4KLQkJICogVGhlIGZpbGUgbmFtZSBtdXN0IGF0IGxlYXN0IGVuZCB3aXRoICIuY2xhc3MiIGFuZCBjb250YWluIG5vIHNwYWNlcy4KLQkJICogKE5laXRoZXIgY2xhc3MgbmFtZXMgbm9yIHBhY2thZ2UgbmFtZXMgbWF5IGNvbnRhaW4gc3BhY2VzLikKLQkJICogV2hldGhlciBpdCBhY3R1YWxseSBpcyBhIGNsYXNzIGZpbGUgd2lsbCBuZWVkIHRvIGJlIGRldGVybWluZWQgYnkKLQkJICogYSBjbGFzcyBsb2FkZXIuCi0JCSAqLwotCQlib29sZWFuIGZpbGVOYW1lTWlnaHRCZUZvckNsYXNzRmlsZShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIEZpbGVUb29scy5leHRlbnNpb24obmFtZSkudG9Mb3dlckNhc2UoKS5lcXVhbHMoIi5jbGFzcyIpCi0JCQkJCSYmIChuYW1lLmluZGV4T2YoJyAnKSA9PSAtMSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoLgotCQkgKiBKdXN0IGEgYml0IG1vcmUgcGVyZm9ybWFudCB0aGFuICNjbGFzc05hbWVzKCkuCi0JCSAqLwotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzU3RyZWFtKCkgewotCQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lc1N0cmVhbShGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCQkgKiB0aGF0IGFyZSBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlci4KLQkJICogSnVzdCBhIGJpdCBtb3JlIHBlcmZvcm1hbnQgdGhhbiAjY2xhc3NOYW1lcyhGaWx0ZXIpLgotCQkgKi8KLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc1N0cmVhbShGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lc0ZvckRpcmVjdG9yeShmaWx0ZXIpOwotCQkJCX0KLQkJCQlpZiAoZmlsZUlzQXJjaGl2ZSh0aGlzLmNhbm9uaWNhbEZpbGUpKSB7Ci0JCQkJCXJldHVybiB0aGlzLmNsYXNzTmFtZXNGb3JBcmNoaXZlKGZpbHRlcik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIHVuZGVyIHRoZSBlbnRyeSdzIGRpcmVjdG9yeSBhbmQgYWNjZXB0ZWQgYnkKLQkJICogdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqLwotCQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc0ZvckRpcmVjdG9yeShGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2xhc3NOYW1lc0ZvckRpcmVjdG9yeSgpLCBmaWx0ZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRyYW5zZm9ybSB0aGUgY2xhc3MgZmlsZXMgdG8gY2xhc3MgbmFtZXMuCi0JCSAqLwotCQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc0ZvckRpcmVjdG9yeSgpIHsKLQkJCWZpbmFsIGludCBzdGFydCA9IHRoaXMuY2Fub25pY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5sZW5ndGgoKSArIDE7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmlsZSwgU3RyaW5nPih0aGlzLmNsYXNzRmlsZXNGb3JEaXJlY3RvcnkoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEZpbGUgZikgewotCQkJCQlyZXR1cm4gY29udmVydFRvQ2xhc3NOYW1lKGYuZ2V0QWJzb2x1dGVQYXRoKCkuc3Vic3RyaW5nKHN0YXJ0KSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIGluIHRoZSBlbnRyeSdzIGFyY2hpdmUgZmlsZSBhbmQgYWNjZXB0ZWQgYnkgdGhlCi0JCSAqIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqLwotCQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc0ZvckFyY2hpdmUoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQkvLyB3ZSBjYW4ndCBzaW1wbHkgd3JhcCBpdGVyYXRvcnMgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gY2xvc2UgdGhlIGFyY2hpdmUgZmlsZS4uLgotCQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHRoaXMuY2Fub25pY2FsRmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oemlwRmlsZS5zaXplKCkpOwotCQkJZm9yIChFbnVtZXJhdGlvbjw/IGV4dGVuZHMgWmlwRW50cnk+IHN0cmVhbSA9IHppcEZpbGUuZW50cmllcygpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotCQkJCVppcEVudHJ5IHppcEVudHJ5ID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIHppcEVudHJ5TmFtZSA9IHppcEVudHJ5LmdldE5hbWUoKTsKLQkJCQlpZiAodGhpcy5maWxlTmFtZU1pZ2h0QmVGb3JDbGFzc0ZpbGUoemlwRW50cnlOYW1lKSkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29udmVydFRvQ2xhc3NOYW1lKHppcEVudHJ5TmFtZSk7Ci0JCQkJCWlmIChmaWx0ZXIuYWNjZXB0KGNsYXNzTmFtZSkpIHsKLQkJCQkJCWNsYXNzTmFtZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXppcEZpbGUuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCXJldHVybiBjbGFzc05hbWVzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvbGxlY3Rpb25Ub29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvbGxlY3Rpb25Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjMyNTAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbUFjY2VzczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5HZW5lcmljSXRlcmF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uVG9vbHMgewotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBuZXdBcnJheShFW10gYXJyYXksIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIChFW10pIEFycmF5Lm5ld0luc3RhbmNlKGFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gYmUgYWRkZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNhZGQoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGQoRVtdIGFycmF5LCBFIHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgbGVuICsgMSk7Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGxlbik7Ci0JCX0KLQkJcmVzdWx0W2xlbl0gPSB2YWx1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkKEVbXSBhcnJheSwgaW50IGluZGV4LCBFIHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgbGVuICsgMSk7Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCXJlc3VsdFtpbmRleF0gPSB2YWx1ZTsKLQkJaWYgKGxlbiA+IGluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCwgcmVzdWx0LCBpbmRleCArIDEsIGxlbiAtIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBiZSBhZGRlZC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZChjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gYWRkKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuICsgMV07Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGxlbik7Ci0JCX0KLQkJcmVzdWx0W2xlbl0gPSB2YWx1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkKGNoYXJbXSBhcnJheSwgaW50IGluZGV4LCBjaGFyIHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGFkZChjaGFyW10gYXJyYXksIGludCBpbmRleCwgY2hhciB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuICsgMV07Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCXJlc3VsdFtpbmRleF0gPSB2YWx1ZTsKLQkJaWYgKGxlbiA+IGluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCwgcmVzdWx0LCBpbmRleCArIDEsIGxlbiAtIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBiZSBhZGRlZC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZChpbnRbXSBhcnJheSwgaW50IHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsZW4gKyAxXTsKLQkJaWYgKGxlbiA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgbGVuKTsKLQkJfQotCQlyZXN1bHRbbGVuXSA9IHZhbHVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogamF2YS51dGlsLkFycmF5cyNhZGQoaW50W10gYXJyYXksIGludCBpbmRleCwgaW50IHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkKGludFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbiArIDFdOwotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlyZXN1bHRbaW5kZXhdID0gdmFsdWU7Ci0JCWlmIChsZW4gPiBpbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyAxLCBsZW4gLSBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jYWRkQWxsKGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhZGRBbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI2FkZEFsbChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jYWRkQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGNvbGxlY3Rpb24uYWRkQWxsKGxpc3QoaXRlcmF0b3IpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNhZGRBbGwoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGNvbGxlY3Rpb24uYWRkQWxsKGxpc3QoaXRlcmF0b3IsIHNpemUpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNhZGRBbGwoT2JqZWN0W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEVbXSBhcnJheSkgewotCQlyZXR1cm4gKGFycmF5Lmxlbmd0aCA9PSAwKSA/IGZhbHNlIDogY29sbGVjdGlvbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChhcnJheSkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5MaXN0I2FkZEFsbChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoTGlzdDw/IHN1cGVyIEU+IGxpc3QsIGludCBpbmRleCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGFkZEFsbChsaXN0LCBpbmRleCwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkxpc3QjYWRkQWxsKGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChsaXN0LCBpbmRleCwgaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkxpc3QjYWRkQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8gbGlzdC5hZGRBbGwoaW5kZXgsIGxpc3QoaXRlcmF0b3IpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5MaXN0I2FkZEFsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoTGlzdDw/IHN1cGVyIEU+IGxpc3QsIGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPyBsaXN0LmFkZEFsbChpbmRleCwgbGlzdChpdGVyYXRvciwgc2l6ZSkpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkxpc3QjYWRkQWxsKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKExpc3Q8PyBzdXBlciBFPiBsaXN0LCBpbnQgaW5kZXgsIEVbXSBhcnJheSkgewotCQlyZXR1cm4gKGFycmF5Lmxlbmd0aCA9PSAwKSA/IGZhbHNlIDogbGlzdC5hZGRBbGwoaW5kZXgsIEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZEFsbChPYmplY3RbXSBhcnJheSwgamF2YS51dGlsLkNvbGxlY3Rpb24gYykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlpbnQgc2l6ZSA9IGNvbGxlY3Rpb24uc2l6ZSgpOwotCQlyZXR1cm4gKHNpemUgPT0gMCkgPyBhcnJheSA6IGFkZEFsbChhcnJheSwgY29sbGVjdGlvbiwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uLnNpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgY29sbGVjdGlvblNpemUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBsZW4gKyBjb2xsZWN0aW9uU2l6ZSk7Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGxlbik7Ci0JCX0KLQkJaW50IGkgPSBsZW47Ci0JCWZvciAoRSBpdGVtIDogY29sbGVjdGlvbikgewotCQkJcmVzdWx0W2krK10gPSBpdGVtOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkQWxsKE9iamVjdFtdIGFycmF5LCBqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogamF2YS51dGlsLkFycmF5cyNhZGRBbGwoT2JqZWN0W10gYXJyYXksIGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkFycmF5cyNhZGRBbGwoT2JqZWN0W10gYXJyYXksIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGFkZEFsbF8oYXJyYXksIGxpc3QoaXRlcmF0b3IpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZEFsbChPYmplY3RbXSBhcnJheSwgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGFkZEFsbF8oYXJyYXksIGxpc3QoaXRlcmF0b3IsIHNpemUpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgMSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogamF2YS51dGlsLkFycmF5cyNhZGRBbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBFW10gYXJyYXkyKSB7Ci0JCWludCBhcnJheTJMZW5ndGggPSBhcnJheTIubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkyTGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIEVbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8gYXJyYXkyIDogYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5MUxlbmd0aCA+IDAgYW5kIGFycmF5Mkxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBFW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheTEsIGFycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGFycmF5MUxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogZmlyc3Qgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG9iamVjdHMgaW4gdGhlIHNlY29uZAotCSAqIHNwZWNpZmllZCBhcnJheSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkKE9iamVjdFtdIGFycmF5MSwgaW50IGluZGV4LCBPYmplY3RbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBpbnQgaW5kZXgsIEVbXSBhcnJheTIpIHsKLQkJaW50IGFycmF5Mkxlbmd0aCA9IGFycmF5Mi5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gYXJyYXkxIDogYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkyTGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIGludCBpbmRleCwgRVtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJcmV0dXJuIChpbmRleCA9PSBhcnJheTFMZW5ndGgpID8gIC8vIGFycmF5MiBhZGRlZCB0byBlbmQgb2YgYXJyYXkxCi0JCQkJKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MiA6IGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpCi0JCQk6Ci0JCQkJYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTFMZW5ndGggPiAwIGFuZCBhcnJheTJMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgaW50IGluZGV4LCBFW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheTEsIGFycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgaW5kZXgsIGFycmF5Mkxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCBpbmRleCwgcmVzdWx0LCBpbmRleCArIGFycmF5Mkxlbmd0aCwgYXJyYXkxTGVuZ3RoIC0gaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBqYXZhLnV0aWwuQ29sbGVjdGlvbiBjKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJaW50IHNpemUgPSBjb2xsZWN0aW9uLnNpemUoKTsKLQkJcmV0dXJuIChzaXplID09IDApID8gYXJyYXkgOiBhZGRBbGwoYXJyYXksIGluZGV4LCBjb2xsZWN0aW9uLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgaW5kZXgsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb24uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBhcnJheUxlbmd0aCArIGNvbGxlY3Rpb25TaXplKTsKLQkJaWYgKChhcnJheUxlbmd0aCA9PSAwKSAmJiAoaW5kZXggPT0gMCkpIHsKLQkJCXJldHVybiBjb2xsZWN0aW9uLnRvQXJyYXkocmVzdWx0KTsKLQkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJaW50IGkgPSBpbmRleDsKLQkJZm9yIChFIGl0ZW0gOiBjb2xsZWN0aW9uKSB7Ci0JCQlyZXN1bHRbaSsrXSA9IGl0ZW07Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyBjb2xsZWN0aW9uU2l6ZSwgYXJyYXlMZW5ndGggLSBpbmRleCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGluZGV4LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkQWxsKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBzaXplKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGluZGV4LCBpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvciBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkQWxsKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8gYWRkQWxsXyhhcnJheSwgaW5kZXgsIGxpc3QoaXRlcmF0b3IpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogamF2YS51dGlsLkFycmF5cyNhZGRBbGwoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8gYWRkQWxsXyhhcnJheSwgaW5kZXgsIGxpc3QoaXRlcmF0b3IsIHNpemUpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgMSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogamF2YS51dGlsLkFycmF5cyNhZGRBbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MikgewotCQlpbnQgYXJyYXkyTGVuZ3RoID0gYXJyYXkyLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5Mkxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8gYXJyYXkyIDogYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5MUxlbmd0aCA+IDAgYW5kIGFycmF5Mkxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2FycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGFycmF5MUxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogZmlyc3Qgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG9iamVjdHMgaW4gdGhlIHNlY29uZAotCSAqIHNwZWNpZmllZCBhcnJheSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5MikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyW10gYXJyYXkyKSB7Ci0JCWludCBhcnJheTJMZW5ndGggPSBhcnJheTIubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5Mkxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJcmV0dXJuIChpbmRleCA9PSBhcnJheTFMZW5ndGgpID8gIC8vIGFycmF5MiBhZGRlZCB0byBlbmQgb2YgYXJyYXkxCi0JCQkJKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MiA6IGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpCi0JCQk6Ci0JCQkJYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTFMZW5ndGggPiAwIGFuZCBhcnJheTJMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBpbnQgaW5kZXgsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2FycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgaW5kZXgsIGFycmF5Mkxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCBpbmRleCwgcmVzdWx0LCBpbmRleCArIGFycmF5Mkxlbmd0aCwgYXJyYXkxTGVuZ3RoIC0gaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgMSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogamF2YS51dGlsLkFycmF5cyNhZGRBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpIHsKLQkJaW50IGFycmF5Mkxlbmd0aCA9IGFycmF5Mi5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gYXJyYXkxIDogYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTJMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MiA6IGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTFMZW5ndGggPiAwIGFuZCBhcnJheTJMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoICsgYXJyYXkyTGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgYXJyYXkxTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgb2JqZWN0cyBpbiB0aGUgc2Vjb25kCi0JICogc3BlY2lmaWVkIGFycmF5IGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogamF2YS51dGlsLkFycmF5cyNhZGQoaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludFtdIGFycmF5MikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50W10gYXJyYXkyKSB7Ci0JCWludCBhcnJheTJMZW5ndGggPSBhcnJheTIubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5Mkxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludFtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJcmV0dXJuIChpbmRleCA9PSBhcnJheTFMZW5ndGgpID8gIC8vIGFycmF5MiBhZGRlZCB0byBlbmQgb2YgYXJyYXkxCi0JCQkJKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MiA6IGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpCi0JCQk6Ci0JCQkJYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTFMZW5ndGggPiAwIGFuZCBhcnJheTJMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnRbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFthcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGluZGV4LCBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyBhcnJheTJMZW5ndGgsIGFycmF5MUxlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jdG9BcnJheSgpCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI3RvQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXJyYXkoSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGFycmF5KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiN0b0FycmF5KCkKLQkgKiBqYXZhLmxhbmcuSXRlcmFibGUjdG9BcnJheSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBhcnJheShJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGFycmF5KGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGU7Ci0JICogdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhhdCBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIElmIHRoZSBjb2xsZWN0aW9uIGZpdHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwgaXQgaXMgcmV0dXJuZWQgdGhlcmVpbi4KLQkgKiBPdGhlcndpc2UsIGEgbmV3IGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGFuZCB0aGUgc2l6ZSBvZiB0aGlzIGNvbGxlY3Rpb24uCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiN0b0FycmF5KGphdmEubGFuZy5PYmplY3RbXSkKLQkgKiBqYXZhLmxhbmcuSXRlcmFibGUjdG9BcnJheShPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYXJyYXkoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBFW10gYXJyYXkpIHsKLQkJcmV0dXJuIGFycmF5KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlOwotCSAqIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5IGlzIHRoYXQgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBJZiB0aGUgY29sbGVjdGlvbiBmaXRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXksIGl0IGlzIHJldHVybmVkIHRoZXJlaW4uCi0JICogT3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCB0aGUgcnVudGltZSB0eXBlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBhbmQgdGhlIHNpemUgb2YgdGhpcyBjb2xsZWN0aW9uLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jdG9BcnJheShqYXZhLmxhbmcuT2JqZWN0W10pCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI3RvQXJyYXkoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFycmF5KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUsIEVbXSBhcnJheSkgewotCQlyZXR1cm4gYXJyYXkoaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiN0b0FycmF5KCkKLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjdG9BcnJheSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBhcnJheShJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPyBsaXN0KGl0ZXJhdG9yKS50b0FycmF5KCkgOiBFTVBUWV9PQkpFQ1RfQVJSQVk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVF9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jdG9BcnJheSgpCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI3RvQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXJyYXkoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGxpc3QoaXRlcmF0b3IsIHNpemUpLnRvQXJyYXkoKSA6IEVNUFRZX09CSkVDVF9BUlJBWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yOwotCSAqIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5IGlzIHRoYXQgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBJZiB0aGUgY29sbGVjdGlvbiBmaXRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXksIGl0IGlzIHJldHVybmVkIHRoZXJlaW4uCi0JICogT3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCB0aGUgcnVudGltZSB0eXBlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBhbmQgdGhlIHNpemUgb2YgdGhpcyBjb2xsZWN0aW9uLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jdG9BcnJheShqYXZhLmxhbmcuT2JqZWN0W10pCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI3RvQXJyYXkoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFycmF5KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRVtdIGFycmF5KSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGxpc3QoaXRlcmF0b3IpLnRvQXJyYXkoYXJyYXkpIDogbmV3QXJyYXkoYXJyYXksIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3I7Ci0JICogdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhhdCBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIElmIHRoZSBjb2xsZWN0aW9uIGZpdHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwgaXQgaXMgcmV0dXJuZWQgdGhlcmVpbi4KLQkgKiBPdGhlcndpc2UsIGEgbmV3IGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGFuZCB0aGUgc2l6ZSBvZiB0aGlzIGNvbGxlY3Rpb24uCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiN0b0FycmF5KGphdmEubGFuZy5PYmplY3RbXSkKLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjdG9BcnJheShPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYXJyYXkoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSwgRVtdIGFycmF5KSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGxpc3QoaXRlcmF0b3IsIHNpemUpLnRvQXJyYXkoYXJyYXkpIDogbmV3QXJyYXkoYXJyYXksIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24uCi0JICogSGFzaEJhZyhqYXZhLnV0aWwuRW51bWVyYXRpb24gZW51bWVyYXRpb24pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQmFnPEU+IGJhZyhFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJcmV0dXJuIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgPwotCQkJCWJhZyhlbnVtZXJhdGlvbiwgbmV3IEhhc2hCYWc8RT4oKSkKLQkJCToKLQkJCQlCYWcuRW1wdHkuPEU+aW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqIEhhc2hCYWcoamF2YS51dGlsLkVudW1lcmF0aW9uIGVudW1lcmF0aW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEJhZzxFPiBiYWcoRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSA/Ci0JCQkJYmFnKGVudW1lcmF0aW9uLCBuZXcgSGFzaEJhZzxFPihzaXplKSkKLQkJCToKLQkJCQlCYWcuRW1wdHkuPEU+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gQmFnPEU+IGJhZyhFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24sIEhhc2hCYWc8RT4gYmFnKSB7Ci0JCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJYmFnLmFkZChlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpKTsKLQkJfQotCQlyZXR1cm4gYmFnOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogSGFzaEJhZyhqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQmFnPEU+IGJhZyhJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGJhZyhpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIEhhc2hCYWcoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEJhZzxFPiBiYWcoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gYmFnKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogSGFzaEJhZyhqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQmFnPEU+IGJhZyhJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8KLQkJCQliYWcoaXRlcmF0b3IsIG5ldyBIYXNoQmFnPEU+KCkpCi0JCQk6Ci0JCQkJQmFnLkVtcHR5LjxFPmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBIYXNoQmFnKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBCYWc8RT4gYmFnKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8KLQkJCQliYWcoaXRlcmF0b3IsIG5ldyBIYXNoQmFnPEU+KHNpemUpKQotCQkJOgotCQkJCUJhZy5FbXB0eS48RT5pbnN0YW5jZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBCYWc8RT4gYmFnKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgSGFzaEJhZzxFPiBiYWcpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYmFnLmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBIYXNoQmFnKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEJhZzxFPiBiYWcoRS4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBCYWcuRW1wdHkuPEU+aW5zdGFuY2UoKTsKLQkJfQotCQlCYWc8RT4gYmFnID0gbmV3IEhhc2hCYWc8RT4obGVuKTsKLQkJZm9yIChFIGl0ZW0gOiBhcnJheSkgewotCQkJYmFnLmFkZChpdGVtKTsKLQkJfQotCQlyZXR1cm4gYmFnOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IENvbGxlY3Rpb248RT4gY29sbGVjdGlvbihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJcmV0dXJuIGJhZyhlbnVtZXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbiwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGJhZyhlbnVtZXJhdGlvbiwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29sbGVjdGlvbihpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24oSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gY29sbGVjdGlvbihpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBiYWcoaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IENvbGxlY3Rpb248RT4gY29sbGVjdGlvbihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiBiYWcoaXRlcmF0b3IsIHNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IENvbGxlY3Rpb248RT4gY29sbGVjdGlvbihFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBiYWcoYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24gY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogamF2YS51dGlsLkVudW1lcmF0aW9uI2NvbnRhaW5zKE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhFbnVtZXJhdGlvbjw/PiBlbnVtZXJhdGlvbiwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlpZiAoZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIGphdmEubGFuZy5JdGVyYWJsZSNjb250YWlucyhPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoSXRlcmFibGU8Pz4gaXRlcmFibGUsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gY29udGFpbnMoaXRlcmFibGUuaXRlcmF0b3IoKSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI2NvbnRhaW5zKE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKGl0ZXJhdG9yLm5leHQoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGl0ZXJhdG9yLm5leHQoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIGphdmEudXRpbC5BcnJheXMjY29udGFpbnMoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoYXJyYXlbaV0gPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWlucyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlyZXR1cm4gY29udGFpbnMoYXJyYXksIHZhbHVlLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIGphdmEudXRpbC5BcnJheXMjY29udGFpbnMoaW50W10gYXJyYXksIGludCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlyZXR1cm4gY29udGFpbnMoYXJyYXksIHZhbHVlLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoaW50W10gYXJyYXksIGludCB2YWx1ZSwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI2NvbnRhaW5zQWxsKGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI2NvbnRhaW5zQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoICEgY29sbGVjdGlvbi5jb250YWlucyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNjb250YWluc0FsbChPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3RbXSBhcnJheSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb2xsZWN0aW9uLmNvbnRhaW5zKGFycmF5W2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI2NvbnRhaW5zQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBqYXZhLmxhbmcuSXRlcmFibGUjY29udGFpbnNBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBzaXplLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZSAyLgotCSAqIGphdmEubGFuZy5JdGVyYWJsZSNjb250YWluc0FsbChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZTEuaXRlcmF0b3IoKSwgaXRlcmFibGUyLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZSAyLgotCSAqIGphdmEubGFuZy5JdGVyYWJsZSNjb250YWluc0FsbChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgaW50IHNpemUsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUxLml0ZXJhdG9yKCksIHNpemUsIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIGphdmEubGFuZy5JdGVyYWJsZSNjb250YWluc0FsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI2NvbnRhaW5zQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBzaXplLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI2NvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYWJsZTw/PiBpdGVyYWJsZSwgT2JqZWN0W10gYXJyYXkpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIGphdmEubGFuZy5JdGVyYWJsZSNjb250YWluc0FsbChPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBzaXplLCBPYmplY3RbXSBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjY29udGFpbnNBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29sbGVjdGlvbihpdGVyYXRvcikuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIGphdmEudXRpbC5JdGVyYXRvciNjb250YWluc0FsbChqYXZhLnV0aWwuQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IHNpemUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29sbGVjdGlvbihpdGVyYXRvciwgc2l6ZSkuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjY29udGFpbnNBbGwoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGNvbGxlY3Rpb24oaXRlcmF0b3IpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjY29udGFpbnNBbGwoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IHNpemUsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChjb2xsZWN0aW9uKGl0ZXJhdG9yLCBzaXplKSwgaXRlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvciAyLgotCSAqIGphdmEudXRpbC5JdGVyYXRvciNjb250YWluc0FsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChjb2xsZWN0aW9uKGl0ZXJhdG9yMSksIGl0ZXJhdG9yMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDIuCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI2NvbnRhaW5zQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IxLCBpbnQgc2l6ZSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChjb2xsZWN0aW9uKGl0ZXJhdG9yMSwgc2l6ZSksIGl0ZXJhdG9yMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBPYmplY3RbXSBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoY29sbGVjdGlvbihpdGVyYXRvciksIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIGphdmEudXRpbC5JdGVyYXRvciNjb250YWluc0FsbChPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBzaXplLCBPYmplY3RbXSBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoY29sbGVjdGlvbihpdGVyYXRvciwgc2l6ZSksIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgamF2YS51dGlsLkNvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoYXJyYXksIGNvbGxlY3Rpb24uaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2NvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5LCBqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoYXJyYXksIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5LCBpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIGphdmEudXRpbC5BcnJheXMjY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheTIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTEsIGFycmF5MltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWluc0FsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheTIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTEsIGFycmF5MltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWluc0FsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Mi5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5MSwgYXJyYXkyW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gLTEuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IHNpemVzLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQotCSAqIGxhc3QgZWxlbWVudCBpbiB0aGUgbG9uZ2VyIGFycmF5LgotCSAqIFVzZSB0aGUgZWxlbWVudHMnICNlcXVhbHMoKSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBkaWZmRW5kKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCXJldHVybiBkaWZmRW5kKEFycmF5cy5hc0xpc3QoYXJyYXkxKSwgQXJyYXlzLmFzTGlzdChhcnJheTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LCBiZWdpbm5pbmcgYXQgdGhlIGVuZC4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIC0xLgotCSAqIElmIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50IHNpemVzLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQotCSAqIGxhc3QgZWxlbWVudCBpbiB0aGUgbG9uZ2VyIGxpc3QuCi0JICogVXNlIHRoZSBlbGVtZW50cycgI2VxdWFscygpIG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZFbmQoTGlzdDw/PiBsaXN0MSwgTGlzdDw/PiBsaXN0MikgewotCQlpbnQgc2l6ZTEgPSBsaXN0MS5zaXplKCk7Ci0JCWludCBzaXplMiA9IGxpc3QyLnNpemUoKTsKLQkJaWYgKHNpemUxICE9IHNpemUyKSB7Ci0JCQlyZXR1cm4gTWF0aC5tYXgoc2l6ZTEsIHNpemUyKSAtIDE7Ci0JCX0KLQkJaW50IGVuZCA9IHNpemUxIC0gMTsKLQkJd2hpbGUgKGVuZCA+IC0xKSB7Ci0JCQlPYmplY3QgbyA9IGxpc3QxLmdldChlbmQpOwotCQkJaWYgKG8gPT0gbnVsbCkgewotCQkJCWlmIChsaXN0Mi5nZXQoZW5kKSA9PSBudWxsKSB7Ci0JCQkJCWVuZC0tOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbmQ7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoby5lcXVhbHMobGlzdDIuZ2V0KGVuZCkpKSB7Ci0JCQkJCWVuZC0tOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbmQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByYW5nZSBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiBbc2l6ZSwgLTFdLgotCSAqIFVzZSB0aGUgZWxlbWVudHMnICNlcXVhbHMoKSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKiBAc2VlICNkaWZmU3RhcnQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqIEBzZWUgI2RpZmZFbmQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2UgZGlmZlJhbmdlKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCXJldHVybiBkaWZmUmFuZ2UoQXJyYXlzLmFzTGlzdChhcnJheTEpLCBBcnJheXMuYXNMaXN0KGFycmF5MikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyAjZXF1YWxzKCkgbWV0aG9kIHRvIGNvbXBhcmUgdGhlCi0JICogZWxlbWVudHMuCi0JICogQHNlZSAjZGlmZlN0YXJ0KGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuTGlzdCkKLQkgKiBAc2VlICNkaWZmRW5kKGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGRpZmZSYW5nZShMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCWludCBlbmQgPSBkaWZmRW5kKGxpc3QxLCBsaXN0Mik7Ci0JCWlmIChlbmQgPT0gLTEpIHsKLQkJCS8vIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCB0aGUgc3RhcnQgaXMgdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cwotCQkJcmV0dXJuIG5ldyBSYW5nZShsaXN0MS5zaXplKCksIGVuZCk7Ci0JCX0KLQkJLy8gdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQsIGNhbGN1bGF0ZSB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlCi0JCXJldHVybiBuZXcgUmFuZ2UoZGlmZlN0YXJ0KGxpc3QxLCBsaXN0MiksIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBhcnJheXMgKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXgpLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcyBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzaG9ydGVyIGFycmF5IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGFycmF5LCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNob3J0ZXIgYXJyYXkKLQkgKiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2hvcnRlciBhcnJheSkuCi0JICogVXNlIHRoZSBlbGVtZW50cycgI2VxdWFscygpIG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZTdGFydChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlyZXR1cm4gZGlmZlN0YXJ0KEFycmF5cy5hc0xpc3QoYXJyYXkxKSwgQXJyYXlzLmFzTGlzdChhcnJheTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBsaXN0IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGxpc3QsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBsaXN0Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgbGlzdCkuCi0JICogVXNlIHRoZSBlbGVtZW50cycgI2VxdWFscygpIG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZTdGFydChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCWludCBlbmQgPSBNYXRoLm1pbihsaXN0MS5zaXplKCksIGxpc3QyLnNpemUoKSk7Ci0JCWludCBzdGFydCA9IDA7Ci0JCXdoaWxlIChzdGFydCA8IGVuZCkgewotCQkJT2JqZWN0IG8gPSBsaXN0MS5nZXQoc3RhcnQpOwotCQkJaWYgKG8gPT0gbnVsbCkgewotCQkJCWlmIChsaXN0Mi5nZXQoc3RhcnQpID09IG51bGwpIHsKLQkJCQkJc3RhcnQrKzsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoby5lcXVhbHMobGlzdDIuZ2V0KHN0YXJ0KSkpIHsKLQkJCQkJc3RhcnQrKzsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9ycyByZXR1cm4gZXF1YWwgZWxlbWVudHMuCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI2VxdWFscyhqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQl3aGlsZSAoaXRlcmF0b3IxLmhhc05leHQoKSAmJiBpdGVyYXRvcjIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbzEgPSBpdGVyYXRvcjEubmV4dCgpOwotCQkJT2JqZWN0IG8yID0gaXRlcmF0b3IyLm5leHQoKTsKLQkJCWlmICggISAobzEgPT0gbnVsbCA/IG8yID09IG51bGwgOiBvMS5lcXVhbHMobzIpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gISAoaXRlcmF0b3IxLmhhc05leHQoKSB8fCBpdGVyYXRvcjIuaGFzTmV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yI2dldChpbnQgaW5kZXgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRSBnZXQoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGluZGV4KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUUgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpdGVyYXRvci5wcmV2aW91c0luZGV4KCkgPT0gaW5kZXgpIHsKLQkJCQlyZXR1cm4gbmV4dDsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihpbmRleCkgKyAnOicgKyBTdHJpbmcudmFsdWVPZihpdGVyYXRvci5wcmV2aW91c0luZGV4KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5cyBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzLgotCSAqIGphdmEudXRpbC5BcnJheXMjaWRlbnRpY2FsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpZGVudGljYWwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaWYgKGFycmF5MSA9PSBhcnJheTIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhcnJheTEgPT0gbnVsbCB8fCBhcnJheTIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlpZiAoYXJyYXkyLmxlbmd0aCAhPSBsZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheTFbaV0gIT0gYXJyYXkyW2ldKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzIHJldHVybiB0aGUgc2FtZSBlbGVtZW50cy4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjaWRlbnRpY2FsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaWRlbnRpY2FsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXdoaWxlIChpdGVyYXRvcjEuaGFzTmV4dCgpICYmIGl0ZXJhdG9yMi5oYXNOZXh0KCkpIHsKLQkJCWlmIChpdGVyYXRvcjEubmV4dCgpICE9IGl0ZXJhdG9yMi5uZXh0KCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICEgKGl0ZXJhdG9yMS5oYXNOZXh0KCkgfHwgaXRlcmF0b3IyLmhhc05leHQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQsIGJlZ2lubmluZyBhdCB0aGUgZW5kLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIC0xLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgaW4gdGhlIGxvbmdlciBhcnJheS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZkVuZChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlyZXR1cm4gaWRlbnRpdHlEaWZmRW5kKEFycmF5cy5hc0xpc3QoYXJyYXkxKSwgQXJyYXlzLmFzTGlzdChhcnJheTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LCBiZWdpbm5pbmcgYXQgdGhlIGVuZC4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIC0xLgotCSAqIElmIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50IHNpemVzLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQotCSAqIGxhc3QgZWxlbWVudCBpbiB0aGUgbG9uZ2VyIGxpc3QuCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZFbmQoTGlzdDw/PiBsaXN0MSwgTGlzdDw/PiBsaXN0MikgewotCQlpbnQgc2l6ZTEgPSBsaXN0MS5zaXplKCk7Ci0JCWludCBzaXplMiA9IGxpc3QyLnNpemUoKTsKLQkJaWYgKHNpemUxICE9IHNpemUyKSB7Ci0JCQlyZXR1cm4gTWF0aC5tYXgoc2l6ZTEsIHNpemUyKSAtIDE7Ci0JCX0KLQkJaW50IGVuZCA9IHNpemUxIC0gMTsKLQkJd2hpbGUgKGVuZCA+IC0xKSB7Ci0JCQlpZiAobGlzdDEuZ2V0KGVuZCkgPT0gbGlzdDIuZ2V0KGVuZCkpIHsKLQkJCQllbmQtLTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGVuZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqIEBzZWUgI2lkZW50aXR5RGlmZlN0YXJ0KE9iamVjdFtdLCBPYmplY3RbXSkKLQkgKiBAc2VlICNpZGVudGl0eURpZmZFbmQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2UgaWRlbnRpdHlEaWZmUmFuZ2UoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJcmV0dXJuIGlkZW50aXR5RGlmZlJhbmdlKEFycmF5cy5hc0xpc3QoYXJyYXkxKSwgQXJyYXlzLmFzTGlzdChhcnJheTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJhbmdlIG9mIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIFtzaXplLCAtMV0uCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKiBAc2VlICNpZGVudGl0eURpZmZTdGFydChqYXZhLnV0aWwuTGlzdCwgamF2YS51dGlsLkxpc3QpCi0JICogQHNlZSAjaWRlbnRpdHlEaWZmRW5kKGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGlkZW50aXR5RGlmZlJhbmdlKExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJaW50IGVuZCA9IGlkZW50aXR5RGlmZkVuZChsaXN0MSwgbGlzdDIpOwotCQlpZiAoZW5kID09IC0xKSB7Ci0JCQkvLyB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgdGhlIHN0YXJ0IGlzIHRoZSBzaXplIG9mIHRoZSB0d28gbGlzdHMKLQkJCXJldHVybiBuZXcgUmFuZ2UobGlzdDEuc2l6ZSgpLCBlbmQpOwotCQl9Ci0JCS8vIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50LCBjYWxjdWxhdGUgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZQotCQlyZXR1cm4gbmV3IFJhbmdlKGlkZW50aXR5RGlmZlN0YXJ0KGxpc3QxLCBsaXN0MiksIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBhcnJheXMgKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXgpLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcyBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzaG9ydGVyIGFycmF5IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGFycmF5LCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNob3J0ZXIgYXJyYXkKLQkgKiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2hvcnRlciBhcnJheSkuCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZTdGFydChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlyZXR1cm4gaWRlbnRpdHlEaWZmU3RhcnQoQXJyYXlzLmFzTGlzdChhcnJheTEpLCBBcnJheXMuYXNMaXN0KGFycmF5MikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBsaXN0cyB0aGF0IGFyZSBkaWZmZXJlbnQuIElmIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4KLQkgKiB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3RzIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4KS4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBzaXplcyBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzaG9ydGVyIGxpc3QgbWF0Y2ggdGhlaXIgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbgotCSAqIHRoZSBsb25nZXIgbGlzdCwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzaG9ydGVyIGxpc3QKLQkgKiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2hvcnRlciBsaXN0KS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZlN0YXJ0KExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJaW50IGVuZCA9IE1hdGgubWluKGxpc3QxLnNpemUoKSwgbGlzdDIuc2l6ZSgpKTsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7Ci0JCQlpZiAobGlzdDEuZ2V0KHN0YXJ0KSA9PSBsaXN0Mi5nZXQoc3RhcnQpKSB7Ci0JCQkJc3RhcnQrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHN0YXJ0OwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IsCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI2luZGV4T2YoT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpKyspIHsKLQkJCQlpZiAoaXRlcmF0b3IubmV4dCgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGl0ZXJhdG9yLmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjaW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjaW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2luZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmFibGUgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgbGlzdCBhbmQgc3RpbGwga2VlcAotCSAqIHRoZSBsaXN0IHNvcnRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBpbnQgaW5zZXJ0aW9uSW5kZXhPZihMaXN0PEU+IHNvcnRlZExpc3QsIENvbXBhcmFibGU8RT4gdmFsdWUpIHsKLQkJaW50IGxlbiA9IHNvcnRlZExpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAodmFsdWUuY29tcGFyZVRvKHNvcnRlZExpc3QuZ2V0KGkpKSA8IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgc29ydGVkIGxpc3QgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgbGlzdCBzb3J0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gaW50IGluc2VydGlvbkluZGV4T2YoTGlzdDxFPiBzb3J0ZWRMaXN0LCBFIHZhbHVlLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlpbnQgbGVuID0gc29ydGVkTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChjb21wYXJhdG9yLmNvbXBhcmUodmFsdWUsIHNvcnRlZExpc3QuZ2V0KGkpKSA8IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmFibGUgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgYXJyYXkgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgYXJyYXkgc29ydGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IGludCBpbnNlcnRpb25JbmRleE9mKEVbXSBzb3J0ZWRBcnJheSwgQ29tcGFyYWJsZTxFPiB2YWx1ZSkgewotCQlpbnQgbGVuID0gc29ydGVkQXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAodmFsdWUuY29tcGFyZVRvKHNvcnRlZEFycmF5W2ldKSA8IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmFibGUgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgYXJyYXkgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgYXJyYXkgc29ydGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGludCBpbnNlcnRpb25JbmRleE9mKEVbXSBzb3J0ZWRBcnJheSwgRSB2YWx1ZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJaW50IGxlbiA9IHNvcnRlZEFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGNvbXBhcmF0b3IuY29tcGFyZSh2YWx1ZSwgc29ydGVkQXJyYXlbaV0pIDwgMCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgb25lLXVzZSBJdGVyYWJsZSBmb3IgdGhlIEl0ZXJhdG9yIGdpdmVuLgotCSAqIFRocm93cyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaXRlcmFibGUoKSBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogQXMgc3VjaCwgdGhpcyB1dGlsaXR5IHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gb25lLXVzZSBzaXR1YXRpb25zLCBzdWNoIGFzCi0JICogYSAiZm9yIiBsb29wLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFNpbmdsZVVzZUl0ZXJhYmxlPEU+KGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmFibGUgb24gdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNpdGVyYWJsZShPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYWJsZTxFPiBpdGVyYWJsZShFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNpdGVyYXRvcihPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYXRvcjxFPiBpdGVyYXRvcihFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxFPihhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IsCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI2xhc3RJbmRleE9mKE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8gbGlzdChpdGVyYXRvcikubGFzdEluZGV4T2YodmFsdWUpIDogLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IsCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI2xhc3RJbmRleE9mKE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgc2l6ZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGxpc3QoaXRlcmF0b3IsIHNpemUpLmxhc3RJbmRleE9mKHZhbHVlKSA6IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjbGFzdEluZGV4T2YoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJCWlmIChhcnJheVtpXSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogamF2YS51dGlsLkFycmF5cyNsYXN0SW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjbGFzdEluZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIGphdmEubGFuZy5JdGVyYWJsZSN0b0xpc3QoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gbGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGxpc3QoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI3RvTGlzdCgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBsaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGxpc3QoaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI3RvTGlzdCgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBsaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPyBsaXN0KGl0ZXJhdG9yLCBuZXcgQXJyYXlMaXN0PEU+KCkpIDogQ29sbGVjdGlvbnMuPEU+ZW1wdHlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI3RvTGlzdCgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBsaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8gbGlzdChpdGVyYXRvciwgbmV3IEFycmF5TGlzdDxFPihzaXplKSkgOiBDb2xsZWN0aW9ucy48RT5lbXB0eUxpc3QoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gTGlzdDxFPiBsaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgQXJyYXlMaXN0PEU+IGxpc3QpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGlzdC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBVbmxpa2UgamF2YS51dGlsLkFycmF5cy5hc0xpc3QoT2JqZWN0W10pLCB0aGUgbGlzdAotCSAqIGlzIG1vZGlmaWFibGUgYW5kIGlzIG5vdCBiYWNrZWQgYnkgdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gbGlzdChFLi4uIGFycmF5KSB7Ci0JCUxpc3Q8RT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4oYXJyYXkubGVuZ3RoKTsKLQkJZm9yIChFIGl0ZW0gOiBhcnJheSkgewotCQkJbGlzdC5hZGQoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2xpc3RJdGVyYXRvcihPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGxpc3RJdGVyYXRvcihhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotCSAqIGphdmEudXRpbC5BcnJheXMjbGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihFW10gYXJyYXksIGludCBpbmRleCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChhcnJheSkubGlzdEl0ZXJhdG9yKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWF4aW11bSB2YWx1ZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI21heChjaGFyW10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIG1heChjaGFyLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQljaGFyIG1heCA9IGFycmF5WzBdOwotCQkvLyBzdGFydCBhdCAxCi0JCWZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgbmV4dCA9IGFycmF5W2ldOwotCQkJaWYgKG5leHQgPiBtYXgpIHsKLQkJCQltYXggPSBuZXh0OwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbnRlZ2VyIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBtYXhpbXVtIHZhbHVlLgotCSAqIGphdmEudXRpbC5BcnJheXMjbWF4KGludFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IG1heChpbnQuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JCWludCBtYXggPSBhcnJheVswXTsKLQkJLy8gc3RhcnQgYXQgMQotCQlmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpbnQgbmV4dCA9IGFycmF5W2ldOwotCQkJaWYgKG5leHQgPiBtYXgpIHsKLQkJCQltYXggPSBuZXh0OwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG1pbmltdW0gdmFsdWUuCi0JICogamF2YS51dGlsLkFycmF5cyNtaW4oY2hhcltdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBtaW4oY2hhci4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQkJY2hhciBtaW4gPSBhcnJheVswXTsKLQkJLy8gc3RhcnQgYXQgMQotCQlmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIG5leHQgPSBhcnJheVtpXTsKLQkJCWlmIChuZXh0IDwgbWluKSB7Ci0JCQkJbWluID0gbmV4dDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW50ZWdlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWluaW11bSB2YWx1ZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI21pbihpbnRbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBtaW4oaW50Li4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgbWluID0gYXJyYXlbMF07Ci0JCS8vIHN0YXJ0IGF0IDEKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBsZW47IGkrKykgewotCQkJaW50IG5leHQgPSBhcnJheVtpXTsKLQkJCWlmIChuZXh0IDwgbWluKSB7Ci0JCQkJbWluID0gbmV4dDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIE1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI21vdmUoT2JqZWN0W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBtb3ZlKEVbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgPyBhcnJheSA6IG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gbW92ZV8oRVtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlFIHRlbXAgPSBhcnJheVtzb3VyY2VJbmRleF07Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgMSwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIDEsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJYXJyYXlbdGFyZ2V0SW5kZXhdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNtb3ZlKE9iamVjdFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gbW92ZShFW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpZiAobGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQlFW10gdGVtcCA9IG5ld0FycmF5KGFycmF5LCBsZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCwgdGVtcCwgMCwgbGVuZ3RoKTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyBsZW5ndGgsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyBsZW5ndGgsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBhcnJheSwgdGFyZ2V0SW5kZXgsIGxlbmd0aCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNtb3ZlKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIG1vdmUoaW50W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXJldHVybiAodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpID8gYXJyYXkgOiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGFyZ2V0SW5kZXggIT0gc291cmNlSW5kZXgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBtb3ZlXyhpbnRbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJaW50IHRlbXAgPSBhcnJheVtzb3VyY2VJbmRleF07Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgMSwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIDEsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJYXJyYXlbdGFyZ2V0SW5kZXhdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNtb3ZlKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIG1vdmUoaW50W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpZiAobGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQlpbnRbXSB0ZW1wID0gbmV3IGludFtsZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCwgdGVtcCwgMCwgbGVuZ3RoKTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyBsZW5ndGgsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyBsZW5ndGgsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBhcnJheSwgdGFyZ2V0SW5kZXgsIGxlbmd0aCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNtb3ZlKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gbW92ZShjaGFyW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXJldHVybiAodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpID8gYXJyYXkgOiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGFyZ2V0SW5kZXggIT0gc291cmNlSW5kZXgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gbW92ZV8oY2hhcltdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQljaGFyIHRlbXAgPSBhcnJheVtzb3VyY2VJbmRleF07Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgMSwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIDEsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJYXJyYXlbdGFyZ2V0SW5kZXhdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNtb3ZlKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gbW92ZShjaGFyW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpZiAobGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQljaGFyW10gdGVtcCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4LCB0ZW1wLCAwLCBsZW5ndGgpOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIGxlbmd0aCwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIGxlbmd0aCwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIGFycmF5LCB0YXJnZXRJbmRleCwgbGVuZ3RoKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBsaXN0LgotCSAqIGphdmEudXRpbC5MaXN0I21vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBtb3ZlKExpc3Q8RT4gbGlzdCwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgPyBsaXN0IDogbW92ZV8obGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGFyZ2V0SW5kZXggIT0gc291cmNlSW5kZXgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gTGlzdDxFPiBtb3ZlXyhMaXN0PEU+IGxpc3QsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWlmIChsaXN0IGluc3RhbmNlb2YgUmFuZG9tQWNjZXNzKSB7Ci0JCQkvLyBtb3ZlIGVsZW1lbnRzLCBsZWF2aW5nIHRoZSBsaXN0IGluIHBsYWNlCi0JCQlFIHRlbXAgPSBsaXN0LmdldChzb3VyY2VJbmRleCk7Ci0JCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaS0tID4gdGFyZ2V0SW5kZXg7ICkgewotCQkJCQlsaXN0LnNldChpICsgMSwgbGlzdC5nZXQoaSkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpIDwgdGFyZ2V0SW5kZXg7IGkrKykgewotCQkJCQlsaXN0LnNldChpLCBsaXN0LmdldChpICsgMSkpOwotCQkJCX0KLQkJCX0KLQkJCWxpc3Quc2V0KHRhcmdldEluZGV4LCB0ZW1wKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHJlbW92ZSB0aGUgZWxlbWVudCBhbmQgcmUtYWRkIGl0IGF0IHRoZSB0YXJnZXQgaW5kZXgKLQkJCWxpc3QuYWRkKHRhcmdldEluZGV4LCBsaXN0LnJlbW92ZShzb3VyY2VJbmRleCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgbGlzdC4KLQkgKiBqYXZhLnV0aWwuTGlzdCNtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gbW92ZShMaXN0PEU+IGxpc3QsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBsaXN0OwotCQl9Ci0JCWlmIChsZW5ndGggPT0gMSkgewotCQkJcmV0dXJuIG1vdmVfKGxpc3QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJaWYgKGxpc3QgaW5zdGFuY2VvZiBSYW5kb21BY2Nlc3MpIHsKLQkJCS8vIG1vdmUgZWxlbWVudHMsIGxlYXZpbmcgdGhlIGxpc3QgaW4gcGxhY2UKLQkJCUFycmF5TGlzdDxFPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxFPihsaXN0LnN1Ykxpc3Qoc291cmNlSW5kZXgsIHNvdXJjZUluZGV4ICsgbGVuZ3RoKSk7Ci0JCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaS0tID4gdGFyZ2V0SW5kZXg7ICkgewotCQkJCQlsaXN0LnNldChpICsgbGVuZ3RoLCBsaXN0LmdldChpKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gc291cmNlSW5kZXg7IGkgPCB0YXJnZXRJbmRleDsgaSsrKSB7Ci0JCQkJCWxpc3Quc2V0KGksIGxpc3QuZ2V0KGkgKyBsZW5ndGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJbGlzdC5zZXQodGFyZ2V0SW5kZXggKyBpLCB0ZW1wLmdldChpKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyByZW1vdmUgdGhlIGVsZW1lbnRzIGFuZCByZS1hZGQgdGhlbSBhdCB0aGUgdGFyZ2V0IGluZGV4Ci0JCQlsaXN0LmFkZEFsbCh0YXJnZXRJbmRleCwgcmVtb3ZlRWxlbWVudHNBdEluZGV4KGxpc3QsIHNvdXJjZUluZGV4LCBsZW5ndGgpKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIG9sZCB2YWx1ZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXBsYWNlQWxsKE9iamVjdFtdIGFycmF5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVwbGFjZUFsbChFW10gYXJyYXksIE9iamVjdCBvbGRWYWx1ZSwgRSBuZXdWYWx1ZSkgewotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJYXJyYXlbaV0gPSBuZXdWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAob2xkVmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlhcnJheVtpXSA9IG5ld1ZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvbGQgdmFsdWUgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVwbGFjZUFsbChpbnRbXSBhcnJheSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZXBsYWNlQWxsKGludFtdIGFycmF5LCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSBvbGRWYWx1ZSkgewotCQkJCWFycmF5W2ldID0gbmV3VmFsdWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlcGxhY2VBbGwoY2hhcltdIGFycmF5LCBjaGFyIG9sZFZhbHVlLCBjaGFyIG5ld1ZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlcGxhY2VBbGwoY2hhcltdIGFycmF5LCBjaGFyIG9sZFZhbHVlLCBjaGFyIG5ld1ZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IG9sZFZhbHVlKSB7Ci0JCQkJYXJyYXlbaV0gPSBuZXdWYWx1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZShFW10gYXJyYXksIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGluZGV4T2YoYXJyYXksIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmUoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgaW5kZXhPZihhcnJheSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmUoaW50W10gYXJyYXksIGludCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZShpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgaW5kZXhPZihhcnJheSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZW1vdmVBbGwoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI3JlbW92ZUFsbChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI3JlbW92ZUFsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGNvbGxlY3Rpb24ucmVtb3ZlQWxsKHNldChpdGVyYXRvcikpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jcmVtb3ZlQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGNvbGxlY3Rpb24ucmVtb3ZlQWxsKHNldChpdGVyYXRvciwgc2l6ZSkpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jcmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3RbXSBhcnJheSkgewotCQlyZXR1cm4gY29sbGVjdGlvbi5yZW1vdmVBbGwoc2V0KGFycmF5KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IHJlbW92ZUFsbF8oYXJyYXksIHNldChpdGVyYXRvcikpIDogYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYXRvciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8gcmVtb3ZlQWxsXyhhcnJheSwgc2V0KGl0ZXJhdG9yLCBzaXplKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSA/IGFycmF5IDogcmVtb3ZlQWxsXyhhcnJheSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJlbW92ZUFsbChhcnJheSwgY29sbGVjdGlvbiwgYXJyYXlMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkgYW5kIGFycmF5TGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXlMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotCQkJaWYgKCAhIGNvbGxlY3Rpb24uY29udGFpbnMoYXJyYXlbaV0pKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgaik7Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQkvLyBjb252ZXJ0IHRvIGEgYmFnIHRvIHRha2UgYWR2YW50YWdlIG9mIGhhc2hlZCBsb29rLXVwCi0JCXJldHVybiAoYXJyYXkyLmxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IHJlbW92ZUFsbF8oYXJyYXkxLCBzZXQoYXJyYXkyKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpIHsKLQkJaWYgKGFycmF5Mi5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5MTsKLQkJfQotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJaWYgKGFycmF5MUxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5MUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheTFMZW5ndGg7IGkrKykgewotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5MiwgYXJyYXkxW2ldKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXkxTGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5MVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MikgewotCQlpZiAoYXJyYXkyLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOwotCQl9Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlpZiAoYXJyYXkxTGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTE7Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5MUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoICEgY29udGFpbnMoYXJyYXkyLCBhcnJheTFbaV0pKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheTFMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTE7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5MVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZW1vdmVBbGxPY2N1cnJlbmNlcyhPYmplY3QgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbE9jY3VycmVuY2VzKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgT2JqZWN0IHZhbHVlKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8Pz4gc3RyZWFtID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoc3RyZWFtLm5leHQoKSA9PSBudWxsKSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIG9jY3VycmVuY2VzIG9mCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbE9jY3VycmVuY2VzKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbE9jY3VycmVuY2VzKEVbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGFycmF5TGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldICE9IG51bGwpIHsKLQkJCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoICEgdmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgaik7Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIG9jY3VycmVuY2VzIG9mCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoYXJyYXlMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldICE9IHZhbHVlKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgb2NjdXJyZW5jZXMgb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlQWxsT2NjdXJyZW5jZXMoaW50W10gYXJyYXksIGludCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUFsbE9jY3VycmVuY2VzKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoYXJyYXlMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldICE9IHZhbHVlKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUVsZW1lbnRBdEluZGV4KE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUVsZW1lbnRBdEluZGV4KEVbXSBhcnJheSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50c0F0SW5kZXgoYXJyYXksIGluZGV4LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVFbGVtZW50QXRJbmRleChjaGFyW10gYXJyYXksIGludCBpbmRleCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVFbGVtZW50QXRJbmRleChjaGFyW10gYXJyYXksIGludCBpbmRleCkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGFycmF5LCBpbmRleCwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlRWxlbWVudEF0SW5kZXgoaW50W10gYXJyYXksIGludCBpbmRleCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUVsZW1lbnRBdEluZGV4KGludFtdIGFycmF5LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRzQXRJbmRleChhcnJheSwgaW5kZXgsIDEpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgZWxlbWVudHMuCi0JICogamF2YS51dGlsLkxpc3QjcmVtb3ZlKGludCBpbmRleCwgaW50IGxlbmd0aCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJlbW92ZUVsZW1lbnRzQXRJbmRleChMaXN0PEU+IGxpc3QsIGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQlMaXN0PEU+IHN1Ykxpc3QgPSBsaXN0LnN1Ykxpc3QoaW5kZXgsIGluZGV4ICsgbGVuZ3RoKTsKLQkJQXJyYXlMaXN0PEU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RT4oc3ViTGlzdCk7Ci0JCXN1Ykxpc3QuY2xlYXIoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50cyByZW1vdmVkLgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlRWxlbWVudHNBdEluZGV4KE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUVsZW1lbnRzQXRJbmRleChFW10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWludCBuZXdMZW5ndGggPSBhcnJheUxlbmd0aCAtIGxlbmd0aDsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBuZXdMZW5ndGgpOwotCQlpZiAoKG5ld0xlbmd0aCA9PSAwKSAmJiAoaW5kZXggPT0gMCkpIHsKLQkJCXJldHVybiByZXN1bHQ7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCArIGxlbmd0aCwgcmVzdWx0LCBpbmRleCwgbmV3TGVuZ3RoIC0gaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIHJlbW92ZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVFbGVtZW50QXRJbmRleChjaGFyW10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVFbGVtZW50c0F0SW5kZXgoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpbnQgbmV3TGVuZ3RoID0gYXJyYXlMZW5ndGggLSBsZW5ndGg7Ci0JCWlmICgobmV3TGVuZ3RoID09IDApICYmIChpbmRleCA9PSAwKSkgewotCQkJcmV0dXJuIEVNUFRZX0NIQVJfQVJSQVk7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltuZXdMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyBsZW5ndGgsIHJlc3VsdCwgaW5kZXgsIG5ld0xlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVNUFRZX0NIQVJfQVJSQVkgPSBuZXcgY2hhclswXTsKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIHJlbW92ZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVFbGVtZW50QXRJbmRleChpbnRbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGludFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpbnQgbmV3TGVuZ3RoID0gYXJyYXlMZW5ndGggLSBsZW5ndGg7Ci0JCWlmICgobmV3TGVuZ3RoID09IDApICYmIChpbmRleCA9PSAwKSkgewotCQkJcmV0dXJuIEVNUFRZX0lOVF9BUlJBWTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtuZXdMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyBsZW5ndGgsIHJlc3VsdCwgaW5kZXgsIG5ld0xlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gRU1QVFlfSU5UX0FSUkFZID0gbmV3IGludFswXTsKLQotCS8qKgotCSAqIFJlbW92ZSBhbnkgZHVwbGljYXRlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiB3aGlsZSBtYWludGFpbmluZyB0aGUgb3JkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKEUuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCUxpc3Q8RT4gbGlzdCA9IHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKEFycmF5cy5hc0xpc3QoYXJyYXkpLCBsZW4pOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ld0FycmF5KGFycmF5LCBsaXN0LnNpemUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbnkgZHVwbGljYXRlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBsaXN0LAotCSAqIHdoaWxlIG1haW50YWluaW5nIHRoZSBvcmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKExpc3Q8RT4gbGlzdCkgewotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlpZiAoKHNpemUgPT0gMCkgfHwgKHNpemUgPT0gMSkpIHsKLQkJCXJldHVybiBsaXN0OwotCQl9Ci0JCXJldHVybiByZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0LCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgbGlzdCBpcyBub24tZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gTGlzdDxFPiByZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhMaXN0PEU+IGxpc3QsIGludCBzaXplKSB7Ci0JCUxpc3Q8RT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxFPihzaXplKTsKLQkJU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PEU+KHNpemUpOwkJLy8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFzaGVkIGxvb2stdXAKLQkJZm9yIChFIGl0ZW0gOiBsaXN0KSB7Ci0JCQlpZiAoc2V0LmFkZChpdGVtKSkgewotCQkJCXJlc3VsdC5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI3JldGFpbkFsbChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiByZXRhaW5BbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIG9ubHkgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZXRhaW5BbGwoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHJldGFpbkFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI3JldGFpbkFsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBjb2xsZWN0aW9uLnJldGFpbkFsbChzZXQoaXRlcmF0b3IpKTsKLQkJfQotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jcmV0YWluQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBjb2xsZWN0aW9uLnJldGFpbkFsbChzZXQoaXRlcmF0b3IsIHNpemUpKTsKLQkJfQotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jcmV0YWluQWxsKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3RbXSBhcnJheSkgewotCQlpZiAoYXJyYXkubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIGNvbGxlY3Rpb24ucmV0YWluQWxsKHNldChhcnJheSkpOwotCQl9Ci0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmV0YWluQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYXRvciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJldGFpbkFsbChhcnJheSwgYXJyYXlMZW5ndGgsIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYXRvciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYXRvciwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5TGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgaW50IGFycmF5TGVuZ3RoLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPwotCQkJCXJldGFpbkFsbF8oYXJyYXksIHNldChpdGVyYXRvciksIGFycmF5TGVuZ3RoKQotCQkJOgotCQkJCW5ld0FycmF5KGFycmF5LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXlMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBpbnQgYXJyYXlMZW5ndGgsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/Ci0JCQkJcmV0YWluQWxsXyhhcnJheSwgc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBhcnJheUxlbmd0aCkKLQkJCToKLQkJCQluZXdBcnJheShhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGFycmF5IDogcmV0YWluQWxsKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5TGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJcmV0dXJuIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgPwotCQkJCW5ld0FycmF5KGFycmF5LCAwKQotCQkJOgotCQkJCXJldGFpbkFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkgYW5kIGFycmF5TGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb2xsZWN0aW9uLmNvbnRhaW5zKGFycmF5W2ldKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXlMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTsgIC8vIGV2ZXJ5dGhpbmcgd2FzIHJldGFpbmVkCi0JCX0KLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBqKTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmV0YWluQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mi5sZW5ndGggPT0gMCkgPwotCQkJCShhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBuZXdBcnJheShhcnJheTEsIDApCi0JCQk6Ci0JCQkJcmV0YWluQWxsKGFycmF5MSwgc2V0KGFycmF5MiksIGFycmF5MUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmV0YWluQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmV0YWluQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8gYXJyYXkxIDogcmV0YWluQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTFMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHJldGFpbkFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoKSB7Ci0JCWludCBhcnJheTJMZW5ndGggPSBhcnJheTIubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IEVNUFRZX0NIQVJfQVJSQVkgOiByZXRhaW5BbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkxTGVuZ3RoID4gMCBhbmQgYXJyYXkyTGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSByZXRhaW5BbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheTFMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkxTGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb250YWlucyhhcnJheTIsIGFycmF5MVtpXSwgYXJyYXkyTGVuZ3RoKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXkxTGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOyAgLy8gZXZlcnl0aGluZyB3YXMgcmV0YWluZWQKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheTFbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXRhaW5BbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZXRhaW5BbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8gYXJyYXkxIDogcmV0YWluQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTFMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gcmV0YWluQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoKSB7Ci0JCWludCBhcnJheTJMZW5ndGggPSBhcnJheTIubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IEVNUFRZX0lOVF9BUlJBWSA6IHJldGFpbkFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTFMZW5ndGggPiAwIGFuZCBhcnJheTJMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gcmV0YWluQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5MUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheTFMZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbnRhaW5zKGFycmF5MiwgYXJyYXkxW2ldLCBhcnJheTJMZW5ndGgpKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheTFMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTE7ICAvLyBldmVyeXRoaW5nIHdhcyByZXRhaW5lZAotCQl9Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheTFbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IHJldmVyc2VkLgotCSAqIGphdmEudXRpbC5BcnJheXMucmV2ZXJzZShPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV2ZXJzZShFLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwLCBtaWQgPSBsZW4gPj4gMSwgaiA9IGxlbiAtIDE7IGkgPCBtaWQ7IGkrKywgai0tKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCBqKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSByZXZlcnNlZC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzLnJldmVyc2UoY2hhcltdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJldmVyc2UoY2hhci4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMCwgbWlkID0gbGVuID4+IDEsIGogPSBsZW4gLSAxOyBpIDwgbWlkOyBpKyssIGotLSkgewotCQkJc3dhcChhcnJheSwgaSwgaik7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgcmV2ZXJzZWQuCi0JICogamF2YS51dGlsLkFycmF5cy5yZXZlcnNlKGludFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmV2ZXJzZShpbnQuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDAsIG1pZCA9IGxlbiA+PiAxLCBqID0gbGVuIC0gMTsgaSA8IG1pZDsgaSsrLCBqLS0pIHsKLQkJCXN3YXAoYXJyYXksIGksIGopOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHdpdGggZW50cmllcyBpbiByZXZlcnNlIG9yZGVyIGZyb20gdGhvc2UKLQkgKiByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiByZXZlcnNlKGxpc3QoaXRlcmFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHdpdGggZW50cmllcyBpbiByZXZlcnNlIG9yZGVyIGZyb20gdGhvc2UKLQkgKiByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gcmV2ZXJzZShsaXN0KGl0ZXJhYmxlLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCB3aXRoIGVudHJpZXMgaW4gcmV2ZXJzZSBvcmRlciBmcm9tIHRob3NlCi0JICogcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJldmVyc2VMaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gcmV2ZXJzZShsaXN0KGl0ZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCB3aXRoIGVudHJpZXMgaW4gcmV2ZXJzZSBvcmRlciBmcm9tIHRob3NlCi0JICogcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJldmVyc2VMaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHJldmVyc2UobGlzdChpdGVyYXRvciwgc2l6ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCBvbmUgcG9zaXRpb24uCi0JICogamF2YS51dGlsLkFycmF5cy5yb3RhdGUoT2JqZWN0W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJvdGF0ZShFLi4uIGFycmF5KSB7Ci0JCXJldHVybiByb3RhdGUoYXJyYXksIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlLgotCSAqIGphdmEudXRpbC5BcnJheXMucm90YXRlKE9iamVjdFtdIGFycmF5LCBpbnQgZGlzdGFuY2UpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJvdGF0ZShFW10gYXJyYXksIGludCBkaXN0YW5jZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZGlzdGFuY2UgPSBkaXN0YW5jZSAlIGxlbjsKLQkJaWYgKGRpc3RhbmNlIDwgMCkgewotCQkJZGlzdGFuY2UgKz0gbGVuOwotCQl9Ci0JCWlmIChkaXN0YW5jZSA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgY3ljbGVTdGFydCA9IDAsIG5Nb3ZlZCA9IDA7IG5Nb3ZlZCAhPSBsZW47IGN5Y2xlU3RhcnQrKykgewotCQkJRSBkaXNwbGFjZWQgPSBhcnJheVtjeWNsZVN0YXJ0XTsKLQkJCWludCBpID0gY3ljbGVTdGFydDsKLQkJCWRvIHsKLQkJCQlpICs9IGRpc3RhbmNlOwotCQkJCWlmIChpID49IGxlbikgewotCQkJCQlpIC09IGxlbjsKLQkJCQl9Ci0JCQkJRSB0ZW1wID0gYXJyYXlbaV07Ci0JCQkJYXJyYXlbaV0gPSBkaXNwbGFjZWQ7Ci0JCQkJZGlzcGxhY2VkID0gdGVtcDsKLQkJCQluTW92ZWQgKys7Ci0JCQl9IHdoaWxlIChpICE9IGN5Y2xlU3RhcnQpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgb25lIHBvc2l0aW9uLgotCSAqIGphdmEudXRpbC5BcnJheXMucm90YXRlKGNoYXJbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByb3RhdGUoY2hhci4uLiBhcnJheSkgewotCQlyZXR1cm4gcm90YXRlKGFycmF5LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgdGhlIHNwZWNpZmllZCBkaXN0YW5jZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzLnJvdGF0ZShjaGFyW10gYXJyYXksIGludCBkaXN0YW5jZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByb3RhdGUoY2hhcltdIGFycmF5LCBpbnQgZGlzdGFuY2UpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWRpc3RhbmNlID0gZGlzdGFuY2UgJSBsZW47Ci0JCWlmIChkaXN0YW5jZSA8IDApIHsKLQkJCWRpc3RhbmNlICs9IGxlbjsKLQkJfQotCQlpZiAoZGlzdGFuY2UgPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGN5Y2xlU3RhcnQgPSAwLCBuTW92ZWQgPSAwOyBuTW92ZWQgIT0gbGVuOyBjeWNsZVN0YXJ0KyspIHsKLQkJCWNoYXIgZGlzcGxhY2VkID0gYXJyYXlbY3ljbGVTdGFydF07Ci0JCQlpbnQgaSA9IGN5Y2xlU3RhcnQ7Ci0JCQlkbyB7Ci0JCQkJaSArPSBkaXN0YW5jZTsKLQkJCQlpZiAoaSA+PSBsZW4pIHsKLQkJCQkJaSAtPSBsZW47Ci0JCQkJfQotCQkJCWNoYXIgdGVtcCA9IGFycmF5W2ldOwotCQkJCWFycmF5W2ldID0gZGlzcGxhY2VkOwotCQkJCWRpc3BsYWNlZCA9IHRlbXA7Ci0JCQkJbk1vdmVkICsrOwotCQkJfSB3aGlsZSAoaSAhPSBjeWNsZVN0YXJ0KTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IG9uZSBwb3NpdGlvbi4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzLnJvdGF0ZShpbnRbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJvdGF0ZShpbnQuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHJvdGF0ZShhcnJheSwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IHRoZSBzcGVjaWZpZWQgZGlzdGFuY2UuCi0JICogamF2YS51dGlsLkFycmF5cy5yb3RhdGUoaW50W10gYXJyYXksIGludCBkaXN0YW5jZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJvdGF0ZShpbnRbXSBhcnJheSwgaW50IGRpc3RhbmNlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlkaXN0YW5jZSA9IGRpc3RhbmNlICUgbGVuOwotCQlpZiAoZGlzdGFuY2UgPCAwKSB7Ci0JCQlkaXN0YW5jZSArPSBsZW47Ci0JCX0KLQkJaWYgKGRpc3RhbmNlID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBjeWNsZVN0YXJ0ID0gMCwgbk1vdmVkID0gMDsgbk1vdmVkICE9IGxlbjsgY3ljbGVTdGFydCsrKSB7Ci0JCQlpbnQgZGlzcGxhY2VkID0gYXJyYXlbY3ljbGVTdGFydF07Ci0JCQlpbnQgaSA9IGN5Y2xlU3RhcnQ7Ci0JCQlkbyB7Ci0JCQkJaSArPSBkaXN0YW5jZTsKLQkJCQlpZiAoaSA+PSBsZW4pIHsKLQkJCQkJaSAtPSBsZW47Ci0JCQkJfQotCQkJCWludCB0ZW1wID0gYXJyYXlbaV07Ci0JCQkJYXJyYXlbaV0gPSBkaXNwbGFjZWQ7Ci0JCQkJZGlzcGxhY2VkID0gdGVtcDsKLQkJCQluTW92ZWQgKys7Ci0JCQl9IHdoaWxlIChpICE9IGN5Y2xlU3RhcnQpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIGphdmEudXRpbC5IYXNoU2V0KGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gc2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gc2V0KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogamF2YS51dGlsLkhhc2hTZXQoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBzZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gc2V0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkhhc2hTZXQoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBzZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBzZXQoaXRlcmF0b3IsIG5ldyBIYXNoU2V0PEU+KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkhhc2hTZXQoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBzZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gc2V0KGl0ZXJhdG9yLCBuZXcgSGFzaFNldDxFPihzaXplKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IFNldDxFPiBzZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBIYXNoU2V0PEU+IHNldCkgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlzZXQuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIGphdmEudXRpbC5IYXNoU2V0KE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBzZXQoRS4uLiBhcnJheSkgewotCQlTZXQ8RT4gc2V0ID0gbmV3IEhhc2hTZXQ8RT4oYXJyYXkubGVuZ3RoKTsKLQkJZm9yIChFIGl0ZW0gOiBhcnJheSkgewotCQkJc2V0LmFkZChpdGVtKTsKLQkJfQotCQlyZXR1cm4gc2V0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSBSQU5ET00gPSBuZXcgUmFuZG9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyICJzaHVmZmxpbmciIGl0LgotCSAqIGphdmEudXRpbC5BcnJheXMjc2h1ZmZsZShPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc2h1ZmZsZShFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBzaHVmZmxlKGFycmF5LCBSQU5ET00pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogamF2YS51dGlsLkFycmF5cyNzaHVmZmxlKE9iamVjdFtdIGFycmF5LCBSYW5kb20gcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc2h1ZmZsZShFW10gYXJyYXksIFJhbmRvbSByYW5kb20pIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJc3dhcChhcnJheSwgaSwgcmFuZG9tLm5leHRJbnQobGVuKSk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogamF2YS51dGlsLkFycmF5cyNzaHVmZmxlKGNoYXJbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzaHVmZmxlKGNoYXIuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHNodWZmbGUoYXJyYXksIFJBTkRPTSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3NodWZmbGUoY2hhcltdIGFycmF5LCBSYW5kb20gcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzaHVmZmxlKGNoYXJbXSBhcnJheSwgUmFuZG9tIHJhbmRvbSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCByYW5kb20ubmV4dEludChsZW4pKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3NodWZmbGUoaW50W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzaHVmZmxlKGludC4uLiBhcnJheSkgewotCQlyZXR1cm4gc2h1ZmZsZShhcnJheSwgUkFORE9NKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyICJzaHVmZmxpbmciIGl0LgotCSAqIGphdmEudXRpbC5BcnJheXMjc2h1ZmZsZShpbnRbXSBhcnJheSwgUmFuZG9tIHIpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzaHVmZmxlKGludFtdIGFycmF5LCBSYW5kb20gcmFuZG9tKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCXN3YXAoYXJyYXksIGksIHJhbmRvbS5uZXh0SW50KGxlbikpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNpbmdsZSwKLQkgKiBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIE9iamVjdCN0b0l0ZXJhdG9yKCkgPyEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYXRvcjxFPiBzaW5nbGV0b25JdGVyYXRvcihFIHZhbHVlKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIGphdmEubGFuZy5JdGVyYWJsZSNzaXplKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBzaXplKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBzaXplKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI3NpemUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNpemUoSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJaW50IHNpemUgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlzaXplKys7Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogamF2YS51dGlsLlRyZWVTZXQoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFNvcnRlZFNldDxFPiBzb3J0ZWRTZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmFibGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIGphdmEudXRpbC5UcmVlU2V0KGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBTb3J0ZWRTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYWJsZSwgc2l6ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBhbmQgY29tcGFyYXRvci4KLQkgKiBqYXZhLnV0aWwuVHJlZVNldChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUsIGphdmEudXRpbC5Db21wYXJhdG9yIGMpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gU29ydGVkU2V0PEU+IHNvcnRlZFNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgY29tcGFyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBhbmQgY29tcGFyYXRvci4KLQkgKiBqYXZhLnV0aWwuVHJlZVNldChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUsIGphdmEudXRpbC5Db21wYXJhdG9yIGMpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gU29ydGVkU2V0PEU+IHNvcnRlZFNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBzaXplLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlyZXR1cm4gc29ydGVkU2V0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUsIGNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIGphdmEudXRpbC5UcmVlU2V0KGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBTb3J0ZWRTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gc29ydGVkU2V0KGl0ZXJhdG9yLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBqYXZhLnV0aWwuVHJlZVNldChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gU29ydGVkU2V0PEU+IHNvcnRlZFNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmF0b3IsIHNpemUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogYW5kIGNvbXBhcmF0b3IuCi0JICogamF2YS51dGlsLlRyZWVTZXQoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yLCBqYXZhLnV0aWwuQ29tcGFyYXRvciBjKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFNvcnRlZFNldDxFPiBzb3J0ZWRTZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlyZXR1cm4gc29ydGVkU2V0KGxpc3QoaXRlcmF0b3IpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIGphdmEudXRpbC5UcmVlU2V0KGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvciwgamF2YS51dGlsLkNvbXBhcmF0b3IgYykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBTb3J0ZWRTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQobGlzdChpdGVyYXRvciwgc2l6ZSksIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBTb3J0ZWRTZXQ8RT4gc29ydGVkU2V0KExpc3Q8RT4gbGlzdCwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJU29ydGVkU2V0PEU+IHNvcnRlZFNldCA9IG5ldyBUcmVlU2V0PEU+KGNvbXBhcmF0b3IpOwotCQlzb3J0ZWRTZXQuYWRkQWxsKGxpc3QpOwotCQlyZXR1cm4gc29ydGVkU2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIGphdmEudXRpbC5UcmVlU2V0KE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFNvcnRlZFNldDxFPiBzb3J0ZWRTZXQoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gc29ydGVkU2V0KGFycmF5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIGphdmEudXRpbC5UcmVlU2V0KE9iamVjdFtdIGFycmF5LCBqYXZhLnV0aWwuQ29tcGFyYXRvciBjKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFNvcnRlZFNldDxFPiBzb3J0ZWRTZXQoRVtdIGFycmF5LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlTb3J0ZWRTZXQ8RT4gc29ydGVkU2V0ID0gbmV3IFRyZWVTZXQ8RT4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChhcnJheSkpOwotCQlyZXR1cm4gc29ydGVkU2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1hcnJheSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkCi0JICogcG9zaXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3N1YkFycmF5KEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzdWJBcnJheShFW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGxlbmd0aCk7Ci0JCWlmIChsZW5ndGggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzdGFydCwgcmVzdWx0LCAwLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLWFycmF5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXksIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQKLQkgKiBwb3NpdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIGphdmEudXRpbC5BcnJheXMjc3ViQXJyYXkoaW50W10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHN1YkFycmF5KGludFtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsZW5ndGhdOwotCQlpZiAobGVuZ3RoID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc3RhcnQsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1hcnJheSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkCi0JICogcG9zaXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3N1YkFycmF5KGNoYXJbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHN1YkFycmF5KGNoYXJbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlpZiAobGVuZ3RoID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc3RhcnQsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBoYXZlIGJlZW4gInN3YXBwZWQiLgotCSAqIGphdmEudXRpbC5BcnJheXMjc3dhcChPYmplY3RbXSBhcnJheSwgaW50IGksIGludCBqKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzd2FwKEVbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCUUgdGVtcCA9IGFycmF5W2ldOwotCQlhcnJheVtpXSA9IGFycmF5W2pdOwotCQlhcnJheVtqXSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgaGF2ZSBiZWVuICJzd2FwcGVkIi4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3N3YXAoY2hhcltdIGFycmF5LCBpbnQgaSwgaW50IGopCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc3dhcChjaGFyW10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQljaGFyIHRlbXAgPSBhcnJheVtpXTsKLQkJYXJyYXlbaV0gPSBhcnJheVtqXTsKLQkJYXJyYXlbal0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogamF2YS51dGlsLkFycmF5cyNzd2FwKGludFtdIGFycmF5LCBpbnQgaSwgaW50IGopCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzd2FwKGludFtdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJaW50IHRlbXAgPSBhcnJheVtpXTsKLQkJYXJyYXlbaV0gPSBhcnJheVtqXTsKLQkJYXJyYXlbal0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbGVnYWN5IGNvZGUgdGhhdCByZXF1aXJlcyBhIGphdmEudXRpbC5WZWN0b3IuCi0JICogamF2YS51dGlsLlZlY3RvcihqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHZlY3RvcihpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEgamF2YS51dGlsLlZlY3Rvci4KLQkgKiBqYXZhLnV0aWwuVmVjdG9yKGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHZlY3RvcihpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEgamF2YS51dGlsLlZlY3Rvci4KLQkgKiBqYXZhLnV0aWwuVmVjdG9yKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gdmVjdG9yKGl0ZXJhdG9yLCBuZXcgVmVjdG9yPEU+KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSBqYXZhLnV0aWwuVmVjdG9yLgotCSAqIGphdmEudXRpbC5WZWN0b3IoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFZlY3RvcjxFPiB2ZWN0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gdmVjdG9yKGl0ZXJhdG9yLCBuZXcgVmVjdG9yPEU+KHNpemUpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIFZlY3RvcjxFPiB2KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXYuYWRkRWxlbWVudChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSBqYXZhLnV0aWwuVmVjdG9yLgotCSAqIGphdmEudXRpbC5WZWN0b3IoT2JqZWN0W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihFLi4uIGFycmF5KSB7Ci0JCVZlY3RvcjxFPiB2ID0gbmV3IFZlY3RvcjxFPihhcnJheS5sZW5ndGgpOwotCQlmb3IgKEUgaXRlbSA6IGFycmF5KSB7Ci0JCQl2LmFkZEVsZW1lbnQoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZS11c2UgSXRlcmFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpcyBhIG9uZS10aW1lIHVzZSBpdGVyYWJsZSB0aGF0IGNhbiByZXR1cm4gYSBzaW5nbGUgaXRlcmF0b3IuCi0JICogT25jZSB0aGUgaXRlcmF0b3IgaXMgcmV0dXJuZWQgdGhlIGl0ZXJhYmxlIGlzIG5vIGxvbmdlciB2YWxpZC4KLQkgKiBBcyBzdWNoLCB0aGlzIHV0aWxpdHkgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBvbmUtdGltZSB1c2Ugc2l0dWF0aW9ucywKLQkgKiBzdWNoIGFzIGEgJ2Zvci1lYWNoJyBsb29wLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xlVXNlSXRlcmFibGU8RT4gaW1wbGVtZW50cyBJdGVyYWJsZTxFPiB7Ci0JCXByaXZhdGUgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0KLQkJcHVibGljIFNpbmdsZVVzZUl0ZXJhYmxlKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCWlmIChpdGVyYXRvciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLml0ZXJhdG9yID0gbmV3IEdlbmVyaWNJdGVyYXRvcldyYXBwZXI8RT4oaXRlcmF0b3IpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQkJaWYgKHRoaXMuaXRlcmF0b3IgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlJdGVyYXRvcjxFPiByZXN1bHQgPSB0aGlzLml0ZXJhdG9yOwotCQkJdGhpcy5pdGVyYXRvciA9IG51bGw7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGphdmEudXRpbC5Db2xsZWN0aW9ucyBlbmhhbmNlbWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBsaXN0IGFmdGVyIHRoZSBzb3VyY2UgbGlzdCBoYXMgYmVlbiBjb3BpZWQgaW50byBpdC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNjb3B5KGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PD8gc3VwZXIgRT4gY29weShMaXN0PD8gc3VwZXIgRT4gZGVzdCwgTGlzdDw/IGV4dGVuZHMgRT4gc3JjKSB7Ci0JCUNvbGxlY3Rpb25zLmNvcHkoZGVzdCwgc3JjKTsKLQkJcmV0dXJuIGRlc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI2ZpbGwoamF2YS51dGlsLkxpc3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDw/IHN1cGVyIEU+IGZpbGwoTGlzdDw/IHN1cGVyIEU+IGxpc3QsIEUgdmFsdWUpIHsKLQkJQ29sbGVjdGlvbnMuZmlsbChsaXN0LCB2YWx1ZSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAicmV2ZXJzZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI3JldmVyc2UoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiByZXZlcnNlKExpc3Q8RT4gbGlzdCkgewotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInJvdGF0ZWQiIGJ5IG9uZSBwb3NpdGlvbi4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNyb3RhdGUoamF2YS51dGlsLkxpc3QsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJvdGF0ZShMaXN0PEU+IGxpc3QpIHsKLQkJcmV0dXJuIHJvdGF0ZShsaXN0LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInJvdGF0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI3JvdGF0ZShqYXZhLnV0aWwuTGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcm90YXRlKExpc3Q8RT4gbGlzdCwgaW50IGRpc3RhbmNlKSB7Ci0JCUNvbGxlY3Rpb25zLnJvdGF0ZShsaXN0LCBkaXN0YW5jZSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAic2h1ZmZsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NodWZmbGUoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzaHVmZmxlKExpc3Q8RT4gbGlzdCkgewotCQlDb2xsZWN0aW9ucy5zaHVmZmxlKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInNodWZmbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzaHVmZmxlKGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuUmFuZG9tKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gc2h1ZmZsZShMaXN0PEU+IGxpc3QsIFJhbmRvbSByYW5kb20pIHsKLQkJQ29sbGVjdGlvbnMuc2h1ZmZsZShsaXN0LCByYW5kb20pOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc29ydChqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBMaXN0PEU+IHNvcnQoTGlzdDxFPiBsaXN0KSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzb3J0KGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuQ29tcGFyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHNvcnQoTGlzdDxFPiBsaXN0LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIGNvbXBhcmF0b3IpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZXJhYmxlIGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IEl0ZXJhYmxlPEU+IHNvcnQoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNvcnQoaXRlcmFibGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmFibGUgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmFibGU8RT4gc29ydChJdGVyYWJsZTxFPiBpdGVyYWJsZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQobGlzdChpdGVyYWJsZSksIGNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gSXRlcmF0b3I8RT4gc29ydChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQoaXRlcmF0b3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmF0b3I8RT4gc29ydChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0KGxpc3QoaXRlcmF0b3IpLCBjb21wYXJhdG9yKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3dhcChqYXZhLnV0aWwuTGlzdCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzd2FwKExpc3Q8RT4gbGlzdCwgaW50IGksIGludCBqKSB7Ci0JCUNvbGxlY3Rpb25zLnN3YXAobGlzdCwgaSwgaik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqYXZhLnV0aWwuQXJyYXlzIGVuaGFuY2VtZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGJvb2xlYW5bXSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW5bXSBmaWxsKGJvb2xlYW5bXSBhcnJheSwgYm9vbGVhbiB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChib29sZWFuW10sIGludCwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbltdIGZpbGwoYm9vbGVhbltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgYm9vbGVhbiB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGJ5dGVbXSwgYnl0ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBmaWxsKGJ5dGVbXSBhcnJheSwgYnl0ZSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChieXRlW10sIGludCwgaW50LCBieXRlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGZpbGwoYnl0ZVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgYnl0ZSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGNoYXJbXSwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmaWxsKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChjaGFyW10sIGludCwgaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGZpbGwoY2hhcltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgY2hhciB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGRvdWJsZVtdLCBkb3VibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBkb3VibGVbXSBmaWxsKGRvdWJsZVtdIGFycmF5LCBkb3VibGUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoZG91YmxlW10sIGludCwgaW50LCBkb3VibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBkb3VibGVbXSBmaWxsKGRvdWJsZVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoZmxvYXRbXSwgZmxvYXQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIGZpbGwoZmxvYXRbXSBhcnJheSwgZmxvYXQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoZmxvYXRbXSwgaW50LCBpbnQsIGZsb2F0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmxvYXRbXSBmaWxsKGZsb2F0W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBmbG9hdCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGludFtdLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBmaWxsKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoaW50W10sIGludCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBmaWxsKGludFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgaW50IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoT2JqZWN0W10sIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gZmlsbChFW10gYXJyYXksIEUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoT2JqZWN0W10sIGludCwgaW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGZpbGwoRVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgRSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGxvbmdbXSwgbG9uZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmdbXSBmaWxsKGxvbmdbXSBhcnJheSwgbG9uZyB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChsb25nW10sIGludCwgaW50LCBsb25nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIGZpbGwobG9uZ1tdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgbG9uZyB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKHNob3J0W10sIHNob3J0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBmaWxsKHNob3J0W10gYXJyYXksIHNob3J0IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKHNob3J0W10sIGludCwgaW50LCBzaG9ydCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHNob3J0W10gZmlsbChzaG9ydFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgc2hvcnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChieXRlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gc29ydChieXRlLi4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoYnl0ZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBzb3J0KGJ5dGVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGNoYXJbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzb3J0KGNoYXIuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHNvcnQoY2hhcltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoZG91YmxlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBkb3VibGVbXSBzb3J0KGRvdWJsZS4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGRvdWJsZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGRvdWJsZVtdIHNvcnQoZG91YmxlW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChmbG9hdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmxvYXRbXSBzb3J0KGZsb2F0Li4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoZmxvYXRbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIHNvcnQoZmxvYXRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGludFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc29ydChpbnQuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChpbnRbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzb3J0KGludFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNvcnQoRS4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KE9iamVjdFtdLCBqYXZhLnV0aWwuQ29tcGFyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc29ydChFW10gYXJyYXksIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoT2JqZWN0W10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzb3J0KEVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KE9iamVjdFtdLCBpbnQsIGludCwgamF2YS51dGlsLkNvbXBhcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNvcnQoRVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgY29tcGFyYXRvcik7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGxvbmdbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmdbXSBzb3J0KGxvbmcuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChsb25nW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIHNvcnQobG9uZ1tdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoc2hvcnRbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHNob3J0W10gc29ydChzaG9ydC4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KHNob3J0W10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBzb3J0KHNob3J0W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvdW50ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db3VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTNjZGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB3aGVyZXZlciBhIG11dGFibGUgaW50ZWdlciBvYmplY3QgaXMgbmVlZGVkLgotICogSXQgaXMgYSBjcm9zcyBiZXR3ZWVuIGFuIGludCBhbmQgYW4gSW50ZWdlci4gSXQgY2FuIGJlIHN0b3JlZCBpbiBhIHN0YW5kYXJkCi0gKiBjb250YWluZXIgKGUuZy4gQ29sbGVjdGlvbikgYnV0IGNhbiBiZSBtb2RpZmllZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvdW50ZXIKLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvdW50ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIENvdW50ZXIoaW50IGNvdW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY291bnQgPSBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb3VudGVyIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiB6ZXJvLgotCSAqLwotCXB1YmxpYyBDb3VudGVyKCkgewotCQl0aGlzKDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBjb3VudCBvZiB0aGUgY291bnRlci4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBjb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMuY291bnQ7Ci0JfQotCi0JLyoqCi0JICogSW5jcmVtZW50IGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgY291bnQgb2YgdGhlIGNvdW50ZXIuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgaW5jcmVtZW50KCkgewotCQlyZXR1cm4gKyt0aGlzLmNvdW50OwotCX0KLQotCS8qKgotCSAqIEluY3JlbWVudCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IGNvdW50IG9mIHRoZSBjb3VudGVyLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGluY3JlbWVudChpbnQgaW5jcmVtZW50KSB7Ci0JCXJldHVybiB0aGlzLmNvdW50ICs9IGluY3JlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBEZXJlbWVudCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IGNvdW50IG9mIHRoZSBjb3VudGVyLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGRlY3JlbWVudCgpIHsKLQkJcmV0dXJuIC0tdGhpcy5jb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBEZXJlbWVudCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IGNvdW50IG9mIHRoZSBjb3VudGVyLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGRlY3JlbWVudChpbnQgZGVjcmVtZW50KSB7Ci0JCXJldHVybiB0aGlzLmNvdW50IC09IGRlY3JlbWVudDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIENvdW50ZXIpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY291bnQgPT0gKChDb3VudGVyKSBvKS5jb3VudDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuY291bnQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlzYi5hcHBlbmQodGhpcy5jb3VudCk7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9FbXB0eUl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRW1wdHlJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjE1NTY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9FbXB0eUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLS8qKgotICogQW4gPGNvZGU+RW1wdHlJdGVyYWJsZTwvY29kZT4gaXMganVzdCB0aGF0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVtcHR5SXRlcmFibGUgSU5TVEFOQ0UgPSBuZXcgRW1wdHlJdGVyYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8VD4gSXRlcmFibGU8VD4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRW1wdHlJdGVyYWJsZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRmlsZVRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRmlsZVRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTU0YzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0ZpbGVUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIEFzc29ydGVkIGZpbGUgdG9vbHM6Ci0gKiAtIGRlbGV0ZSBlbnRpcmUgdHJlZXMgb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi0gKiAtIGJ1aWxkIGl0ZXJhdG9ycyBvbiBlbnRpcmUgdHJlZXMgb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi0gKiAtIGJ1aWxkIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeQotICogLSAiY2Fub25pemUiIGZpbGVzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9IT01FX0RJUkVDVE9SWV9OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSA9ICJ0bXBkaXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfV09SS0lOR19ESVJFQ1RPUllfTkFNRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLQotICAgIC8qKiBBIGxpc3Qgb2Ygc29tZSBpbnZhbGlkIGZpbGUgbmFtZSBjaGFyYWN0ZXJzLgotCQkJCTogaXMgdGhlIGZpbGVuYW1lIHNlcGFyYXRvciBpbiBNYWNPUyBhbmQgdGhlIGRyaXZlIGluZGljYXRvciBpbiBET1MKLQkJCQkqIGlzIGEgRE9TIHdpbGRjYXJkIGNoYXJhY3RlcgotCQkJCXwgaXMgYSBET1MgcmVkaXJlY3Rpb24gY2hhcmFjdGVyCi0JCQkJJiBpcyBvdXIgb3duIGVzY2FwZSBjaGFyYWN0ZXIKLQkJCQkvIGlzIHRoZSBmaWxlbmFtZSBzZXBhcmF0b3IgaW4gVW5peCBhbmQgdGhlIGNvbW1hbmQgb3B0aW9uIHRhZyBpbiBET1MKLQkJCQlcIGlzIHRoZSBmaWxlbmFtZSBzZXBhcmF0b3IgaW4gRE9TL1dpbmRvd3MgYW5kIHRoZSBlc2NhcGUgY2hhcmFjdGVyIGluIFVuaXgKLQkJCQk7IGlzID8/PwotCQkJCT8gaXMgYSBET1Mgd2lsZGNhcmQgY2hhcmFjdGVyCi0JCQkJWyBpcyA/Pz8KLQkJCQldIGlzID8/PwotCQkJCT0gaXMgPz8/Ci0JCQkJKyBpcyA/Pz8KLQkJCQk8IGlzIGEgRE9TIHJlZGlyZWN0aW9uIGNoYXJhY3RlcgotCQkJCT4gaXMgYSBET1MgcmVkaXJlY3Rpb24gY2hhcmFjdGVyCi0JCQkJIiBpcyB1c2VkIGJ5IERPUyB0byBkZWxpbWl0IGZpbGUgbmFtZXMgd2l0aCBzcGFjZXMKLQkJCQksIGlzID8/PwotICAgICAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIElOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyA9IHsgJzonLCAnKicsICd8JywgJyYnLCAnLycsICdcXCcsICc7JywgJz8nLCAnWycsICddJywgJz0nLCAnKycsICc8JywgJz4nLCAnIicsICcsJyB9OwotCi0JLyoqIFRoaXMgZW5jb2RlciB3aWxsIGNvbnZlcnQgc3RyaW5ncyBpbnRvIHZhbGlkIGZpbGUgbmFtZXMuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTdHJpbmdFbmNvZGVyIEZJTEVfTkFNRV9FTkNPREVSID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQotCS8qKiBXaW5kb3dzIGZpbGVzIHRoYXQgYXJlIHJlZGlyZWN0ZWQgdG8gZGV2aWNlcyBldGMuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gV0lORE9XU19SRVNFUlZFRF9GSUxFX05BTUVTID0gewotCQkiY29uIiwKLQkJImF1eCIsCi0JCSJjb20xIiwgImNvbTIiLCAiY29tMyIsICJjb200IiwgImNvbTUiLCAiY29tNiIsICJjb203IiwgImNvbTgiLCAiY29tOSIsCi0JCSJscHQxIiwgImxwdDIiLCAibHB0MyIsICJscHQ0IiwgImxwdDUiLCAibHB0NiIsICJscHQ3IiwgImxwdDgiLCAibHB0OSIsCi0JCSJwcm4iLAotCQkibnVsIgotCX07Ci0KLQkvKiogVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgc2hvcnRlbmVkIGZpbGUgbmFtZS4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIID0gNjA7Ci0KLQotCS8vICoqKioqKioqKiogZGVsZXRpbmcgZGlyZWN0b3JpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogRGVsZXRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVBbGwoKT8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCWRlbGV0ZURpcmVjdG9yeShuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgYWxsIG9mIGl0cyBjb250ZW50cy4KLQkgKiA8ZW0+VVNFIFdJVEggQ0FSRS48L2VtPgotCSAqIEZpbGUjZGVsZXRlQWxsKCk/Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgewotCQlkZWxldGVEaXJlY3RvcnlDb250ZW50cyhkaXJlY3RvcnkpOwotCQlpZiAoICEgZGlyZWN0b3J5LmRlbGV0ZSgpKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidW5hYmxlIHRvIGRlbGV0ZSBkaXJlY3Rvcnk6ICIgKyBkaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKLQkgKiAoYnV0IG5vdCB0aGUgZGlyZWN0b3J5IGl0c2VsZikuCi0JICogPGVtPlVTRSBXSVRIIENBUkUuPC9lbT4KLQkgKiBGaWxlI2RlbGV0ZUZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5Q29udGVudHMoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJZGVsZXRlRGlyZWN0b3J5Q29udGVudHMobmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0JICogKGJ1dCBub3QgdGhlIGRpcmVjdG9yeSBpdHNlbGYpLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVGaWxlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWZvciAoRmlsZSBmaWxlIDogZGlyZWN0b3J5Lmxpc3RGaWxlcygpKSB7Ci0JCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJZGVsZXRlRGlyZWN0b3J5KGZpbGUpOwkvLyByZWN1cnNlIHRocm91Z2ggc3ViZGlyZWN0b3JpZXMKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCAhIGZpbGUuZGVsZXRlKCkpIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInVuYWJsZSB0byBkZWxldGUgZmlsZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQotCS8vICoqKioqKioqKiogY29weWluZyBmaWxlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgotCSAqIEZpbGUjY29weShGaWxlIGRlc3RpbmF0aW9uRmlsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weVRvRmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdGluYXRpb25GaWxlKQotCQl0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCUZpbGVDaGFubmVsIHNvdXJjZUNoYW5uZWwgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZUZpbGUpLmdldENoYW5uZWwoKTsKLQkJRmlsZUNoYW5uZWwgZGVzdGluYXRpb25DaGFubmVsID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdGluYXRpb25GaWxlKS5nZXRDaGFubmVsKCk7Ci0JCXRyeSB7Ci0JCQlkZXN0aW5hdGlvbkNoYW5uZWwudHJhbnNmZXJGcm9tKHNvdXJjZUNoYW5uZWwsIDAsIHNvdXJjZUNoYW5uZWwuc2l6ZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNvdXJjZUNoYW5uZWwuY2xvc2UoKTsKLQkJCWRlc3RpbmF0aW9uQ2hhbm5lbC5jbG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gYSBmaWxlIGJ5Ci0JICogdGhlIHNhbWUgbmFtZSBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotCSAqIEZpbGUjY29weVRvRGlyZWN0b3J5KEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnkpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlUb0RpcmVjdG9yeShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnkpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJRmlsZSBkZXN0aW5hdGlvbkZpbGUgPSBuZXcgRmlsZShkZXN0aW5hdGlvbkRpcmVjdG9yeSwgc291cmNlRmlsZS5nZXROYW1lKCkpOwotCQlkZXN0aW5hdGlvbkZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQljb3B5VG9GaWxlKHNvdXJjZUZpbGUsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBpdGVyYXRvcmluZyBvdmVyIGZpbGVzIGFuZCBkaXJlY3RvcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNmaWxlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCXJldHVybiBmaWxlc0luKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogVGhlIGl0ZXJhdG9yIHdpbGwgc2tpcCBvdmVyIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjZmlsZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJbihGaWxlIGRpcmVjdG9yeSkgewotCQlyZXR1cm4gZmlsZXNJbihkaXJlY3RvcnkubGlzdEZpbGVzKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luKEZpbGVbXSBmaWxlcykgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEZpbGUsIEZpbGU+KG5ldyBBcnJheUl0ZXJhdG9yPEZpbGU+KGZpbGVzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRmlsZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuaXNGaWxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzCi0JICogaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogRmlsZSNzdWJEaXJlY3RvcmllcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBkaXJlY3Rvcmllc0luKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCXJldHVybiBkaXJlY3Rvcmllc0luKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgc3ViZGlyZWN0b3JpZXMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiBGaWxlI3N1YkRpcmVjdG9yaWVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW4oRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGRpcmVjdG9yaWVzSW4oZGlyZWN0b3J5Lmxpc3RGaWxlcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJbihGaWxlW10gZmlsZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxGaWxlLCBGaWxlPihuZXcgQXJyYXlJdGVyYXRvcjxGaWxlPihmaWxlcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmlzRGlyZWN0b3J5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGZpbGVzIHVuZGVyIHRoZSBzcGVjaWZpZWQKLQkgKiBkaXJlY3RvcnksIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLgotCSAqIFRoZSBpdGVyYXRvciB3aWxsIHNraXAgb3ZlciB0aGUgc3ViZGlyZWN0b3JpZXMgdGhlbXNlbHZlcy4KLQkgKiBGaWxlI2ZpbGVzUmVjdXJzZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luVHJlZShTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlyZXR1cm4gZmlsZXNJblRyZWUobmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyB1bmRlciB0aGUgc3BlY2lmaWVkCi0JICogZGlyZWN0b3J5LCByZWN1cnNpbmcgaW50byBzdWJkaXJlY3Rvcmllcy4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgdGhlIHN1YmRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMuCi0JICogRmlsZSNmaWxlc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJblRyZWUoRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGZpbGVzSW5UcmVlQXNTZXQoZGlyZWN0b3J5KS5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFNldDxGaWxlPiBmaWxlc0luVHJlZUFzU2V0KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCVNldDxGaWxlPiBmaWxlcyA9IG5ldyBIYXNoU2V0PEZpbGU+KDEwMDAwKTsKLQkJYWRkRmlsZXNJblRyZWVUbyhkaXJlY3RvcnksIGZpbGVzKTsKLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRmlsZXNJblRyZWVUbyhGaWxlIGRpcmVjdG9yeSwgQ29sbGVjdGlvbjxGaWxlPiBhbGxGaWxlcykgewotCQlmb3IgKEZpbGUgZmlsZSA6IGRpcmVjdG9yeS5saXN0RmlsZXMoKSkgewotCQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCQlhbGxGaWxlcy5hZGQoZmlsZSk7Ci0JCQl9IGVsc2UgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWFkZEZpbGVzSW5UcmVlVG8oZmlsZSwgYWxsRmlsZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNzdWJEaXJlY3Rvcmllc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWUoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJcmV0dXJuIGRpcmVjdG9yaWVzSW5UcmVlKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNzdWJEaXJlY3Rvcmllc1JlY3Vyc2UoKQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWUoRmlsZSBkaXJlY3RvcnkpIHsKLQkJRmlsZVtdIGZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEZpbGU+KGRpcmVjdG9yaWVzSW4oZmlsZXMpLCBkaXJlY3Rvcmllc0luVHJlZXMoZGlyZWN0b3JpZXNJbihmaWxlcykpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWVzKEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8RmlsZT4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGaWxlLCBJdGVyYXRvcjxGaWxlPj4oZGlyZWN0b3JpZXMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8RmlsZT4gdHJhbnNmb3JtKEZpbGUgbmV4dCkgewotCQkJCQlyZXR1cm4gRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW5UcmVlKG5leHQpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHNob3J0IGZpbGUgbmFtZSBtYW5pcHVsYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaXAgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lCi0JICogYW5kIHJldHVybiB0aGUgcmVzdWx0LiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBubwotCSAqIGV4dGVuc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkCi0JICogRmlsZSNiYXNlUGF0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0JCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBTdHJpcCB0aGUgZXh0ZW5zaW9uIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlJ3MgbmFtZQotCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gSWYgdGhlIGZpbGUncyBuYW1lIGhhcyBubwotCSAqIGV4dGVuc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkCi0JICogRmlsZSNiYXNlUGF0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbnNpb24oRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBzdHJpcEV4dGVuc2lvbihmaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHRlbnNpb24sIGluY2x1ZGluZyB0aGUgZG90LCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZS4KLQkgKiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBubyBleHRlbnNpb24sIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCi0JICogRmlsZSNleHRlbnNpb24oKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgdGhlIGRvdCwgb2YgdGhlIHNwZWNpZmllZCBmaWxlJ3MgbmFtZS4KLQkgKiBJZiB0aGUgZmlsZSdzIG5hbWUgaGFzIG5vIGV4dGVuc2lvbiwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKiBGaWxlI2V4dGVuc2lvbigpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5zaW9uKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZXh0ZW5zaW9uKGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVtcG9yYXJ5IGRpcmVjdG9yaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYW4gZW1wdHkgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGNsZWFyZWQgb3V0LgotCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQkgKiBhcyBpbmRpY2F0ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBlbXB0eVRlbXBvcmFyeURpcmVjdG9yeShTdHJpbmcgbmFtZSkgewotCQlGaWxlIGRpciA9IG5ldyBGaWxlKHVzZXJUZW1wb3JhcnlEaXJlY3RvcnkoKSwgbmFtZSk7Ci0JCWlmIChkaXIuZXhpc3RzKCkpIHsKLQkJCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpcik7Ci0JCX0gZWxzZSB7Ci0JCQlkaXIubWtkaXJzKCk7Ci0JCX0KLQkJcmV0dXJuIGRpcjsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhbiBlbXB0eSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggYQotCSAqIG5hbWUgb2YgInRtcGRpciIuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgY2xlYXJlZCBvdXQuCi0JICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LAotCSAqIGFzIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGVtcHR5VGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZW1wdHlUZW1wb3JhcnlEaXJlY3RvcnkoREVGQVVMVF9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGxlZnQgdW5jaGFuZ2VkOwotCSAqIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4KLQkgKiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksCi0JICogYXMgaW5kaWNhdGVkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdGVtcG9yYXJ5RGlyZWN0b3J5KFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUodXNlclRlbXBvcmFyeURpcmVjdG9yeSgpLCBuYW1lKTsKLQkJaWYgKCAhIGRpci5leGlzdHMoKSkgewotCQkJZGlyLm1rZGlycygpOwotCQl9Ci0JCXJldHVybiBkaXI7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggYSBuYW1lIG9mCi0JICogInRtcGRpciIuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgbGVmdCB1bmNoYW5nZWQ7Ci0JICogaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLgotCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQkgKiBhcyBpbmRpY2F0ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSB0ZW1wb3JhcnlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiB0ZW1wb3JhcnlEaXJlY3RvcnkoREVGQVVMVF9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgKm5ldyogdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBwcmVmaXguIFRoZSBwcmVmaXggd2lsbCBiZSBhcHBlbmRlZCB3aXRoIGEgbnVtYmVyIHRoYXQKLQkgKiBpcyBpbmNyZW1lbnRlZCwgc3RhcnRpbmcgd2l0aCAxLCB1bnRpbCBhIG5vbi1wcmUtZXhpc3RpbmcgZGlyZWN0b3J5Ci0JICogaXMgZm91bmQgYW5kIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEKLQkgKiBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYXMgaW5kaWNhdGVkIGJ5Ci0JICogdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBuZXdUZW1wb3JhcnlEaXJlY3RvcnkoU3RyaW5nIHByZWZpeCkgewotCQlpZiAoICEgcHJlZml4LmVuZHNXaXRoKCIuIikpIHsKLQkJCXByZWZpeCA9IHByZWZpeCArICIuIjsKLQkJfQotCQlGaWxlIGRpcjsKLQkJaW50IGkgPSAwOwotCQlkbyB7Ci0JCQlpKys7Ci0JCQlkaXIgPSBuZXcgRmlsZSh1c2VyVGVtcG9yYXJ5RGlyZWN0b3J5KCksIHByZWZpeCArIGkpOwotCQl9IHdoaWxlICggISBkaXIubWtkaXJzKCkpOwotCQlyZXR1cm4gZGlyOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgKm5ldyogdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIGEKLQkgKiBwcmVmaXggb2YgInRtcGRpciIuIFRoaXMgcHJlZml4IHdpbGwgYmUgYXBwZW5kZWQgd2l0aCBhIG51bWJlciB0aGF0Ci0JICogaXMgaW5jcmVtZW50ZWQsIHN0YXJ0aW5nIHdpdGggMSwgdW50aWwgYSBub24tcHJlLWV4aXN0aW5nIGRpcmVjdG9yeQotCSAqIGlzIGZvdW5kIGFuZCBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhCi0JICogc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFzIGluZGljYXRlZCBieQotCSAqIHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgbmV3VGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3VGVtcG9yYXJ5RGlyZWN0b3J5KERFRkFVTFRfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgotCSAqIFRoZSByZXNvdXJjZSBuYW1lIG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLCBpLmUuIGl0IGNhbm5vdCBiZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBwYWNrYWdlIG5hbWUvZGlyZWN0b3J5LgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvdXJjZUZpbGUoU3RyaW5nIHJlc291cmNlTmFtZSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCWlmICggISByZXNvdXJjZU5hbWUuc3RhcnRzV2l0aCgiLyIpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHJlc291cmNlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIEZpbGVUb29scy5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvdXJjZUZpbGUoU3RyaW5nIHJlc291cmNlTmFtZSwgQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IGphdmFDbGFzcy5nZXRSZXNvdXJjZShyZXNvdXJjZU5hbWUpOwotCQlyZXR1cm4gYnVpbGRGaWxlKHVybCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIFVSTC4KLQkgKiBOQjogVGhlcmUgaXMgYSBidWcgaW4gamRrMS40LnggdGhlIHByZXZlbnRzIHVzIGZyb20gZ2V0dGluZwotCSAqIGEgcmVzb3VyY2UgdGhhdCBoYXMgc3BhY2VzIChvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMpIGluCi0JICogaXRzIG5hbWUuLi4uIChzZWUgU3VuJ3MgSmF2YSBidWcgNDQ2NjQ4NSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgYnVpbGRGaWxlKFVSTCB1cmwpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlyZXR1cm4gYnVpbGRGaWxlKHVybC5nZXRGaWxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUuCi0JICogTkI6IFRoZXJlIGlzIGEgYnVnIGluIGpkazEuNC54IHRoZSBwcmV2ZW50cyB1cyBmcm9tIGdldHRpbmcKLQkgKiBhIHJlc291cmNlIHRoYXQgaGFzIHNwYWNlcyAob3Igb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzKSBpbgotCSAqIGl0cyBuYW1lLi4uLiAoc2VlIFN1bidzIEphdmEgYnVnIDQ0NjY0ODUpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGJ1aWxkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlVUkkgdXJpID0gbmV3IFVSSShmaWxlTmFtZSk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaS5nZXRQYXRoKCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqICJjYW5vbmljYWwiIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlIGludG8gYSAiY2Fub25pY2FsIiBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjYW5vbmljYWxGaWxlKEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4Y2VwdGlvbikgewotCQkJLy8gc2V0dGxlIGZvciB0aGUgYWJzb2x1dGUgZmlsZQotCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW4gaXRlcmF0b3IgdGhhdCB3aWxsIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBjYW5vbmljYWxGaWxlcyhJdGVyYXRvcjxGaWxlPiBmaWxlcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmlsZSwgRmlsZT4oZmlsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEZpbGUgdHJhbnNmb3JtKEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBjYW5vbmljYWxGaWxlKG5leHQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGVzCi0JICogaW50byAiY2Fub25pY2FsIiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGNhbm9uaWNhbEZpbGVzKENvbGxlY3Rpb248RmlsZT4gZmlsZXMpIHsKLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVzKGZpbGVzLml0ZXJhdG9yKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIGludG8gYSAiY2Fub25pY2FsIiBmaWxlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fub25pY2FsRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlKG5ldyBGaWxlKGZpbGVOYW1lKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZSBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY2Fub25pY2FsRmlsZU5hbWVzKEl0ZXJhdG9yPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4oZmlsZU5hbWVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVOYW1lKG5leHQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZXMKLQkgKiBpbnRvICJjYW5vbmljYWwiIGZpbGUgbmFtZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbm9uaWNhbEZpbGVOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlTmFtZXMoZmlsZU5hbWVzLml0ZXJhdG9yKCkpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogZmlsZSBuYW1lIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgaW52YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc0ludmFsaWQoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXJldHVybiAhIGZpbGVOYW1lSXNWYWxpZChmaWxlbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgdmFsaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVOYW1lSXNWYWxpZChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGZpbGVuYW1lQ2hhciA9IGZpbGVuYW1lLmNoYXJBdChpKTsKLQkJCWlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTLCBmaWxlbmFtZUNoYXIpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGlsbGVnYWwgY2hhcmFjdGVycyBpbiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSB0bwotCSAqIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9WYWxpZEZpbGVOYW1lKFN0cmluZyBmaWxlbmFtZSwgY2hhciByZXBsYWNlbWVudENoYXIpIHsKLQkJaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBmaWxlbmFtZUNoYXIgPSBmaWxlbmFtZS5jaGFyQXQoaSk7Ci0JCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKElOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUywgZmlsZW5hbWVDaGFyKSkgewotCQkJCXNiLmFwcGVuZChyZXBsYWNlbWVudENoYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQoZmlsZW5hbWVDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgdG8KLQkgKiBwZXJpb2RzICgnLicpIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9WYWxpZEZpbGVOYW1lKFN0cmluZyBmaWxlbmFtZSkgewotCQlyZXR1cm4gY29udmVydFRvVmFsaWRGaWxlTmFtZShmaWxlbmFtZSwgJy4nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSBpcyAicmVzZXJ2ZWQiCi0JICogKGkuZS4gaXQgY2Fubm90IGJlIHVzZWQgZm9yICJ1c2VyIiBmaWxlcykuIFdpbmRvd3MgcmVzZXJ2ZXMKLQkgKiBhIG51bWJlciBvZiBmaWxlIG5hbWVzIChlLmcuIENPTiwgQVVYLCBQUk4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlTmFtZUlzUmVzZXJ2ZWQoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChleGVjdXRpbmdPbldpbmRvd3MoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhXSU5ET1dTX1JFU0VSVkVEX0ZJTEVfTkFNRVMsIGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsJLy8gVW5peCBkb2VzIG5vdCBoYXZlIGFueSAicmVzZXJ2ZWQiIGZpbGUgbmFtZXMgKEkgdGhpbmsuLi4pCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIGNvbnRhaW5zIGFueSAicmVzZXJ2ZWQiCi0JICogY29tcG9uZW50cy4KLQkgKiBXaW5kb3dzIHJlc2VydmVzIGEgbnVtYmVyIG9mIGZpbGUgbmFtZXMgKGUuZy4gQ09OLCBBVVgsIFBSTik7Ci0JICogYW5kIHRoZXNlIGZpbGUgbmFtZXMgY2Fubm90IGJlIHVzZWQgZm9yIGVpdGhlciB0aGUgbmFtZXMgb2YKLQkgKiBmaWxlcyBvciBkaXJlY3Rvcmllcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhGaWxlIGZpbGUpIHsKLQkJRmlsZSB0ZW1wID0gZmlsZTsKLQkJd2hpbGUgKHRlbXAgIT0gbnVsbCkgewotCQkJaWYgKGZpbGVOYW1lSXNSZXNlcnZlZCh0ZW1wLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNob3J0ZW5lZCBmaWxlIG5hbWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHNob3J0ZXIgdmVyc2lvbiBvZiB0aGUgYWJzb2x1dGUgZmlsZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogVGhlIHNob3J0ZXIgdmVyc2lvbiB3aWxsIG5vdCBiZSBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGguCi0JICogVGhlIGZpcnN0IGRpcmVjdG9yeSAodXN1YWxseSB0aGUgZHJpdmUgbGV0dGVyKSBhbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUKLQkgKiBsYXN0IGRpcmVjdG9yeSB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIHN0cmluZyByZWdhcmRsZXNzIG9mCi0JICogdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRlbkZpbGVOYW1lKFVSTCB1cmwpIHsKLQkJcmV0dXJuIHNob3J0ZW5GaWxlTmFtZSh1cmwsIE1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNob3J0ZXIgdmVyc2lvbiBvZiB0aGUgYWJzb2x1dGUgZmlsZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogVGhlIHNob3J0ZXIgdmVyc2lvbiB3aWxsIG5vdCBiZSBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGguCi0JICogVGhlIGZpcnN0IGRpcmVjdG9yeSAodXN1YWxseSB0aGUgZHJpdmUgbGV0dGVyKSBhbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUKLQkgKiBsYXN0IGRpcmVjdG9yeSB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIHN0cmluZyByZWdhcmRsZXNzIG9mCi0JICogdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRlbkZpbGVOYW1lKFVSTCB1cmwsIGludCBtYXhMZW5ndGgpIHsKLQkJRmlsZSBmaWxlOwotCQl0cnkgewotCQkJZmlsZSA9IGJ1aWxkRmlsZSh1cmwpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJZmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotCQl9Ci0JCXJldHVybiBzaG9ydGVuRmlsZU5hbWUoZmlsZSwgbWF4TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIGFic29sdXRlIGZpbGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFRoZSBzaG9ydGVyIHZlcnNpb24gd2lsbCBub3QgYmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoLgotCSAqIFRoZSBmaXJzdCBkaXJlY3RvcnkgKHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcikgYW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlCi0JICogbGFzdCBkaXJlY3Rvcnkgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBzdHJpbmcgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5GaWxlTmFtZShGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIHNob3J0ZW5GaWxlTmFtZShmaWxlLCBNQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIGFic29sdXRlIGZpbGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFRoZSBzaG9ydGVyIHZlcnNpb24gd2lsbCBub3QgYmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoLgotCSAqIFRoZSBmaXJzdCBkaXJlY3RvcnkgKHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcikgYW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlCi0JICogbGFzdCBkaXJlY3Rvcnkgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBzdHJpbmcgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5GaWxlTmFtZShGaWxlIGZpbGUsIGludCBtYXhMZW5ndGgpIHsKLQkJU3RyaW5nIGFic29sdXRlRmlsZU5hbWUgPSBjYW5vbmljYWxGaWxlKGZpbGUpLmdldEFic29sdXRlUGF0aCgpOwotCQlpZiAoYWJzb2x1dGVGaWxlTmFtZS5sZW5ndGgoKSA8PSBtYXhMZW5ndGgpIHsKLQkJCS8vIG5vIG5lZWQgdG8gc2hvcnRlbgotCQkJcmV0dXJuIGFic29sdXRlRmlsZU5hbWU7Ci0JCX0KLQotCQkvLyBicmVhayBkb3duIHRoZSBwYXRoIGludG8gaXRzIGNvbXBvbmVudHMKLQkJU3RyaW5nIGZzID0gRmlsZS5zZXBhcmF0b3I7Ci0JCVN0cmluZ1tdIHBhdGhzID0gYWJzb2x1dGVGaWxlTmFtZS5zcGxpdCgiXFwiICsgZnMpOwotCi0JCWlmIChwYXRocy5sZW5ndGggPD0gMSkgewotCQkJLy8gZS5nLiAiQzpcIgotCQkJcmV0dXJuIHBhdGhzWzBdOwotCQl9Ci0KLQkJaWYgKHBhdGhzLmxlbmd0aCA9PSAyKSB7Ci0JCQkvLyBlLmcuICJDOlxNeVJlYWxseUxvbmdGaWxlTmFtZS5leHQiIG9yICJDOlxNeVJlYWxseUxvbmdEaXJlY3RvcnlOYW1lIgotCQkJLy8gcmV0dXJuIHRoZSBjb21wbGV0ZSBmaWxlIG5hbWUgc2luY2UgdGhpcyBpcyBhIG1pbmltdW0gcmVxdWlyZW1lbnQsCi0JCQkvLyByZWdhcmRsZXNzIG9mIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkCi0JCQlyZXR1cm4gYWJzb2x1dGVGaWxlTmFtZTsKLQkJfQotCi0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQocGF0aHNbMF0pOwkJLy8gYWx3YXlzIGFkZCB0aGUgZmlyc3QgZGlyZWN0b3J5LCB3aGljaCBpcyB1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIKLQotCQkvLyBLZWVwIHRoZSBpbmRleCBvZiBpbnNlcnRpb24gaW50byB0aGUgc3RyaW5nIGJ1ZmZlcgotCQlpbnQgaW5zZXJ0SW5kZXggPSBzYi5sZW5ndGgoKTsKLQotCQlzYi5hcHBlbmQoZnMpOwotCQlzYi5hcHBlbmQocGF0aHNbcGF0aHMubGVuZ3RoIC0gMV0pOwkJLy8gYXBwZW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlIGxhc3QgZGlyZWN0b3J5Ci0KLQkJbWF4TGVuZ3RoIC09IDQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIC00IGZvciAiLy4uLiIKLQotCQlpbnQgY3VycmVudExlbmd0aCA9IHNiLmxlbmd0aCgpIC0gNDsgLy8gLTQgZm9yICIvLi4uIgotCQlpbnQgbGVmdEluZGV4ID0gMTsgICAgICAgICAgICAgICAgICAgLy8gIDEgdG8gc2tpcCB0aGUgcm9vdCBkaXJlY3RvcnkKLQkJaW50IHJpZ2h0SW5kZXggPSBwYXRocy5sZW5ndGggLSAyOyAgIC8vIC0xIGZvciB0aGUgZmlsZSBuYW1lIG9yIHRoZSBsYXN0IGRpcmVjdG9yeQotCi0JCWJvb2xlYW4gY2FuQWRkRnJvbUxlZnQgPSB0cnVlOwotCQlib29sZWFuIGNhbkFkZEZyb21SaWdodCA9IHRydWU7Ci0KLQkJLy8gQWRkIGVhY2ggZGlyZWN0b3J5LCB0aGUgaW5zZXJ0aW9uIGlzIGdvaW5nIGluIGJvdGggZGlyZWN0aW9uOiBsZWZ0IGFuZAotCQkvLyByaWdodCwgb25jZSBhIHNpZGUgY2FuJ3QgYmUgYWRkZWQsIHRoZSBvdGhlciBzaWRlIGlzIHN0aWxsIGNvbnRpbnVpbmcKLQkJLy8gdW50aWwgYm90aCBjYW4ndCBhZGQgYW55bW9yZQotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKCFjYW5BZGRGcm9tTGVmdCAmJiAhY2FuQWRkRnJvbVJpZ2h0KQotCQkJCWJyZWFrOwotCi0JCQlpZiAoY2FuQWRkRnJvbVJpZ2h0KSB7Ci0JCQkJU3RyaW5nIHJpZ2h0RGlyZWN0b3J5ID0gcGF0aHNbcmlnaHRJbmRleF07Ci0JCQkJaW50IHJpZ2h0TGVuZ3RoID0gcmlnaHREaXJlY3RvcnkubGVuZ3RoKCk7Ci0KLQkJCQkvLyBBZGQgdGhlIGRpcmVjdG9yeSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgbG9vcAotCQkJCWlmIChjdXJyZW50TGVuZ3RoICsgcmlnaHRMZW5ndGggKyAxIDw9IG1heExlbmd0aCkgewotCQkJCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXgsICAgICBmcyk7Ci0JCQkJCXNiLmluc2VydChpbnNlcnRJbmRleCArIDEsIHJpZ2h0RGlyZWN0b3J5KTsKLQotCQkJCQljdXJyZW50TGVuZ3RoICs9IHJpZ2h0TGVuZ3RoICsgMTsKLQkJCQkJcmlnaHRJbmRleC0tOwotCi0JCQkJCS8vIFRoZSByaWdodCBzaWRlIGlzIG5vdyBvdmVybGFwcGluZyB0aGUgbGVmdCBzaWRlLCB0aGF0IG1lYW5zCi0JCQkJCS8vIHdlIGNhbid0IGFkZCBmcm9tIHRoZSByaWdodCBzaWRlIGFueW1vcmUKLQkJCQkJaWYgKGxlZnRJbmRleCA+PSByaWdodEluZGV4KSB7Ci0JCQkJCQljYW5BZGRGcm9tUmlnaHQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNhbkFkZEZyb21SaWdodCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNhbkFkZEZyb21MZWZ0KSB7Ci0JCQkJU3RyaW5nIGxlZnREaXJlY3RvcnkgPSBwYXRoc1tsZWZ0SW5kZXhdOwotCQkJCWludCBsZWZ0TGVuZ3RoID0gbGVmdERpcmVjdG9yeS5sZW5ndGgoKTsKLQotCQkJCS8vIEFkZCB0aGUgZGlyZWN0b3J5IG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGxvb3AKLQkJCQlpZiAoY3VycmVudExlbmd0aCArIGxlZnRMZW5ndGggKyAxIDw9IG1heExlbmd0aCkgewotCQkJCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXgsICAgICBmcyk7Ci0JCQkJCXNiLmluc2VydChpbnNlcnRJbmRleCArIDEsIGxlZnREaXJlY3RvcnkpOwotCi0JCQkJCWluc2VydEluZGV4ICs9IGxlZnRMZW5ndGggKyAxOwotCQkJCQljdXJyZW50TGVuZ3RoICs9IGxlZnRMZW5ndGggKyAxOwotCQkJCQlsZWZ0SW5kZXgrKzsKLQotCQkJCQkvLyBUaGUgbGVmdCBzaWRlIGlzIG5vdyBvdmVybGFwcGluZyB0aGUgcmlnaHQgc2lkZSwgdGhhdCBtZWFucwotCQkJCQkvLyB3ZSBjYW4ndCBhZGQgZnJvbSB0aGUgbGVmdCBzaWRlIGFueW1vcmUKLQkJCQkJaWYgKGxlZnRJbmRleCA+PSByaWdodEluZGV4KSB7Ci0JCQkJCQljYW5BZGRGcm9tTGVmdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2FuQWRkRnJvbUxlZnQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGVmdEluZGV4IDw9IHJpZ2h0SW5kZXgpIHsKLQkJCXNiLmluc2VydChpbnNlcnRJbmRleCwgZnMpOwotCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4ICsgMSwgIi4uLiIpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5c3RlbSBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgcmVwcmVzZW50aW5nIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIHVzZXJIb21lRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEZpbGUoVVNFUl9IT01FX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSByZXByZXNlbnRpbmcgdGhlIHVzZXIncyB0ZW1wb3JhcnkgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSB1c2VyVGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEZpbGUoVVNFUl9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRmlsZShDVVJSRU5UX1dPUktJTkdfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGV4ZWN1dGluZ09uV2luZG93cygpIHsKLQkJcmV0dXJuIGV4ZWN1dGluZ09uKCJXaW5kb3dzIik7Ci0JfQotCi0vLwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGV4ZWN1dGluZ09uTGludXgoKSB7Ci0vLwkJcmV0dXJuIGV4ZWN1dGluZ09uKCJMaW51eCIpOwotLy8JfQotLy8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGV4ZWN1dGluZ09uKFN0cmluZyBvc05hbWUpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmluZGV4T2Yob3NOYW1lKSAhPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gb25seSB0aGUgZmlsZXMgdGhhdCBmaXQgdGhlIGZpbHRlci4KLQkgKiBGaWxlI2ZpbGVzKEZpbGVGaWx0ZXIgZmlsZUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbHRlcihJdGVyYXRvcjxGaWxlPiBmaWxlcywgZmluYWwgRmlsZUZpbHRlciBmaWxlRmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZSwgRmlsZT4oZmlsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBmaWxlRmlsdGVyLmFjY2VwdChuZXh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWM6Ci0JICogICAgICAgICBjb252ZXJ0VG9SZWxhdGl2ZUZpbGUoL2Zvby9iYXIvYmF6LmphdmEsIC9mb28pCi0JICogICAgICAgICAgICAgPT4gYmFyL2Jhei5qYXZhCi0JICogICAgIFdpbmRvd3M6Ci0JICogICAgICAgICBjb252ZXJ0VG9SZWxhdGl2ZUZpbGUoQzpcZm9vXGJhclxiYXouamF2YSwgQzpcZm9vKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqIFRoZSBmaWxlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9yIGEgZGlyZWN0b3J5OyB0aGUgZGlyZWN0b3J5Ci0JICogKnNob3VsZCogYmUgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSByZWxhdGl2ZSBvciBpdCBjYW5ub3QgYmUgbWFkZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgRmlsZSBkaXIpIHsKLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBhbHJlYWR5IHJlbGF0aXZlCi0JCWlmICggISBmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQotCQlGaWxlIGNGaWxlID0gY2Fub25pY2FsRmlsZShmaWxlKTsKLQkJRmlsZSBjRGlyID0gY2Fub25pY2FsRmlsZShkaXIpOwotCi0JCS8vIHRoZSB0d28gYXJlIHRoZSBzYW1lIGRpcmVjdG9yeQotCQlpZiAoY0ZpbGUuZXF1YWxzKGNEaXIpKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbGUoIi4iKTsKLQkJfQotCi0JCUZpbGVbXSBmaWxlUGF0aEZpbGVzID0gcGF0aEZpbGVzKGNGaWxlKTsKLQkJRmlsZVtdIGRpclBhdGhGaWxlcyA9IHBhdGhGaWxlcyhjRGlyKTsKLQotCQkvLyBXaW5kb3dzIG9ubHkgKD8pOiB0aGUgcm9vdHMgYXJlIGRpZmZlcmVudCAtIGUuZy4gRDpcIHZzLiBDOlwKLQkJaWYgKCAhIGRpclBhdGhGaWxlc1swXS5lcXVhbHMoZmlsZVBhdGhGaWxlc1swXSkpIHsKLQkJCXJldHVybiBmaWxlOwkJLy8gcmV0dXJuIHVuY2hhbmdlZAotCQl9Ci0KLQkJLy8gYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSByb290IGlzIHRoZSBzYW1lLCBub3cgZmluZCBob3cgbXVjaCBpcyBpbiBjb21tb24KLQkJaW50IGkgPSAwOwkJLy8gdGhpcyB3aWxsIHBvaW50IGF0IHRoZSBmaXJzdCBtaXNjb21wYXJlCi0JCXdoaWxlICgoaSA8IGRpclBhdGhGaWxlcy5sZW5ndGgpICYmIChpIDwgZmlsZVBhdGhGaWxlcy5sZW5ndGgpKSB7Ci0JCQlpZiAoZGlyUGF0aEZpbGVzW2ldLmVxdWFscyhmaWxlUGF0aEZpbGVzW2ldKSkgewotCQkJCWkrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gc2F2ZSBvdXIgY3VycmVudCBwb3NpdGlvbgotCQlpbnQgZmlyc3RNaXNtYXRjaCA9IGk7Ci0KLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBBQk9WRSB0aGUgZGlyZWN0b3J5OiAuLi8uLgotCQlpZiAoZmlyc3RNaXNtYXRjaCA9PSBmaWxlUGF0aEZpbGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIHJlbGF0aXZlUGFyZW50RmlsZShkaXJQYXRoRmlsZXMubGVuZ3RoIC0gZmlyc3RNaXNtYXRjaCk7Ci0JCX0KLQotCQkvLyBidWlsZCBhIG5ldyBmaWxlIGZyb20gdGhlIHBhdGggYmV5b25kIHRoZSBtYXRjaGluZyBwb3J0aW9ucwotCQlGaWxlIGRpZmYgPSBuZXcgRmlsZShmaWxlUGF0aEZpbGVzW2ldLmdldE5hbWUoKSk7Ci0JCXdoaWxlICgrK2kgPCBmaWxlUGF0aEZpbGVzLmxlbmd0aCkgewotCQkJZGlmZiA9IG5ldyBGaWxlKGRpZmYsIGZpbGVQYXRoRmlsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJfQotCi0JCS8vIGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXMgQkVMT1cgdGhlIGRpcmVjdG9yeTogc3ViZGlyMS9zdWJkaXIyL2ZpbGUuZXh0Ci0JCWlmIChmaXJzdE1pc21hdGNoID09IGRpclBhdGhGaWxlcy5sZW5ndGgpIHsKLQkJCXJldHVybiBkaWZmOwotCQl9Ci0KLQkJLy8gdGhlIGZpbGUgbXVzdCBiZSBhIFBFRVIgb2YgdGhlIGRpcmVjdG9yeTogLi4vLi4vc3ViZGlyMS9zdWJkaXIyL2ZpbGUuZXh0Ci0JCXJldHVybiBuZXcgRmlsZShyZWxhdGl2ZVBhcmVudEZpbGUoZGlyUGF0aEZpbGVzLmxlbmd0aCAtIGZpcnN0TWlzbWF0Y2gpLCBkaWZmLmdldFBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB0aGF0IGlzIGEgcmUtc3BlY2lmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmlsZSwgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi0JICogICAgIExpbnV4L1VuaXgvTWFjIChDV0QgPSAvZm9vKToKLQkgKiAgICAgICAgIGNvbnZlcnRUb1JlbGF0aXZlRmlsZSgvZm9vL2Jhci9iYXouamF2YSkKLQkgKiAgICAgICAgICAgICA9PiBiYXIvYmF6LmphdmEKLQkgKiAgICAgV2luZG93cyAoQ1dEID0gQzpcZm9vKToKLQkgKiAgICAgICAgIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShDOlxmb29cYmFyXGJhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqIFRoZSBmaWxlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9yIGEgZGlyZWN0b3J5LgotCSAqIElmIHRoZSBmaWxlIGlzIGFscmVhZHkgcmVsYXRpdmUgb3IgaXQgY2Fubm90IGJlIG1hZGUgcmVsYXRpdmUKLQkgKiB0byB0aGUgZGlyZWN0b3J5LCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLiBGb3IgZXhhbXBsZToKLQkgKiAgICAgQzovZm9vL2Jhci9iYXoudHh0ID0+Ci0JICogICAgIHsgQzovLCBDOi9mb28sIEM6L2Zvby9iYXIsIEM6L2Zvby9iYXIvYmF6LnR4dCB9Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIHBhdGhGaWxlcyhGaWxlIGZpbGUpIHsKLQkJTGlzdDxGaWxlPiBwYXRoID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotCQlmb3IgKEZpbGUgZiA9IGZpbGU7IGYgIT0gbnVsbDsgZiA9IGYuZ2V0UGFyZW50RmlsZSgpKSB7Ci0JCQlwYXRoLmFkZChmKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHBhdGgpOwotCQlyZXR1cm4gcGF0aC50b0FycmF5KG5ldyBGaWxlW3BhdGguc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgKG5vbi16ZXJvKSBudW1iZXIgb2YgcmVsYXRpdmUKLQkgKiBmaWxlIG5hbWVzLCBlLmcuIHh4eCgzKSA9PiAuLi8uLi8uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEZpbGUgcmVsYXRpdmVQYXJlbnRGaWxlKGludCBsZW4pIHsKLQkJaWYgKGxlbiA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybzogIiArIGxlbik7Ci0JCX0KLQkJRmlsZSByZXN1bHQgPSBuZXcgRmlsZSgiLi4iKTsKLQkJZm9yIChpbnQgaSA9IGxlbiAtIDE7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0ID0gbmV3IEZpbGUocmVzdWx0LCAiLi4iKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgdGhhdCBpcyBhIHJlLXNwZWNpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZAotCSAqIGZpbGUsIGFic29sdXRlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqICAgICBMaW51eC9Vbml4L01hYzoKLQkgKiAgICAgICAgIGNvbnZlcnRUb0Fic29sdXRlRmlsZShiYXIvYmF6LmphdmEsIC9mb28pCi0JICogICAgICAgICAgICAgPT4gL2Zvby9iYXIvYmF6LmphdmEKLQkgKiAgICAgV2luZG93czoKLQkgKiAgICAgICAgIGNvbnZlcnRUb0Fic29sdXRlRmlsZShiYXIvYmF6LmphdmEsIEM6XGZvbykKLQkgKiAgICAgICAgICAgICA9PiBDOlxmb29cYmFyXGJhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3Rvcnk7IHRoZSBkaXJlY3RvcnkKLQkgKiAqc2hvdWxkKiBiZSBhIGRpcmVjdG9yeS4KLQkgKiBJZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0Fic29sdXRlRmlsZShmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIEZpbGUgZGlyKSB7Ci0JCS8vIGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXMgYWxyZWFkeSBhYnNvbHV0ZQotCQlpZiAoZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCXJldHVybiBmaWxlOwkJLy8gcmV0dXJuIHVuY2hhbmdlZAotCQl9Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlKG5ldyBGaWxlKGRpciwgZmlsZS5nZXRQYXRoKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCBhYnNvbHV0ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWMgKENXRCA9IC9mb28pOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSkKLQkgKiAgICAgICAgICAgICA9PiAvZm9vL2Jhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzIChDV0QgPSBDOlxmb28pOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSkKLQkgKiAgICAgICAgICAgICA9PiBDOlxmb29cYmFyXGJhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSBhYnNvbHV0ZSwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogCi0JICogTkI6IFRoaXMgbWV0aG9kIGhhcyBiZWVuIHRlc3RlZCBvbiBXaW5kb3dzIGFuZCBMaW51eCwKLQkgKiBidXQgbm90IE1hYyAoYnV0IHRoZSBNYWMgaXMgVW5peC1iYXNlZCB0aGVzZSBkYXlzLCBzbwotCSAqIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0uLi4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmluYWwgRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgY3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBGaWxlVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0hhc2hCYWcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9IYXNoQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NjRlZGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0hhc2hCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSA8Y29kZT5CYWc8L2NvZGU+IGludGVyZmFjZSwgYmFja2VkIGJ5IGEKLSAqIGhhc2ggdGFibGUuIEl0IG1ha2VzIG5vIGd1YXJhbnRlZXMgYXMgdG8gdGhlIGl0ZXJhdGlvbiBvcmRlciBvZgotICogdGhlIGJhZydzIGVsZW1lbnRzOyBpbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUgb3JkZXIKLSAqIHdpbGwgcmVtYWluIGNvbnN0YW50IG92ZXIgdGltZS4gVGhpcyBjbGFzcyBwZXJtaXRzIHRoZSA8Y29kZT5udWxsPC9jb2RlPgotICogZWxlbWVudC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBvZmZlcnMgY29uc3RhbnQgdGltZSBwZXJmb3JtYW5jZSBmb3IgdGhlIGJhc2ljIG9wZXJhdGlvbnMKLSAqICg8Y29kZT5hZGQ8L2NvZGU+LCA8Y29kZT5yZW1vdmU8L2NvZGU+LCA8Y29kZT5jb250YWluczwvY29kZT4gYW5kCi0gKiA8Y29kZT5zaXplPC9jb2RlPiksIGFzc3VtaW5nIHRoZSBoYXNoIGZ1bmN0aW9uIGRpc3BlcnNlcyB0aGUgZWxlbWVudHMKLSAqIHByb3Blcmx5IGFtb25nIHRoZSBidWNrZXRzLiBJdGVyYXRpbmcgb3ZlciB0aGlzIGJhZyByZXF1aXJlcyB0aW1lCi0gKiBwcm9wb3J0aW9uYWwgdG8gdGhlIHN1bSBvZiB0aGUgYmFnJ3Mgc2l6ZSAodGhlIG51bWJlciBvZiBlbGVtZW50cykgcGx1cyB0aGUKLSAqICJjYXBhY2l0eSIgb2YgdGhlIGJhY2tpbmcgaGFzaCB0YWJsZSAodGhlIG51bWJlciBvZiBidWNrZXRzKS4gVGh1cywgaXQgaXMKLSAqIGltcG9ydGFudCBub3QgdG8gc2V0IHRoZSBpbml0aWFsIGNhcGFjaXR5IHRvbyBoaWdoIChvciB0aGUgbG9hZCBmYWN0b3IgdG9vCi0gKiBsb3cpIGlmIGl0ZXJhdGlvbiBwZXJmb3JtYW5jZSBpcyBpbXBvcnRhbnQuCi0gKiA8cD4KLSAqIDxiPk5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuPC9iPiBJZiBtdWx0aXBsZQotICogdGhyZWFkcyBhY2Nlc3MgYSBiYWcgY29uY3VycmVudGx5LCBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSB0aHJlYWRzIG1vZGlmaWVzCi0gKiB0aGUgYmFnLCBpdCA8aT5tdXN0PC9pPiBiZSBzeW5jaHJvbml6ZWQgZXh0ZXJuYWxseS4gVGhpcyBpcyB0eXBpY2FsbHkKLSAqIGFjY29tcGxpc2hlZCBieSBzeW5jaHJvbml6aW5nIG9uIHNvbWUgb2JqZWN0IHRoYXQgbmF0dXJhbGx5IGVuY2Fwc3VsYXRlcwotICogdGhlIGJhZy4gSWYgbm8gc3VjaCBvYmplY3QgZXhpc3RzLCB0aGUgYmFnIHNob3VsZCBiZSAid3JhcHBlZCIgdXNpbmcgdGhlCi0gKiA8Y29kZT5Db2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uPC9jb2RlPiBtZXRob2QuIFRoaXMgaXMKLSAqIGJlc3QgZG9uZSBhdCBjcmVhdGlvbiB0aW1lLCB0byBwcmV2ZW50IGFjY2lkZW50YWwgdW5zeW5jaHJvbml6ZWQgYWNjZXNzCi0gKiB0byB0aGUgYmFnOgotICogPHByZT4KLSAqIENvbGxlY3Rpb24gYyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb24obmV3IEhhc2hCYWcoLi4uKSk7Ci0gKiA8L3ByZT4KLSAqIDxwPgotICogVGhlIGl0ZXJhdG9ycyByZXR1cm5lZCBieSB0aGlzIGNsYXNzJ3MgPGNvZGU+aXRlcmF0b3I8L2NvZGU+IG1ldGhvZCBhcmUKLSAqIDxpPmZhaWwtZmFzdDwvaT46IGlmIHRoZSBiYWcgaXMgbW9kaWZpZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGl0ZXJhdG9yIGlzCi0gKiBjcmVhdGVkLCBpbiBhbnkgd2F5IGV4Y2VwdCB0aHJvdWdoIHRoZSBpdGVyYXRvcidzIG93biA8Y29kZT5yZW1vdmU8L2NvZGU+Ci0gKiBtZXRob2QsIHRoZSBpdGVyYXRvciB0aHJvd3MgYSA8Y29kZT5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uPC9jb2RlPi4KLSAqIFRodXMsIGluIHRoZSBmYWNlIG9mIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLCB0aGUgaXRlcmF0b3IgZmFpbHMgcXVpY2tseQotICogYW5kIGNsZWFubHksIHJhdGhlciB0aGFuIHJpc2tpbmcgYXJiaXRyYXJ5LCBub24tZGV0ZXJtaW5pc3RpYyBiZWhhdmlvciBhdAotICogYW4gdW5kZXRlcm1pbmVkIHRpbWUgaW4gdGhlIGZ1dHVyZS4KLSAqIAotICogQHNlZQlDb2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRDb2xsZWN0aW9uKENvbGxlY3Rpb24pCi0gKi8KLXB1YmxpYyBjbGFzcyBIYXNoQmFnPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb248RT4KLQlpbXBsZW1lbnRzIEJhZzxFPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQotCS8qKiBUaGUgaGFzaCB0YWJsZS4gKi8KLQl0cmFuc2llbnQgRW50cnk8RT5bXSB0YWJsZTsKLQotCS8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGJhZy4gKi8KLQl0cmFuc2llbnQgaW50IGNvdW50ID0gMDsKLQotCS8qKiBUaGUgbnVtYmVyIG9mIHVuaXF1ZSBlbnRyaWVzIGluIHRoZSBiYWcuICovCi0JdHJhbnNpZW50IGludCB1bmlxdWVDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgaGFzaCB0YWJsZSBpcyByZWhhc2hlZCB3aGVuIGl0cyBzaXplIGV4Y2VlZHMgdGhpcyB0aHJlc2hvbGQuIChUaGUKLQkgKiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIChpbnQpKGNhcGFjaXR5ICogbG9hZEZhY3RvcikuKQotCSAqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgaW50IHRocmVzaG9sZDsKLQotCS8qKgotCSAqIFRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIGhhc2ggdGFibGUuCi0JICoKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBmbG9hdCBsb2FkRmFjdG9yOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGJhZyBoYXMgYmVlbiBzdHJ1Y3R1cmFsbHkgbW9kaWZpZWQuCi0JICogU3RydWN0dXJhbCBtb2RpZmljYXRpb25zIGFyZSB0aG9zZSB0aGF0IGNoYW5nZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLQkgKiB0aGUgYmFnIG9yIG90aGVyd2lzZSBtb2RpZnkgaXRzIGludGVybmFsIHN0cnVjdHVyZSAoZS5nLiByZWhhc2gpLgotCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBtYWtlIGl0ZXJhdG9ycyBvbiB0aGlzIGJhZyBmYWlsLWZhc3QuCi0JICoKLQkgKiBAc2VlIGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JICovCi0JdHJhbnNpZW50IGludCBtb2RDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBiYWcgd2l0aCB0aGUKLQkgKiBkZWZhdWx0IGNhcGFjaXR5LCB3aGljaCBpcyAxMSwgYW5kIGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LgotCSAqLwotCXB1YmxpYyBIYXNoQmFnKCkgewotCQl0aGlzKDExLCAwLjc1Zik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgYmFnIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5Ci0JICogYW5kIGRlZmF1bHQgbG9hZCBmYWN0b3IsIHdoaWNoIGlzIDAuNzUuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoZSBiYWNraW5nIG1hcC4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBsZXNzCi0JICogICAgIHRoYW4gemVyby4KLQkgKi8KLQlwdWJsaWMgSGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCXRoaXMoaW5pdGlhbENhcGFjaXR5LCAwLjc1Zik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgYmFnIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kIHRoZSBzcGVjaWZpZWQgbG9hZCBmYWN0b3IuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoZSBiYWNraW5nIG1hcC4KLQkgKiBAcGFyYW0gbG9hZEZhY3RvciB0aGUgbG9hZCBmYWN0b3Igb2YgdGhlIGJhY2tpbmcgbWFwLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIGxlc3MKLQkgKiAgICAgdGhhbiB6ZXJvLCBvciBpZiB0aGUgbG9hZCBmYWN0b3IgaXMgbm9ucG9zaXRpdmUuCi0JICovCi0JcHVibGljIEhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgewotCQlpZiAoaW5pdGlhbENhcGFjaXR5IDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBJbml0aWFsIENhcGFjaXR5OiAiICsgaW5pdGlhbENhcGFjaXR5KTsKLQkJfQotCQlpZiAobG9hZEZhY3RvciA8PSAwIHx8IEZsb2F0LmlzTmFOKGxvYWRGYWN0b3IpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIExvYWQgZmFjdG9yOiAiICsgbG9hZEZhY3Rvcik7Ci0JCX0KLQkJaWYgKGluaXRpYWxDYXBhY2l0eSA9PSAwKSB7Ci0JCQlpbml0aWFsQ2FwYWNpdHkgPSAxOwotCQl9Ci0JCXRoaXMubG9hZEZhY3RvciA9IGxvYWRGYWN0b3I7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoaW5pdGlhbENhcGFjaXR5KTsKLQkJdGhpcy50aHJlc2hvbGQgPSAoaW50KSAoaW5pdGlhbENhcGFjaXR5ICogbG9hZEZhY3Rvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBiYWcgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBjYXBhY2l0eSBvZiB0aGUgYmFnIGlzCi0JICogdHdpY2UgdGhlIHNpemUgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9yIDExICh3aGljaGV2ZXIgaXMKLQkgKiBncmVhdGVyKSwgYW5kIHRoZSBkZWZhdWx0IGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LCBpcyB1c2VkLgotCSAqCi0JICogQHBhcmFtIGMgdGhlIGNvbGxlY3Rpb24gd2hvc2UgZWxlbWVudHMgYXJlIHRvIGJlIHBsYWNlZCBpbnRvIHRoaXMgYmFnLgotCSAqLwotCXB1YmxpYyBIYXNoQmFnKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJdGhpcyhNYXRoLm1heCgyKmMuc2l6ZSgpLCAxMSkpOwotCQl0aGlzLmFkZEFsbChjKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIHRoZSBtYWludGFpbmVkIGNvdW50LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY291bnQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY29tcGFyZXMgdGhlIG1haW50YWluZWQgY291bnQgdG8gemVyby4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5jb3VudCA9PSAwOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYlswXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUub2JqZWN0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaW50IGhhc2ggPSBvLmhhc2hDb2RlKCk7Ci0JCQlpbnQgaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYltpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmIG8uZXF1YWxzKGUub2JqZWN0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBpbnQgY291bnQoT2JqZWN0IG8pIHsKLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbMF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJCWlmIChlLm9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBlLmNvdW50OwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludCBoYXNoID0gby5oYXNoQ29kZSgpOwotCQkJaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiBvLmVxdWFscyhlLm9iamVjdCkpIHsKLQkJCQkJcmV0dXJuIGUuY291bnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFJlaGFzaGVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGJhZyBpbnRvIGEgbmV3IGhhc2ggdGFibGUKLQkgKiB3aXRoIGEgbGFyZ2VyIGNhcGFjaXR5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKLQkgKiBudW1iZXIgb2YgZGlmZmVyZW50IGVsZW1lbnRzIGluIHRoaXMgbWFwIGV4Y2VlZHMgaXRzCi0JICogY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWhhc2goKSB7Ci0JCUVudHJ5PEU+W10gb2xkTWFwID0gdGhpcy50YWJsZTsKLQkJaW50IG9sZENhcGFjaXR5ID0gb2xkTWFwLmxlbmd0aDsKLQotCQlpbnQgbmV3Q2FwYWNpdHkgPSBvbGRDYXBhY2l0eSAqIDIgKyAxOwotCQlFbnRyeTxFPltdIG5ld1RhYmxlID0gdGhpcy5idWlsZFRhYmxlKG5ld0NhcGFjaXR5KTsKLQotCQl0aGlzLm1vZENvdW50Kys7Ci0JCXRoaXMudGhyZXNob2xkID0gKGludCkgKG5ld0NhcGFjaXR5ICogdGhpcy5sb2FkRmFjdG9yKTsKLQkJdGhpcy50YWJsZSA9IG5ld1RhYmxlOwotCi0JCWZvciAoaW50IGkgPSBvbGRDYXBhY2l0eTsgaS0tID4gMDsgKSB7Ci0JCQlmb3IgKEVudHJ5PEU+IG9sZCA9IG9sZE1hcFtpXTsgb2xkICE9IG51bGw7ICkgewotCQkJCUVudHJ5PEU+IGUgPSBvbGQ7Ci0JCQkJb2xkID0gb2xkLm5leHQ7Ci0KLQkJCQlpbnQgaW5kZXggPSAoZS5oYXNoICYgMHg3RkZGRkZGRikgJSBuZXdDYXBhY2l0eTsKLQkJCQllLm5leHQgPSBuZXdUYWJsZVtpbmRleF07Ci0JCQkJbmV3VGFibGVbaW5kZXhdID0gZTsKLQkJCX0KLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRW50cnk8RT5bXSBidWlsZFRhYmxlKGludCBjYXBhY2l0eSkgewotCQlyZXR1cm4gbmV3IEVudHJ5W2NhcGFjaXR5XTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIDxUPiBFbnRyeTxFPiBidWlsZEVudHJ5KGludCBoYXNoLCBPYmplY3QgbywgRW50cnk8VD4gbmV4dCkgewotCQlyZXR1cm4gbmV3IEVudHJ5KGhhc2gsIG8sIG5leHQpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgPFQ+IEVudHJ5PEU+IGJ1aWxkRW50cnkoaW50IGhhc2gsIE9iamVjdCBvLCBpbnQgY250LCBFbnRyeTxUPiBuZXh0KSB7Ci0JCXJldHVybiBuZXcgRW50cnkoaGFzaCwgbywgY250LCBuZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQl0aGlzLm1vZENvdW50Kys7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJaW50IGhhc2ggPSAwOwotCQlpbnQgaW5kZXggPSAwOwotCi0JCS8vIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbiB0aGUgYmFnLCBzaW1wbHkgYnVtcCBpdHMgY291bnQKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJZm9yIChFbnRyeTxFPiBlID0gdGFiWzBdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZS5vYmplY3QgPT0gbnVsbCkgewotCQkJCQllLmNvdW50Kys7Ci0JCQkJCXRoaXMuY291bnQrKzsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaGFzaCA9IG8uaGFzaENvZGUoKTsKLQkJCWluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiBvLmVxdWFscyhlLm9iamVjdCkpIHsKLQkJCQkJZS5jb3VudCsrOwotCQkJCQl0aGlzLmNvdW50Kys7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlaGFzaCB0aGUgdGFibGUgaWYgdGhlIHRocmVzaG9sZCBpcyBleGNlZWRlZAotCQlpZiAodGhpcy51bmlxdWVDb3VudCA+PSB0aGlzLnRocmVzaG9sZCkgewotCQkJdGhpcy5yZWhhc2goKTsKLQkJCXRhYiA9IHRoaXMudGFibGU7Ci0JCQlpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBuZXcgZW50cnkgYW5kIHB1dCBpdCBpbiB0aGUgdGFibGUKLQkJRW50cnk8RT4gZSA9IHRoaXMuYnVpbGRFbnRyeShoYXNoLCBvLCB0YWJbaW5kZXhdKTsKLQkJdGFiW2luZGV4XSA9IGU7Ci0JCXRoaXMuY291bnQrKzsKLQkJdGhpcy51bmlxdWVDb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbywgaW50IGNudCkgewotCQlpZiAoY250IDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aGlzLm1vZENvdW50Kys7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJaW50IGhhc2ggPSAwOwotCQlpbnQgaW5kZXggPSAwOwotCi0JCS8vIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbiB0aGUgYmFnLCBzaW1wbHkgYnVtcCBpdHMgY291bnQKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJZm9yIChFbnRyeTxFPiBlID0gdGFiWzBdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZS5vYmplY3QgPT0gbnVsbCkgewotCQkJCQllLmNvdW50ICs9IGNudDsKLQkJCQkJdGhpcy5jb3VudCArPSBjbnQ7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWhhc2ggPSBvLmhhc2hDb2RlKCk7Ci0JCQlpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQkJZm9yIChFbnRyeTxFPiBlID0gdGFiW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgby5lcXVhbHMoZS5vYmplY3QpKSB7Ci0JCQkJCWUuY291bnQgKz0gY250OwotCQkJCQl0aGlzLmNvdW50ICs9IGNudDsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVoYXNoIHRoZSB0YWJsZSBpZiB0aGUgdGhyZXNob2xkIGlzIGV4Y2VlZGVkCi0JCWlmICh0aGlzLnVuaXF1ZUNvdW50ID49IHRoaXMudGhyZXNob2xkKSB7Ci0JCQl0aGlzLnJlaGFzaCgpOwotCQkJdGFiID0gdGhpcy50YWJsZTsKLQkJCWluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIG5ldyBlbnRyeSBhbmQgcHV0IGl0IGluIHRoZSB0YWJsZQotCQlFbnRyeTxFPiBlID0gdGhpcy5idWlsZEVudHJ5KGhhc2gsIG8sIGNudCwgdGFiW2luZGV4XSk7Ci0JCXRhYltpbmRleF0gPSBlOwotCQl0aGlzLmNvdW50ICs9IGNudDsKLQkJdGhpcy51bmlxdWVDb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJZm9yIChFbnRyeTxFPiBlID0gdGFiWzBdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmIChlLm9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCXRoaXMubW9kQ291bnQrKzsKLQkJCQkJZS5jb3VudC0tOwotCQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3Qgb25lLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCWlmIChlLmNvdW50ID09IDApIHsKLQkJCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCQl0YWJbMF0gPSBlLm5leHQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJfQotCQkJCQl0aGlzLmNvdW50LS07Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludCBoYXNoID0gby5oYXNoQ29kZSgpOwotCQkJaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbaW5kZXhdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmIG8uZXF1YWxzKGUub2JqZWN0KSkgewotCQkJCQl0aGlzLm1vZENvdW50Kys7Ci0JCQkJCWUuY291bnQtLTsKLQkJCQkJLy8gaWYgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IG9uZSwgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQkJdGFiW2luZGV4XSA9IGUubmV4dDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQkJfQotCQkJCQkJdGhpcy51bmlxdWVDb3VudC0tOwotCQkJCQl9Ci0JCQkJCXRoaXMuY291bnQtLTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjbnQpIHsKLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbMF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUub2JqZWN0ID09IG51bGwpIHsKLQkJCQkJdGhpcy5tb2RDb3VudCsrOwotCQkJCQlpbnQgY250MiA9IChjbnQgPCBlLmNvdW50KSA/IGNudCA6IGUuY291bnQ7Ci0JCQkJCWUuY291bnQgLT0gY250MjsKLQkJCQkJLy8gaWYgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IGVsZW1lbnQocyksIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQkJaWYgKGUuY291bnQgPT0gMCkgewotCQkJCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCQkJCXRhYlswXSA9IGUubmV4dDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQkJfQotCQkJCQkJdGhpcy51bmlxdWVDb3VudC0tOwotCQkJCQl9Ci0JCQkJCXRoaXMuY291bnQgLT0gY250MjsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaW50IGhhc2ggPSBvLmhhc2hDb2RlKCk7Ci0JCQlpbnQgaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYltpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgby5lcXVhbHMoZS5vYmplY3QpKSB7Ci0JCQkJCXRoaXMubW9kQ291bnQrKzsKLQkJCQkJaW50IGNudDIgPSAoY250IDwgZS5jb3VudCkgPyBjbnQgOiBlLmNvdW50OwotCQkJCQllLmNvdW50IC09IGNudDI7Ci0JCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBlbGVtZW50KHMpLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCWlmIChlLmNvdW50ID09IDApIHsKLQkJCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCQl0YWJbaW5kZXhdID0gZS5uZXh0OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQl0aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJCX0KLQkJCQkJdGhpcy5jb3VudCAtPSBjbnQyOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY2xlYXJzIG91dCBhbGwgb2YgdGhlIGhhc2ggdGFibGUgYnVja2V0cy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQl0aGlzLm1vZENvdW50Kys7Ci0JCWZvciAoaW50IGkgPSB0YWIubGVuZ3RoOyAtLWkgPj0gMDsgKSB7Ci0JCQl0YWJbaV0gPSBudWxsOwotCQl9Ci0JCXRoaXMuY291bnQgPSAwOwotCQl0aGlzLnVuaXF1ZUNvdW50ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgYmFnOiB0aGUgZWxlbWVudHMKLQkgKiB0aGVtc2VsdmVzIGFyZSBub3QgY2xvbmVkLgotCSAqCi0JICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGJhZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSGFzaEJhZzxFPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJSGFzaEJhZzxFPiBjbG9uZSA9IChIYXNoQmFnPEU+KSBzdXBlci5jbG9uZSgpOwotCQkJY2xvbmUudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUodGhpcy50YWJsZS5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IHRoaXMudGFibGUubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQljbG9uZS50YWJsZVtpXSA9ICh0aGlzLnRhYmxlW2ldID09IG51bGwpIAotCQkJCQkJPyBudWxsIDogKEVudHJ5PEU+KSB0aGlzLnRhYmxlW2ldLmNsb25lKCk7Ci0JCQl9Ci0JCQljbG9uZS5tb2RDb3VudCA9IDA7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEhhc2ggdGFibGUgY29sbGlzaW9uIGxpc3QgZW50cnkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnk8RT4gaW1wbGVtZW50cyBCYWcuRW50cnk8RT4gewotCQlpbnQgaGFzaDsKLQkJRSBvYmplY3Q7Ci0JCWludCBjb3VudDsKLQkJRW50cnk8RT4gbmV4dDsKLQotCQlFbnRyeShpbnQgaGFzaCwgRSBvYmplY3QsIEVudHJ5PEU+IG5leHQpIHsKLQkJCXRoaXMoaGFzaCwgb2JqZWN0LCAxLCBuZXh0KTsKLQkJfQotCi0JCUVudHJ5KGludCBoYXNoLCBFIG9iamVjdCwgaW50IGNvdW50LCBFbnRyeTxFPiBuZXh0KSB7Ci0JCQl0aGlzLmhhc2ggPSBoYXNoOwotCQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQl0aGlzLm5leHQgPSBuZXh0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENhc2NhZGUgdGhlIGNsb25lIHRvIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgc2FtZSBidWNrZXQuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXByb3RlY3RlZCBFbnRyeTxFPiBjbG9uZSgpIHsKLQkJCXJldHVybiBuZXcgRW50cnkodGhpcy5oYXNoLCB0aGlzLm9iamVjdCwgdGhpcy5jb3VudCwKLQkJCQkJKHRoaXMubmV4dCA9PSBudWxsID8gbnVsbCA6IHRoaXMubmV4dC5jbG9uZSgpKSk7Ci0JCX0KLQotCQkvLyAqKioqKiBCYWcuRW50cnkgaW1wbGVtZW50YXRpb24KLQkJcHVibGljIEUgZ2V0RWxlbWVudCgpIHsKLQkJCXJldHVybiB0aGlzLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb3VudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgc2V0Q291bnQoaW50IGNvdW50KSB7Ci0JCQlpZiAoY291bnQgPD0gMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm86ICIgKyBjb3VudCk7Ci0JCQl9Ci0JCQlpbnQgb2xkID0gdGhpcy5jb3VudDsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJCXJldHVybiBvbGQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBCYWcuRW50cnkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlCYWcuRW50cnkgZSA9IChCYWcuRW50cnkpIG87Ci0JCQlpZiAodGhpcy5jb3VudCAhPSBlLmdldENvdW50KCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlPYmplY3QgbzEgPSB0aGlzLm9iamVjdDsKLQkJCU9iamVjdCBvMiA9IGUuZ2V0RWxlbWVudCgpOwotCQkJaWYgKG8xID09IG8yKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAobzEgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBvMS5lcXVhbHMobzIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlFIG8gPSB0aGlzLm9iamVjdDsKLQkJCXJldHVybiAobyA9PSBudWxsKSA/IDAgOiAodGhpcy5jb3VudCAqIG8uaGFzaENvZGUoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm9iamVjdCArICI9PiIgKyB0aGlzLmNvdW50OwotCQl9Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy5jb3VudCA9PSAwKSA/IEVNUFRZX0lURVJBVE9SIDogbmV3IEhhc2hJdGVyYXRvcigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLmNvdW50ID09IDApID8gRU1QVFlfSVRFUkFUT1IgOiBuZXcgVW5pcXVlSXRlcmF0b3IoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBlbnRyaWVzKCkgewotCQlyZXR1cm4gKHRoaXMuY291bnQgPT0gMCkgPyBFTVBUWV9JVEVSQVRPUiA6IG5ldyBFbnRyeUl0ZXJhdG9yKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBFbXB0eSBpdGVyYXRvciB0aGF0IGRvZXMganVzdCBhYm91dCBub3RoaW5nLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhdG9yIEVNUFRZX0lURVJBVE9SID0gbmV3IEVtcHR5SXRlcmF0b3IoKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVtcHR5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0KLQkJRW1wdHlJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBIYXNoSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7Ci0JCXByaXZhdGUgRW50cnk8RT5bXSBsb2NhbFRhYmxlID0gSGFzaEJhZy50aGlzLnRhYmxlOwotCQlwcml2YXRlIGludCBpbmRleCA9IHRoaXMubG9jYWxUYWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCXByaXZhdGUgRW50cnk8RT4gbmV4dEVudHJ5ID0gbnVsbDsKLQkJcHJpdmF0ZSBpbnQgbmV4dEVudHJ5Q291bnQgPSAwOwotCQlwcml2YXRlIEVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogYmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUhhc2hJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZSA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZSA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZTsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJcmV0dXJuIGUgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBldCA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZXQgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWV0ID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBldDsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJaWYgKGV0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZSA9IHRoaXMubGFzdFJldHVybmVkRW50cnkgPSB0aGlzLm5leHRFbnRyeTsKLQkJCXRoaXMubmV4dEVudHJ5Q291bnQrKzsKLQkJCWlmICh0aGlzLm5leHRFbnRyeUNvdW50ID09IGUuY291bnQpIHsKLQkJCQl0aGlzLm5leHRFbnRyeSA9IGUubmV4dDsKLQkJCQl0aGlzLm5leHRFbnRyeUNvdW50ID0gMDsKLQkJCX0KLQkJCXJldHVybiBlLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWlmICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMubG9jYWxUYWJsZTsKLQkJCWludCBzbG90ID0gKHRoaXMubGFzdFJldHVybmVkRW50cnkuaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYltzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJZS5jb3VudC0tOwotCQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3Qgb25lLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQkJdGFiW3Nsb3RdID0gZS5uZXh0OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHNsaWRlIGJhY2sgdGhlIGNvdW50IHRvIGFjY291bnQgZm9yIHRoZSBqdXN0LXJlbW92ZWQgZWxlbWVudAotCQkJCQkJdGhpcy5uZXh0RW50cnlDb3VudC0tOwotCQkJCQl9Ci0JCQkJCUhhc2hCYWcudGhpcy5jb3VudC0tOwotCQkJCQl0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsJLy8gaXQgY2Fubm90IGJlIHJlbW92ZWQgYWdhaW4KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBFbnRyeUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RW50cnk8RT4+IHsKLQkJcHJpdmF0ZSBFbnRyeTxFPltdIGxvY2FsVGFibGUgPSBIYXNoQmFnLnRoaXMudGFibGU7Ci0JCXByaXZhdGUgaW50IGluZGV4ID0gdGhpcy5sb2NhbFRhYmxlLmxlbmd0aDsJLy8gc3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUKLQkJcHJpdmF0ZSBFbnRyeTxFPiBuZXh0RW50cnkgPSBudWxsOwotCQlwcml2YXRlIEVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogYmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUVudHJ5SXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCUVudHJ5PEU+IGUgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gdGhpcy5sb2NhbFRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGUgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWUgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGU7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCXJldHVybiBlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRW50cnk8RT4gbmV4dCgpIHsKLQkJCWlmIChIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGV0ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMubG9jYWxUYWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChldCA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZXQgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGV0OwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlpZiAoZXQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IHRoaXMubmV4dEVudHJ5OwotCQkJdGhpcy5uZXh0RW50cnkgPSBlLm5leHQ7Ci0JCQlyZXR1cm4gZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWlmICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMubG9jYWxUYWJsZTsKLQkJCWludCBzbG90ID0gKHRoaXMubGFzdFJldHVybmVkRW50cnkuaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYltzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJLy8gcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQl0YWJbc2xvdF0gPSBlLm5leHQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCX0KLQkJCQkJSGFzaEJhZy50aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJCUhhc2hCYWcudGhpcy5jb3VudCAtPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5LmNvdW50OwotCQkJCQl0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsJLy8gaXQgY2Fubm90IGJlIHJlbW92ZWQgYWdhaW4KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBVbmlxdWVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKLQkJcHJpdmF0ZSBFbnRyeUl0ZXJhdG9yIGVudHJ5SXRlcmF0b3IgPSBuZXcgRW50cnlJdGVyYXRvcigpOwotCQkKLQkJVW5pcXVlSXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLmVudHJ5SXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIEUgbmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLmVudHJ5SXRlcmF0b3IubmV4dCgpLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRoaXMuZW50cnlJdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCi0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQmFnKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlCYWc8RT4gYiA9IChCYWc8RT4pIG87Ci0JCWlmIChiLnNpemUoKSAhPSB0aGlzLnNpemUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUJhZzxFPiBjbG9uZSA9IHRoaXMuY2xvbmUoKTsKLQkJZm9yIChFIGUgOiBiKSB7Ci0JCQlpZiAoICEgY2xvbmUucmVtb3ZlKGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBjbG9uZS5pc0VtcHR5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IGggPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3QgbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJaCArPSBuZXh0Lmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGg7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgc3RhdGUgb2YgdGhpcyBiYWcgdG8gYSBzdHJlYW0gKGkuZS4gc2VyaWFsaXplIGl0KS4KLQkgKgotCSAqIEBzZXJpYWxEYXRhIEVtaXQgdGhlIGNhcGFjaXR5IG9mIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzIGluIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IGFsbCBvZiB0aGUgYmFnJ3MgZWxlbWVudHMgKGVhY2ggYW4gT2JqZWN0KSBhbmQKLQkgKiAgICAgdGhlaXIgY291bnRzIChlYWNoIGFuIGludCksIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJLy8gd3JpdGUgb3V0IHRoZSB0aHJlc2hvbGQsIGxvYWQgZmFjdG9yLCBhbmQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCi0JCS8vIHdyaXRlIG91dCBudW1iZXIgb2YgYnVja2V0cwotCQlzLndyaXRlSW50KHRoaXMudGFibGUubGVuZ3RoKTsKLQotCQkvLyB3cml0ZSBvdXQgbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlzLndyaXRlSW50KHRoaXMudW5pcXVlQ291bnQpOwotCi0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJLy8gd3JpdGUgb3V0IGVsZW1lbnRzIGFuZCBjb3VudHMgKGFsdGVybmF0aW5nKQotCQlmb3IgKEVudHJ5PEU+IGVudHJ5IDogdGFiKSB7Ci0JCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotCQkJCXMud3JpdGVPYmplY3QoZW50cnkub2JqZWN0KTsKLQkJCQlzLndyaXRlSW50KGVudHJ5LmNvdW50KTsKLQkJCQllbnRyeSA9IGVudHJ5Lm5leHQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFJlY29uc3RpdHV0ZSB0aGUgYmFnIGZyb20gYSBzdHJlYW0gKGkuZS4gZGVzZXJpYWxpemUgaXQpLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyByZWFkIGluIHRoZSB0aHJlc2hvbGQsIGxvYWRmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotCQkvLyByZWFkIGluIG51bWJlciBvZiBidWNrZXRzIGFuZCBhbGxvY2F0ZSB0aGUgYnVja2V0IGFycmF5Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUocy5yZWFkSW50KCkpOwotCi0JCS8vIHJlYWQgaW4gbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlpbnQgdW5pcXVlID0gcy5yZWFkSW50KCk7Ci0KLQkJLy8gcmVhZCB0aGUgZWxlbWVudHMgYW5kIGNvdW50cywgYW5kIHB1dCB0aGUgZWxlbWVudHMgaW4gdGhlIGJhZwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZTsgaSsrKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUUgZWxlbWVudCA9IChFKSBzLnJlYWRPYmplY3QoKTsKLQkJCWludCBlbGVtZW50Q291bnQgPSBzLnJlYWRJbnQoKTsKLQkJCXRoaXMuYWRkKGVsZW1lbnQsIGVsZW1lbnRDb3VudCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzNTAwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgPGNvZGU+QmFnPC9jb2RlPiBpbnRlcmZhY2Ugd2l0aCBhCi0gKiBoYXNoIHRhYmxlLCB1c2luZyBvYmplY3QtaWRlbnRpdHkgaW4gcGxhY2Ugb2Ygb2JqZWN0LWVxdWFsaXR5IHdoZW4KLSAqIGNvbXBhcmluZyBlbGVtZW50cy4gSW4gb3RoZXIgd29yZHMsIGluIGFuIDxjb2RlPklkZW50aXR5SGFzaEJhZzwvY29kZT4sCi0gKiB0d28gb2JqZWN0cyA8Y29kZT5rMTwvY29kZT4gYW5kIDxjb2RlPmsyPC9jb2RlPiBhcmUgY29uc2lkZXJlZAotICogZXF1YWwgaWYgYW5kIG9ubHkgaWYgPGNvZGU+KGsxID09IGsyKTwvY29kZT4uIChJbiBub3JtYWwgPGNvZGU+QmFnPC9jb2RlPgotICogaW1wbGVtZW50YXRpb25zIChsaWtlIDxjb2RlPkhhc2hCYWc8L2NvZGU+KSB0d28gb2JqZWN0cyA8Y29kZT5rMTwvY29kZT4KLSAqIGFuZCA8Y29kZT5rMjwvY29kZT4gYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgYW5kIG9ubHkgaWYKLSAqIDxjb2RlPihrMSA9PSBudWxsID8gazIgPT0gbnVsbCA6IGsxLmVxdWFscyhrMikpPC9jb2RlPi4pCi0gKiA8cD4KLSAqIDxiPgotICogVGhpcyBjbGFzcyBpcyA8aT5ub3Q8L2k+IGEgZ2VuZXJhbC1wdXJwb3NlIDxjb2RlPkJhZzwvY29kZT4KLSAqIGltcGxlbWVudGF0aW9uISBXaGlsZSB0aGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIDxjb2RlPkJhZzwvY29kZT4gaW50ZXJmYWNlLCBpdAotICogaW50ZW50aW9uYWxseSB2aW9sYXRlcyA8Y29kZT5CYWcnczwvY29kZT4gZ2VuZXJhbCBjb250cmFjdCwgd2hpY2ggbWFuZGF0ZXMgdGhlCi0gKiB1c2Ugb2YgdGhlIDxjb2RlPmVxdWFsczwvY29kZT4gbWV0aG9kIHdoZW4gY29tcGFyaW5nIG9iamVjdHMuIFRoaXMgY2xhc3MgaXMKLSAqIGRlc2lnbmVkIGZvciB1c2Ugb25seSBpbiB0aGUgcmFyZSBjYXNlcyB3aGVyZWluIG9iamVjdC1pZGVudGl0eQotICogc2VtYW50aWNzIGFyZSByZXF1aXJlZC4KLSAqIDwvYj4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYWtlcyBubyBndWFyYW50ZWVzIGFzIHRvIHRoZSBpdGVyYXRpb24gb3JkZXIgb2YKLSAqIHRoZSBiYWcncyBlbGVtZW50czsgaW4gcGFydGljdWxhciwgaXQgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIG9yZGVyCi0gKiB3aWxsIHJlbWFpbiBjb25zdGFudCBvdmVyIHRpbWUuIFRoaXMgY2xhc3MgcGVybWl0cyB0aGUgPGNvZGU+bnVsbDwvY29kZT4KLSAqIGVsZW1lbnQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgb2ZmZXJzIGNvbnN0YW50IHRpbWUgcGVyZm9ybWFuY2UgZm9yIHRoZSBiYXNpYyBvcGVyYXRpb25zCi0gKiAoPGNvZGU+YWRkPC9jb2RlPiwgPGNvZGU+cmVtb3ZlPC9jb2RlPiwgPGNvZGU+Y29udGFpbnM8L2NvZGU+IGFuZAotICogPGNvZGU+c2l6ZTwvY29kZT4pLCBhc3N1bWluZyB0aGUgc3lzdGVtIGlkZW50aXR5IGhhc2ggZnVuY3Rpb24KLSAqICh7QGxpbmsgU3lzdGVtI2lkZW50aXR5SGFzaENvZGUoT2JqZWN0KX0pIGRpc3BlcnNlcyBlbGVtZW50cyBwcm9wZXJseQotICogYW1vbmcgdGhlIGJ1Y2tldHMuIEl0ZXJhdGluZyBvdmVyIHRoaXMgYmFnIHJlcXVpcmVzIHRpbWUKLSAqIHByb3BvcnRpb25hbCB0byB0aGUgc3VtIG9mIHRoZSBiYWcncyBzaXplICh0aGUgbnVtYmVyIG9mIGVsZW1lbnRzKSBwbHVzIHRoZQotICogImNhcGFjaXR5IiBvZiB0aGUgYmFja2luZyBoYXNoIHRhYmxlICh0aGUgbnVtYmVyIG9mIGJ1Y2tldHMpLiBUaHVzLCBpdCBpcwotICogaW1wb3J0YW50IG5vdCB0byBzZXQgdGhlIGluaXRpYWwgY2FwYWNpdHkgdG9vIGhpZ2ggKG9yIHRoZSBsb2FkIGZhY3RvciB0b28KLSAqIGxvdykgaWYgaXRlcmF0aW9uIHBlcmZvcm1hbmNlIGlzIGltcG9ydGFudC4KLSAqIDxwPgotICogPGI+Tm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC48L2I+IElmIG11bHRpcGxlCi0gKiB0aHJlYWRzIGFjY2VzcyBhIGJhZyBjb25jdXJyZW50bHksIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlIHRocmVhZHMgbW9kaWZpZXMKLSAqIHRoZSBiYWcsIGl0IDxpPm11c3Q8L2k+IGJlIHN5bmNocm9uaXplZCBleHRlcm5hbGx5LiBUaGlzIGlzIHR5cGljYWxseQotICogYWNjb21wbGlzaGVkIGJ5IHN5bmNocm9uaXppbmcgb24gc29tZSBvYmplY3QgdGhhdCBuYXR1cmFsbHkgZW5jYXBzdWxhdGVzCi0gKiB0aGUgYmFnLiBJZiBubyBzdWNoIG9iamVjdCBleGlzdHMsIHRoZSBiYWcgc2hvdWxkIGJlICJ3cmFwcGVkIiB1c2luZyB0aGUKLSAqIDxjb2RlPkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb248L2NvZGU+IG1ldGhvZC4gVGhpcyBpcwotICogYmVzdCBkb25lIGF0IGNyZWF0aW9uIHRpbWUsIHRvIHByZXZlbnQgYWNjaWRlbnRhbCB1bnN5bmNocm9uaXplZCBhY2Nlc3MKLSAqIHRvIHRoZSBiYWc6Ci0gKiA8cHJlPgotICogQ29sbGVjdGlvbiBjID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbihuZXcgSWRlbnRpdHlIYXNoQmFnKC4uLikpOwotICogPC9wcmU+Ci0gKiA8cD4KLSAqIFRoZSBpdGVyYXRvcnMgcmV0dXJuZWQgYnkgdGhpcyBjbGFzcydzIDxjb2RlPml0ZXJhdG9yPC9jb2RlPiBtZXRob2QgYXJlCi0gKiA8aT5mYWlsLWZhc3Q8L2k+OiBpZiB0aGUgYmFnIGlzIG1vZGlmaWVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBpdGVyYXRvciBpcwotICogY3JlYXRlZCwgaW4gYW55IHdheSBleGNlcHQgdGhyb3VnaCB0aGUgaXRlcmF0b3IncyBvd24gPGNvZGU+cmVtb3ZlPC9jb2RlPgotICogbWV0aG9kLCB0aGUgaXRlcmF0b3IgdGhyb3dzIGEgPGNvZGU+Q29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjwvY29kZT4uCi0gKiBUaHVzLCBpbiB0aGUgZmFjZSBvZiBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiwgdGhlIGl0ZXJhdG9yIGZhaWxzIHF1aWNrbHkKLSAqIGFuZCBjbGVhbmx5LCByYXRoZXIgdGhhbiByaXNraW5nIGFyYml0cmFyeSwgbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IgYXQKLSAqIGFuIHVuZGV0ZXJtaW5lZCB0aW1lIGluIHRoZSBmdXR1cmUuCi0gKiAKLSAqIEBzZWUJQ29sbGVjdGlvbnMjc3luY2hyb25pemVkQ29sbGVjdGlvbihDb2xsZWN0aW9uKQotICovCi0KLXB1YmxpYyBjbGFzcyBJZGVudGl0eUhhc2hCYWc8RT4KLQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbjxFPgotCWltcGxlbWVudHMgQmFnPEU+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCi0JLyoqIFRoZSBoYXNoIHRhYmxlLiAqLwotCXRyYW5zaWVudCBFbnRyeTxFPltdIHRhYmxlOwotCi0JLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgY291bnQgPSAwOwotCi0JLyoqIFRoZSBudW1iZXIgb2YgdW5pcXVlIGVudHJpZXMgaW4gdGhlIGJhZy4gKi8KLQl0cmFuc2llbnQgaW50IHVuaXF1ZUNvdW50ID0gMDsKLQotCS8qKgotCSAqIFRoZSBoYXNoIHRhYmxlIGlzIHJlaGFzaGVkIHdoZW4gaXRzIHNpemUgZXhjZWVkcyB0aGlzIHRocmVzaG9sZC4gKFRoZQotCSAqIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgKGludCkoY2FwYWNpdHkgKiBsb2FkRmFjdG9yKS4pCi0JICoKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBpbnQgdGhyZXNob2xkOwotCi0JLyoqCi0JICogVGhlIGxvYWQgZmFjdG9yIGZvciB0aGUgaGFzaCB0YWJsZS4KLQkgKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIGZsb2F0IGxvYWRGYWN0b3I7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgYmFnIGhhcyBiZWVuIHN0cnVjdHVyYWxseSBtb2RpZmllZC4KLQkgKiBTdHJ1Y3R1cmFsIG1vZGlmaWNhdGlvbnMgYXJlIHRob3NlIHRoYXQgY2hhbmdlIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbgotCSAqIHRoZSBiYWcgb3Igb3RoZXJ3aXNlIG1vZGlmeSBpdHMgaW50ZXJuYWwgc3RydWN0dXJlIChlLmcuIHJlaGFzaCkuCi0JICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIG1ha2UgaXRlcmF0b3JzIG9uIHRoaXMgYmFnIGZhaWwtZmFzdC4KLQkgKgotCSAqIEBzZWUgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkgKi8KLQl0cmFuc2llbnQgaW50IG1vZENvdW50ID0gMDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGJhZyB3aXRoIHRoZQotCSAqIGRlZmF1bHQgY2FwYWNpdHksIHdoaWNoIGlzIDExLCBhbmQgbG9hZCBmYWN0b3IsIHdoaWNoIGlzIDAuNzUuCi0JICovCi0JcHVibGljIElkZW50aXR5SGFzaEJhZygpIHsKLQkJdGhpcygxMSwgMC43NWYpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGJhZyB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eQotCSAqIGFuZCBkZWZhdWx0IGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LgotCSAqCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgYmFja2luZyBtYXAuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8uCi0JICovCi0JcHVibGljIElkZW50aXR5SGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCXRoaXMoaW5pdGlhbENhcGFjaXR5LCAwLjc1Zik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgYmFnIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kIHRoZSBzcGVjaWZpZWQgbG9hZCBmYWN0b3IuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoZSBiYWNraW5nIG1hcC4KLQkgKiBAcGFyYW0gbG9hZEZhY3RvciB0aGUgbG9hZCBmYWN0b3Igb2YgdGhlIGJhY2tpbmcgbWFwLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIGxlc3MKLQkgKiAgICAgdGhhbiB6ZXJvLCBvciBpZiB0aGUgbG9hZCBmYWN0b3IgaXMgbm9ucG9zaXRpdmUuCi0JICovCi0JcHVibGljIElkZW50aXR5SGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0JCWlmIChpbml0aWFsQ2FwYWNpdHkgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIEluaXRpYWwgQ2FwYWNpdHk6ICIgKyBpbml0aWFsQ2FwYWNpdHkpOwotCQl9Ci0JCWlmIChsb2FkRmFjdG9yIDw9IDAgfHwgRmxvYXQuaXNOYU4obG9hZEZhY3RvcikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgTG9hZCBmYWN0b3I6ICIgKyBsb2FkRmFjdG9yKTsKLQkJfQotCQlpZiAoaW5pdGlhbENhcGFjaXR5ID09IDApIHsKLQkJCWluaXRpYWxDYXBhY2l0eSA9IDE7Ci0JCX0KLQkJdGhpcy5sb2FkRmFjdG9yID0gbG9hZEZhY3RvcjsKLQkJdGhpcy50YWJsZSA9IHRoaXMuYnVpbGRUYWJsZShpbml0aWFsQ2FwYWNpdHkpOwotCQl0aGlzLnRocmVzaG9sZCA9IChpbnQpIChpbml0aWFsQ2FwYWNpdHkgKiBsb2FkRmFjdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGJhZyBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogY29sbGVjdGlvbi4gVGhlIGNhcGFjaXR5IG9mIHRoZSBiYWcgaXMKLQkgKiB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb3IgMTEgKHdoaWNoZXZlciBpcwotCSAqIGdyZWF0ZXIpLCBhbmQgdGhlIGRlZmF1bHQgbG9hZCBmYWN0b3IsIHdoaWNoIGlzIDAuNzUsIGlzIHVzZWQuCi0JICoKLQkgKiBAcGFyYW0gYyB0aGUgY29sbGVjdGlvbiB3aG9zZSBlbGVtZW50cyBhcmUgdG8gYmUgcGxhY2VkIGludG8gdGhpcyBiYWcuCi0JICovCi0JcHVibGljIElkZW50aXR5SGFzaEJhZyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXRoaXMoTWF0aC5tYXgoMipjLnNpemUoKSwgMTEpKTsKLQkJdGhpcy5hZGRBbGwoYyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgbWFpbnRhaW5lZCBjb3VudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvdW50OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNvbXBhcmVzIHRoZSBtYWludGFpbmVkIGNvdW50IHRvIHplcm8uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuY291bnQgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5Ci0JICogY2FsY3VsYXRpbmcgdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZQotCSAqIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaCB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQlpbnQgaGFzaCA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pOwotCQlpbnQgaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJZm9yIChFbnRyeTxFPiBlID0gdGFiW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoZS5vYmplY3QgPT0gbykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGludCBjb3VudChPYmplY3QgbykgewotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCWludCBoYXNoID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobyk7Ci0JCWludCBpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmIChlLm9iamVjdCA9PSBvKSkgewotCQkJCXJldHVybiBlLmNvdW50OwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFJlaGFzaGVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGJhZyBpbnRvIGEgbmV3IGhhc2ggdGFibGUKLQkgKiB3aXRoIGEgbGFyZ2VyIGNhcGFjaXR5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKLQkgKiBudW1iZXIgb2YgZGlmZmVyZW50IGVsZW1lbnRzIGluIHRoaXMgbWFwIGV4Y2VlZHMgaXRzCi0JICogY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWhhc2goKSB7Ci0JCUVudHJ5PEU+W10gb2xkTWFwID0gdGhpcy50YWJsZTsKLQkJaW50IG9sZENhcGFjaXR5ID0gb2xkTWFwLmxlbmd0aDsKLQotCQlpbnQgbmV3Q2FwYWNpdHkgPSBvbGRDYXBhY2l0eSAqIDIgKyAxOwotCQlFbnRyeTxFPltdIG5ld1RhYmxlID0gdGhpcy5idWlsZFRhYmxlKG5ld0NhcGFjaXR5KTsKLQotCQl0aGlzLm1vZENvdW50Kys7Ci0JCXRoaXMudGhyZXNob2xkID0gKGludCkgKG5ld0NhcGFjaXR5ICogdGhpcy5sb2FkRmFjdG9yKTsKLQkJdGhpcy50YWJsZSA9IG5ld1RhYmxlOwotCi0JCWZvciAoaW50IGkgPSBvbGRDYXBhY2l0eTsgaS0tID4gMDsgKSB7Ci0JCQlmb3IgKEVudHJ5PEU+IG9sZCA9IG9sZE1hcFtpXTsgb2xkICE9IG51bGw7ICkgewotCQkJCUVudHJ5PEU+IGUgPSBvbGQ7Ci0JCQkJb2xkID0gb2xkLm5leHQ7Ci0KLQkJCQlpbnQgaW5kZXggPSAoZS5oYXNoICYgMHg3RkZGRkZGRikgJSBuZXdDYXBhY2l0eTsKLQkJCQllLm5leHQgPSBuZXdUYWJsZVtpbmRleF07Ci0JCQkJbmV3VGFibGVbaW5kZXhdID0gZTsKLQkJCX0KLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRW50cnk8RT5bXSBidWlsZFRhYmxlKGludCBjYXBhY2l0eSkgewotCQlyZXR1cm4gbmV3IEVudHJ5W2NhcGFjaXR5XTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIDxUPiBFbnRyeTxFPiBidWlsZEVudHJ5KGludCBoYXNoLCBPYmplY3QgbywgRW50cnk8VD4gbmV4dCkgewotCQlyZXR1cm4gbmV3IEVudHJ5KGhhc2gsIG8sIG5leHQpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgPFQ+IEVudHJ5PEU+IGJ1aWxkRW50cnkoaW50IGhhc2gsIE9iamVjdCBvLCBpbnQgY250LCBFbnRyeTxUPiBuZXh0KSB7Ci0JCXJldHVybiBuZXcgRW50cnkoaGFzaCwgbywgY250LCBuZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5Ci0JICogY2FsY3VsYXRpbmcgdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZQotCSAqIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaCB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQl0aGlzLm1vZENvdW50Kys7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJaW50IGhhc2ggPSAwOwotCQlpbnQgaW5kZXggPSAwOwotCi0JCS8vIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbiB0aGUgYmFnLCBzaW1wbHkgYnVtcCBpdHMgY291bnQKLQkJaGFzaCA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pOwotCQlpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmIChlLm9iamVjdCA9PSBvKSkgewotCQkJCWUuY291bnQrKzsKLQkJCQl0aGlzLmNvdW50Kys7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZWhhc2ggdGhlIHRhYmxlIGlmIHRoZSB0aHJlc2hvbGQgaXMgZXhjZWVkZWQKLQkJaWYgKHRoaXMudW5pcXVlQ291bnQgPj0gdGhpcy50aHJlc2hvbGQpIHsKLQkJCXRoaXMucmVoYXNoKCk7Ci0JCQl0YWIgPSB0aGlzLnRhYmxlOwotCQkJaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgbmV3IGVudHJ5IGFuZCBwdXQgaXQgaW4gdGhlIHRhYmxlCi0JCUVudHJ5PEU+IGUgPSB0aGlzLmJ1aWxkRW50cnkoaGFzaCwgbywgdGFiW2luZGV4XSk7Ci0JCXRhYltpbmRleF0gPSBlOwotCQl0aGlzLmNvdW50Kys7Ci0JCXRoaXMudW5pcXVlQ291bnQrKzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieQotCSAqIGNhbGN1bGF0aW5nIHRoZSBvYmplY3QncyBpZGVudGl0eSBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUKLQkgKiBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2ggdGFibGUgYnVja2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZChFIG8sIGludCBjbnQpIHsKLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdGhpcy5tb2RDb3VudCsrOwotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCWludCBoYXNoID0gMDsKLQkJaW50IGluZGV4ID0gMDsKLQotCQkvLyBpZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgaW4gdGhlIGJhZywgc2ltcGx5IGJ1bXAgaXRzIGNvdW50Ci0JCWhhc2ggPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKTsKLQkJaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJZm9yIChFbnRyeTxFPiBlID0gdGFiW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoZS5vYmplY3QgPT0gbykpIHsKLQkJCQllLmNvdW50ICs9IGNudDsKLQkJCQl0aGlzLmNvdW50ICs9IGNudDsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlaGFzaCB0aGUgdGFibGUgaWYgdGhlIHRocmVzaG9sZCBpcyBleGNlZWRlZAotCQlpZiAodGhpcy51bmlxdWVDb3VudCA+PSB0aGlzLnRocmVzaG9sZCkgewotCQkJdGhpcy5yZWhhc2goKTsKLQkJCXRhYiA9IHRoaXMudGFibGU7Ci0JCQlpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBuZXcgZW50cnkgYW5kIHB1dCBpdCBpbiB0aGUgdGFibGUKLQkJRW50cnk8RT4gZSA9IHRoaXMuYnVpbGRFbnRyeShoYXNoLCBvLCBjbnQsIHRhYltpbmRleF0pOwotCQl0YWJbaW5kZXhdID0gZTsKLQkJdGhpcy5jb3VudCArPSBjbnQ7Ci0JCXRoaXMudW5pcXVlQ291bnQrKzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieQotCSAqIGNhbGN1bGF0aW5nIHRoZSBvYmplY3QncyBpZGVudGl0eSBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUKLQkgKiBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2ggdGFibGUgYnVja2V0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCWludCBoYXNoID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobyk7Ci0JCWludCBpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbaW5kZXhdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgKGUub2JqZWN0ID09IG8pKSB7Ci0JCQkJdGhpcy5tb2RDb3VudCsrOwotCQkJCWUuY291bnQtLTsKLQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3Qgb25lLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJaWYgKGUuY291bnQgPT0gMCkgewotCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQl0YWJbaW5kZXhdID0gZS5uZXh0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQl9Ci0JCQkJCXRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQl9Ci0JCQkJdGhpcy5jb3VudC0tOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5Ci0JICogY2FsY3VsYXRpbmcgdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZQotCSAqIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaCB0YWJsZSBidWNrZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY250KSB7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJaW50IGhhc2ggPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKTsKLQkJaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCWZvciAoRW50cnk8RT4gZSA9IHRhYltpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoZS5vYmplY3QgPT0gbykpIHsKLQkJCQl0aGlzLm1vZENvdW50Kys7Ci0JCQkJaW50IGNudDIgPSAoY250IDwgZS5jb3VudCkgPyBjbnQgOiBlLmNvdW50OwotCQkJCWUuY291bnQgLT0gY250MjsKLQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3QgZWxlbWVudChzKSwgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCWlmIChlLmNvdW50ID09IDApIHsKLQkJCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCQkJdGFiW2luZGV4XSA9IGUubmV4dDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJfQotCQkJCQl0aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJfQotCQkJCXRoaXMuY291bnQgLT0gY250MjsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIG9iamVjdC1pZGVudGl0eSB0byBkZXRlcm1pbmUgd2hldGhlcgotCSAqIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGEgcGFydGljdWxhciBlbGVtZW50LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHN1cGVyLnJlbW92ZUFsbCh0aGlzLmJ1aWxkSWRlbnRpdHlIYXNoQmFnKGMpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgb2JqZWN0LWlkZW50aXR5IHRvIGRldGVybWluZSB3aGV0aGVyCi0JICogc3BlY2lmaWVkIGNvbGxlY3Rpb24gY29udGFpbnMgYSBwYXJ0aWN1bGFyIGVsZW1lbnQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gc3VwZXIucmV0YWluQWxsKHRoaXMuYnVpbGRJZGVudGl0eUhhc2hCYWcoYykpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgQ29sbGVjdGlvbjw/PiBidWlsZElkZW50aXR5SGFzaEJhZyhDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIG5ldyBJZGVudGl0eUhhc2hCYWcoYyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY2xlYXJzIG91dCBhbGwgb2YgdGhlIGhhc2ggdGFibGUgYnVja2V0cy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQl0aGlzLm1vZENvdW50Kys7Ci0JCWZvciAoaW50IGkgPSB0YWIubGVuZ3RoOyAtLWkgPj0gMDsgKSB7Ci0JCQl0YWJbaV0gPSBudWxsOwotCQl9Ci0JCXRoaXMuY291bnQgPSAwOwotCQl0aGlzLnVuaXF1ZUNvdW50ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgYmFnOiB0aGUgZWxlbWVudHMKLQkgKiB0aGVtc2VsdmVzIGFyZSBub3QgY2xvbmVkLgotCSAqCi0JICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGJhZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnPEU+IGNsb25lKCkgewotCQl0cnkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlJZGVudGl0eUhhc2hCYWc8RT4gY2xvbmUgPSAoSWRlbnRpdHlIYXNoQmFnPEU+KSBzdXBlci5jbG9uZSgpOwotCQkJY2xvbmUudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUodGhpcy50YWJsZS5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IHRoaXMudGFibGUubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQljbG9uZS50YWJsZVtpXSA9ICh0aGlzLnRhYmxlW2ldID09IG51bGwpIAotCQkJCQkJPyBudWxsIDogKEVudHJ5PEU+KSB0aGlzLnRhYmxlW2ldLmNsb25lKCk7Ci0JCQl9Ci0JCQljbG9uZS5tb2RDb3VudCA9IDA7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEhhc2ggdGFibGUgY29sbGlzaW9uIGxpc3QgZW50cnkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnk8RT4gaW1wbGVtZW50cyBCYWcuRW50cnk8RT4gewotCQlpbnQgaGFzaDsKLQkJRSBvYmplY3Q7Ci0JCWludCBjb3VudDsKLQkJRW50cnk8RT4gbmV4dDsKLQotCQlFbnRyeShpbnQgaGFzaCwgRSBvYmplY3QsIEVudHJ5PEU+IG5leHQpIHsKLQkJCXRoaXMoaGFzaCwgb2JqZWN0LCAxLCBuZXh0KTsKLQkJfQotCi0JCUVudHJ5KGludCBoYXNoLCBFIG9iamVjdCwgaW50IGNvdW50LCBFbnRyeTxFPiBuZXh0KSB7Ci0JCQl0aGlzLmhhc2ggPSBoYXNoOwotCQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQl0aGlzLm5leHQgPSBuZXh0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENhc2NhZGUgdGhlIGNsb25lIHRvIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgc2FtZSBidWNrZXQuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXByb3RlY3RlZCBFbnRyeTxFPiBjbG9uZSgpIHsKLQkJCXJldHVybiBuZXcgRW50cnkodGhpcy5oYXNoLCB0aGlzLm9iamVjdCwgdGhpcy5jb3VudCwKLQkJCQkJKHRoaXMubmV4dCA9PSBudWxsID8gbnVsbCA6IHRoaXMubmV4dC5jbG9uZSgpKSk7Ci0JCX0KLQotCi0JCS8vICoqKioqIEJhZy5FbnRyeSBpbXBsZW1lbnRhdGlvbgotCQlwdWJsaWMgRSBnZXRFbGVtZW50KCkgewotCQkJcmV0dXJuIHRoaXMub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmNvdW50OwotCQl9Ci0KLQkJcHVibGljIGludCBzZXRDb3VudChpbnQgY291bnQpIHsKLQkJCWlmIChjb3VudCA8PSAwKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybzogIiArIGNvdW50KTsKLQkJCX0KLQkJCWludCBvbGQgPSB0aGlzLmNvdW50OwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQkJcmV0dXJuIG9sZDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmICggISAobyBpbnN0YW5jZW9mIEJhZy5FbnRyeSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUJhZy5FbnRyeSBlID0gKEJhZy5FbnRyeSkgbzsKLQkJCXJldHVybiAodGhpcy5vYmplY3QgPT0gZS5nZXRFbGVtZW50KCkpCi0JCQkJCSYmICh0aGlzLmNvdW50ID09IGUuZ2V0Q291bnQoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCUUgbyA9IHRoaXMub2JqZWN0OwotCQkJcmV0dXJuIChvID09IG51bGwpID8gMCA6ICh0aGlzLmNvdW50ICogby5oYXNoQ29kZSgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMub2JqZWN0ICsgIj0+IiArIHRoaXMuY291bnQ7Ci0JCX0KLQl9Ci0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLmNvdW50ID09IDApID8gRU1QVFlfSVRFUkFUT1IgOiBuZXcgSGFzaEl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBlYWNoIGl0ZW0gaW4gdGhlIGJhZwotCSAqIG9uY2UgYW5kIG9ubHkgb25jZSwgaXJyZXNwZWN0aXZlIG9mIGhvdyBtYW55IHRpbWVzCi0JICogdGhlIGl0ZW0gd2FzIGFkZGVkIHRvIHRoZSBiYWcuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuY291bnQgPT0gMCkgPyBFTVBUWV9JVEVSQVRPUiA6IG5ldyBVbmlxdWVJdGVyYXRvcigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxCYWcuRW50cnk8RT4+IGVudHJpZXMoKSB7Ci0JCXJldHVybiAodGhpcy5jb3VudCA9PSAwKSA/IEVNUFRZX0lURVJBVE9SIDogbmV3IEVudHJ5SXRlcmF0b3IoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEVtcHR5IGl0ZXJhdG9yIHRoYXQgZG9lcyBqdXN0IGFib3V0IG5vdGhpbmcuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmF0b3IgRU1QVFlfSVRFUkFUT1IgPSBuZXcgRW1wdHlJdGVyYXRvcigpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW1wdHlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotCQlFbXB0eUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIEhhc2hJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKLQkJcHJpdmF0ZSBFbnRyeTxFPltdIGxvY2FsVGFibGUgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZTsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSB0aGlzLmxvY2FsVGFibGUubGVuZ3RoOwkvLyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZQotCQlwcml2YXRlIEVudHJ5PEU+IG5leHRFbnRyeSA9IG51bGw7Ci0JCXByaXZhdGUgaW50IG5leHRFbnRyeUNvdW50ID0gMDsKLQkJcHJpdmF0ZSBFbnRyeTxFPiBsYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtb2RDb3VudCB2YWx1ZSB0aGF0IHRoZSBpdGVyYXRvciBiZWxpZXZlcyB0aGF0IHRoZSBiYWNraW5nCi0JCSAqIGJhZyBzaG91bGQgaGF2ZS4gSWYgdGhpcyBleHBlY3RhdGlvbiBpcyB2aW9sYXRlZCwgdGhlIGl0ZXJhdG9yCi0JCSAqIGhhcyBkZXRlY3RlZCBhIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgZXhwZWN0ZWRNb2RDb3VudCA9IElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUhhc2hJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZSA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZSA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZTsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJcmV0dXJuIGUgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlpZiAoSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGV0ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMubG9jYWxUYWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChldCA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZXQgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGV0OwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlpZiAoZXQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IHRoaXMubmV4dEVudHJ5OwotCQkJdGhpcy5uZXh0RW50cnlDb3VudCsrOwotCQkJaWYgKHRoaXMubmV4dEVudHJ5Q291bnQgPT0gZS5jb3VudCkgewotCQkJCXRoaXMubmV4dEVudHJ5ID0gZS5uZXh0OwotCQkJCXRoaXMubmV4dEVudHJ5Q291bnQgPSAwOwotCQkJfQotCQkJcmV0dXJuIGUub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaWYgKHRoaXMubGFzdFJldHVybmVkRW50cnkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQlpbnQgc2xvdCA9ICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5Lmhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbc2xvdF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUgPT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSkgewotCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJZS5jb3VudC0tOwotCQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3Qgb25lLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQkJdGFiW3Nsb3RdID0gZS5uZXh0OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy51bmlxdWVDb3VudC0tOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gc2xpZGUgYmFjayB0aGUgY291bnQgdG8gYWNjb3VudCBmb3IgdGhlIGp1c3QtcmVtb3ZlZCBlbGVtZW50Ci0JCQkJCQl0aGlzLm5leHRFbnRyeUNvdW50LS07Ci0JCQkJCX0KLQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMuY291bnQtLTsKLQkJCQkJdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7CS8vIGl0IGNhbm5vdCBiZSByZW1vdmVkIGFnYWluCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIEVudHJ5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFbnRyeTxFPj4gewotCQlwcml2YXRlIEVudHJ5PEU+W10gbG9jYWxUYWJsZSA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlOwotCQlwcml2YXRlIGludCBpbmRleCA9IHRoaXMubG9jYWxUYWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCXByaXZhdGUgRW50cnk8RT4gbmV4dEVudHJ5ID0gbnVsbDsKLQkJcHJpdmF0ZSBFbnRyeTxFPiBsYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtb2RDb3VudCB2YWx1ZSB0aGF0IHRoZSBpdGVyYXRvciBiZWxpZXZlcyB0aGF0IHRoZSBiYWNraW5nCi0JCSAqIGJhZyBzaG91bGQgaGF2ZS4gSWYgdGhpcyBleHBlY3RhdGlvbiBpcyB2aW9sYXRlZCwgdGhlIGl0ZXJhdG9yCi0JCSAqIGhhcyBkZXRlY3RlZCBhIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgZXhwZWN0ZWRNb2RDb3VudCA9IElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUVudHJ5SXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCUVudHJ5PEU+IGUgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gdGhpcy5sb2NhbFRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGUgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWUgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGU7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCXJldHVybiBlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRW50cnk8RT4gbmV4dCgpIHsKLQkJCWlmIChJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZXQgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gdGhpcy5sb2NhbFRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGV0ID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQlldCA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZXQ7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCWlmIChldCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGUgPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGUubmV4dDsKLQkJCXJldHVybiBlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaWYgKHRoaXMubGFzdFJldHVybmVkRW50cnkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQlpbnQgc2xvdCA9ICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5Lmhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbc2xvdF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUgPT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSkgewotCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJLy8gcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQl0YWJbc2xvdF0gPSBlLm5leHQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCX0KLQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMuY291bnQgLT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5jb3VudDsKLQkJCQkJdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7CS8vIGl0IGNhbm5vdCBiZSByZW1vdmVkIGFnYWluCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVW5pcXVlSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7Ci0JCXByaXZhdGUgRW50cnlJdGVyYXRvciBlbnRyeUl0ZXJhdG9yID0gbmV3IEVudHJ5SXRlcmF0b3IoKTsKLQkJCi0JCVVuaXF1ZUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRyeUl0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRyeUl0ZXJhdG9yLm5leHQoKS5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aGlzLmVudHJ5SXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJZGVudGl0eUhhc2hCYWcpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJSWRlbnRpdHlIYXNoQmFnPEU+IGIgPSAoSWRlbnRpdHlIYXNoQmFnPEU+KSBvOwotCQkJaWYgKGIuc2l6ZSgpICE9IHRoaXMuc2l6ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJSWRlbnRpdHlIYXNoQmFnPEU+IGNsb25lID0gdGhpcy5jbG9uZSgpOwotCQkJZm9yIChFIGUgOiBiKSB7Ci0JCQkJaWYgKCAhIGNsb25lLnJlbW92ZShlKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNsb25lLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQmFnKSB7Ci0JCQkvLyBobW1tLi4uCi0JCQlyZXR1cm4gdGhpcy5idWlsZEJhZygpLmVxdWFscyhvKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgQmFnPEU+IGJ1aWxkQmFnKCkgewotCQlyZXR1cm4gbmV3IEhhc2hCYWcodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IGggPSAwOwotCQlmb3IgKEUgZSA6IHRoaXMpIHsKLQkJCWggKz0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZSk7Ci0JCX0KLQkJcmV0dXJuIGg7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgc3RhdGUgb2YgdGhpcyBiYWcgdG8gYSBzdHJlYW0gKGkuZS4gc2VyaWFsaXplIGl0KS4KLQkgKgotCSAqIEBzZXJpYWxEYXRhIEVtaXQgdGhlIGNhcGFjaXR5IG9mIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzIGluIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IGFsbCBvZiB0aGUgYmFnJ3MgZWxlbWVudHMgKGVhY2ggYW4gT2JqZWN0KSBhbmQKLQkgKiAgICAgdGhlaXIgY291bnRzIChlYWNoIGFuIGludCksIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJLy8gd3JpdGUgb3V0IHRoZSB0aHJlc2hvbGQsIGxvYWQgZmFjdG9yLCBhbmQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCi0JCS8vIHdyaXRlIG91dCBudW1iZXIgb2YgYnVja2V0cwotCQlzLndyaXRlSW50KHRoaXMudGFibGUubGVuZ3RoKTsKLQotCQkvLyB3cml0ZSBvdXQgbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlzLndyaXRlSW50KHRoaXMudW5pcXVlQ291bnQpOwotCi0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJLy8gd3JpdGUgb3V0IGVsZW1lbnRzIGFuZCBjb3VudHMgKGFsdGVybmF0aW5nKQotCQlmb3IgKEVudHJ5PEU+IGVudHJ5IDogdGFiKSB7Ci0JCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotCQkJCXMud3JpdGVPYmplY3QoZW50cnkub2JqZWN0KTsKLQkJCQlzLndyaXRlSW50KGVudHJ5LmNvdW50KTsKLQkJCQllbnRyeSA9IGVudHJ5Lm5leHQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFJlY29uc3RpdHV0ZSB0aGUgYmFnIGZyb20gYSBzdHJlYW0gKGkuZS4gZGVzZXJpYWxpemUgaXQpLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyByZWFkIGluIHRoZSB0aHJlc2hvbGQsIGxvYWRmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotCQkvLyByZWFkIGluIG51bWJlciBvZiBidWNrZXRzIGFuZCBhbGxvY2F0ZSB0aGUgYnVja2V0IGFycmF5Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUocy5yZWFkSW50KCkpOwotCi0JCS8vIHJlYWQgaW4gbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlpbnQgdW5pcXVlID0gcy5yZWFkSW50KCk7Ci0KLQkJLy8gcmVhZCB0aGUgZWxlbWVudHMgYW5kIGNvdW50cywgYW5kIHB1dCB0aGUgZWxlbWVudHMgaW4gdGhlIGJhZwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZTsgaSsrKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUUgZWxlbWVudCA9IChFKSBzLnJlYWRPYmplY3QoKTsKLQkJCWludCBlbGVtZW50Q291bnQgPSBzLnJlYWRJbnQoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudENvdW50OyBqKyspIHsKLQkJCQl0aGlzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0luZGVudGluZ1ByaW50V3JpdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSW5kZW50aW5nUHJpbnRXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhZmIxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSW5kZW50aW5nUHJpbnRXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqCi0gKiBFeHRlbmQgUHJpbnRXcml0ZXIgdG8gYXV0b21hdGljYWxseSBpbmRlbnQgbmV3IGxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgSW5kZW50aW5nUHJpbnRXcml0ZXIgZXh0ZW5kcyBQcmludFdyaXRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpbmRlbnQ7Ci0JcHJpdmF0ZSBpbnQgaW5kZW50TGV2ZWw7Ci0JcHJpdmF0ZSBib29sZWFuIG5lZWRzSW5kZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9JTkRFTlQgPSAiXHQiOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0ZXIgdGhhdCBpbmRlbnRzIHdpdGggdGFicy4KLQkgKi8KLQlwdWJsaWMgSW5kZW50aW5nUHJpbnRXcml0ZXIoV3JpdGVyIG91dCkgewotCQl0aGlzKG91dCwgREVGQVVMVF9JTkRFTlQpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0ZXIgdGhhdCBpbmRlbnRzIHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICovCi0JcHVibGljIEluZGVudGluZ1ByaW50V3JpdGVyKFdyaXRlciBvdXQsIFN0cmluZyBpbmRlbnQpIHsKLQkJc3VwZXIob3V0KTsKLQkJdGhpcy5pbmRlbnQgPSBpbmRlbnQ7Ci0JCXRoaXMuaW5kZW50TGV2ZWwgPSAwOwotCQl0aGlzLm5lZWRzSW5kZW50ID0gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IGZsYWcgc28gZm9sbG93aW5nIGxpbmUgaXMgaW5kZW50ZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRsbigpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXN1cGVyLnByaW50bG4oKTsKLQkJCXRoaXMubmVlZHNJbmRlbnQgPSB0cnVlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByaW50IHRoZSBhcHByb3ByaWF0ZSBpbmRlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50SW5kZW50KCkgewotCQlpZiAodGhpcy5uZWVkc0luZGVudCkgewotCQkJdGhpcy5uZWVkc0luZGVudCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IHRoaXMuaW5kZW50TGV2ZWw7IGktLSA+IDA7ICkgewotCQkJCXRoaXMucHJpbnQodGhpcy5pbmRlbnQpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10sIGludCBvZmYsIGludCBsZW4pIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMucHJpbnRJbmRlbnQoKTsKLQkJCXN1cGVyLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFdyaXRlIGEgc2luZ2xlIGNoYXJhY3Rlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5wcmludEluZGVudCgpOwotCQkJc3VwZXIud3JpdGUoYyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogV3JpdGUgYSBwb3J0aW9uIG9mIGEgc3RyaW5nLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzLCBpbnQgb2ZmLCBpbnQgbGVuKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQl0aGlzLnByaW50SW5kZW50KCk7Ci0JCQlzdXBlci53cml0ZShzLCBvZmYsIGxlbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVtcCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGluZGVudCgpIHsKLQkJdGhpcy5pbmNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCX0KLQkKLQkvKioKLQkgKiBEZWNyZW1lbnQgdGhlIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRlbnQoKSB7Ci0JCXRoaXMuZGVjcmVtZW50SW5kZW50TGV2ZWwoKTsKLQl9Ci0JCi0JLyoqCi0JICogQnVtcCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGluY3JlbWVudEluZGVudExldmVsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5pbmRlbnRMZXZlbCsrOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERlY3JlbWVudCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlY3JlbWVudEluZGVudExldmVsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5pbmRlbnRMZXZlbC0tOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBpbmRlbnQgbGV2ZWwuCi0JICovCi0JcHVibGljIGludCBpbmRlbnRMZXZlbCgpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZW50TGV2ZWw7Ci0JfQotCQotCS8qKgotCSAqIEFsbG93IHRoZSBpbmRlbnQgbGV2ZWwgdG8gYmUgc2V0IGRpcmVjdGx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZGVudExldmVsKGludCBpbmRlbnRMZXZlbCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5pbmRlbnRMZXZlbCA9IGluZGVudExldmVsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NzM2NDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0pEQkNUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnNxbC5UeXBlczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotCi0vKioKLSAqIEhlbHBlciBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggdGhlIEpEQkMgQVBJLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSkRCQ1Rvb2xzIHsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIGpkYmNUeXBlRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUphdmFUb0pEQkNUeXBlTWFwcGluZyBtYXBwaW5nID0gamF2YVRvSkRCQ1R5cGVNYXBwaW5nKGNsYXNzTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IERFRkFVTFRfSkRCQ19UWVBFIDogbWFwcGluZy5nZXRKREJDVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSBqZGJjVHlwZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGpkYmNUeXBlRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgamRiY1R5cGVGb3IoSmF2YVR5cGUgamF2YVR5cGUpIHsKLQkJcmV0dXJuIGpkYmNUeXBlRm9yQ2xhc3NOYW1lZChqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3JKREJDVHlwZU5hbWVkKFN0cmluZyBqZGJjVHlwZU5hbWUpIHsKLQkJSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIG1hcHBpbmcgPSBqZGJjVG9KYXZhVHlwZU1hcHBpbmcoamRiY1R5cGVOYW1lKTsKLQkJcmV0dXJuIChtYXBwaW5nID09IG51bGwpID8gREVGQVVMVF9KQVZBX1RZUEUgOiBtYXBwaW5nLmdldEphdmFUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEpEQkMgdHlwZS4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZSBqYXZhVHlwZUZvcihKREJDVHlwZSBqZGJjVHlwZSkgewotCQlyZXR1cm4gamF2YVR5cGVGb3JKREJDVHlwZU5hbWVkKGpkYmNUeXBlLm5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEpEQkMgdHlwZS4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZSBqYXZhVHlwZUZvckpEQkNUeXBlQ29kZShpbnQgamRiY1R5cGVDb2RlKSB7Ci0JCXJldHVybiBqYXZhVHlwZUZvcihKREJDVHlwZS50eXBlKGpkYmNUeXBlQ29kZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBzdHVmZiAqKioqKioqKioqCi0KLQotCS8vICoqKioqKioqKiogSkRCQyA9PiBKYXZhICoqKioqKioqKioKLQotCS8qKgotCSAqIEpEQkMgPT4gSmF2YSB0eXBlIG1hcHBpbmdzLCBrZXllZCBieSBKREJDIHR5cGUgbmFtZSAoZS5nLiAiVkFSQ0hBUiIpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4gSkRCQ19UT19KQVZBX1RZUEVfTUFQUElOR1M7ICAvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBERUZBVUxUX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsgIC8vIFRPRE8gT2JqZWN0IGlzIHRoZSBkZWZhdWx0PwotCi0KLQlwcml2YXRlIHN0YXRpYyBKREJDVG9KYXZhVHlwZU1hcHBpbmcgamRiY1RvSmF2YVR5cGVNYXBwaW5nKFN0cmluZyBqZGJjVHlwZU5hbWUpIHsKLQkJcmV0dXJuIGpkYmNUb0phdmFUeXBlTWFwcGluZ3MoKS5nZXQoamRiY1R5cGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4gamRiY1RvSmF2YVR5cGVNYXBwaW5ncygpIHsKLQkJaWYgKEpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTID09IG51bGwpIHsKLQkJCUpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTID0gYnVpbGRKREJDVG9KYXZhVHlwZU1hcHBpbmdzKCk7Ci0JCX0KLQkJcmV0dXJuIEpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IGJ1aWxkSkRCQ1RvSmF2YVR5cGVNYXBwaW5ncygpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4gbWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4oKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nc1RvKG1hcHBpbmdzKTsKLQkJcmV0dXJuIG1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIGhhcmQgY29kZSB0aGUgZGVmYXVsdCBtYXBwaW5ncyBmcm9tIHRoZSBKREJDIHR5cGVzIHRvIHRoZQotCSAqIGFwcHJvcHJpYXRlIEphdmEgdHlwZXMKLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICogc2VlICJKREJDIDMuMCBTcGVjaWZpY2F0aW9uIiBBcHBlbmRpeCBCCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdzVG8oSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4gbWFwcGluZ3MpIHsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQVJSQVksIGphdmEuc3FsLkFycmF5LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkJJR0lOVCwgbG9uZy5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CSU5BUlksIGJ5dGVbXS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CSVQsIGJvb2xlYW4uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQkxPQiwgamF2YS5zcWwuQmxvYi5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CT09MRUFOLCBib29sZWFuLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkNIQVIsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQ0xPQiwgamF2YS5zcWwuQ2xvYi5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5EQVRBTElOSywgamF2YS5uZXQuVVJMLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRBVEUsIGphdmEuc3FsLkRhdGUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuREVDSU1BTCwgamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRElTVElOQ1QsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsgIC8vID8/PwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5ET1VCTEUsIGRvdWJsZS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5GTE9BVCwgZG91YmxlLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLklOVEVHRVIsIGludC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5KQVZBX09CSkVDVCwgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgbWFwcGluZ3MpOyAgLy8gPz8/Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkxPTkdWQVJCSU5BUlksIGJ5dGVbXS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5MT05HVkFSQ0hBUiwgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgbWFwcGluZ3MpOwotCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBpcyBkZWZpbmVkIGluIGphdmEuc3FsLlR5cGVzCi0vLwkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuTlVMTCwgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5OVU1FUklDLCBqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5PVEhFUiwgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgbWFwcGluZ3MpOwkvLyA/Pz8KLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuUkVBTCwgZmxvYXQuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuUkVGLCBqYXZhLnNxbC5SZWYuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuU01BTExJTlQsIHNob3J0LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlNUUlVDVCwgamF2YS5zcWwuU3RydWN0LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlRJTUUsIGphdmEuc3FsLlRpbWUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVElNRVNUQU1QLCBqYXZhLnNxbC5UaW1lc3RhbXAuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVElOWUlOVCwgYnl0ZS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5WQVJCSU5BUlksIGJ5dGVbXS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5WQVJDSEFSLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBtYXBwaW5ncyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhpbnQgamRiY1R5cGVDb2RlLCBDbGFzczw/PiBqYXZhQ2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCS8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCUpEQkNUeXBlIGpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShqZGJjVHlwZUNvZGUpOwotCQlPYmplY3QgcHJldiA9IG1hcHBpbmdzLnB1dChqZGJjVHlwZS5uYW1lKCksIGJ1aWxkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nKGpkYmNUeXBlLCBqYXZhQ2xhc3MpKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVwbGljYXRlIEpEQkMgdHlwZTogIiArIGpkYmNUeXBlLm5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKREJDVG9KYXZhVHlwZU1hcHBpbmcgYnVpbGRKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3IEpEQkNUb0phdmFUeXBlTWFwcGluZyhqZGJjVHlwZSwgbmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhID0+IEpEQkMgKioqKioqKioqKgotCi0JLyoqCi0JICogSmF2YSA9PiBKREJDIHR5cGUgbWFwcGluZ3MsIGtleWVkIGJ5IEphdmEgY2xhc3MgbmFtZSAoZS5nLiAiamF2YS5sYW5nLk9iamVjdCIpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7ICAvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKREJDVHlwZSBERUZBVUxUX0pEQkNfVFlQRSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7ICAvLyBUT0RPIFZBUkNIQVIgaXMgdGhlIGRlZmF1bHQ/Ci0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUb0pEQkNUeXBlTWFwcGluZyBqYXZhVG9KREJDVHlwZU1hcHBpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gamF2YVRvSkRCQ1R5cGVNYXBwaW5ncygpLmdldChjbGFzc05hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBqYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlpZiAoSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPT0gbnVsbCkgewotCQkJSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPSBidWlsZEphdmFUb0pEQkNUeXBlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gYnVpbGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPigpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzVG8obWFwcGluZ3MpOwotCQlyZXR1cm4gbWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogaGFyZCBjb2RlIHRoZSBkZWZhdWx0IG1hcHBpbmdzIGZyb20gdGhlIEphdmEgdHlwZXMgdG8gdGhlCi0JICogYXBwcm9wcmlhdGUgSkRCQyB0eXBlcwotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKiBzZWUgIkpEQkMgMy4wIFNwZWNpZmljYXRpb24iIEFwcGVuZGl4IEIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ3NUbyhIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBwcmltaXRpdmVzCi0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhieXRlLmNsYXNzLCBUeXBlcy5USU5ZSU5ULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGRvdWJsZS5jbGFzcywgVHlwZXMuRE9VQkxFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGludC5jbGFzcywgVHlwZXMuSU5URUdFUiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhsb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oc2hvcnQuY2xhc3MsIFR5cGVzLlNNQUxMSU5ULCBtYXBwaW5ncyk7Ci0KLQkJLy8gcmVmZXJlbmNlIGNsYXNzZXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuQnl0ZS5jbGFzcywgVHlwZXMuVElOWUlOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuRG91YmxlLmNsYXNzLCBUeXBlcy5ET1VCTEUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLCBUeXBlcy5JTlRFR0VSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5Mb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLlNob3J0LmNsYXNzLCBUeXBlcy5TTUFMTElOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBUeXBlcy5WQVJDSEFSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBUeXBlcy5OVU1FUklDLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubmV0LlVSTC5jbGFzcywgVHlwZXMuREFUQUxJTkssIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQXJyYXkuY2xhc3MsIFR5cGVzLkFSUkFZLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLkJsb2IuY2xhc3MsIFR5cGVzLkJMT0IsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQ2xvYi5jbGFzcywgVHlwZXMuQ0xPQiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLnNxbC5EYXRlLmNsYXNzLCBUeXBlcy5EQVRFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlJlZi5jbGFzcywgVHlwZXMuUkVGLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlN0cnVjdC5jbGFzcywgVHlwZXMuU1RSVUNULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlRpbWUuY2xhc3MsIFR5cGVzLlRJTUUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLCBUeXBlcy5USU1FU1RBTVAsIG1hcHBpbmdzKTsKLQotCQkvLyBhcnJheXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oYnl0ZVtdLmNsYXNzLCBUeXBlcy5WQVJCSU5BUlksIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJ5dGVbXS5jbGFzcywgVHlwZXMuVkFSQklOQVJZLCBtYXBwaW5ncyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhDbGFzczw/PiBqYXZhQ2xhc3MsIGludCBqZGJjVHlwZUNvZGUsIEhhc2hNYXA8U3RyaW5nLCBKYXZhVG9KREJDVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCS8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCU9iamVjdCBwcmV2ID0gbWFwcGluZ3MucHV0KGphdmFDbGFzcy5nZXROYW1lKCksIGJ1aWxkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nKGphdmFDbGFzcywgamRiY1R5cGVDb2RlKSk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBKYXZhIGNsYXNzOiAiICsgKChKYXZhVG9KREJDVHlwZU1hcHBpbmcpIHByZXYpLmdldEphdmFUeXBlKCkuZGVjbGFyYXRpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKYXZhVG9KREJDVHlwZU1hcHBpbmcgYnVpbGRKYXZhVG9KREJDVHlwZU1hcHBpbmcoQ2xhc3M8Pz4gamF2YUNsYXNzLCBpbnQgamRiY1R5cGVDb2RlKSB7Ci0JCXJldHVybiBuZXcgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nKG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhQ2xhc3MpLCBKREJDVHlwZS50eXBlKGpkYmNUeXBlQ29kZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSkRCQ1Rvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogSkRCQyA9PiBKYXZhCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIHsKLQkJcHJpdmF0ZSBmaW5hbCBKREJDVHlwZSBqZGJjVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLQotCQlKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQkJdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOwotCQl9Ci0KLQkJcHVibGljIEpEQkNUeXBlIGdldEpEQkNUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoaW50IGpkYmNUeXBlQ29kZSkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGUuY29kZSgpID09IGpkYmNUeXBlQ29kZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGpkYmNUeXBlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGUubmFtZSgpLmVxdWFscyhqZGJjVHlwZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhKREJDVHlwZSB0eXBlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZSA9PSB0eXBlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXRoaXMuYXBwZW5kVG8oc2IpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQl0aGlzLmpkYmNUeXBlLmFwcGVuZFRvKHNiKTsKLQkJCXNiLmFwcGVuZCgiID0+ICIpOwotCQkJdGhpcy5qYXZhVHlwZS5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogSmF2YSA9PiBKREJDCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nIHsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBKREJDVHlwZSBqZGJjVHlwZTsKLQotCQlKYXZhVG9KREJDVHlwZU1hcHBpbmcoSmF2YVR5cGUgamF2YVR5cGUsIEpEQkNUeXBlIGpkYmNUeXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQl9Ci0KLQkJcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamF2YVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSkRCQ1R5cGUgZ2V0SkRCQ1R5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoSmF2YVR5cGUganQpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmVxdWFscyhqdCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGphdmFDbGFzc05hbWUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmRlc2NyaWJlcyhqYXZhQ2xhc3NOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5kZXNjcmliZXMoamF2YUNsYXNzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQl0aGlzLmFwcGVuZFRvKHNiKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJdGhpcy5qYXZhVHlwZS5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJCXNiLmFwcGVuZCgiID0+ICIpOwotCQkJdGhpcy5qZGJjVHlwZS5hcHBlbmRUbyhzYik7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0pEQkNUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhZTI5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5zcWwuVHlwZXM7Ci1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEFzc29jaWF0ZSB0aGUgSmF2YSBjb25zdGFudCBhbmQgdGhlIEpEQkMgdHlwZSBuYW1lLgotICogVGhlc2UgYXJlIGRlcml2ZWQgZnJvbSBqYXZhLnNxbC5UeXBlcy4KLSAqIAotICogQHNlZSBqYXZhLnNxbC5UeXBlcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSkRCQ1R5cGUKLQlpbXBsZW1lbnRzIENvbXBhcmFibGU8SkRCQ1R5cGU+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCi0JLyoqCi0JICogdGhlIGNvbnN0YW50IG5hbWUgKGUuZy4gVkFSQ0hBUikKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogdGhlIEpEQkMgY29kZSB1c2VkIGJ5IEpEQkMgZHJpdmVycwotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IGNvZGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSkRCQyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB0eXBlIGNvZGUuCi0JICogVGhpcyBpcyBwcml2YXRlIGJlY2F1c2UgYWxsIHRoZSBwb3NzaWJsZSBKREJDIHR5cGVzIGFyZSBidWlsdCBhbmQKLQkgKiBzdG9yZWQgaW4gdGhlIHN0YXRpYyBhcnJheSBUWVBFUy4KLQkgKiBAc2VlICN0eXBlcygpCi0JICovCi0JcHJpdmF0ZSBKREJDVHlwZShTdHJpbmcgbmFtZSwgaW50IGNvZGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5jb2RlID0gY29kZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSwgYXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgY29kZSwgYXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcy4KLQkgKi8KLQlwdWJsaWMgaW50IGNvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvZGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50aW5nIGFuZCBkaXNwbGF5aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCXRoaXMuYXBwZW5kVG8oc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpEQkNUeXBlIGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChKREJDVHlwZSkgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhKREJDVHlwZSB0eXBlKSB7Ci0JCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcy5uYW1lLCB0eXBlLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgc3R1ZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogYWxsIHRoZSBKREJDIHR5cGUgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEpEQkNUeXBlW10gVFlQRVM7CQkvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSkRCQ1R5cGVbXSB0eXBlcygpIHsKLQkJaWYgKFRZUEVTID09IG51bGwpIHsKLQkJCVRZUEVTID0gYnVpbGRUeXBlcygpOwotCQl9Ci0JCXJldHVybiBUWVBFUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIGNvZGUgKGUuZy4gVHlwZXMuVkFSQ0hBUikuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgdHlwZShpbnQgY29kZSkgewotCQlKREJDVHlwZVtdIHR5cGVzID0gdHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IHR5cGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAodHlwZXNbaV0uY29kZSgpID09IGNvZGUpIHsKLQkJCQlyZXR1cm4gdHlwZXNbaV07Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKREJDIHR5cGUgY29kZTogIiArIGNvZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZSAoZS5nLiAiVkFSQ0hBUiIpLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIHR5cGUoU3RyaW5nIG5hbWUpIHsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IHR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSB0eXBlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKHR5cGVzW2ldLm5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gdHlwZXNbaV07Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKREJDIHR5cGUgbmFtZTogIiArIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIHVwIHRoZSBKREJDIHR5cGVzIHZpYSByZWZsZWN0aW9uCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEpEQkNUeXBlW10gYnVpbGRUeXBlcygpIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBUeXBlcy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlpbnQgbGVuID0gZmllbGRzLmxlbmd0aDsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IG5ldyBKREJDVHlwZVtsZW5dOwotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCWludCBjb2RlOwotCQkJdHJ5IHsKLQkJCQljb2RlID0gKChJbnRlZ2VyKSBmaWVsZHNbaV0uZ2V0KG51bGwpKS5pbnRWYWx1ZSgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsJLy8gc2hvdWxkbid0IGhhcHBlbi4uLgotCQkJfQotCQkJdHlwZXNbaV0gPSBuZXcgSkRCQ1R5cGUobmFtZSwgY29kZSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL05hbWVUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL05hbWVUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQ2MjAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9OYW1lVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLS8qKgotICogVmFyaW91cyBoZWxwZXIgbWV0aG9kcyBmb3IgZ2VuZXJhdGluZyBuYW1lcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hbWVUb29scyB7Ci0KLQkvKioKLQkgKiBHaXZlbiBhICJyb290IiBuYW1lIGFuZCBhIHNldCBvZiBleGlzdGluZyBuYW1lcywgZ2VuZXJhdGUgYSB1bmlxdWUKLQkgKiBuYW1lIHRoYXQgaXMgZWl0aGVyIHRoZSAicm9vdCIgbmFtZSBvciBzb21lIHZhcmlhdGlvbiBvbiB0aGUgInJvb3QiCi0JICogbmFtZSAoZS5nLiAicm9vdDIiLCAicm9vdDMiLC4uLikuIFRoZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUKLQkgKiAoaS5lLiAiUm9vdCIgYW5kICJyb290IiBhcmUgYm90aCBhbGxvd2VkKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9yKFN0cmluZyByb290TmFtZSwgSXRlcmF0b3I8U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9yKHJvb3ROYW1lLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGV4aXN0aW5nTmFtZXMpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYSAicm9vdCIgbmFtZSBhbmQgYSBzZXQgb2YgZXhpc3RpbmcgbmFtZXMsIGdlbmVyYXRlIGEgdW5pcXVlCi0JICogbmFtZSB0aGF0IGlzIGVpdGhlciB0aGUgInJvb3QiIG5hbWUgb3Igc29tZSB2YXJpYXRpb24gb24gdGhlICJyb290IgotCSAqIG5hbWUgKGUuZy4gInJvb3QyIiwgInJvb3QzIiwuLi4pLiBUaGUgbmFtZXMgYXJlIGNhc2Utc2Vuc2l0aXZlCi0JICogKGkuZS4gIlJvb3QiIGFuZCAicm9vdCIgYXJlIGJvdGggYWxsb3dlZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcihTdHJpbmcgcm9vdE5hbWUsIENvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9yKHJvb3ROYW1lLCBleGlzdGluZ05hbWVzLCByb290TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSAicm9vdCIgbmFtZSBhbmQgYSBzZXQgb2YgZXhpc3RpbmcgbmFtZXMsIGdlbmVyYXRlIGEgdW5pcXVlCi0JICogbmFtZSB0aGF0IGlzIGVpdGhlciB0aGUgInJvb3QiIG5hbWUgb3Igc29tZSB2YXJpYXRpb24gb24gdGhlICJyb290IgotCSAqIG5hbWUgKGUuZy4gInJvb3QyIiwgInJvb3QzIiwuLi4pLiBUaGUgbmFtZXMgYXJlIE5PVCBjYXNlLXNlbnNpdGl2ZQotCSAqIChpLmUuICJSb290IiBhbmQgInJvb3QiIGFyZSBOT1QgYm90aCBhbGxvd2VkKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShTdHJpbmcgcm9vdE5hbWUsIEl0ZXJhdG9yPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcklnbm9yZUNhc2Uocm9vdE5hbWUsIENvbGxlY3Rpb25Ub29scy5zZXQoZXhpc3RpbmdOYW1lcykpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgInJvb3QiIG5hbWUgYW5kIGEgc2V0IG9mIGV4aXN0aW5nIG5hbWVzLCBnZW5lcmF0ZSBhIHVuaXF1ZQotCSAqIG5hbWUgdGhhdCBpcyBlaXRoZXIgdGhlICJyb290IiBuYW1lIG9yIHNvbWUgdmFyaWF0aW9uIG9uIHRoZSAicm9vdCIKLQkgKiBuYW1lIChlLmcuICJyb290MiIsICJyb290MyIsLi4uKS4gVGhlIG5hbWVzIGFyZSBOT1QgY2FzZS1zZW5zaXRpdmUKLQkgKiAoaS5lLiAiUm9vdCIgYW5kICJyb290IiBhcmUgTk9UIGJvdGggYWxsb3dlZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoU3RyaW5nIHJvb3ROYW1lLCBDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcihyb290TmFtZSwgY29udmVydFRvTG93ZXJDYXNlKGV4aXN0aW5nTmFtZXMpLCByb290TmFtZS50b0xvd2VyQ2FzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB1c2UgdGhlIHN1ZmZpeGVkICJ0ZW1wbGF0ZSIgbmFtZSB0byBwZXJmb3JtIHRoZSBjb21wYXJpc29ucywgYnV0IFJFVFVSTgotCSAqIHRoZSBzdWZmaXhlZCAicm9vdCIgbmFtZTsgdGhpcyBhbGxvd3MgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29ucwotCSAqIChpLmUuIHRoZSAidGVtcGxhdGUiIG5hbWUgaGFzIGJlZW4gbW9ycGhlZCB0byB0aGUgc2FtZSBjYXNlIGFzCi0JICogdGhlICJleGlzdGluZyIgbmFtZXMsIHdoaWxlIHRoZSAicm9vdCIgbmFtZSBoYXMgbm90LCBidXQgdGhlICJyb290IiBuYW1lCi0JICogaXMgd2hhdCB0aGUgY2xpZW50IHdhbnRzIG1vcnBoZWQgdG8gYmUgdW5pcXVlKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9yKFN0cmluZyByb290TmFtZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMsIFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJaWYgKCAhIGV4aXN0aW5nTmFtZXMuY29udGFpbnModGVtcGxhdGVOYW1lKSkgewotCQkJcmV0dXJuIHJvb3ROYW1lOwotCQl9Ci0JCVN0cmluZyB1bmlxdWVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQlmb3IgKGludCBzdWZmaXggPSAyOyB0cnVlOyBzdWZmaXgrKykgewotCQkJaWYgKCAhIGV4aXN0aW5nTmFtZXMuY29udGFpbnModW5pcXVlTmFtZSArIHN1ZmZpeCkpIHsKLQkJCQlyZXR1cm4gcm9vdE5hbWUuY29uY2F0KFN0cmluZy52YWx1ZU9mKHN1ZmZpeCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncyB0byBhIGNvbGxlY3Rpb24gb2YgdGhlIHNhbWUKLQkgKiBzdHJpbmdzIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBjb252ZXJ0VG9Mb3dlckNhc2UoQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJSGFzaFNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oc3RyaW5ncy5zaXplKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBzdHJpbmdzKSB7Ci0JCQlyZXN1bHQuYWRkKHN0cmluZy50b0xvd2VyQ2FzZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgZnVsbHktcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0LgotCSAqIFZhcmlhdGlvbnM6Ci0JICogICAgIGNhdGFsb2cuc2NoZW1hLm5hbWUKLQkgKiAgICAgY2F0YWxvZy4ubmFtZQotCSAqICAgICBzY2hlbWEubmFtZQotCSAqICAgICBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWEsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICgoY2F0YWxvZyA9PSBudWxsKSAmJiAoc2NoZW1hID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoY2F0YWxvZyk7Ci0JCQlzYi5hcHBlbmQoJy4nKTsKLQkJfQotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChzY2hlbWEpOwotCQl9Ci0JCXNiLmFwcGVuZCgnLicpOwotCQlzYi5hcHBlbmQobmFtZSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZXQgb2YgcmVzZXJ2ZWQgd29yZHMgaW4gdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi0JICogVGhlc2Ugd29yZHMgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMgKGkuZS4gbmFtZXMpLgotCSAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy90dXRvcmlhbC9qYXZhL251dHNhbmRib2x0cy9fa2V5d29yZHMuaHRtbAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQV9SRVNFUlZFRF9XT1JEUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkJImFic3RyYWN0IiwKLQkJCQkiYXNzZXJ0IiwgIC8vIGpkayAxLjQKLQkJCQkiYm9vbGVhbiIsCi0JCQkJImJyZWFrIiwKLQkJCQkiYnl0ZSIsCi0JCQkJImNhc2UiLAotCQkJCSJjYXRjaCIsCi0JCQkJImNoYXIiLAotCQkJCSJjbGFzcyIsCi0JCQkJImNvbnN0IiwgIC8vIHVudXNlZAotCQkJCSJjb250aW51ZSIsCi0JCQkJImRlZmF1bHQiLAotCQkJCSJkbyIsCi0JCQkJImRvdWJsZSIsCi0JCQkJImVsc2UiLAotCQkJCSJlbnVtIiwgIC8vIGpkayAxLjUKLQkJCQkiZXh0ZW5kcyIsCi0JCQkJImZhbHNlIiwKLQkJCQkiZmluYWwiLAotCQkJCSJmaW5hbGx5IiwKLQkJCQkiZmxvYXQiLAotCQkJCSJmb3IiLAotCQkJCSJnb3RvIiwgIC8vIHVudXNlZAotCQkJCSJpZiIsCi0JCQkJImltcGxlbWVudHMiLAotCQkJCSJpbXBvcnQiLAotCQkJCSJpbnN0YW5jZW9mIiwKLQkJCQkiaW50IiwKLQkJCQkiaW50ZXJmYWNlIiwKLQkJCQkibG9uZyIsCi0JCQkJIm5hdGl2ZSIsCi0JCQkJIm5ldyIsCi0JCQkJIm51bGwiLAotCQkJCSJwYWNrYWdlIiwKLQkJCQkicHJpdmF0ZSIsCi0JCQkJInByb3RlY3RlZCIsCi0JCQkJInB1YmxpYyIsCi0JCQkJInJldHVybiIsCi0JCQkJInNob3J0IiwKLQkJCQkic3RhdGljIiwKLQkJCQkic3RyaWN0ZnAiLCAgLy8gamRrIDEuMgotCQkJCSJzdXBlciIsCi0JCQkJInN3aXRjaCIsCi0JCQkJInN5bmNocm9uaXplZCIsCi0JCQkJInRoaXMiLAotCQkJCSJ0aHJvdyIsCi0JCQkJInRocm93cyIsCi0JCQkJInRyYW5zaWVudCIsCi0JCQkJInRydWUiLAotCQkJCSJ0cnkiLAotCQkJCSJ2b2lkIiwKLQkJCQkidm9sYXRpbGUiLAotCQkJCSJ3aGlsZSIKLQkJCX07Ci0KLQkvKioKLQkgKiBUaGUgc2V0IG9mIHJlc2VydmVkIHdvcmRzIGluIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlLgotCSAqIFRoZXNlIHdvcmRzIGNhbm5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXJzIChpLmUuIG5hbWVzKS4KLQkgKiBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvdHV0b3JpYWwvamF2YS9udXRzYW5kYm9sdHMvX2tleXdvcmRzLmh0bWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNvcnRlZFNldDxTdHJpbmc+IEpBVkFfUkVTRVJWRURfV09SRFNfU0VUID0gCi0JCUNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZFNldChDb2xsZWN0aW9uVG9vbHMuc29ydGVkU2V0KEpBVkFfUkVTRVJWRURfV09SRFMpKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2V0IG9mIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgcmVzZXJ2ZWQgd29yZHMuCi0JICogVGhlc2Ugd29yZHMgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMgKGkuZS4gbmFtZXMpLgotCSAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy90dXRvcmlhbC9qYXZhL251dHNhbmRib2x0cy9fa2V5d29yZHMuaHRtbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhUmVzZXJ2ZWRXb3JkcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFWQV9SRVNFUlZFRF9XT1JEUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29uc2lzdHMgb2YgSmF2YSBpZGVudGlmaWVyCi0JICogY2hhcmFjdGVycyAoYnV0IG1heSBiZSBhIHJlc2VydmVkIHdvcmQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnNfKHN0cmluZy50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb25zaXN0cyBvZiBKYXZhIGlkZW50aWZpZXIKLQkgKiBjaGFyYWN0ZXJzIChidXQgbWF5IGJlIGEgcmVzZXJ2ZWQgd29yZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnMoY2hhcltdIHN0cmluZykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnNfKHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBzdHJpbmcgbXVzdCBub3QgYmUgZW1wdHkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzXyhjaGFyW10gc3RyaW5nKSB7Ci0JCWlmICggISBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KHN0cmluZ1swXSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gc3RyaW5nLmxlbmd0aDsgaS0tID4gMTsgKSB7ICAvLyBOQjogZW5kIHdpdGggMQotCQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChzdHJpbmdbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVycyhzdHJpbmcpCi0JCQkJJiYgISBKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVC5jb250YWlucyhzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVycyhzdHJpbmcpCi0JCQkJJiYgISBKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVC5jb250YWlucyhuZXcgU3RyaW5nKHN0cmluZykpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIKLQkgKiBieSBzdWJzdGl0dXRpbmcgYW4gdW5kZXJzY29yZSAnXycgZm9yIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKLQkgKiBpbiB0aGUgc3RyaW5nIGFuZCBhcHBlbmRpbmcgYW4gdW5kZXJzY29yZSAnXycgdG8gdGhlIHN0cmluZyBpZgotCSAqIGl0IGlzIGEgSmF2YSByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKHN0cmluZywgJ18nKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JICogYnkgc3Vic3RpdHV0aW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGZvciBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzCi0JICogaW4gdGhlIHN0cmluZyBhbmQsIGlmIG5lY2Vzc2FyeSwgYXBwZW5kaW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogdG8gdGhlIHN0cmluZyB1bnRpbCBpdCBpcyBub3QgYSBKYXZhIHJlc2VydmVkIHdvcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YUlkZW50aWZpZXIoU3RyaW5nIHN0cmluZywgY2hhciBjKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQuY29udGFpbnMoc3RyaW5nKSkgewotCQkJLy8gYSByZXNlcnZlZCB3b3JkIGlzIGEgdmFsaWQgaWRlbnRpZmllciwgd2UganVzdCBuZWVkIHRvIHR3ZWFrIGl0IGEgYml0Ci0JCQljaGVja0NoYXJJc0phdmFJZGVudGlmaWVyUGFydChjKTsKLQkJCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihzdHJpbmcgKyBjLCBjKTsKLQkJfQotCQljaGFyW10gYXJyYXkgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJcmV0dXJuIChjb252ZXJ0VG9KYXZhSWRlbnRpZmllcl8oYXJyYXksIGMpKSA/IG5ldyBTdHJpbmcoYXJyYXkpIDogc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIKLQkgKiBieSBzdWJzdGl0dXRpbmcgYW4gdW5kZXJzY29yZSAnXycgZm9yIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKLQkgKiBpbiB0aGUgc3RyaW5nIGFuZCBhcHBlbmRpbmcgYW4gdW5kZXJzY29yZSAnXycgdG8gdGhlIHN0cmluZyBpZgotCSAqIGl0IGlzIGEgSmF2YSByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKHN0cmluZywgJ18nKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JICogYnkgc3Vic3RpdHV0aW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGZvciBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzCi0JICogaW4gdGhlIHN0cmluZyBhbmQsIGlmIG5lY2Vzc2FyeSwgYXBwZW5kaW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogdG8gdGhlIHN0cmluZyB1bnRpbCBpdCBpcyBub3QgYSBKYXZhIHJlc2VydmVkIHdvcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvSmF2YUlkZW50aWZpZXIoY2hhcltdIHN0cmluZywgY2hhciBjKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKEpBVkFfUkVTRVJWRURfV09SRFNfU0VULmNvbnRhaW5zKG5ldyBTdHJpbmcoc3RyaW5nKSkpIHsKLQkJCS8vIGEgcmVzZXJ2ZWQgd29yZCBpcyBhIHZhbGlkIGlkZW50aWZpZXIsIHdlIGp1c3QgbmVlZCB0byB0d2VhayBpdCBhIGJpdAotCQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JCQlyZXR1cm4gY29udmVydFRvSmF2YUlkZW50aWZpZXIoQ29sbGVjdGlvblRvb2xzLmFkZChzdHJpbmcsIGMpLCBjKTsKLQkJfQotCQljb252ZXJ0VG9KYXZhSWRlbnRpZmllcl8oc3RyaW5nLCBjKTsKLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIHN0cmluZyBtdXN0IG5vdCBiZSBlbXB0eS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3RyaW5nIHdhcyBtb2RpZmllZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJYm9vbGVhbiBtb2QgPSBmYWxzZTsKLQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoc3RyaW5nWzBdKSkgewotCQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclN0YXJ0KGMpOwotCQkJc3RyaW5nWzBdID0gYzsKLQkJCW1vZCA9IHRydWU7Ci0JCX0KLQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JCWZvciAoaW50IGkgPSBzdHJpbmcubGVuZ3RoOyBpLS0gPiAxOyApIHsgIC8vIE5COiBlbmQgd2l0aCAxCi0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHN0cmluZ1tpXSkpIHsKLQkJCQlzdHJpbmdbaV0gPSBjOwotCQkJCW1vZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJTdGFydChjaGFyIGMpIHsKLQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYykpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgSmF2YSBpZGVudGlmaWVyIHN0YXJ0IGNoYXI6ICciICsgYyArICdcJycpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NoYXJJc0phdmFJZGVudGlmaWVyUGFydChjaGFyIGMpIHsKLQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKYXZhIGlkZW50aWZpZXIgcGFydCBjaGFyOiAnIiArIGMgKyAnXCcnKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgTmFtZVRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9OdWxsTGlzdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL051bGxMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MGQ0ZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL051bGxMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgIm51bGwiIGxpc3QgaXMgYSBiaXQgZGlmZmVyZW50IGZyb20gYW4gImVtcHR5IiBsaXN0OiBpdCBhbGxvd3MgY2xpZW50cyB0bwotICogYWRkL3JlbW92ZSBlbGVtZW50cyB0by9mcm9tIGl0IGJ1dCBuZXZlciBjaGFuZ2VzLiBUaGlzIGlzIHVzZWZ1bAotICogZm9yIHBhc3NpbmcgdG8gbWV0aG9kcyB0aGF0IHJlcXVpcmUgYSAiY29sbGVjdGluZyBwYXJhbWV0ZXIiIGJ1dCB0aGUKLSAqIGNsaWVudCB3aWxsIGlnbm9yZSB0aGUgcmVzdWx0aW5nICJjb2xsZWN0aW9uIi4KLSAqIAotICogTkI6IFdlIHJldHVybiAnbnVsbCcgZnJvbSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgKGFzIG9wcG9zZWQgdG8gdGhyb3dpbmcKLSAqIGFuIGV4Y2VwdGlvbik6Ci0gKiAgICAgZ2V0KGludCkgOiBFCi0gKiAgICAgcmVtb3ZlKGludCkgOiBFCi0gKiAgICAgc2V0KGludCwgRSkgOiBFCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsTGlzdDxFPiBpbXBsZW1lbnRzIExpc3Q8RT4gewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVsbExpc3QgSU5TVEFOQ0UgPSBuZXcgTnVsbExpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTnVsbExpc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQkvLyBpZ25vcmUKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gYy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6IDAiKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyBFIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAwIik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgRSBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAwIik7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxFPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVF9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiBFTVBUWV9PQkpFQ1RfQVJSQVk7Ci0JfQotCi0JcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gYTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SYW5nZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYmU0ODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBzaW1wbGUgY29udGFpbmVyIGNsYXNzIHNpbXBseSBwdXRzIGEgYml0IG9mIHNlbWFudGljcwotICogYXJvdW5kIGEgcGFpciBvZiBudW1iZXJzLgotICovCi1wdWJsaWMgY2xhc3MgUmFuZ2UKLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgcmFuZ2UuICovCi0JcHVibGljIGZpbmFsIGludCBzdGFydDsKLQotCS8qKiBUaGUgZW5kaW5nIGluZGV4IG9mIHRoZSByYW5nZS4gKi8KLQlwdWJsaWMgZmluYWwgaW50IGVuZDsKLQotCS8qKgotCSAqIFRoZSBzaXplIGNhbiBiZSBuZWdhdGl2ZSBpZiB0aGUgZW5kaW5nIGluZGV4Ci0JICogaXMgbGVzcyB0aGFuIHRoZSBzdGFydGluZyBpbmRleC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IHNpemU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggdGhlIHNwZWNpZmllZCBzdGFydCBhbmQgZW5kLAotCSAqIGJvdGggb2Ygd2hpY2ggYXJlIGltbXV0YWJsZS4KLQkgKi8KLQlwdWJsaWMgUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhcnQgPSBzdGFydDsKLQkJdGhpcy5lbmQgPSBlbmQ7Ci0JCXRoaXMuc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcmFuZ2UgaW5jbHVkZXMgdGhlIHNwZWNpZmllZAotCSAqIGluZGV4LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzKGludCBpbmRleCkgewotCQlyZXR1cm4gKHRoaXMuc3RhcnQgPD0gaW5kZXgpICYmIChpbmRleCA8PSB0aGlzLmVuZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICh0aGlzID09IG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIFJhbmdlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVJhbmdlIG90aGVyUmFuZ2UgPSAoUmFuZ2UpIG87Ci0JCXJldHVybiAodGhpcy5zdGFydCA9PSBvdGhlclJhbmdlLnN0YXJ0KQotCQkJJiYgKHRoaXMuZW5kID09IG90aGVyUmFuZ2UuZW5kKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5zdGFydCBeIHRoaXMuZW5kOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSYW5nZSBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoUmFuZ2UpIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJbIiArIHRoaXMuc3RhcnQgKyAiLCAiICsgdGhpcy5lbmQgKyAnXSc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGMwMWY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIFRoaXMgY29tcGFyYXRvciB3aWxsIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KLSAqIElmIHRoZSBjb21wYXJhdG9yIGlzIG51bGwsIHRoZSBuYXR1cmFsIG9yZGVyaW5nIG9mIHRoZSBvYmplY3RzIHdpbGwgYmUgdXNlZC4KLSAqLwotcHVibGljIGNsYXNzIFJldmVyc2VDb21wYXJhdG9yPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+Ci0JaW1wbGVtZW50cyBDb21wYXJhdG9yPEU+LCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcjsKLQotCXB1YmxpYyBSZXZlcnNlQ29tcGFyYXRvcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgUmV2ZXJzZUNvbXBhcmF0b3IoQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlKEUgZTEsIEUgZTIpIHsKLQkJcmV0dXJuICh0aGlzLmNvbXBhcmF0b3IgPT0gbnVsbCkgPwotCQkJZTIuY29tcGFyZVRvKGUxKQotCQk6Ci0JCQl0aGlzLmNvbXBhcmF0b3IuY29tcGFyZShlMiwgZTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlQXNzb2NpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5YjBhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlQXNzb2NpYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgQXNzb2NpYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVBc3NvY2lhdGlvbjxLLCBWPgotCWV4dGVuZHMgQWJzdHJhY3RBc3NvY2lhdGlvbjxLLCBWPgotCWltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIEsga2V5OwotCXByaXZhdGUgViB2YWx1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXNzb2NpYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGtleQotCSAqIGFuZCBhIG51bGwgdmFsdWUuCi0JICovCi0JcHVibGljIFNpbXBsZUFzc29jaWF0aW9uKEsga2V5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMua2V5ID0ga2V5OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3NvY2lhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGFuZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlQXNzb2NpYXRpb24oSyBrZXksIFYgdmFsdWUpIHsKLQkJdGhpcyhrZXkpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0KLQlwdWJsaWMgSyBrZXkoKSB7Ci0JCXJldHVybiB0aGlzLmtleTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFYgdmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgViBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0JCVYgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU2ltcGxlQXNzb2NpYXRpb248SywgVj4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFNpbXBsZUFzc29jaWF0aW9uPEssIFY+KSBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUZpbHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2Y2YmIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci0KLS8qKgotICogU2ltcGxlLCBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gKiB0aGF0IGhvbGRzIG9uIHRvIGEgY3JpdGVyaW9uIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZQotICogPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+IG9yIDxjb2RlPnJlamVjdChPYmplY3QpPC9jb2RlPgotICogbWV0aG9kcy4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZXNlIG1ldGhvZHMsCi0gKiBkZXBlbmRpbmcgb24gd2hpY2ggaXMgZWFzaWVyIHRvIGltcGxlbWVudC4gTm90ZSB0aGF0IGF0IGxlYXN0Ci0gKiBvbmUgb2YgdGhlc2UgbWV0aG9kcyA8ZW0+bXVzdDwvZW0+IGJlIG92ZXJyaWRkZW4gb3IKLSAqIGFuIGluZmluaXRlIGxvb3Agd2lsbCBvY2N1ci4gSWYgYm90aCBvZiB0aGVtIGFyZSBvdmVycmlkZGVuLAotICogb25seSB0aGUgPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIHVzZWQuCi0gKiA8cD4KLSAqIFNpbXBsaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHN0cmFpZ2h0Zm9yd2FyZCBpbm5lciBjbGFzc2VzLgotICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgZmlsdGVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYQotICogPGNvZGU+RmlsdGVyaW5nSXRlcmF0b3I8L2NvZGU+IHRvIHJldHVybiBvbmx5IHRob3NlIHN0cmluZ3MKLSAqIGluIHRoZSBuZXN0ZWQgaXRlcmF0b3Igc3RhcnQgd2l0aCAicHJlZml4IjoKLSAqIDxwcmU+Ci0gKglGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBuZXcgU2ltcGxlRmlsdGVyPFN0cmluZz4oInByZWZpeCIpIHsKLSAqCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIG8pIHsKLSAqCQkJcmV0dXJuIG8uc3RhcnRzV2l0aCgoU3RyaW5nKSBjcml0ZXJpb24pOwotICoJCX0KLSAqCX07Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbXBsZUZpbHRlcjxULCBTPgotCWltcGxlbWVudHMgRmlsdGVyPFQ+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByb3RlY3RlZCBmaW5hbCBTIGNyaXRlcmlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBNb3JlIHVzZWZ1bCBjb25zdHJ1Y3Rvci4gVGhlIHNwZWNpZmllZCBjcml0ZXJpb24gY2FuCi0JICogYmUgdXNlZCBieSBhIHN1YmNsYXNzIHRvICJhY2NlcHQiIG9yICJyZWplY3QiIG9iamVjdHMuCi0JICovCi0JcHJvdGVjdGVkIFNpbXBsZUZpbHRlcihTIGNyaXRlcmlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmNyaXRlcmlvbiA9IGNyaXRlcmlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzaW1wbGUgZmlsdGVyIHdpdGggYSBudWxsIGNyaXRlcmlvbgotCSAqLwotCXByb3RlY3RlZCBTaW1wbGVGaWx0ZXIoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHNob3VsZCBiZSAicmVqZWN0ZWQiLgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgInJlamVjdGVkIiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjbGllbnQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVqZWN0KFQgbykgewotCQlyZXR1cm4gISB0aGlzLmFjY2VwdChvKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGhlIHNwZWNpZmllZCBvYmplY3Qgc2hvdWxkIGJlICJhY2NlcHRlZCIuCi0JICogVGhlIHNlbWFudGljcyBvZiAiYWNjZXB0ZWQiIGlzIGRldGVybWluZWQgYnkgdGhlIGNsaWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoVCBvKSB7Ci0JCXJldHVybiAhIHRoaXMucmVqZWN0KG8pOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBTaW1wbGVGaWx0ZXI8VCwgUz4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFNpbXBsZUZpbHRlcjxULCBTPikgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgU2ltcGxlRmlsdGVyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVNpbXBsZUZpbHRlcjw/LCA/PiBvdGhlciA9IChTaW1wbGVGaWx0ZXI8PywgPz4pIG87Ci0JCXJldHVybiAodGhpcy5jcml0ZXJpb24gPT0gbnVsbCkgPwotCQkJKG90aGVyLmNyaXRlcmlvbiA9PSBudWxsKSA6IHRoaXMuY3JpdGVyaW9uLmVxdWFscyhvdGhlci5jcml0ZXJpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAodGhpcy5jcml0ZXJpb24gPT0gbnVsbCkgPyAwIDogdGhpcy5jcml0ZXJpb24uaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNyaXRlcmlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSmF2YVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVKYXZhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWMyNTNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVKYXZhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSmF2YVR5cGUgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlSmF2YVR5cGUKLQlpbXBsZW1lbnRzIEphdmFUeXBlLCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCi0JLyoqCi0JICogc3RvcmUgdGhlIHR5cGUgYXMgYSBuYW1lLCBzbyB3ZSBjYW4gcmVmZXJlbmNlIGNsYXNzZXMKLQkgKiB0aGF0IGFyZSBub3QgbG9hZGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWxlbWVudFR5cGVOYW1lOwotCi0JLyoqCi0JICogbm9uLWFycmF5IHR5cGVzIGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybwotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IGFycmF5RGVwdGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSmF2YSB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHR5cGUgYW5kIGFycmF5IGRlcHRoLgotCSAqLwotCXB1YmxpYyBTaW1wbGVKYXZhVHlwZShTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQlzdXBlcigpOwotCQlpZiAoKGVsZW1lbnRUeXBlTmFtZSA9PSBudWxsKSB8fCAoZWxlbWVudFR5cGVOYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZWxlbWVudCB0eXBlIG5hbWUgaXMgcmVxdWlyZWQuIik7Ci0JCX0KLQkJaWYgKENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoZWxlbWVudFR5cGVOYW1lKSAhPSAwKSB7CQkvLyBlLmcuICJbTGphdmEubGFuZy5PYmplY3Q7IgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGVsZW1lbnQgdHlwZSBtdXN0IG5vdCBiZSBhbiBhcnJheTogIiArIGVsZW1lbnRUeXBlTmFtZSArICcuJyk7Ci0JCX0KLQkJaWYgKGFycmF5RGVwdGggPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgYXJyYXkgZGVwdGggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOwotCQl9Ci0JCWlmIChlbGVtZW50VHlwZU5hbWUuZXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSAmJiAoYXJyYXlEZXB0aCAhPSAwKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ3ZvaWQnIG11c3QgaGF2ZSBhbiBhcnJheSBkZXB0aCBvZiB6ZXJvOiAiICsgYXJyYXlEZXB0aCArICcuJyk7Ci0JCX0KLQkJdGhpcy5lbGVtZW50VHlwZU5hbWUgPSBlbGVtZW50VHlwZU5hbWU7Ci0JCXRoaXMuYXJyYXlEZXB0aCA9IGFycmF5RGVwdGg7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSmF2YSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBjbGFzcyBuYW1lIGNhbiBiZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKLQkgKiAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqICAgICBpbnQKLQkgKiAgICAgamF2YS51dGlsLk1hcCRFbnRyeQotCSAqICAgICBbTGphdmEubGFuZy5PYmplY3Q7Ci0JICogICAgIFtJCi0JICogICAgIFtMamF2YS51dGlsLk1hcCRFbnRyeTsKLQkgKi8KLQlwdWJsaWMgU2ltcGxlSmF2YVR5cGUoU3RyaW5nIGphdmFDbGFzc05hbWUpIHsKLQkJdGhpcyhDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzTmFtZSksIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoamF2YUNsYXNzTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEphdmEgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlSmF2YVR5cGUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXRoaXMoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFR5cGVOYW1lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXJyYXlEZXB0aCgpIHsKLQkJcmV0dXJuIHRoaXMuYXJyYXlEZXB0aDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5hcnJheURlcHRoID4gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gMCkgJiYgQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUodGhpcy5lbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlV3JhcHBlcigpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gMCkgJiYgQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3ModGhpcy5lbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmUoKSB7Ci0JCXJldHVybiAodGhpcy5hcnJheURlcHRoID09IDApICYmIENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUodGhpcy5lbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKCkgewotCQlyZXR1cm4gKHRoaXMuYXJyYXlEZXB0aCA9PSAwKSAmJiBDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKHRoaXMuZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3M8Pz4gZ2V0SmF2YUNsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gQ2xhc3NUb29scy5jbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih0aGlzLmVsZW1lbnRUeXBlTmFtZSwgdGhpcy5hcnJheURlcHRoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbih0aGlzLmVsZW1lbnRUeXBlTmFtZSwgdGhpcy5hcnJheURlcHRoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29tcGFyaXNvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoU3RyaW5nIG90aGVyRWxlbWVudFR5cGVOYW1lLCBpbnQgb3RoZXJBcnJheURlcHRoKSB7Ci0JCXJldHVybiAodGhpcy5hcnJheURlcHRoID09IG90aGVyQXJyYXlEZXB0aCkKLQkJCSYmIHRoaXMuZWxlbWVudFR5cGVOYW1lLmVxdWFscyhvdGhlckVsZW1lbnRUeXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZGVzY3JpYmVzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxzKENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChjbGFzc05hbWUpLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGNsYXNzTmFtZSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRlc2NyaWJlcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHRoaXMuZGVzY3JpYmVzKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhKYXZhVHlwZSBvdGhlcikgewotCQlyZXR1cm4gdGhpcy5lcXVhbHMob3RoZXIuZ2V0RWxlbWVudFR5cGVOYW1lKCksIG90aGVyLmdldEFycmF5RGVwdGgoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCXJldHVybiAodGhpcyA9PSBvKSA/IHRydWUgOiAobyBpbnN0YW5jZW9mIEphdmFUeXBlKSA/IHRoaXMuZXF1YWxzKChKYXZhVHlwZSkgbykgOiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VHlwZU5hbWUuaGFzaENvZGUoKSBeIHRoaXMuYXJyYXlEZXB0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhKYXZhVHlwZSBqdCkgewotCQlpbnQgeCA9IENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0aGlzLmVsZW1lbnRUeXBlTmFtZSwganQuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCQlyZXR1cm4gKHggIT0gMCkgPyB4IDogKHRoaXMuYXJyYXlEZXB0aCAtIGp0LmdldEFycmF5RGVwdGgoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50aW5nIGFuZCBkaXNwbGF5aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZToKLQkgKiAgICAgIltbSiIgPT4gImxvbmdbXVtdIgotCSAqICAgICAiamF2YS51dGlsLk1hcCRFbnRyeSIgPT4gImphdmEudXRpbC5NYXAuRW50cnkiCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNsYXJhdGlvbigpIHsKLQkJaWYgKHRoaXMuYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbGVtZW50VHlwZU5hbWVEZWNsYXJhdGlvbigpOwotCQl9Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcih0aGlzLmVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSArICgyICogdGhpcy5hcnJheURlcHRoKSk7Ci0JCXRoaXMuYXBwZW5kRGVjbGFyYXRpb25UbyhzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZToKLQkgKiAgICAgIltbSiIgPT4gImxvbmdbXVtdIgotCSAqICAgICAiamF2YS51dGlsLk1hcCRFbnRyeSIgPT4gImphdmEudXRpbC5NYXAuRW50cnkiCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kRGVjbGFyYXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmVsZW1lbnRUeXBlTmFtZURlY2xhcmF0aW9uKCkpOwotCQlmb3IgKGludCBpID0gdGhpcy5hcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZCgiW10iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IHRoZSB2ZXJzaW9uIG9mIHRoZSB0eXBlJ3MgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHNvdXJjZSBjb2RlOgotCSAqICAgICAiW1tKIiA9PiAibG9uZ1tdW10iCi0JICogICAgICJqYXZhLnV0aWwuTWFwJEVudHJ5IiA9PiAiamF2YS51dGlsLk1hcC5FbnRyeSIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludERlY2xhcmF0aW9uT24oUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQodGhpcy5lbGVtZW50VHlwZU5hbWVEZWNsYXJhdGlvbigpKTsKLQkJZm9yIChpbnQgaSA9IHRoaXMuYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlwdy5wcmludCgiW10iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSAnJCcgdmVyc2lvbiBvZiB0aGUgbmFtZSBpcyB1c2VkIGluIENsYXNzLmZvck5hbWUoU3RyaW5nKSwKLQkgKiBidXQgdGhlICcuJyB2ZXJpb25zIG9mIHRoZSBuYW1lIGlzIHVzZWQgaW4gc291cmNlIGNvZGUuCi0JICogVmVyeSBpcnJpdGF0aW5nLi4uLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VHlwZU5hbWUucmVwbGFjZSgnJCcsICcuJyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCXRoaXMuYXBwZW5kRGVjbGFyYXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlTWV0aG9kU2lnbmF0dXJlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlTWV0aG9kU2lnbmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YzU0ODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZU1ldGhvZFNpZ25hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1ldGhvZFNpZ25hdHVyZSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVNZXRob2RTaWduYXR1cmUKLQlpbXBsZW1lbnRzIE1ldGhvZFNpZ25hdHVyZSwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogc3RvcmUgdGhlIHBhcmFtZXRlciB0eXBlcyBhcyBuYW1lcywgc28gd2UgY2FuIHJlZmVyZW5jZSBjbGFzc2VzCi0JICogdGhhdCBhcmUgbm90IGxvYWRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgSmF2YVR5cGVbXSBwYXJhbWV0ZXJUeXBlczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhVHlwZVtdIEVNUFRZX1BBUkFNRVRFUl9UWVBFUyA9IG5ldyBKYXZhVHlwZVswXTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbWV0aG9kIHNpZ25hdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQKLQkgKiBubyBwYXJhbWV0ZXIgdHlwZXMuCi0JICovCi0JcHVibGljIFNpbXBsZU1ldGhvZFNpZ25hdHVyZShTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIEVNUFRZX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbWV0aG9kIHNpZ25hdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgcGFyYW1ldGVyCi0JICogdHlwZXMuCi0JICovCi0JcHVibGljIFNpbXBsZU1ldGhvZFNpZ25hdHVyZShTdHJpbmcgbmFtZSwgSmF2YVR5cGUuLi4gcGFyYW1ldGVyVHlwZXMpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbmFtZSBpcyByZXF1aXJlZC4iKTsKLQkJfQotCQlpZiAocGFyYW1ldGVyVHlwZXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmFtZXRlciB0eXBlcyBhcmUgcmVxdWlyZWQuIik7Ci0JCX0KLQkJY2hlY2tQYXJhbWV0ZXJUeXBlcyhwYXJhbWV0ZXJUeXBlcyk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucGFyYW1ldGVyVHlwZXMgPSBwYXJhbWV0ZXJUeXBlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUGFyYW1ldGVyVHlwZXMoSmF2YVR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocGFyYW1ldGVyVHlwZXNbaV0gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1pc3NpbmcgcGFyYW1ldGVyIHR5cGU6ICIgKyBpKTsKLQkJCX0KLQkJCWlmIChwYXJhbWV0ZXJUeXBlc1tpXS5nZXRFbGVtZW50VHlwZU5hbWUoKS5lcXVhbHModm9pZC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBwYXJhbWV0ZXIgdHlwZSBvZiAndm9pZCcgaXMgbm90IGFsbG93ZWQ6ICIgKyBpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHBhcmFtZXRlcgotCSAqIHR5cGVzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIG5hbWUsIFN0cmluZy4uLiBwYXJhbWV0ZXJUeXBlTmFtZXMpIHsKLQkJdGhpcyhuYW1lLCBidWlsZFBhcmFtZXRlclR5cGVzKHBhcmFtZXRlclR5cGVOYW1lcykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUeXBlW10gYnVpbGRQYXJhbWV0ZXJUeXBlcyhTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlTmFtZXMpIHsKLQkJaWYgKHBhcmFtZXRlclR5cGVOYW1lcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIHR5cGUgbmFtZXMgYXJlIHJlcXVpcmVkLiIpOwotCQl9Ci0JCUphdmFUeXBlW10gcGFyYW1ldGVyVHlwZXMgPSBuZXcgSmF2YVR5cGVbcGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocGFyYW1ldGVyVHlwZU5hbWVzW2ldID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nIHBhcmFtZXRlciB0eXBlIG5hbWU6ICIgKyBpKTsKLQkJCX0KLQkJCXBhcmFtZXRlclR5cGVzW2ldID0gbmV3IFNpbXBsZUphdmFUeXBlKHBhcmFtZXRlclR5cGVOYW1lc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHBhcmFtZXRlclR5cGVzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHBhcmFtZXRlcgotCSAqIHR5cGVzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIG5hbWUsIENsYXNzPD8+Li4uIHBhcmFtZXRlckphdmFDbGFzc2VzKSB7Ci0JCXRoaXMobmFtZSwgYnVpbGRQYXJhbWV0ZXJUeXBlTmFtZXMocGFyYW1ldGVySmF2YUNsYXNzZXMpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBidWlsZFBhcmFtZXRlclR5cGVOYW1lcyhDbGFzczw/PltdIHBhcmFtZXRlckphdmFDbGFzc2VzKSB7Ci0JCWlmIChwYXJhbWV0ZXJKYXZhQ2xhc3NlcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIEphdmEgY2xhc3NlcyBhcmUgcmVxdWlyZWQuIik7Ci0JCX0KLQkJU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJKYXZhQ2xhc3Nlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckphdmFDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocGFyYW1ldGVySmF2YUNsYXNzZXNbaV0gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1pc3NpbmcgcGFyYW1ldGVyIEphdmEgY2xhc3M6ICIgKyBpKTsKLQkJCX0KLQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHBhcmFtZXRlckphdmFDbGFzc2VzW2ldLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gcGFyYW1ldGVyVHlwZU5hbWVzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgSmF2YSBtZXRob2QuCi0JICovCi0JcHVibGljIFNpbXBsZU1ldGhvZFNpZ25hdHVyZShNZXRob2QgbWV0aG9kKSB7Ci0JCXRoaXMobWV0aG9kLmdldE5hbWUoKSwgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyBKYXZhVHlwZVtdIGdldFBhcmFtZXRlclR5cGVzKCkgewotCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJUeXBlczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29tcGFyaXNvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoU3RyaW5nIG90aGVyTmFtZSwgSmF2YVR5cGVbXSBvdGhlclBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiB0aGlzLm5hbWUuZXF1YWxzKG90aGVyTmFtZSkKLQkJCQkmJiBBcnJheXMuZXF1YWxzKHRoaXMucGFyYW1ldGVyVHlwZXMsIG90aGVyUGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhNZXRob2RTaWduYXR1cmUgb3RoZXIpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxzKG90aGVyLmdldE5hbWUoKSwgb3RoZXIuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCXJldHVybiAodGhpcyA9PSBvKSA/IHRydWUgOiAobyBpbnN0YW5jZW9mIE1ldGhvZFNpZ25hdHVyZSkgPyB0aGlzLmVxdWFscygoTWV0aG9kU2lnbmF0dXJlKSBvKSA6IGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWUuaGFzaENvZGUoKSBeIEFycmF5cy5oYXNoQ29kZSh0aGlzLnBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhNZXRob2RTaWduYXR1cmUgbXMpIHsKLQkJaW50IGNvbXBhcmUgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcy5uYW1lLCBtcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gKGNvbXBhcmUgIT0gMCkgPyBjb21wYXJlIDogdGhpcy5jb21wYXJlUGFyYW1ldGVyVHlwZXMobXMuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcGFyZVBhcmFtZXRlclR5cGVzKEphdmFUeXBlW10gb3RoZXJQYXJhbWV0ZXJUeXBlcykgewotCQlpbnQgbGVuMSA9IHRoaXMucGFyYW1ldGVyVHlwZXMubGVuZ3RoOwotCQlpbnQgbGVuMiA9IG90aGVyUGFyYW1ldGVyVHlwZXMubGVuZ3RoOwotCQlpbnQgbWluID0gTWF0aC5taW4obGVuMSwgbGVuMik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWluOyBpKyspIHsKLQkJCWludCBjb21wYXJlID0gdGhpcy5wYXJhbWV0ZXJUeXBlc1tpXS5jb21wYXJlVG8ob3RoZXJQYXJhbWV0ZXJUeXBlc1tpXSk7Ci0JCQlpZiAoY29tcGFyZSAhPSAwKSB7Ci0JCQkJcmV0dXJuIGNvbXBhcmU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChsZW4xID09IGxlbjIpID8gMCA6IChsZW4xIDwgbGVuMikgPyAtMSA6IDE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50aW5nIGFuZCBkaXNwbGF5aW5nICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJdGhpcy5hcHBlbmRTaWduYXR1cmVUbyhzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGVuZFNpZ25hdHVyZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDApIHsKLQkJCQlzYi5hcHBlbmQoIiwgIik7Ci0JCQl9Ci0JCQl0aGlzLnBhcmFtZXRlclR5cGVzW2ldLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50U2lnbmF0dXJlT24oUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQodGhpcy5uYW1lKTsKLQkJcHcucHJpbnQoJygnKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJcHcucHJpbnQoIiwgIik7Ci0JCQl9Ci0JCQl0aGlzLnBhcmFtZXRlclR5cGVzW2ldLnByaW50RGVjbGFyYXRpb25Pbihwdyk7Ci0JCX0KLQkJcHcucHJpbnQoJyknKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcykpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJdGhpcy5hcHBlbmRTaWduYXR1cmVUbyhzYik7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RhY2suamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTgzOTQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RhY2sgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlU3RhY2s8RT4KLQlpbXBsZW1lbnRzIFN0YWNrPEU+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgTGlua2VkTGlzdDxFPiBlbGVtZW50czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgc3RhY2suCi0JICovCi0JcHVibGljIFNpbXBsZVN0YWNrKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnRzID0gbmV3IExpbmtlZExpc3Q8RT4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGFjayBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkCi0JICogY29sbGVjdGlvbi4gVGhlIHN0YWNrIHdpbGwgcG9wIGl0cyBlbGVtZW50cyBpbiByZXZlcnNlIG9mIHRoZQotCSAqIG9yZGVyIHRoZXkgYXJlIHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3IgKGkuZS4gdGhlCi0JICogbGFzdCBlbGVtZW50IHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3Igd2lsbCBiZSB0aGUKLQkgKiBmaXJzdCBlbGVtZW50IHJldHVybmVkIGJ5ICNwb3AoKSkuCi0JICovCi0JcHVibGljIFNpbXBsZVN0YWNrKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PEU+KGMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTdGFjayBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBwdXNoKEUgbykgewotCQl0aGlzLmVsZW1lbnRzLmFkZExhc3Qobyk7Ci0JfQotCi0JcHVibGljIEUgcG9wKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZWxlbWVudHMucmVtb3ZlTGFzdCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIEUgcGVlaygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnRzLmdldExhc3QoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRzLmlzRW1wdHkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ2xvbmVhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTaW1wbGVTdGFjazxFPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJU2ltcGxlU3RhY2s8RT4gY2xvbmUgPSAoU2ltcGxlU3RhY2s8RT4pIHN1cGVyLmNsb25lKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUxpbmtlZExpc3Q8RT4gbGwgPSAoTGlua2VkTGlzdDxFPikgdGhpcy5lbGVtZW50cy5jbG9uZSgpOwotCQkJY2xvbmUuZWxlbWVudHMgPSBsbDsKLQkJCXJldHVybiBjbG9uZTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVTdHJpbmdNYXRjaGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RyaW5nTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTU1OTVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVTdHJpbmdNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotCi0vLyBUT0RPIHRoZSByZWdleCBjb2RlIGlzIG5vdCB2ZXJ5IGZhc3QgLSB3ZSBjb3VsZCBwcm9iYWJseSBkbyBiZXR0ZXIsCi0vLyBoYW5kLWNvZGluZyB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIChlY2xpcHNlIFN0cmluZ01hdGNoZXI/KQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzaW1wbGUgc3RyaW5nLW1hdGNoaW5nIGFsZ29yaXRobSB0aGF0IGlzIGEgbGl0dGxlCi0gKiBtb3JlIHVzZXItZnJpZW5kbHkgdGhhbiBzdGFuZGFyZCByZWd1bGFyIGV4cHJlc3Npb25zLiBJbnN0YW50aWF0ZSBhCi0gKiBzdHJpbmcgbWF0Y2hlciB3aXRoIGEgZmlsdGVyIHBhdHRlcm4gYW5kIHRoZW4geW91IGNhbiB1c2UgdGhlIG1hdGNoZXIKLSAqIHRvIGRldGVybWluZSB3aGV0aGVyIGFub3RoZXIgc3RyaW5nIChvciBvYmplY3QpIG1hdGNoZXMgdGhlIHBhdHRlcm4uCi0gKiBZb3UgY2FuIGFsc28gc3BlY2lmeSB3aGV0aGVyIHRoZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZS1zZW5zaXRpdmUuCi0gKiAKLSAqIFRoZSBwYXR0ZXJuIGNhbiBjb250YWluIHR3byAibWV0YS1jaGFyYWN0ZXJzIjoKLSAqIAknKicgd2lsbCBtYXRjaCBhbnkgc2V0IG9mIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzCi0gKiAJJz8nIHdpbGwgbWF0Y2ggYW55IHNpbmdsZSBjaGFyYWN0ZXIKLSAqIAotICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgI3ByZWZpeCgpIGFuZC9vciAjc3VmZml4KCkgdG8gY2hhbmdlIHdoYXQKLSAqIHN0cmluZ3MgYXJlIHByZXBlbmRlZCBvciBhcHBlbmRlZCB0byB0aGUgb3JpZ2luYWwgcGF0dGVybiBzdHJpbmcuCi0gKiBUaGlzIGNhbiBvZmZlciBhIHNsaWdodCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGNvbmNhdGVuYXRpbmcKLSAqIHN0cmluZ3MgYmVmb3JlIGNhbGxpbmcgI3NldFBhdHRlcm5TdHJpbmcoU3RyaW5nKS4KLSAqIEJ5IGRlZmF1bHQsIGEgJyonIGlzIGFwcGVuZGVkIHRvIGV2ZXJ5IHN0cmluZy4KLSAqIAotICogVGhpcyBjbGFzcyBhbHNvIHVzZXMgdGhlIHN0cmluZy1tYXRjaGluZyBhbGdvcml0aG0gdG8gImZpbHRlciIgb2JqZWN0cwotICogKGFuZCwgYXMgYSByZXN1bHQsIGFsc28gaW1wbGVtZW50cyB0aGUgRmlsdGVyIGludGVyZmFjZSkuCi0gKiBBIHN0cmluZyBjb252ZXJ0ZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBzdHJpbmcgYXNwZWN0IG9mIHRoZQotICogb2JqZWN0IGlzIGNvbXBhcmVkIHRvIHRoZSBwYXR0ZXJuLiBCeSBkZWZhdWx0IHRoZSBzdHJpbmcgcmV0dXJuZWQKLSAqIGJ5IHRoZSBvYmplY3QncyAjdG9TdHJpbmcoKSBtZXRob2QgaXMgcGFzc2VkIHRvIHRoZSBwYXR0ZXJuIG1hdGNoZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdHJpbmdNYXRjaGVyPFQ+Ci0JaW1wbGVtZW50cyBTdHJpbmdNYXRjaGVyLCBGaWx0ZXI8VD4sIFNlcmlhbGl6YWJsZQotewotCi0JLyoqIEFuIGFkYXB0ZXIgdGhhdCBjb252ZXJ0cyB0aGUgb2JqZWN0cyBpbnRvIHN0cmluZ3MgdG8gYmUgbWF0Y2hlZCB3aXRoIHRoZSBwYXR0ZXJuLiAqLwotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcjsKLQotCS8qKiBUaGUgc3RyaW5nIHVzZWQgdG8gY29uc3RydWN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4gKi8KLQlwcml2YXRlIFN0cmluZyBwYXR0ZXJuU3RyaW5nOwotCi0JLyoqIFdoZXRoZXIgdGhlIG1hdGNoZXIgaWdub3JlcyBjYXNlIC0gdGhlIGRlZmF1bHQgaXMgdHJ1ZS4gKi8KLQlwcml2YXRlIGJvb2xlYW4gaWdub3Jlc0Nhc2U7Ci0KLQkvKiogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIGJ1aWx0IGZyb20gdGhlIHBhdHRlcm4gc3RyaW5nLiAqLwotCXByaXZhdGUgUGF0dGVybiBwYXR0ZXJuOwotCi0JLyoqIEEgbGlzdCBvZiB0aGUgbWV0YS1jaGFyYWN0ZXJzIHdlIG5lZWQgdG8gZXNjYXBlIGlmIGZvdW5kIGluIHRoZSBwYXR0ZXJuIHN0cmluZy4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBSRUdfRVhfTUVUQV9DSEFSUyA9IHsgJygnLCAnWycsICd7JywgJ1xcJywgJ14nLCAnJCcsICd8JywgJyknLCAnPycsICcqJywgJysnLCAnLicgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdHJpbmcgbWF0Y2hlciB3aXRoIGFuIHBhdHRlcm4gdGhhdCB3aWxsIG1hdGNoCi0JICogYW55IHN0cmluZyBhbmQgaWdub3JlIGNhc2UuCi0JICovCi0JcHVibGljIFNpbXBsZVN0cmluZ01hdGNoZXIoKSB7Ci0JCXRoaXMoIioiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdHJpbmcgbWF0Y2hlciB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0dGVybgotCSAqIHRoYXQgd2lsbCBpZ25vcmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlU3RyaW5nTWF0Y2hlcihTdHJpbmcgcGF0dGVyblN0cmluZykgewotCQl0aGlzKHBhdHRlcm5TdHJpbmcsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0cmluZyBtYXRjaGVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXR0ZXJuIHRoYXQgd2lsbAotCSAqIGlnbm9yZSBjYXNlIGFzIHNwZWNpZmllZC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlU3RyaW5nTWF0Y2hlcihTdHJpbmcgcGF0dGVyblN0cmluZywgYm9vbGVhbiBpZ25vcmVzQ2FzZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhdHRlcm5TdHJpbmcgPSBwYXR0ZXJuU3RyaW5nOwotCQl0aGlzLmlnbm9yZXNDYXNlID0gaWdub3Jlc0Nhc2U7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCk7Ci0JCXRoaXMucmVidWlsZFBhdHRlcm4oKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgY3VycmVudCBwYXR0ZXJuIHN0cmluZyBhbmQgY2FzZS1zZW5zaXRpdml0eSBzZXR0aW5nLAotCSAqIHJlLWJ1aWxkIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVidWlsZFBhdHRlcm4oKSB7Ci0JCXRoaXMucGF0dGVybiA9IHRoaXMuYnVpbGRQYXR0ZXJuKCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIGN1cnJlbnQgcGF0dGVybiBzdHJpbmcgYW5kIGNhc2Utc2Vuc2l0aXZpdHkgc2V0dGluZywKLQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdGhhdCBjYW4gYmUgdXNlZAotCSAqIHRvIG1hdGNoIHN0cmluZ3MuCi0JICovCi0JcHJvdGVjdGVkIFBhdHRlcm4gYnVpbGRQYXR0ZXJuKCkgewotCQlpbnQgcGF0dGVybkZsYWdzID0gMHgwOwotCQlpZiAodGhpcy5pZ25vcmVzQ2FzZSkgewotCQkJcGF0dGVybkZsYWdzID0gUGF0dGVybi5VTklDT0RFX0NBU0UgfCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkU7Ci0JCX0KLQkJcmV0dXJuIFBhdHRlcm4uY29tcGlsZSh0aGlzLmNvbnZlcnRUb1JlZ0V4KHRoaXMucGF0dGVyblN0cmluZyksIHBhdHRlcm5GbGFncyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0cmluZ01hdGNoZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFBhdHRlcm5TdHJpbmcoU3RyaW5nIHBhdHRlcm5TdHJpbmcpIHsKLQkJdGhpcy5wYXR0ZXJuU3RyaW5nID0gcGF0dGVyblN0cmluZzsKLQkJdGhpcy5yZWJ1aWxkUGF0dGVybigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG1hdGNoZXMgdGhlIHBhdHRlcm4uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gdGhpcy5wYXR0ZXJuLm1hdGNoZXIoc3RyaW5nKS5tYXRjaGVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEZpbHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWNjZXB0KFQgbykgewotCQlyZXR1cm4gdGhpcy5tYXRjaGVzKHRoaXMuc3RyaW5nQ29udmVydGVyLmNvbnZlcnRUb1N0cmluZyhvKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0cmluZyBjb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IHRoZSBvYmplY3RzCi0JICogcGFzc2VkIHRvIHRoZSBtYXRjaGVyIGludG8gc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnN0cmluZ0NvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHN0cmluZyBjb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IHRoZSBvYmplY3RzCi0JICogcGFzc2VkIHRvIHRoZSBtYXRjaGVyIGludG8gc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U3RyaW5nQ29udmVydGVyKFN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBzdHJpbmdDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBwYXR0ZXJuU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5wYXR0ZXJuU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtYXRjaGVyIGlnbm9yZXMgY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaWdub3Jlc0Nhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmlnbm9yZXNDYXNlOwotCX0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHRoZSBtYXRjaGVyIGlnbm9yZXMgY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SWdub3Jlc0Nhc2UoYm9vbGVhbiBpZ25vcmVzQ2FzZSkgewotCQl0aGlzLmlnbm9yZXNDYXNlID0gaWdub3Jlc0Nhc2U7Ci0JCXRoaXMucmVidWlsZFBhdHRlcm4oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgUGF0dGVybiBwYXR0ZXJuKCkgewotCQlyZXR1cm4gdGhpcy5wYXR0ZXJuOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdGhlciBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVndWxhciBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8KLQkgKiB0aGUgb3JpZ2luYWwgcGF0dGVybiBzdHJpbmcuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgcmVndWxhckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRUb1JlZ0V4KHRoaXMucGF0dGVyblN0cmluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1JlZ0V4KFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzdHJpbmcubGVuZ3RoKCkgKyAxMCk7Ci0JCXRoaXMuY29udmVydFRvUmVnRXhPbih0aGlzLnByZWZpeCgpLCBzYik7Ci0JCXRoaXMuY29udmVydFRvUmVnRXhPbihzdHJpbmcsIHNiKTsKLQkJdGhpcy5jb252ZXJ0VG9SZWdFeE9uKHRoaXMuc3VmZml4KCksIHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFueSBwcmVmaXggdGhhdCBzaG91bGQgYmUgcHJlcGVuZGVkIHRvIHRoZSBvcmlnaW5hbAotCSAqIHN0cmluZy4gQnkgZGVmYXVsdCwgdGhlcmUgaXMgbm8gcHJlZml4LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlZml4KCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFueSBzdWZmaXggdGhhdCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gdGhlIG9yaWdpbmFsCi0JICogc3RyaW5nLiBTaW5jZSB0aGlzIGNsYXNzIGlzIHR5cGljYWxseSB1c2VkIGluIFVJIHNpdHVhdGlvbiB3aGVyZQotCSAqIHRoZSB1c2VyIGlzIHR5cGluZyBpbiBhIHBhdHRlcm4gdXNlZCB0byBmaWx0ZXIgYSBsaXN0LCB0aGUgZGVmYXVsdAotCSAqIHN1ZmZpeCBpcyBhIHdpbGRjYXJkIGNoYXJhY3Rlci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN1ZmZpeCgpIHsKLQkJcmV0dXJuICIqIjsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbnZlcnRUb1JlZ0V4T24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXJbXSBjaGFyQXJyYXkgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGxlbmd0aCA9IGNoYXJBcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgYyA9IGNoYXJBcnJheVtpXTsKLQkJCS8vIGNvbnZlcnQgdXNlci1mcmllbmRseSBtZXRhLWNoYXJzIGludG8gcmVnZXggbWV0YS1jaGFycwotCQkJaWYgKGMgPT0gJyonKSB7Ci0JCQkJc2IuYXBwZW5kKCIuKiIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGMgPT0gJz8nKSB7Ci0JCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkvLyBlc2NhcGUgcmVnZXggbWV0YS1jaGFycwotCQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhSRUdfRVhfTUVUQV9DSEFSUywgYykpIHsKLQkJCQlzYi5hcHBlbmQoJ1xcJyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdGFjay5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYmVmNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLS8qKgotICogSW50ZXJmYWNlIGRlZmluaW5nIHRoZSBjbGFzc2ljIHN0YWNrIGJlaGF2aW9yLAotICogd2l0aG91dCB0aGUgYmFja2Rvb3JzIGFsbG93ZWQgYnkgamF2YS51dGlsLlN0YWNrLgotICogRSBpcyB0aGUgdHlwZSBvZiBlbGVtZW50cyBjb250YWluZWQgYnkgdGhlIFN0YWNrLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YWNrPEU+IHsKLQotCS8qKgotCSAqICJQdXNoIiB0aGUgc3BlY2lmaWVkIGl0ZW0gb24gdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JICovCi0Jdm9pZCBwdXNoKEUgbyk7Ci0KLQkvKioKLQkgKiAiUG9wIiBhbiBpdGVtIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JICovCi0JRSBwb3AoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgc3RhY2suCi0JICovCi0JRSBwZWVrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3RhY2sgaXMgZW1wdHkuCi0JICovCi0JYm9vbGVhbiBpc0VtcHR5KCk7Ci0KLQotCWZpbmFsIGNsYXNzIEVtcHR5PEU+IGltcGxlbWVudHMgU3RhY2s8RT4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0YWNrIElOU1RBTkNFID0gbmV3IEVtcHR5KCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxUPiBTdGFjazxUPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRW1wdHkoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHB1c2goRSBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlwdWJsaWMgRSBwb3AoKSB7Ci0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBFIHBlZWsoKSB7Ci0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2YjUzMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzCi0gKiBpbnRvIHN0cmluZ3MuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RyaW5nQ29udmVydGVyPFQ+IHsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBvYmplY3QgaW50byBhIHN0cmluZy4KLQkgKiBUaGUgc2VtYW50aWNzIG9mICJjb252ZXJ0IiBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKi8KLQlTdHJpbmcgY29udmVydFRvU3RyaW5nKFQgbyk7Ci0KLQotCWZpbmFsIGNsYXNzIERlZmF1bHQ8Uz4gaW1wbGVtZW50cyBTdHJpbmdDb252ZXJ0ZXI8Uz4gewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdDb252ZXJ0ZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gU3RyaW5nQ29udmVydGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QncyAjdG9TdHJpbmcoKSByZXN1bHQKLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoUyBvKSB7Ci0JCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyBudWxsIDogby50b1N0cmluZygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdCI7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIFN0cmluZ0NvbnZlcnRlcjxTPiB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ0NvbnZlcnRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gU3RyaW5nQ29udmVydGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFMgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlN0cmluZ0NvbnZlcnRlci5EaXNhYmxlZCI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdNYXRjaGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc2OWQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBzaW1wbGUgQVBJIGZvciBhbGxvd2luZyAicGx1Z2dhYmxlIgotICogc3RyaW5nIG1hdGNoZXJzIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBhIHBhdHRlcm4gc3RyaW5nCi0gKiB0aGVuIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgc3RyaW5ncyBtYXRjaCB0aGUgcGF0dGVybi4KLSAqLwotcHVibGljIGludGVyZmFjZSBTdHJpbmdNYXRjaGVyIHsKLQotCS8qKgotCSAqIFNldCB0aGUgcGF0dGVybiBzdHJpbmcgdXNlZCB0byBkZXRlcm1pbmUgZnV0dXJlCi0JICogbWF0Y2hlcy4gVGhlIGZvcm1hdCBhbmQgc2VtYW50aWNzIG9mIHRoZSBwYXR0ZXJuCi0JICogc3RyaW5nIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZQotCSAqIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKi8KLQl2b2lkIHNldFBhdHRlcm5TdHJpbmcoU3RyaW5nIHBhdHRlcm5TdHJpbmcpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgbWF0Y2hlcyB0aGUKLQkgKiBlc3RhYmxpc2hlZCBwYXR0ZXJuIHN0cmluZy4gVGhlIHNlbWFudGljcyBvZiBhIG1hdGNoCi0JICogaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUKLQkgKiBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzdHJpbmcpOwotCi0KLQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgU3RyaW5nTWF0Y2hlciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nTWF0Y2hlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nTWF0Y2hlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UGF0dGVyblN0cmluZyhTdHJpbmcgcGF0dGVyblN0cmluZykgewotCQkJLy8gaWdub3JlIHRoZSBwYXR0ZXJuIHN0cmluZwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHN0cmluZykgewotCQkJLy8gZXZlcnl0aGluZyBpcyBhIG1hdGNoCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiU3RyaW5nTWF0Y2hlci5OdWxsIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ1Rvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlZTBkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIGphdmEubGFuZy5TdHJpbmcgY2xhc3MuCi0gKiAKLSAqIEFzIG9mIGpkayAxLjUsIGl0J3MgdGVtcHRpbmcgdG8gY29udmVydCBhbGwgb2YgdGhlc2UgbWV0aG9kcyB0byB1c2UKLSAqIGphdmEubGFuZy5BcHBlbmRhYmxlIChpbnN0ZWFkIG9mIFN0cmluZ0J1ZmZlciwgU3RyaW5nQnVpbGRlciwgYW5kIFdyaXRlcik7Ci0gKiBidXQgYWxsIHRoZSBBcHBlbmRhYmxlIG1ldGhvZHMgdGhyb3cgamF2YS5pby5JT0V4Y2VwdGlvbiAoeWVjaCkgYW5kIHdlCi0gKiBbbWlnaHQ/XSBnZXQgYSBiaXQgYmV0dGVyIHBlcmZvcm1hbmNlIGludm9raW5nIG1ldGhvZHMgb24gY2xhc3NlcyB0aGFuCi0gKiB3ZSBnZXQgb24gaW50ZXJmYWNlcy4gOi0pCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdUb29scyB7Ci0KLQkvKiogY2FycmlhZ2UgcmV0dXJuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQkvKiogZG91YmxlIHF1b3RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFFVT1RFID0gJyInOwotCi0JLyoqIHBhcmVudGhlc2lzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9QRU5fUEFSRU5USEVTSVMgPSAnKCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENMT1NFX1BBUkVOVEhFU0lTID0gJyknOwotCi0JLyoqIGJyYWNrZXRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9QRU5fQlJBQ0tFVCA9ICdbJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0xPU0VfQlJBQ0tFVCA9ICddJzsKLQotCS8qKiBicmFja2V0cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUEVOX0JSQUNFID0gJ3snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDTE9TRV9CUkFDRSA9ICd9JzsKLQotCS8qKiBicmFja2V0cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUEVOX0NIRVZST04gPSAnPCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENMT1NFX0NIRVZST04gPSAnPic7Ci0KLQkvKiogZW1wdHkgc3RyaW5nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBlbXB0eSBjaGFyIGFycmF5ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRU1QVFlfQ0hBUl9BUlJBWSA9IG5ldyBjaGFyWzBdOwotCi0KLQotCS8vICoqKioqKioqKiogcGFkZGluZy90cnVuY2F0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWQoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZChTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBwYWQoc3RyaW5nLCBsZW5ndGgsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcGFkT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcGFkT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWQoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gcGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWQoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHBhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBwYWQoc3RyaW5nLCBsZW5ndGgsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgd3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcGFkT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcGFkT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBwYWQoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWRPclRydW5jYXRlKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHBhZE9yVHJ1bmNhdGUoc3RyaW5nLCBsZW5ndGgsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlwYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcgJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlwYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWRPclRydW5jYXRlKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBwYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLnN1YnN0cmluZygwLCBsZW5ndGgpLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcuc3Vic3RyaW5nKDAsIGxlbmd0aCkpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZygwLCBsZW5ndGgpKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZShpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBwYWRPclRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlwYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlwYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBwYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAwLCBsZW5ndGgpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDAsIGxlbmd0aCwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDAsIGxlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhZF8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHBhZF8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbmd0aCwgYykpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHdyaXRlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJZmlsbF8oc3RyaW5nLmxlbmd0aCgpLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHdyaXRlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhpbnQgc3RyaW5nTGVuZ3RoLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihDb2xsZWN0aW9uVG9vbHMuZmlsbChuZXcgY2hhcltsZW5ndGggLSBzdHJpbmdMZW5ndGhdLCBjKSwgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoKCksIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oaW50IHN0cmluZ0xlbmd0aCwgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENvbGxlY3Rpb25Ub29scy5maWxsKG5ldyBjaGFyW2xlbmd0aCAtIHN0cmluZ0xlbmd0aF0sIGMpKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoKCksIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgsIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oaW50IHN0cmluZ0xlbmd0aCwgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDb2xsZWN0aW9uVG9vbHMuZmlsbChuZXcgY2hhcltsZW5ndGggLSBzdHJpbmdMZW5ndGhdLCBjKSk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcGFkXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAwLCBzdHJpbmdMZW5ndGgpOwotCQlBcnJheXMuZmlsbChyZXN1bHQsIHN0cmluZ0xlbmd0aCwgbGVuZ3RoLCBjKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWQoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHplcm9QYWQoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gZnJvbnRQYWQoc3RyaW5nLCBsZW5ndGgsICcwJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT24oaW50LCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZyb250UGFkT24oc3RyaW5nLCBsZW5ndGgsICcwJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZyb250UGFkT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZChpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZnJvbnRQYWQoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gZnJvbnRQYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB6ZXJvUGFkKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkKHN0cmluZywgbGVuZ3RoLCAnMCcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWQoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGZyb250UGFkKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBmcm9udFBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZShpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgemVyb1BhZE9yVHJ1bmNhdGUoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gZnJvbnRQYWRPclRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCAnMCcpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPclRydW5jYXRlT24oaW50LCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZyb250UGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZyb250UGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZShpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZnJvbnRQYWRPclRydW5jYXRlKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhzdHJpbmdMZW5ndGggLSBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBmcm9udFBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZy5zdWJzdHJpbmcoc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoKSwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZy5zdWJzdHJpbmcoc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZyhzdHJpbmdMZW5ndGggLSBsZW5ndGgpKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZShpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gemVyb1BhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gZnJvbnRQYWRPclRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCAnMCcpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPclRydW5jYXRlT24oaW50LCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZyb250UGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZyb250UGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlIAotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGUoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGZyb250UGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIHN0cmluZ0xlbmd0aCAtIGxlbmd0aCwgcmVzdWx0LCAwLCBsZW5ndGgpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gZnJvbnRQYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlIAotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoLCBsZW5ndGgsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUgCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZywgc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUgCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCBzdHJpbmdMZW5ndGggLSBsZW5ndGgsIGxlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBGcm9udC1wYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnJvbnRQYWRfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlyZXR1cm4gbmV3IFN0cmluZyhmcm9udFBhZF8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbmd0aCwgYykpOwotCX0KLQotCS8qCi0JICogWmVyby1wYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gZnJvbnRQYWRfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWludCBwYWRMZW5ndGggPSBsZW5ndGggLSBzdHJpbmdMZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIHBhZExlbmd0aCwgc3RyaW5nTGVuZ3RoKTsKLQkJQXJyYXlzLmZpbGwocmVzdWx0LCAwLCBwYWRMZW5ndGgsIGMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB3cmFwcGluZy9xdW90aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHdyYXAoc3RyaW5nLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl3cmFwT24oc3RyaW5nLCBRVU9URSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJd3JhcE9uKHN0cmluZywgUVVPVEUsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXdyYXBPbihzdHJpbmcsIFFVT1RFLCBzYik7Ci0JfQotCi0JLyoqCi0JICogV3JhcCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IHF1b3RlKEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHN0cmluZykgewotCQkJCXJldHVybiBTdHJpbmdUb29scy5xdW90ZShzdHJpbmcpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3cmFwKFN0cmluZyBzdHJpbmcsIGNoYXIgd3JhcCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyh3cmFwKHN0cmluZy50b0NoYXJBcnJheSgpLCB3cmFwKSk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cmFwT24oU3RyaW5nIHN0cmluZywgY2hhciB3cmFwLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKHdyYXAsIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl3cml0ZUNoYXJPbih3cmFwLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JhcE9uKFN0cmluZyBzdHJpbmcsIGNoYXIgd3JhcCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyYXBPbihTdHJpbmcgc3RyaW5nLCBjaGFyIHdyYXAsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHdyYXApOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJc2IuYXBwZW5kKHdyYXApOwotCX0KLQotCS8qKgotCSAqIFdyYXAgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gd3JhcChJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MsIGZpbmFsIGNoYXIgd3JhcCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHN0cmluZykgewotCQkJCXJldHVybiBTdHJpbmdUb29scy53cmFwKHN0cmluZywgd3JhcCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdyYXAoU3RyaW5nIHN0cmluZywgU3RyaW5nIHdyYXApIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcod3JhcChzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JhcC50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cmFwT24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHdyYXAsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbih3cmFwLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbih3cmFwLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JhcE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyB3cmFwLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHdyYXApOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJc2IuYXBwZW5kKHdyYXApOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JhcE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyB3cmFwLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IHdyYXAoSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzLCBmaW5hbCBTdHJpbmcgd3JhcCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHN0cmluZykgewotCQkJCXJldHVybiBTdHJpbmdUb29scy53cmFwKHN0cmluZywgd3JhcCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcXVvdGUoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gd3JhcChzdHJpbmcsIFFVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyYXBPbihzdHJpbmcsIFFVT1RFLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQl3cmFwT24oc3RyaW5nLCBRVU9URSwgc2IpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJd3JhcE9uKHN0cmluZywgUVVPVEUsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gcXVvdGVDaGFyQXJyYXlzKEl0ZXJhdG9yPGNoYXJbXT4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Y2hhcltdLCBjaGFyW10+KHN0cmluZ3MpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXJbXSB0cmFuc2Zvcm0oY2hhcltdIHN0cmluZykgewotCQkJCXJldHVybiBTdHJpbmdUb29scy5xdW90ZShzdHJpbmcpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB3cmFwKGNoYXJbXSBzdHJpbmcsIGNoYXIgd3JhcCkgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbisyXTsKLQkJcmVzdWx0WzBdID0gd3JhcDsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgMSwgbGVuKTsKLQkJcmVzdWx0W2xlbisxXSA9IHdyYXA7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cmFwT24oY2hhcltdIHN0cmluZywgY2hhciB3cmFwLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKHdyYXAsIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl3cml0ZUNoYXJPbih3cmFwLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JhcE9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgd3JhcCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyYXBPbihjaGFyW10gc3RyaW5nLCBjaGFyIHdyYXAsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHdyYXApOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJc2IuYXBwZW5kKHdyYXApOwotCX0KLQotCS8qKgotCSAqIFdyYXAgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gd3JhcENoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzLCBmaW5hbCBjaGFyIHdyYXApIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBjaGFyW10gdHJhbnNmb3JtKGNoYXJbXSBzdHJpbmcpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMud3JhcChzdHJpbmcsIHdyYXApOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB3cmFwKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSB3cmFwKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpbnQgd3JhcExlbmd0aCA9IHdyYXAubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbc3RyaW5nTGVuZ3RoKygyKndyYXBMZW5ndGgpXTsKLQkJU3lzdGVtLmFycmF5Y29weSh3cmFwLCAwLCByZXN1bHQsIDAsIHdyYXBMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCB3cmFwTGVuZ3RoLCBzdHJpbmdMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHdyYXAsIDAsIHJlc3VsdCwgc3RyaW5nTGVuZ3RoK3dyYXBMZW5ndGgsIHdyYXBMZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JhcE9uKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSB3cmFwLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24od3JhcCwgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24od3JhcCwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyYXBPbihjaGFyW10gc3RyaW5nLCBjaGFyW10gd3JhcCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyYXBPbihjaGFyW10gc3RyaW5nLCBjaGFyW10gd3JhcCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQod3JhcCk7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCQlzYi5hcHBlbmQod3JhcCk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYQotCSAqIGNvcHkgb2YgdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8Y2hhcltdPiB3cmFwQ2hhckFycmF5cyhJdGVyYXRvcjxjaGFyW10+IHN0cmluZ3MsIGZpbmFsIGNoYXJbXSB3cmFwKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhcltdIHRyYW5zZm9ybShjaGFyW10gc3RyaW5nKSB7Ci0JCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLndyYXAoc3RyaW5nLCB3cmFwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVsaW1pdGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBxdW90ZWQ6ICJcImZvb1wiIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNRdW90ZWQoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgcGFyZW50aGV0aWNhbDogIihmb28pIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNQYXJlbnRoZXRpY2FsKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9QQVJFTlRIRVNJUywgQ0xPU0VfUEFSRU5USEVTSVMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGJyYWNrZXRlZDogIltmb29dIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNCcmFja2V0ZWQoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX0JSQUNLRVQsIENMT1NFX0JSQUNLRVQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGJyYWNlZDogIntmb299Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNCcmFjZWQoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX0JSQUNFLCBDTE9TRV9CUkFDRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgY2hldnJvbmVkOiAiPGZvbz4iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0NoZXZyb25lZChTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fQ0hFVlJPTiwgQ0xPU0VfQ0hFVlJPTik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgZGVsaW1pdGVkIGJ5IHRoZSBzcGVjaWZpZWQKLQkgKiBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRGVsaW1pdGVkKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBjLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNwZWNpZmllZAotCSAqIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRGVsaW1pdGVkKFN0cmluZyBzdHJpbmcsIGNoYXIgc3RhcnQsIGNoYXIgZW5kKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPCAyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZy50b0NoYXJBcnJheSgpLCBzdGFydCwgZW5kLCBsZW4pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHF1b3RlZDogIlwiZm9vXCIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc1F1b3RlZChjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIFFVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBwYXJlbnRoZXRpY2FsOiAiKGZvbykiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc1BhcmVudGhldGljYWwoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX1BBUkVOVEhFU0lTLCBDTE9TRV9QQVJFTlRIRVNJUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYnJhY2tldGVkOiAiW2Zvb10iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0JyYWNrZXRlZChjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fQlJBQ0tFVCwgQ0xPU0VfQlJBQ0tFVCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYnJhY2VkOiAie2Zvb30iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0JyYWNlZChjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fQlJBQ0UsIENMT1NFX0JSQUNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBjaGV2cm9uZWQ6ICI8Zm9vPiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzQ2hldnJvbmVkKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9DSEVWUk9OLCBDTE9TRV9DSEVWUk9OKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNwZWNpZmllZAotCSAqIGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNEZWxpbWl0ZWQoY2hhcltdIHN0cmluZywgY2hhciBjKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIGMsIGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGRlbGltaXRlZCBieSB0aGUgc3BlY2lmaWVkCi0JICogY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNEZWxpbWl0ZWQoY2hhcltdIHN0cmluZywgY2hhciBzdGFydCwgY2hhciBlbmQpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gPCAyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgc3RhcnQsIGVuZCwgbGVuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRGVsaW1pdGVkKGNoYXJbXSBzLCBjaGFyIHN0YXJ0LCBjaGFyIGVuZCwgaW50IGxlbikgewotCQlyZXR1cm4gKHNbMF0gPT0gc3RhcnQpICYmIChzW2xlbiAtIDFdID09IGVuZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVud3JhcHBpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW53cmFwcGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bndyYXAoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gdW53cmFwKHN0cmluZywgMSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW53cmFwcGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bndyYXAoU3RyaW5nIHN0cmluZywgaW50IGNvdW50KSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBzdHJpbmcgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKHVud3JhcChzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuLCBjb3VudCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVud3JhcHBlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gdW53cmFwKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHVud3JhcChzdHJpbmcsIDEpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVud3JhcHBlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gdW53cmFwKGNoYXJbXSBzdHJpbmcsIGludCBjb3VudCkgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9DSEFSX0FSUkFZOwotCQl9Ci0JCXJldHVybiB1bndyYXAoc3RyaW5nLCBsZW4sIGNvdW50KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdW53cmFwKGNoYXJbXSBzdHJpbmcsIGludCBsZW4sIGludCBjb3VudCkgewotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIGNvdW50LCByZXN1bHQsIDAsIGxlbik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVW53cmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bndyYXBPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXVud3JhcE9uKHN0cmluZywgMSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVbndyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgb2YgY291bnQgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW53cmFwT24oU3RyaW5nIHN0cmluZywgaW50IGNvdW50LCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBzdHJpbmcgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIGNvdW50LCBsZW4sIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogVW53cmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bndyYXBPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJdW53cmFwT24oc3RyaW5nLCAxLCBzYik7Ci0JfQotCi0JLyoqCi0JICogVW53cmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG9mIGNvdW50IGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVud3JhcE9uKFN0cmluZyBzdHJpbmcsIGludCBjb3VudCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBzdHJpbmcgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2IuYXBwZW5kKHN0cmluZywgY291bnQsIGNvdW50ICsgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBVbndyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVud3JhcE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJdW53cmFwT24oc3RyaW5nLCAxLCBzYik7Ci0JfQotCi0JLyoqCi0JICogVW53cmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG9mIGNvdW50IGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVud3JhcE9uKFN0cmluZyBzdHJpbmcsIGludCBjb3VudCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgc3RyaW5nICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNiLmFwcGVuZChzdHJpbmcsIGNvdW50LCBjb3VudCArIGxlbik7Ci0JfQotCi0JLyoqCi0JICogVW53cmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bndyYXBPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXVud3JhcE9uKHN0cmluZywgMSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVbndyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgb2YgY291bnQgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW53cmFwT24oY2hhcltdIHN0cmluZywgaW50IGNvdW50LCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCBjb3VudCwgbGVuLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFVud3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW53cmFwT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXVud3JhcE9uKHN0cmluZywgMSwgc2IpOwotCX0KLQotCS8qKgotCSAqIFVud3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyBvZiBjb3VudCBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bndyYXBPbihjaGFyW10gc3RyaW5nLCBpbnQgY291bnQsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzYi5hcHBlbmQoc3RyaW5nLCBjb3VudCwgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBVbndyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVud3JhcE9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJdW53cmFwT24oc3RyaW5nLCAxLCBzYik7Ci0JfQotCi0JLyoqCi0JICogVW53cmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG9mIGNvdW50IGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVud3JhcE9uKGNoYXJbXSBzdHJpbmcsIGludCBjb3VudCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzYi5hcHBlbmQoc3RyaW5nLCBjb3VudCwgbGVuKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZpbmcgY2hhcmFjdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBTdHJpbmcjcmVtb3ZlRmlyc3RPY2N1cnJlbmNlKGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewotCQlpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgbm90IGZvdW5kCi0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCX0KLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoKCkgLSAxOwotCQlpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBsYXN0KTsKLQkJfQotCQkvLyBjaGFyYWN0ZXIgZm91bmQgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZwotCQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkuY29uY2F0KHN0cmluZy5zdWJzdHJpbmcoaW5kZXggKyAxKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGaXJzdE9jY3VycmVuY2VPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVDaGFyQXRJbmRleE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBpbmRleCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVDaGFyQXRJbmRleE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBpbmRleCwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ2hhckF0SW5kZXhPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgaW5kZXgsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2UoY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVGaXJzdE9jY3VycmVuY2UoY2hhcltdIHN0cmluZywgY2hhciBjKSB7Ci0JCWludCBpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJLy8gY2hhcmFjdGVyIG5vdCBmb3VuZAotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGFzdF07Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDEsIHJlc3VsdCwgMCwgbGFzdCk7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAwLCBsYXN0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgaW5kZXggKyAxLCByZXN1bHQsIGluZGV4LCBsYXN0IC0gaW5kZXgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLCBpbmRleCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQ2hhckF0SW5kZXhPbihjaGFyW10gc3RyaW5nLCBpbnQgaW5kZXgsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoIC0gMTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZnJvbnQgb2Ygc3RyaW5nCi0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMSwgbGFzdCwgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSBsYXN0KSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiBzdHJpbmcKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBsYXN0LCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBpbmRleCwgd3JpdGVyKTsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCBpbmRleCArIDEsIGxhc3QgLSBpbmRleCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLCBpbmRleCwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVDaGFyQXRJbmRleE9uKGNoYXJbXSBzdHJpbmcsIGludCBpbmRleCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMSwgbGFzdCk7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsYXN0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBpbmRleCk7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCBpbmRleCArIDEsIGxhc3QgLSBpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLCBpbmRleCwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVDaGFyQXRJbmRleE9uKGNoYXJbXSBzdHJpbmcsIGludCBpbmRleCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDEsIGxhc3QpOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgbGFzdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgaW5kZXgpOwotCQkJc2IuYXBwZW5kKHN0cmluZywgaW5kZXggKyAxLCBsYXN0IC0gaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbE9jY3VycmVuY2VzKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewotCQlpbnQgZmlyc3QgPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJcmV0dXJuIChmaXJzdCA9PSAtMSkgPyBzdHJpbmcgOiBuZXcgU3RyaW5nKHJlbW92ZUFsbE9jY3VycmVuY2VzXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgZmlyc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBmaXJzdCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGMsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGMsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgZmlyc3QgPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBjLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlpbnQgZmlyc3QgPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IHJlbW92ZUFsbE9jY3VycmVuY2VzXyhzdHJpbmcsIGMsIGZpcnN0KTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsT2NjdXJyZW5jZXNfKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgaW50IGZpcnN0KSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHJpbmcubGVuZ3RoKTsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLCBjLCBmaXJzdCwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGZpcnN0ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZywgYywgZmlyc3QsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT25fKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgaW50IGZpcnN0LCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBmaXJzdCwgd3JpdGVyKTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGQgPSBzdHJpbmdbaV07Ci0JCQlpZiAoZCAhPSBjKSB7Ci0JCQkJd3JpdGVDaGFyT24oZCwgd3JpdGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZywgYywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oY2hhcltdIHN0cmluZywgY2hhciBjLCBpbnQgZmlyc3QsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBmaXJzdCk7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBkID0gc3RyaW5nW2ldOwotCQkJaWYgKGQgIT0gYykgewotCQkJCXNiLmFwcGVuZChkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZywgYywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oY2hhcltdIHN0cmluZywgY2hhciBjLCBpbnQgZmlyc3QsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZywgMCwgZmlyc3QpOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZCA9IHN0cmluZ1tpXTsKLQkJCWlmIChkICE9IGMpIHsKLQkJCQlzYi5hcHBlbmQoZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWxsU3BhY2VzKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbE9jY3VycmVuY2VzKHN0cmluZywgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXNPbihXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBzdHJpbmcgYnVmZmVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXNPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkCi0JICogc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsU3BhY2VzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxTcGFjZXMoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoc3RyaW5nLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcwotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdyaXRlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsU3BhY2VzT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsU3BhY2VzT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbFdoaXRlc3BhY2UoU3RyaW5nIHN0cmluZykgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogbmV3IFN0cmluZyhyZW1vdmVBbGxXaGl0ZXNwYWNlXyhzdHJpbmcyLCBmaXJzdCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXJbXSBzdHJpbmcyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcyKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nMiwgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2VPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxXaGl0ZXNwYWNlKGNoYXJbXSBzdHJpbmcpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogcmVtb3ZlQWxsV2hpdGVzcGFjZV8oc3RyaW5nLCBmaXJzdCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2ZXaGl0ZXNwYWNlXyhjaGFyW10gc3RyaW5nKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHJpbmdbaV0pKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxXaGl0ZXNwYWNlXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cmluZy5sZW5ndGgpOwotCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2VPbihXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgZmlyc3QsIHdyaXRlcik7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKCAhIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQl3cml0ZUNoYXJPbihjLCB3cml0ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZywgMCwgZmlyc3QpOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHN0cmluZ1tpXTsKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0JCQkJc2IuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb21tb24gcHJlZml4ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IHNoYXJlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmluZ3MuCi0JICogU3RyaW5nI2NvbW1vblByZWZpeExlbmd0aChTdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCXJldHVybiBjb21tb25QcmVmaXhMZW5ndGgoczEudG9DaGFyQXJyYXkoKSwgczIudG9DaGFyQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoY2hhcltdIHMxLCBjaGFyW10gczIpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aF8oczEsIHMyLCBNYXRoLm1pbihzMS5sZW5ndGgsIHMyLmxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IHNoYXJlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmluZ3M7Ci0JICogYnV0IGxpbWl0IHRoZSBsZW5ndGggdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtLgotCSAqIFN0cmluZyNjb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZyBzMSwgU3RyaW5nIHMyLCBpbnQgbWF4KSB7Ci0JCXJldHVybiBjb21tb25QcmVmaXhMZW5ndGgoczEudG9DaGFyQXJyYXkoKSwgczIudG9DaGFyQXJyYXkoKSwgbWF4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzOwotCSAqIGJ1dCBsaW1pdCB0aGUgbGVuZ3RoIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoY2hhcltdIHMxLCBjaGFyW10gczIsIGludCBtYXgpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aF8oczEsIHMyLCBNYXRoLm1pbihtYXgsIE1hdGgubWluKHMxLmxlbmd0aCwgczIubGVuZ3RoKSkpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5nczsKLQkgKiBidXQgbGltaXQgdGhlIGxlbmd0aCB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0uIEFzc3VtZSB0aGUgc3BlY2lmaWVkCi0JICogbWF4aW11bSBpcyBsZXNzIHRoYW4gdGhlIGxlbmd0aHMgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGhfKGNoYXJbXSBzMSwgY2hhcltdIHMyLCBpbnQgbWF4KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCWlmIChzMVtpXSAhPSBzMltpXSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7CS8vIGFsbCB0aGUgY2hhcmFjdGVycyB1cCB0byAnbWF4JyBhcmUgdGhlIHNhbWUKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2FwaXRhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciBsb3dlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGNhcGl0YWxpemVfKGNoYXJbXSBzdHJpbmcpIHsKLQkJc3RyaW5nWzBdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0cmluZ1swXSk7Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aAotCSAqIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY2FwaXRhbGl6ZShjaGFyW10gc3RyaW5nKSB7Ci0JCWlmICgoc3RyaW5nLmxlbmd0aCA9PSAwKSB8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gY2FwaXRhbGl6ZV8oc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIFN0cmluZyNjYXBpdGFsaXplKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBpdGFsaXplKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNhcGl0YWxpemVfKHN0cmluZy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciB1cHBlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0cmluZ1swXSkpOwotCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIFN0cmluZyNjYXBpdGFsaXplT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY2FwaXRhbGl6ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciB1cHBlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJpbmdbMF0pKTsKLQkJc2IuYXBwZW5kKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKiBTdHJpbmcjY2FwaXRhbGl6ZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIHVwcGVyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbl8oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyaW5nWzBdKSwgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDEsIHN0cmluZy5sZW5ndGggLSAxLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1swXSkpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIFN0cmluZyNjYXBpdGFsaXplT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIGxvd2VyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdW5jYXBpdGFsaXplXyhjaGFyW10gc3RyaW5nKSB7Ci0JCXN0cmluZ1swXSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pOwotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oY2hhcltdIHN0cmluZykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHN0cmluZ1swXSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGlmIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2hhcmFjdGVycyBhcmUgY2FwaXRhbGl6ZWQsCi0JCS8vIHJldHVybiB0aGUgc3RyaW5nIHVuY2hhbmdlZAotCQlpZiAoKHN0cmluZy5sZW5ndGggPiAxKQotCQkJCSYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMV0pCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1swXSkpewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggaXRzCi0JICogZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHVuY2FwaXRhbGl6ZShjaGFyW10gc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiB1bmNhcGl0YWxpemVfKHN0cmluZyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gaWYgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBjaGFyYWN0ZXJzIGFyZSBjYXBpdGFsaXplZCwKLQkJLy8gcmV0dXJuIHRoZSBzdHJpbmcgdW5jaGFuZ2VkCi0JCWlmICgoc3RyaW5nLmxlbmd0aCgpID4gMSkKLQkJCQkmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgxKSkKLQkJCQkmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICogU3RyaW5nI3VuY2FwaXRhbGl6ZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5jYXBpdGFsaXplKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcodW5jYXBpdGFsaXplXyhzdHJpbmcudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgbG93ZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0cmluZ1swXSkpOwotCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICogU3RyaW5nI3VuY2FwaXRhbGl6ZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciBsb3dlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0cmluZ1swXSkpOwotCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICogU3RyaW5nI3VuY2FwaXRhbGl6ZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgdXBwZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVDaGFyT24oQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0cmluZ1swXSksIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqIFN0cmluZyN1bmNhcGl0YWxpemVPbihXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqICN0b1N0cmluZygpIGhlbHBlciBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGEgInN0YW5kYXJkIiAjdG9TdHJpbmcoKSByZXN1bHQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogYW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246Ci0JICogCUNsYXNzTmFtZVswMEYzRUU0Ml0gKGFkZCdsIGluZm8pCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRUb1N0cmluZ0ZvcihPYmplY3QgbywgT2JqZWN0IGFkZGl0aW9uYWxJbmZvKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlidWlsZFNpbXBsZVRvU3RyaW5nT24obywgc2IpOwotCQlzYi5hcHBlbmQoIiAoIik7ICAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChhZGRpdGlvbmFsSW5mbyk7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhICJzdGFuZGFyZCIgc2ltcGxlICN0b1N0cmluZygpIHJlc3VsdCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3Q6Ci0JICogCUNsYXNzTmFtZVswMEYzRUU0Ml0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFRvU3RyaW5nRm9yKE9iamVjdCBvKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlidWlsZFNpbXBsZVRvU3RyaW5nT24obywgc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgYSAic3RhbmRhcmQiIHNpbXBsZSAjdG9TdHJpbmcoKSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXI6Ci0JICogCUNsYXNzTmFtZVswMEYzRUU0Ml0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYnVpbGRTaW1wbGVUb1N0cmluZ09uKE9iamVjdCBvLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENsYXNzVG9vbHMudG9TdHJpbmdDbGFzc05hbWVGb3JPYmplY3QobykpOwotCQlzYi5hcHBlbmQoJ1snKTsKLQkJLy8gdXNlIFN5c3RlbSNpZGVudGl0eUhhc2hDb2RlKE9iamVjdCksIHNpbmNlIE9iamVjdCNoYXNoQ29kZSgpIG1heSBiZSBvdmVycmlkZGVuCi0JCXNiLmFwcGVuZCh6ZXJvUGFkKEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobykpLnRvVXBwZXJDYXNlKCksIDgpKTsKLQkJc2IuYXBwZW5kKCddJyk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGEgInN0YW5kYXJkIiBzaW1wbGUgI3RvU3RyaW5nKCkgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvCi0JICogdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcjoKLQkgKiAJQ2xhc3NOYW1lWzAwRjNFRTQyXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBidWlsZFNpbXBsZVRvU3RyaW5nT24oT2JqZWN0IG8sIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENsYXNzVG9vbHMudG9TdHJpbmdDbGFzc05hbWVGb3JPYmplY3QobykpOwotCQlzYi5hcHBlbmQoJ1snKTsKLQkJLy8gdXNlIFN5c3RlbSNpZGVudGl0eUhhc2hDb2RlKE9iamVjdCksIHNpbmNlIE9iamVjdCNoYXNoQ29kZSgpIG1heSBiZSBvdmVycmlkZGVuCi0JCXNiLmFwcGVuZCh6ZXJvUGFkKEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobykpLnRvVXBwZXJDYXNlKCksIDgpKTsKLQkJc2IuYXBwZW5kKCddJyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbnVsbCwgZW1wdHksIG9yIGNvbnRhaW5zCi0JICogb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHkoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0lzRW1wdHlfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG51bGwsIGVtcHR5LCBvciBjb250YWlucwotCSAqIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0VtcHR5KGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNFbXB0eV8oc3RyaW5nLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eV8oY2hhcltdIHMsIGludCBsZW4pIHsKLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBub24tbnVsbCwgbm9uLWVtcHR5LCBhbmQgZG9lcwotCSAqIG5vdCBjb250YWluIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc05vdEVtcHR5KFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuICEgc3RyaW5nSXNFbXB0eShzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG5vbi1udWxsLCBub24tZW1wdHksIGFuZCBkb2VzCi0JICogbm90IGNvbnRhaW4gb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzTm90RW1wdHkoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gISBzdHJpbmdJc0VtcHR5KHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmdzIGFyZSBlcXVhbCwgaWdub3JpbmcgY2FzZS4KLQkgKiBDaGVjayBmb3IgbnVsbHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJaWYgKChzMSA9PSBudWxsKSAmJiAoczIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiB0cnVlOyAgLy8gYm90aCBhcmUgbnVsbAotCQl9Ci0JCWlmICgoczEgPT0gbnVsbCkgfHwgKHMyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBvbmUgaXMgbnVsbCBidXQgdGhlIG90aGVyIGlzIG5vdAotCQl9Ci0JCXJldHVybiBzMS5lcXVhbHNJZ25vcmVDYXNlKHMyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmdzIGFyZSBlcXVhbCwgaWdub3JpbmcgY2FzZS4KLQkgKiBDaGVjayBmb3IgbnVsbHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoY2hhcltdIHMxLCBjaGFyW10gczIpIHsKLQkJaWYgKChzMSA9PSBudWxsKSAmJiAoczIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiB0cnVlOyAgLy8gYm90aCBhcmUgbnVsbAotCQl9Ci0JCWlmICgoczEgPT0gbnVsbCkgfHwgKHMyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBvbmUgaXMgbnVsbCBidXQgdGhlIG90aGVyIGlzIG5vdAotCQl9Ci0JCWludCBsZW4gPSBzMS5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gczIubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZShzMVtpXSwgczJbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LAotCSAqIGlnbm9yaW5nIGNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSBwcmVmaXgpIHsKLQkJaW50IHByZWZpeExlbmd0aCA9IHByZWZpeC5sZW5ndGg7Ci0JCWlmIChzdHJpbmcubGVuZ3RoIDwgcHJlZml4TGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IHByZWZpeExlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZShzdHJpbmdbaV0sIHByZWZpeFtpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LAotCSAqIGlnbm9yaW5nIGNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIHN0cmluZy5yZWdpb25NYXRjaGVzKHRydWUsIDAsIHByZWZpeCwgMCwgcHJlZml4Lmxlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcnMgYXJlIGFyZSBlcXVhbCwgaWdub3JpbmcgY2FzZS4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcjcmVnaW9uTWF0Y2hlcyhib29sZWFuLCBpbnQsIFN0cmluZywgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoY2hhciBjMSwgY2hhciBjMikgewotCQkvLyAgc29tZXRoaW5nIGFib3V0IHRoZSBHZW9yZ2lhbiBhbHBoYWJldCByZXF1aXJlcyB1cyB0byBjaGVjayBsb3dlciBjYXNlIGFsc28KLQkJcmV0dXJuIChjMSA9PSBjMikKLQkJCQl8fCAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMxKSA9PSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzIpKQotCQkJCXx8IChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzEpID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHVwcGVyY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNVcHBlcmNhc2UoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gKHN0cmluZy5sZW5ndGgoKSA9PSAwKSA/IGZhbHNlIDogc3RyaW5nSXNVcHBlcmNhc2VfKHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgdXBwZXJjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc1VwcGVyY2FzZShjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiAoc3RyaW5nLmxlbmd0aCA9PSAwKSA/IGZhbHNlIDogc3RyaW5nSXNVcHBlcmNhc2VfKG5ldyBTdHJpbmcoc3RyaW5nKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc1VwcGVyY2FzZV8oU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nLmVxdWFscyhzdHJpbmcudG9VcHBlckNhc2UoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbG93ZXJjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xvd2VyY2FzZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiAoc3RyaW5nLmxlbmd0aCgpID09IDApID8gZmFsc2UgOiBzdHJpbmdJc0xvd2VyY2FzZV8oc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBsb3dlcmNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzTG93ZXJjYXNlKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIChzdHJpbmcubGVuZ3RoID09IDApID8gZmFsc2UgOiBzdHJpbmdJc0xvd2VyY2FzZV8obmV3IFN0cmluZyhzdHJpbmcpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzTG93ZXJjYXNlXyhTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcuZXF1YWxzKHN0cmluZy50b0xvd2VyQ2FzZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydCBjYW1lbCBjYXNlIHRvIGFsbCBjYXBzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoU3RyaW5nIGNhbWVsQ2FzZVN0cmluZykgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBjYW1lbENhc2VTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbikpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoY2hhcltdIGNhbWVsQ2FzZVN0cmluZykgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gY2FtZWxDYXNlU3RyaW5nOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjYW1lbENhc2VTdHJpbmcsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBsZW4pIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbiAqIDIpOwotCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbGVuLCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IGxlbiwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXNiLmFwcGVuZCgnXycpOwotCQkJfQotCQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSk7Ci0JCQlwcmV2ID0gYzsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbGVuLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXNiLmFwcGVuZCgnXycpOwotCQkJfQotCQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSk7Ci0JCQlwcmV2ID0gYzsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJd3JpdGVDaGFyT24oJ18nLCB3cml0ZXIpOwotCQkJfQotCQkJd3JpdGVDaGFyT24oQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpLCB3cml0ZXIpOwotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCkgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobWF4TGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gY2FtZWxDYXNlU3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBtYXhMZW5ndGgsIGxlbikpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobWF4TGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gY2FtZWxDYXNlU3RyaW5nOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjYW1lbENhc2VTdHJpbmcsIG1heExlbmd0aCwgbGVuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgaW50IGxlbikgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobWF4TGVuZ3RoKTsKLQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIG1heExlbmd0aCwgbGVuLCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmICgobGVuICE9IDApICYmIChtYXhMZW5ndGggIT0gMCkpIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIGludCBsZW4sIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVha18ocHJldiwgYywgbmV4dCkpIHsKLQkJCQlzYi5hcHBlbmQoJ18nKTsKLQkJCQlpZiAoc2IubGVuZ3RoKCkgPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLQkJCWlmIChzYi5sZW5ndGgoKSA9PSBtYXhMZW5ndGgpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlwcmV2ID0gYzsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmICgobGVuICE9IDApICYmIChtYXhMZW5ndGggIT0gMCkpIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIG1heExlbmd0aCwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIG1heExlbmd0aCwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgaW50IGxlbiwgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVha18ocHJldiwgYywgbmV4dCkpIHsKLQkJCQlzYi5hcHBlbmQoJ18nKTsKLQkJCQlpZiAoc2IubGVuZ3RoKCkgPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLQkJCWlmIChzYi5sZW5ndGgoKSA9PSBtYXhMZW5ndGgpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlwcmV2ID0gYzsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmICgobGVuICE9IDApICYmIChtYXhMZW5ndGggIT0gMCkpIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIG1heExlbmd0aCwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmICgobGVuICE9IDApICYmIChtYXhMZW5ndGggIT0gMCkpIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBtYXhMZW5ndGgsIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBpbnQgbGVuLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlpbnQgd3JpdGVyTGVuZ3RoID0gMDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVha18ocHJldiwgYywgbmV4dCkpIHsKLQkJCQl3cml0ZUNoYXJPbignXycsIHdyaXRlcik7Ci0JCQkJaWYgKCsrd3JpdGVyTGVuZ3RoID09IG1heExlbmd0aCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJd3JpdGVDaGFyT24oQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpLCB3cml0ZXIpOwotCQkJaWYgKCsrd3JpdGVyTGVuZ3RoID09IG1heExlbmd0aCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHNlcmllcyBvZiBjaGFyYWN0ZXJzIG9jY3VyIGF0Ci0JICogYSAiY2FtZWwgY2FzZSIgd29yayBicmVhazoKLQkgKiAgICAgIiphYSIgLT4gZmFsc2UKLQkgKiAgICAgIipBQSIgLT4gZmFsc2UKLQkgKiAgICAgIipBYSIgLT4gZmFsc2UKLQkgKiAgICAgIkFhQSIgLT4gZmFsc2UKLQkgKiAgICAgIkFBQSIgLT4gZmFsc2UKLQkgKiAgICAgImFhKiIgLT4gZmFsc2UKLQkgKiAgICAgIkFhQSIgLT4gZmFsc2UKLQkgKiAgICAgImFBYSIgLT4gdHJ1ZQotCSAqICAgICAiQUEqIiAtPiBmYWxzZQotCSAqICAgICAiQUFhIiAtPiB0cnVlCi0JICogd2hlcmUgJyonID09IGFueSBjaGFyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW1lbENhc2VXb3JkQnJlYWtfKGNoYXIgcHJldiwgY2hhciBjLCBjaGFyIG5leHQpIHsKLQkJaWYgKHByZXYgPT0gMCkgewkvLyBzdGFydCBvZiBzdHJpbmcKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShwcmV2KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG5leHQgPT0gMCkgewkvLyBlbmQgb2Ygc3RyaW5nCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShuZXh0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydCB1bmRlcnNjb3JlcyB0byBjYW1lbCBjYXNlICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gIkxhcmdlUHJvamVjdCIKLQkgKiBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcpIHsKLQkJcmV0dXJuIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKHVuZGVyc2NvcmVTdHJpbmcsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gIkxhcmdlUHJvamVjdCIKLQkgKiBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcpIHsKLQkJcmV0dXJuIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKHVuZGVyc2NvcmVTdHJpbmcsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZShTdHJpbmcgdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHVuZGVyc2NvcmVTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VfKHVuZGVyc2NvcmVTdHJpbmcudG9DaGFyQXJyYXkoKSwgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdW5kZXJzY29yZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VfKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VfKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbikgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuKTsKLQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcudG9DaGFyQXJyYXkoKSwgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8oY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBpbnQgbGVuLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsKLQkJY2hhciBjID0gMDsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXByZXYgPSBjOwotCQkJYyA9IHVuZGVyc2NvcmVTdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSAnXycpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJaWYgKGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQkJCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwcmV2ID09ICdfJykgewotCQkJCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcudG9DaGFyQXJyYXkoKSwgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbiwgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyIHByZXYgPSAwOwotCQljaGFyIGMgPSAwOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJcHJldiA9IGM7Ci0JCQljID0gdW5kZXJzY29yZVN0cmluZ1tpXTsKLQkJCWlmIChjID09ICdfJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlpZiAoY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHByZXYgPT0gJ18nKSB7Ci0JCQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihTdHJpbmcgdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZy50b0NoYXJBcnJheSgpLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyhjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhciBwcmV2ID0gMDsKLQkJY2hhciBjID0gMDsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXByZXYgPSBjOwotCQkJYyA9IHVuZGVyc2NvcmVTdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSAnXycpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJaWYgKGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQkJCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9VcHBlckNhc2UoYyksIHdyaXRlcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJd3JpdGVDaGFyT24oQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpLCB3cml0ZXIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHByZXYgPT0gJ18nKSB7Ci0JCQkJCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSwgd3JpdGVyKTsKLQkJCQl9IGVsc2UgewotCQkJCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYyksIHdyaXRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnQgdG8gSmF2YSBzdHJpbmcgbGl0ZXJhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMID0gIlwiXCIiOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUxfQ0hBUl9BUlJBWSA9IEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwudG9DaGFyQXJyYXkoKTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKFN0cmluZyBzdHJpbmcpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTDsKLQkJfQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuICsgNSk7Ci0JCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYiwgbGVuKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoY2hhcltdIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTF9DSEFSX0FSUkFZOwotCQl9Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4gKyA1KTsKLQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLCBzYiwgbGVuKTsKLQkJbGVuID0gc2IubGVuZ3RoKCk7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5dOwotCQlzYi5nZXRDaGFycygwLCBsZW4sIHJlc3VsdCwgMCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJc2IuYXBwZW5kKEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwpOwotCQl9IGVsc2UgewotCQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiLCBsZW4pOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXNiLmFwcGVuZChFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZywgc2IsIGxlbik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIGxlbmd0aCBjaGVja3MKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYiwgaW50IGxlbikgewotCQlzYi5lbnN1cmVDYXBhY2l0eShzYi5sZW5ndGgoKSArIGxlbiArIDUpOwotCQlzYi5hcHBlbmQoUVVPVEUpOwotCQlmb3IgKGNoYXIgYyA6IHN0cmluZykgewotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnXGInOiAgLy8gYmFja3NwYWNlCi0JCQkJCXNiLmFwcGVuZCgiXFxiIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1x0JzogIC8vIGhvcml6b250YWwgdGFiCi0JCQkJCXNiLmFwcGVuZCgiXFx0Iik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xuJzogIC8vIGxpbmUtZmVlZCBMRgotCQkJCQlzYi5hcHBlbmQoIlxcbiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcZic6ICAvLyBmb3JtLWZlZWQgRkYKLQkJCQkJc2IuYXBwZW5kKCJcXGYiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXHInOiAgLy8gY2FycmlhZ2UtcmV0dXJuIENSCi0JCQkJCXNiLmFwcGVuZCgiXFxyIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInOiAgLy8gZG91YmxlLXF1b3RlCi0JCQkJCXNiLmFwcGVuZCgiXFxcIiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLS8vCQkJCWNhc2UgJ1wnJzogIC8vIHNpbmdsZS1xdW90ZQotLy8JCQkJCXNiLmFwcGVuZCgiXFwnIik7ICAvLyROT04tTkxTLTEkCi0vLwkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXFwnOiAgLy8gYmFja3NsYXNoCi0JCQkJCXNiLmFwcGVuZCgiXFxcXCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXNiLmFwcGVuZChRVU9URSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXNiLmFwcGVuZChFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYiwgbGVuKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJc2IuYXBwZW5kKEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwpOwotCQl9IGVsc2UgewotCQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLCBzYiwgbGVuKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gbGVuZ3RoIGNoZWNrcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYiwgaW50IGxlbikgewotCQlzYi5lbnN1cmVDYXBhY2l0eShzYi5sZW5ndGgoKSArIGxlbiArIDUpOwotCQlzYi5hcHBlbmQoUVVPVEUpOwotCQlmb3IgKGNoYXIgYyA6IHN0cmluZykgewotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnXGInOiAgLy8gYmFja3NwYWNlCi0JCQkJCXNiLmFwcGVuZCgiXFxiIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1x0JzogIC8vIGhvcml6b250YWwgdGFiCi0JCQkJCXNiLmFwcGVuZCgiXFx0Iik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xuJzogIC8vIGxpbmUtZmVlZCBMRgotCQkJCQlzYi5hcHBlbmQoIlxcbiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcZic6ICAvLyBmb3JtLWZlZWQgRkYKLQkJCQkJc2IuYXBwZW5kKCJcXGYiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXHInOiAgLy8gY2FycmlhZ2UtcmV0dXJuIENSCi0JCQkJCXNiLmFwcGVuZCgiXFxyIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInOiAgLy8gZG91YmxlLXF1b3RlCi0JCQkJCXNiLmFwcGVuZCgiXFxcIiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLS8vCQkJCWNhc2UgJ1wnJzogIC8vIHNpbmdsZS1xdW90ZQotLy8JCQkJCXNiLmFwcGVuZCgiXFwnIik7ICAvLyROT04tTkxTLTEkCi0vLwkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXFwnOiAgLy8gYmFja3NsYXNoCi0JCQkJCXNiLmFwcGVuZCgiXFxcXCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXNiLmFwcGVuZChRVU9URSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXdyaXRlU3RyaW5nT24oRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQl3cml0ZVN0cmluZ09uKEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIGxlbmd0aCBjaGVja3MKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVDaGFyT24oUVVPVEUsIHdyaXRlcik7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICdcYic6ICAvLyBiYWNrc3BhY2UKLQkJCQkJd3JpdGVTdHJpbmdPbigiXFxiIiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXHQnOiAgLy8gaG9yaXpvbnRhbCB0YWIKLQkJCQkJd3JpdGVTdHJpbmdPbigiXFx0Iiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXG4nOiAgLy8gbGluZS1mZWVkIExGCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcbiIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xmJzogIC8vIGZvcm0tZmVlZCBGRgotCQkJCQl3cml0ZVN0cmluZ09uKCJcXGYiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdccic6ICAvLyBjYXJyaWFnZS1yZXR1cm4gQ1IKLQkJCQkJd3JpdGVTdHJpbmdPbigiXFxyIiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIic6ICAvLyBkb3VibGUtcXVvdGUKLQkJCQkJd3JpdGVTdHJpbmdPbigiXFxcIiIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotLy8JCQkJY2FzZSAnXCcnOiAgLy8gc2luZ2xlLXF1b3RlCi0vLwkJCQkJd3JpdGVTdHJpbmdPbigiXFwnIiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQlicmVhazsKLQkJCQljYXNlICdcXCc6ICAvLyBiYWNrc2xhc2gKLQkJCQkJd3JpdGVTdHJpbmdPbigiXFxcXCIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXdyaXRlQ2hhck9uKGMsIHdyaXRlcik7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXdyaXRlQ2hhck9uKFFVT1RFLCB3cml0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VG9DaGFyQXJyYXkoU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBzYi5sZW5ndGgoKTsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl07Ci0JCXNiLmdldENoYXJzKDAsIGxlbiwgcmVzdWx0LCAwKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VG9DaGFyQXJyYXkoU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gc2IubGVuZ3RoKCk7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5dOwotCQlzYi5nZXRDaGFycygwLCBsZW4sIHJlc3VsdCwgMCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZ09uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZShzdHJpbmcpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZ09uKGNoYXJbXSBzdHJpbmcsIGludCBvZmYsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZShzdHJpbmcsIG9mZiwgbGVuKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHJpbmdPbihTdHJpbmcgc3RyaW5nLCBpbnQgb2ZmLCBpbnQgbGVuLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoc3RyaW5nLCBvZmYsIGxlbik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKHN0cmluZyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQ2hhck9uKGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKGMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1Rvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCb29sZWFuLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDc0YTY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCb29sZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN5bmNocm9uaXplZCBhY2Nlc3MgdG8gYSBib29sZWFuIHZhbHVlLgotICogSXQgYWxzbyBwcm92aWRlcyBwcm90b2NvbCBmb3Igc3VzcGVuZGluZyBhIHRocmVhZCB1bnRpbCB0aGUKLSAqIGJvb2xlYW4gdmFsdWUgaXMgc2V0IHRvIHRydWUgb3IgZmFsc2UsIHdpdGggb3B0aW9uYWwgdGltZS1vdXRzLgotICogQHNlZSBCb29sZWFuSG9sZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRCb29sZWFuCi0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIGJvb2xlYW4uICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbHVlOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgYm9vbGVhbiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZQotCSAqIGFuZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhbihib29sZWFuIHZhbHVlLCBPYmplY3QgbXV0ZXgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm11dGV4ID0gbXV0ZXg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIGJvb2xlYW4gd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW4oYm9vbGVhbiB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBib29sZWFuIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiBmYWxzZQotCSAqIGFuZCBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW4oT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMoZmFsc2UsIG11dGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgYm9vbGVhbiB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgZmFsc2UuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW4oKSB7Ci0JCXRoaXMoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IGJvb2xlYW4gdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCBib29sZWFuIHZhbHVlIGlzIHRydWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcnVlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgYm9vbGVhbiB2YWx1ZSBpcyBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhbHNlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiAhIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCBib29sZWFuIHZhbHVlIGlzIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXMoYm9vbGVhbiB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gdjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYm9vbGVhbiB2YWx1ZS4gSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nCi0JICogdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWlmICh0aGlzLnZhbHVlICE9IHZhbHVlKSB7Ci0JCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGJvb2xlYW4gdmFsdWUgdG8gdHJ1ZS4gSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nCi0JICogdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJ1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLnNldFZhbHVlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBib29sZWFuIHZhbHVlIHRvIGZhbHNlLiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcKLQkgKiB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGYWxzZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLnNldFZhbHVlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoaXMgb2JqZWN0IGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IG11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZWZpbml0ZSB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIGJvb2xlYW4gdmFsdWUgaXMgYWxyZWFkeSB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzKGJvb2xlYW4gdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl3aGlsZSAodGhpcy52YWx1ZSAhPSB2KSB7Ci0JCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzIHRvIHRydWUuCi0JICogSWYgdGhlIGJvb2xlYW4gdmFsdWUgaXMgYWxyZWFkeSB0cnVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsVHJ1ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIGJvb2xlYW4gdmFsdWUgY2hhbmdlcyB0byBmYWxzZS4KLQkgKiBJZiB0aGUgYm9vbGVhbiB2YWx1ZSBpcyBhbHJlYWR5IGZhbHNlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRmFsc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJcyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogTk9UIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSBib29sZWFuIHZhbHVlIGlzIGFscmVhZHkKLQkgKiBOT1QgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlCi0JICogaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvU2V0VmFsdWUoYm9vbGVhbiB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJcyggISB2KTsKLQkJCXRoaXMuc2V0VmFsdWUodik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzIHRvIGZhbHNlLAotCSAqIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gdHJ1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgYm9vbGVhbgotCSAqIHZhbHVlIGlzIGFscmVhZHkgZmFsc2UsIHNldCB0aGUgdmFsdWUgdG8gdHJ1ZSBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9TZXRUcnVlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRUb1NldFZhbHVlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIGJvb2xlYW4gdmFsdWUgY2hhbmdlcyB0byB0cnVlLAotCSAqIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gZmFsc2UgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIGJvb2xlYW4KLQkgKiB2YWx1ZSBpcyBhbHJlYWR5IHRydWUsIHNldCB0aGUgdmFsdWUgdG8gZmFsc2UgaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvU2V0RmFsc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFRvU2V0VmFsdWUoZmFsc2UpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRpbWVkIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBib29sZWFuIHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gZmFsc2UgaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgYm9vbGVhbiB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiB0cnVlCi0JICogaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsVmFsdWVJcyhib29sZWFuIHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJCXRoaXMud2FpdFVudGlsVmFsdWVJcyh2KTsJLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCQlyZXR1cm4gdHJ1ZTsJLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJCX0KLQkKLQkJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJCXdoaWxlICgodGhpcy52YWx1ZSAhPSB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJcmV0dXJuICh0aGlzLnZhbHVlID09IHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIGJvb2xlYW4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRydWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiBmYWxzZSBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBib29sZWFuIHZhbHVlIGlzIGFscmVhZHkgdHJ1ZSwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsVHJ1ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJcyh0cnVlLCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBib29sZWFuIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBmYWxzZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIGJvb2xlYW4gdmFsdWUgaXMgYWxyZWFkeSB0cnVlLCByZXR1cm4gdHJ1ZSBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxGYWxzZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJcyhmYWxzZSwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzIHRvIE5PVCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgY29udGludWUKLQkgKiBleGVjdXRpbmcuIElmIHRoZSBib29sZWFuIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byBmYWxzZSBiZWZvcmUgdGhlCi0JICogdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMKLQkgKiBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZTsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIGJvb2xlYW4gdmFsdWUgaXMgYWxyZWFkeSBOT1QgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0IHRoZSB2YWx1ZQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW1tZWRpYXRlbHkgYW5kIHJldHVybiB0cnVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldFZhbHVlKGJvb2xlYW4gdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsVmFsdWVJcyggISB2LCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5zZXRWYWx1ZSh2KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIGJvb2xlYW4gdmFsdWUgY2hhbmdlcyB0byBmYWxzZSwKLQkgKiB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIHRydWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIGJvb2xlYW4KLQkgKiB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gZmFsc2UgYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlCi0JICogZXhlY3V0aW5nIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZhbHVlLiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluCi0JICogbWlsbGlzZWNvbmRzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byB0cnVlOyByZXR1cm4gZmFsc2UKLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgYm9vbGVhbiB2YWx1ZSBpcyBhbHJlYWR5IGZhbHNlLCBzZXQgdGhlCi0JICogdmFsdWUgdG8gdHJ1ZSBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIHRydWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0VHJ1ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUodHJ1ZSwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzIHRvIHRydWUsCi0JICogdGhlbiBjaGFuZ2UgaXQgYmFjayB0byBmYWxzZSBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgYm9vbGVhbgotCSAqIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byB0cnVlIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZQotCSAqIGV4ZWN1dGluZyB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4gVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbgotCSAqIG1pbGxpc2Vjb25kcy4gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gZmFsc2U7IHJldHVybiBmYWxzZQotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSBib29sZWFuIHZhbHVlIGlzIGFscmVhZHkgdHJ1ZSwgc2V0IHRoZQotCSAqIHZhbHVlIHRvIGZhbHNlIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRGYWxzZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUoZmFsc2UsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplZCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGludGVycnVwdGVkLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAKLQkgKiB3aXRoIHRoZSBtdXRleCBsb2NrZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBpbml0aWFsaXppbmcgdGhlIHZhbHVlIGluIGFub3RoZXIKLQkgKiB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCQlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBTeW5jaHJvbml6ZWRCb29sZWFuKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSgpID09ICgoU3luY2hyb25pemVkQm9vbGVhbikgbykudmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUoKSA/IDEgOiAwOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZih0aGlzLnZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmIwOWMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3luY2hyb25pemVkIGFjY2VzcyB0byBhbiBvYmplY3Qgb2YgdHlwZSBULgotICogSXQgYWxzbyBwcm92aWRlcyBwcm90b2NvbCBmb3Igc3VzcGVuZGluZyBhIHRocmVhZCB1bnRpbCB0aGUKLSAqIHZhbHVlIGlzIHNldCB0byBudWxsIG9yIGEgbm9uLW51bGwgdmFsdWUsIHdpdGggb3B0aW9uYWwgdGltZS1vdXRzLgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkT2JqZWN0PFQ+Ci0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHZhbHVlLiAqLwotCXByaXZhdGUgVCB2YWx1ZTsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZQotCSAqIGFuZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0KFQgdmFsdWUsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRPYmplY3QoVCB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBvYmplY3Qgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIG51bGwuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgVCB2YWx1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIG51bGwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID09IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgbnVsbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vdE51bGwoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUuIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZwotCSAqIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlpZiAodGhpcy52YWx1ZSAhPSB2YWx1ZSkgewotCQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byBudWxsLiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcKLQkgKiB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROdWxsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMuc2V0VmFsdWUobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGlzIG9iamVjdCBsb2NrcyBvbiB3aGlsZSBwZXJmb3JtaW5nCi0JICogaXRzIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIE9iamVjdCBtdXRleCgpIHsKLQkJcmV0dXJuIHRoaXMubXV0ZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGVmaW5pdGUgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzKFQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl3aGlsZSAodGhpcy52YWx1ZSAhPSB2KSB7Ci0JCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZQotCSAqIHZhbHVlIGlzIGFscmVhZHkgTk9UIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzTm90KFQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl3aGlsZSAodGhpcy52YWx1ZSA9PSB2KSB7Ci0JCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBudWxsLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IG51bGwsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOdWxsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXMobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgTk9UIG51bGwsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOb3ROdWxsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3QobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlCi0JICogaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgTk9UIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHNldAotCSAqIHRoZSB2YWx1ZSBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9TZXRWYWx1ZShUIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90KHYpOwotCQkJdGhpcy5zZXRWYWx1ZSh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogc29tZXRoaW5nIG90aGVyIHRoYW4gbnVsbCwgdGhlbiBjaGFuZ2UgaXQgYmFjayB0byBudWxsCi0JICogYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgTk9UIG51bGwsCi0JICogc2V0IHRoZSB2YWx1ZSB0byBudWxsIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb1NldE51bGwoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTm90TnVsbCgpOwotCQkJdGhpcy5zZXRWYWx1ZShudWxsKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0aW1lZCB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiBmYWxzZSBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiB0cnVlIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXMoVCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCQl0aGlzLndhaXRVbnRpbFZhbHVlSXModik7CS8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCQl9Ci0KLQkJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJCXdoaWxlICgodGhpcy52YWx1ZSAhPSB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJcmV0dXJuICh0aGlzLnZhbHVlID09IHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUgd2FzIHJlbW92ZWQ7IHJldHVybiBmYWxzZSBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IE5PVCB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gdHJ1ZSBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxWYWx1ZUlzTm90KFQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90KHYpOwkvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJCXJldHVybiB0cnVlOwkvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQkJfQotCi0JCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCQl3aGlsZSAoKHRoaXMudmFsdWUgPT0gdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCXJldHVybiAodGhpcy52YWx1ZSAhPSB2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gbnVsbCBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbnVsbCwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTnVsbChsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJcyhudWxsLCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gbnVsbCBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgTk9UIG51bGwsIHJldHVybiB0cnVlIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdE51bGwobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3QobnVsbCwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlCi0JICogaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUKLQkgKiBzcGVjaWZpZWQgYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZwotCSAqIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzCi0JICogc2V0IHRvIHRydWU7IHJldHVybiBmYWxzZSBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHNldAotCSAqIHRoZSB2YWx1ZSBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIHRydWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0VmFsdWUoVCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90KHYsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnNldFZhbHVlKHYpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBzb21ldGhpbmcKLQkgKiBvdGhlciB0aGFuIG51bGwsIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gbnVsbCBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gbnVsbCBiZWZvcmUKLQkgKiB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMKLQkgKiBzZXQgdG8gZmFsc2U7IHJldHVybiBmYWxzZSBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwsIHNldAotCSAqIHRoZSB2YWx1ZSB0byBudWxsIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXROdWxsKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbE5vdE51bGwodGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0VmFsdWUobnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZWQgYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgY3VycmVudCB0aHJlYWQgaXMgbm90IGludGVycnVwdGVkLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAKLQkgKiB3aXRoIHRoZSBtdXRleCBsb2NrZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBpbml0aWFsaXppbmcgdGhlIHZhbHVlIGluIGFub3RoZXIKLQkgKiB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTeW5jaHJvbml6ZWRPYmplY3Q8VD4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3Q8VD4gY2xvbmUgPSAoU3luY2hyb25pemVkT2JqZWN0PFQ+KSBzdXBlci5jbG9uZSgpOwotCQkJCXJldHVybiBjbG9uZTsKLQkJCX0KLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoICEgKG9iaiBpbnN0YW5jZW9mIFN5bmNocm9uaXplZE9iamVjdCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlPYmplY3QgdjEgPSB0aGlzLnZhbHVlKCk7Ci0JCU9iamVjdCB2MiA9ICgoU3luY2hyb25pemVkT2JqZWN0PD8+KSBvYmopLnZhbHVlKCk7Ci0JCXJldHVybiAodjEgPT0gbnVsbCkgPwotCQkJKHYyID09IG51bGwpIDogdjEuZXF1YWxzKHYyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlPYmplY3QgdiA9IHRoaXMudmFsdWUoKTsKLQkJcmV0dXJuICh2ID09IG51bGwpID8gMCA6IHYuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFjay5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MzgyYmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiBUaHJlYWQtc2FmZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RhY2sgaW50ZXJmYWNlLgotICogVGhpcyBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogc3RhY2sgaXMgZW1wdHkgb3Igbm90IGVtcHR5LCB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFN0YWNrPEU+Ci0JaW1wbGVtZW50cyBTdGFjazxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgc3RhY2suICovCi0JcHJpdmF0ZSBTdGFjazxFPiBzdGFjazsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIHN0YWNrIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIHN0YWNrIGFuZCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFjayhTdGFjazxFPiBzdGFjaywgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhY2sgPSBzdGFjazsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBzdGFjayB0aGF0IHdyYXBzIHRoZQotCSAqIHNwZWNpZmllZCBzdGFjayBhbmQgbG9ja3Mgb24gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFjayhTdGFjazxFPiBzdGFjaykgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YWNrID0gc3RhY2s7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBzdGFjayB0aGF0IGxvY2tzIG9uIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFN0YWNrKE9iamVjdCBtdXRleCkgewotCQl0aGlzKG5ldyBTaW1wbGVTdGFjazxFPigpLCBtdXRleCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIHN0YWNrIHRoYXQgbG9ja3Mgb24gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFjaygpIHsKLQkJdGhpcyhuZXcgU2ltcGxlU3RhY2s8RT4oKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0YWNrIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHB1c2goRSBvKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5zdGFjay5wdXNoKG8pOwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFIHBvcCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlFIG8gPSB0aGlzLnN0YWNrLnBvcCgpOwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJCXJldHVybiBvOwotCQl9Ci0JfQotCi0JcHVibGljIEUgcGVlaygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zdGFjay5wZWVrKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnN0YWNrLmlzRW1wdHkoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRlZmluaXRlIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjaydzIGVtcHR5IHN0YXR1cyBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxFbXB0eUlzKGJvb2xlYW4gZW1wdHkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJd2hpbGUgKHRoaXMuaXNFbXB0eSgpICE9IGVtcHR5KSB7Ci0JCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRW1wdHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJcyh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBoYXMgc29tZXRoaW5nIG9uIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVtcHR5KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXMoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5LAotCSAqIHRoZW4gInB1c2giIHRoZSBzcGVjaWZpZWQgaXRlbSBvbiB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvUHVzaChFIG8pIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eSgpOwotCQkJdGhpcy5wdXNoKG8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGhhcyBzb21ldGhpbmcgb24gaXQsCi0JICogdGhlbiAicG9wIiBhbiBpdGVtIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHJldHVybiBpdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHdhaXRUb1BvcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxOb3RFbXB0eSgpOwotCQkJcmV0dXJuIHRoaXMucG9wKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGltZWQgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrJ3MgZW1wdHkgc3RhdHVzIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gZmFsc2UgaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxFbXB0eUlzKGJvb2xlYW4gZW1wdHksIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJCXRoaXMud2FpdFVudGlsRW1wdHlJcyhlbXB0eSk7CS8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCQl9Ci0KLQkJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJCXdoaWxlICgodGhpcy5pc0VtcHR5KCkgIT0gZW1wdHkpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gKHRoaXMuaXNFbXB0eSgpID09IGVtcHR5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gdHJ1ZSBpZgotCSAqIHRoZSBzdGFjayBpcyBlbXB0eTsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsRW1wdHkobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXModHJ1ZSwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaGFzIHNvbWV0aGluZyBvbiBpdC4KLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIHRydWUgaWYKLQkgKiB0aGUgc3RhY2sgaGFzIHNvbWV0aGluZyBvbiBpdDsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90RW1wdHkobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXMoZmFsc2UsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5LAotCSAqIHRoZW4gInB1c2giIHRoZSBzcGVjaWZpZWQgaXRlbSBvbiB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSBzdGFjayBpcyBub3QgZW1wdGllZCBvdXQKLQkgKiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQKLQkgKiAicHVzaGluZyIgdGhlIGl0ZW0uCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiB0cnVlIGlmIHRoZQotCSAqIGl0ZW0gd2FzIHB1c2hlZDsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvUHVzaChFIG8sIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbEVtcHR5KHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnB1c2gobyk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBoYXMgc29tZXRoaW5nIG9uIGl0LAotCSAqIHRoZW4gInBvcCIgYW4gaXRlbSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGFuZCByZXR1cm4gaXQuCi0JICogSWYgdGhlIHN0YWNrIGlzIGVtcHR5IGFuZCBub3RoaW5nIGlzICJwdXNoZWQiIG9uIHRvIGl0IGJlZm9yZSB0aGUKLQkgKiB0aW1lLW91dCwgdGhyb3cgYW4gZW1wdHkgc3RhY2sgZXhjZXB0aW9uLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLgotCSAqLwotCXB1YmxpYyBPYmplY3Qgd2FpdFRvUG9wKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbE5vdEVtcHR5KHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQlyZXR1cm4gdGhpcy5wb3AoKTsKLQkJCX0KLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemVkIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgaW50ZXJydXB0ZWQsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIAotCSAqIHdpdGggdGhlIG11dGV4IGxvY2tlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluaXRpYWxpemluZyB0aGUgc3RhY2sgaW4gYW5vdGhlcgotCSAqIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZGl0aW9uYWwgcHVibGljIHByb3RvY29sICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoaXMgb2JqZWN0IGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IG11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnN0YWNrLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9UcmFuc2Zvcm1lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZTRjYzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzLgotICogVHJhbnNmb3JtIGFuIG9iamVjdCBvZiB0eXBlIFQxIHRvIGFuIG9iamVjdCBvZiB0eXBlIFQyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyYW5zZm9ybWVyPFQxLCBUMj4gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCBvYmplY3QuCi0JICogVGhlIHNlbWFudGljcyBvZiAidHJhbnNmb3JtIiBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKi8KLQlUMiB0cmFuc2Zvcm0oVDEgbyk7Ci0KLQotCWZpbmFsIGNsYXNzIE51bGw8UzEsIFMyPiBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFMxLCBTMj4gewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSMSwgUjI+IFRyYW5zZm9ybWVyPFIxLCBSMj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCwgdW5jaGFuZ2VkCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXJldHVybiAoUzIpIG87Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRyYW5zZm9ybWVyLk51bGwiOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQ8UzEsIFMyPiBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFMxLCBTMj4gewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8UjEsIFIyPiBUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTMiB0cmFuc2Zvcm0oUzEgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRyYW5zZm9ybWVyLkRpc2FibGVkIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYzM1OWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotLyoqCi0gKiBUaGlzIGVuY29kZXIgd2lsbCByZXBsYWNlIGFueSBvZiBhIHNwZWNpZmllZCBzZXQgb2YgY2hhcmFjdGVycyB3aXRoIGFuIFhNTAotICogImNoYXJhY3RlciByZWZlcmVuY2UiOiAnLycgPT4gIiYjeDJmOyIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTFN0cmluZ0VuY29kZXIgewotCi0JLyoqIFRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSBjb252ZXJ0ZWQgaW50byBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuICovCi0JcHJpdmF0ZSBmaW5hbCBjaGFyW10gY2hhcnM7Ci0KLQkvKiogQ2FjaGUgdGhlIHZhbHVlIG9mIHRoZSBoaWdoZXN0IGNoYXJhY3RlciBpbiB0aGUgc2V0IGFib3ZlLiAqLwotCXByaXZhdGUgZmluYWwgY2hhciBtYXhDaGFyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW5jb2RlciB0aGF0IGNvbnZlcnRzIHRoZSBzcGVjaWZpZWQgc2V0IG9mIGNoYXJhY3RlcnMKLQkgKiBpbnRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgWE1MU3RyaW5nRW5jb2RlcihjaGFyW10gY2hhcnMpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNoYXJzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoZSBhbXBlcnNhbmQgbXVzdCBiZSBpbmNsdWRlZCBzaW5jZSBpdCBpcyB0aGUgZXNjYXBlIGNoYXJhY3RlcgotCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNoYXJzLCAnJicpKSB7Ci0JCQl0aGlzLmNoYXJzID0gY2hhcnM7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmNoYXJzID0gQ29sbGVjdGlvblRvb2xzLmFkZChjaGFycywgJyYnKTsKLQkJfQotCQl0aGlzLm1heENoYXIgPSB0aGlzLmNhbGN1bGF0ZU1heEludmFsaWRGaWxlTmFtZUNoYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIGNvbnZlcnRlZAotCSAqIGludG8gWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBzaG9ydC1jaXJjdWl0IHRoZQotCSAqIHNlYXJjaCBmb3IgYSBjaGFyYWN0ZXIgaW4gdGhlIHNldC4KLQkgKiBAc2VlICNjaGFySXNUb0JlRW5jb2RlZChjaGFyKQotCSAqLwotCXByaXZhdGUgY2hhciBjYWxjdWxhdGVNYXhJbnZhbGlkRmlsZU5hbWVDaGFyKCkgewotCQljaGFyW10gbG9jYWxDaGFycyA9IHRoaXMuY2hhcnM7Ci0JCWNoYXIgbWF4ID0gMDsKLQkJZm9yIChpbnQgaSA9IGxvY2FsQ2hhcnMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWNoYXIgYyA9IGxvY2FsQ2hhcnNbaV07Ci0JCQlpZiAobWF4IDwgYykgewotCQkJCW1heCA9IGM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGFueSBjaGFyYWN0ZXJzIGluIHRoZSBzZXQKLQkgKiByZXBsYWNlZCB3aXRoIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgewotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJLy8gYWxsb3cgZm9yIGEgZmV3IGVuY29kZWQgY2hhcmFjdGVycwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuICsgMjApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQl0aGlzLmFwcGVuZENoYXJhY3RlclRvKHMuY2hhckF0KGkpLCBzYik7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggYW55IFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcwotCSAqIHJlcGxhY2VkIGJ5IHRoZSBjaGFyYWN0ZXJzIHRoZW1zZWx2ZXMuCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHMubGVuZ3RoKCkpOwotCQlTdHJpbmdCdWlsZGVyIHRlbXAgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwkvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl0aGlzLmRlY29kZVRvKG5ldyBTdHJpbmdSZWFkZXIocyksIHNiLCB0ZW1wKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHRvIHRoZSBzdHJpbmcgYnVmZmVyLAotCSAqIGNvbnZlcnRpbmcgaXQgdG8gYW4gWE1MIGNoYXJhY3RlciByZWZlcmVuY2UgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRDaGFyYWN0ZXJUbyhjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHRoaXMuY2hhcklzVG9CZUVuY29kZWQoYykpIHsKLQkJCXRoaXMuYXBwZW5kQ2hhcmFjdGVyUmVmZXJlbmNlVG8oYywgc2IpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKGMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgb25lIG9mIHRoZSBjaGFyYWN0ZXJzCi0JICogdG8gYmUgY29udmVydGVkIHRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hhcklzVG9CZUVuY29kZWQoY2hhciBjKSB7Ci0JCXJldHVybiAoYyA8PSB0aGlzLm1heENoYXIpICYmIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNoYXJzLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIncyBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZSB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlciAoZS5nLiAnLycgPT4gIiYjeDJmOyIpLgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRDaGFyYWN0ZXJSZWZlcmVuY2VUbyhjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCImI3giKTsKLQkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoYywgMTYpKTsKLQkJc2IuYXBwZW5kKCc7Jyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY29kZVRvKFJlYWRlciByZWFkZXIsIFN0cmluZ0J1aWxkZXIgc2IsIFN0cmluZ0J1aWxkZXIgdGVtcCkgewotCQl0cnkgewotCQkJdGhpcy5kZWNvZGVUb18ocmVhZGVyLCBzYiwgdGVtcCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVjb2RlVG9fKFJlYWRlciByZWFkZXIsIFN0cmluZ0J1aWxkZXIgc2IsIFN0cmluZ0J1aWxkZXIgdGVtcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGMgPSByZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSAtMSkgewotCQkJaWYgKGMgPT0gJyYnKSB7Ci0JCQkJdGhpcy5kZWNvZGVDaGFyYWN0ZXJSZWZlcmVuY2VUbyhyZWFkZXIsIHNiLCB0ZW1wKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKSBjKTsKLQkJCX0KLQkJCWMgPSByZWFkZXIucmVhZCgpOwotCQl9Ci0JCXJlYWRlci5jbG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWNvZGVDaGFyYWN0ZXJSZWZlcmVuY2VUbyhSZWFkZXIgcmVhZGVyLCBTdHJpbmdCdWlsZGVyIHNiLCBTdHJpbmdCdWlsZGVyIHRlbXApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjID0gcmVhZGVyLnJlYWQoKTsKLQkJdGhpcy5jaGVja0NoYXIoYywgJyMnKTsKLQkJYyA9IHJlYWRlci5yZWFkKCk7Ci0JCXRoaXMuY2hlY2tDaGFyKGMsICd4Jyk7Ci0KLQkJdGVtcC5zZXRMZW5ndGgoMCk7ICAvLyByZS11c2UgdGVtcAotCQljID0gcmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gJzsnKSB7Ci0JCQl0aGlzLmNoZWNrRW5kT2ZTdHJlYW0oYyk7Ci0JCQl0ZW1wLmFwcGVuZCgoY2hhcikgYyk7Ci0JCQljID0gcmVhZGVyLnJlYWQoKTsKLQkJfQotCQlTdHJpbmcgY2hhclZhbHVlID0gdGVtcC50b1N0cmluZygpOwotCQlpZiAoY2hhclZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1pc3NpbmcgbnVtZXJpYyBzdHJpbmciKTsKLQkJfQotCQlzYi5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQoY2hhclZhbHVlLCAxNikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NoYXIoaW50IGMsIGludCBleHBlY3RlZCkgewotCQl0aGlzLmNoZWNrRW5kT2ZTdHJlYW0oYyk7Ci0JCWlmIChjICE9IGV4cGVjdGVkKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHBlY3RlZCAnIiArIChjaGFyKSBleHBlY3RlZCArICInLCBidXQgZW5jb3VudGVyZWQgJyIgKyAoY2hhcikgYyArICInIik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tFbmRPZlN0cmVhbShpbnQgYykgewotCQlpZiAoYyA9PSAtMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nIik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NzRhZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQW4gPGNvZGU+QXJyYXlJdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyBvZiB0eXBlIEUuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCWZpbmFsIEVbXSBhcnJheTsJLy8gcHJpdmF0ZS1wcm90ZWN0ZWQKLQlpbnQgbmV4dEluZGV4OwkJLy8gcHJpdmF0ZS1wcm90ZWN0ZWQKLQlwcml2YXRlIGZpbmFsIGludCBtYXhJbmRleDsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlJdGVyYXRvcihFLi4uIGFycmF5KSB7Ci0JCXRoaXMoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBBcnJheUl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPiBhcnJheS5sZW5ndGgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGFydDogIiArIHN0YXJ0KTsKLQkJfQotCQlpZiAoKGxlbmd0aCA8IDApIHx8IChsZW5ndGggPiBhcnJheS5sZW5ndGggLSBzdGFydCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxlbmd0aDogIiArIGxlbmd0aCk7Ci0JCX0KLQkJdGhpcy5hcnJheSA9IGFycmF5OwotCQl0aGlzLm5leHRJbmRleCA9IHN0YXJ0OwotCQl0aGlzLm1heEluZGV4ID0gc3RhcnQgKyBsZW5ndGg7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleCA8IHRoaXMubWF4SW5kZXg7Ci0JfQotCQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMuYXJyYXlbdGhpcy5uZXh0SW5kZXgrK107Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hcnJheSkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3MGVkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogQW4gPGNvZGU+QXJyYXlMaXN0SXRlcmF0b3I8L2NvZGU+IHByb3ZpZGVzIGEgPGNvZGU+TGlzdEl0ZXJhdG9yPC9jb2RlPgotICogZm9yIGFuIGFycmF5IG9mIG9iamVjdHMuCi0gKiAKLSAqIFRoZSBuYW1lIG1pZ2h0IGJlIGEgYml0IGNvbmZ1c2luZzoKLSAqIFRoaXMgaXMgYSA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+IGZvciBhbiA8Y29kZT5BcnJheTwvY29kZT47Ci0gKiA8ZW0+bm90PC9lbT4gYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+IGZvciBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlMaXN0SXRlcmF0b3I8RT4KLQlleHRlbmRzIEFycmF5SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgaW50IG1pbkluZGV4OwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3IoRS4uLiBhcnJheSkgewotCQl0aGlzKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQkJdGhpcy5taW5JbmRleCA9IHN0YXJ0OwotCX0KLQkKLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4OwotCX0KLQkKLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleCAtIDE7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXggPiB0aGlzLm1pbkluZGV4OwotCX0KLQkKLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJaWYgKHRoaXMuaGFzUHJldmlvdXMoKSkgewotCQkJcmV0dXJuIHRoaXMuYXJyYXlbLS10aGlzLm5leHRJbmRleF07Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1MDc2ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNoYWluSXRlcmF0b3I8L2NvZGU+IHByb3ZpZGVzIGEgcGx1Z2dhYmxlIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPgotICogdGhhdCBsb29wcyBvdmVyIGEgY2hhaW4gb2YgYXJiaXRyYXJpbHkgbGlua2VkIG9iamVjdHMuIFRoZSBjaGFpbgotICogc2hvdWxkIGJlIG51bGwtdGVybWluYXRlZCAoaS5lLiBhIGNhbGwgdG8gdGhlIDxjb2RlPm5leHRMaW5rKE9iamVjdCk8L2NvZGU+Ci0gKiBtZXRob2Qgc2hvdWxkIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIGl0IGlzIHBhc3NlZCB0aGUgbGFzdAotICogbGluayBvZiB0aGUgY2hhaW4pLgotICogVG8gdXNlLCBzdXBwbHkgYSBzdGFydGluZyBsaW5rIGFuZCBzdXBwbHkgYSA8Y29kZT5MaW5rZXI8L2NvZGU+IG9yIAotICogc3ViY2xhc3MgPGNvZGU+Q2hhaW5JdGVyYXRvcjwvY29kZT4gYW5kIG92ZXJyaWRlIHRoZQotICogPGNvZGU+bmV4dExpbmsoT2JqZWN0KTwvY29kZT4gbWV0aG9kLgotICogVGhlIHN0YXJ0aW5nIGxpbmsgd2lsbCBiZSB0aGUgZmlyc3Qgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvci4KLSAqIElmIHRoZSBzdGFydGluZyBsaW5rIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgaXRlcmF0b3Igd2lsbCBiZSBlbXB0eS4KLSAqIE5vdGUgdGhhdCB0aGUgaXRlcmF0b3IgZG9lcyBub3Qgc3VwcG9ydCA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50cy4KLSAqLwotcHVibGljIGNsYXNzIENoYWluSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBFIG5leHRMaW5rOwotCXByaXZhdGUgZmluYWwgTGlua2VyPEU+IGxpbmtlcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBzdGFydGluZyBsaW5rCi0JICogYW5kIGEgZGlzYWJsZWQgbGlua2VyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPm5leHRMaW5rKE9iamVjdCk8L2NvZGU+IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSA8Y29kZT5MaW5rZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDaGFpbkl0ZXJhdG9yKEUgc3RhcnRMaW5rKSB7Ci0JCXRoaXMoc3RhcnRMaW5rLCBMaW5rZXIuRGlzYWJsZWQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgbGluawotCSAqIGFuZCBsaW5rZXIuCi0JICovCi0JcHVibGljIENoYWluSXRlcmF0b3IoRSBzdGFydExpbmssIExpbmtlcjxFPiBsaW5rZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uZXh0TGluayA9IHN0YXJ0TGluazsKLQkJdGhpcy5saW5rZXIgPSBsaW5rZXI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRMaW5rICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLm5leHRMaW5rID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSByZXN1bHQgPSB0aGlzLm5leHRMaW5rOwotCQl0aGlzLm5leHRMaW5rID0gdGhpcy5uZXh0TGluayh0aGlzLm5leHRMaW5rKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXh0IGxpbmsgaW4gdGhlIGNoYWluLgotCSAqLwotCXByb3RlY3RlZCBFIG5leHRMaW5rKEUgY3VycmVudExpbmspIHsKLQkJcmV0dXJuIHRoaXMubGlua2VyLm5leHRMaW5rKGN1cnJlbnRMaW5rKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5uZXh0TGluayk7Ci0JfQotCQotCi0JLy8qKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSA8Y29kZT5DaGFpbkl0ZXJhdG9yPC9jb2RlPiB0byBsaW5rCi0JICogdGhlIGVsZW1lbnRzIGluIHRoZSBjaGFpbi4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpbmtlcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmV4dCBsaW5rIGluIHRoZSBjaGFpbi4KLQkJICovCi0JCVQgbmV4dExpbmsoVCBjdXJyZW50TGluayk7Ci0KLQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTGlua2VyPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBMaW5rZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyBzaW1wbHkgcmV0dXJuIG51bGwsIGluZGljYXRpbmcgdGhlIGNoYWluIGlzIGVuZGVkCi0JCQlwdWJsaWMgUyBuZXh0TGluayhTIGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJDaGFpbkl0ZXJhdG9yLkxpbmtlci5OdWxsIjsKLQkJCX0KLQkJfQotCi0JCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+IGltcGxlbWVudHMgTGlua2VyPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTGlua2VyPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQkJcHVibGljIFMgbmV4dExpbmsoUyBjdXJyZW50TGluaykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyAgLy8gQ2hhaW5JdGVyYXRvci5uZXh0TGluayhPYmplY3QpIHdhcyBub3QgaW1wbGVtZW50ZWQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkNoYWluSXRlcmF0b3IuTGlua2VyLkRpc2FibGVkIjsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjgyM2E1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+Q2xvbmVJdGVyYXRvcjwvY29kZT4gaXRlcmF0ZXMgb3ZlciBhIGNvcHkgb2YgYSBjb2xsZWN0aW9uLAotICogYWxsb3dpbmcgZm9yIGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBUaGUgb3JpZ2luYWwgY29sbGVjdGlvbiBwYXNzZWQgdG8gdGhlIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQ7IG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mCi0gKiBhIGNvcnJ1cHRlZCBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBhIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+IGRvZXMgbm90IHN1cHBvcnQgdGhlCi0gKiA8Y29kZT4jcmVtb3ZlKCk8L2NvZGU+IG9wZXJhdGlvbjsgdGhpcyBpcyBiZWNhdXNlIGl0IGRvZXMgbm90IGhhdmUKLSAqIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4gQnV0IGlmIHRoZSA8Y29kZT5DbG9uZUl0ZXJhdG9yPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhbiA8Y29kZT5NdXRhdG9yPC9jb2RlPiBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICogPGNvZGU+I3JlbW92ZSgpPC9jb2RlPiBvcGVyYXRpb24gdG8gdGhlIDxjb2RlPk11dGF0b3I8L2NvZGU+LgotICogQWx0ZXJuYXRpdmVseSwgYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhlIDxjb2RlPiNyZW1vdmUoT2JqZWN0KTwvY29kZT4KLSAqIG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIENsb25lSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxPYmplY3Q+IG5lc3RlZEl0ZXJhdG9yOwotCXByaXZhdGUgRSBjdXJyZW50OwotCXByaXZhdGUgZmluYWwgTXV0YXRvcjxFPiBtdXRhdG9yOwotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVBbGxvd2VkOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUgPGNvZGU+I3JlbW92ZSgpPC9jb2RlPiBtZXRob2Qgd2lsbCBub3QgYmUgc3VwcG9ydGVkLAotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUgPGNvZGU+I3JlbW92ZShPYmplY3QpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXRoaXMoYywgTXV0YXRvci5SZWFkT25seS48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBtdXRhdG9yIHRvIHJlbW92ZSBvYmplY3RzIGZyb20gdGhlCi0JICogb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjLCBNdXRhdG9yPEU+IG11dGF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uZXN0ZWRJdGVyYXRvciA9IG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oYy50b0FycmF5KCkpOwotCQl0aGlzLmN1cnJlbnQgPSBudWxsOwotCQl0aGlzLm11dGF0b3IgPSBtdXRhdG9yOwotCQl0aGlzLnJlbW92ZUFsbG93ZWQgPSBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkSXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRoaXMuY3VycmVudCA9IHRoaXMubmVzdGVkTmV4dCgpOwotCQl0aGlzLnJlbW92ZUFsbG93ZWQgPSB0cnVlOwotCQlyZXR1cm4gdGhpcy5jdXJyZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJaWYgKCAhIHRoaXMucmVtb3ZlQWxsb3dlZCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucmVtb3ZlKHRoaXMuY3VycmVudCk7Ci0JCXRoaXMucmVtb3ZlQWxsb3dlZCA9IGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIHBhc3NlZCBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGhlbGQgRXMsCi0JICogc28gdGhpcyBjYXN0IGlzIG5vdCBhIHByb2JsZW0uIFdlIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UKLQkgKiBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHdlcmUgY29waWVkIGludG8KLQkgKiBhbiBvYmplY3QgYXJyYXkgKE9iamVjdFtdKS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRSBuZXN0ZWROZXh0KCkgewotCQlyZXR1cm4gKEUpIHRoaXMubmVzdGVkSXRlcmF0b3IubmV4dCgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYW4gPGNvZGU+TXV0YXRvcjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEUgZSkgewotCQl0aGlzLm11dGF0b3IucmVtb3ZlKGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotCi0JLy8qKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSA8Y29kZT5DbG9uZUl0ZXJhdG9yPC9jb2RlPiB0byByZW1vdmUKLQkgKiBlbGVtZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uOyBzaW5jZSB0aGUgaXRlcmF0b3IKLQkgKiBkb2VzIG5vdCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIGludGVyZmFjZSBNdXRhdG9yPFQ+IHsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JCSAqLwotCQl2b2lkIHJlbW92ZShUIGN1cnJlbnQpOwotCi0KLQkJZmluYWwgY2xhc3MgUmVhZE9ubHk8Uz4gaW1wbGVtZW50cyBNdXRhdG9yPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBNdXRhdG9yIElOU1RBTkNFID0gbmV3IFJlYWRPbmx5KCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE11dGF0b3I8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBSZWFkT25seSgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gcmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgY3VycmVudCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ2xvbmVJdGVyYXRvci5NdXRhdG9yLlJlYWRPbmx5IjsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYWQzNDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPiBpdGVyYXRlcyBvdmVyIGEgY29weSBvZiBhIGxpc3QsCi0gKiBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0gKiA8cD4KLSAqIFRoZSBvcmlnaW5hbCBsaXN0IHBhc3NlZCB0byB0aGUgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQ7IG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mCi0gKiBhIGNvcnJ1cHRlZCBsaXN0LgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBhIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPiBkb2VzIG5vdCBzdXBwb3J0IHRoZQotICogbW9kaWZpY2F0aW9uIG9wZXJhdGlvbnM7IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlCi0gKiBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuIEJ1dCBpZiB0aGUgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+Ci0gKiBpcyBzdXBwbGllZCB3aXRoIGEgPGNvZGU+TXV0YXRvcjwvY29kZT4gaXQgd2lsbCBkZWxlZ2F0ZSB0aGUKLSAqIG1vZGlmaWNhdGlvbiBvcGVyYXRpb25zIHRvIHRoZSA8Y29kZT5NdXRhdG9yPC9jb2RlPi4KLSAqIEFsdGVybmF0aXZlbHksIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoZSBtb2RpZmljYXRpb24gbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIENsb25lTGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjxPYmplY3Q+IG5lc3RlZExpc3RJdGVyYXRvcjsKLQlwcml2YXRlIGludCBjdXJzb3I7Ci0JcHJpdmF0ZSBTdHJpbmcgc3RhdGU7Ci0JcHJpdmF0ZSBmaW5hbCBNdXRhdG9yPEU+IG11dGF0b3I7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTiA9ICJ1bmtub3duIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklPVVMgPSAicHJldmlvdXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVhUID0gIm5leHQiOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhlIG1vZGlmaWNhdGlvbiBtZXRob2RzIHdpbGwgbm90IGJlIHN1cHBvcnRlZCwKLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlbS4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewotCQl0aGlzKGxpc3QsIE11dGF0b3IuUmVhZE9ubHkuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIGxpc3QgbXV0YXRvciB0byBtb2RpZnkgdGhlIG9yaWdpbmFsIGxpc3QuCi0JICovCi0JcHVibGljIENsb25lTGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QsIE11dGF0b3I8RT4gbXV0YXRvcikgewotCQlzdXBlcigpOwotCQkvLyBidWlsZCBhIGNvcHkgb2YgdGhlIGxpc3QgYW5kIGtlZXAgaXQgaW4gc3luY2ggd2l0aCBvcmlnaW5hbCAoaWYgdGhlIG11dGF0b3IgYWxsb3dzIGNoYW5nZXMpCi0JCS8vIHRoYXQgd2F5IHRoZSBuZXN0ZWQgbGlzdCBpdGVyYXRvciB3aWxsIG1haW50YWluIHNvbWUgb2Ygb3VyIHN0YXRlCi0JCXRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yID0gQ29sbGVjdGlvblRvb2xzLmxpc3QobGlzdC50b0FycmF5KCkpLmxpc3RJdGVyYXRvcigpOwotCQl0aGlzLm11dGF0b3IgPSBtdXRhdG9yOwotCQl0aGlzLmN1cnNvciA9IDA7Ci0JCXRoaXMuc3RhdGUgPSBVTktOT1dOOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0SXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQkvLyBhbGxvdyB0aGUgbmVzdGVkIGl0ZXJhdG9yIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBiZWZvcmUgd2UgbW9kaWZ5IHRoZSBpbmRleAotCQlFIG5leHQgPSB0aGlzLm5lc3RlZE5leHQoKTsKLQkJdGhpcy5jdXJzb3IrKzsKLQkJdGhpcy5zdGF0ZSA9IE5FWFQ7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdAotCQl0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5yZW1vdmUoKTsKLQkJaWYgKHRoaXMuc3RhdGUgPT0gUFJFVklPVVMpIHsKLQkJCXRoaXMucmVtb3ZlKHRoaXMuY3Vyc29yKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuY3Vyc29yLS07Ci0JCQl0aGlzLnJlbW92ZSh0aGlzLmN1cnNvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIGluZGV4Ci0JCUUgcHJldmlvdXMgPSB0aGlzLm5lc3RlZFByZXZpb3VzKCk7Ci0JCXRoaXMuY3Vyc29yLS07Ci0JCXRoaXMuc3RhdGUgPSBQUkVWSU9VUzsKLQkJcmV0dXJuIHByZXZpb3VzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFIG8pIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdAotCQl0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5hZGQobyk7Ci0JCXRoaXMuYWRkKHRoaXMuY3Vyc29yLCBvKTsKLQkJdGhpcy5jdXJzb3IrKzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBvKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIG9yaWdpbmFsIGxpc3QKLQkJdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3Iuc2V0KG8pOwotCQlpZiAodGhpcy5zdGF0ZSA9PSBQUkVWSU9VUykgewotCQkJdGhpcy5zZXQodGhpcy5jdXJzb3IsIG8pOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXQodGhpcy5jdXJzb3IgLSAxLCBvKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBsaXN0IHBhc3NlZCBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGhlbGQgRXMsCi0JICogc28gdGhpcyBjYXN0IGlzIG5vdCBhIHByb2JsZW0uIFdlIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UKLQkgKiBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHdlcmUgY29waWVkIGludG8KLQkgKiBhbiBvYmplY3QgYXJyYXkgKE9iamVjdFtdKS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRSBuZXN0ZWROZXh0KCkgewotCQlyZXR1cm4gKEUpIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBwYXNzZWQgaW4gZHVyaW5nIGNvbnN0cnVjdGlvbiBoZWxkIEVzLAotCSAqIHNvIHRoaXMgY2FzdCBpcyBub3QgYSBwcm9ibGVtLiBXZSBuZWVkIHRoaXMgY2FzdCBiZWNhdXNlCi0JICogYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiB3ZXJlIGNvcGllZCBpbnRvCi0JICogYW4gb2JqZWN0IGFycmF5IChPYmplY3RbXSkuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEUgbmVzdGVkUHJldmlvdXMoKSB7Ci0JCXJldHVybiAoRSkgdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIDxjb2RlPk11dGF0b3I8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgaW5kZXgsIEUgbykgewotCQl0aGlzLm11dGF0b3IuYWRkKGluZGV4LCBvKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+TXV0YXRvcjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQl0aGlzLm11dGF0b3IucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIDxjb2RlPk11dGF0b3I8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldChpbnQgaW5kZXgsIEUgbykgewotCQl0aGlzLm11dGF0b3Iuc2V0KGluZGV4LCBvKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotCi0JLy8qKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSA8Y29kZT5DbG9uZUxpc3RJdGVyYXRvcjwvY29kZT4gdG8gcmVtb3ZlCi0JICogZWxlbWVudHMgZnJvbSB0aGUgb3JpZ2luYWwgbGlzdDsgc2luY2UgdGhlIGxpc3QgaXRlcmF0b3IKLQkgKiBkb2VzIG5vdCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBNdXRhdG9yPFQ+IHsKLQotCQkvKioKLQkJICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCQkgKi8KLQkJdm9pZCBhZGQoaW50IGluZGV4LCBUIG8pOwotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkJICovCi0JCXZvaWQgcmVtb3ZlKGludCBpbmRleCk7Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgbGlzdC4KLQkJICovCi0JCXZvaWQgc2V0KGludCBpbmRleCwgVCBvKTsKLQotCi0JCWZpbmFsIGNsYXNzIFJlYWRPbmx5PFM+IGltcGxlbWVudHMgTXV0YXRvcjxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTXV0YXRvciBJTlNUQU5DRSA9IG5ldyBSZWFkT25seSgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNdXRhdG9yPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgUmVhZE9ubHkoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIGFkZCBpcyBub3Qgc3VwcG9ydGVkCi0JCQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgbykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJLy8gcmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCS8vIHNldCBpcyBub3Qgc3VwcG9ydGVkCi0JCQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBPYmplY3QgbykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvci5SZWFkT25seSI7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODNmNTM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhIGNvbGxlY3Rpb24KLSAqIG9mIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPnMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiA8Y29kZT5JdGVyYXRvcjwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9yczsKLQlwcml2YXRlIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBjdXJyZW50SXRlcmF0b3I7Ci0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9ycykgewotCQl0aGlzKGl0ZXJhdG9ycy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvcnMgPSBpdGVyYXRvcnM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoRSBvYmplY3QsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4ob2JqZWN0KSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhdG9yLCBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4uLi4gaXRlcmF0b3JzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmF0b3I8SXRlcmF0b3I8PyBleHRlbmRzIEU+PihpdGVyYXRvcnMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZEN1cnJlbnRJdGVyYXRvcigpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGlzIG9jY3VycyBpZiB0aGVyZSBhcmUgbm8gaXRlcmF0b3JzIGF0IGFsbAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhpcy5sb2FkQ3VycmVudEl0ZXJhdG9yKCk7Ci0JCUUgcmVzdWx0ID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCi0JCS8vIHRoZSBzdGF0ZW1lbnQgYWJvdmUgd2lsbCB0aHJvdyBhIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkJLy8gaWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZTsKLQkJLy8gc28gaWYgd2UgZ2V0IGhlcmUsIHdlIGNhbiBzZXQgJ2xhc3RJdGVyYXRvclRvUmV0dXJuTmV4dCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybk5leHQgPSB0aGlzLmN1cnJlbnRJdGVyYXRvcjsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJaWYgKHRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0ID09IG51bGwpIHsKLQkJCS8vIENvbXBvc2l0ZUl0ZXJhdG9yI25leHQoKSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuTmV4dC5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGN1cnJlbnRJdGVyYXRvciB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IDxjb2RlPmhhc05leHQoKTwvY29kZT4KLQkgKiBvciB0aGUgZmluYWwgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRDdXJyZW50SXRlcmF0b3IoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoKCAhIHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgJiYgdGhpcy5pdGVyYXRvcnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMDM3ZjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVMaXN0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGEgbGlzdAotICogb2YgPGNvZGU+TGlzdEl0ZXJhdG9yPC9jb2RlPnMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8RT4gbmV4dEl0ZXJhdG9yOwotCXByaXZhdGUgaW50IG5leHRJbmRleDsKLSAJLyoqCi0gCSAqIHRydWUgaWYgIm5leHQiIHdhcyBsYXN0IHJldHVybmVkOyBmYWxzZSBpZiAicHJldmlvdXMiIHdhcyBsYXN0IHJldHVybmVkOwotIAkgKiB0aGlzIGRldGVybWluZXMgdGhlIGVmZmVjdCBvZiByZW1vdmUoT2JqZWN0KSBvbiBuZXh0SW5kZXgKLSAJICovCi0JcHJpdmF0ZSBib29sZWFuIG5leHRSZXR1cm5lZDsKLQlwcml2YXRlIExpc3RJdGVyYXRvcjxFPiBsYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQ7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8RT4+IGl0ZXJhdG9ycykgewotCQl0aGlzKGl0ZXJhdG9ycy5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0IGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPEU+PiBpdGVyYXRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvcnMgPSBpdGVyYXRvcnM7Ci0JCXRoaXMubmV4dEluZGV4ID0gMDsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPihvYmplY3QpLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvciwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYXRvciwgbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8RT4uLi4gaXRlcmF0b3JzKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjxFPj4oaXRlcmF0b3JzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXRoaXMubmV4dEl0ZXJhdG9yLmFkZChvKTsKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkTmV4dEl0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZFByZXZpb3VzSXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLm5leHRJdGVyYXRvci5uZXh0KCk7Ci0KLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIHNldCB0aGUgJ2xhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPSB0aGlzLm5leHRJdGVyYXRvcjsKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSB0cnVlOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleDsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJdGhpcy5sb2FkUHJldmlvdXNJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMubmV4dEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0KLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIHNldCB0aGUgJ2xhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPSB0aGlzLm5leHRJdGVyYXRvcjsKLQkJdGhpcy5uZXh0SW5kZXgtLTsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSBmYWxzZTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4ICAtIDE7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQlpZiAodGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50LnJlbW92ZSgpOwotCQlpZiAodGhpcy5uZXh0UmV0dXJuZWQpIHsKLQkJCS8vIGRlY3JlbWVudCB0aGUgaW5kZXggYmVjYXVzZSB0aGUgIm5leHQiIGVsZW1lbnQgaGFzIG1vdmVkIGZvcndhcmQgaW4gdGhlIGxpc3QKLQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCWlmICh0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQuc2V0KGUpOwotCX0KLQotCS8qKgotCSAqIExvYWQgJ25leHRJdGVyYXRvcicgd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dEl0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCAnbmV4dEl0ZXJhdG9yJyB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IDxjb2RlPmhhc1ByZXZpb3VzKCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpcnN0IGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkUHJldmlvdXNJdGVyYXRvcigpIHsKLQkJdGhpcy5jaGVja05leHRJdGVyYXRvcigpOwotCQl3aGlsZSAoKCAhIHRoaXMubmV4dEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElmICduZXh0SXRlcmF0b3InIGlzIG51bGwsIGxvYWQgaXQgd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTmV4dEl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5uZXh0SXRlcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9ycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5RW51bWVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlFbnVtZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTc3MjFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlFbnVtZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5OdWxsRW51bWVyYXRpb248L2NvZGU+IGlzIGp1c3QgdGhhdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVtcHR5RW51bWVyYXRpb248RT4KLQlpbXBsZW1lbnRzIEVudW1lcmF0aW9uPEU+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbXB0eUVudW1lcmF0aW9uIElOU1RBTkNFID0gbmV3IEVtcHR5RW51bWVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IEVudW1lcmF0aW9uPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5RW51bWVyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dEVsZW1lbnQoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNhYzMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQW4gPGNvZGU+RW1wdHlJdGVyYXRvcjwvY29kZT4gaXMganVzdCB0aGF0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVtcHR5SXRlcmF0b3IgSU5TVEFOQ0UgPSBuZXcgRW1wdHlJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8VD4gSXRlcmF0b3I8VD4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRW1wdHlJdGVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2FiNGE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbXB0eUxpc3RJdGVyYXRvcjwvY29kZT4gaXMganVzdCB0aGF0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1wdHlMaXN0SXRlcmF0b3IgSU5TVEFOQ0UgPSBuZXcgRW1wdHlMaXN0SXRlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3RJdGVyYXRvcjxUPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFbXB0eUxpc3RJdGVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1NzEwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbnVtZXJhdGlvbkl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbgotICogPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IHNvIHRoYXQgaXQgY2FuIGJlIHRyZWF0ZWQgbGlrZSBhbgotICogPGNvZGU+SXRlcmF0b3I8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRpb25JdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHdyYXBzIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24uCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uSXRlcmF0b3IoRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uKSB7Ci0JCXRoaXMuZW51bWVyYXRpb24gPSBlbnVtZXJhdGlvbjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXJldHVybiB0aGlzLmVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZW51bWVyYXRpb24pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4MjMwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciA8Y29kZT5JdGVyYXRvcjwvY29kZT4KLSAqIGFuZCB1c2VzIGEgPGNvZGU+RmlsdGVyPC9jb2RlPiB0byBkZXRlcm1pbmUgd2hpY2ggZWxlbWVudHMgaW4gdGhlCi0gKiBuZXN0ZWQgaXRlcmF0b3IgYXJlIHRvIGJlIHJldHVybmVkIGJ5IGNhbGxzIHRvIDxjb2RlPm5leHQoKTwvY29kZT4uCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+RmlsdGVyPC9jb2RlPiwgYSBzdWJjbGFzcwotICogb2YgPGNvZGU+RmlsdGVyaW5nSXRlcmF0b3I8L2NvZGU+IGNhbiBvdmVycmlkZSB0aGUKLSAqIDxjb2RlPmFjY2VwdChPYmplY3QpPC9jb2RlPiBtZXRob2QuCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgaXRlcmF0b3IgaXMgdGhhdAotICogdGhlIG5lc3RlZCBpdGVyYXRvcidzIDxjb2RlPm5leHQoKTwvY29kZT4gbWV0aG9kIHdpbGwgYmUgaW52b2tlZAotICogPGVtPmJlZm9yZTwvZW0+IHRoZSBmaWx0ZXJlZCBpdGVyYXRvcidzIDxjb2RlPm5leHQoKTwvY29kZT4KLSAqIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGJlY2F1c2UgdGhlICJuZXh0IiBlbGVtZW50IG11c3QgYmUKLSAqIGNoZWNrZWQgZm9yIHdoZXRoZXIgaXQgaXMgdG8gYmUgYWNjZXB0ZWQgYmVmb3JlIHRoZSBmaWx0ZXJlZCBpdGVyYXRvcgotICogY2FuIGRldGVybWluZSB3aGV0aGVyIGl0IGhhcyBhICJuZXh0IiBlbGVtZW50IChpLmUuIHRoYXQgdGhlCi0gKiA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+IG1ldGhvZCBzaG91bGQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+KS4KLSAqIFRoaXMgYWxzbyBwcmV2ZW50cyBhIGZpbHRlcmVkIGl0ZXJhdG9yIGZyb20gc3VwcG9ydGluZyB0aGUgb3B0aW9uYWwKLSAqIDxjb2RlPnJlbW92ZSgpPC9jb2RlPiBtZXRob2QuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdJdGVyYXRvcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmVzdGVkSXRlcmF0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBGaWx0ZXI8RTE+IGZpbHRlcjsKLQlwcml2YXRlIEUyIG5leHQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogaXRlcmF0b3IgYW5kIGEgZGlzYWJsZWQgZmlsdGVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPmFjY2VwdChPYmplY3QpPC9jb2RlPiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEgPGNvZGU+RmlsdGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEUxPiBuZXN0ZWRJdGVyYXRvcikgewotCQl0aGlzKG5lc3RlZEl0ZXJhdG9yLCBGaWx0ZXIuRGlzYWJsZWQuPEUxPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogaXRlcmF0b3IgYW5kIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEUxPiBuZXN0ZWRJdGVyYXRvciwgRmlsdGVyPEUxPiBmaWx0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uZXN0ZWRJdGVyYXRvciA9IG5lc3RlZEl0ZXJhdG9yOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy5sb2FkTmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRTIgbmV4dCgpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFMiByZXN1bHQgPSB0aGlzLm5leHQ7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCZWNhdXNlIHdlIG5lZWQgdG8gcHJlLWxvYWQgdGhlIG5leHQgZWxlbWVudAotCSAqIHRvIGJlIHJldHVybmVkLCB3ZSBjYW5ub3Qgc3VwcG9ydCB0aGUgPGNvZGU+cmVtb3ZlKCk8L2NvZGU+Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0IHdpdGggdGhlIG5leHQgdmFsaWQgZW50cnkgZnJvbSB0aGUgbmVzdGVkCi0JICogaXRlcmF0b3IuIElmIHRoZXJlIGFyZSBub25lLCBuZXh0IGlzIHNldCB0byA8Y29kZT5FTkQ8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dCgpIHsKLQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJd2hpbGUgKHRoaXMubmVzdGVkSXRlcmF0b3IuaGFzTmV4dCgpICYmICh0aGlzLmRvbmUpKSB7Ci0JCQlFMSB0ZW1wID0gdGhpcy5uZXN0ZWRJdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodGhpcy5hY2NlcHQodGVtcCkpIHsKLQkJCQkvLyBhc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0IHdhcyBhY2NlcHRlZCBpdCBpcyBvZiB0eXBlIEUKLQkJCQl0aGlzLm5leHQgPSB0aGlzLmNhc3QodGVtcCk7Ci0JCQkJdGhpcy5kb25lID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMubmV4dCA9IG51bGw7Ci0JCQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFdlIGhhdmUgdG8gYXNzdW1lIHRoZSBmaWx0ZXIgd2lsbCBvbmx5ICJhY2NlcHQiIG9iamVjdHMgdGhhdCBjYW4KLQkgKiBiZSBjYXN0IHRvIEUyLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRTIgY2FzdChFMSBvKSB7Ci0JCXJldHVybiAoRTIpIG87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIDxjb2RlPkZpbHRlcmluZ0l0ZXJhdG9yPC9jb2RlPgotCSAqIHNob3VsZCByZXR1cm4gdGhlIHNwZWNpZmllZCBuZXh0IGVsZW1lbnQgZnJvbSBhIGNhbGwgdG8gdGhlCi0JICogPGNvZGU+bmV4dCgpPC9jb2RlPiBtZXRob2QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+RmlsdGVyPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRTEgbykgewotCQlyZXR1cm4gdGhpcy5maWx0ZXIuYWNjZXB0KG8pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmVzdGVkSXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HZW5lcmljSXRlcmF0b3JXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0dlbmVyaWNJdGVyYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ2ZWFkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0dlbmVyaWNJdGVyYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogV3JhcCBhbiBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiBhbnkgc3ViLXR5cGUgb2YgRSwgY29udmVydGluZyBpdCBpbnRvIGFuCi0gKiBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIEUuIFRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSBzaW5jZSB0aGVyZQotICogaXMgbm8gd2F5IHRvIGFkZCBlbGVtZW50cyB0byB0aGUgaXRlcmF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSXRlcmF0b3JXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCi0JcHVibGljIEdlbmVyaWNJdGVyYXRvcldyYXBwZXIoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTllNmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkdyYXBoSXRlcmF0b3I8L2NvZGU+IGlzIHNpbWlsYXIgdG8gYSA8Y29kZT5UcmVlSXRlcmF0b3I8L2NvZGU+Ci0gKiBleGNlcHQgdGhhdCBpdCBjYW5ub3QgYmUgYXNzdW1lZCB0aGF0IGFsbCBub2RlcyBhc3N1bWUgYSBzdHJpY3QgdHJlZQotICogc3RydWN0dXJlLiAgRm9yIGluc3RhbmNlLCBpbiBhIHRyZWUsIGEgbm9kZSBjYW5ub3QgYmUgYSBkZXNjZW5kZW50IG9mCi0gKiBpdHNlbGYsIGJ1dCBhIGdyYXBoIG1heSBoYXZlIGEgY3ljbGljYWwgc3RydWN0dXJlLgotICogCi0gKiBBIDxjb2RlPkdyYXBoSXRlcmF0b3I8L2NvZGU+IHNpbXBsaWZpZXMgdGhlIHRyYXZlcnNhbCBvZiBhCi0gKiBncmFwaCBvZiBvYmplY3RzLCB3aGVyZSB0aGUgb2JqZWN0cycgcHJvdG9jb2wocykgcHJvdmlkZXMKLSAqIGEgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBuZXh0IGNvbGxlY3Rpb24gb2Ygbm9kZXMgaW4gdGhlIGdyYXBoLAotICogKG9yICpuZWlnaGJvcnMqKSwgYnV0IGRvZXMgbm90IHByb3ZpZGUgYSBtZXRob2QgZm9yIGdldHRpbmcgKmFsbCogCi0gKiBvZiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLgotICogKGUuZy4gYSBuZWlnaGJvciBjYW4gcmV0dXJuIGhpcyBuZWlnaGJvcnMsIGFuZCB0aG9zZSBuZWlnaGJvcnMKLSAqIGNhbiByZXR1cm4gdGhlaXIgbmVpZ2hib3JzLCB3aGljaCBtaWdodCBhbHNvIGluY2x1ZGUgdGhlIG9yaWdpbmFsCi0gKiBuZWlnaGJvciwgYnV0IHlvdSBvbmx5IHdhbnQgdG8gdmlzaXQgdGhlIG9yaWdpbmFsIG5laWdoYm9yIG9uY2UuKQotICogPHA+Ci0gKiBJZiBhIG5laWdoYm9yIGhhcyBhbHJlYWR5IGJlZW4gdmlzaXRlZCAoZGV0ZXJtaW5lZCBieSB1c2luZyAKLSAqIDxjb2RlPmVxdWFscyhPYmplY3QpPC9jb2RlPiksIHRoYXQgbmVpZ2hib3IgaXMgbm90IHZpc2l0ZWQgYWdhaW4sCi0gKiBub3IgYXJlIHRoZSBuZWlnaGJvcnMgb2YgdGhhdCBvYmplY3QuCi0gKiA8cD4KLSAqIEl0IGlzIHVwIHRvIHRoZSB1c2VyIG9mIHRoaXMgY2xhc3MgdG8gZW5zdXJlIGEgKmNvbXBsZXRlKiBncmFwaC4KLSAqIDxwPgotICogVG8gdXNlLCBzdXBwbHk6PHVsPgotICogPGxpPiBlaXRoZXIgdGhlIGluaXRpYWwgbm9kZSBvZiB0aGUgZ3JhcGggb3IgYW4gSXRlcmF0b3Igb3ZlciBhbgotICogaW5pdGlhbCBjb2xsZWN0aW9uIG9mIGdyYXBoIG5vZGVzCi0gKiA8bGk+IGEgPGNvZGU+TWlzdGVyUm9nZXJzPC9jb2RlPiB0aGF0IHRlbGxzIHdobyB0aGUgbmVpZ2hib3JzIGFyZQotICogb2YgZWFjaCBub2RlCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUgPGNvZGU+bmVpZ2hib3JzKE9iamVjdCk8L2NvZGU+IG1ldGhvZCkKLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIDxjb2RlPnJlbW92ZSgpPC9jb2RlPiBpcyBub3Qgc3VwcG9ydGVkLiAgVGhpcyBtZXRob2QsIGlmIAotICogZGVzaXJlZCwgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgdXNlciBvZiB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBmaW5hbCBTZXQ8RT4gdmlzaXRlZE5laWdoYm9yczsKLQlwcml2YXRlIGZpbmFsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnM7Ci0JCi0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY3VycmVudEl0ZXJhdG9yOwotCQotCXByaXZhdGUgRSBuZXh0TmVpZ2hib3I7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIG1pc3RlciByb2dlcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+Y2hpbGRyZW4oT2JqZWN0KTwvY29kZT4gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIDxjb2RlPk1pc3RlclJvZ2VyczwvY29kZT4uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoRS4uLiByb290cykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhdG9yPEU+KHJvb3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGlzYWJsZWQgbWlzdGVyIHJvZ2Vycy4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiA8Y29kZT5jaGlsZHJlbihPYmplY3QpPC9jb2RlPiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEgPGNvZGU+TWlzdGVyUm9nZXJzPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gcm9vdHMpIHsKLQkJdGhpcyhyb290cywgTWlzdGVyUm9nZXJzLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBhIGRpc2FibGVkIG1pc3RlciByb2dlcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+Y2hpbGRyZW4oT2JqZWN0KTwvY29kZT4gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIDxjb2RlPk1pc3RlclJvZ2VyczwvY29kZT4uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoRSByb290KSB7Ci0JCXRoaXMocm9vdCwgTWlzdGVyUm9nZXJzLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBtaXN0ZXIgcm9nZXJzLgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEUgcm9vdCwgTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4ocm9vdCksIG1pc3RlclJvZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCByb290cwotCSAqIGFuZCBtaXN0ZXIgcm9nZXJzLgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiByb290cywgTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQlzdXBlcigpOwotCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHJvb3RzOwotCQkvLyB1c2UgYSBMaW5rZWRMaXN0IHNpbmNlIHdlIHdpbGwgYmUgcHVsbGluZyBvZmYgdGhlIGZyb250IGFuZCBhZGRpbmcgdG8gdGhlIGVuZAotCQl0aGlzLml0ZXJhdG9ycyA9IG5ldyBMaW5rZWRMaXN0PEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4oKTsKLQkJdGhpcy5taXN0ZXJSb2dlcnMgPSBtaXN0ZXJSb2dlcnM7Ci0JCXRoaXMudmlzaXRlZE5laWdoYm9ycyA9IG5ldyBIYXNoU2V0PEU+KCk7Ci0JCXRoaXMubG9hZE5leHROZWlnaGJvcigpOwotCX0KLQotCS8qKgotCSAqIExvYWQgbmV4dCBuZWlnaGJvciB3aXRoIHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIGN1cnJlbnQgaXRlcmF0b3IuCi0JICogSWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaGFzIG5vbmUsIGxvYWQgdGhlIG5leHQgaXRlcmF0b3IuCi0JICogSWYgdGhlcmUgYXJlIG5vIG1vcmUsIHRoZSAnZG9uZScgZmxhZyBpcyBzZXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0TmVpZ2hib3IoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvciA9PSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpIHsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFIG5leHRQb3NzaWJsZU5laWdoYm9yID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHRoaXMudmlzaXRlZE5laWdoYm9ycy5jb250YWlucyhuZXh0UG9zc2libGVOZWlnaGJvcikpIHsKLQkJCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsgIC8vIHJlY3Vyc2UKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5uZXh0TmVpZ2hib3IgPSBuZXh0UG9zc2libGVOZWlnaGJvcjsKLQkJCQl0aGlzLnZpc2l0ZWROZWlnaGJvcnMuYWRkKG5leHRQb3NzaWJsZU5laWdoYm9yKTsKLQkJCQl0aGlzLml0ZXJhdG9ycy5hZGQodGhpcy5uZWlnaGJvcnMobmV4dFBvc3NpYmxlTmVpZ2hib3IpKTsKLQkJCX0KLQkJfSAKLQkJZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IHN0cmVhbSA9IHRoaXMuaXRlcmF0b3JzLml0ZXJhdG9yKCk7ICEgdGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpICYmIHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gc3RyZWFtLm5leHQoKTsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlpZiAoICEgdGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsgIC8vIHJlY3Vyc2UKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgbmV4dCA9IHRoaXMubmV4dE5laWdoYm9yOwotCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBuZWlnaGJvcnMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZWlnaGJvcnMoRSBuZXh0KSB7Ci0JCXJldHVybiB0aGlzLm1pc3RlclJvZ2Vycy5uZWlnaGJvcnMobmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jdXJyZW50SXRlcmF0b3IpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVXNlZCBieSA8Y29kZT5HcmFwaEl0ZXJhdG9yPC9jb2RlPiB0byByZXRyaWV2ZQotCSAqIHRoZSBpbW1lZGlhdGUgbmVpZ2hib3JzIG9mIGEgbm9kZSBpbiB0aGUgZ3JhcGguCi0JICogIlRoZXNlIGFyZSB0aGUgcGVvcGxlIGluIHlvdXIgbmVpZ2hib3Job29kLi4uIgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTWlzdGVyUm9nZXJzPFQ+IHsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgbmVpZ2hib3JzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCQkgKi8KLQkJSXRlcmF0b3I8PyBleHRlbmRzIFQ+IG5laWdoYm9ycyhUIG5leHQpOwotCQkKLQkJCi0JCWZpbmFsIGNsYXNzIE51bGw8Uz4gaW1wbGVtZW50cyBNaXN0ZXJSb2dlcnM8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1pc3RlclJvZ2VycyBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pc3RlclJvZ2VyczxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE51bGwoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHJldHVybiBubyBuZWlnaGJvcnMKLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBuZWlnaGJvcnMoUyBuZXh0KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzLk51bGwiOwotCQkJfQotCQl9Ci0KLQkJLyoqIFRoZSBtaXN0ZXIgcm9nZXJzIHVzZWQgd2hlbiB0aGUgI25laWdoYm9ycyhPYmplY3QpIG1ldGhvZCBpcyBvdmVycmlkZGVuLiAqLwotCQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIE1pc3RlclJvZ2VyczxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTWlzdGVyUm9nZXJzIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pc3RlclJvZ2VyczxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBuZWlnaGJvcnMoUyBuZXh0KSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7ICAvLyBHcmFwaEl0ZXJhdG9yLm5laWdoYm9ycyhPYmplY3QpIHdhcyBub3QgaW1wbGVtZW50ZWQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzLkRpc2FibGVkIjsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0l0ZXJhdG9yRW51bWVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvSXRlcmF0b3JFbnVtZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE0ZjA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvSXRlcmF0b3JFbnVtZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFuIDxjb2RlPkl0ZXJhdG9yRW51bWVyYXRpb248L2NvZGU+IHdyYXBzIGFuCi0gKiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gc28gdGhhdCBpdCBjYW4gYmUgdHJlYXRlZCBsaWtlIGFuCi0gKiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRvckVudW1lcmF0aW9uPEU+Ci0JaW1wbGVtZW50cyBFbnVtZXJhdGlvbjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVudW1lcmF0aW9uIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3JFbnVtZXJhdGlvbihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2YWVkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlBlZWthYmxlSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIgPGNvZGU+SXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgYWxsb3dzIGEgPGNvZGU+cGVlaygpPC9jb2RlPiBhdCB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIAotICogcmV0dXJuZWQgYnkgPGNvZGU+bmV4dCgpPC9jb2RlPi4KLSAqIDxwPgotICogT25lLCBwb3NzaWJseSB1bmRlc2lyYWJsZSwgc2lkZS1lZmZlY3Qgb2YgdXNpbmcgdGhpcyBpdGVyYXRvciBpcyB0aGF0Ci0gKiB0aGUgbmVzdGVkIGl0ZXJhdG9yJ3MgPGNvZGU+bmV4dCgpPC9jb2RlPiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkCi0gKiA8ZW0+YmVmb3JlPC9lbT4gdGhlIHBlZWthYmxlIGl0ZXJhdG9yJ3MgPGNvZGU+bmV4dCgpPC9jb2RlPgotICogbWV0aG9kIGlzIGludm9rZWQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgIm5leHQiIGVsZW1lbnQgbXVzdCBiZQotICogcHJlLWxvYWRlZCBmb3IgdGhlIDxjb2RlPnBlZWsoKTwvY29kZT4gbWV0aG9kLgotICogVGhpcyBhbHNvIHByZXZlbnRzIGEgcGVla2FibGUgaXRlcmF0b3IgZnJvbSBzdXBwb3J0aW5nIHRoZSBvcHRpb25hbAotICogPGNvZGU+cmVtb3ZlKCk8L2NvZGU+IG1ldGhvZC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUGVla2FibGVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXN0ZWRJdGVyYXRvcjsKLQlwcml2YXRlIEUgbmV4dDsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcGVla2FibGUgaXRlcmF0b3IgdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBQZWVrYWJsZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXN0ZWRJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5lc3RlZEl0ZXJhdG9yID0gbmVzdGVkSXRlcmF0b3I7Ci0JCXRoaXMuZG9uZSA9IGZhbHNlOwotCQl0aGlzLmxvYWROZXh0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5kb25lOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSByZXN1bHQgPSB0aGlzLm5leHQ7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBuZXh0IGNhbGwgdG8gdGhlCi0JICogPGNvZGU+bmV4dCgpPC9jb2RlPiBtZXRob2QsIHdpdGhvdXQgYWR2YW5jaW5nIHBhc3QgaXQuCi0JICovCi0JcHVibGljIEUgcGVlaygpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0OwotCX0KLQotCS8qKgotCSAqIEJlY2F1c2Ugd2UgbmVlZCB0byBwcmUtbG9hZCB0aGUgbmV4dCBlbGVtZW50Ci0JICogdG8gYmUgcmV0dXJuZWQsIHdlIGNhbm5vdCBzdXBwb3J0IHRoZSA8Y29kZT5yZW1vdmUoKTwvY29kZT4KLQkgKiBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIG5leHQgd2l0aCB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBuZXN0ZWQKLQkgKiBpdGVyYXRvci4gSWYgdGhlcmUgYXJlIG5vbmUsIG5leHQgaXMgc2V0IHRvIDxjb2RlPkVORDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0KCkgewotCQlpZiAodGhpcy5uZXN0ZWRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dCA9IHRoaXMubmVzdGVkSXRlcmF0b3IubmV4dCgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5uZXh0ID0gbnVsbDsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzZDM2ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjwvY29kZT4gd3JhcHMgYSBsaXN0Ci0gKiBvZiA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+cyBhbmQgbWFrZXMgdGhlbSBhcHBlYXIgdG8gYmUgYSBzaW5nbGUKLSAqIHJlYWQtb25seSA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+LiBBIHJlYWQtb25seSBjb21wb3NpdGUgbGlzdAotICogaXRlcmF0b3IgaXMgbW9yZSBmbGV4aWJsZSB0aGFuIGEgbm9ybWFsIGNvbXBvc2l0ZSB3aGVuIGl0IGNvbWVzIHRvIHRoZSBlbGVtZW50IHR5cGVzIG9mCi0gKiB0aGUgbmVzdGVkIGl0ZXJhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXh0SXRlcmF0b3I7Ci0JcHJpdmF0ZSBpbnQgbmV4dEluZGV4OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZgotCSAqIGxpc3QgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMpIHsKLQkJdGhpcyhpdGVyYXRvcnMubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mCi0JICogbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3JzID0gaXRlcmF0b3JzOwotCQl0aGlzLm5leHRJbmRleCA9IDA7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihFIG9iamVjdCwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+KG9iamVjdCksIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYXRvciwgbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+Li4uIGl0ZXJhdG9ycykgewotCQl0aGlzKG5ldyBBcnJheUxpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PihpdGVyYXRvcnMpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkTmV4dEl0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZFByZXZpb3VzSXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLm5leHRJdGVyYXRvci5uZXh0KCk7Ci0JCi0JCS8vIHRoZSBzdGF0ZW1lbnQgYWJvdmUgd2lsbCB0aHJvdyBhIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkJLy8gaWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZTsKLQkJLy8gc28gaWYgd2UgZ2V0IGhlcmUsIHdlIGNhbiBpbmNyZW1lbnQgJ25leHRJbmRleCcKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4OwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQl0aGlzLmxvYWRQcmV2aW91c0l0ZXJhdG9yKCk7Ci0JCUUgcmVzdWx0ID0gdGhpcy5uZXh0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkKLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIGRlY3JlbWVudCAnbmV4dEluZGV4JwotCQl0aGlzLm5leHRJbmRleC0tOwotCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4ICAtIDE7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQkvLyB0aGUgbGlzdCBpdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyB0aGUgbGlzdCBpdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQkvLyB0aGUgbGlzdCBpdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0SXRlcmF0b3Igd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dEl0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0SXRlcmF0b3Igd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCA8Y29kZT5oYXNQcmV2aW91cygpPC9jb2RlPgotCSAqIG9yIHRoZSBmaXJzdCBpdGVyYXRvciBpZiBhbGwgdGhlIGVsZW1lbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFByZXZpb3VzSXRlcmF0b3IoKSB7Ci0JCXRoaXMuY2hlY2tOZXh0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKCggISB0aGlzLm5leHRJdGVyYXRvci5oYXNQcmV2aW91cygpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNQcmV2aW91cygpKSB7Ci0JCQl0aGlzLm5leHRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiAnbmV4dEl0ZXJhdG9yJyBpcyBudWxsLCBsb2FkIGl0IHdpdGggdGhlIGZpcnN0IGl0ZXJhdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja05leHRJdGVyYXRvcigpIHsKLQkJaWYgKHRoaXMubmV4dEl0ZXJhdG9yID09IG51bGwpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwYTUxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciA8Y29kZT5JdGVyYXRvcjwvY29kZT4KLSAqIGFuZCByZW1vdmVzIHN1cHBvcnQgZm9yICNyZW1vdmUoKS4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbmVzdGVkSXRlcmF0b3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRoYXQKLQkgKiBkaXNhbGxvd3MgcmVtb3Zlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYXRvcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXRoaXMoYy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCBkaXNhbGxvdyByZW1vdmVzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXN0ZWRJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5lc3RlZEl0ZXJhdG9yID0gbmVzdGVkSXRlcmF0b3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRJdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYjI1OTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlMaXN0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIDxjb2RlPkxpc3RJdGVyYXRvcjwvY29kZT4gYW5kIHJlbW92ZXMgc3VwcG9ydCBmb3I6Ci0gKiAJI3JlbW92ZSgpCi0gKiAJI3NldChPYmplY3QpCi0gKiAJI2FkZChPYmplY3QpCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IG5lc3RlZExpc3RJdGVyYXRvcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMsIHNldHMsIGFuZCBhZGRzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYXRvciB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMsIHNldHMsIGFuZCBhZGRzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IG5lc3RlZExpc3RJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5lc3RlZExpc3RJdGVyYXRvciA9IG5lc3RlZExpc3RJdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5lc3RlZExpc3RJdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXN1bHRTZXRJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXN1bHRTZXRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGRhODQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVzdWx0U2V0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmVzdWx0U2V0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGEgPGNvZGU+UmVzdWx0U2V0PC9jb2RlPgotICogYW5kIHRyYW5zZm9ybXMgaXRzIHJvd3MgZm9yIGNsaWVudCBjb25zdW1wdGlvbi4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKLSAqIDxjb2RlPiNidWlsZE5leHQoUmVzdWx0U2V0KTwvY29kZT4gdG8gYnVpbGQgdGhlIGV4cGVjdGVkIG9iamVjdCBmcm9tCi0gKiB0aGUgY3VycmVudCByb3cgb2YgdGhlIHJlc3VsdCBzZXQuCi0gKiA8cD4KLSAqIFRvIHVzZSwgc3VwcGx5Ojx1bD4KLSAqIDxsaT4gYSA8Y29kZT5SZXN1bHRTZXQ8L2NvZGU+Ci0gKiA8bGk+IGFuIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IHRoYXQgY29udmVydHMgYSByb3cgaW4gdGhlIDxjb2RlPlJlc3VsdFNldDwvY29kZT4KLSAqIGludG8gdGhlIGRlc2lyZWQgb2JqZWN0Ci0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+UmVzdWx0U2V0SXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIDxjb2RlPmJ1aWxkTmV4dChSZXN1bHRTZXQpPC9jb2RlPiBtZXRob2QpCi0gKiA8L3VsPgotICogPHA+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHRTZXRJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIFJlc3VsdFNldCByZXN1bHRTZXQ7Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyPEU+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBFIG5leHQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIHJlc3VsdCBzZXQgdGhhdCByZXR1cm5zCi0JICogdGhlIG9iamVjdHMgcHJvZHVjZWQgYnkgdGhlIHNwZWNpZmllZCBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBSZXN1bHRTZXRJdGVyYXRvcihSZXN1bHRTZXQgcmVzdWx0U2V0LCBBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZXN1bHRTZXQgPSByZXN1bHRTZXQ7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXRoaXMuZG9uZSA9IGZhbHNlOwotCQl0aGlzLm5leHQgPSB0aGlzLmJ1aWxkTmV4dCgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIHJlc3VsdCBzZXQgdGhhdCByZXR1cm5zCi0JICogdGhlIGZpcnN0IG9iamVjdCBpbiBlYWNoIHJvdyBvZiB0aGUgcmVzdWx0IHNldC4KLQkgKi8KLQlwdWJsaWMgUmVzdWx0U2V0SXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCkgewotCQl0aGlzKHJlc3VsdFNldCwgQWRhcHRlci5EZWZhdWx0LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBuZXh0IG9iamVjdCBmb3IgdGhlIGl0ZXJhdG9yIHRvIHJldHVybi4KLQkgKiBDbG9zZSB0aGUgcmVzdWx0IHNldCB3aGVuIHdlIHJlYWNoIHRoZSBlbmQuCi0JICovCi0JcHJpdmF0ZSBFIGJ1aWxkTmV4dCgpIHsKLQkJdHJ5IHsKLQkJCWlmICh0aGlzLnJlc3VsdFNldC5uZXh0KCkpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE5leHQodGhpcy5yZXN1bHRTZXQpOwotCQkJfQotCQkJdGhpcy5yZXN1bHRTZXQuY2xvc2UoKTsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCByZXR1cm4gdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgY3VycmVudCByb3cKLQkgKiBvZiB0aGUgcmVzdWx0IHNldC4gQW55IDxjb2RlPlNRTEV4Y2VwdGlvbjwvY29kZT5zIHdpbGwKLQkgKiBiZSBjYXVnaHQgYW5kIHdyYXBwZWQgaW4gYSA8Y29kZT5SdW50aW1lRXhjZXB0aW9uPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgRSBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5idWlsZE5leHQocnMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgdGVtcCA9IHRoaXMubmV4dDsKLQkJdGhpcy5uZXh0ID0gdGhpcy5idWlsZE5leHQoKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnJlc3VsdFNldCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IDxjb2RlPlJlc3VsdFNldEl0ZXJhdG9yPC9jb2RlPiB0byBjb252ZXJ0IGEKLQkgKiA8Y29kZT5SZXN1bHRTZXQ8L2NvZGU+J3MgY3VycmVudCByb3cgaW50byB0aGUgbmV4dCBvYmplY3QKLQkgKiB0byBiZSByZXR1cm5lZCBieSB0aGUgPGNvZGU+SXRlcmF0b3I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhbiBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzdWx0IHNldCdzCi0JCSAqICJjdXJyZW50IiByb3cuIEFueSA8Y29kZT5TUUxFeGNlcHRpb248L2NvZGU+cyB3aWxsCi0JCSAqIGJlIGNhdWdodCBhbmQgd3JhcHBlZCBpbiBhIDxjb2RlPlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+LgotCQkgKiBAc2VlIGphdmEuc3FsLlJlc3VsdFNldAotCQkgKi8KLQkJVCBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwotCi0KLQkJZmluYWwgY2xhc3MgRGVmYXVsdDxTPiBpbXBsZW1lbnRzIEFkYXB0ZXI8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIEFkYXB0ZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBBZGFwdGVyPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gcmV0dXJuIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIGN1cnJlbnQgcm93IG9mIHRoZSByZXN1bHQgc2V0Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBTIGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJCS8vIHJlc3VsdCBzZXQgY29sdW1ucyBhcmUgaW5kZXhlZCBzdGFydGluZyB3aXRoIDEKLQkJCQlyZXR1cm4gKFMpIHJzLmdldE9iamVjdCgxKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlJlc3VsdFNldEl0ZXJhdG9yLkFkYXB0ZXIuRGVmYXVsdCI7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZmQ5ZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudEl0ZXJhdG9yPC9jb2RlPiBob2xkcyBhIHNpbmdsZSBlbGVtZW50Ci0gKiBhbmQgcmV0dXJucyBpdCB3aXRoIHRoZSBmaXJzdCBjYWxsIHRvIDxjb2RlPm5leHQoKTwvY29kZT4sIGF0Ci0gKiB3aGljaCBwb2ludCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gYW55IHN1YnNlcXVlbnQKLSAqIGNhbGwgdG8gPGNvZGU+aGFzTmV4dCgpPC9jb2RlPi4KLSAqIDxwPgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50SXRlcmF0b3I8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0gKiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gcmV0dXJuZWQgYnk6Ci0gKiAJPGNvZGU+amF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbihlbGVtZW50KS5pdGVyYXRvcigpPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRSBlbGVtZW50OwotCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNwZWNpZmllZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoRSBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuZG9uZSA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuZG9uZSA9IHRydWU7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5Y2I3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8L2NvZGU+IGhvbGRzIGEgc2luZ2xlIGVsZW1lbnQKLSAqIGFuZCByZXR1cm5zIGl0IHdpdGggdGhlIGZpcnN0IGNhbGwgdG8gPGNvZGU+bmV4dCgpPC9jb2RlPiwgYXQKLSAqIHdoaWNoIHBvaW50IGl0IHdpbGwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBhbnkgc3Vic2VxdWVudAotICogY2FsbCB0byA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+LiBMaWtld2lzZSwgaXQgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gKiB0byBhIGNhbGwgdG8gPGNvZGU+aGFzUHJldmlvdXMoKTwvY29kZT4gdW50aWwgYSBjYWxsIHRvIDxjb2RlPm5leHQoKTwvY29kZT4sCi0gKiBhdCB3aGljaCBwb2ludCBhIGNhbGwgdG8gPGNvZGU+cHJldmlvdXMoKTwvY29kZT4gd2lsbCByZXR1cm4gdGhlCi0gKiBzaW5nbGUgZWxlbWVudC4KLSAqIDxwPgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIHRoZQotICogPGNvZGU+SXRlcmF0b3I8L2NvZGU+IHJldHVybmVkIGJ5OgotICogCTxjb2RlPmphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVsZW1lbnQpLmxpc3RJdGVyYXRvcigpPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBFIGVsZW1lbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc05leHQ7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3IgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNwZWNpZmllZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKEUgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmhhc05leHQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLmhhc05leHQ7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuaGFzTmV4dCkgewotCQkJdGhpcy5oYXNOZXh0ID0gZmFsc2U7Ci0JCQlyZXR1cm4gdGhpcy5lbGVtZW50OwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmhhc05leHQgPyAwIDogMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNOZXh0OwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQlpZiAodGhpcy5oYXNOZXh0KSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuaGFzTmV4dCA9IHRydWU7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5oYXNOZXh0ID8gLTEgOiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTcwZDI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci0KLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIgPGNvZGU+SXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgdHJhbnNmb3JtcyBpdHMgcmVzdWx0cyBmb3IgY2xpZW50IGNvbnN1bXB0aW9uLiBUbyB1c2UsIHN1cHBseSBhIAotICogPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIDxjb2RlPnRyYW5zZm9ybShPYmplY3QpPC9jb2RlPiBtZXRob2QuCi0gKiBPYmplY3RzIG9mIHR5cGUgRTEgYXJlIHRyYW5zZm9ybWVkIGludG8gb2JqZWN0cyBvZiB0eXBlIEUyOwotICogaS5lLiB0aGUgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgRTIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEUxLCBFMj4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEUyPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEUxPiBuZXN0ZWRJdGVyYXRvcjsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPnRyYW5zZm9ybShPYmplY3QpPC9jb2RlPiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEgPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJdGhpcyhuZXN0ZWRJdGVyYXRvciwgVHJhbnNmb3JtZXIuRGlzYWJsZWQuPEUxLCBFMj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IG5lc3RlZEl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5lc3RlZEl0ZXJhdG9yID0gbmVzdGVkSXRlcmF0b3I7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRTIgbmV4dCgpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG5lc3RlZCBpdGVyYXRvciBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLm5lc3RlZEl0ZXJhdG9yLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXRoaXMubmVzdGVkSXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtKEUxIG5leHQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmVzdGVkSXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODdmYzExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgdHJhbnNmb3JtcyBpdHMgcmVzdWx0cyBmb3IgY2xpZW50IGNvbnN1bXB0aW9uLiBUbyB1c2UsIHN1cHBseSBhIAotICogPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIDxjb2RlPnRyYW5zZm9ybShPYmplY3QpPC9jb2RlPiBtZXRob2QuCi0gKiAKLSAqIFRoZSBtZXRob2RzIDxjb2RlPnNldChPYmplY3QpPC9jb2RlPiBhbmQgPGNvZGU+YWRkKE9iamVjdCk8L2NvZGU+Ci0gKiBhcmUgbGVmdCB1bnN1cHBvcnRlZCBpbiB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8RTEsIEUyPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEUyPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmVzdGVkSXRlcmF0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgYSBkaXNhYmxlZCB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiA8Y29kZT50cmFuc2Zvcm0oT2JqZWN0KTwvY29kZT4gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJdGhpcyhuZXN0ZWRJdGVyYXRvciwgVHJhbnNmb3JtZXIuRGlzYWJsZWQuPEUxLCBFMj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubmVzdGVkSXRlcmF0b3IgPSBuZXN0ZWRJdGVyYXRvcjsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubmVzdGVkSXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFMiBuZXh0KCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbmVzdGVkIGl0ZXJhdG9yIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMubmVzdGVkSXRlcmF0b3IubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFMiBwcmV2aW91cygpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG5lc3RlZCBpdGVyYXRvciBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLm5lc3RlZEl0ZXJhdG9yLnByZXZpb3VzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRJdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUyIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUyIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXRoaXMubmVzdGVkSXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtKEUxIG5leHQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmVzdGVkSXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMDUwOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlRyZWVJdGVyYXRvcjwvY29kZT4gc2ltcGxpZmllcyB0aGUgdHJhdmVyc2FsIG9mIGEKLSAqIHRyZWUgb2Ygb2JqZWN0cywgd2hlcmUgdGhlIG9iamVjdHMnIHByb3RvY29sKHMpIHByb3ZpZGVzCi0gKiBhIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotICogbm9kZSBidXQgZG9lcyBub3QgcHJvdmlkZSBhIG1ldGhvZCBmb3IgZ2V0dGluZyBhbGwgdGhlCi0gKiBkZXNjZW5kYW50cyAoY2hpbGRyZW4sIGdyYW5kY2hpbGRyZW4sIGV0Yy4pIG9mIHRoZSBnaXZlbiBub2RlLgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGVpdGhlciB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSB0cmVlIG9yLCBpZiB0aGUgdHJlZSBoYXMKLSAqIG11bHRpcGxlIHJvb3RzLCBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gb3ZlciB0aGUgc2V0IG9mIHJvb3RzCi0gKiA8bGk+IGEgPGNvZGU+TWlkd2lmZTwvY29kZT4gdGhhdCBkZWxpdmVycyB0aGUgY2hpbGRyZW4KLSAqIG9mIGVhY2ggY2hpbGQKLSAqIChhbHRlcm5hdGl2ZWx5LCBzdWJjbGFzcyA8Y29kZT5UcmVlSXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIDxjb2RlPmNoaWxkcmVuKE9iamVjdCk8L2NvZGU+IG1ldGhvZCkKLSAqIDwvdWw+Ci0gKiA8cD4KLSAqLwotcHVibGljIGNsYXNzIFRyZWVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBmaW5hbCBNaWR3aWZlPEU+IG1pZHdpZmU7Ci0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY3VycmVudEl0ZXJhdG9yOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBtaWR3aWZlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPmNoaWxkcmVuKE9iamVjdCk8L2NvZGU+IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSA8Y29kZT5NaWR3aWZlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiByb290cykgewotCQl0aGlzKHJvb3RzLCBNaWR3aWZlLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBhIGRpc2FibGVkIG1pZHdpZmUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+Y2hpbGRyZW4oT2JqZWN0KTwvY29kZT4gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIDxjb2RlPk1pZHdpZmU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoRSByb290KSB7Ci0JCXRoaXMocm9vdCwgTWlkd2lmZS5EaXNhYmxlZC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QKLQkgKiBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEUgcm9vdCwgTWlkd2lmZTxFPiBtaWR3aWZlKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxFPihyb290KSwgbWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCByb290cwotCSAqIGFuZCBtaWR3aWZlLgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IHJvb3RzLCBNaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSByb290czsKLQkJLy8gdXNlIGEgTGlua2VkTGlzdCBzaW5jZSB3ZSB3aWxsIGJlIHB1bGxpbmcgb2ZmIHRoZSBmcm9udCBhbmQgYWRkaW5nIHRvIHRoZSBlbmQKLQkJdGhpcy5pdGVyYXRvcnMgPSBuZXcgTGlua2VkTGlzdDxJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KCk7Ci0JCXRoaXMubWlkd2lmZSA9IG1pZHdpZmU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJaWYgKHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IgOiB0aGlzLml0ZXJhdG9ycykgewotCQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXh0SW50ZXJuYWwoKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gc3RyZWFtID0gdGhpcy5pdGVyYXRvcnMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEludGVybmFsKCk7Ci0JfQotCi0JLyoqCi0JICogRmV0Y2ggdGhlIGNoaWxkcmVuIG9mIHRoZSBuZXh0IG5vZGUgYmVmb3JlIHJldHVybmluZyBpdC4KLQkgKi8KLQlwcml2YXRlIEUgbmV4dEludGVybmFsKCkgewotCQlFIG5leHQgPSB0aGlzLmN1cnJlbnRJdGVyYXRvci5uZXh0KCk7Ci0JCXRoaXMuaXRlcmF0b3JzLmFkZCh0aGlzLmNoaWxkcmVuKG5leHQpKTsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aGlzLmN1cnJlbnRJdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGNoaWxkcmVuKEUgbmV4dCkgewotCQlyZXR1cm4gdGhpcy5taWR3aWZlLmNoaWxkcmVuKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY3VycmVudEl0ZXJhdG9yKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZWQgYnkgPGNvZGU+VHJlZUl0ZXJhdG9yPC9jb2RlPiB0byByZXRyaWV2ZQotCSAqIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgYSBub2RlIGluIHRoZSB0cmVlLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTWlkd2lmZTxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCQkgKi8KLQkJSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGNoaWxkcmVuKFQgbyk7Ci0KLQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTWlkd2lmZTxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTWlkd2lmZSBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pZHdpZmU8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZXR1cm4gbm8gbmVpZ2hib3JzCi0JCQlwdWJsaWMgSXRlcmF0b3I8Uz4gY2hpbGRyZW4oUyBuZXh0KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlRyZWVJdGVyYXRvci5NaWR3aWZlLk51bGwiOwotCQkJfQotCQl9Ci0KLQkJLyoqIFRoZSBtaWR3aWZlIHVzZWQgd2hlbiB0aGUgI2NoaWxkcmVuKE9iamVjdCkgbWV0aG9kIGlzIG92ZXJyaWRkZW4uICovCi0JCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+IGltcGxlbWVudHMgTWlkd2lmZTxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTWlkd2lmZSBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNaWR3aWZlPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQkJcHVibGljIEl0ZXJhdG9yPFM+IGNoaWxkcmVuKFMgbmV4dCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyAgLy8gVHJlZUl0ZXJhdG9yLmNoaWxkcmVuKE9iamVjdCkgd2FzIG5vdCBpbXBsZW1lbnRlZAotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVHJlZUl0ZXJhdG9yLk1pZHdpZmUuRGlzYWJsZWQiOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWE0ZDlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBNb2RlbCBwcm90b2NvbC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBNb2RlbCwgU2VyaWFsaXphYmxlIHsKLQkvKioKLQkgKiBEZWxlZ2F0ZSBzdGF0ZS9wcm9wZXJ0eS9jb2xsZWN0aW9uL2xpc3QvdHJlZSBjaGFuZ2Ugc3VwcG9ydCB0byB0aGlzCi0JICogaGVscGVyIG9iamVjdC4gVGhlIGNoYW5nZSBzdXBwb3J0IG9iamVjdCBpcyAibGF6eS1pbml0aWFsaXplZCIuCi0JICovCi0JcHJpdmF0ZSBDaGFuZ2VTdXBwb3J0IGNoYW5nZVN1cHBvcnQ7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICogVGhpcyB3aWxsIGNhbGwgI2luaXRpYWxpemUoKSBvbiB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhY2Nlc3NvciB3aWxsIGJ1aWxkIHRoZSBjaGFuZ2Ugc3VwcG9ydCB3aGVuIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQ2hhbmdlU3VwcG9ydCBnZXRDaGFuZ2VTdXBwb3J0KCkgewotCQlpZiAodGhpcy5jaGFuZ2VTdXBwb3J0ID09IG51bGwpIHsKLQkJCXRoaXMuY2hhbmdlU3VwcG9ydCA9IHRoaXMuYnVpbGRDaGFuZ2VTdXBwb3J0KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hhbmdlU3VwcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvdyBzdWJjbGFzc2VzIHRvIHR3ZWFrIHRoZSBjaGFuZ2Ugc3VwcG9ydCB1c2VkLgotCSAqLwotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VTdXBwb3J0KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbnVsbCwgbmV3VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGFkZGVkSXRlbXMpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcykgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlQ29sbGVjdGlvbkNoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNhZGQoT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtVG9Db2xsZWN0aW9uKEUgaXRlbSwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24uYWRkKGl0ZW0pKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGl0ZW0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI2FkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oRVtdIGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbihuZXcgQXJyYXlJdGVyYXRvcjxFPihpdGVtcyksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI2FkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlDb2xsZWN0aW9uPEU+IGFkZGVkSXRlbXMgPSBudWxsOwotCQl3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlFIGl0ZW0gPSBpdGVtcy5uZXh0KCk7Ci0JCQlpZiAoY29sbGVjdGlvbi5hZGQoaXRlbSkpIHsKLQkJCQlpZiAoYWRkZWRJdGVtcyA9PSBudWxsKSB7Ci0JCQkJCWFkZGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0JCQkJfQotCQkJCWFkZGVkSXRlbXMuYWRkKGl0ZW0pOwotCQkJfQotCQl9Ci0JCWlmIChhZGRlZEl0ZW1zICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jcmVtb3ZlKE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oT2JqZWN0IGl0ZW0sIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChjb2xsZWN0aW9uLnJlbW92ZShpdGVtKSkgewotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoY29sbGVjdGlvbk5hbWUsIGl0ZW0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JlbW92ZUFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKE9iamVjdFtdIGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oaXRlbXMpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jcmVtb3ZlQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oSXRlcmFibGU8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JlbW92ZUFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKEl0ZXJhdG9yPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlDb2xsZWN0aW9uPD8+IGl0ZW1zMiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZW1zKTsKLQkJaXRlbXMyLnJldGFpbkFsbChjb2xsZWN0aW9uKTsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gY29sbGVjdGlvbi5yZW1vdmVBbGwoaXRlbXMyKTsKLQotCQlpZiAoICEgaXRlbXMyLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCBpdGVtczIpOwotCQl9Ci0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZXRhaW5BbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oT2JqZWN0W10gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oaXRlbXMpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihJdGVyYWJsZTw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZXRhaW5BbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCUNvbGxlY3Rpb248Pz4gaXRlbXMyID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlbXMpOwotCQlDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGNvbGxlY3Rpb24pOwotCQlyZW1vdmVkSXRlbXMucmVtb3ZlQWxsKGl0ZW1zMik7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGNvbGxlY3Rpb24ucmV0YWluQWxsKGl0ZW1zMik7Ci0KLQkJaWYgKCAhIHJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJfQotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQ2xlYXIgdGhlIGVudGlyZSBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jY2xlYXIoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNsZWFyQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGNvbGxlY3Rpb25OYW1lKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFN5bmNocm9uaXplIHRoZSBjb2xsZWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuZXcgY29sbGVjdGlvbiwKLQkgKiBtYWtpbmcgYSBtaW5pbXVtIG51bWJlciBvZiByZW1vdmVzIGFuZCBhZGRzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbihDb2xsZWN0aW9uPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChuZXdDb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCUNvbGxlY3Rpb248RT4gcmVtb3ZlSXRlbXMgPSBuZXcgSGFzaEJhZzxFPihjb2xsZWN0aW9uKTsKLQkJcmVtb3ZlSXRlbXMucmVtb3ZlQWxsKG5ld0NvbGxlY3Rpb24pOwotCQljaGFuZ2VkIHw9IHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmVJdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCi0JCUNvbGxlY3Rpb248RT4gYWRkSXRlbXMgPSBuZXcgSGFzaEJhZzxFPihuZXdDb2xsZWN0aW9uKTsKLQkJYWRkSXRlbXMucmVtb3ZlQWxsKGNvbGxlY3Rpb24pOwotCQljaGFuZ2VkIHw9IHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oYWRkSXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogU3luY2hyb25pemUgdGhlIGNvbGxlY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBjb2xsZWN0aW9uLAotCSAqIG1ha2luZyBhIG1pbmltdW0gbnVtYmVyIG9mIHJlbW92ZXMgYW5kIGFkZHMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKEl0ZXJhdG9yPEU+IG5ld0l0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZUNvbGxlY3Rpb24oQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmV3SXRlbXMpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IHJlbW92ZWRJdGVtcykgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbVJlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IHJlcGxhY2VkSXRlbSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgPEU+IHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8PyBleHRlbmRzIEU+IG5ld0l0ZW1zLCBMaXN0PEU+IHJlcGxhY2VkSXRlbXMpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgcmVwbGFjZWRJdGVtcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbU1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1Nb3ZlZChsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgPEU+IHZvaWQgZmlyZUl0ZW1zTW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNNb3ZlZChsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNNb3ZlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUxpc3RDbGVhcmVkKFN0cmluZyBsaXN0TmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTGlzdENsZWFyZWQobGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVMaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUxpc3RDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTGlzdENoYW5nZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVMaXN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTGlzdENoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNhZGQoaW50LCBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIDxFPiB2b2lkIGFkZEl0ZW1Ub0xpc3QoaW50IGluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWxpc3QuYWRkKGluZGV4LCBpdGVtKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZChPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1Ub0xpc3QoRSBpdGVtLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5hZGQoaXRlbSkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChsaXN0TmFtZSwgbGlzdC5zaXplKCkgLSAxLCBpdGVtKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZEFsbChpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIG5ldyBBcnJheUl0ZXJhdG9yPEU+KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkQWxsKGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdChpbmRleCwgaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkQWxsKGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlMaXN0PEU+IGl0ZW1zMiA9IENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZW1zKTsKLQkJaWYgKGxpc3QuYWRkQWxsKGluZGV4LCBpdGVtczIpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbXMyKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIGVuZCBvZiB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0KG5ldyBBcnJheUl0ZXJhdG9yPEU+KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgZW5kIG9mIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3QoaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgZW5kIG9mIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJTGlzdDxFPiBpdGVtczIgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVtcyk7Ci0JCWludCBpbmRleCA9IGxpc3Quc2l6ZSgpOwotCQlpZiAobGlzdC5hZGRBbGwoaXRlbXMyKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zMik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7ICAvLyBlbXB0eSBsaXN0IG9mIGl0ZW1zIGFkZGVkCi0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW0gZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBpdGVtLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmVtb3ZlKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IEUgcmVtb3ZlSXRlbUZyb21MaXN0KGludCBpbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJRSBpdGVtID0gbGlzdC5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW0pOwotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbSBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZW1vdmVkIGl0ZW0uCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmUoT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1Gcm9tTGlzdChPYmplY3QgaXRlbSwgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKGl0ZW0pOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlsaXN0LnJlbW92ZShpbmRleCk7Ci0JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZW1vdmVkIGl0ZW1zLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmVtb3ZlKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gcmVtb3ZlSXRlbXNGcm9tTGlzdChpbnQgaW5kZXgsIGludCBsZW5ndGgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCUxpc3Q8RT4gc3ViTGlzdCA9IGxpc3Quc3ViTGlzdChpbmRleCwgaW5kZXggKyBsZW5ndGgpOwotCQlMaXN0PEU+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oc3ViTGlzdCk7Ci0JCXN1Ykxpc3QuY2xlYXIoKTsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJcmV0dXJuIHJlbW92ZWRJdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBpdGVtcy4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JlbW92ZUFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KE9iamVjdFtdIGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgaXRlbXMuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYWJsZTw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcy5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgaXRlbXMuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCXdoaWxlIChpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCWNoYW5nZWQgfD0gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaXRlbXMubmV4dCgpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChPYmplY3RbXSBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkxpc3QobmV3IEFycmF5SXRlcmF0b3I8T2JqZWN0PihpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0YWluIHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmV0YWluQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5MaXN0KEl0ZXJhYmxlPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luTGlzdChpdGVtcy5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJQ29sbGVjdGlvbjw/PiBpdGVtczIgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVtcyk7Ci0JCUNvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obGlzdCk7Ci0JCXJlbW92ZWRJdGVtcy5yZW1vdmVBbGwoaXRlbXMyKTsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChyZW1vdmVkSXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgaXRlbSBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVwbGFjZWQgaXRlbS4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3NldChpbnQsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IEUgc2V0SXRlbUluTGlzdChpbnQgaW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJRSByZXBsYWNlZEl0ZW0gPSBsaXN0LnNldChpbmRleCwgaXRlbSk7Ci0JCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW0sIHJlcGxhY2VkSXRlbSk7Ci0JCXJldHVybiByZXBsYWNlZEl0ZW07Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJlcGxhY2UgdGhlIHNwZWNpZmllZCBpdGVtIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZXBsYWNlZCBpdGVtLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3Qjc2V0KGludCwgT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCA8RT4gRSByZXBsYWNlSXRlbUluTGlzdChFIG9sZEl0ZW0sIEUgbmV3SXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2V0SXRlbUluTGlzdChsaXN0LmluZGV4T2Yob2xkSXRlbSksIG5ld0l0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlcGxhY2VkIGl0ZW1zLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3Qjc2V0KGludCwgT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCA8RT4gTGlzdDxFPiBzZXRJdGVtc0luTGlzdChpbnQgaW5kZXgsIEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2V0SXRlbXNJbkxpc3QoaW5kZXgsIEFycmF5cy5hc0xpc3QoaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZXBsYWNlZCBpdGVtcy4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3NldChpbnQsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3QoaW50IGluZGV4LCBMaXN0PD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJTGlzdDxFPiBzdWJMaXN0ID0gbGlzdC5zdWJMaXN0KGluZGV4LCBpbmRleCArIGl0ZW1zLnNpemUoKSk7Ci0JCUxpc3Q8RT4gcmVwbGFjZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oc3ViTGlzdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCXN1Ykxpc3Quc2V0KGksIGl0ZW1zLmdldChpKSk7Ci0JCX0KLQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zLCByZXBsYWNlZEl0ZW1zKTsKLQkJcmV0dXJuIHJlcGxhY2VkSXRlbXM7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIE1vdmUgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlCi0JICogc3BlY2lmaWVkIHRhcmdldCBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJvdGVjdGVkIDxFPiB2b2lkIG1vdmVJdGVtc0luTGlzdChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQl0aGlzLmZpcmVJdGVtc01vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIE1vdmUgYW4gaXRlbSBpbiB0aGUgc3BlY2lmaWVkIGxpc3QgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4LgotCSAqLwotCXByb3RlY3RlZCA8RT4gdm9pZCBtb3ZlSXRlbUluTGlzdChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5maXJlSXRlbU1vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBDbGVhciB0aGUgZW50aXJlIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNjbGVhcigpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xlYXJMaXN0KExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWxpc3QuY2xlYXIoKTsKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQobGlzdE5hbWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVOb2RlQWRkZWQoU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlQWRkZWQodHJlZU5hbWUsIHBhdGgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVOb2RlQWRkZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlQWRkZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVOb2RlUmVtb3ZlZChTdHJpbmcgdHJlZU5hbWUsIE9iamVjdFtdIHBhdGgpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZU5vZGVSZW1vdmVkKHRyZWVOYW1lLCBwYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTm9kZVJlbW92ZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFN0cmluZyB0cmVlTmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlVHJlZUNsZWFyZWQodHJlZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVUcmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlVHJlZUNoYW5nZWQoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVUcmVlQ2hhbmdlZCh0cmVlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFN0cmluZyB0cmVlTmFtZSwgT2JqZWN0W10gcGF0aCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlVHJlZUNoYW5nZWQodHJlZU5hbWUsIHBhdGgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHN0YXRlIGNoYW5nZSBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBubyBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGxpc3QgY2hhbmdlIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyBsaXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGxpc3QgY2hhbmdlIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyBsaXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHRyZWUgY2hhbmdlIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyB0cmVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHRyZWUgY2hhbmdlIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyB0cmVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vVHJlZUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgdHJlZU5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdmFsdWVzIGFyZSBlcXVhbCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVsbCBjaGVja3MuCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBETyBOT1QgdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gZmlyZSBhIGNoYW5nZSBub3RpZmljYXRpb24sCi0JICogQ2hhbmdlU3VwcG9ydCBhbHJlYWR5IGRvZXMgdGhhdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB2YWx1ZXNBcmVFcXVhbChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS52YWx1ZXNBcmVFcXVhbCh2YWx1ZTEsIHZhbHVlMik7Ci0JfQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gdGhpcy52YWx1ZXNBcmVFcXVhbChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudWxsIGNoZWNrcy4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gYXR0cmlidXRlIHZhbHVlIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIERPIE5PVCB1c2UgdGhpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBmaXJlIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiwKLQkgKiBDaGFuZ2VTdXBwb3J0IGFscmVhZHkgZG9lcyB0aGF0LgotCSAqIAotCSAqIEZvciBleGFtcGxlLCBhZnRlciBmaXJpbmcgdGhlIGNoYW5nZSBub3RpZmljYXRpb24sIHlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kCi0JICogdG8gZGVjaWRlIGlmIHNvbWUgb3RoZXIsIHJlbGF0ZWQsIHBpZWNlIG9mIHN0YXRlIG5lZWRzIHRvIGJlIHN5bmNocm9uaXplZAotCSAqIHdpdGggdGhlIHN0YXRlIHRoYXQganVzdCBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHZhbHVlc0FyZURpZmZlcmVudChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS52YWx1ZXNBcmVEaWZmZXJlbnQodmFsdWUxLCB2YWx1ZTIpOwotCX0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWx0aG91Z2ggY2xvbmluZyBtb2RlbHMgaXMgdXN1YWxseSBub3QgYSBHb29kIElkZWEsCi0JICogd2Ugc2hvdWxkIGF0IGxlYXN0IHN1cHBvcnQgaXQgcHJvcGVybHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0TW9kZWwgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotCQlBYnN0cmFjdE1vZGVsIGNsb25lID0gKEFic3RyYWN0TW9kZWwpIHN1cGVyLmNsb25lKCk7Ci0JCWNsb25lLnBvc3RDbG9uZSgpOwotCQlyZXR1cm4gY2xvbmU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBhbnkgcG9zdC1jbG9uZSBwcm9jZXNzaW5nIG5lY2Vzc2FyeSB0bwotCSAqIHN1Y2Nlc3NmdWxseSBkaXNjb25uZWN0IHRoZSBjbG9uZSBmcm9tIHRoZSBvcmlnaW5hbC4KLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiB0aGUgY2xvbmUsIHRoZSBjbG9uZQotCSAqIGlzIGEgInNoYWxsb3ciIGNvcHkgb2YgdGhlIG9yaWdpbmFsIChpLmUuIHRoZSBjbG9uZQotCSAqIHNoYXJlcyBhbGwgaXRzIGluc3RhbmNlIHZhcmlhYmxlcyB3aXRoIHRoZSBvcmlnaW5hbCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9zdENsb25lKCkgewotCQkvLyBjbGVhciBvdXQgY2hhbmdlIHN1cHBvcnQgLSBtb2RlbHMgZG8gbm90IHNoYXJlIGxpc3RlbmVycwotCQl0aGlzLmNoYW5nZVN1cHBvcnQgPSBudWxsOwotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5wb3N0Q2xvbmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuYnVpbGRTaW1wbGVUb1N0cmluZ09uKHRoaXMsIHNiKTsKLQkJc2IuYXBwZW5kKCIgKCIpOwotCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIG1ha2UgdGhpcyBwdWJsaWMgc28gb25lIG1vZGVsIGNhbiBjYWxsIGEgbmVzdGVkIG1vZGVsJ3MKLQkgKiAjdG9TdHJpbmcoU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCS8vIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdG8gZG8gc29tZXRoaW5nIGEgYml0IG1vcmUgaGVscGZ1bAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL0NhbGxiYWNrQ2hhbmdlU3VwcG9ydC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL0NhbGxiYWNrQ2hhbmdlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzZmMTdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9DYWxsYmFja0NoYW5nZVN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBUaGlzIGNoYW5nZSBzdXBwb3J0IGNsYXNzIHdpbGwgbm90aWZ5IHRoZSBzb3VyY2Ugd2hlbiBvbmUgb2YgdGhlIHNvdXJjZSdzCi0gKiBhc3BlY3RzIGhhcyBjaGFuZ2VkLgotICovCi1wdWJsaWMgY2xhc3MgQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0IGV4dGVuZHMgQ2hhbmdlU3VwcG9ydCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwdWJsaWMgQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0KFNvdXJjZSBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU291cmNlIHNvdXJjZSgpIHsKLQkJcmV0dXJuIChTb3VyY2UpIHRoaXMuc291cmNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IENoaWxkKHRoaXMuc291cmNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNvdXJjZUNoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJc3VwZXIuc291cmNlQ2hhbmdlZChhc3BlY3ROYW1lKTsKLQkJdGhpcy5zb3VyY2UoKS5hc3BlY3RDaGFuZ2VkKGFzcGVjdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGlsZCBjaGFuZyBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBhc3BlY3Qtc3BlY2lmaWMgY2hhbmdlIHN1cHBvcnQgY2xhc3MgZG9lcyBub3QgbmVlZCB0bwotCSAqIG5vdGlmeSB0aGUgc291cmNlIG5vZGUgb2YgY2hhbmdlcyAodGhlIHBhcmVudCB3aWxsIHRha2UgY2FyZSBvZiB0aGF0KTsKLQkgKiBub3IgZG9lcyBpdCBuZWVkIHRvIGJ1aWxkICJncmFuZGNoaWxkcmVuIiBjaGFuZ2Ugc3VwcG9ydCBvYmplY3RzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ2hpbGQgZXh0ZW5kcyBDaGFuZ2VTdXBwb3J0IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIENoaWxkKFNvdXJjZSBzb3VyY2UpIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU291cmNlIHNvdXJjZSgpIHsKLQkJCXJldHVybiAoU291cmNlKSB0aGlzLnNvdXJjZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoaWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCS8vIHRoZXJlIGFyZSBubyBncmFuZGNoaWxkcmVuCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHNvdXJjZSBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGNhbGxiYWNrIGNoYW5nZSBzdXBwb3J0IHNvdXJjZSBtdXN0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBzbyBpdAotCSAqIGNhbiBiZSBub3RpZmllZCBvZiBhbnkgYXNwZWN0IGNoYW5nZXMuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBTb3VyY2UgZXh0ZW5kcyBNb2RlbCB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBzcGVjaWZpZWQgYXNwZWN0IGNoYW5nZWQuCi0JCSAqLwotCQl2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL0NoYW5nZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3NDhhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogU3VwcG9ydCBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBieSBpbXBsZW1lbnRvcnMgb2YgdGhlIE1vZGVsIGludGVyZmFjZS4KLSAqIEl0IHByb3ZpZGVzIGZvciBzdGF0ZSwgcHJvcGVydHksIGNvbGxlY3Rpb24sIGxpc3QsIGFuZCB0cmVlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvCi0gKiBsaXN0ZW5lcnMuCi0gKiAKLSAqIE5COiBUaGVyZSBpcyBsb3RzIG9mIGNvcHktbi1wYXN0ZSBjb2RlIGluIHRoaXMgY2xhc3MuIE5lYXJseSBhbGwgb2YgdGhpcyBkdXBsaWNhdGlvbgotICogaXMgYW4gZWZmb3J0IHRvIHByZXZlbnQgdGhlIHVubmVjZXNzYXJ5IGNyZWF0aW9uIG9mIG5ldyBvYmplY3RzICh0eXBpY2FsbHkgZXZlbnQKLSAqIG9iamVjdHMpLiBTaW5jZSBtYW55IGV2ZW50cyBhcmUgZmlyZWQgd2hlbiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLCB3ZSBwb3N0cG9uZQotICogdGhlIGNyZWF0aW9uIG9mIGV2ZW50IG9iamVjdHMgdW50aWwgd2Uga25vdyB3ZSBoYXZlIGludGVyZXN0ZWQgbGlzdGVuZXJzLgotICogTW9zdCBtZXRob2RzIGhhdmUgdGhlICJub24tZHVwbGljYXRlZCIgdmVyc2lvbiBvZiB0aGUgbWV0aG9kIGJvZHkgY29tbWVudGVkCi0gKiBvdXQgYXQgdGhlIHRvcCBvZiB0aGUgY3VycmVudCBtZXRob2QgYm9keS4KLSAqIFRoZSBob3BlIHdhcyB0aGF0IHRoaXMgY2xhc3Mgd291bGQgcHJvdmUgdG8gYmUgZmFpcmx5IHN0YXRpYyBhbmQgdGhlIGR1cGxpY2F0ZWQKLSAqIGNvZGUgd291bGQgbm90IHByb3ZlIG9uZXJvdXM7IGJ1dCB0aGF0IGhhcyBub3QgcHJvdmVuIHRvIGJlCi0gKiB0aGUgY2FzZSwgYXMgd2UgaGF2ZSBhZGRlZCBzdXBwb3J0IGZvciAic3RhdGUiIGNoYW5nZXMsICJkaXJ0eSIgbm90aWZpY2F0aW9uLAotICogYW5kIGN1c3RvbSAibm90aWZpZXJzIiwgd2l0aCBtb3JlIHRvIGNvbWUsIEknbSBzdXJlLi4uLiAgfmJqdgotICogCi0gKiBOQjI6IFRoaXMgY2xhc3Mgd2lsbCBjaGVjayB0byBzZWUgaWYsIGR1cmluZyB0aGUgZmlyaW5nIG9mIGV2ZW50cywgYSBsaXN0ZW5lcgotICogb24gdGhlIG9yaWdpbmFsLCBjbG9uZWQsIGxpc3Qgb2YgbGlzdGVuZXJzIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbWFzdGVyCi0gKiBsaXN0IG9mIGxpc3RlbmVycyAqYmVmb3JlKiBpdCBpcyBub3RpZmllZC4gSWYgdGhlIGxpc3RlbmVyIGhhcyBiZWVuIHJlbW92ZWQKLSAqICJjb25jdXJyZW50bHkiIGl0IHdpbGwgKm5vdCogYmUgbm90aWZpZWQuIChTZWUgdGhlIGNvZGUgdGhhdCB1c2VzIHRoZQotICogJ3N0aWxsTGlzdGVuaW5nJyBsb2NhbCBib29sZWFuIGZsYWcuKQotICogCi0gKiBOQjM6IEFueSBsaXN0ZW5lciB0aGF0IGlzIGFkZGVkIGR1cmluZyB0aGUgZmlyaW5nIG9mIGV2ZW50cyB3aWxsICpub3QqIGJlCi0gKiBhbHNvIG5vdGlmaWVkLgotICogCi0gKiBOQjQ6IFRoaXMgY2xhc3MgaXMgc2VyaWFsaXphYmxlLCBidXQgaXQgd2lsbCBvbmx5IHdyaXRlIG91dCBsaXN0ZW5lcnMgdGhhdAotICogYXJlIGFsc28gc2VyaWFsaXphYmxlIHdoaWxlIHNpbGVudGx5IGxlYXZpbmcgYmVoaW5kIGxpc3RlbmVycyB0aGF0IGFyZSBub3QuCi0gKiAKLSAqIFRPRE8gZmlyZSBhIHN0YXRlIGNoYW5nZSBldmVudCB3aXRoICpldmVyeSogY2hhbmdlPwotICogVE9ETyB1c2Ugb2JqZWN0cyAoSURzPykgaW5zdGVhZCBvZiBzdHJpbmdzIHRvIGlkZW50aWZ5IGFzcGVjdHM/Ci0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VTdXBwb3J0Ci0JaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLXsKLQotCS8qKiBUaGUgb2JqZWN0IHRvIGJlIHByb3ZpZGVkIGFzIHRoZSAic291cmNlIiBmb3IgYW55IGdlbmVyYXRlZCBldmVudHMuICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGVsIHNvdXJjZTsKLQotCS8qKiBBc3NvY2lhdGUgYSBsaXN0ZW5lciBjbGFzcyB0byBhIGNvbGxlY3Rpb24gb2YgImdlbmVyaWMiIGxpc3RlbmVycyBmb3IgdGhhdCBjbGFzcy4gKi8KLQl0cmFuc2llbnQgcHJpdmF0ZSBHZW5lcmljTGlzdGVuZXJMaXN0W10gZ2VuZXJpY0xpc3RlbmVycyA9IEVNUFRZX0dFTkVSSUNfTElTVEVORVJTOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBHZW5lcmljTGlzdGVuZXJMaXN0W10gRU1QVFlfR0VORVJJQ19MSVNURU5FUlMgPSBuZXcgR2VuZXJpY0xpc3RlbmVyTGlzdFswXTsKLQotCS8qKiBBc3NvY2lhdGUgYXNwZWN0IG5hbWVzIHRvIGNoaWxkIGNoYW5nZSBzdXBwb3J0IG9iamVjdHMuICovCi0JcHJpdmF0ZSBBc3BlY3RDaGlsZFtdIGFzcGVjdENoaWxkcmVuID0gRU1QVFlfQVNQRUNUX0NISUxEUkVOOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBc3BlY3RDaGlsZFtdIEVNUFRZX0FTUEVDVF9DSElMRFJFTiA9IG5ldyBBc3BlY3RDaGlsZFswXTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBzdXBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIHNvdXJjZSBvZiBjaGFuZ2UgZXZlbnRzLgotCSAqIFRoZSBzb3VyY2UgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIENoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhICJnZW5lcmljIiBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGV2ZW50cyBhcHByb3ByaWF0ZSB0byB0aGF0Ci0JICogbGlzdGVuZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFzcGVjdCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGV2ZW50LgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsJCS8vIGJldHRlciBzb29uZXIgdGhhbiBsYXRlcgotCQl9Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJR2VuZXJpY0xpc3RlbmVyTGlzdCBnbGwgPSB0aGlzLmdlbmVyaWNMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcyk7Ci0JCQlpZiAoZ2xsID09IG51bGwpIHsKLQkJCQl0aGlzLmFkZEdlbmVyaWNMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQkJfSBlbHNlIHsKLQkJCQlnbGwuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZ2VuZXJpYyIgbGlzdGVuZXIgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcy4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgbGlzdCBpcyBub3QgcHJlc2VudC4KLQkgKi8KLQlwcm90ZWN0ZWQgR2VuZXJpY0xpc3RlbmVyTGlzdCBnZW5lcmljTGlzdGVuZXJMaXN0KENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcykgewotCQlmb3IgKEdlbmVyaWNMaXN0ZW5lckxpc3QgZ2xsIDogdGhpcy5nZW5lcmljTGlzdGVuZXJzKSB7Ci0JCQlpZiAoZ2xsLmxpc3RlbmVyQ2xhc3MgPT0gbGlzdGVuZXJDbGFzcykgewotCQkJCXJldHVybiBnbGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSAiZ2VuZXJpYyIgbGlzdGVuZXIgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcy4KLQkgKiBSZXR1cm4gdGhlIG5ld2x5LWJ1aWx0IGdlbmVyaWMgbGlzdGVuZXIgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gR2VuZXJpY0xpc3RlbmVyTGlzdCBhZGRHZW5lcmljTGlzdGVuZXJMaXN0KENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJR2VuZXJpY0xpc3RlbmVyTGlzdCBnbGwgPSBuZXcgR2VuZXJpY0xpc3RlbmVyTGlzdChsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JCXRoaXMuZ2VuZXJpY0xpc3RlbmVycyA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5nZW5lcmljTGlzdGVuZXJzLCBnbGwpOwotCQlyZXR1cm4gZ2xsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGV2ZW50cyBhcHByb3ByaWF0ZSB0byB0aGF0IGxpc3RlbmVyLAotCSAqIGFuZCBvbmx5IHRvIHRob3NlIGV2ZW50cyBjYXJyeWluZyB0aGUgYXNwZWN0IG5hbWUgc3BlY2lmaWVkLgotCSAqIFRoZSBhc3BlY3QgbmFtZSBjYW5ub3QgYmUgbnVsbCBhbmQgdGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXByb3RlY3RlZCA8VCBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKFN0cmluZyBhc3BlY3ROYW1lLCBDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCWlmICgoYXNwZWN0TmFtZSA9PSBudWxsKSB8fCAobGlzdGVuZXIgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwkJLy8gYmV0dGVyIHNvb25lciB0aGFuIGxhdGVyCi0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gdGhpcy5jaGlsZChhc3BlY3ROYW1lKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQgPSB0aGlzLmFkZENoaWxkKGFzcGVjdE5hbWUpOwotCQkJfQotCQkJY2hpbGQuYWRkTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGlsZCBjaGFuZ2Ugc3VwcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBhc3BlY3QgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYXNwZWN0IG5hbWUgaXMgbnVsbCBvciB0aGUgY2hpbGQgaXMgbm90IHByZXNlbnQuCi0JICovCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgY2hpbGQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJLy8gcHV0IGluIGEgbnVsbCBjaGVjayB0byBzaW1wbGlmeSBjYWxsaW5nIGNvZGUKLQkJaWYgKGFzcGVjdE5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZm9yIChBc3BlY3RDaGlsZCBhc3BlY3RDaGlsZCA6IHRoaXMuYXNwZWN0Q2hpbGRyZW4pIHsKLQkJCWlmIChhc3BlY3RDaGlsZC5hc3BlY3ROYW1lID09IGFzcGVjdE5hbWUpIHsKLQkJCQlyZXR1cm4gYXNwZWN0Q2hpbGQuY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBjaGlsZCBjaGFuZ2Ugc3VwcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBhc3BlY3QgbmFtZS4KLQkgKiBSZXR1cm4gdGhlIG5ld2x5LWJ1aWx0IGNoaWxkIGNoYW5nZSBzdXBwb3J0LgotCSAqLwotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGFkZENoaWxkKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSB0aGlzLmJ1aWxkQ2hpbGRDaGFuZ2VTdXBwb3J0KCk7Ci0JCXRoaXMuYXNwZWN0Q2hpbGRyZW4gPSBDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuYXNwZWN0Q2hpbGRyZW4sIG5ldyBBc3BlY3RDaGlsZChhc3BlY3ROYW1lLCBjaGlsZCkpOwotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIGNoaWxkIGNoYW5nZSBzdXBwb3J0IHRvIGhvbGQgYXNwZWN0LXNwZWNpZmljIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoaWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VTdXBwb3J0KHRoaXMuc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgImdlbmVyaWMiIGxpc3RlbmVyIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCBmb3IgYWxsIGV2ZW50cwotCSAqIGFwcHJvcHJpYXRlIHRvIHRoYXQgbGlzdGVuZXIuCi0JICovCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcywgVCBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUdlbmVyaWNMaXN0ZW5lckxpc3QgZ2xsID0gdGhpcy5nZW5lcmljTGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MpOwotCQkJaWYgKGdsbCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdGVuZXIgbm90IHJlZ2lzdGVyZWQiKTsKLQkJCX0KLQkJCWlmICggISBnbGwucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpKSB7ICAvLyBsZWF2ZSB0aGUgR0xMLCBldmVuIGlmIGl0IGlzIGVtcHR5PwotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3RlbmVyIG5vdCByZWdpc3RlcmVkIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIGZvciBhcHByb3ByaWF0ZQotCSAqIGV2ZW50cyBjYXJyeWluZyB0aGUgc3BlY2lmaWVkIGFzcGVjdCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCA8VCBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiB2b2lkIHJlbW92ZUxpc3RlbmVyKFN0cmluZyBhc3BlY3ROYW1lLCBDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IHRoaXMuY2hpbGQoYXNwZWN0TmFtZSk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3RlbmVyIG5vdCByZWdpc3RlcmVkIik7Ci0JCQl9Ci0JCQljaGlsZC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7ICAvLyBsZWF2ZSB0aGUgY2hpbGQsIGV2ZW4gaWYgaXQgaXMgZW1wdHk/Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJnZW5lcmljIiBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlcmUgYXJlIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5lcnMoQ2xhc3M8PyBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCUdlbmVyaWNMaXN0ZW5lckxpc3QgZ2xsID0gdGhpcy5nZW5lcmljTGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MpOwotCQlyZXR1cm4gKGdsbCA9PSBudWxsKSA/IG51bGwgOiBnbGwubGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgImdlbmVyaWMiIGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZAotCSAqIGxpc3RlbmVyIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcykgewotCQlHZW5lcmljTGlzdGVuZXJMaXN0IGdsbCA9IHRoaXMuZ2VuZXJpY0xpc3RlbmVyTGlzdChsaXN0ZW5lckNsYXNzKTsKLQkJcmV0dXJuIChnbGwgIT0gbnVsbCkgJiYgZ2xsLmhhc0xpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBubyAiZ2VuZXJpYyIgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkCi0JICogbGlzdGVuZXIgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcykgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueUxpc3RlbmVycyhsaXN0ZW5lckNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZAotCSAqIGxpc3RlbmVyIGNsYXNzIGFuZCBhc3BlY3QgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJaWYgKHRoaXMuaGFzQW55TGlzdGVuZXJzKGxpc3RlbmVyQ2xhc3MpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJCS8vIHRoZXJlJ3MgYSAiZ2VuZXJpYyIgbGlzdGVuZXIKLQkJfQotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gdGhpcy5jaGlsZChhc3BlY3ROYW1lKTsKLQkJcmV0dXJuIChjaGlsZCAhPSBudWxsKSAmJgotCQkJY2hpbGQuaGFzQW55TGlzdGVuZXJzKGxpc3RlbmVyQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBubyAiZ2VuZXJpYyIgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkCi0JICogbGlzdGVuZXIgY2xhc3MgYW5kIGFzcGVjdCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCA8VCBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBib29sZWFuIGhhc05vTGlzdGVuZXJzKENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55TGlzdGVuZXJzKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIGFzcGVjdCBvZiB0aGUgc291cmNlIGhhcyBjaGFuZ2VkOwotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gdGhpbmdzIGxpa2Ugc2V0dGluZyBhCi0JICogZGlydHkgZmxhZyBvciB2YWxpZGF0aW5nIHRoZSBzb3VyY2UncyBzdGF0ZS4KLQkgKiBUaGUgYXNwZWN0IElEIHdpbGwgYmUgbnVsbCBpZiBhICJzdGF0ZSBjaGFuZ2UiIG9jY3VycmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNvdXJjZUNoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJLy8gdGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFN0YXRlQ2hhbmdlTGlzdGVuZXI+IFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IFN0YXRlQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoU1RBVEVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgc3RhdGUgY2hhbmdlIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgc3RhdGUgY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBTdGF0ZUNoYW5nZUxpc3RlbmVyW10gc3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAoU3RhdGVDaGFuZ2VMaXN0ZW5lcltdKSB0aGlzLmxpc3RlbmVycyhTVEFURV9DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgdGhlIHNwZWNpZmllZCBzdGF0ZSBjaGFuZ2UgZXZlbnQgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCi0JCVN0YXRlQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCVN0YXRlQ2hhbmdlTGlzdGVuZXJbXSBzdGF0ZUNoYW5nZUxpc3RlbmVycyA9IHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChzdGF0ZUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHN0YXRlQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0YXRlQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCXRhcmdldC5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBnZW5lcmljIHN0YXRlIGNoYW5nZSBldmVudCB0byBhbnkgcmVnaXN0ZXJlZCBzdGF0ZSBjaGFuZ2UKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLS8vCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZShuZXcgU3RhdGVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSkpOwotCi0JCVN0YXRlQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCVN0YXRlQ2hhbmdlTGlzdGVuZXJbXSBzdGF0ZUNoYW5nZUxpc3RlbmVycyA9IHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChzdGF0ZUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHN0YXRlQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJCWZvciAoU3RhdGVDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IFN0YXRlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlcyBhcmUgZXF1YWwsIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bGwgY2hlY2tzLgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlpZiAoKHZhbHVlMSA9PSBudWxsKSAmJiAodmFsdWUyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJLy8gYm90aCBhcmUgbnVsbAotCQl9Ci0JCWlmICgodmFsdWUxID09IG51bGwpIHx8ICh2YWx1ZTIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsJLy8gb25lIGlzIG51bGwgYnV0IHRoZSBvdGhlciBpcyBub3QKLQkJfQotCQlyZXR1cm4gdmFsdWUxLmVxdWFscyh2YWx1ZTIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVsbCBjaGVja3MuCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gISB0aGlzLnZhbHVlc0FyZUVxdWFsKHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCBpcyByZWdpc3RlcmVkIGZvciBhbGwgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIFRoZSBsaXN0ZW5lcgotCSAqIHdpbGwgYmUgbm90aWZpZWQgb25seSBmb3IgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKHByb3BlcnR5TmFtZSwgUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIGFsbCBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhIHNwZWNpZmljIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gYW55IHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10pIHRoaXMubGlzdGVuZXJzKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogRmlyZSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGNoYW5nZSBldmVudCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogTm8gZXZlbnQgaXMgZmlyZWQgaWYgdGhlIGdpdmVuIGV2ZW50J3Mgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB0aGUgc2FtZTsKLQkgKiB0aGlzIGluY2x1ZGVzIHdoZW4gYm90aCB2YWx1ZXMgYXJlIG51bGwuIFVzZSBhIHN0YXRlIGNoYW5nZSBldmVudAotCSAqIGZvciBnZW5lcmFsIHB1cnBvc2Ugbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGV2ZW50LmdldE9sZFZhbHVlKCksIGV2ZW50LmdldE5ld1ZhbHVlKCkpKSB7Ci0JCQlyZXR1cm47IAotCQl9Ci0KLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAocHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCXRhcmdldC5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycy4KLQkgKiBObyBldmVudCBpcyBmaXJlZCBpZiB0aGUgZ2l2ZW4gb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB0aGUgc2FtZTsKLQkgKiB0aGlzIGluY2x1ZGVzIHdoZW4gYm90aCB2YWx1ZXMgYXJlIG51bGwuIFVzZSBhIHN0YXRlIGNoYW5nZSBldmVudAotCSAqIGZvciBnZW5lcmFsIHB1cnBvc2Ugbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpKTsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwob2xkVmFsdWUsIG5ld1ZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyA9IHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChwcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQocHJvcGVydHlOYW1lKTsKLQkJfQotCi0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGFuIGludCBib3VuZCBwcm9wZXJ0eSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIE5vIGV2ZW50IGlzIGZpcmVkIGlmIG9sZCBhbmQgbmV3IGFyZSBlcXVhbC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG1lcmVseSBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBtb3JlIGdlbmVyYWwKLQkgKiBmaXJlUHJvcGVydHlDaGFuZ2UgbWV0aG9kIHRoYXQgdGFrZXMgT2JqZWN0IHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0vLwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3IEludGVnZXIob2xkVmFsdWUpLCBuZXcgSW50ZWdlcihuZXdWYWx1ZSkpOwotCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAocHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQotCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBwcm9wZXJ0eU5hbWUsIG5ldyBJbnRlZ2VyKG9sZFZhbHVlKSwgbmV3IEludGVnZXIobmV3VmFsdWUpKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm9vbGVhbiBib3VuZCBwcm9wZXJ0eSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIE5vIGV2ZW50IGlzIGZpcmVkIGlmIG9sZCBhbmQgbmV3IGFyZSBlcXVhbC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG1lcmVseSBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBtb3JlIGdlbmVyYWwKLQkgKiBmaXJlUHJvcGVydHlDaGFuZ2UgbWV0aG9kIHRoYXQgdGFrZXMgT2JqZWN0IHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLS8vCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCBCb29sZWFuLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChwcm9wZXJ0eU5hbWUpOwotCQl9Ci0KLQkJUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCBCb29sZWFuLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogQWRkIGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCBpcyByZWdpc3RlcmVkIGZvciBhbGwgY29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gVGhlIGxpc3RlbmVyCi0JICogd2lsbCBiZSBub3RpZmllZCBvbmx5IGZvciBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhbGwgY29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYSBzcGVjaWZpYyBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gYW55IGNvbGxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10pIHRoaXMubGlzdGVuZXJzKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5pdGVtc1NpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWUgPSBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpOwotCi0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCXRhcmdldC5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkLmZpcmVJdGVtc0FkZGVkKGV2ZW50KTsKLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBhZGRlZEl0ZW1zKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNBZGRlZChuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcykpOwotCQlpZiAoYWRkZWRJdGVtcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyA9IHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQoY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJdGFyZ2V0Lml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbXNBZGRlZChjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNBZGRlZChjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKGFkZGVkSXRlbSkpOwotCi0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihhZGRlZEl0ZW0pKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCWNoaWxkLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5pdGVtc1NpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWUgPSBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpOwotCi0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCXRhcmdldC5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiByZW1vdmVkSXRlbXMpIHsKLS8vCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcykpOwotCQlpZiAocmVtb3ZlZEl0ZW1zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbXSBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAoY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCByZW1vdmVkSXRlbSkgewotLy8JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJlbW92ZWRJdGVtKSk7Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyA9IHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQoY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJlbW92ZWRJdGVtKSk7Ci0JCQkJCX0KLQkJCQkJdGFyZ2V0Lml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCWNoaWxkLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGNvbGxlY3Rpb25OYW1lID0gZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKTsKLQotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbXSBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAoY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQl0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLS8vCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSkpOwotCi0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCWNoaWxkLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChjb2xsZWN0aW9uTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBjb2xsZWN0aW9uTmFtZSA9IGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCk7Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyA9IHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQoY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJdGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0vLwkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQobmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUpKTsKLQotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbXSBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAoY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlQ29sbGVjdGlvbkNoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5maXJlQ29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RDaGFuZ2VMaXN0ZW5lcj4gTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IGlzIHJlZ2lzdGVyZWQgZm9yIGFsbCBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LiBUaGUgbGlzdGVuZXIKLQkgKiB3aWxsIGJlIG5vdGlmaWVkIG9ubHkgZm9yIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKGxpc3ROYW1lLCBMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3QgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIGFsbCBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhIHNwZWNpZmljIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIobGlzdE5hbWUsIExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGxpc3QgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiBhbnkgbGlzdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIChMaXN0Q2hhbmdlTGlzdGVuZXJbXSkgdGhpcy5saXN0ZW5lcnMoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50Lml0ZW1zU2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJdGFyZ2V0Lml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZUl0ZW1zQWRkZWQoZXZlbnQpOwotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gYWRkZWRJdGVtcykgewotLy8JCXRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKSk7Ci0JCWlmIChhZGRlZEl0ZW1zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSBsaXN0Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGxpc3RDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChsaXN0TmFtZSk7Ci0JCX0KLQotCQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJdGFyZ2V0Lml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWRkZWRJdGVtKSk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJTGlzdENoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWRkZWRJdGVtKSk7Ci0JCQkJCX0KLQkJCQkJdGFyZ2V0Lml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuZmlyZUl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50Lml0ZW1zU2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJdGFyZ2V0Lml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQljaGlsZC5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKSk7Ci0JCWlmIChyZW1vdmVkSXRlbXMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUxpc3RDaGFuZ2VMaXN0ZW5lcltdIGxpc3RDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChsaXN0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gbGlzdENoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGxpc3ROYW1lKTsKLQkJfQotCi0JCUxpc3RDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCByZW1vdmVkSXRlbSkgewotLy8JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVtb3ZlZEl0ZW0pKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSBsaXN0Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGxpc3RDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChsaXN0TmFtZSk7Ci0JCX0KLQotCQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyZW1vdmVkSXRlbSkpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbVJlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5pdGVtc1NpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgbGlzdE5hbWUgPSBldmVudC5nZXRMaXN0TmFtZSgpOwotCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUxpc3RDaGFuZ2VMaXN0ZW5lcltdIGxpc3RDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChsaXN0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gbGlzdENoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGxpc3ROYW1lKTsKLQkJfQotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCXRhcmdldC5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IG5ld0l0ZW1zLCBMaXN0PD8+IHJlcGxhY2VkSXRlbXMpIHsKLS8vCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIHJlcGxhY2VkSXRlbXMpKTsKLQkJaWYgKG5ld0l0ZW1zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSBsaXN0Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGxpc3RDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChsaXN0TmFtZSk7Ci0JCX0KLQotCQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIHJlcGxhY2VkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZUl0ZW1zUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgcmVwbGFjZWRJdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3QgcmVwbGFjZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3SXRlbSksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVwbGFjZWRJdGVtKSk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJTGlzdENoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3SXRlbSksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVwbGFjZWRJdGVtKSk7Ci0JCQkJCX0KLQkJCQkJdGFyZ2V0Lml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRUYXJnZXRJbmRleCgpID09IGV2ZW50LmdldFNvdXJjZUluZGV4KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJdGFyZ2V0Lml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZUl0ZW1zTW92ZWQoZXZlbnQpOwotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zTW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotLy8JCXRoaXMuZmlyZUl0ZW1zTW92ZWQobmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKSk7Ci0JCWlmICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJTGlzdENoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZUl0ZW1zTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuZmlyZUl0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1Nb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZXZlbnQuZ2V0TGlzdE5hbWUoKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSBsaXN0Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGxpc3RDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChsaXN0TmFtZSk7Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQl0YXJnZXQubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZUxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChTdHJpbmcgbGlzdE5hbWUpIHsKLS8vCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSkpOwotCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUxpc3RDaGFuZ2VMaXN0ZW5lcltdIGxpc3RDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChsaXN0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gbGlzdENoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGxpc3ROYW1lKTsKLQkJfQotCi0JCUxpc3RDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCWNoaWxkLmZpcmVMaXN0Q2xlYXJlZChsaXN0TmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVMaXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJdGFyZ2V0Lmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkLmZpcmVMaXN0Q2hhbmdlZChldmVudCk7Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENoYW5nZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0vLwkJdGhpcy5maXJlTGlzdENoYW5nZWQobmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUpKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSBsaXN0Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGxpc3RDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChsaXN0TmFtZSk7Ci0JCX0KLQotCQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlTGlzdENoYW5nZWQobGlzdE5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5maXJlTGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBUcmVlQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfVFJFRV9QQVRIID0gbmV3IE9iamVjdFswXTsKLQotCS8qKgotCSAqIEFkZCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgaXMgcmVnaXN0ZXJlZCBmb3IgYWxsIHRyZWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIHRyZWUuIFRoZSBsaXN0ZW5lcgotCSAqIHdpbGwgYmUgbm90aWZpZWQgb25seSBmb3IgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIodHJlZU5hbWUsIFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYWxsIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYSBzcGVjaWZpYyB0cmVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgdHJlZU5hbWUsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKHRyZWVOYW1lLCBUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgdHJlZSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCB0cmVlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgdHJlZSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gYW55IHRyZWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVDaGFuZ2VMaXN0ZW5lcltdIHRyZWVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAoVHJlZUNoYW5nZUxpc3RlbmVyW10pIHRoaXMubGlzdGVuZXJzKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHRyZWVOYW1lID0gZXZlbnQuZ2V0VHJlZU5hbWUoKTsKLQotCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0cmVlQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAodHJlZUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHRyZWVDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZCh0cmVlTmFtZSk7Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQl0YXJnZXQubm9kZUFkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkLmZpcmVOb2RlQWRkZWQoZXZlbnQpOwotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChTdHJpbmcgdHJlZU5hbWUsIE9iamVjdFtdIHBhdGgpIHsKLS8vCQl0aGlzLmZpcmVOb2RlQWRkZWQobmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpKTsKLQotCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0cmVlQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAodHJlZUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHRyZWVDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZCh0cmVlTmFtZSk7Ci0JCX0KLQotCQlUcmVlQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBUcmVlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQubm9kZUFkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZU5vZGVBZGRlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVOb2RlQWRkZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgdHJlZU5hbWUgPSBldmVudC5nZXRUcmVlTmFtZSgpOwotCi0JCVRyZWVDaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCVRyZWVDaGFuZ2VMaXN0ZW5lcltdIHRyZWVDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmICh0cmVlQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gdHJlZUNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKHRyZWVOYW1lKTsKLQkJfQotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCXRhcmdldC5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQljaGlsZC5maXJlTm9kZVJlbW92ZWQoZXZlbnQpOwotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFN0cmluZyB0cmVlTmFtZSwgT2JqZWN0W10gcGF0aCkgewotLy8JCXRoaXMuZmlyZU5vZGVSZW1vdmVkKG5ldyBUcmVlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKSk7Ci0KLQkJVHJlZUNoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJVHJlZUNoYW5nZUxpc3RlbmVyW10gdHJlZUNoYW5nZUxpc3RlbmVycyA9IHRoaXMudHJlZUNoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKHRyZWVDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSB0cmVlQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQodHJlZU5hbWUpOwotCQl9Ci0KLQkJVHJlZUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCk7Ci0JCQkJCX0KLQkJCQkJdGFyZ2V0Lm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZU5vZGVSZW1vdmVkKHRyZWVOYW1lLCBwYXRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuZmlyZU5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZCh0cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHRyZWVOYW1lID0gZXZlbnQuZ2V0VHJlZU5hbWUoKTsKLQotCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0cmVlQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAodHJlZUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHRyZWVDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZCh0cmVlTmFtZSk7Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQl0YXJnZXQudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZVRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZCh0cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChTdHJpbmcgdHJlZU5hbWUsIE9iamVjdFtdIHBhdGgpIHsKLS8vCQl0aGlzLmZpcmVUcmVlQ2xlYXJlZChuZXcgVHJlZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCkpOwotCi0JCVRyZWVDaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCVRyZWVDaGFuZ2VMaXN0ZW5lcltdIHRyZWVDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmICh0cmVlQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gdHJlZUNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKHRyZWVOYW1lKTsKLQkJfQotCi0JCVRyZWVDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMudHJlZUNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCWNoaWxkLmZpcmVUcmVlQ2xlYXJlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVUcmVlQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXRoaXMuZmlyZVRyZWVDbGVhcmVkKHRyZWVOYW1lLCBFTVBUWV9UUkVFX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyB0cmVlTmFtZSA9IGV2ZW50LmdldFRyZWVOYW1lKCk7Ci0KLQkJVHJlZUNoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJVHJlZUNoYW5nZUxpc3RlbmVyW10gdHJlZUNoYW5nZUxpc3RlbmVycyA9IHRoaXMudHJlZUNoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKHRyZWVDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSB0cmVlQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQodHJlZU5hbWUpOwotCQl9Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMudHJlZUNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJdGFyZ2V0LnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkLmZpcmVUcmVlQ2hhbmdlZChldmVudCk7Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0vLwkJdGhpcy5maXJlVHJlZUNoYW5nZWQobmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpKTsKLQotCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0cmVlQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAodHJlZUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHRyZWVDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZCh0cmVlTmFtZSk7Ci0JCX0KLQotCQlUcmVlQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBUcmVlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlVHJlZUNoYW5nZWQodHJlZU5hbWUsIHBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5maXJlVHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFN0cmluZyB0cmVlTmFtZSkgewotCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZCh0cmVlTmFtZSwgRU1QVFlfVFJFRV9QQVRIKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNvdXJjZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlcmlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gd3JpdGUgb3V0IHRoZSBzb3VyY2UsIGNoaWxkcmVuLCBhbmQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCi0JCS8vIG9ubHkgd3JpdGUgb3V0IFNlcmlhbGl6YWJsZSBsaXN0ZW5lcnMKLQkJaW50IGxlbjEgPSB0aGlzLmdlbmVyaWNMaXN0ZW5lcnMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjE7IGkrKykgewotCQkJdGhpcy53cml0ZU9iamVjdChzLCB0aGlzLmdlbmVyaWNMaXN0ZW5lcnNbaV0pOwotCQl9Ci0JCXMud3JpdGVPYmplY3QobnVsbCk7Ci0gICAgfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzLCBHZW5lcmljTGlzdGVuZXJMaXN0IGdsbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWludCBsZW4gPSBnbGwubGlzdGVuZXJzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBnbGwubGlzdGVuZXJzW2ldOwotCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgU2VyaWFsaXphYmxlKSB7Ci0JCQkJaWYgKGZpcnN0KSB7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJCXMud3JpdGVPYmplY3QoZ2xsLmxpc3RlbmVyQ2xhc3MpOwotCQkJCX0KLQkJCQlzLndyaXRlT2JqZWN0KGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQlpZiAoICEgZmlyc3QpIHsKLQkJCXMud3JpdGVPYmplY3QobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gcmVhZCBpbiB0aGUgc291cmNlLCBjaGlsZHJlbiwgYW5kIGFueSBoaWRkZW4gc3R1ZmYKLQkJcy5kZWZhdWx0UmVhZE9iamVjdCgpOwotCi0JCS8vIHJlYWQgaW4gZ2VuZXJpYyBsaXN0ZW5lciBsaXN0cwotCQl0aGlzLmdlbmVyaWNMaXN0ZW5lcnMgPSBFTVBUWV9HRU5FUklDX0xJU1RFTkVSUzsKLQkJT2JqZWN0IG87Ci0JCXdoaWxlIChudWxsICE9IChvID0gcy5yZWFkT2JqZWN0KCkpKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUNsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcyA9IChDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+KSBvOwotCQkJR2VuZXJpY0xpc3RlbmVyTGlzdCBnbGwgPSBudWxsOwotCQkJd2hpbGUgKG51bGwgIT0gKG8gPSBzLnJlYWRPYmplY3QoKSkpIHsKLQkJCQlpZiAoZ2xsID09IG51bGwpIHsKLQkJCQkJZ2xsID0gdGhpcy5hZGRHZW5lcmljTGlzdGVuZXJMaXN0SW50ZXJuYWwobGlzdGVuZXJDbGFzcywgKENoYW5nZUxpc3RlbmVyKSBvKTsKLQkJCQl9IGVsc2UgewotCQkJCQlnbGwuYWRkTGlzdGVuZXIoKENoYW5nZUxpc3RlbmVyKSBvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIDxUIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IEdlbmVyaWNMaXN0ZW5lckxpc3QgYWRkR2VuZXJpY0xpc3RlbmVyTGlzdEludGVybmFsKENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiB0aGlzLmFkZEdlbmVyaWNMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcywgKFQpIGxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUGFpciBhIGxpc3RlbmVyIGNsYXNzIHdpdGggaXRzICJnZW5lcmljIiBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR2VuZXJpY0xpc3RlbmVyTGlzdCB7Ci0JCWZpbmFsIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzczsKLQkJQ2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5lcnM7Ci0KLQkJPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gR2VuZXJpY0xpc3RlbmVyTGlzdChDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5saXN0ZW5lckNsYXNzID0gbGlzdGVuZXJDbGFzczsKLQkJCXRoaXMubGlzdGVuZXJzID0gKENoYW5nZUxpc3RlbmVyW10pIEFycmF5Lm5ld0luc3RhbmNlKGxpc3RlbmVyQ2xhc3MsIDEpOwotCQkJdGhpcy5saXN0ZW5lcnNbMF0gPSBsaXN0ZW5lcjsKLQkJfQotCi0JCXZvaWQgYWRkTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJzID0gQ29sbGVjdGlvblRvb2xzLmFkZCh0aGlzLmxpc3RlbmVycywgbGlzdGVuZXIpOwotCQl9Ci0KLQkJYm9vbGVhbiByZW1vdmVMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJaW50IGxlbiA9IHRoaXMubGlzdGVuZXJzLmxlbmd0aDsKLQkJCWlmIChsZW4gPT0gMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJdGhpcy5saXN0ZW5lcnMgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlKHRoaXMubGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBsaXN0ZW5lciBub3QgaW4gdGhlIGxpc3QKLQkJCX0KLQkJCXJldHVybiAodGhpcy5saXN0ZW5lcnMubGVuZ3RoICsgMSkgPT0gbGVuOwotCQl9Ci0KLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0ZW5lcnMubGVuZ3RoID4gMDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgQ2xhc3NUb29scy5zaG9ydE5hbWVGb3IodGhpcy5saXN0ZW5lckNsYXNzKSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFBhaXIgYW4gYXNwZWN0IG5hbWUgd2l0aCB0aGUgY2hhbmdlIHN1cHBvcnQgaG9sZGluZyBpdHMgYXNzb2NpYXRlZAotCSAqIGxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBBc3BlY3RDaGlsZCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCWZpbmFsIFN0cmluZyBhc3BlY3ROYW1lOwotCQlmaW5hbCBDaGFuZ2VTdXBwb3J0IGNoaWxkOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlBc3BlY3RDaGlsZChTdHJpbmcgYXNwZWN0TmFtZSwgQ2hhbmdlU3VwcG9ydCBjaGlsZCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYXNwZWN0TmFtZSA9IGFzcGVjdE5hbWU7Ci0JCQl0aGlzLmNoaWxkID0gY2hpbGQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYXNwZWN0TmFtZSk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2M2U1MjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBjaGFuZ2Ugc3VwcG9ydCBjbGFzcyBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiB0aGUgc3RhbmRhcmQKLSAqIENoYW5nZVN1cHBvcnQgaW4gc2V2ZXJhbCB3YXlzOgotICogCS0gQWxsIGV2ZW50cyBmaXJlZCBieSB0aGUgc291cmNlIG11c3Qgc3BlY2lmeSB0aGUgc2luZ2xlIGFzcGVjdC4KLSAqIAktIExpc3RlbmVycyBhcmUgcmVxdWlyZWQgdG8gYmUgZWl0aGVyICJnZW5lcmljIiBsaXN0ZW5lcnMgb3IKLSAqIAkgICAgbGlzdGVuZXJzIG9mIHRoZSBzaW5nbGUgYXNwZWN0LgotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydAotCWV4dGVuZHMgQ2hhbmdlU3VwcG9ydAotewotCXByb3RlY3RlZCBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3M7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBhc3BlY3ROYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlLCBDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCXRoaXMubGlzdGVuZXJDbGFzcyA9IGxpc3RlbmVyQ2xhc3M7Ci0JCXRoaXMuYXNwZWN0TmFtZSA9IGFzcGVjdE5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByaXZhdGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gdW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCXJldHVybiBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgTW9kZWwgc3VwcG9ydHMgb25seSBjaGFuZ2VzIGZvciB0aGUgbGlzdGVuZXIgdHlwZSBcIiIgKyB0aGlzLmxpc3RlbmVyQ2xhc3MuZ2V0TmFtZSgpCi0JCQkJKyAiXCIgYW5kIHRoZSBhc3BlY3QgXCIiICsgdGhpcy5hc3BlY3ROYW1lICsgIlwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrKENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbENsYXNzLCBTdHJpbmcgYU5hbWUpIHsKLQkJaWYgKGxDbGFzcyAhPSB0aGlzLmxpc3RlbmVyQ2xhc3MpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoaXMgTW9kZWwgc3VwcG9ydHMgb25seSBjaGFuZ2VzIGZvciB0aGUgbGlzdGVuZXIgdHlwZSBcIiIgKyB0aGlzLmxpc3RlbmVyQ2xhc3MuZ2V0TmFtZSgpICsgIlwiIDogXCIiICsgbENsYXNzLmdldE5hbWUoKSArICJcIiIpOwotCQl9Ci0JCWlmIChhTmFtZSAhPSB0aGlzLmFzcGVjdE5hbWUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoaXMgTW9kZWwgc3VwcG9ydHMgb25seSBjaGFuZ2VzIGZvciB0aGUgYXNwZWN0IFwiIiArIHRoaXMuYXNwZWN0TmFtZSArICJcIiA6IFwiIiArIGFOYW1lICsgIlwiIik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihTdHJpbmcgYU5hbWUsIENsYXNzPFQ+IGxDbGFzcywgVCBsaXN0ZW5lcikgewotCQl0aGlzLmNoZWNrKGxDbGFzcywgYU5hbWUpOwotCQlzdXBlci5hZGRMaXN0ZW5lcihhTmFtZSwgbENsYXNzLCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoU3RyaW5nIGFOYW1lLCBDbGFzczxUPiBsQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJdGhpcy5jaGVjayhsQ2xhc3MsIGFOYW1lKTsKLQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIoYU5hbWUsIGxDbGFzcywgbGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBxdWVyaWVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0FueUxpc3RlbmVycyhDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGxDbGFzcywgU3RyaW5nIGFOYW1lKSB7Ci0JCXRoaXMuY2hlY2sobENsYXNzLCBhTmFtZSk7Ci0JCXJldHVybiBzdXBlci5oYXNBbnlMaXN0ZW5lcnMobENsYXNzLCBhTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aHJvdyB0aGlzLnVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJdGhyb3cgdGhpcy51bnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmNoZWNrKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQl0aGlzLmNoZWNrKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCXRoaXMuY2hlY2soUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUpOwotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVJdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNBZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtc0FkZGVkKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IGFkZGVkSXRlbSkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1SZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJc3VwZXIuZmlyZUl0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiByZW1vdmVkSXRlbXMpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBuZXdJdGVtcywgTGlzdDw/PiByZXBsYWNlZEl0ZW1zKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgcmVwbGFjZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZXBsYWNlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCByZXBsYWNlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVJdGVtc01vdmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNNb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1zTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlzdXBlci5maXJlTGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChTdHJpbmcgbGlzdE5hbWUpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlTGlzdENsZWFyZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVMaXN0Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKFN0cmluZyBsaXN0TmFtZSkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVMaXN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVOb2RlQWRkZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlQWRkZWQoU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQkJc3VwZXIuZmlyZU5vZGVBZGRlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJc3VwZXIuZmlyZU5vZGVSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZVJlbW92ZWQoU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQkJc3VwZXIuZmlyZU5vZGVSZW1vdmVkKHRyZWVOYW1lLCBwYXRoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCQlzdXBlci5maXJlVHJlZUNsZWFyZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChTdHJpbmcgdHJlZU5hbWUsIE9iamVjdFtdIHBhdGgpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCQlzdXBlci5maXJlVHJlZUNsZWFyZWQodHJlZU5hbWUsIHBhdGgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVUcmVlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFN0cmluZyB0cmVlTmFtZSwgT2JqZWN0W10gcGF0aCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSk7Ci0JCXN1cGVyLmZpcmVUcmVlQ2hhbmdlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGNjMTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgQVdUCi0gKiBldmVudCBxdWV1ZS4KLSAqIEZvcndhcmQgKmV2ZXJ5KiBldmVudCBhc3luY2hyb25vdXNseSB2aWEgdGhlIFVJIHRocmVhZCBzbyB0aGUgbGlzdGVuZXIKLSAqIHJlY2VpdmVzIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkgd2VyZSBnZW5lcmF0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyBhZGRlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRDb2xsZWN0aW9uQ2xlYXJlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjbGVhcmVkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogRXZlbnRRdWV1ZSNpbnZva2VMYXRlcihSdW5uYWJsZSkgc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcgI2ludm9rZUFuZFdhaXQoUnVubmFibGUpIGNhbiBzb21ldGltZXMgbWFrZSB0aGluZ3MKLQkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbkV2ZW50UXVldWUoUnVubmFibGUgcikgewotCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKHIpOwotLy8JCXRyeSB7Ci0vLwkJCUV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChyKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfQotCX0KLQotCXZvaWQgaXRlbXNBZGRlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlbW92ZWRfKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRfKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgIikiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyOGI5Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dDsKLQotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBsaXN0IGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUuCi0gKiBGb3J3YXJkICpldmVyeSogZXZlbnQgYXN5bmNocm9ub3VzbHkgdmlhIHRoZSBVSSB0aHJlYWQgc28gdGhlIGxpc3RlbmVyCi0gKiByZWNlaXZlcyBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgZ2VuZXJhdGVkLgotICovCi1wdWJsaWMgY2xhc3MgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNNb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRMaXN0Q2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIGFkZGVkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVtb3ZlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNNb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgbW92ZWQiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlcGxhY2VkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2xlYXJlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZExpc3RDaGFuZ2VkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmxpc3RDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZWQiOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpIHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nICNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKSBjYW4gc29tZXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNNb3ZlZF8oTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNNb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlcGxhY2VkXyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGxpc3RDbGVhcmVkXyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5saXN0Q2xlYXJlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBsaXN0Q2hhbmdlZF8oTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQVdUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAiKSI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODI3NzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3Q7Ci0KLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLgotICogRm9yd2FyZCAqZXZlcnkqIGV2ZW50IGFzeW5jaHJvbm91c2x5IHZpYSB0aGUgVUkgdGhyZWFkIHNvIHRoZSBsaXN0ZW5lcgotICogcmVjZWl2ZXMgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSB3ZXJlIGdlbmVyYXRlZC4KLSAqLwotcHVibGljIGNsYXNzIEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0KLQlwdWJsaWMgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMucHJvcGVydHlDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogRXZlbnRRdWV1ZSNpbnZva2VMYXRlcihSdW5uYWJsZSkgc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcgI2ludm9rZUFuZFdhaXQoUnVubmFibGUpIGNhbiBzb21ldGltZXMgbWFrZSB0aGluZ3MKLQkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbkV2ZW50UXVldWUoUnVubmFibGUgcikgewotCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKHIpOwotLy8JCXRyeSB7Ci0vLwkJCUV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChyKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfQotCX0KLQotCXZvaWQgcHJvcGVydHlDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgIikiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTk1NTZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgc3RhdGUgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgQVdUCi0gKiBldmVudCBxdWV1ZS4KLSAqIEZvcndhcmQgKmV2ZXJ5KiBldmVudCBhc3luY2hyb25vdXNseSB2aWEgdGhlIFVJIHRocmVhZCBzbyB0aGUgbGlzdGVuZXIKLSAqIHJlY2VpdmVzIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkgd2VyZSBnZW5lcmF0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgU3RhdGVDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBBV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5zdGF0ZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyAjaW52b2tlQW5kV2FpdChSdW5uYWJsZSkgY2FuIHNvbWV0aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBzdGF0ZUNoYW5nZWRfKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQVdUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAiKSI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBhMGUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIHRyZWUgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgQVdUCi0gKiBldmVudCBxdWV1ZS4KLSAqIEZvcndhcmQgKmV2ZXJ5KiBldmVudCBhc3luY2hyb25vdXNseSB2aWEgdGhlIFVJIHRocmVhZCBzbyB0aGUgbGlzdGVuZXIKLSAqIHJlY2VpdmVzIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkgd2VyZSBnZW5lcmF0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBUcmVlQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGROb2RlQWRkZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGROb2RlQWRkZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubm9kZUFkZGVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIGFkZGVkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTm9kZVJlbW92ZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubm9kZVJlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgcmVtb3ZlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZmluYWwgVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnRyZWVDbGVhcmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNsZWFyZWQiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRUcmVlQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy50cmVlQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJlZSBjaGFuZ2VkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyAjaW52b2tlQW5kV2FpdChSdW5uYWJsZSkgY2FuIHNvbWV0aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBub2RlQWRkZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBub2RlUmVtb3ZlZF8oVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNsZWFyZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIHRyZWVDaGFuZ2VkXyhUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci50cmVlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICIpIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNmM4M2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2hhaW5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlTm9kZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogU3ViY2xhc3NlcyBuZWVkIG9ubHkgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqIAotICogI3ZhbHVlKCkKLSAqCSAgICByZXR1cm4gdGhlIHVzZXItZGV0ZXJtaW5lZCAidmFsdWUiIG9mIHRoZSBub2RlLAotICogICAgIGkuZS4gdGhlIG9iamVjdCAid3JhcHBlZCIgYnkgdGhlIG5vZGUKLSAqIAotICogI3NldFZhbHVlKE9iamVjdCkKLSAqICAgICBzZXQgdGhlIHVzZXItZGV0ZXJtaW5lZCAidmFsdWUiIG9mIHRoZSBub2RlLAotICogICAgIGkuZS4gdGhlIG9iamVjdCAid3JhcHBlZCIgYnkgdGhlIG5vZGU7Ci0gKiAgICAgdHlwaWNhbGx5IG9ubHkgb3ZlcnJpZGRlbiBmb3Igbm9kZXMgd2l0aCAicHJpbWl0aXZlIiB2YWx1ZXMKLSAqIAotICogI3BhcmVudCgpCi0gKiAgICAgcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhlIG5vZGUsIHdoaWNoIHNob3VsZCBiZSBhbm90aGVyCi0gKiAgICAgVHJlZU5vZGVWYWx1ZU1vZGVsCi0gKiAKLSAqICNjaGlsZHJlbk1vZGVsKCkKLSAqICAgICByZXR1cm4gYSBMaXN0VmFsdWVNb2RlbCBmb3IgdGhlIG5vZGUncyBjaGlsZHJlbgotICogCi0gKiAjZW5nYWdlVmFsdWUoKSBhbmQgI2Rpc2VuZ2FnZVZhbHVlKCkKLSAqICAgICBvdmVycmlkZSB0aGVzZSBtZXRob2RzIHRvIGxpc3RlbiB0byB0aGUgbm9kZSdzIHZhbHVlIGlmCi0gKiAgICAgaXQgY2FuIGNoYW5nZSBpbiBhIHdheSB0aGF0IHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gdGhlIHRyZWUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBUcmVlTm9kZVZhbHVlTW9kZWw8VD4KLXsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCS8vIHRoaXMgbW9kZWwgZmlyZXMgKmJvdGgqICJ2YWx1ZSBwcm9wZXJ0eSBjaGFuZ2UiIGFuZCAic3RhdGUgY2hhbmdlIiBldmVudHMuLi4KLS8vCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcywgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJcmV0dXJuIHN1cGVyLmJ1aWxkQ2hhbmdlU3VwcG9ydCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBiZSBhZGRpbmcgYm90aCAic3RhdGUgY2hhbmdlIiBhbmQgInZhbHVlIHByb3BlcnR5IGNoYW5nZSIKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VWYWx1ZSgpOwotCQl9Ci0JCXN1cGVyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEJlZ2luIGxpc3RlbmluZyB0byB0aGUgbm9kZSdzIHZhbHVlJ3Mgc3RhdGUuIElmIHRoZSBzdGF0ZSBvZiB0aGUgbm9kZSBjaGFuZ2VzCi0JICogaW4gYSB3YXkgdGhhdCBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSB0cmVlLCBmaXJlIGEgInN0YXRlIGNoYW5nZSIgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlVmFsdWUoKTsKLQotCS8qKgotCSAqIEBzZWUgI2FkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUncyB2YWx1ZS4KLQkgKiBAc2VlICNlbmdhZ2VWYWx1ZSgpCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlVmFsdWUoKTsKLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGF0aCgpIHsKLQkJTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHBhdGggPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5iYWNrUGF0aCgpKTsKLQkJcmV0dXJuIHBhdGgudG9BcnJheShuZXcgVHJlZU5vZGVWYWx1ZU1vZGVsW3BhdGguc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgY2xpbWJzIHVwIHRoZSBub2RlJ3MgcGF0aCwKLQkgKiBzdGFydGluZyB3aXRoLCBhbmQgaW5jbHVkaW5nLCB0aGUgbm9kZQotCSAqIGFuZCB1cCB0bywgYW5kIGluY2x1ZGluZywgdGhlIHJvb3Qgbm9kZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBiYWNrUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4odGhpcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5leHRMaW5rKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjdXJyZW50TGluaykgewotCQkJCXJldHVybiBjdXJyZW50TGluay5wYXJlbnQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGNoaWxkKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsKCkuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbCgpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2ZDaGlsZChUcmVlTm9kZVZhbHVlTW9kZWw8VD4gY2hpbGQpIHsKLQkJTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5Nb2RlbCgpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbi5nZXQoaSkgPT0gY2hpbGQpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMZWFmKCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsKCkuc2l6ZSgpID09IDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogV2UgaW1wbGVtZW50ICNlcXVhbHMoT2JqZWN0KSBzbyB0aGF0IFRyZWVQYXRocyBjb250YWluaW5nIHRoZXNlIG5vZGVzCi0JICogd2lsbCByZXNvbHZlIHByb3Blcmx5IHdoZW4gdGhlIG5vZGVzIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWVzLiBUaGlzIGlzCi0JICogbmVjZXNzYXJ5IGJlY2F1c2Ugbm9kZXMgYXJlIGRyb3BwZWQgYW5kIHJlYnVpbHQgd2lsbHktbmlsbHkgd2hlbiBkZWFsaW5nCi0JICogd2l0aCBhIHNvcnRlZCBsaXN0IG9mIGNoaWxkcmVuOyBhbmQgdGhpcyBhbGxvd3MgdXMgdG8gc2F2ZSBhbmQgcmVzdG9yZQotCSAqIGEgdHJlZSdzIGV4cGFuZGVkIHBhdGhzLiBUaGUgbm9kZXMgaW4gdGhlIGV4cGFuZGVkIHBhdGhzIHRoYXQgYXJlCi0JICogc2F2ZWQgYmVmb3JlIGFueSBtb2RpZmljYXRpb24gKGUuZy4gcmVuYW1pbmcgYSBub2RlKSB3aWxsIGJlIGRpZmZlcmVudAotCSAqIGZyb20gdGhlIG5vZGVzIGluIHRoZSB0cmVlJ3MgcGF0aHMgYWZ0ZXIgdGhlIG1vZGlmaWNhdGlvbiwgaWYgdGhlIG1vZGlmaWNhdGlvbgotCSAqIHJlc3VsdHMgaW4gYSBwb3NzaWJsZSBjaGFuZ2UgaW4gdGhlIG5vZGUgc29ydCBvcmRlci4gIH5ianYKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChvLmdldENsYXNzKCkgIT0gdGhpcy5nZXRDbGFzcygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG90aGVyID0gKEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBvOwotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2QzM2Q1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBleHRlbnNpb24gb2YgQWJzdHJhY3RNb2RlbCBwcm92aWRlcyBhIGJhc2UgZm9yIGFkZGluZyAKLSAqIGNoYW5nZSBsaXN0ZW5lcnMgKFByb3BlcnR5Q2hhbmdlLCBDb2xsZWN0aW9uQ2hhbmdlLCBMaXN0Q2hhbmdlLCBUcmVlQ2hhbmdlKQotICogdG8gYSBzdWJqZWN0IGFuZCBjb252ZXJ0aW5nIHRoZSBzdWJqZWN0J3MgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBhIHNpbmdsZQotICogc2V0IG9mIGNoYW5nZSBub3RpZmljYXRpb25zIGZvciBhIGNvbW1vbiBhc3BlY3QgKGUuZy4gVkFMVUUpLgotICogCi0gKiBUaGUgYWRhcHRlciB3aWxsIG9ubHkgbGlzdGVuIHRvIHRoZSBzdWJqZWN0IChhbmQgc3ViamVjdCBob2xkZXIpIHdoZW4gdGhlCi0gKiBhZGFwdGVyIGl0c2VsZiBhY3R1YWxseSBoYXMgbGlzdGVuZXJzLiBUaGlzIHdpbGwgYWxsb3cgdGhlIGFkYXB0ZXIgdG8gYmUKLSAqIGdhcmJhZ2UgY29sbGVjdGVkIHdoZW4gYXBwcm9wcmlhdGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFzcGVjdEFkYXB0ZXI8Uz4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLXsKLQkvKioKLQkgKiBUaGUgc3ViamVjdCB0aGF0IGhvbGRzIHRoZSBhc3BlY3QgYW5kIGZpcmVzCi0JICogY2hhbmdlIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBhc3BlY3QgY2hhbmdlcy4KLQkgKiBXZSBuZWVkIHRvIGhvbGQgb24gdG8gdGhpcyBkaXJlY3RseSBzbyB3ZSBjYW4KLQkgKiBkaXNlbmdhZ2UgaXQgd2hlbiBpdCBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCBTIHN1YmplY3Q7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIHRoYXQgaG9sZHMgdGhlIHN1YmplY3QKLQkgKiB0aGF0IGhvbGRzIHRoZSBhc3BlY3QgYW5kIHByb3ZpZGVzIGNoYW5nZSBub3RpZmljYXRpb24uCi0JICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGVyZSBhcmUgYSBudW1iZXIgb2YgQXNwZWN0QWRhcHRlcnMKLQkgKiB0aGF0IGhhdmUgdGhlIHNhbWUgc3ViamVjdCBhbmQgdGhhdCBzdWJqZWN0IGNhbiBjaGFuZ2UuCi0JICogQWxsIHRoZSBBc3BlY3RBZGFwdGVycyBzaG91bGQgc2hhcmUgdGhlIHNhbWUgc3ViamVjdCBob2xkZXIuCi0JICogRm9yIG5vdywgdGhpcyBpcyBjYW4gb25seSBiZSBzZXQgdXBvbiBjb25zdHJ1Y3Rpb24gYW5kIGlzCi0JICogaW1tdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGtlZXBzIHVzIGluIHN5bmNoIHdpdGggdGhlIHN1YmplY3RIb2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc3ViamVjdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gQXNwZWN0QWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBBc3BlY3RBZGFwdGVyKFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBBc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyLgotCSAqIFRoZSBzdWJqZWN0IGhvbGRlciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHN1YmplY3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyID0gc3ViamVjdEhvbGRlcjsKLQkJdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHRoZSBzdWJqZWN0IGlzIG51bGwgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byBpdAotCQkvLyB0aGlzIHdpbGwgdHlwaWNhbGx5IHJlc3VsdCBpbiBvdXIgdmFsdWUgYmVpbmcgbnVsbAotCQl0aGlzLnN1YmplY3QgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDaGFuZ2VTdXBwb3J0KHRoaXMsIHRoaXMuZ2V0TGlzdGVuZXJDbGFzcygpLCB0aGlzLmdldExpc3RlbmVyQXNwZWN0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBob2xkZXIncyB2YWx1ZSBoYXMgY2hhbmdlZCwga2VlcCBvdXIgc3ViamVjdCBpbiBzeW5jaC4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuc3ViamVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInN1YmplY3QgY2hhbmdlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaGFzIGNoYW5nZWQuIE5vdGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCWJvb2xlYW4gaGFzTGlzdGVuZXJzID0gdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0KCk7Ci0JCX0KLQkJdGhpcy5zdWJqZWN0ID0gdGhpcy5zdWJqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZW5nYWdlU3ViamVjdCgpOwotCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKG9sZFZhbHVlLCB0aGlzLmdldFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhc3BlY3QncyBjdXJyZW50IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3Mgb2YgbGlzdGVuZXIgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHRoZSBhc3BlY3QgYWRhcHRlcidzCi0JICogY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFzcGVjdCBhZGFwdGVyJ3MgYXNwZWN0IChlLmcuIFZBTFVFKS4KLQkgKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhc3BlY3QgYWRhcHRlcidzIHNpbmdsZSBhc3BlY3QsIG5vdCB0aGUKLQkgKiBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgYXNwZWN0IHRoZSBhc3BlY3QgYWRhcHRlciBpcyBhZGFwdGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0ZW5lcnMgZm9yIHRoZSBhc3BlY3QuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFzTGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIGZvciB0aGUgYXNwZWN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc0xpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBhc3BlY3QgaGFzIGNoYW5nZWQsIG5vdGlmeSBsaXN0ZW5lcnMgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKTsKLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3QoKSB7Ci0JCS8vIGNoZWNrIGZvciBub3RoaW5nIHRvIGxpc3RlbiB0bwotCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuZW5nYWdlU3ViamVjdF8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gYWRkIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VTdWJqZWN0XygpOwotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdCgpIHsKLQkJLy8gY2hlY2sgZm9yIG5vdGhpbmcgdG8gbGlzdGVuIHRvCi0JCWlmICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0XygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaXMgbm90IG51bGwgLSByZW1vdmUgb3VyIGxpc3RlbmVyLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0SG9sZGVyKCkgewotCQl0aGlzLnN1YmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIHN1YmplY3QgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QgaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnN1YmplY3QgPSB0aGlzLnN1YmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0SG9sZGVyKCkgewotCQl0aGlzLnN1YmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBzdWJqZWN0IHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gaXRzIGhvbGRlcgotCQl0aGlzLnN1YmplY3QgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVscygpIHsKLQkJdGhpcy5lbmdhZ2VTdWJqZWN0SG9sZGVyKCk7Ci0JCXRoaXMuZW5nYWdlU3ViamVjdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVscygpIHsKLQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0KCk7Ci0JCXRoaXMuZGlzZW5nYWdlU3ViamVjdEhvbGRlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsb2NhbCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgY2hhbmdlIHN1cHBvcnQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBhc3BlY3QgYWRhcHRlcidzCi0JICogbW9kZWxzICh0aGUgc3ViamVjdCBob2xkZXIgYW5kIHRoZSBzdWJqZWN0IGl0c2VsZikgd2hlbiB0aGUgZmlyc3QKLQkgKiByZWxldmFudCBsaXN0ZW5lciBpcyBhZGRlZC4KLQkgKiBDb252ZXJzZWx5LCBzdG9wIGxpc3RlbmluZyB0byB0aGUgYXNwZWN0IGFkYXB0ZXIncyBtb2RlbHMgd2hlbiB0aGUKLQkgKiBsYXN0IHJlbGV2YW50IGxpc3RlbmVyIGlzIHJlbW92ZWQuCi0JICogQSByZWxldmFudCBsaXN0ZW5lciBpcyBhIGxpc3RlbmVyIG9mIHRoZSByZWxldmFudCB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBMb2NhbENoYW5nZVN1cHBvcnQgZXh0ZW5kcyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIExvY2FsQ2hhbmdlU3VwcG9ydChBc3BlY3RBZGFwdGVyPFM+IHNvdXJjZSwgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQkJc3VwZXIoc291cmNlLCBsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQkJfQotCi0JCXByb3RlY3RlZCBib29sZWFuIGxpc3RlbmVySXNSZWxldmFudChDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGxDbGFzcykgewotCQkJcmV0dXJuIGxDbGFzcyA9PSB0aGlzLmxpc3RlbmVyQ2xhc3M7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb1JlbGV2YW50TGlzdGVuZXJzKENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbENsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0ZW5lcklzUmVsZXZhbnQobENsYXNzKQotCQkJCQkJJiYgdGhpcy5oYXNOb0xpc3RlbmVycyhsQ2xhc3MpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gbGlzdGVuZXJJc1JlbGV2YW50KENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbENsYXNzLCBTdHJpbmcgbGlzdGVuZXJBc3BlY3ROYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0ZW5lcklzUmVsZXZhbnQobENsYXNzKQotCQkJCQkJJiYgKGxpc3RlbmVyQXNwZWN0TmFtZSA9PSBBc3BlY3RBZGFwdGVyLnRoaXMuZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9SZWxldmFudExpc3RlbmVycyhDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGxDbGFzcywgU3RyaW5nIGxpc3RlbmVyQXNwZWN0TmFtZSkgewotCQkJcmV0dXJuIHRoaXMubGlzdGVuZXJJc1JlbGV2YW50KGxDbGFzcywgbGlzdGVuZXJBc3BlY3ROYW1lKQotCQkJCQkJJiYgdGhpcy5oYXNOb0xpc3RlbmVycyhsQ2xhc3MsIGxpc3RlbmVyQXNwZWN0TmFtZSk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIDxUIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IHZvaWQgYWRkTGlzdGVuZXIoQ2xhc3M8VD4gbENsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCQlpZiAodGhpcy5oYXNOb1JlbGV2YW50TGlzdGVuZXJzKGxDbGFzcykpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuZW5nYWdlTW9kZWxzKCk7Ci0JCQl9Ci0JCQlzdXBlci5hZGRMaXN0ZW5lcihsQ2xhc3MsIGxpc3RlbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihTdHJpbmcgbGlzdGVuZXJBc3BlY3ROYW1lLCBDbGFzczxUPiBsQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJCWlmICh0aGlzLmhhc05vUmVsZXZhbnRMaXN0ZW5lcnMobENsYXNzLCBsaXN0ZW5lckFzcGVjdE5hbWUpKSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLmVuZ2FnZU1vZGVscygpOwotCQkJfQotCQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXJBc3BlY3ROYW1lLCBsQ2xhc3MsIGxpc3RlbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gdm9pZCByZW1vdmVMaXN0ZW5lcihDbGFzczxUPiBsQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxDbGFzcywgbGlzdGVuZXIpOwotCQkJaWYgKHRoaXMuaGFzTm9SZWxldmFudExpc3RlbmVycyhsQ2xhc3MpKSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLmRpc2VuZ2FnZU1vZGVscygpOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCA8VCBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiB2b2lkIHJlbW92ZUxpc3RlbmVyKFN0cmluZyBsaXN0ZW5lckFzcGVjdE5hbWUsIENsYXNzPFQ+IGxDbGFzcywgVCBsaXN0ZW5lcikgewotCQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJBc3BlY3ROYW1lLCBsQ2xhc3MsIGxpc3RlbmVyKTsKLQkJCWlmICh0aGlzLmhhc05vUmVsZXZhbnRMaXN0ZW5lcnMobENsYXNzLCBsaXN0ZW5lckFzcGVjdE5hbWUpKSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLmRpc2VuZ2FnZU1vZGVscygpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg1Mzc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIHZhbHVlIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBjb252ZXJ0Ci0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBjaGFuZ2UKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKiAKLSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZToKLSAqIC0gI2J1aWxkVmFsdWUoKQotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgbW9kZWwgdmFsdWUKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JLyoqCi0JICogQ2FjaGUgdGhlIGN1cnJlbnQgdmFsdWUgc28gd2UgY2FuIHBhc3MgYW4gIm9sZCB2YWx1ZSIgd2hlbgotCSAqIHdlIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICogV2UgbmVlZCB0aGlzIGJlY2F1c2UgdGhlIHZhbHVlIG1heSBiZSBjYWxjdWxhdGVkIGFuZCB3ZSBtYXkKLQkgKiBub3QgYWJsZSB0byBkZXJpdmUgdGhlICJvbGQgdmFsdWUiIGZyb20gdGhlIGNvbGxlY3Rpb24KLQkgKiBjaGFuZ2UgZXZlbnQgZmlyZWQgYnkgdGhlIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIFQgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIG91ciB2YWx1ZSBpcyBudWxsIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIFZBTFVFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2FjaGVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocHJvcGVydHlOYW1lID09IFZBTFVFICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBWQUxVRSAmJiB0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbGlzdGVuZXJzIGZvciB0aGUgYXNwZWN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbGlzdGVuZXJzIGZvciB0aGUgYXNwZWN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc0xpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsIGFuZCBidWlsZCB0aGUgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZW5nYWdlTW9kZWxfKCk7Ci0JCS8vIHN5bmNoIG91ciB2YWx1ZSAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgdGhlIGNvbGxlY3Rpb24ncyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZU1vZGVsXygpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotCSAqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHdyYXBwZWQgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFQgYnVpbGRWYWx1ZSgpOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsIGFuZCBjbGVhciB0aGUgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlTW9kZWxfKCk7Ci0JCS8vIGNsZWFyIG91dCBvdXIgdmFsdWUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbgotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlTW9kZWxfKCk7Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBtb2RlbCBjaGFuZ2VkIGluIHNvbWUgZmFzaGlvbi4KLQkgKiBSZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIG5vdGlmeSBhbnkgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZCgpIHsKLQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGQsIHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODFiZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIEJ1ZmZlcmVkUHJvcGVydHlWYWx1ZU1vZGVsIGlzIHVzZWQgdG8gaG9sZCBhIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSB2YWx1ZQotICogaW4gYW5vdGhlciBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCAodGhlICJ3cmFwcGVkIiB2YWx1ZSBob2xkZXIpLiBUaGUgYXBwbGljYXRpb24KLSAqIGNhbiBtb2RpZnkgdGhpcyB0ZW1wb3JhcnkgY29weSwgYWQgbmF1c2VhbTsgYnV0IHRoZSB0ZW1wb3JhcnkgY29weSBpcyBvbmx5Ci0gKiBwYXNzZWQgdGhyb3VnaCB0byB0aGUgIndyYXBwZWQiIHZhbHVlIGhvbGRlciB3aGVuIHRoZSB0cmlnZ2VyICJhY2NlcHRzIiB0aGUKLSAqIGJ1ZmZlcmVkIHZhbHVlLiBBbHRlcm5hdGl2ZWx5LCB0aGUgYXBwbGljYXRpb24gY2FuICJyZXNldCIgdGhlIGJ1ZmZlcmVkIHZhbHVlCi0gKiB0byB0aGUgb3JpZ2luYWwsICJ3cmFwcGVkIiB2YWx1ZS4KLSAqIAotICogVGhlIHRyaWdnZXIgaXMgYW5vdGhlciB2YWx1ZSBtb2RlbCB0aGF0IGhvbGRzIGEgQm9vbGVhbiBhbmQgdGhlIGFwcGxpY2F0aW9uCi0gKiBjaGFuZ2VzIHRoZSB0cmlnZ2VyJ3MgdmFsdWUgdG8gdHJ1ZSBvbiAiYWNjZXB0IiwgZmFsc2Ugb24gInJlc2V0Ii4gVHlwaWNhbGx5LAotICogaW4gYSBkaWFsb2c6Ci0gKiAJLSBwcmVzc2luZyB0aGUgT0sgYnV0dG9uIHdpbGwgdHJpZ2dlciBhbiAiYWNjZXB0IiBhbmQgY2xvc2UgdGhlIGRpYWxvZwotICogCS0gcHJlc3NpbmcgdGhlIENhbmNlbCBidXR0b24gd2lsbCBzaW1wbHkgY2xvc2UgdGhlIGRpYWxvZywKLSAqIAkJZHJvcHBpbmcgdGhlICJidWZmZXJlZCIgdmFsdWVzIGludG8gdGhlIGJpdCBidWNrZXQKLSAqIAktIHByZXNzaW5nIHRoZSBBcHBseSBidXR0b24gd2lsbCB0cmlnZ2VyIGFuICJhY2NlcHQiIGFuZCBsZWF2ZSB0aGUgZGlhbG9nIG9wZW4KLSAqIAktIHByZXNzaW5nIHRoZSBSZXN0b3JlIGJ1dHRvbiB3aWxsIHRyaWdnZXIgYSAicmVzZXQiIGFuZCBsZWF2ZSB0aGUgZGlhbG9nIG9wZW4KLSAqIAotICogQSBudW1iZXIgb2YgYnVmZmVyZWQgcHJvcGVydHkgdmFsdWUgbW9kZWxzIGNhbiB3cmFwIGFub3RoZXIgc2V0IG9mCi0gKiBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlcnMgdGhhdCBhZGFwdCB0aGUgdmFyaW91cyBhc3BlY3RzIG9mIGEgc2luZ2xlCi0gKiBkb21haW4gbW9kZWwuIEFsbCB0aGUgYnVmZmVyZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMgY2FuIGJlIGhvb2tlZCB0byB0aGUKLSAqIHNhbWUgdHJpZ2dlciwgYW5kIHRoYXQgdHJpZ2dlciBpcyBjb250cm9sbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgdHlwaWNhbGx5Ci0gKiB2aWEgdGhlIE9LIGJ1dHRvbiBpbiBhIGRpYWxvZy4KLSAqIAotICogQHNlZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8VD4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQkvKioKLQkgKiBXZSBjYWNoZSB0aGUgdmFsdWUgaGVyZSB1bnRpbCBpdCBpcyBhY2NlcHRlZCBhbmQgcGFzc2VkCi0JICogdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIuCi0JICovCi0JcHJvdGVjdGVkIFQgYnVmZmVyZWRWYWx1ZTsKLQotCS8qKgotCSAqIFRoaXMgaXMgc2V0IHRvIHRydWUgd2hlbiB3ZSBhcmUgImFjY2VwdGluZyIgdGhlIGJ1ZmZlcmVkIHZhbHVlCi0JICogYW5kIHBhc3NpbmcgaXQgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIuIFRoaXMgYWxsb3dzCi0JICogdXMgdG8gaWdub3JlIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgZmlyZWQgYnkgdGhlIHdyYXBwZWQKLQkgKiB2YWx1ZSBob2xkZXIuCi0JICogKFdlIGNhbid0IHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlciwgYmVjYXVzZQotCSAqIGlmIHdlIGFyZSB0aGUgb25seSBsaXN0ZW5lciB0aGF0IGNvdWxkICJkZWFjdGl2YXRlIiB0aGUgd3JhcHBlZAotCSAqIHZhbHVlIGhvbGRlci4pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0aW5nOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgdHJpZ2dlciB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBidWZmZXJlZCB2YWx1ZQotCSAqIHNob3VsZCBiZSBhY2NlcHRlZCBvciByZXNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRyaWdnZXJIb2xkZXI7Ci0KLQkvKiogVGhpcyBsaXN0ZW5zIHRvIHRoZSB0cmlnZ2VyIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0cmlnZ2VyQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgb3VyIGJ1ZmZlcmVkIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkCi0JICogYSB2YWx1ZSBhbmQgaXMgcG9zc2libHkgb3V0IG9mIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVmZmVyaW5nOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBidWZmZXJlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCB0cmlnZ2VyIGhvbGRlci4KLQkgKi8KLQlwdWJsaWMgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRyaWdnZXJIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQlpZiAodHJpZ2dlckhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnRyaWdnZXJIb2xkZXIgPSB0cmlnZ2VySG9sZGVyOwotCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSBudWxsOwotCQl0aGlzLmJ1ZmZlcmluZyA9IGZhbHNlOwotCQl0aGlzLmFjY2VwdGluZyA9IGZhbHNlOwotCQl0aGlzLnRyaWdnZXJDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmlnZ2VyQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJpZ2dlckNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwudGhpcy50cmlnZ2VyQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmlnZ2VyIGNoYW5nZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHdlIGFyZSBjdXJyZW50bHkgImJ1ZmZlcmluZyIgYSB2YWx1ZSwgcmV0dXJuIHRoYXQ7Ci0JICogb3RoZXJ3aXNlLCByZXR1cm4gdGhlIHdyYXBwZWQgdmFsdWUuCi0JICovCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1ZmZlcmluZyA/IHRoaXMuYnVmZmVyZWRWYWx1ZSA6IHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NpZ24gdGhlIG5ldyB2YWx1ZSB0byBvdXIgImJ1ZmZlcmVkIiB2YWx1ZS4KLQkgKiBJdCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIKLQkgKiB3aGVuIHRoZSB0cmlnZ2VyIGlzICJhY2NlcHRlZCIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQlPYmplY3Qgb2xkID0gdGhpcy5nZXRWYWx1ZSgpOwotCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5idWZmZXJpbmcgPSB0cnVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdGhpcy5idWZmZXJlZFZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlciBleHRlbnNpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIGV4dGVuZCB0byBlbmdhZ2UgdGhlIHRyaWdnZXIgaG9sZGVyIGFsc28KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZUhvbGRlcigpIHsKLQkJc3VwZXIuZW5nYWdlVmFsdWVIb2xkZXIoKTsKLQkJdGhpcy50cmlnZ2VySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMudHJpZ2dlckNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBleHRlbmQgdG8gZGlzZW5nYWdlIHRoZSB0cmlnZ2VyIGhvbGRlciBhbHNvCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVIb2xkZXIoKSB7Ci0JCXRoaXMudHJpZ2dlckhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFZBTFVFLCB0aGlzLnRyaWdnZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc2VuZ2FnZVZhbHVlSG9sZGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHdlIGRvIG5vdCB5ZXQgaGF2ZSBhICJidWZmZXJlZCIgdmFsdWUsIHNpbXBseSBwcm9wYWdhdGUgdGhlCi0JICogY2hhbmdlIG5vdGlmaWNhdGlvbiB3aXRoIHRoZSBidWZmZXJlZCBtb2RlbCBhcyB0aGUgc291cmNlLgotCSAqIElmIHdlIGRvIGhhdmUgYSAiYnVmZmVyZWQiIHZhbHVlLCBkbyBub3RoaW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmFjY2VwdGluZykgewotCQkJLy8gaWYgd2UgYXJlIGN1cnJlbnRseSAiYWNjZXB0aW5nIiB0aGUgdmFsdWUsIGlnbm9yZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucywKLQkJCS8vIHNpbmNlIHdlIGNhdXNlZCB0aGVtIGFuZCBvdXIgb3duIGxpc3RlbmVycyBhcmUgYWxyZWFkeSBhd2FyZSBvZiB0aGUgY2hhbmdlCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuYnVmZmVyaW5nKSB7Ci0JCQl0aGlzLmhhbmRsZUNoYW5nZUNvbmZsaWN0KGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcykpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGlmIHdlIGhhdmUgYSAiYnVmZmVyZWQiIHZhbHVlIGFuZCB0aGUgIndyYXBwZWQiIHZhbHVlIGNoYW5nZXMsCi0JICogd2Ugc2ltcGx5IGlnbm9yZSB0aGUgbmV3ICJ3cmFwcGVkIiB2YWx1ZSBhbmQgc2ltcGx5IG92ZXJsYXkgaXQgd2l0aCB0aGUKLQkgKiAiYnVmZmVyZWQiIHZhbHVlIGlmIGl0IGlzICJhY2NlcHRlZCIuICgiTGFzdCBPbmUgSW4gV2lucyIgY29uY3VycmVuY3kgbW9kZWwpCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoYXQgYmVoYXZpb3Igd2l0aCBhCi0JICogZGlmZmVyZW50IGNvbmN1cnJlbmN5IG1vZGVsLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGRyb3AgdGhlICJidWZmZXJlZCIgdmFsdWUKLQkgKiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBuZXcgIndyYXBwZWQiIHZhbHVlLCBvciB5b3UgY291bGQgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlQ29uZmxpY3QoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIFRoZSB0cmlnZ2VyIGNoYW5nZWQ6Ci0JICogSWYgaXQgaXMgbm93IHRydWUsICJhY2NlcHQiIHRoZSBidWZmZXJlZCB2YWx1ZSBhbmQgZm9yd2FyZAotCSAqIGl0IHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlci4KLQkgKiBJZiBpdCBpcyBub3cgZmFsc2UsICJyZXNldCIgdGhlIGJ1ZmZlcmVkIHZhbHVlIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmlnZ2VyQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmJ1ZmZlcmluZykgewotCQkJLy8gaWYgbm90aGluZyBoYXMgYmVlbiAiYnVmZmVyZWQiLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nOgotCQkJLy8gbm90aGluZyBuZWVkcyB0byBiZSBwYXNzZWQgdGhyb3VnaDsgbm90aGluZyBuZWVkcyB0byBiZSByZXNldDsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJLy8gc2V0IHRoZSBhY2NlcHRpbmcgZmxhZyBzbyB3ZSBpZ25vcmUgYW55IGV2ZW50cwotCQkJLy8gZmlyZWQgYnkgdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyCi0JCQl0aGlzLmFjY2VwdGluZyA9IHRydWU7Ci0JCQl0aGlzLnZhbHVlSG9sZGVyKCkuc2V0VmFsdWUodGhpcy5idWZmZXJlZFZhbHVlKTsKLQkJCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IG51bGw7Ci0JCQl0aGlzLmJ1ZmZlcmluZyA9IGZhbHNlOwotCQkJLy8gY2xlYXIgdGhlIGZsYWcgb25jZSB0aGUgImFjY2VwdCIgaXMgY29tcGxldGUKLQkJCXRoaXMuYWNjZXB0aW5nID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3RpZnkgb3VyIGxpc3RlbmVycyB0aGF0IG91ciB2YWx1ZSBoYXMgYmVlbiByZXNldAotCQkJT2JqZWN0IG9sZCA9IHRoaXMuYnVmZmVyZWRWYWx1ZTsKLQkJCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IG51bGw7Ci0JCQl0aGlzLmJ1ZmZlcmluZyA9IGZhbHNlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGQsIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBidWZmZXJlZCBtb2RlbCBpcyBjdXJyZW50bHkgImJ1ZmZlcmluZyIKLQkgKiBhIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQnVmZmVyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5idWZmZXJpbmc7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9yIGFjY2VwdHMgb25seSBhIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+LgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPikgdGhpcy52YWx1ZUhvbGRlcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJpZ2dlciBpcyBhIHNwZWNpYWwgcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBvbmx5IG1haW50YWlucyBpdHMKLQkgKiB2YWx1ZSAob2YgdHJ1ZSBvciBmYWxzZSkgZHVyaW5nIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGNhdXNlZCBieQotCSAqIHRoZSAjc2V0VmFsdWUoT2JqZWN0KSBtZXRob2QuIEluIG90aGVyIHdvcmRzLCBhIFRyaWdnZXIgb2JqZWN0Ci0JICogb25seSBoYXMgYSB2YWxpZCB2YWx1ZSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRyaWdnZXIgZXh0ZW5kcyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gewotCi0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdCBhIHRyaWdnZXIgd2l0aCBhIG51bGwgdmFsdWUuCi0JCSAqLwotCQlwdWJsaWMgVHJpZ2dlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIEV4dGVuZCBzbyB0aGF0IHRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgZHVyaW5nCi0JCSAqIGNoYW5nZSBub3RpZmljYXRpb24gdHJpZ2dlcmVkIGJ5ICNzZXRWYWx1ZShPYmplY3QpLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBCb29sZWFuIGdldFZhbHVlKCkgewotCQkJaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtZXRob2QgVHJpZ2dlci52YWx1ZSgpIG1heSBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4iKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEV4dGVuZCB0byByZXNldCB0aGUgdmFsdWUgdG8gbnVsbCBvbmNlIGFsbCB0aGUKLQkJICogbGlzdGVuZXJzIGhhdmUgYmVlbiBub3RpZmllZC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQlzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQl0aGlzLnZhbHVlID0gbnVsbDsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCQkvKioKLQkJICogU2V0IHRoZSB0cmlnZ2VyJ3MgdmFsdWU6Ci0JCSAqIAktIHRydWUgaW5kaWNhdGVzICJhY2NlcHQiCi0JCSAqIAktIGZhbHNlIGluZGljYXRlcyAicmVzZXQiCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0JCQl0aGlzLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZih2YWx1ZSkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgdHJpZ2dlcidzIHZhbHVlOgotCQkgKiAJLSB0cnVlIGluZGljYXRlcyAiYWNjZXB0IgotCQkgKiAJLSBmYWxzZSBpbmRpY2F0ZXMgInJlc2V0IgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBY2NlcHQgdGhlIHRyaWdnZXIgKGkuZS4gc2V0IGl0cyB2YWx1ZSB0byB0cnVlKS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjY2VwdCgpIHsKLQkJCXRoaXMuc2V0VmFsdWUodHJ1ZSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIHRyaWdnZXIgaGFzIGJlZW4gYWNjZXB0ZWQKLQkJICogKGkuZS4gaXRzIHZhbHVlIHdhcyBjaGFuZ2VkIHRvIHRydWUpLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNBY2NlcHRlZCgpIHsKLQkJCXJldHVybiB0aGlzLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlc2V0IHRoZSB0cmlnZ2VyIChpLmUuIHNldCBpdHMgdmFsdWUgdG8gZmFsc2UpLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCQl0aGlzLnNldFZhbHVlKGZhbHNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHJpZ2dlciBoYXMgYmVlbiByZXNldAotCQkgKiAoaS5lLiBpdHMgdmFsdWUgd2FzIGNoYW5nZWQgdG8gZmFsc2UpLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNSZXNldCgpIHsKLQkJCXJldHVybiAhIHRoaXMuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1YzI3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBleHRlbnNpb24gb2YgQXNwZWN0QWRhcHRlciBwcm92aWRlcyBDb2xsZWN0aW9uQ2hhbmdlIHN1cHBvcnQuCi0gKiBUaGlzIGFsbG93cyB1cyB0byBjb252ZXJ0IGEgc2V0IG9mIG9uZSBvciBtb3JlIGNvbGxlY3Rpb25zIGludG8KLSAqIGEgc2luZ2xlIGNvbGxlY3Rpb24sIFZBTFVFUy4KLSAqIAotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gKiAjaXRlcmF0b3JfKCkKLSAqICAgICBhdCB0aGUgdmVyeSBtaW5pbXVtLCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlCi0gKiAgICAgc3ViamVjdCdzIGNvbGxlY3Rpb24gYXNwZWN0OyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICAjaXRlcmF0b3IoKSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogI3NpemVfKCkKLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICAjc2l6ZSgpIGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiAjaXRlcmF0b3IoKQotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGFuIGVtcHR5IGl0ZXJhdG9yIHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogI3NpemUoKQotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGEgemVybyB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFMgZXh0ZW5kcyBNb2RlbCwgRT4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8Uz4KLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9ucyB0aGF0IHdlIHVzZSBmb3IgdGhlIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBjb2xsZWN0aW9uTmFtZXM7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfQ09MTEVDVElPTl9OQU1FUyA9IG5ldyBTdHJpbmdbMF07Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdHJpbmdbXSB7Y29sbGVjdGlvbk5hbWV9LCBzdWJqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIGNvbGxlY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihTdHJpbmdbXSBjb2xsZWN0aW9uTmFtZXMsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCksIGNvbGxlY3Rpb25OYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdCBob2xkZXIKLQkgKiBhbmQgY29sbGVjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlciwgU3RyaW5nLi4uIGNvbGxlY3Rpb25OYW1lcykgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyKTsKLQkJdGhpcy5jb2xsZWN0aW9uTmFtZXMgPSBjb2xsZWN0aW9uTmFtZXM7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIGNvbGxlY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIENvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBjb2xsZWN0aW9uTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2NvbGxlY3Rpb25OYW1lcy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIgZm9yIGFuICJ1bmNoYW5naW5nIiBjb2xsZWN0aW9uIGluCi0JICogdGhlIHNwZWNpZmllZCBzdWJqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYSBjb2xsZWN0aW9uIGFzcGVjdCB0aGF0IGRvZXMgbm90Ci0JICogY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIgc3ViamVjdDsgYnV0IHRoZSBzdWJqZWN0IHdpbGwgY2hhbmdlLCByZXN1bHRpbmcgaW4KLQkgKiBhIG5ldyBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBFTVBUWV9DT0xMRUNUSU9OX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdCBoYXMgY2hhbmdlZCwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzCi0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uTmFtZXMpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMuaXRlcmF0b3JfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGNvbGxlY3Rpb24gYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNpdGVyYXRvcigpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yXygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IDAgOiB0aGlzLnNpemVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI3NpemUoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLml0ZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIFZBTFVFUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIGNvbGxlY3Rpb25OYW1lIDogdGhpcy5jb2xsZWN0aW9uTmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNvbGxlY3Rpb25OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCkgewotCQkJCXNiLmFwcGVuZCgiLCAiKTsKLQkJCX0KLQkJCXNiLmFwcGVuZCh0aGlzLmNvbGxlY3Rpb25OYW1lc1tpXSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcywgVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIFZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChWQUxVRVMpOyAgLy8gbm90aGluZyBmcm9tIG9yaWdpbmFsIGV2ZW50IHRvIGZvcndhcmQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTKTsgIC8vIG5vdGhpbmcgZnJvbSBvcmlnaW5hbCBldmVudCB0byBmb3J3YXJkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJhYzMxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSBDb2xsZWN0aW9uVmFsdWVNb2RlbCBiZWhhdmUgbGlrZQotICogYSByZWFkLW9ubHkgTGlzdFZhbHVlTW9kZWwsIHNvcnRhLgotICogCi0gKiBUbyBtYWludGFpbiBhIHJlYXNvbmFibHkgY29uc2lzdGVudCBhcHBlYXJhbmNlIHRvIGNsaWVudCBjb2RlLCB3ZQotICoga2VlcCBhbiBpbnRlcm5hbCBsaXN0IHNvbWV3aGF0IGluIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQgY29sbGVjdGlvbi4KLSAqIAotICogTkI6IFNpbmNlIHdlIG9ubHkgbGlzdGVuIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gd2hlbiB3ZSBoYXZlCi0gKiBsaXN0ZW5lcnMgb3Vyc2VsdmVzIGFuZCB3ZSBjYW4gb25seSBzdGF5IGluIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQKLSAqIGNvbGxlY3Rpb24gd2hpbGUgd2UgYXJlIGxpc3RlbmluZyB0byBpdCwgcmVzdWx0cyB0byB2YXJpb3VzIG1ldGhvZHMKLSAqIChlLmcuICNzaXplKCksIGdldEl0ZW0oaW50KSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSBjb2xsZWN0aW9uIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIE91ciBpbnRlcm5hbCBsaXN0LCB3aGljaCBob2xkcyB0aGUgc2FtZSBlbGVtZW50cyBhcwotCSAqIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24sIGJ1dCBrZWVwcyB0aGVtIGluIG9yZGVyLgotCSAqLwotCS8vIHdlIGRlY2xhcmUgdGhpcyBhbiBBcnJheUxpc3Qgc28gd2UgY2FuIHVzZSAjY2xvbmUoKSBhbmQgI2Vuc3VyZUNhcGFjaXR5KGludCkKLQlwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PEU+IGxpc3Q7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBDb2xsZWN0aW9uVmFsdWVNb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAoY29sbGVjdGlvbkhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBjb2xsZWN0aW9uSG9sZGVyOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0ID0gbmV3IEFycmF5TGlzdDxFPigpOwotCQkvLyBwb3N0cG9uZSBidWlsZGluZyB0aGUgbGlzdCBhbmQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24KLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGxpc3QgY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdCk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVuZCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZExpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdE5hbWUgPT0gTElTVF9WQUxVRVMgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKGxpc3ROYW1lID09IExJU1RfVkFMVUVTICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgaXRlbSwgdXNpbmcgb2JqZWN0Ci0JICogaWRlbnRpdHkgaW5zdGVhZCBvZiBlcXVhbGl0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGxhc3RJZGVudGl0eUluZGV4T2YoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGFzdElkZW50aXR5SW5kZXhPZihvLCB0aGlzLmxpc3Quc2l6ZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsYXN0IGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgaXRlbSwgc3RhcnRpbmcganVzdCBiZWZvcmUgdGhlCi0JICogdGhlIHNwZWNpZmllZCBlbmRwb2ludCwgYW5kIHVzaW5nIG9iamVjdCBpZGVudGl0eSBpbnN0ZWFkIG9mIGVxdWFsaXR5LgotCSAqLwotCXByb3RlY3RlZCBpbnQgbGFzdElkZW50aXR5SW5kZXhPZihPYmplY3QgbywgaW50IGVuZCkgewotCQlmb3IgKGludCBpID0gZW5kOyBpLS0gPiAwOyApIHsKLQkJCWlmICh0aGlzLmxpc3QuZ2V0KGkpID09IG8pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZExpc3QoKSB7Ci0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBzdHJlYW0gPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKTsKLQkJLy8gaWYgdGhlIG5ldyBjb2xsZWN0aW9uIGlzIGVtcHR5LCBkbyBub3RoaW5nCi0JCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLmxpc3QuZW5zdXJlQ2FwYWNpdHkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJCXRoaXMubGlzdC5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCQl0aGlzLnBvc3RCdWlsZExpc3QoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFuaXB1bGF0ZSB0aGUgaW50ZXJuYWwgbGlzdCBiZWZvcmUKLQkgKiBzZW5kaW5nIG91dCBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvc3RCdWlsZExpc3QoKSB7Ci0JCS8vIHRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuLi4KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIGxpc3QgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmJ1aWxkTGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KHRoaXMuaW5kZXhUb0FkZEl0ZW1zKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuaXRlbXMoZSkpLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBpbmRleFRvQWRkSXRlbXMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3Quc2l6ZSgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYXRvcjxFPiBpdGVtcyhDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQlyZXR1cm4gKEl0ZXJhdG9yPEU+KSBlLml0ZW1zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCS8vIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBpdGVtcyBpbmRpdmlkdWFsbHksCi0JCS8vIHNpbmNlIHRoZXkgYXJlIHByb2JhYmx5IG5vdCBpbiBzZXF1ZW5jZQotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuaXRlbXMoZSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QodGhpcy5sYXN0SWRlbnRpdHlJbmRleE9mKHN0cmVhbS5uZXh0KCkpLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuY2xlYXJMaXN0KHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQkKLQkvKioKLQkgKiBzeW5jaHJvbml6ZSBvdXIgaW50ZXJuYWwgbGlzdCB3aXRoIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJLy8gcHV0IGluIGVtcHR5IGNoZWNrIHNvIHdlIGRvbid0IGZpcmUgZXZlbnRzIHVubmVjZXNzYXJpbHkKLQkJaWYgKCAhIHRoaXMubGlzdC5pc0VtcHR5KCkpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJQXJyYXlMaXN0PEU+IHJlbW92ZWRJdGVtcyA9IChBcnJheUxpc3Q8RT4pIHRoaXMubGlzdC5jbG9uZSgpOwotCQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTElTVF9WQUxVRVMsIDAsIHJlbW92ZWRJdGVtcyk7Ci0JCX0KLQotCQl0aGlzLmJ1aWxkTGlzdCgpOwotCQkvLyBwdXQgaW4gZW1wdHkgY2hlY2sgc28gd2UgZG9uJ3QgZmlyZSBldmVudHMgdW5uZWNlc3NhcmlseQotCQlpZiAoICEgdGhpcy5saXN0LmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX1ZBTFVFUywgMCwgdGhpcy5saXN0KTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjhmZjcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIAotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlOgotICogLSAjYnVpbGRWYWx1ZSgpCi0gKiAgICAgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0gKiAgICAgY3VycmVudCBjb2xsZWN0aW9uIHZhbHVlCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWlnaHQgd2FudCB0byBvdmVycmlkZToKLSAqIC0gI2l0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KQotICogLSAjaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkKLSAqIC0gI2NvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkKLSAqIC0gI2NvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkKLSAqICAgICB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLXsKLQkvKiogVGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvblZhbHVlTW9kZWw8Pz4gY29sbGVjdGlvbkhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gY29sbGVjdGlvbkhvbGRlcjsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9CQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIGhhcyBjaGFuZ2VkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YmQzMDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhbm90aGVyIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIHByb3BhZ2F0ZQotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi17Ci0KLQkvKiogVGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gY29sbGVjdGlvbkhvbGRlcjsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQkJCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5lc3RlZCBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGNvbGxlY3Rpb25OYW1lID09IENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUyAmJiB0aGlzLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCQlpZiAoY29sbGVjdGlvbk5hbWUgPT0gQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTICYmIHRoaXMuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBjb2xsZWN0aW9uIGhvbGRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZW1zKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhdG9yPEU+KSBldmVudC5pdGVtcygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXIgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkNjVlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5OdWxsTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiA8Y29kZT5Db2xsZWN0aW9uVmFsdWVNb2RlbDwvY29kZT4gYW5kIHVzZXMgYSA8Y29kZT5UcmFuc2Zvcm1lcjwvY29kZT4KLSAqIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdG8geWV0IGFub3RoZXIKLSAqIDxjb2RlPkNvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPi4gVGhpcyBjb21wb3NpdGUgY29sbGVjdGlvbiBjb250YWlucwotICogdGhlIGNvbWJpbmVkIGl0ZW1zIGZyb20gYWxsIHRoZXNlIGNvbXBvbmVudCBjb2xsZWN0aW9ucy4KLSAqIAotICogTkI6IFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gbXVzdCBiZSBhbiAiaWRlbnRpdHkgc2V0IiB0aGF0IGRvZXMgbm90Ci0gKiBjb250YWluIHRoZSBzYW1lIGl0ZW0gdHdpY2Ugb3IgdGhpcyBjbGFzcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAqIAotICogVGVybWlub2xvZ3k6Ci0gKiAtIHNvdXJjZXMgLSB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbDsgdGhlc2UKLSAqICAgIGFyZSBjb252ZXJ0ZWQgaW50byBjb21wb25lbnQgQ1ZNcyBieSB0aGUgdHJhbnNmb3JtZXIKLSAqIC0gY29tcG9uZW50IENWTXMgLSB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzIHRoYXQgYXJlIGNvbWJpbmVkCi0gKiAgICBieSB0aGlzIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsCi0gKiAtIGl0ZW1zIC0gdGhlIGl0ZW1zIGhlbGQgYnkgdGhlIGNvbXBvbmVudCBDVk1zCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMSwgRTI+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXI8RTE+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4KLXsKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSAob3B0aW9uYWwpIHVzZXItc3VwcGxpZWQgb2JqZWN0IHRoYXQgdHJhbnNmb3JtcwotCSAqIHRoZSBpdGVtcyBpbiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHRvIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLgotCSAqLwotCXByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXI7Ci0KLQkvKioKLQkgKiBDYWNoZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzIHRoYXQKLQkgKiB3ZXJlIGdlbmVyYXRlZCBieSB0aGUgdHJhbnNmb3JtZXI7IGtleWVkIGJ5IHRoZSBpdGVtCi0JICogaW4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIHRyYW5zZm9ybWVyLgotCSAqLwotCXByaXZhdGUgZmluYWwgSWRlbnRpdHlIYXNoTWFwPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+IGNvbXBvbmVudENWTXM7Ci0KLQkvKioKLQkgKiBDYWNoZSBvZiB0aGUgY29sbGVjdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgY29tcG9uZW50Ci0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMgYWJvdmU7IGtleWVkIGJ5IHRoZSBjb21wb25lbnQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscy4KLQkgKiBVc2UgQXJyYXlMaXN0cyBzbyB3ZSBjYW4gdXNlIEFycmF5TGlzdC1zcGVjaWZpYyBtZXRob2RzCi0JICogKGUuZy4gI2Nsb25lKCkgYW5kICNlbnN1cmVDYXBhY2l0eSgpKS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElkZW50aXR5SGFzaE1hcDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4sIEFycmF5TGlzdDxFMj4+IGNvbGxlY3Rpb25zOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscy4gKi8KLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBjb21wb25lbnRDVk1MaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgc2l6ZSBvZiB0aGUgY29tcG9zaXRlIGNvbGxlY3Rpb24uICovCi0JcHJpdmF0ZSBpbnQgc2l6ZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmCi0JICogICAgIC0gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMgb3IKLQkgKiAgICAgLSB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgPGNvZGU+dHJhbnNmb3JtKEUxKTwvY29kZT4gbWV0aG9kCi0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcyhjb2xsZWN0aW9uSG9sZGVyLCBUcmFuc2Zvcm1lci5OdWxsLjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+Pmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uSG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCQl0aGlzLmNvbXBvbmVudENWTXMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+KCk7Ci0JCXRoaXMuY29sbGVjdGlvbnMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiwgQXJyYXlMaXN0PEUyPj4oKTsKLQkJdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21wb25lbnRMaXN0ZW5lcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZgotCSAqICAgICAtIHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBjb2xsZWN0aW9uCi0JICogICAgICAgdmFsdWUgbW9kZWxzIG9yCi0JICogICAgIC0geW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIDxjb2RlPnRyYW5zZm9ybShFMSk8L2NvZGU+IG1ldGhvZAotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSA8Y29kZT5UcmFuc2Zvcm1lcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RTE+KGxpc3RIb2xkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFMT4obGlzdEhvbGRlciksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24uIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmCi0JICogICAgIC0gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBhbHJlYWR5IGNvbnRhaW5zIGNvbGxlY3Rpb24KLQkgKiAgICAgICB2YWx1ZSBtb2RlbHMgb3IKLQkgKiAgICAgLSB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgPGNvZGU+dHJhbnNmb3JtKEUxKTwvY29kZT4gbWV0aG9kCi0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb248PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uLCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbiksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbXBvbmVudExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0JCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50Q29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRDb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21wb25lbnQgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RTI+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEUyPih0aGlzLmJ1aWxkQ29sbGVjdGlvbnNJdGVyYXRvcnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEl0ZXJhdG9yPEUyPj4gYnVpbGRDb2xsZWN0aW9uc0l0ZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEFycmF5TGlzdDxFMj4sIEl0ZXJhdG9yPEUyPj4odGhpcy5jb2xsZWN0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxFMj4gdHJhbnNmb3JtKEFycmF5TGlzdDxFMj4gbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5zaXplOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXIgb3ZlcnJpZGVzL2ltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCBvdXIgY2FjaGUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5hZGRBbGxDb21wb25lbnRTb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIGFsbCB0aGUgc291cmNlcyB0byBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscwotCSAqIGFuZCBhZGQgdGhlaXIgaXRlbXMgdG8gb3VyIGNhY2hlLCB3aXRoIG5vIGV2ZW50IG5vdGlmaWNhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbGxDb21wb25lbnRTb3VyY2VzKCkgewotCQlmb3IgKEUxIHNvdXJjZSA6IHRoaXMuY29sbGVjdGlvbkhvbGRlcikgewotCQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2Uoc291cmNlLCBOdWxsTGlzdC48RTI+aW5zdGFuY2UoKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbXBvbmVudHMuLi4KLQkJZm9yIChDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNIDogdGhpcy5jb21wb25lbnRDVk1zLnZhbHVlcygpKSB7Ci0JCQljb21wb25lbnRDVk0ucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFZBTFVFUywgdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lcik7Ci0JCX0KLQkJLy8gLi4uYW5kIGNsZWFyIHRoZSBjYWNoZQotCQl0aGlzLmNvbXBvbmVudENWTXMuY2xlYXIoKTsKLQkJdGhpcy5jb2xsZWN0aW9ucy5jbGVhcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSBhZGRlZDsKLQkgKiBhZGQgdGhlaXIgY29ycmVzcG9uZGluZyBpdGVtcyB0byBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEUyPiBhZGRlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4oKTsKLQkJZm9yIChJdGVyYXRvcjxFMT4gc3RyZWFtID0gdGhpcy5pdGVtcyhldmVudCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2Uoc3RyZWFtLm5leHQoKSwgYWRkZWRJdGVtcyk7Ci0JCX0KLQkJdGhpcy5maXJlSXRlbXNBZGRlZChWQUxVRVMsIGFkZGVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIHNvdXJjZSB0byBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwKLQkgKiBhbmQgYWRkIGl0cyBpdGVtcyB0byBvdXIgY2FjaGUgYW5kIHRoZSAiY29sbGVjdGluZyBwYXJhbWV0ZXIiLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudFNvdXJjZShFMSBzb3VyY2UsIExpc3Q8RTI+IGFkZGVkSXRlbXMpIHsKLQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTSA9IHRoaXMudHJhbnNmb3JtKHNvdXJjZSk7Ci0JCWlmICh0aGlzLmNvbXBvbmVudENWTXMucHV0KHNvdXJjZSwgY29tcG9uZW50Q1ZNKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkdXBsaWNhdGUgY29tcG9uZW50OiAiICsgc291cmNlKTsKLQkJfQotCQljb21wb25lbnRDVk0uYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFZBTFVFUywgdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lcik7Ci0JCUFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8RTI+KGNvbXBvbmVudENWTS5zaXplKCkpOwotCQlpZiAodGhpcy5jb2xsZWN0aW9ucy5wdXQoY29tcG9uZW50Q1ZNLCBjb21wb25lbnRDb2xsZWN0aW9uKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkdXBsaWNhdGUgY29sbGVjdGlvbjogIiArIHNvdXJjZSk7Ci0JCX0KLQkJdGhpcy5hZGRDb21wb25lbnRJdGVtcyhjb21wb25lbnRDVk0sIGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQlhZGRlZEl0ZW1zLmFkZEFsbChjb21wb25lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IENWTSB0byB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudAotCSAqIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50SXRlbXMoQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTSwgQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uKSB7Ci0JCWludCBpdGVtc1NpemUgPSBjb21wb25lbnRDVk0uc2l6ZSgpOwotCQl0aGlzLnNpemUgKz0gaXRlbXNTaXplOwotCQljb21wb25lbnRDb2xsZWN0aW9uLmVuc3VyZUNhcGFjaXR5KGNvbXBvbmVudENvbGxlY3Rpb24uc2l6ZSgpICsgaXRlbXNTaXplKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChjb21wb25lbnRDb2xsZWN0aW9uLCBjb21wb25lbnRDVk0pOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSByZW1vdmVkOwotCSAqIHJlbW92ZSB0aGVpciBjb3JyZXNwb25kaW5nIGl0ZW1zIGZyb20gb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEUyPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPigpOwotCQlmb3IgKEl0ZXJhdG9yPEUxPiBzdHJlYW0gPSB0aGlzLml0ZW1zKGV2ZW50KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZShzdHJlYW0ubmV4dCgpLCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChWQUxVRVMsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBpdGVtcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogZnJvbSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29tcG9uZW50U291cmNlKEUxIHNvdXJjZSwgTGlzdDxFMj4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRDVk0gPSB0aGlzLmNvbXBvbmVudENWTXMucmVtb3ZlKHNvdXJjZSk7Ci0JCWlmIChjb21wb25lbnRDVk0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzc2luZyBjb21wb25lbnQ6ICIgKyBzb3VyY2UpOwotCQl9Ci0JCWNvbXBvbmVudENWTS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVkFMVUVTLCB0aGlzLmNvbXBvbmVudENWTUxpc3RlbmVyKTsKLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9ucy5yZW1vdmUoY29tcG9uZW50Q1ZNKTsKLQkJaWYgKGNvbXBvbmVudENvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzc2luZyBjb2xsZWN0aW9uOiAiICsgc291cmNlKTsKLQkJfQotCQlyZW1vdmVkSXRlbXMuYWRkQWxsKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLnJlbW92ZUNvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBvdXIgc2l6ZSBhbmQgY29sbGVjdGlvbiBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb21wb25lbnRJdGVtcyhBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24pIHsKLQkJdGhpcy5zaXplIC09IGNvbXBvbmVudENvbGxlY3Rpb24uc2l6ZSgpOwotCQljb21wb25lbnRDb2xsZWN0aW9uLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbXBvbmVudCBzb3VyY2VzIGNsZWFyZWQ7Ci0JICogY2xlYXIgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUFsbENvbXBvbmVudFNvdXJjZXMoKTsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoVkFMVUVTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxDb21wb25lbnRTb3VyY2VzKCkgewotCQkvLyBjb3B5IHRoZSBrZXlzIHNvIHdlIGRvbid0IGVhdCBvdXIgb3duIHRhaWwKLQkJQXJyYXlMaXN0PEUxPiBjb3B5ID0gbmV3IEFycmF5TGlzdDxFMT4odGhpcy5jb21wb25lbnRDVk1zLmtleVNldCgpKTsKLQkJZm9yIChFMSBzb3VyY2UgOiBjb3B5KSB7Ci0JCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZShzb3VyY2UsIE51bGxMaXN0LjxFMj5pbnN0YW5jZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyBjaGFuZ2VkOwotCSAqIHJlYnVpbGQgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUFsbENvbXBvbmVudFNvdXJjZXMoKTsKLQkJdGhpcy5hZGRBbGxDb21wb25lbnRTb3VyY2VzKCk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IHRyYW5zZm9ybShFMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lci50cmFuc2Zvcm0odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb25zIGhhZCBpdGVtcyBhZGRlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBpdGVtc1NpemUgPSBldmVudC5pdGVtc1NpemUoKTsKLQkJdGhpcy5zaXplICs9IGl0ZW1zU2l6ZTsKLQotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldCh0aGlzLmNvbXBvbmVudENWTShldmVudCkpOwotCQljb21wb25lbnRDb2xsZWN0aW9uLmVuc3VyZUNhcGFjaXR5KGNvbXBvbmVudENvbGxlY3Rpb24uc2l6ZSgpICsgaXRlbXNTaXplKTsKLQotCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKHRoaXMuY29tcG9uZW50SXRlbXMoZXZlbnQpLCBjb21wb25lbnRDb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb25zIGhhZCBpdGVtcyByZW1vdmVkOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnNpemUgLT0gZXZlbnQuaXRlbXNTaXplKCk7Ci0JCUFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbnMuZ2V0KHRoaXMuY29tcG9uZW50Q1ZNKGV2ZW50KSk7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbih0aGlzLmNvbXBvbmVudEl0ZW1zKGV2ZW50KSwgY29tcG9uZW50Q29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9ucyB3YXMgY2xlYXJlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGVzIGJ5IGNsZWFyaW5nIG91dCB0aGUgYXBwcm9wcmlhdGUKLQkgKiBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudENvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldCh0aGlzLmNvbXBvbmVudENWTShldmVudCkpOwotCQlBcnJheUxpc3Q8RTI+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLnJlbW92ZUNvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoVkFMVUVTLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb25zIGNoYW5nZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlcyBieSBjbGVhcmluZyBvdXQgdGhlIGFwcHJvcHJpYXRlCi0JICogY29sbGVjdGlvbiBhbmQgdGhlbiByZWJ1aWxkaW5nIGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudENvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNID0gdGhpcy5jb21wb25lbnRDVk0oZXZlbnQpOwotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldChjb21wb25lbnRDVk0pOwotCQl0aGlzLnJlbW92ZUNvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLmFkZENvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENWTSwgY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUyk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYXRvcjxFMj4gY29tcG9uZW50SXRlbXMoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmF0b3I8RTI+KSBldmVudC5pdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTShDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4pIGV2ZW50LmdldFNvdXJjZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjODRjNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICogPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGFuZCB1c2VzIGEgPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+Ci0gKiB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IHRvIHlldCBhbm90aGVyCi0gKiA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4uIFRoaXMgY29tcG9zaXRlIGxpc3QgY29udGFpbnMKLSAqIHRoZSBjb21iaW5lZCBpdGVtcyBmcm9tIGFsbCB0aGVzZSBjb21wb25lbnQgbGlzdHMuCi0gKiAKLSAqIFRlcm1pbm9sb2d5OgotICogLSBzb3VyY2VzIC0gdGhlIGl0ZW1zIGluIHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWw7IHRoZXNlCi0gKiAgICBhcmUgY29udmVydGVkIGludG8gY29tcG9uZW50IExWTXMgYnkgdGhlIHRyYW5zZm9ybWVyCi0gKiAtIGNvbXBvbmVudExWTXMgLSB0aGUgY29tcG9uZW50IGxpc3QgdmFsdWUgbW9kZWxzIHRoYXQgYXJlIGNvbWJpbmVkCi0gKiAgICBieSB0aGlzIGNvbXBvc2l0ZSBsaXN0IHZhbHVlIG1vZGVsCi0gKiAtIGl0ZW1zIC0gdGhlIGl0ZW1zIGhlbGQgYnkgdGhlIGNvbXBvbmVudCBMVk1zCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxFMSwgRTI+Ci0JZXh0ZW5kcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RTE+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFMj4KLXsKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSAob3B0aW9uYWwpIHVzZXItc3VwcGxpZWQgb2JqZWN0IHRoYXQgdHJhbnNmb3JtcwotCSAqIHRoZSBpdGVtcyBpbiB0aGUgd3JhcHBlZCBsaXN0IHRvIGxpc3QgdmFsdWUgbW9kZWxzLgotCSAqLwotCXByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXI8RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXI7Ci0KLQkvKioKLQkgKiBDYWNoZSBvZiB0aGUgc291cmNlcywgY29tcG9uZW50IExWTXMsIGxpc3RzLgotCSAqLwotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEluZm8+IGluZm9MaXN0OwotCXByb3RlY3RlZCBjbGFzcyBJbmZvIHsKLQkJLy8gdGhlIG9iamVjdCBwYXNzZWQgdG8gdGhlIHRyYW5zZm9ybWVyCi0JCWZpbmFsIEUxIHNvdXJjZTsKLQkJLy8gdGhlIGxpc3QgdmFsdWUgbW9kZWwgZ2VuZXJhdGVkIGJ5IHRoZSB0cmFuc2Zvcm1lcgotCQlmaW5hbCBMaXN0VmFsdWVNb2RlbDxFMj4gY29tcG9uZW50TFZNOwotCQkvLyBjYWNoZSBvZiB0aGUgaXRlbXMgaGVsZCBieSB0aGUgY29tcG9uZW50IExWTQotCQlmaW5hbCBBcnJheUxpc3Q8RTI+IGl0ZW1zOwotCQkvLyB0aGUgY29tcG9uZW50IExWTSdzIGJlZ2lubmluZyBpbmRleCB3aXRoaW4gdGhlIGNvbXBvc2l0ZSBMVk0KLQkJaW50IGJlZ2luOwotCQlJbmZvKEUxIHNvdXJjZSwgTGlzdFZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudExWTSwgQXJyYXlMaXN0PEUyPiBpdGVtcywgaW50IGJlZ2luKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLmNvbXBvbmVudExWTSA9IGNvbXBvbmVudExWTTsKLQkJCXRoaXMuaXRlbXMgPSBpdGVtczsKLQkJCXRoaXMuYmVnaW4gPSBiZWdpbjsKLQkJfQotCX0KLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBjb21wb25lbnQgbGlzdCB2YWx1ZSBtb2RlbHMuICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgY29tcG9uZW50TFZNTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHNpemUgb2YgdGhlIGNvbXBvc2l0ZSBsaXN0LiAqLwotCXByaXZhdGUgaW50IHNpemU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZgotCSAqICAgICAtIHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGxpc3QgdmFsdWUgbW9kZWxzIG9yCi0JICogICAgIC0geW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIDxjb2RlPnRyYW5zZm9ybShFMSk8L2NvZGU+IG1ldGhvZAotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSA8Y29kZT5UcmFuc2Zvcm1lcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobGlzdEhvbGRlciwgVHJhbnNmb3JtZXIuTnVsbC48RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQkJdGhpcy5pbmZvTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW5mbz4oKTsKLQkJdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21wb25lbnRMVk1MaXN0ZW5lcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogbGlzdC4gVXNlIHRoaXMgY29uc3RydWN0b3IgaWYKLQkgKiAgICAgLSB0aGUgd3JhcHBlZCBsaXN0IGFscmVhZHkgY29udGFpbnMgbGlzdCB2YWx1ZSBtb2RlbHMgb3IKLQkgKiAgICAgLSB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgPGNvZGU+dHJhbnNmb3JtKEUxKTwvY29kZT4gbWV0aG9kCi0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbChMaXN0PD8gZXh0ZW5kcyBFMT4gbGlzdCkgewotCQl0aGlzKG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxFMT4obGlzdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogbGlzdCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKExpc3Q8PyBleHRlbmRzIEUxPiBsaXN0LCBUcmFuc2Zvcm1lcjxFMSwgTGlzdFZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxFMT4obGlzdCksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZENvbXBvbmVudExWTUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0JCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50TGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRMaXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21wb25lbnQgTFZNIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEUyIGdldChpbnQgaW5kZXgpIHsKLQkJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSB0aGlzLnNpemUpKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6ICIgKyB0aGlzLnNpemUpOwotCQl9Ci0JCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIGluZm8gbGlzdAotCQlmb3IgKGludCBpID0gdGhpcy5pbmZvTGlzdC5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoaSk7Ci0JCQlpZiAoaW5kZXggPj0gaW5mby5iZWdpbikgewotCQkJCXJldHVybiBpbmZvLml0ZW1zLmdldChpbmRleCAtIGluZm8uYmVnaW4pOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgIC8vIHNvbWV0aGluZyBpcyB3YWNrCi0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEUyPih0aGlzLmJ1aWxkTGlzdHNJdGVyYXRvcnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8RTI+PiBidWlsZExpc3RzSXRlcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPEluZm8sIExpc3RJdGVyYXRvcjxFMj4+KHRoaXMuaW5mb0xpc3QubGlzdEl0ZXJhdG9yKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFMj4gdHJhbnNmb3JtKEluZm8gaW5mbykgewotCQkJCXJldHVybiBpbmZvLml0ZW1zLmxpc3RJdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5hcnJheSh0aGlzLmxpc3RJdGVyYXRvcigpLCB0aGlzLnNpemUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbFdyYXBwZXIgb3ZlcnJpZGVzL2ltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCBvdXIgY2FjaGUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgbGlzdCwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKDAsIHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBjb21wb25lbnQgTFZNcy4uLgotCQlmb3IgKEluZm8gaW5mbyA6IHRoaXMuaW5mb0xpc3QpIHsKLQkJCWluZm8uY29tcG9uZW50TFZNLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX1ZBTFVFUywgdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lcik7Ci0JCX0KLQkJLy8gLi4uYW5kIGNsZWFyIHRoZSBjYWNoZQotCQl0aGlzLmluZm9MaXN0LmNsZWFyKCk7Ci0JCXRoaXMuc2l6ZSA9IDA7Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIGFkZGVkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYWRkQ29tcG9uZW50U291cmNlcyhldmVudC5nZXRJbmRleCgpLCB0aGlzLml0ZW1zKGV2ZW50KSwgZXZlbnQuaXRlbXNTaXplKCksIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQl9Ci0KLQkvKioKLQkgKiBEbyBub3QgZmlyZSBhbiBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21wb25lbnRTb3VyY2VzKGludCBhZGRlZFNvdXJjZXNJbmRleCwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gYWRkZWRTb3VyY2VzLCBpbnQgYWRkZWRTb3VyY2VzU2l6ZSkgewotCQl0aGlzLmFkZENvbXBvbmVudFNvdXJjZXMoYWRkZWRTb3VyY2VzSW5kZXgsIGFkZGVkU291cmNlcywgYWRkZWRTb3VyY2VzU2l6ZSwgZmFsc2UpOyAgLy8gZmFsc2UgPSBkbyBub3QgZmlyZSBldmVudAotCX0KLQotCS8qKgotCSAqIEFkZCBpbmZvcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlcyB0byBvdXIgY2FjaGUuCi0JICogRmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgcmVxdWVzdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudFNvdXJjZXMoaW50IGFkZGVkU291cmNlc0luZGV4LCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEUxPiBhZGRlZFNvdXJjZXMsIGludCBhZGRlZFNvdXJjZXNTaXplLCBib29sZWFuIGZpcmVFdmVudCkgewotCQlBcnJheUxpc3Q8SW5mbz4gbmV3SW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0PEluZm8+KGFkZGVkU291cmNlc1NpemUpOwotCQkvLyB0aGUgJ2l0ZW1zJyBhcmUgZWl0aGVyIHRhY2tlZCBvbiB0byB0aGUgZW5kIG9yCi0JCS8vIGF0IHRoZSAnYmVnaW4nIGluZGV4IG9mIHRoZSBmaXJzdCAnaW5mbycgdGhhdCBpcyBiZWluZyBwdXNoZWQgYmFjawotCQlpbnQgbmV3SXRlbXNJbmRleCA9IChhZGRlZFNvdXJjZXNJbmRleCA9PSB0aGlzLmluZm9MaXN0LnNpemUoKSkgPyB0aGlzLnNpemUgOiB0aGlzLmluZm9MaXN0LmdldChhZGRlZFNvdXJjZXNJbmRleCkuYmVnaW47Ci0KLQkJaW50IGJlZ2luID0gbmV3SXRlbXNJbmRleDsKLQkJd2hpbGUgKGFkZGVkU291cmNlcy5oYXNOZXh0KCkpIHsKLQkJCUUxIHNvdXJjZSA9IGFkZGVkU291cmNlcy5uZXh0KCk7Ci0JCQlMaXN0VmFsdWVNb2RlbDxFMj4gY29tcG9uZW50TFZNID0gdGhpcy50cmFuc2Zvcm0oc291cmNlKTsKLQkJCWNvbXBvbmVudExWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9WQUxVRVMsIHRoaXMuY29tcG9uZW50TFZNTGlzdGVuZXIpOwotCQkJQXJyYXlMaXN0PEUyPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KGNvbXBvbmVudExWTS5zaXplKCkpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChpdGVtcywgY29tcG9uZW50TFZNLmxpc3RJdGVyYXRvcigpKTsKLQkJCW5ld0luZm9MaXN0LmFkZChuZXcgSW5mbyhzb3VyY2UsIGNvbXBvbmVudExWTSwgaXRlbXMsIGJlZ2luKSk7Ci0JCQliZWdpbiArPSBpdGVtcy5zaXplKCk7Ci0JCX0KLQkJdGhpcy5pbmZvTGlzdC5hZGRBbGwoYWRkZWRTb3VyY2VzSW5kZXgsIG5ld0luZm9MaXN0KTsKLQkJaW50IG5ld0l0ZW1zU2l6ZSA9IGJlZ2luIC0gbmV3SXRlbXNJbmRleDsKLQkJdGhpcy5zaXplICs9IG5ld0l0ZW1zU2l6ZTsKLQotCQkvLyBidW1wIHRoZSAnYmVnaW4nIGluZGV4IGZvciBhbGwgdGhlIGluZm9zIHRoYXQgd2VyZSBwdXNoZWQgYmFjayBieSB0aGUgaW5zZXJ0Ci0JCWludCBtb3ZlZEluZm9zSW5kZXggPSBhZGRlZFNvdXJjZXNJbmRleCArIGFkZGVkU291cmNlc1NpemU7Ci0JCWZvciAoaW50IGkgPSBtb3ZlZEluZm9zSW5kZXg7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiArPSBuZXdJdGVtc1NpemU7Ci0JCX0KLQotCQlpZiAoZmlyZUV2ZW50KSB7Ci0JCQlBcnJheUxpc3Q8RTI+IG5ld0l0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4obmV3SXRlbXNTaXplKTsKLQkJCWZvciAoaW50IGkgPSBhZGRlZFNvdXJjZXNJbmRleDsgaSA8IG1vdmVkSW5mb3NJbmRleDsgaSsrKSB7Ci0JCQkJbmV3SXRlbXMuYWRkQWxsKHRoaXMuaW5mb0xpc3QuZ2V0KGkpLml0ZW1zKTsKLQkJCX0KLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9WQUxVRVMsIG5ld0l0ZW1zSW5kZXgsIG5ld0l0ZW1zKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSByZW1vdmVkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2VzKGV2ZW50LmdldEluZGV4KCksIGV2ZW50Lml0ZW1zU2l6ZSgpLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JfQotCi0JLyoqCi0JICogRG8gbm90IGZpcmUgYW4gZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29tcG9uZW50U291cmNlcyhpbnQgcmVtb3ZlZFNvdXJjZXNJbmRleCwgaW50IHJlbW92ZWRTb3VyY2VzU2l6ZSkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZXMocmVtb3ZlZFNvdXJjZXNJbmRleCwgcmVtb3ZlZFNvdXJjZXNTaXplLCBmYWxzZSk7ICAvLyBmYWxzZSA9IGRvIG5vdCBmaXJlIGV2ZW50Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBpbmZvcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlcyBmcm9tIG91ciBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb21wb25lbnRTb3VyY2VzKGludCByZW1vdmVkU291cmNlc0luZGV4LCBpbnQgcmVtb3ZlZFNvdXJjZXNTaXplLCBib29sZWFuIGZpcmVFdmVudCkgewotCQlpbnQgcmVtb3ZlZEl0ZW1zSW5kZXggPSB0aGlzLmluZm9MaXN0LmdldChyZW1vdmVkU291cmNlc0luZGV4KS5iZWdpbjsKLQkJaW50IG1vdmVkU291cmNlc0luZGV4ID0gcmVtb3ZlZFNvdXJjZXNJbmRleCArIHJlbW92ZWRTb3VyY2VzU2l6ZTsKLQkJaW50IG1vdmVkSXRlbXNJbmRleCA9IChtb3ZlZFNvdXJjZXNJbmRleCA9PSB0aGlzLmluZm9MaXN0LnNpemUoKSkgPyB0aGlzLnNpemUgOiB0aGlzLmluZm9MaXN0LmdldChtb3ZlZFNvdXJjZXNJbmRleCkuYmVnaW47Ci0JCWludCByZW1vdmVkSXRlbXNTaXplID0gbW92ZWRJdGVtc0luZGV4IC0gcmVtb3ZlZEl0ZW1zSW5kZXg7Ci0JCXRoaXMuc2l6ZSAtPSByZW1vdmVkSXRlbXNTaXplOwotCi0JCUxpc3Q8SW5mbz4gc3ViTGlzdCA9IHRoaXMuaW5mb0xpc3Quc3ViTGlzdChyZW1vdmVkU291cmNlc0luZGV4LCByZW1vdmVkU291cmNlc0luZGV4ICsgcmVtb3ZlZFNvdXJjZXNTaXplKTsKLQkJQXJyYXlMaXN0PEluZm8+IHJlbW92ZWRJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW5mbz4oc3ViTGlzdCk7ICAvLyBtYWtlIGEgY29weQotCQlzdWJMaXN0LmNsZWFyKCk7Ci0KLQkJLy8gZGVjcmVtZW50IHRoZSAnYmVnaW4nIGluZGV4IGZvciBhbGwgdGhlIGluZm9zIHRoYXQgd2VyZSBtb3ZlZCBmb3J3YXJkIGJ5IHRoZSBkZWxldGVzCi0JCWZvciAoaW50IGkgPSByZW1vdmVkU291cmNlc0luZGV4OyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQkJfQotCi0JCWZvciAoSW5mbyByZW1vdmVkSW5mbyA6IHJlbW92ZWRJbmZvTGlzdCkgewotCQkJcmVtb3ZlZEluZm8uY29tcG9uZW50TFZNLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX1ZBTFVFUywgdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZmlyZUV2ZW50KSB7Ci0JCQlBcnJheUxpc3Q8RTI+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KHJlbW92ZWRJdGVtc1NpemUpOwotCQkJZm9yIChJbmZvIHJlbW92ZWRJbmZvIDogcmVtb3ZlZEluZm9MaXN0KSB7Ci0JCQkJcmVtb3ZlZEl0ZW1zLmFkZEFsbChyZW1vdmVkSW5mby5pdGVtcyk7Ci0JCQl9Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTElTVF9WQUxVRVMsIHJlbW92ZWRJdGVtc0luZGV4LCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIHJlcGxhY2VkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVwbGFjZUNvbXBvbmVudFNvdXJjZXMoZXZlbnQuZ2V0SW5kZXgoKSwgdGhpcy5pdGVtcyhldmVudCksIGV2ZW50Lml0ZW1zU2l6ZSgpLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZWQgY29tcG9uZW50IHNvdXJjZXMgd2lsbCBub3QgKHR5cGljYWxseSkgbWFwIHRvIGEgc2V0IG9mIHJlcGxhY2VkCi0JICogaXRlbXMsIHNvIHdlIHJlbW92ZSBhbmQgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGxpc3RzIG9mIGl0ZW1zLCByZXN1bHRpbmcgaW4KLQkgKiB0d28gZXZlbnRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VDb21wb25lbnRTb3VyY2VzKGludCByZXBsYWNlZFNvdXJjZXNJbmRleCwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmV3U291cmNlcywgaW50IHJlcGxhY2VkU291cmNlc1NpemUsIGJvb2xlYW4gZmlyZUV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50U291cmNlcyhyZXBsYWNlZFNvdXJjZXNJbmRleCwgcmVwbGFjZWRTb3VyY2VzU2l6ZSwgZmlyZUV2ZW50KTsKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKHJlcGxhY2VkU291cmNlc0luZGV4LCBuZXdTb3VyY2VzLCByZXBsYWNlZFNvdXJjZXNTaXplLCBmaXJlRXZlbnQpOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSBtb3ZlZDsgdXBkYXRlIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vdmVDb21wb25lbnRTb3VyY2VzKGV2ZW50LmdldFRhcmdldEluZGV4KCksIGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldE1vdmVMZW5ndGgoKSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVDb21wb25lbnRTb3VyY2VzKGludCB0YXJnZXRTb3VyY2VzSW5kZXgsIGludCBzb3VyY2VTb3VyY2VzSW5kZXgsIGludCBtb3ZlZFNvdXJjZXNMZW5ndGgsIGJvb2xlYW4gZmlyZUV2ZW50KSB7Ci0JCWludCBzb3VyY2VJdGVtc0luZGV4ID0gdGhpcy5pbmZvTGlzdC5nZXQoc291cmNlU291cmNlc0luZGV4KS5iZWdpbjsKLQotCQlpbnQgbmV4dFNvdXJjZVNvdXJjZUluZGV4ID0gc291cmNlU291cmNlc0luZGV4ICsgbW92ZWRTb3VyY2VzTGVuZ3RoOwotCQlpbnQgbmV4dFNvdXJjZUl0ZW1JbmRleCA9IChuZXh0U291cmNlU291cmNlSW5kZXggPT0gdGhpcy5pbmZvTGlzdC5zaXplKCkpID8gdGhpcy5zaXplIDogdGhpcy5pbmZvTGlzdC5nZXQobmV4dFNvdXJjZVNvdXJjZUluZGV4KS5iZWdpbjsKLQkJaW50IG1vdmVJdGVtc0xlbmd0aCA9IG5leHRTb3VyY2VJdGVtSW5kZXggLSBzb3VyY2VJdGVtc0luZGV4OwotCi0JCWludCB0YXJnZXRJdGVtc0luZGV4ID0gLTE7Ci0JCWlmIChzb3VyY2VTb3VyY2VzSW5kZXggPiB0YXJnZXRTb3VyY2VzSW5kZXgpIHsKLQkJCS8vIG1vdmUgZnJvbSBoaWdoIHRvIGxvdyBpbmRleAotCQkJdGFyZ2V0SXRlbXNJbmRleCA9IHRoaXMuaW5mb0xpc3QuZ2V0KHRhcmdldFNvdXJjZXNJbmRleCkuYmVnaW47Ci0JCX0gZWxzZSB7Ci0JCQkvLyBtb3ZlIGZyb20gbG93IHRvIGhpZ2ggaW5kZXggKGhpZ2hlciBpdGVtcyBtb3ZlIGRvd24gZHVyaW5nIG1vdmUpCi0JCQlpbnQgbmV4dFRhcmdldFNvdXJjZUluZGV4ID0gdGFyZ2V0U291cmNlc0luZGV4ICsgbW92ZWRTb3VyY2VzTGVuZ3RoOwotCQkJdGFyZ2V0SXRlbXNJbmRleCA9IChuZXh0VGFyZ2V0U291cmNlSW5kZXggPT0gdGhpcy5pbmZvTGlzdC5zaXplKCkpID8gdGhpcy5zaXplIDogdGhpcy5pbmZvTGlzdC5nZXQobmV4dFRhcmdldFNvdXJjZUluZGV4KS5iZWdpbjsKLQkJCXRhcmdldEl0ZW1zSW5kZXggPSB0YXJnZXRJdGVtc0luZGV4IC0gbW92ZUl0ZW1zTGVuZ3RoOwotCQl9Ci0KLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5pbmZvTGlzdCwgdGFyZ2V0U291cmNlc0luZGV4LCBzb3VyY2VTb3VyY2VzSW5kZXgsIG1vdmVkU291cmNlc0xlbmd0aCk7Ci0KLQkJLy8gdXBkYXRlIHRoZSAnYmVnaW4nIGluZGV4ZXMgb2YgYWxsIHRoZSBhZmZlY3RlZCAnaW5mb3MnCi0JCWludCBtaW4gPSBNYXRoLm1pbih0YXJnZXRTb3VyY2VzSW5kZXgsIHNvdXJjZVNvdXJjZXNJbmRleCk7Ci0JCWludCBtYXggPSBNYXRoLm1heCh0YXJnZXRTb3VyY2VzSW5kZXgsIHNvdXJjZVNvdXJjZXNJbmRleCkgKyBtb3ZlZFNvdXJjZXNMZW5ndGg7Ci0JCWludCBiZWdpbiA9IE1hdGgubWluKHRhcmdldEl0ZW1zSW5kZXgsIHNvdXJjZUl0ZW1zSW5kZXgpOwotCQlmb3IgKGludCBpID0gbWluOyBpIDwgbWF4OyBpKyspIHsKLQkJCUluZm8gaW5mbyA9IHRoaXMuaW5mb0xpc3QuZ2V0KGkpOwotCQkJaW5mby5iZWdpbiA9IGJlZ2luOwotCQkJYmVnaW4gKz0gaW5mby5jb21wb25lbnRMVk0uc2l6ZSgpOwotCQl9Ci0KLQkJaWYgKGZpcmVFdmVudCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZChMSVNUX1ZBTFVFUywgdGFyZ2V0SXRlbXNJbmRleCwgc291cmNlSXRlbXNJbmRleCwgbW92ZUl0ZW1zTGVuZ3RoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIGNsZWFyZWQ7IGNsZWFyIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2VzKDAsIHRoaXMuaW5mb0xpc3Quc2l6ZSgpKTsKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyBjaGFuZ2VkOyByZWJ1aWxkIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2VzKDAsIHRoaXMuaW5mb0xpc3Quc2l6ZSgpKTsKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKDAsIHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RJdGVyYXRvcigpLCB0aGlzLnNpemUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgaW50byBhIGxpc3QgdmFsdWUgbW9kZWwuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxFMj4gdHJhbnNmb3JtKEUxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBMVk0uCi0JICovCi0JcHJvdGVjdGVkIGludCBpbmRleE9mKExpc3RWYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRMVk0pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAodGhpcy5pbmZvTGlzdC5nZXQoaSkuY29tcG9uZW50TFZNID09IGNvbXBvbmVudExWTSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgY29tcG9uZW50IExWTTogIiArIGNvbXBvbmVudExWTSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50J3MgY29tcG9uZW50IExWTS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGluZGV4Rm9yKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy5pbmRleE9mKHRoaXMuY29tcG9uZW50TFZNKGV2ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byBvbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0czsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdXBkYXRlIHRoZSBhZmZlY3RlZCAnYmVnaW4nIGluZGljZXMKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCWludCBuZXdJdGVtc1NpemUgPSBldmVudC5pdGVtc1NpemUoKTsKLQkJZm9yIChpbnQgaSA9IGNvbXBvbmVudExWTUluZGV4ICsgMTsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuaW5mb0xpc3QuZ2V0KGkpLmJlZ2luICs9IG5ld0l0ZW1zU2l6ZTsKLQkJfQotCQl0aGlzLnNpemUgKz0gbmV3SXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoaW5mby5pdGVtcywgZXZlbnQuZ2V0SW5kZXgoKSwgdGhpcy5jb21wb25lbnRJdGVtcyhldmVudCksIGV2ZW50Lml0ZW1zU2l6ZSgpKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gb25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHM7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdXBkYXRlIHRoZSBhZmZlY3RlZCAnYmVnaW4nIGluZGljZXMKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCWludCByZW1vdmVkSXRlbXNTaXplID0gZXZlbnQuaXRlbXNTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBjb21wb25lbnRMVk1JbmRleCArIDE7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiAtPSByZW1vdmVkSXRlbXNTaXplOwotCQl9Ci0JCXRoaXMuc2l6ZSAtPSByZW1vdmVkSXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCk7Ci0JCWludCBpdGVtSW5kZXggPSBldmVudC5nZXRJbmRleCgpOwotCQlpbmZvLml0ZW1zLnN1Ykxpc3QoaXRlbUluZGV4LCBpdGVtSW5kZXggKyBldmVudC5pdGVtc1NpemUoKSkuY2xlYXIoKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcywgTElTVF9WQUxVRVMsIGluZm8uYmVnaW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIG9uZSBvZiB0aGUgY29tcG9uZW50IGxpc3RzOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRJdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBubyBjaGFuZ2VzIHRvIHRoZSAnYmVnaW4nIGluZGljZXMgb3Igc2l6ZQotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpOwotCQlpbnQgaSA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWZvciAoSXRlcmF0b3I8RTI+IHN0cmVhbSA9IHRoaXMuY29tcG9uZW50SXRlbXMoZXZlbnQpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWluZm8uaXRlbXMuc2V0KGkrKywgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiBvbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0czsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gbm8gY2hhbmdlcyB0byB0aGUgJ2JlZ2luJyBpbmRpY2VzIG9yIHNpemUKLQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY2FjaGVkIGxpc3QKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCUluZm8gaW5mbyA9IHRoaXMuaW5mb0xpc3QuZ2V0KGNvbXBvbmVudExWTUluZGV4KTsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUoaW5mby5pdGVtcywgZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0U291cmNlSW5kZXgoKSwgZXZlbnQuZ2V0TW92ZUxlbmd0aCgpKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHMgd2FzIGNsZWFyZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudExpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJdGhpcy5jbGVhckNvbXBvbmVudExpc3QoY29tcG9uZW50TFZNSW5kZXgsIHRoaXMuaW5mb0xpc3QuZ2V0KGNvbXBvbmVudExWTUluZGV4KSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJDb21wb25lbnRMaXN0KGludCBjb21wb25lbnRMVk1JbmRleCwgSW5mbyBpbmZvKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgYWZmZWN0ZWQgJ2JlZ2luJyBpbmRpY2VzCi0JCWludCByZW1vdmVkSXRlbXNTaXplID0gaW5mby5pdGVtcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSBjb21wb25lbnRMVk1JbmRleCArIDE7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiAtPSByZW1vdmVkSXRlbXNTaXplOwotCQl9Ci0JCXRoaXMuc2l6ZSAtPSByZW1vdmVkSXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlBcnJheUxpc3Q8RTI+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4oaW5mby5pdGVtcyk7Ci0JCWluZm8uaXRlbXMuY2xlYXIoKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChMSVNUX1ZBTFVFUywgaW5mby5iZWdpbiwgaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGxpc3RzIGNoYW5nZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlIGJ5IGNsZWFyaW5nIG91dCB0aGUgYXBwcm9wcmlhdGUKLQkgKiBsaXN0IGFuZCByZWJ1aWxkaW5nIGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudExpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpOwotCQl0aGlzLmNsZWFyQ29tcG9uZW50TGlzdChjb21wb25lbnRMVk1JbmRleCwgaW5mbyk7Ci0KLQkJLy8gdXBkYXRlIHRoZSBhZmZlY3RlZCAnYmVnaW4nIGluZGljZXMKLQkJaW50IG5ld0l0ZW1zU2l6ZSA9IGluZm8uY29tcG9uZW50TFZNLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IGNvbXBvbmVudExWTUluZGV4ICsgMTsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuaW5mb0xpc3QuZ2V0KGkpLmJlZ2luICs9IG5ld0l0ZW1zU2l6ZTsKLQkJfQotCQl0aGlzLnNpemUgKz0gbmV3SXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGluZm8uaXRlbXMsIGluZm8uY29tcG9uZW50TFZNLmxpc3RJdGVyYXRvcigpLCBuZXdJdGVtc1NpemUpOwotCi0JCS8vIHRyYW5zbGF0ZSB0aGUgZXZlbnQKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX1ZBTFVFUywgaW5mby5iZWdpbiwgaW5mby5pdGVtcyk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RTI+IGNvbXBvbmVudEl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKExpc3RJdGVyYXRvcjxFMj4pIGV2ZW50Lml0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxFMj4gY29tcG9uZW50TFZNKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKExpc3RWYWx1ZU1vZGVsPEUyPikgZXZlbnQuZ2V0U291cmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGJkNDEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIHdyYXBwZXIgZXh0ZW5kcyBhIExpc3RWYWx1ZU1vZGVsIChvciBDb2xsZWN0aW9uVmFsdWVNb2RlbCkKLSAqIHdpdGggZml4ZWQgY29sbGVjdGlvbnMgb2YgaXRlbXMgb24gZWl0aGVyIGVuZC4KLSAqIDxwPgotICogTkI6IEJlIGNhcmVmdWwgdXNpbmcgb3Igd3JhcHBpbmcgdGhpcyBsaXN0IHZhbHVlIG1vZGVsLCBzaW5jZSB0aGUKLSAqICJleHRlbmRlZCIgaXRlbXMgbWF5IGJlIHVuZXhwZWN0ZWQgYnkgdGhlIGNsaWVudCBjb2RlIG9yIHdyYXBwZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiB0aGUgaXRlbXMgInByZXBlbmRlZCIgdG8gdGhlIHdyYXBwZWQgbGlzdCAqLwotCXByb3RlY3RlZCBMaXN0PEU+IHByZWZpeDsKLQotCS8qKiB0aGUgaXRlbXMgImFwcGVuZGVkIiB0byB0aGUgd3JhcHBlZCBsaXN0ICovCi0JcHJvdGVjdGVkIExpc3Q8RT4gc3VmZml4OwotCi0KLQkvLyAqKioqKioqKioqIGxvdHMgbycgY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeCBhbmQgc3VmZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0PD8gZXh0ZW5kcyBFPiBwcmVmaXgsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBMaXN0PD8gZXh0ZW5kcyBFPiBzdWZmaXgpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gbmV3IEFycmF5TGlzdDxFPihwcmVmaXgpOwotCQl0aGlzLnN1ZmZpeCA9IG5ldyBBcnJheUxpc3Q8RT4oc3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBwcmVmaXggYW5kIHN1ZmZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoRSBwcmVmaXgsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBFIHN1ZmZpeCkgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHByZWZpeCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdDw/IGV4dGVuZHMgRT4gcHJlZml4LCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBuZXcgQXJyYXlMaXN0PEU+KHByZWZpeCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgcHJlZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihFIHByZWZpeCwgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwcmVmaXgpOwotCQl0aGlzLnN1ZmZpeCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHN1ZmZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIsIExpc3Q8PyBleHRlbmRzIEU+IHN1ZmZpeCkgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJdGhpcy5zdWZmaXggPSBuZXcgQXJyYXlMaXN0PEU+KHN1ZmZpeCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgc3VmZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgRSBzdWZmaXgpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeCBjb250YWluaW5nIGEgc2luZ2xlIG51bGwgaXRlbS4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChudWxsKTsKLQkJdGhpcy5zdWZmaXggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3RJdGVyYXRvcl8oKSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3JfKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+KAotCQkJdGhpcy5wcmVmaXgubGlzdEl0ZXJhdG9yKCksCi0JCQl0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCksCi0JCQl0aGlzLnN1ZmZpeC5saXN0SXRlcmF0b3IoKQotCQkpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJaW50IHByZWZpeFNpemUgPSB0aGlzLnByZWZpeC5zaXplKCk7Ci0JCWlmIChpbmRleCA8IHByZWZpeFNpemUpIHsKLQkJCXJldHVybiB0aGlzLnByZWZpeC5nZXQoaW5kZXgpOwotCQl9IGVsc2UgaWYgKGluZGV4ID49IHByZWZpeFNpemUgKyB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWZmaXguZ2V0KGluZGV4IC0gKHByZWZpeFNpemUgKyB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmdldChpbmRleCAtIHByZWZpeFNpemUpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5wcmVmaXguc2l6ZSgpICsgdGhpcy5saXN0SG9sZGVyLnNpemUoKSArIHRoaXMuc3VmZml4LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJQXJyYXlMaXN0PEU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMuc2l6ZSgpKTsKLQkJbGlzdC5hZGRBbGwodGhpcy5wcmVmaXgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJbGlzdC5hZGRBbGwodGhpcy5zdWZmaXgpOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsV3JhcHBlciBpbXBsZW1lbnRhdGlvbi9vdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcywgTElTVF9WQUxVRVMsIHRoaXMucHJlZml4LnNpemUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lV2l0aFNvdXJjZSh0aGlzLCBMSVNUX1ZBTFVFUywgdGhpcy5wcmVmaXguc2l6ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcywgTElTVF9WQUxVRVMsIHRoaXMucHJlZml4LnNpemUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTLCB0aGlzLnByZWZpeC5zaXplKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMpOyAgLy8gbm90ICJjbGVhcmVkIgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5wcmVmaXgpOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKHRoaXMuc3VmZml4KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoTGlzdDxFPiBwcmVmaXgpIHsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdWZmaXgoTGlzdDxFPiBzdWZmaXgpIHsKLQkJdGhpcy5zdWZmaXggPSBzdWZmaXg7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjJlMmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+RmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIDxjb2RlPkNvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPiBhbmQgdXNlcyBhIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAqIHRvIGRldGVybWluZSB3aGljaCBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbiBhcmUgcmV0dXJuZWQgYnkgY2FsbHMKLSAqIHRvIDxjb2RlPiNpdGVyYXRvcigpPC9jb2RlPi4KLSAqIDxwPgotICogVGhlIGZpbHRlciBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZTsgYWxsb3dpbmcgdGhlIHNhbWUKLSAqIGFkYXB0ZXIgdG8gYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBmaWx0ZXIgY3JpdGVyaWEgKGUuZy4gd2hlbiB0aGUgdXNlcgotICogd2FudHMgdG8gdmlldyBhIGxpc3Qgb2YgLmphdmEgZmlsZXMpLgotICogPHA+Ci0gKiBOQjogSWYgdGhlIG9iamVjdHMgaW4gdGhlICJmaWx0ZXJlZCIgY29sbGVjdGlvbiBjYW4gY2hhbmdlIGluIHN1Y2ggYSB3YXkKLSAqIHRoYXQgdGhleSBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSAiZmlsdGVyZWQiIGNvbGxlY3Rpb24sIHlvdSB3aWxsCi0gKiBuZWVkIHRvIHdyYXAgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gaW4gYW4gSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci4KLSAqIEZvciBleGFtcGxlLCBpZiB0aGUgZmlsdGVyIG9ubHkgImFjY2VwdHMiIGl0ZW1zIHdob3NlIG5hbWVzIGJlZ2luCi0gKiB3aXRoICJYIiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBpdGVtcyBjYW4gY2hhbmdlLCB5b3Ugd2lsbCBuZWVkIHRvCi0gKiB3cmFwIHRoZSBvcmlnaW5hbCBsaXN0IG9mIHVuZmlsdGVyZWQgaXRlbXMgd2l0aCBhbgotICogSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyB0byBlYWNoCi0gKiBpdGVtJ3MgbmFtZSBhbmQgZmlyZXMgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IHdoZW5ldmVyIGFuIGl0ZW0ncyBuYW1lCi0gKiBjaGFuZ2VzLiBUaGUgZXZlbnQgd2lsbCBjYXVzZSB0aGlzIHdyYXBwZXIgdG8gcmUtZmlsdGVyIHRoZSBjaGFuZ2VkCi0gKiBpdGVtIGFuZCBhZGQgb3IgcmVtb3ZlIGl0IGZyb20gdGhlICJmaWx0ZXJlZCIgY29sbGVjdGlvbiBhcyBhcHByb3ByaWF0ZS4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoaXMgZmlsdGVycyB0aGUgaXRlbXMgaW4gdGhlIG5lc3RlZCBjb2xsZWN0aW9uLiAqLwotCXByaXZhdGUgRmlsdGVyPEU+IGZpbHRlcjsKLQotCS8qKiBDYWNoZSB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBmaWx0ZXIgKi8KLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248RT4gZmlsdGVyZWRJdGVtczsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIGEgZmlsdGVyIHRoYXQgc2ltcGx5IGFjY2VwdHMgZXZlcnkgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKGNvbGxlY3Rpb25Ib2xkZXIsIEZpbHRlci5OdWxsLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCBmaWx0ZXIuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy5maWx0ZXJlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCBhIGZpbHRlciB0aGF0IHNpbXBseSBhY2NlcHRzIGV2ZXJ5IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQl0aGlzKG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+KGxpc3RIb2xkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXRoaXMobmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4obGlzdEhvbGRlciksIGZpbHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPEU+KHRoaXMuZmlsdGVyZWRJdGVtcyk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXJlZEl0ZW1zLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyIG92ZXJyaWRlcy9pbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3luY2ggb3VyIGNhY2hlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmZpbHRlcmVkSXRlbXMsIHRoaXMuZmlsdGVyKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIGNsZWFyIG91dCB0aGUgY2FjaGUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIGNvbGxlY3Rpb24KLQkJdGhpcy5maWx0ZXJlZEl0ZW1zLmNsZWFyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZmlsdGVyIHRoZSB2YWx1ZXMgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBjaGFuZ2UgZXZlbnQKLQkJdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbih0aGlzLmZpbHRlcih0aGlzLml0ZW1zKGV2ZW50KSksIHRoaXMuZmlsdGVyZWRJdGVtcywgVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvICpub3QqIGZpbHRlciB0aGUgdmFsdWVzLCBiZWNhdXNlIHRoZXkgbWF5IG5vIGxvbmdlciBiZQotCQkvLyAiYWNjZXB0ZWQiIGFuZCB0aGF0IG1pZ2h0IGJlIHdoeSB0aGV5IHdlcmUgcmVtb3ZlZCBpbiB0aGUgZmlyc3QgcGxhY2U7Ci0JCS8vIGFueXdheSwgYW55IGV4dHJhbmVvdXMgaXRlbXMgYXJlIGhhcm1sZXNzCi0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihldmVudC5pdGVtcygpLCB0aGlzLmZpbHRlcmVkSXRlbXMsIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuZmlsdGVyZWRJdGVtcywgVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZWJ1aWxkRmlsdGVyZWRJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCS8qKgotCSAqIENoYW5nZSB0aGUgZmlsdGVyIGFuZCByZWJ1aWxkIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLnJlYnVpbGRGaWx0ZXJlZEl0ZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgZmlsdGVycyB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxFPiBmaWx0ZXIoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RSwgRT4oaXRlbXMsIHRoaXMuZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSBvdXIgY2FjaGUgd2l0aCB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYnVpbGRGaWx0ZXJlZEl0ZW1zKCkgewotCQl0aGlzLmZpbHRlcmVkSXRlbXMuY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmZpbHRlcmVkSXRlbXMsIHRoaXMuZmlsdGVyKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpKSk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NmNjMzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIDxjb2RlPlByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gYW5kIHVzZXMgYSA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gKiB0byBkZXRlcm1pbmUgd2hlbiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZCBieSBjYWxscwotICogdG8gPGNvZGU+dmFsdWUoKTwvY29kZT4uCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+RmlsdGVyPC9jb2RlPiwgYSBzdWJjbGFzcwotICogb2YgPGNvZGU+RmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBjYW4gb3ZlcnJpZGUgdGhlCi0gKiA8Y29kZT5hY2NlcHQoT2JqZWN0KTwvY29kZT4gbWV0aG9kLgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIHZhbHVlIG1vZGVsIGlzIHRoYXQKLSAqIGl0IG11c3QgcmV0dXJuICpzb21ldGhpbmcqIGFzIHRoZSB2YWx1ZS4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMKLSAqIHRvIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuZXZlciB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBub3QgImFjY2VwdGVkIiwKLSAqIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkIGFuZC9vciBvdmVycmlkZGVuLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQ+Ci0JaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQlwcm90ZWN0ZWQgZmluYWwgRmlsdGVyPFQ+IGZpbHRlcjsKLQlwcm90ZWN0ZWQgZmluYWwgVCBkZWZhdWx0VmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+Ci0JICogbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSA8Y29kZT5GaWx0ZXI8L2NvZGU+LgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHZhbHVlSG9sZGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwsIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLCBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+Ci0JICogbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0JICogPGVtPmFuZDwvZW0+IHlvdSBuZWVkIHRvIHNwZWNpZnkKLQkgKiBhIGRlZmF1bHQgdmFsdWUgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVIb2xkZXIsIFQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGZpbHRlci4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiB2YWx1ZUhvbGRlciwgRmlsdGVyPFQ+IGZpbHRlcikgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBmaWx0ZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwsIGZpbHRlciwgYW5kIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHZhbHVlSG9sZGVyLCBGaWx0ZXI8VD4gZmlsdGVyLCBUIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXJWYWx1ZSh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGZpbHRlciB0aGUgdmFsdWVzIGJlZm9yZSBwcm9wYWdhdGluZyB0aGUgY2hhbmdlIGV2ZW50Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmZpbHRlclZhbHVlKChUKSBldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZmlsdGVyVmFsdWUoKFQpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyAiYWNjZXB0ZWQiIHNpbXBseSByZXR1cm4gaXQsCi0JICogb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVCBmaWx0ZXJWYWx1ZShUIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmFjY2VwdCh2YWx1ZSkgPyB2YWx1ZSA6IHRoaXMuZGVmYXVsdFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIDxjb2RlPkZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gc2hvdWxkCi0JICogcmV0dXJuIHRoZSBzcGVjaWZpZWQgdmFsdWUgZnJvbSBhIGNhbGwgdG8gdGhlCi0JICogPGNvZGU+dmFsdWUoKTwvY29kZT4gbWV0aG9kOyB0aGUgdmFsdWUgY2FtZQotCSAqIGZyb20gdGhlIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbAotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIDxjb2RlPkZpbHRlcjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFQgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyLmFjY2VwdCh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgaWYKLQkgKiB0aGUgbmVzdGVkIHZhbHVlIHdhcyByZWplY3RlZCBieSB0aGUgZmlsdGVyLgotCSAqIFRoZSBkZWZhdWx0IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBUIGRlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlMjBmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmlkaUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiA8Y29kZT5Xcml0YWJlbFByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gYW5kIHVzZXMgYSA8Y29kZT5CaWRpRmlsdGVyPC9jb2RlPgotICogdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQgYnkgY2FsbHMKLSAqIHRvIDxjb2RlPnZhbHVlKCk8L2NvZGU+IGFuZCBtb2RpZmllZCBieSBjYWxscyB0bwotICogPGNvZGU+c2V0VmFsdWUoT2JqZWN0KTwvY29kZT4uCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+QmlkaUZpbHRlcjwvY29kZT4sIGEgc3ViY2xhc3MKLSAqIG9mIDxjb2RlPkZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBjYW4gb3ZlcnJpZGUgdGhlCi0gKiA8Y29kZT5hY2NlcHQoT2JqZWN0KTwvY29kZT4gYW5kIDxjb2RlPnJldmVyc2VBY2NlcHQoT2JqZWN0KTwvY29kZT4KLSAqIG1ldGhvZHMuCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgdmFsdWUgbW9kZWwgaXMgdGhhdAotICogaXQgbXVzdCByZXR1cm4gKnNvbWV0aGluZyogYXMgdGhlIHZhbHVlLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcwotICogdG8gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW5ldmVyIHRoZSB3cmFwcGVkIHZhbHVlIGlzIG5vdCAiYWNjZXB0ZWQiLAotICogd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgYW5kL29yIG92ZXJyaWRkZW4uCi0gKiA8cD4KLSAqIFNpbWlsYXJseSwgaWYgYW4gaW5jb21pbmcgdmFsdWUgaXMgbm90ICJyZXZlcnNlQWNjZXB0ZWQiLCAqbm90aGluZyogd2lsbCBwYXNzZWQKLSAqIHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyLCBub3QgZXZlbiA8Y29kZT5udWxsPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+IGFuZCA8Y29kZT5yZXZlcnNlQWNjZXB0KE9iamVjdCk8L2NvZGU+Ci0JICogbWV0aG9kcyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgPGNvZGU+QmlkaUZpbHRlcjwvY29kZT4uCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgQmlkaUZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwsIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLCBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+IGFuZCA8Y29kZT5yZXZlcnNlQWNjZXB0KE9iamVjdCk8L2NvZGU+Ci0JICogbWV0aG9kcyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgPGNvZGU+QmlkaUZpbHRlcjwvY29kZT4KLQkgKiA8ZW0+YW5kPC9lbT4geW91IG5lZWQgdG8gc3BlY2lmeQotCSAqIGEgZGVmYXVsdCB2YWx1ZSBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgVCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgQmlkaUZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGZpbHRlci4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgQmlkaUZpbHRlcjxUPiBmaWx0ZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgZmlsdGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsLCBmaWx0ZXIsIGFuZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgQmlkaUZpbHRlcjxUPiBmaWx0ZXIsIFQgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyLCBmaWx0ZXIsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJaWYgKHRoaXMucmV2ZXJzZUFjY2VwdCh2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgPGNvZGU+RmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+Ci0JICogc2hvdWxkIHBhc3MgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBuZXN0ZWQKLQkgKiB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBpbiBhIGNhbGwgdG8gdGhlCi0JICogPGNvZGU+c2V0VmFsdWUoT2JqZWN0KTwvY29kZT4gbWV0aG9kCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+QmlkaUZpbHRlcjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChUIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldEZpbHRlcigpLnJldmVyc2VBY2NlcHQodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvcnMgYWNjZXB0IG9ubHkgYSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiAoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9ycyBhY2NlcHQgb25seSBhIGJpZGlyZWN0aW9uYWwgZmlsdGVyLgotCSAqLwotCXByb3RlY3RlZCBCaWRpRmlsdGVyPFQ+IGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIChCaWRpRmlsdGVyPFQ+KSB0aGlzLmZpbHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzg2ZGJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db3VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQWJzdHJhY3QgbGlzdCB2YWx1ZSBtb2RlbCB0aGF0IHByb3ZpZGVzIGJlaGF2aW9yIGZvciB3cmFwcGluZyBhIGxpc3QgdmFsdWUKLSAqIG1vZGVsIChvciBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsKSBhbmQgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIHRvIGFzcGVjdHMgb2YgdGhlCi0gKiAqaXRlbXMqIGhlbGQgYnkgdGhlIGxpc3QgKG9yIGNvbGxlY3Rpb24pLiBDaGFuZ2VzIHRvIHRoZSBhY3R1YWwgbGlzdAotICogKG9yIGNvbGxlY3Rpb24pIGFyZSBhbHNvIG1vbml0b3JlZC4KLSAqIAotICogVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBjb2xsZWN0aW9uIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIG1vZGlmaWVkIGJ5IGFkZGluZwotICogb3IgcmVtb3ZpbmcgaXRlbXMgb3IgdGhlIGl0ZW1zIHRoZW1zZWx2ZXMgbWlnaHQgY2hhbmdlIGluIGEgZmFzaGlvbiB0aGF0Ci0gKiBtaWdodCBjaGFuZ2UgdGhlIGNvbGxlY3Rpb24ncyBleHRlcm5hbCBhcHBlYXJhbmNlLgotICogCi0gKiBTdWJjbGFzc2VzIG5lZWQgdG8gb3ZlcnJpZGUgdHdvIG1ldGhvZHM6Ci0gKiAKLSAqICNsaXN0ZW5Ub0l0ZW0oTW9kZWwpCi0gKiAgICAgYmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBhc3BlY3Qgb2YgdGhlIHNwZWNpZmllZCBpdGVtIGFuZCBjYWxsCi0gKiAgICAgI2l0ZW1Bc3BlY3RDaGFuZ2VkKE9iamVjdCkgd2hlbmV2ZXIgdGhlIGFzcGVjdCBjaGFuZ2VzCi0gKiAKLSAqICNzdG9wTGlzdGVuaW5nVG9JdGVtKE1vZGVsKQotICogICAgIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBhc3BlY3Qgb2YgdGhlIHNwZWNpZmllZCBpdGVtCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0KLQkvKioKLQkgKiBNYWludGFpbiBhIGNvdW50ZXIgZm9yIGVhY2ggb2YgdGhlIGl0ZW1zIGluIHRoZQotCSAqIHdyYXBwZWQgbGlzdCBob2xkZXIgd2UgYXJlIGxpc3RlbmluZyB0by4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSWRlbnRpdHlIYXNoTWFwPEUsIENvdW50ZXI+IGNvdW50ZXJzOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5jb3VudGVycyA9IG5ldyBJZGVudGl0eUhhc2hNYXA8RSwgQ291bnRlcj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBjb2xsZWN0aW9uIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyIGFuZCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMuZW5nYWdlQWxsSXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VBbGxJdGVtcygpIHsKLQkJdGhpcy5lbmdhZ2VJdGVtcyh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbXMoSXRlcmF0b3I8PyBleHRlbmRzIEU+IHN0cmVhbSkgewotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJdGhpcy5lbmdhZ2VJdGVtKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbShFIGl0ZW0pIHsKLQkJLy8gbGlzdGVuIHRvIGFuIGl0ZW0gb25seSBvbmNlCi0JCUNvdW50ZXIgY291bnRlciA9IHRoaXMuY291bnRlcnMuZ2V0KGl0ZW0pOwotCQlpZiAoY291bnRlciA9PSBudWxsKSB7Ci0JCQljb3VudGVyID0gbmV3IENvdW50ZXIoKTsKLQkJCXRoaXMuY291bnRlcnMucHV0KGl0ZW0sIGNvdW50ZXIpOwotCQkJdGhpcy5zdGFydExpc3RlbmluZ1RvSXRlbSgoTW9kZWwpIGl0ZW0pOwotCQl9Ci0JCWNvdW50ZXIuaW5jcmVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlbS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzdGFydExpc3RlbmluZ1RvSXRlbShNb2RlbCBpdGVtKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlciBhbmQgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmRpc2VuZ2FnZUFsbEl0ZW1zKCk7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlQWxsSXRlbXMoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXModGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW1zKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBzdHJlYW0pIHsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlSXRlbShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW0oRSBpdGVtKSB7Ci0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIGFuIGl0ZW0gb25seSBvbmNlCi0JCUNvdW50ZXIgY291bnRlciA9IHRoaXMuY291bnRlcnMuZ2V0KGl0ZW0pOwotCQlpZiAoY291bnRlciA9PSBudWxsKSB7Ci0JCQkvLyBzb21ldGhpbmcgaXMgd3JvbmcgaWYgdGhpcyBoYXBwZW5zLi4uICB+Ymp2Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIGNvdW50ZXI6ICIgKyBpdGVtKTsKLQkJfQotCQlpZiAoY291bnRlci5kZWNyZW1lbnQoKSA9PSAwKSB7Ci0JCQl0aGlzLmNvdW50ZXJzLnJlbW92ZShpdGVtKTsKLQkJCXRoaXMuc3RvcExpc3RlbmluZ1RvSXRlbSgoTW9kZWwpIGl0ZW0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVtLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHN0b3BMaXN0ZW5pbmdUb0l0ZW0oTW9kZWwgaXRlbSk7Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIEZvcndhcmQgdGhlIGV2ZW50IGFuZCBiZWdpbiBsaXN0ZW5pbmcgdG8gdGhlIGFkZGVkIGl0ZW1zLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuZW5nYWdlSXRlbXModGhpcy5pdGVtcyhldmVudCkpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByZW1vdmVkIGl0ZW1zIGFuZCBmb3J3YXJkIHRoZSBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXModGhpcy5pdGVtcyhldmVudCkpOwotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgcmVtb3ZlZCBpdGVtcywgZm9yd2FyZCB0aGUgZXZlbnQsCi0JICogYW5kIGJlZ2luIGxpc3RlbmluZyB0byB0aGUgYWRkZWQgaXRlbXMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyh0aGlzLnJlcGxhY2VkSXRlbXMoZXZlbnQpKTsKLQkJLy8gcmUtZmlyZSBldmVudCB3aXRoIHRoZSB3cmFwcGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcywgTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5lbmdhZ2VJdGVtcyh0aGlzLml0ZW1zKGV2ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBObyBuZWVkIHRvIGNoYW5nZSBhbnkgbGlzdGVuZXJzOyBqdXN0IGZvcndhcmQgdGhlIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgd2FzIGNsZWFyZWQuCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHJlbW92ZWQgaXRlbXMgYW5kIGZvcndhcmQgdGhlIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyB3ZSBzaG91bGQgb25seSBuZWVkIHRvIGRpc2VuZ2FnZSBlYWNoIGl0ZW0gb25jZS4uLgotCQkvLyBtYWtlIGEgY29weSB0byBwcmV2ZW50IGEgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotCQlDb2xsZWN0aW9uPEU+IGtleXMgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMuY291bnRlcnMua2V5U2V0KCkpOwotCQl0aGlzLmRpc2VuZ2FnZUl0ZW1zKGtleXMuaXRlcmF0b3IoKSk7Ci0JCXRoaXMuY291bnRlcnMuY2xlYXIoKTsKLQkJLy8gcmUtZmlyZSBldmVudCB3aXRoIHRoZSB3cmFwcGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIGhhcyBjaGFuZ2VkIGluIHNvbWUgZHJhbWF0aWMgZmFzaGlvbi4KLQkgKiBSZWNvbmZpZ3VyZSBvdXIgbGlzdGVuZXJzIGFuZCBmb3J3YXJkIHRoZSBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2Ugc2hvdWxkIG9ubHkgbmVlZCB0byBkaXNlbmdhZ2UgZWFjaCBpdGVtIG9uY2UuLi4KLQkJLy8gbWFrZSBhIGNvcHkgdG8gcHJldmVudCBhIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkJQ29sbGVjdGlvbjxFPiBrZXlzID0gbmV3IEFycmF5TGlzdDxFPih0aGlzLmNvdW50ZXJzLmtleVNldCgpKTsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyhrZXlzLml0ZXJhdG9yKCkpOwotCQl0aGlzLmNvdW50ZXJzLmNsZWFyKCk7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTKTsKLQkJdGhpcy5lbmdhZ2VBbGxJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVtIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlbSBoYXMgYSBib3VuZCBwcm9wZXJ0eSB0aGF0IGhhcyBjaGFuZ2VkLgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtQXNwZWN0Q2hhbmdlZChFdmVudE9iamVjdCBldmVudCkgewotCQlPYmplY3QgaXRlbSA9IGV2ZW50LmdldFNvdXJjZSgpOwotCQlpbnQgaW5kZXggPSB0aGlzLmxhc3RJZGVudGl0eUluZGV4T2YoaXRlbSk7Ci0JCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJdGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChpbmRleCwgaXRlbSk7Ci0JCQlpbmRleCA9IHRoaXMubGFzdElkZW50aXR5SW5kZXhPZihpdGVtLCBpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZW0gaGFzIGEgYm91bmQgcHJvcGVydHkgdGhhdCBoYXMgY2hhbmdlZC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbUFzcGVjdENoYW5nZWQoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQoTElTVF9WQUxVRVMsIGluZGV4LCBpdGVtLCBpdGVtKTsJCS8vIGhtbW0uLi4KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBpdGVtLCB1c2luZyBvYmplY3QKLQkgKiBpZGVudGl0eSBpbnN0ZWFkIG9mIGVxdWFsaXR5LgotCSAqLwotCXByb3RlY3RlZCBpbnQgbGFzdElkZW50aXR5SW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5sYXN0SWRlbnRpdHlJbmRleE9mKG8sIHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW0sIHN0YXJ0aW5nIGp1c3QgYmVmb3JlIHRoZQotCSAqIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQsIGFuZCB1c2luZyBvYmplY3QgaWRlbnRpdHkgaW5zdGVhZCBvZiBlcXVhbGl0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGxhc3RJZGVudGl0eUluZGV4T2YoT2JqZWN0IG8sIGludCBlbmQpIHsKLQkJZm9yIChpbnQgaSA9IGVuZDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAodGhpcy5saXN0SG9sZGVyLmdldChpKSA9PSBvKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0NmE3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlciB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgY29sbGVjdGlvbgotICogYXNwZWN0cyBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBpdGVtcycgY29sbGVjdGlvbnMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGNvbGxlY3Rpb25OYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGl0ZW1Db2xsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gQ29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsIFN0cmluZy4uLiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuY29sbGVjdGlvbk5hbWVzID0gY29sbGVjdGlvbk5hbWVzOwotCQl0aGlzLml0ZW1Db2xsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbUNvbGxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gQ29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNvbGxlY3Rpb25Ib2xkZXIsIFN0cmluZy4uLiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSwgY29sbGVjdGlvbk5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsIHdlIHJlYWxseSBjYXJlIGFib3V0IGlzIHRoZSBmYWN0IHRoYXQgYSBDb2xsZWN0aW9uIGFzcGVjdCBoYXMgCi0JICogY2hhbmdlZC4gIERvIHRoZSBzYW1lIHRoaW5nIG5vIG1hdHRlciB3aGljaCBldmVudCBvY2N1cnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1Db2xsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIGNvbGxlY3Rpb24gbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuY29sbGVjdGlvbk5hbWVzKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnRMaXN0ZW5pbmdUb0l0ZW0oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuY29sbGVjdGlvbk5hbWVzKSB7Ci0JCQlpdGVtLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgdGhpcy5pdGVtQ29sbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0b3BMaXN0ZW5pbmdUb0l0ZW0oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuY29sbGVjdGlvbk5hbWVzKSB7Ci0JCQlpdGVtLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgdGhpcy5pdGVtQ29sbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzYWM2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIgdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlIGxpc3QKLSAqIGFzcGVjdHMgb2YgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCi0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgc3ViamVjdCdzIGxpc3RzIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBsaXN0TmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBpdGVtTGlzdExpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIExpc3QgYXNwZWN0cy4KLQkgKi8KLQlwdWJsaWMgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIGxpc3ROYW1lcykgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5saXN0TmFtZXMgPSBsaXN0TmFtZXM7Ci0JCXRoaXMuaXRlbUxpc3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtTGlzdExpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBMaXN0IGFzcGVjdHMuCi0JICovCi0JcHVibGljIEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNvbGxlY3Rpb25Ib2xkZXIsIFN0cmluZy4uLiBsaXN0TmFtZXMpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSwgbGlzdE5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsIHdlIHJlYWxseSBjYXJlIGFib3V0IGlzIHRoZSBmYWN0IHRoYXQgdGhlIExpc3QgYXNwZWN0IGhhcyAKLQkgKiBjaGFuZ2VkLiAgRG8gdGhlIHNhbWUgdGhpbmcgbm8gbWF0dGVyIHdoaWNoIGV2ZW50IG9jY3Vycy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbUxpc3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbSBsaXN0IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmxpc3ROYW1lcyk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydExpc3RlbmluZ1RvSXRlbShNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCWl0ZW0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLml0ZW1MaXN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc3RvcExpc3RlbmluZ1RvSXRlbShNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLml0ZW1MaXN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMDAwNzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIgdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlCi0gKiBwcm9wZXJ0aWVzIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBpdGVtcycgcHJvcGVydGllcyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpdGVtUHJvcGVydHlMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJvcGVydHlOYW1lcyA9IHByb3BlcnR5TmFtZXM7Ci0JCXRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbVByb3BlcnR5TGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyLCBTdHJpbmcuLi4gcHJvcGVydHlOYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBwcm9wZXJ0eU5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtUHJvcGVydHlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIHByb3BlcnR5IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5wcm9wZXJ0eU5hbWVzKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0TGlzdGVuaW5nVG9JdGVtKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQlpdGVtLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLml0ZW1Qcm9wZXJ0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0b3BMaXN0ZW5pbmdUb0l0ZW0oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZDdkODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlciB0byBsaXN0ZW4gdG8gdGhlCi0gKiAic3RhdGUiIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGl0ZW1TdGF0ZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIGl0ZW0gc3RhdGUuCi0JICovCi0JcHVibGljIEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLml0ZW1TdGF0ZUxpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1TdGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBpdGVtIHN0YXRlLgotCSAqLwotCXB1YmxpYyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtU3RhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIHN0YXRlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0TGlzdGVuaW5nVG9JdGVtKE1vZGVsIGl0ZW0pIHsKLQkJaXRlbS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuaXRlbVN0YXRlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0b3BMaXN0ZW5pbmdUb0l0ZW0oTW9kZWwgaXRlbSkgewotCQlpdGVtLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5pdGVtU3RhdGVMaXN0ZW5lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmNjNzcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyIHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZSB0cmVlCi0gKiBhc3BlY3RzIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLXsKLQotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIGl0ZW1zJyB0cmVlIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSB0cmVlTmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciBpdGVtVHJlZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIHRyZWVzLgotCSAqLwotCXB1YmxpYyBJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBTdHJpbmcuLi4gdHJlZU5hbWVzKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnRyZWVOYW1lcyA9IHRyZWVOYW1lczsKLQkJdGhpcy5pdGVtVHJlZUxpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1UcmVlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIHRyZWVzLgotCSAqLwotCXB1YmxpYyBJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyLCBTdHJpbmcuLi4gdHJlZU5hbWVzKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4oY29sbGVjdGlvbkhvbGRlciksIHRyZWVOYW1lcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbCB3ZSByZWFsbHkgY2FyZSBhYm91dCBpcyB0aGUgZmFjdCB0aGF0IGEgdHJlZSBhc3BlY3QgaGFzIAotCSAqIGNoYW5nZWQuICBEbyB0aGUgc2FtZSB0aGluZyBubyBtYXR0ZXIgd2hpY2ggZXZlbnQgb2NjdXJzLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtVHJlZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gdHJlZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydExpc3RlbmluZ1RvSXRlbShNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCWl0ZW0uYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLml0ZW1UcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc3RvcExpc3RlbmluZ1RvSXRlbShNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLml0ZW1UcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTAwNGZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBvZiBBc3BlY3RBZGFwdGVyIHByb3ZpZGVzIExpc3RDaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgYWxsb3dzIHVzIHRvIGNvbnZlcnQgYSBzZXQgb2Ygb25lIG9yIG1vcmUgY29sbGVjdGlvbnMgaW50bwotICogYSBzaW5nbGUgY29sbGVjdGlvbiwgTElTVF9WQUxVRVMuCi0gKiAKLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogI2xpc3RJdGVyYXRvcl8oKQotICogICAgIGF0IHRoZSB2ZXJ5IG1pbmltdW0sIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhIGxpc3QgaXRlcmF0b3IKLSAqICAgICBvbiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0OyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICAjbGlzdEl0ZXJhdG9yKCkgaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqICNnZXQoaW50KQotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLSAqICNzaXplXygpCi0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZTsgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmCi0gKiAgICAgI3NpemUoKSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogI2xpc3RJdGVyYXRvcigpCi0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiByZXR1cm5pbmcgYW4gZW1wdHkgbGlzdCBpdGVyYXRvciB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqICNzaXplKCkKLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhIHplcm8gd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0QXNwZWN0QWRhcHRlcjxTIGV4dGVuZHMgTW9kZWwsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgbGlzdHMgdGhhdCB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gbGlzdE5hbWVzOwotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0xJU1RfTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIExpc3RBc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoU3RyaW5nIGxpc3ROYW1lLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RyaW5nW10ge2xpc3ROYW1lfSwgc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgTGlzdEFzcGVjdEFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBsaXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoU3RyaW5nW10gbGlzdE5hbWVzLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpLCBsaXN0TmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIExpc3RBc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIGxpc3RzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIFN0cmluZy4uLiBsaXN0TmFtZXMpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JCXRoaXMubGlzdE5hbWVzID0gbGlzdE5hbWVzOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBMaXN0QXNwZWN0QWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBsaXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gbGlzdE5hbWVzKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgbGlzdE5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0TmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIExpc3RBc3BlY3RBZGFwdGVyIGZvciBhbiAidW5jaGFuZ2luZyIgbGlzdCBpbgotCSAqIHRoZSBzcGVjaWZpZWQgc3ViamVjdC4gVGhpcyBpcyB1c2VmdWwgZm9yIGEgbGlzdCBhc3BlY3QgdGhhdCBkb2VzIG5vdAotCSAqIGNoYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIHN1YmplY3Q7IGJ1dCB0aGUgc3ViamVjdCB3aWxsIGNoYW5nZSwgcmVzdWx0aW5nIGluCi0JICogYSBuZXcgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgRU1QVFlfTElTVF9OQU1FUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QgaGFzIGNoYW5nZWQsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgc3ViamVjdCdzIGxpc3QgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIGxpc3QgY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KExpc3RBc3BlY3RBZGFwdGVyLnRoaXMubGlzdE5hbWVzKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5TGlzdEl0ZXJhdG9yLjxFPmluc3RhbmNlKCkgOiB0aGlzLmxpc3RJdGVyYXRvcl8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI2xpc3RJdGVyYXRvcigpCi0JICovCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3JfKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5nZXQodGhpcy5saXN0SXRlcmF0b3IoKSwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3ViamVjdCA9PSBudWxsID8gMCA6IHRoaXMuc2l6ZV8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoYXQgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjc2l6ZSgpCi0JICovCi0JcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBtYW5pZmVzdGF0aW9uIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLnN1YmplY3QgPT0gbnVsbCA/IEVNUFRZX0FSUkFZIDogdGhpcy50b0FycmF5XygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBtYW5pZmVzdGF0aW9uIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI3RvQXJyYXkoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSB0b0FycmF5XygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5hcnJheSh0aGlzLmxpc3RJdGVyYXRvcigpLCB0aGlzLnNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gTElTVF9WQUxVRVM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmxpc3ROYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMubGlzdE5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubGlzdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOwotCQkJfQotCQkJc2IuYXBwZW5kKHRoaXMubGlzdE5hbWVzW2ldKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGV2ZW50LmNsb25lV2l0aFNvdXJjZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lV2l0aFNvdXJjZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNNb3ZlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9WQUxVRVMpOyAgLy8gbm90aGluZyBmcm9tIG9yaWdpbmFsIGV2ZW50IHRvIGZvcndhcmQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMpOyAgLy8gbm90aGluZyBmcm9tIG9yaWdpbmFsIGV2ZW50IHRvIGZvcndhcmQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGU3M2E3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSBMaXN0VmFsdWVNb2RlbCBiZWhhdmUgbGlrZQotICogYSByZWFkLW9ubHkgQ29sbGVjdGlvblZhbHVlTW9kZWwsIHNvcnRhLgotICogCi0gKiBXZSBrZWVwIGFuIGludGVybmFsIGNvbGxlY3Rpb24gc29tZXdoYXQgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZCBsaXN0LgotICogCi0gKiBOQjogU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgbGlzdCB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogbGlzdCB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4gI3NpemUoKSwgdmFsdWUoKSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSBsaXN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIE91ciBpbnRlcm5hbCBjb2xsZWN0aW9uLCB3aGljaCBob2xkcyB0aGUgc2FtZSBlbGVtZW50cyBhcwotCSAqIHRoZSB3cmFwcGVkIGxpc3QuCi0JICovCi0JLy8gd2UgZGVjbGFyZSB0aGlzIGFuIEFycmF5TGlzdCBzbyB3ZSBjYW4gdXNlICNjbG9uZSgpIGFuZCAjZW5zdXJlQ2FwYWNpdHkoaW50KQotCXByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8RT4gY29sbGVjdGlvbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIExpc3RWYWx1ZU1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0JCS8vIHBvc3Rwb25lIGJ1aWxkaW5nIHRoZSBjb2xsZWN0aW9uIGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbGlzdAotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIFZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBoYXMgY2hhbmdlZCwgZm9yd2FyZCBhbiBlcXVpdmFsZW50Ci0JICogY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnQgdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCS8vIHRyeSB0byBwcmV2ZW50IGJhY2tkb29yIG1vZGlmaWNhdGlvbiBvZiB0aGUgbGlzdAotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlciBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGNvbGxlY3Rpb25OYW1lID09IFZBTFVFUyAmJiB0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCQlpZiAoY29sbGVjdGlvbk5hbWUgPT0gVkFMVUVTICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFZBTFVFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW0sIHVzaW5nIG9iamVjdAotCSAqIGlkZW50aXR5IGluc3RlYWQgb2YgZXF1YWxpdHkuCi0JICovCi0JcHJvdGVjdGVkIGludCBsYXN0SWRlbnRpdHlJbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxhc3RJZGVudGl0eUluZGV4T2YobywgdGhpcy5jb2xsZWN0aW9uLnNpemUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW0sIHN0YXJ0aW5nIGp1c3QgYmVmb3JlIHRoZQotCSAqIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQsIGFuZCB1c2luZyBvYmplY3QgaWRlbnRpdHkgaW5zdGVhZCBvZiBlcXVhbGl0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGxhc3RJZGVudGl0eUluZGV4T2YoT2JqZWN0IG8sIGludCBlbmQpIHsKLQkJZm9yIChpbnQgaSA9IGVuZDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uLmdldChpKSA9PSBvKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDb2xsZWN0aW9uKCkgewotCQlJdGVyYXRvcjw/IGV4dGVuZHMgRT4gc3RyZWFtID0gdGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCk7Ci0JCS8vIGlmIHRoZSBuZXcgbGlzdCBpcyBlbXB0eSwgZG8gbm90aGluZwotCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJdGhpcy5jb2xsZWN0aW9uLmVuc3VyZUNhcGFjaXR5KHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIGNvbGxlY3Rpb24gKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgY29sbGVjdGlvbiB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlcgotCQl0aGlzLmNvbGxlY3Rpb24uY2xlYXIoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiBpdGVtcyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChMaXN0SXRlcmF0b3I8RT4pIGV2ZW50Lml0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gcmVwbGFjZWRJdGVtcyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChMaXN0SXRlcmF0b3I8RT4pIGV2ZW50LnJlcGxhY2VkSXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKHRoaXMuaXRlbXMoZXZlbnQpLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSW50ZXJuYWxJdGVtcyhJdGVyYXRvcjxFPiBpdGVtcykgewotCQkvLyB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgaXRlbXMgaW5kaXZpZHVhbGx5LAotCQkvLyBzaW5jZSB0aGV5IGFyZSBwcm9iYWJseSBub3QgaW4gc2VxdWVuY2UKLQkJd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHJlbW92ZWRJdGVtID0gaXRlbXMubmV4dCgpOwotCQkJaW50IGluZGV4ID0gdGhpcy5sYXN0SWRlbnRpdHlJbmRleE9mKHJlbW92ZWRJdGVtKTsKLQkJCXRoaXMuY29sbGVjdGlvbi5yZW1vdmUoaW5kZXgpOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCByZW1vdmVkSXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlSW50ZXJuYWxJdGVtcyh0aGlzLml0ZW1zKGV2ZW50KSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJbnRlcm5hbEl0ZW1zKHRoaXMucmVwbGFjZWRJdGVtcyhldmVudCkpOwotCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKHRoaXMuaXRlbXMoZXZlbnQpLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZz8gbW92aW5nIGl0ZW1zIGluIGEgbGlzdCBoYXMgbm8gbmV0IGVmZmVjdCBvbiBhIGNvbGxlY3Rpb24uLi4KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gcHV0IGluIGVtcHR5IGNoZWNrIHNvIHdlIGRvbid0IGZpcmUgZXZlbnRzIHVubmVjZXNzYXJpbHkKLQkJaWYgKCAhIHRoaXMuY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuY29sbGVjdGlvbi5jbGVhcigpOwotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoVkFMVUVTKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHN5bmNocm9uaXplIG91ciBpbnRlcm5hbCBjb2xsZWN0aW9uIHdpdGggdGhlIHdyYXBwZWQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gcHV0IGluIGVtcHR5IGNoZWNrIHNvIHdlIGRvbid0IGZpcmUgZXZlbnRzIHVubmVjZXNzYXJpbHkKLQkJaWYgKCAhIHRoaXMuY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJQXJyYXlMaXN0PEU+IHJlbW92ZWRJdGVtcyA9IChBcnJheUxpc3Q8RT4pIHRoaXMuY29sbGVjdGlvbi5jbG9uZSgpOwotCQkJdGhpcy5jb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoVkFMVUVTLCByZW1vdmVkSXRlbXMpOwotCQl9Ci0KLQkJdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJLy8gcHV0IGluIGVtcHR5IGNoZWNrIHNvIHdlIGRvbid0IGZpcmUgZXZlbnRzIHVubmVjZXNzYXJpbHkKLQkJaWYgKCAhIHRoaXMuY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb24pOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MjBiNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIEFzcGVjdEFkYXB0ZXIgcHJvdmlkZXMgTGlzdENoYW5nZSBzdXBwb3J0Ci0gKiBieSBhZGFwdGluZyBhIHN1YmplY3QncyBzdGF0ZSBjaGFuZ2UgZXZlbnRzIHRvIGEgbWluaW11bSBzZXQKLSAqIG9mIGxpc3QgY2hhbmdlIGV2ZW50cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3RDdXJhdG9yPFMgZXh0ZW5kcyBNb2RlbCwgRT4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8Uz4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIEhvdyB0aGUgbGlzdCBsb29rZWQgYmVmb3JlIHRoZSBsYXN0IHN0YXRlIGNoYW5nZSAqLwotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEU+IHJlY29yZDsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyBmb3IgdGhlIHN1YmplY3QncyBzdGF0ZSB0byBjaGFuZ2UgKi8KLQlwcml2YXRlIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgc3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgQ3VyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q3VyYXRvcihTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjdXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyLgotCSAqIFRoZSBzdWJqZWN0IGhvbGRlciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEN1cmF0b3IoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQl0aGlzLnJlY29yZCA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJdGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QncyBzdGF0ZSBoYXMgY2hhbmdlZCwgZG8gaW52ZW50b3J5IGFuZCByZXBvcnQgdG8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q3VyYXRvci50aGlzLnN1Ym1pdEludmVudG9yeVJlcG9ydCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3RhdGUgY2hhbmdlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLnJlY29yZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnJlY29yZC5nZXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVjb3JkLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbWFuaWZlc3RhdGlvbiBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5yZWNvcmQudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIExJU1RfVkFMVUVTOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGFzcGVjdCBoYXMgY2hhbmdlZCwgbm90aWZ5IGxpc3RlbmVycyBhcHByb3ByaWF0ZWx5LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2UoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gYWRkIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmNoIG91ciBsaXN0ICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0LAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMucmVjb3JkLCB0aGlzLml0ZXJhdG9yRm9yUmVjb3JkKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gcmVtb3ZlIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgbGlzdCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0Ci0JCXRoaXMucmVjb3JkLmNsZWFyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RDdXJhdG9yIHByb3RvY29sICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgZGlmZmVyZW50IGZyb20gI0xpc3RWYWx1ZU1vZGVsLml0ZXJhdG9yKCkuCi0JICogSXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHN1YmplY3QgY2hhbmdlcyBvciB0aGUKLQkgKiBzdWJqZWN0J3MgInN0YXRlIiBjaGFuZ2VzIChhcyBzaWduaWZpZWQgYnkgYSBzdGF0ZSBjaGFuZ2UgZXZlbnQpLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvcjxFPiBpdGVyYXRvckZvclJlY29yZCgpOwotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXZvaWQgc3VibWl0SW52ZW50b3J5UmVwb3J0KCkgewotCQlMaXN0PEU+IG5ld1JlY29yZCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuaXRlcmF0b3JGb3JSZWNvcmQoKSk7Ci0JCWludCByZWNvcmRJbmRleCA9IDA7Ci0KLQkJLy8gYWRkIGl0ZW1zIGZyb20gdGhlIG5ldyByZWNvcmQKLQkJZm9yIChFIG5ld0l0ZW0gOiBuZXdSZWNvcmQpIHsKLQkJCXRoaXMuaW52ZW50b3J5TmV3SXRlbShyZWNvcmRJbmRleCwgbmV3SXRlbSk7Ci0JCQlyZWNvcmRJbmRleCsrOwotCQl9Ci0KLQkJLy8gY2xlYW4gb3V0IGl0ZW1zIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgbmV3IHJlY29yZAotCQlmb3IgKHJlY29yZEluZGV4ID0gMDsgcmVjb3JkSW5kZXggPCB0aGlzLnJlY29yZC5zaXplKCk7ICkgewotCQkJRSBpdGVtID0gdGhpcy5yZWNvcmQuZ2V0KHJlY29yZEluZGV4KTsKLQotCQkJaWYgKG5ld1JlY29yZC5jb250YWlucyhpdGVtKSkgewotCQkJCXJlY29yZEluZGV4Kys7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21JbnZlbnRvcnkocmVjb3JkSW5kZXgsIGl0ZW0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludmVudG9yeU5ld0l0ZW0oaW50IHJlY29yZEluZGV4LCBFIG5ld0l0ZW0pIHsKLQkJTGlzdDxFPiByZWMgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMucmVjb3JkKTsKLQotCQlpZiAoKHJlY29yZEluZGV4IDwgcmVjLnNpemUoKSkgJiYgcmVjLmdldChyZWNvcmRJbmRleCkuZXF1YWxzKG5ld0l0ZW0pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHJlYy5jb250YWlucyhuZXdJdGVtKSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUludmVudG9yeShyZWNvcmRJbmRleCwgcmVjLmdldChyZWNvcmRJbmRleCkpOwotCQkJdGhpcy5pbnZlbnRvcnlOZXdJdGVtKHJlY29yZEluZGV4LCBuZXdJdGVtKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuYWRkSXRlbVRvSW52ZW50b3J5KHJlY29yZEluZGV4LCBuZXdJdGVtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJdGVtVG9JbnZlbnRvcnkoaW50IGluZGV4LCBFIGl0ZW0pIHsKLQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBpdGVtLCB0aGlzLnJlY29yZCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVJdGVtRnJvbUludmVudG9yeShpbnQgaW5kZXgsIEUgaXRlbSkgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5yZWNvcmQsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzhiNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHdyYXAKLSAqIGEgbGlzdCB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogCi0gKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGU6Ci0gKiAtICNidWlsZFZhbHVlKCkKLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IGxpc3QgdmFsdWUKLSAqIAotICogU3ViY2xhc3NlcyBtaWdodCB3YW50IHRvIG92ZXJyaWRlOgotICogLSAjaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpCi0gKiAtICNpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KQotICogLSAjaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpCi0gKiAtICNpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkKLSAqIC0gI2xpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkKLSAqIC0gI2xpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkKLSAqICAgICB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLXsKLQkvKiogVGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9CQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciB3YXMgY2xlYXJlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWI2MDRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHdyYXAKLSAqIGFub3RoZXIgbGlzdCB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgcHJvcGFnYXRlCi0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLXsKLQotCS8qKiBUaGUgd3JhcHBlZCBsaXN0IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVuZCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3ROYW1lID09IExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTICYmIHRoaXMuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG5lc3RlZCBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCQlpZiAobGlzdE5hbWUgPT0gTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMgJiYgdGhpcy5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCS8vIG1pbmltaXplIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IGl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKExpc3RJdGVyYXRvcjxFPikgZXZlbnQuaXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiByZXBsYWNlZEl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKExpc3RJdGVyYXRvcjxFPikgZXZlbnQucmVwbGFjZWRJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgbW92ZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgd2FzIGNsZWFyZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGQ5MGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIHJlYWQtb25seSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGZvciB3aGVuIHlvdQotICogZG9uJ3QgbmVlZCB0byBzdXBwb3J0IGEgY29sbGVjdGlvbi4gSW4gcGFydGljdWxhciwgdGhpcwotICogaXMgdXNlZnVsIGZvciB0aGUgbGVhZiBub2RlcyBvZiBhIHRyZWUgdGhhdCBuZXZlciBoYXZlCi0gKiBjaGlsZHJlbi4KLSAqIAotICogV2UgZG9uJ3QgdXNlIGEgc2luZ2xldG9uIGJlY2F1c2Ugd2UgaG9sZCBvbiB0byBsaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIAlyZXR1cm4gQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5MmVkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGVtcHR5IGxpc3QgdmFsdWUgbW9kZWwgZm9yIHdoZW4geW91IGRvbid0Ci0gKiBuZWVkIHRvIHN1cHBvcnQgYSBsaXN0LgotICogCi0gKiBXZSBkb24ndCB1c2UgYSBzaW5nbGV0b24gYmVjYXVzZSB3ZSBob2xkIG9uIHRvIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBOdWxsTGlzdFZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogMCIpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gRU1QVFlfQVJSQVk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjOWI2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBmb3Igd2hlbiB5b3UKLSAqIGRvbid0IG5lZWQgdG8gc3VwcG9ydCBhIHZhbHVlLgotICogCi0gKiBXZSBkb24ndCB1c2UgYSBzaW5nbGV0b24gYmVjYXVzZSB3ZSBob2xkIG9uIHRvIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIE51bGxQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTnVsbFByb3BlcnR5VmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFRyZWVWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFRyZWVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDM1MzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxUcmVlVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIHRyZWUgdmFsdWUgbW9kZWwgZm9yIHdoZW4geW91Ci0gKiBkb24ndCBuZWVkIHRvIHN1cHBvcnQgYW55IG5vZGVzLgotICogCi0gKiBXZSBkb24ndCB1c2UgYSBzaW5nbGV0b24gYmVjYXVzZSB3ZSBob2xkIG9uIHRvIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIE51bGxUcmVlVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgVHJlZVZhbHVlTW9kZWw8RT4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE51bGxUcmVlVmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIFRyZWVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBub2RlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlOTNkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlBc3BlY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgQXNwZWN0QWRhcHRlciBwcm92aWRlcyBiYXNpYyBQcm9wZXJ0eUNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBhbGxvd3MgdXMgdG8gY29udmVydCBhIHNldCBvZiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIGludG8KLSAqIGEgc2luZ2xlIHByb3BlcnR5LCBWQUxVRS4KLSAqIAotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gKiAjYnVpbGRWYWx1ZV8oKQotICogICAgIGF0IHRoZSB2ZXJ5IG1pbmltdW0sIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0gKiAgICAgc3ViamVjdCdzIHByb3BlcnR5IChvciAidmlydHVhbCIgcHJvcGVydHkpOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gKiAgICAgb3ZlcnJpZGRlbiBpZiAjYnVpbGRWYWx1ZSgpIGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiAjc2V0VmFsdWVfKE9iamVjdCkKLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGUgY2xpZW50IGNvZGUgbmVlZHMgdG8gKnNldCogdGhlIHZhbHVlIG9mCi0gKiAgICAgdGhlIHN1YmplY3QncyBwcm9wZXJ0eTsgb2Z0ZW50aW1lcywgdGhvdWdoLCB0aGUgY2xpZW50IGNvZGUgKGUuZy4gVUkpCi0gKiAgICAgd2lsbCBuZWVkIG9ubHkgdG8gKmdldCogdGhlIHZhbHVlOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gKiAgICAgb3ZlcnJpZGRlbiBpZiAjc2V0VmFsdWUoT2JqZWN0KSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogI2J1aWxkVmFsdWUoKQotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGEgbnVsbCB2YWx1ZSB3aGVuIHRoZSBzdWJqZWN0IGlzIG51bGwKLSAqICAgICBpcyB1bmFjY2VwdGFibGUKLSAqICNzZXRWYWx1ZShPYmplY3QpCi0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiBzb21ldGhpbmcgbXVzdCBiZSBkb25lIHdoZW4gdGhlIHN1YmplY3QKLSAqICAgICBpcyBudWxsIChlLmcuIHRocm93IGFuIGV4Y2VwdGlvbikKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTIGV4dGVuZHMgTW9kZWwsIFQ+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCS8qKgotCSAqIENhY2hlIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBhc3BlY3Qgc28gd2UKLQkgKiBjYW4gcGFzcyBhbiAib2xkIHZhbHVlIiB3aGVuIHdlIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICogV2UgbmVlZCB0aGlzIGJlY2F1c2UgdGhlIHZhbHVlIG1heSBiZSBjYWxjdWxhdGVkIGFuZCBtYXkKLQkgKiBub3QgYmUgaW4gdGhlIHByb3BlcnR5IGNoYW5nZSBldmVudCBmaXJlZCBieSB0aGUgc3ViamVjdCwKLQkgKiBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIG11bHRpcGxlIGFzcGVjdHMuCi0JICovCi0JcHJvdGVjdGVkIFQgdmFsdWU7Ci0KLQkvKiogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0aWVzIHRoYXQgd2UgdXNlIGZvciB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIHByb3BlcnR5TmFtZXM7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfUFJPUEVSVFlfTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzIG9mIHRoZSBzdWJqZWN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFByb3BlcnR5QXNwZWN0QWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIHByb3BlcnR5LgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0cmluZ1tdIHtwcm9wZXJ0eU5hbWV9LCBzdWJqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoU3RyaW5nW10gcHJvcGVydHlOYW1lcywgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTPihzdWJqZWN0KSwgcHJvcGVydHlOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgUHJvcGVydHlBc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIFN0cmluZy4uLiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQl0aGlzLnByb3BlcnR5TmFtZXMgPSBwcm9wZXJ0eU5hbWVzOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBvdXIgdmFsdWUgaXMgbnVsbCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0Ci0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFByb3BlcnR5QXNwZWN0QWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIHByb3BlcnR5TmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3Byb3BlcnR5TmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFByb3BlcnR5QXNwZWN0QWRhcHRlciBmb3IgYW4gInVuY2hhbmdpbmciIHByb3BlcnR5IGluCi0JICogdGhlIHNwZWNpZmllZCBzdWJqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYSBwcm9wZXJ0eSBhc3BlY3QgdGhhdCBkb2VzIG5vdAotCSAqIGNoYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIHN1YmplY3Q7IGJ1dCB0aGUgc3ViamVjdCB3aWxsIGNoYW5nZSwgcmVzdWx0aW5nIGluCi0JICogYSBuZXcgcHJvcGVydHkuIChBIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsIGNvdWxkIGFsc28gYmUKLQkgKiB1c2VkIGluIHRoaXMgc2l0dWF0aW9uLikKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlcikgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIEVNUFRZX1BST1BFUlRZX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QncyBwcm9wZXJ0eSBoYXMgY2hhbmdlZCwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHN1YmplY3QncyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgcHJvcGVydHkgY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByb3BlcnR5QXNwZWN0QWRhcHRlci50aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIudGhpcy5wcm9wZXJ0eU5hbWVzKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCWlmICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRWYWx1ZV8odmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIHByb3BlcnR5LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNzZXRWYWx1ZShPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFQgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBWQUxVRTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFZBTFVFKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0KCkgewotCQlzdXBlci5lbmdhZ2VTdWJqZWN0KCk7Ci0JCS8vIHN5bmNoIG91ciB2YWx1ZSAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgc3ViamVjdCwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0KCkgewotCQlzdXBlci5kaXNlbmdhZ2VTdWJqZWN0KCk7Ci0JCS8vIGNsZWFyIG91dCBvdXIgdmFsdWUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgc3ViamVjdAotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCkgewotCQkJCXNiLmFwcGVuZCgiLCAiKTsKLQkJCX0KLQkJCXNiLmFwcGVuZCh0aGlzLnByb3BlcnR5TmFtZXNbaV0pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNwZWN0J3MgdmFsdWUuCi0JICogQXQgdGhpcyBwb2ludCB0aGUgc3ViamVjdCBtYXkgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgVCBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVmFsdWVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIHByb3BlcnR5LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNidWlsZFZhbHVlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVCBidWlsZFZhbHVlXygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKCkgewotCQlUIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKG9sZCwgdGhpcy52YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGNjMGQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIFByb3BlcnR5VmFsdWVNb2RlbCBiZWhhdmUgbGlrZQotICogYSByZWFkLW9ubHksIHNpbmdsZS1lbGVtZW50IENvbGxlY3Rpb25WYWx1ZU1vZGVsLCBzb3J0YS4KLSAqIAotICogSWYgdGhlIHByb3BlcnR5J3MgdmFsdWUgaXMgbnVsbCwgYW4gZW1wdHkgaXRlcmF0b3IgaXMgcmV0dXJuZWQKLSAqIChpLmUuIHlvdSBjYW4ndCBoYXZlIGEgY29sbGVjdGlvbiB3aXRoIGEgbnVsbCBlbGVtZW50KS4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgd3JhcHBlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgYW55IGV2ZW50cyBmaXJlZCBieSB0aGUgdmFsdWUgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBFIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgTGlzdFZhbHVlTW9kZWwuCi0JICovCi0JcHVibGljIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzLCBWQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIHZhbHVlIGhhcyBjaGFuZ2VkLCBmb3J3YXJkIGFuIGVxdWl2YWxlbnQKLQkgKiBjb2xsZWN0aW9uIGNoYW5nZSBldmVudCB0byBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudmFsdWVDaGFuZ2VkKChFKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8KLQkJCQkJRW1wdHlJdGVyYXRvci48RT5pbnN0YW5jZSgpCi0JCQkJOgotCQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KHRoaXMudmFsdWUpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVuZCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlciBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlciBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChjb2xsZWN0aW9uTmFtZSA9PSBWQUxVRVMgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlciBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCQlpZiAoY29sbGVjdGlvbk5hbWUgPT0gVkFMVUVTICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFZBTFVFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkvLyBzeW5jaCBvdXIgdmFsdWUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlciwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSB2YWx1ZSB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc3luY2hyb25pemUgb3VyIGludGVybmFsIHZhbHVlIHdpdGggdGhlIHdyYXBwZWQgdmFsdWUKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKEUgbmV3VmFsdWUpIHsKLQkJLy8gcHV0IGluICJlbXB0eSIgY2hlY2sgc28gd2UgZG9uJ3QgZmlyZSBldmVudHMgdW5uZWNlc3NhcmlseQotCQlpZiAodGhpcy52YWx1ZSAhPSBudWxsKSB7Ci0JCQlFIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKLQkJCXRoaXMudmFsdWUgPSBudWxsOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCBvbGRWYWx1ZSk7Ci0JCX0KLQkJdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOwotCQkvLyBwdXQgaW4gImVtcHR5IiBjaGVjayBzbyB3ZSBkb24ndCBmaXJlIGV2ZW50cyB1bm5lY2Vzc2FyaWx5Ci0JCWlmICh0aGlzLnZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChWQUxVRVMsIHRoaXMudmFsdWUpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZUhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODI2YWY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSBQcm9wZXJ0eVZhbHVlTW9kZWwgYmVoYXZlIGxpa2UKLSAqIGEgcmVhZC1vbmx5LCBzaW5nbGUtZWxlbWVudCBMaXN0VmFsdWVNb2RlbCwgc29ydGEuCi0gKiAKLSAqIElmIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGlzIG51bGwsIGFuIGVtcHR5IGl0ZXJhdG9yIGlzIHJldHVybmVkCi0gKiAoaS5lLiB5b3UgY2FuJ3QgaGF2ZSBhIGxpc3Qgd2l0aCBhIG51bGwgZWxlbWVudCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQotCS8qKiBUaGUgd3JhcHBlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgYW55IGV2ZW50cyBmaXJlZCBieSB0aGUgdmFsdWUgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBFIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwuCi0JICovCi0JcHVibGljIFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzLCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgdmFsdWUgaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGxpc3QgY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy52YWx1ZUNoYW5nZWQoKEUpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8KLQkJCQkJRW1wdHlMaXN0SXRlcmF0b3IuPEU+aW5zdGFuY2UoKQotCQkJCToKLQkJCQkJbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4odGhpcy52YWx1ZSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLnZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IHRoaXMuaW9vYmUoaW5kZXgsIDApOwotCQl9Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCXRocm93IHRoaXMuaW9vYmUoaW5kZXgsIDEpOwotCQl9Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfT0JKRUNUX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gRU1QVFlfT0JKRUNUX0FSUkFZIDogbmV3IE9iamVjdFtdIHt0aGlzLnZhbHVlfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3ROYW1lID09IExJU1RfVkFMVUVTICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKGxpc3ROYW1lID09IExJU1RfVkFMVUVTICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW9vYmUoaW50IGluZGV4LCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAiICsgc2l6ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmNoIG91ciB2YWx1ZSAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnZhbHVlID0gdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkvLyBjbGVhciBvdXQgdGhlIHZhbHVlIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlcgotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzeW5jaHJvbml6ZSBvdXIgaW50ZXJuYWwgdmFsdWUgd2l0aCB0aGUgd3JhcHBlZCB2YWx1ZQotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoRSBuZXdWYWx1ZSkgewotCQlFIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotCQkJdGhpcy5maXJlSXRlbUFkZGVkKExJU1RfVkFMVUVTLCAwLCBuZXdWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKExJU1RfVkFMVUVTLCAwLCBvbGRWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChMSVNUX1ZBTFVFUywgMCwgbmV3VmFsdWUsIG9sZFZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWVIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNGU1NTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYW5vdGhlciBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgcHJvcGFnYXRlCi0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi17Ci0KLQkvKiogVGhlIHdyYXBwZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHZhbHVlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwuIFRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAodmFsdWVIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLnRoaXMudmFsdWVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGNoYW5nZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSkgewotCQkJdGhpcy5lbmdhZ2VWYWx1ZUhvbGRlcigpOwotCQl9Ci0JCXN1cGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUgJiYgdGhpcy5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpIHsKLQkJCXRoaXMuZW5nYWdlVmFsdWVIb2xkZXIoKTsKLQkJfQotCQlzdXBlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG5lc3RlZCBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVZhbHVlSG9sZGVyKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUgJiYgdGhpcy5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlVmFsdWVIb2xkZXIoKTsKLQkJfQotCX0KLQkKLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCS8qKgotCSAqIEJlZ2luIGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlSG9sZGVyKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlSG9sZGVyKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlSG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjQyNjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBhbmQgQ29sbGVjdGlvbiB0aGF0IHNpbXBseSBob2xkcyBhCi0gKiBjb2xsZWN0aW9uIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMgb2YgYW55IGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4sIENvbGxlY3Rpb248RT4KLXsKLQkvKiogVGhlIGNvbGxlY3Rpb24uICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgQ29sbGVjdGlvblZhbHVlTW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgQ29sbGVjdGlvblZhbHVlTW9kZWwgd2l0aCBhbiBlbXB0eSBpbml0aWFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKCkgewotCQl0aGlzKG5ldyBIYXNoQmFnPEU+KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzcywgVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IExvY2FsSXRlcmF0b3I8RT4odGhpcy5jb2xsZWN0aW9uLml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5zaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5jb250YWlucyhvKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIDxUIGV4dGVuZHMgT2JqZWN0PiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLnRvQXJyYXkoYSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKG8sIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKG8sIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5jb250YWluc0FsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbihjLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKGMsIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKGMsIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKG8gaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSAmJiAobyBpbnN0YW5jZW9mIENvbGxlY3Rpb25WYWx1ZU1vZGVsKSkgewotCQkJQ29sbGVjdGlvbjxFPiBjMSA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuY29sbGVjdGlvbik7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUNvbGxlY3Rpb248RT4gYzIgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbigoKENvbGxlY3Rpb248RT4pIG8pLml0ZXJhdG9yKCkpOwotCQkJcmV0dXJuIGMxLmVxdWFscyhjMik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmNvbGxlY3Rpb24pLmhhc2hDb2RlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZGl0aW9uYWwgYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsb3cgdGhlIGNvbGxlY3Rpb24gdG8gYmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvbihDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24pIHsKLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVyYXRvciAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsSXRlcmF0b3I8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7Ci0JCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8VD4gaXRlcmF0b3I7Ci0JCXByaXZhdGUgVCBuZXh0OwotCi0JCUxvY2FsSXRlcmF0b3IoSXRlcmF0b3I8VD4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIFQgbmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLm5leHQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1SZW1vdmVkKFZBTFVFUywgdGhpcy5uZXh0KTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmFmZTYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBMaXN0VmFsdWVNb2RlbCBhbmQgTGlzdCB0aGF0IHNpbXBseSBob2xkcyBhCi0gKiBjb2xsZWN0aW9uIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMgb2YgYW55IGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4sIExpc3Q8RT4KLXsKLQkvKiogVGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIExpc3Q8RT4gbGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgTGlzdFZhbHVlTW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTGlzdFZhbHVlTW9kZWwoTGlzdDxFPiBsaXN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgTGlzdFZhbHVlTW9kZWwgd2l0aCBhbiBlbXB0eSBpbml0aWFsIGxpc3QuCi0JICovCi0JcHVibGljIFNpbXBsZUxpc3RWYWx1ZU1vZGVsKCkgewotCQl0aGlzKG5ldyBBcnJheUxpc3Q8RT4oKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzLCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbEl0ZXJhdG9yPEU+KHRoaXMubGlzdC5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbExpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmdldChpbmRleCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5jb250YWlucyhvKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIDxUIGV4dGVuZHMgT2JqZWN0PiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoYSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtVG9MaXN0KG8sIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QobywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3QoYywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdChpbmRleCwgYywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGMsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkxpc3QoYywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMuY2xlYXJMaXN0KHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKG8gaW5zdGFuY2VvZiBMaXN0KSAmJiAobyBpbnN0YW5jZW9mIExpc3RWYWx1ZU1vZGVsKSkgewotCQkJTGlzdDxFPiBsMSA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUxpc3Q8RT4gbDIgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCgoKExpc3Q8RT4pIG8pLml0ZXJhdG9yKCkpOwotCQkJcmV0dXJuIGwxLmVxdWFscyhsMik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaGFzaENvZGUoKTsKLQl9Ci0KLQlwdWJsaWMgRSBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRoaXMuc2V0SXRlbUluTGlzdChpbmRleCwgZWxlbWVudCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgZWxlbWVudCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIEUgcmVtb3ZlKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmluZGV4T2Yobyk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxhc3RJbmRleE9mKG8pOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IExvY2FsTGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdC5saXN0SXRlcmF0b3IoaW5kZXgpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxFPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCS8vIFRPRE8gaG1tbSAgfmJqdgotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkaXRpb25hbCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGxvdyB0aGUgbGlzdCB0byBiZSByZXBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0KExpc3Q8RT4gbGlzdCkgewotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3QgPSBsaXN0OwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBhIHNpbmdsZSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5tb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIE1vdmUgYSBzdWItbGlzdCBvZiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMubW92ZUl0ZW1zSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSByYW5nZSBvZiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGVuZ3RoLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSByYW5nZSBvZiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBMaXN0PEU+IGVsZW1lbnRzKSB7Ci0JCXRoaXMuc2V0SXRlbXNJbkxpc3QoaW5kZXgsIGVsZW1lbnRzLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVyYXRvcnMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbEl0ZXJhdG9yPFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewotCQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOwotCQlwcml2YXRlIGludCBpbmRleCA9IC0xOwotCQlwcml2YXRlIFQgbmV4dDsKLQotCQlMb2NhbEl0ZXJhdG9yKEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBUIG5leHQoKSB7Ci0JCQl0aGlzLm5leHQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJCXRoaXMuaW5kZXgrKzsKLQkJCXJldHVybiB0aGlzLm5leHQ7Ci0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQlTaW1wbGVMaXN0VmFsdWVNb2RlbC50aGlzLmZpcmVJdGVtUmVtb3ZlZChMSVNUX1ZBTFVFUywgdGhpcy5pbmRleCwgdGhpcy5uZXh0KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbExpc3RJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxUPiB7Ci0JCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOwotCQlwcml2YXRlIGludCBsYXN0ID0gLTE7Ci0JCXByaXZhdGUgaW50IG5leHQgPSAwOwotCQlwcml2YXRlIFQgY3VycmVudDsKLQotCQlMb2NhbExpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8VD4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIFQgbmV4dCgpIHsKLQkJCXRoaXMuY3VycmVudCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQkJdGhpcy5sYXN0ID0gdGhpcy5uZXh0Kys7Ci0JCQlyZXR1cm4gdGhpcy5jdXJyZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0SW5kZXgoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQkJfQotCi0JCXB1YmxpYyBUIHByZXZpb3VzKCkgewotCQkJdGhpcy5jdXJyZW50ID0gdGhpcy5pdGVyYXRvci5wcmV2aW91cygpOwotCQkJdGhpcy5sYXN0ID0gLS10aGlzLm5leHQ7Ci0JCQlyZXR1cm4gdGhpcy5jdXJyZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCBzZXQoVCBvKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnNldChvKTsKLQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1SZXBsYWNlZChMSVNUX1ZBTFVFUywgdGhpcy5sYXN0LCBvLCB0aGlzLmN1cnJlbnQpOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCBhZGQoVCBvKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLmFkZChvKTsKLQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1BZGRlZChMSVNUX1ZBTFVFUywgdGhpcy5uZXh0LCBvKTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1SZW1vdmVkKExJU1RfVkFMVUVTLCB0aGlzLmxhc3QsIHRoaXMuY3VycmVudCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzI0OGU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgc2ltcGx5IGhvbGRzIG9uIHRvIGFuCi0gKiBvYmplY3QgYW5kIHVzZXMgaXQgYXMgdGhlIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCS8qKiBUaGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIFQgdmFsdWU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFByb3BlcnR5VmFsdWVNb2RlbCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsKFQgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFByb3BlcnR5VmFsdWVNb2RlbCB3aXRoIGEgc3RhcnRpbmcgdmFsdWUgb2YgbnVsbC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIFZBTFVFKTsKLQl9Ci0KLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCVQgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTEyYjlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIDxjb2RlPkNvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPgotICogKG9yIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPikgYmVoYXZlIGxpa2UgYSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4KLSAqIHRoYXQga2VlcHMgaXRzIGNvbnRlbnRzIHNvcnRlZCBhbmQgbm90aWZpZXMgbGlzdGVuZXJzIGFwcHJvcHJpYXRlbHkuCi0gKiA8cD4KLSAqIFRoZSBjb21wYXJhdG9yIGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lOyBhbGxvd2luZyB0aGUgc2FtZQotICogYWRhcHRlciB0byBiZSB1c2VkIHdpdGggZGlmZmVyZW50IHNvcnQgY3JpdGVyaWEgKGUuZy4gd2hlbiB0aGUgdXNlcgotICogd2FudHMgdG8gc29ydCBhIGxpc3Qgb2YgZmlsZXMgZmlyc3QgYnkgbmFtZSwgdGhlbiBieSBkYXRlLCB0aGVuIGJ5IHNpemUpLgotICogPHA+Ci0gKiBOQjogU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogY29sbGVjdGlvbiB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4gPGNvZGU+I3NpemUoKTwvY29kZT4sIDxjb2RlPiNnZXRJdGVtKGludCk8L2NvZGU+KSB3aWxsIGJlCi0gKiB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCS8qKgotCSAqIEEgY29tcGFyYXRvciB1c2VkIGZvciBzb3J0aW5nIHRoZSBlbGVtZW50czsKLQkgKiBpZiBpdCBpcyBudWxsLCB3ZSB1c2UgIm5hdHVyYWwgb3JkZXJpbmciLgotCSAqLwotCXByb3RlY3RlZCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3I7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCBzb3J0IGl0cyBjb250ZW50cwotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyLCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIHNvcnQgaXRzIGNvbnRlbnRzCi0JICogYmFzZWQgb24gdGhlIGVsZW1lbnRzJyAibmF0dXJhbCBvcmRlcmluZyIuCi0JICovCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKGNvbGxlY3Rpb25Ib2xkZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBsaXN0IHZhbHVlIG1vZGVsIGFuZCBzb3J0IGl0cyBjb250ZW50cwotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPihsaXN0SG9sZGVyKSwgY29tcGFyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGxpc3QgdmFsdWUgbW9kZWwgYW5kIHNvcnQgaXRzIGNvbnRlbnRzCi0JICogYmFzZWQgb24gdGhlIGVsZW1lbnRzJyAibmF0dXJhbCBvcmRlcmluZyIuCi0JICovCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQl0aGlzKGxpc3RIb2xkZXIsIG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0Q29tcGFyYXRvcihDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLQkJdGhpcy5zb3J0TGlzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTb3J0IHRoZSBpbnRlcm5hbCBsaXN0IGJlZm9yZQotCSAqIHNlbmRpbmcgb3V0IGNoYW5nZSBub3RpZmljYXRpb24uCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEJ1aWxkTGlzdCgpIHsKLQkJc3VwZXIucG9zdEJ1aWxkTGlzdCgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHRoaXMubGlzdCwgdGhpcy5jb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgbGlzdCB3aWxsIG5lZWQgdG8gYmUgc29ydGVkIGFmdGVyIHRoZSBpdGVtIGlzIGFkZGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZmlyc3QgYWRkIHRoZSBpdGVtcyBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuLi4KLQkJc3VwZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCS8vIC4uLnRoZW4gc29ydCB0aGUgbGlzdAotCQl0aGlzLnNvcnRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogc29ydCB0aGUgbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMsIGlmIG5lY2Vzc2FyeTsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzb3J0TGlzdCgpIHsKLQkJLy8gc2F2ZSB0aGUgdW5zb3J0ZWQgc3RhdGUgb2YgdGhlIHNvcnRlZCBsaXN0IHNvIHdlIGNhbiBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mICJyZXBsYWNlZCIgaXRlbXMKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUFycmF5TGlzdDxFPiB1bnNvcnRlZExpc3QgPSAoQXJyYXlMaXN0PEU+KSB0aGlzLmxpc3QuY2xvbmUoKTsKLQkJQ29sbGVjdGlvbnMuc29ydCh0aGlzLmxpc3QsIHRoaXMuY29tcGFyYXRvcik7Ci0JCVJhbmdlIGRpZmZSYW5nZSA9IENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZSh1bnNvcnRlZExpc3QsIHRoaXMubGlzdCk7Ci0JCWlmIChkaWZmUmFuZ2Uuc2l6ZSA+IDApIHsKLQkJCUxpc3Q8RT4gdW5zb3J0ZWRJdGVtcyA9IHVuc29ydGVkTGlzdC5zdWJMaXN0KGRpZmZSYW5nZS5zdGFydCwgZGlmZlJhbmdlLmVuZCArIDEpOwotCQkJTGlzdDxFPiBzb3J0ZWRJdGVtcyA9IHRoaXMubGlzdC5zdWJMaXN0KGRpZmZSYW5nZS5zdGFydCwgZGlmZlJhbmdlLmVuZCArIDEpOwotCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChMSVNUX1ZBTFVFUywgZGlmZlJhbmdlLnN0YXJ0LCBzb3J0ZWRJdGVtcywgdW5zb3J0ZWRJdGVtcyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2YzBjOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogCi0gKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGU6Ci0gKiAtICNidWlsZFZhbHVlKCkKLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IG1vZGVsCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWlnaHQgd2FudCB0byBvdmVycmlkZToKLSAqIC0gI3N0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KQotICogICAgIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgKGJ5IG5vdCByZWNhbGN1bGF0aW5nIHRoZSB2YWx1ZSwgaWYgcG9zc2libGUpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLXsKLQkvKiogVGhlIHdyYXBwZWQgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGVsIG1vZGVsOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIFN0YXRlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVN0YXRlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5tb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5tb2RlbC5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5tb2RlbCk7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgbW9kZWwncyBzdGF0ZSBjaGFuZ2VkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYmE0YzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBDb2xsZWN0aW9uVmFsdWVNb2RlbCB0aGF0IGNhbiBiZSB1c2VkIGZvcgotICogcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG9uIGEgc3RhdGljIGNvbGxlY3Rpb24sIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgTkVWRVIgYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIGNvbGxlY3Rpb24uICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5zaXplKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5jb2xsZWN0aW9uLml0ZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODRkNGFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgTGlzdFZhbHVlTW9kZWwgdGhhdCBjYW4gYmUgdXNlZCBmb3IKLSAqIHJldHVybmluZyBhIGxpc3QgaXRlcmF0b3Igb24gYSBzdGF0aWMgbGlzdCwgYnV0IHN0aWxsIGFsbG93cyBsaXN0ZW5lcnMgdG8gYmUgYWRkZWQuCi0gKiBMaXN0ZW5lcnMgd2lsbCBORVZFUiBiZSBub3RpZmllZCBvZiBhbnkgY2hhbmdlcywgYmVjYXVzZSB0aGVyZSBzaG91bGQgYmUgbm9uZS4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRpY0xpc3RWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8PyBleHRlbmRzIEU+IGxpc3Q7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIExpc3RWYWx1ZU1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIFN0YXRpY0xpc3RWYWx1ZU1vZGVsKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ID0gbGlzdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5saXN0Lml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlY2NmMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgY2FuIGJlIHVzZWQgZm9yCi0gKiByZXR1cm5pbmcgYSBzdGF0aWMgdmFsdWUsIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgTkVWRVIgYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCS8qKiBUaGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFQgdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIFByb3BlcnR5VmFsdWVNb2RlbCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsKFQgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1RyZWVWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVHJlZVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyOTUzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVHJlZVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBUcmVlVmFsdWVNb2RlbCB0aGF0IGNhbiBiZSB1c2VkIGZvcgotICogcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG9uIGEgc3RhdGljIHRyZWUsIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgTkVWRVIgYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNUcmVlVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgVHJlZVZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIHRyZWUncyBub2Rlcy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IG5vZGVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBUcmVlVmFsdWVNb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgU3RhdGljVHJlZVZhbHVlTW9kZWwoSXRlcmFibGU8PyBleHRlbmRzIEU+IG5vZGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm5vZGVzID0gbm9kZXM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUcmVlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gbm9kZXMoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxFPih0aGlzLm5vZGVzLml0ZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMubm9kZXMoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ0YTJhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciB0aGF0IGFsbG93cyB1cyB0byB0cmFuc2Zvcm0gYSBMaXN0VmFsdWVNb2RlbAotICogKG9yIENvbGxlY3Rpb25WYWx1ZU1vZGVsKSBpbnRvIGEgcmVhZC1vbmx5IExpc3RWYWx1ZU1vZGVsCi0gKiB3aG9zZSBpdGVtcyBhcmUgdHJhbmZvcm1hdGlvbnMgb2YgdGhlIGl0ZW1zIGluIHRoZSB3cmFwcGVkCi0gKiBMaXN0VmFsdWVNb2RlbC4gSXQgd2lsbCBrZWVwIGl0cyBjb250ZW50cyBpbiBzeW5jaCB3aXRoCi0gKiB0aGUgY29udGVudHMgb2YgdGhlIHdyYXBwZWQgTGlzdFZhbHVlTW9kZWwgYW5kIG5vdGlmaWVzIGl0cwotICogbGlzdGVuZXJzIG9mIGFueSBjaGFuZ2VzLgotICogPHA+Ci0gKiBUaGUgdHJhbnNmb3JtZXIgY2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWU7IGFsbG93aW5nIHRoZSBzYW1lCi0gKiBhZGFwdGVyIHRvIGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgdHJhbnNmb3JtYXRpb25zLgotICogPHA+Ci0gKiBOQjogU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgbGlzdCB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogbGlzdCB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4gI3NpemUoKSwgI2dldEl0ZW0oaW50KSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEUxLCBFMj4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFMT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEUyPgotewotCi0JLyoqIFRoaXMgdHJhbnNmb3JtcyB0aGUgaXRlbXMsIHVubGVzcyB0aGUgc3ViY2xhc3Mgb3ZlcnJpZGVzICN0cmFuc2Zvcm1JdGVtKE9iamVjdCkuICovCi0JcHJvdGVjdGVkIFRyYW5zZm9ybWVyPEUxLCBFMj4gdHJhbnNmb3JtZXI7Ci0KLQkvKiogVGhlIGxpc3Qgb2YgdHJhbnNmb3JtZWQgaXRlbXMuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8RTI+IHRyYW5zZm9ybWVkTGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8RTI+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlcikgewotCQl0aGlzKGxpc3RIb2xkZXIsIFRyYW5zZm9ybWVyLk51bGwuPEUxLCBFMj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBjb2xsZWN0aW9uIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uSG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RTE+KGNvbGxlY3Rpb25Ib2xkZXIpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgY29sbGVjdGlvbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEUxPihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RTI+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFMj4odGhpcy50cmFuc2Zvcm1lZExpc3QpOwotCX0KLQotCXB1YmxpYyBFMiBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVkTGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZWRMaXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZWRMaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCB0aGUgdHJhbnNmb3JtZWQgbGlzdCAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0LmFkZEFsbCh0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMubGlzdEhvbGRlcikpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1JdGVtcyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5pdGVtcyhldmVudCksIGV2ZW50Lml0ZW1zU2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFMj4gdHJhbnNmb3JtSXRlbXMoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsdm0pIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXMobHZtLmxpc3RJdGVyYXRvcigpLCBsdm0uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHJlcGxhY2VkIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1SZXBsYWNlZEl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1JdGVtcyh0aGlzLnJlcGxhY2VkSXRlbXMoZXZlbnQpLCBldmVudC5pdGVtc1NpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgaXRlbXMuCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8RTI+IHRyYW5zZm9ybUl0ZW1zKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IGl0ZW1zLCBpbnQgc2l6ZSkgewotCQlMaXN0PEUyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEUyPihzaXplKTsKLQkJd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgewotCQkJcmVzdWx0LmFkZCh0aGlzLnRyYW5zZm9ybUl0ZW0oaXRlbXMubmV4dCgpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBpdGVtLgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm1JdGVtKEUxIGl0ZW0pIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIENoYW5nZSB0aGUgdHJhbnNmb3JtZXIgYW5kIHJlYnVpbGQgdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtZXIoVHJhbnNmb3JtZXI8RTEsIEUyPiB0cmFuc2Zvcm1lcikgewotCQl0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0JCXRoaXMucmVidWlsZFRyYW5zZm9ybWVkTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIG91ciBjYWNoZSB3aXRoIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVidWlsZFRyYW5zZm9ybWVkTGlzdCgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuY2xlYXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuYWRkQWxsKHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5saXN0SG9sZGVyKSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFRyYW5zZm9ybSB0aGVtLCBhZGQgdGhlbSB0byBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdCwKLQkgKiBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRJdGVtc1RvTGlzdChldmVudC5nZXRJbmRleCgpLCB0aGlzLnRyYW5zZm9ybUl0ZW1zKGV2ZW50KSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBSZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgZnJvbSBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdAotCSAqIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChldmVudC5nZXRJbmRleCgpLCBldmVudC5pdGVtc1NpemUoKSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFJlcGxhY2UgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgaW4gb3VyIHRyYW5zZm9ybWF0aW9uIGxpc3QKLQkgKiBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRJdGVtc0luTGlzdChldmVudC5nZXRJbmRleCgpLCB0aGlzLnRyYW5zZm9ybUl0ZW1zKGV2ZW50KSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIE1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgaW4gb3VyIHRyYW5zZm9ybWF0aW9uIGxpc3QKLQkgKiBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAJdGhpcy5tb3ZlSXRlbXNJbkxpc3QoZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0U291cmNlSW5kZXgoKSwgZXZlbnQuZ2V0TW92ZUxlbmd0aCgpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIHdhcyBjbGVhcmVkLgotCSAqIENsZWFyIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAJdGhpcy5jbGVhckxpc3QodGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciBoYXMgY2hhbmdlZCBpbiBzb21lIGRyYW1hdGljIGZhc2hpb24uCi0JICogUmVidWlsZCBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVidWlsZFRyYW5zZm9ybWVkTGlzdCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzYjkzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICogPGNvZGU+UHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBhbmQgdXNlcyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPgotICogdG8gdHJhbnNmb3JtIHRoZSB3cmFwcGVkIHZhbHVlIGJlZm9yZSBpdCBpcyByZXR1cm5lZCBieSA8Y29kZT52YWx1ZSgpPC9jb2RlPi4KLSAqIDxwPgotICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSA8Y29kZT5UcmFuc2Zvcm1lcjwvY29kZT4sCi0gKiBhIHN1YmNsYXNzIG9mIDxjb2RlPlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBjYW4KLSAqIGVpdGhlciBvdmVycmlkZSB0aGUgPGNvZGU+dHJhbnNmb3JtXyhPYmplY3QpPC9jb2RlPiBtZXRob2Qgb3IsCi0gKiBpZiBzb21ldGhpbmcgb3RoZXIgdGhhbiBudWxsIHNob3VsZCBiZSByZXR1cm5lZCB3aGVuIHRoZSB3cmFwcGVkIHZhbHVlCi0gKiBpcyBudWxsLCBvdmVycmlkZSB0aGUgPGNvZGU+dHJhbnNmb3JtKE9iamVjdCk8L2NvZGU+IG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8VDE+Ci0JaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlTW9kZWw8VDI+Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIFRyYW5zZm9ybWVyPFQxLCBUMj4gdHJhbnNmb3JtZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+dHJhbnNmb3JtXyhPYmplY3QpPC9jb2RlPiBvciA8Y29kZT50cmFuc2Zvcm0oT2JqZWN0KTwvY29kZT4KLQkgKiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUMT4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLnRyYW5zZm9ybWVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVDE+IHZhbHVlSG9sZGVyLCBUcmFuc2Zvcm1lcjxUMSwgVDI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2Zvcm1lcjxUMSwgVDI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVDIgZ2V0VmFsdWUoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBuZXN0ZWQgdmFsdWUgbW9kZWwgYmVmb3JlIHJldHVybmluZyBpdAotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHZhbHVlcyBiZWZvcmUgcHJvcGFnYXRpbmcgdGhlIGNoYW5nZSBldmVudAotCSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy50cmFuc2Zvcm0oKFQxKSBldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMudHJhbnNmb3JtKChUMSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5ICN2YWx1ZSgpIGFuZCAjdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQpLgotCSAqLwotCXByb3RlY3RlZCBUMiB0cmFuc2Zvcm0oVDEgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCwgbm9uLW51bGwsIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtXyhUMSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCB0cmFuc2Zvcm1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB0cmFuc2Zvcm1lciB3aWxsIHJldHVybiBudWxsIGlmIHRoZSB3cmFwcGVkIHZhbHVlIGlzIG51bGwuCi0JICogSWYgdGhlIHdyYXBwZWQgdmFsdWUgaXMgbm90IG51bGwsIGl0IGlzIHRyYW5zZm9ybWVkIGJ5IGEgc3ViY2xhc3MKLQkgKiBpbXBsZW1lbnRhdGlvbiBvZiAjdHJhbnNmb3JtXyhPYmplY3QpLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxUMSwgVDI+IHsKLQkJcHVibGljIFQyIHRyYW5zZm9ybShUMSB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC50aGlzLnRyYW5zZm9ybV8odmFsdWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1Y2M2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaWRpVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiA8Y29kZT5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gYW5kIHVzZXMgYSA8Y29kZT5CaWRpVHJhbnNmb3JtZXI8L2NvZGU+Ci0gKiB0bzo8dWw+Ci0gKiA8bGk+dHJhbnNmb3JtIHRoZSB3cmFwcGVkIHZhbHVlIGJlZm9yZSBpdCBpcyByZXR1cm5lZCBieSA8Y29kZT52YWx1ZSgpPC9jb2RlPgotICogPGxpPiJyZXZlcnNlLXRyYW5zZm9ybSIgdGhlIG5ldyB2YWx1ZSB0aGF0IGNvbWVzIGluIHZpYQotICogPGNvZGU+c2V0VmFsdWUoT2JqZWN0KTwvY29kZT4KLSAqIDwvdWw+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIDxjb2RlPkJpZGlUcmFuc2Zvcm1lcjwvY29kZT4sCi0gKiBhIHN1YmNsYXNzIG9mIDxjb2RlPlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGNhbgotICogb3ZlcnJpZGUgdGhlIDxjb2RlPnRyYW5zZm9ybV8oT2JqZWN0KTwvY29kZT4gYW5kIAotICogPGNvZGU+cmV2ZXJzZVRyYW5zZm9ybV8oT2JqZWN0KTwvY29kZT4gbWV0aG9kczsgb3IsCi0gKiBpZiBzb21ldGhpbmcgb3RoZXIgdGhhbiBudWxsIHNob3VsZCBiZSByZXR1cm5lZCB3aGVuIHRoZSB3cmFwcGVkIHZhbHVlCi0gKiBpcyBudWxsIG9yIHRoZSBuZXcgdmFsdWUgaXMgbnVsbCwgb3ZlcnJpZGUgdGhlIDxjb2RlPnRyYW5zZm9ybShPYmplY3QpPC9jb2RlPgotICogYW5kIDxjb2RlPnJldmVyc2VUcmFuc2Zvcm0oT2JqZWN0KTwvY29kZT4gbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotCWV4dGVuZHMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDI+Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IGJpZGkgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+dHJhbnNmb3JtXyhPYmplY3QpPC9jb2RlPiBhbmQgPGNvZGU+cmV2ZXJzZVRyYW5zZm9ybV8oT2JqZWN0KTwvY29kZT4KLQkgKiAob3IgPGNvZGU+dHJhbnNmb3JtKE9iamVjdCk8L2NvZGU+IGFuZCA8Y29kZT5yZXZlcnNlVHJhbnNmb3JtKE9iamVjdCk8L2NvZGU+KQotCSAqIG1ldGhvZHMgaW5zdGVhZCBvZiBidWlsZGluZyBhIDxjb2RlPkJpZGlUcmFuc2Zvcm1lcjwvY29kZT4uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGJpZGkgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyLCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZUhvbGRlciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRCaWRpVHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVDIgdmFsdWUpIHsKLQkJLy8gInJldmVyc2UtdHJhbnNmb3JtIiB0aGUgb2JqZWN0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSB0aGUgbmVzdGVkIHZhbHVlIG1vZGVsCi0JCXRoaXMudmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh0aGlzLnJldmVyc2VUcmFuc2Zvcm0odmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogIlJldmVyc2UtdHJhbnNmb3JtIiB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSAjc2V0VmFsdWUoT2JqZWN0KS4KLQkgKi8KLQlwcm90ZWN0ZWQgVDEgcmV2ZXJzZVRyYW5zZm9ybShUMiB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lcigpLnJldmVyc2VUcmFuc2Zvcm0odmFsdWUpOwotCX0KLQotCS8qKgotCSAqICJSZXZlcnNlLXRyYW5zZm9ybSIgdGhlIHNwZWNpZmllZCwgbm9uLW51bGwsIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgVDEgcmV2ZXJzZVRyYW5zZm9ybV8oVDIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9ycyBhY2NlcHQgb25seSBhIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPikgdGhpcy52YWx1ZUhvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3JzIGFjY2VwdCBvbmx5IGEgYmlkaXJlY3Rpb25hbCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwcm90ZWN0ZWQgQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4gdHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiAoQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4pIHRoaXMudHJhbnNmb3JtZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgYmlkaSB0cmFuc2Zvcm1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBiaWRpIHRyYW5zZm9ybWVyIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIHdyYXBwZWQgdmFsdWUgaXMgbnVsbC4KLQkgKiBJZiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBub3QgbnVsbCwgaXQgaXMgdHJhbnNmb3JtZWQgYnkgYSBzdWJjbGFzcwotCSAqIGltcGxlbWVudGF0aW9uIG9mICN0cmFuc2Zvcm1fKE9iamVjdCkuCi0JICogVGhlIGRlZmF1bHQgYmlkaSB0cmFuc2Zvcm1lciB3aWxsIGFsc28gcmV0dXJuIG51bGwgaWYgdGhlIG5ldyB2YWx1ZSBpcyBudWxsLgotCSAqIElmIHRoZSBuZXcgdmFsdWUgaXMgbm90IG51bGwsIGl0IGlzIHJldmVyc2UtdHJhbnNmb3JtZWQgYnkgYSBzdWJjbGFzcwotCSAqIGltcGxlbWVudGF0aW9uIG9mICNyZXZlcnNlVHJhbnNmb3JtXyhPYmplY3QpLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0QmlkaVRyYW5zZm9ybWVyCi0JCWV4dGVuZHMgRGVmYXVsdFRyYW5zZm9ybWVyCi0JCWltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4KLQl7Ci0JCXB1YmxpYyBUMSByZXZlcnNlVHJhbnNmb3JtKFQyIHZhbHVlKSB7Ci0JCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwudGhpcy5yZXZlcnNlVHJhbnNmb3JtXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlQXNwZWN0QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVBc3BlY3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMTMxZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVBc3BlY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBleHRlbnNpb24gb2YgUHJvcGVydHlBZGFwdGVyIHByb3ZpZGVzIFRyZWVDaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgYWxsb3dzIHVzIHRvIGNvbnZlcnQgYSBzZXQgb2Ygb25lIG9yIG1vcmUgdHJlZXMgaW50bwotICogYSBzaW5nbGUgdHJlZSwgTk9ERVMuCi0gKiAKLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogI25vZGVzXygpCi0gKiAgICAgYXQgdGhlIHZlcnkgbWluaW11bSwgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yCi0gKiAgICAgb24gdGhlIHN1YmplY3QncyB0cmVlIGFzcGVjdDsgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmCi0gKiAgICAgI25vZGVzKCkgaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqICNub2RlcygpCi0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiByZXR1cm5pbmcgYW4gZW1wdHkgaXRlcmF0b3Igd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlQXNwZWN0QWRhcHRlcjxTIGV4dGVuZHMgTW9kZWwsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBUcmVlVmFsdWVNb2RlbDxFPgotewotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgdHJlZXMgdGhhdCB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gdHJlZU5hbWVzOwotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1RSRUVfTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBzdWJqZWN0J3MgdHJlZSBhc3BlY3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciB0cmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFRyZWVBc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgdHJlZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoU3RyaW5nIHRyZWVOYW1lLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RyaW5nW10ge3RyZWVOYW1lfSwgc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgVHJlZUFzcGVjdEFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCB0cmVlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoU3RyaW5nW10gdHJlZU5hbWVzLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpLCB0cmVlTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFRyZWVBc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIHRyZWVzLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIFN0cmluZy4uLiB0cmVlTmFtZXMpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JCXRoaXMudHJlZU5hbWVzID0gdHJlZU5hbWVzOwotCQl0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBUcmVlQXNwZWN0QWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCB0cmVlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gdHJlZU5hbWVzKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgdHJlZU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1t0cmVlTmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFRyZWVBc3BlY3RBZGFwdGVyIGZvciBhbiAidW5jaGFuZ2luZyIgdHJlZSBpbgotCSAqIHRoZSBzcGVjaWZpZWQgc3ViamVjdC4gVGhpcyBpcyB1c2VmdWwgZm9yIGEgdHJlZSBhc3BlY3QgdGhhdCBkb2VzIG5vdAotCSAqIGNoYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIHN1YmplY3Q7IGJ1dCB0aGUgc3ViamVjdCB3aWxsIGNoYW5nZSwgcmVzdWx0aW5nIGluCi0JICogYSBuZXcgdHJlZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgRU1QVFlfVFJFRV9OQU1FUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0J3MgdHJlZSBhc3BlY3QgaGFzIGNoYW5nZWQsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgc3ViamVjdCdzIHRyZWUgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIHRyZWUgY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlci50aGlzLm5vZGVBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlci50aGlzLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyLnRoaXMudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNoYW5nZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGVzIG9mIHRoZSBzdWJqZWN0J3MgdHJlZSBhc3BlY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEU+IG5vZGVzKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMubm9kZXNfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBub2RlcyBvZiB0aGUgc3ViamVjdCdzIHRyZWUgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNub2RlcygpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IG5vZGVzXygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMubm9kZXMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gVHJlZUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gTk9ERVM7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKE5PREVTKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKE5PREVTKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMudHJlZUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyB0cmVlTmFtZSA6IHRoaXMudHJlZU5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMudHJlZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOwotCQkJfQotCQkJc2IuYXBwZW5kKHRoaXMudHJlZU5hbWVzW2ldKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZU5vZGVBZGRlZChOT0RFUywgZXZlbnQuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTm9kZVJlbW92ZWQoTk9ERVMsIGV2ZW50LmdldFBhdGgoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZVRyZWVDbGVhcmVkKE5PREVTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoTk9ERVMsIGV2ZW50LmdldFBhdGgoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWI2ZjFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIHRyZWUgdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIAotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlOgotICogLSAjYnVpbGRWYWx1ZSgpCi0gKiAgICAgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0gKiAgICAgY3VycmVudCBjb2xsZWN0aW9uIHZhbHVlCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWlnaHQgd2FudCB0byBvdmVycmlkZToKLSAqIC0gI3N0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KQotICogICAgIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgKGJ5IG5vdCByZWNhbGN1bGF0aW5nIHRoZSB2YWx1ZSwgaWYgcG9zc2libGUpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotewotCS8qKiBUaGUgd3JhcHBlZCB0cmVlIHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmVlVmFsdWVNb2RlbDw/PiB0cmVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIHRyZWUgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmVlQ2hhbmdlTGlzdGVuZXIgdHJlZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogdHJlZSB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoVHJlZVZhbHVlTW9kZWw8Pz4gdHJlZUhvbGRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnRyZWVIb2xkZXIgPSB0cmVlSG9sZGVyOwotCQl0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLm5vZGVBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNoYW5nZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdHJlZSBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLnRyZWVIb2xkZXIuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMudHJlZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdHJlZSBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLnRyZWVIb2xkZXIucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMudHJlZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnRyZWVIb2xkZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogTm9kZXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCB0cmVlIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCB0cmVlIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIHRyZWUgaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgdHJlZSBob2xkZXIgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQXNwZWN0QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDdjNTBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQWJzdHJhY3QgbW9kZWwgdGhhdCBwcm92aWRlcyBiZWhhdmlvciBmb3Igd3JhcHBpbmcgYSBwcm9wZXJ0eQotICogdmFsdWUgbW9kZWwgYW5kIGxpc3RlbmluZyBmb3IgY2hhbmdlcyB0byBhc3BlY3RzIG9mIHRoZSAqdmFsdWUqIGNvbnRhaW5lZAotICogYnkgdGhlIHByb3BlcnR5IHZhbHVlIG1vZGVsLiBDaGFuZ2VzIHRvIHRoZSBhY3R1YWwgdmFsdWUgYXJlIGFsc28gbW9uaXRvcmVkLgotICogCi0gKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHZhbHVlIHRoYXQgbWF5IGNoYW5nZSwgYnV0IHdob3NlIGFzcGVjdHMgY2FuIGFsc28KLSAqIGNoYW5nZSBpbiBhIGZhc2hpb24gdGhhdCBtaWdodCBiZSBvZiBpbnRlcmVzdCB0byB0aGUgY2xpZW50LgotICogCi0gKiBOQjogQ2xpZW50cyB3aWxsIG5lZWQgdG8gbGlzdGVuIGZvciB0d28gZGlmZmVyZW50IGNoYW5nZSBub3RpZmljYXRpb25zOiBhIHByb3BlcnR5Ci0gKiBjaGFuZ2UgZXZlbnQgd2lsbCBiZSBiZSBmaXJlZCB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzOyBhIHN0YXRlIGNoYW5nZSBldmVudAotICogd2lsbCBiZSBmaXJlZCB3aGVuIGFuIGFzcGVjdCBvZiB0aGUgdmFsdWUgY2hhbmdlcy4KLSAqIAotICogU3ViY2xhc3NlcyBuZWVkIHRvIG92ZXJyaWRlIHR3byBtZXRob2RzOgotICogCi0gKiAjZW5nYWdlVmFsdWVfKCkKLSAqICAgICBiZWdpbiBsaXN0ZW5pbmcgdG8gdGhlIGFwcHJvcHJpYXRlIGFzcGVjdCBvZiB0aGUgdmFsdWUgYW5kIGNhbGwKLSAqICAgICAjdmFsdWVBc3BlY3RDaGFuZ2VkKE9iamVjdCkgd2hlbmV2ZXIgdGhlIGFzcGVjdCBjaGFuZ2VzCi0gKiAKLSAqICNkaXNlbmdhZ2VWYWx1ZV8oKQotICogICAgIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBhc3BlY3Qgb2YgdGhlIHZhbHVlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWx1ZUFzcGVjdEFkYXB0ZXI8VD4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8VD4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JLyoqIENhY2hlIHRoZSB2YWx1ZSBzbyB3ZSBjYW4gZGlzZW5nYWdlLiAqLwotCXByb3RlY3RlZCBUIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlQXNwZWN0QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBhbGxvdyBib3RoIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZSBhbmQgc3RhdGUgY2hhbmdlCi0JICogbGlzdGVuZXJzLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VTdXBwb3J0KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZSgpOwotCQl0aGlzLmVuZ2FnZVZhbHVlKCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlVmFsdWUoKTsKLQkJfQotCQlzdXBlci5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlVmFsdWUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWUoKSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JCWlmICh0aGlzLnZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuZW5nYWdlVmFsdWVfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWUuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VWYWx1ZV8oKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlKCkgewotCQlpZiAodGhpcy52YWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVZhbHVlXygpOwotCQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpOwotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCB3aGVuZXZlciB0aGUgdmFsdWUncyBhc3BlY3QgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUFzcGVjdENoYW5nZWQoKSB7Ci0JCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvcnMgYWNjZXB0IG9ubHkgYSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUMT4uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+KSB0aGlzLnZhbHVlSG9sZGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZGI3NGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQgVmFsdWVBc3BlY3RBZGFwdGVyIHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZSBjb2xsZWN0aW9uCi0gKiBhc3BlY3RzIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXI8VCBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFQ+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSB2YWx1ZSdzIGNvbGxlY3Rpb25zIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBjb2xsZWN0aW9uTmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSBjb2xsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVDb2xsZWN0aW9uQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgU3RyaW5nLi4uIGNvbGxlY3Rpb25OYW1lcykgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMuY29sbGVjdGlvbk5hbWVzID0gY29sbGVjdGlvbk5hbWVzOwotCQl0aGlzLnZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbCB3ZSByZWFsbHkgY2FyZSBhYm91dCBpcyB0aGUgZmFjdCB0aGF0IGEgQ29sbGVjdGlvbiBhc3BlY3QgaGFzIAotCSAqIGNoYW5nZWQuIERvIHRoZSBzYW1lIHRoaW5nIG5vIG1hdHRlciB3aGljaCBldmVudCBvY2N1cnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVDb2xsZWN0aW9uQWRhcHRlci50aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGNvbGxlY3Rpb24gbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uTmFtZXMpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJdGhpcy52YWx1ZS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMudmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuY29sbGVjdGlvbk5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgdGhpcy52YWx1ZUNvbGxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjRkMTAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIFZhbHVlQXNwZWN0QWRhcHRlciB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgbGlzdAotICogYXNwZWN0cyBvZiB0aGUgdmFsdWUgaW4gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUxpc3RBZGFwdGVyPFQgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxUPgotewotCi0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgdmFsdWUncyBsaXN0cyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gbGlzdE5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciB2YWx1ZUxpc3RMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgbGlzdHMuCi0JICovCi0JcHVibGljIFZhbHVlTGlzdEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiBsaXN0TmFtZXMpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLmxpc3ROYW1lcyA9IGxpc3ROYW1lczsKLQkJdGhpcy52YWx1ZUxpc3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUxpc3RMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGwgd2UgcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlIGZhY3QgdGhhdCBhIExpc3QgYXNwZWN0IGhhcyAKLQkgKiBjaGFuZ2VkLiBEbyB0aGUgc2FtZSB0aGluZyBubyBtYXR0ZXIgd2hpY2ggZXZlbnQgb2NjdXJzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUxpc3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlTGlzdEFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlTGlzdEFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgbGlzdCBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoVmFsdWVMaXN0QWRhcHRlci50aGlzLmxpc3ROYW1lcyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMubGlzdE5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgdGhpcy52YWx1ZUxpc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCXRoaXMudmFsdWUucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLnZhbHVlTGlzdExpc3RlbmVyKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0MGU4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCBWYWx1ZUFzcGVjdEFkYXB0ZXIgdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlCi0gKiBwcm9wZXJ0aWVzIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlUHJvcGVydHlBZGFwdGVyPFQgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxUPgotewotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIHZhbHVlJ3MgcHJvcGVydGllcyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHZhbHVlUHJvcGVydHlMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVQcm9wZXJ0eUFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5wcm9wZXJ0eU5hbWVzID0gcHJvcGVydHlOYW1lczsKLQkJdGhpcy52YWx1ZVByb3BlcnR5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVQcm9wZXJ0eUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlUHJvcGVydHlBZGFwdGVyLnRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBwcm9wZXJ0eSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoVmFsdWVQcm9wZXJ0eUFkYXB0ZXIudGhpcy5wcm9wZXJ0eU5hbWVzKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLnZhbHVlUHJvcGVydHlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMucHJvcGVydHlOYW1lcykgewotCQkJdGhpcy52YWx1ZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy52YWx1ZVByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTE2ZmRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQgVmFsdWVBc3BlY3RBZGFwdGVyIHRvIGxpc3RlbiB0byB0aGUKLSAqICJzdGF0ZSIgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVTdGF0ZUFkYXB0ZXI8VCBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFQ+Ci17Ci0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciB2YWx1ZVN0YXRlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgdmFsdWUgc3RhdGUuCi0JICovCi0JcHVibGljIFZhbHVlU3RhdGVBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy52YWx1ZVN0YXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVTdGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVTdGF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlU3RhdGVBZGFwdGVyLnRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBzdGF0ZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCXRoaXMudmFsdWUuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnZhbHVlU3RhdGVMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVfKCkgewotCQl0aGlzLnZhbHVlLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy52YWx1ZVN0YXRlTGlzdGVuZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlVHJlZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVRyZWVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzljNTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlVHJlZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQgVmFsdWVBc3BlY3RBZGFwdGVyIHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZQotICogdHJlZSBhc3BlY3RzIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlVHJlZUFkYXB0ZXI8VCBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFQ+Ci17Ci0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgdmFsdWUncyB0cmVlcyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gdHJlZU5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciB2YWx1ZVRyZWVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHJlZXMuCi0JICovCi0JcHVibGljIFZhbHVlVHJlZUFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiB0cmVlTmFtZXMpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLnRyZWVOYW1lcyA9IHRyZWVOYW1lczsKLQkJdGhpcy52YWx1ZVRyZWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZVRyZWVMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVUcmVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIHRyZWUgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlVHJlZUFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLnZhbHVlVHJlZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJdGhpcy52YWx1ZS5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMudmFsdWVUcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjY2E3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmlkaVN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgd3JhcHMgYSBQcmVmZXJlbmNlIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgUHJvcGVydHlWYWx1ZU1vZGVsLgotICogSXQgbGlzdGVucyBmb3IgdGhlIGFwcHJvcHJpYXRlICJwcmVmZXJlbmNlIiBjaGFuZ2VzIGFuZCBjb252ZXJ0cyB0aGVtIGludG8KLSAqIFZBTFVFIHByb3BlcnR5IGNoYW5nZXMuIEl0IGFsc28gYWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgZGVmYXVsdCB2YWx1ZQotICogZm9yIHRoZSBQcmVmZXJlbmNlLCB3aGljaCwgYnkgZGVmYXVsdCwgaXMgbnVsbCAoYW5kIGlzIHByb2JhYmx5ICpub3QqIGEgdmVyeQotICogZ29vZCBkZWZhdWx0KS4KLSAqIAotICogWW91IGNhbiBjb25maWd1cmUgd2hldGhlciB0aGUgcHJlZmVyZW5jZSdzIHZhbHVlIGlzIHJldHVybmVkLAotICogdW5jaGFuZ2VkLCBhcyBhIHN0cmluZyBvciBhcyBzb21lIG90aGVyIG9iamVjdCAoZS5nLiBhbiBJbnRlZ2VyKSBieQotICogc2V0dGluZyB0aGUgYWRhcHRlcidzIGNvbnZlcnRlci4gSW50ZXJuYWxseSwgdGhlIHByZWZlcmVuY2UncyB2YWx1ZQotICogaXMgc3RvcmVkIGFzIHRoZSBjb252ZXJ0ZWQgb2JqZWN0OyBhbmQgdGhlIGNvbnZlcnNpb25zIHRha2UgcGxhY2UKLSAqIHdoZW4gcmVhZGluZyBvciB3cml0aW5nIGZyb20gdGhlIHByZWZlcmVuY2VzIG5vZGUgb3IgcmV0cmlldmluZyB0aGUKLSAqIHZhbHVlIGZyb20gYW4gZXZlbnQgZmlyZWQgYnkgdGhlIHByZWZlcmVuY2VzIG5vZGUuCi0gKiAKLSAqIFRoaXMgYWRhcHRlciBpcyBhIGJpdCBkaWZmZXJlbnQgZnJvbSBtb3N0IG90aGVyIGFkYXB0ZXJzIGJlY2F1c2UgdGhlCi0gKiBjaGFuZ2UgZXZlbnRzIGZpcmVkIG9mZiBieSBhIFByZWZlcmVuY2VzIG5vZGUgYXJlIGFzeW5jaHJvbm91cyBmcm9tCi0gKiB0aGUgY2hhbmdlIGl0c2VsZi4gKEFic3RyYWN0UHJlZmVyZW5jZXMgdXNlcyBhbiBldmVudCBkaXNwYXRjaCBkYWVtb24uKQotICogQXMgYSByZXN1bHQsIGEgY2xpZW50IGNhbiBzZXQgb3VyIHZhbHVlIHdpdGggI3NldFZhbHVlKE9iamVjdCkgYW5kIHdlCi0gKiB3aWxsIHJldHVybiBmcm9tIHRoYXQgbWV0aG9kIGJlZm9yZSB3ZSBldmVyIHJlY2VpdmUgbm90aWZpY2F0aW9uIGZyb20KLSAqIHRoZSBQcmVmZXJlbmNlcyBub2RlIHRoYXQgKml0KiBoYXMgY2hhbmdlZC4gVGhpcyBtZWFucyB3ZSBjYW5ub3QKLSAqIHJlbHkgb24gdGhhdCBldmVudCB0byBrZWVwIG91ciBpbnRlcm5hbGx5IGNhY2hlZCB2YWx1ZSBpbiBzeW5jaC4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8UHJlZmVyZW5jZXM+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQPgotewotCS8qKiBUaGUga2V5IHRvIHRoZSBwcmVmZXJlbmNlIHdlIHVzZSBmb3IgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcga2V5OwotCi0JLyoqCi0JICogQ2FjaGUgdGhlIGN1cnJlbnQgKG9iamVjdCkgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugc28gd2UKLQkgKiBjYW4gcGFzcyBhbiAib2xkIHZhbHVlIiB3aGVuIHdlIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIFAgdmFsdWU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCAob2JqZWN0KSB2YWx1ZSByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyB2YWx1ZQotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUCBkZWZhdWx0VmFsdWU7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnZlcnRlciBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIHByZWZlcmVuY2UncwotCSAqIHN0cmluZyB2YWx1ZSB0byBhbmQgZnJvbSBhbiBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8UD4gY29udmVydGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBhcHByb3ByaWF0ZSBwcmVmZXJlbmNlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSkgewotCQl0aGlzKHByZWZlcmVuY2VzLCBrZXksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMsIFN0cmluZyBrZXksIFAgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMocHJlZmVyZW5jZXMsIGtleSwgZGVmYXVsdFZhbHVlLCBCaWRpU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFA+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSwgUCBkZWZhdWx0VmFsdWUsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8UD4gY29udmVydGVyKSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4ocHJlZmVyZW5jZXMpLCBrZXksIGRlZmF1bHRWYWx1ZSwgY29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmb3JCb29sZWFuKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzLCBTdHJpbmcga2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oCi0JCQkJcHJlZmVyZW5jZXMsCi0JCQkJa2V5LAotCQkJCWRlZmF1bHRWYWx1ZSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UsCi0JCQkJQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkKLQkJCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gZm9ySW50ZWdlcihQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oCi0JCQkJcHJlZmVyZW5jZXMsCi0JCQkJa2V5LAotCQkJCW5ldyBJbnRlZ2VyKGRlZmF1bHRWYWx1ZSksCi0JCQkJQmlkaVN0cmluZ0NvbnZlcnRlci5JbnRlZ2VyQ29udmVydGVyLmluc3RhbmNlKCkKLQkJCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aWxsIGJlIG51bGwuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcmVmZXJlbmNlcz4gcHJlZmVyZW5jZXNIb2xkZXIsIFN0cmluZyBrZXkpIHsKLQkJdGhpcyhwcmVmZXJlbmNlc0hvbGRlciwga2V5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyLCBTdHJpbmcga2V5LCBQIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKHByZWZlcmVuY2VzSG9sZGVyLCBrZXksIGRlZmF1bHRWYWx1ZSwgQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxQPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcmVmZXJlbmNlcz4gcHJlZmVyZW5jZXNIb2xkZXIsIFN0cmluZyBrZXksIFAgZGVmYXVsdFZhbHVlLCBCaWRpU3RyaW5nQ29udmVydGVyPFA+IGNvbnZlcnRlcikgewotCQlzdXBlcihwcmVmZXJlbmNlc0hvbGRlcik7Ci0JCXRoaXMua2V5ID0ga2V5OwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCXRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBvdXIgdmFsdWUgaXMgbnVsbCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBwcmVmZXJlbmNlCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBIHByZWZlcmVuY2UgaGFzIGNoYW5nZWQsIG5vdGlmeSB0aGUgbGlzdGVuZXJzIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHByZWZlcmVuY2UgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIHByb3BlcnR5IGNoYW5nZSBldmVudHMKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwudGhpcy5wcmVmZXJlbmNlQ2hhbmdlZChldmVudC5nZXRLZXkoKSwgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJwcmVmZXJlbmNlIGNoYW5nZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYWNoZWQgKGNvbnZlcnRlZCkgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBQIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgY2FjaGVkIHZhbHVlLCB0aGVuIHNldCB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VmFsdWUoUCB2YWx1ZSkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQlyZXR1cm47CQkvLyBubyBjaGFuZ2VzIGFsbG93ZWQgd2hlbiB3ZSBoYXZlIG5vIGxpc3RlbmVycwotCQl9Ci0KLQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKG9sZCwgdmFsdWUpOwotCi0JCWlmICgodGhpcy5zdWJqZWN0ICE9IG51bGwpICYmIHRoaXMuc2hvdWxkU2V0UHJlZmVyZW5jZShvbGQsIHZhbHVlKSkgewotCQkJdGhpcy5zZXRWYWx1ZV8odmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBWQUxVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFZBTFVFKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdGhpcy5zdWJqZWN0LmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuc3ViamVjdC5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGZvciBzb21lIG9kZCByZWFzb24sIHdlIGFyZSBub3QgYWxsb3dlZCB0byByZW1vdmUgYSBsaXN0ZW5lciBmcm9tIGEgImRlYWQiCi0JCQkvLyBwcmVmZXJlbmNlcyBub2RlOyBzbyBoYW5kbGUgdGhlIGV4Y2VwdGlvbiB0aGF0IGdldHMgdGhyb3duIGhlcmUKLQkJCWlmICggISBleC5nZXRNZXNzYWdlKCkuZXF1YWxzKCJOb2RlIGhhcyBiZWVuIHJlbW92ZWQuIikpIHsKLQkJCQkvLyBpZiBpdCBpcyBub3QgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiwgcmUtdGhyb3cgaXQKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJfQotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmtleSk7Ci0JCXNiLmFwcGVuZCgiID0+ICIpOwotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmVmZXJlbmNlJ3Mga2V5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gdGhpcy5rZXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmVmZXJlbmNlJ3MgdmFsdWUuCi0JICogQXQgdGhpcyBwb2ludCB0aGUgc3ViamVjdCBtYXkgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgUCBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVmFsdWVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBwcmVmZXJlbmNlLCBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIG9iamVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoYXQgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICovCi0JcHJvdGVjdGVkIFAgYnVpbGRWYWx1ZV8oKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRUb09iamVjdCh0aGlzLnN1YmplY3QuZ2V0KHRoaXMua2V5LCB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLmRlZmF1bHRWYWx1ZSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGFwcHJvcHJpYXRlIHByZWZlcmVuY2UgYWZ0ZXIgY29udmVydGluZyB0aGUgdmFsdWUgdG8gYSBzdHJpbmcuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhQIHZhbHVlKSB7Ci0JCXRoaXMuc3ViamVjdC5wdXQodGhpcy5rZXksIHRoaXMuY29udmVydFRvU3RyaW5nKHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZAotCSAqIHRocm91Z2ggdG8gdGhlIHByZWZlcmVuY2UuIEJ5IGRlZmF1bHQsIG9ubHkgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLAotCSAqIHdpbGwgaXQgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHByZWZlcmVuY2UuIFRoaXMgYWxzbyBoYXMgdGhlCi0JICogZWZmZWN0IG9mIG5vdCBjcmVhdGluZyBuZXcgcHJlZmVyZW5jZXMgaW4gdGhlICJiYWNraW5nIHN0b3JlIgotCSAqIGlmIHRoZSBuZXcgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRydWUgaWYgdGhleQotCSAqIHdvdWxkIGxpa2UgdG8gQUxXQVlTIHBhc3MgdGhyb3VnaCB0aGUgbmV3IHZhbHVlIHRvIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNldFByZWZlcmVuY2UoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byBhIHN0cmluZyB0aGF0IGNhbiBiZSBzdG9yZWQgYXMKLQkgKiB0aGUgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoUCBvKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcobyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2UgdmFsdWUgc3RyaW5nIHRvIGFuCi0JICogYXBwcm9wcmlhdGVseS10eXBlZCBvYmplY3QgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgUCBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyLmNvbnZlcnRUb09iamVjdChzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlZChTdHJpbmcgcHJlZktleSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCWlmIChwcmVmS2V5LmVxdWFscyh0aGlzLmtleSkpIHsKLQkJCXRoaXMucHJlZmVyZW5jZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIHByZWZlcmVuY2UgY2hhbmdlZDsgZWl0aGVyIGJlY2F1c2Ugd2UgY2hhbmdlZCBpdAotCSAqIGluICNzZXRWYWx1ZV8oT2JqZWN0KSBvciBhIHRoaXJkLXBhcnR5IGNoYW5nZWQgaXQuCi0JICogSWYgdGhpcyBpcyBjYWxsZWQgYmVjYXVzZSBvZiBvdXIgb3duIGNoYW5nZSwgdGhlIGV2ZW50IHdpbGwgYmUKLQkgKiBzd2FsbG93ZWQgYmVjYXVzZSB0aGUgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB0aGUgc2FtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcHJlZmVyZW5jZUNoYW5nZWQoKSB7Ci0JCU9iamVjdCBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JCXRoaXMuZmlyZUFzcGVjdENoYW5nZShvbGQsIHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Y2VmNjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIHdyYXBzIGEgUHJlZmVyZW5jZXMgbm9kZSBhbmQgY29udmVydHMgaXRzIHByZWZlcmVuY2VzIGludG8gYQotICogQ29sbGVjdGlvblZhbHVlTW9kZWwgb2YgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbHMuIEl0IGxpc3RlbnMgZm9yCi0gKiAicHJlZmVyZW5jZSIgY2hhbmdlcyBhbmQgY29udmVydHMgdGhlbSBpbnRvIFZBTFVFIGNvbGxlY3Rpb24gY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWw8UD4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8UHJlZmVyZW5jZXM+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PgotewotCi0JLyoqIENhY2hlIHRoZSBjdXJyZW50IHByZWZlcmVuY2VzLCBzdG9yZWQgaW4gbW9kZWxzIGFuZCBrZXllZCBieSBuYW1lLiAqLwotCXByb3RlY3RlZCBmaW5hbCBIYXNoTWFwPFN0cmluZywgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gcHJlZmVyZW5jZXM7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHByZWZlcmVuY2VzIG5vZGUgZm9yIGFkZGVkIG9yIHJlbW92ZWQgcHJlZmVyZW5jZXMuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBwcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2VzIG5vZGUuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFByZWZlcmVuY2VzPihwcmVmZXJlbmNlcykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2VzIG5vZGUuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcmVmZXJlbmNlcz4gcHJlZmVyZW5jZXNIb2xkZXIpIHsKLQkJc3VwZXIocHJlZmVyZW5jZXNIb2xkZXIpOwotCQl0aGlzLnByZWZlcmVuY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PigpOwotCQl0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQSBwcmVmZXJlbmNlcyBoYXZlIGNoYW5nZWQsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgcHJlZmVyZW5jZSBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzCi0JCXJldHVybiBuZXcgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJlZmVyZW5jZUNoYW5nZShQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMucHJlZmVyZW5jZUNoYW5nZWQoZXZlbnQuZ2V0S2V5KCksIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJlZmVyZW5jZSBjaGFuZ2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIHByZWZlcmVuY2UgbW9kZWxzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnByZWZlcmVuY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXMuc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIFZBTFVFUzsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVkFMVUVTKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUyk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0JCXRoaXMuc3ViamVjdC5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlmb3IgKEl0ZXJhdG9yPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+IHN0cmVhbSA9IHRoaXMucHJlZmVyZW5jZU1vZGVscygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gcHJlZmVyZW5jZU1vZGVsID0gc3RyZWFtLm5leHQoKTsKLQkJCXRoaXMucHJlZmVyZW5jZXMucHV0KHByZWZlcmVuY2VNb2RlbC5nZXRLZXkoKSwgcHJlZmVyZW5jZU1vZGVsKTsKLQkJfQotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQl0cnkgewotCQkJdGhpcy5zdWJqZWN0LnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJLy8gZm9yIHNvbWUgb2RkIHJlYXNvbiwgd2UgYXJlIG5vdCBhbGxvd2VkIHRvIHJlbW92ZSBhIGxpc3RlbmVyIGZyb20gYSAiZGVhZCIKLQkJCS8vIHByZWZlcmVuY2VzIG5vZGU7IHNvIGhhbmRsZSB0aGUgZXhjZXB0aW9uIHRoYXQgZ2V0cyB0aHJvd24gaGVyZQotCQkJaWYgKCAhIGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMoIk5vZGUgaGFzIGJlZW4gcmVtb3ZlZC4iKSkgewotCQkJCS8vIGlmIGl0IGlzIG5vdCB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLCByZS10aHJvdyBpdAotCQkJCXRocm93IGV4OwotCQkJfQotCQl9Ci0JCXRoaXMucHJlZmVyZW5jZXMuY2xlYXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnN1YmplY3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgcHJlZmVyZW5jZSBtb2RlbHMuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PiBwcmVmZXJlbmNlTW9kZWxzKCkgewotCQlTdHJpbmdbXSBrZXlzOwotCQl0cnkgewotCQkJa2V5cyA9IHRoaXMuc3ViamVjdC5rZXlzKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+KG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oa2V5cykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gdHJhbnNmb3JtKFN0cmluZyBrZXkpIHsKLQkJCQlyZXR1cm4gUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbC50aGlzLmJ1aWxkUHJlZmVyZW5jZU1vZGVsKGtleSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gdHdlYWsgdGhlIG1vZGVsIHVzZWQgdG8gd3JhcCB0aGUKLQkgKiBzcGVjaWZpZWQgcHJlZmVyZW5jZSAoZS5nLiB0byBjdXN0b21pemUgdGhlIG1vZGVsJ3MgY29udmVydGVyKS4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBidWlsZFByZWZlcmVuY2VNb2RlbChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBuZXcgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPih0aGlzLnN1YmplY3RIb2xkZXIsIGtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHByZWZlcmVuY2VDaGFuZ2VkKFN0cmluZyBrZXksIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJLy8gYSBwcmVmZXJlbmNlIHdhcyByZW1vdmVkCi0JCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+IHByZWZlcmVuY2VNb2RlbCA9IHRoaXMucHJlZmVyZW5jZXMucmVtb3ZlKGtleSk7Ci0JCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChWQUxVRVMsIHByZWZlcmVuY2VNb2RlbCk7Ci0JCX0gZWxzZSBpZiAoICEgdGhpcy5wcmVmZXJlbmNlcy5jb250YWluc0tleShrZXkpKSB7Ci0JCQkvLyBhIHByZWZlcmVuY2Ugd2FzIGFkZGVkCi0JCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+IHByZWZlcmVuY2VNb2RlbCA9IHRoaXMuYnVpbGRQcmVmZXJlbmNlTW9kZWwoa2V5KTsKLQkJCXRoaXMucHJlZmVyZW5jZXMucHV0KGtleSwgcHJlZmVyZW5jZU1vZGVsKTsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChWQUxVRVMsIHByZWZlcmVuY2VNb2RlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBhIHByZWZlcmVuY2UncyB2YWx1ZSBjaGFuZ2VkIC0gZG8gbm90aGluZwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQWJzdHJhY3RUcmVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9BYnN0cmFjdFRyZWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTQ2NDE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9BYnN0cmFjdFRyZWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBwcm92aWRlZCBieSB0aGUgSkRLCi0gKiAo4CBsYSBqYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbCkuIFRoaXMgY2xhc3MgcHJvdmlkZXM6Ci0gKiAtIHN1cHBvcnQgZm9yIGEgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMKLSAqIC0gYSBudW1iZXIgb2YgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmlyaW5nIGV2ZW50cyBmb3IgdGhvc2UgbGlzdGVuZXJzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVNb2RlbAotCWltcGxlbWVudHMgVHJlZU1vZGVsLCBTZXJpYWxpemFibGUKLXsKLQkvKiogT3VyIGxpc3RlbmVycy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdGVuZXJMaXN0ID0gbmV3IEV2ZW50TGlzdGVuZXJMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBhcnRpYWwgVHJlZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKFRyZWVNb2RlbExpc3RlbmVyLmNsYXNzLCBsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcywgbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtb2RlbCdzIGN1cnJlbnQgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMuCi0JICogKFRoZXJlIHNlZW1zIHRvIGJlIGEgcGF0dGVybiBvZiBtYWtpbmcgdGhpcyB0eXBlIG9mIG1ldGhvZCBwdWJsaWM7Ci0JICogYWx0aG91Z2ggaXQgc2hvdWxkIHByb2JhYmx5IGJlIHByb3RlY3RlZC4uLi4pCi0JICovCi0JcHVibGljIFRyZWVNb2RlbExpc3RlbmVyW10gdHJlZU1vZGVsTGlzdGVuZXJzKCkgewotIAkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycyhUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vVHJlZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1vZGVsIGhhcyBhbnkgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1RyZWVNb2RlbExpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNOb1RyZWVNb2RlbExpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEEgc2lnbmlmaWNhbnQgcHJvcGVydHkgb2YgdGhlIG5vZGVzIGNoYW5nZWQsIGJ1dCB0aGUgbm9kZXMgdGhlbXNlbHZlcwotCSAqIGFyZSBzdGlsbCB0aGUgc2FtZSBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2Rlc0NoYW5nZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEEgc2lnbmlmaWNhbnQgcHJvcGVydHkgb2YgdGhlIG5vZGUgY2hhbmdlZCwgYnV0IHRoZSBub2RlIGl0c2VsZiBpcyB0aGUgc2FtZSBvYmplY3QuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVDaGFuZ2VkKE9iamVjdFtdIHBhdGgsIGludCBjaGlsZEluZGV4LCBPYmplY3QgY2hpbGQpIHsKLQkJdGhpcy5maXJlVHJlZU5vZGVzQ2hhbmdlZChwYXRoLCBuZXcgaW50W10ge2NoaWxkSW5kZXh9LCBuZXcgT2JqZWN0W10ge2NoaWxkfSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBBIHNpZ25pZmljYW50IHByb3BlcnR5IG9mIHRoZSByb290IGNoYW5nZWQsIGJ1dCB0aGUgcm9vdCBpdHNlbGYgaXMgdGhlIHNhbWUgb2JqZWN0LgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVSb290Q2hhbmdlZChPYmplY3Qgcm9vdCkgewotCQl0aGlzLmZpcmVUcmVlTm9kZXNDaGFuZ2VkKG5ldyBPYmplY3RbXSB7cm9vdH0sIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVzSW5zZXJ0ZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc0luc2VydGVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVJbnNlcnRlZChPYmplY3RbXSBwYXRoLCBpbnQgY2hpbGRJbmRleCwgT2JqZWN0IGNoaWxkKSB7Ci0JCXRoaXMuZmlyZVRyZWVOb2Rlc0luc2VydGVkKHBhdGgsIG5ldyBpbnRbXSB7Y2hpbGRJbmRleH0sIG5ldyBPYmplY3RbXSB7Y2hpbGR9KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2Rlc1JlbW92ZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlTm9kZVJlbW92ZWQoT2JqZWN0W10gcGF0aCwgaW50IGNoaWxkSW5kZXgsIE9iamVjdCBjaGlsZCkgewotCQl0aGlzLmZpcmVUcmVlTm9kZXNSZW1vdmVkKHBhdGgsIG5ldyBpbnRbXSB7Y2hpbGRJbmRleH0sIG5ldyBPYmplY3RbXSB7Y2hpbGR9KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKE9iamVjdFtdIHBhdGgpIHsKLQkJLy8gZ3VhcmFudGVlZCB0byByZXR1cm4gYSBub24tbnVsbCBhcnJheQotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKTsKLQkJVHJlZU1vZGVsRXZlbnQgZXZlbnQgPSBudWxsOwotCQkvLyBwcm9jZXNzIHRoZSBsaXN0ZW5lcnMgbGFzdCB0byBmaXJzdCwgbm90aWZ5aW5nCi0JCS8vIHRob3NlIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gdGhpcyBldmVudAotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aC0yOyBpPj0wOyBpLT0yKSB7Ci0JCQlpZiAobGlzdGVuZXJzW2ldPT1UcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgewotCQkJCS8vIGxhemlseSBjcmVhdGUgdGhlIGV2ZW50Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJZXZlbnQgPSBuZXcgVHJlZU1vZGVsRXZlbnQodGhpcywgcGF0aCk7Ci0JCQkJfQotCQkJCSgoVHJlZU1vZGVsTGlzdGVuZXIpIGxpc3RlbmVyc1tpKzFdKS50cmVlU3RydWN0dXJlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVSb290UmVwbGFjZWQoT2JqZWN0IG5ld1Jvb3QpIHsKLQkJdGhpcy5maXJlVHJlZVN0cnVjdHVyZUNoYW5nZWQobmV3IE9iamVjdFtdIHtuZXdSb290fSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjZjYmZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQnV0dG9uTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3RlbmVyCi0gKiAoZS5nLiBhIEpDaGVja0JveCkgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0Ci0gKiBob2xkcyBhIGJvb2xlYW4uCi0gKiAKLSAqIE1heWJlIG5vdCB0aGUgcmljaGVzdCBjbGFzcyBpbiBvdXIgdG9vbGJveCwgYnV0IGl0IHdhcyB0aGUKLSAqIHZpY3RpbSBvZiByZWZhY3RvcmluZy4uLi4gIH5ianYKLSAqLwotcHVibGljIGNsYXNzIENoZWNrQm94TW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBUb2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIKLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBDaGVja0JveE1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcihib29sZWFuSG9sZGVyLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIENoZWNrQm94TW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIpIHsKLQkJc3VwZXIoYm9vbGVhbkhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29sdW1uQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbHVtbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyYjVkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29sdW1uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0KLS8qKgotICogVGhpcyBhZGFwdGVyIGlzIHVzZWQgYnkgdGhlIHRhYmxlIG1vZGVsIGFkYXB0ZXIgdG8KLSAqIGNvbnZlcnQgYSBtb2RlbCBvYmplY3QgaW50byB0aGUgbW9kZWxzIHVzZWQgZm9yIGVhY2ggb2YKLSAqIHRoZSBjZWxscyBmb3IgdGhlIG9iamVjdCdzIGNvcnJlc3BvbmRpbmcgcm93IGluIHRoZSB0YWJsZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb2x1bW5BZGFwdGVyIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS4KLQkgKiBUeXBpY2FsbHkgdGhpcyBpcyBzdGF0aWMuCi0JICovCi0JaW50IGNvbHVtbkNvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBjb2x1bW4uCi0JICovCi0JU3RyaW5nIGNvbHVtbk5hbWUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBjb2x1bW4uCi0JICovCi0JQ2xhc3M8Pz4gY29sdW1uQ2xhc3MoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sdW1uIGlzIGVkaXRhYmxlLgotCSAqIFR5cGljYWxseSB0aGlzIGlzIHRoZSBzYW1lIGZvciBldmVyeSByb3cuCi0JICovCi0JYm9vbGVhbiBjb2x1bW5Jc0VkaXRhYmxlKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwgbW9kZWxzIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIHJvdyBpbiB0aGUgdGFibGUuCi0JICovCi0JV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIGNlbGxNb2RlbHMoT2JqZWN0IHN1YmplY3QpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmMzBjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgTGlzdERhdGFMaXN0ZW5lcgotICogKGUuZy4gYSBKQ29tYm9Cb3gpIGluIHN5bmNoIHdpdGggYSBMaXN0VmFsdWVNb2RlbCAob3IgYSBDb2xsZWN0aW9uVmFsdWVNb2RlbCkuCi0gKiBGb3IgY29tYm8gYm94ZXMsIHRoZSBtb2RlbCBvYmplY3QgdGhhdCBob2xkcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMKLSAqIHR5cGljYWxseSBhIGRpZmZlcmVudCBtb2RlbCBvYmplY3QgdGhhbiB0aGUgb25lIHRoYXQgaG9sZHMgdGhlIGNvbGxlY3Rpb24KLSAqIG9mIGNob2ljZXMuCi0gKiAKLSAqIEZvciBleGFtcGxlLCBhIE1XUmVmZXJlbmNlICh0aGUgc2VsZWN0aW9uT3duZXIpIGhhcyBhbiBhdHRyaWJ1dGUKLSAqICJzb3VyY2VUYWJsZSIgKHRoZSBjb2xsZWN0aW9uT3duZXIpCi0gKiB3aGljaCBob2xkcyBvbiB0byBhIGNvbGxlY3Rpb24gb2YgTVdEYXRhYmFzZUZpZWxkcy4gV2hlbiB0aGUgc2VsZWN0aW9uCi0gKiBpcyBjaGFuZ2VkIHRoaXMgbW9kZWwgd2lsbCBrZWVwIHRoZSBsaXN0ZW5lcnMgYXdhcmUgb2YgdGhlIGNoYW5nZXMuCi0gKiBUaGUgaW5oZXJpdGVkIGxpc3QgbW9kZWwgd2lsbCBrZWVwIGl0cyBsaXN0ZW5lcnMgYXdhcmUgb2YgY2hhbmdlcyB0byB0aGUKLSAqIGNvbGxlY3Rpb24gbW9kZWwKLSAqIAotICogSW4gYWRkaXRpb24gdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIHJlcXVpcmVkIGJ5IHRoZSBzdXBlcmNsYXNzLAotICogYW4gaW5zdGFuY2Ugb2YgdGhpcyBDb21ib0JveE1vZGVsIG11c3QgYmUgc3VwcGxpZWQgd2l0aCBhCi0gKiBzZWxlY3Rpb24gaG9sZGVyLCB3aGljaCBpcyBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IHByb3ZpZGVzIGFjY2VzcwotICogdG8gdGhlIHNlbGVjdGlvbiAodHlwaWNhbGx5IGEgUHJvcGVydHlBc3BlY3RBZGFwdGVyKS4KLSAqLwotcHVibGljIGNsYXNzIENvbWJvQm94TW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBMaXN0TW9kZWxBZGFwdGVyCi0JaW1wbGVtZW50cyBDb21ib0JveE1vZGVsCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyOwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciBhbmQgc2VsZWN0aW9uIGhvbGRlciBhcmUgcmVxdWlyZWQ7Ci0JICovCi0JcHVibGljIENvbWJvQm94TW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQlpZiAoc2VsZWN0aW9uSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc2VsZWN0aW9uSG9sZGVyID0gc2VsZWN0aW9uSG9sZGVyOwotCQl0aGlzLnNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgY29sbGVjdGlvbiBob2xkZXIgYW5kIHNlbGVjdGlvbiBob2xkZXIgYXJlIHJlcXVpcmVkOwotCSAqLwotCXB1YmxpYyBDb21ib0JveE1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uSG9sZGVyLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQkJaWYgKHNlbGVjdGlvbkhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnNlbGVjdGlvbkhvbGRlciA9IHNlbGVjdGlvbkhvbGRlcjsKLQkJdGhpcy5zZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gbm90aWZ5IGxpc3RlbmVycyB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlci50aGlzLmZpcmVTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21ib0JveE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3Rpb25Ib2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEl0ZW0oT2JqZWN0IHNlbGVjdGVkSXRlbSkgewotCQl0aGlzLnNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gZW5nYWdlIHRoZSBzZWxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQl0aGlzLnNlbGVjdGlvbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGRpc2VuZ2FnZSB0aGUgc2VsZWN0aW9uIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5zZWxlY3Rpb25Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSB0aGUgbGlzdGVuZXJzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJLy8gSSBndWVzcyB0aGlzIHdpbGwgd29yay4uLgotCQl0aGlzLmZpcmVDb250ZW50c0NoYW5nZWQodGhpcywgLTEsIC0xKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNlbGVjdGlvbkhvbGRlciArICI6IiArIHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDAyNTZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyRGF0ZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyRGF0ZU1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBDaGFuZ2VMaXN0ZW5lcgotICogKGUuZy4gYSBKU3Bpbm5lcikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgZGF0ZS4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IGJlIGEgc3ViLWNsYXNzIG9mIFNwaW5uZXJEYXRlTW9kZWwgYmVjYXVzZSBvZiBzb21lCi0gKiBjcmFwcHkgamRrIGNvZGUuLi4uICB+Ymp2Ci0gKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyI2NyZWF0ZUVkaXRvcihqYXZheC5zd2luZy5TcGlubmVyTW9kZWwpCi0gKiAKLSAqIElmIHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgbW9kaWZpZWQsIGl0IHdvdWxkIGJlaG9vdmUgdXMgdG8gcmV2aWV3IHRoZQotICogb3RoZXIsIHNpbWlsYXIgY2xhc3NlczoKLSAqIEBzZWUgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqIEBzZWUgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFNwaW5uZXJEYXRlTW9kZWwKLXsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWU7IHVzZWQgd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBkYXRlIHZhbHVlIGlzIG51bGwuCi0JICogVGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgZGF0ZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIERhdGUgZGVmYXVsdFZhbHVlOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgZGF0ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGggY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGUuICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGRhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZSBpcyB0aGUgY3VycmVudCBkYXRlLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIpIHsKLQkJdGhpcyhkYXRlSG9sZGVyLCBuZXcgRGF0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBkYXRlIGhvbGRlciBhbmQgZGVmYXVsdCB2YWx1ZSBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlciwgRGF0ZSBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhkYXRlSG9sZGVyLCBudWxsLCBudWxsLCBDYWxlbmRhci5EQVlfT0ZfTU9OVEgsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZSBpcyB0aGUgY3VycmVudCBkYXRlLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIsIENvbXBhcmFibGU8Pz4gc3RhcnQsIENvbXBhcmFibGU8Pz4gZW5kLCBpbnQgY2FsZW5kYXJGaWVsZCkgewotCQl0aGlzKGRhdGVIb2xkZXIsIHN0YXJ0LCBlbmQsIGNhbGVuZGFyRmllbGQsIG5ldyBEYXRlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGRhdGUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIsIENvbXBhcmFibGU8Pz4gc3RhcnQsIENvbXBhcmFibGU8Pz4gZW5kLCBpbnQgY2FsZW5kYXJGaWVsZCwgRGF0ZSBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoZGF0ZUhvbGRlci5nZXRWYWx1ZSgpID09IG51bGwgPyBkZWZhdWx0VmFsdWUgOiAoRGF0ZSkgZGF0ZUhvbGRlci5nZXRWYWx1ZSgpLCBzdGFydCwgZW5kLCBjYWxlbmRhckZpZWxkKTsKLQkJdGhpcy5kYXRlSG9sZGVyID0gZGF0ZUhvbGRlcjsKLQkJdGhpcy5kYXRlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBkYXRlCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURhdGVTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3luY2hyb25pemUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkYXRlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3Bpbm5lck1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBjaGVjayB3aGV0aGVyIHRoaXMgbWV0aG9kIGlzIGJlaW5nIGNhbGxlZCBiZWZvcmUgd2UgCi0JICogaGF2ZSBhbnkgbGlzdGVuZXJzLgotCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSBjcmFwcHkgamRrIGNvZGUgZ2V0cyB0aGUgdmFsdWUKLQkgKiBmcm9tIHRoZSBtb2RlbCAqYmVmb3JlKiBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLiAgfmJqdgotCSAqIEBzZWUgamF2YXguc3dpbmcuSlNwaW5uZXIuRGVmYXVsdEVkaXRvcihqYXZheC5zd2luZy5KU3Bpbm5lcikKLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJLy8gc29ycnkgYWJvdXQgdGhpcyAibGF0ZXJhbCIgY2FsbCB0byBzdXBlciAgfmJqdgotCQkJc3VwZXIuc2V0VmFsdWUodGhpcy5zcGlubmVyVmFsdWVPZih0aGlzLmRhdGVIb2xkZXIuZ2V0VmFsdWUoKSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgZGF0ZSBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLmRhdGVIb2xkZXIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgZGF0ZSBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMuZGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5kYXRlQ2hhbmdlTGlzdGVuZXIpOwotCQkJdGhpcy5zeW5jaHJvbml6ZSh0aGlzLmRhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBkYXRlIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMuZGF0ZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5kYXRlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIERhdGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0byBhIG5vbi1udWxsIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3Bpbm5lclZhbHVlT2YoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRWYWx1ZSgpIDogdmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lciB2YWx1ZSBpZiBpdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplKE9iamVjdCB2YWx1ZSkgewotCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLnNwaW5uZXJWYWx1ZU9mKHZhbHVlKTsKLQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHNwaW5uZXIgZGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kYXRlSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmMDRkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5FdmVudExpc3RlbmVyTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5VbmRvYWJsZUVkaXRFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5VbmRvYWJsZUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkF0dHJpYnV0ZVNldDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5FbGVtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuUGxhaW5Eb2N1bWVudDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU2VnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgRG9jdW1lbnRMaXN0ZW5lcgotICogKGUuZy4gYSBKVGV4dEZpZWxkKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSBzdHJpbmcuCi0gKiAKLSAqIE5COiBUaGlzIG1vZGVsIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yICJzbWFsbCIgZG9jdW1lbnRzOwotICogaS5lLiBkb2N1bWVudHMgdXNlZCBieSB0ZXh0IGZpZWxkcywgbm90IHRleHQgcGFuZXMuCi0gKiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKFN0cmluZykKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50QWRhcHRlcgotCWltcGxlbWVudHMgRG9jdW1lbnQsIFNlcmlhbGl6YWJsZQotewotCi0JLyoqIFRoZSBkZWxlZ2F0ZSBkb2N1bWVudCB3aG9zZSBiZWhhdmlvciB3ZSAiZW5oYW5jZSIuICovCi0JcHJvdGVjdGVkIGZpbmFsIERvY3VtZW50IGRlbGVnYXRlOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gZm9yd2FyZCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBkZWxlZ2F0ZSBkb2N1bWVudC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYmluZWRMaXN0ZW5lciBkZWxlZ2F0ZUxpc3RlbmVyOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nLiAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGggY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdHJpbmdMaXN0ZW5lcjsKLQotICAgIC8qKiBUaGUgZXZlbnQgbGlzdGVuZXIgbGlzdCBmb3IgdGhlIGRvY3VtZW50LiAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBFdmVudExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgRXZlbnRMaXN0ZW5lckxpc3QoKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgc3RyaW5nIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIERvY3VtZW50QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlciwgRG9jdW1lbnQgZGVsZWdhdGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHN0cmluZ0hvbGRlciA9PSBudWxsIHx8IGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc3RyaW5nSG9sZGVyID0gc3RyaW5nSG9sZGVyOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JCXRoaXMuc3RyaW5nTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdGVuZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZUxpc3RlbmVyID0gdGhpcy5idWlsZERlbGVnYXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBzdHJpbmcgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFdyYXAgYSBwbGFpbiBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyKSB7Ci0JCXRoaXMoc3RyaW5nSG9sZGVyLCBuZXcgUGxhaW5Eb2N1bWVudCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdHJpbmdMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU3RyaW5nTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RyaW5nTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURvY3VtZW50QWRhcHRlci50aGlzLnN0cmluZ0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3RyaW5nIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYmluZWRMaXN0ZW5lciBidWlsZERlbGVnYXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSW50ZXJuYWxMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEb2N1bWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbHMgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50TGlzdGVuZXIoRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChEb2N1bWVudExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRlbGVnYXRlLmFkZERvY3VtZW50TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJCXRoaXMuZW5nYWdlU3RyaW5nSG9sZGVyKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKERvY3VtZW50TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWxzIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50TGlzdGVuZXIoRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUoRG9jdW1lbnRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChEb2N1bWVudExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVN0cmluZ0hvbGRlcigpOwotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBkZWxlZ2F0ZSBkb2N1bWVudCBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVW5kb2FibGVFZGl0TGlzdGVuZXIoVW5kb2FibGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyQ291bnQoVW5kb2FibGVFZGl0TGlzdGVuZXIuY2xhc3MpID09IDApIHsKLQkJCXRoaXMuZGVsZWdhdGUuYWRkVW5kb2FibGVFZGl0TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQoVW5kb2FibGVFZGl0TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGRlbGVnYXRlIGRvY3VtZW50IGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVVuZG9hYmxlRWRpdExpc3RlbmVyKFVuZG9hYmxlRWRpdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVVbmRvYWJsZUVkaXRMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFByb3BlcnR5KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0UHJvcGVydHkoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMuZGVsZWdhdGUucHV0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBzdHJpbmcgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IG9mZnNldCwgaW50IGxlbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmUob2Zmc2V0LCBsZW4pOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSh0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKSkpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nIGRpcmVjdGx5LgotCSAqIFRoZSByZXN1bHRpbmcgZXZlbnQgd2lsbCBiZSBpZ25vcmVkOiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKFN0cmluZykuCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0U3RyaW5nKGludCBvZmZzZXQsIFN0cmluZyBpbnNlcnRlZFN0cmluZywgQXR0cmlidXRlU2V0IGEpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRoaXMuZGVsZWdhdGUuaW5zZXJ0U3RyaW5nKG9mZnNldCwgaW5zZXJ0ZWRTdHJpbmcsIGEpOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSh0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRUZXh0KG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgsIFNlZ21lbnQgdHh0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aGlzLmRlbGVnYXRlLmdldFRleHQob2Zmc2V0LCBsZW5ndGgsIHR4dCk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGdldFN0YXJ0UG9zaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFN0YXJ0UG9zaXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgUG9zaXRpb24gZ2V0RW5kUG9zaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldEVuZFBvc2l0aW9uKCk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGNyZWF0ZVBvc2l0aW9uKGludCBvZmZzKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVQb3NpdGlvbihvZmZzKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudFtdIGdldFJvb3RFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0Um9vdEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0RGVmYXVsdFJvb3RFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXREZWZhdWx0Um9vdEVsZW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW5kZXIoUnVubmFibGUgcikgewotCQl0aGlzLmRlbGVnYXRlLnJlbmRlcihyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcltdIGRvY3VtZW50TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKERvY3VtZW50TGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBVbmRvYWJsZUVkaXRMaXN0ZW5lcltdIHVuZG9hYmxlRWRpdExpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycyhVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgdGhpcmQgcGFydHkgaGFzIG1vZGlmaWVkIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgZGVsZWdhdGUgZG9jdW1lbnQgYWNjb3JkaW5nbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RyaW5nQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSBkb2N1bWVudCdzIGVudGlyZSB0ZXh0IHN0cmluZyB3aXRoIHRoZSBuZXcgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nIHMpIHsKLQkJdHJ5IHsKLQkJCWludCBsZW4gPSB0aGlzLmRlbGVnYXRlLmdldExlbmd0aCgpOwotCQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGRlbGVnYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCQkvLyAodmlhICNpbnNlcnRTdHJpbmcoKSBvciAjcmVtb3ZlKCkpCi0JCQlpZiAoICEgdGhpcy5kZWxlZ2F0ZS5nZXRUZXh0KDAsIGxlbikuZXF1YWxzKHMpKSB7Ci0JCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmUoMCwgbGVuKTsKLQkJCQl0aGlzLmRlbGVnYXRlLmluc2VydFN0cmluZygwLCBzLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3RyaW5nSG9sZGVyKCkgewotCQl0aGlzLnN0cmluZ0hvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdHJpbmdMaXN0ZW5lcik7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSh0aGlzLnN0cmluZ0hvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdHJpbmdIb2xkZXIoKSB7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN0cmluZ0xpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZUNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJRG9jdW1lbnRFdmVudCBlZSA9IG5ldyBJbnRlcm5hbERvY3VtZW50RXZlbnQodGhpcywgZXZlbnQpOwotCQlEb2N1bWVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy5kb2N1bWVudExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0uY2hhbmdlZFVwZGF0ZShlZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZUluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5vIG5lZWQgdG8gbGF6eS1pbml0aWFsaXplIHRoZSBldmVudDsKLQkJLy8gd2Ugd291bGRuJ3QgZ2V0IGhlcmUgaWYgd2UgZGlkIG5vdCBoYXZlIGxpc3RlbmVycy4uLgotCQlEb2N1bWVudEV2ZW50IGVlID0gbmV3IEludGVybmFsRG9jdW1lbnRFdmVudCh0aGlzLCBldmVudCk7Ci0JCURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSB0aGlzLmRvY3VtZW50TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWxpc3RlbmVyc1tpXS5pbnNlcnRVcGRhdGUoZWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZWdhdGVSZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJRG9jdW1lbnRFdmVudCBlZSA9IG5ldyBJbnRlcm5hbERvY3VtZW50RXZlbnQodGhpcywgZXZlbnQpOwotCQlEb2N1bWVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy5kb2N1bWVudExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0ucmVtb3ZlVXBkYXRlKGVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGVnYXRlVW5kb2FibGVFZGl0SGFwcGVuZWQoVW5kb2FibGVFZGl0RXZlbnQgZXZlbnQpIHsKLQkJLy8gbm8gbmVlZCB0byBsYXp5LWluaXRpYWxpemUgdGhlIGV2ZW50OwotCQkvLyB3ZSB3b3VsZG4ndCBnZXQgaGVyZSBpZiB3ZSBkaWQgbm90IGhhdmUgbGlzdGVuZXJzLi4uCi0JCVVuZG9hYmxlRWRpdEV2ZW50IGVlID0gbmV3IFVuZG9hYmxlRWRpdEV2ZW50KHRoaXMsIGV2ZW50LmdldEVkaXQoKSk7Ci0JCVVuZG9hYmxlRWRpdExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy51bmRvYWJsZUVkaXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJbGlzdGVuZXJzW2ldLnVuZG9hYmxlRWRpdEhhcHBlbmVkKGVlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN0cmluZ0hvbGRlcik7Ci0JfQotCi0KLS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGludGVyZmFjZSBDb21iaW5lZExpc3RlbmVyIGV4dGVuZHMgRG9jdW1lbnRMaXN0ZW5lciwgVW5kb2FibGVFZGl0TGlzdGVuZXIgewotCQkvLyBqdXN0IGNvbnNvbGlkYXRlIHRoZSB0d28gaW50ZXJmYWNlcwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJbnRlcm5hbExpc3RlbmVyIGltcGxlbWVudHMgQ29tYmluZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRG9jdW1lbnRBZGFwdGVyLnRoaXMuZGVsZWdhdGVDaGFuZ2VkVXBkYXRlKGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRG9jdW1lbnRBZGFwdGVyLnRoaXMuZGVsZWdhdGVJbnNlcnRVcGRhdGUoZXZlbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlEb2N1bWVudEFkYXB0ZXIudGhpcy5kZWxlZ2F0ZVJlbW92ZVVwZGF0ZShldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdW5kb2FibGVFZGl0SGFwcGVuZWQoVW5kb2FibGVFZGl0RXZlbnQgZXZlbnQpIHsKLQkJCURvY3VtZW50QWRhcHRlci50aGlzLmRlbGVnYXRlVW5kb2FibGVFZGl0SGFwcGVuZWQoZXZlbnQpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSW50ZXJuYWxEb2N1bWVudEV2ZW50Ci0JCWV4dGVuZHMgRXZlbnRPYmplY3QKLQkJaW1wbGVtZW50cyBEb2N1bWVudEV2ZW50Ci0JewotCQlwcm90ZWN0ZWQgRG9jdW1lbnRFdmVudCBkZWxlZ2F0ZTsKLQkKLQkJcHJvdGVjdGVkIEludGVybmFsRG9jdW1lbnRFdmVudChEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRFdmVudCBkZWxlZ2F0ZSkgewotCQkJc3VwZXIoZG9jdW1lbnQpOwotCQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCQl9Ci0JCXB1YmxpYyBFbGVtZW50Q2hhbmdlIGdldENoYW5nZShFbGVtZW50IGVsZW0pIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldENoYW5nZShlbGVtKTsKLQkJfQotCQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCQlyZXR1cm4gKERvY3VtZW50KSB0aGlzLnNvdXJjZTsKLQkJfQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldExlbmd0aCgpOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0T2Zmc2V0KCk7Ci0JCX0KLQkJcHVibGljIEV2ZW50VHlwZSBnZXRUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0VHlwZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhZDc0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuTGlzdE1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBMaXN0RGF0YUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpMaXN0KSBpbiBzeW5jaCB3aXRoIGEgTGlzdFZhbHVlTW9kZWwgKG9yIGEgQ29sbGVjdGlvblZhbHVlTW9kZWwpLgotICogCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIExpc3RNb2RlbCAqbXVzdCogYmUgc3VwcGxpZWQgd2l0aCBhIHZhbHVlIG1vZGVsLAotICogd2hpY2ggaXMgYSBMaXN0VmFsdWVNb2RlbCBvbiB0aGUgYm91bmQgbGlzdCBvciBhIENvbGxlY3Rpb25WYWx1ZU1vZGVsCi0gKiBvbiB0aGUgYm91bmQgY29sbGVjdGlvbi4gVGhpcyBpcyByZXF1aXJlZCAtIHRoZSBsaXN0IChvciBjb2xsZWN0aW9uKQotICogaXRzZWxmIGNhbiBiZSBudWxsLCBidXQgdGhlIHZhbHVlIG1vZGVsIHRoYXQgaG9sZHMgaXQgY2Fubm90LgotICovCi1wdWJsaWMgY2xhc3MgTGlzdE1vZGVsQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3RMaXN0TW9kZWwKLXsKLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LiAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyOwotCi0JLyoqCi0JICogQ2FjaGUgdGhlIHNpemUgb2YgdGhlIGxpc3QgZm9yICJkcmFtYXRpYyIgY2hhbmdlcy4KLQkgKiBAc2VlICNsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGludCBsaXN0U2l6ZTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGZvcndhcmQgY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IgLSBpbml0aWFsaXplIHN0dWZmLgotCSAqLwotCXByaXZhdGUgTGlzdE1vZGVsQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0U2l6ZSA9IDA7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0TW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIpIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldE1vZGVsKGxpc3RIb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0TW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldE1vZGVsKGNvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0RGF0YUxpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCQl0aGlzLmxpc3RTaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0RGF0YUxpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3REYXRhTGlzdGVuZXIoTGlzdERhdGFMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vTGlzdERhdGFMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy5saXN0U2l6ZSA9IDA7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdFZhbHVlTW9kZWw8Pz4gbW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXI7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIpIHsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSB0aGlzLmhhc0xpc3REYXRhTGlzdGVuZXJzKCk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQlpZiAoaGFzTGlzdGVuZXJzKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiBtb2RlbC4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMuc2V0TW9kZWwobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3REYXRhTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIGFueSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdERhdGFMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTm9MaXN0RGF0YUxpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgc3RhcnQgPSBldmVudC5nZXRJbmRleCgpOwotCQlpbnQgZW5kID0gc3RhcnQgKyBldmVudC5pdGVtc1NpemUoKSAtIDE7Ci0JCXRoaXMuZmlyZUludGVydmFsQWRkZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JCXRoaXMubGlzdFNpemUgKz0gZXZlbnQuaXRlbXNTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHN0YXJ0ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJaW50IGVuZCA9IHN0YXJ0ICsgZXZlbnQuaXRlbXNTaXplKCkgLSAxOwotCQl0aGlzLmZpcmVJbnRlcnZhbFJlbW92ZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JCXRoaXMubGlzdFNpemUgLT0gZXZlbnQuaXRlbXNTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHN0YXJ0ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJaW50IGVuZCA9IHN0YXJ0ICsgZXZlbnQuaXRlbXNTaXplKCkgLSAxOwotCQl0aGlzLmZpcmVDb250ZW50c0NoYW5nZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHN0YXJ0ID0gTWF0aC5taW4oZXZlbnQuZ2V0U291cmNlSW5kZXgoKSwgZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSk7Ci0JCWludCBlbmQgPSBNYXRoLm1heChldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRUYXJnZXRJbmRleCgpKSArIGV2ZW50LmdldE1vdmVMZW5ndGgoKSAtIDE7Ci0JCXRoaXMuZmlyZUNvbnRlbnRzQ2hhbmdlZCh0aGlzLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IHdhcyBjbGVhcmVkLgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoKSB7Ci0JCWlmICh0aGlzLmxpc3RTaXplICE9IDApIHsKLQkJCXRoaXMuZmlyZUludGVydmFsUmVtb3ZlZCh0aGlzLCAwLCB0aGlzLmxpc3RTaXplIC0gMSk7Ci0JCQl0aGlzLmxpc3RTaXplID0gMDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QgaGFzIGNoYW5nZWQgImRyYW1hdGljYWxseSIuCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMubGlzdFNpemUgIT0gMCkgewotCQkJdGhpcy5maXJlSW50ZXJ2YWxSZW1vdmVkKHRoaXMsIDAsIHRoaXMubGlzdFNpemUgLSAxKTsKLQkJfQotCQl0aGlzLmxpc3RTaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJaWYgKHRoaXMubGlzdFNpemUgIT0gMCkgewotCQkJdGhpcy5maXJlSW50ZXJ2YWxBZGRlZCh0aGlzLCAwLCB0aGlzLmxpc3RTaXplIC0gMSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlZTdiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJMaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLlNwaW5uZXJMaXN0TW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIENoYW5nZUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpTcGlubmVyKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSB2YWx1ZQotICogaW4gdGhlIGxpc3QuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHN1Yi1jbGFzcyBvZiBTcGlubmVyTGlzdE1vZGVsIGJlY2F1c2Ugb2Ygc29tZQotICogY3JhcHB5IGpkayBjb2RlLi4uLiAgfmJqdgotICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lciNjcmVhdGVFZGl0b3IoamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsKQotICogCi0gKiBOQjogVGhpcyBtb2RlbCBzaG91bGQgb25seSBiZSB1c2VkIGZvciB2YWx1ZXMgdGhhdCBoYXZlIGEgcmVhc29uYWJseQotICogaW5leHBlbnNpdmUgI2VxdWFscygpIGltcGxlbWVudGF0aW9uLgotICogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KQotICogCi0gKiBJZiB0aGlzIGNsYXNzIG5lZWRzIHRvIGJlIG1vZGlmaWVkLCBpdCB3b3VsZCBiZWhvb3ZlIHVzIHRvIHJldmlldyB0aGUKLSAqIG90aGVyLCBzaW1pbGFyIGNsYXNzZXM6Ci0gKiBAc2VlIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiBAc2VlIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBTcGlubmVyTGlzdE1vZGVsCi17Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlOyB1c2VkIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgdmFsdWUgaXMgbnVsbC4KLQkgKiBUaGUgZGVmYXVsdCBpcyB0aGUgZmlyc3QgaXRlbSBvbiB0aGUgbGlzdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBkZWZhdWx0VmFsdWU7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyB2YWx1ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyB2YWx1ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdmFsdWVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFVzZSB0aGUgbW9kZWwgdmFsdWUgaXRzZWxmIGFzIHRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUuCi0JICovCi0JcHVibGljIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgdmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIG5ldyBPYmplY3RbXSB7ZGVmYXVsdFZhbHVlfSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IG9mIHZhbHVlcyBhcyB0aGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgdmFsdWVzLCB2YWx1ZXNbMF0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgT2JqZWN0W10gdmFsdWVzLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEFycmF5cy5hc0xpc3QodmFsdWVzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IG9mIHZhbHVlcyBhcyB0aGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBMaXN0PE9iamVjdD4gdmFsdWVzKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIHZhbHVlcywgdmFsdWVzLmdldCgwKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBMaXN0PE9iamVjdD4gdmFsdWVzLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKHZhbHVlcyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3luY2hyb25pemUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNwaW5uZXJNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gY2hlY2sgd2hldGhlciB0aGlzIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYmVmb3JlIHdlIAotCSAqIGhhdmUgYW55IGxpc3RlbmVycy4KLQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgY3JhcHB5IGpkayBjb2RlIGdldHMgdGhlIHZhbHVlCi0JICogZnJvbSB0aGUgbW9kZWwgKmJlZm9yZSogbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4gIH5ianYKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyLkRlZmF1bHRFZGl0b3IoamF2YXguc3dpbmcuSlNwaW5uZXIpCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCS8vIHNvcnJ5IGFib3V0IHRoaXMgImxhdGVyYWwiIGNhbGwgdG8gc3VwZXIgIH5ianYKLQkJCXN1cGVyLnNldFZhbHVlKHRoaXMuc3Bpbm5lclZhbHVlT2YodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyB2YWx1ZSBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemUodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdG8gYSBub24tbnVsbCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHNwaW5uZXJWYWx1ZU9mKE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0VmFsdWUoKSA6IHZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIHNwaW5uZXIgdmFsdWUgaWYgaXQgaGFzIGNoYW5nZWQuCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZShPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5zcGlubmVyVmFsdWVPZih2YWx1ZSk7Ci0JCS8vIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBzcGlubmVyIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCS8vICh2aWEgI3NldFZhbHVlKCkpCi0JCWlmICggISB0aGlzLmdldFZhbHVlKCkuZXF1YWxzKG5ld1ZhbHVlKSkgewotCQkJdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnZhbHVlSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTg4YWE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJOdW1iZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuU3Bpbm5lck51bWJlck1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBDaGFuZ2VMaXN0ZW5lcgotICogKGUuZy4gYSBKU3Bpbm5lcikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgbnVtYmVyLgotICogCi0gKiBUaGlzIGNsYXNzIG11c3QgYmUgYSBzdWItY2xhc3Mgb2YgU3Bpbm5lck51bWJlck1vZGVsIGJlY2F1c2Ugb2Ygc29tZQotICogY3JhcHB5IGpkayBjb2RlLi4uLiAgfmJqdgotICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lciNjcmVhdGVFZGl0b3IoamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsKQotICogCi0gKiBJZiB0aGlzIGNsYXNzIG5lZWRzIHRvIGJlIG1vZGlmaWVkLCBpdCB3b3VsZCBiZWhvb3ZlIHVzIHRvIHJldmlldyB0aGUKLSAqIG90aGVyLCBzaW1pbGFyIGNsYXNzZXM6Ci0gKiBAc2VlIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiBAc2VlIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBTcGlubmVyTnVtYmVyTW9kZWwKLXsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWU7IHVzZWQgd2hlbiB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsIG51bWJlciB2YWx1ZSBpcyBudWxsLgotCSAqLwotCXByaXZhdGUgZmluYWwgTnVtYmVyIGRlZmF1bHRWYWx1ZTsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG51bWJlci4gKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoCi0JICogY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG51bWJlci4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbnVtYmVyQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZSBpcyB6ZXJvLgotCSAqIFRoZSBzdGVwIHNpemUgaXMgb25lLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyKSB7Ci0JCXRoaXMobnVtYmVySG9sZGVyLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBzdGVwIHNpemUgaXMgb25lLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyLCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMobnVtYmVySG9sZGVyLCBudWxsLCBudWxsLCBuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoZGVmYXVsdFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBVc2UgdGhlIG1pbmltdW0gdmFsdWUgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgaW50IG1pbmltdW0sIGludCBtYXhpbXVtLCBpbnQgc3RlcFNpemUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIG1pbmltdW0sIG1heGltdW0sIHN0ZXBTaXplLCBtaW5pbXVtKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyLCBpbnQgbWluaW11bSwgaW50IG1heGltdW0sIGludCBzdGVwU2l6ZSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKG51bWJlckhvbGRlciwgbmV3IEludGVnZXIobWluaW11bSksIG5ldyBJbnRlZ2VyKG1heGltdW0pLCBuZXcgSW50ZWdlcihzdGVwU2l6ZSksIG5ldyBJbnRlZ2VyKGRlZmF1bHRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBtaW5pbXVtIHZhbHVlIGFzIHRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIGRvdWJsZSB2YWx1ZSwgZG91YmxlIG1pbmltdW0sIGRvdWJsZSBtYXhpbXVtLCBkb3VibGUgc3RlcFNpemUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIHZhbHVlLCBtaW5pbXVtLCBtYXhpbXVtLCBzdGVwU2l6ZSwgbWluaW11bSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgZG91YmxlIHZhbHVlLCBkb3VibGUgbWluaW11bSwgZG91YmxlIG1heGltdW0sIGRvdWJsZSBzdGVwU2l6ZSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKG51bWJlckhvbGRlciwgbmV3IERvdWJsZShtaW5pbXVtKSwgbmV3IERvdWJsZShtYXhpbXVtKSwgbmV3IERvdWJsZShzdGVwU2l6ZSksIG5ldyBEb3VibGUoZGVmYXVsdFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgQ29tcGFyYWJsZTw/PiBtaW5pbXVtLCBDb21wYXJhYmxlPD8+IG1heGltdW0sIE51bWJlciBzdGVwU2l6ZSwgTnVtYmVyIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcihudW1iZXJIb2xkZXIuZ2V0VmFsdWUoKSA9PSBudWxsID8gZGVmYXVsdFZhbHVlIDogKE51bWJlcikgbnVtYmVySG9sZGVyLmdldFZhbHVlKCksIG1pbmltdW0sIG1heGltdW0sIHN0ZXBTaXplKTsKLQkJdGhpcy5udW1iZXJIb2xkZXIgPSBudW1iZXJIb2xkZXI7Ci0JCXRoaXMubnVtYmVyQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG51bWJlcgotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZE51bWJlckNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE51bWJlckNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3luY2hyb25pemUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJudW1iZXIgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTcGlubmVyTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGJlZm9yZSB3ZSAKLQkgKiBoYXZlIGFueSBsaXN0ZW5lcnMuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIGNyYXBweSBqZGsgY29kZSBnZXRzIHRoZSB2YWx1ZQotCSAqIGZyb20gdGhlIG1vZGVsICpiZWZvcmUqIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuICB+Ymp2Ci0JICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lci5EZWZhdWx0RWRpdG9yKGphdmF4LnN3aW5nLkpTcGlubmVyKQotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBzb3JyeSBhYm91dCB0aGlzICJsYXRlcmFsIiBjYWxsIHRvIHN1cGVyICB+Ymp2Ci0JCQlzdXBlci5zZXRWYWx1ZSh0aGlzLnNwaW5uZXJWYWx1ZU9mKHRoaXMubnVtYmVySG9sZGVyLmdldFZhbHVlKCkpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG51bWJlciBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QpLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMubnVtYmVySG9sZGVyLnNldFZhbHVlKChOdW1iZXIpIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG51bWJlciBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMubnVtYmVySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm51bWJlckNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemUodGhpcy5udW1iZXJIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBudW1iZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5udW1iZXJIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubnVtYmVyQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE51bWJlciBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRvIGEgbm9uLW51bGwgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzcGlubmVyVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkgOiB2YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXZvaWQgc3luY2hyb25pemUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuc3Bpbm5lclZhbHVlT2YodmFsdWUpOwotCQkvLyBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgZGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5udW1iZXJIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQyZTM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBUaGlzIExpc3RTZWxlY3Rpb25Nb2RlbCBpcyBhd2FyZSBvZiB0aGUgTGlzdE1vZGVsIGFuZAotICogcHJvdmlkZXMgY29udmVuaWVuY2UgbWV0aG9kcyB0byBhY2Nlc3MgYW5kIHNldCB0aGUKLSAqIHNlbGVjdGVkICpvYmplY3RzKiwgYXMgb3Bwb3NlZCB0byB0aGUgc2VsZWN0ZWQgKmluZGV4ZXMqLgotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsCi0JZXh0ZW5kcyBEZWZhdWx0TGlzdFNlbGVjdGlvbk1vZGVsCi17Ci0JLyoqIFRoZSBsaXN0IG1vZGVsIHJlZmVyZW5jZWQgYnkgdGhlIGxpc3Qgc2VsZWN0aW9uIG1vZGVsLiAqLwotCXByaXZhdGUgZmluYWwgTGlzdE1vZGVsIGxpc3RNb2RlbDsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGNsZWFyIHRoZSBzZWxlY3Rpb24gd2hlbiB0aGUgbGlzdCBtb2RlbCBoYXMgY2hhbmdlZC4gKi8KLQlwcml2YXRlIGZpbmFsIExpc3REYXRhTGlzdGVuZXIgbGlzdERhdGFMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBzZWxlY3Rpb24gbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKExpc3RNb2RlbCBsaXN0TW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0TW9kZWwgPSBsaXN0TW9kZWw7Ci0JCXRoaXMubGlzdERhdGFMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0RGF0YUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgTGlzdERhdGFMaXN0ZW5lciBidWlsZExpc3REYXRhTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdERhdGFMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGludGVydmFsQWRkZWQoTGlzdERhdGFFdmVudCBldmVudCkgewotCQkJCS8vIHRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBzZWxlY3Rpb24KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGludGVydmFsUmVtb3ZlZChMaXN0RGF0YUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gdGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbGVjdGlvbgotCQkJfQotCQkJcHVibGljIHZvaWQgY29udGVudHNDaGFuZ2VkKExpc3REYXRhRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwudGhpcy5saXN0TW9kZWxDb250ZW50c0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBkYXRhIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBUeXBpY2FsbHksIHRoZSBzZWxlY3Rpb24gZG9lcyBub3QgbmVlZCB0byBiZSBjbGVhcmVkIHdoZW4gdGhlCi0JICogY29udGVudHMgb2YgdGhlIGxpc3QgaGF2ZSBjaGFuZ2VkLiBNb3N0IG9mIHRoZSB0aW1lIHRoaXMganVzdAotCSAqIG1lYW5zIGFuIGl0ZW0gaGFzIGNoYW5nZWQgaW4gYSB3YXkgdGhhdCBhZmZlY3RzIGl0cyBkaXNwbGF5IHN0cmluZwotCSAqIG9yIGljb24uIFdlIHR5cGljYWxseSBvbmx5IHVzZSB0aGUgY2xhc3MgZm9yIGVkaXRzIGludm9sdmluZwotCSAqIHNpbmdsZSBzZWxlY3Rpb24uCi0JICogQSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhlIHNlbGVjdGlvbgotCSAqIHNob3VsZCBiZSBjbGVhcmVkIGJlY2F1c2UgYSBjaGFuZ2UgY291bGQgbWVhbiB0aGUgc2VsZWN0aW9uIGlzIGludmFsaWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdE1vZGVsQ29udGVudHNDaGFuZ2VkKExpc3REYXRhRXZlbnQgZXZlbnQpIHsKLQkJLyoqdGhpcy5jbGVhclNlbGVjdGlvbigpOyovCi0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RTZWxlY3Rpb25Nb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0U2VsZWN0aW9uTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMubGlzdE1vZGVsLmFkZExpc3REYXRhTGlzdGVuZXIodGhpcy5saXN0RGF0YUxpc3RlbmVyKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIobCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdFNlbGVjdGlvbkxpc3RlbmVyKExpc3RTZWxlY3Rpb25MaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RTZWxlY3Rpb25MaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0U2VsZWN0aW9uTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMubGlzdE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIodGhpcy5saXN0RGF0YUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKSB7CS8vIHByaXZhdGUtcHJvdGVjdGVkCi0JCXJldHVybiB0aGlzLmdldExpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKS5sZW5ndGggPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgbW9kZWwgcmVmZXJlbmNlZCBieSB0aGUgbGlzdCBzZWxlY3Rpb24gbW9kZWwuCi0JICovCi0JcHVibGljIExpc3RNb2RlbCBnZXRMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgaW50IHNlbGVjdGVkVmFsdWVzU2l6ZSgpIHsKLQkJaW50IG1pbiA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaW50IG1heCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoKG1pbiA8IDApIHx8IChtYXggPCAwKSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpbnQgbiA9IDA7Ci0JCWludCBjb3VudCA9IHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0U2l6ZSgpOwotCQlmb3IgKGludCBpID0gbWluOyBpIDw9IG1heDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5pc1NlbGVjdGVkSW5kZXgoaSkgJiYgKGkgPCBjb3VudCkpIHsKLQkJCQluKys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBzZWxlY3RlZCB2YWx1ZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBPYmplY3Qgc2VsZWN0ZWRWYWx1ZSgpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5nZXRNaW5TZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmdldExpc3RNb2RlbCgpLmdldFNpemUoKSA8PSBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHNlbGVjdGVkIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gc2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCWludCBtaW4gPSB0aGlzLmdldE1pblNlbGVjdGlvbkluZGV4KCk7Ci0JCWludCBtYXggPSB0aGlzLmdldE1heFNlbGVjdGlvbkluZGV4KCk7Ci0KLQkJaWYgKChtaW4gPCAwKSB8fCAobWF4IDwgMCkpIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJaW50IG1heFNpemUgPSAobWF4IC0gbWluKSArIDE7Ci0JCU9iamVjdFtdIHRlbXAgPSBuZXcgT2JqZWN0W21heFNpemVdOwotCQlpbnQgbiA9IDA7Ci0JCWludCBjb3VudCA9IHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0U2l6ZSgpOwotCQlmb3IgKGludCBpID0gbWluOyBpIDw9IG1heDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5pc1NlbGVjdGVkSW5kZXgoaSkgJiYgKGkgPCBjb3VudCkpIHsKLQkJCQl0ZW1wW24rK10gPSB0aGlzLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpKTsKLQkJCX0KLQkJfQotCQlpZiAobiA9PSBtYXhTaXplKSB7Ci0JCQkvLyBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCQkvLyBvbmx5IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3Rbbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBuKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHNlbGVjdGVkIGluZGljZXMgaW4gb3JkZXIuCi0JICovCi0JcHVibGljIGludFtdIHNlbGVjdGVkSW5kaWNlcygpIHsKLQkJaW50IG1pbiA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaW50IG1heCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoKG1pbiA8IDApIHx8IChtYXggPCAwKSkgewotCQkJcmV0dXJuIG5ldyBpbnRbMF07Ci0JCX0KLQotCQlpbnQgbWF4U2l6ZSA9IChtYXggLSBtaW4pICsgMTsKLQkJaW50W10gdGVtcCA9IG5ldyBpbnRbbWF4U2l6ZV07Ci0JCWludCBuID0gMDsKLQkJaW50IGNvdW50ID0gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBtaW47IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmICh0aGlzLmlzU2VsZWN0ZWRJbmRleChpKSAmJiAoaSA8IGNvdW50KSkgewotCQkJCXRlbXBbbisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG4gPT0gbWF4U2l6ZSkgewotCQkJLy8gYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2Ugd2VyZSBzZWxlY3RlZAotCQkJQXJyYXlzLnNvcnQodGVtcCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCQkvLyBvbmx5IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBuKTsKLQkJQXJyYXlzLnNvcnQocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNlbGVjdGVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLnNldFNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMgdG8gdGhlIHNwZWNpZmllZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3NldFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWVzKEl0ZXJhdG9yPD8+IG9iamVjdHMpIHsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKHRydWUpOwotCQl0aGlzLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXNJbnRlcm5hbChvYmplY3RzKTsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMgdG8gdGhlIHNwZWNpZmllZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3NldFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb248Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFNlbGVjdGVkVmFsdWVzKG9iamVjdHMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNzZXRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFZhbHVlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKG9iamVjdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdHMgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZXMoSXRlcmF0b3I8Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcodHJ1ZSk7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXNJbnRlcm5hbChvYmplY3RzKTsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3RzIHRvIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2FkZFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb248Pz4gb2JqZWN0cykgewotCQl0aGlzLmFkZFNlbGVjdGVkVmFsdWVzKG9iamVjdHMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNhZGRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RlZFZhbHVlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKG9iamVjdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNyZW1vdmVTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZFZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5yZW1vdmVTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3Iob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3JlbW92ZVNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkVmFsdWVzKEl0ZXJhdG9yPD8+IG9iamVjdHMpIHsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKHRydWUpOwotCQlMaXN0TW9kZWwgbG0gPSB0aGlzLmdldExpc3RNb2RlbCgpOwotCQlpbnQgbG1TaXplID0gbG0uZ2V0U2l6ZSgpOwotCQl3aGlsZSAob2JqZWN0cy5oYXNOZXh0KCkpIHsKLQkJCWludCBpbmRleCA9IHRoaXMuaW5kZXhPZihvYmplY3RzLm5leHQoKSwgbG0sIGxtU2l6ZSk7Ci0JCQl0aGlzLnJlbW92ZVNlbGVjdGlvbkludGVydmFsKGluZGV4LCBpbmRleCk7Ci0JCX0KLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjcmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvbjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMucmVtb3ZlU2VsZWN0ZWRWYWx1ZXMob2JqZWN0cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjcmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoT2JqZWN0W10gb2JqZWN0cykgewotCQl0aGlzLnJlbW92ZVNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihvYmplY3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjZ2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgoKQotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbmNob3Igc2VsZWN0aW9uIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QW5jaG9yU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5nZXRBbmNob3JTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFuY2hvclNlbGVjdGVkVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLnNldEFuY2hvclNlbGVjdGlvbkluZGV4KHRoaXMuaW5kZXhPZihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRMZWFkU2VsZWN0aW9uSW5kZXgoKQotCSAqIFJldHVybiBudWxsIGlmIHRoZSBsZWFkIHNlbGVjdGlvbiBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExlYWRTZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldExlYWRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0TGVhZFNlbGVjdGlvbkluZGV4KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWFkU2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuc2V0TGVhZFNlbGVjdGlvbkluZGV4KHRoaXMuaW5kZXhPZihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRNYXhTZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIG1heCBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNYXhTZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldE1heFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRNaW5TZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIG1pbiBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNaW5TZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldE1pblNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNpc1NlbGVjdGVkSW5kZXgoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbHVlSXNTZWxlY3RlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0aGlzLmlzU2VsZWN0ZWRJbmRleCh0aGlzLmluZGV4T2Yob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cywKLQkgKiB3aXRob3V0IHdyYXBwaW5nIHRoZSBhY3Rpb25zIGluICJhZGp1c3RpbmciIGV2ZW50cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZXNJbnRlcm5hbChJdGVyYXRvcjw/PiBvYmplY3RzKSB7Ci0JCUxpc3RNb2RlbCBsbSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCk7Ci0JCWludCBsaXN0TW9kZWxTaXplID0gbG0uZ2V0U2l6ZSgpOwotCQl3aGlsZSAob2JqZWN0cy5oYXNOZXh0KCkpIHsKLQkJCWludCBpbmRleCA9IHRoaXMuaW5kZXhPZihvYmplY3RzLm5leHQoKSwgbG0sIGxpc3RNb2RlbFNpemUpOwotCQkJdGhpcy5hZGRTZWxlY3Rpb25JbnRlcnZhbChpbmRleCwgaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBpbiB0aGUgbGlzdCBtb2RlbCBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBSZXR1cm4gLTEgaWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGxpc3QgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBpbnQgaW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3RNb2RlbCBsbSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCk7Ci0JCXJldHVybiB0aGlzLmluZGV4T2Yob2JqZWN0LCBsbSwgbG0uZ2V0U2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBsaXN0IG1vZGVsIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFJldHVybiAtMSBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgbGlzdCBtb2RlbC4KLQkgKi8KLQkvLyB3ZSdyZSBqdXN0IGplcmtpbmcgYXJvdW5kIHdpdGggcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBoZXJlCi0JLy8gKGluIG1lbW9yeSBvZiBQaGlsLi4uKTsKLQkvLyBjYWxsIHRoaXMgbWV0aG9kIGluc2lkZSBsb29wcyB0aGF0IGRvIG5vdCBtb2RpZnkgdGhlIGxpc3RNb2RlbAotCXByaXZhdGUgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCwgTGlzdE1vZGVsIGxtLCBpbnQgbGlzdE1vZGVsU2l6ZSkgewotCQlmb3IgKGludCBpID0gbGlzdE1vZGVsU2l6ZTsgaS0tID4gMDsgKSB7Ci0JCQlpZiAobG0uZ2V0RWxlbWVudEF0KGkpID09IG9iamVjdCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWI0YjRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRNdXRhYmxlVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0VHJlZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuTXV0YWJsZVRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSB0cmVlIHdpdGggYSAibnVsbCIgcm9vdCB0aGF0Ci0gKiBoYXMgYSBzZXQgb2YgInByaW1pdGl2ZSIgY2hpbGRyZW4uIFRoZXNlICJwcmltaXRpdmUiIGNoaWxkcmVuIGRvIG5vdCBoYXZlCi0gKiBjaGlsZHJlbiB0aGVtc2VsdmVzLCBtYWtpbmcgdGhlIHRyZWUgYSBtYXhpbXVtIG9mIDIgbGV2ZWxzIGRlZXAuCi0gKiBUaGlzIG1vZGVsIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemVzIHRoZSByb290J3MgY2hpbGRyZW4gd2l0aCBhCi0gKiBMaXN0VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmUgKG5vbi1tb2RlbCkgb2JqZWN0cwotICogKGUuZy4gU3RyaW5ncykuCi0gKiAKLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBwcm92aWRpbmcgYW4gImVkaXRhYmxlIiBsaXN0IG9mIHByaW1pdGl2ZXMuIFNpbmNlIHRoZSBKREsKLSAqIGRvZXMgbm90IHByb3ZpZGUgdXMgd2l0aCBhbiBlZGl0YWJsZSBsaXN0Ym94LCB3ZSBtdXN0IHVzZSBhbiBlZGl0YWJsZSB0cmVlLgotICogV2Ugd3JhcCBldmVyeXRoaW5nIGluIERlZmF1bHRNdXRhYmxlVHJlZU5vZGVzLgotICogCi0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50ICNwcmltaXRpdmVDaGFuZ2VkKGludCwgT2JqZWN0KSBhbmQgdXBkYXRlCi0gKiB0aGUgbW9kZWwgYXBwcm9wcmlhdGVseS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgZWRpdHMgdGhlCi0gKiBsaXN0IGRpcmVjdGx5IGFuZCBwcmVzc2VzIDxFbnRlcj4uCi0gKiAKLSAqIFRoZSBKVHJlZSB1c2luZyB0aGlzIG1vZGVsIG11c3QgYmUgY29uZmlndXJlZCBhcyAiZWRpdGFibGUiOgotICogCXRyZWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gKi8KLS8vIFRPRE8gY29udmVydCB0byB1c2UgYW4gYWRhcHRlciBpbnN0ZWFkIG9mIHJlcXVpcmluZyBzdWJjbGFzcwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwKLQlleHRlbmRzIERlZmF1bHRUcmVlTW9kZWwKLXsKLQkvKiogYSBtb2RlbCBvbiB0aGUgbGlzdCBvZiBwcmltaXRpdmVzICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyOwotCi0JLyoqIGEgbGlzdGVuZXIgdGhhdCBoYW5kbGVzIHRoZSBhZGRpbmcsIHJlbW92aW5nLCBhbmQgcmVwbGFjaW5nIG9mIHRoZSBwcmltaXRpdmVzICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogUHVibGljIGNvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyIGlzIHJlcXVpcmVkCi0JICovCi0JcHVibGljIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcikgewotCQlzdXBlcihuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShudWxsLCB0cnVlKSk7ICAvLyB0cnVlID0gdGhlIHJvb3QgY2FuIGhhdmUgY2hpbGRyZW4KLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgbW9kZWwgdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzCi0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByaW1pdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byB1cGRhdGUgdGhlIAotCSAqIG1vZGVsIGFwcHJvcHJpYXRlbHkuIFRoZSBwcmltaXRpdmUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB3YXMKLQkgKiBlZGl0ZWQgZGlyZWN0bHkgYnkgdGhlIHVzZXIgYW5kIHRoZSBuZXcgdmFsdWUgaXMgYXMgc3BlY2lmaWVkLgotCSAqIENvbnZlcnQgdGhlIHZhbHVlIGFwcHJvcHJpYXRlbHkgYW5kIHBsYWNlIGl0IGluIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmltaXRpdmVDaGFuZ2VkKGludCBpbmRleCwgT2JqZWN0IG5ld1ZhbHVlKTsKLQotCi0JLy8gKioqKioqKioqKiBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGluc3RlYWQgb2YgY2hhbmdpbmcgdGhlIG5vZGUgZGlyZWN0bHkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsdWVGb3JQYXRoQ2hhbmdlZChUcmVlUGF0aCBwYXRoLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJVHJlZU5vZGUgbm9kZSA9IChUcmVlTm9kZSkgcGF0aC5nZXRMYXN0UGF0aENvbXBvbmVudCgpOwotCQlpbnQgaW5kZXggPSAoKFRyZWVOb2RlKSB0aGlzLmdldFJvb3QoKSkuZ2V0SW5kZXgobm9kZSk7Ci0JCXRoaXMucHJpbWl0aXZlQ2hhbmdlZChpbmRleCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuZ2V0VHJlZU1vZGVsTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemVMaXN0KCk7Ci0JCX0KLQkJc3VwZXIuYWRkVHJlZU1vZGVsTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlVHJlZU1vZGVsTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmdldFRyZWVNb2RlbExpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3luY2hyb25pemUgb3VyIGxpc3Qgb2Ygbm9kZXMgd2l0aCB0aGUgbGlzdCBvZiBwcmltaXRpdmVzCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZUxpc3QoKSB7Ci0JCXRoaXMuY2xlYXJMaXN0KCk7Ci0JCXRoaXMuYnVpbGRMaXN0KCk7Ci0JfQotCi0Jdm9pZCBjbGVhckxpc3QoKSB7Ci0JCWludCBjaGlsZGNvdW50ID0gdGhpcy5yb290LmdldENoaWxkQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IGNoaWxkY291bnQgLSAxOyBpID49IDA7IGktLSkgewotCQkJdGhpcy5yZW1vdmVOb2RlRnJvbVBhcmVudCgoTXV0YWJsZVRyZWVOb2RlKXRoaXMucm9vdC5nZXRDaGlsZEF0KGkpKTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTGlzdCgpIHsKLQkJZm9yIChJdGVyYXRvcjw/PiBzdHJlYW0gPSB0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmFkZFByaW1pdGl2ZShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQcmltaXRpdmUoT2JqZWN0IHByaW1pdGl2ZSkgewotCQl0aGlzLmluc2VydFByaW1pdGl2ZSh0aGlzLnJvb3QuZ2V0Q2hpbGRDb3VudCgpLCBwcmltaXRpdmUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlCi0JICogYW5kIGluc2VydCBpdCBhcyBhIGNoaWxkIG9mIHRoZSByb290LgotCSAqLwotCXZvaWQgaW5zZXJ0UHJpbWl0aXZlKGludCBpbmRleCwgT2JqZWN0IHByaW1pdGl2ZSkgewotCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShwcmltaXRpdmUsIGZhbHNlKTsgLy8gZG9uJ3QgYWxsb3cgY2hpbGRyZW4gb24gdGhlIGNoaWxkIG5vZGUKLQkJdGhpcy5pbnNlcnROb2RlSW50byhub2RlLCAoTXV0YWJsZVRyZWVOb2RlKSB0aGlzLnJvb3QsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgbm9kZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCU11dGFibGVUcmVlTm9kZSByZW1vdmVOb2RlKGludCBpbmRleCkgewotCQlNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChNdXRhYmxlVHJlZU5vZGUpIHRoaXMucm9vdC5nZXRDaGlsZEF0KGluZGV4KTsKLQkJdGhpcy5yZW1vdmVOb2RlRnJvbVBhcmVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSB0aGUgdXNlciBvYmplY3Qgb2YgdGhlIG5vZGUgYXQgY2hpbGRJbmRleC4KLQkgKi8KLQl2b2lkIHJlcGxhY2VQcmltaXRpdmUoaW50IGluZGV4LCBPYmplY3QgcHJpbWl0aXZlKSB7Ci0JCU11dGFibGVUcmVlTm9kZSBub2RlID0gKE11dGFibGVUcmVlTm9kZSkgdGhpcy5yb290LmdldENoaWxkQXQoaW5kZXgpOwotCQlub2RlLnNldFVzZXJPYmplY3QocHJpbWl0aXZlKTsKLQkJdGhpcy5ub2RlQ2hhbmdlZChub2RlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBQcmltaXRpdmVMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlQcmltaXRpdmVMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJCWZvciAoTGlzdEl0ZXJhdG9yPD8+IHN0cmVhbSA9IGV2ZW50Lml0ZW1zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5pbnNlcnRQcmltaXRpdmUoaSsrLCBzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnQuaXRlbXNTaXplKCk7IGkrKykgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5yZW1vdmVOb2RlKGV2ZW50LmdldEluZGV4KCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJCWZvciAoTGlzdEl0ZXJhdG9yPD8+IHN0cmVhbSA9IGV2ZW50Lml0ZW1zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5yZXBsYWNlUHJpbWl0aXZlKGkrKywgc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJQXJyYXlMaXN0PE11dGFibGVUcmVlTm9kZT4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8TXV0YWJsZVRyZWVOb2RlPihldmVudC5nZXRNb3ZlTGVuZ3RoKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudC5nZXRNb3ZlTGVuZ3RoKCk7IGkrKykgewotCQkJCXRlbXAuYWRkKFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5yZW1vdmVOb2RlKGV2ZW50LmdldFNvdXJjZUluZGV4KCkpKTsKLQkJCX0KLQkJCWludCBpID0gZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJCWZvciAoTXV0YWJsZVRyZWVOb2RlIG5vZGUgOiB0ZW1wKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLmluc2VydFByaW1pdGl2ZShpKyssIG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMuY2xlYXJMaXN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5zeW5jaHJvbml6ZUxpc3QoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2FlZTQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaWRpRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQnV0dG9uTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3RlbmVyCi0gKiAoZS5nLiBhIEpSYWRpb0J1dHRvbikgaW4gc3luY2ggd2l0aCBhICh0eXBpY2FsbHkgc2hhcmVkKQotICogUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgb25lIHZhbHVlIG91dCBvZiBhIHNldCBvZiB2YWx1ZXMuCi0gKiAKLSAqIE5PVEU6IERvICpub3QqIHVzZSB0aGlzIG1vZGVsIHdpdGggYSBCdXR0b25Hcm91cCwgc2luY2UgdGhlCi0gKiBzaGFyZWQgdmFsdWUgaG9sZGVyIGFuZCB0aGUgd3JhcHBlcnMgYnVpbHQgYnkgdGhpcyBhZGFwdGVyIHdpbGwKLSAqIGtlZXAgdGhlIGFwcHJvcHJpYXRlIHJhZGlvIGJ1dHRvbiBjaGVja2VkLiBBbHNvLCB0aGlzIGFsbG93cwotICogdXMgdG8gdW5jaGVjayBhbGwgdGhlIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCB3aGVuIHRoZSBzaGFyZWQKLSAqIHZhbHVlIGlzIG51bGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcgotCWV4dGVuZHMgVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBidXR0b25WYWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoYnVpbGRCb29sZWFuSG9sZGVyKHZhbHVlSG9sZGVyLCBidXR0b25WYWx1ZSksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBidXR0b25WYWx1ZSkgewotCQlzdXBlcihidWlsZEJvb2xlYW5Ib2xkZXIodmFsdWVIb2xkZXIsIGJ1dHRvblZhbHVlKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIHVwIGEgc2V0IG9mIHdyYXBwZXJzIHRoYXQgd2lsbCBjb252ZXJ0IHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSBob2xkZXIgYW5kIGJ1dHRvbiB2YWx1ZSB0by9mcm9tIGEgYm9vbGVhbi4KLQkgKiAKLQkgKiBJZiB0aGUgdmFsdWUgaG9sZGVyJ3MgdmFsdWUgbWF0Y2hlcyB0aGUgYnV0dG9uIHZhbHVlLAotCSAqIHRoZSB3cmFwcGVyIHdpbGwgcmV0dXJuIHRydWUuIExpa2V3aXNlLCBpZiB0aGUgdmFsdWUgaG9sZGVyJ3MKLQkgKiB2YWx1ZSBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHdyYXBwZXIgd2lsbCBzZXQgdGhlIHZhbHVlIGhvbGRlcidzCi0JICogdmFsdWUgdG8gdGhlIGJ1dHRvbiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBmaWx0ZXJpbmdQVk0gPSBuZXcgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0Pih2YWx1ZUhvbGRlciwgbmV3IFJhZGlvQnV0dG9uRmlsdGVyKGJ1dHRvblZhbHVlKSk7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3QsIEJvb2xlYW4+KGZpbHRlcmluZ1BWTSwgbmV3IFJhZGlvQnV0dG9uVHJhbnNmb3JtZXIoYnV0dG9uVmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSB1c2VyIGNhbm5vdCBkZS1zZWxlY3QgYSByYWRpbyBidXR0b24gLSB0aGUgdXNlcgotCSAqIGNhbiBvbmx5ICpzZWxlY3QqIGEgcmFkaW8gYnV0dG9uLiBPbmx5IHRoZSBtb2RlbCBjYW4KLQkgKiBjYXVzZSBhIHJhZGlvIGJ1dHRvbiB0byBiZSBkZS1zZWxlY3RlZC4gV2UgdXNlIHRoZQotCSAqIEFSTUVEIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBhcmUgYmVpbmcgZGUtc2VsZWN0ZWQKLQkgKiBieSB0aGUgdXNlci4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIGIpIHsKLQkJLy8gZG8gbm90IGFsbG93IHRoZSB1c2VyIHRvIGRlLXNlbGVjdCBhIHJhZGlvIGJ1dHRvbgotCQkvLyByYWRpbyBidXR0b25zIGNhbgotCQlpZiAoKGIgPT0gZmFsc2UpICYmIHRoaXMuaXNBcm1lZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuc2V0U2VsZWN0ZWQoYik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBmaWx0ZXIgd2lsbCBvbmx5IHBhc3MgdGhyb3VnaCBhIG5ldyB2YWx1ZSB0byB0aGUgd3JhcHBlZAotCSAqIHZhbHVlIGhvbGRlciB3aGVuIGl0IG1hdGNoZXMgdGhlIGNvbmZpZ3VyZWQgYnV0dG9uIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmFkaW9CdXR0b25GaWx0ZXIgaW1wbGVtZW50cyBCaWRpRmlsdGVyPE9iamVjdD4gewotCQlwcml2YXRlIE9iamVjdCBidXR0b25WYWx1ZTsKLQotCQlwdWJsaWMgUmFkaW9CdXR0b25GaWx0ZXIoT2JqZWN0IGJ1dHRvblZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5idXR0b25WYWx1ZSA9IGJ1dHRvblZhbHVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGFsd2F5cyByZXR1cm4gdGhlIHdyYXBwZWQgdmFsdWUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3QgdmFsdWUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHBhc3MgdGhyb3VnaCB0aGUgdmFsdWUgdG8gdGhlIHdyYXBwZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwKLQkJICogKm9ubHkqIHdoZW4gaXQgbWF0Y2hlcyBvdXIgYnV0dG9uIHZhbHVlCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuIHZhbHVlID09IHRoaXMuYnV0dG9uVmFsdWU7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgdHJhbnNmb3JtZXIgd2lsbCBjb252ZXJ0IHRoZSB3cmFwcGVkIHZhbHVlIHRvIEJvb2xlYW4uVFJVRQotCSAqIHdoZW4gaXQgbWF0Y2hlcyB0aGUgY29uZmlndXJlZCBidXR0b24gdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSYWRpb0J1dHRvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPE9iamVjdCwgQm9vbGVhbj4gewotCQlwcml2YXRlIE9iamVjdCBidXR0b25WYWx1ZTsKLQotCQlwdWJsaWMgUmFkaW9CdXR0b25UcmFuc2Zvcm1lcihPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1dHRvblZhbHVlID0gYnV0dG9uVmFsdWU7Ci0JCX0KLQotCQkvKioKLQkJICogaWYgdGhlIHdyYXBwZWQgdmFsdWUgbWF0Y2hlcyBvdXIgYnV0dG9uIHZhbHVlIHJldHVybiB0cnVlLAotCQkgKiBpZiBpdCBpcyBzb21lIG90aGVyIHZhbHVlIHJldHVybiBmYWxzZTsKLQkJICogYnV0IGlmIGl0IGlzIG51bGwgc2ltcGx5IHBhc3MgaXQgdGhyb3VnaCBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgdGhlCi0JCSAqIGJ1dHRvbiBtb2RlbCdzIGRlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZAotCQkgKi8KLQkJcHVibGljIEJvb2xlYW4gdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuLnZhbHVlT2YodmFsdWUgPT0gdGhpcy5idXR0b25WYWx1ZSk7Ci0JCX0KLQotCQkvKioKLQkJICogaWYgdGhlIG5ldyB2YWx1ZSBpcyB0cnVlLCBwYXNzIHRocm91Z2ggdGhlIG91ciBidXR0b24gdmFsdWU7Ci0JCSAqIG90aGVyd2lzZSBwYXNzIHRocm91Z2ggbnVsbAotCQkgKi8KLQkJcHVibGljIE9iamVjdCByZXZlcnNlVHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCXJldHVybiAodmFsdWUuYm9vbGVhblZhbHVlKCkpID8gdGhpcy5idXR0b25WYWx1ZSA6IG51bGw7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZDg5M2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RTcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJOdW1iZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBDaGFuZ2VMaXN0ZW5lcgotICogKGUuZy4gYSBKU3Bpbm5lcikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgdmFsdWUuCi0gKiAKLSAqIE5vdGU6IGl0IGlzIGxpa2VseSB5b3Ugd2FudCB0byB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBpbnN0ZWFkIG9mCi0gKiB0aGlzIG9uZToKLSAqICAgICBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcgotICogICAgIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqICAgICBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcgotICogCi0gKiBOQjogVGhpcyBtb2RlbCBzaG91bGQgb25seSBiZSB1c2VkIGZvciB2YWx1ZXMgdGhhdCBoYXZlIGEgZmFpcmx5Ci0gKiBpbmV4cGVuc2l2ZSAjZXF1YWxzKCkgaW1wbGVtZW50YXRpb24uCi0gKiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKE9iamVjdCkKLSAqLwotcHVibGljIGNsYXNzIFNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0U3Bpbm5lck1vZGVsCi17Ci0JLyoqIFRoZSBkZWxlZ2F0ZSBzcGlubmVyIG1vZGVsIHdob3NlIGJlaGF2aW9yIHdlICJlbmhhbmNlIi4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lck1vZGVsIGRlbGVnYXRlOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gZm9yd2FyZCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBkZWxlZ2F0ZSBzcGlubmVyIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDaGFuZ2VMaXN0ZW5lciBkZWxlZ2F0ZUxpc3RlbmVyOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWx1ZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgYW5kIGRlbGVnYXRlIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBTcGlubmVyTW9kZWwgZGVsZWdhdGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwgfHwgZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZQotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy52YWx1ZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlTGlzdGVuZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZUxpc3RlbmVyID0gdGhpcy5idWlsZERlbGVnYXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhpcyB3aWxsIHdyYXAgYSBzaW1wbGUgbnVtYmVyIHNwaW5uZXIgbW9kZWwuCi0JICovCi0JcHVibGljIFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcikgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBuZXcgU3Bpbm5lck51bWJlck1vZGVsKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFZhbHVlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnZhbHVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogZXhwYW5kIGFjY2VzcyBhIGJpdCBmb3IgaW5uZXIgY2xhc3MKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKCkgewotCQlzdXBlci5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENoYW5nZUxpc3RlbmVyIGJ1aWxkRGVsZWdhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCS8vIGZvcndhcmQgdGhlIGV2ZW50LCB3aXRoIHRoaXMgYXMgdGhlIHNvdXJjZQotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkZWxlZ2F0ZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNwaW5uZXJNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgdmFsdWUgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoT2JqZWN0KS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJdGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TmV4dFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXROZXh0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByZXZpb3VzVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFByZXZpb3VzVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChDaGFuZ2VMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kZWxlZ2F0ZS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQkJdGhpcy5lbmdhZ2VWYWx1ZUhvbGRlcigpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChDaGFuZ2VMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZUhvbGRlcigpOwotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgdGhpcmQgcGFydHkgaGFzIG1vZGlmaWVkIHRoZSB1bmRlcmx5aW5nIHZhbHVlLgotCSAqIFN5bmNocm9uaXplIHRoZSBkZWxlZ2F0ZSBtb2RlbCBhY2NvcmRpbmdseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplRGVsZWdhdGUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkZWxlZ2F0ZSdzIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplRGVsZWdhdGUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBkZWxlZ2F0ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5kZWxlZ2F0ZS5nZXRWYWx1ZSgpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCXRoaXMuZGVsZWdhdGUuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVIb2xkZXIoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVMaXN0ZW5lcik7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlSG9sZGVyKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudmFsdWVIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5NjExOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UYWJsZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgVGFibGVNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgVGFibGVNb2RlbExpc3RlbmVyIChlLmcuIGEgSlRhYmxlKQotICogaW4gc3luY2ggd2l0aCBhIExpc3RWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIG1vZGVsIG9iamVjdHMsCi0gKiBlYWNoIG9mIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgcm93IGluIHRoZSB0YWJsZS4KLSAqIFR5cGljYWxseSwgZWFjaCBjb2x1bW4gb2YgdGhlIHRhYmxlIHdpbGwgYmUgYm91bmQgdG8gYSBkaWZmZXJlbnQgYXNwZWN0Ci0gKiBvZiB0aGUgY29udGFpbmVkIG1vZGVsIG9iamVjdHMuCi0gKiAKLSAqIEZvciBleGFtcGxlLCBhIE1XVGFibGUgaGFzIGFuIGF0dHJpYnV0ZSAnZGF0YWJhc2VGaWVsZHMnIHRoYXQgaG9sZHMKLSAqIGEgY29sbGVjdGlvbiBvZiBNV0RhdGFiYXNlRmllbGRzIHRoYXQgd291bGQgY29ycmVzcG9uZCB0byB0aGUgcm93cyBvZgotICogYSBKVGFibGU7IGFuZCBlYWNoIE1XRGF0YWJhc2VGaWVsZCBoYXMgYSBudW1iZXIKLSAqIG9mIGF0dHJpYnV0ZXMgKGUuZy4gbmFtZSwgdHlwZSwgc2l6ZSkgdGhhdCBjYW4gYmUgYm91bmQgdG8gdGhlIGNvbHVtbnMgb2YKLSAqIGEgcm93IGluIHRoZSBKVGFibGUuIEFzIHRoZXNlIGRhdGFiYXNlIGZpZWxkcyBhcmUgYWRkZWQsIHJlbW92ZWQsIGFuZAotICogY2hhbmdlZCwgdGhpcyBtb2RlbCB3aWxsIGtlZXAgdGhlIGxpc3RlbmVycyBhd2FyZSBvZiB0aGUgY2hhbmdlcy4KLSAqIAotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBUYWJsZU1vZGVsIG11c3QgYmUgc3VwcGxpZWQgd2l0aCBhCi0gKiBsaXN0IGhvbGRlciAoZS5nLiB0aGUgJ2RhdGFiYXNlRmllbGRzJyksIHdoaWNoIGlzIGEgdmFsdWUKLSAqIG1vZGVsIG9uIHRoZSBib3VuZCBjb2xsZWN0aW9uIFRoaXMgaXMgcmVxdWlyZWQgLSB0aGUKLSAqIGNvbGxlY3Rpb24gaXRzZWxmIGNhbiBiZSBudWxsLCBidXQgdGhlIGxpc3QgdmFsdWUgbW9kZWwgdGhhdAotICogaG9sZHMgaXQgaXMgcmVxdWlyZWQuIFR5cGljYWxseSB0aGlzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgKEBzZWUKLSAqIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcikuCi0gKiAKLSAqIFRoaXMgVGFibGVNb2RlbCBtdXN0IGFsc28gYmUgc3VwcGxpZWQgd2l0aCBhIENvbHVtbkFkYXB0ZXIgdGhhdAotICogd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgaGVhZGVycywgcmVuZGVyZXJzLCBlZGl0b3JzLCBhbmQgY29udGVudHMKLSAqIG9mIHRoZSB2YXJpb3VzIGNvbHVtbnMuCi0gKiAKLSAqIERlc2lnbiBkZWNpc2lvbjoKLSAqIENlbGwgbGlzdGVuZXIgb3B0aW9ucyAoZnJvbSBsb3cgc3BhY2UvaGlnaCB0aW1lIHRvIGhpZ2ggc3BhY2UvbG93IHRpbWUpOgotICogCS0gMSBjZWxsIGxpc3RlbmVyIGxpc3RlbmluZyB0byBldmVyeSBjZWxsICh0aGlzIGlzIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uKQotICogCS0gMSBjZWxsIGxpc3RlbmVyIHBlciByb3cKLSAqIAktIDEgY2VsbCBsaXN0ZW5lciBwZXIgY2VsbAotICovCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0VGFibGVNb2RlbAotewotCS8qKgotCSAqIGEgbGlzdCBvZiB1c2VyIG9iamVjdHMgdGhhdCBhcmUgY29udmVydGVkIHRvCi0JICogcm93cyB2aWEgdGhlIGNvbHVtbiBhZGFwdGVyCi0JICovCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBlYWNoIHJvdyBpcyBhbiBhcnJheSBvZiBjZWxsIG1vZGVscwotCSAqLwotCS8vIGRlY2xhcmUgYXMgQXJyYXlMaXN0IHNvIHdlIGNhbiB1c2UgI2Vuc3VyZUNhcGFjaXR5KGludCkKLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+IHJvd3M7Ci0KLQkvKioKLQkgKiBjbGllbnQtc3VwcGxpZWQgYWRhcHRlciB0aGF0IHByb3ZpZGVzIHdpdGggdGhlIHZhcmlvdXMgY29sdW1uCi0JICogc2V0dGluZ3MgYW5kIGNvbnZlcnRzIHRoZSBvYmplY3RzIGluIHRoZSBMVk0KLQkgKiBpbnRvIGFuIGFycmF5IG9mIGNlbGwgbW9kZWxzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb2x1bW5BZGFwdGVyIGNvbHVtbkFkYXB0ZXI7Ci0KLQkvKioKLQkgKiB0aGUgc2luZ2xlIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBldmVyeSBjZWxsJ3MgbW9kZWwKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY2VsbExpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0YWJsZSBtb2RlbCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdHMKLQkgKiBhbmQgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgVGFibGVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIsIENvbHVtbkFkYXB0ZXIgY29sdW1uQWRhcHRlcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQl0aGlzLmNvbHVtbkFkYXB0ZXIgPSBjb2x1bW5BZGFwdGVyOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5yb3dzID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+KCk7Ci0JCXRoaXMuY2VsbExpc3RlbmVyID0gdGhpcy5idWlsZENlbGxMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRhYmxlIG1vZGVsIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0cwotCSAqIGFuZCBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBUYWJsZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlciwgQ29sdW1uQWRhcHRlciBjb2x1bW5BZGFwdGVyKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4oY29sbGVjdGlvbkhvbGRlciksIGNvbHVtbkFkYXB0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmFkZFJvd3MoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuaXRlbXNTaXplKCksIHRoaXMuaXRlbXMoZXZlbnQpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZVJvd3MoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuaXRlbXNTaXplKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnJlcGxhY2VSb3dzKGV2ZW50LmdldEluZGV4KCksIHRoaXMuaXRlbXMoZXZlbnQpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5tb3ZlUm93cyhldmVudC5nZXRUYXJnZXRJbmRleCgpLCBldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRNb3ZlTGVuZ3RoKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5jbGVhclRhYmxlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnJlYnVpbGRUYWJsZSgpOwotCQkJfQotCQkJLyoqCi0JCQkgKiBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JCQkgKi8KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPE9iamVjdD4gaXRlbXMoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJcmV0dXJuIChJdGVyYXRvcjxPYmplY3Q+KSBldmVudC5pdGVtcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENlbGxMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQ2VsbExpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENlbGxMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmNlbGxDaGFuZ2VkKChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjZWxsIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMucm93cy5zaXplKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5OYW1lKGNvbHVtbik7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIENsYXNzPD8+IGdldENvbHVtbkNsYXNzKGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNsYXNzKGNvbHVtbkluZGV4KTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0YWJsZShpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbklzRWRpdGFibGUoY29sdW1uSW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5yb3dzLmdldChyb3dJbmRleCk7Ci0JCXJldHVybiByb3dbY29sdW1uSW5kZXhdLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsdWVBdChPYmplY3QgdmFsdWUsIGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLnJvd3MuZ2V0KHJvd0luZGV4KTsKLQkJcm93W2NvbHVtbkluZGV4XS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVGFibGVNb2RlbExpc3RlbmVyKFRhYmxlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vVGFibGVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFibGVNb2RlbExpc3RlbmVyKFRhYmxlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZVRhYmxlTW9kZWxMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9UYWJsZU1vZGVsTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9IHRoaXMuaGFzVGFibGVNb2RlbExpc3RlbmVycygpOwotCQlpZiAoaGFzTGlzdGVuZXJzKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy5maXJlVGFibGVEYXRhQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzLnNldE1vZGVsKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1vZGVsIGhhcyBubyBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9UYWJsZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChUYWJsZU1vZGVsTGlzdGVuZXIuY2xhc3MpID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgYW55IGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNUYWJsZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc05vVGFibGVNb2RlbExpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3Qgb2Ygb2JqZWN0cyBhbmQgdGhlIHZhcmlvdXMgYXNwZWN0cwotCSAqIG9mIHRoZSBvYmplY3RzIHRoYXQgbWFrZSB1cCB0aGUgcm93cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5lbmdhZ2VBbGxDZWxscygpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIG9iamVjdHMgaW50byByb3dzIGFuZCBsaXN0ZW4gdG8gdGhlIGNlbGxzLgotCSAqLwotCXByaXZhdGUgdm9pZCBlbmdhZ2VBbGxDZWxscygpIHsKLQkJdGhpcy5yb3dzLmVuc3VyZUNhcGFjaXR5KHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBzdHJlYW0gPSB0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNlbGxNb2RlbHMoc3RyZWFtLm5leHQoKSk7Ci0JCQl0aGlzLmVuZ2FnZVJvdyhyb3cpOwotCQkJdGhpcy5yb3dzLmFkZChyb3cpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSBjZWxscyBpbiB0aGUgc3BlY2lmaWVkIHJvdy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlUm93KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cpIHsKLQkJZm9yIChpbnQgaSA9IHJvdy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJcm93W2ldLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNlbGxMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlQWxsQ2VsbHMoKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VBbGxDZWxscygpIHsKLQkJZm9yIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93IDogdGhpcy5yb3dzKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVJvdyhyb3cpOwotCQl9Ci0JCXRoaXMucm93cy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VSb3coV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdykgewotCQlmb3IgKGludCBpID0gcm93Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlyb3dbaV0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2VsbExpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGJydXRlLWZvcmNlIHNlYXJjaCBmb3IgdGhlIGNlbGwocykgdGhhdCBjaGFuZ2VkLi4uCi0JICovCi0Jdm9pZCBjZWxsQ2hhbmdlZChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNlbGxIb2xkZXIpIHsKLQkJZm9yIChpbnQgaSA9IHRoaXMucm93cy5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdyA9IHRoaXMucm93cy5nZXQoaSk7Ci0JCQlmb3IgKGludCBqID0gcm93Lmxlbmd0aDsgai0tID4gMDsgKSB7Ci0JCQkJaWYgKHJvd1tqXSA9PSBjZWxsSG9sZGVyKSB7Ci0JCQkJCXRoaXMuZmlyZVRhYmxlQ2VsbFVwZGF0ZWQoaSwgaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY29udmVydCB0aGUgaXRlbXMgdG8gcm93cwotCSAqLwotCXZvaWQgYWRkUm93cyhpbnQgaW5kZXgsIGludCBzaXplLCBJdGVyYXRvcjxPYmplY3Q+IGl0ZW1zKSB7Ci0JCUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiBuZXdSb3dzID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+KHNpemUpOwotCQl3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNlbGxNb2RlbHMoaXRlbXMubmV4dCgpKTsKLQkJCXRoaXMuZW5nYWdlUm93KHJvdyk7Ci0JCQluZXdSb3dzLmFkZChyb3cpOwotCQl9Ci0JCXRoaXMucm93cy5hZGRBbGwoaW5kZXgsIG5ld1Jvd3MpOwotCQl0aGlzLmZpcmVUYWJsZVJvd3NJbnNlcnRlZChpbmRleCwgaW5kZXggKyBzaXplIC0gMSk7Ci0JfQotCi0Jdm9pZCByZW1vdmVSb3dzKGludCBpbmRleCwgaW50IHNpemUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRoaXMuZGlzZW5nYWdlUm93KHRoaXMucm93cy5yZW1vdmUoaW5kZXgpKTsKLQkJfQotCQl0aGlzLmZpcmVUYWJsZVJvd3NEZWxldGVkKGluZGV4LCBpbmRleCArIHNpemUgLSAxKTsKLQl9Ci0KLQl2b2lkIHJlcGxhY2VSb3dzKGludCBpbmRleCwgSXRlcmF0b3I8T2JqZWN0PiBpdGVtcykgewotCQlpbnQgaSA9IGluZGV4OwotCQl3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5yb3dzLmdldChpKTsKLQkJCXRoaXMuZGlzZW5nYWdlUm93KHJvdyk7Ci0JCQlyb3cgPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY2VsbE1vZGVscyhpdGVtcy5uZXh0KCkpOwotCQkJdGhpcy5lbmdhZ2VSb3cocm93KTsKLQkJCXRoaXMucm93cy5zZXQoaSwgcm93KTsKLQkJCWkrKzsKLQkJfQotCQl0aGlzLmZpcmVUYWJsZVJvd3NVcGRhdGVkKGluZGV4LCBpIC0gMSk7Ci0JfQotCi0Jdm9pZCBtb3ZlUm93cyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+KGxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXRlbXAuYWRkKHRoaXMucm93cy5yZW1vdmUoc291cmNlSW5kZXgpKTsKLQkJfQotCQl0aGlzLnJvd3MuYWRkQWxsKHRhcmdldEluZGV4LCB0ZW1wKTsKLQotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlpbnQgZW5kID0gTWF0aC5tYXgodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KSArIGxlbmd0aCAtIDE7Ci0JCXRoaXMuZmlyZVRhYmxlUm93c1VwZGF0ZWQoc3RhcnQsIGVuZCk7Ci0JfQotCi0Jdm9pZCBjbGVhclRhYmxlKCkgewotCQl0aGlzLmRpc2VuZ2FnZUFsbENlbGxzKCk7Ci0JCXRoaXMuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLQl9Ci0KLQl2b2lkIHJlYnVpbGRUYWJsZSgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VBbGxDZWxscygpOwotCQl0aGlzLmVuZ2FnZUFsbENlbGxzKCk7Ci0JCXRoaXMuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Ub2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Ub2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY3M2JhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1MaXN0ZW5lcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpUb2dnbGVCdXR0b24uVG9nZ2xlQnV0dG9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBsaXN0ZW5lcgotICogKGUuZy4gYSBKQ2hlY2tCb3ggb3IgYSBKUmFkaW9CdXR0b24pIGluIHN5bmNoIHdpdGggYSBQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIG9uIGEgYm9vbGVhbi4KLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcgotCWV4dGVuZHMgVG9nZ2xlQnV0dG9uTW9kZWwKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgdG9nZ2xlIGJ1dHRvbjsgZm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMgbnVsbC4KLQkgKiBUaGUgZGVmYXVsdCBbZGVmYXVsdCB2YWx1ZV0gaXMgZmFsc2UgKGkuZS4gdGhlIHRvZ2dsZSBidXR0b24gaXMgdW5jaGVja2VkL2VtcHR5KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBib29sZWFuLiAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoCi0JICogY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGJvb2xlYW4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChib29sZWFuSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYm9vbGVhbkhvbGRlciA9IGJvb2xlYW5Ib2xkZXI7Ci0JCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyKSB7Ci0JCXRoaXMoYm9vbGVhbkhvbGRlciwgZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLnRoaXMuYm9vbGVhbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYm9vbGVhbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJ1dHRvbk1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gYikgewotCQlpZiAodGhpcy5pc1NlbGVjdGVkKCkgIT0gYikgewkvLyBzdG9wIHRoZSByZWN1cnNpb24hCi0JCQlzdXBlci5zZXRTZWxlY3RlZChiKTsvL3B1dCB0aGUgc3VwZXIgY2FsbCBmaXJzdCwgb3RoZXJ3aXNlIHRoZSBmb2xsb3dpbmcgZ2V0cyBjYWxsZWQgdHdpY2UKLQkJCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShCb29sZWFuLnZhbHVlT2YoYikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQWN0aW9uTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUFjdGlvbkxpc3RlbmVyKEFjdGlvbkxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlQWN0aW9uTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZEl0ZW1MaXN0ZW5lcihJdGVtTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkSXRlbUxpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVJdGVtTGlzdGVuZXIoSXRlbUxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlSXRlbUxpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgd2UgaGF2ZSBubyBsaXN0ZW5lcnMgYXQgYWxsLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudCgpID09IDA7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBJZiBpdCBpcyBudWxsLCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgKHdoaWNoIGlzIHR5cGljYWxseSBmYWxzZSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0ZWQoQm9vbGVhbiB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRTZWxlY3RlZCh0aGlzLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0U2VsZWN0ZWQodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSBhY2NvcmRpbmdseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBib29sZWFuQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWQoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5zZXRTZWxlY3RlZCh0aGlzLmJvb2xlYW5Ib2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYm9vbGVhbkhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzZWE4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZU5vZGVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIFRyZWVNb2RlbExpc3RlbmVyCi0gKiAoZS5nLiBhIEpUcmVlKSBpbiBzeW5jaCB3aXRoIGEgdHJlZSBvZiBUcmVlTm9kZVZhbHVlTW9kZWwgb2JqZWN0cy4gVW5saWtlCi0gKiBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRUcmVlTW9kZWwsIHlvdSBkbyBub3QgYWRkIGFuZCByZW1vdmUgbm9kZXMgd2l0aAotICogbWV0aG9kcyBpbXBsZW1lbnRlZCBoZXJlLiBZb3UgY2FuIGFkZCBhbmQgcmVtb3ZlIG5vZGVzIGJ5IGFkZGluZyBhbmQKLSAqIHJlbW92aW5nIHRoZW0gZGlyZWN0bHkgdG8vZnJvbSB0aGUgbm9kZXMgKG9yLCBtb3JlIHR5cGljYWxseSwgdGhlIGRvbWFpbgotICogb2JqZWN0cyB0aGUgbm9kZXMgYXJlIHdyYXBwaW5nIGFuZCBsaXN0ZW5pbmcgdG8pLgotICogCi0gKiBEdWUgdG8gbGltaXRhdGlvbnMgaW4gSlRyZWUsIHRoZSByb290IG9mIHRoZSB0cmVlIGNhbiBuZXZlciBiZSBudWxsLAotICogd2hpY2gsIHR5cGljYWxseSwgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0uIChJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGFuIGVtcHR5Ci0gKiB0cmVlIHlvdSBjYW4gc2V0IHRoZSBKVHJlZSdzIHRyZWVNb2RlbCB0byBudWxsLikKLSAqLwotcHVibGljIGNsYXNzIFRyZWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFic3RyYWN0VHJlZU1vZGVsCi17Ci0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyB0cmVlJ3Mgcm9vdCBub2RlIGFuZCBpdHMKLQkgKiBjb3JyZXNwb25kaW5nIGxpc3RlbmVyLiBUaGlzIGFsbG93cyBjbGllbnRzIHRvIHN3YXAgb3V0Ci0JICogdGhlIGVudGlyZSB0cmVlLiBEdWUgdG8gbGltaXRhdGlvbnMgaW4gSlRyZWUsIHRoZSByb290IHNob3VsZAotCSAqIG5ldmVyIGJlIHNldCB0byBudWxsIHdoaWxlIHdlIGhhdmUgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gcm9vdEhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcm9vdExpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHVzIHdoZW4gYSBub2RlJ3MgaW50ZXJuYWwKLQkgKiAic3RhdGUiIGNoYW5nZXMgKGFzIG9wcG9zZWQgdG8gdGhlIG5vZGUncyB2YWx1ZSBvciBsaXN0IG9mCi0JICogY2hpbGRyZW4pLCBhbGxvd2luZyB1cyB0byBmb3J3YXJkIG5vdGlmaWNhdGlvbiB0byBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciBub2RlU3RhdGVMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBub3RpZmllcyB1cyB3aGVuIGEgbm9kZSdzICJ2YWx1ZSIKLQkgKiBjaGFuZ2VzIChhcyBvcHBvc2VkIHRvIHRoZSBub2RlJ3Mgc3RhdGUgb3IgbGlzdCBvZgotCSAqIGNoaWxkcmVuKSwgYWxsb3dpbmcgdXMgdG8gZm9yd2FyZCBub3RpZmljYXRpb24gdG8gb3VyIGxpc3RlbmVycy4KLQkgKiBUeXBpY2FsbHksIHRoaXMgd2lsbCBvbmx5IGhhcHBlbiB3aXRoIG5vZGVzIHRoYXQgaG9sZAotCSAqIHByaW1pdGl2ZSBkYXRhLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBub2RlVmFsdWVMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBub3RpZmllcyB1cyB3aGVuIGFuIHVuZGVybHlpbmcgbm9kZSdzCi0JICogImxpc3QiIG9mIGNoaWxkcmVuIGNoYW5nZXMsIGFsbG93aW5nIHVzIHRvIGtlZXAgb3VyCi0JICogaW50ZXJuYWwgdHJlZSBpbiBzeW5jaCB3aXRoIHRoZSB1bmRlcmx5aW5nIHRyZWUgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgY2hpbGRyZW5MaXN0ZW5lcjsKLQotCS8qIHRoZXNlIGF0dHJpYnV0ZXMgbWFrZSB1cCBvdXIgaW50ZXJuYWwgdHJlZSAqLwotCS8qKgotCSAqIFRoZSByb290IGNhbm5vdCBiZSBudWxsIHdoaWxlIHdlIGhhdmUgbGlzdGVuZXJzLCB3aGljaCBpcwotCSAqIG1vc3Qgb2YgdGhlIHRpbWUuIFRoZSByb290IGlzIGNhY2hlZCBzbyB3ZSBjYW4gZGlzZW5nYWdlCi0JICogZnJvbSBpdCB3aGVuIGl0IGhhcyBiZWVuIHN3YXBwZWQgb3V0LgotCSAqLwotCXByaXZhdGUgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHJvb3Q7Ci0KLQkvKioKLQkgKiBNYXAgdGhlIG5vZGVzIHRvIHRoZWlyIGxpc3RzIG9mIGNoaWxkcmVuLgotCSAqIFdlIGNhY2hlIHRoZXNlIHNvIHdlIGNhbiBzd2FwIG91dCB0aGUgZW50aXJlIGxpc3Qgb2YgY2hpbGRyZW4KLQkgKiB3aGVuIHdlIHJlY2VpdmUgYSAjbGlzdENoYW5nZWQoKSBldmVudCAod2hpY2ggZG9lcyBub3QgaW5jbHVkZQotCSAqIHRoZSBpdGVtcyB0aGF0IHdlcmUgYWZmZWN0ZWQpLgotCSAqIEBzZWUgRXZlbnRDaGFuZ2VQb2xpY3kjcmVidWlsZENoaWxkcmVuKCkKLQkgKi8KLQlmaW5hbCBJZGVudGl0eUhhc2hNYXA8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+LCBMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4+IGNoaWxkcmVuTGlzdHM7Ci0KLQkvKioKLQkgKiBNYXAgdGhlIGNoaWxkcmVuIG1vZGVscyB0byB0aGVpciBwYXJlbnRzLgotCSAqIFdlIGNhY2hlIHRoZXNlIHNvIHdlIGNhbiBmaWd1cmUgb3V0IHRoZSAicmVhbCIgc291cmNlIG9mIHRoZQotCSAqIGxpc3QgY2hhbmdlIGV2ZW50cyAodGhlIHBhcmVudCkuCi0JICogQHNlZSBFdmVudENoYW5nZVBvbGljeSNwYXJlbnQoKQotCSAqLwotCWZpbmFsIElkZW50aXR5SGFzaE1hcDxMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+LCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHBhcmVudHM7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgcm9vdC4KLQkgKi8KLQlwdWJsaWMgVHJlZU1vZGVsQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiByb290SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChyb290SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucm9vdEhvbGRlciA9IHJvb3RIb2xkZXI7Ci0JCXRoaXMucm9vdExpc3RlbmVyID0gdGhpcy5idWlsZFJvb3RMaXN0ZW5lcigpOwotCQl0aGlzLm5vZGVTdGF0ZUxpc3RlbmVyID0gdGhpcy5idWlsZE5vZGVTdGF0ZUxpc3RlbmVyKCk7Ci0JCXRoaXMubm9kZVZhbHVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTm9kZVZhbHVlTGlzdGVuZXIoKTsKLQkJdGhpcy5jaGlsZHJlbkxpc3RlbmVyID0gdGhpcy5idWlsZENoaWxkcmVuTGlzdGVuZXIoKTsKLQkJdGhpcy5jaGlsZHJlbkxpc3RzID0gbmV3IElkZW50aXR5SGFzaE1hcDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4sIExpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Pj4oKTsKLQkJdGhpcy5wYXJlbnRzID0gbmV3IElkZW50aXR5SGFzaE1hcDxMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+LCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCByb290LgotCSAqLwotCXB1YmxpYyBUcmVlTW9kZWxBZGFwdGVyKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiByb290KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KHJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRSb290TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFJvb3RMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRSb290TGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5yb290Q2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicm9vdCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROb2RlVmFsdWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTm9kZVZhbHVlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVZhbHVlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLm5vZGVDaGFuZ2VkKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgdmFsdWUgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVN0YXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5ub2RlQ2hhbmdlZCgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHN0YXRlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRDaGlsZHJlbkxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLmFkZENoaWxkcmVuKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IEV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5yZW1vdmVDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLnJlcGxhY2VDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLm1vdmVDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IEV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5jbGVhckNoaWxkcmVuKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLnJlYnVpbGRDaGlsZHJlbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY2hpbGRyZW4gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpcy5yb290OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoT2JqZWN0IHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgcGFyZW50KS5jaGlsZChpbmRleCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGludCBnZXRDaGlsZENvdW50KE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuICgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBwYXJlbnQpLmNoaWxkcmVuU2l6ZSgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBib29sZWFuIGlzTGVhZihPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIG5vZGUpLmlzTGVhZigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIHZhbHVlRm9yUGF0aENoYW5nZWQoVHJlZVBhdGggcGF0aCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCSgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBwYXRoLmdldExhc3RQYXRoQ29tcG9uZW50KCkpLnNldFZhbHVlKChUKSBuZXdWYWx1ZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGludCBnZXRJbmRleE9mQ2hpbGQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiAoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgcGFyZW50KS5pbmRleE9mQ2hpbGQoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9UcmVlTW9kZWxMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFRyZWVNb2RlbExpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb1RyZWVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSByb290IGFuZCBhbGwgdGhlIG90aGVyIG5vZGVzCi0JICogaW4gdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMucm9vdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5yb290TGlzdGVuZXIpOwotCQl0aGlzLnJvb3QgPSB0aGlzLnJvb3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsJLy8gdGhlIHJvb3QgY2Fubm90IGJlIG51bGwgd2hpbGUgd2UgaGF2ZSBsaXN0ZW5lcnMKLQkJfQotCQl0aGlzLmVuZ2FnZU5vZGUodGhpcy5yb290KTsKLQkJdGhpcy5hZGRSb290KCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSByb290IGFuZCBhbGwgb2YgdGhlIG5vZGVzIHRvIHRoZSB1bmRlcmx5aW5nIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJvb3QoKSB7Ci0JCXRoaXMuYWRkTm9kZSgwLCB0aGlzLnJvb3QpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByb290IGFuZCBhbGwgdGhlIG90aGVyCi0JICogbm9kZXMgaW4gdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMucmVtb3ZlUm9vdCgpOwotCQl0aGlzLmRpc2VuZ2FnZU5vZGUodGhpcy5yb290KTsKLQkJdGhpcy5yb290ID0gbnVsbDsKLQkJdGhpcy5yb290SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnJvb3RMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSByb290IGFuZCBhbGwgb2YgdGhlIG5vZGVzIGZyb20gdGhlIHVuZGVybHlpbmcgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUm9vdCgpIHsKLQkJdGhpcy5yZW1vdmVOb2RlKDAsIHRoaXMucm9vdCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJvb3QgaGFzIGJlZW4gc3dhcHBlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGJpdCBnbmFybHkgYmVjYXVzZSB0aGUgQVBJIGZvciBub3RpZnlpbmcgbGlzdGVuZXJzCi0JICogdGhhdCB0aGUgcm9vdCBoYXMgY2hhbmdlZCBpcyBhIGJpdCBpbmNvbnNpc3RlbnQgd2l0aCB0aGF0IHVzZWQgZm9yCi0JICogbm9uLXJvb3Qgbm9kZXMuCi0JICovCi0Jdm9pZCByb290Q2hhbmdlZCgpIHsKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5ld1Jvb3QgPSB0aGlzLnJvb3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKG5ld1Jvb3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CS8vIHRoZSByb290IGNhbm5vdCBiZSBudWxsIHdoaWxlIHdlIGhhdmUgbGlzdGVuZXJzCi0JCX0KLQkJLy8gcmVtb3ZlIGFsbCB0aGUgY3VycmVudCByb290J3MgY2hpbGRyZW4gZnJvbSB0aGUgdHJlZQotCQkvLyBhbmQgcmVtb3ZlIHRoZSBpdCBmcm9tIHRoZSBpbnRlcm5hbCB0cmVlCi0JCXRoaXMucmVtb3ZlUm9vdCgpOyAKLQotCQkvLyBzYXZlIHRoZSBvbGQgcm9vdCBhbmQgc3dhcCBpbiB0aGUgbmV3IHJvb3QKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG9sZFJvb3QgPSB0aGlzLnJvb3Q7Ci0JCXRoaXMucm9vdCA9IG5ld1Jvb3Q7Ci0KLQkJLy8gd2UgbXVzdCBiZSBsaXN0ZW5pbmcgdG8gYm90aCB0aGUgb2xkIGFuZCBuZXcgcm9vdHMgd2hlbiB3ZSBmaXJlIHRoZSBldmVudAotCQkvLyBiZWNhdXNlIHRoZWlyIHZhbHVlcyBjYW4gYmUgYWZmZWN0ZWQgYnkgd2hldGhlciB0aGV5IGhhdmUgbGlzdGVuZXJzCi0JCXRoaXMuZW5nYWdlTm9kZSh0aGlzLnJvb3QpOwotCQl0aGlzLmZpcmVUcmVlUm9vdFJlcGxhY2VkKHRoaXMucm9vdCk7Ci0JCS8vIG5vdyB3ZSBjYW4gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCByb290Ci0JCXRoaXMuZGlzZW5nYWdlTm9kZShvbGRSb290KTsKLQotCQkvLyBhZGQgdGhlIG5ldyByb290IHRvIHRoZSBpbnRlcm5hbCB0cmVlIGFuZAotCQkvLyBhZGQgYWxsIGl0cyBjaGlsZHJlbiB0byB0aGUgdHJlZSBhbHNvCi0JCXRoaXMuYWRkUm9vdCgpOwotCX0KLQotCS8qKgotCSAqIEVpdGhlciB0aGUgInZhbHVlIiBvciB0aGUgInN0YXRlIiBvZiB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGNoYW5nZWQsCi0JICogZm9yd2FyZCBub3RpZmljYXRpb24gdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQl2b2lkIG5vZGVDaGFuZ2VkKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQgPSBub2RlLnBhcmVudCgpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXRoaXMuZmlyZVRyZWVSb290Q2hhbmdlZChub2RlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZmlyZVRyZWVOb2RlQ2hhbmdlZChwYXJlbnQucGF0aCgpLCBwYXJlbnQuaW5kZXhPZkNoaWxkKG5vZGUpLCBub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbiB0byB0aGUgbm9kZXMsIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgdGhlIG5vZGVzIHdlcmUgYWRkZWQsCi0JICogYW5kIHRoZW4gYWRkIHRoZSBub2RlcyB0byBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKiBXZSBtdXN0IGxpc3RlbiB0byB0aGUgbm9kZXMgYmVmb3JlIG5vdGlmeWluZyBhbnlib2R5LCBiZWNhdXNlCi0JICogYWRkaW5nIGEgbGlzdGVuZXIgY2FuIGNoYW5nZSB0aGUgdmFsdWUgb2YgYSBub2RlLgotCSAqLwotCXZvaWQgYWRkQ2hpbGRyZW4oVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBjaGlsZHJlbikgewotCQlpbnQgbGVuID0gY2hpbGRJbmRpY2VzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5lbmdhZ2VOb2RlKGNoaWxkcmVuW2ldKTsKLQkJfQotCQl0aGlzLmZpcmVUcmVlTm9kZXNJbnNlcnRlZChwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5hZGROb2RlKGNoaWxkSW5kaWNlc1tpXSwgY2hpbGRyZW5baV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSBub2RlIGFuZCBpdHMgY2hpbGRyZW4gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZU5vZGUoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUpIHsKLQkJbm9kZS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMubm9kZVN0YXRlTGlzdGVuZXIpOwotCQlub2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5vZGVWYWx1ZUxpc3RlbmVyKTsKLQkJbm9kZS5jaGlsZHJlbk1vZGVsKCkuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmNoaWxkcmVuTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbm9kZSB0byBvdXIgaW50ZXJuYWwgdHJlZTsKLQkgKiB0aGVuIHJlY3Vyc2UgZG93biB0aHJvdWdoIHRoZSBub2RlJ3MgY2hpbGRyZW4sCi0JICogYWRkaW5nIHRoZW0gdG8gdGhlIGludGVybmFsIHRyZWUgYWxzby4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZShpbnQgaW5kZXgsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCXRoaXMuYWRkTm9kZVRvSW50ZXJuYWxUcmVlKG5vZGUucGFyZW50KCksIGluZGV4LCBub2RlLCBub2RlLmNoaWxkcmVuTW9kZWwoKSk7Ci0JCW5ldyBOb2RlQ2hhbmdlUG9saWN5KG5vZGUpLmFkZENoaWxkcmVuKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbm9kZSB0byBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZVRvSW50ZXJuYWxUcmVlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQsIGludCBpbmRleCwgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5Nb2RlbCkgewotCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gc2libGluZ3MgPSB0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCWlmIChzaWJsaW5ncyA9PSBudWxsKSB7Ci0JCQlzaWJsaW5ncyA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PigpOwotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChwYXJlbnQsIHNpYmxpbmdzKTsKLQkJfQotCQlzaWJsaW5ncy5hZGQoaW5kZXgsIG5vZGUpOwotCi0JCXRoaXMucGFyZW50cy5wdXQoY2hpbGRyZW5Nb2RlbCwgbm9kZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIG5vZGVzIGZyb20gb3VyIGludGVybmFsIHRyZWUsIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgdGhlCi0JICogbm9kZXMgd2VyZSByZW1vdmVkLCB0aGVuIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBub2Rlcy4KLQkgKiBXZSBtdXN0IGxpc3RlbiB0byB0aGUgbm9kZXMgdW50aWwgYWZ0ZXIgbm90aWZ5aW5nIGFueWJvZHksIGJlY2F1c2UKLQkgKiByZW1vdmluZyBhIGxpc3RlbmVyIGNhbiBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgbm9kZS4KLQkgKi8KLQl2b2lkIHJlbW92ZUNoaWxkcmVuKFRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIHBhdGgsIGludFtdIGNoaWxkSW5kaWNlcywgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRyZW4pIHsKLQkJaW50IGxlbiA9IGNoaWxkSW5kaWNlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCS8vIHRoZSBpbmRpY2VzIHNsaWRlIGRvd24gYSBub3RjaCBlYWNoIHRpbWUgd2UgcmVtb3ZlIGEgY2hpbGQKLQkJCXRoaXMucmVtb3ZlTm9kZShjaGlsZEluZGljZXNbaV0gLSBpLCBjaGlsZHJlbltpXSk7Ci0JCX0KLQkJdGhpcy5maXJlVHJlZU5vZGVzUmVtb3ZlZChwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5kaXNlbmdhZ2VOb2RlKGNoaWxkcmVuW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpcnN0LCByZWN1cnNlIGRvd24gdGhyb3VnaCB0aGUgbm9kZSdzIGNoaWxkcmVuLAotCSAqIHJlbW92aW5nIHRoZW0gZnJvbSBvdXIgaW50ZXJuYWwgdHJlZTsKLQkgKiB0aGVuIHJlbW92ZSB0aGUgbm9kZSBpdHNlbGYgZnJvbSBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShpbnQgaW5kZXgsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCW5ldyBOb2RlQ2hhbmdlUG9saWN5KG5vZGUpLnJlbW92ZUNoaWxkcmVuKCk7Ci0JCXRoaXMucmVtb3ZlTm9kZUZyb21JbnRlcm5hbFRyZWUobm9kZS5wYXJlbnQoKSwgaW5kZXgsIG5vZGUsIG5vZGUuY2hpbGRyZW5Nb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBub2RlIGZyb20gb3VyIGludGVybmFsIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGVGcm9tSW50ZXJuYWxUcmVlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQsIGludCBpbmRleCwgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5Nb2RlbCkgewotCQl0aGlzLnBhcmVudHMucmVtb3ZlKGNoaWxkcmVuTW9kZWwpOwotCi0JCUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBzaWJsaW5ncyA9IHRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJc2libGluZ3MucmVtb3ZlKGluZGV4KTsKLQkJaWYgKHNpYmxpbmdzLmlzRW1wdHkoKSkgewotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnJlbW92ZShwYXJlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUgYW5kIGl0cyBjaGlsZHJlbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTm9kZShUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbm9kZSkgewotCQlub2RlLmNoaWxkcmVuTW9kZWwoKS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuY2hpbGRyZW5MaXN0ZW5lcik7Ci0JCW5vZGUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubm9kZVZhbHVlTGlzdGVuZXIpOwotCQlub2RlLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5ub2RlU3RhdGVMaXN0ZW5lcik7Ci0JfQotCi0Jdm9pZCBtb3ZlQ2hpbGRyZW4oVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGNoaWxkcmVuTGlzdCA9IHRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJQXJyYXlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PihsZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQl0ZW1wLmFkZChjaGlsZHJlbkxpc3QucmVtb3ZlKHNvdXJjZUluZGV4KSk7Ci0JCX0KLQkJY2hpbGRyZW5MaXN0LmFkZEFsbCh0YXJnZXRJbmRleCwgdGVtcCk7Ci0KLQkJdGhpcy5maXJlVHJlZVN0cnVjdHVyZUNoYW5nZWQocGFyZW50LnBhdGgoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5yb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb2FsZXNjZSBzb21lIG9mIHRoZSBjb21tb24gY2hhbmdlIHBvbGljeSBiZWhhdmlvci4KLQkgKi8KLQlwcml2YXRlIGFic3RyYWN0IGNsYXNzIENoYW5nZVBvbGljeSB7Ci0KLQkJQ2hhbmdlUG9saWN5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5hZGRDaGlsZHJlbih0aGlzLnBhcmVudCgpLnBhdGgoKSwgdGhpcy5jaGlsZEluZGljZXMoKSwgdGhpcy5jaGlsZEFycmF5KCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQl2b2lkIHJlbW92ZUNoaWxkcmVuKCkgewotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHRoaXMucGFyZW50KCkucGF0aCgpLCB0aGlzLmNoaWxkSW5kaWNlcygpLCB0aGlzLmNoaWxkQXJyYXkoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBpbmRpY2VzIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbiwKLQkJICogd2hpY2ggc2hvdWxkIGJlIGNvbnRpZ3VvdXMuCi0JCSAqLwotCQlpbnRbXSBjaGlsZEluZGljZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZEluZGljZXModGhpcy5jaGlsZHJlblN0YXJ0SW5kZXgoKSwgdGhpcy5jaGlsZHJlblNpemUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkQXJyYXkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZEFycmF5KHRoaXMuY2hpbGRyZW4oKSwgdGhpcy5jaGlsZHJlblNpemUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQnVpbGQgYW4gYXJyYXkgdG8gaG9sZCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkJICogSWYgdGhleSBhcmUgZGlmZmVyZW50IHNpemVzLCBzb21ldGhpbmcgaXMgc2NyZXdlZCB1cC4uLgotCQkgKi8KLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gYnVpbGRBcnJheShJdGVyYXRvcjxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHN0cmVhbSwgaW50IHNpemUpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gYXJyYXkgPSBuZXcgVHJlZU5vZGVWYWx1ZU1vZGVsW3NpemVdOwotCQkJZm9yIChpbnQgaSA9IDA7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJCWFycmF5W2ldID0gc3RyZWFtLm5leHQoKTsKLQkJCX0KLQkJCXJldHVybiBhcnJheTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYSBzZXQgb2YgaW5kaWNlcywgc3RhcnRpbmcgYXQgemVybyBhbmQKLQkJICogY29udGludWluZyBmb3IgdGhlIHNwZWNpZmllZCBzaXplLgotCQkgKi8KLQkJaW50W10gYnVpbGRJbmRpY2VzKGludCBzaXplKSB7Ci0JCQlyZXR1cm4gYnVpbGRJbmRpY2VzKDAsIHNpemUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhIHNldCBvZiBpbmRpY2VzLCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFuZAotCQkgKiBjb250aW51aW5nIGZvciB0aGUgc3BlY2lmaWVkIHNpemUuCi0JCSAqLwotCQlpbnRbXSBidWlsZEluZGljZXMoaW50IHN0YXJ0LCBpbnQgc2l6ZSkgewotCQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbc2l6ZV07Ci0JCQlpbnQgaW5kZXggPSBzdGFydDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaW5kaWNlc1tpXSA9IGluZGV4Kys7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5kaWNlczsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQlhYnN0cmFjdCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggZm9yIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IGludCBjaGlsZHJlblN0YXJ0SW5kZXgoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IGludCBjaGlsZHJlblNpemUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGludGVyYXRvciBvbiB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQlhYnN0cmFjdCBJdGVyYXRvcjxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGNoaWxkcmVuKCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgTGlzdENoYW5nZUV2ZW50IGZvciBhZGRpbmcsIHJlbW92aW5nLCByZXBsYWNpbmcsCi0JICogYW5kIGNoYW5naW5nIGNoaWxkcmVuLgotCSAqLwotCXByaXZhdGUgY2xhc3MgRXZlbnRDaGFuZ2VQb2xpY3kgZXh0ZW5kcyBDaGFuZ2VQb2xpY3kgewotCQlwcml2YXRlIExpc3RDaGFuZ2VFdmVudCBldmVudDsKLQotCQlFdmVudENoYW5nZVBvbGljeShMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBNYXAgdGhlIExpc3RDaGFuZ2VFdmVudCdzIHNvdXJjZSB0byB0aGUgY29ycmVzcG9uZGluZyBwYXJlbnQuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCgpIHsKLQkJCXJldHVybiBUcmVlTW9kZWxBZGFwdGVyLnRoaXMucGFyZW50cy5nZXQodGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RDaGFuZ2VFdmVudCdzIGl0ZW0gaW5kZXggaXMgdGhlIGNoaWxkcmVuIHN0YXJ0IGluZGV4LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudC5nZXRJbmRleCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0Q2hhbmdlRXZlbnQncyBzaXplIGlzIHRoZSBjaGlsZHJlbiBzaXplLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudC5pdGVtc1NpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdENoYW5nZUV2ZW50J3MgaXRlbXMgYXJlIHRoZSBjaGlsZHJlbi4KLQkJICovCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiAoSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PikgdGhpcy5ldmVudC5pdGVtcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgb2xkIG5vZGVzIGFuZCBhZGQgdGhlIG5ldyBvbmVzLgotCQkgKi8KLQkJdm9pZCByZXBsYWNlQ2hpbGRyZW4oKSB7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXJlbnRQYXRoID0gdGhpcy5wYXJlbnQoKS5wYXRoKCk7Ci0JCQlpbnRbXSBjaGlsZEluZGljZXMgPSB0aGlzLmNoaWxkSW5kaWNlcygpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgdGhpcy5yZXBsYWNlZENoaWxkcmVuKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLmFkZENoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgdGhpcy5jaGlsZEFycmF5KCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgb2xkIG5vZGVzIGFuZCBhZGQgdGhlIG5ldyBvbmVzLgotCQkgKi8KLQkJdm9pZCBtb3ZlQ2hpbGRyZW4oKSB7Ci0JCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMubW92ZUNoaWxkcmVuKHRoaXMucGFyZW50KCksIHRoaXMuZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSwgdGhpcy5ldmVudC5nZXRTb3VyY2VJbmRleCgpLCB0aGlzLmV2ZW50LmdldE1vdmVMZW5ndGgoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQ2xlYXIgYWxsIHRoZSBub2Rlcy4KLQkJICovCi0JCXZvaWQgY2xlYXJDaGlsZHJlbigpIHsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQgPSB0aGlzLnBhcmVudCgpOwotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGFyZW50UGF0aCA9IHBhcmVudC5wYXRoKCk7Ci0JCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5MaXN0ID0gVHJlZU1vZGVsQWRhcHRlci50aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCQlpbnRbXSBjaGlsZEluZGljZXMgPSB0aGlzLmJ1aWxkSW5kaWNlcyhjaGlsZHJlbkxpc3Quc2l6ZSgpKTsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkQXJyYXkgPSB0aGlzLmJ1aWxkQXJyYXkoY2hpbGRyZW5MaXN0Lml0ZXJhdG9yKCksIGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmVtb3ZlIGFsbCB0aGUgb2xkIG5vZGVzIGFuZCBhZGQgYWxsIHRoZSBuZXcgbm9kZXMuCi0JCSAqLwotCQl2b2lkIHJlYnVpbGRDaGlsZHJlbigpIHsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQgPSB0aGlzLnBhcmVudCgpOwotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGFyZW50UGF0aCA9IHBhcmVudC5wYXRoKCk7Ci0JCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5MaXN0ID0gVHJlZU1vZGVsQWRhcHRlci50aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCQlpbnRbXSBjaGlsZEluZGljZXMgPSB0aGlzLmJ1aWxkSW5kaWNlcyhjaGlsZHJlbkxpc3Quc2l6ZSgpKTsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkQXJyYXkgPSB0aGlzLmJ1aWxkQXJyYXkoY2hpbGRyZW5MaXN0Lml0ZXJhdG9yKCksIGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0KLQkJCWNoaWxkSW5kaWNlcyA9IHRoaXMuYnVpbGRJbmRpY2VzKHBhcmVudC5jaGlsZHJlbk1vZGVsKCkuc2l6ZSgpKTsKLQkJCWNoaWxkQXJyYXkgPSB0aGlzLmJ1aWxkQXJyYXkocGFyZW50LmNoaWxkcmVuTW9kZWwoKS5pdGVyYXRvcigpLCBwYXJlbnQuY2hpbGRyZW5TaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLmFkZENoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RDaGFuZ2VFdmVudCdzIHJlcGxhY2VkIGl0ZW1zIGFyZSB0aGUgcmVwbGFjZWQgY2hpbGRyZW4uCi0JCSAqLwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcmVwbGFjZWRDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkQXJyYXkoKEl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4pIHRoaXMuZXZlbnQucmVwbGFjZWRJdGVtcygpLCB0aGlzLmV2ZW50Lml0ZW1zU2l6ZSgpKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIFRyZWVOb2RlVmFsdWVNb2RlbCBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyBpdHMgY2hpbGRyZW4uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBOb2RlQ2hhbmdlUG9saWN5IGV4dGVuZHMgQ2hhbmdlUG9saWN5IHsKLQkJcHJpdmF0ZSBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbm9kZTsKLQotCQlOb2RlQ2hhbmdlUG9saWN5KFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCQl0aGlzLm5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBub2RlIGl0c2VsZiBpcyB0aGUgcGFyZW50LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNpbmNlIHdlIHdpbGwgYWx3YXlzIGJlIGRlYWxpbmcgd2l0aCBhbGwgb2YgdGhlIG5vZGUncwotCQkgKiBjaGlsZHJlbiwgdGhlIGNoaWxkcmVuIHN0YXJ0IGluZGV4IGlzIGFsd2F5cyB6ZXJvLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB3ZSB3aWxsIGFsd2F5cyBiZSBkZWFsaW5nIHdpdGggYWxsIG9mIHRoZSBub2RlJ3MKLQkJICogY2hpbGRyZW4sIHRoZSBjaGlsZHJlbiBzaXplIGlzIGFsd2F5cyBlcXVhbCB0byB0aGUgc2l6ZQotCQkgKiBvZiB0aGUgY2hpbGRyZW4gbW9kZWwuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5vZGUuY2hpbGRyZW5Nb2RlbCgpLnNpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB3ZSB3aWxsIGFsd2F5cyBiZSBkZWFsaW5nIHdpdGggYWxsIG9mIHRoZSBub2RlJ3MKLQkJICogY2hpbGRyZW4sIHRoZSBjaGlsZHJlbiBhcmUgYWxsIHRoZSBvYmplY3RzIGhlbGQgYnkKLQkJICogdGhlIGNoaWxkcmVuIG1vZGVsLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCUl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlLmNoaWxkcmVuTW9kZWwoKS5pdGVyYXRvcigpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0Fic3RyYWN0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NTIzN2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgTm9kZSBjbGFzc2VzLgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZzoKLSAqICAgICBpbml0aWFsaXphdGlvbgotICogICAgIGVuZm9yY2VkIG9iamVjdCBpZGVudGl0eSB3cnQgI2VxdWFscygpLyNoYXNoQ29kZSgpCi0gKiAgICAgY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGQpCi0gKiAgICAgdXNlciBjb21tZW50Ci0gKiAgICAgZGlydHkgZmxhZwotICogICAgIHByb2JsZW1zCi0gKiAgICAgc29ydGluZwotICogCi0gKiBUeXBpY2FsbHksIHN1YmNsYXNzZXMgc2hvdWxkIGNvbnNpZGVyIGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gKiAgICAgdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9ycwotICogICAgICAgICAod2l0aCB0aGUgYXBwcm9wcmlhdGVseS1yZXN0cmljdGl2ZSB0eXBlIGRlY2xhcmF0aW9uIGZvciBwYXJlbnQpCi0gKiAgICAgI2luaXRpYWxpemUoKQotICogICAgICNpbml0aWFsaXplKE5vZGUgcGFyZW50Tm9kZSkKLSAqICAgICAjY2hlY2tQYXJlbnQoTm9kZSBwYXJlbnROb2RlKQotICogICAgICNhZGRDaGlsZHJlblRvKExpc3QgbGlzdCkKLSAqICAgICAjbm9kZVJlbW92ZWQoTm9kZSkKLSAqICAgICAjdmFsaWRhdG9yKCkKLSAqICAgICAjdHJhbnNpZW50QXNwZWN0TmFtZXMoKSBvcgotICogICAgICAgICAjYWRkVHJhbnNpZW50QXNwZWN0TmFtZXNUbyhTZXQgdHJhbnNpZW50QXNwZWN0TmFtZXMpCi0gKiAgICAgI2FkZFByb2JsZW1zVG8oTGlzdCBjdXJyZW50UHJvYmxlbXMpCi0gKiAgICAgI25vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkKLSAqICAgICAgICAgI2FkZE5vblZhbGlkYXRlZEFzcGVjdE5hbWVzVG8oU2V0IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKQotICogICAgICNkaXNwbGF5U3RyaW5nKCkKLSAqICAgICAjdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm9kZSAKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIE5vZGUsIENhbGxiYWNrQ2hhbmdlU3VwcG9ydC5Tb3VyY2UKLXsKLQotCS8qKiBDb250YWlubWVudCBoaWVyYXJjaHkuICovCi0JcHJpdmF0ZSBOb2RlIHBhcmVudDsgIC8vIHBzZXVkby1maW5hbAotCi0JLyoqIFRyYWNrIHdoZXRoZXIgdGhlIG5vZGUgaGFzIGNoYW5nZWQuICovCi0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGRpcnR5OwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkaXJ0eUJyYW5jaDsKLQotCS8qKgotCSAqIFRoZSBub2RlJ3MgcHJvYmxlbXMsIGFzIGNhbGN1bGF0ZWQgZHVyaW5nIHZhbGlkYXRpb24uCi0JICogVGhpcyBsaXN0IHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIHZpYSBhIFByb2JsZW1TeW5jaHJvbml6ZXIsCi0JICogYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyBtb2RpZmljYXRpb24gZnJvbSBhbm90aGVyIHRocmVhZC4KLQkgKi8KLQlwcml2YXRlIFZlY3RvcjxQcm9ibGVtPiBwcm9ibGVtczsJCS8vIHBzZXVkby1maW5hbAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9QUk9CTEVNX01FU1NBR0VfQVJHVU1FTlRTID0gbmV3IE9iamVjdFswXTsKLQotCS8qKgotCSAqIENhY2hlIHRoZSBub2RlJ3MgImJyYW5jaCIgcHJvYmxlbXMsIGFzIGNhbGN1bGF0ZWQgZHVyaW5nIHZhbGlkYXRpb24uCi0JICogVGhpcyBsaXN0IHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIHZpYSBhIFByb2JsZW1TeW5jaHJvbml6ZXIsCi0JICogYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyBtb2RpZmljYXRpb24gZnJvbSBhbm90aGVyIHRocmVhZC4KLQkgKiBUaGlzIG11c3QgYmUgcmVjYWxjdWxhdGVkIGV2ZXJ5IHRpbWUgdGhpcyBub2RlIG9yIG9uZSBvZiBpdHMKLQkgKiBkZXNjZW5kYW50cyBjaGFuZ2VzIGl0IHByb2JsZW1zLgotCSAqLwotCXByaXZhdGUgVmVjdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zOwkJLy8gcHNldWRvLWZpbmFsCi0KLQkvKiogVXNlciBjb21tZW50LiAqLwotCXByaXZhdGUgdm9sYXRpbGUgU3RyaW5nIGNvbW1lbnQ7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIGZpZWxkcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXRzIG9mIHRyYW5zaWVudCBhc3BlY3QgbmFtZXMsIGtleWVkIGJ5IGNsYXNzLgotCSAqIFRoaXMgaXMgYnVpbHQgdXAgbGF6aWx5LCBhcyB0aGUgb2JqZWN0cyBhcmUgbW9kaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3ROb2RlPiwgSGFzaFNldDxTdHJpbmc+PiB0cmFuc2llbnRBc3BlY3ROYW1lU2V0cyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdE5vZGU+LCBIYXNoU2V0PFN0cmluZz4+KCk7Ci0KLQkvKioKLQkgKiBTZXRzIG9mIG5vbi12YWxpZGF0ZWQgYXNwZWN0IG5hbWVzLCBrZXllZCBieSBjbGFzcy4KLQkgKiBUaGlzIGlzIGJ1aWx0IHVwIGxhemlseSwgYXMgdGhlIG9iamVjdHMgYXJlIG1vZGlmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Tm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZVNldHMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3ROb2RlPiwgSGFzaFNldDxTdHJpbmc+PigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBNb3N0IG9iamVjdHMgbXVzdCBoYXZlIGEgcGFyZW50LgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIG5ldyBub2RlLgotCSAqIEBzZWUgI2luaXRpYWxpemUoTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3ROb2RlKE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbml0aWFsaXplIGEgbmV3bHktY3JlYXRlZCBpbnN0YW5jZS4KLQkgKiBAc2VlICNpbml0aWFsaXplKE5vZGUpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLmNvbW1lbnQgPSAiIjsKLQotCQkvLyBhIG5ldyBvYmplY3QgaXMgZGlydHksIGJ5IGRlZmluaXRpb24KLQkJdGhpcy5kaXJ0eSA9IHRydWU7Ci0JCXRoaXMuZGlydHlCcmFuY2ggPSB0cnVlOwotCi0JCXRoaXMucHJvYmxlbXMgPSBuZXcgVmVjdG9yPFByb2JsZW0+KCk7Ci0JCXRoaXMuYnJhbmNoUHJvYmxlbXMgPSBuZXcgVmVjdG9yPFByb2JsZW0+KCk7Ci0KLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgYSBuZXdseS1jcmVhdGVkIGluc3RhbmNlLgotCSAqIEBzZWUgI2luaXRpYWxpemUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCXRoaXMuY2hlY2tQYXJlbnQocGFyZW50Tm9kZSk7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50Tm9kZTsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuaW5pdGlhbGl6ZShwYXJlbnROb2RlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlcXVhbGl0eSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMgPT0gbzsKLQl9Ci0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LgotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhcmVudCBpcyBub3QgdmFsaWQKLQkgKiBmb3IgdGhlIG5vZGUuCi0JICogQnkgZGVmYXVsdCByZXF1aXJlIGEgbm9uLW51bGwgcGFyZW50LiBPdmVycmlkZSBpZiBvdGhlciByZXN0cmljdGlvbnMgZXhpc3QKLQkgKiBvciB0aGUgcGFyZW50IHNob3VsZCBiZSBudWxsLgotCSAqIE5COiBSb290IG5vZGUgbW9kZWwgaW1wbGVtZW50YXRpb25zIHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudE5vZGUpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmVudCBub2RlIGNhbm5vdCBiZSBudWxsIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQST8KLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBjaGlsZHJlbiwgd2hpY2ggYXJlIGFsc28gbm9kZXMuCi0JICogRG8gTk9UIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIE92ZXJyaWRlICNhZGRDaGlsZHJlblRvKExpc3QpLgotCSAqIEBzZWUgI2dldFBhcmVudCgpCi0JICogQHNlZSAjYWRkQ2hpbGRyZW5UbyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgSXRlcmF0b3I8Tm9kZT4gY2hpbGRyZW4oKSB7Ci0JCUxpc3Q8Tm9kZT4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7Ci0JCXRoaXMuYWRkQ2hpbGRyZW5UbyhjaGlsZHJlbik7Ci0JCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCB0aGVpciBjaGlsZHJlbgotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBAc2VlICNjaGlsZHJlbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW5UbyhMaXN0PE5vZGU+IGxpc3QpIHsKLQkJLy8gdGhpcyBjbGFzcyBoYXMgbm8gY2hpbGRyZW4sIHN1YmNsYXNzZXMgd2lsbC4uLgotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5hZGRDaGlsZHJlblRvKGxpc3QpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5J3Mgcm9vdCBub2RlLgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcm9vdC4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqIE5COiBBc3N1bWUgdGhlIHJvb3QgaGFzIG5vIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgTm9kZSByb290KCkgewotCQlOb2RlIHAgPSB0aGlzLnBhcmVudDsKLQkJcmV0dXJuIChwID09IG51bGwpID8gdGhpcyA6IHAucm9vdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZXNjZW5kYW50T2YoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAodGhpcyA9PSBub2RlKSB8fCB0aGlzLnBhcmVudElzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHBhcmVudElzRGVzY2VuZGFudE9mKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKHRoaXMucGFyZW50ICE9IG51bGwpICYmIHRoaXMucGFyZW50LmlzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gaG9sZGluZyBhbGwgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwKLQkgKiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzJyAicmVmZXJlbmNlcyIuICJSZWZlcmVuY2VzIiBhcmUKLQkgKiBvYmplY3RzIHRoYXQgYXJlICJyZWZlcmVuY2VkIiBieSBhbm90aGVyIG9iamVjdCwgYXMgb3Bwb3NlZAotCSAqIHRvICJvd25lZCIgYnkgYW5vdGhlciBvYmplY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKCkgewotCQlDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxOb2RlLlJlZmVyZW5jZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRCcmFuY2hSZWZlcmVuY2VzVG8oYnJhbmNoUmVmZXJlbmNlcyk7Ci0JCXJldHVybiBicmFuY2hSZWZlcmVuY2VzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCcmFuY2hSZWZlcmVuY2VzVG8oQ29sbGVjdGlvbjxOb2RlLlJlZmVyZW5jZT4gYnJhbmNoUmVmZXJlbmNlcykgewotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJY2hpbGQuYWRkQnJhbmNoUmVmZXJlbmNlc1RvKGJyYW5jaFJlZmVyZW5jZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLiBUaGUgbm9kZXMgd2lsbCBwcm9iYWJseSByZXR1cm5lZAotCSAqIGluICJkZXB0aC1maXJzdCIgb3JkZXIuCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxOb2RlPiBhbGxOb2RlcygpIHsKLQkJQ29sbGVjdGlvbjxOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJcmV0dXJuIG5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEk/Ci0JICogQWRkIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLCB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2RlcykgewotCQlub2Rlcy5hZGQodGhpcyk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBzeW5jaHJvbml6YXRpb24gc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFRoaXMgaXMgYSBnZW5lcmFsIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBoYXMgYmVlbgotCSAqIHJlbW92ZWQgZnJvbSB0aGUgdHJlZS4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uCi0JICogc2hvdWxkIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSB1cGRhdGVzIHRvIHJlbWFpbiBpbiBzeW5jaAotCSAqIHdpdGggdGhlIHRyZWUgKGUuZy4gY2xlYXJpbmcgb3V0IG9yIHJlcGxhY2luZyBhbnkgcmVmZXJlbmNlcwotCSAqIHRvIHRoZSByZW1vdmVkIG5vZGUgb3IgYW55IG9mIHRoZSByZW1vdmVkIG5vZGUncyBkZXNjZW5kYW50cykuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW1vdmVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW1vdmVkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqIHJldHVybiB3aGV0aGVyIG5vZGUxIGlzIGEgZGVzY2VuZGFudCBvZiBub2RlMjsKLQkgKiBub2RlMSBjYW4gYmUgbnVsbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5vZGVJc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCXJldHVybiAobm9kZTEgIT0gbnVsbCkgJiYgbm9kZTEuaXNEZXNjZW5kYW50T2Yobm9kZTIpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVGhpcyBpcyBhIGdlbmVyYWwgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNwZWNpZmllZCBub2RlIGhhcyBiZWVuCi0JICogcmVuYW1lZC4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uIHNob3VsZCBtYXJrIGl0cwotCSAqIGJyYW5jaCBkaXJ0eSBpZiBuZWNlc3NhcnkgKGkuZS4gaXQgcmVmZXJlbmNlcyB0aGUgcmVuYW1lZCBub2RlCi0JICogb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cykuIFRoaXMgbWV0aG9kIGlzIG9mIHBhcnRpY3VsYXIgY29uY2VybgotCSAqIHRvIEhhbmRsZXMuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVuYW1lZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW5hbWVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW5hbWVkKG5vZGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHVzZXIgY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCdzIHVzZXIgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGNvbW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBvYmplY3QncyB1c2VyIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotCQlPYmplY3Qgb2xkID0gdGhpcy5jb21tZW50OwotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09NTUVOVF9QUk9QRVJUWSwgb2xkLCBjb21tZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQW4gYXNwZWN0IG9mIHRoZSBub2RlIGhhcyBjaGFuZ2VkOgotCSAqIAktIGlmIGl0IGlzIGEgcGVyc2lzdGVudCBhc3BlY3QsIG1hcmsgdGhlIG9iamVjdCBkaXJ0eQotCSAqIAktIGlmIGl0IGlzIGEgc2lnbmlmaWNhbnQgYXNwZWN0LCB2YWxpZGF0ZSB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlpZiAodGhpcy5hc3BlY3RJc1BlcnNpc3RlbnQoYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBkaXJ0eSBjaGFuZ2U6ICIgKyB0aGlzICsgIjogIiArIGFzcGVjdE5hbWUpOwotCQkJdGhpcy5tYXJrRGlydHkoKTsKLQkJfQotCQlpZiAodGhpcy5hc3BlY3RDaGFuZ2VSZXF1aXJlc1ZhbGlkYXRpb24oYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiB2YWxpZGF0aW9uIGNoYW5nZTogIiArIHRoaXMgKyAiOiAiICsgYXNwZWN0TmFtZSk7Ci0JCQl0aGlzLnZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogUmV0dXJuIGEgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGEKLQkgKiAidmFsaWRhdGVkIiBhc3BlY3Qgb2YgdGhlIG5vZGUgdHJlZSBjaGFuZ2VzLgotCSAqIFR5cGljYWxseSBvbmx5IHRoZSByb290IG5vZGUgZGlyZWN0bHkgaG9sZHMgYSB2YWxpZGF0b3IuCi0JICogTkI6IFJvb3Qgbm9kZSBtb2RlbCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBOb2RlLlZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIG5vZGUgc2hvdWxkIG5vdCBiZSBmaXJpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbi4iKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0VmFsaWRhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGEKLQkgKiAidmFsaWRhdGVkIiBhc3BlY3Qgb2YgdGhlIG5vZGUgdHJlZSBjaGFuZ2VzLgotCSAqIFR5cGljYWxseSBvbmx5IHRoZSByb290IG5vZGUgZGlyZWN0bHkgaG9sZHMgYSB2YWxpZGF0b3IuCi0JICogTkI6IFJvb3Qgbm9kZSBtb2RlbCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihOb2RlLlZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgcm9vdCBub2RlIHNob3VsZCBpbXBsZW1lbnQgI3NldFZhbGlkYXRvcihOb2RlLlZhbGlkYXRvcikuIik7Ci0JCX0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJPbmx5IHJvb3Qgbm9kZXMgaW1wbGVtZW50ICNzZXRWYWxpZGF0b3IoTm9kZS5WYWxpZGF0b3IpLiIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXJ0eSBmbGFnIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0Ci0JICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvYmplY3Qgd2FzIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgY2hhbmdlcyB0byB0aGUgb2JqZWN0J3MgZGVzY2VuZGFudHMuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZGlydHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0LAotCSAqIG9yIGFueSBvZiBpdHMgZGVzY2VuZGFudHMsIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RpcnR5QnJhbmNoKCkgewotCQlyZXR1cm4gdGhpcy5kaXJ0eUJyYW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgb2JqZWN0IGlzIHVubW9kaWZpZWQKLQkgKiBzaW5jZSBpdCB3YXMgbGFzdCByZWFkIG9yIHNhdmVkLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSBjaGFuZ2VzIHRvIHRoZSBvYmplY3QncyBkZXNjZW5kYW50cy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMKLQkgKiBhcmUgdW5tb2RpZmllZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuQnJhbmNoKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5QnJhbmNoOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGlydHkgYnJhbmNoIGZsYWcgc2V0dGluZy4gVGhpcyBpcyBzZXQgdG8gdHJ1ZQotCSAqIHdoZW4gZWl0aGVyIHRoZSBvYmplY3Qgb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cyBiZWNvbWVzIGRpcnR5LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRJc0RpcnR5QnJhbmNoKGJvb2xlYW4gZGlydHlCcmFuY2gpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRpcnR5QnJhbmNoOwotCQl0aGlzLmRpcnR5QnJhbmNoID0gZGlydHlCcmFuY2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVJUWV9CUkFOQ0hfUFJPUEVSVFksIG9sZCwgZGlydHlCcmFuY2gpOwotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhcyBkaXJ0eSBhbmQgYXMgYSBkaXJ0eSBicmFuY2guCi0JICogQW4gb2JqZWN0IGlzIG1hcmtlZCBkaXJ0eSB3aGVuIGVpdGhlciBhICJwZXJzaXN0ZW50IiBhdHRyaWJ1dGUKLQkgKiBoYXMgY2hhbmdlZCBvciBpdHMgc2F2ZSBsb2NhdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFya0RpcnR5KCkgewotCQl0aGlzLmRpcnR5ID0gdHJ1ZTsKLQkJdGhpcy5tYXJrQnJhbmNoRGlydHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnQgYXMgZGlydHkgYnJhbmNoZXMuCi0JICogVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgZGlydHkuCi0JICovCi0JcHVibGljIHZvaWQgbWFya0JyYW5jaERpcnR5KCkgewotCQkvLyBzaG9ydC1jaXJjdWl0IGFueSB1bm5lY2Vzc2FyeSBwcm9wYWdhdGlvbgotCQlpZiAodGhpcy5kaXJ0eUJyYW5jaCkgewotCQkJLy8gaWYgdGhpcyBpcyBhbHJlYWR5IGEgZGlydHkgYnJhbmNoLCB0aGUgcGFyZW50IG11c3QgYmUgYWxzbwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5zZXRJc0RpcnR5QnJhbmNoKHRydWUpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpIHsKLQkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKLQkJCXRoaXMucGFyZW50Lm1hcmtCcmFuY2hEaXJ0eSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFyayB0aGUgb2JqZWN0IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFzIGRpcnR5LgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBzYXZlIGxvY2F0aW9uIG9mIHNvbWUKLQkgKiB0b3AtbGV2ZWwgb2JqZWN0IGlzIGNoYW5nZWQgYW5kIHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlIG11c3QgYmUgbWFya2VkIGRpcnR5IHNvIGl0Ci0JICogd2lsbCBiZSB3cml0dGVuIG91dC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBtYXJrRW50aXJlQnJhbmNoRGlydHkoKSB7Ci0JCXRoaXMubWFya0RpcnR5KCk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5tYXJrRW50aXJlQnJhbmNoRGlydHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBjbGVhbi4KLQkgKiBUaGVuIG5vdGlmeSB0aGUgb2JqZWN0J3MgcGFyZW50IHRoYXQgaXQgKHRoZSBwYXJlbnQpCi0JICogbWlnaHQgbm93IGJlIGEgY2xlYW4gYnJhbmNoIGFsc28uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgb2JqZWN0IGhhcyBqdXN0IGJlZW4KLQkgKiByZWFkIGluIG9yIHdyaXR0ZW4gb3V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1hcmtFbnRpcmVCcmFuY2hDbGVhbigpIHsKLQkJdGhpcy5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCXRoaXMubWFya1BhcmVudEJyYW5jaENsZWFuSWZQb3NzaWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5tYXJrQnJhbmNoQ2xlYW5JZlBvc3NpYmxlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgYXMgY2xlYW4uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgbm9kZSBoYXMganVzdCBiZWVuCi0JICogcmVhZCBpbiBvciB3cml0dGVuIG91dC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqIE5vdCB0aGUgYmVzdCBvZiBtZXRob2QgbmFtZXMuLi4uIDotKAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNhc2NhZGVNYXJrRW50aXJlQnJhbmNoQ2xlYW4oKSB7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCX0KLQkJdGhpcy5kaXJ0eSA9IGZhbHNlOwotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQSBjaGlsZCBub2RlJ3MgYnJhbmNoIGhhcyBiZWVuIG1hcmtlZCBjbGVhbi4gSWYgdGhlIG5vZGUKLQkgKiBpdHNlbGYgaXMgY2xlYW4gYW5kIGlmIGFsbCBvZiBpdHMgY2hpbGRyZW4gYXJlIGFsc28gY2xlYW4sIHRoZQotCSAqIG5vZGUncyBicmFuY2ggY2FuIGJlIG1hcmtlZCBjbGVhbi4gVGhlbiwgaWYgdGhlIG5vZGUncwotCSAqIGJyYW5jaCBpcyBjbGVhbiwgdGhlIG5vZGUgd2lsbCBub3RpZnkgaXRzIHBhcmVudCB0aGF0IGl0IG1pZ2h0Ci0JICogYmUgY2xlYW4gYWxzby4gVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgY2xlYW4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbWFya0JyYW5jaENsZWFuSWZQb3NzaWJsZSgpIHsKLQkJLy8gc2hvcnQtY2lyY3VpdCBhbnkgdW5uZWNlc3NhcnkgcHJvcGFnYXRpb24KLQkJaWYgKHRoaXMuZGlydHkpIHsKLQkJCS8vIGlmIHRoZSBvYmplY3QgaXMgImxvY2FsbHkiIGRpcnR5LCBpdCBpcyBzdGlsbCBhIGRpcnR5IGJyYW5jaAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWlmIChjaGlsZC5pc0RpcnR5QnJhbmNoKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0SXNQZXJzaXN0ZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuYXNwZWN0SXNUcmFuc2llbnQoYXNwZWN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdElzVHJhbnNpZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zaWVudEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyB0cmFuc2llbnQgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgdG8gYmUgbWFya2VkIGRpcnR5LgotCSAqIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgdHJhbnNpZW50IGFzcGVjdHMsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgI2FkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodHJhbnNpZW50QXNwZWN0TmFtZVNldHMpIHsKLQkJCUhhc2hTZXQ8U3RyaW5nPiB0cmFuc2llbnRBc3BlY3ROYW1lcyA9IHRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLmdldCh0aGlzLmdldENsYXNzKCkpOwotCQkJaWYgKHRyYW5zaWVudEFzcGVjdE5hbWVzID09IG51bGwpIHsKLQkJCQl0cmFuc2llbnRBc3BlY3ROYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQl0aGlzLmFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8odHJhbnNpZW50QXNwZWN0TmFtZXMpOwotCQkJCXRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLnB1dCh0aGlzLmdldENsYXNzKCksIHRyYW5zaWVudEFzcGVjdE5hbWVzKTsKLQkJCX0KLQkJCXJldHVybiB0cmFuc2llbnRBc3BlY3ROYW1lczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgb2JqZWN0J3MgdHJhbnNpZW50IGFzcGVjdCBuYW1lcyB0byB0aGUgc3BlY2lmaWVkIHNldC4KLQkgKiBUaGVzZSBhcmUgdGhlIGFzcGVjdHMgdGhhdCwgd2hlbiB0aGV5IGNoYW5nZSwgd2lsbCBOT1QgY2F1c2UgdGhlCi0JICogb2JqZWN0IHRvIGJlIG1hcmtlZCBkaXJ0eS4KLQkgKiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyIHRyYW5zaWVudCBhc3BlY3RzIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uLAotCSAqIG92ZXJyaWRlICN0cmFuc2llbnRBc3BlY3ROYW1lcygpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMpIHsKLQkJdHJhbnNpZW50QXNwZWN0TmFtZXMuYWRkKERJUlRZX0JSQU5DSF9QUk9QRVJUWSk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChCUkFOQ0hfUFJPQkxFTVNfTElTVCk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZKTsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkVHJhbnNpZW50QXNwZWN0TmFtZXNUbyh0cmFuc2llbnRBc3BlY3ROYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXJ0eSBub2RlcyBpbiB0aGUgb2JqZWN0J3MgYnJhbmNoIG9mIHRoZSB0cmVlLAotCSAqIGluY2x1ZGluZyB0aGUgbm9kZSBpdHNlbGYgKGlmIGFwcHJvcHJpYXRlKS4KLQkgKiBPbmx5IHJlYWxseSB1c2VkIGZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcuCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPE5vZGU+IGFsbERpcnR5Tm9kZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Tm9kZSwgTm9kZT4odGhpcy5hbGxOb2RlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChOb2RlIG5vZGUpIHsKLQkJCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE5vZGUpICYmICgoQWJzdHJhY3ROb2RlKSBub2RlKS5pc0RpcnR5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb2JsZW1zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZSdzIHByb2JsZW1zLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSB0aGUgcHJvYmxlbXMgb2YgdGhlIG5vZGUncyBkZXNjZW5kYW50cy4KLQkgKiBAc2VlICNicmFuY2hQcm9ibGVtcygpCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPFByb2JsZW0+IHByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8UHJvYmxlbT4odGhpcy5wcm9ibGVtcyk7CS8vIHJlbW92ZXMgYXJlIG5vdCBhbGxvd2VkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgcHJvYmxlbXMuCi0JICogVGhpcyBkb2VzIE5PVCBpbmNsdWRlIHRoZSBwcm9ibGVtcyBvZiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzLgotCSAqIEBzZWUgI2JyYW5jaFByb2JsZW1zU2l6ZSgpCi0JICovCi0JcHVibGljIGZpbmFsIGludCBwcm9ibGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByb2JsZW1zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBoYXMgcHJvYmxlbXMKLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgdGhlIHByb2JsZW1zIG9mIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMuCi0JICogQHNlZSAjaGFzQnJhbmNoUHJvYmxlbXMoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1Byb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLnByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBub2RlJ3MgcHJvYmxlbXMgYWxvbmcgd2l0aCBhbGwgdGhlCi0JICogbm9kZSdzIGRlc2NlbmRhbnRzJyBwcm9ibGVtcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdEl0ZXJhdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFByb2JsZW0+KHRoaXMuYnJhbmNoUHJvYmxlbXMpOwkvLyByZW1vdmVzIGFyZSBub3QgYWxsb3dlZAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgYnJhbmNoUHJvYmxlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cyBoYXZlIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0JyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLmJyYW5jaFByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc0JyYW5jaFByb2JsZW0oUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCXJldHVybiB0aGlzLmJyYW5jaFByb2JsZW1zLmNvbnRhaW5zKHByb2JsZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBQcm9ibGVtIGJ1aWxkUHJvYmxlbShTdHJpbmcgbWVzc2FnZUtleSwgT2JqZWN0Li4uIG1lc3NhZ2VBcmd1bWVudHMpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0UHJvYmxlbSh0aGlzLCBtZXNzYWdlS2V5LCBtZXNzYWdlQXJndW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUHJvYmxlbSBidWlsZFByb2JsZW0oU3RyaW5nIG1lc3NhZ2VLZXkpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQcm9ibGVtKG1lc3NhZ2VLZXksIEVNUFRZX1BST0JMRU1fTUVTU0FHRV9BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLAotCSAqIGFuZCB1cGRhdGUgdGhlaXIgc2V0cyBvZiAiYnJhbmNoIiBwcm9ibGVtcy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCcmFuY2goKSB7Ci0JCWlmICh0aGlzLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKSkgewotCQkJLy8gaWYgb3VyICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwgdGhlbgotCQkJLy8gb3VyIHBhcmVudCBtdXN0IHJlYnVpbGQgaXRzICJicmFuY2giIHByb2JsZW1zIGFsc28KLQkJCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkUGFyZW50QnJhbmNoUHJvYmxlbXMoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5yZWJ1aWxkQnJhbmNoUHJvYmxlbXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMsCi0JICogYW5kIHVwZGF0ZSB0aGVpciBzZXRzIG9mICJicmFuY2giIHByb2JsZW1zLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCcmFuY2hJbnRlcm5hbCgpIHsKLQkJLy8gcmVidWlsZCAiYnJhbmNoIiBwcm9ibGVtcyBpbiBjaGlsZHJlbiBmaXJzdAotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gcmVidWlsZCBvdXIgImJyYW5jaCIKLQkJCS8vIHByb2JsZW1zIG5vIG1hdHRlciB3aGF0LCB0byBzZWUgaWYgdGhleSBoYXZlIGNoYW5nZWQKLQkJCWNoaWxkLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKTsKLQkJfQotCi0JCXRoaXMucHJvYmxlbXMuY2xlYXIoKTsKLQkJdGhpcy5hZGRQcm9ibGVtc1RvKHRoaXMucHJvYmxlbXMpOwotCi0JCXJldHVybiB0aGlzLmNoZWNrQnJhbmNoUHJvYmxlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYW55IHByb2JsZW1zIGFuZCBhZGQgdGhlbSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIE9OTFkgYWRkIHByb2JsZW1zIGZvciB0aGlzIHBhcnRpY3VsYXIgbm9kZTsKLQkgKiBpdCBzaG91bGQgTk9UIGFkZCBwcm9ibGVtcyBmb3IgYW55IG9mIHRoaXMgbm9kZSdzIGRlc2NlbmRhbnRzCi0JICogb3IgYW5jZXN0b3JzLiAoQWx0aG91Z2ggdGhlcmUgd2lsbCBiZSB0aW1lcyB3aGVuIGl0IGlzIGRlYmF0YWJsZQotCSAqIGFzIHRvIHdoaWNoIG5vZGUgYSBwcm9ibGVtICJiZWxvbmdzIiB0by4uLi4pCi0JICogCi0JICogTkI6IFRoaXMgbWV0aG9kIHNob3VsZCBOT1QgbW9kaWZ5IEFOWSBwYXJ0IG9mIHRoZSBub2RlJ3Mgc3RhdGUhCi0JICogSXQgaXMgYSBSRUFELU9OTFkgYmVoYXZpb3IuIE9OTFkgdGhlIGxpc3Qgb2YgY3VycmVudCBwcm9ibGVtcwotCSAqIHBhc3NlZCBpbiB0byB0aGUgbWV0aG9kIHNob3VsZCBiZSBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCS8vIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCi0JCS8vIFdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5hZGRQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmVidWlsZCB0aGUgImJyYW5jaCIgcHJvYmxlbXMgYW5kIHJldHVybiB3aGV0aGVyIHRoZXkgaGF2ZQotCSAqIGNoYW5nZWQuCi0JICogTkI6IFRoZSBlbnRpcmUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBtdXN0IGJlIHJlLWNhbGN1bGF0ZWQKLQkgKiB3aXRoIEVWRVJZICJzaWduaWZpY2FudCIgY2hhbmdlIC0gd2UgY2Fubm90IGtlZXAgaXQgaW4gc3luY2ggdmlhCi0JICogY2hhbmdlIG5vdGlmaWNhdGlvbnMgYmVjYXVzZSBpZiBhIGRlc2NlbmRhbnQgd2l0aCBwcm9ibGVtcyBpcwotCSAqIHJlbW92ZWQgb3IgcmVwbGFjZWQgd2Ugd2lsbCBub3QgcmVjZWl2ZSBub3RpZmljYXRpb24gdGhhdCBpdHMKLQkgKiBwcm9ibGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSBvdXIgImJyYW5jaCIgcHJvYmxlbXMuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrQnJhbmNoUHJvYmxlbXMoKSB7Ci0JCVZlY3RvcjxQcm9ibGVtPiBvbGRCcmFuY2hQcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4odGhpcy5icmFuY2hQcm9ibGVtcyk7Ci0JCWludCBvbGRTaXplID0gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0KLQkJdGhpcy5icmFuY2hQcm9ibGVtcy5jbGVhcigpOwotCQl0aGlzLmJyYW5jaFByb2JsZW1zLmFkZEFsbCh0aGlzLnByb2JsZW1zKTsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLmFkZEJyYW5jaFByb2JsZW1zVG8odGhpcy5icmFuY2hQcm9ibGVtcyk7Ci0JCX0KLQotCQkvLyBpZiB0aGUgc2l6ZSBoYXMgY2hhbmdlZCB0byBvciBmcm9tIHplcm8sIG91ciB2aXJ0dWFsIGZsYWcgaGFzIGNoYW5nZWQKLQkJaW50IG5ld1NpemUgPSB0aGlzLmJyYW5jaFByb2JsZW1zLnNpemUoKTsKLQkJaWYgKChvbGRTaXplID09IDApICYmIChuZXdTaXplICE9IDApKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSEFTX0JSQU5DSF9QUk9CTEVNU19QUk9QRVJUWSwgZmFsc2UsIHRydWUpOwotCQl9IGVsc2UgaWYgKChvbGRTaXplICE9IDApICYmIChuZXdTaXplID09IDApKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSEFTX0JSQU5DSF9QUk9CTEVNU19QUk9QRVJUWSwgdHJ1ZSwgZmFsc2UpOwotCQl9Ci0KLQkJaWYgKG9sZEJyYW5jaFByb2JsZW1zLmVxdWFscyh0aGlzLmJyYW5jaFByb2JsZW1zKSkgewotCQkJcmV0dXJuIGZhbHNlOwkJLy8gb3VyICJicmFuY2giIHByb2JsZW1zIGRpZCBub3QgY2hhbmdlCi0JCX0KLQkJLy8gb3VyICJicmFuY2giIHByb2JsZW1zIGNoYW5nZWQKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoQlJBTkNIX1BST0JMRU1TX0xJU1QpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEFkZCBhbGwgdGhlIHByb2JsZW1zIG9mIHRoZSBub2RlIGFuZCBhbGwKLQkgKiB0aGUgcHJvYmxlbXMgb2YgaXRzIGRlc2NlbmRhbnRzIHRvIHRoZQotCSAqIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJyYW5jaFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBsaXN0KSB7Ci0JCWxpc3QuYWRkQWxsKHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQSBjaGlsZCBub2RlJ3MgImJyYW5jaCIgcHJvYmxlbXMgY2hhbmdlZDsKLQkgKiB0aGVyZWZvcmUgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQgYWxzbyBhbmQKLQkgKiBtdXN0IGJlIHJlYnVpbHQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVidWlsZEJyYW5jaFByb2JsZW1zKCkgewotCQlpZiAoICEgdGhpcy5jaGVja0JyYW5jaFByb2JsZW1zKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIndlIHNob3VsZCBub3QgZ2V0IGhlcmUgdW5sZXNzIG91ciBcImJyYW5jaFwiIHByb2JsZW1zIGhhdmUgY2hhbmdlZCIpOwotCQl9Ci0JCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY2xlYXJBbGxCcmFuY2hQcm9ibGVtcygpIHsKLQkJaWYgKHRoaXMuY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCkpIHsKLQkJCS8vIGlmIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQsIHRoZW4KLQkJCS8vIG91ciBwYXJlbnQgbXVzdCByZWJ1aWxkIGl0cyAiYnJhbmNoIiBwcm9ibGVtcyBhbHNvCi0JCQl0aGlzLnJlYnVpbGRQYXJlbnRCcmFuY2hQcm9ibGVtcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBDbGVhciB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGFuZCB0aGUgImJyYW5jaCIKLQkgKiBwcm9ibGVtcyBvZiBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCkgewotCQlpZiAodGhpcy5icmFuY2hQcm9ibGVtcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gY2xlYXIgb3VyICJicmFuY2giCi0JCQkvLyBwcm9ibGVtcyBubyBtYXR0ZXIgd2hhdAotCQkJY2hpbGQuY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0JCX0KLQkJdGhpcy5wcm9ibGVtcy5jbGVhcigpOwotCQl0aGlzLmJyYW5jaFByb2JsZW1zLmNsZWFyKCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZLCB0cnVlLCBmYWxzZSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEJSQU5DSF9QUk9CTEVNU19MSVNUKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBjaGFuZ2UgdG8gc3BlY2lmaWVkIGFzcGVjdCByZXF1aXJlcyBhIHJlLXZhbGlkYXRpb24KLQkgKiBvZiB0aGUgbm9kZSdzIHRyZWUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdENoYW5nZVJlcXVpcmVzVmFsaWRhdGlvbihTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmFzcGVjdENoYW5nZURvZXNOb3RSZXF1aXJlVmFsaWRhdGlvbihhc3BlY3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0Q2hhbmdlRG9lc05vdFJlcXVpcmVWYWxpZGF0aW9uKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLm5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyAibm9uLXZhbGlkYXRlZCIgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgKG9yIGl0cyBjb250YWluaW5nIHRyZWUpIHRvIGJlIHZhbGlkYXRlZCwgaS5lLiBjaGVja2VkIGZvciBwcm9ibGVtcy4KLQkgKiBJZiB5b3UgbmVlZCBpbnN0YW5jZS1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyICJub24tdmFsaWRhdGVkIiBhc3BlY3RzLAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBpcyBzdWZmaWNpZW50LAotCSAqIG92ZXJyaWRlICNhZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKFNldCkuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzKSB7Ci0JCQlIYXNoU2V0PFN0cmluZz4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMgPSBub25WYWxpZGF0ZWRBc3BlY3ROYW1lU2V0cy5nZXQodGhpcy5nZXRDbGFzcygpKTsKLQkJCWlmIChub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyA9PSBudWxsKSB7Ci0JCQkJbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQkJdGhpcy5hZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKTsKLQkJCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lU2V0cy5wdXQodGhpcy5nZXRDbGFzcygpLCBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG9iamVjdCdzICJub24tdmFsaWRhdGVkIiBhc3BlY3QgbmFtZXMgdG8gdGhlIHNwZWNpZmllZCBzZXQuCi0JICogVGhlc2UgYXJlIHRoZSBhc3BlY3RzIHRoYXQsIHdoZW4gdGhleSBjaGFuZ2UsIHdpbGwgTk9UIGNhdXNlIHRoZQotCSAqIG9iamVjdCAob3IgaXRzIGNvbnRhaW5pbmcgdHJlZSkgdG8gYmUgdmFsaWRhdGVkLCBpLmUuIGNoZWNrZWQgZm9yIHByb2JsZW1zLgotCSAqIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgIm5vbi12YWxpZGF0ZWQiIGFzcGVjdHMgaXMgc3VmZmljaWVudCwKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSWYgeW91IG5lZWQgaW5zdGFuY2UtYmFzZWQgY2FsY3VsYXRpb24sCi0JICogb3ZlcnJpZGUgI25vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVmFsaWRhdGVkQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcykgewotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoQ09NTUVOVF9QUk9QRVJUWSk7Ci0JCW5vblZhbGlkYXRlZEFzcGVjdE5hbWVzLmFkZChESVJUWV9CUkFOQ0hfUFJPUEVSVFkpOwotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoQlJBTkNIX1BST0JMRU1TX0xJU1QpOwotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoSEFTX0JSQU5DSF9QUk9CTEVNU19QUk9QRVJUWSk7Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLmFkZE5vblZhbGlkYXRlZEFzcGVjdE5hbWVzVG8obm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwbGF5IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29tcGFyZSBkaXNwbGF5IHN0cmluZ3MuCi0JICovCi0JcHVibGljIGludCBjb21wYXJlVG8oTm9kZSBub2RlKSB7Ci0JCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBkZXZlbG9wZXItZnJpZW5kbHkgU3RyaW5nLiBJZiB5b3Ugd2FudCBzb21ldGhpbmcgdXNlZnVsIGZvcgotCSAqIGRpc3BsYXlpbmcgaW4gYSB1c2VyIGludGVyZmFjZSwgdXNlICNkaXNwbGF5U3RyaW5nKCkuCi0JICogSWYgeW91IHdhbnQgdG8gZ2l2ZSBtb3JlIGluZm9ybWF0aW9uIGluIHlvdXIgI3RvU3RyaW5nKCksCi0JICogb3ZlcnJpZGUgI3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpLiAKLQkgKiBXaGF0ZXZlciB5b3UgYWRkIHRvIHRoYXQgc3RyaW5nIGJ1ZmZlciB3aWxsIHNob3cgdXAgYmV0d2VlbiB0aGUgcGFyZW50aGVzZXMuCi0JICogQHNlZSBBYnN0cmFjdE1vZGVsI3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpCi0JICogQHNlZSAjZGlzcGxheVN0cmluZygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Bc3luY2hyb25vdXNWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0FzeW5jaHJvbm91c1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDIwNTljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0FzeW5jaHJvbm91c1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUgaW50ZXJmYWNlCi0gKiBzaW1wbHkgc2V0cyBhIHNoYXJlZCAidmFsaWRhdGUiIGZsYWcgdG8gdHJ1ZS4gVGhpcyBzaG91bGQgdHJpZ2dlciBhCi0gKiBzZXBhcmF0ZSAidmFsaWRhdGlvbiIgdGhyZWFkIHRvIGJlZ2luIHZhbGlkYXRpbmcgdGhlIGFwcHJvcHJpYXRlCi0gKiBicmFuY2ggb2Ygbm9kZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3luY2hyb25vdXNWYWxpZGF0b3IKLQlpbXBsZW1lbnRzIFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZQotewotCXByaXZhdGUgU3luY2hyb25pemVkQm9vbGVhbiB2YWxpZGF0ZUZsYWc7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB2YWxpZGF0b3IgZGVsZWdhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIHNoYXJlZAotCSAqICJ2YWxpZGF0ZSIgZmxhZy4gVGhpcyBmbGFnIHNob3VsZCBiZSBzaGFyZWQgd2l0aAotCSAqIGFub3RoZXIgdGhyZWFkIHRoYXQgd2lsbCBwZXJmb3JtIHRoZSBhY3R1YWwgdmFsaWRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzVmFsaWRhdG9yKFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsaWRhdGVGbGFnID0gdmFsaWRhdGVGbGFnOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc2hhcmVkICJ2YWxpZGF0ZSIgZmxhZyB0byB0cnVlLCB0cmlnZ2VyaW5nCi0JICogYW4gYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gb2YgdGhlIGFwcHJvcHJpYXRlCi0JICogYnJhbmNoIG9mIG5vZGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCQl0aGlzLnZhbGlkYXRlRmxhZy5zZXRUcnVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy52YWxpZGF0ZUZsYWcpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvRGVmYXVsdFByb2JsZW0uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0RlZmF1bHRQcm9ibGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjU3NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvRGVmYXVsdFByb2JsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQcm9ibGVtIGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRQcm9ibGVtCi0JaW1wbGVtZW50cyBQcm9ibGVtCi17Ci0JcHJpdmF0ZSBmaW5hbCBOb2RlIHNvdXJjZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlS2V5OwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50czsKLQotCi0JRGVmYXVsdFByb2JsZW0oTm9kZSBzb3VyY2UsIFN0cmluZyBtZXNzYWdlS2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc291cmNlID0gc291cmNlOwotCQl0aGlzLm1lc3NhZ2VLZXkgPSBtZXNzYWdlS2V5OwotCQl0aGlzLm1lc3NhZ2VBcmd1bWVudHMgPSBtZXNzYWdlQXJndW1lbnRzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9ibGVtIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBOb2RlIHNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuc291cmNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgbWVzc2FnZUtleSgpIHsKLQkJcmV0dXJuIHRoaXMubWVzc2FnZUtleTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMubWVzc2FnZUFyZ3VtZW50czsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXZSBpbXBsZW1lbnQgI2VxdWFscyhPYmplY3QpIGJlY2F1c2UgcHJvYmxlbXMgYXJlIHJlcGVhdGVkbHkKLQkgKiByZS1jYWxjdWxhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHByb2JsZW1zIG1lcmdlZCB3aXRoIHRoZSBleGlzdGluZwotCSAqIHNldCBvZiBwcm9ibGVtczsgYW5kIHdlIHdhbnQgdG8ga2VlcCB0aGUgb3JpZ2luYWwgcHJvYmxlbXMgYW5kCi0JICogaWdub3JlIGFueSBmcmVzaGx5LWdlbmVyYXRlZCBkdXBsaWNhdGVzLgotCSAqIEFsc28sIHByb2JsZW1zIGFyZSBub3Qgc2F2ZWQgdG8gZGlzay4uLi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgUHJvYmxlbSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlQcm9ibGVtIG90aGVyID0gKFByb2JsZW0pIG87Ci0JCXJldHVybiB0aGlzLnNvdXJjZSA9PSBvdGhlci5zb3VyY2UoKQotCQkJCSYmIHRoaXMubWVzc2FnZUtleS5lcXVhbHMob3RoZXIubWVzc2FnZUtleSgpKQotCQkJCSYmIEFycmF5cy5lcXVhbHModGhpcy5tZXNzYWdlQXJndW1lbnRzLCBvdGhlci5tZXNzYWdlQXJndW1lbnRzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLnNvdXJjZS5oYXNoQ29kZSgpIF4gdGhpcy5tZXNzYWdlS2V5Lmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5tZXNzYWdlS2V5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL05vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzNjg4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIG1ldGhvZHMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkCi0gKiBieSBhbnkgY2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSB0byBiZSBwYXJ0IG9mIGEgY29udGFpbm1lbnQgaGllcmFyY2h5Ci0gKiB0aGF0IHN1cHBvcnRzIGEgImRpcnR5IiBzdGF0ZSBhbmQgdmFsaWRhdGlvbiAicHJvYmxlbXMiLgotICogCi0gKiBOb3RlOiBNZXRob2RzIG1hcmtlZCAiSU5UUkEtVFJFRSBBUEkiIGFyZSB0eXBpY2FsbHkgb25seSB1c2VkIGJ5Ci0gKiB0aGUgbm9kZXMgdGhlbXNlbHZlcywgYXMgb3Bwb3NlZCB0byBjbGllbnRzIG9mIHRoZSBub2Rlcy4gVGhlc2UKLSAqIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBhIG5vZGUgb24gZWl0aGVyIGl0cyBwYXJlbnQgb3IgaXRzIGNoaWxkcmVuLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBNb2RlbCwgQ29tcGFyYWJsZTxOb2RlPiB7Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LiBUaGUgcGFyZW50IGlzIGltbXV0YWJsZS4KLQkgKiBAc2VlICNjaGlsZHJlbigpCi0JICovCi0JTm9kZSBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkcmVuLCB3aGljaCBhcmUgYWxzbyBub2Rlcy4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqLwotCUl0ZXJhdG9yPE5vZGU+IGNoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQST8KLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5tZW50IGhpZXJhcmNoeSdzIHJvb3Qgbm9kZS4KLQkgKiBNb3N0IG5vZGVzIG11c3QgaGF2ZSBhIHJvb3QuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKi8KLQlOb2RlIHJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JYm9vbGVhbiBpc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQl2b2lkIGFkZEJyYW5jaFJlZmVyZW5jZXNUbyhDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIEFkZCBhbGwgdGhlIG5vZGVzIGluIHRoZSBvYmplY3QncyBicmFuY2ggb2YgdGhlIHRyZWUsCi0JICogaW5jbHVkaW5nIHRoZSBub2RlIGl0c2VsZiwgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIE9ubHkgcmVhbGx5IHVzZWQgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZy4KLQkgKi8KLQl2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2Rlcyk7Ci0KLQotCS8vICoqKioqKioqKiogbW9kZWwgc3luY2hyb25pemF0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW1vdmVkIGZyb20gdGhlIHRyZWUuIFRoZSBub2RlIHJlY2VpdmluZyB0aGlzIG5vdGlmaWNhdGlvbgotCSAqIHNob3VsZCBwZXJmb3JtIGFueSBuZWNlc3NhcnkgdXBkYXRlcyB0byByZW1haW4gaW4gc3luY2gKLQkgKiB3aXRoIHRoZSB0cmVlIChlLmcuIGNsZWFyaW5nIG91dCBvciByZXBsYWNpbmcgYW55IHJlZmVyZW5jZXMKLQkgKiB0byB0aGUgcmVtb3ZlZCBub2RlIG9yIGFueSBvZiB0aGUgcmVtb3ZlZCBub2RlJ3MgZGVzY2VuZGFudHMpLgotCSAqIEBzZWUgI2lzRGVzY2VuZGFudE9mKE5vZGUpCi0JICovCi0Jdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW5hbWVkLiBUaGUgbm9kZSByZWNlaXZpbmcgdGhpcyBub3RpZmljYXRpb24gc2hvdWxkIG1hcmsgaXRzCi0JICogYnJhbmNoIGRpcnR5IGlmIG5lY2Vzc2FyeSAoaS5lLiBpdCByZWZlcmVuY2VzIHRoZSByZW5hbWVkIG5vZGUKLQkgKiBvciBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzKS4gVGhpcyBtZXRob2QgaXMgb2YgcGFydGljdWxhciBjb25jZXJuCi0JICogdG8gSGFuZGxlcy4KLQkgKiBAc2VlICNpc0Rlc2NlbmRhbnRPZihOb2RlKQotCSAqLwotCXZvaWQgbm9kZVJlbmFtZWQoTm9kZSBub2RlKTsKLQkKLQotCS8vICoqKioqKioqKiogZGlydHkgZmxhZyBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBwZXJzaXN0ZW50IGFzcGVjdHMgb2YgdGhlIG5vZGUsCi0JICogb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cywgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBub2RlIGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlib29sZWFuIGlzRGlydHlCcmFuY2goKTsKLQkJU3RyaW5nIERJUlRZX0JSQU5DSF9QUk9QRVJUWSA9ICJkaXJ0eUJyYW5jaCI7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnQgYXMgZGlydHkgYnJhbmNoZXMuCi0JICogVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgZGlydHkuCi0JICovCi0Jdm9pZCBtYXJrQnJhbmNoRGlydHkoKTsKLQotCS8qKgotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgYXMgZGlydHkuCi0JICogVGhpcyBpcyB1c2VkIHdoZW4gdGhlIHNhdmUgbG9jYXRpb24gb2Ygc29tZQotCSAqIHRvcC1sZXZlbCBub2RlIGlzIGNoYW5nZWQgYW5kIHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlIG11c3QgYmUgbWFya2VkIGRpcnR5IHNvIGl0Ci0JICogd2lsbCBiZSB3cml0dGVuIG91dC4KLQkgKi8KLQl2b2lkIG1hcmtFbnRpcmVCcmFuY2hEaXJ0eSgpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBIGNoaWxkIG5vZGUncyBicmFuY2ggaGFzIGJlZW4gbWFya2VkIGNsZWFuLiBJZiB0aGUgbm9kZQotCSAqIGl0c2VsZiBpcyBjbGVhbiBhbmQgaWYgYWxsIG9mIGl0cyBjaGlsZHJlbiBhcmUgYWxzbyBjbGVhbiwgdGhlCi0JICogbm9kZSdzIGJyYW5jaCBjYW4gYmUgbWFya2VkIGNsZWFuLiBUaGVuLCBpZiB0aGUgbm9kZSdzCi0JICogYnJhbmNoIGlzIGNsZWFuLCB0aGUgbm9kZSB3aWxsIG5vdGlmeSBpdHMgcGFyZW50IHRoYXQgaXQgbWlnaHQKLQkgKiBiZSBjbGVhbiBhbHNvLiBUaGlzIG1lc3NhZ2UgaXMgcHJvcGFnYXRlZCB1cCB0aGUgY29udGFpbm1lbnQKLQkgKiB0cmVlIHdoZW4gYSBwYXJ0aWN1bGFyIG5vZGUgYmVjb21lcyBjbGVhbi4KLQkgKi8KLQl2b2lkIG1hcmtCcmFuY2hDbGVhbklmUG9zc2libGUoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogTWFyayB0aGUgbm9kZSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBjbGVhbi4KLQkgKiBUeXBpY2FsbHkgdXNlZCB3aGVuIHRoZSBub2RlIGhhcyBqdXN0IGJlZW4KLQkgKiByZWFkIGluIG9yIHdyaXR0ZW4gb3V0LgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICogTm90IHRoZSBiZXN0IG9mIG1ldGhvZCBuYW1lcy4uLi4gOi0oCi0JICovCi0Jdm9pZCBjYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0KLQotCS8vICoqKioqKioqKiogcHJvYmxlbXMgKioqKioqKioqKgotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBSZXR1cm4gYSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbmV2ZXIgYQotCSAqICJ2YWxpZGF0ZWQiIGFzcGVjdCBvZiB0aGUgbm9kZSB0cmVlIGNoYW5nZXMuCi0JICogVHlwaWNhbGx5IG9ubHkgdGhlIHJvb3Qgbm9kZSBkaXJlY3RseSBob2xkcyBhIHZhbGlkYXRvci4KLQkgKi8KLQlWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXQgYSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbmV2ZXIgYQotCSAqICJ2YWxpZGF0ZWQiIGFzcGVjdCBvZiB0aGUgbm9kZSB0cmVlIGNoYW5nZXMuCi0JICogVHlwaWNhbGx5IG9ubHkgdGhlIHJvb3Qgbm9kZSBkaXJlY3RseSBob2xkcyBhIHZhbGlkYXRvci4KLQkgKi8KLQl2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKTsKLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBpdHMgZGVzY2VuZGFudHMuCi0JICogVGhpcyBpcyBhbiBleHBsaWNpdCByZXF1ZXN0IGludm9rZWQgYnkgYSBjbGllbnQ7IGFuZCBpdCB3aWxsCi0JICogdHlwaWNhbGx5IGJlIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCSAqIAkjYnJhbmNoUHJvYmxlbXMoKQotCSAqIAkjaGFzQnJhbmNoUHJvYmxlbXMoKQotCSAqIFdoZXRoZXIgdGhlIG5vZGUgbWFpbnRhaW5zIGl0cyBwcm9ibGVtcyBvbiB0aGUgZmx5Ci0JICogb3Igd2FpdHMgdW50aWwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGlzIGRldGVybWluZWQgYnkgdGhlCi0JICogaW1wbGVtZW50YXRpb24uCi0JICogQHNlZSBQcm9ibGVtCi0JICovCi0Jdm9pZCB2YWxpZGF0ZUJyYW5jaCgpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBWYWxpZGF0ZSB0aGUgbm9kZSBhbmQgYWxsIG9mIGl0cyBkZXNjZW5kYW50cywKLQkgKiBhbmQgdXBkYXRlIHRoZWlyIHNldHMgb2YgImJyYW5jaCIgcHJvYmxlbXMuCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gb2YgImJyYW5jaCIgcHJvYmxlbXMgaGFzIGNoYW5nZWQuCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OyBpdCBpcyBub3QgZm9yCi0JICogY2xpZW50IHVzZS4KLQkgKi8KLQlib29sZWFuIHZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCUxpc3RJdGVyYXRvcjxQcm9ibGVtPiBicmFuY2hQcm9ibGVtcygpOwotCQlTdHJpbmcgQlJBTkNIX1BST0JMRU1TX0xJU1QgPSAiYnJhbmNoUHJvYmxlbXMiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIGFsbCB0aGUgbm9kZSdzIHByb2JsZW1zIGFsb25nIHdpdGggYWxsIHRoZQotCSAqIG5vZGUncyBkZXNjZW5kYW50cycgcHJvYmxlbXMuCi0JICovCi0JaW50IGJyYW5jaFByb2JsZW1zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cyBoYXZlIHByb2JsZW1zLgotCSAqLwotCWJvb2xlYW4gaGFzQnJhbmNoUHJvYmxlbXMoKTsKLQkJU3RyaW5nIEhBU19CUkFOQ0hfUFJPQkxFTVNfUFJPUEVSVFkgPSAiaGFzQnJhbmNoUHJvYmxlbXMiOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBicmFuY2ggcHJvYmxlbS4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zQnJhbmNoUHJvYmxlbShQcm9ibGVtIHByb2JsZW0pOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBTb21ldGhpbmcgY2hhbmdlZCwgcmVidWlsZCB0aGUgbm9kZSdzIGNvbGxlY3Rpb24gb2YgYnJhbmNoIHByb2JsZW1zLgotCSAqLwotCXZvaWQgcmVidWlsZEJyYW5jaFByb2JsZW1zKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEFkZCB0aGUgbm9kZSdzIHByb2JsZW1zLCBhbmQgYWxsIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMnCi0JICogcHJvYmxlbXMsIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBBIGNhbGwgdG8gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGEgY2FsbCB0bwotCSAqICN2YWxpZGF0ZUJyYW5jaCgpIG9yIGFsbCBvZiB0aGUgcHJvYmxlbXMgbWlnaHQgbm90IGJlCi0JICogYWRkZWQgdG8gdGhlIGxpc3QuCi0JICogQHNlZSBQcm9ibGVtCi0JICovCi0Jdm9pZCBhZGRCcmFuY2hQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gYnJhbmNoUHJvYmxlbXMpOwotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKi8KLQl2b2lkIGNsZWFyQWxsQnJhbmNoUHJvYmxlbXMoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBoYXMgY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqLwotCWJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVzZXIgY29tbWVudCBjb25jZXJuaW5nIHRoZSBub2RlLgotCSAqLwotCVN0cmluZyBjb21tZW50KCk7Ci0JCVN0cmluZyBDT01NRU5UX1BST1BFUlRZID0gImNvbW1lbnQiOwotCi0JLyoqCi0JICogU2V0IHRoZSB1c2VyIGNvbW1lbnQgY29uY2VybmluZyB0aGUgbm9kZS4KLQkgKi8KLQl2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpOwotCi0KLQkvLyAqKioqKioqKioqIGRpc3BsYXlpbmcvc29ydGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsLCBzdWl0YWJsZSBmb3Igc29ydGluZy4KLQkgKi8KLQlTdHJpbmcgZGlzcGxheVN0cmluZygpOwotCi0KLQkvLyAqKioqKioqKioqIHN1Yi1pbnRlcmZhY2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFNpbXBsZSBpbnRlcmZhY2UgZGVmaW5pbmcgYSAicmVmZXJlbmNlIiBiZXR3ZWVuIHR3byBub2Rlcy4KLQkgKiBAc2VlIE5vZGUjYWRkQnJhbmNoUmVmZXJlbmNlc1RvKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCWludGVyZmFjZSBSZWZlcmVuY2UgewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlICJzb3VyY2UiIG5vZGUgb2YgdGhlIHJlZmVyZW5jZSwgaS5lLiB0aGUgbm9kZSB0aGF0Ci0JCSAqIHJlZmVyZW5jZXMgdGhlICJ0YXJnZXQiIG5vZGUuCi0JCSAqLwotCQlOb2RlIHNvdXJjZSgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlICJ0YXJnZXQiIG5vZGUgb2YgdGhlIHJlZmVyZW5jZSwgaS5lLiB0aGUgbm9kZSB0aGF0Ci0JCSAqIGlzIHJlZmVyZW5jZWQgYnkgdGhlICJzb3VyY2UiIG5vZGUuCi0JCSAqLwotCQlOb2RlIHRhcmdldCgpOwotCi0JfQotCi0KLQkvKioKLQkgKiBBIHZhbGlkYXRvciB3aWxsIHZhbGlkYXRlIGEgbm9kZSBhcyBhcHByb3ByaWF0ZS4KLQkgKiBUeXBpY2FsbHkgdGhlIHZhbGlkYXRpb24gd2lsbAotCSAqIAktIG9jY3VyIHdoZW5ldmVyIGEgbm9kZSBoYXMgY2hhbmdlZAotCSAqIAktIGVuY29tcGFzcyB0aGUgZW50aXJlIHRyZWUgY29udGFpbmluZyB0aGUgbm9kZQotCSAqIAktIGV4ZWN1dGUgYXN5bmNocm9ub3VzbHkKLQkgKi8KLQlpbnRlcmZhY2UgVmFsaWRhdG9yIHsKLQotCQkvKioKLQkJICogQSAic2lnbmlmaWNhbnQiIGFzcGVjdCBoYXMgY2hhbmdlZDsKLQkJICogdmFsaWRhdGUgdGhlIG5vZGUgYXMgYXBwcm9wcmlhdGUKLQkJICovCi0JCXZvaWQgdmFsaWRhdGUoKTsKLQotCQkvKioKLQkJICogU3RvcCBhbGwgdmFsaWRhdGlvbiBvZiB0aGUgbm9kZSB1bnRpbCAjcmVzdW1lKCkgaXMgY2FsbGVkLgotCQkgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIGFueSBsb25nLXJ1bm5pbmcKLQkJICogYWN0aW9uIHRoYXQgdHJpZ2dlcnMgbnVtZXJvdXMgY2hhbmdlcyB0byB0aGUgbm9kZS4gQmUgc3VyZSB0bwotCQkgKiBtYXRjaCBhIGNhbGwgdG8gdGhpcyBtZXRob2Qgd2l0aCBhIGNvcnJlc3BvbmRpbmcgY2FsbCB0bwotCQkgKiAjcmVzdW1lKCkuCi0JCSAqLwotCQl2b2lkIHBhdXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFJlc3VtZSB2YWxpZGF0aW9uIG9mIHRoZSBub2RlLiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZQotCQkgKiBjYWxsZWQgYWZ0ZXIgYSBtYXRjaGluZyBjYWxsIHRvICNwYXVzZSgpLgotCQkgKi8KLQkJdm9pZCByZXN1bWUoKTsKLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgaW1wbGVtZW50YXRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmVmZXJlbmNlIGludGVyZmFjZQotCSAqIGRlZmluZWQgYWJvdmUuCi0JICovCi0JcHVibGljIGNsYXNzIFNpbXBsZVJlZmVyZW5jZSBpbXBsZW1lbnRzIFJlZmVyZW5jZSB7Ci0JCXByaXZhdGUgTm9kZSBzb3VyY2U7Ci0JCXByaXZhdGUgTm9kZSB0YXJnZXQ7Ci0JCXB1YmxpYyBTaW1wbGVSZWZlcmVuY2UoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0KSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHRhcmdldCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCQl9Ci0JCXB1YmxpYyBOb2RlIHNvdXJjZSgpIHsKLQkJCXJldHVybiB0aGlzLnNvdXJjZTsKLQkJfQotCQlwdWJsaWMgTm9kZSB0YXJnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXJnZXQ7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNvdXJjZSArICIgPT4gIiArIHRoaXMudGFyZ2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFR5cGljYWwgY29tcGFyYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHNvcnQgYSBjb2xsZWN0aW9uIG9mIG5vZGVzLgotCSAqIFNvcnQgYmFzZWQgb24gZGlzcGxheSBzdHJpbmc6Ci0JICogCS0gaWRlbnRpY2FsIG9iamVjdHMgYXJlIGVxdWFsICh3aGljaCBtZWFucyB0aGF0IGNhbm5vdAotCSAqIAkJY28tZXhpc3QgaW4gYSBTb3J0ZWRTZXQpCi0JICogCS0gdXNlIHRoZSBkZWZhdWx0IGNvbGxhdG9yICh3aGljaCB0eXBpY2FsbHkgaW50ZXJsZWF2ZXMKLQkgKiAJCWxvd2VyLSBhbmQgdXBwZXItY2FzZSBsZXR0ZXJzKQotCSAqIAktIGFsbG93IGR1cGxpY2F0ZSBkaXNwbGF5IHN0cmluZ3MgKGZyb20gZGlmZmVyZW50IG9iamVjdHMpCi0JICogCS0gdHJ5IHRvIHJldHVybiBjb25zaXN0ZW50IHJlc3VsdHMgZm9yIHNhbWUgb2JqZWN0IHBhaXJzCi0JICovCi0JQ29tcGFyYXRvcjxOb2RlPiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQluZXcgQ29tcGFyYXRvcjxOb2RlPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCQkJLy8gZGlzYWxsb3cgZHVwbGljYXRlcyBiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkKLQkJCQlpZiAobm9kZTEgPT0gbm9kZTIpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCi0JCQkJLy8gZmlyc3QgY29tcGFyZSBkaXNwbGF5IHN0cmluZ3MgdXNpbmcgdGhlIGRlZmF1bHQgY29sbGF0b3IKLQkJCQlpbnQgcmVzdWx0ID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKG5vZGUxLmRpc3BsYXlTdHJpbmcoKSwgbm9kZTIuZGlzcGxheVN0cmluZygpKTsKLQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0KLQkJCQkvLyB0aGVuIGNvbXBhcmUgdXNpbmcgb2JqZWN0LWlkCi0JCQkJcmVzdWx0ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobm9kZTEpIC0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobm9kZTIpOwotCQkJCWlmIChyZXN1bHQgIT0gMCkgewotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQotCQkJCS8vIEl0J3MgdW5saWtlbHkgdGhhdCB3ZSBnZXQgdG8gdGhpcyBwb2ludDsgYnV0LCBqdXN0IGluIGNhc2UsIHdlIHdpbGwgcmV0dXJuIC0xLgotCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgaW50cm9kdWNlcyBzb21lIG1pbGQgdW5wcmVkaWN0YWJpbGl0eSB0byB0aGUgc29ydCBvcmRlcgotCQkJCS8vICh1bmxlc3MgdGhlIG9iamVjdHMgYXJlIGFsd2F5cyBwYXNzZWQgaW50byB0aGlzIG1ldGhvZCBpbiB0aGUgc2FtZSBvcmRlcikuCi0JCQkJcmV0dXJuIC0xOwkJLy8gaWYgYWxsIGVsc2UgZmFpbHMsIGluZGljYXRlIHRoYXQgbzEgPCBvMgotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiTm9kZS5ERUZBVUxUX0NPTVBBUkFUT1IiOwotCQkJfQotCQl9OwotCi0KLQkvKioKLQkgKiBUaGlzIHZhbGlkYXRvciBkb2VzIG5vdGhpbmcgdG8gdmFsaWRhdGUgdGhlIG5vZGUuCi0JICovCi0JVmFsaWRhdG9yIE5VTExfVkFMSURBVE9SID0KLQkJbmV3IFBsdWdnYWJsZVZhbGlkYXRvcihQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUuTnVsbC5pbnN0YW5jZSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJOb2RlLk5VTExfVkFMSURBVE9SIjsKLQkJCX0KLQkJfTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvUGx1Z2dhYmxlVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9QbHVnZ2FibGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0ZjhhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9QbHVnZ2FibGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFZhbGlkYXRvciBpbnRlcmZhY2UgaW1wbGVtZW50cyB0aGUKLSAqIHBhdXNlL3Jlc3VtZSBwb3J0aW9uIG9mIHRoZSBwcm90b2NvbCwgYnV0IGRlbGVnYXRlcyB0aGUgYWN0dWFsCi0gKiB2YWxpZGF0aW9uIHRvIGEgInBsdWdnYWJsZSIgZGVsZWdhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnZ2FibGVWYWxpZGF0b3IKLQlpbXBsZW1lbnRzIE5vZGUuVmFsaWRhdG9yCi17Ci0JcHJpdmF0ZSBib29sZWFuIHBhdXNlOwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZU9uUmVzdW1lOwotCXByaXZhdGUgZmluYWwgRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIGZhY3RvcnkgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZS5WYWxpZGF0b3IgYnVpbGRBc3luY2hyb25vdXNWYWxpZGF0b3IoU3luY2hyb25pemVkQm9vbGVhbiB2YWxpZGF0ZUZsYWcpIHsKLQkJcmV0dXJuIG5ldyBQbHVnZ2FibGVWYWxpZGF0b3IobmV3IEFzeW5jaHJvbm91c1ZhbGlkYXRvcih2YWxpZGF0ZUZsYWcpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBmYWN0b3J5IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUuVmFsaWRhdG9yIGJ1aWxkU3luY2hyb25vdXNWYWxpZGF0b3IoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBuZXcgUGx1Z2dhYmxlVmFsaWRhdG9yKG5ldyBTeW5jaHJvbm91c1ZhbGlkYXRvcihub2RlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdmFsaWRhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBkZWxlZ2F0ZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2dhYmxlVmFsaWRhdG9yKERlbGVnYXRlIGRlbGVnYXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGF1c2UgPSBmYWxzZTsKLQkJdGhpcy52YWxpZGF0ZU9uUmVzdW1lID0gZmFsc2U7Ci0JCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCWlmICh0aGlzLnBhdXNlKSB7Ci0JCQl0aGlzLnZhbGlkYXRlT25SZXN1bWUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJdGhpcy5kZWxlZ2F0ZS52YWxpZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHBhdXNlKCkgewotCQlpZiAodGhpcy5wYXVzZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWxyZWFkeSBwYXVzZWQiKTsKLQkJfQotCQl0aGlzLnBhdXNlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzdW1lKCkgewotCQlpZiAoICEgdGhpcy5wYXVzZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IHBhdXNlZCIpOwotCQl9Ci0JCXRoaXMucGF1c2UgPSBmYWxzZTsKLQkJLy8gdmFsaWRhdGUgYW55IGNoYW5nZXMgdGhhdCBvY2N1cnJlZCB3aGlsZSB0aGUgdmFsaWRhdGlvbiB3YXMgcGF1c2VkCi0JCWlmICh0aGlzLnZhbGlkYXRlT25SZXN1bWUpIHsKLQkJCXRoaXMudmFsaWRhdGVPblJlc3VtZSA9IGZhbHNlOwotCQkJdGhpcy5kZWxlZ2F0ZS52YWxpZGF0ZSgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kZWxlZ2F0ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGFueSBkZWxlZ2F0ZXMgb2YgYSBwbHVnZ2FibGUgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgRGVsZWdhdGUgewotCi0JCS8qKgotCQkgKiBUaGUgdmFsaWRhdG9yIGlzIG5vdCAicGF1c2VkIiAtIHBlcmZvcm0gdGhlIGFwcHJvcHJpYXRlIHZhbGlkYXRpb24uCi0JCSAqLwotCQl2b2lkIHZhbGlkYXRlKCk7Ci0KLQotCQkvKioKLQkJICogVGhpcyBkZWxlZ2F0ZSBkb2VzIG5vdGhpbmcuCi0JCSAqLwotCQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgRGVsZWdhdGUgewotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBEZWxlZ2F0ZSBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlwdWJsaWMgc3RhdGljIERlbGVnYXRlIGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgTnVsbCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiUGx1Z2dhYmxlVmFsaWRhdG9yLkRlbGVnYXRlLk51bGwiOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1Byb2JsZW0uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1Byb2JsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4ZTczMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Qcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0KLS8qKgotICogRGVmaW5lIGFuIGludGVyZmFjZSBkZXNjcmliaW5nIHRoZSBwcm9ibGVtcyBhc3NvY2lhdGVkIHdpdGggYSBub2RlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2JsZW0gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBub2RlIG1vc3QgY2xvc2VseSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2JsZW0uCi0JICovCi0JTm9kZSBzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGtleSB0aGF0IGNhbiBiZSB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBwcm9ibGVtJ3MgbWVzc2FnZS4KLQkgKi8KLQlTdHJpbmcgbWVzc2FnZUtleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcmd1bWVudHMgYXNzb2NpYXRlIHdpdGggdGhlIHByb2JsZW0ncyBtZXNzYWdlLgotCSAqLwotCU9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9ibGVtIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIEl0IGlzIGVxdWFsIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JICogUHJvYmxlbSBpbnRlcmZhY2UgYW5kIGl0cyBzb3VyY2UsIG1lc3NhZ2Uga2V5LCBhbmQgbWVzc2FnZQotCSAqIGFyZ3VtZW50cyBhcmUgYWxsIGVxdWFsIHRvIHRoaXMgcHJvYmxlbSdzLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvYmxlbSdzIGhhc2ggY29kZSwgd2hpY2ggc2hvdWxkIGNhbGN1bGF0ZWQgYXMgYW4KLQkgKiBYT1Igb2YgdGhlIHNvdXJjZSdzIGhhc2ggY29kZSBhbmQgdGhlIG1lc3NhZ2Uga2V5J3MgaGFzaCBjb2RlLgotCSAqLwotCWludCBoYXNoQ29kZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9SdW5uYWJsZVZhbGlkYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1J1bm5hYmxlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjM0MDEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1J1bm5hYmxlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgUnVubmFibGUgd2lsbCBhc3luY2hyb25vdXNseSB2YWxpZGF0ZQotICogYSBicmFuY2ggb2Ygbm9kZXMuIEl0IHdpbGwgd2FpdCB1bnRpbCBhIHNoYXJlZCAidmFsaWRhdGUiIGZsYWcgaXMKLSAqIHNldCB0byB2YWxpZGF0ZSB0aGUgYnJhbmNoLiBPbmNlIHRoZSB0aGUgYnJhbmNoIGlzIHZhbGlkYXRlZCwKLSAqIHRoZSB0aHJlYWQgd2lsbCBxdWllc2NlIHVudGlsIHRoZSBmbGFnIGlzIHNldCBhZ2Fpbi4KLSAqIAotICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIHN0b3AgdGhpcyB0aHJlYWQ6Ci0gKiAJLSBUaHJlYWQuaW50ZXJydXB0KCkKLSAqIAktIHNldCB0aGUgImNvbnRpbnVlIiBmbGFnIHRvIGZhbHNlCi0gKiBGb3Igbm93LCB0aGVzZSB0d28gYXJlIGVxdWl2YWxlbnQ7IGJ1dCBpbiB0aGUgZnV0dXJlIHdlIG1pZ2h0Ci0gKiBwYXNzIHRoZSAiY29udGludWUiIGZsYWcgdG8gdGhlIE5vZGUudmFsaWRhdGVCcmFuY2goKQotICogbWV0aG9kIHNvIHdlIGNhbiBzaG9ydC1jaXJjdWl0IHRoZSB2YWxpZGF0aW9uIGluc3RlYWQgb2Ygd2FpdGluZwotICogdW50aWwgdGhlIGVudGlyZSBicmFuY2ggaXMgdmFsaWRhdGVkLgotICovCi1wdWJsaWMgY2xhc3MgUnVubmFibGVWYWxpZGF0aW9uCi0JaW1wbGVtZW50cyBSdW5uYWJsZQotewotCS8qKiBUaGUgbm9kZSB3aG9zZSBicmFuY2ggdGhpcyB0aHJlYWQgd2lsbCB2YWxpZGF0ZS4gKi8KLQlwcml2YXRlIGZpbmFsIE5vZGUgbm9kZTsKLQotCS8qKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgd2Uga2ljayBvZmYgdGhlIHZhbGlkYXRpb24gcm91dGluZS4gKi8KLQlwcml2YXRlIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnOwotCi0JLyoqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0byBmYWxzZSwgd2UgYWxsb3cgdGhpcyB0aHJlYWQgdG8gZGllLiAqLwotCXByaXZhdGUgZmluYWwgU3luY2hyb25pemVkQm9vbGVhbiBjb250aW51ZUZsYWc7Ci0KLQkvKiogTG9nIGFueSBleGNlcHRpb25zIGVuY291bnRlcmVkIGR1cmluZyB2YWxpZGF0aW9uIHdpdGggdGhlIGZvbGxvd2luZyBzZXR0aW5ncy4gKi8KLQlwcml2YXRlIGZpbmFsIExvZ2dlciBleGNlcHRpb25Mb2dnZXI7Ci0JcHJpdmF0ZSBmaW5hbCBMZXZlbCBleGNlcHRpb25MZXZlbDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBleGNlcHRpb25NZXNzYWdlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB2YWxpZGF0aW9uIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgUnVubmFibGVWYWxpZGF0aW9uKAotCQkJTm9kZSBub2RlLAotCQkJU3luY2hyb25pemVkQm9vbGVhbiB2YWxpZGF0ZUZsYWcsCi0JCQlTeW5jaHJvbml6ZWRCb29sZWFuIGNvbnRpbnVlRmxhZywKLQkJCUxvZ2dlciBleGNlcHRpb25Mb2dnZXIsCi0JCQlMZXZlbCBleGNlcHRpb25MZXZlbCwKLQkJCVN0cmluZyBleGNlcHRpb25NZXNzYWdlCi0JKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubm9kZSA9IG5vZGU7Ci0JCXRoaXMudmFsaWRhdGVGbGFnID0gdmFsaWRhdGVGbGFnOwotCQl0aGlzLmNvbnRpbnVlRmxhZyA9IGNvbnRpbnVlRmxhZzsKLQkJdGhpcy5leGNlcHRpb25Mb2dnZXIgPSBleGNlcHRpb25Mb2dnZXI7Ci0JCXRoaXMuZXhjZXB0aW9uTGV2ZWwgPSBleGNlcHRpb25MZXZlbDsKLQkJdGhpcy5leGNlcHRpb25NZXNzYWdlID0gZXhjZXB0aW9uTWVzc2FnZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUnVubmFibGUgSW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogTG9vcCB3aGlsZSB0aGUgImNvbnRpbnVlIiBmbGFnIGlzIHRydWUgYW5kIHRoZSB0aHJlYWQKLQkgKiBoYXMgbm90IGJlZW4gaW50ZXJydXB0ZWQgYnkgYW5vdGhlciB0aHJlYWQuCi0JICogSW4gZWFjaCBsb29wOiBXYWl0IHVudGlsIHRoZSAidmFsaWRhdGUiIGZsYWcgaXMgc2V0IHRvIHRydWUsCi0JICogdGhlbiBzZXQgaXQgYmFjayB0byBmYWxzZSBhbmQgdmFsaWRhdGUgdGhlIGJyYW5jaCBvZiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXdoaWxlICh0aGlzLmNvbnRpbnVlRmxhZy5pc1RydWUoKSkgewotCQkJdHJ5IHsKLQkJCQl0aGlzLnZhbGlkYXRlRmxhZy53YWl0VG9TZXRGYWxzZSgpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyB3ZSB3ZXJlIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcsIG11c3QgYmUgcXVpdHRpbicgdGltZQotCQkJCXJldHVybjsKLQkJCX0KLQkJCXRoaXMudmFsaWRhdGVOb2RlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgbm9kZSwgbG9nZ2luZyBhbnkgZXhjZXB0aW9ucy4KLQkgKiBJZiBhbiBleGNlcHRpb24gb2NjdXJzLCB3ZSB0ZXJtaW5hdGUgdGhlIHZhbGlkYXRpb24gdW50aWwgdGhlCi0JICogInZhbGlkYXRpb24iIGZsYWcgaXMgc2V0IGFnYWluLiBTb21lIGV4Y2VwdGlvbnMgb2NjdXIgYmVjYXVzZQotCSAqIG9mIGNvbmN1cnJlbnQgY2hhbmdlcyB0byB0aGUgbW9kZWwgdGhhdCBvY2N1ciAqYWZ0ZXIqIHZhbGlkYXRpb24KLQkgKiBzdGFydHMgYnV0IGJlZm9yZSBpdCBjb21wbGV0ZXMgYW4gZW50aXJlIHBhc3Mgb3ZlciB0aGUgbW9kZWwuIElmIHRoYXQKLQkgKiBpcyB0aGUgY2FzZSwgdGhpbmdzIHNob3VsZCBiZSBPSzsgYmVjYXVzZSB0aGUgZXhjZXB0aW9uIHdpbGwgYmUKLQkgKiBjYXVnaHQgYW5kIHRoZSAidmFsaWRhdGlvbiIgZmxhZyB3aWxsIGhhdmUgYmVlbiBzZXQgYWdhaW4gKmR1cmluZyogdGhlCi0JICogaW5pdGlhbCB2YWxpZGF0aW9uIHBhc3MuIFNvIHdoZW4gd2UgcmV0dXJuIGZyb20gY2F0Y2hpbmcgdGhlIGV4Y2VwdGlvbgotCSAqIHdlIHdpbGwgc2ltcGx5IHJlLXN0YXJ0IHRoZSB2YWxpZGF0aW9uLCBob3BlZnVsbHkgd2l0aCB0aGUgbW9kZWwgaW4KLQkgKiBhIGNvbnNpc3RlbnQgc3RhdGUgdGhhdCB3aWxsIHByZXZlbnQgYW5vdGhlciBleGNlcHRpb24gZnJvbQotCSAqIG9jY3VycmluZy4gT2YgY291cnNlLCBpZiB3ZSBoYXZlIGFueSBleGNlcHRpb25zIHRoYXQgYXJlICpub3QqCi0JICogdGhlIHJlc3VsdCBvZiB0aGUgbW9kZWwgYmVpbmcgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCB3ZSB3aWxsCi0JICogcHJvYmFibHkgZmlsbCB0aGUgbG9nOyBhbmQgdGhvc2UgZXhjZXB0aW9ucyBhcmUgYnVncyB0aGF0IG5lZWQKLQkgKiB0byBiZSBmaXhlZC4gKCEpIEhvcGVmdWxseSB0aGUgdXNlciB3aWxsIG5vdGljZSB0aGUgZW5vcm1vdXMgbG9nIGFuZAotCSAqIGNvbnRhY3Qgc3VwcG9ydC4uLi4gIH5ianYKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVOb2RlKCkgewotCQl0cnkgewotCQkJdGhpcy5ub2RlLnZhbGlkYXRlQnJhbmNoKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJdGhpcy5sb2dFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2UgbmVlZCB0byBkbyBhbGwgdGhpcyBiZWNhdXNlIExvZ2dlciNsb2coTG9nUmVjb3JkKSBkb2VzIG5vdCBwYXNzIHRocm91Z2gKLQkgKiBMb2dnZXIjZG9Mb2coTG9nUmVjb3JkKSBsaWtlIGFsbCB0aGUgb3RoZXIgTG9nZ2VyI2xvZyguLi4pIG1ldGhvZHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXgpIHsKLQkJTG9nUmVjb3JkIGxvZ1JlY29yZCA9IG5ldyBMb2dSZWNvcmQodGhpcy5leGNlcHRpb25MZXZlbCwgdGhpcy5leGNlcHRpb25NZXNzYWdlKTsKLQkJbG9nUmVjb3JkLnNldFBhcmFtZXRlcnMobmV3IE9iamVjdFtdIHsgdGhpcy5ub2RlLmRpc3BsYXlTdHJpbmcoKSB9KTsKLQkJbG9nUmVjb3JkLnNldFRocm93bihleCk7Ci0JCWxvZ1JlY29yZC5zZXRMb2dnZXJOYW1lKHRoaXMuZXhjZXB0aW9uTG9nZ2VyLmdldE5hbWUoKSk7Ci0JCWxvZ1JlY29yZC5zZXRSZXNvdXJjZUJ1bmRsZSh0aGlzLmV4Y2VwdGlvbkxvZ2dlci5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKLQkJdGhpcy5leGNlcHRpb25Mb2dnZXIubG9nKGxvZ1JlY29yZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9TeW5jaHJvbm91c1ZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvU3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlNmI4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9TeW5jaHJvbm91c1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGx1Z2dhYmxlVmFsaWRhdG9yLkRlbGVnYXRlIGludGVyZmFjZQotICogd2lsbCB2YWxpZGF0ZSB0aGUgbm9kZSBpbW1lZGlhdGVseS4KLSAqIAotICogVGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBpbiBhIHNpbmdsZSB0aHJlYWQgb3IgZ2VuZXJhdGluZwotICogcHJvYmxlbSByZXBvcnRzLgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25vdXNWYWxpZGF0b3IKLQlpbXBsZW1lbnRzIFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZQotewotCXByaXZhdGUgZmluYWwgTm9kZSBub2RlOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdmFsaWRhdG9yIHRoYXQgd2lsbCBpbW1lZGlhdGVseSB2YWxpZGF0ZSB0aGUKLQkgKiBzcGVjaWZpZWQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25vdXNWYWxpZGF0b3IoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubm9kZSA9IG5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCXRoaXMubm9kZS52YWxpZGF0ZUJyYW5jaCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubm9kZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWJlMjYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGEgY2xpZW50IHRvIGJldHRlciBjb250cm9sIHRoZSBwZXJmb3JtYW5jZSBvZgotICogYSBjb21ibyBib3ggbW9kZWwgYnkgYWxsb3dpbmcgdGhlIGNsaWVudCB0byBzcGVjaWZ5IHdoZW4gaXQgaXMKLSAqIGFjY2VwdGFibGUgZm9yIHRoZSBtb2RlbCB0byAiY2FjaGUiIGFuZCAidW5jYWNoZSIgaXRzIGxpc3Qgb2YgZWxlbWVudHMuCi0gKiBUaGUgbW9kZWwgbWF5IGlnbm9yZSB0aGVzZSBoaW50cyBpZiBhcHByb3ByaWF0ZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBleHRlbmRzIENvbWJvQm94TW9kZWwgewotICAgIAotICAgIC8qKgotICAgICAqIENhY2hlIHRoZSBjb21ib0JveE1vZGVsIExpc3QuICBJZiB5b3UgY2FsbCB0aGlzLCB5b3UKLSAgICAgKiBtdXN0IG1ha2Ugc3VyZSB0byBjYWxsIHVuY2FjaGVMaXN0KCkgYXMgd2VsbC4gIE90aGVyd2lzZQotICAgICAqIHN0YWxlIGRhdGEgd2lsbCBiZSBpbiB0aGUgQ29tYm9Cb3ggdW50aWwgY2FjaGVMaXN0KCkgaXMgCi0gICAgICogY2FsbGVkIGFnYWluIG9yIHVuY2FjaGVMaXN0KCkgaXMgY2FsbGVkLgotICAgICAqLwotICAgIHZvaWQgY2FjaGVMaXN0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGNhY2hlZCBsaXN0LiAgTmV4dCB0aW1lIHRoZSBsaXN0IGlzIG5lZWRlZCBpdCB3aWxsCi0gICAgICogYmUgYnVpbHQgd2hlbiBpdCBpcyBub3QgY2FjaGVkLgotICAgICAqLwotICAgIHZvaWQgdW5jYWNoZUxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgbGlzdCBpcyBhbHJlYWR5IGNhY2hlZC4gIFRoaXMgY2FuIGJlIHVzZWQgZm9yIAotICAgICAqIE1vdXNlRXZlbnRzLCBzaW5jZSB0aGV5IGFyZSBub3QgdGVycmlibHkgcHJlZGljdGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0NhY2hlZCgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiZDM3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCi0vKioKLSAqIE1ha2UgdGhlIGNlbGwgbG9vayBsaWtlIGEgY2hlY2sgYm94LgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgewotCi0JLyoqIHRoZSBjb21wb25lbnQgdXNlZCB0byBwYWludCB0aGUgY2VsbCAqLwotCXByaXZhdGUgZmluYWwgSkNoZWNrQm94IGNoZWNrQm94OwotCQotCS8qKiB0aGUgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgb24gYW4gaW1tZWRpYXRlIGVkaXQgKi8KLQlwcm90ZWN0ZWQgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgaW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCi0JLyoqICJub3JtYWwiIGJvcmRlciAtIGFzc3VtZSB0aGUgZGVmYXVsdCB0YWJsZSAiZm9jdXMiIGJvcmRlciBpcyAxIHBpeGVsIHRoaWNrICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIE5PX0ZPQ1VTX0JPUkRFUiA9IEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMSwgMSwgMSwgMSk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCBubyBsYWJlbCBvciBpY29uLgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmNoZWNrQm94ID0gdGhpcy5idWlsZENoZWNrQm94KCk7Ci0JCS8vIGJ5IGRlZmF1bHQsIGNoZWNrIGJveGVzIGRvIG5vdCBwYWludCB0aGVpciBib3JkZXJzCi0JCXRoaXMuY2hlY2tCb3guc2V0Qm9yZGVyUGFpbnRlZCh0cnVlKTsKLQkJLy8gdGhpcyBzZXR0aW5nIGlzIHJlY29tbWVuZGVkIGZvciBjaGVjayBib3hlcyBpbnNpZGUgb2YgdHJlZXMgYW5kIHRhYmxlcwotCQl0aGlzLmNoZWNrQm94LnNldEJvcmRlclBhaW50ZWRGbGF0KHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHQgYW5kIGljb24sCi0JICogZWl0aGVyIG9mIHdoaWNoIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKFN0cmluZyB0ZXh0LCBJY29uIGljb24pIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldFRleHQodGV4dCk7Ci0JCXRoaXMuc2V0SWNvbihpY29uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXModGV4dCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB3aXRoIHRoZSBzcGVjaWZpZWQgaWNvbi4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcihJY29uIGljb24pIHsKLQkJdGhpcyhudWxsLCBpY29uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkNoZWNrQm94IGJ1aWxkQ2hlY2tCb3goKSB7Ci0JCUpDaGVja0JveCBjYiA9IG5ldyBKQ2hlY2tCb3goKTsKLQkJY2IuYWRkQWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZEFjdGlvbkxpc3RlbmVyKCkpOwotCQlyZXR1cm4gY2I7Ci0JfQotCQotCXByaXZhdGUgQWN0aW9uTGlzdGVuZXIgYnVpbGRBY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKENoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyLmltbWVkaWF0ZUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkgICAgdGhpcy5jaGVja0JveC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KFN3aW5nQ29uc3RhbnRzLkNFTlRFUik7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Q29tcG9uZW50T3JpZW50YXRpb24odGFibGUuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwotCQl0aGlzLmNoZWNrQm94LnNldEVuYWJsZWQodGFibGUuaXNFbmFibGVkKCkpOwotCi0JCXRoaXMuY2hlY2tCb3guc2V0Rm9yZWdyb3VuZCh0aGlzLmZvcmVncm91bmRDb2xvcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJdGhpcy5jaGVja0JveC5zZXRCYWNrZ3JvdW5kKHRoaXMuYmFja2dyb3VuZENvbG9yKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCQkvLyBvbmNlIHRoZSBjb2xvcnMgYXJlIHNldCwgY2FsY3VsYXRlIG9wYXF1ZSBzZXR0aW5nCi0JCXRoaXMuY2hlY2tCb3guc2V0T3BhcXVlKHRoaXMuY2VsbElzT3BhcXVlSW4odGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Qm9yZGVyKHRoaXMuYm9yZGVyKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCi0JCXRoaXMuc2V0VmFsdWUodmFsdWUpOwotCQlyZXR1cm4gdGhpcy5jaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBmb3JlZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBmb3JlZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZm9jdXNDZWxsRm9yZWdyb3VuZCIpOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0Rm9yZWdyb3VuZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRDb2xvcihKVGFibGUgdGFibGUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWlmIChoYXNGb2N1cyAmJiB0YWJsZS5pc0NlbGxFZGl0YWJsZShyb3csIGNvbHVtbikpIHsKLQkJCQlyZXR1cm4gVUlNYW5hZ2VyLmdldENvbG9yKCJUYWJsZS5mb2N1c0NlbGxCYWNrZ3JvdW5kIik7Ci0JCQl9Ci0JCQlyZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpOwotCQl9Ci0JCXJldHVybiB0YWJsZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYm9yZGVyLgotCSAqLwotCXByb3RlY3RlZCBCb3JkZXIgYm9yZGVyKEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBoYXNGb2N1cyA/ICBVSU1hbmFnZXIuZ2V0Qm9yZGVyKCJUYWJsZS5mb2N1c0NlbGxIaWdobGlnaHRCb3JkZXIiKSA6IE5PX0ZPQ1VTX0JPUkRFUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY2VsbCBzaG91bGQgYmUgb3BhcXVlIGluIHRoZSB0YWJsZS4KLQkgKiBJZiB0aGUgY2VsbCdzIGJhY2tncm91bmQgaXMgdGhlIHNhbWUgYXMgdGhlIHRhYmxlJ3MgYmFja2dyb3VuZAotCSAqIGFuZCB0YWJsZSBpcyBvcGFxdWUsIHdlIGRvbid0IG5lZWQgdG8gcGFpbnQgdGhlIGJhY2tncm91bmQgLQotCSAqIHRoZSB0YWJsZSB3aWxsIGRvIGl0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNlbGxJc09wYXF1ZUluKEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCUNvbG9yIGNlbGxCYWNrZ3JvdW5kID0gdGhpcy5jaGVja0JveC5nZXRCYWNrZ3JvdW5kKCk7Ci0JCUNvbG9yIHRhYmxlQmFja2dyb3VuZCA9IHRhYmxlLmdldEJhY2tncm91bmQoKTsKLQkJcmV0dXJuICEgKHRhYmxlLmlzT3BhcXVlKCkgJiYgY2VsbEJhY2tncm91bmQuZXF1YWxzKHRhYmxlQmFja2dyb3VuZCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY2hlY2sgYm94J3MgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIENSIzM5OTkzMTggLSBUaGlzIG51bGwgY2hlY2sgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIEpESyBidWcgaXMgZml4ZWQKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQl0aGlzLmNoZWNrQm94LnNldFNlbGVjdGVkKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuY2hlY2tCb3guaXNTZWxlY3RlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIGNoZWNrIGJveCdzIHRleHQ7IHdoaWNoIGJ5IGRlZmF1bHQgaXMgYmxhbmsuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLmNoZWNrQm94LnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjaGVjayBib3gncyBpY29uOyB3aGljaCBieSBkZWZhdWx0IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb24oSWNvbiBpY29uKSB7Ci0JCXRoaXMuY2hlY2tCb3guc2V0SWNvbihpY29uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbmRlcmVyJ3MgcHJlZmVycmVkIGhlaWdodC4gVGhpcyBhbGxvd3MgeW91Ci0JICogdG8gc2V0IHRoZSB0YWJsZSdzIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBjaGVjayBib3gKLQkgKiB3aWxsIGxvb2sgZ29vZCBpbi4uLi4KLQkgKi8KLQlwdWJsaWMgaW50IHByZWZlcnJlZEhlaWdodCgpIHsKLQkJLy8gYWRkIGluIHNwYWNlIGZvciB0aGUgYm9yZGVyIHRvcCBhbmQgYm90dG9tCi0JCXJldHVybiAoaW50KSB0aGlzLmNoZWNrQm94LmdldFByZWZlcnJlZFNpemUoKS5nZXRIZWlnaHQoKSArIDI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkYjgyYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Qb3B1cE1lbnVFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Qb3B1cE1lbnVMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci0KLS8qKgotICogTWFrZSB0aGUgY2VsbCBsb29rIGxpa2UgYSBjb21iby1ib3guCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudHMgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciB7Ci0KLQkvKiBjYWNoaW5nIHRoZSBjb21ibyBib3ggYmVjYXVzZSB3ZSBhcmUgY2FjaGluZyB0aGUgY29tYm9Cb3hNb2RlbC4KLQkgKiBFdmVyeXRpbWUgd2UgcmVidWlsdCB0aGUgY29tYm9Cb3ggd2Ugd291bGQgc2V0IHRoZSBtb2RlbCBvbiBpdCBhbmQgbm90Ci0JICogcmVtb3ZlIHRoZSBtb2RlbCBmcm9tIHRoZSBvbGQgY29tYm8gYm94LiAgVGhpcyBtZWFudCB0aGF0IG5ldyBsaXN0ZW5lcnMKLQkgKiBrZXB0IGJlaW5nIGFkZGVkIHRvIHRoZSBjb21ib0JveE1vZGVsIGZvciBldmVyeSBjb21ib0JveCBidWlsZC4KLQkgKiBOb3Qgc3VyZSBpZiB0aGVyZSBpcyBhIHdheSB0byBjbGVhciBvdXQgdGhlIG9sZCBjb21ibyBib3gsIG9yIHdoeQotCSAqIHdlIHdlcmUgYnVpbGRpZyBhIG5ldyBjb21ibyBib3ggZXZlcnkgdGltZSBzbyBJIHdlbnQgd2l0aCBjYWNoaW5nIGl0LgotCSAqLwotCXByaXZhdGUgSkNvbWJvQm94IGNvbWJvQm94OwotCQotCS8qKiB0aGUgaXRlbXMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgY29tYm8gYm94ICovCi0JcHJpdmF0ZSBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBtb2RlbDsKLQlwcml2YXRlIExpc3RDZWxsUmVuZGVyZXIgcmVuZGVyZXI7Ci0JT2JqZWN0IHZhbHVlOwotCXByaXZhdGUgc3RhdGljIGludCBoZWlnaHQgPSAtMTsKLQlib29sZWFuIGZha2VGb2N1c0ZsYWc7Ci0KLQkvKiogdGhlIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIG9uIGFuIGltbWVkaWF0ZSBlZGl0ICovCi0JcHJvdGVjdGVkIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyIGltbWVkaWF0ZUVkaXRMaXN0ZW5lcjsKLQkKLQkvKiogaG9sZCB0aGUgb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBjb21iby1ib3ggKi8KLQlwcml2YXRlIHN0YXRpYyBDb2xvciBkZWZhdWx0Rm9yZWdyb3VuZDsKLQlwcml2YXRlIHN0YXRpYyBDb2xvciBkZWZhdWx0QmFja2dyb3VuZDsKLQotCS8qKiAibm9ybWFsIiBib3JkZXIgLSBhc3N1bWUgdGhlIGRlZmF1bHQgdGFibGUgImZvY3VzIiBib3JkZXIgaXMgMSBwaXhlbCB0aGljayAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvcmRlciBOT19GT0NVU19CT1JERVIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDEsIDEsIDEsIDEpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY29tYm8tYm94IG1vZGVsLgotCSAqLwotCXB1YmxpYyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKENvbWJvQm94TW9kZWwgbW9kZWwpIHsKLQkJdGhpcyhuZXcgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwobW9kZWwpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjYWNoaW5nIGNvbWJvLWJveCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcihDYWNoaW5nQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQl0aGlzKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogY29tYm8tYm94IG1vZGVsIGFuZCByZW5kZXJlci4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcihDb21ib0JveE1vZGVsIG1vZGVsLCBMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMobmV3IE5vbkNhY2hpbmdDb21ib0JveE1vZGVsKG1vZGVsKSwgcmVuZGVyZXIpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogY2FjaGluZyBjb21iby1ib3ggbW9kZWwgYW5kIHJlbmRlcmVyLgotCSAqLwotCXB1YmxpYyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsLCBMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMobW9kZWwpOwotCQl0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gc2F2ZSB0aGUgb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBjb21iby1ib3gsIHNvIHdlCi0JCS8vIGNhbiB1c2UgdGhlbSB0byBwYWludCBub24tc2VsZWN0ZWQgY2VsbHMKLQkJaWYgKGhlaWdodCA9PSAtMSkgewotCQkJSkNvbWJvQm94IGNiID0gbmV3IEpDb21ib0JveCgpOwotCQkJY2IuYWRkSXRlbSgibSIpOwotCi0JCQkvLyBhZGQgaW4gc3BhY2UgZm9yIHRoZSBib3JkZXIgdG9wIGFuZCBib3R0b20KLQkJCWhlaWdodCA9IGNiLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQgKyAyOwotCi0JCQlkZWZhdWx0Rm9yZWdyb3VuZCA9IGNiLmdldEZvcmVncm91bmQoKTsKLQkJCWRlZmF1bHRCYWNrZ3JvdW5kID0gY2IuZ2V0QmFja2dyb3VuZCgpOwotCQl9Ci0JfQotCi0gICAgc3RhdGljIEpMYWJlbCBwcm90b3R5cGVMYWJlbCA9IG5ldyBKTGFiZWwoIlByb3RvdHlwZSIsIG5ldyBFbXB0eUljb24oMTYpLCBTd2luZ0NvbnN0YW50cy5MRUFESU5HKTsKLQotICAgIHByb3RlY3RlZCBKQ29tYm9Cb3ggYnVpbGRDb21ib0JveCgpIHsKLQotCQlmaW5hbCBKQ29tYm9Cb3ggcmVzdWx0ID0gbmV3IEpDb21ib0JveCgpIHsKLQkJCXByaXZhdGUgYm9vbGVhbiBmYWtlRm9jdXM7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotCQkJCXJldHVybiBmYWtlRm9jdXMgfHwgc3VwZXIuaGFzRm9jdXMoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgewotCQkJCWZha2VGb2N1cyA9IENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy5mYWtlRm9jdXNGbGFnOwotCQkJCXN1cGVyLnBhaW50KGcpOwotCQkJCWZha2VGb2N1cyA9IGZhbHNlOwotCQkJfQotCQkJLy93cmFwIHRoZSByZW5kZXJlciB0byBkZWFsIHdpdGggdGhlIHByb3RvdHlwZURpc3BsYXlWYWx1ZQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRSZW5kZXJlcihmaW5hbCBMaXN0Q2VsbFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQkgICAgICAgIHN1cGVyLnNldFJlbmRlcmVyKG5ldyBMaXN0Q2VsbFJlbmRlcmVyKCl7Ci0JCSAgICAgICAgICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChKTGlzdCBsaXN0LCBPYmplY3QgdiwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCSAgICAgICAgICAgICAgICBpZiAodiA9PSBwcm90b3R5cGVMYWJlbCkgewotCQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm90b3R5cGVMYWJlbDsKLQkJICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgIHJldHVybiBhUmVuZGVyZXIuZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChsaXN0LCB2LCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLQkJICAgICAgICAgICAgfQotCQkgICAgICAgIH0pOwotCQkgICAgfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGdldFNlbGVjdGVkSW5kZXgoKSB7Ci0JCSAgICAgICAgYm9vbGVhbiBsaXN0Tm90Q2FjaGVkID0gIWxpc3RJc0NhY2hlZCgpOwotCQkgICAgICAgIGlmIChsaXN0Tm90Q2FjaGVkKSB7Ci0JCSAgICAgICAgICAgIGNhY2hlTGlzdCgpOwotCQkgICAgICAgIH0KLQkJICAgICAgICAKLQkJCQlpbnQgaW5kZXggPSBzdXBlci5nZXRTZWxlY3RlZEluZGV4KCk7Ci0KLQkJICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotCQkgICAgICAgICAgICB1bmNhY2hlTGlzdCgpOwotCQkgICAgICAgIH0KLQkJCQlyZXR1cm4gaW5kZXg7Ci0JCSAgIH0KLQotCQl9OwotCQkvLyBzdG9sZSB0aGlzIGNvZGUgZnJvbSBqYXZheC5zd2luZy5EZWZhdWx0Q2VsbEVkaXRvcgotCQlyZXN1bHQucHV0Q2xpZW50UHJvcGVydHkoIkpDb21ib0JveC5pc1RhYmxlQ2VsbEVkaXRvciIsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkQWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXJlc3VsdC5hZGRQb3B1cE1lbnVMaXN0ZW5lcih0aGlzLmJ1aWxkUG9wdXBNZW51TGlzdGVuZXIoKSk7Ci0JCQotICAgICAgICAvL1RoZXNlIGFyZSB1c2VkIHRvIHdvcmthcm91bmQgcHJvYmxlbXMgd2l0aCBTd2luZyB0cnlpbmcgdG8gCi0gICAgICAgIC8vZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgY29tYm9Cb3ggd2l0aCBhIGxhcmdlIG1vZGVsCi0gICAgICAgIHJlc3VsdC5zZXRQcm90b3R5cGVEaXNwbGF5VmFsdWUocHJvdG90eXBlTGFiZWwpOwotICAgICAgICBnZXRMaXN0Qm94KHJlc3VsdCkuc2V0UHJvdG90eXBlQ2VsbFZhbHVlKHByb3RvdHlwZUxhYmVsKTsKLSAgICAgICAgCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotICAgIAotICAgIHByaXZhdGUgSkxpc3QgZ2V0TGlzdEJveChKQ29tYm9Cb3ggcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiAoSkxpc3QpIENsYXNzVG9vbHMuZmllbGRWYWx1ZShyZXN1bHQuZ2V0VUkoKSwgImxpc3RCb3giKTsKLSAgICB9Ci0KLQkKLQlwcml2YXRlIEFjdGlvbkxpc3RlbmVyIGJ1aWxkQWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotCQkJCUpDb21ib0JveCBjYiA9IChKQ29tYm9Cb3gpIGUuZ2V0U291cmNlKCk7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkSXRlbSA9IGNiLmdldFNlbGVjdGVkSXRlbSgpOwotCi0JCQkJLy8gT25seSB1cGRhdGUgdGhlIHNlbGVjdGVkIGl0ZW0gYW5kIGludm9rZSBpbW1lZGlhdGVFZGl0KCkgaWYgdGhlCi0JCQkJLy8gc2VsZWN0ZWQgaXRlbSBhY3R1YWxseSBjaGFuZ2VkLCBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZQotCQkJCS8vIGVkaXRpbmcsIHRoZSBtb2RlbCBjaGFuZ2VzIGFuZCBjYXVzZXMgdGhpcyBtZXRob2QgdG8gYmUgaW52b2tlZCwKLQkJCQkvLyBpdCBjYXVzZXMgQ1IjMzk2MzY3NSB0byBvY2N1ciBiZWNhdXNlIGltbWVkaWF0ZUVkaXQoKSBzdG9wIHRoZQotCQkJCS8vIGVkaXRpbmcsIHdoaWNoIGlzIGRvbmUgYXQgdGhlIHdyb25nIHRpbWUKLQkJCQlpZiAoQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci50aGlzLnZhbHVlICE9IHNlbGVjdGVkSXRlbSkgewotCQkJCQlDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMudmFsdWUgPSBjYi5nZXRTZWxlY3RlZEl0ZW0oKTsKLQkJCQkJQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci50aGlzLmltbWVkaWF0ZUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBpbW1lZGlhdGVFZGl0KCkgewotCQlpZiAodGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJdGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIuaW1tZWRpYXRlRWRpdCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgUG9wdXBNZW51TGlzdGVuZXIgYnVpbGRQb3B1cE1lbnVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQb3B1cE1lbnVMaXN0ZW5lcigpIHsKLQkJCi0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVXaWxsQmVjb21lVmlzaWJsZShQb3B1cE1lbnVFdmVudCBlKSB7Ci0JCQkJaWYgKGxpc3RJc0NhY2hlZCgpKSB7Ci0JCQkJCXVuY2FjaGVMaXN0KCk7Ci0JCQkJfQotCQkJCWNhY2hlTGlzdCgpOwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudVdpbGxCZWNvbWVJbnZpc2libGUoUG9wdXBNZW51RXZlbnQgZSkgewotCSAgICAgICAgICAgIGlmIChsaXN0SXNDYWNoZWQoKSkgewotCSAgICAgICAgICAgICAgICB1bmNhY2hlTGlzdCgpOwotCSAgICAgICAgICAgIH0KLQotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudUNhbmNlbGVkKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkgICAgICAgICAgICBpZiAobGlzdElzQ2FjaGVkKCkpIHsKLQkgICAgICAgICAgICAgICAgdW5jYWNoZUxpc3QoKTsKLQkgICAgICAgICAgICB9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCi0Jdm9pZCBjYWNoZUxpc3QoKSB7Ci0JCXRoaXMubW9kZWwuY2FjaGVMaXN0KCk7Ci0JfQotCQotCXZvaWQgdW5jYWNoZUxpc3QoKSB7Ci0JCXRoaXMubW9kZWwudW5jYWNoZUxpc3QoKTsKLQl9CQotCQotCWJvb2xlYW4gbGlzdElzQ2FjaGVkKCkgewotCQlyZXR1cm4gdGhpcy5tb2RlbC5pc0NhY2hlZCgpOwotCX0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCXRoaXMuZmFrZUZvY3VzRmxhZyA9IHNlbGVjdGVkIHx8IGhhc0ZvY3VzOwotCQlpZiAodGhpcy5jb21ib0JveCA9PSBudWxsKSB7Ci0JCQl0aGlzLmNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KCk7Ci0JCi0JCQl0aGlzLmNvbWJvQm94LnNldENvbXBvbmVudE9yaWVudGF0aW9uKHRhYmxlLmdldENvbXBvbmVudE9yaWVudGF0aW9uKCkpOwotCQkJdGhpcy5jb21ib0JveC5zZXRNb2RlbCh0aGlzLm1vZGVsKTsKLQkJCWlmICh0aGlzLnJlbmRlcmVyICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbWJvQm94LnNldFJlbmRlcmVyKHRoaXMucmVuZGVyZXIpOwotCQkJfQotCQkJdGhpcy5jb21ib0JveC5zZXRGb250KHRhYmxlLmdldEZvbnQoKSk7Ci0JCQl0aGlzLmNvbWJvQm94LnNldEVuYWJsZWQodGFibGUuaXNFbmFibGVkKCkpOwotCQkJdGhpcy5jb21ib0JveC5zZXRCb3JkZXIodGhpcy5ib3JkZXIodGFibGUsIHZhbCwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCQl9Ci0KLQkJLy8gV2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSBtb2RlbCBzaW5jZSBKQ29tYm9Cb3ggbWlnaHQgcHJldmVudCB1cyBmcm9tCi0JCS8vIHNlbGVjdGluZyB0aGUgdmFsdWUuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSB2YWx1ZSBpcyBub3QgY29udGFpbmVkCi0JCS8vIGluIHRoZSBtb2RlbCwgc2VlIENSIzM5NTAwNDQgZm9yIGFuIGV4YW1wbGUKLQkJdGhpcy5tb2RlbC5zZXRTZWxlY3RlZEl0ZW0odmFsKTsKLQotCQlyZXR1cm4gdGhpcy5jb21ib0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBmb3JlZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBmb3JlZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBkZWZhdWx0Rm9yZWdyb3VuZDsKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRGb3JlZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRDb2xvcihKVGFibGUgdGFibGUsIE9iamVjdCB2YWwsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRCYWNrZ3JvdW5kOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEJhY2tncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYm9yZGVyLgotCSAqLwotCXByb3RlY3RlZCBCb3JkZXIgYm9yZGVyKEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbCwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlyZXR1cm4gaGFzRm9jdXMgPwotCQkJVUlNYW5hZ2VyLmdldEJvcmRlcigiVGFibGUuZm9jdXNDZWxsSGlnaGxpZ2h0Qm9yZGVyIikKLQkJOgotCQkJTk9fRk9DVVNfQk9SREVSOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLlJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbW1lZGlhdGVFZGl0TGlzdGVuZXIoVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbmRlcmVyJ3MgcHJlZmVycmVkIGhlaWdodC4gVGhpcyBhbGxvd3MgeW91Ci0JICogdG8gc2V0IHRoZSByb3cgaGVpZ2h0IHRvIHNvbWV0aGluZyB0aGUgY29tYm8tYm94IHdpbGwgbG9vayBnb29kIGluLi4uLgotCSAqLwotCXB1YmxpYyBpbnQgcHJlZmVycmVkSGVpZ2h0KCkgewotCQlyZXR1cm4gaGVpZ2h0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9EaXNwbGF5YWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0Rpc3BsYXlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmYxOGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0Rpc3BsYXlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFVzZWQgYnkgZ2VuZXJhbC1wdXJwb3NlIFVJIG1vZGVscyBhbmQgcmVuZGVyZXJzIHRvIGNhc3QKLSAqIGFwcGxpY2F0aW9uIG1vZGVsIG9iamVjdHMgdG8gc29tZXRoaW5nIGRpc3BsYXlhYmxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc3BsYXlhYmxlCi0JZXh0ZW5kcyBNb2RlbCwgQ29tcGFyYWJsZTxEaXNwbGF5YWJsZT4KLXsKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RlbAotCSAqIGluIGEgdGV4dHVhbCBVSSBzZXR0aW5nICh0eXBpY2FsbHkgdGhlIG9iamVjdCdzIG5hbWUpLgotCSAqIFdoZW4gdGhlIGRpc3BsYXkgc3RyaW5nIGNoYW5nZXMsIHRoZSBtb2RlbCBzaG91bGQgZmlyZQotCSAqIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uOgotCSAqICAgICB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZERpc3BsYXlTdHJpbmcsIHRoaXMuZGlzcGxheVN0cmluZygpKTsKLQkgKi8KLQlTdHJpbmcgZGlzcGxheVN0cmluZygpOwotCQlTdHJpbmcgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkgPSAiZGlzcGxheVN0cmluZyI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RlbAotCSAqIGluIGEgVUkgY29tcG9uZW50IHRoYXQgc3VwcG9ydHMgaWNvbnMgKHRoZSBpY29uIGNhbiBiZSBudWxsKS4KLQkgKiBXaGVuIHRoZSBpY29uIGNoYW5nZXMsIHRoZSBtb2RlbCBzaG91bGQgZmlyZQotCSAqIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uOgotCSAqICAgICB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSUNPTl9QUk9QRVJUWSwgb2xkSWNvbiwgdGhpcy5pY29uKCkpOwotCSAqLwotCUljb24gaWNvbigpOwotCQlTdHJpbmcgSUNPTl9QUk9QRVJUWSA9ICJpY29uIjsKLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgaW1wbGVtZW50YXRpb25zICoqKioqKioqKioKLQotCUNvbGxhdG9yIERFRkFVTFRfQ09MTEFUT1IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogU2luY2UgYWxsIGRpc3BsYXlhYmxlIG9iamVjdHMgbXVzdCBiZSBjb21wYXJhYmxlLCBwcm92aWRlIGEKLQkgKiB0eXBpY2FsIGNvbXBhcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byBzb3J0IGEgY29sbGVjdGlvbiBvZgotCSAqIGRpc3BsYXlhYmxlIG9iamVjdHMuCi0JICogU29ydCBiYXNlZCBvbiBkaXNwbGF5IHN0cmluZzoKLQkgKiAgICAgLSBpZGVudGljYWwgb2JqZWN0cyBhcmUgZXF1YWwgKHdoaWNoIG1lYW5zIHRoZXkgY2Fubm90Ci0JICogICAgICAgICBjby1leGlzdCBpbiBhIFNvcnRlZFNldCkKLQkgKiAgICAgLSB1c2UgdGhlIGRlZmF1bHQgY29sbGF0b3IgKHdoaWNoIHR5cGljYWxseSBpbnRlcmxlYXZlcwotCSAqICAgICAgICAgbG93ZXItIGFuZCB1cHBlci1jYXNlIGxldHRlcnMpCi0JICogICAgIC0gYWxsb3cgZHVwbGljYXRlIGRpc3BsYXkgc3RyaW5ncyAoZnJvbSBkaWZmZXJlbnQgb2JqZWN0cykKLQkgKiAgICAgLSB0cnkgdG8gcmV0dXJuIGNvbnNpc3RlbnQgcmVzdWx0cyBmb3Igc2FtZSBvYmplY3QgcGFpcnMKLQkgKi8KLQlDb21wYXJhdG9yPERpc3BsYXlhYmxlPiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQluZXcgQ29tcGFyYXRvcjxEaXNwbGF5YWJsZT4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoRGlzcGxheWFibGUgZDEsIERpc3BsYXlhYmxlIGQyKSB7Ci0JCQkJLy8gZGlzYWxsb3cgZHVwbGljYXRlcyBiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkKLQkJCQlpZiAoZDEgPT0gZDIpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCi0JCQkJLy8gZmlyc3QgY29tcGFyZSBkaXNwbGF5IHN0cmluZ3MgdXNpbmcgdGhlIGRlZmF1bHQgY29sbGF0b3IKLQkJCQlpbnQgcmVzdWx0ID0gREVGQVVMVF9DT0xMQVRPUi5jb21wYXJlKGQxLmRpc3BsYXlTdHJpbmcoKSwgZDIuZGlzcGxheVN0cmluZygpKTsKLQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0KLQkJCQkvLyB0aGVuIGNvbXBhcmUgdXNpbmcgb2JqZWN0LWlkCi0JCQkJcmVzdWx0ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDEpIC0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDIpOwotCQkJCWlmIChyZXN1bHQgIT0gMCkgewotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQotCQkJCS8vIEl0J3MgdW5saWtlbHkgdGhhdCB3ZSBnZXQgdG8gdGhpcyBwb2ludDsgYnV0LCBqdXN0IGluIGNhc2UsIHdlIHdpbGwgcmV0dXJuIC0xLgotCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgaW50cm9kdWNlcyBzb21lIG1pbGQgdW5wcmVkaWN0YWJpbGl0eSB0byB0aGUgc29ydCBvcmRlcgotCQkJCS8vICh1bmxlc3MgdGhlIG9iamVjdHMgYXJlIGFsd2F5cyBwYXNzZWQgaW50byB0aGlzIG1ldGhvZCBpbiB0aGUgc2FtZSBvcmRlcikuCi0JCQkJcmV0dXJuIC0xOwkJLy8gaWYgYWxsIGVsc2UgZmFpbHMsIGluZGljYXRlIHRoYXQgbzEgPCBvMgotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiRGlzcGxheWFibGUuREVGQVVMVF9DT01QQVJBVE9SIjsKLQkJCX0KLQkJfTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0VtcHR5SWNvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0VtcHR5SWNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDIyNTFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9FbXB0eUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi0vKioKLSAqIEltcGxlbWVudCB0aGUgSWNvbiBpbnRlcmZhY2Ugd2l0aCBhbiBpY29uIHRoYXQgaGFzIGEgc2l6ZSBidXQKLSAqIGRvZXMgbm90IHBhaW50IGFueXRoaW5nIG9uIHRoZSBncmFwaGljcyBjb250ZXh0LgotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlJY29uCi0JaW1wbGVtZW50cyBJY29uCi17Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgd2lkdGg7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgaGVpZ2h0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbXB0eUljb24gTlVMTF9JTlNUQU5DRSA9IG5ldyBFbXB0eUljb24oMCk7Ci0KLQotCXB1YmxpYyBFbXB0eUljb24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7Ci0JfQotCi0JcHVibGljIEVtcHR5SWNvbihpbnQgc2l6ZSkgewotCQl0aGlzKHNpemUsIHNpemUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJY29uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHBhaW50SWNvbihDb21wb25lbnQgYywgR3JhcGhpY3MgZywgaW50IHgsIGludCB5KSB7Ci0JCS8vIGRvbid0IHBhaW50IGFueXRoaW5nIGZvciBhbiBlbXB0eSBpY29uCi0JfQotCi0JcHVibGljIGludCBnZXRJY29uV2lkdGgoKSB7IAotCQlyZXR1cm4gdGhpcy53aWR0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEljb25IZWlnaHQoKSB7Ci0JCXJldHVybiB0aGlzLmhlaWdodDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9GaWx0ZXJpbmdMaXN0QnJvd3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RCcm93c2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWYzZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RCcm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIExvbmdMaXN0Q29tcG9uZW50LkJyb3dzZXIgdXNlcyBhCi0gKiBKT3B0aW9uUGFuZSB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIHRoZSBzZWxlY3Rpb24uIFRoZSBKT1B0aW9uUGFuZQotICogaXMgcGFzc2VkIGEgRmlsdGVyaW5nTGlzdFBhbmVsIHRvIGFzc2lzdCB0aGUgdXNlciBpbiBtYWtpbmcKLSAqIGEgc2VsZWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nTGlzdEJyb3dzZXI8VD4gCi0JaW1wbGVtZW50cyBMaXN0Q2hvb3Nlci5MaXN0QnJvd3NlciAKLXsKLQlwcml2YXRlIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBwYW5lbDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0xpc3RCcm93c2VyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhbmVsID0gdGhpcy5idWlsZFBhbmVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBidWlsZFBhbmVsKCkgewotCQlyZXR1cm4gbmV3IExvY2FsRmlsdGVyaW5nTGlzdFBhbmVsPFQ+KCk7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0IHRoZSB1c2VyIHVzaW5nIGEgSk9wdGlvblBhbmUgd2l0aCBhIGZpbHRlcmluZwotCSAqIGxpc3QgcGFuZWwuCi0JICovCi0JcHVibGljIHZvaWQgYnJvd3NlKExpc3RDaG9vc2VyIGNob29zZXIpIHsJCi0JCXRoaXMuaW5pdGlhbGl6ZUNlbGxSZW5kZXJlcihjaG9vc2VyKTsKLQkJCi0JCWludCBvcHRpb24gPSAKLQkJCUpPcHRpb25QYW5lLnNob3dPcHRpb25EaWFsb2coCi0JCQkJY2hvb3NlciwgCi0JCQkJdGhpcy5tZXNzYWdlKGNob29zZXIpLCAKLQkJCQl0aGlzLnRpdGxlKGNob29zZXIpLCAKLQkJCQl0aGlzLm9wdGlvblR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMubWVzc2FnZVR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMuaWNvbihjaG9vc2VyKSwgCi0JCQkJdGhpcy5zZWxlY3Rpb25WYWx1ZXMoY2hvb3NlciksIAotCQkJCXRoaXMuaW5pdGlhbFNlbGVjdGlvblZhbHVlKGNob29zZXIpCi0JCSk7Ci0JCQotCQlpZiAob3B0aW9uID09IEpPcHRpb25QYW5lLk9LX09QVElPTikgewotCQkJY2hvb3Nlci5nZXRNb2RlbCgpLnNldFNlbGVjdGVkSXRlbSh0aGlzLnBhbmVsLnNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQkJLy8gY2xlYXIgdGhlIHRleHQgZmllbGQgc28gdGhlIGxpc3QgYm94IGlzIHJlLWZpbHRlcmVkCi0JCXRoaXMucGFuZWwudGV4dEZpZWxkKCkuc2V0VGV4dCgiIik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDZWxsUmVuZGVyZXIoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCS8vIGRlZmF1bHQgYmVoYXZpb3Igc2hvdWxkIGJlIHRvIHVzZSB0aGUgY2VsbCByZW5kZXJlciBmcm9tIHRoZSBjb21ib2JveC4KLQkJdGhpcy5wYW5lbC5saXN0Qm94KCkuc2V0Q2VsbFJlbmRlcmVyKGNvbWJvQm94LmdldFJlbmRlcmVyKCkpOwotCX0KLQotCS8qKgotCSAqIHRoZSBtZXNzYWdlIGNhbiBiZSBhbnl0aGluZyAtIGhlcmUgd2UgYnVpbGQgYSBjb21wb25lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG1lc3NhZ2UoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXRoaXMucGFuZWwuc2V0Q29tcGxldGVMaXN0KHRoaXMuY29udmVydFRvQXJyYXkoY29tYm9Cb3guZ2V0TW9kZWwoKSkpOwotCQl0aGlzLnBhbmVsLnNldFNlbGVjdGlvbihjb21ib0JveC5nZXRNb2RlbCgpLmdldFNlbGVjdGVkSXRlbSgpKTsKLQkJcmV0dXJuIHRoaXMucGFuZWw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBvcHRpb25UeXBlKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gSk9wdGlvblBhbmUuT0tfQ0FOQ0VMX09QVElPTjsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IG1lc3NhZ2VUeXBlKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSWNvbiBpY29uKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gc2VsZWN0aW9uVmFsdWVzKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb25WYWx1ZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgbGlzdCBvZiBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBtb2RlbAotCSAqIGludG8gYW4gYXJyYXkuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGNvbnZlcnRUb0FycmF5KExpc3RNb2RlbCBtb2RlbCkgewotCQlpbnQgc2l6ZSA9IG1vZGVsLmdldFNpemUoKTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IG1vZGVsLmdldEVsZW1lbnRBdChpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGN1c3RvbSBwYW5lbCAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBMb2NhbEZpbHRlcmluZ0xpc3RQYW5lbDxTPiBleHRlbmRzIEZpbHRlcmluZ0xpc3RQYW5lbDxTPiB7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCi0JCXByb3RlY3RlZCBMb2NhbEZpbHRlcmluZ0xpc3RQYW5lbCgpIHsKLQkJCXN1cGVyKEVNUFRZX0FSUkFZLCBudWxsKTsKLQkJfQotCQotCQkvKioKLQkJICogRGlzYWJsZSB0aGUgcGVyZm9ybWFuY2UgdHdlYWsgYmVjYXVzZSBKT3B0aW9uUGFuZQotCQkgKiB3aWxsIHRyeSBvcGVuIHdpZGUgZW5vdWdoIHRvIGRpc2FibGUgdGhlIGhvcml6b250YWwgc2Nyb2xsIGJhcjsKLQkJICogYW5kIGl0IGxvb2tzIGEgYml0IGNsdW1zeS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIHByb3RvdHlwZUNlbGxWYWx1ZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdFBhbmVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOWE1NmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuRm9udDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0TGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZVN0cmluZ01hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ01hdGNoZXI7Ci0KLS8qKgotICogVGhpcyBwYW5lbCBwcmVzZW50cyBhbiBlbnRyeSBmaWVsZCBhbmQgYSBsaXN0IGJveCBvZiBjaG9pY2VzIHRoYXQKLSAqIGFsbG93cyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIGVudHJpZXMgaW4gdGhlIGxpc3QgYm94IGJ5IGVudGVyaW5nCi0gKiBhIHBhdHRlcm4gaW4gdGhlIGVudHJ5IGZpZWxkLgotICogCi0gKiBCeSBkZWZhdWx0LCB0d28gd2lsZGNhcmRzIGFyZSBhbGxvd2VkIGluIHRoZSBwYXR0ZXJuOgotICogCScqJyB3aWxsIG1hdGNoIGFueSBzZXQgb2YgemVybyBvciBtb3JlIGNoYXJhY3RlcnMKLSAqIAknPycgd2lsbCBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlcgotICogCi0gKiBUaGUgcGFuZWwgY29uc2lzdHMgb2YgNCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIGN1c3RvbWl6ZWQ6Ci0gKiAJLSAxIHRleHQgZmllbGQKLSAqIAktIDEgbGlzdCBib3gKLSAqIAktIDIgbGFiZWxzLCBvbmUgZm9yIGVhY2ggb2YgdGhlIGFib3ZlCi0gKiAKLSAqIE90aGVyIGFzcGVjdHMgb2YgdGhlIHBhbmVsJ3MgYmVoYXZpb3IgY2FuIGJlIGNoYW5nZWQ6Ci0gKiAJLSB0aGUgc3RyaW5nIGNvbnZlcnRlciBkZXRlcm1pbmVzIGhvdyB0aGUgb2JqZWN0cyBpbiB0aGUKLSAqIAkJbGlzdCBhcmUgY29udmVydGVkIHRvIHN0cmluZ3MgYW5kIGNvbXBhcmVkIHRvIHRoZSBwYXR0ZXJuCi0gKiAJCWVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQ7IGJ5IGRlZmF1bHQgdGhlIGNvbnZlcnRlciBzaW1wbHkKLSAqIAkJdXNlcyB0aGUgcmVzdWx0IG9mIHRoZSBvYmplY3QncyAjdG9TdHJpbmcoKSBtZXRob2QKLSAqIAkJKGlmIHlvdSByZXBsYWNlIHRoZSBzdHJpbmcgY29udmVydGVyLCB5b3Ugd2lsbCBwcm9iYWJseQotICogCQl3YW50IHRvIHJlcGxhY2UgdGhlIGxpc3QgYm94J3MgY2VsbCByZW5kZXJlciBhbHNvKQotICogCS0gdGhlIHN0cmluZyBtYXRjaGVyIGNhbiBhbHNvIGJlIGNoYW5nZWQgaWYgeW91IHdvdWxkCi0gKiAJCWxpa2UgZGlmZmVyZW50IHBhdHRlcm4gbWF0Y2hpbmcgYmVoYXZpb3IgdGhhbiB0aGF0Ci0gKiAJCWRlc2NyaWJlZCBhYm92ZQotICogCS0geW91IGNhbiBzcGVjaWZ5IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGxpc3QgLSB0aGlzIG1heQotICogCQlmb3JjZSB0aGUgdXNlciB0byBlbnRlciBhIHBhdHRlcm4gcmVzdHJpY3RpdmUgZW5vdWdoCi0gKiAJCXRvIHJlc3VsdCBpbiBhIGxpc3Qgc21hbGxlciB0aGFuIHRoZSBtYXhpbXVtIHNpemU7IHRoZQotICogCQlkZWZhdWx0IGlzIC0xLCB3aGljaCBkaXNhYmxlcyB0aGUgcmVzdHJpY3Rpb24KLSAqIAotICogVGhpcyBwYW5lbCBpcyBub3QgYSB0eXBpY2FsIHBhbmVsLCBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBkb2VzIG5vdCBzaGFyZQotICogaXRzIG1vZGVsIHdpdGggY2xpZW50cyB2aWEgdmFsdWUgbW9kZWxzLiBJbnN0ZWFkLCB0aGlzIHBhbmVsJ3MgbW9kZWwKLSAqIGlzIHNldCBhbmQgcXVlcmllZCBkaXJlY3RseSBiZWNhdXNlIGl0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gYQotICogZGlhbG9nIHRoYXQgZGlyZWN0cyB0aGUgdXNlcidzIGJlaGF2aW9yIChhcyBvcHBvc2VkIHRvIGEgIm5vcm1hbCIKLSAqIHdpbmRvdykuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdMaXN0UGFuZWw8VD4gZXh0ZW5kcyBKUGFuZWwgewotCi0JLyoqCi0JICogVGhlIGNvbXBsZXRlIGxpc3Qgb2YgYXZhaWxhYmxlIGNob2ljZXMKLQkgKiAoYXMgb3Bwb3NlZCB0byB0aGUgcGFydGlhbCBsaXN0IGhlbGQgYnkgdGhlIGxpc3QgYm94KS4KLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIGNvbXBsZXRlTGlzdDsKLQotCS8qKgotCSAqIEFuIGFkYXB0ZXIgdXNlZCB0byBjb252ZXJ0IHRoZSBvYmplY3RzIGluIHRoZSBsaXN0Ci0JICogdG8gc3RyaW5ncyBzbyB0aGV5IGNhbiBiZSBydW4gdGhyb3VnaCB0aGUgbWF0Y2hlcgotCSAqIGFuZCBkaXNwbGF5ZWQgaW4gdGhlIHRleHQgZmllbGQuCi0JICovCi0JU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcjsKLQotCS8qKiBUaGUgdGV4dCBmaWVsZC4gKi8KLQlwcml2YXRlIEpUZXh0RmllbGQgdGV4dEZpZWxkOwotCXByaXZhdGUgSkxhYmVsIHRleHRGaWVsZExhYmVsOwotCXByaXZhdGUgRG9jdW1lbnRMaXN0ZW5lciB0ZXh0RmllbGRMaXN0ZW5lcjsKLQotCS8qKiBUaGUgbGlzdCBib3guICovCi0JcHJpdmF0ZSBKTGlzdCBsaXN0Qm94OwotCXByaXZhdGUgSkxhYmVsIGxpc3RCb3hMYWJlbDsKLQotCS8qKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LiAqLwotCXByaXZhdGUgaW50IG1heExpc3RTaXplOwotCi0JLyoqCi0JICogVGhlIG1hdGNoZXIgdXNlZCB0byBmaWx0ZXIgdGhlIGxpc3QgYWdhaW5zdAotCSAqIHRoZSBwYXR0ZXJuIGVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQuIEJ5IGRlZmF1bHQsCi0JICogdGhpcyBhbGxvd3MgdGhlIHR3byB3aWxkY2FyZCBjaGFyYWN0ZXJzIGRlc2NyaWJlZCBpbgotCSAqIHRoZSBjbGFzcyBjb21tZW50LgotCSAqLwotCXByaXZhdGUgU3RyaW5nTWF0Y2hlciBzdHJpbmdNYXRjaGVyOwotCi0JLyoqCi0JICogUGVyZm9ybWFuY2UgdHdlYWs6IFdlIHVzZSB0aGlzIGJ1ZmZlciBpbnN0ZWFkIG9mCi0JICogYSB0ZW1wb3JhcnkgdmFyaWFibGUgZHVyaW5nIGZpbHRlcmluZyBzbyB3ZSBkb24ndCBoYXZlCi0JICogdG8ga2VlcCByZS1hbGxvY2F0aW5nIGl0LgotCSAqLwotCXByaXZhdGUgT2JqZWN0W10gYnVmZmVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIFRFWFRfRklFTERfTEFCRUxfQk9SREVSID0gQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigwLCAwLCA1LCAwKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb3JkZXIgTElTVF9CT1hfTEFCRUxfQk9SREVSID0gQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcig1LCAwLCA1LCAwKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgRmlsdGVyaW5nTGlzdFBhbmVsIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGNob2ljZXMKLQkgKiBhbmQgaW5pdGlhbCBzZWxlY3Rpb24uIFVzZSB0aGUgZGVmYXVsdCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlCi0JICogY2hvaWNlcyBhbmQgc2VsZWN0aW9uIHRvIHN0cmluZ3MgKHdoaWNoIHNpbXBseSBjYWxscyAjdG9TdHJpbmcoKSBvbgotCSAqIHRoZSBvYmplY3RzKS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nTGlzdFBhbmVsKE9iamVjdFtdIGNvbXBsZXRlTGlzdCwgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb24pIHsKLQkJdGhpcyhjb21wbGV0ZUxpc3QsIGluaXRpYWxTZWxlY3Rpb24sIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxUPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEZpbHRlcmluZ0xpc3RQYW5lbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBjaG9pY2VzCi0JICogYW5kIGluaXRpYWwgc2VsZWN0aW9uLiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlCi0JICogY2hvaWNlcyBhbmQgc2VsZWN0aW9uIHRvIHN0cmluZ3MuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0xpc3RQYW5lbChPYmplY3RbXSBjb21wbGV0ZUxpc3QsIE9iamVjdCBpbml0aWFsU2VsZWN0aW9uLCBTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCXN1cGVyKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCXRoaXMuY29tcGxldGVMaXN0ID0gY29tcGxldGVMaXN0OwotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQkJdGhpcy5pbml0aWFsaXplKGluaXRpYWxTZWxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgaW5pdGlhbFNlbGVjdGlvbikgewotCQl0aGlzLm1heExpc3RTaXplID0gdGhpcy5kZWZhdWx0TWF4TGlzdFNpemUoKTsKLQkJdGhpcy5idWZmZXIgPSB0aGlzLmJ1aWxkQnVmZmVyKCk7Ci0KLQkJdGhpcy50ZXh0RmllbGRMaXN0ZW5lciA9IHRoaXMuYnVpbGRUZXh0RmllbGRMaXN0ZW5lcigpOwotCi0JCXRoaXMuc3RyaW5nTWF0Y2hlciA9IHRoaXMuYnVpbGRTdHJpbmdNYXRjaGVyKCk7Ci0KLQkJdGhpcy5pbml0aWFsaXplTGF5b3V0KGluaXRpYWxTZWxlY3Rpb24pOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gYnVpbGRCdWZmZXIoKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W3RoaXMubWF4KCldOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBtYXggbnVtYmVyIG9mIGVudHJpZXMgYWxsb3dlZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHJpdmF0ZSBpbnQgbWF4KCkgewotCQlpZiAodGhpcy5tYXhMaXN0U2l6ZSA9PSAtMSkgewotCQkJcmV0dXJuIHRoaXMuY29tcGxldGVMaXN0Lmxlbmd0aDsKLQkJfQotCQlyZXR1cm4gTWF0aC5taW4odGhpcy5tYXhMaXN0U2l6ZSwgdGhpcy5jb21wbGV0ZUxpc3QubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBsaXN0ZW4gdG8gY2hhbmdlcyBpbiB0aGUgdGV4dCBmaWVsZAotCSAqIGFuZCBmaWx0ZXIgdGhlIGxpc3QgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcml2YXRlIERvY3VtZW50TGlzdGVuZXIgYnVpbGRUZXh0RmllbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEb2N1bWVudExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0xpc3RQYW5lbC50aGlzLmZpbHRlckxpc3QoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nTGlzdFBhbmVsLnRoaXMuZmlsdGVyTGlzdCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0xpc3RQYW5lbC50aGlzLmZpbHRlckxpc3QoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRleHQgZmllbGQgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgaW50IGRlZmF1bHRNYXhMaXN0U2l6ZSgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgU3RyaW5nTWF0Y2hlciBidWlsZFN0cmluZ01hdGNoZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RyaW5nTWF0Y2hlcjxUPigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplTGF5b3V0KE9iamVjdCBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCS8vIHRleHQgZmllbGQKLQkJSlBhbmVsIHRleHRGaWVsZFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQl0aGlzLnRleHRGaWVsZExhYmVsID0gbmV3IEpMYWJlbCgpOwotCQl0aGlzLnRleHRGaWVsZExhYmVsLnNldEJvcmRlcihURVhUX0ZJRUxEX0xBQkVMX0JPUkRFUik7Ci0JCXRleHRGaWVsZFBhbmVsLmFkZCh0aGlzLnRleHRGaWVsZExhYmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCi0JCXRoaXMudGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQoKTsKLQkJdGhpcy50ZXh0RmllbGQuZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMudGV4dEZpZWxkTGlzdGVuZXIpOwotCQl0aGlzLnRleHRGaWVsZExhYmVsLnNldExhYmVsRm9yKHRoaXMudGV4dEZpZWxkKTsKLQkJdGV4dEZpZWxkUGFuZWwuYWRkKHRoaXMudGV4dEZpZWxkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotCQl0aGlzLmFkZCh0ZXh0RmllbGRQYW5lbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQotCQkvLyBsaXN0IGJveAotCQlKUGFuZWwgbGlzdEJveFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQl0aGlzLmxpc3RCb3hMYWJlbCA9IG5ldyBKTGFiZWwoKTsKLQkJdGhpcy5saXN0Qm94TGFiZWwuc2V0Qm9yZGVyKExJU1RfQk9YX0xBQkVMX0JPUkRFUik7Ci0JCWxpc3RCb3hQYW5lbC5hZGQodGhpcy5saXN0Qm94TGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0KLQkJdGhpcy5saXN0Qm94ID0gbmV3IEpMaXN0KCk7Ci0JCXRoaXMubGlzdEJveC5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJdGhpcy5saXN0Qm94LnNldE1vZGVsKHRoaXMuYnVpbGRQYXJ0aWFsQXJyYXlMaXN0TW9kZWwodGhpcy5jb21wbGV0ZUxpc3QsIHRoaXMubWF4KCkpKTsKLQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuc2V0U2VsZWN0aW9uTW9kZShMaXN0U2VsZWN0aW9uTW9kZWwuU0lOR0xFX1NFTEVDVElPTik7Ci0JCS8vIHBlcmZvcm1hbmNlIHR3ZWFrKD8pCi0JCXRoaXMubGlzdEJveC5zZXRQcm90b3R5cGVDZWxsVmFsdWUodGhpcy5wcm90b3R5cGVDZWxsVmFsdWUoKSk7Ci0JCXRoaXMubGlzdEJveC5zZXRQcm90b3R5cGVDZWxsVmFsdWUobnVsbCk7Ci0JCXRoaXMubGlzdEJveC5zZXRDZWxsUmVuZGVyZXIodGhpcy5idWlsZERlZmF1bHRDZWxsUmVuZGVyZXIoKSk7Ci0JCXRoaXMubGlzdEJveExhYmVsLnNldExhYmVsRm9yKHRoaXMubGlzdEJveCk7Ci0JCS8vIGJ1ZyAyNzc3ODAyIC0gc2Nyb2xsIGJhcnMgc2hvdWxkbid0IGJlIG9uIHRoZSB0YWIgc2VxdWVuY2UKLQkJSlNjcm9sbFBhbmUgbGlzdEJveFNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUodGhpcy5saXN0Qm94KTsKLQkJbGlzdEJveFNjcm9sbFBhbmUuZ2V0SG9yaXpvbnRhbFNjcm9sbEJhcigpLnNldEZvY3VzYWJsZShmYWxzZSk7Ci0JCWxpc3RCb3hTY3JvbGxQYW5lLmdldFZlcnRpY2FsU2Nyb2xsQmFyKCkuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKLQkJbGlzdEJveFBhbmVsLmFkZChsaXN0Qm94U2Nyb2xsUGFuZSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLQkJLy8gaW5pdGlhbGl6ZSB0aGUgd2lkZ2V0cwotCQl0aGlzLmxpc3RCb3guc2V0U2VsZWN0ZWRWYWx1ZShpbml0aWFsU2VsZWN0aW9uLCB0cnVlKTsKLQkJdGhpcy50ZXh0RmllbGQuc2VsZWN0KDAsIHRoaXMudGV4dEZpZWxkLmdldFRleHQoKS5sZW5ndGgoKSk7Ci0KLQkJdGhpcy5hZGQobGlzdEJveFBhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IHNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEJveC5nZXRTZWxlY3RlZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJdGhpcy5saXN0Qm94LnNldFNlbGVjdGVkVmFsdWUoc2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gY29tcGxldGVMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5jb21wbGV0ZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogcmVidWlsZCB0aGUgZmlsdGVyaW5nIGJ1ZmZlciBhbmQgcmUtYXBwbHkgdGhlIGZpbHRlcgotCSAqIHRvIHRoZSBuZXcgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBsZXRlTGlzdChPYmplY3RbXSBjb21wbGV0ZUxpc3QpIHsKLQkJdGhpcy5jb21wbGV0ZUxpc3QgPSBjb21wbGV0ZUxpc3Q7Ci0JCWlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCB0aGlzLm1heCgpKSB7Ci0JCQkvLyB0aGUgYnVmZmVyIHdpbGwgbmV2ZXIgc2hyaW5rIC0gbWlnaHQgd2FudCB0byByZS1jb25zaWRlci4uLiAgfmJqdgotCQkJdGhpcy5idWZmZXIgPSB0aGlzLmJ1aWxkQnVmZmVyKCk7Ci0JCX0KLQkJdGhpcy5maWx0ZXJMaXN0KCk7Ci0JfQotCi0JcHVibGljIGludCBtYXhMaXN0U2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWF4TGlzdFNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWF4TGlzdFNpemUoaW50IG1heExpc3RTaXplKSB7Ci0JCXRoaXMubWF4TGlzdFNpemUgPSBtYXhMaXN0U2l6ZTsKLQkJaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA8IHRoaXMubWF4KCkpIHsKLQkJCS8vIHRoZSBidWZmZXIgd2lsbCBuZXZlciBzaHJpbmsgLSBtaWdodCB3YW50IHRvIHJlLWNvbnNpZGVyLi4uICB+Ymp2Ci0JCQl0aGlzLmJ1ZmZlciA9IHRoaXMuYnVpbGRCdWZmZXIoKTsKLQkJfQotCQl0aGlzLmZpbHRlckxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIGFwcGx5IHRoZSBuZXcgZmlsdGVyIHRvIHRoZSBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nQ29udmVydGVyKFN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBzdHJpbmdDb252ZXJ0ZXI7Ci0JCXRoaXMuZmlsdGVyTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIGFsbG93IGNsaWVudCBjb2RlIHRvIGFjY2VzcyB0aGUgdGV4dCBmaWVsZAotCSAqIChzbyB3ZSBjYW4gc2V0IHRoZSBmb2N1cykKLQkgKi8KLQlwdWJsaWMgSlRleHRGaWVsZCB0ZXh0RmllbGQoKSB7Ci0JCXJldHVybiB0aGlzLnRleHRGaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiBhbGxvdyBjbGllbnQgY29kZSB0byBhY2Nlc3MgdGhlIHRleHQgZmllbGQgbGFiZWwKLQkgKi8KLQlwdWJsaWMgSkxhYmVsIHRleHRGaWVsZExhYmVsKCkgewotCQlyZXR1cm4gdGhpcy50ZXh0RmllbGRMYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0RmllbGRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0RmllbGRMYWJlbC5zZXRUZXh0KHRleHQpOwotCX0KLQotCS8qKgotCSAqIGFsbG93IGNsaWVudCBjb2RlIHRvIGFjY2VzcyB0aGUgbGlzdCBib3gKLQkgKiAoc28gd2UgY2FuIGFkZCBtb3VzZSBsaXN0ZW5lcnMgZm9yIGRvdWJsZS1jbGlja2luZykKLQkgKi8KLQlwdWJsaWMgSkxpc3QgbGlzdEJveCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEJveDsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0Qm94Q2VsbFJlbmRlcmVyKExpc3RDZWxsUmVuZGVyZXIgcmVuZGVyZXIpIHsKLQkJdGhpcy5saXN0Qm94LnNldENlbGxSZW5kZXJlcihyZW5kZXJlcik7Ci0JfQotCi0JLyoqCi0JICogYWxsb3cgY2xpZW50IGNvZGUgdG8gYWNjZXNzIHRoZSBsaXN0IGJveCBsYWJlbAotCSAqLwotCXB1YmxpYyBKTGFiZWwgbGlzdEJveExhYmVsKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Qm94TGFiZWw7Ci0JfQotCi0JLyoqCi0JICogY29udmVuaWVuY2UgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdEJveExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLmxpc3RCb3hMYWJlbC5zZXRUZXh0KHRleHQpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudHNGb250KEZvbnQgZm9udCkgewotCQl0aGlzLnRleHRGaWVsZExhYmVsLnNldEZvbnQoZm9udCk7Ci0JCXRoaXMudGV4dEZpZWxkLnNldEZvbnQoZm9udCk7Ci0JCXRoaXMubGlzdEJveExhYmVsLnNldEZvbnQoZm9udCk7Ci0JCXRoaXMubGlzdEJveC5zZXRGb250KGZvbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdNYXRjaGVyIHN0cmluZ01hdGNoZXIoKSB7Ci0JCXJldHVybiB0aGlzLnN0cmluZ01hdGNoZXI7Ci0JfQotCi0JLyoqCi0JICogcmUtYXBwbHkgdGhlIGZpbHRlciB0byB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmluZ01hdGNoZXIoU3RyaW5nTWF0Y2hlciBzdHJpbmdNYXRjaGVyKSB7Ci0JCXRoaXMuc3RyaW5nTWF0Y2hlciA9IHN0cmluZ01hdGNoZXI7Ci0JCXRoaXMuZmlsdGVyTGlzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbG93IHN1YmNsYXNzZXMgdG8gZGlzYWJsZSBwZXJmb3JtYW5jZSB0d2VhawotCSAqIGJ5IHJldHVybmluZyBudWxsIGhlcmUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm90b3R5cGVDZWxsVmFsdWUoKSB7Ci0JCXJldHVybiAiPT09PT09PT09PT4gQV9TVFJJTkdfVEhBVF9JU19ERUZJTklURUxZX0xPTkdFUl9USEFOX0VWRVJZX1NUUklOR19JTl9USEVfTElTVCA8PT09PT09PT09PSI7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgdXNlIHRoZSBzdHJpbmcgY29udmVydGVyIHRvIGJ1aWxkIHRoZSB0ZXh0Ci0JICogdXNlZCBieSB0aGUgbGlzdCBib3gncyBjZWxsIHJlbmRlcmVyLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2VsbFJlbmRlcmVyIGJ1aWxkRGVmYXVsdENlbGxSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0Q2VsbFJlbmRlcmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkgewotCQkJCXJldHVybiBGaWx0ZXJpbmdMaXN0UGFuZWwudGhpcy5zdHJpbmdDb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKChUKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogU29tZXRoaW5nIGhhcyBjaGFuZ2VkIHRoYXQgcmVxdWlyZXMgdXMgdG8gZmlsdGVyIHRoZSBsaXN0LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHN5bmNocm9uaXplZCBiZWNhdXNlIGEgZmFzdCB0eXBpc3QgY2FuCi0JICogZ2VuZXJhdGUgZXZlbnRzIHF1aWNrZXIgdGhhbiB3ZSBjYW4gZmlsdGVyIHRoZSBsaXN0LiAoPyAgfmJqdikKLQkgKi8KLQlzeW5jaHJvbml6ZWQgdm9pZCBmaWx0ZXJMaXN0KCkgewotCQkvLyB0ZW1wb3JhcmlseSBzdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBib3ggc2VsZWN0aW9uLCBzaW5jZSB3ZSB3aWxsCi0JCS8vIGJlIGNoYW5naW5nIHRoZSBzZWxlY3Rpb24gZHVyaW5nIHRoZSBmaWx0ZXJpbmcgYW5kIGRvbid0IHdhbnQKLQkJLy8gdGhhdCB0byBhZmZlY3QgdGhlIHRleHQgZmllbGQKLQkJdGhpcy5maWx0ZXJMaXN0KHRoaXMudGV4dEZpZWxkLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogRmlsdGVyIHRoZSBjb250ZW50cyBvZiB0aGUgbGlzdCBib3ggdG8gbWF0Y2ggdGhlCi0JICogc3BlY2lmaWVkIHBhdHRlcm4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbHRlckxpc3QoU3RyaW5nIHBhdHRlcm4pIHsKLQkJaWYgKHBhdHRlcm4ubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhpcy5saXN0Qm94LnNldE1vZGVsKHRoaXMuYnVpbGRQYXJ0aWFsQXJyYXlMaXN0TW9kZWwodGhpcy5jb21wbGV0ZUxpc3QsIHRoaXMubWF4KCkpKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc3RyaW5nTWF0Y2hlci5zZXRQYXR0ZXJuU3RyaW5nKHBhdHRlcm4pOwotCQkJaW50IGogPSAwOwotCQkJaW50IGxlbiA9IHRoaXMuY29tcGxldGVMaXN0Lmxlbmd0aDsKLQkJCWludCBtYXggPSB0aGlzLm1heCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWlmICh0aGlzLnN0cmluZ01hdGNoZXIubWF0Y2hlcyh0aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcodGhpcy5lbnRyeShpKSkpKSB7Ci0JCQkJCXRoaXMuYnVmZmVyW2orK10gPSB0aGlzLmNvbXBsZXRlTGlzdFtpXTsKLQkJCQl9Ci0JCQkJaWYgKGogPT0gbWF4KSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXRoaXMubGlzdEJveC5zZXRNb2RlbCh0aGlzLmJ1aWxkUGFydGlhbEFycmF5TGlzdE1vZGVsKHRoaXMuYnVmZmVyLCBqKSk7Ci0JCX0KLQotCQkvLyBhZnRlciBmaWx0ZXJpbmcgdGhlIGxpc3QsIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgc2VsZWN0aW9uCi0JCWlmICh0aGlzLmxpc3RCb3guZ2V0TW9kZWwoKS5nZXRTaXplKCkgPT0gMCkgewotCQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuY2xlYXJTZWxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25Nb2RlbCgpLnNldEFuY2hvclNlbGVjdGlvbkluZGV4KDApOwotCQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuc2V0TGVhZFNlbGVjdGlvbkluZGV4KDApOwotCQkJdGhpcy5saXN0Qm94LmVuc3VyZUluZGV4SXNWaXNpYmxlKDApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgVCBlbnRyeShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChUKSB0aGlzLmNvbXBsZXRlTGlzdFtpbmRleF07Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBsaXN0IG1vZGVsIHRoYXQgd3JhcHMgb25seSBhIHBvcnRpb24gb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGUgbW9kZWwgd2lsbCBpbmNsdWRlIHRoZSBhcnJheSBlbnRyaWVzIGZyb20gMCB0byAoc2l6ZSAtIDEpLgotCSAqLwotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkUGFydGlhbEFycmF5TGlzdE1vZGVsKGZpbmFsIE9iamVjdFtdIGFycmF5LCBmaW5hbCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gbmV3IEFic3RyYWN0TGlzdE1vZGVsKCkgewotCQkJcHVibGljIGludCBnZXRTaXplKCkgewotCQkJCXJldHVybiBzaXplOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBnZXRFbGVtZW50QXQoaW50IGluZGV4KSB7Ci0JCQkJcmV0dXJuIGFycmF5W2luZGV4XTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTGlzdENob29zZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9MaXN0Q2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRjYThiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9MaXN0Q2hvb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5BV1RFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5BV1RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci1pbXBvcnQgamF2YS5hd3QuUm9ib3Q7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OwotCi1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuYmFzaWMuQmFzaWNDb21ib0JveFVJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLQotLyoqCi0gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHdheSB0byBoYW5kbGUgc2VsZWN0aW5nIGFuIGl0ZW0gZnJvbSBhCi0gKiBsaXN0IHRoYXQgbWF5IGdyb3cgdG9vIGxhcmdlIHRvIGJlIGhhbmRsZWQgY29udmVuaWVudGx5IGJ5IGEgY29tYm8tYm94LiAKLSAqIElmIHRoZSBsaXN0J3Mgc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGRlc2lnbmF0ZWQgImxvbmciIGxpc3Qgc2l6ZSwgCi0gKiB0aGUgY2hvaWNlIGxpc3Qgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gYSBub3JtYWwgY29tYm8tYm94IHBvcHVwOyAKLSAqIG90aGVyd2lzZSwgYSBkaWFsb2cgd2lsbCBiZSB1c2VkIHRvIHByb21wdCB0aGUgdXNlciB0byBjaG9vc2UgYSBzZWxlY3Rpb24uCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgYnJvd3NlIG1lY2hhbmlzbSwgc3ViY2xhc3NlcyBtYXkgCi0gKiAJLSBvdmVycmlkZSB0aGUgbWV0aG9kICNidWlsZEJyb3dzZXIoKQotICogIC0gb3ZlcnJpZGUgdGhlIG1ldGhvZCAjYnJvd3NlKCksIGluIHdoaWNoIGNhc2UgdGhlIG1ldGhvZCAKLSAqIAkJI2J1aWxkQnJvd3NlcigpIG1heSBiZSBpZ25vcmVkLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdENob29zZXIgCi0JZXh0ZW5kcyBKQ29tYm9Cb3gKLXsKLQkKLQkvKiogdGhlIHNpemUgb2YgYSAibG9uZyIgbGlzdCAtIGFueXRoaW5nIHNtYWxsZXIgaXMgYSAic2hvcnQiIGxpc3QgKi8KLQlpbnQgbG9uZ0xpc3RTaXplID0gREVGQVVMVF9MT05HX0xJU1RfU0laRTsKLQkKLQkvKiogdGhlIGRlZmF1bHQgc2l6ZSBvZiBhICJsb25nIiBsaXN0LCB3aGljaCBpcyAyMCAodG8gbWF0Y2ggSk9wdGlvblBhbmUncyBiZWhhdmlvcikgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0xPTkdfTElTVF9TSVpFID0gMjA7Ci0JCi0JLyoqIHByb3BlcnR5IGNoYW5nZSBhc3NvY2lhdGVkIHdpdGggbG9uZyBsaXN0IHNpemUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX0xJU1RfU0laRV9QUk9QRVJUWSA9ICJsb25nTGlzdFNpemUiOwotCQotICAgIHN0YXRpYyBKTGFiZWwgcHJvdG90eXBlTGFiZWwgPSBuZXcgSkxhYmVsKCJQcm90b3R5cGUiLCBuZXcgRW1wdHlJY29uKDE3KSwgU3dpbmdDb25zdGFudHMuTEVBRElORyk7Ci0KLSAgICAvKiogCi0JICogd2hldGhlciB0aGUgY2hvb3NlciBpcyBjaG9vc2FibGUuICBpZiBhIGNob29zZXIgaXMgbm90IGNob29zYWJsZSwKLQkgKiBpdCBvbmx5IHNlcnZlcyBhcyBhIGRpc3BsYXkgd2lkZ2V0LiAgYSB1c2VyIG1heSBub3QgY2hhbmdlIGl0cyAKLQkgKiBzZWxlY3RlZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGNob29zYWJsZSA9IHRydWU7Ci0JCi0JLyoqIHByb3BlcnR5IGNoYW5nZSBhc3NvY2lhdGVkIHdpdGggY2hvb3NhYmxlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hPT1NBQkxFX1BST1BFUlRZID0gImNob29zYWJsZSI7Ci0JCi0JLyoqIHRoZSBicm93c2VyIHVzZWQgdG8gbWFrZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBsb25nIGxpc3QgLSB0eXBpY2FsbHkgdmlhIGEgZGlhbG9nICovCi0JcHJpdmF0ZSBMaXN0QnJvd3NlciBicm93c2VyOwotCQotICAgIHByaXZhdGUgTm9kZVNlbGVjdG9yIG5vZGVTZWxlY3RvcjsKLSAgICAKLQkvKiogSU5URVJOQUwgLSBUaGUgcG9wdXAgaXMgYmVpbmcgc2hvd24uICBVc2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcC4gKi8KLQlib29sZWFuIHBvcHVwQWxyZWFkeUluUHJvZ3Jlc3M7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBDb25zdHJ1Y3RvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaG9vc2VyIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hvb3NlcihDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMobW9kZWwsIG5ldyBOb2RlU2VsZWN0b3IuRGVmYXVsdE5vZGVTZWxlY3RvcigpKTsKLQl9Ci0JCi0gICAgcHVibGljIExpc3RDaG9vc2VyKENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMobW9kZWwsIG5ldyBOb2RlU2VsZWN0b3IuRGVmYXVsdE5vZGVTZWxlY3RvcigpKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIExpc3RDaG9vc2VyKENvbWJvQm94TW9kZWwgbW9kZWwsIE5vZGVTZWxlY3RvciBub2RlU2VsZWN0b3IpIHsKLSAgICAgICAgdGhpcyhuZXcgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwobW9kZWwpLCBub2RlU2VsZWN0b3IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdENob29zZXIoQ2FjaGluZ0NvbWJvQm94TW9kZWwgbW9kZWwsIE5vZGVTZWxlY3RvciBub2RlU2VsZWN0b3IpIHsKLSAgICAgICAgc3VwZXIobW9kZWwpOwotICAgICAgICB0aGlzLmluaXRpYWxpemUoKTsKLSAgICAgICAgdGhpcy5ub2RlU2VsZWN0b3IgPSBub2RlU2VsZWN0b3I7Ci0gICAgfQotCS8vICoqKioqKioqKioqKioqKiogSW5pdGlhbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuYWRkUG9wdXBNZW51TGlzdGVuZXIodGhpcy5idWlsZFBvcHVwTWVudUxpc3RlbmVyKCkpOwotCQl0aGlzLnNldFJlbmRlcmVyKG5ldyBEZWZhdWx0TGlzdENlbGxSZW5kZXJlcigpKTsKLSAgICAgICAgdGhpcy5hZGRLZXlMaXN0ZW5lcihidWlsZEYzS2V5TGlzdGVuZXIoKSk7Ci0gICAgICAgIAotICAgICAgICAvL1RoZXNlIGFyZSB1c2VkIHRvIHdvcmthcm91bmQgcHJvYmxlbXMgd2l0aCBTd2luZyB0cnlpbmcgdG8gCi0gICAgICAgIC8vZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgY29tYm9Cb3ggd2l0aCBhIGxhcmdlIG1vZGVsCi0gICAgICAgIHNldFByb3RvdHlwZURpc3BsYXlWYWx1ZShwcm90b3R5cGVMYWJlbCk7Ci0gICAgICAgIGxpc3RCb3goKS5zZXRQcm90b3R5cGVDZWxsVmFsdWUocHJvdG90eXBlTGFiZWwpOwotCX0KLQkKLSAgICAKLSAgICBwcml2YXRlIEpMaXN0IGxpc3RCb3goKSB7Ci0gICAgICAgIHJldHVybiAoSkxpc3QpIENsYXNzVG9vbHMuZmllbGRWYWx1ZSh0aGlzLnVpLCAibGlzdEJveCIpOwotICAgIH0KLSAgICAKLQkvKiogCi0JICogV2hlbiB0aGUgcG9wdXAgaXMgYWJvdXQgdG8gYmUgc2hvd24sIHRoZSBldmVudCBpcyBjb25zdW1lZCwgYW5kIAotCSAqIFBvcHVwSGFuZGxlciBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gcmVzaG93IHRoZSBwb3B1cCBvciB0byBzaG93Ci0JICogdGhlIGxvbmcgbGlzdCBicm93c2VyLgotCSAqLwotCXByaXZhdGUgUG9wdXBNZW51TGlzdGVuZXIgYnVpbGRQb3B1cE1lbnVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQb3B1cE1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudVdpbGxCZWNvbWVWaXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkJCQlMaXN0Q2hvb3Nlci50aGlzLmFib3V0VG9TaG93UG9wdXAoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudVdpbGxCZWNvbWVJbnZpc2libGUoUG9wdXBNZW51RXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudUNhbmNlbGVkKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJwb3AtdXAgbWVudSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIElmIHRoaXMgY29kZSBpcyBiZWluZyByZWFjaGVkIGR1ZSB0byB0aGUgUG9wdXBIYW5kbGVyIGFscmVhZHkgYmVpbmcgaW4gcHJvZ3Jlc3MsCi0JICogdGhlbiBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlLCBzZXQgdGhlIGZsYWcgdG8gdHJ1ZSBhbmQgbGF1bmNoIHRoZSBQb3B1cEhhbmRsZXIuCi0JICovCi0Jdm9pZCBhYm91dFRvU2hvd1BvcHVwKCkgewotCQlpZiAodGhpcy5wb3B1cEFscmVhZHlJblByb2dyZXNzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRoaXMucG9wdXBBbHJlYWR5SW5Qcm9ncmVzcyA9IHRydWU7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIobmV3IFBvcHVwSGFuZGxlcigpKTsKLQl9Ci0gCi0gICAgCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBidWlsZEYzS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX0YzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdvVG9TZWxlY3RlZEl0ZW0oKTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiRjMga2V5IGxpc3RlbmVyIjsKLQkJCX0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ29Ub1NlbGVjdGVkSXRlbSgpIHsKLSAgICAgICAgaWYgKGdldFNlbGVjdGVkSXRlbSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3RDaG9vc2VyLnRoaXMubm9kZVNlbGVjdG9yLnNlbGVjdE5vZGVGb3IoZ2V0U2VsZWN0ZWRJdGVtKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotCS8vICoqKioqKioqKioqKioqKiogQnJvd3NpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKiAKLQkgKiBMYXppbHkgaW5pdGlhbGl6ZSBiZWNhdXNlIHN1YmNsYXNzZXMgbWF5IGhhdmUgZnVydGhlciBpbml0aWFsaXphdGlvbiB0byBkbwotCSAqIGJlZm9yZSBicm93c2VyIGNhbiBiZSBidWlsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicm93c2UoKSB7Ci0JCWlmICh0aGlzLmJyb3dzZXIgPT0gbnVsbCkgewotCQkJdGhpcy5icm93c2VyID0gdGhpcy5idWlsZEJyb3dzZXIoKTsKLQkJfQotCQkKLQkJdGhpcy5icm93c2VyLmJyb3dzZSh0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYnJvd3NlciIgdXNlZCB0byBtYWtlIGEgc2VsZWN0aW9uIGZyb20gdGhlIGxvbmcgbGlzdCwKLQkgKiB0eXBpY2FsbHkgdmlhIGEgZGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2hvb3Nlci5MaXN0QnJvd3NlciBidWlsZEJyb3dzZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdEJyb3dzZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBDaG9vc2FibGUgZnVuY3Rpb25hbGl0eSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqIG92ZXJyaWRlIGJlaGF2aW9yIC0gY29uc3VtZSBzZWxlY3Rpb24gaWYgY2hvb3NlciBpcyBub3QgY2hvb3NhYmxlICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJbmRleChpbnQgYW5JbmRleCkgewotCQlpZiAodGhpcy5jaG9vc2FibGUpIHsKLQkJCXN1cGVyLnNldFNlbGVjdGVkSW5kZXgoYW5JbmRleCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFycm93QnV0dG9uKCkgewotCQl0cnkgewotCQkJQmFzaWNDb21ib0JveFVJIGNvbWJvQm94VWkgPSAoQmFzaWNDb21ib0JveFVJKSBMaXN0Q2hvb3Nlci50aGlzLmdldFVJKCk7Ci0JCQlKQnV0dG9uIGFycm93QnV0dG9uID0gKEpCdXR0b24pIENsYXNzVG9vbHMuZmllbGRWYWx1ZShjb21ib0JveFVpLCAiYXJyb3dCdXR0b24iKTsKLQkJCWFycm93QnV0dG9uLnNldEVuYWJsZWQodGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLmNob29zYWJsZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGlzIGlzIGEgaHVnZSBoYWNrIHRvIHRyeSBhbmQgbWFrZSB0aGUgY29tYm8gYm94IGxvb2sgcmlnaHQsCi0JCQkvLyBzbyBpZiBpdCBkb2Vzbid0IHdvcmssIGp1c3Qgc3dhbGxvdyB0aGUgZXhjZXB0aW9uCi0JCX0KLQl9Ci0JCi0JCi0gICAgLy8gKioqKioqKioqKioqKioqKiBMaXN0IENhY2hpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgdm9pZCBjYWNoZUxpc3QoKSB7Ci0gICAgICAgICgoQ2FjaGluZ0NvbWJvQm94TW9kZWwpIGdldE1vZGVsKCkpLmNhY2hlTGlzdCgpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHVuY2FjaGVMaXN0KCkgewotICAgICAgICAoKENhY2hpbmdDb21ib0JveE1vZGVsKSBnZXRNb2RlbCgpKS51bmNhY2hlTGlzdCgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gbGlzdElzQ2FjaGVkKCkgewotICAgICAgICByZXR1cm4gKChDYWNoaW5nQ29tYm9Cb3hNb2RlbCkgZ2V0TW9kZWwoKSkuaXNDYWNoZWQoKTsKLSAgICB9Ci0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBQdWJsaWMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIGludCBsb25nTGlzdFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxvbmdMaXN0U2l6ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9uZ0xpc3RTaXplKGludCBuZXdMb25nTGlzdFNpemUpIHsKLQkJaW50IG9sZExvbmdMaXN0U2l6ZSA9IHRoaXMubG9uZ0xpc3RTaXplOwotCQl0aGlzLmxvbmdMaXN0U2l6ZSA9IG5ld0xvbmdMaXN0U2l6ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2UoTE9OR19MSVNUX1NJWkVfUFJPUEVSVFksIG9sZExvbmdMaXN0U2l6ZSwgbmV3TG9uZ0xpc3RTaXplKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDaG9vc2FibGUoKSB7Ci0JCXJldHVybiB0aGlzLmNob29zYWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2hvb3NhYmxlKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMuY2hvb3NhYmxlOwotCQl0aGlzLmNob29zYWJsZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZShDSE9PU0FCTEVfUFJPUEVSVFksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRoaXMudXBkYXRlQXJyb3dCdXR0b24oKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBIYW5kbGUgc2VsZWN0aW5nIG51bGwgYXMgYSB2YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0ZWRJbmRleElzTm9uZVNlbGVjdGVkSXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGluZGV4ID09IC0xICYmCi0JCQkJIGdldE1vZGVsKCkuZ2V0U2l6ZSgpID4gMCAmJgotCQkJCSBnZXRNb2RlbCgpLmdldEVsZW1lbnRBdCgwKSA9PSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJbmRleCgpIHsKLSAgICAgICAgYm9vbGVhbiBsaXN0Tm90Q2FjaGVkID0gIWxpc3RJc0NhY2hlZCgpOwotICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotICAgICAgICAgICAgY2FjaGVMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCWludCBpbmRleCA9IHN1cGVyLmdldFNlbGVjdGVkSW5kZXgoKTsKLQotCQkvLyBVc2UgaW5kZXggMCB0byBzaG93IHRoZSA8bm9uZSBzZWxlY3RlZD4gaXRlbSBzaW5jZSB0aGUgYWN0dWFsIHZhbHVlIGlzCi0JCS8vIG51bGwgYW5kIEpDb21ib0JveCBkb2VzIG5vdCBoYW5kbGUgbnVsbCB2YWx1ZXMKLQkJaWYgKHNlbGVjdGVkSW5kZXhJc05vbmVTZWxlY3RlZEl0ZW0oaW5kZXgpKSB7Ci0JCQlpbmRleCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotICAgICAgICAgICAgdW5jYWNoZUxpc3QoKTsKLSAgICAgICAgfQotCQlyZXR1cm4gaW5kZXg7Ci0gICB9Ci0JCi0JLy93cmFwIHRoZSByZW5kZXJlciB0byBkZWFsIHdpdGggdGhlIHByb3RvdHlwZURpc3BsYXlWYWx1ZQotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKGZpbmFsIExpc3RDZWxsUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0gICAgICAgIHN1cGVyLnNldFJlbmRlcmVyKG5ldyBMaXN0Q2VsbFJlbmRlcmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgQ29tcG9uZW50IGdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gcHJvdG90eXBlTGFiZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvdHlwZUxhYmVsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYVJlbmRlcmVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBNZW1iZXIgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogRGVmaW5lIHRoZSBBUEkgcmVxdWlyZWQgYnkgdGhpcyBMaXN0Q2hvb3NlciB3aGVuIGl0IG11c3QKLQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGFuIGl0ZW0gZnJvbSB0aGUgImxvbmciIGxpc3QuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXN0QnJvd3NlciAKLQl7Ci0JCS8qKgotCQkgKiBQcm9tcHQgdGhlIHVzZXIgdG8gbWFrZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQKLQkJICogY29tYm8tYm94J3MgbW9kZWwuCi0JCSAqLwotCQl2b2lkIGJyb3dzZShMaXN0Q2hvb3NlciBwYXJlbnRDaG9vc2VyKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUnVubmFibGUgY2xhc3MgdGhhdCBjb25zdW1lcyBwb3B1cCB3aW5kb3cgYW5kIGRldGVybWluZXMgd2hldGhlcgotCSAqIHRvIHJlc2hvdyBwb3B1cCBvciB0byBsYXVuY2ggYnJvd3NlciwgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQb3B1cEhhbmRsZXIKLQkJaW1wbGVtZW50cyBSdW5uYWJsZQotCXsKLQkJLyoqIFRoZSBtb3VzZSBldmVudCAqLwotCQlwcml2YXRlIE1vdXNlRXZlbnQgbGFzdE1vdXNlRXZlbnQ7Ci0JCQotCQkvKiogVGhlIGNvbXBvbmVudCBmcm9tIHdoaWNoIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBKQ29tcG9uZW50IGV2ZW50Q29tcG9uZW50OwotCQkKLQkJLyoqIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcG9uZW50IGF0IHRoZSB0aW1lIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBQb2ludCBjb21wb25lbnRMb2NhdGlvbjsKLQkJCi0JCS8qKiBUaGUgbG9jYXRpb24gb2YgdGhlIG1vdXNlIGF0IHRoZSB0aW1lIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBQb2ludCBtb3VzZUxvY2F0aW9uOwotCQkKLQkJCi0JCVBvcHVwSGFuZGxlcigpIHsKLQkJCXRoaXMuaW5pdGlhbGl6ZSgpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCUFXVEV2ZW50IGV2ZW50ID0gRXZlbnRRdWV1ZS5nZXRDdXJyZW50RXZlbnQoKTsKLQkJCQotCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCkgewotCQkJCXRoaXMubGFzdE1vdXNlRXZlbnQgPSAoTW91c2VFdmVudCkgZXZlbnQ7Ci0JCQkJdGhpcy5ldmVudENvbXBvbmVudCA9IChKQ29tcG9uZW50KSB0aGlzLmxhc3RNb3VzZUV2ZW50LmdldFNvdXJjZSgpOwotCQkJCXRoaXMuY29tcG9uZW50TG9jYXRpb24gPSB0aGlzLmV2ZW50Q29tcG9uZW50LmdldExvY2F0aW9uT25TY3JlZW4oKTsKLQkJCQl0aGlzLm1vdXNlTG9jYXRpb24gPSB0aGlzLmxhc3RNb3VzZUV2ZW50LmdldFBvaW50KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmV2ZW50Q29tcG9uZW50ID0gbnVsbDsKLQkJCQl0aGlzLmNvbXBvbmVudExvY2F0aW9uID0gbnVsbDsKLQkJCQl0aGlzLm1vdXNlTG9jYXRpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlMaXN0Q2hvb3Nlci50aGlzLmhpZGVQb3B1cCgpOwotCQkJCi0gICAgICAgICAgICBjYWNoZUxpc3QoKTsKLQkJCWlmIChMaXN0Q2hvb3Nlci50aGlzLmNob29zYWJsZSA9PSB0cnVlKSB7Ci0JCQkJLy8gSWYgdGhlIGNvbWJvIGJveCBtb2RlbCBpcyBvZiBzdWZmaWNpZW50IGxlbmd0aCwgdGhlIGJyb3dzZXIgd2lsbCBiZSBzaG93bi4KLQkJCQkvLyBBc2tpbmcgdGhlIGNvbWJvIGJveCBtb2RlbCBmb3IgaXRzIHNpemUgc2hvdWxkIGJlIGVub3VnaCB0byBlbnN1cmUgdGhhdCAKLQkJCQkvLyAgaXRzIHNpemUgaXMgcmVjYWxjdWxhdGVkLgotCQkJCWlmIChMaXN0Q2hvb3Nlci50aGlzLmdldE1vZGVsKCkuZ2V0U2l6ZSgpID4gTGlzdENob29zZXIudGhpcy5sb25nTGlzdFNpemUpIHsKLQkJCQkJdGhpcy5jaGVja0NvbWJvQm94QnV0dG9uKCk7Ci0JCQkJCUxpc3RDaG9vc2VyLnRoaXMuYnJvd3NlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMaXN0Q2hvb3Nlci50aGlzLnNob3dQb3B1cCgpOwotCQkJCQl0aGlzLmNoZWNrTW91c2VQb3NpdGlvbigpOwotCQkJCX0KLQkJCX0KLSAgICAgICAgICAgIGlmIChsaXN0SXNDYWNoZWQoKSkgewotICAgICAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0JCQkKLQkJCUxpc3RDaG9vc2VyLnRoaXMucG9wdXBBbHJlYWR5SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQl9Ci0JCQotCQkvKiogSWYgdGhpcyBpcyBub3QgZG9uZSwgdGhlIGJ1dHRvbiBuZXZlciBiZWNvbWVzIHVuLXByZXNzZWQgKi8KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrQ29tYm9Cb3hCdXR0b24oKSB7Ci0JCQl0cnkgewotCQkJCUJhc2ljQ29tYm9Cb3hVSSBjb21ib0JveFVpID0gKEJhc2ljQ29tYm9Cb3hVSSkgTGlzdENob29zZXIudGhpcy5nZXRVSSgpOwotCQkJCUpCdXR0b24gYXJyb3dCdXR0b24gPSAoSkJ1dHRvbikgQ2xhc3NUb29scy5maWVsZFZhbHVlKGNvbWJvQm94VWksICJhcnJvd0J1dHRvbiIpOwotCQkJCWFycm93QnV0dG9uLmdldE1vZGVsKCkuc2V0UHJlc3NlZChmYWxzZSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB0aGlzIGlzIGEgaHVnZSBoYWNrIHRvIHRyeSBhbmQgbWFrZSB0aGUgY29tYm8gYm94IGxvb2sgcmlnaHQsCi0JCQkJLy8gc28gaWYgaXQgZG9lc24ndCB3b3JrLCBqdXN0IHN3YWxsb3cgdGhlIGV4Y2VwdGlvbgotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogTW92ZXMgdGhlIG1vdXNlIGJhY2sgdG8gaXRzIG9yaWdpbmFsIHBvc2l0aW9uIGJlZm9yZSBhbnkgamlnZ2VyeSBwb2tlcnkgdGhhdCB3ZSd2ZSBkb25lLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrTW91c2VQb3NpdGlvbigpIHsKLQkJCWlmICh0aGlzLmV2ZW50Q29tcG9uZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWZpbmFsIFBvaW50IG5ld0NvbXBvbmVudExvY2F0aW9uID0gdGhpcy5ldmVudENvbXBvbmVudC5nZXRMb2NhdGlvbk9uU2NyZWVuKCk7Ci0JCQlib29sZWFuIGNvbXBvbmVudE1vdmVkID0gCi0JCQkJbmV3Q29tcG9uZW50TG9jYXRpb24ueCAtIHRoaXMuY29tcG9uZW50TG9jYXRpb24ueCAhPSAwCi0JCQkJfHwgbmV3Q29tcG9uZW50TG9jYXRpb24ueSAtIHRoaXMuY29tcG9uZW50TG9jYXRpb24ueSAhPSAwOwotCQkJCi0JCQlpZiAoY29tcG9uZW50TW92ZWQpIHsKLQkJCQl0cnkgewotCQkJCQluZXcgUm9ib3QoKS5tb3VzZU1vdmUoCi0JCQkJCQluZXdDb21wb25lbnRMb2NhdGlvbi54ICsgdGhpcy5tb3VzZUxvY2F0aW9uLngsCi0JCQkJCQluZXdDb21wb25lbnRMb2NhdGlvbi55ICsgdGhpcy5tb3VzZUxvY2F0aW9uLnkKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEFXVEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBtb3ZlIGZhaWxlZCAtIGRvIG5vdGhpbmcKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9kZVNlbGVjdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9kZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjRkMTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL05vZGVTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotLyoqCi0gKiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBGMyBvciBjaG9vc2VzCi0gKiAnR28gVG8nIGluIHRoZSBjb250ZXh0IG1lbnUKLSAqLwotcHVibGljIGludGVyZmFjZSBOb2RlU2VsZWN0b3IgCi17ICAgICAgIAotICAgIC8qKgotICAgICAqIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgTm9kZSBpbiB0aGUgdHJlZSBvciB0aGUgZWRpdG9yIHBhbmVsLgotICAgICAqLwotICAgIHZvaWQgc2VsZWN0Tm9kZUZvcihPYmplY3QgaXRlbSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBOb2RlU2VsZWN0b3Igd2lsbCBkbyBub3RoaW5nIHdoZW4gc2VsZWN0Tm9kZUZvcihPYmplY3QpIGlzIGNhbGxlZAotICAgICAqLwotICAgIGNsYXNzIERlZmF1bHROb2RlU2VsZWN0b3IgaW1wbGVtZW50cyBOb2RlU2VsZWN0b3IgewotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0Tm9kZUZvcihPYmplY3QgaXRlbSkgewotICAgICAgICAgICAgLy9kZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob25DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTcyMjY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob25DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBpbnRlcmZhY2UgY2FuIGJlIHVzZWQKLSAqIHdoZW5ldmVyIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGNhY2hpbmcgKGkuZS4gdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWxlY3Rpb24KLSAqIGxpc3QgY2FuIGJlIGdlbmVyYXRlZCB3aXRoIGxpdHRsZSBsYXRlbmN5KS4gQWxsIHRoZSBub3JtYWwgQ29tYm9Cb3hNb2RlbAotICogYmVoYXZpb3IgaXMgZGVsZWdhdGVkIHRvIGEgY2xpZW50LXN1cHBsaWVkIENvbWJvQm94TW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBOb25DYWNoaW5nQ29tYm9Cb3hNb2RlbCBpbXBsZW1lbnRzIENhY2hpbmdDb21ib0JveE1vZGVsIHsKLQlwcml2YXRlIENvbWJvQm94TW9kZWwgd3JhcHBlZENvbWJvQm94TW9kZWw7Ci0KLQlwdWJsaWMgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwoQ29tYm9Cb3hNb2RlbCB3cmFwcGVkQ29tYm9Cb3hNb2RlbCkgewotCQl0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsID0gd3JhcHBlZENvbWJvQm94TW9kZWw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhY2hpbmdDb21ib0JveE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGNhY2hlTGlzdCgpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgdW5jYWNoZUxpc3QoKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2FjaGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbWJvQm94TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJdGVtKE9iamVjdCBhbkl0ZW0pIHsKLQkJdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5zZXRTZWxlY3RlZEl0ZW0oYW5JdGVtKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIHRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLmdldFNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0RGF0YUxpc3RlbmVyKExpc3REYXRhTGlzdGVuZXIgbCkgewotCQl0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLmFkZExpc3REYXRhTGlzdGVuZXIobCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHsKLQkJdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKGwpOwotCX0gIAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlRGlzcGxheWFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVEaXNwbGF5YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDZkOGUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVEaXNwbGF5YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIERpc3BsYXlhYmxlIGNvbnZlcnRzIGFueSBPYmplY3QKLSAqIHRvIGEgRGlzcGxheWFibGUuIFN1YmNsYXNzIGl0IHRvIG92ZXJyaWRlICNkaXNwbGF5U3RyaW5nKCkgYW5kCi0gKiAjaWNvbigpIGlmIG5lY2Vzc2FyeS4gQ2hhbmdlIG5vdGlmaWNhdGlvbiB3aWxsIGJlIGZpcmVkIGlmIHRoZQotICogb2JqZWN0IGlzIGNoYW5nZWQuCi0gKiAKLSAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIFN0cmluZ3MgLSB0aGUgZGlzcGxheSBzdHJpbmcKLSAqIHdpbGwgc2ltcGx5IGJlIHRoZSBTdHJpbmcgaXRzZWxmLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGlzcGxheWFibGUKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIERpc3BsYXlhYmxlCi17Ci0JLyoqIFRoZSBvYmplY3QgdG8gYmUgY29udmVydGVkIHRvIGEgRGlzcGxheWFibGUuICovCi0JcHJvdGVjdGVkIE9iamVjdCBvYmplY3Q7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGRpc3BsYXlhYmxlIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoT2JqZWN0IG9iamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoYm9vbGVhbiBiKSB7Ci0JCXRoaXMoQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoY2hhciBjKSB7Ci0JCXRoaXMobmV3IENoYXJhY3RlcihjKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGJ5dGUgYikgewotCQl0aGlzKG5ldyBCeXRlKGIpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoc2hvcnQgcykgewotCQl0aGlzKG5ldyBTaG9ydChzKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGludCBpKSB7Ci0JCXRoaXMobmV3IEludGVnZXIoaSkpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShsb25nIGwpIHsKLQkJdGhpcyhuZXcgTG9uZyhsKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGZsb2F0IGYpIHsKLQkJdGhpcyhuZXcgRmxvYXQoZikpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShkb3VibGUgZCkgewotCQl0aGlzKG5ldyBEb3VibGUoZCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEaXNwbGF5YWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIG8pIHsKLQkJcmV0dXJuIERFRkFVTFRfQ09NUEFSQVRPUi5jb21wYXJlKHRoaXMsIG8pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgb2xkRGlzcGxheVN0cmluZyA9IHRoaXMuZGlzcGxheVN0cmluZygpOwotCQlJY29uIG9sZEljb24gPSB0aGlzLmljb24oKTsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkRGlzcGxheVN0cmluZywgdGhpcy5kaXNwbGF5U3RyaW5nKCkpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSUNPTl9QUk9QRVJUWSwgb2xkSWNvbiwgdGhpcy5pY29uKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oKSB7Ci0JCXJldHVybiAoKEJvb2xlYW4pIHRoaXMub2JqZWN0KS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb29sZWFuKGJvb2xlYW4gYikgewotCQl0aGlzLnNldE9iamVjdChCb29sZWFuLnZhbHVlT2YoYikpOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldENoYXIoKSB7Ci0JCXJldHVybiAoKENoYXJhY3RlcikgdGhpcy5vYmplY3QpLmNoYXJWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYXIoY2hhciBjKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KG5ldyBDaGFyYWN0ZXIoYykpOwotCX0KLQotCXB1YmxpYyBieXRlIGdldEJ5dGUoKSB7Ci0JCXJldHVybiAoKEJ5dGUpIHRoaXMub2JqZWN0KS5ieXRlVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCeXRlKGJ5dGUgYikgewotCQl0aGlzLnNldE9iamVjdChuZXcgQnl0ZShiKSk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldFNob3J0KCkgewotCQlyZXR1cm4gKChTaG9ydCkgdGhpcy5vYmplY3QpLnNob3J0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydChzaG9ydCBzKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KG5ldyBTaG9ydChzKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbnQoKSB7Ci0JCXJldHVybiAoKEludGVnZXIpIHRoaXMub2JqZWN0KS5pbnRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludChpbnQgaSkgewotCQl0aGlzLnNldE9iamVjdChuZXcgSW50ZWdlcihpKSk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0TG9uZygpIHsKLQkJcmV0dXJuICgoTG9uZykgdGhpcy5vYmplY3QpLmxvbmdWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvbmcobG9uZyBsKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KG5ldyBMb25nKGwpKTsKLQl9Ci0KLQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoKSB7Ci0JCXJldHVybiAoKEZsb2F0KSB0aGlzLm9iamVjdCkuZmxvYXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZsb2F0KGZsb2F0IGYpIHsKLQkJdGhpcy5zZXRPYmplY3QobmV3IEZsb2F0KGYpKTsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIGdldERvdWJsZSgpIHsKLQkJcmV0dXJuICgoRG91YmxlKSB0aGlzLm9iamVjdCkuZG91YmxlVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb3VibGUoZG91YmxlIGQpIHsKLQkJdGhpcy5zZXRPYmplY3QobmV3IERvdWJsZShkKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5vYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZUxpc3RCcm93c2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdEJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxNWM2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdEJyb3dzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBMaXN0Q2hvb3Nlci5Ccm93c2VyIHVzZXMgYQotICogSk9wdGlvblBhbmUgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgc2VsZWN0aW9uLiBTdWJjbGFzc2VzIAotICogY2FuIGNoYW5nZSB0aGUgZGlhbG9nJ3MgdGl0bGUsIG1lc3NhZ2UsIGFuZC9vciBpY29uLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlTGlzdEJyb3dzZXIKLQlpbXBsZW1lbnRzIExpc3RDaG9vc2VyLkxpc3RCcm93c2VyIAotewotCS8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yICovCi0JcHJvdGVjdGVkIFNpbXBsZUxpc3RCcm93c2VyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBQcm9tcHQgdGhlIHVzZXIgdXNpbmcgYSBKT3B0aW9uUGFuZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBicm93c2UoTGlzdENob29zZXIgY2hvb3NlcikgewotCQlPYmplY3Qgc2VsZWN0aW9uID0gCi0JCQlKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coCi0JCQkJY2hvb3NlciwgCi0JCQkJdGhpcy5tZXNzYWdlKGNob29zZXIpLCAKLQkJCQl0aGlzLnRpdGxlKGNob29zZXIpLCAKLQkJCQl0aGlzLm1lc3NhZ2VUeXBlKGNob29zZXIpLCAKLQkJCQl0aGlzLmljb24oY2hvb3NlciksIAotCQkJCXRoaXMuc2VsZWN0aW9uVmFsdWVzKGNob29zZXIpLCAKLQkJCQl0aGlzLmluaXRpYWxTZWxlY3Rpb25WYWx1ZShjaG9vc2VyKQotCQkJKTsKLQkJCi0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJY2hvb3Nlci5nZXRNb2RlbCgpLnNldFNlbGVjdGVkSXRlbShzZWxlY3Rpb24pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgbWVzc2FnZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGUoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IG1lc3NhZ2VUeXBlKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEljb24gaWNvbihKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3RbXSBzZWxlY3Rpb25WYWx1ZXMoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRUb0FycmF5KGNvbWJvQm94LmdldE1vZGVsKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb25WYWx1ZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIGNvbWJvQm94LmdldE1vZGVsKCkuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGxpc3Qgb2Ygb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIGxpc3QgbW9kZWwKLQkgKiBpbnRvIGFuIGFycmF5LgotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBjb252ZXJ0VG9BcnJheShMaXN0TW9kZWwgbW9kZWwpIHsKLQkJaW50IHNpemUgPSBtb2RlbC5nZXRTaXplKCk7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBtb2RlbC5nZXRFbGVtZW50QXQoaSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdENlbGxSZW5kZXJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZUxpc3RDZWxsUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjZjVkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdENlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi0vKioKLSAqIFRoaXMgcmVuZGVyZXIgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZSBhcyB0aGUgRGVmYXVsdExpc3RDZWxsUmVuZGVyZXI7Ci0gKiBidXQgaXQgc2xpZ2h0bHkgcmVmYWN0b3JzIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgaWNvbiBhbmQgdGV4dCBvZiB0aGUgbGlzdAotICogY2VsbCBzbyB0aGF0IHN1YmNsYXNzZXMgY2FuIGVhc2lseSBvdmVycmlkZSB0aGUgbWV0aG9kcyB0aGF0IGJ1aWxkCi0gKiB0aGUgaWNvbiBhbmQgdGV4dC4KLSAqIAotICogSW4gbW9zdCBjYXNlcywgeW91IG5lZWQgb25seSBvdmVycmlkZToKLSAqICAgICAjYnVpbGRJY29uKE9iamVjdCB2YWx1ZSkKLSAqICAgICAjYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIKLQlleHRlbmRzIERlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyCi17Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzaW1wbGUgcmVuZGVyZXIuCi0JICovCi0JcHVibGljIFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCS8vIHN1YnN0aXR1dGUgbnVsbCBmb3IgdGhlIGNlbGwgdmFsdWUgc28gbm90aGluZyBpcyBkcmF3biBpbml0aWFsbHkuLi4KLQkJc3VwZXIuZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChsaXN0LCBudWxsLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLQkJdGhpcy5zZXRPcGFxdWUodHJ1ZSk7Ci0KLQkJLy8gLi4udGhlbiBzZXQgdGhlIGljb24gYW5kIHRleHQgbWFudWFsbHkKLQkJdGhpcy5zZXRJY29uKHRoaXMuYnVpbGRJY29uKGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0JCXRoaXMuc2V0VGV4dCh0aGlzLmJ1aWxkVGV4dChsaXN0LCB2YWx1ZSwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cykpOwotCi0JCXRoaXMuc2V0VG9vbFRpcFRleHQodGhpcy5idWlsZFRvb2xUaXBUZXh0KGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0KLQkJLy8gdGhlIGNvbnRleHQgd2lsbCBiZSBpbml0aWFsaXplZCBvbmx5IGlmIGEgcmVhZGVyIGlzIHJ1bm5pbmcKLQkJaWYgKHRoaXMuYWNjZXNzaWJsZUNvbnRleHQgIT0gbnVsbCkgewotCQkJdGhpcy5hY2Nlc3NpYmxlQ29udGV4dC5zZXRBY2Nlc3NpYmxlTmFtZSh0aGlzLmJ1aWxkQWNjZXNzaWJsZU5hbWUobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpKTsKLQkJfQotCi0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaWNvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZSBhbmQgb3RoZXIgc2V0dGluZ3MuIChFdmVuIG1vcmUgc2V0dGluZ3MgYXJlCi0JICogYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIEljb24gYnVpbGRJY29uKEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSWNvbih2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpY29uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY2VsbAotCSAqIHZhbHVlLiBUaGUgZGVmYXVsdCBpcyB0byBkaXNwbGF5IG5vIGljb24gYXQgYWxsIHVubGVzcyB0aGUKLQkgKiB2YWx1ZSBpdHNlbGYgaXMgYW4gaWNvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSWNvbiBidWlsZEljb24oT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIHJlcGxpY2F0ZSB0aGUgZGVmYXVsdCBiZWhhdmlvcgotCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgSWNvbikgPyAoSWNvbikgdmFsdWUgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZSBhbmQgb3RoZXIgc2V0dGluZ3MuIChFdmVuIG1vcmUgc2V0dGluZ3MgYXJlCi0JICogYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUZXh0KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjZWxsCi0JICogdmFsdWUuIFRoZSBkZWZhdWx0IGlzIHRvIGRpc3BsYXkgdGhlIG9iamVjdCdzIGRlZmF1bHQgc3RyaW5nCi0JICogcmVwcmVzZW50YXRpb24gKGFzIHJldHVybmVkIGJ5ICN0b1N0cmluZygpKTsgdW5sZXNzIHRoZQotCSAqIHZhbHVlIGl0c2VsZiBpcyBhbiBpY29uLCBpbiB3aGljaCBjYXNlIG5vIHRleHQgaXMgZGlzcGxheWVkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgSWNvbikgPyAiIiA6ICgodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCBkaXNwbGF5ZWQgd2hlbiB0aGUgY3Vyc29yIGxpbmdlcnMgb3ZlciB0aGUgc3BlY2lmaWVkIGNlbGwuCi0JICogKEV2ZW4gbW9yZSBzZXR0aW5ncyBhcmUgYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRvb2xUaXBUZXh0KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVG9vbFRpcFRleHQodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCBkaXNwbGF5ZWQgd2hlbiB0aGUgY3Vyc29yIGxpbmdlcnMgb3ZlciB0aGUgc3BlY2lmaWVkIGNlbGwuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRvb2xUaXBUZXh0KE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFjY2Vzc2libGUgbmFtZSB0byBiZSBnaXZlbiB0byB0aGUgY29tcG9uZW50IHVzZWQgdG8gcmVuZGVyCi0JICogdGhlIGdpdmVuIHZhbHVlIGFuZCBvdGhlciBzZXR0aW5ncy4gKEV2ZW4gbW9yZSBzZXR0aW5ncyBhcmUgYWNjZXNzaWJsZSB2aWEKLQkgKiBpbmhlcml0ZWQgZ2V0dGVyczogaGFzRm9jdXMsIGlzRW5hYmxlZCwgZXRjLikKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQWNjZXNzaWJsZU5hbWUoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRBY2Nlc3NpYmxlTmFtZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY2Nlc3NpYmxlIG5hbWUgdG8gYmUgZ2l2ZW4gdG8gdGhlIGNvbXBvbmVudCB1c2VkIHRvIHJlbmRlcgotCSAqIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQWNjZXNzaWJsZU5hbWUoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDA3MWU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TcGlubmVyVGFibGVDZWxsUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotCi1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpTcGlubmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogTWFrZSB0aGUgY2VsbCBsb29rIGxpa2UgYSBzcGlubmVyLgotICovCi1wdWJsaWMgY2xhc3MgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudHMgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciB7Ci0KLQkvKiogdGhlIGNvbXBvbmVudCB1c2VkIHRvIHBhaW50IHRoZSBjZWxsICovCi0JcHJvdGVjdGVkIEpTcGlubmVyIHNwaW5uZXI7Ci0JCi0JLyoqIHRoZSBsaXN0ZW5lciB0byBiZSBub3RpZmllZCBvbiBhbiBpbW1lZGlhdGUgZWRpdCAqLwotCXByb3RlY3RlZCBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBpbW1lZGlhdGVFZGl0TGlzdGVuZXI7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIGRlZmF1bHQKLQkgKiBzcGlubmVyIG1vZGVsLCB3aGljaCBpcyBhICJudW1iZXIiIG1vZGVsLgotCSAqLwotCXB1YmxpYyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQKLQkgKiBzcGlubmVyIG1vZGVsLCB3aGljaCB3aWxsIGRldGVybWluZSBob3cgdGhlIHZhbHVlcyBhcmUgZGlzcGxheWVkLgotCSAqLwotCXB1YmxpYyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIoU3Bpbm5lck1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5zZXRNb2RlbChtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zcGlubmVyID0gdGhpcy5idWlsZFNwaW5uZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSlNwaW5uZXIgYnVpbGRTcGlubmVyKCkgewotCQlKU3Bpbm5lciBzID0gbmV3IEpTcGlubmVyKCk7Ci0JCXMuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCkpOwotCQlyZXR1cm4gczsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyLmltbWVkaWF0ZUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJdGhpcy5zcGlubmVyLnNldENvbXBvbmVudE9yaWVudGF0aW9uKHRhYmxlLmdldENvbXBvbmVudE9yaWVudGF0aW9uKCkpOwotCQl0aGlzLnNwaW5uZXIuc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwotCQl0aGlzLnNwaW5uZXIuc2V0RW5hYmxlZCh0YWJsZS5pc0VuYWJsZWQoKSk7Ci0KLQkJSkNvbXBvbmVudCBlZGl0b3IgPSB0aGlzLmVkaXRvcigpOwotCQllZGl0b3Iuc2V0Rm9yZWdyb3VuZCh0aGlzLmZvcmVncm91bmRDb2xvcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJZWRpdG9yLnNldEJhY2tncm91bmQodGhpcy5iYWNrZ3JvdW5kQ29sb3IodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCXRoaXMuc3Bpbm5lci5zZXRCb3JkZXIodGhpcy5ib3JkZXIodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0KLQkJdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXJldHVybiB0aGlzLnNwaW5uZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgZm9yZWdyb3VuZCBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3IgZm9yZWdyb3VuZENvbG9yKEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLmZvY3VzQ2VsbEZvcmVncm91bmQiKTsKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIHRhYmxlLmdldEZvcmVncm91bmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBiYWNrZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBiYWNrZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZm9jdXNDZWxsQmFja2dyb3VuZCIpOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0QmFja2dyb3VuZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJvcmRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9yZGVyIGJvcmRlcihKVGFibGUgdGFibGUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlpZiAoaGFzRm9jdXMpIHsKLQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Qm9yZGVyKCJUYWJsZS5mb2N1c0NlbGxIaWdobGlnaHRCb3JkZXIiKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCXJldHVybiBCb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIodGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpLCAxKTsKLQkJfQotCQlyZXR1cm4gQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKHRhYmxlLmdldEJhY2tncm91bmQoKSwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlZGl0b3IgY29tcG9uZW50IHdob3NlIGNvbG9ycyBzaG91bGQgYmUgc2V0Ci0JICogYnkgdGhlIHJlbmRlcmVyLgotCSAqLwotCXByb3RlY3RlZCBKQ29tcG9uZW50IGVkaXRvcigpIHsKLQkJSkNvbXBvbmVudCBlZGl0b3IgPSB0aGlzLnNwaW5uZXIuZ2V0RWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBKU3Bpbm5lci5EZWZhdWx0RWRpdG9yKSB7Ci0JCQkvLyB0eXBpY2FsbHksIHRoZSBlZGl0b3Igd2lsbCBiZSB0aGUgZGVmYXVsdCBvciBvbmUgb2YgaXRzIHN1YmNsYXNzZXMuLi4KLQkJCWVkaXRvciA9ICgoSlNwaW5uZXIuRGVmYXVsdEVkaXRvcikgZWRpdG9yKS5nZXRUZXh0RmllbGQoKTsKLQkJfQotCQlyZXR1cm4gZWRpdG9yOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lcidzIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIENSIzM5OTkzMTggLSBUaGlzIG51bGwgY2hlY2sgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIEpESyBidWcgaXMgZml4ZWQKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gbmV3IEludGVnZXIoMCk7Ci0JCX0KLQkJdGhpcy5zcGlubmVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGlubmVyLmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEltbWVkaWF0ZUVkaXRMaXN0ZW5lcihUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lcidzIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKFNwaW5uZXJNb2RlbCBtb2RlbCkgewotCQl0aGlzLnNwaW5uZXIuc2V0TW9kZWwobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVuZGVyZXIncyBwcmVmZXJyZWQgaGVpZ2h0LiBUaGlzIGFsbG93cyB5b3UKLQkgKiB0byBzZXQgdGhlIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBzcGlubmVyIHdpbGwgbG9vayBnb29kIGluLi4uLgotCSAqLwotCXB1YmxpYyBpbnQgcHJlZmVycmVkSGVpZ2h0KCkgewotCQkvLyBhZGQgaW4gc3BhY2UgZm9yIHRoZSBib3JkZXIgdG9wIGFuZCBib3R0b20KLQkJcmV0dXJuIChpbnQpIHRoaXMuc3Bpbm5lci5nZXRQcmVmZXJyZWRTaXplKCkuZ2V0SGVpZ2h0KCkgKyAyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1RhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9UYWJsZUNlbGxFZGl0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMTg2OTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1RhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdENlbGxFZGl0b3I7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ2VsbEVkaXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNlbGxSZW5kZXJlcjsKLQotLyoqCi0gKiBBIHRhYmxlIGNlbGwgZWRpdG9yIHRoYXQgd3JhcHMgYSB0YWJsZSBjZWxsIHJlbmRlcmVyLgotICovCi1wdWJsaWMgY2xhc3MgVGFibGVDZWxsRWRpdG9yQWRhcHRlciBleHRlbmRzIEFic3RyYWN0Q2VsbEVkaXRvciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvciB7Ci0KLQkvKiogZGVsZWdhdGUgdG8gYSByZW5kZXJlciAqLwotCXByaXZhdGUgUmVuZGVyZXIgcmVuZGVyZXI7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQotCXByaXZhdGUgVGFibGVDZWxsRWRpdG9yQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCBlZGl0b3IgdGhhdCBiZWhhdmVzIGxpa2UgdGhlIHNwZWNpZmllZCByZW5kZXJlci4KLQkgKi8KLQlwdWJsaWMgVGFibGVDZWxsRWRpdG9yQWRhcHRlcihSZW5kZXJlciByZW5kZXJlcikgewotCQl0aGlzKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShyZW5kZXJlcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUmVuZGVyZXIgcikgewotCQl0aGlzLnJlbmRlcmVyID0gcjsKLQkJci5zZXRJbW1lZGlhdGVFZGl0TGlzdGVuZXIodGhpcy5idWlsZEltbWVkaWF0ZUVkaXRMaXN0ZW5lcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbW1lZGlhdGVFZGl0TGlzdGVuZXIgYnVpbGRJbW1lZGlhdGVFZGl0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSW1tZWRpYXRlRWRpdExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaW1tZWRpYXRlRWRpdCgpIHsKLQkJCQlUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLnRoaXMuc3RvcENlbGxFZGl0aW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogQ2VsbEVkaXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIE9iamVjdCBnZXRDZWxsRWRpdG9yVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlbmRlcmVyLmdldFZhbHVlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsRWRpdG9yQ29tcG9uZW50KEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLnJlbmRlcmVyLmdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIHRydWUsIHJvdywgY29sdW1uKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBNZW1iZXIgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgbWV0aG9kcyB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSByZW5kZXJlcgotCSAqIHRoYXQgY2FuIGJlIHdyYXBwZWQgYnkgYSBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXIgZXh0ZW5kcyBUYWJsZUNlbGxSZW5kZXJlciB7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSByZW5kZXJlci4KLQkJICovCi0JCU9iamVjdCBnZXRWYWx1ZSgpOwotCQkKLQkJLyoqCi0JCSAqIFNldCB0aGUgaW1tZWRpYXRlIGVkaXQgbGlzdGVuZXIKLQkJICovCi0JCXZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JfQotCQotCQotCXB1YmxpYyBpbnRlcmZhY2UgSW1tZWRpYXRlRWRpdExpc3RlbmVyIHsKLQkJCi0JCS8qKgotCQkgKiBDYWxsZWQgd2hlbiB0aGUgcmVuZGVyZXIgZG9lcyBhbiAiaW1tZWRpYXRlIGVkaXQiCi0JCSAqLwotCQl2b2lkIGltbWVkaWF0ZUVkaXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2YyZmQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IG1vZGVscyB0aGF0IG5vdGlmeSBsaXN0ZW5lcnMgb2YKLSAqIGNoYW5nZXMgdG8gYm91bmQgcHJvcGVydGllcywgY29sbGVjdGlvbnMsIGxpc3RzLCBhbmQvb3IgdHJlZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsIHsKLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgc3RhdGUgY2hhbmdlIGV2ZW50cy4KLQkgKiBUaGUgc2FtZSBsaXN0ZW5lciBtYXkgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UgYW5kIHdpbGwgYmUgY2FsbGVkCi0JICogYXMgbWFueSB0aW1lcyBhcyBpdCBpcyBhZGRlZC4gVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHN0YXRlIGNoYW5nZSBsaXN0ZW5lci4gSWYgdGhlIGxpc3RlbmVyCi0JICogd2FzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLCBpdCB3aWxsIGJlIG5vdGlmaWVkIG9uZSBsZXNzIHRpbWUKLQkgKiBhZnRlciBiZWluZyByZW1vdmVkLiBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlCi0JICogbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzLAotCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb3BlcnR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZXZlbnQuCi0JICogVGhlIHNhbWUgbGlzdGVuZXIgbWF5IGJlIGFkZGVkIG1vcmUgdGhhbiBvbmNlIGFuZCB3aWxsIGJlIGNhbGxlZAotCSAqIGFzIG1hbnkgdGltZXMgYXMgaXQgaXMgYWRkZWQuIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHByb3BlcnR5IGNoYW5nZSBldmVudHMgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZS4KLQkgKiBUaGUgc2FtZSBsaXN0ZW5lciBtYXkgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UgYW5kIHdpbGwgYmUgY2FsbGVkCi0JICogYXMgbWFueSB0aW1lcyBhcyBpdCBpcyBhZGRlZC4gVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgcHJvcGVydHkgY2hhbmdlIGV2ZW50cywKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSBwcm9wZXJ0eSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGV2ZW50LgotCSAqIElmIHRoZSBsaXN0ZW5lciB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UsIGl0IHdpbGwgYmUgbm90aWZpZWQgb25lIGxlc3MKLQkgKiB0aW1lIGFmdGVyIGJlaW5nIHJlbW92ZWQuIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUKLQkgKiBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lLgotCSAqIElmIHRoZSBsaXN0ZW5lciB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UsIGl0IHdpbGwgYmUgbm90aWZpZWQgb25lIGxlc3MKLQkgKiB0aW1lIGFmdGVyIGJlaW5nIHJlbW92ZWQuIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUKLQkgKiBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzLAotCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbGxlY3Rpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBldmVudC4KLQkgKiBUaGUgc2FtZSBsaXN0ZW5lciBtYXkgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UgYW5kIHdpbGwgYmUgY2FsbGVkCi0JICogYXMgbWFueSB0aW1lcyBhcyBpdCBpcyBhZGRlZC4gVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG5hbWUuCi0JICogVGhlIHNhbWUgbGlzdGVuZXIgbWF5IGJlIGFkZGVkIG1vcmUgdGhhbiBvbmNlIGFuZCB3aWxsIGJlIGNhbGxlZAotCSAqIGFzIG1hbnkgdGltZXMgYXMgaXQgaXMgYWRkZWQuIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cywKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSBjb2xsZWN0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZXZlbnQuCi0JICogSWYgdGhlIGxpc3RlbmVyIHdhcyBhZGRlZCBtb3JlIHRoYW4gb25jZSwgaXQgd2lsbCBiZSBub3RpZmllZCBvbmUgbGVzcwotCSAqIHRpbWUgYWZ0ZXIgYmVpbmcgcmVtb3ZlZC4gQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZQotCSAqIGxpc3RlbmVyIGlzIG51bGwgb3IgaWYgdGhlIGxpc3RlbmVyIHdhcyBuZXZlciBhZGRlZC4KLQkgKi8KLQl2b2lkIHJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHMsCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gbmFtZS4KLQkgKiBJZiB0aGUgbGlzdGVuZXIgd2FzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLCBpdCB3aWxsIGJlIG5vdGlmaWVkIG9uZSBsZXNzCi0JICogdGltZSBhZnRlciBiZWluZyByZW1vdmVkLiBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlCi0JICogbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGxpc3QgY2hhbmdlIGV2ZW50cywKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSBsaXN0IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZXZlbnQuCi0JICogVGhlIHNhbWUgbGlzdGVuZXIgbWF5IGJlIGFkZGVkIG1vcmUgdGhhbiBvbmNlIGFuZCB3aWxsIGJlIGNhbGxlZAotCSAqIGFzIG1hbnkgdGltZXMgYXMgaXQgaXMgYWRkZWQuIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBsaXN0IGNoYW5nZSBldmVudHMgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbGlzdCBuYW1lLgotCSAqIFRoZSBzYW1lIGxpc3RlbmVyIG1heSBiZSBhZGRlZCBtb3JlIHRoYW4gb25jZSBhbmQgd2lsbCBiZSBjYWxsZWQKLQkgKiBhcyBtYW55IHRpbWVzIGFzIGl0IGlzIGFkZGVkLiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0Jdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBsaXN0IGNoYW5nZSBldmVudHMsCi0JICogcmVnYXJkbGVzcyBvZiB0aGUgbGlzdCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGV2ZW50LgotCSAqIElmIHRoZSBsaXN0ZW5lciB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UsIGl0IHdpbGwgYmUgbm90aWZpZWQgb25lIGxlc3MKLQkgKiB0aW1lIGFmdGVyIGJlaW5nIHJlbW92ZWQuIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUKLQkgKiBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgbGlzdCBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG5hbWUuCi0JICogSWYgdGhlIGxpc3RlbmVyIHdhcyBhZGRlZCBtb3JlIHRoYW4gb25jZSwgaXQgd2lsbCBiZSBub3RpZmllZCBvbmUgbGVzcwotCSAqIHRpbWUgYWZ0ZXIgYmVpbmcgcmVtb3ZlZC4gQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZQotCSAqIGxpc3RlbmVyIGlzIG51bGwgb3IgaWYgdGhlIGxpc3RlbmVyIHdhcyBuZXZlciBhZGRlZC4KLQkgKi8KLQl2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0cmVlIGNoYW5nZSBldmVudHMsCi0JICogcmVnYXJkbGVzcyBvZiB0aGUgdHJlZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGV2ZW50LgotCSAqIFRoZSBzYW1lIGxpc3RlbmVyIG1heSBiZSBhZGRlZCBtb3JlIHRoYW4gb25jZSBhbmQgd2lsbCBiZSBjYWxsZWQKLQkgKiBhcyBtYW55IHRpbWVzIGFzIGl0IGlzIGFkZGVkLiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0Jdm9pZCBhZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdHJlZSBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIHRyZWUgbmFtZS4KLQkgKiBUaGUgc2FtZSBsaXN0ZW5lciBtYXkgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UgYW5kIHdpbGwgYmUgY2FsbGVkCi0JICogYXMgbWFueSB0aW1lcyBhcyBpdCBpcyBhZGRlZC4gVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdHJlZSBjaGFuZ2UgZXZlbnRzLAotCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHRyZWUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBldmVudC4KLQkgKiBJZiB0aGUgbGlzdGVuZXIgd2FzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLCBpdCB3aWxsIGJlIG5vdGlmaWVkIG9uZSBsZXNzCi0JICogdGltZSBhZnRlciBiZWluZyByZW1vdmVkLiBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlCi0JICogbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRyZWUgY2hhbmdlIGV2ZW50cywKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgdHJlZSBuYW1lLgotCSAqIElmIHRoZSBsaXN0ZW5lciB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UsIGl0IHdpbGwgYmUgbm90aWZpZWQgb25lIGxlc3MKLQkgKiB0aW1lIGFmdGVyIGJlaW5nIHJlbW92ZWQuIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUKLQkgKiBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ2hhbmdlRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9DaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzk0MDQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9DaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIGZvciBhbGwgdGhlIGNoYW5nZSBldmVudHMgdGhhdCBjYW4gYmUgZmlyZWQgYnkgbW9kZWxzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hhbmdlRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNoYW5nZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqLwotCXByb3RlY3RlZCBDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE1vZGVsIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIChNb2RlbCkgc3VwZXIuZ2V0U291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhc3BlY3Qgb2YgdGhlIHNvdXJjZSB0aGF0IGNoYW5nZWQuCi0JICogTWF5IGJlIG51bGwgaWYgaW5hcHByb3ByaWF0ZS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEFzcGVjdE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBDaGFuZ2VFdmVudCBjbG9uZVdpdGhTb3VyY2UoTW9kZWwgbmV3U291cmNlKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0QXNwZWN0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2hhbmdlRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiYWQxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJjb2xsZWN0aW9uIGNoYW5nZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiBjb2xsZWN0aW9uLiBBIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLgotICogCi0gKiBOb3JtYWxseSBhIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBpcyBhY2NvbXBhbmllZCBieSB0aGUgY29sbGVjdGlvbiBuYW1lIGFuZAotICogdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhlIGNoYW5nZWQgY29sbGVjdGlvbi4KLSAqIAotICogRGVzaWduIG9wdGlvbnM6Ci0gKiAtIGNyZWF0ZSBhIGNvbGxlY3Rpb24gdG8gd3JhcCBhIHNpbmdsZSBhZGRlZCBvciByZW1vdmVkIGl0ZW0KLSAqIAkodGhpcyBpcyB0aGUgb3B0aW9uIHdlIGltcGxlbWVudGVkIGJlbG93IGFuZCBpbiBjb2xsYWJvcmF0aW5nIGNvZGUpCi0gKiAJc2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIG9wdGltaXplIGRvd25zdHJlYW0gY29kZSBmb3IKLSAqIAlzaW5nbGUgaXRlbXMsIHdlIHRha2UgYW5vdGhlciBwZXJmb3JtYW5jZSBoaXQgYnkgYnVpbGRpbmcKLSAqIAlhIGNvbGxlY3Rpb24gZWFjaCB0aW1lICAoQHNlZSBDb2xsZWN0aW9ucyNzaW5nbGV0b24oT2JqZWN0KSkKLSAqIAlhbmQgZm9yY2luZyBkb3duc3RyZWFtIGNvZGUgdG8gdXNlIGFuIGl0ZXJhdG9yIGV2ZXJ5IHRpbWUKLSAqIAotICogLSBmaXJlIGEgc2VwYXJhdGUgZXZlbnQgZm9yIGVhY2ggaXRlbSBhZGRlZCBvciByZW1vdmVkCi0gKiAJZWxpbWluYXRlcyBhbnkgcG90ZW50aWFsIGZvciBvcHRpbWl6YXRpb25zIHRvIGRvd25zdHJlYW0gY29kZQotICogCi0gKiAtIGFkZCBwcm90b2NvbCB0byBzdXBwb3J0IGJvdGggc2luZ2xlIGl0ZW1zIGFuZCBjb2xsZWN0aW9ucwotICogCWFkZHMgY29uZGl0aW9uYWwgbG9naWMgdG8gZG93bnN0cmVhbSBjb2RlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKiogTmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGNoYW5nZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29sbGVjdGlvbk5hbWU7Ci0KLQkvKiogVGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24uIE1heSBiZSBlbXB0eSwgaWYgbm90IGtub3duLiAqLwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjw/PiBpdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyB0aGF0IHdlcmUgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gaXRlbXMpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKChjb2xsZWN0aW9uTmFtZSA9PSBudWxsKSB8fCAoaXRlbXMgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29sbGVjdGlvbk5hbWUgPSBjb2xsZWN0aW9uTmFtZTsKLQkJdGhpcy5pdGVtcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBjb2xsZWN0aW9uIGNoYW5nZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXRoaXMoc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbGxlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHRvIG9yCi0JICogcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotCSAqIE1heSBiZSBlbXB0eSBpZiBpbmFwcHJvcHJpYXRlIG9yIHVua25vd24uCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPD8+IGl0ZW1zKCkgewotCQlyZXR1cm4gdGhpcy5pdGVtcy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB0byBvcgotCSAqIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4KLQkgKiBNYXkgYmUgMCBpZiBpbmFwcHJvcHJpYXRlIG9yIHVua25vd24uCi0JICovCi0JcHVibGljIGludCBpdGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZW1zLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGNsb25lV2l0aFNvdXJjZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQobmV3U291cmNlLCB0aGlzLmNvbGxlY3Rpb25OYW1lLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBjbG9uZVdpdGhTb3VyY2UoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3Q29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQobmV3U291cmNlLCBuZXdDb2xsZWN0aW9uTmFtZSwgdGhpcy5pdGVtcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENoYW5nZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZWZmMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImxpc3QgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIGxpc3QuIEEgTGlzdENoYW5nZUV2ZW50IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSBMaXN0Q2hhbmdlTGlzdGVuZXIuCi0gKiAKLSAqIE5vcm1hbGx5IGEgTGlzdENoYW5nZUV2ZW50IGlzIGFjY29tcGFuaWVkIGJ5IHRoZSBsaXN0IG5hbWUsCi0gKiB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGUgY2hhbmdlZCBsaXN0LAotICogYW5kIHRoZSBpbmRleCBvZiB3aGVyZSB0aGUgaXRlbXMgYXJlIG9yIHdlcmUgaW4gdGhlIGxpc3QuCi0gKiAKLSAqIERlc2lnbiBvcHRpb25zOgotICogLSBjcmVhdGUgYSBsaXN0IHRvIHdyYXAgYSBzaW5nbGUgYWRkZWQgb3IgcmVtb3ZlZCBpdGVtCi0gKiAJKHRoaXMgaXMgdGhlIG9wdGlvbiB3ZSBpbXBsZW1lbnRlZCBiZWxvdyBhbmQgaW4gY29sbGFib3JhdGluZyBjb2RlKQotICogCXNpbmNlIHRoZXJlIGlzIG5vIHdheSB0byBvcHRpbWl6ZSBkb3duc3RyZWFtIGNvZGUgZm9yCi0gKiAJc2luZ2xlIGl0ZW1zLCB3ZSB0YWtlIGFub3RoZXIgcGVyZm9ybWFuY2UgaGl0IGJ5IGJ1aWxkaW5nCi0gKiAJYSBsaXN0IGVhY2ggdGltZSAgKEBzZWUgQ29sbGVjdGlvbnMjc2luZ2xldG9uTGlzdChPYmplY3QpKQotICogCWFuZCBmb3JjaW5nIGRvd25zdHJlYW0gY29kZSB0byB1c2UgYSBsaXN0IGl0ZXJhdG9yIGV2ZXJ5IHRpbWUKLSAqIAotICogLSBmaXJlIGEgc2VwYXJhdGUgZXZlbnQgZm9yIGVhY2ggaXRlbSBhZGRlZCBvciByZW1vdmVkCi0gKiAJZWxpbWluYXRlcyBhbnkgcG90ZW50aWFsIGZvciBvcHRpbWl6YXRpb25zIHRvIGRvd25zdHJlYW0gY29kZQotICogCi0gKiAtIGFkZCBwcm90b2NvbCB0byBzdXBwb3J0IGJvdGggc2luZ2xlIGl0ZW1zIGFuZCBjb2xsZWN0aW9ucwotICogCWFkZHMgY29uZGl0aW9uYWwgbG9naWMgdG8gZG93bnN0cmVhbSBjb2RlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0Q2hhbmdlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKioKLQkgKiBOYW1lIG9mIHRoZSBsaXN0IHRoYXQgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXN0TmFtZTsKLQotCS8qKgotCSAqIFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSBhZGRlZCwgcmVtb3ZlZCwgb3IgcmVwbGFjZWQuCi0JICogSW4gdGhlIGNhc2Ugb2YgIm1vdmVkIiBpdGVtcywgdGhpcyB3aWxsIGJlIHRoZSAidGFyZ2V0IiBpbmRleC4KLQkgKiBNYXkgYmUgLTEsIGlmIG5vdCBrbm93bi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLQotCS8qKgotCSAqIFRoZSBpdGVtcyB0aGF0IHdlcmUgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiBJbiB0aGUgY2FzZSBvZgotCSAqICJyZXBsYWNlZCIgaXRlbXMsIHRoZXNlIGFyZSB0aGUgbmV3IGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqIEluIHRoZSBjYXNlIG9mICJtb3ZlZCIgaXRlbXMsIHRoaXMgd2lsbCBiZSBlbXB0eS4KLQkgKiBNYXkgYmUgZW1wdHksIGlmIG5vdCBrbm93bi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3Q8Pz4gaXRlbXM7Ci0KLQkvKioKLQkgKiBUaGUgaXRlbXMgaW4gdGhlIGxpc3QgdGhhdCB3ZXJlIHJlcGxhY2VkIGJ5IHRoZSBpdGVtcyBsaXN0ZWQgYWJvdmUsCi0JICogaW4gI2l0ZW1zLiBNYXkgYmUgZW1wdHksIGlmIG5vdCBrbm93bi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3Q8Pz4gcmVwbGFjZWRJdGVtczsKLQotCS8qKgotCSAqIEluIHRoZSBjYXNlIG9mICJtb3ZlZCIgaXRlbXMsIHRoaXMgd2lsbCBiZSB0aGUgInNvdXJjZSIgaW5kZXguCi0JICogTWF5IGJlIC0xLCBpZiBub3Qga25vd24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgc291cmNlSW5kZXg7Ci0KLQkvKioKLQkgKiBJbiB0aGUgY2FzZSBvZiAibW92ZWQiIGl0ZW1zLCB0aGlzIHdpbGwgYmUgdGhlIG51bWJlciBvZiBpdGVtcyBtb3ZlZC4KLQkgKiBNYXkgYmUgLTEsIGlmIG5vdCBrbm93bi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBtb3ZlTGVuZ3RoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBpdGVtcywgTGlzdDw/PiByZXBsYWNlZEl0ZW1zLCBpbnQgc291cmNlSW5kZXgsIGludCBtb3ZlTGVuZ3RoKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCWlmICgobGlzdE5hbWUgPT0gbnVsbCkgfHwgKGl0ZW1zID09IG51bGwpIHx8IChyZXBsYWNlZEl0ZW1zID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3ROYW1lID0gbGlzdE5hbWU7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJdGhpcy5pdGVtcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoaXRlbXMpOwotCQl0aGlzLnJlcGxhY2VkSXRlbXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlcGxhY2VkSXRlbXMpOwotCQl0aGlzLnNvdXJjZUluZGV4ID0gc291cmNlSW5kZXg7Ci0JCXRoaXMubW92ZUxlbmd0aCA9IG1vdmVMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgY2hhbmdlIGV2ZW50IGZvciBhIGxpc3Qgb2YgcmVwbGFjZWQgaXRlbXMuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgaW4gdGhlIGxpc3Qgd2VyZSByZXBsYWNlZC4KLQkgKiBAcGFyYW0gaXRlbXMgVGhlIG5ldyBpdGVtcyBpbiB0aGUgbGlzdC4KLQkgKiBAcGFyYW0gcmVwbGFjZWRJdGVtcyBUaGUgaXRlbXMgaW4gdGhlIGxpc3QgdGhhdCB3ZXJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBpdGVtcywgTGlzdDw/PiByZXBsYWNlZEl0ZW1zKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zLCByZXBsYWNlZEl0ZW1zLCAtMSwgLTEpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IGNoYW5nZSBldmVudCBmb3IgYSBsaXN0IG9mIGFkZGVkIG9yIHJlbW92ZWQgaXRlbXMuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhlIGxpc3QuCi0JICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyB0aGF0IHdlcmUgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBMaXN0Q2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBpdGVtcykgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBpdGVtcywgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIC0xLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgY2hhbmdlIGV2ZW50IGZvciBhIGxpc3Qgb2YgbW92ZWQgaXRlbXMuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIHRhcmdldEluZGV4IFRoZSBpbmRleCB0byB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4KLQkgKiBAcGFyYW0gc291cmNlSW5kZXggVGhlIGluZGV4IGZyb20gd2hpY2ggdGhlIGl0ZW1zIHdlcmUgbW92ZWQuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJdGhpcyhzb3VyY2UsIGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSkgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIC0xLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIC0xLCAtMSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3ROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5saXN0TmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3ROYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgYWRkZWQgdG8sIHJlbW92ZWQgZnJvbSwKLQkgKiBvciByZXBsYWNlZCBpbiB0aGUgbGlzdC4KLQkgKiBJbiB0aGUgY2FzZSBvZiAibW92ZWQiIGl0ZW1zLCB0aGlzIHdpbGwgYmUgdGhlICJ0YXJnZXQiIGluZGV4LgotCSAqIE1heSBiZSAtMSBpZiBpbmFwcHJvcHJpYXRlIG9yIHVua25vd24uCi0JICovCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvbiB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHRvIG9yCi0JICogcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiBJbiB0aGUgY2FzZSBvZiAicmVwbGFjZWQiIGl0ZW1zLCB0aGVzZQotCSAqIGFyZSB0aGUgbmV3IGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqIE1heSBiZSBlbXB0eSBpZiBpbmFwcHJvcHJpYXRlIG9yIHVua25vd24uCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjw/PiBpdGVtcygpIHsKLQkJcmV0dXJuIHRoaXMuaXRlbXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHRvLAotCSAqIHJlbW92ZWQgZnJvbSwgb3IgcmVwbGFjZWQgaW4gdGhlIGxpc3QuCi0JICogTWF5IGJlIDAgaWYgaW5hcHByb3ByaWF0ZSBvciB1bmtub3duLgotCSAqLwotCXB1YmxpYyBpbnQgaXRlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5pdGVtcy5zaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlcGxhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvbiB0aGUgaXRlbXMgaW4gdGhlIGxpc3QgdGhhdCB3ZXJlIHJlcGxhY2VkLgotCSAqIE1heSBiZSBlbXB0eSBpZiBpbmFwcHJvcHJpYXRlIG9yIHVua25vd24uCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjw/PiByZXBsYWNlZEl0ZW1zKCkgewotCQlyZXR1cm4gdGhpcy5yZXBsYWNlZEl0ZW1zLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb3ZlICoqKioqKioqKioKLQotCS8qKgotCSAqIEluIHRoZSBjYXNlIG9mICJtb3ZlZCIgaXRlbXMsIHRoaXMgd2lsbCBiZSB0aGUgInRhcmdldCIgaW5kZXguCi0JICogTWF5IGJlIC0xIGlmIGluYXBwcm9wcmlhdGUgb3IgdW5rbm93bi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhcmdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5pbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBJbiB0aGUgY2FzZSBvZiAibW92ZWQiIGl0ZW1zLCB0aGlzIHdpbGwgYmUgdGhlICJzb3VyY2UiIGluZGV4LgotCSAqIE1heSBiZSAtMSBpZiBpbmFwcHJvcHJpYXRlIG9yIHVua25vd24uCi0JICovCi0JcHVibGljIGludCBnZXRTb3VyY2VJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuc291cmNlSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogSW4gdGhlIGNhc2Ugb2YgIm1vdmVkIiBpdGVtcywgdGhpcyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgaXRlbXMgbW92ZWQuCi0JICogTWF5IGJlIC0xIGlmIGluYXBwcm9wcmlhdGUgb3IgdW5rbm93bi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1vdmVMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLm1vdmVMZW5ndGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudCBjbG9uZVdpdGhTb3VyY2UoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUV2ZW50KG5ld1NvdXJjZSwgdGhpcy5saXN0TmFtZSwgdGhpcy5pbmRleCwgdGhpcy5pdGVtcywgdGhpcy5yZXBsYWNlZEl0ZW1zLCB0aGlzLnNvdXJjZUluZGV4LCB0aGlzLm1vdmVMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdENoYW5nZUV2ZW50IGNsb25lV2l0aFNvdXJjZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCB0aGlzLmluZGV4LCB0aGlzLml0ZW1zLCB0aGlzLnJlcGxhY2VkSXRlbXMsIHRoaXMuc291cmNlSW5kZXgsIHRoaXMubW92ZUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lIGFuZCBkaXNwbGFjaW5nCi0JICogdGhlIGluZGV4IGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LgotCSAqLwotCXB1YmxpYyBMaXN0Q2hhbmdlRXZlbnQgY2xvbmVXaXRoU291cmNlKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMuaW5kZXggKyBvZmZzZXQsIHRoaXMuaXRlbXMsIHRoaXMucmVwbGFjZWRJdGVtcywgdGhpcy5zb3VyY2VJbmRleCArIG9mZnNldCwgdGhpcy5tb3ZlTGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Qcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTJmYTJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Qcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInByb3BlcnR5IGNoYW5nZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiBwcm9wZXJ0eS4gQSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCS8qKiBOYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lOwotCi0JLyoqIFRoZSBwcm9wZXJ0eSdzIG9sZCB2YWx1ZSwgYmVmb3JlIHRoZSBjaGFuZ2UuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0KLQkvKiogVGhlIHByb3BlcnR5J3MgbmV3IHZhbHVlLCBhZnRlciB0aGUgY2hhbmdlLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gb2xkVmFsdWUgVGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5TmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMub2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV3VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLm5ld1ZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50IGNsb25lV2l0aFNvdXJjZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KG5ld1NvdXJjZSwgdGhpcy5wcm9wZXJ0eU5hbWUsIHRoaXMub2xkVmFsdWUsIHRoaXMubmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCB0aGUgcHJvcGVydHkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlDaGFuZ2VFdmVudCBjbG9uZVdpdGhTb3VyY2UoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3UHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld1Byb3BlcnR5TmFtZSwgdGhpcy5vbGRWYWx1ZSwgdGhpcy5uZXdWYWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvU3RhdGVDaGFuZ2VFdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1N0YXRlQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlMzY5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvU3RhdGVDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgZ2VuZXJpYyAic3RhdGUgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgdG8gCi0gKiBzdWNoIGV4dGVudCB0aGF0IGl0IGNhbm5vdCBiZSBkZWxpbmVhdGVkIGFsbCBhc3BlY3RzIG9mIGl0IHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLSAqIEEgU3RhdGVDaGFuZ2VFdmVudCBpcyBzZW50IGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBTdGF0ZUNoYW5nZUxpc3RlbmVyLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgU3RhdGVDaGFuZ2VFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIFN0YXRlQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7ICAvLyB0aGUgcG9pbnQgb2YgdGhlIGV2ZW50IGlzIHRoYXQgdGhlIG5hbWUgaXMgdW5rbm93bi4uLgotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdGF0ZUNoYW5nZUV2ZW50IGNsb25lV2l0aFNvdXJjZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUV2ZW50KG5ld1NvdXJjZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNoYW5nZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzIwMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJ0cmVlIGNoYW5nZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiB0cmVlLiBBIFRyZWVDaGFuZ2VFdmVudCBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUgVHJlZUNoYW5nZUxpc3RlbmVyLgotICogCi0gKiBOb3JtYWxseSBhIFRyZWVDaGFuZ2VFdmVudCBpcyBhY2NvbXBhbmllZCBieSB0aGUgdHJlZSBuYW1lIGFuZCBhIHBhdGgKLSAqIHRvIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlQ2hhbmdlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKiogTmFtZSBvZiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHJlZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBQYXRoIHRvIHRoZSBwYXJlbnQgb2YgdGhlIHBhcnQgb2YgdGhlIHRyZWUgdGhhdCB3YXMgY2hhbmdlZC4KLSAgICAgKiBNYXkgYmUgZW1wdHksIGlmIG5vdCBrbm93biBvciBpZiB0aGUgZW50aXJlIHRyZWUgY2hhbmdlZC4KLSAgICAgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0W10gcGF0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX1BBVEggPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyB0cmVlIGNoYW5nZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSB0cmVlTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHRyZWUgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB0aGUgcGFydCBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBUcmVlQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUsIE9iamVjdFtdIHBhdGgpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKCh0cmVlTmFtZSA9PSBudWxsKSB8fCAocGF0aCA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50cmVlTmFtZSA9IHRyZWVOYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgdHJlZSBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gdHJlZU5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFRyZWVDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSkgewotCQl0aGlzKHNvdXJjZSwgdHJlZU5hbWUsIEVNUFRZX1BBVEgpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHJlZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnRyZWVOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudHJlZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogTWF5IGJlIGVtcHR5LCBpZiBub3Qga25vd24uCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnBhdGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyZWVDaGFuZ2VFdmVudCBjbG9uZVdpdGhTb3VyY2UoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUV2ZW50KG5ld1NvdXJjZSwgdGhpcy50cmVlTmFtZSwgdGhpcy5wYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgdGhlIHRyZWUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUNoYW5nZUV2ZW50IGNsb25lV2l0aFNvdXJjZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdUcmVlTmFtZSkgewotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld1RyZWVOYW1lLCB0aGlzLnBhdGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5YTdhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotLyoqCi0gKiBNYXJrZXIgaW50ZXJmYWNlLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCS8vIG5vdGhpbmcgZm9yIG5vdwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiMTM1OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwMzg4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEEgImNvbGxlY3Rpb24gY2hhbmdlIiBldmVudCBnZXRzIGZpcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIGNvbGxlY3Rpb24uIFlvdSBjYW4gcmVnaXN0ZXIgYSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgd2l0aCBhIHNvdXJjZQotICogbW9kZWwgc28gYXMgdG8gYmUgbm90aWZpZWQgb2YgYW55IGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlcy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBhcmUgYWRkZWQgdG8gYSBib3VuZCBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZC4KLQkgKi8KLQl2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgYXJlIHJlbW92ZWQgZnJvbSBhIGJvdW5kIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgY29sbGVjdGlvbiB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQuCi0JICovCi0Jdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCBjb2xsZWN0aW9uIGlzIGNsZWFyZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSAKLQkgKiBhbmQgdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLgotCSAqLwotCXZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCBjb2xsZWN0aW9uIGlzIGNoYW5nZWQgaW4gYSBtYW5uZXIKLQkgKiB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieSB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGlzIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIAotCSAqIGFuZCB0aGUgY29sbGVjdGlvbiB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTJhYmM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBMaXN0Q2hhbmdlTGlzdGVuZXIuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0Q2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hhbmdlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZWFiM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0xpc3RDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBBICJsaXN0IGNoYW5nZSIgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBsaXN0LiBZb3UgY2FuIHJlZ2lzdGVyIGEgTGlzdENoYW5nZUxpc3RlbmVyIHdpdGggYSBzb3VyY2UKLSAqIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIG9mIGFueSBib3VuZCBsaXN0IHVwZGF0ZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIENoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHRvIGEgYm91bmQgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBMaXN0Q2hhbmdlRXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBsaXN0IHRoYXQgY2hhbmdlZCwgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZCwgYW5kIHRoZSBpbmRleAotCSAqIGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIGFkZGVkLgotCSAqLwotCXZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBhcmUgcmVtb3ZlZCBmcm9tIGEgYm91bmQgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBMaXN0Q2hhbmdlRXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBsaXN0IHRoYXQgY2hhbmdlZCwgdGhlIGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkLCBhbmQgdGhlIGluZGV4Ci0JICogYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVtb3ZlZC4KLQkgKi8KLQl2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBpbiBhIGJvdW5kIGxpc3QgYXJlIHJlcGxhY2VkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIExpc3RDaGFuZ2VFdmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGxpc3QgdGhhdCBjaGFuZ2VkLCB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkLCB0aGUgaXRlbXMgdGhhdCB3ZXJlCi0JICogcmVwbGFjZWQsIGFuZCB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVwbGFjZWQuCi0JICovCi0Jdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGluIGEgYm91bmQgbGlzdCBhcmUgbW92ZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgTGlzdENoYW5nZUV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgaW5kaWNlcyBvZiB3aGVyZSBpdGVtcyB3ZXJlIG1vdmVkCi0JICogZnJvbSBhbmQgdG8uCi0JICovCi0Jdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgYm91bmQgbGlzdCBpcyBjbGVhcmVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIExpc3RDaGFuZ2VFdmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIAotCSAqIGFuZCB0aGUgbGlzdCB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIGJvdW5kIGxpc3QgaXMgY2hhbmdlZCBpbiBhIG1hbm5lcgotCSAqIHRoYXQgaXMgbm90IGVhc2lseSBjaGFyYWN0ZXJpemVkIGJ5IHRoZSBvdGhlciBtZXRob2RzIGluIHRoaXMgaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIExpc3RDaGFuZ2VFdmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIAotCSAqIGFuZCB0aGUgbGlzdCB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9NdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI1YjZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9NdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIgd2hlbiB0aGUgcmVxdWVzdGVkIGxpc3RlbmVyCi0gKiBuZWVkcyB0byBpbXBsZW1lbnQgbXVsdGlwbGUgbWV0aG9kcyAoaS5lLiBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIsCi0gKiBMaXN0Q2hhbmdlTGlzdGVuZXIsIG9yIFRyZWVDaGFuZ2VMaXN0ZW5lcikuCi0gKi8KLWNsYXNzIE11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyCi0JZXh0ZW5kcyBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIgCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIsIExpc3RDaGFuZ2VMaXN0ZW5lciwgVHJlZUNoYW5nZUxpc3RlbmVyCi17Ci0JLyoqIHRoZSBtZXRob2RzIHdlIHdpbGwgaW52b2tlIG9uIHRoZSB0YXJnZXQgb2JqZWN0ICovCi0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgYWRkTWV0aG9kOwotCXByaXZhdGUgZmluYWwgTWV0aG9kIHJlbW92ZU1ldGhvZDsKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCByZXBsYWNlTWV0aG9kOwkvLyB0aGlzIGNhbiBiZSBudWxsCi0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgbW92ZU1ldGhvZDsJLy8gdGhpcyBjYW4gYmUgbnVsbAotCXByaXZhdGUgZmluYWwgTWV0aG9kIGNsZWFyTWV0aG9kOwotCXByaXZhdGUgZmluYWwgTWV0aG9kIGNoYW5nZU1ldGhvZDsKLQotCi0JLyoqCi0JICogVGhlICJyZXBsYWNlIiBhbmQgIm1vdmUiIG1ldGhvZHMgYXJlIG9wdGlvbmFsLgotCSAqLwotCU11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCByZXBsYWNlTWV0aG9kLCBNZXRob2QgbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JCXRoaXMuYWRkTWV0aG9kID0gYWRkTWV0aG9kOwotCQl0aGlzLnJlbW92ZU1ldGhvZCA9IHJlbW92ZU1ldGhvZDsKLQkJdGhpcy5yZXBsYWNlTWV0aG9kID0gcmVwbGFjZU1ldGhvZDsKLQkJdGhpcy5tb3ZlTWV0aG9kID0gbW92ZU1ldGhvZDsKLQkJdGhpcy5jbGVhck1ldGhvZCA9IGNsZWFyTWV0aG9kOwotCQl0aGlzLmNoYW5nZU1ldGhvZCA9IGNoYW5nZU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBObyAicmVwbGFjZSIgb3IgIm1vdmUiIG1ldGhvZHMuCi0JICovCi0JTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGFkZE1ldGhvZCwgTWV0aG9kIHJlbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCXRoaXModGFyZ2V0LCBhZGRNZXRob2QsIHJlbW92ZU1ldGhvZCwgbnVsbCwgbnVsbCwgY2xlYXJNZXRob2QsIGNoYW5nZU1ldGhvZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgaW52b2tlKE1ldGhvZCBtZXRob2QsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBFTVBUWV9DT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgbmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5hZGRNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMucmVtb3ZlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuY2xlYXJNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jaGFuZ2VNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbnZva2UoTWV0aG9kIG1ldGhvZCwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMCkgewotCQkJQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKG1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX0xJU1RfQ0hBTkdFX0VWRU5UX0FSUkFZKTsKLQkJfSBlbHNlIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgTGlzdENoYW5nZUV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmFkZE1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5yZW1vdmVNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLnJlcGxhY2VNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLm1vdmVNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jbGVhck1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNoYW5nZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGludm9rZShNZXRob2QgbWV0aG9kLCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgRU1QVFlfVFJFRV9DSEFOR0VfRVZFTlRfQVJSQVkpOwotCQl9IGVsc2UgewotCQkJQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKG1ldGhvZCwgdGhpcy50YXJnZXQsIG5ldyBUcmVlQ2hhbmdlRXZlbnRbXSB7ZXZlbnR9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5hZGRNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5yZW1vdmVNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jbGVhck1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNoYW5nZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NmJlZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEEgInByb3BlcnR5IGNoYW5nZSIgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBwcm9wZXJ0eS4gWW91IGNhbiByZWdpc3RlciBhIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgd2l0aCBhIHNvdXJjZQotICogbW9kZWwgc28gYXMgdG8gYmUgbm90aWZpZWQgb2YgYW55IGJvdW5kIHByb3BlcnR5IHVwZGF0ZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgbW9kZWwgaGFzIGNoYW5nZWQgYSBib3VuZCBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBTdGF0ZUNoYW5nZUV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZQotCSAqIGFuZCB0aGUgcHJvcGVydHkncyBvbGQgYW5kIG5ldyB2YWx1ZXMuCi0JICovCi0Jdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmODFlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgZmFjdG9yeSBidWlsZHMgbGlzdGVuZXJzIHRoYXQgcmVmbGVjdGl2ZWx5IGZvcndhcmQgQ2hhbmdlRXZlbnRzLgotICogSWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IGhhdmluZyB0b28gbWFueSBsaXR0bGUgY2xhc3NlcyB0aGF0IGhhdmUgdG8gYmUKLSAqIGxvYWRlZCBhbmQgbWFpbnRhaW5lZCBieSB0aGUgY2xhc3MgbG9hZGVyLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlc2UuCi0gKiBPZiBjb3Vyc2UsIHRoaXMgY29tZXMgd2l0aCB0aGUgYWRkaXRpb25hbCBvdmVyaGVhZCBvZiByZWZsZWN0aW9uLi4uLgotICogQWxzbyBub3RlIHRoYXQgdGhlIHZhbGlkaXR5IG9mIHRoZSBtZXRob2QgbmFtZSBpcyBub3QgY2hlY2tlZCBhdCBjb21waWxlCi0gKiB0aW1lLCBidXQgYXQgcnVudGltZTsgYWx0aG91Z2ggd2UgKmRvKiBjaGVjayB0aGUgbWV0aG9kIGFzIHNvb24gYXMgdGhlCi0gKiBsaXN0ZW5lciBpcyBpbnN0YW50aWF0ZWQuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqIHRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHdlIHdpbGwgaW52b2tlIHRoZSBtZXRob2QgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IHRhcmdldDsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxTdGF0ZUNoYW5nZUV2ZW50PiBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBTdGF0ZUNoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8U3RhdGVDaGFuZ2VFdmVudD5bXSBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7U1RBVEVfQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0YXRlQ2hhbmdlRXZlbnRbXSBFTVBUWV9TVEFURV9DSEFOR0VfRVZFTlRfQVJSQVkgPSBuZXcgU3RhdGVDaGFuZ2VFdmVudFswXTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8UHJvcGVydHlDaGFuZ2VFdmVudD4gUFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0NMQVNTID0gUHJvcGVydHlDaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFByb3BlcnR5Q2hhbmdlRXZlbnQ+W10gUFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge1BST1BFUlRZX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eUNoYW5nZUV2ZW50W10gRU1QVFlfUFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0FSUkFZID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnRbMF07Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25DaGFuZ2VFdmVudD4gQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQ2hhbmdlRXZlbnQ+W10gQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7Q09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1N9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUV2ZW50W10gRU1QVFlfQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQVJSQVkgPSBuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50WzBdOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0Q2hhbmdlRXZlbnQ+IExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTID0gTGlzdENoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdENoYW5nZUV2ZW50PltdIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExpc3RDaGFuZ2VFdmVudFtdIEVNUFRZX0xJU1RfQ0hBTkdFX0VWRU5UX0FSUkFZID0gbmV3IExpc3RDaGFuZ2VFdmVudFswXTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUNoYW5nZUV2ZW50PiBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTUyA9IFRyZWVDaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDaGFuZ2VFdmVudD5bXSBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtUUkVFX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmVlQ2hhbmdlRXZlbnRbXSBFTVBUWV9UUkVFX0NIQU5HRV9FVkVOVF9BUlJBWSA9IG5ldyBUcmVlQ2hhbmdlRXZlbnRbMF07Ci0KLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGaW5kIGFuZCByZXR1cm4gYSBtZXRob2QgaW1wbGVtZW50ZWQgYnkgdGhlIHRhcmdldCB0aGF0IGNhbiBiZSBpbnZva2VkCi0JICogcmVmbGVjdGl2ZWx5IHdoZW4gYSBjaGFuZ2UgZXZlbnQgb2NjdXJzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIE1ldGhvZCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VFdmVudD5bXSBldmVudENsYXNzQXJyYXkpIHsKLQkJTWV0aG9kIG1ldGhvZDsKLQkJdHJ5IHsKLQkJCW1ldGhvZCA9IENsYXNzVG9vbHMubWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgZXZlbnRDbGFzc0FycmF5KTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4MSkgewotCQkJdHJ5IHsKLQkJCQltZXRob2QgPSBDbGFzc1Rvb2xzLm1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUpOwotCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4MikgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Mik7ICAvLyAiY2hlY2tlZCIgZXhjZXB0aW9ucyBiaXRlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGlzIHN1aXRhYmxlIGZvciBiZWluZyBpbnZva2VkIHdoZW4gYQotCSAqIGNoYW5nZSBldmVudCBoYXMgb2NjdXJyZWQuIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyBub3Qgc3VpdGFibGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKE1ldGhvZCBtZXRob2QsIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VFdmVudD4gZXZlbnRDbGFzcykgewotCQlDbGFzczw/PltdIHBhcm1UeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlpbnQgcGFybVR5cGVzTGVuZ3RoID0gcGFybVR5cGVzLmxlbmd0aDsKLQkJaWYgKHBhcm1UeXBlc0xlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChwYXJtVHlwZXNMZW5ndGggPT0gMSkgJiYgcGFybVR5cGVzWzBdLmlzQXNzaWduYWJsZUZyb20oZXZlbnRDbGFzcykpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1ldGhvZC50b1N0cmluZygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBTdGF0ZUNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YXRlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QobWV0aG9kLCBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IFNpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7IG90aGVyd2lzZSwKLQkgKiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QobWV0aG9kLCBQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IFNpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7IG90aGVyd2lzZSwKLQkgKiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgYWRkTWV0aG9kLCBNZXRob2QgcmVtb3ZlTWV0aG9kLCBNZXRob2QgY2xlYXJNZXRob2QsIE1ldGhvZCBjaGFuZ2VNZXRob2QpIHsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChhZGRNZXRob2QsIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChyZW1vdmVNZXRob2QsIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjbGVhck1ldGhvZCwgQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNoYW5nZU1ldGhvZCwgQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IE11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgYWRkTWV0aG9kLCByZW1vdmVNZXRob2QsIGNsZWFyTWV0aG9kLCBjaGFuZ2VNZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgY2hhbmdlIGV2ZW50cy4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgYWRkTWV0aG9kTmFtZSwgU3RyaW5nIHJlbW92ZU1ldGhvZE5hbWUsIFN0cmluZyBjbGVhck1ldGhvZE5hbWUsIFN0cmluZyBjaGFuZ2VNZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigKLQkJCQl0YXJnZXQsCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgYWRkTWV0aG9kTmFtZSwgQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIHJlbW92ZU1ldGhvZE5hbWUsIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjbGVhck1ldGhvZE5hbWUsIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjaGFuZ2VNZXRob2ROYW1lLCBDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBMaXN0Q2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgYWRkTWV0aG9kLCBNZXRob2QgcmVtb3ZlTWV0aG9kLCBNZXRob2QgcmVwbGFjZU1ldGhvZCwgTWV0aG9kIG1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGFkZE1ldGhvZCwgTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKHJlbW92ZU1ldGhvZCwgTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKHJlcGxhY2VNZXRob2QsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChtb3ZlTWV0aG9kLCBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoY2xlYXJNZXRob2QsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjaGFuZ2VNZXRob2QsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGFkZE1ldGhvZCwgcmVtb3ZlTWV0aG9kLCByZXBsYWNlTWV0aG9kLCBtb3ZlTWV0aG9kLCBjbGVhck1ldGhvZCwgY2hhbmdlTWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBjaGFuZ2UgZXZlbnRzLiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBhZGRNZXRob2ROYW1lLCBTdHJpbmcgcmVtb3ZlTWV0aG9kTmFtZSwgU3RyaW5nIHJlcGxhY2VNZXRob2ROYW1lLCBTdHJpbmcgbW92ZU1ldGhvZE5hbWUsIFN0cmluZyBjbGVhck1ldGhvZE5hbWUsIFN0cmluZyBjaGFuZ2VNZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigKLQkJCQl0YXJnZXQsCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgYWRkTWV0aG9kTmFtZSwgTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIHJlbW92ZU1ldGhvZE5hbWUsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCByZXBsYWNlTWV0aG9kTmFtZSwgTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1vdmVNZXRob2ROYW1lLCBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2xlYXJNZXRob2ROYW1lLCBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2hhbmdlTWV0aG9kTmFtZSwgTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBhbnkgY2hhbmdlIGV2ZW50LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kczogVHJlZUNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGFkZE1ldGhvZCwgTWV0aG9kIHJlbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoYWRkTWV0aG9kLCBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QocmVtb3ZlTWV0aG9kLCBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoY2xlYXJNZXRob2QsIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjaGFuZ2VNZXRob2QsIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGFkZE1ldGhvZCwgcmVtb3ZlTWV0aG9kLCBjbGVhck1ldGhvZCwgY2hhbmdlTWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGNoYW5nZSBldmVudHMuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIGFkZE1ldGhvZE5hbWUsIFN0cmluZyByZW1vdmVNZXRob2ROYW1lLCBTdHJpbmcgY2xlYXJNZXRob2ROYW1lLCBTdHJpbmcgY2hhbmdlTWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoCi0JCQkJdGFyZ2V0LAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGFkZE1ldGhvZE5hbWUsIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCByZW1vdmVNZXRob2ROYW1lLCBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2xlYXJNZXRob2ROYW1lLCBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2hhbmdlTWV0aG9kTmFtZSwgVFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBhbnkgY2hhbmdlIGV2ZW50LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3Y2M3NTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIgd2hlbiB0aGUgcmVxdWVzdGVkIGxpc3RlbmVyCi0gKiBuZWVkIG9ubHkgaW1wbGVtZW50IGEgc2luZ2xlIG1ldGhvZCAoaS5lLiBTdGF0ZUNoYW5nZUxpc3RlbmVyIG9yCi0gKiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKS4KLSAqLwotY2xhc3MgU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyCi0JZXh0ZW5kcyBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIKLQlpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLXsKLQotCS8qKiB0aGUgbWV0aG9kIHdlIHdpbGwgaW52b2tlIG9uIHRoZSB0YXJnZXQgb2JqZWN0ICovCi0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgbWV0aG9kOwotCS8qKiBjYWNoZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBtZXRob2RJc1plcm9Bcmd1bWVudDsKLQotCVNpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCQl0aGlzLm1ldGhvZElzWmVyb0FyZ3VtZW50ID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0YXRlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubWV0aG9kSXNaZXJvQXJndW1lbnQpIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX1NUQVRFX0NIQU5HRV9FVkVOVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QodGhpcy5tZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgU3RhdGVDaGFuZ2VFdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubWV0aG9kSXNaZXJvQXJndW1lbnQpIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX1BST1BFUlRZX0NIQU5HRV9FVkVOVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QodGhpcy5tZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU3RhdGVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1N0YXRlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlNmJhNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU3RhdGVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQSBnZW5lcmljICJzdGF0ZSBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyB0byAKLSAqIHN1Y2ggZXh0ZW50IHRoYXQgaXQgY2Fubm90IGJlIGRlbGluZWF0ZWQgYWxsIGFzcGVjdHMgb2YgaXQgdGhhdCBoYXZlIGNoYW5nZWQuIAotICogWW91IGNhbiByZWdpc3RlciBhIFN0YXRlQ2hhbmdlTGlzdGVuZXIgd2l0aCBhIHNvdXJjZSBtb2RlbCBzbyBhcyB0byBiZSBub3RpZmllZCAKLSAqIG9mIGFueSBzdWNoIGNoYW5nZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgbW9kZWwgaGFzIGNoYW5nZWQgaW4gc29tZSBnZW5lcmFsIGZhc2hpb24uCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgU3RhdGVDaGFuZ2VFdmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UuCi0JICovCi0Jdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9UcmVlQ2hhbmdlQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNDYyMDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIFRyZWVDaGFuZ2VMaXN0ZW5lci4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIFRyZWVDaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgVHJlZUNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFRyZWVDaGFuZ2VBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTkxZjlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9UcmVlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQSAidHJlZSBjaGFuZ2UiIGV2ZW50IGdldHMgZmlyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogdHJlZS4gWW91IGNhbiByZWdpc3RlciBhIFRyZWVDaGFuZ2VMaXN0ZW5lciB3aXRoIGEgc291cmNlCi0gKiBtb2RlbCBzbyBhcyB0byBiZSBub3RpZmllZCBvZiBhbnkgYm91bmQgdHJlZSB1cGRhdGVzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgbm9kZSBpcyBhZGRlZCB0byBhIGJvdW5kIHRyZWUuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgVHJlZUNoYW5nZUV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgcGF0aCB0byB0aGUgbm9kZSB0aGF0IHdhcyBhZGRlZC4KLQkgKi8KLQl2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIG5vZGUgaXMgcmVtb3ZlZCBmcm9tIGEgYm91bmQgdHJlZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBUcmVlQ2hhbmdlRXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSB0cmVlIHRoYXQgY2hhbmdlZCwgYW5kIHRoZSBwYXRoIHRvIHRoZSBub2RlIHRoYXQgd2FzIHJlbW92ZWQuCi0JICovCi0Jdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIGJvdW5kIHRyZWUgaXMgY2xlYXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBUcmVlQ2hhbmdlRXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSB0cmVlIHRoYXQgY2hhbmdlZCwgYW5kIGFuIGVtcHR5IHBhdGguCi0JICovCi0Jdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIHBvcnRpb24gb2YgYSBib3VuZCB0cmVlIGlzIGNoYW5nZWQgaW4KLQkgKiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieSB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGlzCi0JICogaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIFRyZWVDaGFuZ2VFdmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIHRyZWUgdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIHBhdGggdG8gdGhlIGJyYW5jaCBvZiB0aGUKLQkgKiB0cmVlIHRoYXQgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYTgzNzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gYWJzdHJhY3QgY29sbGVjdGlvbiBhY2Nlc3NpbmcgYW5kCi0gKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFuZCBtYWtlIGl0IG1vcmUgcGx1Z2dhYmxlLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgTW9kZWwsIEl0ZXJhYmxlPEU+Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbGxlY3Rpb24ncyB2YWx1ZXMuCi0JICovCi0JSXRlcmF0b3I8RT4gaXRlcmF0b3IoKTsKLQkJU3RyaW5nIFZBTFVFUyA9ICJ2YWx1ZXMiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uIHZhbHVlLgotCSAqLwotCWludCBzaXplKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzUwNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBhYnN0cmFjdCBsaXN0IGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBNb2RlbCwgSXRlcmFibGU8RT4KLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QncyB2YWx1ZXMuCi0JICovCi0JSXRlcmF0b3I8RT4gaXRlcmF0b3IoKTsKLQkJU3RyaW5nIExJU1RfVkFMVUVTID0gImxpc3QgdmFsdWVzIjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCdzIHZhbHVlcy4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JaW50IHNpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBsaXN0LgotCSAqLwotCUUgZ2V0KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QncyB2YWx1ZXMuCi0JICovCi0JT2JqZWN0W10gdG9BcnJheSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZWUzYzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGFic3RyYWN0IHByb3BlcnR5IGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgTW9kZWwKLXsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvcGVydHkncyB2YWx1ZS4KLQkgKi8KLQlUIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9UcmVlTm9kZVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9UcmVlTm9kZVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiY2VhOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi0vKioKLSAqIEV4dGVuZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbCB0byBiZXR0ZXIgc3VwcG9ydCBUcmVlTW9kZWxBZGFwdGVyLgotICogCi0gKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGZpcmUgYSAic3RhdGUgY2hhbmdlIiBldmVudAotICogd2hlbmV2ZXIgdGhlIG5vZGUncyBpbnRlcm5hbCBzdGF0ZSBjaGFuZ2VzIGluIGEgd2F5IHRoYXQgdGhlCi0gKiB0cmVlIGxpc3RlbmVycyBzaG91bGQgYmUgbm90aWZpZWQuCi0gKiAKLSAqIEltcGxlbWVudG9ycyBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgYWxzbyBmaXJlIGEgInZhbHVlIHByb3BlcnR5IGNoYW5nZSIKLSAqIGV2ZW50IHdoZW5ldmVyIHRoZSBub2RlJ3MgdmFsdWUgY2hhbmdlcy4gVHlwaWNhbGx5LCBvbmx5IG5vZGVzIHRoYXQKLSAqIGhvbGQgInByaW1pdGl2ZSIgZGF0YSB3aWxsIGZpcmUgdGhpcyBldmVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlTm9kZVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBwYXJlbnQgbm9kZTsgbnVsbCBpZiB0aGUgbm9kZQotCSAqIGlzIHRoZSByb290LgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgbm9kZS4KLQkgKi8KLQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHZhbHVlIG1vZGVsIG9mIHRoZSBub2RlJ3MgY2hpbGQgbm9kZXMuCi0JICovCi0JTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbk1vZGVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBjaGlsZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjaGlsZChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgbGlzdCBvZiBjaGlsZHJlbi4KLQkgKi8KLQlpbnQgY2hpbGRyZW5TaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBub2RlJ3MgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkLgotCSAqLwotCWludCBpbmRleE9mQ2hpbGQoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGNoaWxkKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgbGVhZiAoaS5lLiBpdCBoYXMgbm8gY2hpbGRyZW4pCi0JICovCi0JYm9vbGVhbiBpc0xlYWYoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1RyZWVWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc2NTQyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBhYnN0cmFjdCB0cmVlIGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBNb2RlbAotewotCS8qKgotCSAqIFJldHVybiB0aGUgdHJlZSdzIG5vZGVzLgotCSAqLwotCUl0ZXJhdG9yPEU+IG5vZGVzKCk7Ci0JCVN0cmluZyBOT0RFUyA9ICJub2RlcyI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZGRhY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi0vKioKLSAqIEV4dGVuZCBWYWx1ZU1vZGVsIHRvIGFsbG93IHRoZSBzZXR0aW5nIG9mIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIGFuZCBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkgKiBAc2VlIFByb3BlcnR5VmFsdWVNb2RlbCNWQUxVRQotCSAqLwotCXZvaWQgc2V0VmFsdWUoVCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2ZGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2NTYxZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDQ0YWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDA3IDE0OjI2OjMyIEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGUyM2E5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkV4dGVuc2lvblRlc3RQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UuanB0LmRiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7YnVuZGxlLXZlcnNpb249IjMuMy4xMDAiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMsb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMiCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2Fib3V0Lmh0bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlM2Y0MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZT0xLjUKLWphdmFjVGFyZ2V0PTEuNQotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Y3MjdmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEV4dGVuc2lvblRlc3RQbHVnaW4KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi54bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NGRmN2YuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFQbGF0Zm9ybSI+Ci0JCQotCQk8anBhUGxhdGZvcm0KLQkJCWlkPSJjb3JlLnRlc3RKcGFQbGF0Zm9ybSIKLQkJCWxhYmVsPSJUZXN0IEpwYSBQbGF0Zm9ybSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEpwYVBsYXRmb3JtIgotCQkJZGVmYXVsdD0idHJ1ZSI+Ci0JCTwvanBhUGxhdGZvcm0+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQbGF0Zm9ybSI+Ci0JCQotCQk8anBhUGxhdGZvcm0KLQkJCWlkPSJjb3JlLnRlc3RKcGFQbGF0Zm9ybSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEpwYVBsYXRmb3JtVWkiPgotCQk8L2pwYVBsYXRmb3JtPgotCQkKLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvRXh0ZW5zaW9uVGVzdFBsdWdpbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0V4dGVuc2lvblRlc3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwNzVhNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvRXh0ZW5zaW9uVGVzdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uVGVzdFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEV4dGVuc2lvblRlc3RQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFeHRlbnNpb25UZXN0UGx1Z2luKCkgewotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc3N2YzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZwotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInRlc3RBdHRyaWJ1dGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVRUUklCVVRFX0FOTk9UQVRJT05fTkFNRSA9ICJ0ZXN0LlRlc3RBdHRyaWJ1dGUiOwotCi0KLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZy5URVNUX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOGVkYmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuVEVTVF9BVFRSSUJVVEVfQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKFRlc3RKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0JCQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E3ZDg0OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFUeXBlTWFwcGluZzsKLQotcHVibGljIGNsYXNzIEphdmFUZXN0VHlwZU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZwotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVFlQRV9NQVBQSU5HX0tFWSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfQU5OT1RBVElPTl9OQU1FID0gInRlc3QuVGVzdCI7Ci0KLQotCXB1YmxpYyBKYXZhVGVzdFR5cGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gVEVTVF9UWVBFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIFRFU1RfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjYTgyYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdQcm92aWRlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFUZXN0VHlwZU1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVGVzdFR5cGVNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YVRlc3RUeXBlTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKYXZhVGVzdFR5cGVNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBKYXZhVGVzdFR5cGVNYXBwaW5nLlRFU1RfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0VHlwZU1hcHBpbmcuVEVTVF9UWVBFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVRlc3RUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKFRlc3RKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFUZXN0VHlwZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKYXZhQmFzaWNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDJmNmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKYXZhQmFzaWNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUJhc2ljTWFwcGluZzsKLQotcHVibGljIGNsYXNzIFRlc3RKYXZhQmFzaWNNYXBwaW5nIGV4dGVuZHMgR2VuZXJpY0phdmFCYXNpY01hcHBpbmcKLXsKLQlwdWJsaWMgVGVzdEphdmFCYXNpY01hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKYXZhRW50aXR5LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmZmUzYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUVudGl0eTsKLQotcHVibGljIGNsYXNzIFRlc3RKYXZhRW50aXR5IGV4dGVuZHMgR2VuZXJpY0phdmFFbnRpdHkKLXsKLQlwcm90ZWN0ZWQgVGVzdEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwM2U3NTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkdlbmVyaWNKcGFGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgVGVzdEpwYUZhY3RvcnkgZXh0ZW5kcyBHZW5lcmljSnBhRmFjdG9yeQotewotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRW50aXR5IGJ1aWxkSmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFFbnRpdHkocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFCYXNpY01hcHBpbmcgYnVpbGRKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRlc3RKYXZhQmFzaWNNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGVzdFR5cGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YVRlc3RUeXBlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm0uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiMWI3Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uR2VuZXJpY0pwYVBsYXRmb3JtOwotCi1wdWJsaWMgY2xhc3MgVGVzdEpwYVBsYXRmb3JtIGV4dGVuZHMgR2VuZXJpY0pwYVBsYXRmb3JtCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiY29yZS50ZXN0SnBhUGxhdGZvcm0iOwotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFGYWN0b3J5IGJ1aWxkSnBhRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhRmFjdG9yeSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFubm90YXRpb25Qcm92aWRlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhVHlwZU1hcHBpbmdQcm92aWRlcnNUbyhMaXN0PEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJc3VwZXIuYWRkSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzVG8ocHJvdmlkZXJzKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhVGVzdFR5cGVNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzVG8oTGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJc3VwZXIuYWRkSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnNUbyhwcm92aWRlcnMpOwotCQlwcm92aWRlcnMuYWRkKEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVVpLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwOGY3OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5UeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmJhc2UuQmFzZUpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SnBhUGxhdGZvcm1VaSBleHRlbmRzIEJhc2VKcGFQbGF0Zm9ybVVpCi17Ci0JcHVibGljIFRlc3RKcGFQbGF0Zm9ybVVpKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcGFOYXZpZ2F0b3JQcm92aWRlciBidWlsZE5hdmlnYXRvclByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNOYXZpZ2F0b3JQcm92aWRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFVaUZhY3RvcnkgY3JlYXRlSnBhVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IFRlc3RKcGFVaUZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZURETChKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnNUbyhMaXN0PEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gcHJvdmlkZXJzKSB7Ci0JCXN1cGVyLmFkZEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnNUbyhwcm92aWRlcnMpOwotCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzVG8oTGlzdDxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gcHJvdmlkZXJzKSB7Ci0JCXN1cGVyLmFkZEphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzVG8ocHJvdmlkZXJzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhVWlGYWN0b3J5LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWZhOGI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkJhc2VKcGFVaUZhY3Rvcnk7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVJIGZhY3RvcnkgcmVxdWlyZWQgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24KLSAqIHJlbGF0ZWQgdG8gYSBKUEEgbWFwcGluZyAodHlwZSBvciBhdHRyaWJ1dGUpLgotICoKLSAqIEBzZWUgSnBhVWlGYWN0b3J5Ci0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SnBhVWlGYWN0b3J5IGV4dGVuZHMgQmFzZUpwYVVpRmFjdG9yeQotewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5jbGFzc3BhdGggYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwYjNhNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pzdC8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiYTYxMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODM5NWE4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjM0ODc4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjEwOjU1IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmY2NjA0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU4OjMxIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0NGI1Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW07YnVuZGxlLXZlcnNpb249IlsyLjAuMjAwLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMTAwLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuOC4yLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwubW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cyIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmRlMWVlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZSA9IDEuNQotamF2YWNUYXJnZXQgPSAxLjUKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYmY4ZGIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotIyAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotIyAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0jICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9SmF2YSBQZXJzaXN0ZW5jZSBBUEkgQ29yZSBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdEFsbENvcmVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRBbGxDb3JlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwZTYzMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdEFsbENvcmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi0vKioKLSAqIFRoaXMgdGVzdCBzdWl0ZSBpcyB0ZW1wb3JhcnksIHVudGlsIGpwYS5qYXIgY2FuIGJlIGNoZWNrZWQgaW50byB0aGUgQ1ZTCi0gKiByZXBvc2l0b3J5IGFuZCB1c2VkIGR1cmluZyB0aGUgbmlnaHRseSBidWlsZHMuCi0gKiAKLSAqIFJ1bnMgQUxMIEpQVCBDb3JlIFRlc3RzLiBDdXJyZW50bHkgd2UgZG8gbm90IGhhdmUgYSBqcGEuamFyIGNoZWNrZWQgaW4gdG8gQ1ZTLgotICogQXMgYSByZXN1bHQgd2UgY2Fubm90IHJ1biBhbnkgdGVzdHMgdGhhdCBkZXBlbmQgb24gdGhhdCBqYXIgZHVyaW5nIHRoZSBidWlsZC4KLSAqIEluIG91ciBsb2NhbCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgd2Ugc2hvdWxkIHJ1biB0aGlzIHN1aXRlIChKcHRBbGxDb3JlVGVzdHMpCi0gKiB1bnRpbCBqcGEuamFyIGlzIGNoZWNrZWQgaW50byBDVlMuCi0gKiBJbiB0aGUgbmlnaHRseSBidWlsZCB3ZSBzaG91bGQgY29udGludWUgdG8gcnVuIEpwdENvcmVUZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIEpwdEFsbENvcmVUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBKcHRDb3JlVGVzdHMuc3VpdGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRBbGxDb3JlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRDb3JlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0Q29yZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4Nzk1OTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRDb3JlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSnB0Q29yZUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLm1vZGVsLkpwdENvcmVNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLkpwdENvcmVSZXNvdXJjZU1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuSnB0Q29yZVV0aWxpdHlKZHRUZXN0czsKLQotLyoqCi0gKiBSdW5zIE1PU1QgSlBUIENvcmUgVGVzdHMuIEN1cnJlbnRseSB3ZSBkbyBub3QgaGF2ZSBhIGpwYS5qYXIgY2hlY2tlZCBpbnRvIGN2cy4gCi0gKiBBcyBhIHJlc3VsdCB3ZSBjYW5ub3QgcnVuIGFueSB0ZXN0cyB0aGF0IGRlcGVuZCBvbiB0aGF0IGphciBkdXJpbmcgdGhlIG5pZ2h0bHkgYnVpbGQuCi0gKiBJbiBvdXIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIHdlIHNob3VsZCBydW4gSnB0QWxsQ29yZVRlc3RzIChOT1QgdGhpcyBzdWl0ZSkKLSAqIHVudGlsIGpwYS5qYXIgaXMgY2hlY2tlZCBpbnRvIENWUy4KLSAqLwotcHVibGljIGNsYXNzIEpwdENvcmVUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBzdWl0ZShmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZShib29sZWFuIGFsbCkgewotCQlTdHJpbmcgcXVhbnRpdHkgPSBhbGwgPyAiQWxsIiA6ICJNb3N0IjsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShxdWFudGl0eSArICIgSlBUIENvcmUgVGVzdHMiKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRDb3JlVXRpbGl0eUpkdFRlc3RzLnN1aXRlKGFsbCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdENvcmVNb2RlbFRlc3RzLnN1aXRlKGFsbCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdENvcmVSZXNvdXJjZU1vZGVsVGVzdHMuc3VpdGUoYWxsKSk7Ci0JCWlmIChhbGwpIHsKLQkJCXN1aXRlLmFkZFRlc3QoSnB0Q29yZUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKGFsbCkpOwotCQl9Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRDb3JlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9Qcm9qZWN0VXRpbGl0eS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9Qcm9qZWN0VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGFiZGI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvUHJvamVjdFV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLQotLyoqCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VXRpbGl0eSB7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEFsbFByb2plY3RzKCkgewotICAgIAlJUHJvamVjdFtdIHByb2plY3RzID0gbmV3IElQcm9qZWN0WzBdOwotICAgIAl0cnkgewotICAgICAgICBwcm9qZWN0cyA9ICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0gICAgCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleCkgewotICAgIAkJLy8gQ2F0Y2ggTWFsZm9ybWVkIHRyZWUgZXhjZXB0aW9uIHRoYXQgb2NjdXJzIGZyb20gdGltZSB0byB0aW1lLi4uCi0gICAgCX0KLSAgICAJcmV0dXJuIHByb2plY3RzOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvamVjdEV4aXN0cyhTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb2plY3QocHJvamVjdE5hbWUpICE9IG51bGw7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3QgdmVyaWZ5QW5kUmV0dXJuUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gZXhpc3RzKSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKGV4aXN0cykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2plY3QgRG9lcyBOb3QgRXhpc3Q6IiArIHByb2plY3ROYW1lLCBwcm9qZWN0LmV4aXN0cygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQcm9qZWN0IEV4aXN0czoiICsgcHJvamVjdE5hbWUsICFwcm9qZWN0LmV4aXN0cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGV4aXN0cykgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGlmIChleGlzdHMpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQcm9qZWN0IERvZXMgTm90IEV4aXN0OiIgKyBwcm9qZWN0TmFtZSwgcHJvamVjdC5leGlzdHMoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUHJvamVjdCBFeGlzdHM6IiArIHByb2plY3ROYW1lLCAhcHJvamVjdC5leGlzdHMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgU3RyaW5nIHBhdGhTdHJpbmcgPSBwcm9qZWN0TmFtZTsKLSAgICAgICAgaWYgKCEod29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGhTdHJpbmcpID09IG51bGwpKQotICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoU3RyaW5nKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlOb1Byb2plY3RzKCkgewotICAgICAgICBJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0QWxsUHJvamVjdHMoKTsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lcyA9ICIiOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBwcm9qZWN0TmFtZXMgKz0gIiAiICsgcHJvamVjdHNbaV0uZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJBbGwgcHJvamVjdHMgbm90IGRlbGV0ZWQiICsgcHJvamVjdE5hbWVzLCBwcm9qZWN0cy5sZW5ndGggPT0gMCk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVQcm9qZWN0SWZFeGlzdHMoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIGlmIChwcm9qZWN0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmNsb3NlKG51bGwpOwotICAgICAgICAgICAgICAgIHByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotICAgICAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlQWxsUHJvamVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9jbG9zaW5nIHByb2plY3RzIGFuZCB0cmVhZCB3b3JrIGluIGhlcmUgaXMgYSBoYWNrIGJlY2F1c2Ugb2YgYSBCZWFuSW5mbyBidWcgaG9sZGluZwotICAgICAgICAvL29udG8gamFycyBsb2FkZWQgaW4gYW5vdGhlciBWTQotICAgICAgICAKLS8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0vLyAgICAgICAgICAgIGlmIChwcm9qZWN0c1tpXS5leGlzdHMoKSkgewotLy8gICAgICAgICAgICAgICAgcHJvamVjdHNbaV0uY2xvc2UobnVsbCk7IC8vIFRoaXMgc2hvdWxkIHNpZ25hbCB0aGUgZXh0cmEgVk0gdG8ga2lsbCBpdHNlbGYKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLSAvLyAgICAgICBUaHJlYWQueWllbGQoKTsgLy8gZ2l2ZSB0aGUgVk0gYSBjaGFuY2UgdG8gZGllCi0gICAgICAgIElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0QWxsUHJvamVjdHMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCQkJCUV4Y2VwdGlvbiBsYXN0RXhjZXB0aW9uID0gbnVsbDsKLQkJCQkJLy8gRG9uJ3QgbWFrZSAyXjEyIGlzIGFib3V0IDQgc2Vjb25kcyB3aGljaCBpcyB0aGUgbWF4IHdlCi0JCQkJCS8vIHdpbGwgd2FpdCBmb3IgdGhlIFZNIHRvIGRpZQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IDE0ICYmICFzdWNjZXNzOyBqKyspIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCQkJCQkJfQotCQkJCQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJbGFzdEV4Y2VwdGlvbiA9IGV4OwotCQkJCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlwcm9qZWN0LmNsb3NlKG51bGwpOwotCQkJCQkJCQkJcHJvamVjdC5vcGVuKG51bGwpOwotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0JCQkJCQkJCQkvLyBpZ25vcmUgdGhpcyBleGNlcHRpb24KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQl0cnkgewotCQkJCQkJCQlUaHJlYWQuc2xlZXAoKGludCkgTWF0aC5wb3coMiwgaikpOwotCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4MikgewotCQkJCQkJCQkvLyBwcm9iYWJseSB3b24ndCBoYXBwZW4KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCAhIHN1Y2Nlc3MpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSB3aGlsZSBkZWxldGluZzogIiArIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQkJCWxhc3RFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotICAgICAgICAvL3ZlcmlmeU5vUHJvamVjdHMoKTsKLSAgICB9Ci0gICAgLyoqCi0JICogUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIFN0cmluZ3MgdG8gdGhlIGZpbGVzIGJhc2VkIG9uIHRoZSBmaWxlU3VmZml4IGFuZAotCSAqIHBhdGggd2l0aGluIHRoZSBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gZmlsZVN1ZmZpeAotCSAqICAgICAgICAgICAgdGhlIGZpbGUgZW5kaW5nIHdpdGggdGhlICIuIiBpZiByZXF1aXJlZCAodGhlIHN1ZmZpeCB3aWxsIGJlCi0JICogICAgICAgICAgICB1c2VkIGFzIGlzKQotCSAqIEByZXR1cm4KLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0U3BlY2lmaWNGaWxlc0luRGlyZWN0b3J5KFBsdWdpbiBwbHVnaW4sIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcgZmlsZVN1ZmZpeCkgewotICAgICAgICBVUkwgZW50cnkgPSBudWxsOyAKLSAgICAgICAgICAgIGVudHJ5ID0gcGx1Z2luLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBhdGgpOyAKLSAgICAgICAgTGlzdCByZXN1bHQgPSBudWxsOwotICAgICAgICBGaWxlIGZvbGRlciA9IG51bGw7Ci0gICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVudHJ5ID0gUGxhdGZvcm0uYXNMb2NhbFVSTChlbnRyeSk7Ci0gICAgICAgICAgICAgICAgZm9sZGVyID0gbmV3IEZpbGUobmV3IFVSSShlbnRyeS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3QgZmlsZXMgPSBBcnJheXMuYXNMaXN0KGZvbGRlci5saXN0KCkpOwotICAgICAgICAgICAgaWYgKCFmaWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9sZGVyUGF0aCA9IGZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IChTdHJpbmcpIGZpbGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlTmFtZS5lbmRzV2l0aChmaWxlU3VmZml4KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGZvbGRlclBhdGggKyBmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRKYXJzSW5EaXJlY3RvcnkoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNwZWNpZmljRmlsZXNJbkRpcmVjdG9yeShwbHVnaW4sIHBhdGgsICIuamFyIik7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSYXJzSW5EaXJlY3RvcnkoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNwZWNpZmljRmlsZXNJbkRpcmVjdG9yeShwbHVnaW4sIHBhdGgsICIucmFyIik7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFYXJzSW5EaXJlY3RvcnkoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNwZWNpZmljRmlsZXNJbkRpcmVjdG9yeShwbHVnaW4sIHBhdGgsICIuZWFyIik7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXYXJzSW5EaXJlY3RvcnkoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNwZWNpZmljRmlsZXNJbkRpcmVjdG9yeShwbHVnaW4sIHBhdGgsICIud2FyIik7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZ1bGxGaWxlTmFtZShQbHVnaW4gcGx1Z2luLCBTdHJpbmcgcGx1Z2luUmVsYXRpdmVGaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKHBsdWdpblJlbGF0aXZlRmlsZU5hbWUpOwotICAgICAgICBpZiAocGF0aC5nZXREZXZpY2UoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBsdWdpblJlbGF0aXZlRmlsZU5hbWU7Ci0gICAgICAgIFVSTCB1cmwgPSBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGx1Z2luUmVsYXRpdmVGaWxlTmFtZSk7Ci0gICAgICAgIGlmICh1cmwgIT0gbnVsbCkgewotICAgICAgICAgICAgdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotICAgICAgICAgICAgSVBhdGggaVBhdGggPSBuZXcgUGF0aCh1cmwuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIHJldHVybiBpUGF0aC50b09TU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9Db250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0NvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OTcyNzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0NvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRleHRNb2RlbFRlc3RDYXNlIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9QUk9KRUNUX05BTUUgPSAiQ29udGV4dE1vZGVsVGVzdFByb2plY3QiOwotCQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgcGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQ7Ci0JcHJvdGVjdGVkIE9ybUFydGlmYWN0RWRpdCBvcm1BcnRpZmFjdEVkaXQ7Ci0JCi0JCi0JcHJvdGVjdGVkIENvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0ID0gUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQl0aGlzLm9ybUFydGlmYWN0RWRpdCA9IE9ybUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCXdhaXRGb3JXb3Jrc3BhY2VKb2JzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUFsbFByb2plY3RzKCkgIHRocm93cyBFeGNlcHRpb257Ci0JCS8vZG9uJ3QgZGVsZXRlIHByb2plY3RzLCBjcmVhdGluZyBhIG5ldyBvbmUgd2l0aCBhIG5ldyBuYW1lCi0JCS8vd29ya3NwYWNlIHdpbGwgYmUgZGVsZXRlZCBuZXh0IHRpbWUgdGVzdHMgYXJlIHJ1bi4KLQkJLy9ub3Qgc2F5aW5nIHRoaXMgaXMgdGhlIHVsdGltYXRlIHNvbHV0aW9uLCBidXQgaXQgd2lsbCB3b3JrIGZvciBub3cKLQkJLy91bnRpbCB3ZSBjYW4gZmlndXJlIG91dCBob3cgdG8gcHJvcGVybHkgZGVsZXRlIHByb2plY3RzIGluIHRlc3RzCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vYXQgbGVhc3QgZGVsZXRlIHRoZSBwcm9qZWN0IGZyb20gdGhlIHdvcmtzcGFjZSBzaW5jZSwgZGVsZXRpbmcgZnJvbSB0aGUgZmlsZSBzeXN0ZW0gZG9lc24ndCB3b3JrIHdlbGwuCi0JCS8vdGVzdHMgcnVuIHRvbyBzbG93IG90aGVyd2lzZSBiZWNhdXNlIHNvIG1hbnkgcHJvamVjdHMgYXJlIGNyZWF0ZWQgaW4gdGhlIHdvcmtzcGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRoaXMub3JtQXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJdGhpcy5vcm1BcnRpZmFjdEVkaXQgPSBudWxsOwotCQlnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5kZWxldGUoZmFsc2UsIHRydWUsIG51bGwpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGJ1aWxkSmF2YVByb2plY3QoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gYnVpbGRKcGFQcm9qZWN0KEJBU0VfUFJPSkVDVF9OQU1FLCBhdXRvQnVpbGQsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQsIElEYXRhTW9kZWwganBhQ29uZmlnKSAKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gVGVzdEpwYVByb2plY3QuYnVpbGRKcGFQcm9qZWN0KHByb2plY3ROYW1lLCBhdXRvQnVpbGQsIGpwYUNvbmZpZyk7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVByb2plY3QganBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldEphdmFQcm9qZWN0KCkuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yV29ya3NwYWNlSm9icygpIHsKLQkJLy8gVGhpcyBqb2Igd2lsbCBub3QgZmluaXNoIHJ1bm5pbmcgdW50aWwgdGhlIHdvcmtzcGFjZSBqb2JzIGFyZSBkb25lCi0JCUpvYiB3YWl0Sm9iID0gbmV3IEpvYigiV2FpdCBqb2IiKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQl9OwotCQl3YWl0Sm9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCXdhaXRKb2Iuc2NoZWR1bGUoKTsKLQkJdHJ5IHsKLQkJCXdhaXRKb2Iuam9pbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhlIGpvYiB0aHJlYWQgd2FzIGludGVycnVwdGVkIGR1cmluZyBhIHdhaXQgLSBpZ25vcmUKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VSZXNvdXJjZSBwZXJzaXN0ZW5jZVJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5nZXRSZXNvdXJjZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtUmVzb3VyY2Ugb3JtUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLm9ybUFydGlmYWN0RWRpdC5nZXRSZXNvdXJjZShKcHRDb3JlUGx1Z2luLmdldERlZmF1bHRPcm1YbWxEZXBsb3ltZW50VVJJKGpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VSZXNvdXJjZSgpLmdldFBlcnNpc3RlbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdCgpLm1hcHBpbmdGaWxlUmVmcygpLm5leHQoKS5nZXRPcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlUmVzb3VyY2UoKS5nZXRQZXJzaXN0ZW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gcm9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkucGVyc2lzdGVuY2VVbml0cygpLm5leHQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENsYXNzUmVmIGNsYXNzUmVmKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCkubmV4dCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIGNsYXNzUmVmKCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBFbnRpdHkgamF2YUVudGl0eSgpIHsKLQkJcmV0dXJuIChFbnRpdHkpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sQ2xhc3NSZWYoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQlYbWxKYXZhQ2xhc3NSZWYgeG1sQ2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoY2xhc3NOYW1lKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDbGFzc1JlZihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJWG1sSmF2YUNsYXNzUmVmIHhtbEphdmFDbGFzc1JlZlRvUmVtb3ZlICA9IG51bGw7Ci0JCWZvciAoWG1sSmF2YUNsYXNzUmVmIHhtbEphdmFDbGFzc1JlZiA6IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkpIHsKLQkJCWlmICh4bWxKYXZhQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQl4bWxKYXZhQ2xhc3NSZWZUb1JlbW92ZSA9IHhtbEphdmFDbGFzc1JlZjsKLQkJCX0KLQkJfQotCQlpZiAoeG1sSmF2YUNsYXNzUmVmVG9SZW1vdmUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkucmVtb3ZlKHhtbEphdmFDbGFzc1JlZlRvUmVtb3ZlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUm9vdENvbnRleHROb2RlIHJvb3RDb250ZXh0KCkgewotCQlyZXR1cm4gZ2V0SmF2YVByb2plY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gKFRlc3RKcGFQcm9qZWN0KSBzdXBlci5nZXRKYXZhUHJvamVjdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTeXN0ZW0uZ2MoKTsKLQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZGVsZXRlUmVzb3VyY2UocmVzb3VyY2UpOwotCQl3YWl0Rm9yV29ya3NwYWNlSm9icygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBhbm5vdGF0aW9uQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiamF2YXgucGVyc2lzdGVuY2UiLCBhbm5vdGF0aW9uTmFtZSwgYW5ub3RhdGlvbkJvZHkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHBhY2thZ2VOYW1lLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUVudW1BbmRNZW1iZXJzKFN0cmluZyBlbnVtTmFtZSwgU3RyaW5nIGVudW1Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZUVudW1BbmRNZW1iZXJzKCJqYXZheC5wZXJzaXN0ZW5jZSIsIGVudW1OYW1lLCBlbnVtQm9keSk7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUVudW1BbmRNZW1iZXJzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudW1OYW1lLCBTdHJpbmcgZW51bUJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQocGFja2FnZU5hbWUsIGVudW1OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBlbnVtICIgKyBlbnVtTmFtZSArICIgeyAiICsgZW51bUJvZHkgKyAiIH0iKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcGFGaWxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcGFGaWxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1OTg3Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnBhRmlsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKcGFGaWxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBKcGFGaWxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSb290U3RydWN0dXJlTm9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUlGaWxlIGZpbGUgPSBvcm1SZXNvdXJjZSgpLmdldFJlc291cmNlTW9kZWwoKS5nZXRGaWxlKCk7Ci0JCUpwYUZpbGUgb3JtWG1sSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJCi0JCWFzc2VydEVxdWFscyhlbnRpdHlNYXBwaW5ncygpLCBvcm1YbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JCQotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJLy92ZXJpZnkgdGhlIG1hcHBpbmcgZmlsZSByZWZlcmVuY2UgIndpbnMiIGFzIHRoZSByb290IHN0cnVjdHVyZSBub2RlIHdoZW4gYm90aAotCQkvL3BlcnNpc3RlbmNlLnhtbCA8Y2xhc3M+IHRhZyBhbmQgbWFwcGluZyBmaWxlIDxlbnRpdHk+IHRhZyBleGlzdCBmb3IgYSBwYXJ0aWN1bGFyeSBqYXZhIGNsYXNzCi0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlKG9ybVBlcnNpc3RlbnRUeXBlKTsKLQotCQlhc3NlcnRFcXVhbHMoamF2YUVudGl0eSgpLmdldFBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW50aXR5TWFwcGluZ3NSb290U3RydWN0dXJlTm9kZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IG9ybVJlc291cmNlKCkuZ2V0UmVzb3VyY2VNb2RlbCgpLmdldEZpbGUoKTsKLQkJSnBhRmlsZSBvcm1YbWxKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5TWFwcGluZ3MoKSwgb3JtWG1sSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQkKLQkJKChPcm1YbWwpIGVudGl0eU1hcHBpbmdzKCkuZ2V0UGFyZW50KCkpLnJlbW92ZUVudGl0eU1hcHBpbmdzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShvcm1YbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEltcGxpZWRFbnRpdHlNYXBwaW5nc1Jvb3RTdHJ1Y3R1cmVOb2RlUmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gb3JtUmVzb3VyY2UoKS5nZXRSZXNvdXJjZU1vZGVsKCkuZ2V0RmlsZSgpOwotCQlKcGFGaWxlIG9ybVhtbEpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7Ci0JCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkuZ2V0T3JtWG1sKCkuZ2V0RW50aXR5TWFwcGluZ3MoKSwgb3JtWG1sSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQkJCQotCQlwZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKS5nZXRPcm1YbWwoKS5yZW1vdmVFbnRpdHlNYXBwaW5ncygpOwkJCi0JCWFzc2VydEZhbHNlKG9ybVhtbEpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVudGl0eU1hcHBpbmdzUm9vdFN0cnVjdHVyZU5vZGVSZW1vdmVkRnJvbVJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IG9ybVJlc291cmNlKCkuZ2V0UmVzb3VyY2VNb2RlbCgpLmdldEZpbGUoKTsKLQkJSnBhRmlsZSBvcm1YbWxKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5TWFwcGluZ3MoKSwgb3JtWG1sSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLnJlbW92ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtWG1sSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQZXJzaXN0ZW5jZVJvb3RTdHJ1Y3R1cmVOb2RlUGVyc2lzdGVuY2VSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGUgPSBwZXJzaXN0ZW5jZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VNb2RlbCgpLmdldEZpbGUoKTsKLQkJSnBhRmlsZSBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscyhyb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKSwgcGVyc2lzdGVuY2VYbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JCQotCQlyb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkucmVtb3ZlUGVyc2lzdGVuY2UoKTsJCi0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlWG1sSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT3JtSmF2YVJvb3RTdHJ1Y3R1cmVOb2RlUGVyc2lzdGVuY2VSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkJCi0JCXJvb3RDb250ZXh0KCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5yZW1vdmVQZXJzaXN0ZW5jZSgpOwotCQlhc3NlcnRGYWxzZShqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSmF2YVJvb3RTdHJ1Y3R1cmVOb2RlUGVyc2lzdGVuY2VSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JCQotCQlyb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkucmVtb3ZlUGVyc2lzdGVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVuY2VSb290U3RydWN0dXJlTm9kZVJlbW92ZWRGcm9tUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gcGVyc2lzdGVuY2VSZXNvdXJjZSgpLmdldFJlc291cmNlTW9kZWwoKS5nZXRGaWxlKCk7Ci0JCUpwYUZpbGUgcGVyc2lzdGVuY2VYbWxKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwotCQlyb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKHJvb3RDb250ZXh0KCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLCBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLnJlbW92ZShwZXJzaXN0ZW5jZVJlc291cmNlKCkuZ2V0UGVyc2lzdGVuY2UoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVhtbEpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVBlcnNpc3RlbmNlUm9vdFN0cnVjdHVyZU5vZGVQZXJzaXN0ZW5jZVhtbFJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IHBlcnNpc3RlbmNlUmVzb3VyY2UoKS5nZXRSZXNvdXJjZU1vZGVsKCkuZ2V0RmlsZSgpOwotCQlKcGFGaWxlIHBlcnNpc3RlbmNlWG1sSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKHJvb3RDb250ZXh0KCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLCBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkJCi0JCXJvb3RDb250ZXh0KCkucmVtb3ZlUGVyc2lzdGVuY2VYbWwoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VYbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcm1KYXZhUm9vdFN0cnVjdHVyZU5vZGVQZXJzaXN0ZW5jZVhtbFJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQkKLQkJcm9vdENvbnRleHQoKS5yZW1vdmVQZXJzaXN0ZW5jZVhtbCgpOwotCQlhc3NlcnRGYWxzZShqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSmF2YVJvb3RTdHJ1Y3R1cmVOb2RlUGVyc2lzdGVuY2VYbWxSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JCQotCQlyb290Q29udGV4dCgpLnJlbW92ZVBlcnNpc3RlbmNlWG1sKCk7Ci0JCWFzc2VydEZhbHNlKGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPcm1KYXZhUGVyc2lzdGVudFR5cGVSb290U3RydWN0dXJlTm9kZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIE9ybUVudGl0eSk7Ci0JCQotCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVPcm1QZXJzaXN0ZW50VHlwZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIENsYXNzUmVmKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPcm1KYXZhUGVyc2lzdGVudFR5cGVSb290U3RydWN0dXJlTm9kZVJlbW92ZWRGcm9tUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIE9ybUVudGl0eSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBDbGFzc1JlZik7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUGVyc2lzdGVudFR5cGVSb290U3RydWN0dXJlTm9kZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCkubmV4dCgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkpOwotCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVTcGVjaWZpZWRDbGFzc1JlZigwKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKS5uZXh0KCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUGVyc2lzdGVudFR5cGVSb290U3RydWN0dXJlTm9kZVJlbW92ZWRGcm9tUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKS5uZXh0KCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSk7Ci0JCQotCQlyZW1vdmVYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKS5uZXh0KCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEltcGxpZWRKYXZhUGVyc2lzdGVudFR5cGVSb290U3RydWN0dXJlTm9kZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJanBhUHJvamVjdCgpLnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXModHJ1ZSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBwZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCkubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQkKLQkJamF2YVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFzc2VydEZhbHNlKGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUm9vdFN0cnVjdHVyZU5vZGVzRW50aXR5TWFwcGluZ3NSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldENvbnRlbnRzKCkucmVtb3ZlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKSk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKS5uZXh0KCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUm9vdFN0cnVjdHVyZU5vZGVzUGVyc2lzdGVuY2VVbml0UmVtb3ZlZEZyb21SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuZ2V0UGVyc2lzdGVuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkucmVtb3ZlKDApOwotCi0JCWFzc2VydEZhbHNlKGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YVJvb3RTdHJ1Y3R1cmVOb2Rlc1BlcnNpc3RlbmNlVW5pdFJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkJCi0JCWpwYVByb2plY3QoKS5nZXRSb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKS5yZW1vdmVQZXJzaXN0ZW5jZVVuaXQoMCk7Ci0KLQkJYXNzZXJ0RmFsc2UoamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFSb290U3RydWN0dXJlTm9kZXNPcm1QZXJzaXN0ZW50VHlwZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlT3JtUGVyc2lzdGVudFR5cGUoMCk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpLm5leHQoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpLmdldFBhcmVudCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFSb290U3RydWN0dXJlTm9kZXNPcm1UeXBlTWFwcGluZ01vcnBoZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKLQkJamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlKDApOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKS5uZXh0KCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcm1KYXZhUm9vdFN0cnVjdHVyZU5vZGVNYXBwaW5nRmlsZVJlZkNoYW5nZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQkKLQkJTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBwZXJzaXN0ZW5jZVVuaXQoKS5tYXBwaW5nRmlsZVJlZnMoKS5uZXh0KCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKCJmb28iKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlID0gcGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkuZ2V0T3JtWG1sKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkJCi0JCUlGaWxlIGZpbGUgPSBwZXJzaXN0ZW5jZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VNb2RlbCgpLmdldEZpbGUoKTsKLQkJSnBhRmlsZSBvcm1YbWxKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwkJCi0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtWG1sSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSmF2YVJvb3RTdHJ1Y3R1cmVOb2RlTWFwcGluZ0ZpbGVSZWZDaGFuZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JCQotCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IHBlcnNpc3RlbmNlVW5pdCgpLm1hcHBpbmdGaWxlUmVmcygpLm5leHQoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUphdmFSb290U3RydWN1dHJlTm9kZURlbGV0ZU9ybVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0KLQkJCi0JCWRlbGV0ZVJlc291cmNlKG9ybVJlc291cmNlKCkpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpLm5leHQoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpLmdldFBhcmVudCgpKTsKLQl9Ci0JCi0JLy9UT0RPIHRlc3Qgcm9vdFN0cnVjdHVyZU5vZGVzIHdpdGggYSBzdGF0aWMgaW5uZXIgY2xhc3MKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnB0Q29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnB0Q29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwN2UzMDUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdENvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhLkpwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm0uSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuSnB0Q29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBKcHRDb3JlQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHN1aXRlKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoYm9vbGVhbiBhbGwpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb3JlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpwYUZpbGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0Q29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoYWxsKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKGFsbCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMuc3VpdGUoYWxsKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdENvcmVDb250ZXh0TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjEyMTBmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSA9ICJNWV9BU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FIjsKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hcHBlZFN1cGVyY2xhc3MiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOyIgKwotCQkJImJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJImJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQXNzb2NpYXRpb25PdmVycmlkZSIsIAotCQkJIlN0cmluZyBuYW1lKCk7IiArCi0JCQkiSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCk7Iik7CQkKLQl9Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbigpOwotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQotCQkKLQlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGphdmFFbnRpdHkoKS5hc3NvY2lhdGlvbk92ZXJyaWRlcygpLmhhc05leHQoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0KLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUVudGl0eSgpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUykuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhRW50aXR5KCkuYXNzb2NpYXRpb25PdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCQotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMywgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCQotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCi0KLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigyKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKLQkJam9pbkNvbHVtbnMgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5tb3ZlSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1ucyA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW5zID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JfQkKLQkKLQkKLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGVudGl0eS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUoYXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOGY2MjguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQXR0cmlidXRlT3ZlcnJpZGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9OQU1FID0gIk1ZX0FUVFJJQlVURV9PVkVSUklERV9OQU1FIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FID0gIk1ZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSI7Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYXBwZWRTdXBlcmNsYXNzIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsiICsKLQkJCSJib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJImJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OyIgKwotCQkJImludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IiArCi0JCQkiaW50IHNjYWxlKCkgZGVmYXVsdCAwOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBdHRyaWJ1dGVPdmVycmlkZSIsIAotCQkJIlN0cmluZyBuYW1lKCk7IiArCi0JCQkiQ29sdW1uIGNvbHVtbigpOyIpOwkJCi0JfQotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24oKTsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiLCBjb2x1bW49QENvbHVtbihuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0KLQkJCi0JcHVibGljIEphdmFBdHRyaWJ1dGVPdmVycmlkZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uR2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJQ29sdW1uIGNvbHVtbiA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uUmVzb3VyY2UgPSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldENvbHVtbigpOwotCQljb2x1bW5SZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCQotCQljb2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uU2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJQ29sdW1uIGNvbHVtbiA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtblJlc291cmNlID0gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5nZXRDb2x1bW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldENvbHVtbigpKTsKLQkJYXNzZXJ0Tm90TnVsbChzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5EZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3MgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChwZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKSkuZ2V0KDEpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkRlZmF1bHRUYWJsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGVudGl0eS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3MgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChwZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKSkuZ2V0KDEpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCi0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUoYXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YTA5ZmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTG9iQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQmFzaWNNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVCYXNpY0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXNpYyIsICJGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOyBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMb2JBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTG9iIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnVtZXJhdGVkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudW1lcmF0ZWQiLCAiRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlbXBvcmFsQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlbXBvcmFsIiwgIlRlbXBvcmFsVHlwZSB2YWx1ZSgpOyIpOwkJCi0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUJhc2ljQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmdGZXRjaE9wdGlvbmFsU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlQmFzaWNBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuRUFHRVIsIG9wdGlvbmFsPWZhbHNlKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aExvYigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUxvYkFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5MT0IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQExvYiIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVFbnVtZXJhdGVkQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkVOVU1FUkFURUQsIEpQQS5FTlVNX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudW1lcmF0ZWQoRW51bVR5cGUuU1RSSU5HKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRlbXBvcmFsQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRFTVBPUkFMLCBKUEEuVEVNUE9SQUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhQmFzaWNNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QmFzaWNHZXREZWZhdWx0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWNNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEJhc2ljR2V0RGVmYXVsdEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBiYXNpY01hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWNNYXBwaW5nLmdldEZldGNoKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsJCQotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGJhc2ljTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQliYXNpYy5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZKTsKLQkJCi0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkRmV0Y2gyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nRmV0Y2hPcHRpb25hbFNwZWNpZmllZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkJBU0lDKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBiYXNpYy5nZXRGZXRjaCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEZldGNoMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJY3JlYXRlT3JtWG1sRmlsZSgpOwotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydFRydWUoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucHJvcGVydGllcygpLm5leHQoKTsKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkJBU0lDKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBiYXNpYy5nZXRGZXRjaCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkJBU0lDKSk7Ci0JCQotCQliYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3JtWG1sRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEJhc2ljUmVtb3ZlZEZyb21SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnNldE1hcHBpbmdBbm5vdGF0aW9uKG51bGwpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShiYXNpY01hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQkJCi0JCWJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRUcnVlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9EZWZhdWx0QmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRUcnVlKCgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuaXNMb2IoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldEVudW1lcmF0ZWQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbCgoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKCgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0VGVtcG9yYWwoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb1ZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9FbWJlZGRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvRW1iZWRkZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvVHJhbnNpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9PbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0vL1RPRE8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoSU9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCAoKElPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvT25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotLy9UT0RPCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5tYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnkuQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb01hbnlUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLS8vVE9ETwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChJTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCAoKElNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvTWFueVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotLy9UT0RPCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotLy8JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UubWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueS5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QmFzaWNHZXREZWZhdWx0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldERlZmF1bHRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEJhc2ljR2V0RGVmYXVsdE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0RGVmYXVsdE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKGJhc2ljTWFwcGluZy5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWJhc2ljLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9wdGlvbmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZ0ZldGNoT3B0aW9uYWxTcGVjaWZpZWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWMuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkJBU0lDKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRPcHRpb25hbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydFRydWUoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLlRSVUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0KLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQykpOwotCQkKLQkJYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9wdGlvbmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQliYXNpYy5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCQotCQliYXNpYy5zZXRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUoYmFzaWNNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCQotCQliYXNpYy5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0TWFwcGluZ0Fubm90YXRpb24obnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdElzTG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNMb2IoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0xvYjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhMb2IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydFRydWUoYmFzaWNNYXBwaW5nLmlzTG9iKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQotCQliYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldExvYihmYWxzZSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNMb2JVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0xvYigpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydFRydWUoYmFzaWNNYXBwaW5nLmlzTG9iKCkpOwotCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0xvYigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRCYXNpY0dldERlZmF1bHRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCBiYXNpY01hcHBpbmcuZ2V0RGVmYXVsdEVudW1lcmF0ZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRCYXNpY0dldERlZmF1bHRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgYmFzaWNNYXBwaW5nLmdldERlZmF1bHRFbnVtZXJhdGVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgYmFzaWNNYXBwaW5nLmdldEVudW1lcmF0ZWQoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCBiYXNpY01hcHBpbmcuZ2V0RW51bWVyYXRlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEVudW1lcmF0ZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW51bWVyYXRlZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRW51bWVyYXRlZEFubm90YXRpb24gZW51bWVyYXRlZCA9IChFbnVtZXJhdGVkQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUuU1RSSU5HLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQobnVsbCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllRW51bWVyYXRlZFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbnVtZXJhdGVkQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKEVudW1lcmF0ZWRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWVudW1lcmF0ZWQuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSk7Ci0JCQotCQllbnVtZXJhdGVkLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUoYmFzaWNNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRlbXBvcmFsKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBiYXNpY01hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChudWxsKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0ZW1wb3JhbC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgYmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKGJhc2ljTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUNvbHVtblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4Y2U2NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFDb2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fREVGSU5JVElPTiA9ICJNWV9DT0xVTU5fREVGSU5JVElPTiI7Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJhc2ljQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhc2ljIiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOyIgKwotCQkJImJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJImJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7IiArCi0JCQkiaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsiICsKLQkJCSJpbnQgc2NhbGUoKSBkZWZhdWx0IDA7Iik7CQkKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0KLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEJhc2ljQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWU9XCIiICsgQ09MVU1OX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uVGFibGVTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUJhc2ljQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbih0YWJsZT1cIiIgKyBUQUJMRV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwotCQljcmVhdGVCYXNpY0Fubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4oY29sdW1uRGVmaW5pdGlvbj1cIiIgKyBDT0xVTU5fREVGSU5JVElPTiArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBKYXZhQ29sdW1uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0QmFzaWNDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lU3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGJhc2ljTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEJhc2ljQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0QmFzaWNDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEJhc2ljQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVVcGRhdGVzRnJvbVJlc291cmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCQotCQotCQotCQotCQotCQotCQotCQotCQotCQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRUYWJsZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0VGFibGVTcGVjaWZpZWRUYWJsZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCgoRW50aXR5KSBiYXNpY01hcHBpbmcuZ2V0VHlwZU1hcHBpbmcoKSkuZ2V0TmFtZSgpLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0QmFzaWNDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCi0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkVGFibGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5UYWJsZVNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhYmxlVXBkYXRlc0Zyb21SZXNvdXJjZUNoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQljb2x1bW4uc2V0VGFibGUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQljb2x1bW4uc2V0VGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9ERUZJTklUSU9OLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiZm9vIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb25VcGRhdGVzRnJvbVJlc291cmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNTUpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1NSksIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1NSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJY29sdW1uLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNjYpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNjYpLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJCi0JCWNvbHVtbi5zZXRMZW5ndGgobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7CQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZigxMDApKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMDApLCBjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoY29sdW1uLmdldExlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlY2lzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig1NSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDU1KSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW4uc2V0UHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2NikpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig2NiksIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNjYpLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQkKLQkJY29sdW1uLnNldFByZWNpc2lvbihudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsJCi0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDEwMCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwMCksIGNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NhbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9TQ0FMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTUpLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2NhbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1NDQUxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFNjYWxlKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfU0NBTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkU2NhbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtbi5zZXRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNjYpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNjYpLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNjYpLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQljb2x1bW4uc2V0U2NhbGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRTY2FsZSgpKTsJCi0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2NhbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDEwMCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwMCksIGNvbHVtbi5nZXRTY2FsZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoY29sdW1uLmdldFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoQmFzZUNvbHVtbi5ERUZBVUxUX1VOSVFVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFVuaXF1ZSgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0VW5pcXVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoQmFzZUNvbHVtbi5ERUZBVUxUX1VOSVFVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRVbmlxdWUoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFVuaXF1ZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0VW5pcXVlKCkpOwotCQkKLQkJY29sdW1uLnNldFVuaXF1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsJCi0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkVW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoQmFzZUNvbHVtbi5ERUZBVUxUX0lOU0VSVEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRJbnNlcnRhYmxlKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0SW5zZXJ0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJhc2VDb2x1bW4uREVGQVVMVF9JTlNFUlRBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdEluc2VydGFibGUoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJY29sdW1uLnNldEluc2VydGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwkKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROdWxsYWJsZSgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROdWxsYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoQmFzZUNvbHVtbi5ERUZBVUxUX05VTExBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE51bGxhYmxlKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TnVsbGFibGUoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TnVsbGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsJCi0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJhc2VDb2x1bW4uREVGQVVMVF9VUERBVEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRVcGRhdGFibGUoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFVwZGF0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJhc2VDb2x1bW4uREVGQVVMVF9VUERBVEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VXBkYXRhYmxlKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRVcGRhdGFibGUoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJY29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7CQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzBkNWMzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFEaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX05BTUUgPSAiTVlfRElTQ1JJTUlOQVRPUl9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fREVGSU5JVElPTiA9ICJNWV9DT0xVTU5fREVGSU5JVElPTiI7Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRGlzY3JpbWluYXRvckNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIkRUWVBFXCI7IiArCi0JCQkiRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsiICsKLQkJCSJTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsiKTsJCQotCX0KLQkJCi0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0KLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT1cIiIgKyBESVNDUklNSU5BVE9SX0NPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkJCi0JcHVibGljIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKERJU0NSSU1JTkFUT1JfQ09MVU1OX05BTUUsIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lU3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRFRZUEUiLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkRUWVBFIiwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCWphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiRFRZUEUiLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkRUWVBFIiwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRElTQ1JJTUlOQVRPUl9DT0xVTU5fTkFNRSwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBkaXNjcmltaW5hdG9yQ29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JDb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCi0JCWFzc2VydE51bGwoZGlzY3JpbWluYXRvckNvbHVtbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLlNUUklORywgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5DSEFSKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQlkaXNjcmltaW5hdG9yQ29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUuQ0hBUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuQ0hBUiwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJCi0JCWphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuQ0hBUik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JDb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBkaXNjcmltaW5hdG9yQ29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzY3JpbWluYXRvclR5cGVVcGRhdGVzRnJvbVJlc291cmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUik7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUiwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXREaXNjcmltaW5hdG9yVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNTUpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1NSksIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZGlzY3JpbWluYXRvckNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJZGlzY3JpbWluYXRvckNvbHVtbi5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDY2KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNjYpLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsJCQotCQlkaXNjcmltaW5hdG9yQ29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWRpc2NyaW1pbmF0b3JDb2x1bW4uc2V0TGVuZ3RoKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsJCi0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQkKLQkJamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDEwMCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMDApLCBkaXNjcmltaW5hdG9yQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJCi0JCWphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMZW5ndGhVcGRhdGVzRnJvbVJlc291cmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCi0JCWNvbHVtbi5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDc4KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNzgpLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3OCksIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQkKLQkJY29sdW1uLnNldExlbmd0aChudWxsKTsKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihDT0xVTU5fREVGSU5JVElPTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX0RFRklOSVRJT04sIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJmb28iKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmZkZjcwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFFbWJlZGRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtYmVkZGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVtYmVkZGFibGUiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVtYmVkZGFibGVBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQlwdWJsaWMgSmF2YUVtYmVkZGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVudGl0eSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJamF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYXBwZWRTdXBlcmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhTnVsbFR5cGVNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGFibGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZW1iZWRkYWJsZS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IGVtYmVkZGFibGUub3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVOYW1lSXNJbnZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS50YWJsZU5hbWVJc0ludmFsaWQoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLnRhYmxlTmFtZUlzSW52YWxpZCgiRk9PIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShlbWJlZGRhYmxlLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVtYmVkZGFibGUuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGUuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGUuYXNzb2NpYXRlZFRhYmxlcygpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGVtYmVkZGFibGUub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCS8vVE9ETyBuZWVkIHRvIGNyZWF0ZSBhIHN1YmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgYW5kIHRlc3QgdGhpcwotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBlbWJlZGRhYmxlLm92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTdkY2ExLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFFbWJlZGRlZElkTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREFCTEVfVFlQRV9OQU1FID0gIk15RW1iZWRkYWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgRU1CRUREQUJMRV9UWVBFX05BTUU7Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkYWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRhYmxlIiwgIiIpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtYmVkZGVkSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW1iZWRkZWRJZCIsICIiKTsJCQotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlRW1iZWRkZWRJZEFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5FTUJFRERFRF9JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkZWRJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRSArIiBteUVtYmVkZGVkSWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkYWJsZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW1iZWRkYWJsZUFubm90YXRpb24oKTsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKEVNQkVEREFCTEVfVFlQRV9OQU1FKS5hcHBlbmQoIiB7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBFTUJFRERBQkxFX1RZUEVfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCi0JcHVibGljIEphdmFFbWJlZGRlZElkTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoKChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5hdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRFbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWRJZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJYXR0cmlidXRlUmVzb3VyY2UubW92ZSgxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZElkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUVtYmVkZGVkSWQiLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBlbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhbm5vdGF0aW9uLnNldE5hbWUoImNpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZElkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscyg0LCBlbWJlZGRlZElkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlhc3NlcnRFcXVhbHMoNCwgZW1iZWRkZWRJZE1hcHBpbmcuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCi0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic3RhdGUiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQllbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWRJZCIpLmdldE1hcHBpbmcoKTsKLQkJZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UubW92ZSgxLCAwLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU2NDJiOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFFbWJlZGRlZE1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJNeUVtYmVkZGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIEVNQkVEREFCTEVfVFlQRV9OQU1FOwotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtYmVkZGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW1iZWRkYWJsZSIsICIiKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbWJlZGRlZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRlZCIsICIiKTsJCQotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUVtYmVkZGVkQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkVNQkVEREVEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiIG15RW1iZWRkZWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkYWJsZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW1iZWRkYWJsZUFubm90YXRpb24oKTsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChFTUJFRERBQkxFX1RZUEVfTkFNRSkuYXBwZW5kKCIgeyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQotCXB1YmxpYyBKYXZhRW1iZWRkZWRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoKChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5hdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRFbWJlZGRlZE1hcHBpbmdHZW5lcmljRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEdlbmVyaWNFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW50aXR5MSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkVtYmVkZGFibGUxIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0RW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgRW50aXR5MSB7ICIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIEVtYmVkZGFibGUxPEludGVnZXI+IG15RW1iZWRkYWJsZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVudGl0eTEuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0R2VuZXJpY0VtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIEVtYmVkZGFibGUxPFQ+IHt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW1iZWRkYWJsZTEuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibXlFbWJlZGRlZCIsIGF0dHJpYnV0ZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBjaXR5TWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGVtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiY2l0eSIpLmdldE1hcHBpbmcoKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlFbWJlZGRlZCIsIGF0dHJpYnV0ZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiY2l0eSIpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZE1hcHBpbmcuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgZW1iZWRkZWRNYXBwaW5nLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscyg0LCBlbWJlZGRlZE1hcHBpbmcuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCi0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygxLCBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJzdGF0ZSIpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQllbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmUoMSwgMCwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVudGl0eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNDRmMDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZENsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcmllc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVudGl0eVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUUgPSAiZW50aXR5TmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDUklNSU5BVE9SX1ZBTFVFID0gIk1ZX0RJU0NSSU1JTkFUT1JfVkFMVUUiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9UWVBFX05BTUUgPSAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgU1VCX1RZUEVfTkFNRTsKLQkKLQkKLQlwdWJsaWMgSmF2YUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYXBwZWRTdXBlcmNsYXNzIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGFibGUiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUluaGVyaXRhbmNlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVJbmhlcml0YW5jZVR5cGVFbnVtKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkluaGVyaXRhbmNlIiwgIkluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVJbmhlcml0YW5jZVR5cGVFbnVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkluaGVyaXRhbmNlVHlwZSIsICJTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkRpc2NyaW1pbmF0b3JWYWx1ZSIsICJTdHJpbmcgdmFsdWUoKTsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlY29uZGFyeVRhYmxlIiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyBzY2hlbWEoKSBkZWZhdWx0IFwiXCI7ICIpOwkJCQkJCi0vLwkJCVByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0vLwkJCVVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJTZWNvbmRhcnlUYWJsZXMiLCAiU2Vjb25kYXJ5VGFibGVbXSB2YWx1ZSgpOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUHJpbWFyeUtleUpvaW5Db2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpOyAiICsKLQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyAiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlByaW1hcnlLZXlKb2luQ29sdW1ucyIsICJQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7CQkKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGFic3RyYWN0IGNsYXNzICIpLmFwcGVuZChUWVBFX05BTUUpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIEZJTEVfTkFNRSwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRpb25PblByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKCk7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5KG5hbWU9XCIiICsgRU5USVRZX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRhYmxlQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShuYW1lPVwiIiArIFRBQkxFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSW5oZXJpdGFuY2VBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSU5IRVJJVEFOQ0UsIEpQQS5JTkhFUklUQU5DRV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARGlzY3JpbWluYXRvclZhbHVlKHZhbHVlPVwiIiArIERJU0NSSU1JTkFUT1JfVkFMVUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUobmFtZT1cImZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cImZvb1wiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJiYXJcIil9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQllbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiYXNkZiIpOwotCQllbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQllbnRpdHkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJZW50aXR5LmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWVudGl0eS5zZXRJZENsYXNzKCJteUlkQ2xhc3MiKTsKLQkJZW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWVudGl0eS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJamF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYXBwZWRTdXBlcmNsYXNzKTsKLQkJCi0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEluaGVyaXRhbmNlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQllbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiYXNkZiIpOwotCQllbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQllbnRpdHkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJZW50aXR5LmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWVudGl0eS5zZXRJZENsYXNzKCJteUlkQ2xhc3MiKTsKLQkJZW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWVudGl0eS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJamF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGFibGUpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQllbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiYXNkZiIpOwotCQllbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQllbnRpdHkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJZW50aXR5LmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWVudGl0eS5zZXRJZENsYXNzKCJteUlkQ2xhc3MiKTsKLQkJZW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWVudGl0eS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJamF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFOdWxsVHlwZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc05vQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzQW5ub3RhdGlvbnNPblBhcmVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGlvbk9uUHJvcGVydHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkUGVyc2lzdGVudFR5cGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJUGVyc2lzdGVudFR5cGUgcGFyZW50UGVyc2lzdGVudFR5cGUgPSBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgcGFyZW50UGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CQkKLQkJCi0JCSgoSWRNYXBwaW5nKSBwYXJlbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCXR5cGVSZXNvdXJjZS5wcm9wZXJ0aWVzKCkubmV4dCgpLnNldE1hcHBpbmdBbm5vdGF0aW9uKG51bGwpOwotCQkvL25vIG1hcHBpbmcoSWQpIGFubm90YXRpb24sIGJ1dCBzdGlsbCBhIENvbHVtbiBhbm5vdGF0aW9uLCBzbyBhY2Nlc3Mgc2hvdWxkIHN0aWxsIGJlIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBwYXJlbnRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQotCQkoKEJhc2ljTWFwcGluZykgcGFyZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGFyZW50UGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBwYXJlbnRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQkvL3N0aWxsIGFjY2Vzc1R5cGUgb2YgUFJPUEVSVFkgYmVjYXVzZSB0aGUgamF2YSBjbGFzcyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoaXMgb3JtLnhtbAotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgcGFyZW50UGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlyZW1vdmVYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJLy9vbmx5IHBhcmVudCBzcGVjaWZpZWQgaW4gb3JtLnhtbCwgaSB0aGluayB0aGlzIG91dGNvbWUgaXMgcmlnaHQ/PwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJcmVtb3ZlWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkvL2JvdGggcGFyZW50IGFuZCBjaGlsZCBzcGVjaWZpZWQgaW4gb3JtLnhtbAotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NXaXRoWG1sU2V0dGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRpb25PblByb3BlcnR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJCQotCQkoKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl0eXBlUmVzb3VyY2UucHJvcGVydGllcygpLm5leHQoKS5zZXRNYXBwaW5nQW5ub3RhdGlvbihudWxsKTsKLQkJLy9ubyBtYXBwaW5nKElkKSBhbm5vdGF0aW9uLCBidXQgc3RpbGwgYSBDb2x1bW4gYW5ub3RhdGlvbiwgc28gYWNjZXNzIHNob3VsZCBzdGlsbCBiZSBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCi0JCSgoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJLy9zdGlsbCBhY2Nlc3NUeXBlIG9mIFBST1BFUlRZIGJlY2F1c2UgdGhlIGphdmEgY2xhc3MgaXMgbm90IHNwZWNpZmllZCBpbiB0aGlzIG9ybS54bWwKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkvL25vdyBjbGFzcyBpcyBzcGVjaWZpZWQgaW4gb3JtLnhtbCwgc28gZW50aXR5TWFwcGluZ3MgYWNjZXNzIHNldHRpbmcgd2lucyBvdmVyIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJCi0JCS8vYWNjZXNzVHlwZSBzaG91bGQgYmUgUFJPUEVSVFkgbm93LCBqYXZhIGdldHMgdGhlIGFjY2VzcyBmcm9tIHhtbCBlbnRpdHkgaWYgaXQgaXMgc3BlY2lmaWVkCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWVTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgamF2YUVudGl0eSgpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBqYXZhRW50aXR5KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lU3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGphdmFFbnRpdHkoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGphdmFFbnRpdHkoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJamF2YUVudGl0eSgpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFbnRpdHlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlqYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKCgoRW50aXR5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVGcm9tU3BlY2lmaWVkTmFtZUNoYW5nZUluUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eUFubm90YXRpb24gZW50aXR5ID0gKEVudGl0eUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQllbnRpdHkuc2V0TmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwotCQotCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGphdmFFbnRpdHkoKS5nZXRUYWJsZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZU5hbWUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGphdmFFbnRpdHkoKS5nZXRUYWJsZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZU5hbWUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBqYXZhRW50aXR5KCkuZ2V0VGFibGVOYW1lKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhYmxlTmFtZVdpdGhOdWxsVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCVRhYmxlIHRhYmxlID0gamF2YUVudGl0eSgpLmdldFRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUiLCBjdSk7Ci0JCQotCQl0YWJsZS5zZXRTcGVjaWZpZWROYW1lKFRBQkxFX05BTUUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKG5hbWU9XCIiICsgVEFCTEVfTkFNRSArICJcIikiLCBjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgamF2YUVudGl0eSgpLmdldFRhYmxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0KLQkJdGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhUQUJMRV9OQU1FKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSW5oZXJpdGFuY2UoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGphdmFFbnRpdHkoKS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGphdmFFbnRpdHkoKSwgamF2YUVudGl0eSgpLmdldFJvb3RFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBqYXZhRW50aXR5KCkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCQotCQkvL2NoYW5nZSByb290IGluaGVyaXRhbmNlIHN0cmF0ZWd5LCB2ZXJpZnkgZGVmYXVsdCBpcyBjaGFuZ2VkIGZvciBjaGlsZCBlbnRpdHkKLQkJamF2YUVudGl0eSgpLmdldFJvb3RFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBqYXZhRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpLmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgamF2YUVudGl0eSgpLmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgamF2YUVudGl0eSgpLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSW5oZXJpdGFuY2UoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSW5oZXJpdGFuY2VBbm5vdGF0aW9uIGluaGVyaXRhbmNlID0gKEluaGVyaXRhbmNlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJaW5oZXJpdGFuY2Uuc2V0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuSk9JTkVELCBqYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCWluaGVyaXRhbmNlLnNldFN0cmF0ZWd5KG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJbmhlcml0YW5jZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCi0JCWphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5KT0lORUQsIGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlJbmhlcml0YW5jZUFubm90YXRpb24gaW5oZXJpdGFuY2UgPSAoSW5oZXJpdGFuY2VBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJbmhlcml0YW5jZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgaW5oZXJpdGFuY2UuZ2V0U3RyYXRlZ3koKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhESVNDUklNSU5BVE9SX1ZBTFVFLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGphdmFFbnRpdHkoKS5nZXROYW1lKCksIGphdmFFbnRpdHkoKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCi0JCWphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUik7Ci0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKERJU0NSSU1JTkFUT1JfVkFMVUUsIGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JWYWx1ZSA9IChEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJZGlzY3JpbWluYXRvclZhbHVlLnNldFZhbHVlKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJCi0JCWRpc2NyaW1pbmF0b3JWYWx1ZS5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoRElTQ1JJTUlOQVRPUl9WQUxVRSwgamF2YUVudGl0eSgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQotCQlqYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yVmFsdWUgPSAoRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGRpc2NyaW1pbmF0b3JWYWx1ZS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZWNvbmRhcnlUYWJsZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCWFzc2VydEVxdWFscygwLCBlbnRpdHkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQotCQkoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eS5zZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCi0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBzZWNvbmRhcnlUYWJsZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHNlY29uZGFyeVRhYmxlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlUHJlc2VydmVQa0pvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZFNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJTQ0hFTUEiKTsKLQkJc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiUEtfTkFNRSIpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBzcGVjaWZpZWQgc2Vjb25kYXJ5IHRhYmxlLCBwa0pvaW5Db2x1bW5zIGZyb20gZmlyc3Qgc2hvdWxkIGJlIHNhdmVkLgotCQlTZWNvbmRhcnlUYWJsZSBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZTIgPSBqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSk7Ci0JCXNwZWNpZmllZFNlY29uZGFyeVRhYmxlMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCQotCQlJdGVyYXRvcjxTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOwotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmRhcnlUYWJsZSwgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0FUQUxPRyIsIHNlY29uZGFyeVRhYmxlLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiU0NIRU1BIiwgc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgc2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIlBLX05BTUUiLCBwa0pvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZGFyeVRhYmxlLCBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZTIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKSk7Ci0KLQkJamF2YUVudGl0eSgpLnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDEpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8U2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCQotCQkKLQkJamF2YUVudGl0eSgpLnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDEpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCXNlY29uZGFyeVRhYmxlcyA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlqYXZhRW50aXR5KCkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQllbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbj4gamF2YVNlY29uZGFyeVRhYmxlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhU2Vjb25kYXJ5VGFibGVzKSk7Ci0JCQotCQkKLQkJZW50aXR5Lm1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPFNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMgPSBlbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YVNlY29uZGFyeVRhYmxlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhU2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQotCQllbnRpdHkubW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDAsIDEpOwotCQlzZWNvbmRhcnlUYWJsZXMgPSBlbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YVNlY29uZGFyeVRhYmxlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhU2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8U2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IGVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UubW92ZSgyLCAwLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IGVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5tb3ZlKDAsIDEsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gZW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gZW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlzZWNvbmRhcnlUYWJsZXMgPSBlbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IGVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGVkVGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkoKS5hc3NvY2lhdGVkVGFibGVzKCkpKTsKLQkJSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXMgPSBqYXZhRW50aXR5KCkuYXNzb2NpYXRlZFRhYmxlcygpOwotCQlUYWJsZSB0YWJsZTEgPSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJU2Vjb25kYXJ5VGFibGUgdGFibGUyID0gKFNlY29uZGFyeVRhYmxlKSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJU2Vjb25kYXJ5VGFibGUgdGFibGUzID0gKFNlY29uZGFyeVRhYmxlKSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgdGFibGUxLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGUyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGFibGUzLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgcGFyZW50RW50aXR5ID0gamF2YUVudGl0eSgpLmdldFJvb3RFbnRpdHkoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHBhcmVudEVudGl0eS5hc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkpKTsKLQkJSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXMgPSBwYXJlbnRFbnRpdHkuYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpOwotCQlUYWJsZSB0YWJsZTEgPSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJU2Vjb25kYXJ5VGFibGUgdGFibGUyID0gKFNlY29uZGFyeVRhYmxlKSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJU2Vjb25kYXJ5VGFibGUgdGFibGUzID0gKFNlY29uZGFyeVRhYmxlKSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgdGFibGUxLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGUyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGFibGUzLmdldE5hbWUoKSk7Ci0KLQkJRW50aXR5IGNoaWxkRW50aXR5ID0gamF2YUVudGl0eSgpOwotCQkvL1RPRE8gcHJvYmFibHkgd2FudCB0aGlzIHRvIGJlIDMsIHNpbmNlIGluIHRoaXMgY2FzZSB0aGUgY2hpbGQgZGVzY3JpcHRvciByZWFsbHkgdXNlcyB0aGUKLQkJLy9wYXJlbnQgdGFibGUgYmVjYXVzZSBpdCBpcyBzaW5nbGUgdGFibGUgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuICBOb3Qgc3VyZSB5ZXQgaG93IHRvIGRlYWwgd2l0aCB0aGlzLgotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLnNpemUoY2hpbGRFbnRpdHkuYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IHBhcmVudEVudGl0eSA9IGphdmFFbnRpdHkoKS5nZXRSb290RW50aXR5KCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwYXJlbnRFbnRpdHkuYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSkpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGFzc29jaWF0ZWRUYWJsZXMgPSBwYXJlbnRFbnRpdHkuYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKTsKLQkJU3RyaW5nIHRhYmxlMSA9IGFzc29jaWF0ZWRUYWJsZXMubmV4dCgpOwotCQlTdHJpbmcgdGFibGUyID0gYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7Ci0JCVN0cmluZyB0YWJsZTMgPSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgdGFibGUxKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZTIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRhYmxlMyk7Ci0JCQotCQlFbnRpdHkgY2hpbGRFbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCS8vVE9ETyBwcm9iYWJseSB3YW50IHRoaXMgdG8gYmUgMywgc2luY2UgaW4gdGhpcyBjYXNlIHRoZSBjaGlsZCBkZXNjcmlwdG9yIHJlYWxseSB1c2VzIHRoZQotCQkvL3BhcmVudCB0YWJsZSBiZWNhdXNlIGl0IGlzIHNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSBzdHJhdGVneS4gIE5vdCBzdXJlIHlldCBob3cgdG8gZGVhbCB3aXRoIHRoaXMuCi0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShjaGlsZEVudGl0eS5hc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWNvbmRhcnlUYWJsZVRvUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUyID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlzZWNvbmRhcnlUYWJsZTIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlMyA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJc2Vjb25kYXJ5VGFibGUzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlzZWNvbmRhcnlUYWJsZXMgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZWNvbmRhcnlUYWJsZUZyb21SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDIpLnNldFNwZWNpZmllZE5hbWUoImJheiIpOwotCQlMaXN0SXRlcmF0b3I8U2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZXMgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFzc2VydEVxdWFscygyLCBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6Iiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZXMgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGVzID0gamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRFcXVhbHMoMCwgamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGphdmFFbnRpdHkoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7Ci0JCQotCQlqYXZhRW50aXR5KCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQkKLQkJamF2YUVudGl0eSgpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUikpOwotCQlhc3NlcnROb3ROdWxsKGphdmFFbnRpdHkoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJCi0JCS8vdHJ5IGFkZGluZyBhbm90aGVyIHNlcXVlbmNlIGdlbmVyYXRvciwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCWphdmFFbnRpdHkoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJCi0JCWphdmFFbnRpdHkoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUikpOwotCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlqYXZhRW50aXR5KCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7Ci0JCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGphdmFFbnRpdHkoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsJCQotCQlhc3NlcnRFcXVhbHMoMSwgdHlwZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQkJCi0JCWphdmFFbnRpdHkoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUVudGl0eSgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkKLQkJamF2YUVudGl0eSgpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUikpOwotCQlhc3NlcnROb3ROdWxsKGphdmFFbnRpdHkoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCi0JCS8vdHJ5IGFkZGluZyBhbm90aGVyIHRhYmxlIGdlbmVyYXRvciwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCWphdmFFbnRpdHkoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCWphdmFFbnRpdHkoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUikpOwotCQkKLQkJLy90cnkgcmVtb3ZpbmcgdGhlIHRhYmxlIGdlbmVyYXRvciBhZ2Fpbiwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCWphdmFFbnRpdHkoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlwa0pvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcGtKb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJcGtKb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQotCQlwa0pvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlwa0pvaW5Db2x1bW4uc2V0TmFtZSgiQkFaIik7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXR5cGVSZXNvdXJjZS5tb3ZlKDEsIDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCQotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkvL2p1c3QgdGhlIGRlZmF1bHQgcGtKb2luQ29sdW1uLCBzbyAxCi0JCWFzc2VydEVxdWFscygxLCBqYXZhRW50aXR5KCkucHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCS8vb25seSB0aGUgc3BlY2lmaWVkIHBrSm9pbkNvbHVtbnMsIDMKLQkJYXNzZXJ0RXF1YWxzKDMsIGphdmFFbnRpdHkoKS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoamF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBwa0pvaW5Db2x1bW5zID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gcGtKb2luQ29sdW1ucyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKSk7Ci0KLQkJamF2YUVudGl0eSgpLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gcGtKb2luQ29sdW1uUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uPiBwa0pvaW5Db2x1bW5zID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCQotCQlqYXZhRW50aXR5KCkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSk7Ci0JCXBrSm9pbkNvbHVtblJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJcGtKb2luQ29sdW1ucyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJCi0JCWphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJcGtKb2luQ29sdW1uUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXBrSm9pbkNvbHVtbnMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEZhbHNlKHBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zKSk7Ci0JCQotCQkKLQkJZW50aXR5Lm1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQotCQllbnRpdHkubW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDAsIDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGVudGl0eS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UubW92ZSgyLCAwLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGVudGl0eS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5tb3ZlKDAsIDEsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gZW50aXR5LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gZW50aXR5LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGVudGl0eS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbklzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShqYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkuaXNWaXJ0dWFsKCkpOwotCi0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1uLmlzVmlydHVhbCgpKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTmFtZUlzSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEZhbHNlKGphdmFFbnRpdHkoKS50YWJsZU5hbWVJc0ludmFsaWQoVFlQRV9OQU1FKSk7Ci0JCWFzc2VydFRydWUoamF2YUVudGl0eSgpLnRhYmxlTmFtZUlzSW52YWxpZCgiRk9PIikpOwotCQkKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RmFsc2UoamF2YUVudGl0eSgpLnRhYmxlTmFtZUlzSW52YWxpZCgiQkFSIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBqYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGphdmFFbnRpdHkoKS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gamF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBqYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXR5cGVSZXNvdXJjZS5tb3ZlKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBqYXZhRW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBqYXZhRW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgamF2YUVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gamF2YUVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBqYXZhRW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMiwgamF2YUVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGphdmFFbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YUVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlqYXZhRW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygyLCBqYXZhRW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJamF2YUVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGphdmFFbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YUVudGl0eS5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCi0JCWphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGphdmFFbnRpdHkuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGphdmFFbnRpdHkuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsJCi0JCWFzc2VydEVxdWFscyg0LCBqYXZhRW50aXR5LmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCWphdmFFbnRpdHkoKS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlqYXZhRW50aXR5KCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlqYXZhRW50aXR5KCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlqYXZhRW50aXR5KCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWphdmFFbnRpdHkoKS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpKTsKLQotCQlqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCWphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCWphdmFFbnRpdHkoKS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlqYXZhRW50aXR5KCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0KLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uPiBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFBdHRyaWJ1dGVPdmVycmlkZXMpKTsKLQkJCi0JCQotCQllbnRpdHkubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCi0JCWVudGl0eS5tb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0vLwkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCSgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCQkKLQkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJdHlwZVJlc291cmNlLm1vdmUoMiwgMCwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQl0eXBlUmVzb3VyY2UubW92ZSgwLCAxLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gZW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCAgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlqYXZhRW50aXR5KCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBqYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBqYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLS8vCS8vVE9ETyBhZGQgYWxsIG1hcHBpbmcgdHlwZXMgdG8gdGhlIG1hcHBlZCBzdXBlcmNsYXNzIHRvIHRlc3Qgd2hpY2ggb25lcyBhcmUgb3ZlcnJpZGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBqYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBqYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zTWFwcGVkU3VwZXJjbGFzc0luT3JtWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gamF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQl0eXBlUmVzb3VyY2UubW92ZSgxLCAwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBqYXZhRW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0KLQkJLy9NYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkvL0Jhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgamF2YUVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCi0JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCQkKLQkJCi0JCQotLy8JCS8vVE9ETyBqb2luQ29sdW1ucyBmb3IgZGVmYXVsdCBhc3NvY2lhdGlvbiBvdmVycmlkZXMKLS8vLy8JSUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLS8vLy8JCi0vLy8vCi0vLy8vCUlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoSU1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLS8vLy8JCi0vLy8vCUlPbmVUb09uZU1hcHBpbmcgYWRkcmVzc01hcHBpbmcgPSAoSU9uZVRvT25lTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotLy8vLwlJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gYWRkcmVzc01hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBWiIpOwotLy8vLwkKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGUuQU5OT1RBVElPTl9OQU1FKSk7Ci0vLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXMuQU5OT1RBVElPTl9OQU1FKSk7Ci0vLy8vCi0vLy8vCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSk7Ci0vLy8vCWRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJCQVoiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLS8vLy8KLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8KLS8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLS8vLy8JCi0vLy8vCWphdmFFbnRpdHkuYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwKS5zZXROYW1lKCJhZGRyZXNzIik7Ci0vLy8vCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygyLCBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGphdmFFbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgamF2YUVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCQkKLQkJamF2YUVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhRW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlqYXZhRW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFFbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBqYXZhRW50aXR5ID0gamF2YUVudGl0eSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGphdmFFbnRpdHkuYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCi0JCWphdmFFbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMiwgamF2YUVudGl0eS5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlqYXZhRW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGphdmFFbnRpdHkuYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7CQotCQlhc3NlcnRFcXVhbHMoMywgamF2YUVudGl0eS5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlqYXZhRW50aXR5KCkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlqYXZhRW50aXR5KCkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKSk7Ci0KLQkJamF2YUVudGl0eSgpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJSXRlcmF0b3I8QXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlqYXZhRW50aXR5KCkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlqYXZhRW50aXR5KCkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uPiBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcykpOwotCQkKLQkJCi0JCWVudGl0eS5tb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgxLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gZW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCi0JCWVudGl0eS5tb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBlbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQkJCi0JCUxpc3RJdGVyYXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJdHlwZVJlc291cmNlLm1vdmUoMiwgMCwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gZW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5tb3ZlKDAsIDEsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBlbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gZW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCAgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBlbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBqYXZhRW50aXR5KCkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxOYW1lZFF1ZXJ5QW5ub3RhdGlvbj4gamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MiA9IGVudGl0eS5hZGROYW1lZFF1ZXJ5KDApOwotCQluYW1lZFF1ZXJ5Mi5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MyA9IGVudGl0eS5hZGROYW1lZFF1ZXJ5KDEpOwotCQluYW1lZFF1ZXJ5My5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8TmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeTIsIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeTMsIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeSwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCQotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJmb28iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQllbnRpdHkuYWRkTmFtZWRRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5LmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eS5hZGROYW1lZFF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE5hbWVkUXVlcnlBbm5vdGF0aW9uPiBqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQkKLQkJZW50aXR5LnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhTmFtZWRRdWVyaWVzKSk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWVudGl0eS5yZW1vdmVOYW1lZFF1ZXJ5KDApOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE5hbWVkTmF0aXZlUXVlcnlXaXRoTmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWVudGl0eS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQluYXRpdmVRdWVyeS5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQllbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlksIEpQQS5OQU1FRF9RVUVSSUVTKTsKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBlbnRpdHkubmFtZWRRdWVyaWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVOYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJZW50aXR5LmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eS5hZGROYW1lZFF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHkuYWRkTmFtZWRRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxOYW1lZFF1ZXJ5QW5ub3RhdGlvbj4gamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQkJCi0JCQotCQllbnRpdHkubW92ZU5hbWVkUXVlcnkoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCi0JCWVudGl0eS5tb3ZlTmFtZWRRdWVyeSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lZFF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7Ci0JCQotCQkoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQlMaXN0SXRlcmF0b3I8TmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5tb3ZlKDIsIDAsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5tb3ZlKDAsIDEsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkUXVlcmllcygpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5hbWVkUXVlcmllc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5uYW1lZFF1ZXJpZXNTaXplKCkpOwotCi0JCSgoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5Lm5hbWVkUXVlcmllc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJbmFtZWROYXRpdmVRdWVyeS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbj4gamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5MiA9IGVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQluYW1lZE5hdGl2ZVF1ZXJ5Mi5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5MyA9IGVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpOwotCQluYW1lZE5hdGl2ZVF1ZXJ5My5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8TmFtZWROYXRpdmVRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMobmFtZWROYXRpdmVRdWVyeTIsIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWROYXRpdmVRdWVyeTMsIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWROYXRpdmVRdWVyeSwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCQotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJZW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbj4gamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQkJCi0JCWVudGl0eS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQkJamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5LnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhTmFtZWRRdWVyaWVzKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8TmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24+IGphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhTmFtZWRRdWVyaWVzKSk7Ci0JCQotCQkKLQkJZW50aXR5Lm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8TmFtZWROYXRpdmVRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQotCQllbnRpdHkubW92ZU5hbWVkTmF0aXZlUXVlcnkoMCwgMSk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCQkKLQkJKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsJCi0JCUxpc3RJdGVyYXRvcjxOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCQkKLQkJdHlwZVJlc291cmNlLm1vdmUoMiwgMCwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJdHlwZVJlc291cmNlLm1vdmUoMCwgMSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkpOwotCi0JCSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUlkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlJZENsYXNzQW5ub3RhdGlvbiBpZENsYXNzID0gKElkQ2xhc3NBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWlkQ2xhc3Muc2V0VmFsdWUoIm1vZGVsLkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGphdmFFbnRpdHkoKS5nZXRJZENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsICgoSWRDbGFzc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLmdldFZhbHVlKCkpOwotCQkKLQkJLy90ZXN0IHNldHRpbmcgIEBJZENsYXNzIHZhbHVlIHRvIG51bGwsIElkQ2xhc3MgYW5ub3RhdGlvbiBpcyByZW1vdmVkCi0JCWlkQ2xhc3Muc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3Jlc2V0IEBJZENsYXNzIHZhbHVlIGFuZCB0aGVuIHJlbW92ZSBASWRDbGFzcwotCQlpZENsYXNzID0gKElkQ2xhc3NBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkKLQkJaWRDbGFzcy5zZXRWYWx1ZSgibW9kZWwuRm9vIik7Ci0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRJZENsYXNzKCkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRJZENsYXNzKCkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCi0JCWphdmFFbnRpdHkoKS5zZXRJZENsYXNzKCJtb2RlbC5Gb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCAoKElkQ2xhc3NBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBqYXZhRW50aXR5KCkuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCWphdmFFbnRpdHkoKS5zZXRJZENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRJZENsYXNzKCkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJpbWFyeUtleUNvbHVtbk5hbWVXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkpOwotCi0JCW1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqYXZhRW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkpOwotCQkKLQkJKChKYXZhSWRNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9JRCIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgamF2YUVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpKTsKLQkJCi0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBqYXZhRW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZSA9IChKYXZhQXR0cmlidXRlT3ZlcnJpZGUpIGphdmFBdHRyaWJ1dGVPdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIklEIik7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBqYXZhRW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkQ29uY3JldGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRUcnVlKGphdmFFbnRpdHkoKS5pc0Rpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWRBYnN0cmFjdENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUVudGl0eSgpLmlzRGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdGVkVmFsdWVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA4OGY5My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdGVkVmFsdWVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFHZW5lcmF0ZWRWYWx1ZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SID0gIk1ZX0dFTkVSQVRPUiI7Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkdlbmVyYXRlZFZhbHVlIiwgCi0JCQkiR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0OyIgKwotCQkJIlN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0IFwiXCI7ICIpOwkJCi0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5HRU5FUkFURURfVkFMVUUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBHZW5lcmF0ZWRWYWx1ZShnZW5lcmF0b3I9XCIiICsgR0VORVJBVE9SICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhR2VuZXJhdGVkVmFsdWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1IsIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldEdlbmVyYXRvcigpKTsKLQotCQkvL2NoYW5nZSByZXNvdXJjZSBtb2RlbCBzZXF1ZW5jZUdlbmVyYXRvciBuYW1lLCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKTsKLQkJCi0JCWdlbmVyYXRlZFZhbHVlLnNldEdlbmVyYXRvcigiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldEdlbmVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJhdGVkVmFsdWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUiwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0R2VuZXJhdG9yKCkpOwotCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLnNldFNwZWNpZmllZEdlbmVyYXRvcigiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldEdlbmVyYXRvcigpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1IsIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldEdlbmVyYXRvcigpKTsKLQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5zZXRTcGVjaWZpZWRHZW5lcmF0b3IobnVsbCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChnZW5lcmF0ZWRWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX1NUUkFURUdZLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXRTdHJhdGVneSgpKTsKLQotCQkvL2NoYW5nZSByZXNvdXJjZSBtb2RlbCBzZXF1ZW5jZUdlbmVyYXRvciBuYW1lLCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKTsKLQkJCi0JCWdlbmVyYXRlZFZhbHVlLnNldFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuSURFTlRJVFkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRpb25UeXBlLklERU5USVRZLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXRTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRlZFZhbHVlLkRFRkFVTFRfU1RSQVRFR1ksIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldERlZmF1bHRTdHJhdGVneSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmF0ZWRWYWx1ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGVkVmFsdWUuREVGQVVMVF9TVFJBVEVHWSwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0KLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuc2V0U3BlY2lmaWVkU3RyYXRlZ3koR2VuZXJhdGlvblR5cGUuSURFTlRJVFkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRpb25UeXBlLklERU5USVRZLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXRTdHJhdGVneSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuSURFTlRJVFksIGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuc2V0U3BlY2lmaWVkU3RyYXRlZ3kobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGVkVmFsdWUuREVGQVVMVF9TVFJBVEVHWSwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0JCWdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKTsKLQkJYXNzZXJ0Tm90TnVsbChnZW5lcmF0ZWRWYWx1ZSk7Ci0JCWFzc2VydE51bGwoZ2VuZXJhdGVkVmFsdWUuZ2V0U3RyYXRlZ3koKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmMDdlZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhSWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVJZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiR2VuZXJhdGVkVmFsdWUiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlbXBvcmFsQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlbXBvcmFsIiwgIlRlbXBvcmFsVHlwZSB2YWx1ZSgpOyIpOwkJCi0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVUZW1wb3JhbEFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLlRFTVBPUkFMLCBKUEEuVEVNUE9SQUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZ0dlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuR0VORVJBVEVEX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAR2VuZXJhdGVkVmFsdWUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEphdmFJZE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFRlbXBvcmFsKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlpZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJaWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZy5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFRlbXBvcmFsKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlpZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJaWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZy5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRlbXBvcmFsKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBpZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkJCi0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChudWxsKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0ZW1wb3JhbC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgaWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKGlkTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGlkTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgaWRNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgaWRNYXBwaW5nLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoaWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJCi0JCWlkTWFwcGluZy5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgc2VxdWVuY2UgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJCWlkTWFwcGluZy5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJCi0JCQotCQlpZE1hcHBpbmcucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUikpOwotCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlpZE1hcHBpbmcucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShpZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0Tm90TnVsbChpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoaWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCi0JCWlkTWFwcGluZy5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgdGFibGUgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJaWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7CQkKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQotCQkKLQkJaWRNYXBwaW5nLnJlbW92ZVRhYmxlR2VuZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpKTsKLQkJCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSB0YWJsZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlpZE1hcHBpbmcucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRHZW5lcmF0ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0R2VuZXJhdGVkVmFsdWUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZ0dlbmVyYXRlZFZhbHVlKCk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSkpOwotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCi0JCS8vdHJ5IGFkZGluZyBhbm90aGVyIGdlbmVyYXRlZCB2YWx1ZSwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQkKLQkJCi0JCWlkTWFwcGluZy5yZW1vdmVHZW5lcmF0ZWRWYWx1ZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKSk7Ci0JCQotCQkvL3RyeSByZW1vdmluZyB0aGUgZ2VuZXJhdGVkVmFsdWUgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlpZE1hcHBpbmcucmVtb3ZlR2VuZXJhdGVkVmFsdWUoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmZkMjI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFKb2luQ29sdW1uVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBKYXZhSm9pbkNvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlT25lVG9PbmVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9PbmUiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsgIiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyAiICsKLQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkJCi0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU9uZVRvT25lQW5ub3RhdGlvbigpOwotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVPbmVUb09uZUFubm90YXRpb24oKTsKLQkJY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKTsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgUHJvamVjdCB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgcHJval9pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb2plY3QuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uKTsKLQkJCi0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsJCi0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGFubm90YXRpb24gcmVtb3ZlZCwgc3BlY2lmaWVkIGpvaW4gY29sdW1uIHJlbW92ZWQKLQkJamF2YUpvaW5Db2x1bW4uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JLy8gPGF0dHJpYnV0ZSBuYW1lPl88cmVmZXJlbmNlZCBjb2x1bW4gbmFtZT4KLQkvLyAgICAgb3IKLQkvLyA8dGFyZ2V0IGVudGl0eSBuYW1lPl88cmVmZXJlbmNlZCBjb2x1bW4gbmFtZT4JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZSgpOwotCQljcmVhdGVUYXJnZXRFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luQ29sdW1uIGRlZmF1bHRKYXZhSm9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQkKLS8vCQlhc3NlcnROdWxsKGRlZmF1bHRKYXZhSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLS8vVE9ETyB0ZXN0IGRlZmF1bHQgam9pbiBjb2x1bW4gbmFtZQotLy8JCS8vYWRkIHRhcmdldCBlbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyBqb2luIHRhYmxlIG5hbWUgaXMgW3RhYmxlIG5hbWVdX1t0YXJnZXQgdGFibGUgbmFtZV0KLS8vCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb2plY3QiKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0Iiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotLy8JCQotLy8JCUphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5qYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0vLwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9uKEpvaW5UYWJsZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vCQotLy8JCS8vdGFyZ2V0IGVudGl0eSBkb2VzIG5vdCByZXNvbHZlLCBkZWZhdWx0IG5hbWUgaXMgbnVsbAotLy8JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiRm9vIik7Ci0vLwkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwotLy8JCS8vZGVmYXVsdCB0YXJnZXQgZW50aXR5IGRvZXMgcmVzb2x2ZSwgc28gZGVmYXVsdCBuYW1lIGlzIGFnYWluIFt0YWJsZSBuYW1lXV9bdGFyZ2V0IHRhYmxlIG5hbWVdCi0vLwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX1Byb2plY3QiLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwotLy8JCS8vYWRkIHRoZSBqb2luIHRhYmxlIGFubm90YXRpb24sIHZlcmlmeSBkZWZhdWx0IGpvaW4gdGFibGUgbmFtZSBpcyB0aGUgc2FtZQotLy8JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSm9pblRhYmxlLkFOTk9UQVRJT05fTkFNRSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb24oSm9pblRhYmxlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8JCQotLy8JCS8vc2V0IGEgdGFibGUgb24gdGhlIHRhcmdldCBlbnRpdHksIHZlcnkgZGVmYXVsdCBqb2luIHRhYmxlIG5hbWUgdXBkYXRlcwotLy8JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9GT08iLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJLy9zZXQgYSB0YWJsZSBvbiB0aGUgb3duaW5nIGVudGl0eSwgdmVyeSBkZWZhdWx0IGpvaW4gdGFibGUgbmFtZSB1cGRhdGVzCi0vLwkJamF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4pOwotCQkKLQkJCi0JCS8vc2V0IHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWphdmFKb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwkKLQkJamF2YUpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIkJBUiIpOwotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCi0JCS8vc2V0IHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIAotCQlqYXZhSm9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKCJCQVIiLCBqYXZhSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQkvL3NldCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkvL3NldCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JLy9UT0RPIHRlc3QgZGVmYXVsdCBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lCi0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4pOwotCQkKLQkJCi0JCS8vc2V0IHRhYmxlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsJCi0JCWphdmFKb2luQ29sdW1uLnNldFRhYmxlKCJCQVIiKTsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQotCQkvL3NldCB0YWJsZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgCi0JCWphdmFKb2luQ29sdW1uLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoIkJBUiIsIGphdmFKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCS8vc2V0IHRhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCB0YWJsZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCS8vVE9ETyB0ZXN0IGRlZmF1bHQgam9pbiBjb2x1bW4gdGFibGUKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbik7Ci0JCQotCQkKLQkJLy9zZXQgdW5pcXVlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsJCi0JCWphdmFKb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgamF2YUpvaW5Db2x1bW4uZ2V0VW5pcXVlKCkpOwotCQotCQkvL3NldCB1bmlxdWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIAotCQlqYXZhSm9pbkNvbHVtbi5zZXRVbmlxdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4uZ2V0VW5pcXVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQkvL3NldCB1bmlxdWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGphdmFKb2luQ29sdW1uLmdldFVuaXF1ZSgpKTsKLQkJCi0JCS8vc2V0IHVuaXF1ZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uLmdldFVuaXF1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uKTsKLQkJCi0JCQotCQkvL3NldCBudWxsYWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7CQotCQlqYXZhSm9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqYXZhSm9pbkNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkKLQkJLy9zZXQgbnVsbGFibGUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIAotCQlqYXZhSm9pbkNvbHVtbi5zZXROdWxsYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uLmdldE51bGxhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCS8vc2V0IG51bGxhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgamF2YUpvaW5Db2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQkvL3NldCBudWxsYWJsZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbik7Ci0JCQotCQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7CQotCQlqYXZhSm9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgamF2YUpvaW5Db2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgCi0JCWphdmFKb2luQ29sdW1uLnNldEluc2VydGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQkvL3NldCBpbnNlcnRhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGphdmFKb2luQ29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JCQotCQkvL3NldCBpbnNlcnRhYmxlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4pOwotCQkKLQkJCi0JCS8vc2V0IHVwZGF0YWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7CQotCQlqYXZhSm9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGphdmFKb2luQ29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkKLQkJLy9zZXQgdXBkYXRhYmxlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCAKLQkJamF2YUpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJCi0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJLy9zZXQgdXBkYXRhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqYXZhSm9pbkNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JCQotCQkvL3NldCB1cGRhdGFibGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFKb2luVGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjgwMzIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YUpvaW5UYWJsZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgSmF2YUpvaW5UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9NYW55IiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luVGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJLy9UT0RPCi0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5UYWJsZSIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJVbmlxdWVDb25zdHJhaW50IiwgCi0JCQkiU3RyaW5nW10gY29sdW1uTmFtZXMoKTsgIik7CQkKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKTsKLQkJY3JlYXRlSm9pblRhYmxlQW5ub3RhdGlvbigpOwotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVNYW55VG9NYW55QW5ub3RhdGlvbigpOwotCQljcmVhdGVKb2luVGFibGVBbm5vdGF0aW9uKCk7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248UHJvamVjdD4gcHJvamVjdHM7IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgUHJvamVjdCB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgcHJval9pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb2plY3QuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCUpvaW5UYWJsZUFubm90YXRpb24gamF2YUpvaW5UYWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5UYWJsZSk7Ci0JCQotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWphdmFKb2luVGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWphdmFKb2luVGFibGUuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWphdmFKb2luVGFibGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlqYXZhSm9pblRhYmxlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luVGFibGUuZ2V0TmFtZSgpKTsKLQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGphdmFKb2luVGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luVGFibGUpOwotCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlqYXZhSm9pblRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFKb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJLy9qb2luVGFibGUgZGVmYXVsdCBuYW1lIGlzIG51bGwgYmVjYXVzZSB0YXJnZXRFbnRpdHkgaXMgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCS8vYWRkIHRhcmdldCBlbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyBqb2luIHRhYmxlIG5hbWUgaXMgW3RhYmxlIG5hbWVdX1t0YXJnZXQgdGFibGUgbmFtZV0KLQkJY3JlYXRlVGFyZ2V0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvamVjdCIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0Iiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQotCQkvL3RhcmdldCBlbnRpdHkgZG9lcyBub3QgcmVzb2x2ZSwgZGVmYXVsdCBuYW1lIGlzIG51bGwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJLy9kZWZhdWx0IHRhcmdldCBlbnRpdHkgZG9lcyByZXNvbHZlLCBzbyBkZWZhdWx0IG5hbWUgaXMgYWdhaW4gW3RhYmxlIG5hbWVdX1t0YXJnZXQgdGFibGUgbmFtZV0KLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0Iiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCS8vYWRkIHRoZSBqb2luIHRhYmxlIGFubm90YXRpb24sIHZlcmlmeSBkZWZhdWx0IGpvaW4gdGFibGUgbmFtZSBpcyB0aGUgc2FtZQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCBhIHRhYmxlIG9uIHRoZSB0YXJnZXQgZW50aXR5LCB2ZXJ5IGRlZmF1bHQgam9pbiB0YWJsZSBuYW1lIHVwZGF0ZXMKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9GT08iLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkvL3NldCBhIHRhYmxlIG9uIHRoZSBvd25pbmcgZW50aXR5LCB2ZXJ5IGRlZmF1bHQgam9pbiB0YWJsZSBuYW1lIHVwZGF0ZXMKLQkJamF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCUpvaW5UYWJsZUFubm90YXRpb24gamF2YUpvaW5UYWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pblRhYmxlKTsKLQkJCi0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pblRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pblRhYmxlLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhSm9pblRhYmxlLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWphdmFKb2luVGFibGUuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5UYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlqYXZhSm9pblRhYmxlLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhSm9pblRhYmxlLmdldFNjaGVtYSgpKTsKLQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqYXZhSm9pblRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luVGFibGUpOwotCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJmb28iKTsKLQkJamF2YUpvaW5UYWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFKb2luVGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJam9pblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGphdmFKb2luVGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luVGFibGUpOwotCQkKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pblRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pblRhYmxlLnNldENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqYXZhSm9pblRhYmxlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5UYWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJamF2YUpvaW5UYWJsZS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhSm9pblRhYmxlLmdldENhdGFsb2coKSk7Ci0KLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqYXZhSm9pblRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pblRhYmxlKTsKLQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWpvaW5UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJamF2YUpvaW5UYWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhSm9pblRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJam9pblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IGpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlqb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0KLQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQkKLQkJam9pblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCi0KLQkJam9pblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDApOwotCQlqb2luVGFibGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDEpOwotCQlqb2luVGFibGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDIpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLnNldE5hbWUoIkZPTyIpOwotCQlqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5zZXROYW1lKCJCQVoiKTsKLQkKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UubW92ZUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gam9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW5zID0gam9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW5zID0gam9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShqb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCS8vVE9ETwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCi0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuam9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuam9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBqb2luVGFibGUuam9pbkNvbHVtbnNTaXplKCkpOwotCi0JCWpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQkvL2lmIG5vbi1vd25pbmcgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIHRoZW4gbm8gZGVmYXVsdCBqb2luIGNvbHVtbgotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygwLCBqb2luVGFibGUuam9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJCi0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbjIgPSBqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4zID0gam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDEpOwotCQlpbnZlcnNlSm9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGludmVyc2VKb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKGludmVyc2VKb2luQ29sdW1uMiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhpbnZlcnNlSm9pbkNvbHVtbjMsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoaW52ZXJzZUpvaW5Db2x1bW4sIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0KLQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJCi0JCWpvaW5UYWJsZS5tb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSBqb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCWpvaW5UYWJsZS5tb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSW52ZXJzZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLmFkZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlqb2luVGFibGVSZXNvdXJjZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMik7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApLnNldE5hbWUoIkZPTyIpOwotCQlqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDIpLnNldE5hbWUoIkJBWiIpOwotCQotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLm1vdmVJbnZlcnNlSm9pbkNvbHVtbigyLCAwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UubW92ZUludmVyc2VKb2luQ29sdW1uKDAsIDEpOwotCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSBqb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uoam9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpIHsKLQkJLy9UT0RPCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBqb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCi0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgam9pblRhYmxlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCS8vaWYgbm9uLW93bmluZyBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgdGhlbiBubyBkZWZhdWx0IGpvaW4gY29sdW1uCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKb2luVGFibGUgam9pblRhYmxlID0gKChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpKS5nZXRKb2luVGFibGUoKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSAoKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkpLmdldEpvaW5UYWJsZSgpOwotCi0JCWFzc2VydEVxdWFscygwLCAgam9pblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiZm9vIik7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJiYXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCAgam9pblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKb2luVGFibGUgam9pblRhYmxlID0gKChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpKS5nZXRKb2luVGFibGUoKTsKLQkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9ICgoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKSkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9ICgoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKSkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCWpvaW5UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQkKLQkJam9pblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJam9pblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKb2luVGFibGUgam9pblRhYmxlID0gKChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpKS5nZXRKb2luVGFibGUoKTsKLQkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQkKLQkJam9pblRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQotCi0JCWpvaW5UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9ICgoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKSkuZ2V0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0KLQkJCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDdjNGNhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1hbnlUb01hbnlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFueVRvTWFueSIsICIiKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVNYW55VG9NYW55QW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sbGVjdGlvbk1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uQ29sbGVjdGlvbk1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueS5zZXRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9NYW55LmdldEZldGNoKCkpOwotCQotCQltYW55VG9NYW55LnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueS5zZXRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LnNldE1hcHBlZEJ5KCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5IiwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gbWFueVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gbWFueVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IG1hbnlUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgZGVmYXVsdCBzdGlsbCBzZXQsIGhhbmRsZWQgYnkgdmFsaWRhdGlvbgotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCS8vYWRkIHRhcmdldEVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gYWRkcmVzc0NsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCi0JCS8vdGVzdCB0YXJnZXQgaXMgbm90IGFuIEVudGl0eSwgZGVmYXVsdCB0YXJnZXQgZW50aXR5IHN0aWxsIGV4aXN0cywgdGhpcyBjYXNlIGhhbmRsZWQgd2l0aCB2YWxpZGF0aW9uCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBtYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldEVudGl0eUNvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sbGVjdGlvbk1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHlOb25Db2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5vbkNvbGxlY3Rpb25NYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBtYW55VG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBtYW55VG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXRFbnRpdHkgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyB0YXJnZXQgZW50aXR5IHNob3VsZCByZXNvbHZlCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlUeXBlTWFwcGluZyBhZGRyZXNzVHlwZU1hcHBpbmcgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9yZGVyQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCi0JCS8vc2V0IG9yZGVyQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9yZGVyQnkuZ2V0VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9yZGVyQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7Ci0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5Iiwgb3JkZXJCeS5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5vT3JkZXJpbmcoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCi0JCS8vc2V0IG9yZGVyQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKLQkKLQkJLy9zZXQgb3JkZXJCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobWFueVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOb09yZGVyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCi0vLwkJbWFueVRvTWFueU1hcHBpbmcuc2V0Tm9PcmRlcmluZyhmYWxzZSk7IC8vdGhpcyBkb2VzIG5vdGhpbmcKLS8vCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLS8vCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJuZXdPcmRlckJ5Iik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKLS8vCQlPcmRlckJ5IG9yZGVyQnkgPSAoT3JkZXJCeSkgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbihPcmRlckJ5LkFOTk9UQVRJT05fTkFNRSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5Iiwgb3JkZXJCeS5nZXRWYWx1ZSgpKTsKLS8vCQotLy8JCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLS8vCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KG51bGwpOwotLy8JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKLS8vCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb24oT3JkZXJCeS5BTk5PVEFUSU9OX05BTUUpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUGtPcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc1BrT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnlNYXBwaW5nLmlzUGtPcmRlcmluZygpKTsKLQkJCi0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJb3JkZXJCeS5zZXRWYWx1ZSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc1BrT3JkZXJpbmcoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc1BrT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9tT3JkZXJpbmcoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQkKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydFRydWUobWFueVRvTWFueU1hcHBpbmcuaXNDdXN0b21PcmRlcmluZygpKTsKLQkKLQkJLy9zZXQgb3JkZXJCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiMmE4NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVNYW55VG9PbmVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFueVRvT25lIiwgIiIpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvT25lQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvT25lQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbGxlY3Rpb25NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvT25lQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNpemVkQ29sbGVjdGlvbk1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVNYW55VG9PbmVBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9PbmUuc2V0VGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvT25lLnNldE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkKLQkJbWFueVRvT25lLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQotCQkKLQkJLy9zZXQgb3B0aW9uYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvT25lLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCi0JCW1hbnlUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFueVRvT25lLmdldE9wdGlvbmFsKCkpOwotCi0JCQotCQkvL3NldCBvcHRpb25hbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW1hbnlUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0KLQkJam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmUoMSwgMCwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRKb2luKCkgewotCQkvL1RPRE8KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQltYW55VG9PbmVNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBtYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgbWFueVRvT25lTWFwcGluZy5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBtYW55VG9PbmVNYXBwaW5nLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG1hbnlUb09uZU1hcHBpbmcuam9pbkNvbHVtbnNTaXplKCkpOwotCi0JCW1hbnlUb09uZU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJbWFueVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgbWFueVRvT25lTWFwcGluZy5qb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gam9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKSk7Ci0KLQkJbWFueVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gam9pbkNvbHVtblJlc291cmNlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW1hbnlUb09uZU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCWpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCQotCQltYW55VG9PbmVNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW5SZXNvdXJjZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gamF2YUpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFKb2luQ29sdW1ucykpOwotCQkKLQkJCi0JCW1hbnlUb09uZU1hcHBpbmcubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YUpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCi0JCW1hbnlUb09uZU1hcHBpbmcubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhSm9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJKChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlKDIsIDAsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlUmVzb3VyY2UubW92ZSgwLCAxLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbklzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRKb2luQ29sdW1uKCkuaXNWaXJ0dWFsKCkpOwotCQkKLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlKb2luQ29sdW1uIHNwZWNpZmllZEpvaW5Db2x1bW4gPSBtYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1uLmlzVmlydHVhbCgpKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0Sm9pbkNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXRFbnRpdHkgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBkZWZhdWx0IHN0aWxsIHNldCwgaGFuZGxlZCBieSB2YWxpZGF0aW9uCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBtYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBtYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgYWRkcmVzc0NsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQotCQkvL3Rlc3QgdGFyZ2V0IGlzIG5vdCBhbiBFbnRpdHksIGRlZmF1bHQgdGFyZ2V0IGVudGl0eSBzdGlsbCBleGlzdHMsIHRoaXMgY2FzZSBoYW5kbGVkIHdpdGggdmFsaWRhdGlvbgotCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldEVudGl0eUNvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sbGVjdGlvbk1hbnlUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5R2VuZXJpY2l6ZWRDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNpemVkQ29sbGVjdGlvbk1hbnlUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBtYW55VG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQotCQltYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQltYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXRFbnRpdHkgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCS8vYWRkIHRhcmdldEVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgbm93IHRhcmdldCBlbnRpdHkgc2hvdWxkIHJlc29sdmUKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCVR5cGVNYXBwaW5nIGFkZHJlc3NUeXBlTWFwcGluZyA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCi0JCW1hbnlUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBtYW55VG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDNiOWVhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFwcGVkU3VwZXJjbGFzcyIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQlwdWJsaWMgSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3Muc2V0SWRDbGFzcygibXlJZENsYXNzIik7Ci0JCQotCQlqYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbnRpdHkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3Muc2V0SWRDbGFzcygibXlJZENsYXNzIik7Ci0KLQkJamF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGFibGUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzLnNldElkQ2xhc3MoIm15SWRDbGFzcyIpOwotCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhTnVsbFR5cGVNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFwcGVkU3VwZXJjbGFzcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBtYXBwZWRTdXBlcmNsYXNzLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBtYXBwZWRTdXBlcmNsYXNzLm92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTmFtZUlzSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKG1hcHBlZFN1cGVyY2xhc3MudGFibGVOYW1lSXNJbnZhbGlkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJYXNzZXJ0RmFsc2UobWFwcGVkU3VwZXJjbGFzcy50YWJsZU5hbWVJc0ludmFsaWQoIkZPTyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKG1hcHBlZFN1cGVyY2xhc3MuYXNzb2NpYXRlZFRhYmxlcygpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRGYWxzZShtYXBwZWRTdXBlcmNsYXNzLmFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRGYWxzZShtYXBwZWRTdXBlcmNsYXNzLmFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IG1hcHBlZFN1cGVyY2xhc3Mub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JLy9UT0RPIG5lZWQgdG8gY3JlYXRlIGEgc3ViY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyBhbmQgdGVzdCB0aGlzCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IG1hcHBlZFN1cGVyY2xhc3Mub3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKG1hcHBlZFN1cGVyY2xhc3MuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKG1hcHBlZFN1cGVyY2xhc3MuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKG1hcHBlZFN1cGVyY2xhc3MuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlJZENsYXNzQW5ub3RhdGlvbiBpZENsYXNzID0gKElkQ2xhc3NBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlpZENsYXNzLnNldFZhbHVlKCJtb2RlbC5Gb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBtYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgKChJZENsYXNzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvL3Rlc3Qgc2V0dGluZyAgQElkQ2xhc3MgdmFsdWUgdG8gbnVsbCwgSWRDbGFzcyBhbm5vdGF0aW9uIGlzIHJlbW92ZWQKLQkJaWRDbGFzcy5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3Jlc2V0IEBJZENsYXNzIHZhbHVlIGFuZCB0aGVuIHJlbW92ZSBASWRDbGFzcwotCQlpZENsYXNzID0gKElkQ2xhc3NBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkKLQkJaWRDbGFzcy5zZXRWYWx1ZSgibW9kZWwuRm9vIik7Ci0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5SWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzcy5nZXRJZENsYXNzKCkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCi0JCW1hcHBlZFN1cGVyY2xhc3Muc2V0SWRDbGFzcygibW9kZWwuRm9vIik7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgKChJZENsYXNzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgbWFwcGVkU3VwZXJjbGFzcy5nZXRJZENsYXNzKCkpOwotCQkKLQkJbWFwcGVkU3VwZXJjbGFzcy5zZXRJZENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxYzkyZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTmFtZWROYXRpdmVRdWVyeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YU5hbWVkTmF0aXZlUXVlcnlUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX05BTUUgPSAiUVVFUllfTkFNRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1FVRVJZID0gIk1ZX1FVRVJZIjsKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVRdWVyeUhpbnRBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5hbWVkTmF0aXZlUXVlcnkiLCAKLQkJCSJTdHJpbmcgbmFtZSgpOyIgKwotCQkJIlN0cmluZyBxdWVyeSgpOyIgKwotCQkJIlF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUXVlcnlIaW50QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJRdWVyeUhpbnQiLCAKLQkJCSJTdHJpbmcgbmFtZSgpOyIgKwotCQkJIlN0cmluZyB2YWx1ZSgpOyIpOwkJCi0JfQotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcnkobmFtZT1cIiIgKyBRVUVSWV9OQU1FICsgIlwiLCBxdWVyeT1cIiIgKyBRVUVSWV9RVUVSWSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQkJCi0JcHVibGljIEphdmFOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW5hbWVkTmF0aXZlUXVlcnkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgbmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnNldFF1ZXJ5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkJCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbmFtZWROYXRpdmVRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW5hbWVkTmF0aXZlUXVlcnkuc2V0UXVlcnkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkJCi0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBuYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQkJcXVlcnlIaW50LnNldE5hbWUoIkZPTyIpOwotCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCVF1ZXJ5SGludCBxdWVyeUhpbnQyID0gbmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApOwotCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JCXF1ZXJ5SGludDIuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlRdWVyeUhpbnQgcXVlcnlIaW50MyA9IG5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgxKTsKLQkJb3JtUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCQlxdWVyeUhpbnQzLnNldE5hbWUoIkJBWiIpOwotCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFF1ZXJ5SGludD4gaGludHMgPSBuYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRzKCk7Ci0JCWFzc2VydEVxdWFscyhxdWVyeUhpbnQyLCBoaW50cy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50MywgaGludHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludCwgaGludHMubmV4dCgpKTsKLQkJCi0JCWhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJbmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkZPTyIpOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5oaW50c1NpemUoKSk7Ci0JCQotCQluYW1lZE5hdGl2ZVF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5oaW50c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0KLQkJbmFtZWROYXRpdmVRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJbmFtZWROYXRpdmVRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCW5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludHNTaXplKCkpOwotCQkKLQkJCi0JCW5hbWVkTmF0aXZlUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxRdWVyeUhpbnQ+IGhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQluYW1lZE5hdGl2ZVF1ZXJ5Lm1vdmVIaW50KDAsIDEpOwotCQloaW50cyA9IG5hbWVkTmF0aXZlUXVlcnkuaGludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgwKTsKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgxKTsKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgyKTsKLQkJCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5zZXROYW1lKCJGT08iKTsKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5oaW50QXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCi0JCUxpc3RJdGVyYXRvcjxRdWVyeUhpbnQ+IGhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCWhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5tb3ZlSGludCgwLCAxKTsKLQkJaGludHMgPSBuYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnJlbW92ZUhpbnQoMSk7Ci0JCWhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5yZW1vdmVIaW50KDEpOwotCQloaW50cyA9IG5hbWVkTmF0aXZlUXVlcnkuaGludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcnkuaGludHMoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5hbWVkTmF0aXZlUXVlcnkuaGludHNTaXplKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCQotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMSwgbmFtZWROYXRpdmVRdWVyeS5oaW50c1NpemUoKSk7Ci0JCQotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWROYXRpdmVRdWVyeS5oaW50c1NpemUoKSk7Ci0JCQotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5yZW1vdmVIaW50KDApOwotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWROYXRpdmVRdWVyeS5oaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5zZXRSZXN1bHRDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuc2V0UmVzdWx0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlc3VsdENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW5hbWVkTmF0aXZlUXVlcnkuc2V0UmVzdWx0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0KLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW5hbWVkTmF0aXZlUXVlcnkuc2V0UmVzdWx0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlc3VsdFNldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdFNldE1hcHBpbmcoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5zZXRSZXN1bHRTZXRNYXBwaW5nKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVzdWx0U2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdFNldE1hcHBpbmcoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW5hbWVkTmF0aXZlUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZFF1ZXJ5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZFF1ZXJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0MDI3Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTmFtZWRRdWVyeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFOYW1lZFF1ZXJ5VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIlFVRVJZX05BTUUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9RVUVSWSA9ICJNWV9RVUVSWSI7Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTmFtZWRRdWVyeUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUXVlcnlIaW50QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOYW1lZFF1ZXJ5IiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsiICsKLQkJCSJTdHJpbmcgcXVlcnkoKTsiICsKLQkJCSJRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUXVlcnlIaW50IiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsiICsKLQkJCSJTdHJpbmcgdmFsdWUoKTsiKTsJCQotCX0KLQkJCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU5hbWVkUXVlcnlBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTkFNRURfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcnkobmFtZT1cIiIgKyBRVUVSWV9OQU1FICsgIlwiLCBxdWVyeT1cIiIgKyBRVUVSWV9RVUVSWSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQkJCi0JcHVibGljIEphdmFOYW1lZFF1ZXJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gamF2YU5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgamF2YU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqYXZhTmFtZWRRdWVyeS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFOYW1lZFF1ZXJ5LnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFOYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gamF2YU5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgamF2YU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW5hbWVkUXVlcnkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqYXZhTmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQluYW1lZFF1ZXJ5LnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFOYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZW50aXR5Lm5hbWVkUXVlcmllcygpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgamF2YU5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqYXZhTmFtZWRRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChqYXZhTmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFOYW1lZFF1ZXJ5LnNldFF1ZXJ5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBqYXZhTmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkJCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChqYXZhTmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW5hbWVkUXVlcnkuc2V0UXVlcnkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFOYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZW50aXR5Lm5hbWVkUXVlcmllcygpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkJCi0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBuYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludC5zZXROYW1lKCJGT08iKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJUXVlcnlIaW50IHF1ZXJ5SGludDIgPSBuYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludDIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQkKLQkJUXVlcnlIaW50IHF1ZXJ5SGludDMgPSBuYW1lZFF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCXF1ZXJ5SGludDMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFF1ZXJ5SGludD4gaGludHMgPSBuYW1lZFF1ZXJ5LmhpbnRzKCk7Ci0JCWFzc2VydEVxdWFscyhxdWVyeUhpbnQyLCBoaW50cy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50MywgaGludHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludCwgaGludHMubmV4dCgpKTsKLQkJCi0JCWhpbnRzID0gbmFtZWRRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gamF2YU5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkZPTyIpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBqYXZhTmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBqYXZhTmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0KLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YU5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgamF2YU5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YU5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQkKLQkJCi0JCW5hbWVkUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxRdWVyeUhpbnQ+IGhpbnRzID0gbmFtZWRRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQluYW1lZFF1ZXJ5Lm1vdmVIaW50KDAsIDEpOwotCQloaW50cyA9IG5hbWVkUXVlcnkuaGludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJamF2YU5hbWVkUXVlcnkuYWRkSGludCgwKTsKLQkJamF2YU5hbWVkUXVlcnkuYWRkSGludCgxKTsKLQkJamF2YU5hbWVkUXVlcnkuYWRkSGludCgyKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5zZXROYW1lKCJGT08iKTsKLQkJamF2YU5hbWVkUXVlcnkuaGludEF0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlqYXZhTmFtZWRRdWVyeS5oaW50QXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCi0JCUxpc3RJdGVyYXRvcjxRdWVyeUhpbnQ+IGhpbnRzID0gbmFtZWRRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJamF2YU5hbWVkUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCWhpbnRzID0gbmFtZWRRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQotCQlqYXZhTmFtZWRRdWVyeS5tb3ZlSGludCgwLCAxKTsKLQkJaGludHMgPSBuYW1lZFF1ZXJ5LmhpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWphdmFOYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMSk7Ci0JCWhpbnRzID0gbmFtZWRRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQotCQlqYXZhTmFtZWRRdWVyeS5yZW1vdmVIaW50KDEpOwotCQloaW50cyA9IG5hbWVkUXVlcnkuaGludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcnkuaGludHMoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJCi0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gamF2YU5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkKLQkJamF2YU5hbWVkUXVlcnkuYWRkSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQkKLQkJamF2YU5hbWVkUXVlcnkuYWRkSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQkKLQkJamF2YU5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJamF2YU5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0OGY1Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlT25lVG9NYW55QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9uZVRvTWFueSIsICIiKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU9uZVRvTWFueUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU9uZVRvTWFueUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sbGVjdGlvbk9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVPbmVUb01hbnlBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25Db2xsZWN0aW9uT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU9uZVRvTWFueUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55LnNldFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueS5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUiwgb25lVG9NYW55LmdldEZldGNoKCkpOwotCQotCQlvbmVUb01hbnkuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55LnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnkuc2V0TWFwcGVkQnkoIm5ld01hcHBlZEJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnkuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSBvbmVUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gb25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSBvbmVUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXRFbnRpdHkgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBkZWZhdWx0IHN0aWxsIHNldCwgaGFuZGxlZCBieSB2YWxpZGF0aW9uCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgYWRkcmVzc0NsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQotCQkvL3Rlc3QgdGFyZ2V0IGlzIG5vdCBhbiBFbnRpdHksIGRlZmF1bHQgdGFyZ2V0IGVudGl0eSBzdGlsbCBleGlzdHMsIHRoaXMgY2FzZSBoYW5kbGVkIHdpdGggdmFsaWRhdGlvbgotCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldEVudGl0eUNvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sbGVjdGlvbk9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5Tm9uQ29sbGVjdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOb25Db2xsZWN0aW9uT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvbmVUb01hbnlNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdmVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyB0YXJnZXQgZW50aXR5IHNob3VsZCByZXNvbHZlCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlUeXBlTWFwcGluZyBhZGRyZXNzVHlwZU1hcHBpbmcgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBvbmVUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBvbmVUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgb25lVG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJteU1hcEtleSIpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT3JkZXJCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCi0JCS8vc2V0IG9yZGVyQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5Iiwgb3JkZXJCeS5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgb3JkZXJCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7Ci0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5Iiwgb3JkZXJCeS5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOb09yZGVyaW5nKCkgIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9NYW55TWFwcGluZy5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKLQkJCi0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJb3JkZXJCeS5zZXRWYWx1ZSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKLQkKLQkJLy9zZXQgb3JkZXJCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55TWFwcGluZy5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVBrT3JkZXJpbmcoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc1BrT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueU1hcHBpbmcuaXNQa09yZGVyaW5nKCkpOwotCQkKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNQa09yZGVyaW5nKCkpOwotCQotCQkvL3NldCBvcmRlckJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc1BrT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9tT3JkZXJpbmcoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCi0JCS8vc2V0IG9yZGVyQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQkKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydFRydWUob25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQotCQkvL3NldCBvcmRlckJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ1NzQzMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbnNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFPbmVUb09uZU1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlT25lVG9PbmVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9PbmUiLCAiIik7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVPbmVUb09uZUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU9uZVRvT25lQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb2xsZWN0aW9uT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlT25lVG9PbmVBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNpemVkQ29sbGVjdGlvbk9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU9uZVRvT25lQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lLnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkJCQotCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkoIm5ld01hcHBlZEJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb09uZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkJCQotCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmVNYXBwaW5nLnNldE1hcHBlZEJ5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb09uZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JCi0JCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9PbmVNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkKLQkJb25lVG9PbmUuc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQotCQkKLQkJLy9zZXQgb3B0aW9uYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuc2V0T3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCi0JCQotCQkvL3NldCBvcHRpb25hbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZS5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQkKLQkJb25lVG9PbmUuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0KLQkJCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUiwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0KLQkJCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiQkFSIik7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCi0JCWpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVoiKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmUoMSwgMCwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEpvaW4oKSB7Ci0JCS8vVE9ETwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygwLCBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIG9uZVRvT25lTWFwcGluZy5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9uZVRvT25lTWFwcGluZy5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9uZVRvT25lTWFwcGluZy5qb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJb25lVG9PbmVNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCW9uZVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgb25lVG9PbmVNYXBwaW5nLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCS8vaWYgbm9uLW93bmluZyBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgdGhlbiBubyBkZWZhdWx0IGpvaW4gY29sdW1uCi0JCW9uZVRvT25lTWFwcGluZy5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygwLCBvbmVUb09uZU1hcHBpbmcuam9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gam9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gam9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpKTsKLQotCQlvbmVUb09uZU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGpvaW5Db2x1bW5SZXNvdXJjZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uUmVzb3VyY2VzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW5SZXNvdXJjZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGphdmFKb2luQ29sdW1ucyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhSm9pbkNvbHVtbnMpKTsKLQkJCi0JCQotCQlvbmVUb09uZU1hcHBpbmcubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhSm9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0KLQkJb25lVG9PbmVNYXBwaW5nLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhSm9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJKChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmUoMiwgMCwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmUoMCwgMSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbklzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRUcnVlKG9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmlzVmlydHVhbCgpKTsKLQotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJSm9pbkNvbHVtbiBzcGVjaWZpZWRKb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1uLmlzVmlydHVhbCgpKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRKb2luQ29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSBvbmVUb09uZU1hcHBpbmcuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IG9uZVRvT25lTWFwcGluZy5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IG9uZVRvT25lTWFwcGluZy5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXRFbnRpdHkgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBkZWZhdWx0IHN0aWxsIHNldCwgaGFuZGxlZCBieSB2YWxpZGF0aW9uCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCS8vYWRkIHRhcmdldEVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgb25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gYWRkcmVzc0NsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCi0JCS8vdGVzdCB0YXJnZXQgaXMgbm90IGFuIEVudGl0eSwgZGVmYXVsdCB0YXJnZXQgZW50aXR5IHN0aWxsIGV4aXN0cywgdGhpcyBjYXNlIGhhbmRsZWQgd2l0aCB2YWxpZGF0aW9uCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHlDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbGxlY3Rpb25PbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHlHZW5lcmljaXplZENvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY2l6ZWRDb2xsZWN0aW9uT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgb25lVG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCS8vYWRkIHRhcmdldEVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgbm93IHRhcmdldCBlbnRpdHkgc2hvdWxkIHJlc29sdmUKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCVR5cGVNYXBwaW5nIGFkZHJlc3NUeXBlTWFwcGluZyA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCi0JCWpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiQkFaIik7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlKDEsIDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsJCQotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgb25lVG9PbmVNYXBwaW5nLnByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBqb2luQ29sdW1ucyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBqb2luQ29sdW1ucyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlvbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKSk7Ci0KLQkJb25lVG9PbmVNYXBwaW5nLnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gam9pbkNvbHVtblJlc291cmNlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uUmVzb3VyY2VzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJCi0JCW9uZVRvT25lTWFwcGluZy5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlvbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gamF2YUpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUpvaW5Db2x1bW5zKSk7Ci0JCQotCQkKLQkJb25lVG9PbmVNYXBwaW5nLm1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YUpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0KLQkJb25lVG9PbmVNYXBwaW5nLm1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigwLCAxKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQkJCi0JCUxpc3RJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlKDIsIDAsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmUoMCwgMSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MzVmMmIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkJCi0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWQiLCAiIik7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFJZE1hcHBpbmcpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFCYXNpY01hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhSWRNYXBwaW5nKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTWFwcGluZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBFbWJlZGRlZEFubm90YXRpb24pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUVtYmVkZGVkTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNYXBwaW5nS2V5MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpIGluc3RhbmNlb2YgRW1iZWRkZWRBbm5vdGF0aW9uKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFFbWJlZGRlZE1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNYXBwaW5nS2V5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdLZXlNYXBwaW5nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0tleU1hcHBpbmdDaGFuZ2VJblJlc291cmNlTW9kZWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0TWFwcGluZ0Fubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpLmdldEtleSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjNzg4Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50VHlwZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZEFuZE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZVdpdGhGaWVsZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGVXaXRoTWV0aG9kQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGVOb25QZXJzaXN0ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlUGVyc2lzdGVudEV4dGVuZHNOb25QZXJzaXN0ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkMi5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkMiIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQgIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc05vdGhpbmdBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NGaWVsZEFuZE1ldGhvZEFubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0luaGVyaXRhbmNlMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9CQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2UzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVdpdGhNZXRob2RBbm5vdGF0aW9uKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQkKLQkJCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0luaGVyaXRhbmNlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQkvL2luaGVyaXRlZCBjbGFzcyBoYXZpbmcgYW5ub3RhdGlvbnMgc2V0IHdpbnMgb3ZlciB0aGUgZGVmYXVsdCBhY2Nlc3Mgc2V0IG9uIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2VQZXJzaXN0ZW5jZVVuaXREZWZhdWx0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sTm9BY2Nlc3NOb0Fubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbEVudGl0eUFjY2Vzc05vQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNBY2Nlc3NOb0Fubm90YXRpb25zKCkgIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5UHJvcGVydHlBY2Nlc3NBbmRGaWVsZEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8veG1sIGFjY2VzcyBzZXQgdG8gcHJvcGVydHksIGZpZWxkIGFubm90YXRpb25zLCBKYXZhUGVyc2lzdGVudFR5cGUgYWNjZXNzIGlzIHByb3BlcnR5Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5RmllbGRBY2Nlc3NBbmRQcm9wZXJ0eUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8veG1sIGFjY2VzcyBzZXQgdG8gZmllbGQsIHByb3BlcnR5IGFubm90YXRpb25zLCBKYXZhUGVyc2lzdGVudFR5cGUgYWNjZXNzIGlzIGZpZWxkCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzQWNjZXNzRmllbGRBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQotCS8vaW5oZXJpdGFuY2Ugd2lucyBvdmVyIGVudGl0eS1tYXBwaW5ncyBzcGVjaWZpZWQgYWNjZXNzCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbEVudGl0eU1hcHBpbmdzQWNjZXNzV2l0aEluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkRW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNoaWxkRW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxNZXRhZGF0YUNvbXBsZXRlRmllbGRBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQkvL3htbCBhY2Nlc3Mgc2V0IHRvIHByb3BlcnR5LCBzbyBldmVuIHRob3VnaCB0aGVyZSBhcmUgZmllbGQgYW5ub3RhdGlvbnMsIEphdmFQZXJzaXN0ZW50VHlwZQotCQkvL2FjY2VzcyBzaG91bGQgYmUgcHJvcGVydHkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc05vWG1sQWNjZXNzWG1sTWV0ZGF0YUNvbXBsZXRlUHJvcGVydHlBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQkvL3htbCBhY2Nlc3Mgbm90IHNldCwgbWV0YWRhdGEgY29tcGxldGUgc2V0LiAgSmF2YVBlcnNpc3RlbnRUeXBlIGFjY2VzcwotCQkvL2lzIGZpZWxkPz8KLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQYXJlbnRQZXJzaXN0ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJvb3RKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMocm9vdEphdmFQZXJzaXN0ZW50VHlwZSwgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUuZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSk7Ci0JCWFzc2VydE51bGwocm9vdEphdmFQZXJzaXN0ZW50VHlwZS5nZXRQYXJlbnRQZXJzaXN0ZW50VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBhcmVudFBlcnNpc3RlbnRUeXBlMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpOwotCQkKLQkJLy9wYXJlbnQgaXMgbm90IGFkZGVkIHRvIHRoZSBwZXJzaXN0ZW5jZVVuaXQsIGJ1dCBpdCBzaG91bGQgc3RpbGwgYmUgZm91bmQKLQkJLy9hcyB0aGUgcGFyZW50UGVyc2lzdGVudFR5cGUgYmVjYXVzZSBvZiBpbXBsaWVkQ2xhc3NSZWZzIGFuZCBjaGFuZ2VzIGZvciBidWcgMTkwMzE3Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSk7Ci0JfQkKLQkKLQkvL0VudGl0eSBleHRlbmRzIE5vbi1FbnRpdHkgZXh0ZW5kcyBFbnRpdHkgCi0JcHVibGljIHZvaWQgdGVzdFBhcmVudFBlcnNpc3RlbnRUeXBlMygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSByb290SmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQljbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUsIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLmdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkpOwotCQlhc3NlcnROdWxsKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUuZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbmhlcml0YW5jZUhpZXJhcmNoeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gaW5oZXJpdGFuY2VIaWVyYXJjaHkgPSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5pbmhlcml0YW5jZUhpZXJhcmNoeSgpOwkKLQkJCi0JCWFzc2VydEVxdWFscyhjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSwgaW5oZXJpdGFuY2VIaWVyYXJjaHkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUsIGluaGVyaXRhbmNlSGllcmFyY2h5Lm5leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbmhlcml0YW5jZUhpZXJhcmNoeTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZU5vblBlcnNpc3RlbnQoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVQZXJzaXN0ZW50RXh0ZW5kc05vblBlcnNpc3RlbnQoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJvb3RKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGluaGVyaXRhbmNlSGllcmFyY2h5ID0gY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUsIGluaGVyaXRhbmNlSGllcmFyY2h5Lm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhyb290SmF2YVBlcnNpc3RlbnRUeXBlLCBpbmhlcml0YW5jZUhpZXJhcmNoeS5uZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ0tleU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSBpbnN0YW5jZW9mIEVudGl0eUFubm90YXRpb24pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGluZ0tleTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSk7Ci0JCWFzc2VydFRydWUodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBFbWJlZGRhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwaW5nS2V5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0tleU1hcHBpbmdDaGFuZ2VJblJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl0eXBlUmVzb3VyY2Uuc2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdLZXlNYXBwaW5nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCXR5cGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNNYXBwZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50VHlwZSgpLmlzTWFwcGVkKCkpOwotCQkKLQkJamF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwkKLQkJYXNzZXJ0RmFsc2UoamF2YVBlcnNpc3RlbnRUeXBlKCkuaXNNYXBwZWQoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkQW5kTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscygxLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXNTaXplMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTmFtZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIikpOwotCQlhc3NlcnROdWxsKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJmb28iKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVOYW1lZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0TnVsbChqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZm9vIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGFyZW50UGVyc2lzdGVudFR5cGVHZW5lcmljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RHZW5lcmljRW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RHZW5lcmljTWFwcGVkU3VwZXJjbGFzcygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbnRpdHkxIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW50aXR5MiIpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuRW50aXR5MSIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRQYXJlbnRQZXJzaXN0ZW50VHlwZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygidGVzdC5FbnRpdHkyIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEdlbmVyaWNFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBFbnRpdHkxICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyBFbnRpdHkyPEludGVnZXI+IHt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW50aXR5MS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RHZW5lcmljTWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIEVudGl0eTI8Sz4ge30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbnRpdHkyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFlYTIwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUUgPSAiTVlfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fREVGSU5JVElPTiA9ICJNWV9DT0xVTU5fREVGSU5JVElPTiI7Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWQiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlByaW1hcnlLZXlKb2luQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQkKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVJZEFubm90YXRpb24oKTsKLQkJY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIiIgKyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkJCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW5SZXNvdXJjZSA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQotCQlwa0pvaW5Db2x1bW5SZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lTm9TcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IGphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHBrSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkvL3JlbW92ZSBASWQgYW5ub3RhdGlvbgotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWlkQXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFzc2VydE51bGwoc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUUsIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJCi0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHBrSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCXBrSm9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydE51bGwocGtKb2luQ29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihDT0xVTU5fREVGSU5JVElPTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX0RFRklOSVRJT04sIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiZm9vIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQljb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uUmVzb3VyY2UgPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkKLQkJcGtKb2luQ29sdW1uUmVzb3VyY2Uuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIkZPTyIpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZU5vU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBwa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCQotCQkvL3JlbW92ZSBASWQgYW5ub3RhdGlvbgotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWlkQXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFzc2VydE51bGwoc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW5SZXNvdXJjZSA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQotCQlwa0pvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQkKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwa0pvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJcGtKb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0TnVsbChwa0pvaW5Db2x1bW4pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1uLmlzVmlydHVhbCgpKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJamF2YUVudGl0eSgpLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRUcnVlKGphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc1JlZmVyZW5jZWRDb2x1bW5SZXNvbHZlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5pc1JlZmVyZW5jZWRDb2x1bW5SZXNvbHZlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERiQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0RGJDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REYlJlZmVyZW5jZWRDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXREYlJlZmVyZW5jZWRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REYlRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0RGJUYWJsZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFRdWVyeUhpbnRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVF1ZXJ5SGludFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZjU0MWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVF1ZXJ5SGludFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUXVlcnlIaW50VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIlFVRVJZX05BTUUiOwotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU5hbWVkUXVlcnlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTmFtZWRRdWVyeSIsIAotCQkJIlN0cmluZyBuYW1lKCk7IiArCi0JCQkiU3RyaW5nIHF1ZXJ5KCk7IiArCi0JCQkiUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVRdWVyeUhpbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlF1ZXJ5SGludCIsIAotCQkJIlN0cmluZyBuYW1lKCk7IiArCi0JCQkiU3RyaW5nIHZhbHVlKCk7Iik7CQkKLQl9Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk5BTUVEX1FVRVJZLCBKUEEuUVVFUllfSElOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyeShuYW1lPVwiIiArIFFVRVJZX05BTUUgKyAiXCIsIGhpbnRzPUBRdWVyeUhpbnQoKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQkJCi0JcHVibGljIEphdmFRdWVyeUhpbnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJUXVlcnlIaW50IHF1ZXJ5SGludCA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCkuaGludHMoKS5uZXh0KCk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlRdWVyeUhpbnRBbm5vdGF0aW9uIGphdmFRdWVyeUhpbnQgPSAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5oaW50cygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YVF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludC5nZXROYW1lKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFRdWVyeUhpbnQuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YVF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqYXZhUXVlcnlIaW50LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YVF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5Lm5hbWVkUXVlcmllcygpLm5leHQoKS5oaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpLmhpbnRzKCkubmV4dCgpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJUXVlcnlIaW50QW5ub3RhdGlvbiBqYXZhUXVlcnloaW50ID0gKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuaGludHMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFRdWVyeWhpbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlxdWVyeUhpbnQuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YVF1ZXJ5aGludC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXF1ZXJ5SGludC5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFRdWVyeWhpbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpLmhpbnRzKCkubmV4dCgpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJUXVlcnlIaW50QW5ub3RhdGlvbiBqYXZhUXVlcnloaW50ID0gKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuaGludHMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFRdWVyeWhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50LmdldFZhbHVlKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFRdWVyeWhpbnQuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFRdWVyeWhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcXVlcnlIaW50LmdldFZhbHVlKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqYXZhUXVlcnloaW50LnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFRdWVyeWhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpLmhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpLmhpbnRzKCkubmV4dCgpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJUXVlcnlIaW50QW5ub3RhdGlvbiBqYXZhUXVlcnloaW50ID0gKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuaGludHMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFRdWVyeWhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50LmdldFZhbHVlKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCXF1ZXJ5SGludC5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YVF1ZXJ5aGludC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBxdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcXVlcnlIaW50LnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFRdWVyeWhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50LmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFTZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQxOWI4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFTZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YVNlY29uZGFyeVRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIk1ZX1RBQkxFIjsKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWQiLCAiIik7CQkKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJTZWNvbmRhcnlUYWJsZSIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2Vjb25kYXJ5VGFibGVzIiwgIlNlY29uZGFyeVRhYmxlW10gdmFsdWUoKTsiKTsJCQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUlkQW5ub3RhdGlvbigpOwotCQljcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUobmFtZT1cIiIgKyBUQUJMRV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9XCJmb29cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiYmFyXCIpfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQotCQkKLQlwdWJsaWMgSmF2YVNlY29uZGFyeVRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBzZWNvbmRhcnlUYWJsZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUZyb21TcGVjaWZpZWROYW1lQ2hhbmdlSW5SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQl0YWJsZS5zZXROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRnJvbVNwZWNpZmllZENhdGFsb2dDaGFuZ2VJblJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUxpc3RJdGVyYXRvcjxTZWNvbmRhcnlUYWJsZUFubm90YXRpb24+IHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpLnNldENhdGFsb2coImZvbyIpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5uZXh0KCkuc2V0Q2F0YWxvZygiYmFyIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8U2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRzYmxlcyA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZWNvbmRhcnlUc2JsZXMubmV4dCgpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgc2Vjb25kYXJ5VHNibGVzLm5leHQoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRnJvbVNwZWNpZmllZFNjaGVtYUNoYW5nZUluUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJTGlzdEl0ZXJhdG9yPFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbj4gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5uZXh0KCkuc2V0U2NoZW1hKCJmb28iKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpLnNldFNjaGVtYSgiYmFyIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8U2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRzYmxlcyA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZWNvbmRhcnlUc2JsZXMubmV4dCgpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBzZWNvbmRhcnlUc2JsZXMubmV4dCgpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCXRhYmxlLnNldENhdGFsb2coIm15Q2F0YWxvZyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCWphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVNlY29uZGFyeVRhYmxlIHRhYmxlID0gamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKLQkJdGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCXRhYmxlLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIHRhYmxlUmVzb3VyY2UuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQl0YWJsZVJlc291cmNlLnNldFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLnNldFNwZWNpZmllZFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVNlY29uZGFyeVRhYmxlIHRhYmxlID0gamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKLQkJdGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJteVNjaGVtYSIpOwotCQl0YWJsZS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIHRhYmxlUmVzb3VyY2UuZ2V0U2NoZW1hKCkpOwotCQkKLQkJdGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBzZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW4gPSB0YWJsZVJlc291cmNlLmFkZFBrSm9pbkNvbHVtbigwKTsKLQkJcGtKb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcGtKb2luQ29sdW1uID0gdGFibGVSZXNvdXJjZS5hZGRQa0pvaW5Db2x1bW4oMCk7Ci0JCXBrSm9pbkNvbHVtbi5zZXROYW1lKCJCQVIiKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJdGFibGVSZXNvdXJjZS5tb3ZlUGtKb2luQ29sdW1uKDEsIDApOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQl0YWJsZVJlc291cmNlLnJlbW92ZVBrSm9pbkNvbHVtbigwKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZVJlc291cmNlLnJlbW92ZVBrSm9pbkNvbHVtbigwKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwotCQkvL2p1c3QgdGhlIGRlZmF1bHQgcGtKb2luQ29sdW1uLCBzbyAxCi0JCWFzc2VydEVxdWFscygxLCBzZWNvbmRhcnlUYWJsZS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCQotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJLy9vbmx5IHRoZSBzcGVjaWZpZWQgcGtKb2luQ29sdW1ucywgMwotCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGUucHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQa0pvaW5Db2x1bW4gPSBzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsgCi0JCWFzc2VydE5vdE51bGwoZGVmYXVsdFBrSm9pbkNvbHVtbik7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGRlZmF1bHRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGRlZmF1bHRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBkZWZhdWx0UGtKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJSXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zID0gdGFibGVSZXNvdXJjZS5wa0pvaW5Db2x1bW5zKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKLQotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBzZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCUl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gcGtKb2luQ29sdW1ucyA9IHRhYmxlUmVzb3VyY2UucGtKb2luQ29sdW1ucygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKLQotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlUmVzb3VyY2UucGtKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJc2Vjb25kYXJ5VGFibGUucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSk7Ci0JCQotCQlJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHBrSm9pbkNvbHVtblJlc291cmNlcyA9IHRhYmxlUmVzb3VyY2UucGtKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHBrSm9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHBrSm9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcGtKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCQotCQlzZWNvbmRhcnlUYWJsZS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKLQkJcGtKb2luQ29sdW1uUmVzb3VyY2VzID0gdGFibGVSZXNvdXJjZS5wa0pvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcGtKb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKHBrSm9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCXBrSm9pbkNvbHVtbnMgPSBzZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJCi0JCXNlY29uZGFyeVRhYmxlLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlwa0pvaW5Db2x1bW5SZXNvdXJjZXMgPSB0YWJsZVJlc291cmNlLnBrSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXBrSm9pbkNvbHVtbnMgPSBzZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZVJlc291cmNlLnBrSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJSXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zID0gdGFibGVSZXNvdXJjZS5wa0pvaW5Db2x1bW5zKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCQotCQlzZWNvbmRhcnlUYWJsZS5tb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMiwgMCk7Ci0JCXBrSm9pbkNvbHVtbnMgPSB0YWJsZVJlc291cmNlLnBrSm9pbkNvbHVtbnMoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5HZXREZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UGtKb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBkZWZhdWx0UGtKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCi0JCQotCQkvL3JlbW92ZSBASWQgYW5ub3RhdGlvbgotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWlkQXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFzc2VydE51bGwoZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFByaW1hcnlLZXlKb2luQ29sdW1uR2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQa0pvaW5Db2x1bW4gPSBzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGRlZmF1bHRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9yZW1vdmUgQElkIGFubm90YXRpb24KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlpZEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlhc3NlcnROdWxsKGRlZmF1bHRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5Jc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW4uaXNWaXJ0dWFsKCkpOwotCQkKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCXNlY29uZGFyeVRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQkKLQkJc2Vjb25kYXJ5VGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJc2Vjb25kYXJ5VGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJCi0JCXNlY29uZGFyeVRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0KLQotCQlzZWNvbmRhcnlUYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkKLQkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKCJCQVoiKTsKLQotCQkKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFTZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MDRkMTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFTZXF1ZW5jZUdlbmVyYXRvclRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUgPSAiTVlfU0VRVUVOQ0VfR0VORVJBVE9SIjsKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2VxdWVuY2VHZW5lcmF0b3IiLCAKLQkJCSJTdHJpbmcgbmFtZSgpOyIgKwotCQkJIlN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJImludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDA7ICIgKwotCQkJImludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Iik7CQkKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlNFUVVFTkNFX0dFTkVSQVRPUiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFNlcXVlbmNlR2VuZXJhdG9yKG5hbWU9XCIiICsgU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkJCi0JcHVibGljIEphdmFTZXF1ZW5jZUdlbmVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFNFUVVFTkNFX0dFTkVSQVRPUl9OQU1FLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwotCi0JCS8vY2hhbmdlIHJlc291cmNlIG1vZGVsIHNlcXVlbmNlR2VuZXJhdG9yIG5hbWUsIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUsIGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFNFUVVFTkNFX0dFTkVSQVRPUl9OQU1FLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwotCi0JCWlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoODIpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODIpLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODIpLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhTZXF1ZW5jZUdlbmVyYXRvci5ERUZBVUxUX0lOSVRJQUxfVkFMVUUsIGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldERlZmF1bHRJbml0aWFsVmFsdWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDgyKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgyKSwgaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDIwKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIwKSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0TmFtZShudWxsKTsKLQkJaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCi0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMjApKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjApLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyMCksIGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkUsIGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigyMCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRvci5ERUZBVUxUX0FMTE9DQVRJT05fU0laRSwgaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIwKSwgaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDI1KSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDI1KSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpKTsKLQl9Ci0JCi0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2VxdWVuY2VOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNlcXVlbmNlTmFtZSgibXlTZXF1ZW5jZU5hbWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlTZXF1ZW5jZU5hbWUiLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTZXF1ZW5jZU5hbWUiLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2VxdWVuY2VOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNlcXVlbmNlTmFtZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgibXlTZXF1ZW5jZU5hbWUiKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNlcXVlbmNlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVNlcXVlbmNlTmFtZSIsIGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCJteVNlcXVlbmNlTmFtZSIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVNlcXVlbmNlTmFtZSIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNlcXVlbmNlTmFtZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUYWJsZUdlbmVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ2MjBjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUYWJsZUdlbmVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRhYmxlR2VuZXJhdG9yVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9HRU5FUkFUT1JfTkFNRSA9ICJNWV9UQUJMRV9HRU5FUkFUT1IiOwotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZUdlbmVyYXRvckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUYWJsZUdlbmVyYXRvciIsIAotCQkJIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyBzY2hlbWEoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHBrQ29sdW1uTmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHBrQ29sdW1uVmFsdWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJImludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDA7ICIgKwotCQkJImludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7ICIgKwotCQkJIlVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVW5pcXVlQ29uc3RyYWludCIsIAotCQkJIlN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7ICIpOwkJCi0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVUYWJsZUdlbmVyYXRvckFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UQUJMRV9HRU5FUkFUT1IsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZUdlbmVyYXRvcihuYW1lPVwiIiArIFRBQkxFX0dFTkVSQVRPUl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhVGFibGVHZW5lcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9HRU5FUkFUT1JfTkFNRSwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0TmFtZSgpKTsKLQotCQkvL2NoYW5nZSByZXNvdXJjZSBtb2RlbCB0YWJsZUdlbmVyYXRvciBuYW1lLCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX0dFTkVSQVRPUl9OQU1FLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwotCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9HRU5FUkFUT1JfTkFNRSwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0TmFtZSgpKTsKLQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0Q2F0YWxvZygpKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0Q2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJteUNhdGFsb2ciKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZENhdGFsb2coIm15Q2F0YWxvZyIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCB0YWJsZUdlbmVyYXRvci5nZXRDYXRhbG9nKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZShudWxsKTsKLQkJaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTY2hlbWEoKSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0KLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpICBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJYTUxfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlKDApOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJLy9kZWZhdWx0IHNjaGVtYSB0YWtlbiBmcm9tIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgbm90IGVudGl0eS1tYXBwaW5ncyBzaW5jZSB0aGUgZW50aXR5IGlzIG5vdCBpbiBhbiBvcm0ueG1sIGZpbGUKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJteVNjaGVtYSIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIHRhYmxlR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRQa0NvbHVtbk5hbWUoIm15UGtDb2x1bW5OYW1lIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5OYW1lIiwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5OYW1lIiwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRQa0NvbHVtbk5hbWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoIm15UGtDb2x1bW5OYW1lIik7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRQa0NvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlQa0NvbHVtbk5hbWUiLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgibXlQa0NvbHVtbk5hbWUiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCWFzc2VydEVxdWFscygibXlQa0NvbHVtbk5hbWUiLCB0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFZhbHVlQ29sdW1uTmFtZSgibXlWYWx1ZUNvbHVtbk5hbWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlWYWx1ZUNvbHVtbk5hbWUiLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlWYWx1ZUNvbHVtbk5hbWUiLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgibXlWYWx1ZUNvbHVtbk5hbWUiKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCJteVZhbHVlQ29sdW1uTmFtZSIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIHRhYmxlR2VuZXJhdG9yLmdldFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFBrQ29sdW1uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFBrQ29sdW1uVmFsdWUoKSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFBrQ29sdW1uVmFsdWUoIm15UGtDb2x1bW5WYWx1ZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uVmFsdWUiLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRQa0NvbHVtblZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5WYWx1ZSIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRQa0NvbHVtblZhbHVlKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgibXlQa0NvbHVtblZhbHVlIik7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRQa0NvbHVtblZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5WYWx1ZSIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCJteVBrQ29sdW1uVmFsdWUiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCWFzc2VydEVxdWFscygibXlQa0NvbHVtblZhbHVlIiwgdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoODIpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODIpLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODIpLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0lOSVRJQUxfVkFMVUUsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRJbml0aWFsVmFsdWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDgyKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgyKSwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDIwKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIwKSwgdGFibGVHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZShudWxsKTsKLQkJaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMjApKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjApLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyMCksIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkUsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigyMCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRvci5ERUZBVUxUX0FMTE9DQVRJT05fU0laRSwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIwKSwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDI1KSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDI1KSwgdGFibGVHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpKTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gKChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gKChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgIHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgIHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSAoKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRUYWJsZUdlbmVyYXRvcigpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSAoKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRUYWJsZUdlbmVyYXRvcigpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZUdlbmVyYXRvckFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCXRhYmxlR2VuZXJhdG9yLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQkKLQkJdGFibGVHZW5lcmF0b3IucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJdGFibGVHZW5lcmF0b3IucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSAoKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRUYWJsZUdlbmVyYXRvcigpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZUdlbmVyYXRvckFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0KLQotCQl0YWJsZUdlbmVyYXRvci5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCi0JCXRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKLQkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0KLQkJCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODQ2ZTk0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVGFibGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiTVlfVEFCTEUiOwotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUYWJsZSIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVW5pcXVlQ29uc3RyYWludCIsIAotCQkJIlN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7ICIpOwkJCi0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlVGFibGVBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRhYmxlKG5hbWU9XCIiICsgVEFCTEVfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0KLQkJCi0JcHVibGljIEphdmFUYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWVTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCS8vdGVzdCB0aGF0IHNldHRpbmcgdGhlIGphdmEgZW50aXR5IG5hbWUgd2lsbCBjaGFuZ2UgdGhlIHRhYmxlIGRlZmF1bHQgbmFtZQotCQlqYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TmFtZVNpbmdsZVRhYmxlSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUoamF2YUVudGl0eSgpLCBqYXZhRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGphdmFFbnRpdHkoKS5nZXRSb290RW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCS8vdGVzdCB0aGF0IHNldHRpbmcgdGhlIHJvb3QgamF2YSBlbnRpdHkgbmFtZSB3aWxsIGNoYW5nZSB0aGUgdGFibGUgZGVmYXVsdCBuYW1lIG9mIHRoZSBjaGlsZAotCQlqYXZhRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCi0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IG9ybUVudGl0eS5nZXRKYXZhRW50aXR5KCk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJYTUxfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVPcm1QZXJzaXN0ZW50VHlwZSgwKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCS8vZGVmYXVsdCBzY2hlbWEgdGFrZW4gZnJvbSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIG5vdCBlbnRpdHktbWFwcGluZ3Mgc2luY2UgdGhlIGVudGl0eSBpcyBub3QgaW4gYW4gb3JtLnhtbCBmaWxlCi0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQotCQlJRmlsZSBmaWxlID0gb3JtUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCS8vcmVtb3ZlIHRoZSBtYXBwaW5nIGZpbGUgcmVmZXJlbmNlIGZyb20gdGhlIHBlcnNpc3RlbmNlLnhtbC4gIGRlZmF1bHQgc2NoZW1hIAotCQkvL3Nob3VsZCBzdGlsbCBjb21lIGZyb20gcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBiZWNhdXNlIG9mIGltcGxpZWQgbWFwcGVkLWZpbGUtcmVmCi0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLnJlbW92ZShtYXBwaW5nRmlsZVJlZik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkKLQkJZmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJamF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCi0JCWFzc2VydE51bGwodGFibGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRnJvbVNwZWNpZmllZE5hbWVDaGFuZ2VJblJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJdGFibGUuc2V0TmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQl0YWJsZS5zZXRDYXRhbG9nKCJteUNhdGFsb2ciKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJteUNhdGFsb2ciKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ0Zyb21QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSBvcm1FbnRpdHkuZ2V0SmF2YUVudGl0eSgpOwotCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiWE1MX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0KLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVPcm1QZXJzaXN0ZW50VHlwZSgwKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCS8vZGVmYXVsdCBjYXRhbG9nIHRha2VuIGZyb20gcGVyc2lzdGVuY2UtdW5pdGUtZGVmYXVsdHMgbm90IGVudGl0eS1tYXBwaW5ncyBzaW5jZSB0aGUgZW50aXR5IGlzIG5vdCBpbiBhbiBvcm0ueG1sIGZpbGUKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQotCQlJRmlsZSBmaWxlID0gb3JtUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCS8vcmVtb3ZlIHRoZSBtYXBwaW5nIGZpbGUgcmVmZXJlbmNlIGZyb20gdGhlIHBlcnNpc3RlbmNlLnhtbC4gIGRlZmF1bHQgc2NoZW1hIAotCQkvL3Nob3VsZCBzdGlsbCBjb21lIGZyb20gcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBiZWNhdXNlIG9mIGltcGxpZWQgbWFwcGVkLWZpbGUtcmVmCi0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLnJlbW92ZShtYXBwaW5nRmlsZVJlZik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCi0JCWZpbGUuZGVsZXRlKHRydWUsIG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVRhYmxlIHRhYmxlID0gamF2YUVudGl0eSgpLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIm15Q2F0YWxvZyIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIHRhYmxlUmVzb3VyY2UuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCi0JCXRhYmxlLnNldFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIm15U2NoZW1hIik7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJVGFibGUgdGFibGUgPSBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJteVNjaGVtYSIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgdGFibGVSZXNvdXJjZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQl0YWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gamF2YUVudGl0eSgpLmdldFRhYmxlKCkudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQl0YWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJdGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCAgamF2YUVudGl0eSgpLmdldFRhYmxlKCkudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlQW5ub3RhdGlvbiA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCXRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwotCQl0YWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJiYXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCAgamF2YUVudGl0eSgpLmdldFRhYmxlKCkudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlUYWJsZSB0YWJsZSA9IGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlUYWJsZSB0YWJsZSA9IGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVRhYmxlIHRhYmxlID0gamF2YUVudGl0eSgpLmdldFRhYmxlKCk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSB0YWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSB0YWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlUYWJsZSB0YWJsZSA9IGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0KLQotCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IHRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlUYWJsZSB0YWJsZSA9IGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQotCQl0YWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJdGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCXRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoIkJBWiIpOwotCi0JCQotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGVBbm5vdGF0aW9uLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTk2ZTIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVHJhbnNpZW50TWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVHJhbnNpZW50QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRyYW5zaWVudCIsICIiKTsJCQotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVUcmFuc2llbnRBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVFJBTlNJRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUcmFuc2llbnQiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhVHJhbnNpZW50TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQotCQlhc3NlcnROb3ROdWxsKHRyYW5zaWVudE1hcHBpbmcpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZWJlYjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFWZXJzaW9uTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVmVyc2lvbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJWZXJzaW9uIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZW1wb3JhbEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUZW1wb3JhbCIsICJUZW1wb3JhbFR5cGUgdmFsdWUoKTsiKTsJCQotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlVmVyc2lvbkFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVUZW1wb3JhbEFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBKUEEuVEVNUE9SQUwsIEpQQS5URU1QT1JBTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRVNUQU1QKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkJCi0JcHVibGljIEphdmFWZXJzaW9uTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0VGVtcG9yYWwoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0VGVtcG9yYWwoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKHZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGVtcG9yYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVtcG9yYWwoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIHZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQkKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChudWxsKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGVtcG9yYWwuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsIHZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwodmVyc2lvbk1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZSh2ZXJzaW9uTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKHZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0Q29yZUNvbnRleHRKYXZhTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0Q29yZUNvbnRleHRKYXZhTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmUwZGY1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0pwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRDb3JlQ29udGV4dEphdmFNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBzdWl0ZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoYm9vbGVhbiBhbGwpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb3JlQ29udGV4dEphdmFNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFBdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFCYXNpY01hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhQ29sdW1uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhRW1iZWRkYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFFbWJlZGRlZElkTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFFbWJlZGRlZE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhRW50aXR5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUdlbmVyYXRlZFZhbHVlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUlkTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFKb2luQ29sdW1uVGVzdHMuY2xhc3MpOwkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFKb2luVGFibGVUZXN0cy5jbGFzcyk7CQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhTmFtZWRRdWVyeVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVF1ZXJ5SGludFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFQZXJzaXN0ZW50VHlwZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVNlY29uZGFyeVRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVRhYmxlR2VuZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVRyYW5zaWVudE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRW50aXR5TWFwcGluZ3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOGI4ODQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotcHVibGljIGNsYXNzIEVudGl0eU1hcHBpbmdzVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFbnRpdHlNYXBwaW5nc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIGVudGl0eU1hcHBpbmdzKCkuZ2V0VmVyc2lvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlc2NyaXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvL3NldCBkZXNjcmlwdGlvbiBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldERlc2NyaXB0aW9uKCJuZXdEZXNjcmlwdGlvbiIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld0Rlc2NyaXB0aW9uIiwgZW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdEZXNjcmlwdGlvbiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkKLQkJLy9zZXQgZGVzY3JpcHRpb24gdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldERlc2NyaXB0aW9uKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVzY3JpcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCS8vc2V0IGRlc2NyaXB0aW9uIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZW50aXR5TWFwcGluZ3MoKS5zZXREZXNjcmlwdGlvbigibmV3RGVzY3JpcHRpb24iKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdEZXNjcmlwdGlvbiIsIGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygibmV3RGVzY3JpcHRpb24iLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvL3NldCBkZXNjcmlwdGlvbiB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0RGVzY3JpcHRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQYWNrYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwotCQkKLQkJLy9zZXQgcGFja2FnZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBhY2thZ2UoImZvby5tb2RlbCIpOwotCQlhc3NlcnRFcXVhbHMoImZvby5tb2RlbCIsIGVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28ubW9kZWwiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJCi0JCS8vc2V0IHBhY2thZ2UgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBhY2thZ2UobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJCi0JCS8vc2V0IHBhY2thZ2UgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQllbnRpdHlNYXBwaW5ncygpLnNldFBhY2thZ2UoImZvby5tb2RlbCIpOwotCQlhc3NlcnRFcXVhbHMoImZvby5tb2RlbCIsIGVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28ubW9kZWwiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQotCQkvL3NldCBwYWNrYWdlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZW50aXR5TWFwcGluZ3MoKS5zZXRQYWNrYWdlKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKTsKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBlbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkRFRkFVTFRfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiREVGQVVMVF9TQ0hFTUEiLCBlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiREVGQVVMVF9TQ0hFTUEiLCBlbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOwotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBlbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0KLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiREVGQVVMVF9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiREVGQVVMVF9DQVRBTE9HIiwgZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJERUZBVUxUX0NBVEFMT0ciLCBlbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOwotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBlbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JfQkKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcm1QZXJzaXN0ZW50VHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCS8vYWRkIGVtYmVkZGFibGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVtYmVkZGFibGUoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuYWRkKGVtYmVkZGFibGUpOwotCQllbWJlZGRhYmxlLnNldENsYXNzTmFtZSgibW9kZWwuRm9vIik7Ci0JCWFzc2VydFRydWUoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9hZGQgZW50aXR5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlYbWxFbnRpdHkgZW50aXR5ID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW50aXR5KCk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmFkZChlbnRpdHkpOwotCQllbnRpdHkuc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28yIik7Ci0JCWFzc2VydFRydWUoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzIiLCBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCi0JCS8vYWRkIG1hcHBlZC1zdXBlcmNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5hZGQobWFwcGVkU3VwZXJjbGFzcyk7Ci0JCW1hcHBlZFN1cGVyY2xhc3Muc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28zIik7Ci0JCWFzc2VydFRydWUoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzMiLCBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPcm1QZXJzaXN0ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJLy9hZGQgZW1iZWRkYWJsZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCWFzc2VydFRydWUoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCi0JCS8vYWRkIGVudGl0eSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCWFzc2VydFRydWUoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzIiLCBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0KLQkJLy9hZGQgbWFwcGVkLXN1cGVyY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28zIik7Ci0JCWFzc2VydFRydWUoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzMiLCBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlT3JtUGVyc2lzdGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzMiKTsKLQkJCi0JCS8vcmVtb3ZlIG9ybVBlcnNpc3RlbnRUeXBlIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlKDEpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVPcm1QZXJzaXN0ZW50VHlwZSgxKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVPcm1QZXJzaXN0ZW50VHlwZSgwKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUYWJsZUdlbmVyYXRvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvckltcGwoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmFkZCh0YWJsZUdlbmVyYXRvclJlc291cmNlKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7Ci0JCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlMiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlR2VuZXJhdG9ySW1wbCgpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuYWRkKDAsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UyKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZTIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVGFibGVHZW5lcmF0b3I+IHRhYmxlR2VuZXJhdG9ycyA9IGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZTMgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvckltcGwoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmFkZCgxLCB0YWJsZUdlbmVyYXRvclJlc291cmNlMyk7Ci0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJdGFibGVHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLm1vdmUoMiwgMCk7Ci0JCXRhYmxlR2VuZXJhdG9ycyA9IGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5yZW1vdmUoMCk7Ci0JCXRhYmxlR2VuZXJhdG9ycyA9IGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnJlbW92ZSgxKTsKLQkJdGFibGVHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5jbGVhcigpOwotCQl0YWJsZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpOwotCQlhc3NlcnRGYWxzZSh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKCJGT08iKTsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IyID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigxKTsKLQkJdGFibGVHZW5lcmF0b3IyLnNldE5hbWUoIkJBUiIpOwotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjMgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDIpOwotCQl0YWJsZUdlbmVyYXRvcjMuc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1UYWJsZUdlbmVyYXRvcj4gdGFibGVHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnMoKTsKLQkJT3JtVGFibGVHZW5lcmF0b3IgeG1sVGFibGVHZW5lcmF0b3IgPSB0YWJsZUdlbmVyYXRvcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbFRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0YWJsZUdlbmVyYXRvcjIsIHhtbFRhYmxlR2VuZXJhdG9yKTsKLQkJeG1sVGFibGVHZW5lcmF0b3IgPSB0YWJsZUdlbmVyYXRvcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbFRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0YWJsZUdlbmVyYXRvcjMsIHhtbFRhYmxlR2VuZXJhdG9yKTsKLQkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoMSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQl0YWJsZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpOwotCQl4bWxUYWJsZUdlbmVyYXRvciA9IHRhYmxlR2VuZXJhdG9ycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sVGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRhYmxlR2VuZXJhdG9yMiwgeG1sVGFibGVHZW5lcmF0b3IpOwotCQlhc3NlcnRGYWxzZSh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQotCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQl0YWJsZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpOwotCQlhc3NlcnRGYWxzZSh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsKLQkJdGFibGVHZW5lcmF0b3Iuc2V0TmFtZSgiRk9PIik7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yMiA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMSk7Ci0JCXRhYmxlR2VuZXJhdG9yMi5zZXROYW1lKCJCQVIiKTsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IzID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigyKTsKLQkJdGFibGVHZW5lcmF0b3IzLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLm1vdmVUYWJsZUdlbmVyYXRvcigyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5tb3ZlVGFibGVHZW5lcmF0b3IoMCwgMik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlR2VuZXJhdG9yc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJCi0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsKLQkJdGFibGVHZW5lcmF0b3Iuc2V0TmFtZSgiRk9PIik7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yMiA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMSk7Ci0JCXRhYmxlR2VuZXJhdG9yMi5zZXROYW1lKCJCQVIiKTsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IzID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigyKTsKLQkJdGFibGVHZW5lcmF0b3IzLnNldE5hbWUoIkJBWiIpOwotCQotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU2VxdWVuY2VHZW5lcmF0b3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7Ci0JCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5hZGQoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZTIgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmFkZCgwLCBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlMik7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UyLnNldE5hbWUoIkJBUiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5hZGQoMSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZTMpOwotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlMy5zZXROYW1lKCJCQVoiKTsKLQotCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkubW92ZSgyLCAwKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS5zZXF1ZW5jZUdlbmVyYXRvcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkucmVtb3ZlKDApOwotCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkucmVtb3ZlKDEpOwotCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmNsZWFyKCk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9ycyA9IGVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzKCk7Ci0JCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXROYW1lKCJGT08iKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IyID0gZW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigxKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3IyLnNldE5hbWUoIkJBUiIpOwotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjMgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDIpOwotCQlzZXF1ZW5jZUdlbmVyYXRvcjMuc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS5zZXF1ZW5jZUdlbmVyYXRvcnMoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3IgeG1sU2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbFNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhzZXF1ZW5jZUdlbmVyYXRvcjIsIHhtbFNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJeG1sU2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbFNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhzZXF1ZW5jZUdlbmVyYXRvcjMsIHhtbFNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJYXNzZXJ0RmFsc2Uoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoMSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOwotCQl4bWxTZXF1ZW5jZUdlbmVyYXRvciA9IHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sU2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlcXVlbmNlR2VuZXJhdG9yMiwgeG1sU2VxdWVuY2VHZW5lcmF0b3IpOwotCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQotCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOwotCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZSgiRk9PIik7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yMiA9IGVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMSk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yMi5zZXROYW1lKCJCQVIiKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IzID0gZW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigyKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3IzLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLm1vdmVTZXF1ZW5jZUdlbmVyYXRvcigyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5tb3ZlU2VxdWVuY2VHZW5lcmF0b3IoMCwgMik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldE5hbWUoIkZPTyIpOwotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjIgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDEpOwotCQlzZXF1ZW5jZUdlbmVyYXRvcjIuc2V0TmFtZSgiQkFSIik7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yMyA9IGVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMik7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yMy5zZXROYW1lKCJCQVoiKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZW50aXR5TWFwcGluZ3MoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeTIgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCW5hbWVkUXVlcnkyLnNldE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MyA9IGVudGl0eU1hcHBpbmdzKCkuYWRkTmFtZWRRdWVyeSgxKTsKLQkJbmFtZWRRdWVyeTMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWRRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5MiwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5MywgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5LCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJCi0JCW5hbWVkUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWRRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkTmFtZWRRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGROYW1lZFF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkTmFtZWRRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQllbnRpdHlNYXBwaW5ncygpLm1vdmVOYW1lZFF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZFF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJZW50aXR5TWFwcGluZ3MoKS5tb3ZlTmFtZWRRdWVyeSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZFF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZWRRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZFF1ZXJ5KCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpKTsKLQkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZFF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLm1vdmUoMiwgMCk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWRRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLm1vdmUoMCwgMSk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWRRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZSgxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZFF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkucmVtb3ZlKDEpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHlNYXBwaW5ncygpLm5hbWVkUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5TWFwcGluZ3MoKS5uYW1lZFF1ZXJpZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5TWFwcGluZ3MoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeTIgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCW5hbWVkTmF0aXZlUXVlcnkyLnNldE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5MyA9IGVudGl0eU1hcHBpbmdzKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKTsKLQkJbmFtZWROYXRpdmVRdWVyeTMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5MiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5MywgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5LCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpKTsKLQkJCi0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQllbnRpdHlNYXBwaW5ncygpLm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJZW50aXR5TWFwcGluZ3MoKS5tb3ZlTmFtZWROYXRpdmVRdWVyeSgwLCAxKTsKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWROYXRpdmVRdWVyeSgpKTsKLQkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLm1vdmUoMiwgMCk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLm1vdmUoMCwgMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnJlbW92ZSgxKTsKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKDEpOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBlbnRpdHlNYXBwaW5ncygpLm5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5TWFwcGluZ3MoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOThlZDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdENvcmVPcm1Db250ZXh0TW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gc3VpdGUodHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZShib29sZWFuIGFsbCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdENvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtWG1sVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW50aXR5TWFwcGluZ3NUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVBlcnNpc3RlbnRUeXBlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtQmFzaWNNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtQ2FzY2FkZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1JZE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1FbWJlZGRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtRW1iZWRkZWRNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtRW1iZWRkZWRJZE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1FbnRpdHlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1HZW5lcmF0ZWRWYWx1ZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUpvaW5Db2x1bW5UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1Kb2luVGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtTmFtZWRRdWVyeVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybU5hbWVkTmF0aXZlUXVlcnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1RdWVyeUhpbnRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1TZWNvbmRhcnlUYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtVGFibGVHZW5lcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1UYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdENvcmVPcm1Db250ZXh0TW9kZWxUZXN0cygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjc2ZmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpKTsKLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG9ybUVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1FbnRpdHkuYXNzb2NpYXRpb25PdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZShlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmlzRW1wdHkoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5hc3NvY2lhdGlvbk92ZXJyaWRlcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKCkpOwotCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gb3JtRW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotCi0JCWFzc2VydE51bGwob3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKCkpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7Ci0JCQotCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKCkpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7Ci0JCQotCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKTsKLQkJCi0JCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtQXNzb2NpYXRpb25PdmVycmlkZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKSk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG9ybUVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCi0JCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtQXNzb2NpYXRpb25PdmVycmlkZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtQXNzb2NpYXRpb25PdmVycmlkZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKSk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG9ybUVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW5JbXBsKCkpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW5JbXBsKCkpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW5JbXBsKCkpOwotCQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkubW92ZSgyLCAwKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1BdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MTFkMTIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1BdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBPcm1BdHRyaWJ1dGVPdmVycmlkZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtQXR0cmlidXRlT3ZlcnJpZGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1FbnRpdHkuYXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5hdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1BdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1BdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1CYXNpY01hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1CYXNpY01hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODY5ZjYwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQmFzaWNNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBPcm1CYXNpY01hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybUJhc2ljTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJhc2ljQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhc2ljIiwgIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7IGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbHVtbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7IiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJImludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsiICsKLQkJCSJpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyIgKwotCQkJImludCBzY2FsZSgpIGRlZmF1bHQgMDsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTG9iQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkxvYiIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW51bWVyYXRlZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnVtZXJhdGVkIiwgIkVudW1UeXBlIHZhbHVlKCkgZGVmYXVsdCBPUkRJTkFMOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZW1wb3JhbEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUZW1wb3JhbCIsICJUZW1wb3JhbFR5cGUgdmFsdWUoKTsiKTsJCQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUJhc2ljQW5ub3RhdGlvbigpOwotCQljcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUxvYkFubm90YXRpb24oKTsKLQkJY3JlYXRlVGVtcG9yYWxBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUVudW1lcmF0ZWRBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ09MVU1OLCBKUEEuTE9CLCBKUEEuVEVNUE9SQUwsIEpQQS5URU1QT1JBTF9UWVBFLCBKUEEuRU5VTUVSQVRFRCwgSlBBLkVOVU1fVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljKGZldGNoPUZldGNoVHlwZS5MQVpZLCBvcHRpb25hbD1mYWxzZSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb2x1bW4obmFtZT1cIk1ZX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIiwgbGVuZ3RoPTUsIHByZWNpc2lvbj02LCBzY2FsZT03KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQExvYiIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImJhc2ljTWFwcGluZyIsIG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljTWFwcGluZyIsIGJhc2ljUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWNSZXNvdXJjZS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBiYXNpY1Jlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWNSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY01hcHBpbmciLCBvcm1CYXNpY01hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY01hcHBpbmciLCBiYXNpY1Jlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUJhc2ljTWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBiYXNpY1Jlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1CYXNpY01hcHBpbmcuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBiYXNpY1Jlc291cmNlLmdldEZldGNoKCkpOwotCQotCQliYXNpY1Jlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZLCBiYXNpY1Jlc291cmNlLmdldEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljUmVzb3VyY2Uuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBiYXNpY1Jlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIGJhc2ljUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWNSZXNvdXJjZS5zZXRFbnVtZXJhdGVkKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKLQkKLQkJYmFzaWNSZXNvdXJjZS5zZXRFbnVtZXJhdGVkKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcsIGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljUmVzb3VyY2Uuc2V0RW51bWVyYXRlZChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldEVudW1lcmF0ZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRFbnVtZXJhdGVkKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMLCBiYXNpY1Jlc291cmNlLmdldEVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKLQkKLQkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcsIGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKG51bGwpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljUmVzb3VyY2Uuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY1Jlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQotCQliYXNpY1Jlc291cmNlLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWNSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljUmVzb3VyY2Uuc2V0T3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQotCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpY1Jlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCi0JCS8vc2V0IGVudW1lcmF0ZWQgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRMb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtQmFzaWNNYXBwaW5nLmlzTG9iKCkpOwotCQlhc3NlcnRGYWxzZShiYXNpY1Jlc291cmNlLmlzTG9iKCkpOwotCQkJCQotCQkvL3NldCBsb2IgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljUmVzb3VyY2Uuc2V0TG9iKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybUJhc2ljTWFwcGluZy5pc0xvYigpKTsKLQkJYXNzZXJ0VHJ1ZShiYXNpY1Jlc291cmNlLmlzTG9iKCkpOwotCi0JCS8vc2V0IGxvYiB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldExvYihmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9ybUJhc2ljTWFwcGluZy5pc0xvYigpKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNSZXNvdXJjZS5pc0xvYigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZExvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCi0JCWFzc2VydEZhbHNlKG9ybUJhc2ljTWFwcGluZy5pc0xvYigpKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNSZXNvdXJjZS5pc0xvYigpKTsKLQkJCQkKLQkJLy9zZXQgbG9iIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1CYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOwotCQlhc3NlcnRUcnVlKGJhc2ljUmVzb3VyY2UuaXNMb2IoKSk7Ci0JCWFzc2VydFRydWUob3JtQmFzaWNNYXBwaW5nLmlzTG9iKCkpOwotCQotCQkvL3NldCBsb2IgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQmFzaWNNYXBwaW5nLnNldExvYihmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljUmVzb3VyY2UuaXNMb2IoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUJhc2ljTWFwcGluZy5pc0xvYigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgb3JtQmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQotCQliYXNpY1Jlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgb3JtQmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FLCBiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCi0JCWJhc2ljUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVApOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgb3JtQmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWNSZXNvdXJjZS5zZXRUZW1wb3JhbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1CYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsIG9ybUJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkKLQkJb3JtQmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCBvcm1CYXNpY01hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0KLQkJb3JtQmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBvcm1CYXNpY01hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1CYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwobnVsbCk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JfQotCQotCS8vVE9ETyB0ZXN0IGRlZmF1bHRzCi0JLy9UT0RPIHRlc3Qgb3ZlcnJpZGluZyBqYXZhIG1hcHBpbmcgd2l0aCBhIGRpZmZlcmVudCBtYXBwaW5nIHR5cGUgaW4geG1sCi0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1CYXNpY01hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRGYWxzZShvcm1CYXNpY01hcHBpbmcuaXNMb2IoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCBvcm1CYXNpY01hcHBpbmcuZ2V0RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtQmFzaWNNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1CYXNpY01hcHBpbmcuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCi0JCQotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXREZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjU1KSwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMCksIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCX0KLQkKLQkvL0BCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UpCi0JLy9AQ29sdW1uKG5hbWU9Ik1ZX0NPTFVNTiIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCAKLQkvLyAgICBjb2x1bW5EZWZpbml0aW9uPSJDT0xVTU5fREVGSU5JVElPTiIsIHRhYmxlPSJNWV9UQUJMRSIsIGxlbmd0aD01LCBwcmVjaXNpb249Niwgc2NhbGU9NykiKTsKLQkvL0BDb2x1bW4oCi0JLy9ATG9iCi0JLy9AVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkKLQkvL0BFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybUJhc2ljTWFwcGluZy5pc0xvYigpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgb3JtQmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1CYXNpY01hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQmFzaWNNYXBwaW5nLmlzTG9iKCkpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkJCi0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyNTUpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQmFzaWNNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQmFzaWNNYXBwaW5nLmlzTG9iKCkpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgb3JtQmFzaWNNYXBwaW5nLmdldERlZmF1bHRFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1CYXNpY01hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1CYXNpY01hcHBpbmcuZ2V0RGVmYXVsdE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkJCi0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDI1NSksIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKLQotCX0KLQkvLzMgdGhpbmdzIHRlc3RlZCBhYm92ZQotCS8vMS4gdmlydHVhbCBtYXBwaW5nIG1ldGFkYXRhIGNvbXBsZXRlPWZhbHNlIC0gZGVmYXVsdHMgYXJlIHRha2VuIGZyb20gdGhlIGphdmEgYW5ub3RhdGlvbnMKLQkvLzIuIHZpcnR1YWwgbWFwcGluZyBtZXRhZGF0YSBjb21wbGV0ZT10cnVlIC0gZGVmYXVsdHMgYXJlIHRha2VuIGZyb20gamF2YSBkZWZhdWx0cyxhbm5vdGF0aW9ucyBpZ25vcmVkCi0JLy8zLiBzcGVjaWZpZWQgbWFwcGluZyAobWV0YWRhdGEgY29tcGxldGU9dHJ1ZS9mYWxzZSAtIGRlZmF1bHRzIGFyZSB0YWtlbiBmcm9tIGphdmEgYW5ub3RhdGlvbnMKLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWMiKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOwotCQliYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWMiKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOwotCQliYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljIik7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljIik7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljIik7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1DYXNjYWRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ2FzY2FkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTc0YzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1DYXNjYWRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgT3JtQ2FzY2FkZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtQ2FzY2FkZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb09uZS5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlSW1wbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGFsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCS8vc2V0IGFsbCB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZUFsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkJCQkKLQkJLy9zZXQgYWxsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQljYXNjYWRlLnNldEFsbCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlQWxsKCkpOwotCQotCQkvL3NldCBhbGwgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY2FzY2FkZS5zZXRBbGwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZUltcGwoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCQkKLQkJLy9zZXQgUGVyc2lzdCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IFBlcnNpc3QgdG8gZmFsc2UgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lLmdldENhc2NhZGUoKS5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkJCQkKLQkJLy9zZXQgUGVyc2lzdCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkKLQkJLy9zZXQgUGVyc2lzdCB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljYXNjYWRlLnNldFBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlTWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZUltcGwoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCi0JCS8vc2V0IE1lcmdlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZS5nZXRDYXNjYWRlKCkuc2V0Q2FzY2FkZU1lcmdlKHRydWUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJLy9zZXQgTWVyZ2UgdG8gZmFsc2UgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lLmdldENhc2NhZGUoKS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXNjYWRlTWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCQotCQkvL3NldCBNZXJnZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRNZXJnZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkKLQkJLy9zZXQgTWVyZ2UgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY2FzY2FkZS5zZXRNZXJnZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb09uZS5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlSW1wbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCi0JCS8vc2V0IFJlbW92ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJCi0JCS8vc2V0IFJlbW92ZSB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVSZW1vdmUoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkJCQkKLQkJLy9zZXQgUmVtb3ZlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQljYXNjYWRlLnNldFJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQotCQkvL3NldCBSZW1vdmUgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY2FzY2FkZS5zZXRSZW1vdmUoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhc2NhZGVSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZUltcGwoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydE5vdE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCQkKLQkJLy9zZXQgUmVmcmVzaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVSZWZyZXNoKHRydWUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQkJCi0JCS8vc2V0IFJlZnJlc2ggdG8gZmFsc2UgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lLmdldENhc2NhZGUoKS5zZXRDYXNjYWRlUmVmcmVzaChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXNjYWRlUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkJCQkKLQkJLy9zZXQgUmVmcmVzaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRSZWZyZXNoKHRydWUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQkKLQkJLy9zZXQgUmVmcmVzaCB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljYXNjYWRlLnNldFJlZnJlc2goZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3ZGY5Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUNvbHVtblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBPcm1Db2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybUNvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uSW1wbCgpKTsKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljLmdldENvbHVtbigpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWJhc2ljLmdldENvbHVtbigpLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGJhc2ljLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0KLQkJYmFzaWMuc2V0Q29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbkltcGwoKSk7Ci0JCWJhc2ljLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGJhc2ljLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQliYXNpYy5zZXRDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGJhc2ljLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbkltcGwoKSk7Ci0JCWJhc2ljLmdldENvbHVtbigpLnNldFRhYmxlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VGFibGUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQliYXNpYy5zZXRDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uSW1wbCgpKTsKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0TnVsbGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXROdWxsYWJsZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXROdWxsYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljLmdldENvbHVtbigpLmdldE51bGxhYmxlKCkpOwotCi0JCWJhc2ljLnNldENvbHVtbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXROdWxsYWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbkltcGwoKSk7Ci0JCWJhc2ljLmdldENvbHVtbigpLnNldFVwZGF0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRVcGRhdGFibGUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0VXBkYXRhYmxlKCkpOwotCQkKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljLmdldENvbHVtbigpLmdldFVwZGF0YWJsZSgpKTsKLQotCQliYXNpYy5zZXRDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRVcGRhdGFibGUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uSW1wbCgpKTsKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0SW5zZXJ0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0SW5zZXJ0YWJsZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRJbnNlcnRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpLmdldEluc2VydGFibGUoKSk7Ci0JCQotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRJbnNlcnRhYmxlKCkpOwotCi0JCWJhc2ljLnNldENvbHVtbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uSW1wbCgpKTsKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljLmdldENvbHVtbigpLmdldFVuaXF1ZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRVbmlxdWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKS5nZXRVbmlxdWUoKSk7Ci0JCQotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0VW5pcXVlKCkpOwotCi0JCWJhc2ljLnNldENvbHVtbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljLmdldENvbHVtbigpLmdldFVuaXF1ZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbkltcGwoKSk7Ci0JCWJhc2ljLmdldENvbHVtbigpLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoOCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0TGVuZ3RoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQkKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0TGVuZ3RoKEludGVnZXIudmFsdWVPZigxMSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDExKSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMSksIGJhc2ljLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQotCQliYXNpYy5zZXRDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFByZWNpc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW5JbXBsKCkpOwotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4KSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljLmdldENvbHVtbigpLnNldFByZWNpc2lvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJCi0JCWJhc2ljLmdldENvbHVtbigpLnNldFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoMTEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMSksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTEpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0KLQkJYmFzaWMuc2V0Q29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUHJlY2lzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2FsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW5JbXBsKCkpOwotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoOCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOCksIGJhc2ljLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljLmdldENvbHVtbigpLnNldFNjYWxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoMTEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMSksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMSksIGJhc2ljLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCWJhc2ljLnNldENvbHVtbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIGJhc2ljLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOwotCQlhdHRyaWJ1dGVzLm5leHQoKTsJCi0JCQotCQkvL3ZpcnR1YWwgYXR0cnVidGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG5hbWVWaXJ0dWFsTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gbmFtZVZpcnR1YWxNYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQkKLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG5ldyBJbnRlZ2VyKDQ1KSk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG5ldyBJbnRlZ2VyKDQ2KSk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobmV3IEludGVnZXIoNDcpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ1KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NiksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDcpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0KLQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIG9ybS54bWwgdmlydHVhbCBjb2x1bW4gaWdub3JlcyBqYXZhIGNvbHVtbiBhbm5vdGF0aW9uCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgZmFsc2UsIG9ybS54bWwgdmlydHVhbCBjb2x1bW4gZ2V0cyBzZXR0aW5nIGZyb20gamF2YSBhbm5vdGF0aW9uCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDUpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NyksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibmFtZSIpOwotCi0JCU9ybUJhc2ljTWFwcGluZyBuYW1lVmlydHVhbE1hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG5hbWVWaXJ0dWFsTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkKLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG5ldyBJbnRlZ2VyKDQ1KSk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG5ldyBJbnRlZ2VyKDQ2KSk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobmV3IEludGVnZXIoNDcpKTsKLQotCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbENvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0JCWF0dHJpYnV0ZXMubmV4dCgpOwkKLQkJCi0JCS8vdmlydHVhbCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG5hbWVWaXJ0dWFsTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBuYW1lVmlydHVhbE1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgQ29sdW1uIHRhYmxlIGVsZW1lbnQgaW4gSmF2YQotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkpBVkFfVEFCTEUiKTsJCi0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJCi0JCS8vbWFrZSBuYW1lIHBlcnNpc3RlbnQgYXR0cmlidXRlIG5vdCB2aXJ0dWFsCi0JCW5hbWVQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJuYW1lIik7Ci0JCW5hbWVWaXJ0dWFsTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCW9ybUNvbHVtbiA9IG5hbWVWaXJ0dWFsTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFIiwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJCi0JfQotCi0vL3B1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZU5vSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCi0vLwlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JYXNzZXJ0RXF1YWxzKCJGb28iLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vfQotLy8KLS8vcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbVBhcmVudCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JY3JlYXRlVGVzdFN1YlR5cGUoKTsKLS8vCQotLy8JT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLS8vCVhtbEVudGl0eSBwYXJlbnRYbWxFbnRpdHkgPSAoWG1sRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwlYbWxFbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoWG1sRW50aXR5KSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQotLy8JYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCi0vLwlwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLS8vCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCXBhcmVudFhtbEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotLy8JYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMGE2MjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE9ybURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUlkQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybURpc2NyaW1pbmF0b3JDb2x1bW4gb3JtQ29sdW1uID0gb3JtRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJWG1sRW50aXR5IG9ybUVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkuamF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRm9vIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQlvcm1FbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotLy8JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCi0vLwkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCYXIiKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lTm9KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxFbnRpdHkgb3JtRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21QYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLS8vCQlYbWxFbnRpdHkgcGFyZW50WG1sRW50aXR5ID0gKFhtbEVudGl0eSkgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCVhtbEVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChYbWxFbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4KSwgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0TGVuZ3RoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDExKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTEpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDExKSwgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldERpc2NyaW1pbmF0b3JDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCWVudGl0eVJlc291cmNlLnNldERpc2NyaW1pbmF0b3JDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybURpc2NyaW1pbmF0b3JDb2x1bW4gb3JtQ29sdW1uID0gb3JtRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBkaXNjcmltaW5hdG9yIHR5cGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldERpc2NyaW1pbmF0b3JDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldERpc2NyaW1pbmF0b3JUeXBlKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCi0JCS8vc2V0IGRpc2NyaW1pbmF0b3IgdHlwZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0RGlzY3JpbWluYXRvclR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXREaXNjcmltaW5hdG9yVHlwZShvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUuQ0hBUik7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUuQ0hBUiwgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCi0JCWVudGl0eVJlc291cmNlLnNldERpc2NyaW1pbmF0b3JDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBkaXNjcmltaW5hdG9yIHR5cGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLlNUUklORywgb3JtQ29sdW1uLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlLlNUUklORywgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJLy9zZXQgZGlzY3JpbWluYXRvciB0eXBlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmODIwNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE9ybUVtYmVkZGFibGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybUVtYmVkZGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVtYmVkZGFibGVSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW1iZWRkYWJsZVJlc291cmNlLnNldENsYXNzTmFtZSgiY29tLkJhciIpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjb20uQmFyIiwgZW1iZWRkYWJsZVJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW1iZWRkYWJsZVJlc291cmNlLnNldENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbWJlZGRhYmxlLnNldENsYXNzKCJjb20uQmFyIik7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbWJlZGRhYmxlLnNldENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCS8vVE9ETyBhZGQgdGVzdHMgZm9yIHNldHRpbmcgdGhlIGNsYXNzTmFtZSB3aGVuIHRoZSBwYWNrYWdlIGlzIHNldCBvbiBlbnRpdHktbWFwcGluZ3MKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW1iZWRkYWJsZVJlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW1iZWRkYWJsZVJlc291cmNlLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUVtYmVkZGFibGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW1iZWRkYWJsZVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVtYmVkZGFibGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCS8vVE9ETyB0ZXN0IGRlZmF1bHQgYWNjZXNzIGZyb20KLQkJLy91bmRlcmx5aW5nIGphdmEKLQkJLy9wZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzCi0JCS8vZW50aXR5LW1hcHBpbmdzCi0JCS8vd2l0aCB4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSBzZXQKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVtYmVkZGFibGVSZXNvdXJjZS5zZXRNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkKLQkJLy9zZXQgYWNjZXNzIHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbWJlZGRhYmxlLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0VHJ1ZShvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydFRydWUoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbWJlZGRhYmxlLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlvcm1FbWJlZGRhYmxlLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVtYmVkZGFibGUuaXNEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUob3JtRW1iZWRkYWJsZS5pc0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVtYmVkZGFibGUuaXNEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVtYmVkZGFibGUuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShvcm1FbWJlZGRhYmxlLmlzTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVtYmVkZGFibGUuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VFbWJlZGRhYmxlRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQllbWJlZGRhYmxlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJZW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCi0JCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW50aXR5LmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5LmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkJCi0JLy90ZXN0IHdpdGggMiBFbWJlZGRhYmxlcywgbWFrZSB0aGUgc2Vjb25kIG9uZSBhbiBFbnRpdHkgc28gaXQgaGFzIHRvIG1vdmUgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0Ci0JcHVibGljIHZvaWQgdGVzdE1ha2VFbWJlZGRhYmxlRW50aXR5MigpIHRocm93cyBFeGNlcHRpb24gewotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWVtYmVkZGFibGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQllbWJlZGRhYmxlLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkKLQkJZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBlbnRpdHkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldE5hbWUoKSk7Ci0JCQotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbnRpdHkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RlbnRUeXBlcyA9IGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50VHlwZXMubmV4dCgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlRW1iZWRkYWJsZU1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWVtYmVkZGFibGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQllbWJlZGRhYmxlLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkKLQkJZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlYbWxNYXBwZWRTdXBlcmNsYXNzICBtYXBwZWRTdXBlcmNsYXNzID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBtYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGVkU3VwZXJjbGFzcy5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIG1hcHBlZFN1cGVyY2xhc3MuZ2V0QWNjZXNzKCkpOwotCQotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JfQotCQotCS8vdGVzdCB3aXRoIDIgRW1iZWRkYWJsZXMsIG1ha2UgdGhlIHNlY29uZCBvbmUgYSBNYXBwZWRTdXBlcmNsYXNzIHNvIGl0IGhhcyB0byBtb3ZlIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdAotCXB1YmxpYyB2b2lkIHRlc3RNYWtlRW1iZWRkYWJsZU1hcHBlZFN1cGVyY2xhc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJZW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQotCQllbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgIG1hcHBlZFN1cGVyY2xhc3MgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwZWRTdXBlcmNsYXNzLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzcy5nZXRBY2Nlc3MoKSk7Ci0JCi0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzID0gZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRUeXBlcy5uZXh0KCkuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDVmMDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FbWJlZGRlZElkTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX05BTUUgPSAiY2l0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSA9ICJFX0NJVFkiOwotCi0JcHVibGljIE9ybUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbWJlZGRlZElkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVtYmVkZGVkSWQiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbHVtbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOyIgKwotCQkJImJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJImJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7IiArCi0JCQkiaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsiICsKLQkJCSJpbnQgc2NhbGUoKSBkZWZhdWx0IDA7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkF0dHJpYnV0ZU92ZXJyaWRlIiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsiICsKLQkJCSJDb2x1bW4gY29sdW1uKCk7Iik7CQkKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUVtYmVkZGVkSWRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkVNQkVEREVEX0lELCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWRJZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIsIGNvbHVtbj1AQ29sdW1uKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FICsgIlwiKSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkNPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb2x1bW4obmFtZT1cIkFfU1RBVEVcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQkKLQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShJTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZE1hcHBpbmciKTsKLS8vCQlYbWxFbWJlZGRlZElkTWFwcGluZyB4bWxFbWJlZGRlZElkTWFwcGluZyA9IChYbWxFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0vLwkJRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiZW1iZWRkZWRJZE1hcHBpbmciLCB4bWxFbWJlZGRlZElkTWFwcGluZy5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiZW1iZWRkZWRJZE1hcHBpbmciLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vCQkJCQotLy8JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0vLwkJZW1iZWRkZWRJZFJlc291cmNlLnNldE5hbWUoIm5ld05hbWUiKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCB4bWxFbWJlZGRlZElkTWFwcGluZy5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8JCi0vLwkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotLy8JCWFzc2VydE51bGwoeG1sRW1iZWRkZWRJZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnROdWxsKGVtYmVkZGVkSWRSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKElNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkTWFwcGluZyIpOwotLy8JCVhtbEVtYmVkZGVkSWRNYXBwaW5nIHhtbEVtYmVkZGVkSWRNYXBwaW5nID0gKFhtbEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLS8vCQlFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZElkTWFwcGluZyIsIHhtbEVtYmVkZGVkSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZElkTWFwcGluZyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8JCQkJCi0vLwkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgeG1sRW1iZWRkZWRJZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vCQotLy8JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbWJlZGRlZElkTWFwcGluZy5nZXROYW1lKCkpOwotLy8JCWFzc2VydE51bGwoZW1iZWRkZWRJZFJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKElNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkTWFwcGluZyIpOwotLy8JCVhtbEVtYmVkZGVkSWRNYXBwaW5nIHhtbEVtYmVkZGVkSWRNYXBwaW5nID0gKFhtbEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLS8vCQlFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0vLwkJCi0vLwkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSB4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0vLwkJb3JtUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotLy8JCQkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUyID0geG1sRW1iZWRkZWRJZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJb3JtUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlMi5zZXROYW1lKCJCQVIiKTsKLS8vCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUzID0geG1sRW1iZWRkZWRJZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMSk7Ci0vLwkJb3JtUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlMy5zZXROYW1lKCJCQVoiKTsKLS8vCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJTGlzdEl0ZXJhdG9yPFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSB4bWxFbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGUyLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGUzLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGUsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCQotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShJTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZE1hcHBpbmciKTsKLS8vCQlYbWxFbWJlZGRlZElkTWFwcGluZyB4bWxFbWJlZGRlZElkTWFwcGluZyA9IChYbWxFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0vLwkJRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotLy8KLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKS5zZXROYW1lKCJGT08iKTsKLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgxKS5zZXROYW1lKCJCQVIiKTsKLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyKS5zZXROYW1lKCJCQVoiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoMywgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJCi0vLwkJeG1sRW1iZWRkZWRJZE1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8KLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMSwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJeG1sRW1iZWRkZWRJZE1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDAsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JCVhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoSU1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWRNYXBwaW5nIik7Ci0vLwkJWG1sRW1iZWRkZWRJZE1hcHBpbmcgeG1sRW1iZWRkZWRJZE1hcHBpbmcgPSAoWG1sRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotLy8JCUVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLS8vCi0vLwkJeG1sRW1iZWRkZWRJZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCkuc2V0TmFtZSgiRk9PIik7Ci0vLwkJeG1sRW1iZWRkZWRJZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMSkuc2V0TmFtZSgiQkFSIik7Ci0vLwkJeG1sRW1iZWRkZWRJZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMikuc2V0TmFtZSgiQkFaIik7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKDMsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotLy8JCQotLy8JCQotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyLCAwKTsKLS8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8KLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLS8vCi0vLwotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwLCAxKTsKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSB4bWxFbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCi0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShJTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZE1hcHBpbmciKTsKLS8vCQlYbWxFbWJlZGRlZElkTWFwcGluZyB4bWxFbWJlZGRlZElkTWFwcGluZyA9IChYbWxFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0vLwkJRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotLy8JCQotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotLy8JCQotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0vLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLS8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotLy8KLS8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotLy8JCQotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotLy8KLS8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSB4bWxFbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLS8vCi0vLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSB4bWxFbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLS8vCi0vLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSB4bWxFbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLS8vCQkKLS8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotLy8JCWFzc2VydEZhbHNlKHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLmhhc05leHQoKSk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkSWRNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWQiKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRJZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZElkTW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWQiKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWQiKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZElkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkSWRNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWQiKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRJZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZElkTW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkIik7Ci0JCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm92ZXJyaWRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPVkVSUklERV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZCIpOwotCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWQiKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWQiKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRJZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZElkTW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWQiKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRJZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwotCQlPcm1FbWJlZGRlZElkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVtYmVkZGVkUmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVtYmVkZGVkUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwotCQlPcm1FbWJlZGRlZElkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUVtYmVkZGVkTWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbWJlZGRlZE1hcHBpbmcuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7Ci0JCU9ybUVtYmVkZGVkSWRNYXBwaW5nIG9ybUVtYmVkZGVkSWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotCi0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCQotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwkJCi0JCQotCQlvcm1FbWJlZGRlZElkTWFwcGluZy5tb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUVtYmVkZGVkSWRNYXBwaW5nLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKLQkJT3JtRW1iZWRkZWRJZE1hcHBpbmcgb3JtRW1iZWRkZWRJZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCQotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQkKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTWFwcGluZ05vVW5kZXJ5bGluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9ybUVtYmVkZGVkSWRNYXBwaW5nIG9ybUVtYmVkZGVkSWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRW1iZWRkZWRJZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUyID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQkKLQkJLy9lbWJlZGRlZCBtYXBwaW5nIGlzIHZpcnR1YWwsIHNwZWNpZmllZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHNob3VsZCBleGlzdAotCQlPcm1FbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChPcm1FbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBlbWJlZGRlZElkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBlbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIGVtYmVkZGVkSWRNYXBwaW5nLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQlqYXZhRW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJamF2YUVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT09fQ09MVU1OIik7Ci0JCWphdmFFbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgcGVyc2lzdGVudFR5cGUyLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJzdGF0ZSIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9TVEFURV9DT0xVTU4iKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkSWRNYXBwaW5nLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX0NPTFVNTiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NUQVRFX0NPTFVNTiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCQotCQkvL2VtYmVkZGVkIG1hcHBpbmcgaXMgc3BlY2lmaWVkLCB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCXBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikubWFrZVNwZWNpZmllZCgpOwotCQllbWJlZGRlZElkTWFwcGluZyA9IChPcm1FbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBlbWJlZGRlZElkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TVEFURV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBvbmUgb2YgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyB0byBzcGVjaWZpZWQsIHZlcmlmeSBvdGhlcnMgYXJlIHN0aWxsIHZpcnR1YWwKLQkJZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBlbWJlZGRlZElkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlPcm1FbWJlZGRlZElkTWFwcGluZyBvcm1FbWJlZGRlZElkTWFwcGluZyA9IChPcm1FbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1FbWJlZGRlZElkTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscyg0LCBvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gb3JtQXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0KLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkKLQkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJb3JtQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlvcm1Db2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJBX1NUQVRFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW9ybUNvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQkvL3dpbGwgYmUgYW4gT3JtRW1iZWRkZWRNYXBwaW5nIGluc3RlYWQgb2YgT3JtRW1iZWRkZWRJZE1hcHBpbmcgc2luY2UgdGhhdCBpcyB0aGUgZGVmYXVsdAotCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQkvL1RPRE8KLS8vCQlhc3NlcnRFcXVhbHMoNCwgb3JtRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW1iZWRkZWRJZE1hcHBpbmcuZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpKSk7Ci0vLwkJTGlzdEl0ZXJhdG9yPFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBvcm1BdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCi0vLwkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQlYbWxDb2x1bW4geG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHhtbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotLy8JCQotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9ybUVtYmVkZGVkSWRNYXBwaW5nIG9ybUVtYmVkZGVkSWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVtYmVkZGVkSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCS8vVE9ETwotLy8JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbWJlZGRlZElkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkpKTsKLS8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkSWRNYXBwaW5nLmRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCi0vLwkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQlYbWxDb2x1bW4geG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgeG1sQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB4bWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vLy8JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig2KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLS8vCQkKLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygic3RhdGUiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygic3RhdGUiLCB4bWxDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB4bWxDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGFiYjNiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkZWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSA9ICJjaXR5IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FID0gIkVfQ0lUWSI7Ci0KLQlwdWJsaWMgT3JtRW1iZWRkZWRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbWJlZGRlZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRlZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7IiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJImludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsiICsKLQkJCSJpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyIgKwotCQkJImludCBzY2FsZSgpIGRlZmF1bHQgMDsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQXR0cmlidXRlT3ZlcnJpZGUiLCAKLQkJCSJTdHJpbmcgbmFtZSgpOyIgKwotCQkJIkNvbHVtbiBjb2x1bW4oKTsiKTsJCQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUVtYmVkZGVkQW5ub3RhdGlvbigpOwotCQljcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5FTUJFRERFRCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uPUBDb2x1bW4obmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuQ09MVU1OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbHVtbihuYW1lPVwiQV9TVEFURVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVtYmVkZGVkUmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVtYmVkZGVkUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRNYXBwaW5nIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRNYXBwaW5nIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbWJlZGRlZE1hcHBpbmcuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRW1iZWRkZWRNYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7Ci0vLwkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotLy8JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLS8vCQkKLS8vCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUVtYmVkZGVkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLS8vCQkJCQotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTIgPSBvcm1FbWJlZGRlZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUyLnNldE5hbWUoIkJBUiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUzID0gb3JtRW1iZWRkZWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDEpOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlMy5zZXROYW1lKCJCQVoiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGUyLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGUzLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGUsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCQotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKLS8vCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0vLwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotLy8KLS8vCQlvcm1FbWJlZGRlZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCkuc2V0TmFtZSgiRk9PIik7Ci0vLwkJb3JtRW1iZWRkZWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDEpLnNldE5hbWUoIkJBUiIpOwotLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyKS5zZXROYW1lKCJCQVoiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoMywgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotLy8JCQotLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwotLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMSwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbWJlZGRlZE1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDAsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CQkKLQkJCi0JCW9ybUVtYmVkZGVkTWFwcGluZy5tb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1FbWJlZGRlZE1hcHBpbmcubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMiwgMCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJCi0JCWFzc2VydEZhbHNlKG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvcm1FbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMiA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCS8vZW1iZWRkZWQgbWFwcGluZyBpcyB2aXJ0dWFsLCBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoNCwgZW1iZWRkZWRNYXBwaW5nLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGphdmFFbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgZW1iZWRkZWRNYXBwaW5nLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQlqYXZhRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT09fQ09MVU1OIik7Ci0JCWphdmFFbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRUeXBlMi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgic3RhdGUiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfU1RBVEVfQ09MVU1OIik7Ci0JCWFzc2VydEVxdWFscyg0LCBlbWJlZGRlZE1hcHBpbmcuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU1RBVEVfQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJCi0JCS8vZW1iZWRkZWQgbWFwcGluZyBpcyBzcGVjaWZpZWQsIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKLQkJcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5tYWtlU3BlY2lmaWVkKCk7Ci0JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQkJZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBlbWJlZGRlZE1hcHBpbmcuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU1RBVEVfQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgb25lIG9mIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgdG8gc3BlY2lmaWVkLCB2ZXJpZnkgb3RoZXJzIGFyZSBzdGlsbCB2aXJ0dWFsCi0JCWVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscyg0LCBvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBvcm1BdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0KLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkKLQkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJb3JtQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlvcm1Db2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJBX1NUQVRFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW9ybUNvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJLy9UT0RPCi0vLwkJYXNzZXJ0RXF1YWxzKDQsIG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotLy8JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbWJlZGRlZE1hcHBpbmcuZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpKSk7Ci0vLwkJTGlzdEl0ZXJhdG9yPFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBvcm1BdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwotLy8JCVhtbEF0dHJpYnV0ZU92ZXJyaWRlIG9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiY2l0eSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB4bWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vLy8JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig2KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLS8vCQkKLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8KLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8KLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiemlwIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQkvL1RPRE8KLS8vCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW1iZWRkZWRNYXBwaW5nLmRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoKSkpOwotLy8JCUxpc3RJdGVyYXRvcjxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gb3JtQXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRNYXBwaW5nLmRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCi0vLwkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQlYbWxDb2x1bW4geG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgeG1sQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB4bWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vLy8JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig2KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLS8vCQkKLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygic3RhdGUiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygic3RhdGUiLCB4bWxDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB4bWxDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZCIpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib3ZlcnJpZGUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9WRVJSSURFX0NPTFVNTiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW50aXR5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW50aXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkYjJkYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE9ybUVudGl0eVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRF9UWVBFX05BTUUgPSAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBDSElMRF9UWVBFX05BTUU7Ci0KLQlwdWJsaWMgT3JtRW50aXR5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVJZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWQiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFwcGVkU3VwZXJjbGFzcyIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eURlZmF1bHRGaWVsZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZpZWxkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5UHJvcGVydHlBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVJZEFubm90YXRpb24oKTsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChDSElMRF9UWVBFX05BTUUpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZVVubWFwcGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKENISUxEX1RZUEVfTkFNRSkuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIpLmFwcGVuZChUWVBFX05BTUUpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbigpOwotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RBYnN0cmFjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBhYnN0cmFjdCBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBGSUxFX05BTUUsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRW50aXR5LmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRW50aXR5LmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RmllbGRBY2Nlc3MoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWROYW1lKCJGb28iKTsKLQkJLy94bWwgZGVmYXVsdCBlbnRpdHkgbmFtZSBjb21lcyBmcm9tIGphdmEKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKCJjb20uQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgb3JtRW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldENsYXNzTmFtZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWVudGl0eVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWROYW1lKCJGb28xIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMSIsIG9ybUVudGl0eS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXRDbGFzc05hbWUoImNvbS5CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldE5hbWUoIkJheiIpOwotCQlhc3NlcnRFcXVhbHMoIkJheiIsIG9ybUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoIkJheiIsIG9ybUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbnRpdHkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVudGl0eVJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCS8vc2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXRDbGFzc05hbWUoImNvbS5CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjb20uQmFyIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjb20uQmFyIiwgZW50aXR5UmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybUVudGl0eS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbnRpdHkuc2V0Q2xhc3MoImNvbS5CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjb20uQmFyIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjb20uQmFyIiwgZW50aXR5UmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbnRpdHkuc2V0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCS8vVE9ETyBhZGQgdGVzdHMgZm9yIHNldHRpbmcgdGhlIGNsYXNzTmFtZSB3aGVuIHRoZSBwYWNrYWdlIGlzIHNldCBvbiBlbnRpdHktbWFwcGluZ3MKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5UmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRBY2Nlc3NGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRBY2Nlc3NGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RGVmYXVsdEZpZWxkQWNjZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJLy9qYXZhIGhhcyBubyBhbm5vdGF0aW9ucywgc28gZGVmYXVsdEFjY2VzcyBpbiB4bWwgaXMgbnVsbAotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsJCQotCQkvL2VudGl0eU1hcHBpbmdzIGFjY2VzcyB3aW5zIG92ZXIgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBhY2Nlc3MKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7CQkKLQkJLy9wZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGFjY2VzcyB1c2VkIG5vdwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCS8vamF2YSBoYXMgYW5ub3RhdGlvbnMgb24gZmllbGRzIG5vdywgdGhhdCBzaG91bGQgd2luIGluIGFsbCBjYXNlcwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEFjY2Vzc0Zyb21KYXZhRmllbGRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZpZWxkQWNjZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0KLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0QWNjZXNzRnJvbUphdmFQcm9wZXJ0eUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlBY2Nlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRBY2Nlc3NOb1VuZGVybHlpbmdKYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCi0JCS8vc2V0IGFjY2VzcyB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW50aXR5UmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0VHJ1ZShvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkuYm9vbGVhblZhbHVlKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkuYm9vbGVhblZhbHVlKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5pc0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybUVudGl0eS5pc0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5pc0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1FbnRpdHkuaXNEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1FbnRpdHkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5pc01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUob3JtRW50aXR5LmlzTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBvcm1FbnRpdHkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpKTsKLQotCQkvL3NldCBpbmhlcml0YW5jZSBzdHJhdGVneSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0SW5oZXJpdGFuY2UoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5oZXJpdGFuY2UoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkuc2V0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIG9ybUVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKS5nZXRTdHJhdGVneSgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3lGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RGVmYXVsdEZpZWxkQWNjZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJLy9ubyBpbmhlcml0YW5jZSBzdHJhdGVneSBzcGVjaWZpZWQgaW4gamF2YSBzbyBzaW5nbGUtdGFibGUgaXMgZGVmYXVsdAotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgb3JtRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkvL2luaGVyaXRhbmNlIHRhZyBleGlzdHMgaW4geG1sLCBzbyBpdCBvdmVycmlkZXMgYW55dGhpbmcgaW4gamF2YQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KG51bGwpOwkJCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuSk9JTkVELCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0KLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIG9ybUVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgb3JtRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJLy90aGlzIHNldHRpbmcgb3ZlcnJpZGVzIHRoZSBmYWxzZSBtZXRhLWRhdGEgY29tcGxldGUgZm91bmQgb24gb3JtRW50aXR5Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneUZyb21QYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eURlZmF1bHRGaWVsZEFjY2VzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnRQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZFBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgcGFyZW50WG1sRW50aXR5ID0gKE9ybUVudGl0eSkgcGFyZW50UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhwYXJlbnRYbWxFbnRpdHksIGNoaWxkWG1sRW50aXR5LmdldFBhcmVudEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkWG1sRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQkKLQkJLy9jaGFuZ2Ugcm9vdCBpbmhlcml0YW5jZSBzdHJhdGVneSwgdmVyaWZ5IGRlZmF1bHQgaXMgY2hhbmdlZCBmb3IgY2hpbGQgZW50aXR5Ci0JCXBhcmVudFhtbEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgcGFyZW50WG1sRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgY2hpbGRYbWxFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwoY2hpbGRYbWxFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQotCQkvL3NldCBzcGVjaWZpZWQgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaW4gamF2YSBhbmQgdmVyaWZ5IGRlZmF1bHRzIGluIHhtbCBhcmUgY29ycmVjdAotCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShudWxsKTsKLQkJcGFyZW50WG1sRW50aXR5LmdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgcGFyZW50WG1sRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgY2hpbGRYbWxFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwoY2hpbGRYbWxFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCXBhcmVudFBlcnNpc3RlbnRUeXBlLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIHBhcmVudFhtbEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkWG1sRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKSk7Ci0JCQotCQkvL3NldCBzdHJhdGVneSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0SW5oZXJpdGFuY2UoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5oZXJpdGFuY2UoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkuc2V0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgb3JtRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKS5nZXRTdHJhdGVneSgpKTsKLQkKLQkJLy9zZXQgc3RyYXRlZ3kgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKS5zZXRTdHJhdGVneShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpLmdldFN0cmF0ZWd5KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKS5zZXRTdHJhdGVneShvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBlbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpLmdldFN0cmF0ZWd5KCkpOwotCi0JCWVudGl0eVJlc291cmNlLnNldEluaGVyaXRhbmNlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkpOwotCQkKLQkJLy9zZXQgc3RyYXRlZ3kgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0JCQotCQkvL3NldCBzdHJhdGVneSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQlPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZTIgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCXNlY29uZGFyeVRhYmxlMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZTMgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSk7Ci0JCXNlY29uZGFyeVRhYmxlMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IG9ybUVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZGFyeVRhYmxlMiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmRhcnlUYWJsZTMsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kYXJ5VGFibGUsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtRW50aXR5LnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1FbnRpdHkubW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IG9ybUVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtRW50aXR5Lm1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwLCAxKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlSW1wbCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkubW92ZSgyLCAwKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5tb3ZlKDAsIDEpOwotCQlzZWNvbmRhcnlUYWJsZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZSgxKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZSgxKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbFNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RmllbGRBY2Nlc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtRW50aXR5IHBhcmVudE9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBhcmVudFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRW50aXR5IGNoaWxkT3JtRW50aXR5ID0gKE9ybUVudGl0eSkgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IGNoaWxkT3JtRW50aXR5LmdldEphdmFFbnRpdHkoKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGVGb28gPSBqYXZhRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlqYXZhU2Vjb25kYXJ5VGFibGVGb28uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIHZpcnR1YWxTZWNvbmRhcnlUYWJsZUZvbyA9IGNoaWxkT3JtRW50aXR5LnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRPcm1FbnRpdHkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbFNlY29uZGFyeVRhYmxlRm9vLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVGb28uc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxTZWNvbmRhcnlUYWJsZUZvby5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxTZWNvbmRhcnlUYWJsZUZvby5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKS5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgY2hpbGRPcm1FbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkT3JtRW50aXR5LnZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRPcm1FbnRpdHkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJCi0JCWphdmFFbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gdmlydHVhbFNlY29uZGFyeVRhYmxlcyA9IGNoaWxkT3JtRW50aXR5LnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMgPSBjaGlsZE9ybUVudGl0eS5zZWNvbmRhcnlUYWJsZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNoaWxkT3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjaGlsZE9ybUVudGl0eS52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNoaWxkT3JtRW50aXR5LnNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCQotCQljaGlsZE9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZE9ybUVudGl0eS52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJCi0JCWNoaWxkT3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscygyLCBjaGlsZE9ybUVudGl0eS52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJCi0JCQotCQljaGlsZE9ybUVudGl0eS5zZXRTZWNvbmRhcnlUYWJsZXNEZWZpbmVkSW5YbWwodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZE9ybUVudGl0eS52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNoaWxkT3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjaGlsZE9ybUVudGl0eS5zZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcyA9IGNoaWxkT3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVGb28gPSBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlRm9vLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUZvby5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVGb28uZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUZvby5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKS5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkKLQkJY2hpbGRPcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZE9ybUVudGl0eS52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkT3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjaGlsZE9ybUVudGl0eS5zZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNoaWxkT3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkKLQkJY2hpbGRPcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZE9ybUVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgY2hpbGRPcm1FbnRpdHkudmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjaGlsZE9ybUVudGl0eS5zZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQl2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzID0gY2hpbGRPcm1FbnRpdHkudmlydHVhbFNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbFNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQkvL2FkZCBhIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGUgdG8gdGhlIHBhcmVudCwgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdmlydHVhbCBzZWNvbmRhcnlUYWJsZXMgaW4gY2hpbGQKLQkJcGFyZW50T3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIlBBUkVOVF9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoMiwgY2hpbGRPcm1FbnRpdHkudmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKSk7CQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGVkVGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGaWVsZEFjY2VzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5hc3NvY2lhdGVkVGFibGVzKCkpKTsKLQkJCi0JCWVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5hc3NvY2lhdGVkVGFibGVzKCkpKTsKLQkKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5LmFzc29jaWF0ZWRUYWJsZXMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZU5hbWVJc0ludmFsaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlRW50aXR5RW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiRElTQ19WQUxVRSIpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZE5hbWUoIkVOVElUWV9OQU1FIik7Ci0JCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbWJlZGRhYmxlLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW1iZWRkYWJsZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVtYmVkZGFibGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JfQotCQotCS8vVE9ETyB0ZXN0IHRoYXQgYXR0cmlidXRlIG1hcHBpbmdzIGFyZSBub3QgcmVtb3ZlZCB3aGVuIGNoYW5naW5nIHR5cGUgbWFwcGluZy4KLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZUVudGl0eUVtYmVkZGFibGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJESVNDX1ZBTFVFIik7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkTmFtZSgiRU5USVRZX05BTUUiKTsKLS8vCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKElNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVtYmVkZGFibGUuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbWJlZGRhYmxlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW1iZWRkYWJsZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJiYXNpY01hcHBpbmciLCBlbWJlZGRhYmxlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW1iZWRkYWJsZS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotLy8JCWFzc2VydEVxdWFscygiYmFzaWNNYXBwaW5nIiwgb3JtRW1iZWRkYWJsZS5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VFbnRpdHlNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJESVNDX1ZBTFVFIik7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkTmFtZSgiRU5USVRZX05BTUUiKTsKLQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgbWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBlZFN1cGVyY2xhc3MuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzLmdldEFjY2VzcygpKTsKLQkJCi0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZUVudGl0eU1hcHBlZFN1cGVyY2xhc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJESVNDX1ZBTFVFIik7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkTmFtZSgiRU5USVRZX05BTUUiKTsKLQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgbWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBlZFN1cGVyY2xhc3MuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzLmdldEFjY2VzcygpKTsKLQkJCi0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCQotCQlvcm1FbnRpdHkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwob3JtRW50aXR5LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQkJCQotCQkvL3RyeSBhZGRpbmcgYW5vdGhlciBzZXF1ZW5jZSBnZW5lcmF0b3IsIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlvcm1FbnRpdHkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCi0JCW9ybUVudGl0eS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhc3NlcnROb3ROdWxsKGVudGl0eVJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUVudGl0eS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQotCQlvcm1FbnRpdHkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlvcm1FbnRpdHkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldFNlcXVlbmNlR2VuZXJhdG9yKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpKTsKLQkJCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCQotCQlvcm1FbnRpdHkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwob3JtRW50aXR5LmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkJCQotCQkvL3RyeSBhZGRpbmcgYW5vdGhlciB0YWJsZSBnZW5lcmF0b3IsIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlvcm1FbnRpdHkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCi0JCW9ybUVudGl0eS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlhc3NlcnROb3ROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUVudGl0eS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQotCQlvcm1FbnRpdHkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSB0YWJsZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlvcm1FbnRpdHkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvckltcGwoKSk7Ci0JCQkJCi0JCWFzc2VydE5vdE51bGwob3JtRW50aXR5LmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCi0JCW9ybUVudGl0eS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2Uuc2V0VGFibGVHZW5lcmF0b3IobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGlzY3JpbWluYXRvckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yVmFsdWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldERpc2NyaW1pbmF0b3JWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlEaXNjcmltaW5hdG9yVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0KLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4yID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4zID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscyhwcmltYXJ5S2V5Sm9pbkNvbHVtbjIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocHJpbWFyeUtleUpvaW5Db2x1bW4zLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHByaW1hcnlLZXlKb2luQ29sdW1uLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCi0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybUVudGl0eS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtRW50aXR5Lm1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUVudGl0eS5tb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCwgMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybUVudGl0eS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtRW50aXR5LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm1vdmUoMiwgMCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybUVudGl0eS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtRW50aXR5LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybUVudGl0eS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybUVudGl0eS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVVubWFwcGVkKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZFBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCWNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikubWFrZVNwZWNpZmllZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJKChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJCi0JCU9ybUVudGl0eSBjaGlsZEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCXBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGNoaWxkRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRGYWxzZShjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBwa0pvaW5Db2x1bW4gZnJvbSB0aGUgY29udGV4dCBtb2RlLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBoYXMgYSBkZWZhdWx0IHBrSm9pbkNvbHVtbgotCQljaGlsZEVudGl0eS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkKLQkJY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCXBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGNoaWxkRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7CQkKLQkJYXNzZXJ0RmFsc2UoY2hpbGRFbnRpdHkuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JCS8vbm93IHJlbW92ZSB0aGUgcGtKb2luQ29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVzIGFuZCBoYXMgYSBkZWZhdWx0IHBrSm9pbkNvbHVtbgotCQkoKFhtbEVudGl0eSljaGlsZEVudGl0eS5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RmllbGRBY2Nlc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJCi0JCQotCQkoKEphdmFFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJCi0JCU9ybUVudGl0eSBjaGlsZEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGphdmFFbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YVByaW1hcnlLZXlKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLQkJCi0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4yID0gamF2YUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKLQkJamF2YVByaW1hcnlLZXlKb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJGT08yIik7Ci0JCWphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIkJBUjIiKTsKLQkJCi0JCWNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCXBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zID0gY2hpbGRFbnRpdHkuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08yIiwgZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSMiIsIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJY2hpbGRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zID0gY2hpbGRFbnRpdHkuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0vLwotLy8JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotLy8JCQkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTIgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUyLnNldE5hbWUoIkJBUiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTMgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMSk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUzLnNldE5hbWUoIkJBWiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotLy8JCQotLy8JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZTIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZTMsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZSwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSk7Ci0vLwkJCi0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwotLy8JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKS5zZXROYW1lKCJGT08iKTsKLS8vCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMSkuc2V0TmFtZSgiQkFSIik7Ci0vLwkJb3JtRW50aXR5LmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIpLnNldE5hbWUoIkJBWiIpOwotLy8JCQotLy8JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8KLS8vCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1FbnRpdHkubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtRW50aXR5Lm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTIgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJCi0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWVudGl0eS5nZXRKYXZhRW50aXR5KCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJZW50aXR5LmdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vVE9ETyBzcGVjaWZpZWQgb3IgZGVmYXVsdD8KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIikubWFrZVNwZWNpZmllZCgpOwotCQlPcm1CYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIikuZ2V0TWFwcGluZygpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfTkFNRSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfTkFNRSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ly9UT0RPIHNwZWNpZmllZCBvciBkZWZhdWx0PwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzTm9KYXZhRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCXBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCQotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENISUxEX1RZUEVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQkKLQkJKChKYXZhRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCQotCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDSElMRF9UWVBFX05BTUUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJCi0JCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQllbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0vLwotLy8JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApOwotLy8JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0vLwkJCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlMiA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApOwotLy8JCWFzc29jaWF0aW9uT3ZlcnJpZGUyLnNldE5hbWUoIkJBUiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlMyA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDEpOwotLy8JCWFzc29jaWF0aW9uT3ZlcnJpZGUzLnNldE5hbWUoIkJBWiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotLy8JCQotLy8JCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG9ybUVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscyhhc3NvY2lhdGlvbk92ZXJyaWRlMiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoYXNzb2NpYXRpb25PdmVycmlkZTMsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKGFzc29jaWF0aW9uT3ZlcnJpZGUsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSk7Ci0vLwkJCi0vLwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwotLy8JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApLnNldE5hbWUoIkZPTyIpOwotLy8JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDEpLnNldE5hbWUoIkJBUiIpOwotLy8JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDIpLnNldE5hbWUoIkJBWiIpOwotLy8JCQotLy8JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotLy8JCQotLy8JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApOwotLy8JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCi0vLwkJb3JtRW50aXR5LnJlbW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LnJlbW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1FbnRpdHkubW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG9ybUVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1FbnRpdHkubW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG9ybUVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG9ybUVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeTIgPSBvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJbmFtZWRRdWVyeTIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MyA9IG9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDEpOwotCQluYW1lZFF1ZXJ5My5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5Lm5hbWVkUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeTIsIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeTMsIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeSwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCQotCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkubmFtZWRRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb3JtRW50aXR5LmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQlvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JCQotCQlvcm1FbnRpdHkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtRW50aXR5LnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJb3JtRW50aXR5LmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1FbnRpdHkubW92ZU5hbWVkUXVlcnkoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkubmFtZWRRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUVudGl0eS5tb3ZlTmFtZWRRdWVyeSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5Lm5hbWVkUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lZFF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZFF1ZXJ5KCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5Lm5hbWVkUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLm1vdmUoMiwgMCk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZFF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5tb3ZlKDAsIDEpOwotCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkubmFtZWRRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkucmVtb3ZlKDEpOwotCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkubmFtZWRRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZFF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkubmFtZWRRdWVyaWVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5MiA9IG9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQluYW1lZE5hdGl2ZVF1ZXJ5Mi5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkzID0gb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcnkzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5MiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5MywgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5LCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpKTsKLQkJCi0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1FbnRpdHkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCW9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQlvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybUVudGl0eS5tb3ZlTmFtZWROYXRpdmVRdWVyeSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtRW50aXR5Lm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDAsIDEpOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVkTmF0aXZlUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWROYXRpdmVRdWVyeSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5tb3ZlKDIsIDApOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkubW92ZSgwLCAxKTsKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gb3JtRW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnJlbW92ZSgxKTsKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gb3JtRW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKDEpOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2Uuc2V0SWRDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxJZENsYXNzKCkpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpLnNldENsYXNzTmFtZSgibW9kZWwuRm9vIik7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nICBASWRDbGFzcyB2YWx1ZSB0byBudWxsLCBpZC1jbGFzcyB0YWcgaXMgbm90IHJlbW92ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpLnNldENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkpOwotCQkKLQkJLy9yZXNldCBASWRDbGFzcyB2YWx1ZSBhbmQgdGhlbiByZW1vdmUgaWQtY2xhc3MgdGFnCi0JCWVudGl0eVJlc291cmNlLnNldElkQ2xhc3MoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSWRDbGFzcygpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpLnNldENsYXNzTmFtZSgibW9kZWwuRm9vIik7Ci0JCWVudGl0eVJlc291cmNlLnNldElkQ2xhc3MobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRJZENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkpOwotCQkJCi0JCW9ybUVudGl0eS5zZXRJZENsYXNzKCJtb2RlbC5Gb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybUVudGl0eS5nZXRJZENsYXNzKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldElkQ2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJpbWFyeUtleUNvbHVtbk5hbWVXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZFBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoY2hpbGRYbWxFbnRpdHkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSk7Ci0KLQkJcGFyZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikubWFrZVNwZWNpZmllZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgY2hpbGRYbWxFbnRpdHkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSk7Ci0JCQotCQkoKE9ybUlkTWFwcGluZykgcGFyZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9JRCIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgY2hpbGRYbWxFbnRpdHkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSk7Ci0KLQkJLy9UT0RPIG9uY2UgYnVnIDIyODcxOCBpcyBmaXhlZAotLy8JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIG9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gY2hpbGRYbWxFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IChPcm1BdHRyaWJ1dGVPdmVycmlkZSkgb3JtQXR0cmlidXRlT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7Ci0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiSUQiKTsKLS8vCQlhc3NlcnRFcXVhbHMoIklEIiwgY2hpbGRYbWxFbnRpdHkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZENvbmNyZXRlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuaXNEaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWRBYnN0cmFjdENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5LmlzRGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1HZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzNjZjMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBPcm1HZW5lcmF0ZWRWYWx1ZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtR2VuZXJhdGVkVmFsdWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUlkQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtR2VuZXJhdGVkVmFsdWUgb3JtR2VuZXJhdGVkVmFsdWUgPSBvcm1JZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQlYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkKLQkJLy9zZXQgZ2VuZXJhdG9yIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZW5lcmF0ZWRWYWx1ZVJlc291cmNlLnNldEdlbmVyYXRvcigiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtR2VuZXJhdGVkVmFsdWUuZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdlbmVyYXRlZFZhbHVlUmVzb3VyY2UuZ2V0R2VuZXJhdG9yKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdlbmVyYXRlZFZhbHVlUmVzb3VyY2Uuc2V0R2VuZXJhdG9yKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZEdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChnZW5lcmF0ZWRWYWx1ZVJlc291cmNlLmdldEdlbmVyYXRvcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtR2VuZXJhdGVkVmFsdWUgb3JtR2VuZXJhdGVkVmFsdWUgPSBvcm1JZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQlYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUdlbmVyYXRlZFZhbHVlLnNldFNwZWNpZmllZEdlbmVyYXRvcigiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZS5nZXRHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtR2VuZXJhdGVkVmFsdWUuZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUdlbmVyYXRlZFZhbHVlLnNldFNwZWNpZmllZEdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChnZW5lcmF0ZWRWYWx1ZVJlc291cmNlLmdldEdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1HZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1JZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1JZE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTk5ZTZmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSWRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgT3JtSWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1JZE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOyIgKwotCQkJImJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJImJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7IiArCi0JCQkiaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsiICsKLQkJCSJpbnQgc2NhbGUoKSBkZWZhdWx0IDA7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlbXBvcmFsQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlbXBvcmFsIiwgIlRlbXBvcmFsVHlwZSB2YWx1ZSgpOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJHZW5lcmF0ZWRWYWx1ZSIsIAotCQkJIkdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOyIgKwotCQkJIlN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0IFwiXCI7ICIpOwkJCi0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlcXVlbmNlR2VuZXJhdG9yIiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsiICsKLQkJCSJTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOyAiICsKLQkJCSJpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOyIpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRhYmxlR2VuZXJhdG9yIiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsgIiArCi0JCQkiaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsgIiArCi0JCQkiVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsiKTsJCQotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKLQkJY3JlYXRlVGVtcG9yYWxBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbigpOwotCQljcmVhdGVTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24oKTsKLQkJY3JlYXRlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4sIEpQQS5URU1QT1JBTCwgSlBBLlRFTVBPUkFMX1RZUEUsIEpQQS5HRU5FUkFURURfVkFMVUUsIEpQQS5HRU5FUkFUSU9OX1RZUEUsIEpQQS5UQUJMRV9HRU5FUkFUT1IsIEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbHVtbihuYW1lPVwiTVlfQ09MVU1OXCIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCBjb2x1bW5EZWZpbml0aW9uPVwiQ09MVU1OX0RFRklOSVRJT05cIiwgdGFibGU9XCJNWV9UQUJMRVwiLCBsZW5ndGg9NSwgcHJlY2lzaW9uPTYsIHNjYWxlPTcpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT1HZW5lcmF0aW9uVHlwZS5UQUJMRSwgZ2VuZXJhdG9yPVwibXlUYWJsZUdlbmVyYXRvclwiKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFRhYmxlR2VuZXJhdG9yKG5hbWU9XCJteVRhYmxlR2VuZXJhdG9yXCIsIHRhYmxlPVwibXlUYWJsZVwiLCBjYXRhbG9nPVwibXlDYXRhbG9nXCIsIHNjaGVtYT1cIm15U2NoZW1hXCIsIHBrQ29sdW1uTmFtZT1cIm15UGtDb2x1bW5OYW1lXCIsIHZhbHVlQ29sdW1uTmFtZT1cIm15VmFsdWVDb2x1bW5OYW1lXCIsIHBrQ29sdW1uVmFsdWU9XCJteVBrQ29sdW1uVmFsdWVcIiwgaW5pdGlhbFZhbHVlPTEsIGFsbG9jYXRpb25TaXplPTEpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT1cIm15U2VxdWVuY2VHZW5lcmF0b3JcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWRNYXBwaW5nIiwgb3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWRNYXBwaW5nIiwgaWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlpZFJlc291cmNlLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlpZFJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkTWFwcGluZyIsIG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkTWFwcGluZyIsIGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtSWRNYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUlkTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlpZFJlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgb3JtSWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBpZFJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQotCQlpZFJlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgb3JtSWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FLCBpZFJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCi0JCWlkUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVApOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgb3JtSWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIGlkUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJaWRSZXNvdXJjZS5zZXRUZW1wb3JhbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1JZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBpZFJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsIG9ybUlkTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkKLQkJb3JtSWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCBvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0KLQkJb3JtSWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIGlkUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1JZE1hcHBpbmcuc2V0VGVtcG9yYWwobnVsbCk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JfQotCQotCS8vVE9ETyB0ZXN0IGRlZmF1bHRzCi0JLy9UT0RPIHRlc3Qgb3ZlcnJpZGluZyBqYXZhIG1hcHBpbmcgd2l0aCBhIGRpZmZlcmVudCBtYXBwaW5nIHR5cGUgaW4geG1sCi0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJCi0JCW9ybUlkTWFwcGluZy5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChpZFJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgc2VxdWVuY2UgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJb3JtSWRNYXBwaW5nLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0KLQkJb3JtSWRNYXBwaW5nLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0KLQkJb3JtSWRNYXBwaW5nLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlvcm1JZE1hcHBpbmcucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1JZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7Ci0JCQotCQlpZFJlc291cmNlLnNldFNlcXVlbmNlR2VuZXJhdG9yKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQkJCi0JCW9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCQkJCQotCQlpZFJlc291cmNlLnNldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCi0JCW9ybUlkTWFwcGluZy5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChpZFJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgdGFibGUgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJb3JtSWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0KLQkJb3JtSWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0KLQkJb3JtSWRNYXBwaW5nLnJlbW92ZVRhYmxlR2VuZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSB0YWJsZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlvcm1JZE1hcHBpbmcucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCQkKLQkJaWRSZXNvdXJjZS5zZXRUYWJsZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvckltcGwoKSk7CQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKLQkJCi0JCW9ybUlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOwotCi0JCWlkUmVzb3VyY2Uuc2V0VGFibGVHZW5lcmF0b3IobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1JZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCQotCQlvcm1JZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCQkJCi0JCS8vdHJ5IGFkZGluZyBhbm90aGVyIHNlcXVlbmNlIGdlbmVyYXRvciwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCW9ybUlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVHZW5lcmF0ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCi0JCW9ybUlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKGlkUmVzb3VyY2UuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCi0JCW9ybUlkTWFwcGluZy5yZW1vdmVHZW5lcmF0ZWRWYWx1ZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQotCQkvL3RyeSByZW1vdmluZyB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9yIGFnYWluLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJb3JtSWRNYXBwaW5nLnJlbW92ZUdlbmVyYXRlZFZhbHVlKCk7CQkKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVHZW5lcmF0ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQkKLQkJaWRSZXNvdXJjZS5zZXRHZW5lcmF0ZWRWYWx1ZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxHZW5lcmF0ZWRWYWx1ZUltcGwoKSk7Ci0JCQkJCi0JCWFzc2VydE5vdE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKGlkUmVzb3VyY2UuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCQkJCi0JCWlkUmVzb3VyY2Uuc2V0R2VuZXJhdGVkVmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZE1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1JZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0KLQkJCi0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1JZE1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldERlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyNTUpLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMCksIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JfQotCQotCS8vQEJhc2ljKGZldGNoPUZldGNoVHlwZS5MQVpZLCBvcHRpb25hbD1mYWxzZSkKLQkvL0BDb2x1bW4obmFtZT0iTVlfQ09MVU1OIiwgdW5pcXVlPXRydWUsIG51bGxhYmxlPWZhbHNlLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UsIAotCS8vICAgIGNvbHVtbkRlZmluaXRpb249IkNPTFVNTl9ERUZJTklUSU9OIiwgdGFibGU9Ik1ZX1RBQkxFIiwgbGVuZ3RoPTUsIHByZWNpc2lvbj02LCBzY2FsZT03KSIpOwotCS8vQENvbHVtbigKLQkvL0BMb2IKLQkvL0BUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRVNUQU1QKQotCS8vQEVudW1lcmF0ZWQoRW51bVR5cGUuU1RSSU5HKQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JCQotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtSWRNYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNiksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQkJCi0JCU9ybUdlbmVyYXRlZFZhbHVlIG9ybUdlbmVyYXRlZFZhbHVlID0gb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygibXlUYWJsZUdlbmVyYXRvciIsIG9ybUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZEdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRpb25UeXBlLlRBQkxFLCBvcm1HZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRTdHJhdGVneSgpKTsKLQkJCi0JCU9ybVRhYmxlR2VuZXJhdG9yIG9ybVRhYmxlR2VuZXJhdG9yID0gb3JtSWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygibXlUYWJsZUdlbmVyYXRvciIsIG9ybVRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUYWJsZSIsIG9ybVRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIG9ybVRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBvcm1UYWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygibXlQa0NvbHVtbk5hbWUiLCBvcm1UYWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlQa0NvbHVtblZhbHVlIiwgb3JtVGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIG9ybVRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgb3JtVGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEpLCBvcm1UYWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQotCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBvcm1TZXF1ZW5jZUdlbmVyYXRvciA9IG9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm15U2VxdWVuY2VHZW5lcmF0b3IiLCBvcm1TZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUlkTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDI1NSksIG9ybUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMCksIG9ybUNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMCksIG9ybUNvbHVtbi5nZXRTY2FsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1JZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCQotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtSWRNYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldERlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyNTUpLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMCksIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JfQotCQotCS8vMyB0aGluZ3MgdGVzdGVkIGFib3ZlCi0JLy8xLiB2aXJ0dWFsIG1hcHBpbmcgbWV0YWRhdGEgY29tcGxldGU9ZmFsc2UgLSBkZWZhdWx0cyBhcmUgdGFrZW4gZnJvbSB0aGUgamF2YSBhbm5vdGF0aW9ucwotCS8vMi4gdmlydHVhbCBtYXBwaW5nIG1ldGFkYXRhIGNvbXBsZXRlPXRydWUgLSBkZWZhdWx0cyBhcmUgdGFrZW4gZnJvbSBqYXZhIGRlZmF1bHRzLGFubm90YXRpb25zIGlnbm9yZWQKLQkvLzMuIHNwZWNpZmllZCBtYXBwaW5nIChtZXRhZGF0YSBjb21wbGV0ZT10cnVlL2ZhbHNlIC0gZGVmYXVsdHMgYXJlIHRha2VuIGZyb20gamF2YSBhbm5vdGF0aW9ucwotCi0JcHVibGljIHZvaWQgdGVzdElkTW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElkTW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElkTW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YTE5ZGIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBPcm1Kb2luQ29sdW1uVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1Kb2luQ29sdW1uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQkJCi0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQkJCi0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCQkJCQotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQkJCi0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0Q29sdW1uRGVmaW5pdGlvbigiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRDb2x1bW5EZWZpbml0aW9uKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsJCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCB0YWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFRhYmxlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkKLQkJLy9zZXQgdGFibGUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFRhYmxlKCkpOwotCQkKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFRhYmxlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsJCQotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgdGFibGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Kb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IHRhYmxlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsJCQotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldE51bGxhYmxlKCkpOwotCQkKLQkJLy9zZXQgbnVsbGFibGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXROdWxsYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TnVsbGFibGUoKSk7Ci0JCi0JCS8vc2V0IG51bGxhYmxlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXROdWxsYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROdWxsYWJsZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TnVsbGFibGUoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROdWxsYWJsZSgpKTsKLQkJCi0JCS8vc2V0IG51bGxhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQkvL3NldCBudWxsYWJsZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROdWxsYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IHVwZGF0YWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFVwZGF0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgam9pbkNvbHVtblJlc291cmNlLmdldFVwZGF0YWJsZSgpKTsKLQkKLQkJLy9zZXQgdXBkYXRhYmxlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRVcGRhdGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRVcGRhdGFibGUoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IHVwZGF0YWJsZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0VXBkYXRhYmxlKCkpOwotCQkKLQkJLy9zZXQgdXBkYXRhYmxlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0VXBkYXRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldEluc2VydGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0SW5zZXJ0YWJsZSgpKTsKLQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0SW5zZXJ0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldEluc2VydGFibGUoKSk7Ci0JCQotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRJbnNlcnRhYmxlKCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldEluc2VydGFibGUoKSk7Ci0JCQotCQkvL3NldCBpbnNlcnRhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtblJlc291cmNlLmdldEluc2VydGFibGUoKSk7Ci0JCQotCQkvL3NldCBpbnNlcnRhYmxlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXRJbnNlcnRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFVuaXF1ZSgpKTsKLQkJCi0JCS8vc2V0IHVuaXF1ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgam9pbkNvbHVtblJlc291cmNlLmdldFVuaXF1ZSgpKTsKLQkKLQkJLy9zZXQgdW5pcXVlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRVbmlxdWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFVuaXF1ZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRVbmlxdWUoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFVuaXF1ZSgpKTsKLQkJCi0JCS8vc2V0IHVuaXF1ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0VW5pcXVlKCkpOwotCQkKLQkJLy9zZXQgdW5pcXVlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0VW5pcXVlKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE2NzA5NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUpvaW5UYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgT3JtSm9pblRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1Kb2luVGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9NYW55IiwgIiIpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5UYWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQkvL1RPRE8KLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pblRhYmxlIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKTsKLQkJY3JlYXRlSm9pblRhYmxlQW5ub3RhdGlvbigpOwotCQljcmVhdGVJZEFubm90YXRpb24oKTsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFByb2plY3Q+IHByb2plY3RzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgUHJvamVjdCB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgcHJval9pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb2plY3QuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCQkKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKSk7Ci0JCW1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldE5hbWUoKSk7Ci0JCQotCQltYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUpvaW5UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSm9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWNyZWF0ZVRhcmdldEVudGl0eSgpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByb2plY3QiKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0Iiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0vL1RPRE8gbmVlZCB0byB0ZXN0IGpvaW5Db2x1bW4gZGVmYXVsdHMgaGVyZSBhcyB3ZWxsIGFzIGluIGphdmEgYW5kIGFsbCB0aGUgcmVsYXRpb3NoaXAgbWFwcGluZyB0eXBlcwotLy8JCWFzc2VydEVxdWFscygiaWRfcHJvamVjdF9pZCIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZF9wcm9qZWN0X2lkIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCU9ybUpvaW5Db2x1bW4gaW52ZXJzZU9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZF9wcm9qZWN0X2lkIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZF9wcm9qZWN0X2lkIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZSA9IGphdmFNYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJDQVRBTE9HIik7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJTQ0hFTUEiKTsKLQkJSmF2YUpvaW5Db2x1bW4gamF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk5BTUUiKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRkVSRU5DRURfTkFNRSIpOwotCQlKYXZhSm9pbkNvbHVtbiBpbnZlcnNlSmF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSmF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiSU5WRVJTRV9OQU1FIik7Ci0JCWludmVyc2VKYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiSU5WRVJTRV9SRUZFUkVOQ0VEX05BTUUiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0FUQUxPRyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlNDSEVNQSIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCW9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTkFNRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSRUZFUkVOQ0VEX05BTUUiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlpbnZlcnNlT3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9OQU1FIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX1JFRkVSRU5DRURfTkFNRSIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55KCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInByb2plY3RzIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCWNyZWF0ZVRhcmdldEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSB0YXJnZXRQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJvamVjdCIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0Iiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCQotCQkoKEphdmFFbnRpdHkpIHRhcmdldFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJKChKYXZhRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFNYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fVEFCTEUiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgdG8gdHJ1ZSwgd2lsbCBpZ25vcmUgamF2YSBhbm5vdGF0aW9uIHNldHRpbmdzCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJLy9vcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0Iiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCS8vcmVtb3ZlIG0tbSBtYXBwaW5nIGZyb20gdGhlIG9ybS54bWwgZmlsZQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKTsKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0pPSU5fVEFCTEUiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vc3BlY2lmaWVkTmFtZSBzaW5jZSB0aGlzIGlzIGEgdmlydHVhbCBtYXBwaW5nIG5vdwotCQkKLQkJamF2YU1hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9UQUJMRV9OQU1FIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJKChPcm1FbnRpdHkpIHRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFSR0VUIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfT1JNX1RBUkdFVCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGVJbXBsKCkpOwotCQltYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgU2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQltYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuamF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGb28iKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0vLwkJeG1sRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCi0vLwkJeG1sRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCYXIiKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hTm9KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0vLwkJWG1sRW50aXR5IHBhcmVudFhtbEVudGl0eSA9IChYbWxFbnRpdHkpIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlYbWxFbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoWG1sRW50aXR5KSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQkKLS8vCQlhc3NlcnROdWxsKHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJCi0vLwkJcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKLS8vCQlhc3NlcnROdWxsKHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwotLy8JCXBhcmVudFhtbEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotLy8JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCQlhc3NlcnROdWxsKGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJWG1sRW50aXR5IHhtbEVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYSgiRk9PIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5qYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkpBVkFfU0NIRU1BIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJKQVZBX1NDSEVNQSIsIHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotLy8JCS8veG1sIGVudGl0eSBub3cgaGFzIGEgdGFibGUgZWxlbWVudCBzbyBkZWZhdWx0IHNjaGVtYSBpcyBub3QgdGFrZW4gZnJvbSBqYXZhCi0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8KLS8vCQkKLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8KLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U2NoZW1hKG51bGwpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotLy8JCWFzc2VydEVxdWFscygiSkFWQV9TQ0hFTUEiLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IFNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBTY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Kb2luVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKSk7Ci0JCW1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCQotCQkvL3NldCBDYXRhbG9nIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCQotCQltYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLnNldENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgQ2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBDYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSm9pblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JfQotCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZENhdGFsb2coIkZvbyIpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8KLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotLy8JCXhtbEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkKLS8vCQl4bWxFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQmFyIik7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nTm9KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ0Zyb21QYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLS8vCQlYbWxFbnRpdHkgcGFyZW50WG1sRW50aXR5ID0gKFhtbEVudGl0eSkgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCVhtbEVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChYbWxFbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCQotLy8JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCQotLy8JCXBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZENhdGFsb2coIkZPTyIpOwotLy8JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8KLS8vCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLS8vCQlhc3NlcnROdWxsKHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCWFzc2VydE51bGwoY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCVhtbEVudGl0eSB4bWxFbnRpdHkgPSAoWG1sRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJCQVIiKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5qYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJKQVZBX0NBVEFMT0ciKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkpBVkFfQ0FUQUxPRyIsIHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLS8vCQkvL3htbCBlbnRpdHkgbm93IGhhcyBhIHRhYmxlIGVsZW1lbnQgc28gZGVmYXVsdCBzY2hlbWEgaXMgbm90IHRha2VuIGZyb20gamF2YQotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwotLy8JCQotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCi0vLwkJeG1sRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2cobnVsbCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotLy8JCWFzc2VydEVxdWFscygiSkFWQV9DQVRBTE9HIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vL30KLQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCUVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbEVudGl0eS5nZXROYW1lKCkpOwotLy8JCQotLy8JCS8vc2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotLy8JCWVudGl0eVJlc291cmNlLnNldENsYXNzTmFtZSgiY29tLkJhciIpOwotLy8JCWFzc2VydEVxdWFscygiQmFyIiwgeG1sRW50aXR5LmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJZW50aXR5UmVzb3VyY2Uuc2V0TmFtZSgiQmF6Iik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCYXoiLCB4bWxFbnRpdHkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotLy8JCWVudGl0eVJlc291cmNlLnNldENsYXNzTmFtZShudWxsKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJheiIsIHhtbEVudGl0eS5nZXROYW1lKCkpOwotLy8JCQotLy8JCWVudGl0eVJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0TmFtZSgpKTsKLS8vCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1Kb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtSm9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtSm9pblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtSm9pblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJbnZlcnNlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKSk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uSW1wbCgpKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW5JbXBsKCkpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbkltcGwoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLm1vdmUoMiwgMCk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLm1vdmUoMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCi0JCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybUpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtSm9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybUpvaW5UYWJsZS5tb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtSm9pblRhYmxlLm1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGVJbXBsKCkpOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uSW1wbCgpKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbkltcGwoKSk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW5JbXBsKCkpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkubW92ZSgyLCAwKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKSk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJmb28iKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGVJbXBsKCkpOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsICBvcm1Kb2luVGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMSwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJiYXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCAgb3JtSm9pblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlSW1wbCgpKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlSW1wbCgpKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQotCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGVJbXBsKCkpOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQkKLQkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnNpemUoKSk7Ci0KLQkJb3JtSm9pblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IGpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQkKLQkJb3JtSm9pblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJCi0JCW9ybUpvaW5UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKSk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1Kb2luVGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQotCi0JCW9ybUpvaW5UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGVJbXBsKCkpOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiRk9PIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMSwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVIiKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgyLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBWiIpOwotCi0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSgyLCAwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5tYWtlU3BlY2lmaWVkKCk7Ci0JCQotCQlvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTA3YjQzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygibWFueVRvTWFueU1hcHBpbmciLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnlNYXBwaW5nIiwgbWFueVRvTWFueS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgbWFueVRvTWFueS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygibWFueVRvTWFueU1hcHBpbmciLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnlNYXBwaW5nIiwgbWFueVRvTWFueS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG1hbnlUb01hbnkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LnNldFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueVJlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkKLQkJbWFueVRvTWFueVJlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuc2V0TWFwcGVkQnkoIm5ld01hcHBlZEJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCi0JCS8vc2V0bWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueS5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW1hbnlUb01hbnkuc2V0TWFwS2V5KE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcEtleUltcGwoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnROb3ROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFueVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCW1hbnlUb01hbnkuc2V0TWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCQkJCQotCQkvL3NldCBvcmRlckJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LnNldE9yZGVyQnkoIm5ld09yZGVyQnkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5IiwgbWFueVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCQotCQkvL3NldCBvcmRlckJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuc2V0T3JkZXJCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0T3JkZXJCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9yZGVyQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE9yZGVyQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG1hbnlUb01hbnkuZ2V0T3JkZXJCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb09yZGVyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKLQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJmb28iKTsKLQkJYXNzZXJ0RmFsc2Uob3JtTWFueVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeShudWxsKTsKLQkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5pc05vT3JkZXJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROb09yZGVyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKLQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJmb28iKTsKLQkJYXNzZXJ0RmFsc2Uob3JtTWFueVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0Tm9PcmRlcmluZyh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKLQl9Ci0vL1RPRE8KLS8vCXB1YmxpYyBib29sZWFuIGlzT3JkZXJCeVBrKCkgewotLy8JCXJldHVybiAiIi5lcXVhbHMoZ2V0T3JkZXJCeSgpKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5UGsoKSB7Ci0vLwkJc2V0T3JkZXJCeSgiIik7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDdXN0b21PcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtTWFueVRvTWFueU1hcHBpbmcuaXNDdXN0b21PcmRlcmluZygpKTsKLQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQkKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeShudWxsKTsKLQkJYXNzZXJ0RmFsc2Uob3JtTWFueVRvTWFueU1hcHBpbmcuaXNDdXN0b21PcmRlcmluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm1hcEtleSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueSIpOwotCQkKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleSgibWFwS2V5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KCJtYXBwZWRCeSIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJpbnZlcnNlTmFtZSIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiaW52ZXJzZVJlZmVyZW5jZU5hbWUiKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm1hcEtleSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueSIpOwotCQkKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleSgibWFwS2V5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KCJtYXBwZWRCeSIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvTWFueSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvTWFueSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibWFwcGVkQnkiLCAoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hcHBlZEJ5IiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZW1vdmUoKSk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGpvaW5UYWJsZS5qb2luQ29sdW1ucygpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInJlZmVyZW5jZU5hbWUiLCBqb2luVGFibGUuam9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW52ZXJzZU5hbWUiLCBqb2luVGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW52ZXJzZVJlZmVyZW5jZU5hbWUiLCBqb2luVGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFueVRvTWFueU1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm1hcEtleSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJpbnZlcnNlTmFtZSIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiaW52ZXJzZVJlZmVyZW5jZU5hbWUiKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUYXJnZXRFbnRpdHkiLCAoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZW1vdmUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotLy9UT0RPCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoSUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY3NjJiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5DYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVNYW55VG9PbmVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFueVRvT25lIiwgCi0JCQkiQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOyIgKwotCQkJIkNhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307IiArCi0JCQkiRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsiICsKLQkJCSJib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOyIgKwotCQkJImJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJImJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVNYW55VG9PbmVBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlLCB0YXJnZXRFbnRpdHk9QWRkcmVzcy5jbGFzcywgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9XCJNWV9SRUZFUkVOQ0VEX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVNYXBwaW5nIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZU1hcHBpbmciLCBtYW55VG9PbmUuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvT25lLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBtYW55VG9PbmUuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9PbmUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVNYXBwaW5nIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZU1hcHBpbmciLCBtYW55VG9PbmUuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgbWFueVRvT25lLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9PbmUuc2V0VGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmVNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvT25lTWFwcGluZyIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb09uZVJlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCi0JCW1hbnlUb09uZVJlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSwgbWFueVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvT25lUmVzb3VyY2Uuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIG1hbnlUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmVNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvT25lUmVzb3VyY2Uuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFueVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCi0JCW1hbnlUb09uZVJlc291cmNlLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCi0JCS8vc2V0IG9wdGlvbmFsIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb09uZVJlc291cmNlLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmVNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQotCQkvL3NldCBvcHRpb25hbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvT25lTWFwcGluZyIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybU1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IG9ybU1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBvcm1NYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybU1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBvcm1NYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0KLQkJb3JtTWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1NYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybU1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybU1hbnlUb09uZU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtTWFueVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvT25lTWFwcGluZyIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQotCQlvcm1NYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybU1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtTWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1NYW55VG9PbmVNYXBwaW5nLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1NYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybU1hbnlUb09uZU1hcHBpbmcubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtTWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9PbmVNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJCi0JCWFzc2VydEZhbHNlKG9ybU1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOwotCQkvL1RPRE8gZGVmYXVsdCBqb2luQ29sdW1ucwotCQkvL2Fzc2VydFRydWUob3JtTWFueVRvT25lTWFwcGluZy5kZWZhdWx0Sm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOwotCQotCQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1NYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9SRUZFUkVOQ0VEX0NPTFVNTiIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgb3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZT0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdE9wdGlvbmFsKCkpOwotCQkvL1RPRE8gaG1tLCBpcyB0aGlzIGNvcnJlY3Q/Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJLy9UT0RPIGRlZmF1bHQgam9pbiBjb2x1bW5zIGluIHhtbCBvbmUtdG8tb25lCi0vLwkJWG1sSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtTWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLS8vCQkvL1RPRE8gamF2YSBkZWZhdWx0IGNvbHVtbnMgbmFtZSBpbiBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5Kb2luQ29sdW1uT3duZXIKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtTWFueVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShvcm1NYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkJCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBmb3Igc3BlY2lmaWVkIHhtbE1hbnlUb09uZSBtYXBwaW5nCi0vLwkJWG1sSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtTWFueVRvT25lTWFwcGluZy5kZWZhdWx0Sm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JLy8zIHRoaW5ncyB0ZXN0ZWQgYWJvdmUKLQkvLzEuIHZpcnR1YWwgbWFwcGluZyBtZXRhZGF0YSBjb21wbGV0ZT1mYWxzZSAtIGRlZmF1bHRzIGFyZSB0YWtlbiBmcm9tIHRoZSBqYXZhIGFubm90YXRpb25zCi0JLy8yLiB2aXJ0dWFsIG1hcHBpbmcgbWV0YWRhdGEgY29tcGxldGU9dHJ1ZSAtIGRlZmF1bHRzIGFyZSB0YWtlbiBmcm9tIGphdmEgZGVmYXVsdHMsYW5ub3RhdGlvbnMgaWdub3JlZAotCS8vMy4gc3BlY2lmaWVkIG1hcHBpbmcgKG1ldGFkYXRhIGNvbXBsZXRlPXRydWUvZmFsc2UgLSBkZWZhdWx0cyBhcmUgdGFrZW4gZnJvbSBqYXZhIGFubm90YXRpb25zCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2YWEwYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBvcm1NYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldENsYXNzTmFtZSgiY29tLkJhciIpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjb20uQmFyIiwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBvcm1NYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2xhc3MoImNvbS5CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjb20uQmFyIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQl9Ci0JLy9UT0RPIGFkZCB0ZXN0cyBmb3Igc2V0dGluZyB0aGUgY2xhc3NOYW1lIHdoZW4gdGhlIHBhY2thZ2UgaXMgc2V0IG9uIGVudGl0eS1tYXBwaW5ncwotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBvcm1NYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldEFjY2VzcygpKTsKLQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCS8vVE9ETyB0ZXN0IGRlZmF1bHQgYWNjZXNzIGZyb20KLQkJLy91bmRlcmx5aW5nIGphdmEKLQkJLy9wZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzCi0JCS8vZW50aXR5LW1hcHBpbmdzCi0JCS8vd2l0aCB4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSBzZXQKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5zZXRNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkKLQkJLy9zZXQgYWNjZXNzIHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsJCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtTWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydFRydWUob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJb3JtTWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShvcm1NYXBwZWRTdXBlcmNsYXNzLmlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybU1hcHBlZFN1cGVyY2xhc3MuaXNEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShvcm1NYXBwZWRTdXBlcmNsYXNzLmlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShvcm1NYXBwZWRTdXBlcmNsYXNzLmlzTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUob3JtTWFwcGVkU3VwZXJjbGFzcy5pc01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvcm1NYXBwZWRTdXBlcmNsYXNzLmlzTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VNYXBwZWRTdXBlcmNsYXNzRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCW1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQotCQltYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVudGl0eS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybUVudGl0eS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtRW50aXR5LmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0JCQotCS8vdGVzdCB3aXRoIDIgTWFwcGVkU3VwZXJjbGFzc2VzLCBtYWtlIHRoZSBmaXJzdCBvbmUgYW4gRW50aXR5IHNvIGl0IGhhcyB0byBtb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZU1hcHBlZFN1cGVyY2xhc3NFbnRpdHkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCi0JCW1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW50aXR5LmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5LmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZXMgPSBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRUeXBlcy5uZXh0KCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VNYXBwZWRTdXBlcmNsYXNzRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQltYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkKLQkJbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbWJlZGRhYmxlLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW1iZWRkYWJsZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVtYmVkZGFibGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW1iZWRkYWJsZS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkvL3Rlc3Qgd2l0aCAyIE1hcHBlZFN1cGVyY2xhc3NlcywgbWFrZSB0aGUgZmlyc3Qgb25lIGFuIEVtYmVkZGFibGUgc28gaXQgaGFzIHRvIG1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAotCXB1YmxpYyB2b2lkIHRlc3RNYWtlTWFwcGVkU3VwZXJjbGFzc0VtYmVkZGFibGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCi0JCW1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW1iZWRkYWJsZS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVtYmVkZGFibGUuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBlbWJlZGRhYmxlLmdldEFjY2VzcygpKTsKLQkJCi0JCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzID0gZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRUeXBlcy5uZXh0KCkuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5zZXRJZENsYXNzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbElkQ2xhc3MoKSk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRJZENsYXNzKCkuc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3Rlc3Qgc2V0dGluZyAgQElkQ2xhc3MgdmFsdWUgdG8gbnVsbCwgaWQtY2xhc3MgdGFnIGlzIG5vdCByZW1vdmVkCi0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRJZENsYXNzKCkuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCS8vcmVzZXQgQElkQ2xhc3MgdmFsdWUgYW5kIHRoZW4gcmVtb3ZlIGlkLWNsYXNzIHRhZwotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0SWRDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxJZENsYXNzKCkpOwotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpLnNldENsYXNzTmFtZSgibW9kZWwuRm9vIik7Ci0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5zZXRJZENsYXNzKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsJCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCi0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRJZENsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRJZENsYXNzKCkpOwotCQkJCi0JCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0SWRDbGFzcygibW9kZWwuRm9vIik7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRJZENsYXNzKCkpOwotCQkKLQkJb3JtTWFwcGVkU3VwZXJjbGFzcy5zZXRJZENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1OYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTmFtZWROYXRpdmVRdWVyeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YjY4MDAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1OYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE9ybU5hbWVkTmF0aXZlUXVlcnlUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybU5hbWVkTmF0aXZlUXVlcnlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5zZXRRdWVyeSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLnNldFF1ZXJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5zZXRRdWVyeSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LnNldFF1ZXJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0KLQkJT3JtUXVlcnlIaW50IHF1ZXJ5SGludCA9IG9ybU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgwKTsKLQkJcXVlcnlIaW50LnNldE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUXVlcnlIaW50IHF1ZXJ5SGludDIgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludDIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUXVlcnlIaW50IHF1ZXJ5SGludDMgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCXF1ZXJ5SGludDMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gcXVlcnlIaW50cyA9IG9ybU5hbWVkTmF0aXZlUXVlcnkuaGludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludDIsIHF1ZXJ5SGludHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludDMsIHF1ZXJ5SGludHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludCwgcXVlcnlIaW50cy5uZXh0KCkpOwotCQkKLQkJcXVlcnlIaW50cyA9IG9ybU5hbWVkTmF0aXZlUXVlcnkuaGludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBxdWVyeUhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHF1ZXJ5SGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcXVlcnlIaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMSwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0KLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkZPTyIpOwotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1RdWVyeUhpbnQ+IGhpbnRzID0gb3JtTmFtZWROYXRpdmVRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5Lm1vdmVIaW50KDAsIDEpOwotCQloaW50cyA9IG9ybU5hbWVkTmF0aXZlUXVlcnkuaGludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxRdWVyeUhpbnQoKSk7Ci0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxRdWVyeUhpbnQoKSk7Ci0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxRdWVyeUhpbnQoKSk7Ci0JCQotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1RdWVyeUhpbnQ+IGhpbnRzID0gb3JtTmFtZWROYXRpdmVRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkubW92ZSgyLCAwKTsKLQkJaGludHMgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0KLQkJbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkubW92ZSgwLCAxKTsKLQkJaGludHMgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0KLQkJbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkucmVtb3ZlKDEpOwotCQloaW50cyA9IG9ybU5hbWVkTmF0aXZlUXVlcnkuaGludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5yZW1vdmUoMSk7Ci0JCWhpbnRzID0gb3JtTmFtZWROYXRpdmVRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRzKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlc3VsdFNldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5zZXRSZXN1bHRTZXRNYXBwaW5nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5zZXRSZXN1bHRTZXRNYXBwaW5nKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlc3VsdFNldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2Uuc2V0UmVzdWx0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2Uuc2V0UmVzdWx0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU5hbWVkUXVlcnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1OYW1lZFF1ZXJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyNTkzNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU5hbWVkUXVlcnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgT3JtTmFtZWRRdWVyeVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtTmFtZWRRdWVyeVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW5hbWVkUXVlcnlSZXNvdXJjZS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbmFtZWRRdWVyeVJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWRRdWVyeSBvcm1OYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTmFtZWRRdWVyeS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1OYW1lZFF1ZXJ5LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbmFtZWRRdWVyeVJlc291cmNlLnNldFF1ZXJ5KCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQluYW1lZFF1ZXJ5UmVzb3VyY2Uuc2V0UXVlcnkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWRRdWVyeSBvcm1OYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1OYW1lZFF1ZXJ5LnNldFF1ZXJ5KCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU5hbWVkUXVlcnkuc2V0UXVlcnkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkUXVlcnkgbmFtZWRRdWVyeVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQotCQlPcm1RdWVyeUhpbnQgcXVlcnlIaW50ID0gb3JtTmFtZWRRdWVyeS5hZGRIaW50KDApOwotCQlxdWVyeUhpbnQuc2V0TmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1RdWVyeUhpbnQgcXVlcnlIaW50MiA9IG9ybU5hbWVkUXVlcnkuYWRkSGludCgwKTsKLQkJcXVlcnlIaW50Mi5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1RdWVyeUhpbnQgcXVlcnlIaW50MyA9IG9ybU5hbWVkUXVlcnkuYWRkSGludCgxKTsKLQkJcXVlcnlIaW50My5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtUXVlcnlIaW50PiBxdWVyeUhpbnRzID0gb3JtTmFtZWRRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50MiwgcXVlcnlIaW50cy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50MywgcXVlcnlIaW50cy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50LCBxdWVyeUhpbnRzLm5leHQoKSk7Ci0JCQotCQlxdWVyeUhpbnRzID0gb3JtTmFtZWRRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHF1ZXJ5SGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcXVlcnlIaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBxdWVyeUhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWRRdWVyeSBvcm1OYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7Ci0KLQkJb3JtTmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkZPTyIpOwotCQlvcm1OYW1lZFF1ZXJ5LmFkZEhpbnQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybU5hbWVkUXVlcnkuYWRkSGludCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5zaXplKCkpOwotCQkKLQkJb3JtTmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1OYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygxLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtTmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkUXVlcnkgbmFtZWRRdWVyeVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQotCQlvcm1OYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybU5hbWVkUXVlcnkuYWRkSGludCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJb3JtTmFtZWRRdWVyeS5hZGRIaW50KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtTmFtZWRRdWVyeS5tb3ZlSGludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gaGludHMgPSBvcm1OYW1lZFF1ZXJ5LmhpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybU5hbWVkUXVlcnkubW92ZUhpbnQoMCwgMSk7Ci0JCWhpbnRzID0gb3JtTmFtZWRRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWRRdWVyeSBvcm1OYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7Ci0KLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFF1ZXJ5SGludCgpKTsKLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFF1ZXJ5SGludCgpKTsKLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFF1ZXJ5SGludCgpKTsKLQkJCi0JCW5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gaGludHMgPSBvcm1OYW1lZFF1ZXJ5LmhpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5tb3ZlKDIsIDApOwotCQloaW50cyA9IG9ybU5hbWVkUXVlcnkuaGludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQotCQluYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5tb3ZlKDAsIDEpOwotCQloaW50cyA9IG9ybU5hbWVkUXVlcnkuaGludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQotCQluYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5yZW1vdmUoMSk7Ci0JCWhpbnRzID0gb3JtTmFtZWRRdWVyeS5oaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCi0JCW5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnJlbW92ZSgxKTsKLQkJaGludHMgPSBvcm1OYW1lZFF1ZXJ5LmhpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybU5hbWVkUXVlcnkuaGludHMoKS5oYXNOZXh0KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyMjVkZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygib25lVG9NYW55TWFwcGluZyIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnlNYXBwaW5nIiwgb25lVG9NYW55LmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb25lVG9NYW55LmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygib25lVG9NYW55TWFwcGluZyIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnlNYXBwaW5nIiwgb25lVG9NYW55LmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9uZVRvTWFueS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55LnNldFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnlSZXNvdXJjZS5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQotCQlvbmVUb01hbnlSZXNvdXJjZS5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIG9uZVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueVJlc291cmNlLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkJCQotCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55LnNldE1hcHBlZEJ5KCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXRtYXBwZWRCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnkuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW9uZVRvTWFueS5zZXRNYXBLZXkoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5SW1wbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQlvbmVUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJb25lVG9NYW55LnNldE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE9yZGVyQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG9yZGVyQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueS5zZXRPcmRlckJ5KCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5Iiwgb25lVG9NYW55LmdldE9yZGVyQnkoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55LnNldE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T3JkZXJCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCQkJCQotCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5Iiwgb25lVG9NYW55LmdldE9yZGVyQnkoKSk7Ci0JCi0JCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0T3JkZXJCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzTm9PcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc05vT3JkZXJpbmcoKSk7Ci0KLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJmb28iKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc05vT3JkZXJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROb09yZGVyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKLQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImZvbyIpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKLQkJCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0Tm9PcmRlcmluZyh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7Ci0JfQotLy9UT0RPCi0vLwlwdWJsaWMgYm9vbGVhbiBpc09yZGVyQnlQaygpIHsKLS8vCQlyZXR1cm4gIiIuZXF1YWxzKGdldE9yZGVyQnkoKSk7Ci0vLwl9Ci0vLwotLy8JcHVibGljIHZvaWQgc2V0T3JkZXJCeVBrKCkgewotLy8JCXNldE9yZGVyQnkoIiIpOwotLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdElzQ3VzdG9tT3JkZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0KLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21PcmRlcmluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb01hbnlNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb01hbnlNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRhcmdldEVudGl0eSIsICgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hcHBlZEJ5IiwgKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZW1vdmUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb01hbnlNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRhcmdldEVudGl0eSIsICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibWFwcGVkQnkiLCAoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9ICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGpvaW5UYWJsZS5qb2luQ29sdW1ucygpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInJlZmVyZW5jZU5hbWUiLCBqb2luVGFibGUuam9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW52ZXJzZU5hbWUiLCBqb2luVGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW52ZXJzZVJlZmVyZW5jZU5hbWUiLCBqb2luVGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRhcmdldEVudGl0eSIsICgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLS8vVE9ETwlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTlkYTc0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE9ybU9uZVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVPbmVUb09uZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb09uZSIsIAotCQkJIkNsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsiICsKLQkJCSJDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OyIgKwotCQkJIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7IiArCi0JCQkiYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsiICsJCQotCQkJIlN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsiICsKLQkJCSJib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJImJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVPbmVUb09uZUFubm90YXRpb24oKTsKLQkJY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlLCB0YXJnZXRFbnRpdHk9QWRkcmVzcy5jbGFzcywgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9XCJNWV9SRUZFUkVOQ0VEX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIG9uZVRvT25lLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9uZVRvT25lLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIG9uZVRvT25lLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvT25lTWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvbmVUb09uZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lLnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZVJlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQotCQlvbmVUb09uZVJlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZLCBvbmVUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lUmVzb3VyY2Uuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSwgb25lVG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkJCQotCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkoIm5ld01hcHBlZEJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0TWFwcGVkQnkoIm5ld01hcHBlZEJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXRPcHRpb25hbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCi0JCW9uZVRvT25lUmVzb3VyY2Uuc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCi0JCS8vc2V0IG9wdGlvbmFsIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lUmVzb3VyY2Uuc2V0T3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IG9wdGlvbmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCi0JCS8vc2V0IG9wdGlvbmFsIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybU9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBvcm1PbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gb3JtT25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybU9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlqb2luQ29sdW1ucyA9IG9ybU9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQotCQlvcm1PbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtT25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybU9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybU9uZVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCi0JCW9ybU9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1PbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtT25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtT25lVG9PbmVNYXBwaW5nLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1PbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtT25lVG9PbmVNYXBwaW5nLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybU9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZU1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkJLy9UT0RPIGRlZmF1bHQgam9pbkNvbHVtbnMKLQkJLy9hc3NlcnRUcnVlKG9ybU9uZVRvT25lTWFwcGluZy5kZWZhdWx0Sm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOwotCQotCQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0KLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtT25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9SRUZFUkVOQ0VEX0NPTFVNTiIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgb3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZT0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0KLQkJLy9UT0RPIGRlZmF1bHQgam9pbiBjb2x1bW5zIGluIHhtbCBvbmUtdG8tb25lCi0vLwkJWG1sSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtT25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8JCS8vVE9ETyBqYXZhIGRlZmF1bHQgY29sdW1ucyBuYW1lIGluIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLkpvaW5Db2x1bW5Pd25lcgotLy8JCS8vYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCS8vYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRPcHRpb25hbCgpKTsKLQkJLy9UT0RPIGRlZmF1bHQgdGFyZ2V0IGVudGl0eSBpbiB4bWwKLQkJLy9hc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkJCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBmb3Igc3BlY2lmaWVkIHhtbE9uZVRvT25lIG1hcHBpbmcKLS8vCQlYbWxKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1PbmVUb09uZU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldE1hcHBlZEJ5KCJtYXBwZWRCeSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZU1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZU1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0KLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZU1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZU1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYXBwZWRCeSIsICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hcHBlZEJ5IiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZW1vdmUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZU1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUYXJnZXRFbnRpdHkiLCAoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZW1vdmUoKSk7Ci0JCQotCQlqb2luQ29sdW1uID0gKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoInJlZmVyZW5jZU5hbWUiLCBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZU1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldE1hcHBlZEJ5KCJtYXBwZWRCeSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLS8vVE9ETwlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JCi0JCi0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybU9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBvcm1PbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IG9ybU9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybU9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBvcm1PbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQotCQlvcm1PbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybU9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtT25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybU9uZVRvT25lTWFwcGluZy5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtT25lVG9PbmVNYXBwaW5nLnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlvcm1PbmVUb09uZU1hcHBpbmcucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0KLQkJb3JtT25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1PbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybU9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtT25lVG9PbmVNYXBwaW5nLm1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybU9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtT25lVG9PbmVNYXBwaW5nLm1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1PbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkZjhhYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZU51bGxBdHRyaWJ1dGVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsJCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbHVtbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQ29sdW1uIiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlT25lVG9PbmVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9uZVRvT25lIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU9uZVRvT25lQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVNwZWNpZmllZE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVOdWxsQXR0cmlidXRlTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCS8vdGFrZSBhIHZpcnR1YWwgbWFwcGluZyB3aXRoIGEgbWFwcGluZyB0eXBlIGFuZCBtYWtlIGl0IHNwZWNpZmllZAotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0VHJ1ZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0VHJ1ZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNPcm1JZE1hcHBpbmcpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5tYWtlU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLm1ha2VTcGVjaWZpZWQoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsJCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbE5vVW5kZXJseWluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5tYWtlU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLm1ha2VTcGVjaWZpZWQoKTsKLQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgibm9KYXZhQXR0cmlidXRlIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ1R5cGVXaGVuTWV0YWRhdGFDb21wbGV0ZSgpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nVHlwZVdoZW5NZXRhZGF0YUNvbXBsZXRlMigpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOWQ5ZGUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE9ybVBlcnNpc3RlbnRUeXBlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQkKLQkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxUeXBlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWFzc2VydEZhbHNlKGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKLS8vCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0vLwkJCi0vLwkJLy9hZGQgZW1iZWRkYWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLS8vCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbWJlZGRhYmxlKCk7Ci0vLwkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuYWRkKGVtYmVkZGFibGUpOwotLy8JCWVtYmVkZGFibGUuc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28iKTsKLS8vCQlhc3NlcnRUcnVlKGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0vLwkJCi0vLwkJLy9hZGQgZW50aXR5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotLy8JCUVudGl0eSBlbnRpdHkgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbnRpdHkoKTsKLS8vCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5hZGQoZW50aXR5KTsKLS8vCQllbnRpdHkuc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28yIik7Ci0vLwkJYXNzZXJ0VHJ1ZShlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28yIiwgZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKLS8vCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotLy8KLS8vCQkvL2FkZCBtYXBwZWQtc3VwZXJjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLS8vCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNYXBwZWRTdXBlcmNsYXNzKCk7Ci0vLwkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmFkZChtYXBwZWRTdXBlcmNsYXNzKTsKLS8vCQltYXBwZWRTdXBlcmNsYXNzLnNldENsYXNzTmFtZSgibW9kZWwuRm9vMyIpOwotLy8JCWFzc2VydFRydWUoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotLy8JfQotLy8JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoWG1sVHlwZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMyIpOwotCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMobWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLCBvcm1QZXJzaXN0ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5zaXplKCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IG9ybVBlcnNpc3RlbnRUeXBlcyA9IGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCk7Ci0JCS8vdGhlIHNhbWUgT3JtUGVyc2lzdGVudFR5cGVzIHNob3VsZCBzdGlsbCBiZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGVzLm5leHQoKSwgZW50aXR5UGVyc2lzdGVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGVzLm5leHQoKSwgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlcy5uZXh0KCksIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNBdHRyaWJ1dGUiKTsKLQkKLQkJWG1sRW50aXR5IGVudGl0eSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIGJhc2ljLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkQXR0cmlidXRlIik7Ci0JCi0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkID0gZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBlbWJlZGRlZC5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50QXR0cmlidXRlIik7Ci0JCi0JCVhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSA9IGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCB0cmFuc2llbnRSZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uQXR0cmlidXRlIik7Ci0JCi0JCVhtbFZlcnNpb24gdmVyc2lvbiA9IGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIHZlcnNpb24uZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkQXR0cmlidXRlIik7Ci0JCi0JCVhtbElkIGlkID0gZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBpZC5nZXROYW1lKCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBwZXJzaXN0ZW50QXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgcGVyc2lzdGVudEF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgcGVyc2lzdGVudEF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgcGVyc2lzdGVudEF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNBdHRyaWJ1dGUiKTsKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZEF0dHJpYnV0ZSIpOwotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbkF0dHJpYnV0ZSIpOwotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkQXR0cmlidXRlIik7Ci0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInRyYW5zaWVudEF0dHJpYnV0ZSIpOwotCQotCQlYbWxFbnRpdHkgZW50aXR5ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImJhc2ljQXR0cmlidXRlIikpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbWJlZGRlZEF0dHJpYnV0ZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInZlcnNpb25BdHRyaWJ1dGUiKSk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZEF0dHJpYnV0ZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ0cmFuc2llbnRBdHRyaWJ1dGUiKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCVhtbEVudGl0eSBlbnRpdHkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkQXR0cmlidXRlIik7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZEF0dHJpYnV0ZSIpKTsJCi0JCWFzc2VydE51bGwoZW50aXR5LmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCYXNpYygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCVhtbEVudGl0eSBlbnRpdHkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljQXR0cmlidXRlIik7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJiYXNpY0F0dHJpYnV0ZSIpKTsJCi0JCWFzc2VydE51bGwoZW50aXR5LmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJWG1sRW50aXR5IGVudGl0eSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uQXR0cmlidXRlIik7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0KLQkJZW50aXR5UGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgidmVyc2lvbkF0dHJpYnV0ZSIpKTsJCi0JCWFzc2VydE51bGwoZW50aXR5LmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbWJlZGRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCVhtbEVudGl0eSBlbnRpdHkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkQXR0cmlidXRlIik7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbWJlZGRlZEF0dHJpYnV0ZSIpKTsJCi0JCWFzc2VydE51bGwoZW50aXR5LmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUcmFuc2llbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlYbWxFbnRpdHkgZW50aXR5ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50QXR0cmlidXRlIik7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInRyYW5zaWVudEF0dHJpYnV0ZSIpKTsJCi0JCWFzc2VydE51bGwoZW50aXR5LmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJWG1sRW50aXR5IGVudGl0eSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQllbnRpdHkuc2V0QXR0cmlidXRlcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdHRyaWJ1dGVzKCkpOwotCQlYbWxCYXNpY0ltcGwgYmFzaWMgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxCYXNpY0ltcGwoKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5hZGQoYmFzaWMpOwotCQliYXNpYy5zZXROYW1lKCJiYXNpY0F0dHJpYnV0ZSIpOwotCQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJCi0JCVhtbEVtYmVkZGVkSW1wbCBlbWJlZGRlZCA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVtYmVkZGVkSW1wbCgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmFkZChlbWJlZGRlZCk7Ci0JCWVtYmVkZGVkLnNldE5hbWUoImVtYmVkZGVkQXR0cmlidXRlIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCi0JCVhtbFZlcnNpb25JbXBsIHZlcnNpb24gPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxWZXJzaW9uSW1wbCgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuYWRkKHZlcnNpb24pOwotCQl2ZXJzaW9uLnNldE5hbWUoInZlcnNpb25BdHRyaWJ1dGUiKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJWG1sSWRJbXBsIGlkID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSWRJbXBsKCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuYWRkKGlkKTsKLQkJaWQuc2V0TmFtZSgiaWRBdHRyaWJ1dGUiKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJWG1sVHJhbnNpZW50SW1wbCB0cmFuc2llbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRyYW5zaWVudEltcGwoKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuYWRkKHRyYW5zaWVudFJlc291cmNlKTsKLQkJdHJhbnNpZW50UmVzb3VyY2Uuc2V0TmFtZSgidHJhbnNpZW50QXR0cmlidXRlIik7Ci0JCQotCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCVhtbE1hbnlUb09uZUltcGwgbWFueVRvT25lUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYW55VG9PbmVJbXBsKCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmFkZChtYW55VG9PbmVSZXNvdXJjZSk7Ci0JCW1hbnlUb09uZVJlc291cmNlLnNldE5hbWUoIm1hbnlUb09uZUF0dHJpYnV0ZSIpOwotCQkKLQkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQlYbWxNYW55VG9NYW55SW1wbCBtYW55VG9NYW55UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYW55VG9NYW55SW1wbCgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuYWRkKG1hbnlUb01hbnlSZXNvdXJjZSk7Ci0JCW1hbnlUb01hbnlSZXNvdXJjZS5zZXROYW1lKCJtYW55VG9NYW55QXR0cmlidXRlIik7Ci0JCQotCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCVhtbE9uZVRvTWFueUltcGwgb25lVG9NYW55UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPbmVUb01hbnlJbXBsKCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmFkZChvbmVUb01hbnlSZXNvdXJjZSk7Ci0JCW9uZVRvTWFueVJlc291cmNlLnNldE5hbWUoIm9uZVRvTWFueUF0dHJpYnV0ZSIpOwotCQkKLQkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQlYbWxPbmVUb09uZUltcGwgb25lVG9PbmVSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9uZVRvT25lSW1wbCgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmFkZChvbmVUb09uZVJlc291cmNlKTsKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXROYW1lKCJvbmVUb09uZUF0dHJpYnV0ZSIpOwotCQkKLQkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCi0JCVhtbEVtYmVkZGVkSWRJbXBsIGVtYmVkZGVkSWRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVtYmVkZGVkSWRJbXBsKCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5hZGQoZW1iZWRkZWRJZFJlc291cmNlKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLnNldE5hbWUoImVtYmVkZGVkSWRBdHRyaWJ1dGUiKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRJZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnlBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnlBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkucmVtb3ZlKDApOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkucmVtb3ZlKDApOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkucmVtb3ZlKDApOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLnJlbW92ZSgwKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnROb3ROdWxsKGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDFmOGVlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVJZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWQiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVJZEFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCXByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2Uuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwocHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCXByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2Uuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwocHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCVhtbEVudGl0eSBvcm1FbnRpdHkgPSAoWG1sRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LmphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZvbyIpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwkJb3JtRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLS8vCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQotLy8JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCQotLy8JCW9ybUVudGl0eS5lbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQmFyIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZU5vSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJWG1sRW50aXR5IG9ybUVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0vLwkJWG1sRW50aXR5IHBhcmVudFhtbEVudGl0eSA9IChYbWxFbnRpdHkpIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlYbWxFbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoWG1sRW50aXR5KSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCQotLy8JCXBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwkJcGFyZW50WG1sRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwocHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5zZXRDb2x1bW5EZWZpbml0aW9uKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLnNldENvbHVtbkRlZmluaXRpb24oIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUXVlcnlIaW50VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUXVlcnlIaW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMyM2QzOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVF1ZXJ5SGludFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgT3JtUXVlcnlIaW50VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1RdWVyeUhpbnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1RdWVyeUhpbnQgb3JtUXVlcnlIaW50ID0gb3JtRW50aXR5LmFkZE5hbWVkUXVlcnkoMCkuYWRkSGludCgwKTsKLQkJCi0JCVhtbFF1ZXJ5SGludCBxdWVyeUhpbnRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0SGludHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXF1ZXJ5SGludFJlc291cmNlLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtUXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHF1ZXJ5SGludFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcXVlcnlIaW50UmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1RdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUXVlcnlIaW50IG9ybVF1ZXJ5SGludCA9IG9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDApLmFkZEhpbnQoMCk7Ci0JCQotCQlYbWxRdWVyeUhpbnQgcXVlcnlIaW50UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldEhpbnRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1RdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1RdWVyeUhpbnQuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1RdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgcXVlcnlIaW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVF1ZXJ5SGludC5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludFJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUXVlcnlIaW50IG9ybVF1ZXJ5SGludCA9IG9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDApLmFkZEhpbnQoMCk7Ci0JCQotCQlYbWxRdWVyeUhpbnQgcXVlcnlIaW50UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldEhpbnRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1RdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50UmVzb3VyY2UuZ2V0VmFsdWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXF1ZXJ5SGludFJlc291cmNlLnNldFZhbHVlKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybVF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgcXVlcnlIaW50UmVzb3VyY2UuZ2V0VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcXVlcnlIaW50UmVzb3VyY2Uuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUXVlcnlIaW50LmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludFJlc291cmNlLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVF1ZXJ5SGludCBvcm1RdWVyeUhpbnQgPSBvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgwKS5hZGRIaW50KDApOwotCQkKLQkJWG1sUXVlcnlIaW50IHF1ZXJ5SGludFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXRIaW50cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtUXVlcnlIaW50LmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludFJlc291cmNlLmdldFZhbHVlKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1RdWVyeUhpbnQuc2V0VmFsdWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtUXVlcnlIaW50LmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBxdWVyeUhpbnRSZXNvdXJjZS5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVF1ZXJ5SGludC5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1RdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50UmVzb3VyY2UuZ2V0VmFsdWUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1TZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MWFjMjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1TZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE9ybVNlY29uZGFyeVRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1TZWNvbmRhcnlUYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2Vjb25kYXJ5VGFibGVJbXBsKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCi0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U2Vjb25kYXJ5VGFibGVzRGVmaW5lZEluWG1sKHRydWUpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkJCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZUltcGwoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5zZXRTY2hlbWEoIkZPTyIpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7CQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5nZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7Ci0JCQotCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJCi0JCWphdmFTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBWiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQotCQkKLQkJb3JtRW50aXR5LnNldFNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbCh0cnVlKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBwYXJlbnRPcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVudGl0eSBjaGlsZE9ybUVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChwYXJlbnRPcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGNoaWxkT3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCXBhcmVudE9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydE51bGwocGFyZW50T3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZE9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJcGFyZW50T3JtRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydE51bGwocGFyZW50T3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChjaGlsZE9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0TnVsbChvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5nZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiSkFWQV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOyAvL3NjaGVtYSBpcyBub3QgZGVmYXVsdGVkIGZyb20gdW5kZXJseWluZyBqYXZhCi0JCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZUltcGwoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldENhdGFsb2coKSk7Ci0JCQotCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuc2l6ZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ0Zyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlqYXZhU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJCQVIiKTsKLQkJCi0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJCi0JCWphdmFTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJCQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbCh0cnVlKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybUVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdENhdGFsb2dGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCW9ybVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnROdWxsKG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlqYXZhU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJKQVZBX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpKTsgLy9zY2hlbWEgaXMgbm90IGRlZmF1bHRlZCBmcm9tIHVuZGVybHlpbmcgamF2YQotCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG9ybVNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4yID0gb3JtU2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4zID0gb3JtU2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybVNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMocHJpbWFyeUtleUpvaW5Db2x1bW4yLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHByaW1hcnlLZXlKb2luQ29sdW1uMywgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1TZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7Ci0KLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybVNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1TZWNvbmRhcnlUYWJsZS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtU2Vjb25kYXJ5VGFibGUucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybVNlY29uZGFyeVRhYmxlLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7Ci0KLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybVNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtU2Vjb25kYXJ5VGFibGUubW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybVNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1TZWNvbmRhcnlUYWJsZS5tb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCwgMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybVNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKCkpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtU2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1TZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5tb3ZlKDAsIDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1TZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybVNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1TZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybVNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1TZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybVNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCAgb3JtU2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgIG9ybVNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwotCQkKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwotCQkKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5zaXplKCkpOwotCi0JCW9ybVNlY29uZGFyeVRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW9ybVNlY29uZGFyeVRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybVNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCQotCQlvcm1TZWNvbmRhcnlUYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybVNlY29uZGFyeVRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1TZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCi0KLQkJb3JtU2Vjb25kYXJ5VGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKLQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiRk9PIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBUiIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVoiKTsKLQotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKDIsIDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybVNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybVNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1TZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoIlNFQ09OREFSWSIpOwotCQkKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKG9ybVNlY29uZGFyeVRhYmxlLmlzVmlydHVhbCgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJamF2YVNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlqYXZhU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybVNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTZWNvbmRhcnlUYWJsZXNEZWZpbmVkSW5YbWwodHJ1ZSk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlMiA9IG9ybUVudGl0eS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7Ci0JCW9ybVNlY29uZGFyeVRhYmxlMi5zZXRTcGVjaWZpZWROYW1lKCJTRUNPTkRBUlkiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiU0VDT05EQVJZIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtU2Vjb25kYXJ5VGFibGUyLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVNlY29uZGFyeVRhYmxlMi51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1TZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzU3YzguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1TZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE9ybVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXRTZXF1ZW5jZU5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldFNlcXVlbmNlTmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldFNlcXVlbmNlTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldFNlcXVlbmNlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBpbml0aWFsIHZhbHVlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMTApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMCksIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMCksIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQotCQkvL3NldCBpbml0aWFsIHZhbHVlIHRvIDEsIHdoaWNoIGhhcHBlbnMgdG8gYmUgdGhlIGRlZmF1bHQsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEpLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQotCQkvL3NldCBpbml0aWFsIHZhbHVlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0SW5pdGlhbFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBpbml0aWFsIHZhbHVlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQotCQkvL3NldCBpbml0aWFsIHZhbHVlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMTApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMCksIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkKLQkJLy9zZXQgYWxsb2NhdGlvbiBzaXplIHRvIDUwLCB3aGljaCBoYXBwZW5zIHRvIGJlIHRoZSBkZWZhdWx0LCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEpLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkKLQkJLy9zZXQgYWxsb2NhdGlvbiBzaXplIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0QWxsb2NhdGlvblNpemUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigxMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMCksIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDUwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUwKSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0KLQkJLy9zZXQgYWxsb2NhdGlvbiBzaXplIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UYWJsZUdlbmVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRhYmxlR2VuZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkMWRkNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRhYmxlR2VuZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBPcm1UYWJsZUdlbmVyYXRvclRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtVGFibGVHZW5lcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUlkQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgaW5pdGlhbCB2YWx1ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDEwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldEluaXRpYWxWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgaW5pdGlhbCB2YWx1ZSB0byAxLCB3aGljaCBoYXBwZW5zIHRvIGJlIHRoZSBkZWZhdWx0LCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEpLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldEluaXRpYWxWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgaW5pdGlhbCB2YWx1ZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldEluaXRpYWxWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgaW5pdGlhbCB2YWx1ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMTApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMCksIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEpLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0KLQkJLy9zZXQgaW5pdGlhbCB2YWx1ZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldEluaXRpYWxWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBhbGxvY2F0aW9uIHNpemUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMCksIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSB0byA1MCwgd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgZGVmYXVsdCwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldEFsbG9jYXRpb25TaXplKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBhbGxvY2F0aW9uIHNpemUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMTApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMCksIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZig1MCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUwKSwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MCksIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldFRhYmxlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFRhYmxlKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0VGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQkKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3IuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3IuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlR2VuZXJhdG9yLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0UGtDb2x1bW5OYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRQa0NvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0VmFsdWVDb2x1bW5OYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRWYWx1ZUNvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldFBrQ29sdW1uVmFsdWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRQa0NvbHVtblZhbHVlKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0UGtDb2x1bW5WYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRQa0NvbHVtblZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7Ci0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJmb28iKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7Ci0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJiYXIiKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgIHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsICB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0KLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQotCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJdGFibGVHZW5lcmF0b3IucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0KLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQl0YWJsZUdlbmVyYXRvci5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQotCi0JCXRhYmxlR2VuZXJhdG9yLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOwotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiRk9PIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBUiIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7Ci0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVoiKTsKLQotCQkKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKDIsIDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCUphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZyA9IChKYXZhSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YVRhYmxlR2VuZXJhdG9yIGphdmFUYWJsZUdlbmVyYXRvciA9IGphdmFJZE1hcHBpbmcuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJamF2YVRhYmxlR2VuZXJhdG9yLnNldE5hbWUoIlRBQkxFX0dFTkVSQVRPUiIpOwotCQkKLQkJT3JtVGFibGVHZW5lcmF0b3Igb3JtVGFibGVHZW5lcmF0b3IgPSBvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShvcm1UYWJsZUdlbmVyYXRvci5pc1ZpcnR1YWwoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybVRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWphdmFUYWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlqYXZhVGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJamF2YVRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1UYWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1JZE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLm1ha2VTcGVjaWZpZWQoKTsKLQkJb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCi0JCU9ybVRhYmxlR2VuZXJhdG9yIG9ybVRhYmxlR2VuZXJhdG9yMiA9IG9ybUlkTWFwcGluZy5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlvcm1UYWJsZUdlbmVyYXRvcjIuc2V0TmFtZSgiVEFCTEVfR0VORVJBVE9SIik7Ci0JCQotCQlhc3NlcnRGYWxzZShvcm1UYWJsZUdlbmVyYXRvcjIuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtVGFibGVHZW5lcmF0b3IyLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODE0MDc2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE9ybVRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtVGFibGUgb3JtVGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXROYW1lKCkpOwotCi0JCWVudGl0eVJlc291cmNlLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1UYWJsZSBvcm1UYWJsZSA9ICgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybVRhYmxlLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVRhYmxlLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZU5vSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbUVudGl0eU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBwYXJlbnRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVRhYmxlIG9ybVRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldFRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkpOwotCQotCQkvL3NldCBTY2hlbWEgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5zZXRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLmdldFNjaGVtYSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQmFyIik7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFOb0phdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBwYXJlbnRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCXBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJcGFyZW50WG1sRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJKQVZBX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfU0NIRU1BIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLQkJLy94bWwgZW50aXR5IG5vdyBoYXMgYSB0YWJsZSBlbGVtZW50IHNvIGRlZmF1bHQgc2NoZW1hIGlzIG5vdCB0YWtlbiBmcm9tIGphdmEKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCi0JCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfU0NIRU1BIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1UYWJsZSBvcm1UYWJsZSA9IG9ybUVudGl0eS5nZXRUYWJsZSgpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgU2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBTY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtVGFibGUgb3JtVGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCBDYXRhbG9nIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJLy9zZXQgQ2F0YWxvZyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLnNldENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCi0JCWVudGl0eVJlc291cmNlLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1UYWJsZSBvcm1UYWJsZSA9IG9ybUVudGl0eS5nZXRUYWJsZSgpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ0Zyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0KLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCYXIiKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nTm9KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdENhdGFsb2dGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBwYXJlbnRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQotCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdENhdGFsb2dGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2coIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZENhdGFsb2coIkpBVkFfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfQ0FUQUxPRyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQkvL3htbCBlbnRpdHkgbm93IGhhcyBhIHRhYmxlIGVsZW1lbnQgc28gZGVmYXVsdCBzY2hlbWEgaXMgbm90IHRha2VuIGZyb20gamF2YQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCi0JCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0NBVEFMT0ciLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLX0KLQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxFbnRpdHkgb3JtRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCUVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUVudGl0eS5nZXROYW1lKCkpOwotLy8JCQotLy8JCS8vc2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotLy8JCWVudGl0eVJlc291cmNlLnNldENsYXNzTmFtZSgiY29tLkJhciIpOwotLy8JCWFzc2VydEVxdWFscygiQmFyIiwgb3JtRW50aXR5LmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJZW50aXR5UmVzb3VyY2Uuc2V0TmFtZSgiQmF6Iik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCYXoiLCBvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotLy8JCWVudGl0eVJlc291cmNlLnNldENsYXNzTmFtZShudWxsKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJheiIsIG9ybUVudGl0eS5nZXROYW1lKCkpOwotLy8JCQotLy8JCWVudGl0eVJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtRW50aXR5LmdldFRhYmxlKCkudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFRhYmxlIHRhYmxlUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZSgpOwotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZSh0YWJsZVJlc291cmNlKTsKLQkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgIG9ybUVudGl0eS5nZXRUYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFRhYmxlIHRhYmxlUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZSgpOwotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZSh0YWJsZVJlc291cmNlKTsKLQkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsICBvcm1FbnRpdHkuZ2V0VGFibGUoKS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCU9ybVRhYmxlIHRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFRhYmxlIHRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlPcm1UYWJsZSB0YWJsZSA9IG9ybUVudGl0eS5nZXRUYWJsZSgpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxUYWJsZSB0YWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlPcm1UYWJsZSB0YWJsZSA9IG9ybUVudGl0eS5nZXRUYWJsZSgpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxUYWJsZSB0YWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJT3JtVGFibGUgdGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sVGFibGUgdGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnNpemUoKSk7Ci0JCQotCQkKLQkJdGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0KLQotCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJT3JtVGFibGUgdGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sVGFibGUgdGFibGVSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlKCk7Ci0JCWVudGl0eVJlc291cmNlLnNldFRhYmxlKHRhYmxlUmVzb3VyY2UpOwotCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7Ci0JCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJGT08iKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOwotCQl0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiQkFSIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgyLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBWiIpOwotCi0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMiwgMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQl0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCi0vL1RPRE8gbm90IHlldCBzdXBwb3J0aW5nIHVuaXF1ZSBjb25zdHJpYW50cyBmcm9tIGphdmEKLS8vCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c0Zyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQkJCQotLy8JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUVudGl0eS5nZXRUYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0vLwkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLS8vCi0vLwkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLS8vCQlqYXZhRW50aXR5LmdldFRhYmxlKCkuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLS8vCQlqYXZhRW50aXR5LmdldFRhYmxlKCkuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLS8vCQlqYXZhRW50aXR5LmdldFRhYmxlKCkuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLS8vCQkKLS8vCQkKLS8vCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0vLwkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLS8vCi0vLwkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKS51bmlxdWVDb25zdHJhaW50cygpOwotLy8JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLS8vCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotLy8JCQotLy8JCWVudGl0eVJlc291cmNlLnNldFRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlSW1wbCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoMCwgIG9ybUVudGl0eS5nZXRUYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLS8vCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWQ4YmFlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUcmFuc2llbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVHJhbnNpZW50IiwgIiIpOwkJCi0JfQotCi0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVUcmFuc2llbnRBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVFJBTlNJRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVHJhbnNpZW50Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50TWFwcGluZyIpOwotCQlPcm1UcmFuc2llbnRNYXBwaW5nIHhtbFRyYW5zaWVudG5NYXBwaW5nID0gKE9ybVRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudE1hcHBpbmciLCB4bWxUcmFuc2llbnRuTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudE1hcHBpbmciLCB0cmFuc2llbnRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl0cmFuc2llbnRSZXNvdXJjZS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHhtbFRyYW5zaWVudG5NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHRyYW5zaWVudFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdHJhbnNpZW50UmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxUcmFuc2llbnRuTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRyYW5zaWVudFJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnRNYXBwaW5nIik7Ci0JCU9ybVRyYW5zaWVudE1hcHBpbmcgeG1sVHJhbnNpZW50bk1hcHBpbmcgPSAoT3JtVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygidHJhbnNpZW50TWFwcGluZyIsIHhtbFRyYW5zaWVudG5NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50TWFwcGluZyIsIHRyYW5zaWVudFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCXhtbFRyYW5zaWVudG5NYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgeG1sVHJhbnNpZW50bk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgdHJhbnNpZW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXhtbFRyYW5zaWVudG5NYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sVHJhbnNpZW50bk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0cmFuc2llbnRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TWFwcGluZ05vVW5kZXJ5bGluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9ybVRyYW5zaWVudE1hcHBpbmcgb3JtVHJhbnNpZW50TWFwcGluZyA9IChPcm1UcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtVHJhbnNpZW50TWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQkKLQkvL0BCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UpCi0JLy9AQ29sdW1uKG5hbWU9Ik1ZX0NPTFVNTiIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCAKLQkvLyAgICBjb2x1bW5EZWZpbml0aW9uPSJDT0xVTU5fREVGSU5JVElPTiIsIHRhYmxlPSJNWV9UQUJMRSIsIGxlbmd0aD01LCBwcmVjaXNpb249Niwgc2NhbGU9NykiKTsKLQkvL0BDb2x1bW4oCi0JLy9ATG9iCi0JLy9AVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkKLQkvL0BFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCU9ybVRyYW5zaWVudE1hcHBpbmcgb3JtVHJhbnNpZW50TWFwcGluZyA9IChPcm1UcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1UcmFuc2llbnRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJT3JtVHJhbnNpZW50TWFwcGluZyBvcm1UcmFuc2llbnRNYXBwaW5nID0gKE9ybVRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVRyYW5zaWVudE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtVHJhbnNpZW50TWFwcGluZyBvcm1UcmFuc2llbnRNYXBwaW5nID0gKE9ybVRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVRyYW5zaWVudE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50Iik7Ci0JCQotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInRyYW5zaWVudCIpOwotCQkKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VHJhbnNpZW50TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnQiKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50Iik7Ci0JCQotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInRyYW5zaWVudCIpOwotCQkKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInRyYW5zaWVudCIpOwotCQkKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50Iik7Ci0JCQotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInRyYW5zaWVudCIpOwotCQkKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50Iik7Ci0JCQotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDUzYjlmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgT3JtVmVyc2lvbk1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybVZlcnNpb25NYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVWZXJzaW9uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlZlcnNpb24iLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbHVtbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7IiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJImludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsiICsKLQkJCSJpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyIgKwotCQkJImludCBzY2FsZSgpIGRlZmF1bHQgMDsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVtcG9yYWxBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVtcG9yYWwiLCAiVGVtcG9yYWxUeXBlIHZhbHVlKCk7Iik7CQkKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlVmVyc2lvbkFubm90YXRpb24oKTsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwotCQljcmVhdGVUZW1wb3JhbEFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBKUEEuQ09MVU1OLCBKUEEuVEVNUE9SQUwsIEpQQS5URU1QT1JBTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbHVtbihuYW1lPVwiTVlfQ09MVU1OXCIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCBjb2x1bW5EZWZpbml0aW9uPVwiQ09MVU1OX0RFRklOSVRJT05cIiwgdGFibGU9XCJNWV9UQUJMRVwiLCBsZW5ndGg9NSwgcHJlY2lzaW9uPTYsIHNjYWxlPTcpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbk1hcHBpbmciKTsKLQkJT3JtVmVyc2lvbk1hcHBpbmcgb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxWZXJzaW9uIHZlcnNpb25SZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25NYXBwaW5nIiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uTWFwcGluZyIsIHZlcnNpb25SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHZlcnNpb25SZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb25NYXBwaW5nIik7Ci0JCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sVmVyc2lvbiB2ZXJzaW9uUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uTWFwcGluZyIsIG9ybVZlcnNpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbk1hcHBpbmciLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtVmVyc2lvbk1hcHBpbmcuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVZlcnNpb25NYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb25NYXBwaW5nIik7Ci0JCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sVmVyc2lvbiB2ZXJzaW9uUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgdmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgdmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCi0JCXZlcnNpb25SZXNvdXJjZS5zZXRUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdmVyc2lvblJlc291cmNlLnNldFRlbXBvcmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbk1hcHBpbmciKTsKLQkJT3JtVmVyc2lvbk1hcHBpbmcgb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxWZXJzaW9uIHZlcnNpb25SZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybVZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgdmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsIG9ybVZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQotCQlvcm1WZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQotCQlvcm1WZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKG51bGwpOwotCQlhc3NlcnROdWxsKHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQl9Ci0JCi0JLy9UT0RPIHRlc3QgZGVmYXVsdHMKLQkvL1RPRE8gdGVzdCBvdmVycmlkaW5nIGphdmEgbWFwcGluZyB3aXRoIGEgZGlmZmVyZW50IG1hcHBpbmcgdHlwZSBpbiB4bWwKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlWZXJzaW9uTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybVZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXREZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjU1KSwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMCksIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCX0KLQkKLQkvL0BCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UpCi0JLy9AQ29sdW1uKG5hbWU9Ik1ZX0NPTFVNTiIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCAKLQkvLyAgICBjb2x1bW5EZWZpbml0aW9uPSJDT0xVTU5fREVGSU5JVElPTiIsIHRhYmxlPSJNWV9UQUJMRSIsIGxlbmd0aD01LCBwcmVjaXNpb249Niwgc2NhbGU9NykiKTsKLQkvL0BDb2x1bW4oCi0JLy9ATG9iCi0JLy9AVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkKLQkvL0BFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIG9ybVZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybVZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNiksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybVZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjU1KSwgb3JtQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgb3JtQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgb3JtQ29sdW1uLmdldFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybVZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldERlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyNTUpLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMCksIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uIik7Ci0JCQotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZlcnNpb25Nb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uIik7Ci0KLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlWZXJzaW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbiIpOwotCQkKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtWG1sVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtWG1sVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxMGQxNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVhtbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgT3JtWG1sVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1YbWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuc2V0TmFtZSgiZm9vIik7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sKCkgewotCQlyZXR1cm4gcm9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtWG1sIG9ybVhtbCgpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdCgpLm1hcHBpbmdGaWxlUmVmcygpLm5leHQoKS5nZXRPcm1YbWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFkZEVudGl0eU1hcHBpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVJlc291cmNlIG9ybVJlc291cmNlID0gb3JtUmVzb3VyY2UoKTsKLQkJb3JtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQlvcm1SZXNvdXJjZS5zYXZlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKLQkJCi0JCW9ybVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVudGl0eU1hcHBpbmdzKCkpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBZGRFbnRpdHlNYXBwaW5ncygpIHsKLQkJT3JtUmVzb3VyY2Ugb3JtUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpOwotCQlvcm1SZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShvcm1SZXNvdXJjZS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKLQkJCi0JCU9ybVhtbCBvcm1YbWwgPSBvcm1YbWwoKTsKLQkJYXNzZXJ0TnVsbChvcm1YbWwuZ2V0RW50aXR5TWFwcGluZ3MoKSk7Ci0JCQotCQlvcm1YbWwuYWRkRW50aXR5TWFwcGluZ3MoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwob3JtWG1sLmdldEVudGl0eU1hcHBpbmdzKCkpOwotCQkKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCW9ybVhtbC5hZGRFbnRpdHlNYXBwaW5ncygpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVtb3ZlRW50aXR5TWFwcGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUmVzb3VyY2Ugb3JtUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKLQkJCi0JCW9ybVJlc291cmNlLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtWG1sKCkuZ2V0RW50aXR5TWFwcGluZ3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZW1vdmVFbnRpdHlNYXBwaW5ncygpIHsKLQkJT3JtWG1sIG9ybVhtbCA9IG9ybVhtbCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1YbWwuZ2V0RW50aXR5TWFwcGluZ3MoKSk7Ci0JCQotCQlvcm1YbWwucmVtb3ZlRW50aXR5TWFwcGluZ3MoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtWG1sLmdldEVudGl0eU1hcHBpbmdzKCkpOwotCQkKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCW9ybVhtbC5yZW1vdmVFbnRpdHlNYXBwaW5ncygpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYmY5ZmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJcmV0dXJuIGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNBbGxGZWF0dXJlc1Vuc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsKLQkJCi0JCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc0FsbEZlYXR1cmVzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRTY2hlbWEoImFzZGYiKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc0FsbEZlYXR1cmVzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0Q2F0YWxvZygiYXNkZiIpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsKLQkJCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTY2hlbWEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hMygpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZzMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBvbmx5IHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBnZXRzIHJlbW92ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIHRhZyBub3QgcmVtb3ZlZAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVQZXJzaXN0MigpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXNjYWRlUGVyc2lzdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5QWNjZXNzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYWRhNTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKLQkJcmV0dXJuIGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzQWxsRmVhdHVyZXNVbnNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc0FsbEZlYXR1cmVzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CQkKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0KLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2xhc3NSZWZUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0NsYXNzUmVmVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmNWE2MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2xhc3NSZWZUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIENsYXNzUmVmVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBDbGFzc1JlZlRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2xhc3NOYW1lKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCBjbGFzcyByZWYKLQkJWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJeG1sQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKCJjb20uZm9vLkJhciIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZCh4bWxDbGFzc1JlZik7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gcGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZENsYXNzUmVmcygpLm5leHQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBjbGFzcyBuYW1lcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyhjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSwgeG1sQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjbGFzcyBuYW1lIHRvIGRpZmZlcmVudCBuYW1lLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmJhci5Gb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscyhjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSwgeG1sQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IGNsYXNzIG5hbWUgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCksIHhtbENsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQkJCi0JCS8vIHNldCBjbGFzcyBuYW1lIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGNsYXNzUmVmLmdldENsYXNzTmFtZSgpLCB4bWxDbGFzc1JlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgbmFtZSBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSwgeG1sQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2xhc3NOYW1lKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCBjbGFzcyByZWYKLQkJWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJeG1sQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKCJjb20uZm9vLkJhciIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZCh4bWxDbGFzc1JlZik7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gcGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZENsYXNzUmVmcygpLm5leHQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBjbGFzcyBuYW1lcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyhjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSwgeG1sQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2xhc3MgbmFtZSB0byBkaWZmZXJlbnQgbmFtZSwgdGVzdCBlcXVhbGl0eQotCQljbGFzc1JlZi5zZXRDbGFzc05hbWUoImNvbS5iYXIuRm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCksIHhtbENsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQkJCi0JCS8vIHNldCBjbGFzcyBuYW1lIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQljbGFzc1JlZi5zZXRDbGFzc05hbWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGNsYXNzUmVmLmdldENsYXNzTmFtZSgpLCB4bWxDbGFzc1JlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgY2xhc3MgbmFtZSB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCWNsYXNzUmVmLnNldENsYXNzTmFtZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSwgeG1sQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IG5hbWUgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQljbGFzc1JlZi5zZXRDbGFzc05hbWUoImNvbS5mb28uQmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCksIHhtbENsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFBlcnNpc3RlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCQotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQlYbWxKYXZhQ2xhc3NSZWYgeG1sQ2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKHhtbENsYXNzUmVmKTsKLQkJCi0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWYoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy90ZXN0IHNldHRpbmcgdG8gYSBjbGFzcyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBwcm9qZWN0Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXIiKTsKLQkJCi0JCWNsYXNzUmVmID0gY2xhc3NSZWYoKTsJCQotCQlhc3NlcnROdWxsKGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpKTsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0pwdENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZDg3ZDIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0pwdENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBzdWl0ZSh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKGJvb2xlYW4gYWxsKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJvb3RDb250ZXh0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGVyc2lzdGVuY2VYbWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZXJzaXN0ZW5jZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBlcnNpc3RlbmNlVW5pdFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1hcHBpbmdGaWxlUmVmVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NSZWZUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL01hcHBpbmdGaWxlUmVmVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9NYXBwaW5nRmlsZVJlZlRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTRhMTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL01hcHBpbmdGaWxlUmVmVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTWFwcGluZ0ZpbGVSZWZUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE1hcHBpbmdGaWxlUmVmVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZigpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdCgpLm1hcHBpbmdGaWxlUmVmcygpLm5leHQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUZpbGVOYW1lKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCBtYXBwaW5nIGZpbGUgcmVmCi0JCVhtbE1hcHBpbmdGaWxlUmVmIHhtbEZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXhtbEZpbGVSZWYuc2V0RmlsZU5hbWUoImZvby54bWwiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxGaWxlUmVmKTsKLQkJTWFwcGluZ0ZpbGVSZWYgZmlsZVJlZiA9IHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKS5uZXh0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgZmlsZSBuYW1lcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyhmaWxlUmVmLmdldEZpbGVOYW1lKCksIHhtbEZpbGVSZWYuZ2V0RmlsZU5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHRvIGRpZmZlcmVudCBmaWxlIG5hbWUsIHRlc3QgZXF1YWxpdHkKLQkJeG1sRmlsZVJlZi5zZXRGaWxlTmFtZSgiYmFyLnhtbCIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBmaWxlIG5hbWUgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbEZpbGVSZWYuc2V0RmlsZU5hbWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBmaWxlIG5hbWUgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxGaWxlUmVmLnNldEZpbGVOYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBmaWxlIG5hbWUgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxGaWxlUmVmLnNldEZpbGVOYW1lKCJiYXoueG1sIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmlsZVJlZi5nZXRGaWxlTmFtZSgpLCB4bWxGaWxlUmVmLmdldEZpbGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RmlsZU5hbWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIG1hcHBpbmcgZmlsZSByZWYKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sRmlsZVJlZi5zZXRGaWxlTmFtZSgiZm9vLnhtbCIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbEZpbGVSZWYpOwotCQlNYXBwaW5nRmlsZVJlZiBmaWxlUmVmID0gcGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpLm5leHQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBmaWxlIG5hbWVzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHRvIGRpZmZlcmVudCBmaWxlIG5hbWUsIHRlc3QgZXF1YWxpdHkKLQkJZmlsZVJlZi5zZXRGaWxlTmFtZSgiYmFyLnhtbCIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBmaWxlIG5hbWUgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCWZpbGVSZWYuc2V0RmlsZU5hbWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBmaWxlIG5hbWUgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlmaWxlUmVmLnNldEZpbGVOYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBmaWxlIG5hbWUgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlmaWxlUmVmLnNldEZpbGVOYW1lKCJiYXoueG1sIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmlsZVJlZi5nZXRGaWxlTmFtZSgpLCB4bWxGaWxlUmVmLmdldEZpbGVOYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGMzODRhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBQZXJzaXN0ZW5jZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UoKSB7Ci0JCXJldHVybiByb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFkZFBlcnNpc3RlbmNlVW5pdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVJlc291cmNlIHBybSA9IHBlcnNpc3RlbmNlUmVzb3VyY2UoKTsKLQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSBwcm0uZ2V0UGVyc2lzdGVuY2UoKTsKLQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSByb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBwZXJzaXN0ZW5jZSB1bml0cywgdGVzdCB0aGF0IGl0J3MgY2xlYXIgaW4gY29udGV4dAotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuY2xlYXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCB4bWwgcGVyc2lzdGVuY2UgdW5pdCwgdGVzdCB0aGF0IGl0J3MgYWRkZWQgdG8gY29udGV4dAotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldE5hbWUoInRlc3QiKTsKLQkJeG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLmFkZCh4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlVW5pdHNTaXplKCkpOwotCQkKLQkJLy8gYWRkIGFub3RoZXIsIHRlc3QgdGhhdCBpdCAqaXNuJ3QqIGFkZCB0byBjb250ZXh0Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKCJ0ZXN0MiIpOwotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuYWRkKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBZGRQZXJzaXN0ZW5jVW5pdCgpIHsKLQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSB4bWxQZXJzaXN0ZW5jZSgpOwotCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlKCk7Ci0JCQotCQkvLyBjbGVhciB4bWwgcGVyc2lzdGVuY2UgdW5pdHMsIHRlc3QgdGhhdCBpdCdzIGNsZWFyIGluIGNvbnRleHQKLQkJeG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLmNsZWFyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBwZXJzaXN0ZW5jZSB1bml0LCB0ZXN0IHRoYXQgaXQncyBhZGRlZCB0byByZXNvdXJjZQotCQlwZXJzaXN0ZW5jZS5hZGRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBhbm90aGVyLCB0ZXN0IHRoYXQgd2UgZ2V0IGFuIGV4Y2VwdGlvbgotCQlib29sZWFuIGV4Y2VwdGlvbiA9IGZhbHNlOwotCQl0cnkgewotCQkJcGVyc2lzdGVuY2UuYWRkUGVyc2lzdGVuY2VVbml0KCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb24gPSB0cnVlOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZW1vdmVQZXJzaXN0ZW5jZVVuaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZSBwcm0gPSBwZXJzaXN0ZW5jZVJlc291cmNlKCk7Ci0JCVhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlID0gcHJtLmdldFBlcnNpc3RlbmNlKCk7Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcm9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCk7Ci0JCQotCQkvLyBhZGQgYSBwZXJzaXN0ZW5jZSB1bml0IGFuZCB0ZXN0IHRoYXQgdGhlcmUgYXJlIHR3byBleGlzdGluZyB4bWwgYW5kIAotCQkvLyBvbmUgY29udGV4dCBwZXJzaXN0ZW5jZSB1bml0Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZSgidGVzdCIpOwotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuYWRkKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBwZXJzaXN0ZW5jZSB1bml0IGZyb20geG1sLCB0ZXN0IHRoYXQgY29udGV4dCByZW1haW5zIHVuY2hhbmdlZAotCQl4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuZ2V0KDApOwotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkucmVtb3ZlKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm90aGVyIG9uZSBmcm9tIHhtbCwgdGV4dCB0aGF0IGl0J3Mgbm93IHJlbW92ZWQgZnJvbSBjb250ZXh0Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCk7Ci0JCXhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5yZW1vdmUoeG1sUGVyc2lzdGVuY2VVbml0KTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlVW5pdHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVtb3ZlUGVyc2lzdGVuY2VVbml0KCkgewotCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IHhtbFBlcnNpc3RlbmNlKCk7Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2UoKTsKLQkJCi0JCS8vIGFkZCBhIHBlcnNpc3RlbmNlIHVuaXQgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIHhtbCBhbmQgCi0JCS8vIG9uZSBjb250ZXh0IHBlcnNpc3RlbmNlIHVuaXQKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKCJ0ZXN0Iik7Ci0JCXhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5hZGQoeG1sUGVyc2lzdGVuY2VVbml0KTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlVW5pdHNTaXplKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHBlcnNpc3RlbmNlIHVuaXQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSByZXNvdXJjZSBhbmQgdGhhdAotCQkvLyBhICpuZXcqIHBlcnNpc3RlbmNlIHVuaXQgcmVwcmVzZW50aW5nIHRoZSBwcmV2aW91c2x5IHVucmVwcmVzZW50ZWQgb25lCi0JCS8vIGlzIHByZXNlbnQKLQkJcGVyc2lzdGVuY2UucmVtb3ZlUGVyc2lzdGVuY2VVbml0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0c1NpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgbmV3IHBlcnNpc3RlbmNlIHVuaXQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSByZXNvdXJjZSBhbmQgCi0JCS8vIGNvbnRleHQKLQkJcGVyc2lzdGVuY2UucmVtb3ZlUGVyc2lzdGVuY2VVbml0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0c1NpemUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjZDQxYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSX0NMQVNTX05BTUUgPSAiSW5uZXJBbm5vdGF0aW9uVGVzdFR5cGUiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9JTk5FUl9DTEFTU19OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgVFlQRV9OQU1FICsgIi4iICsgSU5ORVJfQ0xBU1NfTkFNRTsKLQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBuYW1lcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIHRvIGRpZmZlcmVudCBuYW1lLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgbmFtZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldE5hbWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCkpOwotCQkKLQkJLy8gc2V0IG5hbWUgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldE5hbWUoIm5ld05hbWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IG5hbWVzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCkpOwotCQkKLQkJLy8gc2V0IG5hbWUgdG8gZGlmZmVyZW50IG5hbWUsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldE5hbWUoIm5ld05hbWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZSgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgbmFtZSB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCkpOwotCQkKLQkJLy8gc2V0IG5hbWUgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZSgibmV3TmFtZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHJhbnNhY3Rpb25UeXBlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIDEgLSBpbml0aWFsIHZhbHVlIGlzIGRlZmF1bHQKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0VHJhbnNhY3Rpb25UeXBlKCkpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JCQotCQkvLyAyIC0gc2V0IHZhbHVlLCBjb250ZXh0IGNoYW5nZWQKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFRyYW5zYWN0aW9uVHlwZShYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBKTsKLQkJCi0JCWFzc2VydEVxdWFscyhQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCkpOwotCQkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFRyYW5zYWN0aW9uVHlwZShYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIDMgLSB1bnNldCB2YWx1ZSwgY29udGV4dCBjaGFuZ2VkCi0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRUcmFuc2FjdGlvblR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gMSAtIGluaXRpYWwgdmFsdWUgaXMgZGVmYXVsdAotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIDIgLSBzZXQgY29udGV4dCB2YWx1ZSwgcmVzb3VyY2UgY2hhbmdlZAotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEEsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0VHJhbnNhY3Rpb25UeXBlKCkpOwotCQkKLQkJLy8gMyAtIHNldCBjb250ZXh0IHZhbHVlIHRvIGRlZmF1bHQsIHJlc291cmNlIHVuc2V0Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldFRyYW5zYWN0aW9uVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlc2NyaXB0aW9uKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBkZXNjcmlwdGlvbnMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCksIHBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCS8vIHNldCBkZXNjcmlwdGlvbiB0byBkaWZmZXJlbnQgZGVzY3JpcHRpb24sIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldERlc2NyaXB0aW9uKCJuZXdEZXNjcmlwdGlvbiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvLyBzZXQgZGVzY3JpcHRpb24gdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXREZXNjcmlwdGlvbigiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCksIHBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCS8vIHNldCBkZXNjcmlwdGlvbiB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXREZXNjcmlwdGlvbihudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSwgcGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCkpOwotCQkKLQkJLy8gc2V0IGRlc2NyaXB0aW9uIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldERlc2NyaXB0aW9uKCJuZXdEZXNjcmlwdGlvbiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlEZXNjcmlwdGlvbigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgZGVzY3JpcHRpb25zIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvLyBzZXQgZGVzY3JpcHRpb24gdG8gZGlmZmVyZW50IGRlc2NyaXB0aW9uLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXREZXNjcmlwdGlvbigibmV3RGVzY3JpcHRpb24iKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSwgcGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCkpOwotCQkKLQkJLy8gc2V0IGRlc2NyaXB0aW9uIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0RGVzY3JpcHRpb24oIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvLyBzZXQgZGVzY3JpcHRpb24gdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0RGVzY3JpcHRpb24obnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCksIHBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCS8vIHNldCBkZXNjcmlwdGlvbiBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXREZXNjcmlwdGlvbigibmV3RGVzY3JpcHRpb24iKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSwgcGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJvdmlkZXIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IHByb3ZpZGVycyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSwgcGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCkpOwotCQkKLQkJLy8gc2V0IHByb3ZpZGVyIHRvIGRpZmZlcmVudCBwcm92aWRlciwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvdmlkZXIoIm5ld1Byb3ZpZGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKLQkJCi0JCS8vIHNldCBwcm92aWRlciB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3ZpZGVyKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSwgcGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCkpOwotCQkKLQkJLy8gc2V0IHByb3ZpZGVyIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3ZpZGVyKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSk7Ci0JCQotCQkvLyBzZXQgcHJvdmlkZXIgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvdmlkZXIoIm5ld1Byb3ZpZGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByb3ZpZGVyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBwcm92aWRlcnMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKLQkJCi0JCS8vIHNldCBwcm92aWRlciB0byBkaWZmZXJlbnQgcHJvdmlkZXIsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFByb3ZpZGVyKCJuZXdQcm92aWRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSk7Ci0JCQotCQkvLyBzZXQgcHJvdmlkZXIgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm92aWRlcigiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKLQkJCi0JCS8vIHNldCBwcm92aWRlciB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm92aWRlcihudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSwgcGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCkpOwotCQkKLQkJLy8gc2V0IHByb3ZpZGVyIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFByb3ZpZGVyKCJuZXdQcm92aWRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKdGFEYXRhU291cmNlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBqdGFEYXRhU291cmNlcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBqdGFEYXRhU291cmNlIHRvIGRpZmZlcmVudCBqdGFEYXRhU291cmNlLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRKdGFEYXRhU291cmNlKCJuZXdKdGFEYXRhU291cmNlIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQganRhRGF0YVNvdXJjZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldEp0YURhdGFTb3VyY2UoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IGp0YURhdGFTb3VyY2UgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0SnRhRGF0YVNvdXJjZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBqdGFEYXRhU291cmNlIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldEp0YURhdGFTb3VyY2UoIm5ld0p0YURhdGFTb3VyY2UiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUp0YURhdGFTb3VyY2UoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IGp0YURhdGFTb3VyY2VzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IGp0YURhdGFTb3VyY2UgdG8gZGlmZmVyZW50IGp0YURhdGFTb3VyY2UsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldEp0YURhdGFTb3VyY2UoIm5ld0p0YURhdGFTb3VyY2UiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBqdGFEYXRhU291cmNlIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0SnRhRGF0YVNvdXJjZSgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQganRhRGF0YVNvdXJjZSB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRKdGFEYXRhU291cmNlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IGp0YURhdGFTb3VyY2UgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0SnRhRGF0YVNvdXJjZSgibmV3SnRhRGF0YVNvdXJjZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTm9uSnRhRGF0YVNvdXJjZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgbm9uSnRhRGF0YVNvdXJjZXMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQgbm9uSnRhRGF0YVNvdXJjZSB0byBkaWZmZXJlbnQgbm9uSnRhRGF0YVNvdXJjZSwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0Tm9uSnRhRGF0YVNvdXJjZSgibmV3Tm9uSnRhRGF0YVNvdXJjZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IG5vbkp0YURhdGFTb3VyY2UgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROb25KdGFEYXRhU291cmNlKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBub25KdGFEYXRhU291cmNlIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldE5vbkp0YURhdGFTb3VyY2UobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQgbm9uSnRhRGF0YVNvdXJjZSBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROb25KdGFEYXRhU291cmNlKCJuZXdOb25KdGFEYXRhU291cmNlIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOb25KdGFEYXRhU291cmNlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBub25KdGFEYXRhU291cmNlcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBub25KdGFEYXRhU291cmNlIHRvIGRpZmZlcmVudCBub25KdGFEYXRhU291cmNlLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXROb25KdGFEYXRhU291cmNlKCJuZXdOb25KdGFEYXRhU291cmNlIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQgbm9uSnRhRGF0YVNvdXJjZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldE5vbkp0YURhdGFTb3VyY2UoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IG5vbkp0YURhdGFTb3VyY2UgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0Tm9uSnRhRGF0YVNvdXJjZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBub25KdGFEYXRhU291cmNlIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldE5vbkp0YURhdGFTb3VyY2UoIm5ld05vbkp0YURhdGFTb3VyY2UiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUphckZpbGVSZWZzMSgpIHsKLQkJLy8gVE9ETwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSmFyRmlsZVJlZnMyKCkgewotCQkvLyBUT0RPCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJbXBsaWVkTWFwcGluZ0ZpbGVSZWYxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCB0aGVyZSBpcyBvbmUgaW5pdGlhbGx5Ci0JCU9ybVJlc291cmNlIG9ybVJlc291cmNlID0gb3JtUmVzb3VyY2UoKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZS5leGlzdHMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJCi0JCS8vIHJlbW92ZSBvcm0ueG1sCi0JCWRlbGV0ZVJlc291cmNlKG9ybVJlc291cmNlKTsKLQkJCi0JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlLmV4aXN0cygpKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSW1wbGllZE1hcHBpbmdGaWxlUmVmMigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQotCQlPcm1SZXNvdXJjZSBvcm1SZXNvdXJjZSA9IG9ybVJlc291cmNlKCk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UuZXhpc3RzKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCQotCQkvLyBhZGQgc3BlY2lmaWVkIG9ybS54bWwKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKCJNRVRBLUlORi9vcm0ueG1sIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZS5leGlzdHMoKSk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmczEoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGVyZSBhcmUgbm9uZSBpbml0aWFsbHkKLQkJYXNzZXJ0RXF1YWxzKDAsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKSk7Ci0JCQotCQkvLyBhZGQgbWFwcGluZyBmaWxlIHJlZiwgdGVzdCB0aGF0IGl0J3MgYWRkZWQgdG8gY29udGV4dAotCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoIm9ybS54bWwiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpKSk7Ci0JCQotCQkvLyBhZGQgYW5vdGhlciAuLi4KLQkJeG1sTWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKCJvcm0yLnhtbCIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbE1hcHBpbmdGaWxlUmVmKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmczIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIHR3byBtYXBwaW5nIGZpbGUgcmVmcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQl4bWxNYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZSgib3JtLnhtbCIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbE1hcHBpbmdGaWxlUmVmKTsKLQkJeG1sTWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKCJvcm0yLnhtbCIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbE1hcHBpbmdGaWxlUmVmKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuc2l6ZSgpLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSkpOwotCQkKLQkJLy8gcmVtb3ZlIG1hcHBpbmcgZmlsZSByZWYgZnJvbSB4bWwsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSBjb250ZXh0Ci0JCXhtbE1hcHBpbmdGaWxlUmVmID0geG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmdldCgwKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnJlbW92ZSh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5vdGhlciBvbmUgLi4uCi0JCXhtbE1hcHBpbmdGaWxlUmVmID0geG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmdldCgwKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnJlbW92ZSh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMxKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhlcmUgYXJlIG5vbmUgaW5pdGlhbGx5Ci0JCWFzc2VydEVxdWFscygwLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSkpOwotCQkKLQkJLy8gYWRkIG1hcHBpbmcgZmlsZSByZWYsIHRlc3QgdGhhdCBpdCdzIGFkZGVkIHRvIHJlc291cmNlCi0JCXBlcnNpc3RlbmNlVW5pdC5hZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZigpLnNldEZpbGVOYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuZ2V0KDApLmdldEZpbGVOYW1lKCkpOwotCQkKLQkJLy8gYWRkIGFub3RoZXIgLi4uCi0JCXBlcnNpc3RlbmNlVW5pdC5hZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZigpLnNldEZpbGVOYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuZ2V0KDApLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5nZXQoMSkuZ2V0RmlsZU5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JCQotCQkvLyBhZGQgYW5vdGhlciwgdGVzdGluZyBvcmRlcgotCQlwZXJzaXN0ZW5jZVVuaXQuYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoMCkuc2V0RmlsZU5hbWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmdldCgwKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuZ2V0KDEpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5nZXQoMikuZ2V0RmlsZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCB0d28gbWFwcGluZyBmaWxlIHJlZnMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoIm9ybS54bWwiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQl4bWxNYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZSgib3JtMi54bWwiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkpKTsKLQkJCi0JCS8vIHJlbW92ZSBtYXBwaW5nIGZpbGUgcmVmIGZyb20gY29udGV4dCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIHhtbAotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JCQkKLQkJLy8gcmVtb3ZlIGFub3RoZXIgb25lIC4uLgotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDbGFzc1JlZnMxKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhlcmUgYXJlIG5vbmUgaW5pdGlhbGx5Ci0JCWFzc2VydEVxdWFscygwLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBtYXBwaW5nIGZpbGUgcmVmLCB0ZXN0IHRoYXQgaXQncyBhZGRlZCB0byBjb250ZXh0Ci0JCVhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXIiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRDbGFzc1JlZnNTaXplKCkpOwotCQkKLQkJLy8gYWRkIGFub3RoZXIgLi4uCi0JCXhtbENsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJeG1sQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKCJjb20uZm9vLkJheiIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZCh4bWxDbGFzc1JlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZENsYXNzUmVmc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDbGFzc1JlZnMyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCB0d28gY2xhc3MgcmVmcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0Ci0JCVhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXIiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwotCQl4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXoiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRDbGFzc1JlZnMoKSkpOwotCQkKLQkJLy8gcmVtb3ZlIGNsYXNzIHJlZiBmcm9tIHhtbCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIGNvbnRleHQKLQkJeG1sQ2xhc3NSZWYgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmdldCgwKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5yZW1vdmUoeG1sQ2xhc3NSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRDbGFzc1JlZnMoKSkpOwotCQkKLQkJLy8gcmVtb3ZlIGFub3RoZXIgb25lIC4uLgotCQl4bWxDbGFzc1JlZiA9IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuZ2V0KDApOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnJlbW92ZSh4bWxDbGFzc1JlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZENsYXNzUmVmcygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDbGFzc1JlZnMxKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhlcmUgYXJlIG5vbmUgaW5pdGlhbGx5Ci0JCWFzc2VydEVxdWFscygwLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBjbGFzcyByZWYsIHRlc3QgdGhhdCBpdCdzIGFkZGVkIHRvIGNvbnRleHQKLQkJcGVyc2lzdGVuY2VVbml0LmFkZFNwZWNpZmllZENsYXNzUmVmKCkuc2V0Q2xhc3NOYW1lKCJGb28iKTsKLQkJCi0JCXRyeSB7Ci0JCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuZ2V0KDApLmdldEphdmFDbGFzcygpKTsKLQkKLQkJLy8gYWRkIGFub3RoZXIgLi4uCi0JCXBlcnNpc3RlbmNlVW5pdC5hZGRTcGVjaWZpZWRDbGFzc1JlZigpLnNldENsYXNzTmFtZSgiQmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuZ2V0KDApLmdldEphdmFDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmdldCgxKS5nZXRKYXZhQ2xhc3MoKSk7Ci0JCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuYWRkU3BlY2lmaWVkQ2xhc3NSZWYoMCkuc2V0Q2xhc3NOYW1lKCJCYXoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQmF6IiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5nZXQoMCkuZ2V0SmF2YUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuZ2V0KDEpLmdldEphdmFDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmdldCgyKS5nZXRKYXZhQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDbGFzc1JlZnMyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCB0d28gY2xhc3MgcmVmcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0Ci0JCVhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXIiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwotCQl4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXoiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRDbGFzc1JlZnMoKSkpOwotCQkKLQkJLy8gcmVtb3ZlIGNsYXNzIHJlZiBmcm9tIGNvbnRleHQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSB4bWwKLQkJcGVyc2lzdGVuY2VVbml0LnJlbW92ZVNwZWNpZmllZENsYXNzUmVmKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuc2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm90aGVyIG9uZSAuLi4KLQkJcGVyc2lzdGVuY2VVbml0LnJlbW92ZVNwZWNpZmllZENsYXNzUmVmKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wbGllZENsYXNzUmVmcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFBlcnNpc3RlbnRJbm5lckNsYXNzKCk7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgY2xhc3NSZWZzLm5leHQoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSwgY2xhc3NSZWZzLm5leHQoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQlqcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsKLQkJY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgY2xhc3NSZWZzLm5leHQoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSwgY2xhc3NSZWZzLm5leHQoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUsIGNsYXNzUmVmcy5uZXh0KCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRGYWxzZShjbGFzc1JlZnMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlyZW1vdmVYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgY2xhc3NSZWZzLm5leHQoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSwgY2xhc3NSZWZzLm5leHQoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUsIGNsYXNzUmVmcy5uZXh0KCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRGYWxzZShjbGFzc1JlZnMuaGFzTmV4dCgpKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9JTk5FUl9DTEFTU19OQU1FKTsKLQkJY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOwotCQlhc3NlcnRGYWxzZShjbGFzc1JlZnMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlbW92ZVhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9JTk5FUl9DTEFTU19OQU1FKTsKLQkJY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUsIGNsYXNzUmVmcy5uZXh0KCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRGYWxzZShjbGFzc1JlZnMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSk7Ci0JCWNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKTsKLQkJYXNzZXJ0RmFsc2UoY2xhc3NSZWZzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIDEgLSBpbml0aWFsIHZhbHVlIGlzIGRlZmF1bHQKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmlzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJCi0JCS8vIDIgLSBzZXQgdmFsdWUsIGNvbnRleHQgY2hhbmdlZAotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0LmlzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmlzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQkKLQkJLy8gMyAtIHVuc2V0IHZhbHVlLCBjb250ZXh0IGNoYW5nZWQKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXQuaXNFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyAxIC0gaW5pdGlhbCB2YWx1ZSBpcyBkZWZhdWx0Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdC5pc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCQotCQkvLyAyIC0gc2V0IHZhbHVlLCByZXNvdXJjZSBjaGFuZ2VkCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXQuaXNFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXQuaXNFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCQotCQkvLyAzIC0gc2V0IGNvbnRleHQgdG8gZGVmYXVsdCwgcmVzb3VyY2UgdW5zZXQKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXQuaXNFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJvcGVydGllczEoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGVyZSBhcmUgbm9uZSBpbml0aWFsbHkKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzKCkpKTsKLQkJCi0JCS8vIGFkZCAicHJvcGVydGllcyIsIHRlc3QgdGhhdCB0aGVyZSdzIG5vIHJlYWwgY2hhbmdlIHRvIGNvbnRleHQKLQkJWG1sUHJvcGVydGllcyB4bWxQcm9wZXJ0aWVzID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0aWVzKCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0aWVzKHhtbFByb3BlcnRpZXMpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXMoKSkpOwotCQkKLQkJLy8gYWRkIHByb3BlcnR5LCB0ZXN0IHRoYXQgaXQncyBhZGRlZCB0byBjb250ZXh0Ci0JCVhtbFByb3BlcnR5IHhtbFByb3BlcnR5ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0eSgpOwotCQl4bWxQcm9wZXJ0eS5zZXROYW1lKCJmb28iKTsKLQkJeG1sUHJvcGVydHkuc2V0VmFsdWUoImJhciIpOwotCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5hZGQoeG1sUHJvcGVydHkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzKCkpKTsKLQkJCi0JCS8vIGFkZCBhbm90aGVyIC4uLgotCQl4bWxQcm9wZXJ0eSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydHkoKTsKLQkJeG1sUHJvcGVydHkuc2V0TmFtZSgiRk9PIik7Ci0JCXhtbFByb3BlcnR5LnNldFZhbHVlKCJCQVIiKTsKLQkJeG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuYWRkKHhtbFByb3BlcnR5KTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllcygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcm9wZXJ0aWVzMigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyBhZGQgdHdvIHByb3BlcnRpZXMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnRpZXMoeG1sUHJvcGVydGllcyk7Ci0JCVhtbFByb3BlcnR5IHhtbFByb3BlcnR5ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0eSgpOwotCQl4bWxQcm9wZXJ0eS5zZXROYW1lKCJmb28iKTsKLQkJeG1sUHJvcGVydHkuc2V0VmFsdWUoImJhciIpOwotCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5hZGQoeG1sUHJvcGVydHkpOwotCQl4bWxQcm9wZXJ0eSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydHkoKTsKLQkJeG1sUHJvcGVydHkuc2V0TmFtZSgiRk9PIik7Ci0JCXhtbFByb3BlcnR5LnNldFZhbHVlKCJCQVIiKTsKLQkJeG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuYWRkKHhtbFByb3BlcnR5KTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXMoKSkpOwotCQkKLQkJLy8gcmVtb3ZlIHByb3BlcnR5IGZyb20geG1sLCB0ZXN0IHRoYXQgaXQncyByZW1vdmVkIGZyb20gY29udGV4dAotCQl4bWxQcm9wZXJ0eSA9IHhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldCgwKTsKLQkJeG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKHhtbFByb3BlcnR5KTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllcygpKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5vdGhlciBvbmUgLi4uCi0JCXhtbFByb3BlcnR5ID0geG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KDApOwotCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoeG1sUHJvcGVydHkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByb3BlcnRpZXMxKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhlcmUgYXJlIG5vbmUgaW5pdGlhbGx5Ci0JCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllc1NpemUoKSk7Ci0JCQotCQkvLyBhZGQgcHJvcGVydHksIHRlc3QgdGhhdCBpdCdzIGFkZGVkIHRvIHJlc291cmNlCi0JCXBlcnNpc3RlbmNlVW5pdC5hZGRQcm9wZXJ0eSgpLnNldE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQkvLyBhZGQgYW5vdGhlciAuLi4KLQkJcGVyc2lzdGVuY2VVbml0LmFkZFByb3BlcnR5KCkuc2V0TmFtZSgiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQkvLyBhZGQgYW5vdGhlciB0ZXN0aW5nIG9yZGVyCi0JCXBlcnNpc3RlbmNlVW5pdC5hZGRQcm9wZXJ0eSgwKS5zZXROYW1lKCJiYXoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJvcGVydGllczIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIHR3byBwcm9wZXJ0aWVzIGFuZCB0ZXN0IHRoYXQgdGhlcmUgYXJlIHR3byBleGlzdGluZyBpbiB4bWwgYW5kIGNvbnRleHQKLQkJWG1sUHJvcGVydGllcyB4bWxQcm9wZXJ0aWVzID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0aWVzKCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0aWVzKHhtbFByb3BlcnRpZXMpOwotCQlYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydHkoKTsKLQkJeG1sUHJvcGVydHkuc2V0TmFtZSgiZm9vIik7Ci0JCXhtbFByb3BlcnR5LnNldFZhbHVlKCJiYXIiKTsKLQkJeG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuYWRkKHhtbFByb3BlcnR5KTsKLQkJeG1sUHJvcGVydHkgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCk7Ci0JCXhtbFByb3BlcnR5LnNldE5hbWUoIkZPTyIpOwotCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSgiQkFSIik7Ci0JCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzKCkpKTsKLQkJCi0JCS8vIHJlbW92ZSBwcm9wZXJ0eSBmcm9tIGNvbnRleHQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSByZXNvdXJjZQotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlUHJvcGVydHkoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5vdGhlciBvbmUuICB0ZXN0IHRoYXQgcHJvcGVydGllcyBvYmplY3QgaXMgbnVsbGVkCi0JCXBlcnNpc3RlbmNlVW5pdC5yZW1vdmVQcm9wZXJ0eSgiRk9PIiwgIkJBUiIpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByb3BlcnRpZXMzKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCB0d28gcHJvcGVydGllcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0Ci0JCXBlcnNpc3RlbmNlVW5pdC5wdXRQcm9wZXJ0eSgiZm9vIiwgImJhciIsIGZhbHNlKTsKLQkJcGVyc2lzdGVuY2VVbml0LnB1dFByb3BlcnR5KCJGT08iLCAiQkFSIiwgZmFsc2UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllcygpKSk7Ci0JCQotCQkvLyByZW1vdmUgcHJvcGVydHkgZnJvbSBjb250ZXh0LCB0ZXN0IHRoYXQgaXQncyByZW1vdmVkIGZyb20gcmVzb3VyY2UKLQkJcGVyc2lzdGVuY2VVbml0LnJlbW92ZVByb3BlcnR5KCJmb28iLCAiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm90aGVyIG9uZSwgdGVzdCB0aGF0IHByb3BlcnRpZXMgb2JqZWN0IGlzIG51bGxlZAotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlUHJvcGVydHkoIkZPTyIpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByb3BlcnRpZXM0KCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCB0d28gcHJvcGVydGllcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0Ci0JCXBlcnNpc3RlbmNlVW5pdC5wdXRQcm9wZXJ0eSgiZm9vIiwgImJhciIsIGZhbHNlKTsKLQkJcGVyc2lzdGVuY2VVbml0LnB1dFByb3BlcnR5KCJGT08iLCAiQkFSIiwgZmFsc2UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllc1NpemUoKSk7Ci0JCQotCQkvLyBtb2RpZnkgYSBwcm9wZXJ0eSwgdGVzdCBpdHMgdmFsdWUKLQkJcGVyc2lzdGVuY2VVbml0LnB1dFByb3BlcnR5KCJmb28iLCAiIiwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0eSgiZm9vIikuZ2V0VmFsdWUoKSk7Ci0KLQkJcGVyc2lzdGVuY2VVbml0LnB1dFByb3BlcnR5KCJmb28iLCAiQkFSIiwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0eSgiZm9vIikuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgcHJvcGVydHkgdGhhdCBkb2Vzbid0IGZyb20gY29udGV4dCwgdGVzdCB0aGF0IHRoZSByZXNvdXJjZSBpcyB1bmNoYW5nZWQKLQkJcGVyc2lzdGVuY2VVbml0LnJlbW92ZVByb3BlcnR5KCJub3RFeGlzdCIpOwotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBwcm9wZXJ0eSBmcm9tIGNvbnRleHQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSByZXNvdXJjZQotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlUHJvcGVydHkoIkZPTyIpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0eSgiRk9PIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQotCQkvLyByZW1vdmUgYnkgc2V0dGluZyB2YWx1ZSB0byBudWxsLCB0ZXN0IHRoYXQgcHJvcGVydGllcyBvYmplY3QgaXMgbnVsbGVkCi0JCXBlcnNpc3RlbmNlVW5pdC5wdXRQcm9wZXJ0eSgibm90RXhpc3QiLCBudWxsLCBmYWxzZSk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJub3RFeGlzdCIpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQucHV0UHJvcGVydHkoImZvbyIsIG51bGwsIGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoImZvbyIpKTsKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByb3BlcnRpZXM1KCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3RpbmcgZHVwbGljYXRlIGtleXMsIGFkZCBmb3VyIHByb3BlcnRpZXMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgZm91ciBleGlzdGluZyBpbiB4bWwgYW5kIGNvbnRleHQKLQkJcGVyc2lzdGVuY2VVbml0LnB1dFByb3BlcnR5KCJGT08iLCAiQkFSIiwgZmFsc2UpOwotCQlwZXJzaXN0ZW5jZVVuaXQucHV0UHJvcGVydHkoImZvbyIsICJiYXIgMyIsIHRydWUpOwotCQlwZXJzaXN0ZW5jZVVuaXQucHV0UHJvcGVydHkoImZvbyIsICJiYXIgMiIsIHRydWUpOwotCQlwZXJzaXN0ZW5jZVVuaXQucHV0UHJvcGVydHkoImZvbyIsICJiYXIgMSIsIHRydWUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllcygpKSk7Ci0JCQotCQkvLyBtb2RpZnkgYSBwcm9wZXJ0eSwgdGVzdCBpdHMgdmFsdWUKLQkJcGVyc2lzdGVuY2VVbml0LnJlcGxhY2VQcm9wZXJ0eVZhbHVlKCJmb28iLCAiYmFyIDIiLCAiYmFyIHR3byIpOwotCQkKLQkJUHJvcGVydHkgcHJvcGVydHkgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoImZvbyIsICJiYXIgdHdvIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIHR3byIsIHByb3BlcnR5LmdldFZhbHVlKCkpOwotCi0JCS8vIHJlbW92ZSBhIHByb3BlcnR5LCB0ZXN0IHRoYXQgdGhlcmUgYXJlIGZvdXIgZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0Ci0JCXBlcnNpc3RlbmNlVW5pdC5yZW1vdmVQcm9wZXJ0eSgiZm9vIiwgImJhciAxIik7Ci0JCWFzc2VydEVxdWFscygzLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzUHJvcGVydHkoKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCB0d28gcHJvcGVydGllcyBhbmQgdHJ5IHRvIGFjY2VzcyBpdC4KLQkJcGVyc2lzdGVuY2VVbml0LnB1dFByb3BlcnR5KCJmb28iLCAiYmFyIiwgZmFsc2UpOwotCQlwZXJzaXN0ZW5jZVVuaXQucHV0UHJvcGVydHkoIkZPTyIsICJCQVIiLCBmYWxzZSk7Ci0JCQotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0eSgiZm9vIik7Ci0JCWFzc2VydE5vdE51bGwocHJvcGVydHkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHByb3BlcnR5LmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdC5jb250YWluc1Byb3BlcnR5KCJGT08iKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJGT08iKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoIm5vdEV4aXN0IikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJvcGVydHlOYW1lKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCBwcm9wZXJ0eSBmb3IgdGVzdGluZwotCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnRpZXMoeG1sUHJvcGVydGllcyk7Ci0JCVhtbFByb3BlcnR5IHhtbFByb3BlcnR5ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0eSgpOwotCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5hZGQoeG1sUHJvcGVydHkpOwotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzKCkubmV4dCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IG5hbWVzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIHRvIGRpZmZlcmVudCBuYW1lLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFByb3BlcnR5LnNldE5hbWUoIm5ld05hbWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5LmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgbmFtZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUHJvcGVydHkuc2V0TmFtZSgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0TmFtZSgpLCBwcm9wZXJ0eS5nZXROYW1lKCkpOwotCQkKLQkJLy8gc2V0IG5hbWUgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxQcm9wZXJ0eS5zZXROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUHJvcGVydHkuc2V0TmFtZSgibmV3TmFtZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByb3BlcnR5VmFsdWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIHByb3BlcnR5IGZvciB0ZXN0aW5nCi0JCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydGllcygpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydGllcyh4bWxQcm9wZXJ0aWVzKTsKLQkJWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCk7Ci0JCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7Ci0JCVByb3BlcnR5IHByb3BlcnR5ID0gcGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXMoKS5uZXh0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgdmFsdWVzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldFZhbHVlKCksIHByb3BlcnR5LmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHZhbHVlIHRvIGRpZmZlcmVudCB2YWx1ZSwgdGVzdCBlcXVhbGl0eQotCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSgibmV3VmFsdWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQcm9wZXJ0eS5nZXRWYWx1ZSgpLCBwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB2YWx1ZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUHJvcGVydHkuc2V0VmFsdWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldFZhbHVlKCksIHByb3BlcnR5LmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHZhbHVlIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUHJvcGVydHkuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0VmFsdWUoKSwgcHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgdmFsdWUgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSgibmV3VmFsdWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQcm9wZXJ0eS5nZXRWYWx1ZSgpLCBwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlT3JtWG1sRmlsZSgpOwkJCi0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsJCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgcGVyc2lzdGVuY2VVbml0LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7CQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3JtWG1sRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhQZXJzaXN0ZW50SW5uZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRNZW1iZXJUeXBlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgIiArIElOTkVSX0NMQVNTX05BTUUgKyAiIHt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJLy9wZXJzaXN0ZW50VHlwZSBub3QgbGlzdGVkIGluIHBlcnNpc3RlbmNlLnhtbCBhbmQgZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzIGlzIGZhbHNlCi0JCS8vc3RpbGwgZmluZCB0aGUgcGVyc2lzdGVudFR5cGUgYmVjYXVzZSBvZiBjaGFuZ2VzIGZvciBidWcgMTkwMzE3Ci0JCWFzc2VydEZhbHNlKGpwYVByb2plY3QoKS5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JCQotCQkvL3Rlc3QgcGVyc2lzdGVudFR5cGUgbm90IGxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwsIGRpc2NvdmVyIGFubm90YXRlZCBjbGFzc2VzIHNldCB0byB0cnVlCi0JCWpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKHRydWUpOwkKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQkKLQkJLy90ZXN0IHBlcnNpc3RlbnRUeXBlIGxpc3QgYXMgY2xhc3MgaW4gcGVyc2lzdGVuY2UueG1sCi0JCWpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGZhbHNlKTsKLQkJWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJY2xhc3NSZWYuc2V0SmF2YUNsYXNzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRDbGFzc2VzKCkuYWRkKGNsYXNzUmVmKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCi0JCQotCQkvL3Rlc3QgcGVyc2lzdGVudFR5cGUgZnJvbSBvcm0ueG1sIGZpbGUgdGhhdCBpcyBzcGVjaWZpZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCQljcmVhdGVPcm1YbWxGaWxlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZSgibW9kZWwuRm9vIikpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGUsIHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZSgibW9kZWwuRm9vIikpOwotCi0JCS8vdGVzdCBwZXJzaXN0ZW50VHlwZSBmcm9tIG9ybS54bWwgZmlsZSB0aGF0IGlzIGltcGxpZWQobm90IHNwZWNpZmllZCkgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKCJtb2RlbC5Gb28iKSk7Ci0JfQotCQotLy9UT0RPCi0vLwlTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpOwotLy8JU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCk7Ci0vLwlBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKTsKLS8vCWJvb2xlYW4gZ2V0RGVmYXVsdENhc2NhZGVQZXJzaXN0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDNmN2YyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbFRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sKCkgewotCQlyZXR1cm4gcm9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQWRkUGVyc2lzdGVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZSBwcm0gPSBwZXJzaXN0ZW5jZVJlc291cmNlKCk7Ci0JCXBybS5nZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCXBybS5zYXZlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkpOwotCQkKLQkJcHJtLmdldENvbnRlbnRzKCkuYWRkKFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2UoKSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5QWRkUGVyc2lzdGVuY2UoKSB7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcHJtID0gcGVyc2lzdGVuY2VSZXNvdXJjZSgpOwotCQlwcm0uZ2V0Q29udGVudHMoKS5yZW1vdmUocHJtLmdldFBlcnNpc3RlbmNlKCkpOwotCQlhc3NlcnROdWxsKHBybS5nZXRQZXJzaXN0ZW5jZSgpKTsKLQkJCi0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0gcGVyc2lzdGVuY2VYbWwoKTsKLQkJCi0JCXBlcnNpc3RlbmNlWG1sLmFkZFBlcnNpc3RlbmNlKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCkpOwotCQkKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXBlcnNpc3RlbmNlWG1sLmFkZFBlcnNpc3RlbmNlKCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlbW92ZVBlcnNpc3RlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcHJtID0gcGVyc2lzdGVuY2VSZXNvdXJjZSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkpOwotCQkKLQkJcHJtLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCi0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlbW92ZVBlcnNpc3RlbmNlKCkgewotCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IHBlcnNpc3RlbmNlWG1sKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VYbWwucmVtb3ZlUGVyc2lzdGVuY2UoKTsKLQkJCi0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKSk7Ci0JCQotCQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJcGVyc2lzdGVuY2VYbWwucmVtb3ZlUGVyc2lzdGVuY2UoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9Sb290Q29udGV4dFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUm9vdENvbnRleHRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTcxOTA4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9Sb290Q29udGV4dFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUm9vdENvbnRleHRUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIFJvb3RDb250ZXh0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBZGRQZXJzaXN0ZW5jZVhtbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVJlc291cmNlIHByID0gcGVyc2lzdGVuY2VSZXNvdXJjZSgpOwotCQlkZWxldGVSZXNvdXJjZShwcik7Ci0JCQotCQlhc3NlcnRGYWxzZShwci5leGlzdHMoKSk7Ci0JCQotCQlKcGFSb290Q29udGV4dE5vZGUgYmFzZUpwYUNvbnRlbnQgPSBnZXRKYXZhUHJvamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRSb290Q29udGV4dCgpOwotCQlhc3NlcnROdWxsKGJhc2VKcGFDb250ZW50LmdldFBlcnNpc3RlbmNlWG1sKCkpOwotCQkKLQkJYmFzZUpwYUNvbnRlbnQuYWRkUGVyc2lzdGVuY2VYbWwoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYmFzZUpwYUNvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKSk7Ci0JCQotCQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJYmFzZUpwYUNvbnRlbnQuYWRkUGVyc2lzdGVuY2VYbWwoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVtb3ZlUGVyc2lzdGVuY2VYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhUm9vdENvbnRleHROb2RlIGJhc2VKcGFDb250ZW50ID0gZ2V0SmF2YVByb2plY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHQoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYmFzZUpwYUNvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKSk7Ci0JCQotCQliYXNlSnBhQ29udGVudC5yZW1vdmVQZXJzaXN0ZW5jZVhtbCgpOwotCQl3YWl0Rm9yV29ya3NwYWNlSm9icygpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNlSnBhQ29udGVudC5nZXRQZXJzaXN0ZW5jZVhtbCgpKTsKLQkJCi0JCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQliYXNlSnBhQ29udGVudC5yZW1vdmVQZXJzaXN0ZW5jZVhtbCgpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBZGRQZXJzaXN0ZW5jZVhtbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVJlc291cmNlIHByID0gcGVyc2lzdGVuY2VSZXNvdXJjZSgpOwotCQlkZWxldGVSZXNvdXJjZShwcik7Ci0JCQotCQlhc3NlcnRGYWxzZShwci5leGlzdHMoKSk7Ci0JCQotCQlKcGFSb290Q29udGV4dE5vZGUgYmFzZUpwYUNvbnRlbnQgPSBnZXRKYXZhUHJvamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRSb290Q29udGV4dCgpOwotCQlhc3NlcnROdWxsKGJhc2VKcGFDb250ZW50LmdldFBlcnNpc3RlbmNlWG1sKCkpOwotCQkKLQkJcHIuZ2V0Q29udGVudHMoKS5hZGQoUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZSgpKTsKLQkJcHIuc2F2ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChiYXNlSnBhQ29udGVudC5nZXRQZXJzaXN0ZW5jZVhtbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlbW92ZVBlcnNpc3RlbmNlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcHIgPSBwZXJzaXN0ZW5jZVJlc291cmNlKCk7Ci0JCUpwYVJvb3RDb250ZXh0Tm9kZSBiYXNlSnBhQ29udGVudCA9IGdldEphdmFQcm9qZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFJvb3RDb250ZXh0KCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGJhc2VKcGFDb250ZW50LmdldFBlcnNpc3RlbmNlWG1sKCkpOwotCQkKLQkJZGVsZXRlUmVzb3VyY2UocHIpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNlSnBhQ29udGVudC5nZXRQZXJzaXN0ZW5jZVhtbCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL21vZGVsL0pwYU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnBhTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTYxOTVlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnBhTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLlByb2plY3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0UGxhdGZvcm1Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBKcGFNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqIGNhcnJpYWdlIHJldHVybiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0JcHVibGljIEpwYU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJaWYgKHRoaXMuZGVidWcoKSkgewotCQkJdGhpcy5wcmludE5hbWUoKTsKLQkJfQotCQlQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZygpIHsKLQkJQm9vbGVhbiBkZWJ1ZyA9IChCb29sZWFuKSBDbGFzc1Rvb2xzLnN0YXRpY0ZpZWxkVmFsdWUoSnBhTW9kZWxNYW5hZ2VyLmNsYXNzLCAiREVCVUciKTsKLQkJcmV0dXJuIGRlYnVnLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJdGhpcy5wcmludE5hbWVCb3JkZXIobmFtZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lKTsKLQkJdGhpcy5wcmludE5hbWVCb3JkZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50TmFtZUJvcmRlcihTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gbmFtZS5sZW5ndGgoKTsgaS0tID4gMDsgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCc9Jyk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQkvKiogCi0JICogQnVpbGRzIGEgcHJvamVjdCB3aXRoIHRoZSBqYXZhIGFuZCB1dGlsaXR5IGZhY2V0cyBpbnN0YWxsZWQsIGFuZCB3aXRoCi0JICogcHJlLWV4aXN0aW5nIGVudGl0aWVzIGFkZGVkLgotCSAqLwotCXByaXZhdGUgVGVzdEZhY2V0ZWRQcm9qZWN0IGJ1aWxkVGVzdFByb2plY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEZhY2V0ZWRQcm9qZWN0IHRlc3RQcm9qZWN0ID0gVGVzdEZhY2V0ZWRQcm9qZWN0LmJ1aWxkRmFjZXRlZFByb2plY3QoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSwgdHJ1ZSk7Ci0JCXRlc3RQcm9qZWN0Lmluc3RhbGxGYWNldCgianN0LmphdmEiLCAiNS4wIik7Ci0JCXRlc3RQcm9qZWN0Lmluc3RhbGxGYWNldCgianN0LnV0aWxpdHkiLCAiMS4wIik7Ci0JCXRlc3RQcm9qZWN0LmNyZWF0ZUZpbGUoCi0JCQluZXcgUGF0aCgic3JjL3Rlc3QucGtnL1Rlc3RFbnRpdHkuamF2YSIpLAotCQkJInBhY2thZ2UgdGVzdC5wa2c7IEBFbnRpdHkgcHVibGljIGNsYXNzIFRlc3RFbnRpdHkge30iKTsKLQkJdGVzdFByb2plY3QuY3JlYXRlRmlsZSgKLQkJCW5ldyBQYXRoKCJzcmMvdGVzdC5wa2cvVGVzdEVudGl0eTIuamF2YSIpLAotCQkJInBhY2thZ2UgdGVzdC5wa2c7IEBFbnRpdHkgcHVibGljIGNsYXNzIFRlc3RFbnRpdHkyIHt9Iik7Ci0JCXJldHVybiB0ZXN0UHJvamVjdDsKLQl9CQotCi0JcHJpdmF0ZSBJRmlsZSBmaWxlKFRlc3RQbGF0Zm9ybVByb2plY3QgcCwgU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIHAuZ2V0UHJvamVjdCgpLmdldEZpbGUobmV3IFBhdGgocGF0aCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKcGFNb2RlbCgpIHsKLQkJYXNzZXJ0Tm90TnVsbChKcHRDb3JlUGx1Z2luLmdldEpwYU1vZGVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGYWNldEluc3RhbGxVbmluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEZhY2V0ZWRQcm9qZWN0IHRlc3RQcm9qZWN0ID0gdGhpcy5idWlsZFRlc3RQcm9qZWN0KCk7Ci0JCWFzc2VydE51bGwoSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSkpOwotCi0JCXRlc3RQcm9qZWN0Lmluc3RhbGxGYWNldCgianB0LmpwYSIsICIxLjAiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEpwdENvcmVQbHVnaW4uZ2V0SnBhTW9kZWwoKS5qcGFQcm9qZWN0c1NpemUoKSk7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotLy8JCWFzc2VydEVxdWFscyg0LCBqcGFQcm9qZWN0LmpwYUZpbGVzU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5maWxlKHRlc3RQcm9qZWN0LCAic3JjL3Rlc3QucGtnL1Rlc3RFbnRpdHkuamF2YSIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy90ZXN0LnBrZy9UZXN0RW50aXR5Mi5qYXZhIikpKTsKLQkJLy8gcGVyc2lzdGVuY2UueG1sIGFuZCBvcm0ueG1sIGFyZSBjcmVhdGVkIGluIHRoZSBiYWNrZ3JvdW5kLCBzbyB0aGV5IHByb2JhYmx5Ci0JCS8vIHdvbid0IGJlIHRoZXJlIHlldC4uLgotLy8JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5qcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiKSkpOwotLy8JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5qcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKLQotCQl0ZXN0UHJvamVjdC51bmluc3RhbGxGYWNldCgianB0LmpwYSIsICIxLjAiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEpwdENvcmVQbHVnaW4uZ2V0SnBhTW9kZWwoKS5qcGFQcm9qZWN0c1NpemUoKSk7Ci0JCWpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0TnVsbChqcGFQcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdENsb3NlUmVvcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RGYWNldGVkUHJvamVjdCB0ZXN0UHJvamVjdCA9IHRoaXMuYnVpbGRUZXN0UHJvamVjdCgpOwotCQl0ZXN0UHJvamVjdC5pbnN0YWxsRmFjZXQoImpwdC5qcGEiLCAiMS4wIik7Ci0KLQkJdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmNsb3NlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuaXNPcGVuKCkpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0TnVsbChqcGFQcm9qZWN0KTsKLQotCQl0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkub3BlbihudWxsKTsKLQkJanBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotLy8JCWFzc2VydEVxdWFscyg0LCBqcGFQcm9qZWN0LmpwYUZpbGVzU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5maWxlKHRlc3RQcm9qZWN0LCAic3JjL3Rlc3QucGtnL1Rlc3RFbnRpdHkuamF2YSIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy90ZXN0LnBrZy9UZXN0RW50aXR5Mi5qYXZhIikpKTsKLQkJLy8gcGVyc2lzdGVuY2UueG1sIGFuZCBvcm0ueG1sIGFyZSBjcmVhdGVkIGluIHRoZSBiYWNrZ3JvdW5kLCBzbyB0aGV5IHByb2JhYmx5Ci0JCS8vIHdvbid0IGJlIHRoZXJlIHlldC4uLgotLy8JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5qcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiKSkpOwotLy8JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5qcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdERlbGV0ZVJlaW1wb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RGYWNldGVkUHJvamVjdCB0ZXN0UHJvamVjdCA9IHRoaXMuYnVpbGRUZXN0UHJvamVjdCgpOwotCQl0ZXN0UHJvamVjdC5pbnN0YWxsRmFjZXQoImpwdC5qcGEiLCAiMS4wIik7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQlhc3NlcnRFcXVhbHMoMSwgSnB0Q29yZVBsdWdpbi5nZXRKcGFNb2RlbCgpLmpwYVByb2plY3RzU2l6ZSgpKTsKLQotCQl0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKGZhbHNlLCB0cnVlLCBudWxsKTsKLQkJanBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnROdWxsKGpwYVByb2plY3QpOwotCQlhc3NlcnRFcXVhbHMoMCwgSnB0Q29yZVBsdWdpbi5nZXRKcGFNb2RlbCgpLmpwYVByb2plY3RzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKS5sZW5ndGgpOwotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMSwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpLmxlbmd0aCk7Ci0JCXByb2plY3Qub3BlbihudWxsKTsKLQotCQlhc3NlcnRUcnVlKHByb2plY3QuaXNPcGVuKCkpOwotCQlhc3NlcnRUcnVlKEpwdENvcmVQbHVnaW4ucHJvamVjdEhhc0pwYUZhY2V0KHByb2plY3QpKTsKLQkJanBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLS8vCQlhc3NlcnRFcXVhbHMoNCwganBhUHJvamVjdC5qcGFGaWxlc1NpemUoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy90ZXN0LnBrZy9UZXN0RW50aXR5LmphdmEiKSkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmZpbGUodGVzdFByb2plY3QsICJzcmMvdGVzdC5wa2cvVGVzdEVudGl0eTIuamF2YSIpKSk7Ci0JCS8vIHBlcnNpc3RlbmNlLnhtbCBhbmQgb3JtLnhtbCBhcmUgY3JlYXRlZCBpbiB0aGUgYmFja2dyb3VuZCwgc28gdGhleSBwcm9iYWJseQotCQkvLyB3b24ndCBiZSB0aGVyZSB5ZXQuLi4KLS8vCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuanBhRmlsZSh0aGlzLmZpbGUodGVzdFByb2plY3QsICJzcmMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIikpKTsKLS8vCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuanBhRmlsZSh0aGlzLmZpbGUodGVzdFByb2plY3QsICJzcmMvTUVUQS1JTkYvb3JtLnhtbCIpKSk7Ci0JfQotCi0JLy9UT0RPIC0gQ29tbWVudGVkIG91dCB0aGlzIHRlc3QsIHNpbmNlIGl0IHdhcyBmYWlsaW5nIGluIHRoZSBJLUJ1aWxkIGFuZCB3ZSdyZSBub3Qgc3VyZSB3aHkuCi0JLy9TZWUgYnVnIDIyMTc1NwotLy8JcHVibGljIHZvaWQgdGVzdEVkaXRGYWNldFNldHRpbmdzRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCVRlc3RGYWNldGVkUHJvamVjdCB0ZXN0UHJvamVjdCA9IHRoaXMuYnVpbGRUZXN0UHJvamVjdCgpOwotLy8JCWFzc2VydE51bGwoSnB0Q29yZVBsdWdpbi5qcGFQcm9qZWN0KHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSkpOwotLy8KLS8vCQkvLyBhZGQgdGhlIEpQQSBmYWNldCBieSBtb2RpZnlpbmcgdGhlIGZhY2V0IHNldHRpbmdzIGZpbGUgZGlyZWN0bHkKLS8vCQlJRmlsZSBmYWNldFNldHRpbmdzRmlsZSA9IHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwiKTsKLS8vCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZhY2V0U2V0dGluZ3NGaWxlLmdldENvbnRlbnRzKCkpOwotLy8JCWludCBmaWxlU2l6ZSA9IGluU3RyZWFtLmF2YWlsYWJsZSgpOwotLy8JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtmaWxlU2l6ZV07Ci0vLwkJaW5TdHJlYW0ucmVhZChidWYpOwotLy8JCWluU3RyZWFtLmNsb3NlKCk7Ci0vLwotLy8JCVN0cmluZyBvbGREb2N1bWVudCA9IG5ldyBTdHJpbmcoYnVmKTsKLS8vCQlTdHJpbmcgb2xkU3RyaW5nID0gIjxpbnN0YWxsZWQgZmFjZXQ9XCJqc3QudXRpbGl0eVwiIHZlcnNpb249XCIxLjBcIi8+IjsKLS8vCQlTdHJpbmcgbmV3U3RyaW5nID0gb2xkU3RyaW5nICsgQ1IgKyAiICAiICsgIjxpbnN0YWxsZWQgZmFjZXQ9XCJqcHQuanBhXCIgdmVyc2lvbj1cIjEuMFwiLz4iOwotLy8JCVN0cmluZyBuZXdEb2N1bWVudCA9IG9sZERvY3VtZW50LnJlcGxhY2VBbGwob2xkU3RyaW5nLCBuZXdTdHJpbmcpOwotLy8KLS8vCQlmYWNldFNldHRpbmdzRmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3RG9jdW1lbnQuZ2V0Qnl0ZXMoKSksIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0vLwotLy8JCWFzc2VydEVxdWFscygxLCBKcHRDb3JlUGx1Z2luLmpwYU1vZGVsKCkuanBhUHJvamVjdHNTaXplKCkpOwotLy8JCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uanBhUHJvamVjdCh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOwotLy8JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0vLwkJLy8gcGVyc2lzdGVuY2UueG1sIGFuZCBvcm0ueG1sIGRvIG5vdCBnZXQgY3JlYXRlZCBpbiB0aGlzIHNpdHVhdGlvbiAoPykKLS8vCQlhc3NlcnRFcXVhbHMoMiwganBhUHJvamVjdC5qcGFGaWxlc1NpemUoKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmpwYUZpbGUodGhpcy5maWxlKHRlc3RQcm9qZWN0LCAic3JjL3Rlc3QucGtnL1Rlc3RFbnRpdHkuamF2YSIpKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmpwYUZpbGUodGhpcy5maWxlKHRlc3RQcm9qZWN0LCAic3JjL3Rlc3QucGtnL1Rlc3RFbnRpdHkyLmphdmEiKSkpOwotLy8JCS8vIGFzc2VydE5vdE51bGwoanBhUHJvamVjdC5qcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiKSkpOwotLy8JCS8vIGFzc2VydE5vdE51bGwoanBhUHJvamVjdC5qcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKLS8vCi0vLwkJLy8gbm93IHJlbW92ZSB0aGUgSlBBIGZhY2V0Ci0vLwkJZmFjZXRTZXR0aW5nc0ZpbGUuc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9sZERvY3VtZW50LmdldEJ5dGVzKCkpLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotLy8vLyBUT0RPIG1vdmVkIHRoaXMgc3R1ZmYgdG8gdGhlIGVycm9yIGNvbnNvbGUgdW50aWwgd2UgY2FuIGZpZ3VyZSBvdXQgd2h5IGl0IGZhaWxzIGludGVybWl0dGVudGx5ICB+Ymp2Ci0vLy8vCQlhc3NlcnRFcXVhbHMoMCwgSnB0Q29yZVBsdWdpbi5qcGFNb2RlbCgpLmpwYVByb2plY3RzU2l6ZSgpKTsKLS8vLy8JCWpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmpwYVByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLS8vLy8JCWFzc2VydE51bGwoanBhUHJvamVjdCk7Ci0vLwkJaW50IHNpemUgPSBKcHRDb3JlUGx1Z2luLmpwYU1vZGVsKCkuanBhUHJvamVjdHNTaXplKCk7Ci0vLwkJaWYgKHNpemUgIT0gMCkgewotLy8JCQlTeXN0ZW0uZXJyLnByaW50bG4oImJvZ3VzIHNpemU6ICIgKyBzaXplKTsKLS8vCQkJU3lzdGVtLmVyci5wcmludGxuKCJib2d1cyBwcm9qZWN0OiAiICsgSnB0Q29yZVBsdWdpbi5qcGFQcm9qZWN0KHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSkpOwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIG1ha2Ugc3VyZSB0aGUgREVCVUcgY29uc3RhbnRzIGFyZSAnZmFsc2UnIGJlZm9yZSBjaGVja2luZyBpbiB0aGUgY29kZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RERUJVRygpIHsKLQkJdGhpcy52ZXJpZnlERUJVRyhKcGFNb2RlbE1hbmFnZXIuY2xhc3MpOwotCQl0aGlzLnZlcmlmeURFQlVHKEdlbmVyaWNKcGFNb2RlbC5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURFQlVHKENsYXNzPD8+IGNsYXp6KSB7Ci0JCWFzc2VydEZhbHNlKCJSZWNvbXBpbGUgd2l0aCBcIkRFQlVHID0gZmFsc2VcIjogIiArIGNsYXp6LmdldE5hbWUoKSwKLQkJCQkoKEJvb2xlYW4pIENsYXNzVG9vbHMuc3RhdGljRmllbGRWYWx1ZShjbGF6eiwgIkRFQlVHIikpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0Q29yZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0Q29yZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliZTFhMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL21vZGVsL0pwdENvcmVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdENvcmVNb2RlbFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHN1aXRlKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoYm9vbGVhbiBhbGwpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb3JlTW9kZWxUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpwYU1vZGVsVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRDb3JlTW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0Jhc2VKcGFQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0Jhc2VKcGFQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YTBlZTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9CYXNlSnBhUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLQotcHVibGljIGNsYXNzIEJhc2VKcGFQbGF0Zm9ybVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJQbGF0Zm9ybVRlc3RQcm9qZWN0IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAicGxhdGZvcm0udGVzdCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX0xPQ0FUSU9OID0gInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9STV9YTUxfTE9DQVRJT04gPSAic3JjL01FVEEtSU5GL29ybS54bWwiOwotCQotCQotCXB1YmxpYyBCYXNlSnBhUGxhdGZvcm1UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotCQlqcGFQcm9qZWN0ID0gdGhpcy5idWlsZEpwYVByb2plY3QoUFJPSkVDVF9OQU1FLCBmYWxzZSk7ICAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RKcGFQcm9qZWN0KHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOyAgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLQkJanBhUHJvamVjdCA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotLy8JcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbnRUeXBlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0vLwkJSUZpbGUgcGVyc2lzdGVuY2VYbWxJRmlsZSA9IGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZpbGUoUEVSU0lTVEVOQ0VfWE1MX0xPQ0FUSU9OKTsKLS8vCQlJSnBhRmlsZSBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUgPSBqcGFQcm9qZWN0LmdldEpwYVByb2plY3QoKS5nZXRKcGFGaWxlKHBlcnNpc3RlbmNlWG1sSUZpbGUpOwotLy8JCVBlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlIHBlcnNpc3RlbmNlUm9vdCA9IChQZXJzaXN0ZW5jZVhtbFJvb3RDb250ZW50Tm9kZSkgcGVyc2lzdGVuY2VYbWxKcGFGaWxlLmdldENvbnRlbnQoKTsKLS8vCQlYbWxQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlUm9vdC5nZXRQZXJzaXN0ZW5jZSgpOwotLy8JCQotLy8JCUlGaWxlIG9ybVhtbElGaWxlID0ganBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShPUk1fWE1MX0xPQ0FUSU9OKTsKLS8vCQlJSnBhRmlsZSBvcm1YbWxKcGFGaWxlID0ganBhUHJvamVjdC5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZShvcm1YbWxJRmlsZSk7Ci0vLwkJWG1sUm9vdENvbnRlbnROb2RlIG9ybVJvb3QgPSAoWG1sUm9vdENvbnRlbnROb2RlKSBvcm1YbWxKcGFGaWxlLmdldENvbnRlbnQoKTsKLS8vCQlFbnRpdHlNYXBwaW5nc0ludGVybmFsIGVudGl0eU1hcHBpbmdzID0gb3JtUm9vdC5nZXRFbnRpdHlNYXBwaW5ncygpOwotLy8JCQotLy8JCS8vIGFkZCB4bWwgcGVyc2lzdGVudCB0eXBlCi0vLwkJWG1sRW50aXR5SW50ZXJuYWwgeG1sRW50aXR5ID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW50aXR5SW50ZXJuYWwoKTsKLS8vCQl4bWxFbnRpdHkuc2V0U3BlY2lmaWVkTmFtZSgiWG1sRW50aXR5Iik7Ci0vLwkJZW50aXR5TWFwcGluZ3MuZ2V0VHlwZU1hcHBpbmdzKCkuYWRkKHhtbEVudGl0eSk7Ci0vLwkJZW50aXR5TWFwcGluZ3MuZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLS8vCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoanBhUHJvamVjdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UGxhdGZvcm0oKS5wZXJzaXN0ZW50VHlwZXMoUFJPSkVDVF9OQU1FKSkpOwotLy8JCQotLy8JCS8vIGFkZCBqYXZhIHBlcnNpc3RlbnQgdHlwZQotLy8JCWpwYVByb2plY3QuY3JlYXRlVHlwZShQQUNLQUdFX05BTUUsICJKYXZhRW50aXR5LmphdmEiLCAKLS8vCQkJCSJARW50aXR5IHB1YmxpYyBjbGFzcyBKYXZhRW50aXR5IHt9IgotLy8JCQkpOwotLy8JCVhtbEphdmFDbGFzc1JlZiBqYXZhQ2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFDbGFzc1JlZigpOwotLy8JCWphdmFDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoUEFDS0FHRV9OQU1FICsgIi5KYXZhRW50aXR5Iik7Ci0vLwkJcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLmdldCgwKS5nZXRDbGFzc2VzKCkuYWRkKGphdmFDbGFzc1JlZik7Ci0vLwkJcGVyc2lzdGVuY2UuZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoanBhUHJvamVjdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UGxhdGZvcm0oKS5wZXJzaXN0ZW50VHlwZXMoUFJPSkVDVF9OQU1FKSkpOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybUV4dGVuc2lvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtRXh0ZW5zaW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2ZWE1Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtRXh0ZW5zaW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkV4dGVuc2lvblRlc3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybUV4dGVuc2lvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMQVRGT1JNX0lEID0gVGVzdEpwYVBsYXRmb3JtLklEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExBVEZPUk1fTEFCRUwgPSAiVGVzdCBKcGEgUGxhdGZvcm0iOwotCQotCXB1YmxpYyBKcGFQbGF0Zm9ybUV4dGVuc2lvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXZlcmlmeUV4dGVuc2lvblRlc3RQcm9qZWN0RXhpc3RzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUV4dGVuc2lvblRlc3RQcm9qZWN0RXhpc3RzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSAKLQkJCXJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KEpwdENvcmVQbHVnaW4uUExVR0lOX0lELCAianBhUGxhdGZvcm0iKTsKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCWJvb2xlYW4gZXh0ZW5zaW9uRm91bmQgPSBmYWxzZTsKLQkJZm9yIChJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IGV4dGVuc2lvbnMpIHsKLQkJCWlmIChleHRlbnNpb24uZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkuZXF1YWxzKEV4dGVuc2lvblRlc3RQbHVnaW4uUExVR0lOX0lEKSkgewotCQkJCWV4dGVuc2lvbkZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoIWV4dGVuc2lvbkZvdW5kKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWlzc2luZyBFeHRlbnNpb24gIiArIFRFU1RfUExBVEZPUk1fSUQgKyAiLiBUaGUgRXh0ZW5zaW9uVGVzdFByb2plY3QgcGx1Z2luIG11c3QgYmUgaW4geW91ciB0ZXN0aW5nIHdvcmtzcGFjZS4iKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsSnBhUGxhdGZvcm1JZHMoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnNpemUoSnBhUGxhdGZvcm1SZWdpc3RyeS5pbnN0YW5jZSgpLmpwYVBsYXRmb3JtSWRzKCkpID49IDIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SnBhUGxhdGZvcm1MYWJlbCgpIHsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfUExBVEZPUk1fTEFCRUwsIEpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybUxhYmVsKFRFU1RfUExBVEZPUk1fSUQpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKcGFQbGF0Zm9ybSgpIHsKLQkJYXNzZXJ0Tm90TnVsbChKcGFQbGF0Zm9ybVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm0oVEVTVF9QTEFURk9STV9JRCkpOwkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg3ZmIzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5FeHRlbnNpb25UZXN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkphdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5KYXZhVGVzdFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5KYXZhVGVzdFR5cGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5UZXN0SmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkNvbmZpZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgdGVzdFByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiRXh0ZW5zaW9uVGVzdFByb2plY3QiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJleHRlbnNpb24udGVzdCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTFVHSU5fQ0xBU1MgPSBFeHRlbnNpb25UZXN0UGx1Z2luLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9DTEFTU19OQU1FID0gVGVzdEpwYVBsYXRmb3JtLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMQVRGT1JNX0xBQkVMID0gIlRlc3QgSnBhIFBsYXRmb3JtIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0pQQV9GQUNUT1JZID0gVGVzdEpwYUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVFlQRV9NQVBQSU5HX1BST1ZJREVSX0NMQVNTID0gSmF2YVRlc3RUeXBlTWFwcGluZ1Byb3ZpZGVyLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FUVFJJQlVURV9NQVBQSU5HX1BST1ZJREVSX0NMQVNTID0gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpOwotCQotCXB1YmxpYyBKcGFQbGF0Zm9ybVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCUpwYVBsYXRmb3JtRXh0ZW5zaW9uVGVzdHMudmVyaWZ5RXh0ZW5zaW9uVGVzdFByb2plY3RFeGlzdHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGJ1aWxkSmF2YVByb2plY3QoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuYnVpbGRKcGFQcm9qZWN0KFBST0pFQ1RfTkFNRSwgYXV0b0J1aWxkLCB0aGlzLmJ1aWxkQ29uZmlnKCkpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlBY3Rpb25Db25maWdGYWN0b3J5IGNvbmZpZ0ZhY3RvcnkgPSBuZXcgSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlcigpOwotCQlJRGF0YU1vZGVsIGNvbmZpZyA9IChJRGF0YU1vZGVsKSBjb25maWdGYWN0b3J5LmNyZWF0ZSgpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNX0lELCBUZXN0SnBhUGxhdGZvcm0uSUQpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SnBhRmFjdG9yeSgpIHsKLQkJYXNzZXJ0VHJ1ZShqcGFQbGF0Zm9ybSgpLmdldEpwYUZhY3RvcnkoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoVEVTVF9KUEFfRkFDVE9SWSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QnVpbGRKYXZhVHlwZU1hcHBpbmdGcm9tTWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFUeXBlTWFwcGluZyBqYXZhVHlwZU1hcHBpbmcgPSBqcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5idWlsZEphdmFUeXBlTWFwcGluZ0Zyb21NYXBwaW5nS2V5KEphdmFUZXN0VHlwZU1hcHBpbmcuVEVTVF9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGVNYXBwaW5nIGluc3RhbmNlb2YgSmF2YVRlc3RUeXBlTWFwcGluZyk7Ci0JCQotCQlqYXZhVHlwZU1hcHBpbmcgPSBqcGFQbGF0Zm9ybSgpLmJ1aWxkSmF2YVR5cGVNYXBwaW5nRnJvbU1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50VHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZU1hcHBpbmcgaW5zdGFuY2VvZiBUZXN0SmF2YUVudGl0eSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QnVpbGRKYXZhQXR0cmlidXRlTWFwcGluZ0Zyb21NYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5idWlsZEphdmFBdHRyaWJ1dGVNYXBwaW5nRnJvbU1hcHBpbmdLZXkoSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpKTsJCi0JCWFzc2VydFRydWUoamF2YUF0dHJpYnV0ZU1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcpOwotCQkKLQkJamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqcGFQbGF0Zm9ybSgpLmJ1aWxkSmF2YUF0dHJpYnV0ZU1hcHBpbmdGcm9tTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIikpOwotCQlhc3NlcnRUcnVlKGphdmFBdHRyaWJ1dGVNYXBwaW5nIGluc3RhbmNlb2YgVGVzdEphdmFCYXNpY01hcHBpbmcpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEZhY2V0ZWRQcm9qZWN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RGYWNldGVkUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTE3ZjJiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEZhY2V0ZWRQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBUaGlzIGJ1aWxkcyBhbmQgaG9sZHMgYSAiZmFjZXRlZCIgcHJvamVjdC4KLSAqIFN1cHBvcnQgZm9yIGluc3RhbGxpbmcgZmFjZXRzLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEZhY2V0ZWRQcm9qZWN0IGV4dGVuZHMgVGVzdFBsYXRmb3JtUHJvamVjdCB7Ci0JcHJpdmF0ZSBmaW5hbCBJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3Q7Ci0KLQotCS8vICoqKioqKioqKiogYnVpbGRlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3RGYWNldGVkUHJvamVjdCBidWlsZEZhY2V0ZWRQcm9qZWN0KFN0cmluZyBiYXNlUHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RGYWNldGVkUHJvamVjdCh1bmlxdWVQcm9qZWN0TmFtZShiYXNlUHJvamVjdE5hbWUpLCBhdXRvQnVpbGQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGVzdEZhY2V0ZWRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3ROYW1lLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIFRlc3RGYWNldGVkUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCQl0aGlzLmZhY2V0ZWRQcm9qZWN0ID0gdGhpcy5jcmVhdGVGYWNldGVkUHJvamVjdCgpOwotCX0KLQotCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0IGNyZWF0ZUZhY2V0ZWRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHRoaXMuZ2V0UHJvamVjdCgpLCB0cnVlLCBudWxsKTsJCS8vIHRydWUgPSAiY29udmVydCBpZiBuZWNlc3NhcnkiCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBJRmFjZXRlZFByb2plY3QgZ2V0RmFjZXRlZFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmZhY2V0ZWRQcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluc3RhbGxGYWNldChTdHJpbmcgZmFjZXROYW1lLCBTdHJpbmcgdmVyc2lvbk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcy5pbnN0YWxsRmFjZXQoZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsRmFjZXQoU3RyaW5nIGZhY2V0TmFtZSwgU3RyaW5nIHZlcnNpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMudW5pbnN0YWxsRmFjZXQoZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogaWYgJ2NvbmZpZycgaXMgbnVsbCwgdGhlIEpQQSBwcm9qZWN0IHdpbGwgYmUgYnVpbHQgd2l0aCB0aGUgZGVmYXVsdHMKLQkgKiBkZWZpbmVkIGluIEpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsRmFjZXQoU3RyaW5nIGZhY2V0TmFtZSwgU3RyaW5nIHZlcnNpb25OYW1lLCBJRGF0YU1vZGVsIGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLmZhY2V0ZWRQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQodGhpcy5mYWNldFZlcnNpb24oZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSksIGNvbmZpZywgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsRmFjZXQoU3RyaW5nIGZhY2V0TmFtZSwgU3RyaW5nIHZlcnNpb25OYW1lLCBJRGF0YU1vZGVsIGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLmZhY2V0ZWRQcm9qZWN0LnVuaW5zdGFsbFByb2plY3RGYWNldCh0aGlzLmZhY2V0VmVyc2lvbihmYWNldE5hbWUsIHZlcnNpb25OYW1lKSwgY29uZmlnLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0VmVyc2lvbihTdHJpbmcgZmFjZXROYW1lLCBTdHJpbmcgdmVyc2lvbk5hbWUpIHsKLQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChmYWNldE5hbWUpLmdldFZlcnNpb24odmVyc2lvbk5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SmF2YVByb2plY3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEphdmFQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5Zjc3ZDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SmF2YVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBUaGlzIGJ1aWxkcyBhbmQgaG9sZHMgYSAiSmF2YSIgcHJvamVjdC4KLSAqIFN1cHBvcnQgZm9yIGFkZGluZyBwYWNrYWdlcyBhbmQgdHlwZXMuCi0gKiAKLSAqICJKYXZhIiBwcm9qZWN0cyBhcmVuJ3QgcmVxdWlyZWQgdG8gYmUgImZhY2V0ZWQiIHByb2plY3RzLCBidXQgZm9yIEpQQQotICogdGVzdGluZyB0aGV5IGFyZS4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RKYXZhUHJvamVjdCBleHRlbmRzIFRlc3RGYWNldGVkUHJvamVjdCB7Ci0JcHJpdmF0ZSBmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VGb2xkZXI7Ci0KLQotCS8vICoqKioqKioqKiogYnVpbGRlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3RKYXZhUHJvamVjdCBidWlsZEphdmFQcm9qZWN0KFN0cmluZyBiYXNlUHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RKYXZhUHJvamVjdCh1bmlxdWVQcm9qZWN0TmFtZShiYXNlUHJvamVjdE5hbWUpLCBhdXRvQnVpbGQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGVzdEphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3ROYW1lLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFRlc3RKYXZhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCQl0aGlzLmluc3RhbGxGYWNldCgianN0LmphdmEiLCAiNS4wIik7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUodGhpcy5nZXRQcm9qZWN0KCkpOwotCQl0aGlzLnNvdXJjZUZvbGRlciA9IHRoaXMuamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCh0aGlzLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYyIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXIoU3RyaW5nIGphclBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0aGlzLmFkZENsYXNzcGF0aEVudHJ5KEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChqYXJQYXRoKSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhFbnRyeShJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCksIGVudHJ5KSwgbnVsbCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBjcmVhdGVQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5zb3VyY2VGb2xkZXIuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lLCBmYWxzZSwgbnVsbCk7CS8vIGZhbHNlID0gIm5vIGZvcmNlIgotCX0KLQotCS8qKgotCSAqIFRoZSBzb3VyY2Ugc2hvdWxkIE5PVCBjb250YWluIGEgcGFja2FnZSBkZWNsYXJhdGlvbjsKLQkgKiBpdCB3aWxsIGJlIGFkZGVkIGhlcmUuCi0JICovCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNvbXBpbGF0aW9uVW5pdE5hbWUsIFN0cmluZyBzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHRoaXMuY3JlYXRlUGFja2FnZShwYWNrYWdlTmFtZSksIGNvbXBpbGF0aW9uVW5pdE5hbWUsIG5ldyBTaW1wbGVTb3VyY2VXcml0ZXIoc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNvdXJjZSBzaG91bGQgTk9UIGNvbnRhaW4gYSBwYWNrYWdlIGRlY2xhcmF0aW9uOwotCSAqIGl0IHdpbGwgYmUgYWRkZWQgaGVyZS4KLQkgKi8KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY29tcGlsYXRpb25Vbml0TmFtZSwgU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVDb21waWxhdGlvblVuaXQodGhpcy5jcmVhdGVQYWNrYWdlKHBhY2thZ2VOYW1lKSwgY29tcGlsYXRpb25Vbml0TmFtZSwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc291cmNlIHNob3VsZCBOT1QgY29udGFpbiBhIHBhY2thZ2UgZGVjbGFyYXRpb247Ci0JICogaXQgd2lsbCBiZSBhZGRlZCBoZXJlLgotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCwgU3RyaW5nIGNvbXBpbGF0aW9uVW5pdE5hbWUsIFNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMDApOwotCQlzYi5hcHBlbmQoInBhY2thZ2UgIikuYXBwZW5kKHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKS5hcHBlbmQoIjsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzb3VyY2VXcml0ZXIuYXBwZW5kU291cmNlVG8oc2IpOwotCQlTdHJpbmcgc291cmNlID0gc2IudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudC5jcmVhdGVDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25Vbml0TmFtZSwgc291cmNlLCBmYWxzZSwgbnVsbCk7CS8vIGZhbHNlID0gIm5vIGZvcmNlIgotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50ZXJmYWNlIFNvdXJjZVdyaXRlciB7Ci0JCXZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JfQotCi0JcHVibGljIGNsYXNzIFNpbXBsZVNvdXJjZVdyaXRlciBpbXBsZW1lbnRzIFNvdXJjZVdyaXRlciB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHNvdXJjZTsKLQkJcHVibGljIFNpbXBsZVNvdXJjZVdyaXRlcihTdHJpbmcgc291cmNlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEpwYVByb2plY3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEpwYVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MjJhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKcGFQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLlN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYnVpbGRzIGFuZCBob2xkcyBhICJKUEEiIHByb2plY3QuCi0gKiBTdXBwb3J0IGZvciBhZGRpbmcgcGFja2FnZXMgYW5kIHR5cGVzLgotICogCi0gKiBUaGUgSlBBIHByb2plY3QncyBzZXR0aW5ncyAocGxhdGZvcm0sIGRhdGFiYXNlIGNvbm5lY3Rpb24sIGV0Yy4pIGNhbiBiZQotICogY29udHJvbGxlZCBieSBidWlsZGluZyBhIGRhdGEgbW9kZWwgYW5kIHBhc3NpbmcgaXQgaW50byB0aGUgY29uc3RydWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SnBhUHJvamVjdCBleHRlbmRzIFRlc3RKYXZhUHJvamVjdCB7Ci0JcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5qYXIiOwotCi0KLQkvLyAqKioqKioqKioqIGJ1aWxkZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBiYXNlUHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkLCBJRGF0YU1vZGVsIGpwYUNvbmZpZykKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhUHJvamVjdCh1bmlxdWVQcm9qZWN0TmFtZShiYXNlUHJvamVjdE5hbWUpLCBhdXRvQnVpbGQsIGpwYUNvbmZpZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0SnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoU3RyaW5nIGJhc2VQcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBidWlsZEpwYVByb2plY3QoYmFzZVByb2plY3ROYW1lLCBhdXRvQnVpbGQsIG51bGwpOwotCX0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXN0SnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0TmFtZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBUZXN0SnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMocHJvamVjdE5hbWUsIGF1dG9CdWlsZCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFRlc3RKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQsIElEYXRhTW9kZWwganBhQ29uZmlnKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCQl0aGlzLmluc3RhbGxGYWNldCgianN0LnV0aWxpdHkiLCAiMS4wIik7Ci0JCXRoaXMuaW5zdGFsbEZhY2V0KCJqcHQuanBhIiwgIjEuMCIsIGpwYUNvbmZpZyk7Ci0JCXRoaXMuYWRkSmFyKHRoaXMuamFyTmFtZSgpKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMuZ2V0UHJvamVjdCgpKTsKLQkJdGhpcy5qcGFQcm9qZWN0LnNldFVwZGF0ZXIobmV3IFN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIodGhpcy5qcGFQcm9qZWN0KSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBqYXJOYW1lKCkgewotCQlTdHJpbmcgamFyTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShKQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpOwotCQlpZiAoamFyTmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibWlzc2luZyBKYXZhIHN5c3RlbSBwcm9wZXJ0eTogXCIiICsgSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZICsgIlwiIik7Ci0JCX0KLQkJcmV0dXJuIGphck5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmpwYVByb2plY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RQbGF0Zm9ybVByb2plY3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdFBsYXRmb3JtUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjZmNTYyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdFBsYXRmb3JtUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi0vKioKLSAqIFRoaXMgYnVpbGRzIGFuZCBob2xkcyBhICJnZW5lcmFsIiBFY2xpcHNlIHByb2plY3QuCi0gKiBTdXBwb3J0IGZvciBhZGRpbmcgbmF0dXJlcywgZm9sZGVycywgYW5kIGZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFBsYXRmb3JtUHJvamVjdCB7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotCi0JLyoqIGNhcnJpYWdlIHJldHVybiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0JCi0JLy8gKioqKioqKioqKiBidWlsZGVycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUZXN0UGxhdGZvcm1Qcm9qZWN0IGJ1aWxkUGxhdGZvcm1Qcm9qZWN0KFN0cmluZyBiYXNlUHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RQbGF0Zm9ybVByb2plY3QodW5pcXVlUHJvamVjdE5hbWUoYmFzZVByb2plY3ROYW1lKSwgYXV0b0J1aWxkKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlUHJvamVjdE5hbWUoU3RyaW5nIGJhc2VQcm9qZWN0TmFtZSkgewotCQlyZXR1cm4gYmFzZVByb2plY3ROYW1lICsgU3RyaW5nLnZhbHVlT2YoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLnN1YnN0cmluZyg3KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyBUZXN0UGxhdGZvcm1Qcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXRBdXRvQnVpbGQoYXV0b0J1aWxkKTsgIC8vIHdvcmtzcGFjZS13aWRlIHNldHRpbmcKLQkJdGhpcy5wcm9qZWN0ID0gdGhpcy5idWlsZFBsYXRmb3JtUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEF1dG9CdWlsZChib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJZGVzY3JpcHRpb24uc2V0QXV0b0J1aWxkaW5nKGF1dG9CdWlsZCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdCBidWlsZFBsYXRmb3JtUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCXAuY3JlYXRlKG51bGwpOwotCQlwLm9wZW4obnVsbCk7Ci0JCXJldHVybiBwOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcm9qZWN0TmF0dXJlKFN0cmluZyBuYXR1cmVJRCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gdGhpcy5wcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhDb2xsZWN0aW9uVG9vbHMuYWRkKGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpLCBuYXR1cmVJRCkpOwotCQl0aGlzLnByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb2plY3ROYXR1cmUoU3RyaW5nIG5hdHVyZUlEKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB0aGlzLnByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKSwgbmF0dXJlSUQpKTsKLQkJdGhpcy5wcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmb2xkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZGlyZWN0bHkgdW5kZXIgdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIElGb2xkZXIgY3JlYXRlRm9sZGVyKFN0cmluZyBmb2xkZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUZvbGRlcih0aGlzLnByb2plY3QsIG5ldyBQYXRoKGZvbGRlck5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmb2xkZXIgaW4gdGhlIHNwZWNpZmllZCBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIElGb2xkZXIgY3JlYXRlRm9sZGVyKElDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmcgZm9sZGVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVGb2xkZXIoY29udGFpbmVyLCBuZXcgUGF0aChmb2xkZXJOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGZvbGRlciBpbiB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aC4KLQkgKi8KLQlwdWJsaWMgSUZvbGRlciBjcmVhdGVGb2xkZXIoSUNvbnRhaW5lciBjb250YWluZXIsIElQYXRoIGZvbGRlclBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZvbGRlciBmb2xkZXIgPSBjb250YWluZXIuZ2V0Rm9sZGVyKGZvbGRlclBhdGgpOwotCQlpZiAoICEgZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlmb2xkZXIuY3JlYXRlKGZhbHNlLCB0cnVlLCBudWxsKTsJCS8vIGZhbHNlID0gIm5vIGZvcmNlIjsgdHJ1ZSA9ICJsb2NhbCIKLQkJfQotCQlyZXR1cm4gZm9sZGVyOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBjb250ZW50IGRpcmVjdGx5IHVuZGVyIHRoZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJRmlsZSBjcmVhdGVGaWxlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlRmlsZSh0aGlzLnByb2plY3QsIGZpbGVOYW1lLCBjb250ZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZmlsZSBpbiB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgSUZpbGUgY3JlYXRlRmlsZShJQ29udGFpbmVyIGNvbnRhaW5lciwgU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlRmlsZShjb250YWluZXIsIG5ldyBQYXRoKGZpbGVOYW1lKSwgY29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgZmlsZSBpbiB0aGUgcHJvamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgW3JlbGF0aXZlXSBwYXRoCi0JICogYW5kIGNvbnRlbnQuCi0JICovCi0JcHVibGljIElGaWxlIGNyZWF0ZUZpbGUoSVBhdGggZmlsZVBhdGgsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUZpbGUodGhpcy5wcm9qZWN0LCBmaWxlUGF0aCwgY29udGVudCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGZpbGUgaW4gdGhlIHNwZWNpZmllZCBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGggYW5kIGNvbnRlbnQuCi0JICovCi0JcHVibGljIElGaWxlIGNyZWF0ZUZpbGUoSUNvbnRhaW5lciBjb250YWluZXIsIElQYXRoIGZpbGVQYXRoLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVGaWxlKGNvbnRhaW5lciwgZmlsZVBhdGgsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50LmdldEJ5dGVzKCkpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZmlsZSBpbiB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aCBhbmQgY29udGVudHMuCi0JICovCi0JcHVibGljIElGaWxlIGNyZWF0ZUZpbGUoSUNvbnRhaW5lciBjb250YWluZXIsIElQYXRoIGZpbGVQYXRoLCBJbnB1dFN0cmVhbSBjb250ZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWludCBwYXRoQ291bnQgPSBmaWxlUGF0aC5zZWdtZW50Q291bnQoKSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aENvdW50OyBpKyspIHsKLQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRGb2xkZXIobmV3IFBhdGgoZmlsZVBhdGguc2VnbWVudChpKSkpOwotCQkJaWYgKCAhIGNvbnRhaW5lci5leGlzdHMoKSkgewotCQkJCSgoSUZvbGRlcikgY29udGFpbmVyKS5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7CQkvLyB0cnVlID0gImZvcmNlIjsgdHJ1ZSA9ICJsb2NhbCIKLQkJCX0KLQkJfQotCi0JCUlGaWxlIGZpbGUgPSBjb250YWluZXIuZ2V0RmlsZShuZXcgUGF0aChmaWxlUGF0aC5sYXN0U2VnbWVudCgpKSk7Ci0JCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQlmaWxlLmRlbGV0ZSh0cnVlLCBudWxsKTsJCS8vIHRydWUgPSAiZm9yY2UiCi0JCX0KLQkJZmlsZS5jcmVhdGUoY29udGVudCwgdHJ1ZSwgbnVsbCk7CQkvLyB0cnVlID0gImZvcmNlIgotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSnB0Q29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KcHRDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYzcwNWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KcHRDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KcHRKYXZhUmVzb3VyY2VUZXN0czsKLQotcHVibGljIGNsYXNzIEpwdENvcmVSZXNvdXJjZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHN1aXRlKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoYm9vbGVhbiBhbGwpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0SmF2YVJlc291cmNlVGVzdHMuc3VpdGUoYWxsKSk7Ci0JCWlmIChhbGwpIHsKLQkJCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1Nb2RlbFRlc3RzLmNsYXNzKTsKLQkJCXN1aXRlLmFkZFRlc3RTdWl0ZShQZXJzaXN0ZW5jZU1vZGVsVGVzdHMuY2xhc3MpOwotCQl9Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdENvcmVSZXNvdXJjZU1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvT3JtTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9Pcm1Nb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjg1ZmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9Pcm1Nb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLlByb2plY3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotCi1wdWJsaWMgY2xhc3MgT3JtTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1BST0pFQ1RfTkFNRSA9IE9ybU1vZGVsVGVzdHMuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCQotCVRlc3RKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQkKLQlwdWJsaWMgT3JtTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotCQlqcGFQcm9qZWN0ID0gVGVzdEpwYVByb2plY3QuYnVpbGRKcGFQcm9qZWN0KEJBU0VfUFJPSkVDVF9OQU1FLCBmYWxzZSk7IC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlqcGFQcm9qZWN0ID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGVsTG9hZCgpIHsKLQkJT3JtQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IE9ybUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChhcnRpZmFjdEVkaXQpOwotCQlPcm1SZXNvdXJjZSByZXNvdXJjZSA9IGFydGlmYWN0RWRpdC5nZXRSZXNvdXJjZSgiTUVUQS1JTkYvb3JtLnhtbCIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGVsTG9hZDIoKSB7Ci0JCU9ybUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBPcm1BcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChqcGFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWFzc2VydE5vdE51bGwoYXJ0aWZhY3RFZGl0KTsKLQkJT3JtUmVzb3VyY2UgcmVzb3VyY2UgPSBhcnRpZmFjdEVkaXQuZ2V0UmVzb3VyY2UoIk1FVEEtSU5GL29ybS54bWwiKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9QZXJzaXN0ZW5jZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvUGVyc2lzdGVuY2VNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwM2RlNmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9QZXJzaXN0ZW5jZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1BST0pFQ1RfTkFNRSA9IFBlcnNpc3RlbmNlTW9kZWxUZXN0cy5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0JCi0JVGVzdEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLQkJanBhUHJvamVjdCA9IFRlc3RKcGFQcm9qZWN0LmJ1aWxkSnBhUHJvamVjdChCQVNFX1BST0pFQ1RfTkFNRSwgZmFsc2UpOyAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJanBhUHJvamVjdCA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RlbExvYWQoKSB7Ci0JCVBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IFBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGFydGlmYWN0RWRpdCk7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcmVzb3VyY2UgPSBhcnRpZmFjdEVkaXQuZ2V0UmVzb3VyY2UoIk1FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGVsTG9hZDIoKSB7Ci0JCVBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IFBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGFydGlmYWN0RWRpdCk7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcmVzb3VyY2UgPSBhcnRpZmFjdEVkaXQuZ2V0UmVzb3VyY2UoIk1FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMmVlNzguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgPSAiTVlfQVNTT0NJQVRJT05fT1ZFUlJJREUiOwotCQotCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBc3NvY2lhdGlvbk92ZXJyaWRlIiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCk7ICIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsiICsKLQkJCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiKTsJCi0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLCBASm9pbkNvbHVtbn0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQotCQlhc3NlcnROb3ROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQotCQlhc3NlcnROb3ROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0KLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDEpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbnMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucz1ASm9pbkNvbHVtbikiLCBjdSk7Ci0KLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFzc29jaWF0aW9uT3ZlcnJpZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZUpvaW5Db2x1bW4oMCwgMik7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJmb29cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MDM1NjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVzVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSA9ICJNWV9BU1NPQ0lBVElPTl9PVkVSUklERSI7Ci0JCi0JcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGVzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBc3NvY2lhdGlvbk92ZXJyaWRlIiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiQ29sdW1uIGNvbHVtbigpOyAiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBc3NvY2lhdGlvbk92ZXJyaWRlcyIsIAotCQkJIkFzc29jaWF0aW9uT3ZlcnJpZGVbXSB2YWx1ZSgpOyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsiICsKLQkJCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiksIEBKb2luQ29sdW1ufSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiRk9PXCIsIGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9XCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbj1cIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZT1cIkJBWlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCi0JCWFzc2VydE5vdE51bGwoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCi0JCWFzc2VydE5vdE51bGwoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIkZvb1wiKSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEFzc29jaWF0aW9uT3ZlcnJpZGVDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKHtAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkJBWlwiKSksQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIkJBUlwiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQXNzb2NpYXRpb25PdmVycmlkZVRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyh7QEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpLEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoe0BBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCJCQVpcIiksQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpLCBAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKHtAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkJBWlwiKSksQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIkJBUlwiKX0pIiwgY3UpOwotCQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKS5uZXh0KCk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpLm5leHQoKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKS5uZXh0KCk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCi0KLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKS5uZXh0KCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbnMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKSkiLCBjdSk7Ci0KLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFzc29jaWF0aW9uT3ZlcnJpZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpLm5leHQoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKS5uZXh0KCk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLm1vdmVKb2luQ29sdW1uKDAsIDIpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUykubmV4dCgpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJmb29cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDljMDZiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSA9ICJNWV9BVFRSSUJVVEVfT1ZFUlJJREUiOwotCQotCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkF0dHJpYnV0ZU92ZXJyaWRlIiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiQ29sdW1uIGNvbHVtbigpOyAiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOyAiICsKLQkJCSJib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOyAiICsKLQkJCSJib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJImJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOyAiICsKLQkJCSJTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7ICIgKwotCQkJImludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7ICIgKwotCQkJImludCBzY2FsZSgpIGRlZmF1bHQgMDsiKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oKTsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlV2l0aENvbHVtbk9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWU9XCIiICsgQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCi0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlT3ZlcnJpZGUpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlT3ZlcnJpZGUpOwotCQlhc3NlcnROdWxsKGNvbHVtbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uR2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVXaXRoQ29sdW1uT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5TZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZVdpdGhDb2x1bW5PbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uID0gQENvbHVtbihuYW1lPVwiRm9vXCIpKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnROdWxsKGNvbHVtbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZXNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzEyZDkxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZU92ZXJyaWRlc1Rlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9OQU1FID0gIk1ZX0FUVFJJQlVURV9PVkVSUklERSI7Ci0JCi0JcHVibGljIEF0dHJpYnV0ZU92ZXJyaWRlc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQXR0cmlidXRlT3ZlcnJpZGUiLCAKLQkJCSJTdHJpbmcgbmFtZSgpOyAiICsKLQkJCSJDb2x1bW4gY29sdW1uKCk7ICIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQXR0cmlidXRlT3ZlcnJpZGVzIiwgCi0JCQkiQXR0cmlidXRlT3ZlcnJpZGVbXSB2YWx1ZSgpOyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7ICIgKwotCQkJImJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJImJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJImludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsgIiArCi0JCQkiaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgIiArCi0JCQkiaW50IHNjYWxlKCkgZGVmYXVsdCAwOyIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVXaXRoQ29sdW1uT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUywgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlcyhAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uID0gQENvbHVtbihuYW1lPVwiIiArIENPTFVNTl9OQU1FICsgIlwiKSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIiwgY29sdW1uPUBDb2x1bW4obmFtZT1cIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uPVwiQkFSXCIsIHRhYmxlPVwiQkFaXCIsIHVuaXF1ZT1mYWxzZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgbGVuZ3RoPTEsIHByZWNpc2lvbj0xLCBzY2FsZT0xKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVzID0gKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZXMgPSAoQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCWFzc2VydE51bGwoY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZXMgPSAoQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRm9vXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlcyA9IChBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlV2l0aENvbHVtbk9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlcyA9IChBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCi0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5TZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZVdpdGhDb2x1bW5PbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpLm5leHQoKTsKLQotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWU9XCJGb29cIikpKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEF0dHJpYnV0ZU92ZXJyaWRlQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZPT1wiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWU9XCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7Ci0JCQotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUykpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQXR0cmlidXRlT3ZlcnJpZGVUb0JlZ2lubmluZ09mTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIiwgY29sdW1uID0gQENvbHVtbihuYW1lPVwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCB0YWJsZSA9IFwiQkFaXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxLCBwcmVjaXNpb24gPSAxLCBzY2FsZSA9IDEpKSxAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBUlwiKX0pIiwgY3UpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVpcIiksQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIiwgY29sdW1uID0gQENvbHVtbihuYW1lPVwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCB0YWJsZSA9IFwiQkFaXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxLCBwcmVjaXNpb24gPSAxLCBzY2FsZSA9IDEpKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKLQotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUF0dHJpYnV0ZU92ZXJyaWRlQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZPT1wiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWU9XCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZPT1wiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWU9XCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpIiwgY3UpOwotCX0KLQkvL25vdCBzdXJlIGkgd2FudCB0byB0ZXN0IHRoaXMgYXBpLCBob3cgY2FuIHdlIGtlZXAgQ29udGFpbmVyQW5ub3RhdGlvbi5hZGQsIG1vdmUsIHJlbW92ZSBmcm9tIGJlaW5nIHB1YmxpYz8KLQkvL3VzZXJzIHNob3VsZCBnbyB0aHJvdWdodCBBYnN0cmFjdEphdmFwZXJzaXN0ZW5jZVJlc291cmNlLiB0aGlzIGdldHMgY29uZnVzaW5nIGJlY2F1c2UgeW91IHdvdWxkIGhhbmRsZSBpdCBkaWZmZXJlbnRseQotCS8vZm9yIG5vbiB0b3AtbGV2ZWwgYW5ub3RhdGlvbnMKLS8vCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotLy8JCUphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotLy8JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotLy8JCUF0dHJpYnV0ZU92ZXJyaWRlcyBhdHRyaWJ1dGVPdmVycmlkZXMgPSAoQXR0cmlidXRlT3ZlcnJpZGVzKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLS8vCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlcyk7Ci0vLwkJCi0vLwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gKEF0dHJpYnV0ZU92ZXJyaWRlcykgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0vLwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVPdmVycmlkZXMpOwotLy8JCQotLy8JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzIik7Ci0vLwkJCi0vLwkJQXR0cmlidXRlT3ZlcnJpZGUgZm9vQXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZXMuYWRkKDApOwotLy8JCWZvb0F0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZvbyIpOwotLy8JCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGb29cIikpIik7Ci0vLwotLy8JCUF0dHJpYnV0ZU92ZXJyaWRlIGJhckF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVzLmFkZCgwKTsKLS8vCQliYXJBdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCYXIiKTsKLS8vCQotLy8JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJhclwiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGb29cIil9KSIpOwotLy8KLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdE1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVXaXRoQ29sdW1uT25GaWVsZCgpOwotLy8JCUphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotLy8JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotLy8JCUF0dHJpYnV0ZU92ZXJyaWRlcyBhdHRyaWJ1dGVPdmVycmlkZXMgPSAoQXR0cmlidXRlT3ZlcnJpZGVzKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLS8vCQkKLS8vCQlBdHRyaWJ1dGVPdmVycmlkZSBmb29BdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoMSk7Ci0vLwkJZm9vQXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRm9vIik7Ci0vLwkJCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGb29cIil9KSIpOwotLy8JCQotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcy5tb3ZlKDAsIDEpOwotLy8JCQotLy8JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZvb1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpfSkiKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZVdpdGhDb2x1bW5PbkZpZWxkKCk7Ci0vLwkJSmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0vLwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0vLwkJQXR0cmlidXRlT3ZlcnJpZGVzIGF0dHJpYnV0ZU92ZXJyaWRlcyA9IChBdHRyaWJ1dGVPdmVycmlkZXMpIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotLy8JCQotLy8JCUF0dHJpYnV0ZU92ZXJyaWRlIGZvb0F0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVzLmFkZCgxKTsKLS8vCQlmb29BdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGb28iKTsKLS8vCQkKLS8vCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZvb1wiKX0pIik7Ci0vLwkJCi0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZSgwKTsKLS8vCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGb29cIikpIik7Ci0vLwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcy5yZW1vdmUoMCk7Ci0vLwkJCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoKSIpOwotLy8KLS8vCX0KLQkKLQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQmFzaWNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Jhc2ljVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4YzZlZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQmFzaWNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQmFzaWNUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBCYXNpY1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFzaWMiLCAiYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5CQVNJQyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEJhc2ljV2l0aE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhc2ljIiwgImJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Iik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQkFTSUMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyhvcHRpb25hbD10cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RCYXNpY1dpdGhGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXNpYyIsICJib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOyBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEZldGNoVHlwZS5FQUdFUjsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiRmV0Y2hUeXBlIiwgIkVBR0VSLCBMQVpZIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQkFTSUMsIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEJhc2ljKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWFzc2VydE5vdE51bGwoYmFzaWMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QmFzaWNXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQlhc3NlcnRUcnVlKGJhc2ljLmdldE9wdGlvbmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QmFzaWNXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQlhc3NlcnRUcnVlKGJhc2ljLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYmFzaWMuc2V0T3B0aW9uYWwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShiYXNpYy5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQmFzaWMob3B0aW9uYWw9ZmFsc2UpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWxOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RCYXNpY1dpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWFzc2VydFRydWUoYmFzaWMuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQliYXNpYy5zZXRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQmFzaWMiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJvcHRpb25hbCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RCYXNpY1dpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGJhc2ljLmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QmFzaWNXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBiYXNpYy5nZXRGZXRjaCgpKTsKLQkJCi0JCWJhc2ljLnNldEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBiYXNpYy5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQmFzaWMoZmV0Y2g9TEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEJhc2ljV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkJBU0lDKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWMuZ2V0RmV0Y2goKSk7Ci0JCQotCQliYXNpYy5zZXRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQmFzaWMiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJmZXRjaCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODEyZDg0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIENvbHVtblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9UQUJMRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiA9ICJDT0xVTU5fREVGSU5JVElPTiI7Ci0JCi0JcHVibGljIENvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7ICIgKwotCQkJImJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJImJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJImludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsgIiArCi0JCQkiaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgIiArCi0JCQkiaW50IHNjYWxlKCkgZGVmYXVsdCAwOyIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiIiArIENPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW5XaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbih0YWJsZT1cIiIgKyBDT0xVTU5fVEFCTEUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4oY29sdW1uRGVmaW5pdGlvbj1cIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhCb29sZWFuRWxlbWVudChmaW5hbCBTdHJpbmcgYm9vbGVhbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKCIgKyBib29sZWFuRWxlbWVudCArICI9dHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aEludEVsZW1lbnQoZmluYWwgU3RyaW5nIGludEVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKCIgKyBpbnRFbGVtZW50ICsgIj01KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCi0JCWNvbHVtbi5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKG5hbWU9XCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fVEFCTEUsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQljb2x1bW4uc2V0VGFibGUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKHRhYmxlPVwiRm9vXCIpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0VGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04sIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihjb2x1bW5EZWZpbml0aW9uPVwiRm9vXCIpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDb2x1bW4iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJ1bmlxdWUiKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0KLQkJY29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbih1bmlxdWU9ZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFVuaXF1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDb2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJudWxsYWJsZSIpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldE51bGxhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQotCQljb2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihudWxsYWJsZT1mYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0TnVsbGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoImluc2VydGFibGUiKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKGluc2VydGFibGU9ZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldEluc2VydGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoInVwZGF0YWJsZSIpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKHVwZGF0YWJsZT1mYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENvbHVtbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoSW50RWxlbWVudCgibGVuZ3RoIik7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCi0JCWNvbHVtbi5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldExlbmd0aCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKGxlbmd0aD01KSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRMZW5ndGgobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhJbnRFbGVtZW50KCJwcmVjaXNpb24iKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29sdW1uLmdldFByZWNpc2lvbigpKTsKLQotCQljb2x1bW4uc2V0UHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihwcmVjaXNpb249NSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0UHJlY2lzaW9uKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENvbHVtbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NhbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhJbnRFbGVtZW50KCJzY2FsZSIpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NhbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRTY2FsZSgpKTsKLQotCQljb2x1bW4uc2V0U2NhbGUoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldFNjYWxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4oc2NhbGU9NSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0U2NhbGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhMzFhNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBEaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OID0gIkNPTFVNTl9ERUZJTklUSU9OIjsKLQkKLQlwdWJsaWMgRGlzY3JpbWluYXRvckNvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkRpc2NyaW1pbmF0b3JUeXBlIiwgIlNUUklORywgQ0hBUiwgSU5URUdFUiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJEaXNjcmltaW5hdG9yQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiRFRZUEVcIjsgIiArCi0JCQkiRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsgIiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJImludCBsZW5ndGgoKSBkZWZhdWx0IDMxOyIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARGlzY3JpbWluYXRvckNvbHVtbiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT1cIiIgKyBDT0xVTU5fTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBEaXNjcmltaW5hdG9yQ29sdW1uKGNvbHVtbkRlZmluaXRpb249XCIiICsgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uV2l0aERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4sIEpQQS5ESVNDUklNSU5BVE9SX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBEaXNjcmltaW5hdG9yQ29sdW1uKGRpc2NyaW1pbmF0b3JUeXBlPURpc2NyaW1pbmF0b3JUeXBlLkNIQVIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhJbnRFbGVtZW50KGZpbmFsIFN0cmluZyBpbnRFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JDb2x1bW4oIiArIGludEVsZW1lbnQgKyAiPTUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBEaXNjcmltaW5hdG9yQ29sdW1uKG5hbWU9XCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBEaXNjcmltaW5hdG9yQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBEaXNjcmltaW5hdG9yQ29sdW1uKGNvbHVtbkRlZmluaXRpb249XCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQERpc2NyaW1pbmF0b3JDb2x1bW4iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEludEVsZW1lbnQoImxlbmd0aCIpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldExlbmd0aCgpKTsKLQotCQljb2x1bW4uc2V0TGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQERpc2NyaW1pbmF0b3JDb2x1bW4obGVuZ3RoPTUpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldExlbmd0aChudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBEaXNjcmltaW5hdG9yQ29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzY3JpbWluYXRvclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoRGlzY3JpbWluYXRvclR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGNvbHVtbi5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0KLQkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUiwgY29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBEaXNjcmltaW5hdG9yQ29sdW1uKGRpc2NyaW1pbmF0b3JUeXBlPUlOVEVHRVIpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQERpc2NyaW1pbmF0b3JDb2x1bW4iLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JWYWx1ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzODZiNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgRGlzY3JpbWluYXRvclZhbHVlVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBEaXNjcmltaW5hdG9yVmFsdWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJEaXNjcmltaW5hdG9yVmFsdWUiLCAiU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCBcIlwiOyIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkRJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBEaXNjcmltaW5hdG9yVmFsdWUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RGlzY3JpbWluYXRvclZhbHVlV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkRpc2NyaW1pbmF0b3JWYWx1ZSIsICJTdHJpbmcgdmFsdWUoKSBkZWZhdWx0IFwiXCI7Iik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JWYWx1ZSh2YWx1ZT1cImRpc2NyaW1pbmF0b3JcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQotCQlEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JWYWx1ZSA9IChEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCWFzc2VydE5vdE51bGwoZGlzY3JpbWluYXRvclZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3REaXNjcmltaW5hdG9yVmFsdWVXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JWYWx1ZSA9IChEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscygiZGlzY3JpbWluYXRvciIsIGRpc2NyaW1pbmF0b3JWYWx1ZS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3REaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JWYWx1ZSA9IChEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0KLQkJZGlzY3JpbWluYXRvclZhbHVlLnNldFZhbHVlKCJmb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARGlzY3JpbWluYXRvclZhbHVlKFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJZGlzY3JpbWluYXRvclZhbHVlLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBEaXNjcmltaW5hdG9yVmFsdWUiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YWI4NTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRhYmxlVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbWJlZGRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVtYmVkZGFibGUiLCAiIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFuZEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRhYmxlIiwgIiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSwgSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlKYXZhUmVzb3VyY2VOb2RlIG1hcHBpbmdBbm5vdGF0aW9uID0gdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBFbWJlZGRhYmxlQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRhYmxlQW5kRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbWJlZGRhYmxlQW5kRW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgRW1iZWRkYWJsZUFubm90YXRpb24pOwotCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlhc3NlcnROb3ROdWxsKGVudGl0eSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjkwMzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkSWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEVtYmVkZGVkSWRUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIEVtYmVkZGVkSWRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW1iZWRkZWRJZCIsICIiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERFRF9JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGVkSWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbWJlZGRlZElkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgRW1iZWRkZWRJZEFubm90YXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOTIyZTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIEVtYmVkZGVkVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRlZCIsICIiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERFRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGVkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVtYmVkZGVkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgRW1iZWRkZWRBbm5vdGF0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZmNjNjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEVudGl0eVRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUUgPSAiRm9vIjsKLQkKLQlwdWJsaWMgRW50aXR5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eShuYW1lPVwiIiArIEVOVElUWV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQW5kRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hcHBlZFN1cGVyY2xhc3MiLCAiIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlFbnRpdHlBbm5vdGF0aW9uIGVudGl0eSA9IChFbnRpdHlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkVOVElUWSk7Ci0JCWFzc2VydFRydWUoZW50aXR5ICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGVudGl0eS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlhc3NlcnRUcnVlKGVudGl0eSAhPSBudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXROYW1lKCkpOwotCQllbnRpdHkuc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVudGl0eShuYW1lPVwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVudGl0eSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBFbnRpdHkobmFtZT1cIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcHBlZFN1cGVyY2xhc3NBbmRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NBbmRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlKYXZhUmVzb3VyY2VOb2RlIG1hcHBpbmdBbm5vdGF0aW9uID0gdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBFbnRpdHlBbm5vdGF0aW9uKTsKLQkJCi0JCU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBlZFN1cGVyY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDdkZDFlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnVtZXJhdGVkVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEVudW1lcmF0ZWRUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIEVudW1lcmF0ZWRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW51bWVyYXRlZCIsICJFbnVtVHlwZSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJFbnVtVHlwZSIsICJPUkRJTkFMLCBTVFJJTkciKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlVNRVJBVEVEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW51bWVyYXRlZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnVtZXJhdGVkV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudW1lcmF0ZWQiLCAiRW51bVR5cGUgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiRW51bVR5cGUiLCAiT1JESU5BTCwgU1RSSU5HIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5VTUVSQVRFRCwgSlBBLkVOVU1fVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudW1lcmF0ZWQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRW51bWVyYXRlZEFubm90YXRpb24gZW51bWVyYXRlZCA9IChFbnVtZXJhdGVkQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRU5VTUVSQVRFRCk7Ci0JCWFzc2VydE5vdE51bGwoZW51bWVyYXRlZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW51bWVyYXRlZFdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFbnVtZXJhdGVkQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKEVudW1lcmF0ZWRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlVNRVJBVEVEKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsIGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW51bWVyYXRlZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0KLQkJRW51bWVyYXRlZEFubm90YXRpb24gZW51bWVyYXRlZCA9IChFbnVtZXJhdGVkQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRU5VTUVSQVRFRCk7Ci0KLQkJZW51bWVyYXRlZC5zZXRWYWx1ZShFbnVtVHlwZS5TVFJJTkcpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbnVtZXJhdGVkKFNUUklORykiLCBjdSk7Ci0JCQotCQllbnVtZXJhdGVkLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBFbnVtZXJhdGVkIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0dlbmVyYXRlZFZhbHVlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MjBjZGQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0dlbmVyYXRlZFZhbHVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVkVmFsdWVUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUiA9ICJNWV9HRU5FUkFUT1IiOwotCXB1YmxpYyBHZW5lcmF0ZWRWYWx1ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVHZW5lcmF0aW9uVHlwZUVudW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiR2VuZXJhdGlvblR5cGUiLCAiVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTzsiKTsJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiR2VuZXJhdGVkVmFsdWUiLCAiR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IEFVVE87IFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0IFwiXCIiKTsKLQkJY3JlYXRlR2VuZXJhdGlvblR5cGVFbnVtKCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0R2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuR0VORVJBVEVEX1ZBTFVFLCBKUEEuR0VORVJBVElPTl9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAR2VuZXJhdGVkVmFsdWUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0R2VuZXJhdGVkVmFsdWVXaXRoR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkdFTkVSQVRFRF9WQUxVRSwgSlBBLkdFTkVSQVRJT05fVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEdlbmVyYXRlZFZhbHVlKGdlbmVyYXRvcj1cIiIgKyBHRU5FUkFUT1IgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEdlbmVyYXRlZFZhbHVlV2l0aFN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkdFTkVSQVRFRF9WQUxVRSwgSlBBLkdFTkVSQVRJT05fVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLlNFUVVFTkNFKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEdlbmVyYXRlZFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZSA9IChHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCWFzc2VydE5vdE51bGwoZ2VuZXJhdGVkVmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEdlbmVyYXRlZFZhbHVlV2l0aEdlbmVyYXRvcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZSA9IChHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1IsIGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0R2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RHZW5lcmF0ZWRWYWx1ZVdpdGhHZW5lcmF0b3IoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SLCBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7Ci0JCQotCQlnZW5lcmF0ZWRWYWx1ZS5zZXRHZW5lcmF0b3IoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAR2VuZXJhdGVkVmFsdWUoZ2VuZXJhdG9yPVwiZm9vXCIpIiwgY3UpOwotCQkKLQkJZ2VuZXJhdGVkVmFsdWUuc2V0R2VuZXJhdG9yKG51bGwpOwotCQlhc3NlcnROdWxsKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJnZW5lcmF0b3IiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAR2VuZXJhdGVkVmFsdWUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0R2VuZXJhdGVkVmFsdWVXaXRoU3RyYXRlZ3koKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UsIGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0R2VuZXJhdGVkVmFsdWVXaXRoU3RyYXRlZ3koKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UsIGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCQkKLQkJZ2VuZXJhdGVkVmFsdWUuc2V0U3RyYXRlZ3koR2VuZXJhdGlvblR5cGUuVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGlvblR5cGUuVEFCTEUsIGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT1UQUJMRSkiLCBjdSk7Ci0JCQotCQlnZW5lcmF0ZWRWYWx1ZS5zZXRTdHJhdGVneShudWxsKTsKLQkJYXNzZXJ0TnVsbChnZW5lcmF0ZWRWYWx1ZS5nZXRTdHJhdGVneSgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInN0cmF0ZWd5IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEdlbmVyYXRlZFZhbHVlIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZENsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZENsYXNzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4ZjQzYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRDbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZENsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSWRDbGFzc1Rlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQ0xBU1NfVkFMVUUgPSAiTXlDbGFzcyI7Ci0JCi0JcHVibGljIElkQ2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRDbGFzc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWRDbGFzcyIsICJDbGFzcyB2YWx1ZSgpOyIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdElkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSWRDbGFzc0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5JRF9DTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkQ2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0SWRDbGFzc1dpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVJZENsYXNzQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLklEX0NMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWRDbGFzcygiICsgSURfQ0xBU1NfVkFMVUUgKyAiLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0SWRDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCUlkQ2xhc3NBbm5vdGF0aW9uIGlkQ2xhc3MgPSAoSWRDbGFzc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5JRF9DTEFTUyk7Ci0JCWFzc2VydE5vdE51bGwoaWRDbGFzcyk7Ci0JCWFzc2VydE51bGwoaWRDbGFzcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdElkQ2xhc3NXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUlkQ2xhc3NBbm5vdGF0aW9uIGlkQ2xhc3MgPSAoSWRDbGFzc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5JRF9DTEFTUyk7Ci0JCWFzc2VydEVxdWFscyhJRF9DTEFTU19WQUxVRSwgaWRDbGFzcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdElkQ2xhc3NXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUlkQ2xhc3NBbm5vdGF0aW9uIGlkQ2xhc3MgPSAoSWRDbGFzc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5JRF9DTEFTUyk7Ci0JCWFzc2VydEVxdWFscyhJRF9DTEFTU19WQUxVRSwgaWRDbGFzcy5nZXRWYWx1ZSgpKTsKLQkJCi0JCWlkQ2xhc3Muc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkQ2xhc3MuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQElkQ2xhc3MoZm9vLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWlkQ2xhc3Muc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQElkQ2xhc3MiLCBjdSk7Ci0JCQkJCi0JCWlkQ2xhc3MgPSAoSWRDbGFzc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5JRF9DTEFTUyk7Ci0JCWFzc2VydE51bGwoaWRDbGFzcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGdWxseVF1YWxpZmllZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RJZENsYXNzV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0KLQkJSWRDbGFzc0Fubm90YXRpb24gaWRDbGFzcyA9IChJZENsYXNzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLklEX0NMQVNTKTsKLQkJYXNzZXJ0Tm90TnVsbChpZENsYXNzLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk15Q2xhc3MiLCBpZENsYXNzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3MoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQotCi0JCWlkQ2xhc3Muc2V0VmFsdWUoVFlQRV9OQU1FKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIGlkQ2xhc3MuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzcygpKTsJCQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASWRDbGFzcygiICsgVFlQRV9OQU1FICsgIi5jbGFzcykiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxNDU0ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSWRUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIElkVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0SWQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBJZEFubm90YXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0luaGVyaXRhbmNlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMDU4ZTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0luaGVyaXRhbmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBJbmhlcml0YW5jZVRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSW5oZXJpdGFuY2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkluaGVyaXRhbmNlIiwgIkluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJJbmhlcml0YW5jZVR5cGUiLCAiU0lOR0xFX1RBQkxFLCBKT0lORUQsIFRBQkxFX1BFUl9DTEFTUyIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLklOSEVSSVRBTkNFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2UiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0SW5oZXJpdGFuY2VXaXRoU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSW5oZXJpdGFuY2UiLCAiSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkluaGVyaXRhbmNlVHlwZSIsICJTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSU5IRVJJVEFOQ0UsIEpQQS5JTkhFUklUQU5DRV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLkpPSU5FRCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RJbmhlcml0YW5jZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCUluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbmhlcml0YW5jZSA9IChJbmhlcml0YW5jZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5JTkhFUklUQU5DRSk7Ci0JCWFzc2VydE5vdE51bGwoaW5oZXJpdGFuY2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEluaGVyaXRhbmNlV2l0aFN0cmF0ZWd5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJSW5oZXJpdGFuY2VBbm5vdGF0aW9uIGluaGVyaXRhbmNlID0gKEluaGVyaXRhbmNlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLklOSEVSSVRBTkNFKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5KT0lORUQsIGluaGVyaXRhbmNlLmdldFN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEluaGVyaXRhbmNlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCi0JCUluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbmhlcml0YW5jZSA9IChJbmhlcml0YW5jZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5JTkhFUklUQU5DRSk7Ci0JCWluaGVyaXRhbmNlLnNldFN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBJbmhlcml0YW5jZShzdHJhdGVneT1UQUJMRV9QRVJfQ0xBU1MpIiwgY3UpOwotCQkKLQkJaW5oZXJpdGFuY2Uuc2V0U3RyYXRlZ3kobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEluaGVyaXRhbmNlIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pQVFRvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KUFRUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZjBhODcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pQVFRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklNZXRob2RCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVmFyaWFibGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpQVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkZpZWxkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1ldGhvZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotCi1wdWJsaWMgY2xhc3MgSlBUVG9vbHNUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIEpQVFRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlRmllbGRXaXRoTW9kaWZpZXIoZmluYWwgU3RyaW5nIG1vZGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIiArIG1vZGlmaWVyICsgIiBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByb3RlY3RlZCBGaWVsZEF0dHJpYnV0ZSBmb29GaWVsZChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmllbGQoImZvbyIsIGN1KTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlR2V0TWV0aG9kV2l0aE1vZGlmaWVyKGZpbmFsIFN0cmluZyBtb2RpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiICsgbW9kaWZpZXIgKyAiIGludCBnZXRGb28oKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldEZvbyhpbnQgaWQpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLmlkID0gaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlSW52YWxpZE1ldGhvZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBpbnQgZm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRGb28oaW50IGlkKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgdGhpcy5pZCA9IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZUNvbnN0cnVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgIiArIFRZUEVfTkFNRSArICIoKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgc3VwZXIoKTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVWb2lkTWV0aG9kUmV0dXJuVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgZ2V0Rm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRGb28oaW50IGlkKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgdGhpcy5pZCA9IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotLy8JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlSW52YWxpZE1ldGhvZFJldHVyblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0vLwkJCQotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLS8vCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KCJjb20uZm9vLkZvbyIpOwotLy8JCQl9Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWZmZXIgc2IpIHsKLS8vCQkJCXNiLmFwcGVuZChDUik7Ci0vLwkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgRm9vIGdldEZvbygpIHsiKS5hcHBlbmQoQ1IpOwotLy8JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiBudWxsOyIpLmFwcGVuZChDUik7Ci0vLwkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLS8vCQkJCXNiLmFwcGVuZChDUik7Ci0vLwkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRGb28oRm9vIGlkKSB7IikuYXBwZW5kKENSKTsKLS8vCQkJCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLmlkID0gaWQ7IikuYXBwZW5kKENSKTsKLS8vCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotLy8JCQkJc2IuYXBwZW5kKENSKTsKLS8vCQkJfQotLy8JCX0pOwotLy8JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlSXNNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBib29sZWFuIGlzRm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRGb28oYm9vbGVhbiBpZCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMuaWQgPSBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVJc01ldGhvZFJldHVybkludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIGludCBpc0ZvbygpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gdGhpcy5pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgc2V0Rm9vKGludCBpZCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMuaWQgPSBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVJc0FuZEdldE1ldGhvZFdpdGhNb2RpZmllcihmaW5hbCBTdHJpbmcgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIiArIG1vZGlmaWVyICsgIiBib29sZWFuIGlzRm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiICsgbW9kaWZpZXIgKyAiIGJvb2xlYW4gZ2V0Rm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRGb28oYm9vbGVhbiBpZCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMuaWQgPSBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZVNldE1ldGhvZFdpdGhNb2RpZmllcihmaW5hbCBTdHJpbmcgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIGludCBnZXRGb28oKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIgKyBtb2RpZmllciArICIgdm9pZCBzZXRGb28oaW50IGlkKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgdGhpcy5pZCA9IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlV2l0aE1lbWJlclR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kTWVtYmVyVHlwZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb29TdGF0aWMge30iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIHB1YmxpYyBjbGFzcyBGb29Ob3RTdGF0aWMge30iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE15QW5ub3RhdGlvbiB7fSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgcHVibGljIGVudW0gTXlFbnVtIHt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEF0dHJpYnV0ZSBmb29NZXRob2QoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZE1ldGhvZCgiZ2V0Rm9vIiwgY3UpOwotCX0KLQotCS8vcHJpdmF0ZSBTdHJpbmcgZm9vOyAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkSXNQZXJzaXN0YWJsZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlRmllbGRXaXRoTW9kaWZpZXIoInByaXZhdGUiKTsKLQkJRmllbGRBdHRyaWJ1dGUgZmllbGRBdHRyaWJ1dGUgPSBmb29GaWVsZChjdSk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gZmllbGRBdHRyaWJ1dGUuZ2V0QmluZGluZyhKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0VHJ1ZShKUFRUb29scy5maWVsZElzUGVyc2lzdGFibGUodmFyaWFibGVCaW5kaW5nKSk7Ci0JfQotCQotCS8vcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvbzsgLSBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRJc1BlcnNpc3RhYmxlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVGaWVsZFdpdGhNb2RpZmllcigicHJpdmF0ZSBzdGF0aWMiKTsKLQkJRmllbGRBdHRyaWJ1dGUgZmllbGRBdHRyaWJ1dGUgPSBmb29GaWVsZChjdSk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gZmllbGRBdHRyaWJ1dGUuZ2V0QmluZGluZyhKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMuZmllbGRJc1BlcnNpc3RhYmxlKHZhcmlhYmxlQmluZGluZykpOwotCX0KLQkKLQkvL3ByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBmb287IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkSXNQZXJzaXN0YWJsZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlRmllbGRXaXRoTW9kaWZpZXIoInByaXZhdGUgdHJhbnNpZW50Iik7Ci0JCUZpZWxkQXR0cmlidXRlIGZpZWxkQXR0cmlidXRlID0gZm9vRmllbGQoY3UpOwotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IGZpZWxkQXR0cmlidXRlLmdldEJpbmRpbmcoSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydEZhbHNlKEpQVFRvb2xzLmZpZWxkSXNQZXJzaXN0YWJsZSh2YXJpYWJsZUJpbmRpbmcpKTsKLQl9Ci0JCi0JLy9wcml2YXRlIGZpbmFsIFN0cmluZyBmb287IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRJc1BlcnNpc3RhYmxlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVGaWVsZFdpdGhNb2RpZmllcigicHJpdmF0ZSBmaW5hbCIpOwotCQlGaWVsZEF0dHJpYnV0ZSBmaWVsZEF0dHJpYnV0ZSA9IGZvb0ZpZWxkKGN1KTsKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSBmaWVsZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRUcnVlKEpQVFRvb2xzLmZpZWxkSXNQZXJzaXN0YWJsZSh2YXJpYWJsZUJpbmRpbmcpKTsKLQl9Ci0JCi0JLy9wdWJsaWMgU3RyaW5nIGZvbzsgLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZElzUGVyc2lzdGFibGU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUZpZWxkV2l0aE1vZGlmaWVyKCJwdWJsaWMiKTsKLQkJRmllbGRBdHRyaWJ1dGUgZmllbGRBdHRyaWJ1dGUgPSBmb29GaWVsZChjdSk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gZmllbGRBdHRyaWJ1dGUuZ2V0QmluZGluZyhKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0VHJ1ZShKUFRUb29scy5maWVsZElzUGVyc2lzdGFibGUodmFyaWFibGVCaW5kaW5nKSk7Ci0JfQotCQotCi0JLy9wdWJsaWMgaW50IGdldEZvbygpIHt9IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVHZXRNZXRob2RXaXRoTW9kaWZpZXIoInB1YmxpYyIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRUcnVlKEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihtZXRob2RCaW5kaW5nKSk7Ci0JCQotCX0KLQkKLQkvL3Byb3RlY3RlZCBpbnQgZ2V0Rm9vKCkge30gLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUdldE1ldGhvZFdpdGhNb2RpZmllcigicHJvdGVjdGVkIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gbWV0aG9kQXR0cmlidXRlLmdldEJpbmRpbmcoSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydFRydWUoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKG1ldGhvZEJpbmRpbmcpKTsKLQl9Ci0JCi0JLy9pbnQgZ2V0Rm9vKCkge30gLSBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVHZXRNZXRob2RXaXRoTW9kaWZpZXIoIiIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIobWV0aG9kQmluZGluZykpOwotCX0KLQkKLQkvL3ByaXZhdGUgaW50IGdldEZvbygpIHt9IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlR2V0TWV0aG9kV2l0aE1vZGlmaWVyKCJwcml2YXRlIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gbWV0aG9kQXR0cmlidXRlLmdldEJpbmRpbmcoSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydEZhbHNlKEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihtZXRob2RCaW5kaW5nKSk7Ci0JfQotCQotCS8vcHVibGljIHN0YXRpYyBpbnQgZ2V0Rm9vKCkge30gLSBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyNSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVHZXRNZXRob2RXaXRoTW9kaWZpZXIoInB1YmxpYyBzdGF0aWMiKTsKLQkJTWV0aG9kQXR0cmlidXRlIG1ldGhvZEF0dHJpYnV0ZSA9IGZvb01ldGhvZChjdSk7Ci0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBtZXRob2RBdHRyaWJ1dGUuZ2V0QmluZGluZyhKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKG1ldGhvZEJpbmRpbmcpKTsKLQl9Ci0KLQkvL3B1YmxpYyBmaW5hbCBpbnQgZ2V0Rm9vKCkge30gLSBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyNigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVHZXRNZXRob2RXaXRoTW9kaWZpZXIoInB1YmxpYyBmaW5hbCIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIobWV0aG9kQmluZGluZykpOwotCX0KLQotCS8vcHVibGljIHZvaWQgc2V0Rm9vKGludCBmb28pIHt9IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyNygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVTZXRNZXRob2RXaXRoTW9kaWZpZXIoInB1YmxpYyIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRUcnVlKEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihtZXRob2RCaW5kaW5nKSk7Ci0JCQotCX0KLQkKLQkvL3Byb3RlY3RlZCB2b2lkIHNldEZvbyhpbnQgZm9vKSB7fSAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlU2V0TWV0aG9kV2l0aE1vZGlmaWVyKCJwcm90ZWN0ZWQiKTsKLQkJTWV0aG9kQXR0cmlidXRlIG1ldGhvZEF0dHJpYnV0ZSA9IGZvb01ldGhvZChjdSk7Ci0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBtZXRob2RBdHRyaWJ1dGUuZ2V0QmluZGluZyhKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0VHJ1ZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIobWV0aG9kQmluZGluZykpOwotCX0KLQkKLQkvL3ZvaWQgc2V0Rm9vKGludCBmb28pIHt9IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlU2V0TWV0aG9kV2l0aE1vZGlmaWVyKCIiKTsKLQkJTWV0aG9kQXR0cmlidXRlIG1ldGhvZEF0dHJpYnV0ZSA9IGZvb01ldGhvZChjdSk7Ci0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBtZXRob2RBdHRyaWJ1dGUuZ2V0QmluZGluZyhKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKG1ldGhvZEJpbmRpbmcpKTsKLQl9Ci0JCi0JLy9wcml2YXRlIHZvaWQgc2V0Rm9vKGludCBmb28pIHt9IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSAgY3JlYXRlVGVzdFR5cGVTZXRNZXRob2RXaXRoTW9kaWZpZXIoInByaXZhdGUiKTsKLQkJTWV0aG9kQXR0cmlidXRlIG1ldGhvZEF0dHJpYnV0ZSA9IGZvb01ldGhvZChjdSk7Ci0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBtZXRob2RBdHRyaWJ1dGUuZ2V0QmluZGluZyhKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKG1ldGhvZEJpbmRpbmcpKTsKLQl9Ci0JCi0JLy9wdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKGludCBmb28pIHt9IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVNldE1ldGhvZFdpdGhNb2RpZmllcigicHVibGljIHN0YXRpYyIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIobWV0aG9kQmluZGluZykpOwotCX0KLQotCS8vcHVibGljIGZpbmFsIHZvaWQgc2V0Rm9vKGludCBmb28pIHt9IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVNldE1ldGhvZFdpdGhNb2RpZmllcigicHVibGljIGZpbmFsIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gbWV0aG9kQXR0cmlidXRlLmdldEJpbmRpbmcoSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydEZhbHNlKEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihtZXRob2RCaW5kaW5nKSk7Ci0JfQotCi0JLy9wdWJsaWMgYm9vbGVhbiBpc0ZvbygpIHt9IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlSXNNZXRob2QoKTsKLQkJTWV0aG9kQXR0cmlidXRlIG1ldGhvZEF0dHJpYnV0ZSA9ICB0aGlzLmJ1aWxkTWV0aG9kKCJpc0ZvbyIsIGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRUcnVlKEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihtZXRob2RCaW5kaW5nKSk7Ci0JCQotCX0KLQkKLQkvL3B1YmxpYyBpbnQgaXNGb28oKSB7fSAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxNCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVJc01ldGhvZFJldHVybkludCgpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gIHRoaXMuYnVpbGRNZXRob2QoImlzRm9vIiwgY3UpOwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gbWV0aG9kQXR0cmlidXRlLmdldEJpbmRpbmcoSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydEZhbHNlKEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihtZXRob2RCaW5kaW5nKSk7Ci0JCQotCX0KLQkKLQkvL3B1YmxpYyBpbnQgaXNGb28oKSB7fSAtIHBlcnNpc3RhYmxlCi0JLy9wdWJsaWMgaW50IGdldEZvbygpIHt9IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjE1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUlzQW5kR2V0TWV0aG9kV2l0aE1vZGlmaWVyKCJwdWJsaWMiKTsKLQkJTWV0aG9kQXR0cmlidXRlIGlzRm9vTWV0aG9kID0gIHRoaXMuYnVpbGRNZXRob2QoImlzRm9vIiwgY3UpOwotCQlNZXRob2RBdHRyaWJ1dGUgZ2V0Rm9vTWV0aG9kID0gIHRoaXMuYnVpbGRNZXRob2QoImdldEZvbyIsIGN1KTsKLQkJCi0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0VHJ1ZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIoaXNGb29NZXRob2QuZ2V0QmluZGluZyhhc3RSb290KSkpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIoZ2V0Rm9vTWV0aG9kLmdldEJpbmRpbmcoYXN0Um9vdCkpKTsKLQl9Ci0JCi0JLy9wdWJsaWMgaW50IGZvbygpIHt9IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUludmFsaWRNZXRob2ROYW1lKCk7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBmb29NZXRob2QgPSAgdGhpcy5idWlsZE1ldGhvZCgiZm9vIiwgY3UpOwotCQkKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIoZm9vTWV0aG9kLmdldEJpbmRpbmcoYXN0Um9vdCkpKTsKLQl9Ci0KLQkvL3B1YmxpYyB2b2lkIGdldEZvbygpIHt9IC0gbm90IHBlcnNpc3RhYmxlIC0gdm9pZCByZXR1cm4gdHlwZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxNygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVWb2lkTWV0aG9kUmV0dXJuVHlwZSgpOwotCQlNZXRob2RBdHRyaWJ1dGUgZm9vTWV0aG9kID0gIHRoaXMuYnVpbGRNZXRob2QoImdldEZvbyIsIGN1KTsKLQkJCi0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKGZvb01ldGhvZC5nZXRCaW5kaW5nKGFzdFJvb3QpKSk7Ci0JfQotCQotCS8vVE9ETwotCS8vKipnZXRGb29NZXRob2QuYmluZGluZyhDb21wbGlhdGlvblVuaXQpIGlzIHJldHVybmluZyBudWxsLCBub3Qgc3VyZSB3aHkgYW5kIGRvbid0IGtub3cgaG93IHRvIHRlc3QKLQkvLyoqdGhpcyBpZiBpdCBpcyByZXR1cm5pbmcgbnVsbCB0aGVyZSBpbnN0ZWFkIG9mIHJldHVybmluZyBudWxsIGZvciBJTWV0aG9kQmluZGluZy5nZXRSZXR1cm5UeXBlKCkKLS8vCS8vcHVibGljIEZvbyBnZXRGb28oKSB7fSAtIG5vdCBwZXJzaXN0YWJsZSAtIEZvbyBkb2VzIG5vdCByZXNvbHZlCi0vLwlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVJbnZhbGlkTWV0aG9kUmV0dXJuVHlwZSgpOwotLy8JCU1ldGhvZEF0dHJpYnV0ZSBnZXRGb29NZXRob2QgPSAgdGhpcy5idWlsZE1ldGhvZCgiZ2V0Rm9vIik7Ci0vLwkJCi0vLwkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpOwotLy8JCWFzc2VydEZhbHNlKEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihmb29NZXRob2QuYmluZGluZyhhc3RSb290KSkpOwotLy8JfQotCQotCS8vbWV0aG9kIHdpdGggcGFyYW1ldGVycyAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxOSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGUoKTsKLQkJTWV0aG9kQXR0cmlidXRlIHNldElkTWV0aG9kID0gIGlkU2V0TWV0aG9kKGN1KTsKLQkJCi0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKHNldElkTWV0aG9kLmdldEJpbmRpbmcoYXN0Um9vdCkpKTsKLQl9Ci0JCi0JLy9jb25zdHJ1Y3RvciAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIyMCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVDb25zdHJ1Y3RvcigpOwotCQlNZXRob2RBdHRyaWJ1dGUgY29uc3RydWN0b3IgPSAgYnVpbGRNZXRob2QoVFlQRV9OQU1FLCBjdSk7Ci0JCQotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydEZhbHNlKEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihjb25zdHJ1Y3Rvci5nZXRCaW5kaW5nKGFzdFJvb3QpKSk7Ci0JfQotCQotCS8vbm8gY29ycmVzcG9uZGluZyBzZXQgbWV0aG9kIC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZSgpOwotCQlNZXRob2RBdHRyaWJ1dGUgZ2V0TmFtZU1ldGhvZCA9ICBuYW1lR2V0TWV0aG9kKGN1KTsKLQkJCi0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKGdldE5hbWVNZXRob2QuZ2V0QmluZGluZyhhc3RSb290KSkpOwotCX0KLQkKLQkvL3B1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVGVzdFR5cGUKLQlwdWJsaWMgdm9pZCBjdUlzUGVyc2lzdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlKCk7Ci0JCVR5cGUgdHlwZSA9IHRlc3RUeXBlKGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRUcnVlKEpQVFRvb2xzLnR5cGVJc1BlcnNpc3RhYmxlKHR5cGUuZ2V0QmluZGluZyhhc3RSb290KSkpOwotCX0KLQkKLQkvL3B1YmxpYyBmaW5hbCBjbGFzcyBNeUZpbmFsCi0JcHVibGljIHZvaWQgY3VJc1BlcnNpc3RhYmxlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImZpbmFscyIsICJNeUZpbmFsLmphdmEiLCAicHVibGljIGZpbmFsIGNsYXNzIE15RmluYWwgeyB9Iik7Ci0JCVR5cGUgdHlwZSA9IGJ1aWxkVHlwZSgiTXlGaW5hbCIsIGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy50eXBlSXNQZXJzaXN0YWJsZSh0eXBlLmdldEJpbmRpbmcoYXN0Um9vdCkpKTsKLQl9Ci0JCi0JLy9wdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlCi0JcHVibGljIHZvaWQgY3VJc1BlcnNpc3RhYmxlMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImludGVyZmFjZXMiLCAiTXlJbnRlcmZhY2UuamF2YSIsICJwdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlIHsgfSIpOwotCQlUeXBlIHR5cGUgPSBidWlsZFR5cGUoIk15SW50ZXJmYWNlIiwgY3UpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydEZhbHNlKEpQVFRvb2xzLnR5cGVJc1BlcnNpc3RhYmxlKHR5cGUuZ2V0QmluZGluZyhhc3RSb290KSkpOwotCX0KLQkKLQkvL2VudW0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgY3VJc1BlcnNpc3RhYmxlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiVGVzdEVudW0iLCAiRk9PLCBCQVIsIEJBWiIpOwotCQlUeXBlIHR5cGUgPSBidWlsZFR5cGUoIlRlc3RFbnVtIiwgY3UpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydEZhbHNlKEpQVFRvb2xzLnR5cGVJc1BlcnNpc3RhYmxlKHR5cGUuZ2V0QmluZGluZyhhc3RSb290KSkpOwotCX0KLQkKLQkvL2Fubm90YXRpb24gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgY3VJc1BlcnNpc3RhYmxlNSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVzdEFubm90YXRpb24iLCAiVGVzdEVudW0gZm9vKCk7Iik7Ci0JCVR5cGUgdHlwZSA9IGJ1aWxkVHlwZSgiVGVzdEFubm90YXRpb24iLCBjdSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMudHlwZUlzUGVyc2lzdGFibGUodHlwZS5nZXRCaW5kaW5nKGFzdFJvb3QpKSk7Ci0JfQotCQotCS8vcHVibGljIHN0YXRpYyBtZW1iZXIgdHlwZSBpcyBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIGN1SXNQZXJzaXN0YWJsZTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVXaXRoTWVtYmVyVHlwZXMoKTsKLQkJVHlwZSB0ZXN0VHlwZSA9IHRoaXMudGVzdFR5cGUoY3UpOwotCQlUeXBlIG1lbWJlclR5cGUgPSB0aGlzLmJ1aWxkVHlwZSh0ZXN0VHlwZSwgIkZvb1N0YXRpYyIsIDEsIGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRUcnVlKEpQVFRvb2xzLnR5cGVJc1BlcnNpc3RhYmxlKG1lbWJlclR5cGUuZ2V0QmluZGluZyhhc3RSb290KSkpOwotCX0KLQkKLQkvL25vbi1zdGF0aWMgbWVtYmVyIHR5cGUgaXMgbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgY3VJc1BlcnNpc3RhYmxlNygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZVdpdGhNZW1iZXJUeXBlcygpOwotCQlUeXBlIHRlc3RUeXBlID0gdGhpcy50ZXN0VHlwZShjdSk7Ci0JCVR5cGUgbWVtYmVyVHlwZSA9IHRoaXMuYnVpbGRUeXBlKHRlc3RUeXBlLCAiRm9vTm90U3RhdGljIiwgMSwgY3UpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydEZhbHNlKEpQVFRvb2xzLnR5cGVJc1BlcnNpc3RhYmxlKG1lbWJlclR5cGUuZ2V0QmluZGluZyhhc3RSb290KSkpOwotCX0KLQkvL1RPRE8gc3RpbGwgbmVlZCB0byB0ZXN0IHR5cGVJc1BlcnNpc3RhYmxlKCkgcmV0dXJucyBmYWxzZSBmb3IgbG9jYWwgYW5kIGFub255bW91cyBjbGFzc2VzCi0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YjcxM2MuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5TaW1wbGVKcGFQcm9qZWN0Q29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1wdWJsaWMgY2xhc3MgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZQotewotCXByaXZhdGUgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lciBqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyOwotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VNb2RlbCBqYXZhUmVzb3VyY2VNb2RlbDsKLQkKLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcigpOwotCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogRm9yd2FyZCB0aGUgSmF2YSBlbGVtZW50IGNoYW5nZSBldmVudCBiYWNrIHRvIHRoZSBKUEEgbW9kZWwgbWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7Ci0JCUphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLnRoaXMuamF2YVJlc291cmNlTW9kZWwgIT0gbnVsbCkgewotCQkJCUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UudGhpcy5qYXZhUmVzb3VyY2VNb2RlbC5qYXZhRWxlbWVudENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBhbm5vdGF0aW9uQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiamF2YXgucGVyc2lzdGVuY2UiLCBhbm5vdGF0aW9uTmFtZSwgYW5ub3RhdGlvbkJvZHkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHBhY2thZ2VOYW1lLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUVudW1BbmRNZW1iZXJzKFN0cmluZyBlbnVtTmFtZSwgU3RyaW5nIGVudW1Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZUVudW1BbmRNZW1iZXJzKCJqYXZheC5wZXJzaXN0ZW5jZSIsIGVudW1OYW1lLCBlbnVtQm9keSk7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUVudW1BbmRNZW1iZXJzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudW1OYW1lLCBTdHJpbmcgZW51bUJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQocGFja2FnZU5hbWUsIGVudW1OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBlbnVtICIgKyBlbnVtTmFtZSArICIgeyAiICsgZW51bUJvZHkgKyAiIH0iKTsKLQl9Ci0KLQkvL2J1aWxkIHVwIGEgZHVtbXkgSnBhUHJvamVjdCB0aGF0IGRvZXMgbm90IGhhdmUgSnBhRmlsZXMgaW4gaXQgYW5kIGRvZXMgbm90IHVwZGF0ZSBmcm9tIGphdmEgY2hhbmdlcwotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhUHJvamVjdCh0aGlzLmJ1aWxkSnBhUHJvamVjdENvbmZpZyh0aGlzLmphdmFQcm9qZWN0LmdldFByb2plY3QoKSkpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBUZXN0SnBhUHJvamVjdCBleHRlbmRzIEdlbmVyaWNKcGFQcm9qZWN0IHsKLQkJcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0KEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJc3VwZXIoY29uZmlnKTsKLQkJCXRoaXMuc2V0VXBkYXRlcihVcGRhdGVyLk51bGwuaW5zdGFuY2UoKSk7Ly8gaWdub3JlIGFsbCB1cGRhdGVzLCBzaW5jZSB0aGVyZSBpcyBubyBjb250ZXh0IG1vZGVsCi0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElSZXNvdXJjZVByb3h5VmlzaXRvciBidWlsZEluaXRpYWxSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCXJldHVybiBuZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCXJldHVybiBmYWxzZTsgIC8vIGlnbm9yZSBhbGwgdGhlIGZpbGVzIGluIHRoZSBFY2xpcHNlIHByb2plY3QKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEpwYVJvb3RDb250ZXh0Tm9kZSBidWlsZFJvb3RDb250ZXh0Tm9kZSgpIHsKLQkJCXJldHVybiBudWxsOyAgLy8gbm8gcm9vdCBjb250ZXh0Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUHJvamVjdC5Db25maWcgYnVpbGRKcGFQcm9qZWN0Q29uZmlnKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU2ltcGxlSnBhUHJvamVjdENvbmZpZyBjb25maWcgPSBuZXcgU2ltcGxlSnBhUHJvamVjdENvbmZpZygpOwotCQljb25maWcuc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJY29uZmlnLnNldEpwYVBsYXRmb3JtKEpwdENvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm0ocHJvamVjdCkpOwotCQljb25maWcuc2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKEpwdENvcmVQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKHByb2plY3QpKTsKLQkJY29uZmlnLnNldERpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyhKcHRDb3JlUGx1Z2luLmRpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlcyhwcm9qZWN0KSk7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShJQ29tcGlsYXRpb25Vbml0IGN1KSAKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLmphdmFSZXNvdXJjZU1vZGVsID0gYnVpbGRKYXZhUmVzb3VyY2VNb2RlbChjdSk7Ci0JCXRoaXMuamF2YVJlc291cmNlTW9kZWwucmVzb2x2ZVR5cGVzKCk7Ci0JCXJldHVybiB0aGlzLmphdmFSZXNvdXJjZU1vZGVsLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlTW9kZWwgYnVpbGRKYXZhUmVzb3VyY2VNb2RlbChJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmphdmFSZXNvdXJjZU1vZGVsICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlJRmlsZSBmaWxlID0gKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBidWlsZEpwYVByb2plY3QoKTsKLQkJcmV0dXJuIG5ldyBKYXZhUmVzb3VyY2VNb2RlbEltcGwoCi0JCQlmaWxlLCAKLQkJCWpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyLkRlZmF1bHQuaW5zdGFuY2UoKSwKLQkJCU51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0ZmViNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLklkSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk9uZVRvT25lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlci5FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLQotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uUmVzb2x2aW5nRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0KLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgRm9vIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25SZXNvbHZpbmdNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0KLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgRm9vIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgRm9vIGdldEZvbygpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gdGhpcy5mb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgc2V0Rm9vKEZvbyBmb28pIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLmZvbyA9IGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0aW9uc1BlckxpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWU9XCJiYXpcIikiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb28sIGJhcjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aElkQW5kQmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXNpYyIsICIiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkJBU0lDKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWQiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4iKTsKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyBTdHJpbmcgdGFibGUoKTsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiLCB0YWJsZT1cIk1ZX1RBQkxFXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZENvbHVtbkdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsgU3RyaW5nIHRhYmxlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkdlbmVyYXRlZFZhbHVlIiwgIiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5DT0xVTU4sIEpQQS5JRCwgSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBHZW5lcmF0ZWRWYWx1ZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU11bHRpcGxlQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWU9XCJGT09cIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiQkFSXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW1iZWRkZWQiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQXR0cmlidXRlT3ZlcnJpZGUiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERFRCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGVkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGVkV2l0aEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRlZCIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBdHRyaWJ1dGVPdmVycmlkZSIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBdHRyaWJ1dGVPdmVycmlkZXMiLCAiQXR0cmlidXRlT3ZlcnJpZGVbXSB2YWx1ZSgpOyIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREVELCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGVkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGVkV2l0aEF0dHJpYnV0ZU92ZXJyaWRlc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVtYmVkZGVkIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkF0dHJpYnV0ZU92ZXJyaWRlcyIsICJBdHRyaWJ1dGVPdmVycmlkZVtdIHZhbHVlKCk7Iik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRURERUQsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkZWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlcygpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGVkV2l0aDJBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW1iZWRkZWQiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQXR0cmlidXRlT3ZlcnJpZGUiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQXR0cmlidXRlT3ZlcnJpZGVzIiwgIkF0dHJpYnV0ZU92ZXJyaWRlW10gdmFsdWUoKTsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERFRCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZPT1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVJcIil9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZUFuZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRlZCIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBdHRyaWJ1dGVPdmVycmlkZSIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBdHRyaWJ1dGVPdmVycmlkZXMiLCAiQXR0cmlidXRlT3ZlcnJpZGVbXSB2YWx1ZSgpOyIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREVELCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGVkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBWlwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVQdWJsaWNBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICBwdWJsaWMgU3RyaW5nIGZvbzsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlUGFja2FnZUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICBTdHJpbmcgZm9vOyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVGaW5hbEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICBwdWJsaWMgZmluYWwgU3RyaW5nIGZvbzsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUF0dHJpYnV0ZUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQXR0cmlidXRlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSkpOwotCX0KLQotCS8vVGhpcyB3aWxsIHJlc3VsdCBpbiBhIGNvbXBpbGF0aW9uIGVycm9yLCBidXQgd2UgYXNzdW1lIHRoZSBmaXJzdCBjb2x1bW4gZm91bmQKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eU11bHRpcGxlQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uUmVzb3VyY2UgPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDb2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtblJlc291cmNlID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtblJlc291cmNlLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihuYW1lPVwiRk9PXCIpIiwgY3UpOwotCi0JCWNvbHVtblJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQXR0cmlidXRlTWFwcGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhJZEFuZEJhc2ljKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVSZXNvdXJjZS5tYXBwaW5nQW5ub3RhdGlvbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnNTaXplKCkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQykpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBqYXZhQXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb24gPSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKGphdmFBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQmFzaWMiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASWQiLCBjdSk7Ci0JCQotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb01hbnkiLCAiIik7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnNldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVSZXNvdXJjZS5tYXBwaW5nQW5ub3RhdGlvbnNTaXplKCkpOwotCQlqYXZhQXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb24gPSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKGphdmFBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIE9uZVRvTWFueUFubm90YXRpb24pOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQElkIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXNpYyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEphdmFBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlUmVzb3VyY2UubWFwcGluZ0Fubm90YXRpb25zU2l6ZSgpKTsKLQkJCi0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuSUQpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBJZEFubm90YXRpb24pOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQElkIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKYXZhQXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSk7Ci0JCQotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLklEKTsKLQkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpIGluc3RhbmNlb2YgSWRBbm5vdGF0aW9uKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASWQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SmF2YUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhJZENvbHVtbkdlbmVyYXRlZFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpIGluc3RhbmNlb2YgSWRBbm5vdGF0aW9uKTsKLQkJCi0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhc2ljIiwgIiIpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBCYXNpY0Fubm90YXRpb24pOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBJZCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBHZW5lcmF0ZWRWYWx1ZSIsIGN1KTsgLy9ub3Qgc3VwcG9ydGVkIGJ5IEJhc2ljCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uIiwgY3UpOyAvL2NvbW1vbiBiZXR3ZWVuIElkIGFuZCBCYXNpYwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SmF2YUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhJZENvbHVtbkdlbmVyYXRlZFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpIGluc3RhbmNlb2YgSWRBbm5vdGF0aW9uKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnNldE1hcHBpbmdBbm5vdGF0aW9uKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBJZCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBHZW5lcmF0ZWRWYWx1ZSIsIGN1KTsgLy9ub3Qgc3VwcG9ydGVkIGJ5IEJhc2ljCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uIiwgY3UpOyAvL2NvbW1vbiBiZXR3ZWVuIElkIGFuZCBCYXNpYwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhQXR0cmlidXRlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbiIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbiIsIGN1KTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDb2x1bW4iLCBjdSk7Ci0JfQotCQotCS8vdXBkYXRlIHNvdXJjZSBjb2RlIHRvIGNoYW5nZSBmcm9tIEBJZCB0byBAT25lVG9PbmUgYW5kIG1ha2Ugc3VyZSBAQ29sdW1uIGlzIG5vdCByZW1vdmVkCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUF0dHJpYnV0ZU1hcHBpbmdJblNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCWZpbmFsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQotCQlpZEZpZWxkKGN1KS5lZGl0KG5ldyBFZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkoKElkSW1wbCkgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSkuZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsJCQotCQkKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9PbmUiLCAiIik7Ci0JCWN1LmNyZWF0ZUltcG9ydCgiamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmUiLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWlkRmllbGQoY3UpLmVkaXQobmV3IEVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU9uZVRvT25lSW1wbC5ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwkJCi0JCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQXR0cmlidXRlQW5ub3RhdGlvbnNOZXN0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVtYmVkZGVkV2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSkpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uc05vTmVzdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQXR0cmlidXRlQW5ub3RhdGlvbnNDb250YWluZXJOb05lc3RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoQXR0cmlidXRlT3ZlcnJpZGVzRW1wdHkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUF0dHJpYnV0ZUFubm90YXRpb25zTmVzdGFibGVBbmRDb250YWluZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZUFuZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUykpKTsKLQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKS5uZXh0KCk7CQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCQkgICAgICAgIAotCS8vCQkJLS0+PglAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0iRk9PIikKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YUF0dHJpYnV0ZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIikiLCBjdSk7Ci0JfQotCQotCS8vICBARW1iZWRkZWQgICAgIAkJCQktLT4+ICAgIEBFbWJlZGRlZAotCS8vCUBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPSJGT08iKQkJQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9IkZPTyIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0iQkFSIil9KQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YUF0dHJpYnV0ZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZSgpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBdHRyaWJ1dGVPdmVycmlkZXMiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZPT1wiKSxAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBUlwiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUykpKTsKLQl9Ci0JCi0JLy8gIEBFbWJlZGRlZCAgICAgCQkJCQotCS8vCUBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9IkZPTyIpKQotCS8vICAgICAgICAgICB8fAotCS8vICAgICAgICAgICBcLwotCS8vICBARW1iZWRkZWQgICAgIAkJCQkKLQkvLwlAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0iRk9PIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPSJCQVIiKX0pCi0JcHVibGljIHZvaWQgdGVzdEFkZEphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZPT1wiKSxAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBUlwiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUykpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVJcIiksQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUykpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpKSk7Ci0JfQotCQotCS8vICBARW1iZWRkZWQgICAgIAkJCQkKLQkvLwlAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiKQotCS8vICBAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBUlwiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVpcIil9KQotCS8vCQkJIHx8Ci0JLy8gICAgICAgICAgIFwvCi0JLy8gIEBFbWJlZGRlZCAgICAgCQkJCQotCS8vCUBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIpCi0JLy8gIEBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBWlwiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCT09cIil9KQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhQXR0cmlidXRlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyNCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVtYmVkZGVkV2l0aEF0dHJpYnV0ZU92ZXJyaWRlQW5kQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUykpKTsKLQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBWlwiKSwiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGV9KSIsIGN1KTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQk9PIik7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERVMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSkpOwotCi0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9ucy5uZXh0KCk7CQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9ucy5uZXh0KCk7CQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9ucy5uZXh0KCk7CQotCQlhc3NlcnRFcXVhbHMoIkJPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVJcIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFaXCIpLCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQk9PXCIpfSkiLCBjdSk7Ci0JfQotCi0JLy9ARW50aXR5Ci0JLy9AQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0iRk9PIikKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSmF2YUF0dHJpYnV0ZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVtYmVkZGVkV2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXR0cmlidXRlT3ZlcnJpZGUiLCBjdSk7Ci0JfQotCQotCi0JLy9ARW50aXR5Ci0JLy9AU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShuYW1lPSJGT08iKSkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSmF2YUF0dHJpYnV0ZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBdHRyaWJ1dGVPdmVycmlkZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBdHRyaWJ1dGVPdmVycmlkZXMiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKYXZhQXR0cmlidXRlQW5ub3RhdGlvbkluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoMkF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFICwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBUlwiIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEF0dHJpYnV0ZU92ZXJyaWRlcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uSW5kZXgyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoMkF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCW5ld0Fubm90YXRpb24uc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZPT1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVJcIiksIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVpcIil9KSIsIGN1KTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFaXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSmF2YVR5cGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoMkF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQluZXdBbm5vdGF0aW9uLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpLCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFaXCIpfSkiLCBjdSk7Ci0JCQotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UubW92ZSgwLCAyLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBWlwiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIiksIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKYXZhVHlwZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoMkF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJbmV3QW5ub3RhdGlvbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBUlwiKSwiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBWlwiKX0pIiwgY3UpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UubW92ZSgxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBUlwiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIiksIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVpcIil9KSIsIGN1KTsKLQl9CQotCi0JLy9tb3JlIGRldGFpbGVkIHRlc3RzIGluIEpQVFRvb2xzVGVzdHMKLQlwdWJsaWMgdm9pZCB0ZXN0SXNQZXJzaXN0YWJsZUZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5pc1BlcnNpc3RhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNQZXJzaXN0YWJsZUZpZWxkMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhOb25SZXNvbHZpbmdGaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJTGlzdDxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gKExpc3Q8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4pIENsYXNzVG9vbHMuZmllbGRWYWx1ZSh0eXBlUmVzb3VyY2UsICJmaWVsZHMiKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IGF0dHJpYnV0ZXMuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZVJlc291cmNlLmlzRm9yRmllbGQoKSk7Ci0JCWFzc2VydFRydWUoYXR0cmlidXRlUmVzb3VyY2UuaXNQZXJzaXN0YWJsZSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwotCi0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJ0ZXN0IiwgIkZvby5qYXZhIiwgInB1YmxpYyBjbGFzcyBGb28ge30iKTsKLQkJdGhpcy5qYXZhUmVzb3VyY2VNb2RlbC5yZXNvbHZlVHlwZXMoKTsKLQkJCi0JCWFzc2VydFRydWUoYXR0cmlidXRlUmVzb3VyY2UuaXNQZXJzaXN0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFF1YWxpZmllZFR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aE5vblJlc29sdmluZ0ZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlMaXN0PEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSAoTGlzdDxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPikgQ2xhc3NUb29scy5maWVsZFZhbHVlKHR5cGVSZXNvdXJjZSwgImZpZWxkcyIpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gYXR0cmlidXRlcy5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5Gb28iLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRRdWFsaWZpZWRUeXBlTmFtZSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwotCi0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJ0ZXN0IiwgIkZvby5qYXZhIiwgInB1YmxpYyBjbGFzcyBGb28ge30iKTsKLQkJdGhpcy5qYXZhUmVzb3VyY2VNb2RlbC5yZXNvbHZlVHlwZXMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygidGVzdC5Gb28iLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRRdWFsaWZpZWRUeXBlTmFtZSgpKTsKLQl9Ci0JCi0JCi0JLy9tb3JlIGRldGFpbGVkIHRlc3RzIGluIEpQVFRvb2xzVGVzdHMKLQlwdWJsaWMgdm9pZCB0ZXN0SXNQZXJzaXN0YWJsZU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnByb3BlcnRpZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZVJlc291cmNlLmlzUGVyc2lzdGFibGUoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzUGVyc2lzdGFibGVNZXRob2QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aE5vblJlc29sdmluZ01ldGhvZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJTGlzdDxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gKExpc3Q8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4pIENsYXNzVG9vbHMuZmllbGRWYWx1ZSh0eXBlUmVzb3VyY2UsICJtZXRob2RzIik7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSBhdHRyaWJ1dGVzLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5pc0ZvclByb3BlcnR5KCkpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZVJlc291cmNlLmlzUGVyc2lzdGFibGUoKSk7Ly9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwotCi0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJ0ZXN0IiwgIkZvby5qYXZhIiwgInB1YmxpYyBjbGFzcyBGb28ge30iKTsKLQkJdGhpcy5qYXZhUmVzb3VyY2VNb2RlbC5yZXNvbHZlVHlwZXMoKTsKLQkJCi0JCWFzc2VydFRydWUoYXR0cmlidXRlUmVzb3VyY2UuaXNQZXJzaXN0YWJsZSgpKTsKLQl9Ci0JCi0JLy90aGlzIHRlc3RzIHRoYXQgd2UgaGFuZGxlIG11dGxpcGxlIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBpbiBvbmUgbGluZS4KLQkvL1RoZSBhbm5vdGF0aW9ucyBzaG91bGQgYXBwbHkgdG8gYWxsIGZpZWxkcyBkZWZpbmVkLiAgVGhpcyBpcyBub3QgcmVhbGx5IGEgdXNlZnVsCi0JLy90aGluZyB0byBkbyB3aXRoIEpQQSBiZXlvbmQgdGhlIG1vc3QgYmFzaWMgdGhpbmdzIHRoYXQgdXNlIGRlZmF1bHQgY29sdW1uIG5hbWVzCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVmFyaWFibGVEZWNsYXJhdGlvbnNQZXJMaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5TXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0aW9uc1BlckxpbmUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuZmllbGRzKCkpKTsKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gZmllbGRzID0gdHlwZVJlc291cmNlLmZpZWxkcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gZmllbGRzLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQlhdHRyaWJ1dGVSZXNvdXJjZSA9IGZpZWxkcy5uZXh0KCk7Ci0JCWNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNQdWJsaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlUHVibGljQXR0cmlidXRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZS5pc1B1YmxpYygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzUHVibGljRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlUGFja2FnZUF0dHJpYnV0ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlLmlzUHVibGljKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0ZpbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUZpbmFsQXR0cmlidXRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZS5pc0ZpbmFsKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0ZpbmFsRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlUGFja2FnZUF0dHJpYnV0ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlLmlzRmluYWwoKSk7CQkKLQl9Ci0JCi0JLy9UT0RPIGFkZCB0ZXN0cyBmb3IgSlBUVG9vbHMgc3RhdGljIG1ldGhvZHMKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzY0ZmY4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVudGl0eUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyLkVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtYmVkZGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW1iZWRkYWJsZSIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYXBwZWRTdXBlcmNsYXNzIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJTZWNvbmRhcnlUYWJsZSIsICJTdHJpbmcgbmFtZSgpOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2Vjb25kYXJ5VGFibGVzIiwgIiIpOwkJCi0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RJbnZhbGlkQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0KLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KCJqYXZheC5wZXJzaXN0ZW5jZS5Gb28iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARm9vIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARm9vIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE1lbWJlckVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVFbWJlZGRhYmxlQW5ub3RhdGlvbigpOwotCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRUREQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZE1lbWJlclR5cGVUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIEBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb28geyB9IikuYXBwZW5kKENSKTsKLQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUR1cGxpY2F0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5KG5hbWU9XCJGaXJzdEVudGl0eVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5KG5hbWU9XCJTZWNvbmRFbnRpdHlcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRUREQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZEFuZE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTm9uUGVyc2lzdGFibGVNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRQZXJzaXN0YWJsZU1ldGhvZE5vblBlcnNpc3RhYmxlRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQ29sdW1uIiwgIiIpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbiIpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBub3RQZXJzaXN0YWJsZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0KLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlOb1BlcnNpc3RhYmxlRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kTWVtYmVyVHlwZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5kZWxldGUoc2IuaW5kZXhPZigicHJpdmF0ZSBpbnQgaWQ7IiksIHNiLmluZGV4T2YoInByaXZhdGUgaW50IGlkOyIpICsgInByaXZhdGUgaW50IGlkOyIubGVuZ3RoKCkpOwotCQkJCXNiLmRlbGV0ZShzYi5pbmRleE9mKCJwcml2YXRlIFN0cmluZyBuYW1lOyIpLCBzYi5pbmRleE9mKCJwcml2YXRlIFN0cmluZyBuYW1lOyIpICsgInByaXZhdGUgU3RyaW5nIG5hbWU7Ii5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotLy8JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlMYXJnZShmaW5hbCBpbnQgaSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLS8vCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkgKyBpKTsKLS8vCQkJfQotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0vLwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiICsgaSk7Ci0vLwkJCQlzYi5hcHBlbmQoQ1IpOwotLy8JCQl9Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgU3RyaW5nIHR5cGVOYW1lKCkgewotLy8JCQkJcmV0dXJuIFRZUEVfTkFNRSArIGk7Ci0vLwkJCX0KLS8vCQl9KTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgdm9pZCB0ZXN0TGFyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlmb3IgKGludCBpID0gU1RBUlQ7IGkgPD0gRU5EOyBpKyspIHsKLS8vCQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiAraSwgIlN0cmluZyBuYW1lKCk7Iik7Ci0vLwkJfQotLy8KLS8vCQlMaXN0PElDb21waWxhdGlvblVuaXQ+IGN1cyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBpbGF0aW9uVW5pdD4oKTsKLS8vCQlmb3IgKGludCBpID0gU1RBUlQ7IGkgPD0gRU5EOyBpKyspIHsKLS8vCQkJY3VzLmFkZChjcmVhdGVUZXN0RW50aXR5TGFyZ2UoaSkpOwotLy8JCX0KLS8vCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0vLwkJTGlzdDxKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZT4gdHlwZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2U+KCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBFTkQ7IGkrKykgewotLy8JCQl0eXBlUmVzb3VyY2VzLmFkZChidWlsZEphdmFUeXBlUmVzb3VyY2UoY3VzLmdldChpKSkpOyAKLS8vCQl9Ci0vLwkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLS8vCQkKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oZW5kLXN0YXJ0ICsgIm1zIik7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBFTkQ7IGkrKykgewotLy8JCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlcy5nZXQoaSkuamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbnMoKSkpOwotLy8JCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZXMuZ2V0KGkpLmphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24oSlBBLkVOVElUWSArIChpKzEpKSk7Ci0vLwkJfQotLy8JCQotLy8KLS8vLy8JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuamF2YVR5cGVBbm5vdGF0aW9ucygpKSk7Ci0vLwl9Ci0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRhYmxlIiwgIlN0cmluZyBuYW1lKCk7IFN0cmluZyBzY2hlbWEoKTsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUobmFtZT1cIkZPT1wiLCBzY2hlbWE9XCJCQVJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotLy8JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVBbmRJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotLy8JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRhYmxlIiwgIlN0cmluZyBuYW1lKCk7IFN0cmluZyBzY2hlbWEoKTsiKTsKLS8vCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZENsYXNzIiwgIkNsYXNzIHZhbHVlKCk7Iik7Ci0vLwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLS8vCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UQUJMRSwgSlBBLklEX0NMQVNTKTsKLS8vCQkJfQotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0vLwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLS8vCQkJCXNiLmFwcGVuZChDUik7Ci0vLwkJCQlzYi5hcHBlbmQoIkBUYWJsZSIpOwotLy8JCQkJc2IuYXBwZW5kKENSKTsKLS8vCQkJCXNiLmFwcGVuZCgiQElkQ2xhc3MiKTsKLS8vCQkJfQotLy8JCX0pOwotLy8JfQotLy8KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU11bHRpcGxlVGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGFibGUiLCAiU3RyaW5nIG5hbWUoKTsgU3RyaW5nIHNjaGVtYSgpOyIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShuYW1lPVwiRk9PXCIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShuYW1lPVwiQkFSXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbXB0eVNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlY29uZGFyeVRhYmxlIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlY29uZGFyeVRhYmxlcyIsICJTZWNvbmRhcnlUYWJsZVtdIHZhbHVlKCk7Iik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2Vjb25kYXJ5VGFibGUiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2Vjb25kYXJ5VGFibGVzIiwgIlNlY29uZGFyeVRhYmxlW10gdmFsdWUoKTsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJGT09cIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGgyU2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2Vjb25kYXJ5VGFibGUiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2Vjb25kYXJ5VGFibGVzIiwgIlNlY29uZGFyeVRhYmxlW10gdmFsdWUoKTsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZUFuZFNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlY29uZGFyeVRhYmxlIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlY29uZGFyeVRhYmxlcyIsICJTZWNvbmRhcnlUYWJsZVtdIHZhbHVlKCk7Iik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVpcIil9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNZW1iZXJUeXBlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0KLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kTWVtYmVyVHlwZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIiAgICAgc3RhdGljIGNsYXNzIEZvb1N0YXRpYyB7fSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgY2xhc3MgRm9vTm90U3RhdGljIHt9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICBAaW50ZXJmYWNlIE15QW5ub3RhdGlvbiB7fSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgZW51bSBNeUVudW0ge30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFUeXBlQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJYXNzZXJ0RXF1YWxzKDEsIHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFUeXBlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhVHlwZUFubm90YXRpb25OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKSk7Ci0JfQotCi0JLy9UaGlzIHdpbGwgcmVzdWx0IGluIGEgY29tcGlsYXRpb24gZXJyb3IsIGJ1dCB3ZSBhc3N1bWUgdGhlIGZpcnN0IHRhYmxlIGZvdW5kCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlNdWx0aXBsZVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUYWJsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQotCQlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCXRhYmxlUmVzb3VyY2Uuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKG5hbWU9XCJGT09cIikiLCBjdSk7Ci0KLQkJdGFibGVSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVHlwZU1hcHBpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZSgpOwotCQljcmVhdGVNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbigpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHR5cGVSZXNvdXJjZS5tYXBwaW5nQW5ub3RhdGlvbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdHlwZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkVNQkVEREFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkVOVElUWSkpOwotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBqYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uID0gdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIEVtYmVkZGFibGVBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbnRpdHkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARW1iZWRkYWJsZSIsIGN1KTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMoMSwgdHlwZVJlc291cmNlLm1hcHBpbmdBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24gPSB0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24pOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEVudGl0eSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBwZWRTdXBlcmNsYXNzIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEVtYmVkZGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlhc3NlcnRFcXVhbHMoMCwgdHlwZVJlc291cmNlLm1hcHBpbmdBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2Uuc2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkVOVElUWSk7Ci0JCWFzc2VydFRydWUodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBFbnRpdHlBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbnRpdHkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVBbm5vdGF0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlhc3NlcnRUcnVlKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpIGluc3RhbmNlb2YgRW50aXR5QW5ub3RhdGlvbik7Ci0JCQotCQl0eXBlUmVzb3VyY2Uuc2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkVNQkVEREFCTEUpOwotCQlhc3NlcnRUcnVlKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpIGluc3RhbmNlb2YgRW1iZWRkYWJsZUFubm90YXRpb24pOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBFbnRpdHkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEphdmFUeXBlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUiLCBjdSk7Ci0JCXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKYXZhVHlwZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUiLCBjdSk7Ci0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUiLCBjdSk7Ci0JfQotCQotCS8vdXBkYXRlIHNvdXJjZSBjb2RlIHRvIGNoYW5nZSBmcm9tIEBFbnRpdHkgdG8gQEVtYmVkZGFibGUgYW5kIG1ha2Ugc3VyZSBAVGFibGUgaXMgbm90IHJlbW92ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlVHlwZU1hcHBpbmdJblNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlmaW5hbCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJdGVzdFR5cGUoY3UpLmVkaXQobmV3IEVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCSgoRW50aXR5SW1wbCkgdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpLmdldERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKS5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7CQotCi0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVtYmVkZGFibGUiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJY3UuY3JlYXRlSW1wb3J0KCJqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRhYmxlIiwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCi0JCXRoaXMudGVzdFR5cGUoY3UpLmVkaXQobmV3IEVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVtYmVkZGFibGVJbXBsLkRFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUi5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7CQkKLQkJCi0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5FTlRJVFkpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkVNQkVEREFCTEUpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFUeXBlQW5ub3RhdGlvbnNOZXN0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUykpKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFUeXBlQW5ub3RhdGlvbnNOb05lc3RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YVR5cGVBbm5vdGF0aW9uc0NvbnRhaW5lck5vTmVzdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1wdHlTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFUeXBlQW5ub3RhdGlvbnNOZXN0YWJsZUFuZENvbnRhaW5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZUFuZFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUykpKTsKLQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUykubmV4dCgpOwkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCS8vICBARW50aXR5ICAgICAtLT4+ICAgIEBFbnRpdHkKLQkvLwkJCQkJCUBTZWNvbmRhcnlUYWJsZShuYW1lPSJGT08iKQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhVHlwZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpIiwgY3UpOwotCX0KLQkKLQkvLyAgQEVudGl0eSAgICAgCQkJCS0tPj4gICAgQEVudGl0eQotCS8vCUBTZWNvbmRhcnlUYWJsZShuYW1lPSJGT08iKQkJCUBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPSJGT08iKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9IkJBUiIpfSkJCi0JcHVibGljIHZvaWQgdGVzdEFkZEphdmFUeXBlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQljcmVhdGVTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpLEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7Ci0JCQotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUykpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKSkpOwotCX0KLQkKLQkvLyAgQEVudGl0eSAgICAgCQkJCQotCS8vCUBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKG5hbWU9IkZPTyIpKQotCS8vICAgICAgICAgICB8fAotCS8vICAgICAgICAgICBcLwotCS8vICBARW50aXR5ICAgICAJCQkJCi0JLy8JQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9IkZPTyIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT0iQkFSIil9KQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhVHlwZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpLEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7Ci0JCQotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUykpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YVR5cGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2Uuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKSxAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YVR5cGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXI2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2Uuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKSxAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUykpKTsKLQotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVpcIiksQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVJcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpfSkiLCBjdSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUykpKTsKLQl9Ci0KLQkvLyAgQEVudGl0eSAgICAgCQkJCQotCS8vCUBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpCi0JLy8gIEBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBWlwiKX0pCi0JLy8JCQkgfHwKLQkvLyAgICAgICAgICAgXC8KLQkvLyAgQEVudGl0eSAgICAgCQkJCQotCS8vCUBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpCi0JLy8gIEBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBWlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCT09cIil9KQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhVHlwZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVBbmRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpKSk7Ci0KLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVpcIiksIEBTZWNvbmRhcnlUYWJsZX0pIiwgY3UpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLnNldE5hbWUoIkJPTyIpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUykpKTsKLQotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBzZWNvbmRhcnlUYWJsZUFubm90YXRpb25zID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbnMubmV4dCgpOwkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZUFubm90YXRpb25zLm5leHQoKTsJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9ucy5uZXh0KCk7CQotCQlhc3NlcnRFcXVhbHMoIkJPTyIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVpcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQk9PXCIpfSkiLCBjdSk7Ci0JfQotCi0JLy9ARW50aXR5Ci0JLy9AU2Vjb25kYXJ5VGFibGUobmFtZT0iRk9PIikKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSmF2YVR5cGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSIsIGN1KTsKLQl9Ci0JCi0KLQkvL0BFbnRpdHkKLQkvL0BTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKG5hbWU9IkZPTyIpKQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKYXZhVHlwZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGVzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSmF2YVR5cGVBbm5vdGF0aW9uSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoMlNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJGT09cIiIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGVzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSmF2YVR5cGVBbm5vdGF0aW9uSW5kZXgyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aDJTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJbmV3QW5ub3RhdGlvbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVoiLCBjdSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVpcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKYXZhVHlwZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoMlNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQluZXdBbm5vdGF0aW9uLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9XCJGT09cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBWlwiKX0pIiwgY3UpOwotCQkKLQkJdHlwZVJlc291cmNlLm1vdmUoMCwgMiwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVpcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUphdmFUeXBlQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoMlNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQluZXdBbm5vdGF0aW9uLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9XCJGT09cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBWlwiKX0pIiwgY3UpOwotCQkKLQkJdHlwZVJlc291cmNlLm1vdmUoMiwgMCwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVJcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFaXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWVtYmVyVHlwZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJvbmx5IHBlcnNpc3RhYmxlIHR5cGVzIHNob3VsZCBiZSByZXR1cm5lZCBieSBuZXN0ZWRUeXBlcygpIiwgMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVudFR5cGUubmVzdGVkVHlwZXMoKSkpOwotCQkKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUxpc3Q8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IG5lc3RlZFR5cGVzID0gKExpc3Q8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+KSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUocGVyc2lzdGVudFR5cGUsICJuZXN0ZWRUeXBlcyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcyBhbmQgaW50ZXJmYWNlcyBzaG91bGQgYmUgaWdub3JlZCIsIDIsIENvbGxlY3Rpb25Ub29scy5zaXplKG5lc3RlZFR5cGVzKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlRW50aXR5QW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlEdXBsaWNhdGVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVudGl0eUFubm90YXRpb24gamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbiA9IChFbnRpdHlBbm5vdGF0aW9uKSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuRU5USVRZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGaXJzdEVudGl0eSIsIGphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW50VHlwZS5tYXBwaW5nQW5ub3RhdGlvbnNTaXplKCkpOwotCQkKLQkJamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbiA9IChFbnRpdHlBbm5vdGF0aW9uKSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoIkZpcnN0RW50aXR5IiwgamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQkKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8JCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NOb0F0dHJpYnV0ZXNBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NGaWVsZHNBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzTWV0aG9kc0Fubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgcGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzRmllbGRzQW5kTWV0aG9kc0Fubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkQW5kTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NOb25QZXJzaXN0YWJsZU1ldGhvZEFubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE5vblBlcnNpc3RhYmxlTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCWFzc2VydE51bGwocGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzUGVyc2lzdGFibGVNZXRob2RBbmROb25QZXJzaXN0YWJsZUZpZWxkQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkUGVyc2lzdGFibGVNZXRob2ROb25QZXJzaXN0YWJsZUZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBwZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NOb1BlcnNpc3RhYmxlRmllbGRzQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5Tm9QZXJzaXN0YWJsZUZpZWxkcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgcGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQkvL1RPRE8gbW9yZSB0ZXN0cyBoZXJlIHdpdGggc3VwZXJjbGFzc2VzIG90aGVyIHRoYW4gT2JqZWN0LgotCS8vMS4gVGVzdCB3aGVyZSB0aGUgc3VwZXJjbGFzcyBkb2VzIG5vdCByZXNvbHZlCi0JLy8yLiBUZXN0IGEgc3VwZXJjbGFzcyB0aGF0IGRvZXMgcmVzb2x2ZQotCS8vMy4gV2hhdCBhYm91dCBhIHN1cGVyY2xhc3MgdGhhdCBpcyBhIGNsYXNzIGZpbGUgaW4gYSBqYXI/PwotCS8vNC4KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgcGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJDbGFzc1F1YWxpZmllZE5hbWUoKSk7Ci0JCQotCX0KLQkKLQkvL21vcmUgZGV0YWlsZWQgdGVzdHMgaW4gSlBUVG9vbHNUZXN0cwotCXB1YmxpYyB2b2lkIHRlc3RJc1BlcnNpc3RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCWFzc2VydFRydWUocGVyc2lzdGVudFR5cGUuaXNQZXJzaXN0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRlZE1lbWJlclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhNZW1iZXJFbWJlZGRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuRU5USVRZKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5FTUJFRERBQkxFKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBuZXN0ZWRUeXBlID0gdHlwZVJlc291cmNlLm5lc3RlZFR5cGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKG5lc3RlZFR5cGUuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkVOVElUWSkpOwotCQlhc3NlcnROb3ROdWxsKG5lc3RlZFR5cGUuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkVNQkVEREFCTEUpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEludmFsaWRBbm5vdGF0aW9ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlhc3NlcnRFcXVhbHMoMCwgdHlwZVJlc291cmNlLm1hcHBpbmdBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnNTaXplKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVSZXNvdXJjZS5tYXBwaW5nQW5ub3RhdGlvbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnNTaXplKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRhMTkzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9UQUJMRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiA9ICJDT0xVTU5fREVGSU5JVElPTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIk1ZX1JFRl9DT0xVTU5fTkFNRSI7Ci0JCi0JcHVibGljIEpvaW5Db2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7ICIgKwotCQkJImJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJImJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCI7ICIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW4obmFtZT1cIiIgKyBDT0xVTU5fTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbih0YWJsZT1cIiIgKyBDT0xVTU5fVEFCTEUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWU9XCIiICsgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uPVwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudChmaW5hbCBTdHJpbmcgYm9vbGVhbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbigiICsgYm9vbGVhbkVsZW1lbnQgKyAiPXRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKG5hbWU9XCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9UQUJMRSwgY29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldFRhYmxlKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4odGFibGU9XCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQljb2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZT1cIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbj1cIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJ1bmlxdWUiKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQotCQljb2x1bW4uc2V0VW5pcXVlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbih1bmlxdWU9ZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFVuaXF1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoIm51bGxhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0VHJ1ZShjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldE51bGxhYmxlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKG51bGxhYmxlPWZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXROdWxsYWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJpbnNlcnRhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0VHJ1ZShjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldEluc2VydGFibGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihpbnNlcnRhYmxlPWZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRJbnNlcnRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoInVwZGF0YWJsZSIpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydFRydWUoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKHVwZGF0YWJsZT1mYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5zVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzczNDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uc1Rlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9UQUJMRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiA9ICJDT0xVTU5fREVGSU5JVElPTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIk1ZX1JFRl9DT0xVTU5fTkFNRSI7Ci0JCi0JcHVibGljIEpvaW5Db2x1bW5zVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOyAiICsKLQkJCSJib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOyAiICsKLQkJCSJib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJImJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOyAiICsKLQkJCSJTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyAiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5Db2x1bW5zQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsIAotCQkJIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbnNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUpvaW5Db2x1bW5zQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4obmFtZT1cIiIgKyBDT0xVTU5fTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbnNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbih0YWJsZT1cIiIgKyBDT0xVTU5fVEFCTEUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUpvaW5Db2x1bW5zQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWU9XCIiICsgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbnNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uPVwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoZmluYWwgU3RyaW5nIGJvb2xlYW5FbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbnNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbigiICsgYm9vbGVhbkVsZW1lbnQgKyAiPXRydWUpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbnNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUykubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpLm5leHQoKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihuYW1lPVwiRm9vXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUykubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbiIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9UQUJMRSwgY29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUykubmV4dCgpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldFRhYmxlKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKHRhYmxlPVwiRm9vXCIpKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUykubmV4dCgpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiRm9vXCIpKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04sIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbj1cIkZvb1wiKSkiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudCgidW5pcXVlIik7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpLm5leHQoKTsKLQotCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpLm5leHQoKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQotCQljb2x1bW4uc2V0VW5pcXVlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4odW5pcXVlPWZhbHNlKSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VW5pcXVlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudCgibnVsbGFibGUiKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUykubmV4dCgpOwotCi0JCWFzc2VydFRydWUoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpLm5leHQoKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXROdWxsYWJsZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4obnVsbGFibGU9ZmFsc2UpKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXROdWxsYWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJpbnNlcnRhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpLm5leHQoKTsKLQotCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUykubmV4dCgpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihpbnNlcnRhYmxlPWZhbHNlKSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJ1cGRhdGFibGUiKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUykubmV4dCgpOwotCi0JCWFzc2VydFRydWUoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUykubmV4dCgpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbih1cGRhdGFibGU9ZmFsc2UpKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbiIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEpvaW5Db2x1bW5Db3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKHtASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiksQEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OUykpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pbkNvbHVtblRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyh7QEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpLEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKLQkJCQkKLQkJam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKHtASm9pbkNvbHVtbihuYW1lPVwiQkFaXCIpLEBKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSwgQEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOwotCi0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTlMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUykpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKb2luQ29sdW1uQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyh7QEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpLEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmN2I0MWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEpvaW5UYWJsZVRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTkFNRSA9ICJNWV9TQ0hFTUEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX05BTUUgPSAiTVlfQ0FUQUxPRyI7Ci0JCi0JcHVibGljIEpvaW5UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsiICsKLQkJCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlVuaXF1ZUNvbnN0cmFpbnQiLCAiU3RyaW5nW10gY29sdW1uTmFtZXMoKTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5UYWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKTsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pblRhYmxlIiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjtKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OyBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pblRhYmxlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pblRhYmxlV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pblRhYmxlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUobmFtZT1cIiIgKyBUQUJMRV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luVGFibGVXaXRoU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUpvaW5UYWJsZUFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX1RBQkxFKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUoc2NoZW1hPVwiIiArIFNDSEVNQV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luVGFibGVXaXRoQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luVGFibGVBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5UYWJsZShjYXRhbG9nPVwiIiArIENBVEFMT0dfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUpvaW5UYWJsZUFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX1RBQkxFLCBKUEEuVU5JUVVFX0NPTlNUUkFJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSl9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pblRhYmxlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fVEFCTEUsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5UYWJsZShqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiKSwgQEpvaW5Db2x1bW59KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUpvaW5UYWJsZUFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX1RBQkxFLCBKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLCBASm9pbkNvbHVtbn0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0TmFtZSgpKTsKLQotCQl0YWJsZS5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUobmFtZT1cIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgdGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXRhYmxlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldENhdGFsb2coKSk7Ci0KLQkJdGFibGUuc2V0Q2F0YWxvZygiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGNhdGFsb2c9XCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXRhbG9nTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aENhdGFsb2coKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXRhYmxlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCXRhYmxlLnNldFNjaGVtYSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoc2NoZW1hPVwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCXRhYmxlLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCi0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXNTaXplKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkJBUlwiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnR9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSl9KSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cz1AVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pKSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pfSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSl9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSl9KSIsIGN1KTsKLQkJCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiRk9PXCJ9KX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQotCQkKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDEpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQotCQl0YWJsZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucz1ASm9pbkNvbHVtbikiLCBjdSk7Ci0KLQkJCi0JCXRhYmxlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCi0JCXRhYmxlLm1vdmVKb2luQ29sdW1uKDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwotCQkKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0KLQotCQl0YWJsZS5tb3ZlSm9pbkNvbHVtbigwLCAyKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSB0YWJsZS5qb2luQ29sdW1ucygpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cImZvb1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52ZXJzZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW52ZXJzZUpvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0KLQkJCi0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW52ZXJzZUpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigyKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpfSkiLCBjdSk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmludmVyc2VKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXRhYmxlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSkiLCBjdSk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmludmVyc2VKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQl0YWJsZS5tb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmludmVyc2VKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUludmVyc2VKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDEpLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmludmVyc2VKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJdGFibGUubW92ZUludmVyc2VKb2luQ29sdW1uKDAsIDIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnM9e0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbnZlcnNlSm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cImZvb1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcGFDb21waWxhdGlvblVuaXRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwYUNvbXBpbGF0aW9uVW5pdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NWZkMjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwYUNvbXBpbGF0aW9uVW5pdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpwYUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSnBhQ29tcGlsYXRpb25Vbml0VGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCQotCXB1YmxpYyBKcGFDb21waWxhdGlvblVuaXRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGJ1aWxkSmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdEpwYVByb2plY3QocHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7ICAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImphdmF4LnBlcnNpc3RlbmNlIiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYUNvbXBpbGF0aW9uVW5pdCBnZXRKcGFDb21waWxhdGlvblVuaXRSZXNvdXJjZShJQ29tcGlsYXRpb25Vbml0IHRlc3RDb21waWxhdGlvblVuaXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gKChUZXN0SnBhUHJvamVjdCkgdGhpcy5qYXZhUHJvamVjdCkuZ2V0SnBhUHJvamVjdCgpOwotCQlKcGFGaWxlIGpwYUZpbGUgPSBqcGFQcm9qZWN0LmdldEpwYUZpbGUoKElGaWxlKSB0ZXN0Q29tcGlsYXRpb25Vbml0LmdldFJlc291cmNlKCkpOwotCQlKYXZhUmVzb3VyY2VNb2RlbCBqYXZhUmVzb3VyY2VNb2RlbCA9IChKYXZhUmVzb3VyY2VNb2RlbCkganBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCk7Ci0JCXJldHVybiBqYXZhUmVzb3VyY2VNb2RlbC5nZXRKcGFDb21waWxhdGlvblVuaXQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFBlcnNpc3RlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUNvbXBpbGF0aW9uVW5pdCBqcGFDb21waWxhdGlvblVuaXQgPSBnZXRKcGFDb21waWxhdGlvblVuaXRSZXNvdXJjZShjb21waWxhdGlvblVuaXQpOwotCQkKLQkJYXNzZXJ0VHJ1ZShqcGFDb21waWxhdGlvblVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpIGluc3RhbmNlb2YgRW50aXR5QW5ub3RhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnB0SmF2YVJlc291cmNlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRKYXZhUmVzb3VyY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODFhMDYwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRKYXZhUmVzb3VyY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEphdmFSZXNvdXJjZVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHN1aXRlKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoYm9vbGVhbiBhbGwpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRKYXZhUmVzb3VyY2VUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAoYWxsKSB7Ci0JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSnBhQ29tcGlsYXRpb25Vbml0VGVzdHMuY2xhc3MpOwotCQl9Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKUFRUb29sc1Rlc3RzLmNsYXNzKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXNzb2NpYXRpb25PdmVycmlkZXNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEF0dHJpYnV0ZU92ZXJyaWRlc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJhc2ljVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sdW1uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGlzY3JpbWluYXRvclZhbHVlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtYmVkZGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbWJlZGRlZFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtYmVkZGVkSWRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbnRpdHlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbnVtZXJhdGVkVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJhdGVkVmFsdWVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJZENsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSWRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJbmhlcml0YW5jZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpvaW5Db2x1bW5UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKb2luQ29sdW1uc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpvaW5UYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExvYlRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1hbnlUb01hbnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYW55VG9PbmVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYXBLZXlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYXBwZWRTdXBlcmNsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTmFtZWROYXRpdmVRdWVyeVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5hbWVkTmF0aXZlUXVlcmllc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5hbWVkUXVlcnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOYW1lZFF1ZXJpZXNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPbmVUb01hbnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPbmVUb09uZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yZGVyQnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFF1ZXJ5SGludFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNlY29uZGFyeVRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2Vjb25kYXJ5VGFibGVzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUYWJsZUdlbmVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVGVtcG9yYWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2llbnRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWZXJzaW9uVGVzdHMuY2xhc3MpOwotCQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEphdmFSZXNvdXJjZVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Mb2JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0xvYlRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjI5OGQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0xvYlRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBMb2JUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIExvYlRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkxvYiIsICIiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5MT0IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBMb2IiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdExvYigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlMb2JBbm5vdGF0aW9uIGxvYiA9IChMb2JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5MT0IpOwotCQlhc3NlcnROb3ROdWxsKGxvYik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvTWFueVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvTWFueVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmIxYTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNYW55VG9NYW55VGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgTWFueVRvTWFueVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9NYW55IiwgIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRmV0Y2hUeXBlLkxBWlk7IENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQgPSB7fTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiQ2FzY2FkZVR5cGUiLCAiQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hbnlUb01hbnkiLCAiRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBGZXRjaFR5cGUuTEFaWTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiRmV0Y2hUeXBlIiwgIkVBR0VSLCBMQVpZIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19NQU5ZLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkoZmV0Y2g9RmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9NYW55IiwgIkNsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsgIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSh0YXJnZXRFbnRpdHk9QW5ub3RhdGlvblRlc3RUeXBlLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hbnlUb01hbnkiLCAiU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdFwiXCI7Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkNhc2NhZGVUeXBlIiwgIkFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSCIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkobWFwcGVkQnk9XCJmb29cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueVdpdGhDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hbnlUb01hbnkiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlksIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KGNhc2NhZGU9Q2FzY2FkZVR5cGUuQUxMKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9NYW55IiwgIkNhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQgPSB7fTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiQ2FzY2FkZVR5cGUiLCAiQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19NQU5ZLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueShjYXNjYWRlPXtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueVdpdGhEdXBsaWNhdGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hbnlUb01hbnkiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlksIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KGNhc2NhZGU9e0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5NRVJHRX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnROb3ROdWxsKG1hbnlUb01hbnkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoZmV0Y2g9TEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZldGNoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgbWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkodGFyZ2V0RW50aXR5PUZvby5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRFbnRpdHlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidGFyZ2V0RW50aXR5IiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBtYW55VG9NYW55LmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KHRhcmdldEVudGl0eT1Gb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgbWFueVRvTWFueS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoTWFwcGVkQnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJbWFueVRvTWFueS5zZXRNYXBwZWRCeSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShtYXBwZWRCeT1cImJhclwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhNYXBwZWRCeSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibWFwcGVkQnkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZT1BTEwpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlPU1FUkdFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlPVBFUlNJU1QpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlUmVtb3ZlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZT1SRU1PVkUpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnkuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlUmVmcmVzaCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGU9UkVGUkVTSCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzY2FkZU1vcmVUaGFuT25jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkvL2Egc2Vjb25kIENhc2NhZGVUeXBlLkFsbCBzaG91bGQgbm90IGhhdmUgYmVlbiBhZGRlZAotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZT1DYXNjYWRlVHlwZS5BTEwpIiwgY3UpOwotCQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nIGNhc2NhZGVBbGwgdG8gZmFsc2UgYWdhaW4sIHNob3VsZCBqdXN0IGRvIG5vdGhpbmcKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRHVwbGljYXRlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOyAvL1RPRE8gc2hvdWxkIHRoZSByZXNvdXJjZSBtb2RlbCBoYW5kbGUgdGhpcyBhbmQgcmVtb3ZlIGJvdGggTUVSR0UgCi0JCQkJCQkJCQkJICAvL3NldHRpbmdzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHNldCBpdCBmYWxzZSB0d2ljZT8KLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoTXVsdGlwbGVDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlPVJFTU9WRSkiLCBjdSk7Ci0JCQotCQltYW55VG9NYW55LnNldENhc2NhZGVSZW1vdmUoZmFsc2UpOwkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb09uZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNTU5NTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb09uZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgTWFueVRvT25lVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFueVRvT25lIiwgIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRmV0Y2hUeXBlLkxBWlk7IENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQgPSB7fTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiQ2FzY2FkZVR5cGUiLCAiQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hbnlUb09uZSIsICJGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEZldGNoVHlwZS5MQVpZOyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJGZXRjaFR5cGUiLCAiRUFHRVIsIExBWlkiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSwgSlBBLkZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFueVRvT25lIiwgIkNsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZSh0YXJnZXRFbnRpdHk9QW5ub3RhdGlvblRlc3RUeXBlLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9PbmUiLCAiYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZShvcHRpb25hbD10cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9PbmUiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZShjYXNjYWRlPUNhc2NhZGVUeXBlLkFMTCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9PbmUiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZShjYXNjYWRlPXtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFueVRvT25lIiwgIkNhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQgPSB7fTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiQ2FzY2FkZVR5cGUiLCAiQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19PTkUsIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUoY2FzY2FkZT17Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLk1FUkdFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydE5vdE51bGwobWFueVRvT25lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9PbmUuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG1hbnlUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGZldGNoPUxBWlkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJmZXRjaCIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJbWFueVRvT25lLnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZSh0YXJnZXRFbnRpdHk9Rm9vLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJbWFueVRvT25lLnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidGFyZ2V0RW50aXR5IiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgbWFueVRvT25lLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJbWFueVRvT25lLnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZSh0YXJnZXRFbnRpdHk9Rm9vLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgbWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgbWFueVRvT25lLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCkpOy8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShvcHRpb25hbD1mYWxzZSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPcHRpb25hbE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm9wdGlvbmFsIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGU9QUxMKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVNZXJnZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZT1NRVJHRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZT1QRVJTSVNUKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGU9UkVNT1ZFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmUuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVSZWZyZXNoKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlPVJFRlJFU0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzY2FkZU1vcmVUaGFuT25jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aENhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJLy9hIHNlY29uZCBDYXNjYWRlVHlwZS5BbGwgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYWRkZWQKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZT1DYXNjYWRlVHlwZS5BTEwpIiwgY3UpOwotCQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JCQotCQkvL3Rlc3Qgc2V0dGluZyBjYXNjYWRlQWxsIHRvIGZhbHNlIGFnYWluLCBzaG91bGQganVzdCBkbyBub3RoaW5nCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aER1cGxpY2F0ZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsvL1RPRE8gc2hvdWxkIHRoZSByZXNvdXJjZSBtb2RlbCBoYW5kbGUgdGhpcyBhbmQgcmVtb3ZlIGJvdGggTUVSR0UgCi0JCQkJCQkJCQkJLy9zZXR0aW5ncyBpbnN0ZWFkIG9mIGhhdmluZyB0byBzZXQgaXQgZmFsc2UgdHdpY2U/Ci0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoTXVsdGlwbGVDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZT1SRU1PVkUpIiwgY3UpOwotCQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVSZW1vdmUoZmFsc2UpOwkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBLZXlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcEtleVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOGM4OTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcEtleVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNYXBLZXlUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIE1hcEtleVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hcEtleSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBfS0VZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcEtleVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hcEtleSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBfS0VZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5KG5hbWU9XCJrZXlcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwS2V5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BUF9LRVkpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBLZXlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQVBfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcEtleSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0KLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFQX0tFWSk7Ci0KLQkJbWFwS2V5LnNldE5hbWUoImZvbyIpOwotCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleShuYW1lPVwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXkobmFtZT1cImZvb1wiKSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhNjZjZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIE1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFwcGVkU3VwZXJjbGFzcyIsICIiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0FuZEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYXBwZWRTdXBlcmNsYXNzIiwgIiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGVkU3VwZXJjbGFzc0FuZEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0FuZEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSB0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIEVudGl0eUFubm90YXRpb24pOwotCQkKLQkJTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24gbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGVkU3VwZXJjbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyaWVzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWZkMGM3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE5hbWVkTmF0aXZlUXVlcmllc1Rlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTkFNRSA9ICJteVF1ZXJ5IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUVVFUlkgPSAiU0VMRUNUIG5hbWUgRlJPTSBFbXBsb3llZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1JFU1VMVF9DTEFTUyA9ICJSZXN1bHQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9SRVNVTFRfU0VUX01BUFBJTkcgPSAicmVzdWx0U2V0TWFwcGluZyI7Ci0JCi0JcHVibGljIE5hbWVkTmF0aXZlUXVlcmllc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVRdWVyeUhpbnRBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5hbWVkTmF0aXZlUXVlcnkiLCAiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiU3RyaW5nIHF1ZXJ5KCk7IiArIAotCQkJIlF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdHt9OyIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOYW1lZE5hdGl2ZVF1ZXJpZXMiLCAKLQkJCSJOYW1lZE5hdGl2ZVF1ZXJ5W10gdmFsdWUoKTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUXVlcnlIaW50IiwgIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIlN0cmluZyB2YWx1ZSgpOyIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoU3RyaW5nRWxlbWVudCgibmFtZSIsIFFVRVJZX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoInF1ZXJ5IiwgUVVFUllfUVVFUlkpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0U2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoU3RyaW5nRWxlbWVudCgicmVzdWx0U2V0TWFwcGluZyIsIFFVRVJZX1JFU1VMVF9TRVRfTUFQUElORyk7Ci0JfQotCQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkoIiArIGVsZW1lbnROYW1lICsgIj1cIiIgKyB2YWx1ZSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0Q2xhc3M9IiArIFFVRVJZX1JFU1VMVF9DTEFTUyArICIuY2xhc3MpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5SGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBKUEEuUVVFUllfSElOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcmllcyhATmFtZWROYXRpdmVRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpLCBAUXVlcnlIaW50fSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBKUEEuUVVFUllfSElOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcnkobmFtZT1cImZvb1wiLCBxdWVyeT1cImJhclwiLCBoaW50cz1AUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIiksIHJlc3VsdENsYXNzPUZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZz1cIm1hcHBpbmdcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbiBuYW1lZFF1ZXJpZXMgPSAoTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChuYW1lZFF1ZXJ5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbiBuYW1lZFF1ZXJpZXMgPSAoTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbiBuYW1lZFF1ZXJpZXMgPSAoTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJmb29cIikiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5IiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24gbmFtZWRRdWVyaWVzID0gKE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUyk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSBuYW1lZFF1ZXJpZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uIG5hbWVkUXVlcmllcyA9IChOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gbmFtZWRRdWVyaWVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFF1ZXJ5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHF1ZXJ5PVwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5IiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzdWx0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0Q2xhc3MoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uIG5hbWVkUXVlcmllcyA9IChOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gbmFtZWRRdWVyaWVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUkVTVUxUX0NMQVNTLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24gbmFtZWRRdWVyaWVzID0gKE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUyk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSBuYW1lZFF1ZXJpZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9SRVNVTFRfQ0xBU1MsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFJlc3VsdENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdENsYXNzPWZvby5jbGFzcykiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFJlc3VsdENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkTmF0aXZlUXVlcnkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEZ1bGx5UXVhbGlmaWVkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0Q2xhc3MoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQotCQlOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uIG5hbWVkUXVlcmllcyA9IChOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gbmFtZWRRdWVyaWVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiUmVzdWx0IiwgbmFtZWRRdWVyeS5nZXRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzKCkpOy8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQotCQluYW1lZFF1ZXJ5LnNldFJlc3VsdENsYXNzKFRZUEVfTkFNRSk7CQkKLQkJCi0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBuYW1lZFF1ZXJ5LmdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3MoKSk7CQkJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0Q2xhc3M9IiArIFRZUEVfTkFNRSArICIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzdWx0U2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRTZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbiBuYW1lZFF1ZXJpZXMgPSAoTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1JFU1VMVF9TRVRfTUFQUElORywgbmFtZWRRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZXN1bHRTZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFJlc3VsdFNldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uIG5hbWVkUXVlcmllcyA9IChOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gbmFtZWRRdWVyaWVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUkVTVUxUX1NFVF9NQVBQSU5HLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFJlc3VsdFNldE1hcHBpbmcoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShyZXN1bHRTZXRNYXBwaW5nPVwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRSZXN1bHRTZXRNYXBwaW5nKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWROYXRpdmVRdWVyeSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24gbmFtZWRRdWVyaWVzID0gKE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUyk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSBuYW1lZFF1ZXJpZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24gbmFtZWRRdWVyaWVzID0gKE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUyk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSBuYW1lZFF1ZXJpZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbiBuYW1lZFF1ZXJpZXMgPSAoTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24gbmFtZWRRdWVyaWVzID0gKE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUyk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSBuYW1lZFF1ZXJpZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgxKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIpLEBRdWVyeUhpbnQobmFtZT1cIkZPT1wiKSwgQFF1ZXJ5SGludH0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbiBuYW1lZFF1ZXJpZXMgPSAoTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDIpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcmllcyhATmFtZWROYXRpdmVRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIil9KSkiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcmllcyhATmFtZWROYXRpdmVRdWVyeShoaW50cz1AUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIikpKSIsIGN1KTsKLQkJCi0JCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkTmF0aXZlUXVlcnkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbiBuYW1lZFF1ZXJpZXMgPSAoTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkKLQkJbmFtZWRRdWVyeS5tb3ZlSGludCgyLCAwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKSwgQFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lPVwiQkFaXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uIG5hbWVkUXVlcmllcyA9IChOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gbmFtZWRRdWVyaWVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCQkKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQotCQluYW1lZFF1ZXJ5Lm1vdmVIaW50KDAsIDIpOwotCQkKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcmllcyhATmFtZWROYXRpdmVRdWVyeShoaW50cz17QFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lPVwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZE5hdGl2ZVF1ZXJ5Q29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSwgSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoe0BOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCByZXN1bHRDbGFzcyA9IEZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZyA9IFwibWFwcGluZ1wiKSxATmFtZWROYXRpdmVRdWVyeShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7Ci0JCQotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZE5hdGl2ZVF1ZXJ5VG9CZWdpbm5pbmdPZkxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcmllcyh7QE5hbWVkTmF0aXZlUXVlcnkobmFtZT1cImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIHJlc3VsdENsYXNzID0gRm9vLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nID0gXCJtYXBwaW5nXCIpLEBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlksIEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUyk7Ci0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyaWVzKHtATmFtZWROYXRpdmVRdWVyeShuYW1lPVwiQkFaXCIpLEBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCByZXN1bHRDbGFzcyA9IEZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZyA9IFwibWFwcGluZ1wiKSwgQE5hbWVkTmF0aXZlUXVlcnkobmFtZT1cIkJBUlwiKX0pIiwgY3UpOwotCi0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IG5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIG5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgbmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBuYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSWSkpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUykpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlksIEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUykpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkTmF0aXZlUXVlcnlDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcmllcyh7QE5hbWVkTmF0aXZlUXVlcnkobmFtZT1cImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIHJlc3VsdENsYXNzID0gRm9vLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nID0gXCJtYXBwaW5nXCIpLEBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlksIEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShuYW1lPVwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgcmVzdWx0Q2xhc3MgPSBGb28uY2xhc3MsIHJlc3VsdFNldE1hcHBpbmcgPSBcIm1hcHBpbmdcIikiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDUyOWRmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIm15UXVlcnkiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9RVUVSWSA9ICJTRUxFQ1QgbmFtZSBGUk9NIEVtcGxveWVlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUkVTVUxUX0NMQVNTID0gIlJlc3VsdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1JFU1VMVF9TRVRfTUFQUElORyA9ICJyZXN1bHRTZXRNYXBwaW5nIjsKLQkKLQlwdWJsaWMgTmFtZWROYXRpdmVRdWVyeVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVRdWVyeUhpbnRBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5hbWVkTmF0aXZlUXVlcnkiLCAiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiU3RyaW5nIHF1ZXJ5KCk7IiArIAotCQkJIlF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdHt9OyIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUXVlcnlIaW50QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJRdWVyeUhpbnQiLCAiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcnkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhTdHJpbmdFbGVtZW50KCJuYW1lIiwgUVVFUllfTkFNRSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoU3RyaW5nRWxlbWVudCgicXVlcnkiLCBRVUVSWV9RVUVSWSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRTZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhTdHJpbmdFbGVtZW50KCJyZXN1bHRTZXRNYXBwaW5nIiwgUVVFUllfUkVTVUxUX1NFVF9NQVBQSU5HKTsKLQl9Ci0JCi0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyeSgiICsgZWxlbWVudE5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdENsYXNzPSIgKyBRVUVSWV9SRVNVTFRfQ0xBU1MgKyAiLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5SGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5OQU1FRF9OQVRJVkVfUVVFUlksIEpQQS5RVUVSWV9ISU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpLCBAUXVlcnlIaW50fSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnROb3ROdWxsKG5hbWVkUXVlcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShuYW1lPVwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWROYXRpdmVRdWVyeSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFF1ZXJ5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHF1ZXJ5PVwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5IiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzdWx0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0Q2xhc3MoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1JFU1VMVF9DTEFTUywgbmFtZWRRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVzdWx0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0Q2xhc3MoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1JFU1VMVF9DTEFTUywgbmFtZWRRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UmVzdWx0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0Q2xhc3M9Zm9vLmNsYXNzKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UmVzdWx0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWROYXRpdmVRdWVyeSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnROb3ROdWxsKG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiUmVzdWx0IiwgbmFtZWRRdWVyeS5nZXRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzKCkpOy8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQotCQluYW1lZFF1ZXJ5LnNldFJlc3VsdENsYXNzKFRZUEVfTkFNRSk7CQkKLQkJCi0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBuYW1lZFF1ZXJ5LmdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3MoKSk7CQkJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0Q2xhc3M9IiArIFRZUEVfTkFNRSArICIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzdWx0U2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRTZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9SRVNVTFRfU0VUX01BUFBJTkcsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVzdWx0U2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRTZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9SRVNVTFRfU0VUX01BUFBJTkcsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdFNldE1hcHBpbmc9XCJmb29cIikiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFJlc3VsdFNldE1hcHBpbmcobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5IiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGludHMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgxKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIpLEBRdWVyeUhpbnQobmFtZT1cIkZPT1wiKSwgQFF1ZXJ5SGludH0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgyKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzPXtAUXVlcnlIaW50KG5hbWU9XCJCQVpcIiksIEBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKX0pIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzPUBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKSkiLCBjdSk7Ci0JCQotCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5IiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQotCQluYW1lZFF1ZXJ5Lm1vdmVIaW50KDIsIDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKSwgQFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lPVwiQkFaXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSGludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCi0JCW5hbWVkUXVlcnkubW92ZUhpbnQoMCwgMik7Ci0JCQotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cz17QFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lPVwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIil9KSIsIGN1KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyaWVzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJpZXNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzIwODk5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJpZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyaWVzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE5hbWVkUXVlcmllc1Rlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTkFNRSA9ICJteVF1ZXJ5IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUVVFUlkgPSAiU0VMRUNUIG5hbWUgRlJPTSBFbXBsb3llZSI7Ci0JCi0JcHVibGljIE5hbWVkUXVlcmllc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVRdWVyeUhpbnRBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5hbWVkUXVlcnkiLCAiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiU3RyaW5nIHF1ZXJ5KCk7IiArIAotCQkJIlF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdHt9OyIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTmFtZWRRdWVyaWVzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOYW1lZFF1ZXJpZXMiLCAKLQkJCSJOYW1lZFF1ZXJ5W10gdmFsdWUoKTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUXVlcnlIaW50IiwgIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIlN0cmluZyB2YWx1ZSgpOyIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUklFUywgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyaWVzKEBOYW1lZFF1ZXJ5KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoIm5hbWUiLCBRVUVSWV9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhTdHJpbmdFbGVtZW50KCJxdWVyeSIsIFFVRVJZX1FVRVJZKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUklFUywgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyaWVzKEBOYW1lZFF1ZXJ5KCIgKyBlbGVtZW50TmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUklFUywgSlBBLk5BTUVEX1FVRVJZLCBKUEEuUVVFUllfSElOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcmllcyhATmFtZWRRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpLCBAUXVlcnlIaW50fSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU5hbWVkUXVlcmllc0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5OQU1FRF9RVUVSWSwgSlBBLlFVRVJZX0hJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJ5KG5hbWU9XCJmb29cIiwgcXVlcnk9XCJiYXJcIiwgaGludHM9QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyaWVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uIG5hbWVkUXVlcmllcyA9IChOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUklFUyk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSBuYW1lZFF1ZXJpZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwobmFtZWRRdWVyeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkUXVlcmllc0Fubm90YXRpb24gbmFtZWRRdWVyaWVzID0gKE5hbWVkUXVlcmllc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSSUVTKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWRRdWVyaWVzQW5ub3RhdGlvbiBuYW1lZFF1ZXJpZXMgPSAoTmFtZWRRdWVyaWVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX1FVRVJJRVMpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gbmFtZWRRdWVyaWVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkobmFtZT1cImZvb1wiKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkUXVlcnkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWRRdWVyaWVzQW5ub3RhdGlvbiBuYW1lZFF1ZXJpZXMgPSAoTmFtZWRRdWVyaWVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX1FVRVJJRVMpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gbmFtZWRRdWVyaWVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWRRdWVyaWVzQW5ub3RhdGlvbiBuYW1lZFF1ZXJpZXMgPSAoTmFtZWRRdWVyaWVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX1FVRVJJRVMpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gbmFtZWRRdWVyaWVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFF1ZXJ5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KHF1ZXJ5PVwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZFF1ZXJ5IiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcmllcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkUXVlcmllc0Fubm90YXRpb24gbmFtZWRRdWVyaWVzID0gKE5hbWVkUXVlcmllc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSSUVTKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyaWVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWRRdWVyaWVzQW5ub3RhdGlvbiBuYW1lZFF1ZXJpZXMgPSAoTmFtZWRRdWVyaWVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX1FVRVJJRVMpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gbmFtZWRRdWVyaWVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwotCQkKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaW50czMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkUXVlcmllc0Fubm90YXRpb24gbmFtZWRRdWVyaWVzID0gKE5hbWVkUXVlcmllc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSSUVTKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcmllcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkUXVlcmllc0Fubm90YXRpb24gbmFtZWRRdWVyaWVzID0gKE5hbWVkUXVlcmllc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSSUVTKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDEpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIkJBUlwiKSxAUXVlcnlIaW50KG5hbWU9XCJGT09cIiksIEBRdWVyeUhpbnR9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkUXVlcmllc0Fubm90YXRpb24gbmFtZWRRdWVyaWVzID0gKE5hbWVkUXVlcmllc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSSUVTKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDIpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcmllcyhATmFtZWRRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIil9KSkiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcmllcyhATmFtZWRRdWVyeShoaW50cz1AUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIikpKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkUXVlcmllcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uIG5hbWVkUXVlcmllcyA9IChOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUklFUyk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSBuYW1lZFF1ZXJpZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkKLQkJbmFtZWRRdWVyeS5tb3ZlSGludCgyLCAwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJpZXMoQE5hbWVkUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKSwgQFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lPVwiQkFaXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uIG5hbWVkUXVlcmllcyA9IChOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUklFUyk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSBuYW1lZFF1ZXJpZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkKLQkJbmFtZWRRdWVyeS5tb3ZlSGludCgwLCAyKTsKLQkJCi0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJpZXMoQE5hbWVkUXVlcnkoaGludHM9e0BRdWVyeUhpbnQsIEBRdWVyeUhpbnQobmFtZT1cIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWRRdWVyeUNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdE5hbWVkUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5OQU1FRF9RVUVSWSwgSlBBLk5BTUVEX1FVRVJJRVMpOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcmllcyh7QE5hbWVkUXVlcnkobmFtZT1cImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpLEBOYW1lZFF1ZXJ5KG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKLQkJCi0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX1FVRVJZKSk7Ci0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX1FVRVJJRVMpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuTkFNRURfUVVFUlksIEpQQS5OQU1FRF9RVUVSSUVTKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWRRdWVyeVRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0TmFtZWRRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLk5BTUVEX1FVRVJZLCBKUEEuTkFNRURfUVVFUklFUyk7Ci0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyaWVzKHtATmFtZWRRdWVyeShuYW1lPVwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSksQE5hbWVkUXVlcnkobmFtZT1cIkJBUlwiKX0pIiwgY3UpOwotCQkKLQkJCi0JCW5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSwgSlBBLk5BTUVEX1FVRVJJRVMpOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcmllcyh7QE5hbWVkUXVlcnkobmFtZT1cIkJBWlwiKSxATmFtZWRRdWVyeShuYW1lPVwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSksIEBOYW1lZFF1ZXJ5KG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKLQotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBuYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLk5BTUVEX1FVRVJZLCBKUEEuTkFNRURfUVVFUklFUyk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgbmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBuYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIG5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUlkpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUklFUykpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5OQU1FRF9RVUVSWSwgSlBBLk5BTUVEX1FVRVJJRVMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkUXVlcnlDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfUVVFUlksIEpQQS5OQU1FRF9RVUVSSUVTKTsKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJpZXMoe0BOYW1lZFF1ZXJ5KG5hbWU9XCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpKSxATmFtZWRRdWVyeShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfUVVFUlksIEpQQS5OQU1FRF9RVUVSSUVTKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KG5hbWU9XCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpKSIsIGN1KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZmQ5MGUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlIaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE5hbWVkUXVlcnlUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX05BTUUgPSAibXlRdWVyeSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1FVRVJZID0gIlNFTEVDVCBuYW1lIEZST00gRW1wbG95ZWUiOwotCQotCXB1YmxpYyBOYW1lZFF1ZXJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU5hbWVkUXVlcnlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTmFtZWRRdWVyeSIsICJTdHJpbmcgbmFtZSgpOyAiICsKLQkJCSJTdHJpbmcgcXVlcnkoKTsiICsgCi0JCQkiUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0e307Iik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVRdWVyeUhpbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlF1ZXJ5SGludCIsICJTdHJpbmcgbmFtZSgpOyAiICsKLQkJCSJTdHJpbmcgdmFsdWUoKTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU5hbWVkUXVlcnlBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJ5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoU3RyaW5nRWxlbWVudCgibmFtZSIsIFFVRVJZX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoInF1ZXJ5IiwgUVVFUllfUVVFUlkpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU5hbWVkUXVlcnlBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJ5KCIgKyBlbGVtZW50TmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhRdWVyeUhpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU5hbWVkUXVlcnlBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUlksIEpQQS5RVUVSWV9ISU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpLCBAUXVlcnlIaW50fSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWFzc2VydE5vdE51bGwobmFtZWRRdWVyeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShuYW1lPVwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWRRdWVyeSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShxdWVyeT1cImZvb1wiKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UXVlcnkobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWRRdWVyeSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX1FVRVJZKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSWSk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX1FVRVJZKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPiBpdGVyYXRvciA9IG5hbWVkUXVlcnkuaGludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUlkpOwotCQkKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkZPTyIpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCVF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50ID0gbmFtZWRRdWVyeS5hZGRIaW50KDApOwotCQlxdWVyeUhpbnQuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KGhpbnRzPXtAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiksQFF1ZXJ5SGludChuYW1lPVwiRk9PXCIpLCBAUXVlcnlIaW50fSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMik7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIil9KSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShoaW50cz1AUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIikpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWRRdWVyeSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCi0JCW5hbWVkUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpLCBAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWU9XCJCQVpcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQotCQluYW1lZFF1ZXJ5Lm1vdmVIaW50KDAsIDIpOwotCQkKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkoaGludHM9e0BRdWVyeUhpbnQsIEBRdWVyeUhpbnQobmFtZT1cIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpfSkiLCBjdSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvTWFueVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9NYW55VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhMGIwZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9NYW55VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBPbmVUb01hbnlUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBPbmVUb01hbnlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb01hbnkiLCAiRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBGZXRjaFR5cGUuTEFaWTsgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9NYW55IiwgIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRmV0Y2hUeXBlLkxBWlk7Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkZldGNoVHlwZSIsICJFQUdFUiwgTEFaWSIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19NQU5ZLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueShmZXRjaD1GZXRjaFR5cGUuRUFHRVIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9NYW55IiwgIkNsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSh0YXJnZXRFbnRpdHk9QW5ub3RhdGlvblRlc3RUeXBlLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9NYW55IiwgIlN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHRcIlwiOyIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KG1hcHBlZEJ5PVwiZm9vXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9uZVRvTWFueSIsICJDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0ID0ge307Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkNhc2NhZGVUeXBlIiwgIkFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSCIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19NQU5ZLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KGNhc2NhZGU9Q2FzY2FkZVR5cGUuQUxMKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoTXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9uZVRvTWFueSIsICJDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0ID0ge307Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkNhc2NhZGVUeXBlIiwgIkFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSCIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19NQU5ZLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KGNhc2NhZGU9e0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkV9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoRHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb01hbnkiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fTUFOWSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueShjYXNjYWRlPXtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuTUVSR0V9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0Tm90TnVsbChvbmVUb01hbnkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoZmV0Y2g9TEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZldGNoIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KHRhcmdldEVudGl0eT1Gb28uY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ0YXJnZXRFbnRpdHkiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBvbmVUb01hbnkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KHRhcmdldEVudGl0eT1Gb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvbmVUb01hbnkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoTWFwcGVkQnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJb25lVG9NYW55LnNldE1hcHBlZEJ5KCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShtYXBwZWRCeT1cImJhclwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aE1hcHBlZEJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJb25lVG9NYW55LnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibWFwcGVkQnkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGU9QUxMKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVNZXJnZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZT1NRVJHRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZT1QRVJTSVNUKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGU9UkVNT1ZFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVSZWZyZXNoKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShjYXNjYWRlPVJFRlJFU0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzY2FkZU1vcmVUaGFuT25jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aENhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJLy9hIHNlY29uZCBDYXNjYWRlVHlwZS5BbGwgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYWRkZWQKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZT1DYXNjYWRlVHlwZS5BTEwpIiwgY3UpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JCQotCQkvL3Rlc3Qgc2V0dGluZyBjYXNjYWRlQWxsIHRvIGZhbHNlIGFnYWluLCBzaG91bGQganVzdCBkbyBub3RoaW5nCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aER1cGxpY2F0ZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsvL1RPRE8gc2hvdWxkIHRoZSByZXNvdXJjZSBtb2RlbCBoYW5kbGUgdGhpcyBhbmQgcmVtb3ZlIGJvdGggTUVSR0UgCi0JCQkJCQkJCQkJLy9zZXR0aW5ncyBpbnN0ZWFkIG9mIGhhdmluZyB0byBzZXQgaXQgZmFsc2UgdHdpY2U/Ci0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoTXVsdGlwbGVDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZT1SRU1PVkUpIiwgY3UpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVSZW1vdmUoZmFsc2UpOwkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvT25lVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb09uZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMGUwNDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvT25lVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE9uZVRvT25lVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgT25lVG9PbmVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9uZVRvT25lIiwgIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRmV0Y2hUeXBlLkxBWlk7IENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQgPSB7fTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiQ2FzY2FkZVR5cGUiLCAiQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9uZVRvT25lIiwgIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRmV0Y2hUeXBlLkxBWlk7Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkZldGNoVHlwZSIsICJFQUdFUiwgTEFaWSIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUsIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb09uZSIsICJDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Iik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKHRhcmdldEVudGl0eT1Bbm5vdGF0aW9uVGVzdFR5cGUuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9PbmUiLCAiYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUob3B0aW9uYWw9dHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9PbmUiLCAiU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdFwiXCI7Iik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKG1hcHBlZEJ5PVwiZm9vXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aENhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9PbmUiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUoY2FzY2FkZT1DYXNjYWRlVHlwZS5BTEwpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb09uZSIsICJDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0ID0ge307Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkNhc2NhZGVUeXBlIiwgIkFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSCIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUsIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShjYXNjYWRlPXtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoRHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb09uZSIsICJDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0ID0ge307Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkNhc2NhZGVUeXBlIiwgIkFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSCIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUsIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShjYXNjYWRlPXtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuTUVSR0V9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0Tm90TnVsbChvbmVUb09uZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lLmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9uZVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShmZXRjaD1MQVpZKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZmV0Y2giLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW9uZVRvT25lLnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKHRhcmdldEVudGl0eT1Gb28uY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidGFyZ2V0RW50aXR5IiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG9uZVRvT25lLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJb25lVG9PbmUuc2V0VGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUodGFyZ2V0RW50aXR5PUZvby5jbGFzcykiLCBjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgb25lVG9PbmUuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShvcHRpb25hbD1mYWxzZSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPcHRpb25hbE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCW9uZVRvT25lLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm9wdGlvbmFsIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aE1hcHBlZEJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShtYXBwZWRCeT1cImJhclwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoTWFwcGVkQnkoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibWFwcGVkQnkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGU9QUxMKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlTWVyZ2UodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZT1NRVJHRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZT1QRVJTSVNUKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlUmVtb3ZlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGU9UkVNT1ZFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlUmVmcmVzaCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlPVJFRlJFU0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXNjYWRlTW9yZVRoYW5PbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJLy9hIHNlY29uZCBDYXNjYWRlVHlwZS5BbGwgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYWRkZWQKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlPUNhc2NhZGVUeXBlLkFMTCkiLCBjdSk7Ci0JCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JCQotCQkvL3Rlc3Qgc2V0dGluZyBjYXNjYWRlQWxsIHRvIGZhbHNlIGFnYWluLCBzaG91bGQganVzdCBkbyBub3RoaW5nCi0JCW9uZVRvT25lLnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aER1cGxpY2F0ZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsvL1RPRE8gc2hvdWxkIHRoZSByZXNvdXJjZSBtb2RlbCBoYW5kbGUgdGhpcyBhbmQgcmVtb3ZlIGJvdGggTUVSR0UgCi0JCQkJCQkJCQkJLy9zZXR0aW5ncyBpbnN0ZWFkIG9mIGhhdmluZyB0byBzZXQgaXQgZmFsc2UgdHdpY2U/Ci0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhNdWx0aXBsZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJCi0JCW9uZVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZT1SRU1PVkUpIiwgY3UpOwotCQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZVJlbW92ZShmYWxzZSk7CQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGM2Nzk5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PcmRlckJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBPcmRlckJ5VGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBPcmRlckJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9yZGVyQnkiLCAiU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCBcIlwiOyIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9SREVSX0JZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT3JkZXJCeSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPcmRlckJ5V2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9yZGVyQnkiLCAiU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCBcIlwiOyIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9SREVSX0JZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT3JkZXJCeSh2YWx1ZT1cImtleVwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T3JkZXJCeSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5ID0gKE9yZGVyQnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PUkRFUl9CWSk7Ci0JCWFzc2VydE5vdE51bGwob3JkZXJCeSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T3JkZXJCeVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5ID0gKE9yZGVyQnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PUkRFUl9CWSk7Ci0JCWFzc2VydEVxdWFscygia2V5Iiwgb3JkZXJCeS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5ID0gKE9yZGVyQnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PUkRFUl9CWSk7Ci0KLQkJb3JkZXJCeS5zZXRWYWx1ZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9yZGVyQnkoXCJmb29cIikiLCBjdSk7Ci0JCQotCQlvcmRlckJ5LnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPcmRlckJ5IiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwODE5NTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OID0gIkNPTFVNTl9ERUZJTklUSU9OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSAiTVlfUkVGX0NPTFVNTl9OQU1FIjsKLQkKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJQcmltYXJ5S2V5Sm9pbkNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyAiKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCIiICsgQ09MVU1OX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWU9XCIiICsgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uPVwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbiIsIGN1KTsKLQl9Ci0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUsIGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZT1cIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFByaW1hcnlLZXlKb2luQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uPVwiRm9vXCIpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbiIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYTJkMDAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiA9ICJDT0xVTU5fREVGSU5JVElPTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIk1ZX1JFRl9DT0xVTU5fTkFNRSI7Ci0JCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlByaW1hcnlLZXlKb2luQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7Iik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJQcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLCAKLQkJCSJQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKEBQcmltYXJ5S2V5Sm9pbkNvbHVtbikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCIiICsgQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiIiArIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb249XCIiICsgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUykubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUykubmV4dCgpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1ucyhAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZvb1wiKSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFByaW1hcnlLZXlKb2luQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUykubmV4dCgpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1ucyhAUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWU9XCJGb29cIikpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04sIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uPVwiRm9vXCIpKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSxAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUykpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKSkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJpbWFyeUtleUpvaW5Db2x1bW5Ub0JlZ2lubmluZ09mTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSxAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOwotCQkKLQkJam9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoe0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFaXCIpLEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOwotCi0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHBrSm9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW5Db3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1ucyh7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiksQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1F1ZXJ5SGludFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUXVlcnlIaW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkNzIxMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUXVlcnlIaW50VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlF1ZXJ5SGludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBRdWVyeUhpbnRUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0hJTlRfTkFNRSA9ICJteUhpbnQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9ISU5UX1ZBTFVFID0gIm15VmFsdWUiOwotCQotCXB1YmxpYyBRdWVyeUhpbnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTmFtZWRRdWVyeUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUXVlcnlIaW50QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOYW1lZFF1ZXJ5IiwgIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIlN0cmluZyBxdWVyeSgpOyIgKyAKLQkJCSJRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHR7fTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUXVlcnlIaW50IiwgIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIlN0cmluZyB2YWx1ZSgpOyIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX1FVRVJZLCBKUEEuUVVFUllfSElOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIiIgKyBRVUVSWV9ISU5UX05BTUUgKyAiXCIsIHZhbHVlPVwiIiArIFFVRVJZX0hJTlRfVkFMVUUgKyAiXCIpLCBAUXVlcnlIaW50fSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSWSk7Ci0JCVF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50ID0gbmFtZWRRdWVyeS5oaW50cygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX0hJTlRfTkFNRSwgcXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSWSk7Ci0JCVF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50ID0gbmFtZWRRdWVyeS5oaW50cygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX0hJTlRfTkFNRSwgcXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCQotCQlxdWVyeUhpbnQuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFF1ZXJ5SGludChuYW1lPVwiZm9vXCIsIHZhbHVlPVwiIiArIFFVRVJZX0hJTlRfVkFMVUUgKyAiXCIpIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTI4MzU2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU2Vjb25kYXJ5VGFibGVUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIk1ZX1RBQkxFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX05BTUUgPSAiTVlfU0NIRU1BIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19OQU1FID0gIk1ZX0NBVEFMT0ciOwotCQotCXB1YmxpYyBTZWNvbmRhcnlUYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlVuaXF1ZUNvbnN0cmFpbnQiLCAiU3RyaW5nW10gY29sdW1uTmFtZXMoKTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUHJpbWFyeUtleUpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7IFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgXCJcIjtTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgXCJcIjsiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKCkgIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oKTsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2Vjb25kYXJ5VGFibGUiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJCSJTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsiICsKLQkJCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCQkiUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsiICsKLQkJCQkiVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKG5hbWU9XCIiICsgVEFCTEVfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKHNjaGVtYT1cIiIgKyBTQ0hFTUFfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShjYXRhbG9nPVwiIiArIENBVEFMT0dfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoUGtKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnM9e0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVpcIil9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldE5hbWUoKSk7Ci0KLQkJdGFibGUuc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCB0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJdGFibGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQotCQl0YWJsZS5zZXRDYXRhbG9nKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShjYXRhbG9nPVwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aENhdGFsb2coKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXRhYmxlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCXRhYmxlLnNldFNjaGVtYSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShzY2hlbWE9XCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTY2hlbWFOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQl0YWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSIsIGN1KTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50czMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXNTaXplKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludH0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJSXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSl9KSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPUBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSkpIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFSXCJ9KX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMik7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkZPT1wifSl9KSIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFBrSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLnBrSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGtKb2luQ29sdW1uczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZFBrSm9pbkNvbHVtbigwKTsKLQkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLnBrSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGtKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUucGtKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQa0pvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQotCQkKLQkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRQa0pvaW5Db2x1bW4oMCk7Ci0JCXRhYmxlLmFkZFBrSm9pbkNvbHVtbigwKS5zZXROYW1lKCJCQVIiKTsvL3Rlc3QgYWRkaW5nIGEgcGtKb2luQ29sdW1uIGluIGZyb250IG9mIDIgb3RoZXIgam9pbkNvbHVtbnMKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnBrSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUucGtKb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5wa0pvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5wa0pvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zPXtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBUlwiKSxAUHJpbWFyeUtleUpvaW5Db2x1bW4sIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQa0pvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJdGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnM9e0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBWlwiKX0pIiwgY3UpOwotCi0JCXRhYmxlLnJlbW92ZVBrSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zPUBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFaXCIpKSIsIGN1KTsKLQotCQkKLQkJdGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVBrSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoUGtKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUucGtKb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQl0YWJsZS5tb3ZlUGtKb2luQ29sdW1uKDIsIDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnM9e0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBWlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVQa0pvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhQa0pvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQotCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSB0YWJsZS5wa0pvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCXRhYmxlLm1vdmVQa0pvaW5Db2x1bW4oMCwgMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucz17QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVpcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UGtKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoUGtKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5wa0pvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUucGtKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnM9e0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiZm9vXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVpcIil9KSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZXNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwN2RhZWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNlY29uZGFyeVRhYmxlc1Rlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTkFNRSA9ICJNWV9TQ0hFTUEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX05BTUUgPSAiTVlfQ0FUQUxPRyI7Ci0JCi0JcHVibGljIFNlY29uZGFyeVRhYmxlc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlVuaXF1ZUNvbnN0cmFpbnQiLCAiU3RyaW5nW10gY29sdW1uTmFtZXMoKTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUHJpbWFyeUtleUpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7IFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgXCJcIjtTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgXCJcIjsiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJTZWNvbmRhcnlUYWJsZSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkJIlN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCQkiUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsiICsKLQkJCQkiVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsiKTsKLQkJCi0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJTZWNvbmRhcnlUYWJsZXMiLCAiU2Vjb25kYXJ5VGFibGVbXSB2YWx1ZSgpIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiIiArIFRBQkxFX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHNjaGVtYT1cIiIgKyBTQ0hFTUFfTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKGNhdGFsb2c9XCIiICsgQ0FUQUxPR19OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUywgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnR9KSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIsIGNhdGFsb2c9XCJCQVJcIiwgc2NoZW1hPVwiQkFaXCIsIHVuaXF1ZUNvbnN0cmFpbnRzPUBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzV2l0aFBrSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRVMsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucz17QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBWlwiKX0pKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnROdWxsKHRhYmxlKTsKLQkJU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZXMgPSAoU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlhc3NlcnROb3ROdWxsKHNlY29uZGFyeVRhYmxlcyk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmVzdGVkQW5ub3RhdGlvbkF0KDApOwotCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZXMgPSAoU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmVzdGVkQW5ub3RhdGlvbkF0KDApOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKLQkKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXROYW1lKCkpOwotCi0JCXNlY29uZGFyeVRhYmxlLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZvb1wiKSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZXMgPSAoU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmVzdGVkQW5ub3RhdGlvbkF0KDApOwotCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCBzZWNvbmRhcnlUYWJsZS5nZXRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlcyA9IChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0Q2F0YWxvZygpKTsKLQotCQlzZWNvbmRhcnlUYWJsZS5zZXRDYXRhbG9nKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBzZWNvbmRhcnlUYWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKGNhdGFsb2c9XCJGb29cIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aENhdGFsb2coKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlcyA9IChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7Ci0JCWFzc2VydEVxdWFscyhDQVRBTE9HX05BTUUsIHNlY29uZGFyeVRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlcyA9IChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7Ci0JCWFzc2VydE5vdE51bGwoc2Vjb25kYXJ5VGFibGUpOwotCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHNlY29uZGFyeVRhYmxlLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlcyA9IChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCXNlY29uZGFyeVRhYmxlLnNldFNjaGVtYSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHNjaGVtYT1cIkZvb1wiKSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTY2hlbWFOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlcyA9IChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7Ci0JCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGUiLCBjdSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZXMgPSAoU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmVzdGVkQW5ub3RhdGlvbkF0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlcyA9IChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZXMgPSAoU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmVzdGVkQW5ub3RhdGlvbkF0KDApOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lc1NpemUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkJBUlwiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnR9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZXMgPSAoU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmVzdGVkQW5ub3RhdGlvbkF0KDApOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgyKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFSXCJ9KX0pIiwgY3UpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPUBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSkpIiwgY3UpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZXMgPSAoU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmVzdGVkQW5ub3RhdGlvbkF0KDApOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVzKCkuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludCwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJGT09cIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlcyA9IChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVzKCkuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDIpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludCwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSl9KSkiLCBjdSk7Ci0JfQotCQotCQotCS8vICBARW50aXR5ICAgICAJCQkJLS0+PiAgICBARW50aXR5Ci0JLy8JQFNlY29uZGFyeVRhYmxlKG5hbWU9IkZPTyIpCQkJQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9IkZPTyIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT0iQkFSIil9KQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU2Vjb25kYXJ5VGFibGVDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlzZWNvbmRhcnlUYWJsZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIsIGNhdGFsb2cgPSBcIkJBUlwiLCBzY2hlbWEgPSBcIkJBWlwiLCB1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFSXCIpKSxAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUykpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiLCBjYXRhbG9nID0gXCJCQVJcIiwgc2NoZW1hID0gXCJCQVpcIiwgdW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkJBUlwiKSksQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlzZWNvbmRhcnlUYWJsZS5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFaXCIpLEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIsIGNhdGFsb2cgPSBcIkJBUlwiLCBzY2hlbWEgPSBcIkJBWlwiLCB1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFSXCIpKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKLQotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBzZWNvbmRhcnlUYWJsZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlY29uZGFyeVRhYmxlQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiLCBjYXRhbG9nID0gXCJCQVJcIiwgc2NoZW1hID0gXCJCQVpcIiwgdW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkJBUlwiKSksQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIsIGNhdGFsb2cgPSBcIkJBUlwiLCBzY2hlbWEgPSBcIkJBWlwiLCB1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFSXCIpKSIsIGN1KTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGtKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5wa0pvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBrSm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUykubmV4dCgpOwotCQkKLQkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDApOwotCQl0YWJsZS5hZGRQa0pvaW5Db2x1bW4oMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUucGtKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQa0pvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUykubmV4dCgpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUucGtKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQa0pvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKS5uZXh0KCk7Ci0JCQotCQl0YWJsZS5hZGRQa0pvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZFBrSm9pbkNvbHVtbigxKTsKLQkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zPXtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBUlwiKSxAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUGtKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXNXaXRoUGtKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKS5uZXh0KCk7Ci0JCQotCQl0YWJsZS5yZW1vdmVQa0pvaW5Db2x1bW4oMSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zPXtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBUlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVpcIil9KSkiLCBjdSk7Ci0KLQkJdGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucz1AUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBWlwiKSkpIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVBrSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUykubmV4dCgpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLnBrSm9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJdGFibGUubW92ZVBrSm9pbkNvbHVtbigyLCAwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnM9e0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBWlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlUGtKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUykubmV4dCgpOwotCi0JCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLnBrSm9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJdGFibGUubW92ZVBrSm9pbkNvbHVtbigwLCAyKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnM9e0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFaXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJGT09cIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQa0pvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXNXaXRoUGtKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKS5uZXh0KCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5wa0pvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUucGtKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucz17QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJmb29cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBWlwiKX0pKSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjA5YzRjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTZXF1ZW5jZUdlbmVyYXRvclRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX05BTUUgPSAiTVlfR0VORVJBVE9SIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX1NFUVVFTkNFX05BTUUgPSAiTVlfU0VRVUVOQ0UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgR0VORVJBVE9SX0FMTE9DQVRJT05fU0laRSA9IEludGVnZXIudmFsdWVPZig1KTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEdFTkVSQVRPUl9JTklUSUFMX1ZBTFVFID0gSW50ZWdlci52YWx1ZU9mKDUpOwotCQotCXB1YmxpYyBTZXF1ZW5jZUdlbmVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2VxdWVuY2VHZW5lcmF0b3IiLCAiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiU3RyaW5nIHNlcXVlbmNlTmFtZSgpIGRlZmF1bHQgXCJcIiIgKwotCQkJImludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDEiICsKLQkJCSJpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwIik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlcXVlbmNlR2VuZXJhdG9yIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yT25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlcXVlbmNlR2VuZXJhdG9yIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KCJuYW1lIiwgR0VORVJBVE9SX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aFNlcXVlbmNlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoInNlcXVlbmNlTmFtZSIsIEdFTkVSQVRPUl9TRVFVRU5DRV9OQU1FKTsKLQl9Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlcXVlbmNlR2VuZXJhdG9yKCIgKyBlbGVtZW50TmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoSW50RWxlbWVudCgiYWxsb2NhdGlvblNpemUiLCBHRU5FUkFUT1JfQUxMT0NBVElPTl9TSVpFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhJbnRFbGVtZW50KCJpbml0aWFsVmFsdWUiLCBHRU5FUkFUT1JfSU5JVElBTF9WQUxVRSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoSW50RWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlcXVlbmNlR2VuZXJhdG9yKCIgKyBlbGVtZW50TmFtZSArICI9IiArIHZhbHVlICsgIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcXVlbmNlR2VuZXJhdG9yT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydE5vdE51bGwoc2VxdWVuY2VHZW5lcmF0b3IpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2VHZW5lcmF0b3JPblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yT25UeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydE5vdE51bGwoc2VxdWVuY2VHZW5lcmF0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9OQU1FLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9OQU1FLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT1cImZvb1wiKSIsIGN1KTsKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2VxdWVuY2VHZW5lcmF0b3IiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNlcXVlbmNlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoU2VxdWVuY2VOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9TRVFVRU5DRV9OQU1FLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNlcXVlbmNlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoU2VxdWVuY2VOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9TRVFVRU5DRV9OQU1FLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTZXF1ZW5jZU5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNlcXVlbmNlTmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3Ioc2VxdWVuY2VOYW1lPVwiZm9vXCIpIiwgY3UpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U2VxdWVuY2VOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNlcXVlbmNlTmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2VxdWVuY2VHZW5lcmF0b3IiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhBbGxvY2F0aW9uU2l6ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfQUxMT0NBVElPTl9TSVpFLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0QWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEFsbG9jYXRpb25TaXplKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9BTExPQ0FUSU9OX1NJWkUsIHNlcXVlbmNlR2VuZXJhdG9yLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDUwMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUwMCksIHNlcXVlbmNlR2VuZXJhdG9yLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZXF1ZW5jZUdlbmVyYXRvcihhbGxvY2F0aW9uU2l6ZT01MDApIiwgY3UpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0QWxsb2NhdGlvblNpemUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlcXVlbmNlR2VuZXJhdG9yIiwgY3UpOwotCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigwKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3IoYWxsb2NhdGlvblNpemU9MCkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEluaXRpYWxWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfSU5JVElBTF9WQUxVRSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEluaXRpYWxWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfSU5JVElBTF9WQUxVRSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZig1MDApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MDApLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKGluaXRpYWxWYWx1ZT01MDApIiwgY3UpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZXF1ZW5jZUdlbmVyYXRvciIsIGN1KTsKLQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDApKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZXF1ZW5jZUdlbmVyYXRvcihpbml0aWFsVmFsdWU9MCkiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZUdlbmVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMmM2MzguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFRhYmxlR2VuZXJhdG9yVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfTkFNRSA9ICJNWV9HRU5FUkFUT1IiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfVEFCTEUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfQ0FUQUxPRyA9ICJNWV9DQVRBTE9HIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX1NDSEVNQSA9ICJNWV9TQ0hFTUEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfUEtfQ09MVU1OX05BTUUgPSAiTVlfUEtfQ09MVU1OX05BTUUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfVkFMVUVfQ09MVU1OX05BTUUgPSAiTVlfVkFMVUVfQ09MVU1OX05BTUUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfUEtfQ09MVU1OX1ZBTFVFID0gIk1ZX1BLX0NPTFVNTl9WQUxVRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBHRU5FUkFUT1JfQUxMT0NBVElPTl9TSVpFID0gSW50ZWdlci52YWx1ZU9mKDUpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgR0VORVJBVE9SX0lOSVRJQUxfVkFMVUUgPSBJbnRlZ2VyLnZhbHVlT2YoNSk7Ci0JCi0JcHVibGljIFRhYmxlR2VuZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUYWJsZUdlbmVyYXRvciIsICJTdHJpbmcgbmFtZSgpOyAiICsKLQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCIiICsKLQkJCSJTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIiIgKwotCQkJIlN0cmluZyBzY2hlbWEoKSBkZWZhdWx0IFwiXCIiICsKLQkJCSJTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiIiArCi0JCQkiU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSgpIGRlZmF1bHQgXCJcIiIgKwotCQkJIlN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCBcIlwiIiArCi0JCQkiaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMCIgKwotCQkJImludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTAiICsgCi0JCQkiVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdHt9Iik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlR2VuZXJhdG9yIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yT25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlR2VuZXJhdG9yIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KCJuYW1lIiwgR0VORVJBVE9SX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudCgidGFibGUiLCBHRU5FUkFUT1JfVEFCTEUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KCJjYXRhbG9nIiwgR0VORVJBVE9SX0NBVEFMT0cpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoInNjaGVtYSIsIEdFTkVSQVRPUl9TQ0hFTUEpOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoInBrQ29sdW1uTmFtZSIsIEdFTkVSQVRPUl9QS19DT0xVTU5fTkFNRSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudCgidmFsdWVDb2x1bW5OYW1lIiwgR0VORVJBVE9SX1ZBTFVFX0NPTFVNTl9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhQa0NvbHVtblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudCgicGtDb2x1bW5WYWx1ZSIsIEdFTkVSQVRPUl9QS19DT0xVTU5fVkFMVUUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlR2VuZXJhdG9yKCIgKyBlbGVtZW50TmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoSW50RWxlbWVudCgiYWxsb2NhdGlvblNpemUiLCBHRU5FUkFUT1JfQUxMT0NBVElPTl9TSVpFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhJbnRFbGVtZW50KCJpbml0aWFsVmFsdWUiLCBHRU5FUkFUT1JfSU5JVElBTF9WQUxVRSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoSW50RWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlR2VuZXJhdG9yKCIgKyBlbGVtZW50TmFtZSArICI9IiArIHZhbHVlICsgIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUYWJsZUdlbmVyYXRvckFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVW5pcXVlQ29uc3RyYWludCIsICJTdHJpbmdbXSBjb2x1bW5OYW1lcygpOyIpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFX0dFTkVSQVRPUiwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSl9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVHZW5lcmF0b3JPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvck9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZUdlbmVyYXRvcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZUdlbmVyYXRvck9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JPblR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZUdlbmVyYXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX05BTUUsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX05BTUUsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihuYW1lPVwiZm9vXCIpIiwgY3UpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvciIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9UQUJMRSwgdGFibGVHZW5lcmF0b3IuZ2V0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfVEFCTEUsIHRhYmxlR2VuZXJhdG9yLmdldFRhYmxlKCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0VGFibGUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldFRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcih0YWJsZT1cImZvb1wiKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvciIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfQ0FUQUxPRywgdGFibGVHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfQ0FUQUxPRywgdGFibGVHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldENhdGFsb2coImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKGNhdGFsb2c9XCJmb29cIikiLCBjdSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlR2VuZXJhdG9yIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfU0NIRU1BLCB0YWJsZUdlbmVyYXRvci5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9TQ0hFTUEsIHRhYmxlR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNjaGVtYSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGVHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihzY2hlbWE9XCJmb29cIikiLCBjdSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvciIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGtDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhQa0NvbHVtbk5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1BLX0NPTFVNTl9OQU1FLCB0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoUGtDb2x1bW5OYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9QS19DT0xVTU5fTkFNRSwgdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0UGtDb2x1bW5OYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKHBrQ29sdW1uTmFtZT1cImZvb1wiKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFBrQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlR2VuZXJhdG9yIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhWYWx1ZUNvbHVtbk5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1ZBTFVFX0NPTFVNTl9OQU1FLCB0YWJsZUdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVmFsdWVDb2x1bW5OYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9WQUxVRV9DT0xVTU5fTkFNRSwgdGFibGVHZW5lcmF0b3IuZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0VmFsdWVDb2x1bW5OYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZUdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKHZhbHVlQ29sdW1uTmFtZT1cImZvb1wiKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFZhbHVlQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlR2VuZXJhdG9yIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQa0NvbHVtblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhQa0NvbHVtblZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9QS19DT0xVTU5fVkFMVUUsIHRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFBrQ29sdW1uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFBrQ29sdW1uVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1BLX0NPTFVNTl9WQUxVRSwgdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFBrQ29sdW1uVmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKHBrQ29sdW1uVmFsdWU9XCJmb29cIikiLCBjdSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRQa0NvbHVtblZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlR2VuZXJhdG9yIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoQWxsb2NhdGlvblNpemUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX0FMTE9DQVRJT05fU0laRSwgdGFibGVHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhBbGxvY2F0aW9uU2l6ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfQUxMT0NBVElPTl9TSVpFLCB0YWJsZUdlbmVyYXRvci5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZig1MDApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MDApLCB0YWJsZUdlbmVyYXRvci5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IoYWxsb2NhdGlvblNpemU9NTAwKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvciIsIGN1KTsKLQotCQl0YWJsZUdlbmVyYXRvci5zZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKGFsbG9jYXRpb25TaXplPTApIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhJbml0aWFsVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX0lOSVRJQUxfVkFMVUUsIHRhYmxlR2VuZXJhdG9yLmdldEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhJbml0aWFsVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX0lOSVRJQUxfVkFMVUUsIHRhYmxlR2VuZXJhdG9yLmdldEluaXRpYWxWYWx1ZSgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoNTAwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTAwKSwgdGFibGVHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihpbml0aWFsVmFsdWU9NTAwKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGVHZW5lcmF0b3IiLCBjdSk7Ci0KLQkJdGFibGVHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigwKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IoaW5pdGlhbFZhbHVlPTApIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JPbkZpZWxkKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlVuaXF1ZUNvbnN0cmFpbnQiLCAiU3RyaW5nW10gY29sdW1uTmFtZXMoKTsiKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JPbkZpZWxkKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlVuaXF1ZUNvbnN0cmFpbnQiLCAiU3RyaW5nW10gY29sdW1uTmFtZXMoKTsiKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXNTaXplKCkpOwotCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludH0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSl9KSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHM9QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFaXCJ9KSkiLCBjdSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlR2VuZXJhdG9yIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcih1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFSXCJ9KX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQkKLQkJdGFibGVHZW5lcmF0b3IubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkZPT1wifSl9KSIsIGN1KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ5NWM0ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFRhYmxlVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9OQU1FID0gIk1ZX1NDSEVNQSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfTkFNRSA9ICJNWV9DQVRBTE9HIjsKLQkKLQlwdWJsaWMgVGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRhYmxlIiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJVbmlxdWVDb25zdHJhaW50IiwgIlN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Iik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGFibGVBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRhYmxlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUobmFtZT1cIiIgKyBUQUJMRV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZVdpdGhTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGFibGVBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShzY2hlbWE9XCIiICsgU0NIRU1BX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGFibGVBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShjYXRhbG9nPVwiIiArIENBVEFMT0dfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGFibGVBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEFCTEUsIEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXROYW1lKCkpOwotCi0JCXRhYmxlLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKG5hbWU9XCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCB0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJdGFibGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldENhdGFsb2coKSk7Ci0KLQkJdGFibGUuc2V0Q2F0YWxvZygiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUoY2F0YWxvZz1cIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhdGFsb2dOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZVdpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXRhYmxlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKLQotCQl0YWJsZS5zZXRTY2hlbWEoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUoc2NoZW1hPVwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQl0YWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50czMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXNTaXplKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50fSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQl0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludCxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17IFwiQkFSXCIsIFwiQkFaXCIgfSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiRk9PXCIpfSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGNvbHVtbk5hbWVzID0gdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgY29sdW1uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBjb2x1bW5OYW1lcy5uZXh0KCkpOwotCX0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFaXCJ9KX0pIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cz1AVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pKSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiRk9PXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFSXCIpLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkJBWlwiKX0pIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVpcIil9KSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHM9QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVpcIikpIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJGT09cIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVJcIiksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFaXCIpfSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkZPT1wiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkJBUlwiKX0pIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cz1AVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkZPT1wiKSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJdGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSl9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAyKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiRk9PXCJ9KX0pIiwgY3UpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGVtcG9yYWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWNhODc4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFRlbXBvcmFsVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBUZW1wb3JhbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVtcG9yYWwiLCAiVGVtcG9yYWxUeXBlIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIlRlbXBvcmFsVHlwZSIsICJEQVRFLCBUSU1FLCBUSU1FU1RBTVAiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5URU1QT1JBTCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRlbXBvcmFsIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRlbXBvcmFsV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlbXBvcmFsIiwgIlRlbXBvcmFsVHlwZSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJUZW1wb3JhbFR5cGUiLCAiREFURSwgVElNRSwgVElNRVNUQU1QIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEVNUE9SQUwsIEpQQS5URU1QT1JBTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVtcG9yYWwoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEVNUE9SQUwpOwotCQlhc3NlcnROb3ROdWxsKHRlbXBvcmFsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW1wb3JhbFdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5URU1QT1JBTCk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVtcG9yYWwoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCi0JCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRFTVBPUkFMKTsKLQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRlbXBvcmFsKFRJTUUpIiwgY3UpOwotCQkKLQkJdGVtcG9yYWwuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRlbXBvcmFsIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RyYW5zaWVudFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNpZW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljN2RiNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNpZW50VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zaWVudFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHJhbnNpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRyYW5zaWVudCIsICIiKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5UUkFOU0lFTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUcmFuc2llbnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNpZW50KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgVHJhbnNpZW50QW5ub3RhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVmVyc2lvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVmVyc2lvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjY0ZTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ZlcnNpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBWZXJzaW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlZlcnNpb24iLCAiIik7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVkVSU0lPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFZlcnNpb24iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RWZXJzaW9uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgVmVyc2lvbkFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQW5ub3RhdGlvblRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjhkN2E1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQW5ub3RhdGlvblRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRURmllbGRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUTWV0aG9kQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuUHJvamVjdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBQcm92aWRlIGFuIGVhc3koPykgd2F5IHRvIGJ1aWxkIGFuIGFubm90YXRlZCBzb3VyY2UgZmlsZS4KLSAqIFRoZSB0eXBlIG11c3QgYmUgY3JlYXRlZCBieSBjYWxsaW5nIG9uZSBvZiB0aGUgI2NyZWF0ZVR5cGUoKSBtZXRob2RzCi0gKiBiZWZvcmUgY2FsbGluZyBhbnkgb2YgdGhlIHZhcmlvdXMgaGVscGVyIG1ldGhvZHMgKGkuZS4gdGhlIHR5cGUgaXMgKm5vdCoKLSAqIGNyZWF0ZWQgZHVyaW5nICNzZXRVcCgpKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFubm90YXRpb25UZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQID0gRmlsZS5zZXBhcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIkFubm90YXRpb25UZXN0UHJvamVjdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gInRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBUWVBFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9OQU1FID0gVFlQRV9OQU1FICsgIi5qYXZhIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIEZJTEVfUEFUSCA9IG5ldyBQYXRoKCJzcmMiICsgU0VQICsgUEFDS0FHRV9OQU1FICsgU0VQICsgRklMRV9OQU1FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLQotCi0JLy8gKioqKioqKioqKiBUZXN0Q2FzZSBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZGVsZXRlQWxsUHJvamVjdHMoKTsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IHRoaXMuYnVpbGRKYXZhUHJvamVjdChmYWxzZSk7ICAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlQWxsUHJvamVjdHMoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVByb2plY3RVdGlsaXR5LmRlbGV0ZUFsbFByb2plY3RzKCk7IAkJCi0JfQotCQotCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgYnVpbGRKYXZhUHJvamVjdChib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSmF2YVByb2plY3QoUFJPSkVDVF9OQU1FLCBhdXRvQnVpbGQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGJ1aWxkSmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFQcm9qZWN0KHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJdGhpcy5kdW1wU291cmNlKCk7Ci0vLwkJdGhpcy5qYXZhUHJvamVjdC5kaXNwb3NlKCk7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wU291cmNlKElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiAiICsgdGhpcy5nZXROYW1lKCkgKyAiICoqKioiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0U291cmNlKGN1KSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlIGNyZWF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIGNyZWF0ZSBhbiB1bi1hbm5vdGF0ZWQgdHlwZQotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogc2hvcnRjdXQgZm9yIHNpbXBseSBhZGRpbmcgYW4gYW5ub3RhdGlvbiB0byB0aGUgJ2lkJyBmaWVsZAotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uSW1wb3J0LCBmaW5hbCBTdHJpbmcgaWRGaWVsZEFubm90YXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiAoYW5ub3RhdGlvbkltcG9ydCA9PSBudWxsKSA/Ci0JCQkJCUVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpCi0JCQkJOgotCQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPFN0cmluZz4oYW5ub3RhdGlvbkltcG9ydCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChpZEZpZWxkQW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIHNob3J0Y3V0IGZvciBzaW1wbHkgYWRkaW5nIGEgZnVsbHktcXVhbGlmaWVkIGFubm90YXRpb24gdG8gdGhlICdpZCcgZmllbGQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZShmaW5hbCBTdHJpbmcgaWRGaWVsZEFubm90YXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobnVsbCwgaWRGaWVsZEFubm90YXRpb24pOwotCX0KLQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlKEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBGSUxFX05BTUUsIHRoaXMuY3JlYXRlU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyB0eXBlTmFtZSwgQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChwYWNrYWdlTmFtZSwgZmlsZU5hbWUsIHRoaXMuY3JlYXRlU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIsIHR5cGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFNvdXJjZVdyaXRlciBjcmVhdGVTb3VyY2VXcml0ZXIoQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU291cmNlV3JpdGVyIGNyZWF0ZVNvdXJjZVdyaXRlcihBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZFNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyLCB0eXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYiwgQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJc2IuYXBwZW5kKENSKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGFubm90YXRpb25Xcml0ZXIuaW1wb3J0cygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJc2IuYXBwZW5kKHN0cmVhbS5uZXh0KCkpOwotCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQlzYi5hcHBlbmQoQ1IpOwotCQl9Ci0JCXNiLmFwcGVuZChDUik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kVHlwZUFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCh0eXBlTmFtZSkuYXBwZW5kKCIgIik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhzYik7Ci0JCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgcHVibGljIGludCBnZXRJZCgpIHsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZFNldElkTWV0aG9kQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMuaWQgPSBpZDsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kU2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldFRlc3RGaWVsZChTdHJpbmcgdGVzdEZpZWxkKSB7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMudGVzdEZpZWxkID0gdGVzdEZpZWxkOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZE1lbWJlclR5cGVUbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7CQkKLQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRUb3BMZXZlbFR5cGVzVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0OwotCX0KLQotCXByb3RlY3RlZCBKRFRUeXBlIHRlc3RUeXBlKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUeXBlKFRZUEVfTkFNRSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRUeXBlIGJ1aWxkVHlwZShTdHJpbmcgbmFtZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZFR5cGUobmFtZSwgMSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRUeXBlIGJ1aWxkVHlwZShTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUeXBlKG51bGwsIG5hbWUsIDEsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUVHlwZSBidWlsZFR5cGUoVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIG5ldyBKRFRUeXBlKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRURmllbGRBdHRyaWJ1dGUgaWRGaWVsZChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmllbGQoImlkIiwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRGaWVsZEF0dHJpYnV0ZSBuYW1lRmllbGQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZEZpZWxkKCJuYW1lIiwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRGaWVsZEF0dHJpYnV0ZSBidWlsZEZpZWxkKFN0cmluZyBuYW1lLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmllbGQobmFtZSwgMSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRGaWVsZEF0dHJpYnV0ZSBidWlsZEZpZWxkKFN0cmluZyBuYW1lLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZEZpZWxkKHRoaXMudGVzdFR5cGUoY3UpLCBuYW1lLCBvY2N1cnJlbmNlLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVEZpZWxkQXR0cmlidXRlIGJ1aWxkRmllbGQoVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIG5ldyBKRFRGaWVsZEF0dHJpYnV0ZShkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVE1ldGhvZEF0dHJpYnV0ZSBpZEdldE1ldGhvZChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTWV0aG9kKCJnZXRJZCIsIGN1KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpEVE1ldGhvZEF0dHJpYnV0ZSBpZFNldE1ldGhvZChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTWV0aG9kKCJzZXRJZCIsIG5ldyBTdHJpbmdbXSB7ImludCJ9LCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVE1ldGhvZEF0dHJpYnV0ZSBuYW1lR2V0TWV0aG9kKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRNZXRob2QoImdldE5hbWUiLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVE1ldGhvZEF0dHJpYnV0ZSBidWlsZE1ldGhvZChTdHJpbmcgbmFtZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZE1ldGhvZChuYW1lLCBFTVBUWV9TVFJJTkdfQVJSQVksIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUTWV0aG9kQXR0cmlidXRlIGJ1aWxkTWV0aG9kKFN0cmluZyBuYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRNZXRob2QobmFtZSwgcGFyYW1ldGVyVHlwZU5hbWVzLCAxLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVE1ldGhvZEF0dHJpYnV0ZSBidWlsZE1ldGhvZChTdHJpbmcgbmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gbmV3IEpEVE1ldGhvZEF0dHJpYnV0ZSh0aGlzLnRlc3RUeXBlKGN1KSwgbmFtZSwgcGFyYW1ldGVyVHlwZU5hbWVzLCBvY2N1cnJlbmNlLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVE1ldGhvZEF0dHJpYnV0ZSBidWlsZE1ldGhvZChUeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiBuZXcgSkRUTWV0aG9kQXR0cmlidXRlKGRlY2xhcmluZ1R5cGUsIG5hbWUsIHBhcmFtZXRlclR5cGVOYW1lcywgb2NjdXJyZW5jZSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U291cmNlKElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gY3UuZ2V0QnVmZmVyKCkuZ2V0Q29udGVudHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiBKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZXN0IHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0U291cmNlQ29udGFpbnMoU3RyaW5nIHMsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZXRTb3VyY2UoY3UpOwotCQlib29sZWFuIGZvdW5kID0gc291cmNlLmluZGV4T2YocykgPiAtMTsKLQkJaWYgKCAhIGZvdW5kKSB7Ci0JCQlTdHJpbmcgbXNnID0gInNvdXJjZSBkb2VzIG5vdCBjb250YWluIHRoZSBleHBlY3RlZCBzdHJpbmc6ICIgKyBzICsgIiAoc2VlIFN5c3RlbSBjb25zb2xlKSI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiAiICsgdGhpcy5nZXROYW1lKCkgKyAiICoqKioiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKHNvdXJjZSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCWZhaWwobXNnKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKFN0cmluZyBzLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKGN1KTsKLQkJaW50IHBvcyA9IHNvdXJjZS5pbmRleE9mKHMpOwotCQlpZiAocG9zICE9IC0xKSB7Ci0JCQlTdHJpbmcgbXNnID0gInVuZXhwZWN0ZWQgc3RyaW5nIGluIHNvdXJjZSAocG9zaXRpb246ICIgKyBwb3MgKyAiKTogIiArIHMgKyAiIChzZWUgU3lzdGVtIGNvbnNvbGUpIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqICIgKyB0aGlzLmdldE5hbWUoKSArICIgKioqKiIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oc291cmNlKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJZmFpbChtc2cpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hbmlwdWxhdGUgYW5ub3RhdGlvbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAqZmlyc3QqIG1lbWJlciB2YWx1ZSBwYWlyIGZvciB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJZm9yIChNZW1iZXJWYWx1ZVBhaXIgcGFpciA6IHRoaXMudmFsdWVzKGFubm90YXRpb24pKSB7Ci0JCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCXJldHVybiBwYWlyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIG1pbmltaXplIHRoZSBzY29wZSBvZiB0aGUgc3VwcHJlc3NlZCB3YXJuaW5ncwotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzKE5vcm1hbEFubm90YXRpb24gbmEpIHsKLQkJcmV0dXJuIG5hLnZhbHVlcygpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGZvciBudWxsIG1lbWJlciB2YWx1ZSBwYWlyCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gdmFsdWVfKE1lbWJlclZhbHVlUGFpciBwYWlyKSB7Ci0JCXJldHVybiAocGFpciA9PSBudWxsKSA/IG51bGwgOiBwYWlyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGFubm90YXRpb25FbGVtZW50VmFsdWUoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVfKHRoaXMubWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIGVsZW1lbnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGFubm90YXRpb25FbGVtZW50VmFsdWUoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIGVsZW1lbnROYW1lLmVxdWFscygidmFsdWUiKSA/IGFubm90YXRpb24uZ2V0VmFsdWUoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqIChBbiBlbGVtZW50IG5hbWUgb2YgInZhbHVlIiB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgYSBzaW5nbGUKLQkgKiBtZW1iZXIgYW5ub3RhdGlvbi4pCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlpZiAoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUpOwotCQl9Ci0JCWlmIChhbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBlbGVtZW50TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBudW1iZXIgbGl0ZXJhbCBhbmQgc2V0IGl0cyBpbml0aWFsIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTnVtYmVyTGl0ZXJhbCBuZXdOdW1iZXJMaXRlcmFsKEFTVCBhc3QsIGludCB2YWx1ZSkgewotCQlyZXR1cm4gYXN0Lm5ld051bWJlckxpdGVyYWwoSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgc3RyaW5nIGxpdGVyYWwgYW5kIHNldCBpdHMgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nTGl0ZXJhbCBuZXdTdHJpbmdMaXRlcmFsKEFTVCBhc3QsIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhc3QubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSh2YWx1ZSk7Ci0JCXJldHVybiBzdHJpbmdMaXRlcmFsOwotCX0KLQotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFNpbXBsZU5hbWUgbmFtZSwgRXhwcmVzc2lvbiB2YWx1ZSkgewotCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IGFzdC5uZXdNZW1iZXJWYWx1ZVBhaXIoKTsKLQkJcGFpci5zZXROYW1lKG5hbWUpOwotCQlwYWlyLnNldFZhbHVlKHZhbHVlKTsKLQkJcmV0dXJuIHBhaXI7Ci0JfQotCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBuZXdNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFzdCwgYXN0Lm5ld1NpbXBsZU5hbWUobmFtZSksIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG5ld01lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIHRoaXMubmV3U3RyaW5nTGl0ZXJhbChhc3QsIHZhbHVlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBuZXdNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLCB0aGlzLm5ld051bWJlckxpdGVyYWwoYXN0LCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gdGhlIHJlc3VsdGluZyBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIGFkZE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIE1lbWJlclZhbHVlUGFpciBwYWlyKSB7Ci0JCXRoaXMudmFsdWVzKGFubm90YXRpb24pLmFkZChwYWlyKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiB0aGUgcmVzdWx0aW5nIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gYWRkTWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgbmFtZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBtZW1iZXIgdmFsdWUgcGFpciB0byB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24uCi0JICogUmV0dXJuIHRoZSByZXN1bHRpbmcgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBhZGRNZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLmdldEFTVCgpLCBuYW1lLCB2YWx1ZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25Xcml0ZXIgewotCQlJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKTsKLQkJdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kU2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRTZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZE1lbWJlclR5cGVUbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRUb3BMZXZlbFR5cGVzVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlciBpbXBsZW1lbnRzIEFubm90YXRpb25Xcml0ZXIgewotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkge3JldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kU2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kTWVtYmVyVHlwZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUb3BMZXZlbFR5cGVzVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uV3JpdGVyV3JhcHBlciBpbXBsZW1lbnRzIEFubm90YXRpb25Xcml0ZXIgewotCQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25Xcml0ZXIgYXc7Ci0JCXB1YmxpYyBBbm5vdGF0aW9uV3JpdGVyV3JhcHBlcihBbm5vdGF0aW9uV3JpdGVyIGF3KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5hdyA9IGF3OwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7cmV0dXJuIGF3LmltcG9ydHMoKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge2F3LmFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oc2IpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7YXcuYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHthdy5hcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZE5hbWVGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7YXcuYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHthdy5hcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7YXcuYXBwZW5kU2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oc2IpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7YXcuYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHthdy5hcHBlbmRTZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZE1lbWJlclR5cGVUbyhTdHJpbmdCdWlsZGVyIHNiKSB7YXcuYXBwZW5kTWVtYmVyVHlwZVRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFRvcExldmVsVHlwZXNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7YXcuYXBwZW5kVG9wTGV2ZWxUeXBlc1RvKHNiKTt9Ci0JfQotCi0JcHVibGljIGNsYXNzIEFubm90YXRlZFNvdXJjZVdyaXRlciBpbXBsZW1lbnRzIFNvdXJjZVdyaXRlciB7Ci0JCXByaXZhdGUgQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyOwotCQlwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKLQkJcHVibGljIEFubm90YXRlZFNvdXJjZVdyaXRlcihBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIpIHsKLQkJCXRoaXMoYW5ub3RhdGlvbldyaXRlciwgVFlQRV9OQU1FKTsKLQkJfQotCQlwdWJsaWMgQW5ub3RhdGVkU291cmNlV3JpdGVyKEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlciwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5hbm5vdGF0aW9uV3JpdGVyID0gYW5ub3RhdGlvbldyaXRlcjsKLQkJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlBbm5vdGF0aW9uVGVzdENhc2UudGhpcy5hcHBlbmRTb3VyY2VUbyhzYiwgdGhpcy5hbm5vdGF0aW9uV3JpdGVyLCB0eXBlTmFtZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDk0N2Q5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLQotcHVibGljIGNsYXNzIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBhbm5vdGF0aW9uQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJhbm5vdCIsIGFubm90YXRpb25OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBAaW50ZXJmYWNlICIgKyBhbm5vdGF0aW9uTmFtZSArICIgeyAiICsgYW5ub3RhdGlvbkJvZHkgKyAiIH0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5Kb2luQ29sdW1uIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRFwiKSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDApOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkpvaW5Db2x1bW4iLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEXCIpKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkpvaW5Db2x1bW4iLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpOwotCQlTdHJpbmcgdmFsdWUgPSAoKFN0cmluZ0xpdGVyYWwpICgoTWVtYmVyVmFsdWVQYWlyKSAoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24pLnZhbHVlcygpLmdldCgwKSkuZ2V0VmFsdWUoKSkuZ2V0TGl0ZXJhbFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19JRDIiLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkpvaW5Db2x1bW4iLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpOwotCQlTdHJpbmcgdmFsdWUgPSAoKFN0cmluZ0xpdGVyYWwpICgoTWVtYmVyVmFsdWVQYWlyKSAoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24pLnZhbHVlcygpLmdldCgwKSkuZ2V0VmFsdWUoKSkuZ2V0TGl0ZXJhbFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19JRDIiLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEXCIpKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW5zIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJBRERSRVNTX0lEMiIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQUREUkVTU19JRDIiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJTdHJpbmcgY29tbWVudCgpOyBKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbW1lbnQ9XCJ0ZXN0XCIsY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29tbWVudD1cInRlc3RcIixjb2x1bW5zPUBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMobnVsbCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDApOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1ucyhudWxsKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSI7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbiIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBudWxsfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSI7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIG51bGwsIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKX0pIjsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMyk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtudWxsLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbiIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1uIiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkpvaW5Db2x1bW4iLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW5zIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbiIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoY29sdW1ucz17QEpvaW5Db2x1bW4sQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uLCBAYW5ub3QuSm9pbkNvbHVtbn0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uLCBAYW5ub3QuSm9pbkNvbHVtbiwiICsgQ1IgKyAiICAgIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKDc3KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkpvaW5Db2x1bW4iLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW5zIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCI3NyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9QGFubm90LkpvaW5Db2x1bW4oNzcpKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPUBKb2luQ29sdW1uKSIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiNzciLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPUBhbm5vdC5Kb2luQ29sdW1uKDc3KSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4oNzcpLEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKDc3KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhjb2x1bW5zPXtASm9pbkNvbHVtbig3NyksQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKDc3KSxAYW5ub3QuSm9pbkNvbHVtbig4OCl9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbig3NyksQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyBTdHJpbmcgdGV4dCgpOyBpbnQgbnVtKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbih0ZXh0PVwiYmxhaFwiLG51bT00MikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoY29sdW1ucz17QEpvaW5Db2x1bW4odGV4dD1cImJsYWhcIiwgbnVtPTQyKSxASm9pbkNvbHVtbn0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyBTdHJpbmcgdGV4dCgpOyBpbnQgbnVtKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbih0ZXh0PVwiYmxhaFwiLG51bT00MikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1ucyhjb2x1bW5zPXtASm9pbkNvbHVtbih0ZXh0PVwiYmxhaFwiLCBudW09NDIpLG51bGwsQEpvaW5Db2x1bW59KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyBTdHJpbmcgdGV4dCgpOyBpbnQgbnVtKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4odGV4dD1cImJsYWhcIixudW09NDIpIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEpvaW5Db2x1bW5zKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBKb2luQ29sdW1uKHRleHQ9XCJibGFoXCIsIG51bT00MiksbnVsbCwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBKb2luQ29sdW1uIiArIENSICsgIiAgICB9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQzLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIG51bGwsIG51bGwsIjsgIC8vIHRoZSBsaW5lIGdldHMgc3BsaXQKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJASm9pbkNvbHVtbn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgNCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjI2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBudWxsLCBudWxsLCI7ICAvLyB0aGUgbGluZSBnZXRzIHNwbGl0Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEpvaW5Db2x1bW59KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCA0KTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbnMoY29sdW1ucz17bnVsbCxASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigxKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e251bGwsQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSI7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7bnVsbCxAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpIjsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDEpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDMpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lENFwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQ0XCIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDMpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMyk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDApOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMyk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAzKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQ0XCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQ0XCIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDMpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb245KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoZXhwZWN0ZWQpOyAgLy8gdGhlIHNvdXJjZSBzaG91bGQgYmUgdW5jaGFuZ2VkCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDApOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMyk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpIjsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigxKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuSm9pbkNvbHVtbnMiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMTBhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSI7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBhbm5vdC5Kb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIikiKTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpIjsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuSm9pbkNvbHVtbnMiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpfSkiOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAzKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTkwOTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9EZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkRlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0KLQkvLyAqKioqKioqKioqIFRlc3RDYXNlIGJlaGF2aW9yICoqKioqKioqKioKLQotCXB1YmxpYyBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbW1hTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmNvbW1hTGVuZ3RoKCIsIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5jb21tYUxlbmd0aCgiLCAiKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmNvbW1hTGVuZ3RoKCIsICAgIikpOwotCi0JCWFzc2VydEVxdWFscygyLCB0aGlzLmNvbW1hTGVuZ3RoKCIgLCIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuY29tbWFMZW5ndGgoIiAsICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuY29tbWFMZW5ndGgoIiAsICAgIikpOwotCi0JCWFzc2VydEVxdWFscygzLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICwiKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICwgIikpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5jb21tYUxlbmd0aCgiICAsICAgIikpOwotCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICwsLCIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLCwsICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLCAgICwiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLHgiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICx4ICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLCAgIHgiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoInggICwiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbW1hTGVuZ3RoKCJ4ICAsICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoInggICwgICAiKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tbWFMZW5ndGgoU3RyaW5nIHMpIHsKLQkJSW50ZWdlciBsZW4gPSAoSW50ZWdlcikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpLCAiY29tbWFMZW5ndGgiLCBTdHJpbmcuY2xhc3MsIHMpOwotCQlyZXR1cm4gbGVuLmludFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKCJARiIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN0cmluZ0lzQW5ub3RhdGlvbigiQEZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN0cmluZ0lzQW5ub3RhdGlvbigiQG9yZy5iYXIuRm9vIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKCIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKCJAIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN0cmluZ0lzQW5ub3RhdGlvbigiRm9vIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN0cmluZ0lzQW5ub3RhdGlvbigiRm9vQCIpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3RyaW5nSXNBbm5vdGF0aW9uKFN0cmluZyBzKSB7Ci0JCUJvb2xlYW4gYiA9IChCb29sZWFuKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QoRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCksICJzdHJpbmdJc0Fubm90YXRpb24iLCBTdHJpbmcuY2xhc3MsIHMpOwotCQlyZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUVG9vbHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NDRjYWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRURmllbGRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgSkRUVG9vbHNUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSkRUVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW51bUFuZE1lbWJlcnMoU3RyaW5nIGVudW1OYW1lLCBTdHJpbmcgZW51bUJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiZW51bXMiLCBlbnVtTmFtZSArICIuamF2YSIsICJwdWJsaWMgZW51bSAiICsgZW51bU5hbWUgKyAiIHsgIiArIGVudW1Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRW51bTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiVGVzdEVudW0iLCAiRk9PLCBCQVIsIEJBWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUZXN0QW5ub3RhdGlvbiIsICJUZXN0RW51bSBmb28oKTsiKTsKLQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LlRlc3RBbm5vdGF0aW9uKGZvbz1lbnVtcy5UZXN0RW51bS5CQVopIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LlRlc3RBbm5vdGF0aW9uIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImZvbyIpOwotCQlKRFRGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IHRoaXMuaWRGaWVsZChjdSk7Ci0KLQkJU3RyaW5nIGFjdHVhbCA9IEpEVFRvb2xzLnJlc29sdmVFbnVtKChOYW1lKSBkYWVhLmdldEV4cHJlc3Npb24oZmllbGQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uQkFaIiwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUVudW0yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIlRlc3RFbnVtIiwgIkZPTywgQkFSLCBCQVoiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVzdEFubm90YXRpb24iLCAiVGVzdEVudW0gZm9vKCk7Iik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtcy5UZXN0RW51bS5CQVoiLCAiQGFubm90LlRlc3RBbm5vdGF0aW9uKGZvbz1CQVopIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LlRlc3RBbm5vdGF0aW9uIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImZvbyIpOwotCQlKRFRGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IHRoaXMuaWRGaWVsZChjdSk7Ci0KLQkJU3RyaW5nIGFjdHVhbCA9IEpEVFRvb2xzLnJlc29sdmVFbnVtKChOYW1lKSBkYWVhLmdldEV4cHJlc3Npb24oZmllbGQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uQkFaIiwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUVudW0zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIlRlc3RFbnVtIiwgIkZPTywgQkFSLCBCQVoiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVzdEFubm90YXRpb24iLCAiVGVzdEVudW0gZm9vKCk7Iik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtcy5UZXN0RW51bS4qIiwgIkBhbm5vdC5UZXN0QW5ub3RhdGlvbihmb289QkFaKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5UZXN0QW5ub3RhdGlvbiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJmb28iKTsKLQkJSkRURmllbGRBdHRyaWJ1dGUgZmllbGQgPSB0aGlzLmlkRmllbGQoY3UpOwotCi0JCVN0cmluZyBhY3R1YWwgPSBKRFRUb29scy5yZXNvbHZlRW51bSgoTmFtZSlkYWVhLmdldEV4cHJlc3Npb24oZmllbGQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uQkFaIiwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUVudW00KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIlRlc3RFbnVtIiwgIkZPTywgQkFSLCBCQVoiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVzdEFubm90YXRpb24iLCAiVGVzdEVudW0gZm9vKCk7Iik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoImVudW1zLlRlc3RFbnVtIiwgIkBhbm5vdC5UZXN0QW5ub3RhdGlvbihmb289VGVzdEVudW0uQkFaKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5UZXN0QW5ub3RhdGlvbiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJmb28iKTsKLQkJSkRURmllbGRBdHRyaWJ1dGUgZmllbGQgPSB0aGlzLmlkRmllbGQoY3UpOwotCi0JCVN0cmluZyBhY3R1YWwgPSBKRFRUb29scy5yZXNvbHZlRW51bSgoTmFtZSkgZGFlYS5nZXRFeHByZXNzaW9uKGZpZWxkLmdldE1vZGlmaWVkRGVjbGFyYXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSkpOwotCQlhc3NlcnRFcXVhbHMoImVudW1zLlRlc3RFbnVtLkJBWiIsIGFjdHVhbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0pwdENvcmVVdGlsaXR5SmR0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSnB0Q29yZVV0aWxpdHlKZHRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTUyNTZmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSnB0Q29yZVV0aWxpdHlKZHRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRDb3JlVXRpbGl0eUpkdFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHN1aXRlKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoYm9vbGVhbiBhbGwpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb3JlVXRpbGl0eUpkdFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpEVFRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFR5cGVUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdENvcmVVdGlsaXR5SmR0VGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9NZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9NZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjI1ZjliLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUTm9kZVRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5QcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLQotcHVibGljIGNsYXNzIE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlclRlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQotCXB1YmxpYyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiYW5ub3QiLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudW0oU3RyaW5nIGVudW1OYW1lLCBTdHJpbmcgZW51bUJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiZW51bXMiLCBlbnVtTmFtZSArICIuamF2YSIsICJwdWJsaWMgZW51bSAiICsgZW51bU5hbWUgKyAiIHsgIiArIGVudW1Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJ4eHhcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygieHh4IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImludCBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTQ4KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZGFhLCAiYmFyIiwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ4KSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImNoYXIgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0nYycpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImMiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYm9vbGVhbiBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWZhbHNlKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhLCAiYmFyIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgImJvb2xlYW4gZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KGZyZWQ9ZmFsc2UpKSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhMywgImZyZWQiLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYm9vbGVhbiB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhmYWxzZSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZU51bGwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVOdWxsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJGb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVsbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgIlN0cmluZyBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXopKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEzLCAiZnJlZCIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZVN0cmluZ0NvbmNhdGVuYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPVwieHh4XCIgKyBcInl5eVwiICsgXCJ6enpcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygieHh4eXl5enp6IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZVN0cmluZ0NvbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCS8vIGp1c3QgYSBiaXQgaGFja3k6Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9PX0JBUiA9IFwieHh4XCI7IEBhbm5vdC5Gb28oYmFyPUZPT19CQVIgKyBcInl5eVwiICsgXCJ6enpcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygieHh4eXl5enp6IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZU51bWJlckFyaXRobWV0aWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImludCBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTQ3IC0gNyArIDIgKiAxIC8gMSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yTnVtYmVycyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDIpLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVtYmVyU2hpZnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImludCBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTIgPDwgMikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yTnVtYmVycyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOCksIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVOdW1iZXJDb25zdGFudCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiaW50IGJhcigpOyIpOwotCQkvLyBqdXN0IGEgYml0IGhhY2t5OgotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPT19CQVIgPSA3NzsgQGFubm90LkZvbyhiYXI9Rk9PX0JBUikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yTnVtYmVycyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNzcpLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQ2hhcmFjdGVyQ29uc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImNoYXIgYmFyKCk7Iik7Ci0JCS8vIGp1c3QgYSBiaXQgaGFja3k6Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZPT19CQVIgPSAnUSc7IEBhbm5vdC5Gb28oYmFyPUZPT19CQVIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQ2hhcmFjdGVycyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoIlEiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQ2hhcmFjdGVyQ2FzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiY2hhciBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPShjaGFyKSAweDQxKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckNoYXJhY3RlcnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJBIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUJvb2xlYW5PcGVyYXRvcjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj03ID4gMikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQm9vbGVhbnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQm9vbGVhbk9wZXJhdG9yMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYm9vbGVhbiBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTcgPT0gMikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQm9vbGVhbnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUJvb2xlYW5PcGVyYXRvcjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0oNyAhPSAyKSAmJiBmYWxzZSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQm9vbGVhbnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUJvb2xlYW5PcGVyYXRvcjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0oNyAhPSAyKSA/IGZhbHNlIDogdHJ1ZSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQm9vbGVhbnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTc3KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSW52YWxpZFZhbHVlMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9YmF6enp6KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSW52YWxpZFZhbHVlMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYm9vbGVhbiBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWJhenp6eikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQm9vbGVhbnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVJbnZhbGlkVmFsdWU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJjaGFyIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJiYXp6enpcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JDaGFyYWN0ZXJzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJqYXZhLmxhbmcuT2JqZWN0XCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSW52YWxpZFZhbHVlNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9ZW51bXMuVGVzdEVudW0uY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgImJvb2xlYW4gZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIHZhbHVlID0gIlwiZmFsc2VcIiI7Ci0JCVN0cmluZyBlbGVtZW50ID0gImZyZWQ9IiArIHZhbHVlOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9QGFubm90LkJheigiICsgZWxlbWVudCArICIpKSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhMywgImZyZWQiLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9e3RydWUsIGZhbHNlfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHtudWxsLCBudWxsfSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVJbnZhbGlkVmFsdWU5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTc3KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10ge251bGx9LCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBU1ROb2RlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlTdHJpbmcgdmFsdWUgPSAiXCJ4eHhcIiI7Ci0JCVN0cmluZyBlbGVtZW50ID0gImJhcj0iICsgdmFsdWU7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oIiArIGVsZW1lbnQgKyAiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gbmV3IEFTVE5vZGVUZXh0UmFuZ2UoYWVhLmdldEFzdE5vZGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFNvdXJjZShjdSkuaW5kZXhPZih2YWx1ZSksIHRleHRSYW5nZS5nZXRPZmZzZXQoKSk7Ci0JCWFzc2VydEVxdWFscyh2YWx1ZS5sZW5ndGgoKSwgdGV4dFJhbmdlLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDgsIHRleHRSYW5nZS5nZXRMaW5lTnVtYmVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBU1ROb2RlMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiYm9vbGVhbiBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgdmFsdWUgPSAiZmFsc2UiOwotCQlTdHJpbmcgZWxlbWVudCA9ICJmcmVkPSIgKyB2YWx1ZTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooIiArIGVsZW1lbnQgKyAiKSkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYWVhLmdldFZhbHVlKCkpOwotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gbmV3IEFTVE5vZGVUZXh0UmFuZ2UoYWVhLmdldEFzdE5vZGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JCWFzc2VydEVxdWFscyh2YWx1ZS5sZW5ndGgoKSwgdGV4dFJhbmdlLmdldExlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QVNUTm9kZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgZWxlbWVudCA9ICJcInh4eFwiIjsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbygiICsgZWxlbWVudCArICIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IG5ldyBBU1ROb2RlVGV4dFJhbmdlKGFlYS5nZXRBc3ROb2RlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRTb3VyY2UoY3UpLmluZGV4T2YoZWxlbWVudCksIHRleHRSYW5nZS5nZXRPZmZzZXQoKSk7Ci0JCWFzc2VydEVxdWFscyhlbGVtZW50Lmxlbmd0aCgpLCB0ZXh0UmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBU1ROb2RlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28iOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gbmV3IEFTVE5vZGVUZXh0UmFuZ2UoYWVhLmdldEFzdE5vZGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFNvdXJjZShjdSkuaW5kZXhPZihhbm5vdGF0aW9uKSwgdGV4dFJhbmdlLmdldE9mZnNldCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFubm90YXRpb24ubGVuZ3RoKCksIHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKGJhcj1cInh4eFwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKGJhcj1cInh4eFwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIsIGZhbHNlKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiYm9vbGVhbiBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9QGFubm90LkJheihmcmVkPWZhbHNlKSkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkJhciIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUzYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiYm9vbGVhbiBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9QGFubm90LkJheihmcmVkPWZhbHNlKSkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiLCBmYWxzZSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiLCBmYWxzZSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oQEJhcikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJGb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoInh4eCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhcj1cInh4eFwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KGZyZWQ9ZmFsc2UpKSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooZnJlZD10cnVlKSkpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgImJvb2xlYW4gZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhMywgImZyZWQiLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcihqaW1teT1AQmF6KGZyZWQ9dHJ1ZSkpKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWU3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oYmFyPVwieHh4XCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoInl5eSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhiYXI9XCJ5eXlcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoInh4eCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhcj1cInh4eFwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWU5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsgU3RyaW5nIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKFwienp6XCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoInh4eCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyh2YWx1ZT1cInp6elwiLCBiYXI9XCJ4eHhcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsgU3RyaW5nIGJheigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKGJhcj1cInh4eFwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJheiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKCJ5eXkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oYmFyPVwieHh4XCIsIGJheiA9IFwieXl5XCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJpbnQgZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6W10gamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9e0Bhbm5vdC5CYXooZnJlZD0wKSwgQGFubm90LkJheihmcmVkPTEpLCBAYW5ub3QuQmF6KGZyZWQ9MiksIEBhbm5vdC5CYXooZnJlZD0zKX0pKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAyLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGRhYTMsICJmcmVkIiwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMiksIGFlYS5nZXRWYWx1ZSgpKTsKLQkJYWVhLnNldFZhbHVlKEludGVnZXIudmFsdWVPZig0OCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9e0Bhbm5vdC5CYXooZnJlZD0wKSwgQGFubm90LkJheihmcmVkPTEpLCBAYW5ub3QuQmF6KGZyZWQ9NDgpLCBAYW5ub3QuQmF6KGZyZWQ9Myl9KSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAidmFsdWUiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieHh4Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oXCJ4eHhcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKFwienp6XCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAidmFsdWUiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieHh4Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKFwieHh4XCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlTGl0ZXJhbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9amF2YS5sYW5nLk9iamVjdC5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVR5cGVMaXRlcmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKCJqYXZhLmxhbmcuT2JqZWN0Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyPWphdmEubGFuZy5PYmplY3QuY2xhc3MpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlTGl0ZXJhbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9aW50LmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlTGl0ZXJhbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9amF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAuRW50cnkiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVR5cGVMaXRlcmFsMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1pbnQuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVR5cGVMaXRlcmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKCJpbnQiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXI9aW50LmNsYXNzKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlVHlwZUxpdGVyYWwzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWphdmEubGFuZy5PYmplY3QuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVR5cGVMaXRlcmFsNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj12b2lkLmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVFbnVtMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9ZW51bXMuVGVzdEVudW0uWFhYKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImVudW1zLlRlc3RFbnVtLlhYWCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVFbnVtMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgic3RhdGljIGVudW1zLlRlc3RFbnVtLlhYWCIsICJAYW5ub3QuRm9vKGJhcj1YWFgpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uWFhYIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW0zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW00KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJlbnVtcy5UZXN0RW51bSIsICJAYW5ub3QuRm9vKGJhcj1UZXN0RW51bS5YWFgpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uWFhYIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW0xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0gYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oYmFyPVhYWCkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgic3RhdGljIGVudW1zLlRlc3RFbnVtLlhYWCIsIGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9WFhYKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUoImVudW1zLlRlc3RFbnVtLlhYWCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZVN0cmluZ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXtcInN0cmluZzBcIiwgXCJzdHJpbmcxXCJ9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJzdHJpbmcwIiwgInN0cmluZzEifSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVTdHJpbmdBcnJheUNvbmNhdGVuYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9e1wic3RyaVwiICsgXCJuZzBcIiwgXCJzXCIgKyBcInRyaW5nMVwifSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsic3RyaW5nMCIsICJzdHJpbmcxIn0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlU3RyaW5nQXJyYXlFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17fSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVTdHJpbmdBcnJheVNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJzdHJpbmcwXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7InN0cmluZzAifSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVOdWxsU3RyaW5nQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbygpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3RyaW5nQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJARm9vKGJhcj17XCJzdHJpbmcwXCIsXCJzdHJpbmcxXCJ9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJzdHJpbmcwIiwgInN0cmluZzEifSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVN0cmluZ0FycmF5RW1wdHlSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJARm9vIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbMF0pOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTdHJpbmdBcnJheUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9e30pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdPiBleHByZXNzaW9uQ29udmVydGVyID0gbmV3IEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpLCBmYWxzZSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgZXhwcmVzc2lvbkNvbnZlcnRlcik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nWzBdKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3RyaW5nQXJyYXlTaW5nbGVFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9XCJzdHJpbmcwXCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7InN0cmluZzAifSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW1BcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17ZW51bXMuVGVzdEVudW0uWFhYLCBlbnVtcy5UZXN0RW51bS5ZWVl9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJlbnVtcy5UZXN0RW51bS5YWFgiLCAiZW51bXMuVGVzdEVudW0uWVlZIn0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bUFycmF5SW52YWxpZEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXtlbnVtcy5UZXN0RW51bS5YWFgsIDg4fSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0uWFhYIiwgbnVsbH0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bUFycmF5RW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9e30pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bUFycmF5U2luZ2xlRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1lbnVtcy5UZXN0RW51bS5YWFgpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtLlhYWCJ9LCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW1BcnJheVNpbmdsZUVsZW1lbnRJbnZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPVwiXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7bnVsbH0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVsbEVudW1BcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJARm9vKGJhcj17WFhYLFlZWX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtLlhYWCIsICJlbnVtcy5UZXN0RW51bS5ZWVkifSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0uWFhYOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bS5ZWVk7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlFbXB0eVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBGb28iOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1swXSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1BcnJheUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9e30pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiLCB0cnVlLCBmYWxzZSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nWzBdKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5U2luZ2xlRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBGb28oYmFyPVhYWCkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0uWFhYIn0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDZhYTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBhbm5vdGF0aW9uQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJhbm5vdCIsIGFubm90YXRpb25OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBAaW50ZXJmYWNlICIgKyBhbm5vdGF0aW9uTmFtZSArICIgeyAiICsgYW5ub3RhdGlvbkJvZHkgKyAiIH0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbj1AYW5ub3QuQmFyKSIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkJhciIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiB5YW5hKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBhbm5vdC5CYXIoeWFuYT1AYW5ub3QuQmF6KSkiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAieWFuYSIsICJhbm5vdC5CYXoiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMyk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5CYXoiLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oKSIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249XCJhbm5vdC5CYXJcIikiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGw0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyMiIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcjIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBhbm5vdC5CYXIyKSIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBhbm5vdC5CYXIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjFhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249QGFubm90LkJhcikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIiwgZmFsc2UpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPVwiYW5ub3QuQmFyXCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyMiIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcjIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBhbm5vdC5CYXIyKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogbmVzdGVkQW5ub3RhdGlvbjIoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uMSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uMT1AYW5ub3QuQmFyKG5lc3RlZEFubm90YXRpb24yPUBhbm5vdC5CYXopKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhRm9vID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYUJhciA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUZvbywgIm5lc3RlZEFubm90YXRpb24xIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUJhciwgIm5lc3RlZEFubm90YXRpb24yIiwgImFubm90LkJheiIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmFyIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJCYXoiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb241YSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogbmVzdGVkQW5ub3RhdGlvbjIoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uMSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uMT1AYW5ub3QuQmFyKG5lc3RlZEFubm90YXRpb24yPUBhbm5vdC5CYXopKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhRm9vID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYUJhciA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUZvbywgIm5lc3RlZEFubm90YXRpb24xIiwgImFubm90LkJhciIsIGZhbHNlKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWFCYXIsICJuZXN0ZWRBbm5vdGF0aW9uMiIsICJhbm5vdC5CYXoiLCBmYWxzZSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uMT1AQmFyKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBCYXIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb249QEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7IFN0cmluZyB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZT1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uPUBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3QgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbiA9IEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIHZhbHVlID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb249QEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb249QEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjMoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24zKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKEBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb240KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWU9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbj1AQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3QgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7IFN0cmluZyB4eHgoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjcoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb243KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7IFN0cmluZyB4eHgoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCB2YWx1ZSA9IEBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb244KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uOChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBCYXIoeXl5PVwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ5eXkiLCAidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24yKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcih5eXk9XCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ5eXkiLCAidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbj1AQmFyKHl5eT1cInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjMoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24zKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhAQmFyKHl5eT1cInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjQoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb240KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWU9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbj1AQmFyKHl5eT1cInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjUoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb241KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdCB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKHl5eT1cInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb242KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbiA9IEBCYXIoeXl5ID0gXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb243KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIHZhbHVlID0gQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjgoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb244KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM4YTgzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKGFubm90YXRpb25OYW1lLCAiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhciwgQGFubm90LkJhcihcInR3b1wiKX0pIik7Ci0JCS8vIDAKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkJhciIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0KLQkJLy8gMQotCQlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCWFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkJhciIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmF6Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXpbXSB5YW5hKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKHlhbmE9QGFubm90LkJheikpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJ5YW5hIiwgMCwgImFubm90LkJheiIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEzKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkJheiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmF6Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXpbXSB5YW5hKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKHlhbmE9e0Bhbm5vdC5CYXp9KSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgInlhbmEiLCAwLCAiYW5ub3QuQmF6Iik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTMpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5CYXoiLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpOwotCi0JCS8vIG5hbWUgbWlzbWF0Y2gKLQkJZGFhMyA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAieWFuYSIsIDAsICJhbm5vdC5YeXoiKTsKLQkJYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMyk7Ci0JCWFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJCYXIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmFyIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJCYXIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwiYW5ub3QuQmFyXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25OdWxsNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIk5vdEJhciIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkJhciIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGw1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyLCBAYW5ub3QuQmFyKFwidHdvXCIpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGw2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiWHl6Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmF6Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXpbXSB5YW5hKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKHlhbmE9e0Bhbm5vdC5CYXp9KSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoIkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgInlhbmEiLCAwLCAiYW5ub3QuWHl6Iik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTMpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBAYW5ub3QuQmFyKDEpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17bnVsbCwgQGFubm90LkJhcigxKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtcImFubm90LkJhcjFcIiwgXCJhbm5vdC5CYXIyXCIsIFwiYW5ub3QuQmFyM1wifSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90Lk5vdEJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuTm90QmFyKDApLCBAYW5ub3QuTm90QmFyKDEpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb241YSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIsIGZhbHNlKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydFRydWUoYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKS5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90LkZvbzsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwiYW5ub3QuQmFyXCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5Ob3RCYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBAYW5ub3QuQmFyKDEpLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0VHJ1ZShhYTEuZ2V0QW5ub3RhdGlvbihhc3RSb290KS5pc05vcm1hbEFubm90YXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24oYXN0Um9vdCksICJuZXN0ZWRBbm5vdGF0aW9ucyIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIEBhbm5vdC5CYXIoMSksIG51bGwsIEBhbm5vdC5CYXIoMyl9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIEBhbm5vdC5CYXIoMSksIEBhbm5vdC5CYXIoMiksIEBhbm5vdC5CYXIoMyl9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIsIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbihhc3RSb290KSwgInZhbHVlIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgQGFubm90LkJhcigxKSwgbnVsbCwgQGFubm90LkJhcigzKX0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIEBhbm5vdC5CYXIoMSl9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDEpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIEBhbm5vdC5CYXIoMSl9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoMCkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDEsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDApKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5TSU5HTEVfTUVNQkVSX0FOTk9UQVRJT04sIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpLCAidmFsdWUiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyh7bnVsbCwgQGFubm90LkJhcigxKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMiksIG51bGx9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoMCkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgbnVsbCwgbnVsbCwgQGFubm90LkJhcigzKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIsIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbihhc3RSb290KSwgInZhbHVlIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMiksIEBhbm5vdC5CYXIoMyl9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMywgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLCAidmFsdWUiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90LkJhcigwKSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSwgIm5lc3RlZEFubm90YXRpb25zIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e251bGwsIEBhbm5vdC5CYXIoMSl9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDEsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBudWxsfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKDApKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5TSU5HTEVfTUVNQkVSX0FOTk9UQVRJT04sIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpLCAibmVzdGVkQW5ub3RhdGlvbnMiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24yMCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKSwgQGFubm90LkJhcigzKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIG51bGwsIG51bGwsIEBhbm5vdC5CYXIoMyl9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24oYXN0Um9vdCksICJuZXN0ZWRBbm5vdGF0aW9ucyIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDMsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIsIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbihhc3RSb290KSwgIm5lc3RlZEFubm90YXRpb25zIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKHZhbHVlPVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zPUBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB4eHgoKTsgYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB4eHgoKTsgYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCB2YWx1ZSA9IEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb245KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFzc2VydE51bGwoYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbnM9e251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xMCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsgYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKHZhbHVlPVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zPXtudWxsLG51bGwsbnVsbCxudWxsLG51bGwsQEJhcn0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe1wib25lXCIsIFwidHdvXCJ9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QEJhciwgXCJ0d29cIn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7XCJvbmVcIiwgXCJ0d29cIn0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQmFyfSkiLCBjdSk7ICAvLyBzcGxpdCBsaW5lCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyg3KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKHs3LG51bGwsbnVsbCxudWxsLG51bGwsQEJhcn0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oQGFubm90LkJhcig1NSkpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDU1KSxAQmFyfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtcInNvbWV0aGluZ1wifSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0BCYXJ9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e1wic29tZXRoaW5nXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkJhcn0pIiwgY3UpOyAgLy8gc3BsaXQgbGluZQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90Lk5vdEJhcixudWxsLG51bGwsbnVsbCxudWxsLEBCYXJ9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoODgpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKDg4KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoODgpLG51bGwsQEJhcn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjI0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoODgpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcig4OCksbnVsbCxAQmFyfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoODgpLCBAYW5ub3QuQmFyKDc3KX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcig4OCksIEBhbm5vdC5CYXIoNzcpLCBudWxsLCBudWxsLCI7ICAvLyB0aGUgbGluZSBnZXRzIHNwbGl0Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEJhcn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDQsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoODgpLCBAYW5ub3QuQmFyKDc3KX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcig4OCksIEBhbm5vdC5CYXIoNzcpLCBudWxsLCBudWxsLCI7ICAvLyB0aGUgbGluZSBnZXRzIHNwbGl0Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEJhcn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDQsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcig4OCkpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcig4OCkpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjMoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24zKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhAQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjQoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb240KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsgYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWU9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnM9QEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb241KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHh4eCgpOyBhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0gQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb243KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHh4eCgpOyBhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIHZhbHVlID0gQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb244KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uOChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17bnVsbCxudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoTUlTU0lORyl9KSIsIGN1KTsgIC8vID8/PwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28odmFsdWU9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnM9e251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKE1JU1NJTkcpfSkiLCBjdSk7ICAvLyA/Pz8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtcIm9uZVwiLCBcInR3b1wifSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0BCYXIoODgpLCBcInR3b1wifSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjExKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTEoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7XCJvbmVcIiwgXCJ0d29cIn0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXIoTUlTU0lORyl9KSIsIGN1KTsgIC8vIHNwbGl0IGxpbmUKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDcpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTMoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDcpIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oezcsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKE1JU1NJTkcpfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5Ob3RCYXIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTUoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoNTUpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcig1NSksQEJhcig4OCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtcInNvbWV0aGluZ1wifSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0BCYXIoODgpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE3KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTcoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17XCJzb21ldGhpbmdcIn0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXIoTUlTU0lORyl9KSIsIGN1KTsgIC8vID8/PwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xOShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE5KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIwKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMjAoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5Ob3RCYXIpIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5Ob3RCYXIsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKE1JU1NJTkcpfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKDc3KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yMihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKHh4eD04OCkpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24yKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcih4eHg9ODgpKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcih4eHg9ODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKEBCYXIoeHh4PTg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjQoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb240KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWU9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnM9QEJhcih4eHg9ODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoeHh4PTg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb242KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyBTdHJpbmcgeHh4KCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKHh4eCA9IDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjcoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb243KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyBTdHJpbmcgeHh4KCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgdmFsdWUgPSBAQmFyKHh4eCA9IDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjgoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb244KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb245KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyBTdHJpbmcgeHh4KCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbnM9e251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKCl9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyh2YWx1ZT1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucz17bnVsbCxudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoKX0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtcIm9uZVwiLCBcInR3b1wifSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0BCYXIoeHh4PTg4KSwgXCJ0d29cIn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjExKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe1wib25lXCIsIFwidHdvXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQmFyKCl9KSIsIGN1KTsgIC8vIHNwbGl0IGxpbmUKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyg3KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKHh4eD04OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xMyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEzKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyh7NyxudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoKX0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5Ob3RCYXIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoeHh4PTg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE1KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKDU1KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoNTUpLEBCYXIoeHh4PTg4KX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xNihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE2KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e1wic29tZXRoaW5nXCJ9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QEJhcih4eHg9ODgpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE3KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTcoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjE4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17XCJzb21ldGhpbmdcIn0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXIoKX0pIiwgY3UpOyAgLy8gc3BsaXQgbGluZQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIoeHh4PTg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE5KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTkoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKHh4eD04OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24yMChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIwKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24yMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90Lk5vdEJhcixudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoKX0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoNzcpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKHh4eD04OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24yMihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoMDApKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7bnVsbCxAYW5ub3QuQmFyKDAwKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigxKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe251bGwsIEBhbm5vdC5CYXIoMTEpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcigxMSkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMDApLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMiksIEBhbm5vdC5CYXIoMzMpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMzMpLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMywgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpLCBAYW5ub3QuQmFyKDMzKSwgQGFubm90LkJhcig0NCl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigzMyksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKSwgbnVsbCwgQGFubm90LkJhcig0NCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMywgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMDApLCBAYW5ub3QuQmFyKDExKSwgbnVsbCwgQGFubm90LkJhcigyMil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMyk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe251bGwsIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKSwgQGFubm90LkJhcigwMCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMyk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe251bGwsIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMDApLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMiksIG51bGwsIEBhbm5vdC5CYXIoNDQpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe251bGwsIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKSwgbnVsbCwgQGFubm90LkJhcig0NCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMywgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb245KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMil9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGV4cGVjdGVkKTsgIC8vIHRoZSBzb3VyY2Ugc2hvdWxkIGJlIHVuY2hhbmdlZAotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDAwKSkiOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlpYWEubW92ZUFubm90YXRpb24oMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKDAwKSkiKTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIG51bGwsIEBhbm5vdC5CYXIoMjIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcigyMikpIjsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBudWxsLCBAYW5ub3QuQmFyKDMzKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDMzKSwgQGFubm90LkJhcigxMSl9KSI7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDMsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5MWZmMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQotCXB1YmxpYyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7fSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkZvbyIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDEpIEBhbm5vdC5Gb28oMikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5Gb28iLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpOwotCQlFeHByZXNzaW9uIHZhbHVlID0gKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKS5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5OVU1CRVJfTElURVJBTCwgdmFsdWUuZ2V0Tm9kZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiMSIsICgoTnVtYmVyTGl0ZXJhbCkgdmFsdWUpLmdldFRva2VuKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiYW5ub3QuRm9vIiwgIkBGb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9wIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9wIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb3AiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25OdWxsMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQkvLyB1bi1xdWFsaWZpZWQgbmFtZQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJGb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vIiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQGFubm90LkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oMSkgQGFubm90LkZvbygyKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKDEpIEBhbm5vdC5Gb28oMikiLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuRm9vKDEpIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKDIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuRm9vIiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90LkZvbzsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDg4KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90LkZvbzsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBhbm5vdC5Gb28oODgpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCVNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC5Gb287IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCVNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC5Gb287IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhcj1cInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikiLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlNZW1iZXJWYWx1ZVBhaXIgbXZwID0gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgImJhciIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCXRoaXMudmFsdWVzKGFubm90YXRpb24pLmFkZChtdnApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9UeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvVHlwZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZmIzYmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9UeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotCi1wdWJsaWMgY2xhc3MgVHlwZVRlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQotCXB1YmxpYyBUeXBlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBGSUxFX05BTUUsIHNvdXJjZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGpkdENvbXBpbGF0aW9uVW5pdCA9IHRoaXMuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHRoaXMuYnVpbGRUZXN0MVNvdXJjZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqZHRDb21waWxhdGlvblVuaXQpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVGVzdDFTb3VyY2UoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiB7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgcHVibGljIGludCBnZXRJZCgpIHsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3Rlc3QueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTM1YWUzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotCTwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0JPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0JPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzIi8+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0JPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLQk8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wLz4KLQkJPGRlbGV0ZT4KLQkJCTxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotCTx0YXJnZXQgbmFtZT0ic3VpdGUiPgotCQk8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuSnB0Q29yZVRlc3RzIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiIvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLQk8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLQk8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsIHN1aXRlLCBjbGVhbnVwIj4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jbGFzc3BhdGggYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOGQ5MWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YjAxMjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjNkMGM3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEphbiAxNSAxMToxMToxMSBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkMWVhZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLkpwdERiVGVzdHNQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotRWNsaXBzZS1MYXp5U3RhcnQ6IGZhbHNlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IlszLjguMiw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjEiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5kYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDBkMDEwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0jICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogCi0jICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL2RlcmJ5LnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9kZXJieS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDI2NDNhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL2RlcmJ5LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCBmb3IgRGVyYnkKLXVzZXJJRCA9IAotcGFzc3dvcmQgPSAKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9kZXJieS9saWIvZGVyYnkuamFyCi1qYXJzID0gQzovZGVyYnkvbGliL2RlcmJ5LmphcgotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZCBmb3IgRGVyYnkKLSMgdXJsID0gamRiYzpkZXJieTpDOi9kZXJieS9kYXRhL3Rlc3RkYjtjcmVhdGU9dHJ1ZQotdXJsID0gamRiYzpkZXJieTpDOi9kZXJieS9kYXRhL3Rlc3RkYjtjcmVhdGU9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvbXlzcWwucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL215c3FsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OGIwMmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvbXlzcWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovbXlzcWwvbXlzcWwtY29ubmVjdG9yLWphdmEtNS4wLjYtYmluLmphcgotamFycyA9IEM6L215c3FsL215c3FsLWNvbm5lY3Rvci1qYXZhLTUuMC42LWJpbi5qYXIKLQotIyB0aGUgSkRCQyBVUkwgaXMgb3B0aW9uYWwgZm9yIE15U1FMCi0jIHVybCA9IGpkYmM6bXlzcWw6Ly9sb2NhbGhvc3Q6MzMwNgotCi0jIHRoZSBkYXRhYmFzZSBpcyBvcHRpb25hbAotIyBkYXRhYmFzZSA9IHRlc3RkYgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2Njg1Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSBzY290dAotcGFzc3dvcmQgPSB0aWdlcgotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L29yYWNsZS9qZGJjL2xpYi9vamRiYzUuamFyCi1qYXJzID0gQzovb3JhY2xlL2pkYmMvbGliL29qZGJjNS5qYXIKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6dGVzdGRiCi11cmwgPSBqZGJjOm9yYWNsZTp0aGluOkBsb2NhbGhvc3Q6MTUyMTpvcmNsCi0KLSMgdGhlIGRhdGFiYXNlIGlzIG9wdGlvbmFsCi1kYXRhYmFzZSA9IG9yY2wKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZ1hFLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGdYRS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjc2NjMxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZ1hFLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gc2NvdHQKLXBhc3N3b3JkID0gdGlnZXIKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9vcmFjbGUvamRiYy9saWIvb2pkYmMxNC5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6WEUKLXVybCA9IAotCi0jIHRoZSBkYXRhYmFzZSBpcyBvcHRpb25hbAotZGF0YWJhc2UgPSBYRQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlOWkucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTlpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OWQ1ZDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlOWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSBzY290dAotcGFzc3dvcmQgPSB0aWdlcgotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L29yYWNsZS9qZGJjL2xpYi9vamRiYzE0LmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOm9yYWNsZTp0aGluOkBsb2NhbGhvc3Q6MTUyMTp0ZXN0ZGIKLXVybCA9IAotCi0jIHRoZSBkYXRhYmFzZSBpcyBvcHRpb25hbAotZGF0YWJhc2UgPSB0ZXN0ZGIKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3Bvc3RncmVzcWwucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3Bvc3RncmVzcWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVkOGI3My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9wb3N0Z3Jlc3FsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L3Bvc3RncmVzcWwvamRiYy9wb3N0Z3Jlc3FsLTguMi01MDYuamRiYzMuamFyCi1qYXJzID0gQzovcG9zdGdyZXNxbC9qZGJjL3Bvc3RncmVzcWwtOC4yLTUwNi5qZGJjMy5qYXIKLQotIyB0aGUgSkRCQyBVUkwgaXMgb3B0aW9uYWwgZm9yIFBvc3RncmVTUUwKLSMgdXJsID0gamRiYzpwb3N0Z3Jlc3FsCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3NxbHNlcnZlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWMwMDhhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3NxbHNlcnZlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IAotcGFzc3dvcmQgPSAKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9zcWxzZXJ2ZXIvbGliL3NxbGpkYmMuamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIHJlcXVpcmVkCi0jIHVybCA9IGpkYmM6c3Fsc2VydmVyOi8vbG9jYWxob3N0OjE0MzM7ZGF0YWJhc2VOYW1lPXRlc3RkYgotdXJsID0gCi0KLSMgdGhlIGRhdGFiYXNlIGlzIG9wdGlvbmFsCi1kYXRhYmFzZSA9IHRlc3RkYgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3liYXNlLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zeWJhc2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4ZjVlNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zeWJhc2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovc3liYXNlL2xpYi9qY29ubjMuamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIHJlcXVpcmVkCi0jIHVybCA9IGpkYmM6c3liYXNlOlRkczpsb2NhbGhvc3Q6NTAwMC90ZXN0ZGIKLXVybCA9IAotCi0jIHRoZSBkYXRhYmFzZSBpcyBvcHRpb25hbAotZGF0YWJhc2UgPSB0ZXN0ZGIKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRmZTI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IAotIyAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSlBBIERCIFRlc3RzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjMGNhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zLkFsbFBsYXRmb3JtVGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqICBKUFQgREIgVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEpwdERiVGVzdHMgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdERiVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIEFsbFBsYXRmb3JtVGVzdHMuc3VpdGUoKSk7Ci0gICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBKcHREYlRlc3RzKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzUGx1Z2luLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWMyYTdlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogIEpwdERiVGVzdHNQbHVnaW4KLSAqLwotcHVibGljIGNsYXNzIEpwdERiVGVzdHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEpwdERiVGVzdHNQbHVnaW4gcGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0RGJUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSnB0RGJUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvQWxsUGxhdGZvcm1UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9BbGxQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNWRlOWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9BbGxQbGF0Zm9ybVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqICBBbGxQbGF0Zm9ybVRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxQbGF0Zm9ybVRlc3RzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxQbGF0Zm9ybVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0vLyBUT0RPIC0gVW5jb21tZW50IHRoZSBwbGF0Zm9ybSB0byB0ZXN0LgotLy8JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGVyYnlUZXN0cy5jbGFzcyk7Ci0vLwkJCXN1aXRlLmFkZFRlc3RTdWl0ZShNeVNRTFRlc3RzLmNsYXNzKTsKLS8vCQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yYWNsZTEwZ1Rlc3RzLmNsYXNzKTsKLS8vCQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yYWNsZTEwZ1hFVGVzdHMuY2xhc3MpOwotLy8JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JhY2xlOWlUZXN0cy5jbGFzcyk7Ci0vLwkJCXN1aXRlLmFkZFRlc3RTdWl0ZShQb3N0Z3JlU1FMVGVzdHMuY2xhc3MpOwotLy8JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU1FMU2VydmVyVGVzdHMuY2xhc3MpOwotLy8JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3liYXNlVGVzdHMuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFsbFBsYXRmb3JtVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EVFBQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3OTU3NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGE7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Db25uZWN0aW9uUHJvZmlsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklDb25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5JRHJpdmVyTWdtdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuSVByb3BlcnR5U2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5Qcm9wZXJ0eVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLlhNTEZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5qZGJjLklKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmludGVybmFsLkNvbm5lY3Rpdml0eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5LkNvbHVtblBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLkpwdERiVGVzdHNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5JbmRlbnRpbmdQcmludFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVzdWx0U2V0SXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgdGVzdGluZyBEVFAgd3JhcHBlcnMgb24gdmFyaW91cyBkYXRhYmFzZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIERUUFBsYXRmb3JtVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBUaGUgcGxhdGZvcm0gcHJvcGVydGllcyBhcmUgbG9hZGVkIGZyb20gYSBKYXZhIHByb3BlcnRpZXMgZmlsZSBpbiB0aGUKLQkgKiAnb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZycgZGlyZWN0b3J5LiBFYWNoIGRhdGFiYXNlIHBsYXRmb3JtIGhhcwotCSAqIGl0cyBvd24gcHJvcGVydGllcyBmaWxlIChlLmcuICdkZXJieTEwMS5wcm9wZXJ0aWVzJykuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIHBsYXRmb3JtUHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIERhbGkgY29ubmVjdGlvbiBwcm9maWxlIHdyYXBwZXIuCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fQ09ORklHX0RJUkVDVE9SWSA9ICJjb25maWciOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1VTRVJfSURfUFJPUEVSVFkgPSAidXNlcklEIjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1VTRVJfSURfREVGQVVMVCA9ICJ1c2VyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9QQVNTV09SRF9QUk9QRVJUWSA9ICJwYXNzd29yZCI7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9QQVNTV09SRF9ERUZBVUxUID0gIiI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfRFJJVkVSX0pBUlNfUFJPUEVSVFkgPSAiamFycyI7Ci0JCS8vIHJlcXVpcmVkIC0gbm8gZGVmYXVsdAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1VSTF9QUk9QRVJUWSA9ICJ1cmwiOwotCQkvLyByZXF1aXJlZCAtIG5vIGRlZmF1bHQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9EQVRBQkFTRV9QUk9QRVJUWSA9ICJkYXRhYmFzZSI7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9EQVRBQkFTRV9ERUZBVUxUID0gInRlc3RkYiI7Ci0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRFRQUGxhdGZvcm1UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2V0LXVwL3RlYXItZG93biAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzID0gdGhpcy5sb2FkUGxhdGZvcm1Qcm9wZXJ0aWVzKCk7Ci0JCXRoaXMuYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uRmlsZSgpOwotCQl0aGlzLmJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGUoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZSh0aGlzLmdldFByb2ZpbGVOYW1lKCksIERhdGFiYXNlRmluZGVyLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IG51bGw7Ci0JCXRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzID0gbnVsbDsKLQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCS8vICoqKioqIHBsYXRmb3JtIHByb3BlcnRpZXMgZmlsZQotCXByaXZhdGUgUHJvcGVydGllcyBsb2FkUGxhdGZvcm1Qcm9wZXJ0aWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcC5sb2FkKHRoaXMuYnVpbGRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlVVJMKCkub3BlblN0cmVhbSgpKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSBVUkwgYnVpbGRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlVVJMKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QnVuZGxlKHRoaXMuZ2V0VGVzdFBsdWdpbkJ1bmRsZUlEKCkpLmdldEVudHJ5KHRoaXMuZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVBhdGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGVzdFBsdWdpbkJ1bmRsZUlEKCkgewotCQlyZXR1cm4gSnB0RGJUZXN0c1BsdWdpbi5CVU5ETEVfSUQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBsYXRmb3JtUHJvcGVydGllc0RpcmVjdG9yeU5hbWUoKSArICcvJyArIHRoaXMuZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNEaXJlY3RvcnlOYW1lKCkgewotCQlyZXR1cm4gUExBVEZPUk1fQ09ORklHX0RJUkVDVE9SWTsKLQl9Ci0KLQkvKioKLQkgKiBFYWNoIGRhdGFiYXNlIHBsYXRmb3JtIGhhcyBhIHNlcGFyYXRlIHByb3BlcnRpZXMgZmlsZSBpbiB0aGUgJ2NvbmZpZycKLQkgKiBkaXJlY3RvcnkgdGhhdCBtdXN0IGJlIGN1c3RvbWl6ZWQgYnkgd2hvbWV2ZXIgaXMgZXhlY3V0aW5nIHRoZSB0ZXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCk7Ci0KLQkvLyAqKioqKiBkcml2ZXIgZGVmaW5pdGlvbiBmaWxlCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRFRQRHJpdmVyRGVmaW5pdGlvbkZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVhNTEZpbGVNYW5hZ2VyLnNldFN0b3JhZ2VMb2NhdGlvbih0aGlzLmdldERUUERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpKTsKLQkJWE1MRmlsZU1hbmFnZXIuc2V0RmlsZU5hbWUodGhpcy5nZXREVFBEcml2ZXJGaWxlTmFtZSgpKTsKLQotCQlJUHJvcGVydHlTZXRbXSBzZXRzID0gWE1MRmlsZU1hbmFnZXIubG9hZFByb3BlcnR5U2V0cygpOwotCQlmb3IgKElQcm9wZXJ0eVNldCBzZXQgOiBzZXRzKSB7Ci0JCQlpZiAoc2V0LmdldElEKCkuZXF1YWxzKHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpKSB7Ci0JCQkJcmV0dXJuOyAgLy8gcHJvcGVydHkgc2V0cyBsaXZlIGFjcm9zcyB0ZXN0cwotCQkJfQotCQl9Ci0KLQkJWE1MRmlsZU1hbmFnZXIuc2F2ZU5hbWVkUHJvcGVydHlTZXQodGhpcy5idWlsZERUUERyaXZlckRlZmluaXRpb25Qcm9wZXJ0eVNldHMoKSk7Ci0KLQkJLy8gdmVyaWZ5IHRoZSBmaWxlIHdhcyBjcmVhdGVkOgotCQlGaWxlIGRyaXZlckRlZmluaXRpb25lRmlsZSA9IHRoaXMuZ2V0RFRQRHJpdmVyRGVmaW5pdGlvbkxvY2F0aW9uKCkuYXBwZW5kKHRoaXMuZ2V0RFRQRHJpdmVyRmlsZU5hbWUoKSkudG9GaWxlKCk7Ci0JCWFzc2VydFRydWUoZHJpdmVyRGVmaW5pdGlvbmVGaWxlLmV4aXN0cygpKTsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldERUUERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIENvbm5lY3Rpdml0eVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERUUERyaXZlckZpbGVOYW1lKCkgewotCQlyZXR1cm4gSURyaXZlck1nbXRDb25zdGFudHMuRFJJVkVSX0ZJTEU7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvcGVydHlTZXRbXSBidWlsZERUUERyaXZlckRlZmluaXRpb25Qcm9wZXJ0eVNldHMoKSB7Ci0JCUlQcm9wZXJ0eVNldFtdIHByb3BlcnR5U2V0cyA9IG5ldyBJUHJvcGVydHlTZXRbMV07Ci0JCVByb3BlcnR5U2V0SW1wbCBwcm9wZXJ0eVNldCA9IG5ldyBQcm9wZXJ0eVNldEltcGwodGhpcy5nZXREcml2ZXJOYW1lKCksIHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpOwotCQlwcm9wZXJ0eVNldC5zZXRQcm9wZXJ0aWVzKHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCksIHRoaXMuYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uUHJvcGVydGllcygpKTsKLQkJcHJvcGVydHlTZXRzWzBdID0gcHJvcGVydHlTZXQ7Ci0JCXJldHVybiBwcm9wZXJ0eVNldHM7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJOYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGJ1aWxkRFRQRHJpdmVyRGVmaW5pdGlvblByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXAuc2V0UHJvcGVydHkoQ29ubmVjdGlvblByb2ZpbGUuRFJJVkVSX0RFRklOSVRJT05fVFlQRV9QUk9QX0lELCB0aGlzLmdldERyaXZlckRlZmluaXRpb25UeXBlKCkpOwotCQlwLnNldFByb3BlcnR5KENvbm5lY3Rpb25Qcm9maWxlLkRSSVZFUl9KQVJfTElTVF9QUk9QX0lELCB0aGlzLmdldEpEQkNEcml2ZXJKYXJMaXN0KCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRU5ET1JfUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZVZlbmRvcigpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVSU0lPTl9QUk9QX0lELCB0aGlzLmdldERhdGFiYXNlVmVyc2lvbigpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuRFJJVkVSX0NMQVNTX1BST1BfSUQsIHRoaXMuZ2V0RHJpdmVyQ2xhc3MoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVSTF9QUk9QX0lELCB0aGlzLmdldEpEQkNVUkwoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVTRVJOQU1FX1BST1BfSUQsIHRoaXMuZ2V0VXNlcklEKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QQVNTV09SRF9QUk9QX0lELCB0aGlzLmdldFBhc3N3b3JkKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9OQU1FX1BST1BfSUQsIHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBUaGUgSkFSIGxpc3QgaXMgd29ya3NwYWNlLXNwZWNpZmljIGFuZCBpcyBzZXQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRKREJDRHJpdmVySmFyTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVxdWlyZWRQbGF0Zm9ybVByb3BlcnR5KERCX0RSSVZFUl9KQVJTX1BST1BFUlRZKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJDbGFzcygpOwotCi0JLyoqCi0JICogVGhlIGRhdGFiYXNlIFVSTCBpcyB3b3Jrc3BhY2Utc3BlY2lmaWMgYW5kIGlzIHNldCBpbiB0aGUgcHJvcGVydGllcyBmaWxlCi0JICogZm9yIHNvbWUgZGF0YWJhc2VzLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEpEQkNVUkwoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShEQl9VUkxfUFJPUEVSVFksIHRoaXMuZ2V0RGVmYXVsdEpEQkNVUkwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0SkRCQ1VSTCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8qKgotCSAqIFRoZSB1c2VyIElEIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgc2V0IGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVc2VySUQoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShEQl9VU0VSX0lEX1BST1BFUlRZLCBEQl9VU0VSX0lEX0RFRkFVTFQpOwotCX0KLQotCS8qKgotCSAqIFRoZSBwYXNzd29yZCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHNldCBpbiB0aGUgcHJvcGVydGllcyBmaWxlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoREJfUEFTU1dPUkRfUFJPUEVSVFksIERCX1BBU1NXT1JEX0RFRkFVTFQpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkYXRhYmFzZSBuYW1lIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgc2V0IGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShEQl9EQVRBQkFTRV9QUk9QRVJUWSwgREJfREFUQUJBU0VfREVGQVVMVCk7Ci0JfQotCi0JLy8gKioqKiogRFRQIGNvbm5lY3Rpb24gcHJvZmlsZQotCXByaXZhdGUgdm9pZCBidWlsZERUUENvbm5lY3Rpb25Qcm9maWxlKCkgdGhyb3dzIENvbm5lY3Rpb25Qcm9maWxlRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5nZXRQcm9maWxlQnlOYW1lKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSkgIT0gbnVsbCkgewotCQkJcmV0dXJuOyAgLy8gcHJvZmlsZXMgbGl2ZSBhY3Jvc3MgdGVzdHMKLQkJfQotCQl0aGlzLmNyZWF0ZVByb2ZpbGUodGhpcy5nZXRQcm9maWxlTmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkuZ2V0UHJvZmlsZUJ5TmFtZSh0aGlzLmdldFByb2ZpbGVOYW1lKCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9maWxlKFN0cmluZyBwcm9maWxlTmFtZSkgdGhyb3dzIENvbm5lY3Rpb25Qcm9maWxlRXhjZXB0aW9uIHsKLQkJdGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmNyZWF0ZVByb2ZpbGUoCi0JCQkJcHJvZmlsZU5hbWUsCi0JCQkJdGhpcy5nZXRQcm9maWxlRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFByb3ZpZGVySUQoKSwKLQkJCQl0aGlzLmJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0aWVzKCkKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpOwotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm92aWRlcklEKCkgewotCQlyZXR1cm4gQ29ubmVjdGlvblByb2ZpbGUuQ09OTkVDVElPTl9QUk9GSUxFX1RZUEU7Ci0JfQotCSAKLQlwcml2YXRlIFByb3BlcnRpZXMgYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX05BTUVfUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVTRVJOQU1FX1BST1BfSUQsIHRoaXMuZ2V0VXNlcklEKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QQVNTV09SRF9QUk9QX0lELCB0aGlzLmdldFBhc3N3b3JkKCkpOwotCQlwLnNldFByb3BlcnR5KENvbm5lY3Rpb25Qcm9maWxlLkRSSVZFUl9ERUZJTklUSU9OX1BST1BfSUQsIHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpOwotCi0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRSSVZFUl9DTEFTU19QUk9QX0lELCB0aGlzLmdldERyaXZlckNsYXNzKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VUkxfUFJPUF9JRCwgdGhpcy5nZXRKREJDVVJMKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRU5ET1JfUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZVZlbmRvcigpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVSU0lPTl9QUk9QX0lELCB0aGlzLmdldERhdGFiYXNlVmVyc2lvbigpKTsKLQotCQlwLnNldFByb3BlcnR5KENvbm5lY3Rpb25Qcm9maWxlLkRBVEFCQVNFX1NBVkVfUFdEX1BST1BfSUQsIHRoaXMucGFzc3dvcmRJc1NhdmVkKCkpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwYXNzd29yZElzU2F2ZWQoKSB7Ci0JCXJldHVybiAidHJ1ZSI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCkgdGhyb3dzIENvbm5lY3Rpb25Qcm9maWxlRXhjZXB0aW9uIHsKLQkJVGVzdENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5hZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlTdHJpbmcgY3BOYW1lMSA9IHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSArICIxIjsKLQkJdGhpcy5jcmVhdGVQcm9maWxlKGNwTmFtZTEpOwotCQlJQ29ubmVjdGlvblByb2ZpbGUgZHRwQ1AgPSB0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkuZ2V0UHJvZmlsZUJ5TmFtZShjcE5hbWUxKTsKLQkJYXNzZXJ0Tm90TnVsbChkdHBDUCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNwTmFtZTEsIGxpc3RlbmVyLmFkZGVkTmFtZSk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJU3RyaW5nIGNwTmFtZTIgPSB0aGlzLmdldFByb2ZpbGVOYW1lKCkgKyAiMiI7Ci0JCXRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5tb2RpZnlQcm9maWxlKGR0cENQLCBjcE5hbWUyLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGNwTmFtZTEsIGxpc3RlbmVyLnJlbmFtZWRPbGROYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKGNwTmFtZTIsIGxpc3RlbmVyLnJlbmFtZWROZXdOYW1lKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShjcE5hbWUyKTsKLQkJYXNzZXJ0Tm90TnVsbChjcCk7Ci0KLQkJdGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmRlbGV0ZVByb2ZpbGUoZHRwQ1ApOwotCQlhc3NlcnRFcXVhbHMoY3BOYW1lMiwgbGlzdGVuZXIucmVtb3ZlZE5hbWUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCWNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGNwTmFtZTIpOwotCQlhc3NlcnROdWxsKGNwKTsKLQotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLnJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRQcm9maWxlTmFtZSgpLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzSW5hY3RpdmUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0Rpc2Nvbm5lY3RlZCgpKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0FjdGl2ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzQ29ubmVjdGVkKCkpOwotCi0JCXRoaXMudmVyaWZ5RGF0YWJhc2VWZXJzaW9uTnVtYmVyKCk7Ci0JCXRoaXMudmVyaWZ5RGF0YWJhc2VWZW5kb3IoKTsKLQkJdGhpcy52ZXJpZnlEYXRhYmFzZUNvbnRlbnQoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzSW5hY3RpdmUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0Rpc2Nvbm5lY3RlZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGF0YWJhc2VWZXJzaW9uTnVtYmVyKCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChkYXRhYmFzZSk7Ci0KLQkJU3RyaW5nIGFjdHVhbCA9IGRhdGFiYXNlLmdldFZlcnNpb24oKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gdGhpcy5nZXREYXRhYmFzZVZlcnNpb24oKTsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9ICJleHBlY3RlZDogIiArIGV4cGVjdGVkICsgIiAtIGFjdHVhbDogIiArIGFjdHVhbDsKLQkJLy8gcGFydGlhbCBtYXRjaCBpcyBnb29kIGVub3VnaAotCQlhc3NlcnRUcnVlKGVycm9yTWVzc2FnZSwgYWN0dWFsLmluZGV4T2YoZXhwZWN0ZWQpICE9IC0xKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpOwotCQlTdHJpbmcgYWN0dWFsID0gZGF0YWJhc2UuZ2V0VmVuZG9yKCk7Ci0JCVN0cmluZyBleHBlY3RlZCA9IHRoaXMuZ2V0RGF0YWJhc2VWZW5kb3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEYXRhYmFzZUNvbnRlbnQoKSB7Ci0JCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpOwotCQlhc3NlcnRUcnVlKGRhdGFiYXNlLnNjaGVtYXRhU2l6ZSgpID4gMCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IGRhdGFiYXNlLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlpZiAoc2NoZW1hLnRhYmxlc1NpemUoKSA+IDApIHsKLQkJCQlUYWJsZSB0YWJsZSA9IHNjaGVtYS50YWJsZXMoKS5uZXh0KCk7Ci0JCQkJYXNzZXJ0VHJ1ZSh0YWJsZS5jb2x1bW5zU2l6ZSgpID49IDApOwotCQkJCWFzc2VydFRydWUodGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkgPj0gMCk7Ci0JCQkJYXNzZXJ0VHJ1ZSh0YWJsZS5mb3JlaWduS2V5c1NpemUoKSA+PSAwKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPZmZsaW5lKCkgewotCQlpZiAoICEgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5zdXBwb3J0c1dvcmtPZmZsaW5lTW9kZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0aGlzLnByZXBhcmVGb3JPZmZsaW5lV29yaygpOwotCi0JCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS53b3JrT2ZmbGluZSgpOwotCQlhc3NlcnRUcnVlKHN0YXR1cy5pc09LKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNBY3RpdmUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc1dvcmtpbmdPZmZsaW5lKCkpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNJbmFjdGl2ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzRGlzY29ubmVjdGVkKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVGb3JPZmZsaW5lV29yaygpIHsKLQkJaWYgKCAhIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuY2FuV29ya09mZmxpbmUoKSkgewotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuc2F2ZVdvcmtPZmZsaW5lRGF0YSgpOwotCQkJYXNzZXJ0VHJ1ZShzdGF0dXMuaXNPSygpKTsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNhbldvcmtPZmZsaW5lKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25MaXN0ZW5lckNvbm5lY3QoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKCkpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGVIYXNBbnlMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgbGlzdGVuZXIub3BlbmVkUHJvZmlsZSk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgbGlzdGVuZXIub2tUb0Nsb3NlUHJvZmlsZSk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgbGlzdGVuZXIuYWJvdXRUb0Nsb3NlUHJvZmlsZSk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgbGlzdGVuZXIuY2xvc2VkUHJvZmlsZSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGVIYXNOb0xpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyT2ZmbGluZSgpIHsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLnByZXBhcmVGb3JPZmZsaW5lV29yaygpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUud29ya09mZmxpbmUoKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5vcGVuZWRQcm9maWxlKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5va1RvQ2xvc2VQcm9maWxlKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5hYm91dFRvQ2xvc2VQcm9maWxlKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5jbG9zZWRQcm9maWxlKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25MaXN0ZW5lckRhdGFiYXNlKCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCksIGxpc3RlbmVyLmNoYW5nZWREYXRhYmFzZSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyQ2F0YWxvZygpIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCWlmICggISB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuc3VwcG9ydHNDYXRhbG9ncygpKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJCXJldHVybjsKLQkJfQotCQkJCi0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJLy8gdGFrZSB0aGUgZmlyc3QgY2F0YWxvZwotCQlvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nID0gdGhpcy5nZXRGaXJzdERUUENhdGFsb2coKTsKLQkJQ2F0YWxvZyBjYXRhbG9nID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZChkdHBDYXRhbG9nLmdldE5hbWUoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIGR0cENhdGFsb2cpLnJlZnJlc2goKTsKLQkJYXNzZXJ0U2FtZShjYXRhbG9nLCBsaXN0ZW5lci5jaGFuZ2VkQ2F0YWxvZyk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyU2NoZW1hKCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSA9IG51bGw7Ci0JCVNjaGVtYSBzY2hlbWEgPSBudWxsOwotCQlpZiAodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLnN1cHBvcnRzQ2F0YWxvZ3MoKSkgewotCQkJb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZyA9IHRoaXMuZ2V0Rmlyc3REVFBDYXRhbG9nKCk7Ci0JCQlkdHBTY2hlbWEgPSAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSkgZHRwQ2F0YWxvZy5nZXRTY2hlbWFzKCkuZ2V0KDApOwotCQkJc2NoZW1hID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZChkdHBDYXRhbG9nLmdldE5hbWUoKSkuZ2V0U2NoZW1hTmFtZWQoZHRwU2NoZW1hLmdldE5hbWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlkdHBTY2hlbWEgPSAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSkgdGhpcy5nZXREVFBEYXRhYmFzZSgpLmdldFNjaGVtYXMoKS5nZXQoMCk7Ci0JCQlzY2hlbWEgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoZHRwU2NoZW1hLmdldE5hbWUoKSk7Ci0JCX0KLQkJKChJQ2F0YWxvZ09iamVjdCkgZHRwU2NoZW1hKS5yZWZyZXNoKCk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hLCBsaXN0ZW5lci5jaGFuZ2VkU2NoZW1hKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlyZXR1cm4gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZyBnZXRDYXRhbG9nTmFtZWQoU3RyaW5nIGNhdGFsb2dOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKGNhdGFsb2dOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2NoZW1hIGdldFNjaGVtYU5hbWVkKFN0cmluZyBzY2hlbWFOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoc2NoZW1hTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZFBsYXRmb3JtUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5S2V5KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkocHJvcGVydHlLZXkpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwcm9wZXJ0eVZhbHVlKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGFiYXNlIHBsYXRmb3JtIHByb3BlcnRpZXMgZmlsZSAnIiArIHRoaXMuZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVBhdGgoKQotCQkJCQkrICInIGlzIG1pc3NpbmcgYSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5ICciICsgcHJvcGVydHlLZXkgKyAiJy4iKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUhhc0FueUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25Qcm9maWxlSGFzQW55TGlzdGVuZXJzKHRoaXMuY29ubmVjdGlvblByb2ZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUhhc0FueUxpc3RlbmVycyhDb25uZWN0aW9uUHJvZmlsZSBjcCkgewotCQlyZXR1cm4gKChCb29sZWFuKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QoY3AsICJoYXNBbnlMaXN0ZW5lcnMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVIYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnModGhpcy5jb25uZWN0aW9uUHJvZmlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnMoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJcmV0dXJuICgoQm9vbGVhbikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKGNwLCAiaGFzTm9MaXN0ZW5lcnMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUCBtb2RlbCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvZmlsZU1hbmFnZXIgZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKSB7Ci0JCXJldHVybiBQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBJQ29ubmVjdGlvblByb2ZpbGUgZ2V0RFRQQ29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiBnZXREVFBDb25uZWN0aW9uUHJvZmlsZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElDb25uZWN0aW9uUHJvZmlsZSBnZXREVFBDb25uZWN0aW9uUHJvZmlsZShDb25uZWN0aW9uUHJvZmlsZSBjcCkgewotCQlyZXR1cm4gKElDb25uZWN0aW9uUHJvZmlsZSkgQ2xhc3NUb29scy5maWVsZFZhbHVlKGNwLCAiZHRwQ29ubmVjdGlvblByb2ZpbGUiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1hbmFnZWRDb25uZWN0aW9uIGdldERUUE1hbmFnZWRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gKElNYW5hZ2VkQ29ubmVjdGlvbikgQ2xhc3NUb29scy5maWVsZFZhbHVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsICJkdHBNYW5hZ2VkQ29ubmVjdGlvbiIpOwotCX0KLQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZ2V0RFRQRGF0YWJhc2UoKSB7Ci0JCXJldHVybiBnZXREVFBEYXRhYmFzZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGdldERUUERhdGFiYXNlKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlKSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUoZGF0YWJhc2UsICJkdHBEYXRhYmFzZSIpOwotCX0KLQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBnZXRGaXJzdERUUENhdGFsb2coKSB7Ci0JCXJldHVybiAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKS5nZXRDYXRhbG9ncygpLmdldCgwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZ2V0RFRQQ2F0YWxvZ05hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBnZXREVFBDYXRhbG9nKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQobmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZ2V0RFRQQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHsKLQkJcmV0dXJuIChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZykgQ2xhc3NUb29scy5maWVsZFZhbHVlKGNhdGFsb2csICJkdHBDYXRhbG9nIik7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZ2V0RFRQU2NoZW1hTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldERUUFNjaGVtYSh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQobmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBnZXREVFBTY2hlbWEoU2NoZW1hIHNjaGVtYSkgewotCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEpIENsYXNzVG9vbHMuZmllbGRWYWx1ZShzY2hlbWEsICJkdHBTY2hlbWEiKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXhlY3V0ZSBTUUwgKioqKioqKioqKgotCi0JLyoqCi0JICogaWdub3JlIGFueSBlcnJvcnMgKHVzZWZ1bCBmb3IgZHJvcHBpbmcgZGF0YWJhc2Ugb2JqZWN0cyB0aGF0IG1pZ2h0Ci0JICogbm90IGJlIHRoZXJlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoU3RyaW5nIHNxbCkgewotCQl0cnkgewotCQkJdGhpcy5leGVjdXRlVXBkYXRlKHNxbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVXBkYXRlKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlTdGF0ZW1lbnQgamRiY1N0YXRlbWVudCA9IHRoaXMuY3JlYXRlSkRCQ1N0YXRlbWVudCgpOwotCQlqZGJjU3RhdGVtZW50LmV4ZWN1dGVVcGRhdGUoc3FsKTsKLQkJamRiY1N0YXRlbWVudC5jbG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0PE9iamVjdFtdPiBleGVjdXRlKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlTdGF0ZW1lbnQgamRiY1N0YXRlbWVudCA9IHRoaXMuY3JlYXRlSkRCQ1N0YXRlbWVudCgpOwotCQlqZGJjU3RhdGVtZW50LmV4ZWN1dGUoc3FsKTsKLQkJUmVzdWx0U2V0IHJlc3VsdFNldCA9IGpkYmNTdGF0ZW1lbnQuZ2V0UmVzdWx0U2V0KCk7Ci0JCVJlc3VsdFNldE1ldGFEYXRhIG1ldGFEYXRhID0gcmVzdWx0U2V0LmdldE1ldGFEYXRhKCk7Ci0JCWludCBjb2x1bW5Db3VudCA9IG1ldGFEYXRhLmdldENvbHVtbkNvdW50KCk7Ci0JCUFycmF5TGlzdDxPYmplY3RbXT4gcm93cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0W10+KCk7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0W10+IHN0cmVhbSA9IG5ldyBSZXN1bHRTZXRJdGVyYXRvcjxPYmplY3RbXT4ocmVzdWx0U2V0LCBuZXcgTG9jYWxSZXN1bHRTZXRJdGVyYXRvckFkYXB0ZXIoY29sdW1uQ291bnQpKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlyb3dzLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQlqZGJjU3RhdGVtZW50LmNsb3NlKCk7Ci0JCXJldHVybiByb3dzOwotCX0KLQotCXB1YmxpYyBjbGFzcyBMb2NhbFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlciBpbXBsZW1lbnRzIFJlc3VsdFNldEl0ZXJhdG9yLkFkYXB0ZXI8T2JqZWN0W10+IHsKLQkJcHJpdmF0ZSBpbnQgY29sdW1uQ291bnQ7Ci0JCXB1YmxpYyBMb2NhbFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihpbnQgY29sdW1uQ291bnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbHVtbkNvdW50ID0gY29sdW1uQ291bnQ7Ci0JCX0KLQkJcHVibGljIE9iamVjdFtdIGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJT2JqZWN0W10gcm93ID0gbmV3IE9iamVjdFt0aGlzLmNvbHVtbkNvdW50XTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm93Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJcm93W2ldID0gcnMuZ2V0T2JqZWN0KGkgKyAxKTsKLQkJCX0KLQkJCXJldHVybiByb3c7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RhdGVtZW50IGNyZWF0ZUpEQkNTdGF0ZW1lbnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5jcmVhdGVTdGF0ZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBnZXRKREJDQ29ubmVjdGlvbigpIHsKLQkJcmV0dXJuICgoQ29ubmVjdGlvbkluZm8pIHRoaXMuZ2V0RFRQTWFuYWdlZENvbm5lY3Rpb24oKS5nZXRDb25uZWN0aW9uKCkuZ2V0UmF3Q29ubmVjdGlvbigpKS5nZXRTaGFyZWRDb25uZWN0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGR1bXAgZGF0YWJhc2Ugc2NoZW1hICoqKioqKioqKioKLQotCS8qKgotCSAqIGR1bXAgYWxsIHRoZSBkYXRhYmFzZSBtZXRhZGF0YSB0byB0aGUgY29uc29sZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGR1bXBEYXRhYmFzZSgpIHsKLQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0JCS8vIHN5bmNocm9uaXplIHRoZSBjb25zb2xlIHNvIGV2ZXJ5dGhpbmcgaXMgY29udGlndW91cwotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCXRoaXMuZHVtcERhdGFiYXNlT24ocHcpOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcERhdGFiYXNlT24oSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JCXB3LnByaW50KCJkYXRhYmFzZTogIik7Ci0JCXB3LnByaW50bG4oZGF0YWJhc2UuZ2V0TmFtZSgpKTsKLQkJaWYgKGRhdGFiYXNlLnN1cHBvcnRzQ2F0YWxvZ3MoKSkgewotCQkJZm9yIChJdGVyYXRvcjxDYXRhbG9nPiBzdHJlYW0gPSBkYXRhYmFzZS5jYXRhbG9ncygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLmR1bXBDYXRhbG9nT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5kdW1wU2NoZW1hT25Db250YWluZXJPbihkYXRhYmFzZSwgcHcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcENhdGFsb2dPbihDYXRhbG9nIGNhdGFsb2csIEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KCJjYXRhbG9nOiAiKTsKLQkJcHcucHJpbnRsbihjYXRhbG9nLmdldE5hbWUoKSk7Ci0JCXB3LmluZGVudCgpOwotCQl0aGlzLmR1bXBTY2hlbWFPbkNvbnRhaW5lck9uKGNhdGFsb2csIHB3KTsKLQkJcHcudW5kZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNjaGVtYU9uQ29udGFpbmVyT24oU2NoZW1hQ29udGFpbmVyIHNjaGVtYUNvbnRhaW5lciwgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxTY2hlbWE+IHN0cmVhbSA9IHNjaGVtYUNvbnRhaW5lci5zY2hlbWF0YSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuZHVtcFNjaGVtYU9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTY2hlbWFPbihTY2hlbWEgc2NoZW1hLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgic2NoZW1hOiAiKTsKLQkJcHcucHJpbnRsbihzY2hlbWEuZ2V0TmFtZSgpKTsKLQkJcHcuaW5kZW50KCk7Ci0JCWZvciAoSXRlcmF0b3I8VGFibGU+IHN0cmVhbSA9IHNjaGVtYS50YWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmR1bXBUYWJsZU9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPFNlcXVlbmNlPiBzdHJlYW0gPSBzY2hlbWEuc2VxdWVuY2VzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5kdW1wU2VxdWVuY2VPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQkJcHcudW5kZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFRhYmxlT24oVGFibGUgdGFibGUsIEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KCJ0YWJsZTogIik7Ci0JCXB3LnByaW50bG4odGFibGUuZ2V0TmFtZSgpKTsKLQkJcHcuaW5kZW50KCk7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0YWJsZS5jb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5kdW1wQ29sdW1uT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Rm9yZWlnbktleT4gc3RyZWFtID0gdGFibGUuZm9yZWlnbktleXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmR1bXBGb3JlaWduS2V5T24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JCXB3LnVuZGVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBDb2x1bW5PbihDb2x1bW4gY29sdW1uLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgiY29sdW1uOiAiKTsKLQkJcHcucHJpbnQoY29sdW1uLmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCIgOiAiKTsKLQkJcHcucHJpbnQoY29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJaWYgKGNvbHVtbi5pc1ByaW1hcnlLZXlDb2x1bW4oKSkgewotCQkJcHcucHJpbnQoIiBbcHJpbWFyeSBrZXldIik7Ci0JCX0KLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBGb3JlaWduS2V5T24oRm9yZWlnbktleSBmb3JlaWduS2V5LCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgiZm9yZWlnbiBrZXk6ICIpOwotCQlwdy5wcmludChmb3JlaWduS2V5LmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCI9PiIpOwotCQlwdy5wcmludChmb3JlaWduS2V5LmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCIgKCIpOwotCQlmb3IgKEl0ZXJhdG9yPENvbHVtblBhaXI+IHN0cmVhbSA9IGZvcmVpZ25LZXkuY29sdW1uUGFpcnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlDb2x1bW5QYWlyIGNwID0gc3RyZWFtLm5leHQoKTsKLQkJCXB3LnByaW50KGNwLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkJcHcucHJpbnQoIj0+Iik7Ci0JCQlwdy5wcmludChjcC5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJcHcucHJpbnQoIiwgIik7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnQoJyknKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTZXF1ZW5jZU9uKFNlcXVlbmNlIHNlcXVlbmNlLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgic2VxdWVuY2U6ICIpOwotCQlwdy5wcmludGxuKHNlcXVlbmNlLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gcHJvZmlsZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgVGVzdENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50cyBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIHsKLQkJcHVibGljIFN0cmluZyBhZGRlZE5hbWU7Ci0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlZE5hbWU7Ci0JCXB1YmxpYyBTdHJpbmcgcmVuYW1lZE9sZE5hbWU7Ci0JCXB1YmxpYyBTdHJpbmcgcmVuYW1lZE5ld05hbWU7Ci0KLQkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVBZGRlZChTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5hZGRlZE5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVtb3ZlZChTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5yZW1vdmVkTmFtZSA9IG5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW5hbWVkKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgewotCQkJdGhpcy5yZW5hbWVkT2xkTmFtZSA9IG9sZE5hbWU7Ci0JCQl0aGlzLnJlbmFtZWROZXdOYW1lID0gbmV3TmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCXRoaXMuYWRkZWROYW1lID0gbnVsbDsKLQkJCXRoaXMucmVtb3ZlZE5hbWUgPSBudWxsOwotCQkJdGhpcy5yZW5hbWVkT2xkTmFtZSA9IG51bGw7Ci0JCQl0aGlzLnJlbmFtZWROZXdOYW1lID0gbnVsbDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25uZWN0aW9uIGxpc3RlbmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgQ29ubmVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIG9wZW5lZFByb2ZpbGU7Ci0JCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBtb2RpZmllZFByb2ZpbGU7Ci0JCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBva1RvQ2xvc2VQcm9maWxlOwotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgYWJvdXRUb0Nsb3NlUHJvZmlsZTsKLQkJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIGNsb3NlZFByb2ZpbGU7Ci0JCXB1YmxpYyBEYXRhYmFzZSBjaGFuZ2VkRGF0YWJhc2U7Ci0JCXB1YmxpYyBDYXRhbG9nIGNoYW5nZWRDYXRhbG9nOwotCQlwdWJsaWMgU2NoZW1hIGNoYW5nZWRTY2hlbWE7Ci0JCXB1YmxpYyBTZXF1ZW5jZSBjaGFuZ2VkU2VxdWVuY2U7Ci0JCXB1YmxpYyBUYWJsZSBjaGFuZ2VkVGFibGU7Ci0JCXB1YmxpYyBDb2x1bW4gY2hhbmdlZENvbHVtbjsKLQkJcHVibGljIEZvcmVpZ25LZXkgY2hhbmdlZEZvcmVpZ25LZXk7Ci0KLQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCXRoaXMub3BlbmVkUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5tb2RpZmllZFByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLm9rVG9DbG9zZVByb2ZpbGUgPSBwcm9maWxlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWJvdXRUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCXRoaXMuYWJvdXRUb0Nsb3NlUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCXRoaXMuY2xvc2VkUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQl0aGlzLmNoYW5nZWREYXRhYmFzZSA9IGRhdGFiYXNlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENhdGFsb2cgY2F0YWxvZykgewotCQkJdGhpcy5jaGFuZ2VkQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2NoZW1hQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTY2hlbWEgc2NoZW1hKSB7Ci0JCQl0aGlzLmNoYW5nZWRTY2hlbWEgPSBzY2hlbWE7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2VxdWVuY2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0JCQl0aGlzLmNoYW5nZWRTZXF1ZW5jZSA9IHNlcXVlbmNlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBUYWJsZSB0YWJsZSkgewotCQkJdGhpcy5jaGFuZ2VkVGFibGUgPSB0YWJsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2x1bW5DaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENvbHVtbiBjb2x1bW4pIHsKLQkJCXRoaXMuY2hhbmdlZENvbHVtbiA9IGNvbHVtbjsKLQkJfQotCQlwdWJsaWMgdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJCXRoaXMuY2hhbmdlZEZvcmVpZ25LZXkgPSBmb3JlaWduS2V5OwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJdGhpcy5vcGVuZWRQcm9maWxlID0gbnVsbDsKLQkJCXRoaXMubW9kaWZpZWRQcm9maWxlID0gbnVsbDsKLQkJCXRoaXMub2tUb0Nsb3NlUHJvZmlsZSA9IG51bGw7Ci0JCQl0aGlzLmFib3V0VG9DbG9zZVByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5jbG9zZWRQcm9maWxlID0gbnVsbDsKLQkJCXRoaXMuY2hhbmdlZERhdGFiYXNlID0gbnVsbDsKLQkJCXRoaXMuY2hhbmdlZENhdGFsb2cgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkU2NoZW1hID0gbnVsbDsKLQkJCXRoaXMuY2hhbmdlZFNlcXVlbmNlID0gbnVsbDsKLQkJCXRoaXMuY2hhbmdlZFRhYmxlID0gbnVsbDsKLQkJCXRoaXMuY2hhbmdlZENvbHVtbiA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRGb3JlaWduS2V5ID0gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EZXJieVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RlcmJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1ZTQ2Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RlcmJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotCi0vKioKLSAqICBEZXJieSAxMC4xIEVtYmVkZGVkIERyaXZlciBUZXN0Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERlcmJ5VGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBEZXJieVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gImRlcmJ5LnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJEZXJieSBFbWJlZGRlZCBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5EZXJieSBFbWJlZGRlZCBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmRlcmJ5MTAxLmdlbmVyaWNEcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJEZXJieSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMTAuMSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiRGVyYnlfMTAuMV9FbWJlZGRlZCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiRGVyYnkgMTAuMSBFbWJlZGRlZCBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3ZpZGVySUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5kZXJieS5lbWJlZGRlZC5jb25uZWN0aW9uUHJvZmlsZSI7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QxIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEVTVDEiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0JCUNhdGFsb2cgY2F0YWxvZyA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoIiIpOyAgLy8gRGVyYnkncyBvbmx5IGNhdGFsb2cKLQkJU2NoZW1hIHNjaGVtYTFhID0gY2F0YWxvZy5nZXRTY2hlbWFOYW1lZCgiVEVTVDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExYSk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hMSwgc2NoZW1hMWEpOyAgLy8gc2FtZSBzY2hlbWEgc2hvdWxkIGJlIHJldHVybmVkIGJ5IGJvdGggZGF0YWJhc2UgYW5kIGNhdGFsb2cKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEVTVDIiKTsKLQkJU2NoZW1hIHNjaGVtYTIgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRFU1QyIik7Ci0JCWFzc2VydE51bGwoc2NoZW1hMik7ICAvLyBzaG91bGQgYmUgbnVsbCB1bnRpbCByZWZyZXNoCi0KLQkJKChJQ2F0YWxvZ09iamVjdCkgZ2V0RFRQQ2F0YWxvZyhjYXRhbG9nKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKGNhdGFsb2csIGxpc3RlbmVyLmNoYW5nZWRDYXRhbG9nKTsKLQkJYXNzZXJ0U2FtZShjYXRhbG9nLCB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCIiKSk7Ci0KLQkJc2NoZW1hMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJU2NoZW1hIHNjaGVtYTJhID0gY2F0YWxvZy5nZXRTY2hlbWFOYW1lZCgiVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyYSk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hMiwgc2NoZW1hMmEpOwotCQlhc3NlcnROb3RTYW1lKHNjaGVtYTEsIGNhdGFsb2cuZ2V0U2NoZW1hTmFtZWQoIlRFU1QxIikpOyAgLy8gd2Ugc2hvdWxkIGhhdmUgYSBuZXcgc2NoZW1hIGFmdGVyIHRoZSByZWZyZXNoCi0KLQkJdGhpcy5kcm9wU2NoZW1hKCJURVNUMiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYUxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIExPT0tVUF9URVNUIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJcIkxPT0tVUF9URVNUXCIiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJcImxvb2t1cF9URVNUXCIiKSk7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJMT09LVVBfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBcImxvb2t1cF9URVNUXCIiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIkxPT0tVUF9URVNUIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX3Rlc3QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfVEVTVCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlwibG9va3VwX1RFU1RcIiIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYUFubm90YXRpb25JZGVudGlmaWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgbG9va3VwX3Rlc3QiKTsgIC8vIHRoaXMgZ2V0cyBmb2xkZWQgdG8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBcImxvb2t1cF9URVNUXCIiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiTE9PS1VQX1RFU1QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJMT09LVVBfVEVTVCIsIHNjaGVtYS5nZXRBbm5vdGF0aW9uSWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMT09LVVBfVEVTVCIsIHNjaGVtYS5nZXRBbm5vdGF0aW9uSWRlbnRpZmllcigiTG9va3VwVGVzdCIpKTsKLQkJYXNzZXJ0TnVsbChzY2hlbWEuZ2V0QW5ub3RhdGlvbklkZW50aWZpZXIoIkxvb2t1cF9UZXN0IikpOwotCi0JCXNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX3Rlc3QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJMT09LVVBfVEVTVCIsIHNjaGVtYS5nZXRBbm5vdGF0aW9uSWRlbnRpZmllcigpKTsKLQotCQlzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlwibG9va3VwX1RFU1RcIiIpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRBbm5vdGF0aW9uSWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJcImxvb2t1cF9URVNUXCIiLCBzY2hlbWEuZ2V0QW5ub3RhdGlvbklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT09fQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT08iKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFSIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBUQUJMRV9URVNUIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIFNDSEVNQSA9IFRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhckRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29EREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmF6RERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0JhekRETCgpKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiVEFCTEVfVEVTVCIpOwotCi0JCS8vIEZPTwotCQlUYWJsZSBmb29UYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZvb1RhYmxlLmNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBwa0NvbHVtbiA9IGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIHBrQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBpZENvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJJRCIpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGlkQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgaWRDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydFRydWUoaWRDb2x1bW4uaXNQcmltYXJ5S2V5Q29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShpZENvbHVtbi5pc0ZvcmVpZ25LZXlDb2x1bW4oKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgaWRDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQotCQlDb2x1bW4gbmFtZUNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJOQU1FIik7Ci0JCWFzc2VydEVxdWFscygiVkFSQ0hBUiIsIG5hbWVDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBuYW1lQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNQcmltYXJ5S2V5Q29sdW1uKCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiQkFSX0lEIik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzRm9yZWlnbktleUNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUHJpbWFyeUtleUNvbHVtbigpKTsKLQotCQlGb3JlaWduS2V5IGJhckZLID0gZm9vVGFibGUuZm9yZWlnbktleXMoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5jb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfSUQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxPQiIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJDSFVOSyIpLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlW10iLCBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiQ0hVTksiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJDSFVOSyIpLmRhdGFUeXBlSXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJGT09fQkFaIik7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuY29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBmb29fYmF6VGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuZ2V0Q29sdW1uTmFtZWQoIkZPT19JRCIpLmlzRm9yZWlnbktleUNvbHVtbigpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT09fQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT08iKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFSIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXJEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVIgKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIElOVCBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBDSFVOSyBCTE9CKDEwMEspIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29EREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBGT08gKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIElOVCBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOQU1FIFZBUkNIQVIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBUl9JRCBJTlQgUkVGRVJFTkNFUyBCQVIoSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIElOVCBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOQU1FIFZBUkNIQVIoMjApIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29CYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBGT09fQkFaICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBGT09fSUQgSU5UIFJFRkVSRU5DRVMgRk9PKElEKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBCQVpfSUQgSU5UIFJFRkVSRU5DRVMgQkFaKElEKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5Mb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAidGVzdCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEFCTEVfVEVTVCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBTQ0hFTUEgPSBUQUJMRV9URVNUIik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJUQUJMRV9URVNUIikuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJpZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgibmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElEIElOVEVHRVIsIE5BTUUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJUQUJMRV9URVNUIikuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJJRCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiTkFNRSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0KLQkJLy8gbWl4ZWQgY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChJZCBJTlRFR0VSLCBOYW1lIFZBUkNIQVIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiVEFCTEVfVEVTVCIpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIk5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChcIklkXCIgSU5URUdFUiwgXCJOYW1lXCIgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJUQUJMRV9URVNUIikuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJcIklkXCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIlwiTmFtZVwiIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcFRhYmxlKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgdGFibGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2NoZW1hIHNjaGVtYT0gdGhpcy5nZXRTY2hlbWFOYW1lZChzY2hlbWFOYW1lKTsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlpZiAoc2NoZW1hLmdldFRhYmxlTmFtZWQodGFibGVOYW1lKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFRBQkxFICIgKyBzY2hlbWFOYW1lICsgJy4nICsgdGFibGVOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5COiBBIERlcmJ5IHNjaGVtYSBtdXN0IGJlIGVtcHR5IGJlZm9yZSBpdCBjYW4gYmUgZHJvcHBlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZHJvcFNjaGVtYShTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmdldFNjaGVtYU5hbWVkKG5hbWUpICE9IG51bGwpIHsKLQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBTQ0hFTUEgIiArIG5hbWUgKyAiIFJFU1RSSUNUIik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvTXlTUUxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9NeVNRTFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTBlMzYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9NeVNRTFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLQotCi0vKioKLSAqIFNRTCBTZXJ2ZXIgMjAwNSBEcml2ZXIgVGVzdAotICogCi0gKiBOb3RlczoKLSAqIC0gV2UgY2FuIG9ubHkgZ2V0IGRhdGFiYXNlIG9iamVjdHMgZnJvbSB0aGUgZGF0YWJhc2UgYXNzb2NpYXRlZCB3aXRoIG91cgotICogICAgIGNvbm5lY3Rpb24gcHJvZmlsZS4KLSAqIC0gV2UgY2FuIHJlZmVyZW5jZSBvYmplY3RzIGFjcm9zcyBtdWx0aXBsZSBkYXRhYmFzZXMsIHNvIHRoZXkgYXJlIHNvcnRhIGxpa2UKLSAqICAgICBzY2hlbWFzLi4uLgotICogLSBGb3JlaWduIGtleXMgbXVzdCBiZSBkZWZpbmVkIGFzIHRhYmxlLWxldmVsIGNvbnN0cmFpbnRzOyB0aGV5IGNhbm5vdCBiZQotICogICAgIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgY29sdW1uIGNsYXVzZS4KLSAqIC0gQ2FzZS1zZW5zaXRpdml0eSBhbmQgLWZvbGRpbmcgaXMgd2hhY2tlZCBvbiBNeVNRTC4uLi4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTXlTUUxUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIE15U1FMVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAibXlzcWwucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIk15U1FMIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk15U1FMIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm15c3FsLjRfMS5kcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJNeVNxbCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiNC4xIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gImNvbS5teXNxbC5qZGJjLkRyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0SkRCQ1VSTCgpIHsKLQkJcmV0dXJuICJqZGJjOm15c3FsOi8vbG9jYWxob3N0OjMzMDYiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiTXlTUUxfNC4xIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJNeVNRTCA0LjEgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERhdGFiYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCS8vIE15U1FMIGhhcyBhIHNpbmdsZSBzY2hlbWEgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBkYXRhYmFzZQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JCWFzc2VydFNhbWUodGhpcy5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRTY2hlbWEoKSwgc2NoZW1hKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotLy8JCXRoaXMuZHJvcERhdGFiYXNlKCJ0YWJsZV90ZXN0Iik7Ci0KLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBEQVRBQkFTRSB0YWJsZV90ZXN0Iik7Ci0KLQkJLy8gd2UgbXVzdCBleGVjdXRlIGEgVVNFIHN0YXRlbWVudCBiZWZvcmUgZGVmaW5pbmcgb3VyIHRhYmxlcwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlVTRSAiICsgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImZvb19iYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImJheiIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiZm9vIik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJiYXIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhckRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29EREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmF6RERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0JhekRETCgpKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJLy8gZm9vCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZm9vVGFibGUuY29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5mb3JlaWduS2V5c1NpemUoKSk7Ci0KLQkJQ29sdW1uIHBrQ29sdW1uID0gZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcGtDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIGlkQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoImlkIik7Ci0JCWFzc2VydFNhbWUocGtDb2x1bW4sIGlkQ29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlQiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUHJpbWFyeUtleUNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNGb3JlaWduS2V5Q29sdW1uKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgibmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUHJpbWFyeUtleUNvbHVtbigpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoImJhcl9pZCIpOwotCQlhc3NlcnRFcXVhbHMoIklOVCIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzRm9yZWlnbktleUNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUHJpbWFyeUtleUNvbHVtbigpKTsKLQotCQlGb3JlaWduS2V5IGJhckZLID0gZm9vVGFibGUuZm9yZWlnbktleXMoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5jb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJfaWQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxPQiIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlW10iLCBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiY2h1bmsiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmRhdGFUeXBlSXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJmb29fYmF6Iik7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuY29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBmb29fYmF6VGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuZ2V0Q29sdW1uTmFtZWQoImZvb19pZCIpLmlzRm9yZWlnbktleUNvbHVtbigpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiZm9vX2JheiIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJmb28iKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImJhciIpOwotCi0vLwkJdGhpcy5kcm9wRGF0YWJhc2UoInRhYmxlX3Rlc3QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmFyRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmFyICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGNodW5rIEJMT0IiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvbyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIFZBUkNIQVIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhcl9pZCBJTlRFR0VSLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEZPUkVJR04gS0VZIChiYXJfaWQpIFJFRkVSRU5DRVMgYmFyKGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIG5hbWUgVkFSQ0hBUigyMCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvb19iYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGZvb19pZCBJTlQsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmF6X2lkIElOVCwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBGT1JFSUdOIEtFWSAoZm9vX2lkKSBSRUZFUkVOQ0VTIGZvbyhpZCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgRk9SRUlHTiBLRVkgKGJhel9pZCkgUkVGRVJFTkNFUyBiYXooaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogT24gV2luZG93cywgdGFibGUgbmFtZXMgZ2V0IGZvbGRlZCB0byBsb3dlcmNhc2UgYnkgZGVmYXVsdDsKLQkgKiBldmVuIGlmIHRoZSBuYW1lIGlzIGRlbGltaXRlZCAoYXBwYXJlbnRseSkuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCS8vIHdlIG11c3QgZXhlY3V0ZSBhIFVTRSBzdGF0ZW1lbnQgYmVmb3JlIGRlZmluaW5nIG91ciB0YWJsZXMKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJVU0UgIiArIHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0MSIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImBURVNUM2AiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0MSAoaWQgSU5URUdFUiwgbmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgVEVTVDIgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIGBURVNUM2AgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JCVRhYmxlIHRlc3QxVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgidGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MVRhYmxlKTsKLQotCQkvLyB0aGlzIHByb2JhYmx5IG9ubHkgd29ya3Mgb24gV2luZG93cwotCQlUYWJsZSB0ZXN0MlRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoInRlc3QyIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDJUYWJsZSk7Ci0KLQkJLy8gdGhpcyBwcm9iYWJseSBvbmx5IHdvcmtzIG9uIFdpbmRvd3MKLQkJVGFibGUgdGVzdDNUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJgdGVzdDNgIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDNUYWJsZSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QxIik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJURVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiYFRFU1QzYCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkvLyB3ZSBtdXN0IGV4ZWN1dGUgYSBVU0Ugc3RhdGVtZW50IGJlZm9yZSBkZWZpbmluZyBvdXIgdGFibGVzCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiVVNFICIgKyB0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QiKTsKLQotCQkvLyBsb3dlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoaWQgSU5URUdFUiwgbmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgSU5URUdFUiwgTkFNRSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIk5BTUUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QiKTsKLQotCQkvLyBtaXhlZCBjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElkIElOVEVHRVIsIE5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIklkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJOYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0Iik7Ci0KLQkJLy8gZGVsaW1pdGVkCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGBJZGAgSU5URUdFUiwgYE5hbWVgIFZBUkNIQVIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJgSWRgIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJgTmFtZWAiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkcm9wVGFibGUoU3RyaW5nIGRiTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiArIGRiTmFtZSArICcuJyArIHRhYmxlTmFtZSk7Ci0JfQotCi0vLwlwcml2YXRlIHZvaWQgZHJvcERhdGFiYXNlKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgREFUQUJBU0UgSUYgRVhJU1RTICIgKyBuYW1lKTsKLS8vCX0KLS8vCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOGE0NmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci0KLS8qKgotICogIE9yYWNsZSAxMGcgVGhpbiBEcml2ZXIgVGVzdAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcmFjbGUxMGdUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIE9yYWNsZTEwZ1Rlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJvcmFjbGUxMGcucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZSAxMGcgVGhpbiBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uT3JhY2xlIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm9yYWNsZS4xMC5kcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJPcmFjbGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjEwIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yYWNsZS5qZGJjLk9yYWNsZURyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUxMGdfMTAuMS4wLjQiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIk9yYWNsZTEwZyAoMTAuMS4wLjQpIEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RPZmZsaW5lKCkgewotCQkvLyB3b3JraW5nIG9mZmxpbmUgaXMgcHJldHR5IHVnbHkKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyT2ZmbGluZSgpIHsKLQkJLy8gd29ya2luZyBvZmZsaW5lIGlzIHByZXR0eSB1Z2x5Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERhdGFiYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCS8vIE9yYWNsZSBzaG91bGQgaGF2ZSBhIHNjaGVtYSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHVzZXIKLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCh0aGlzLmdldFVzZXJJRCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0U2NoZW1hKCksIHNjaGVtYSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoImZvb19iYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUoImJheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiZm9vIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJiYXIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhckRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29EREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmF6RERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0JhekRETCgpKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJLy8gZm9vCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZm9vVGFibGUuY29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5mb3JlaWduS2V5c1NpemUoKSk7Ci0KLQkJQ29sdW1uIHBrQ29sdW1uID0gZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgcGtDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIGlkQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoImlkIik7Ci0JCWFzc2VydFNhbWUocGtDb2x1bW4sIGlkQ29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKCJOVU1CRVIiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUHJpbWFyeUtleUNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNGb3JlaWduS2V5Q29sdW1uKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubWF0aC5CaWdEZWNpbWFsIiwgaWRDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQotCQlDb2x1bW4gbmFtZUNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJuYW1lIik7Ci0JCWFzc2VydEVxdWFscygiVkFSQ0hBUjIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUHJpbWFyeUtleUNvbHVtbigpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoImJhcl9pZCIpOwotCQlhc3NlcnRFcXVhbHMoIk5VTUJFUiIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzRm9yZWlnbktleUNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUHJpbWFyeUtleUNvbHVtbigpKTsKLQotCQlGb3JlaWduS2V5IGJhckZLID0gZm9vVGFibGUuZm9yZWlnbktleXMoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5jb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfSUQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxPQiIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlW10iLCBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiY2h1bmsiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmRhdGFUeXBlSXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJmb29fYmF6Iik7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuY29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBmb29fYmF6VGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuZ2V0Q29sdW1uTmFtZWQoImZvb19pZCIpLmlzRm9yZWlnbktleUNvbHVtbigpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiZm9vX2JheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJmb28iKTsKLQkJdGhpcy5kcm9wVGFibGUoImJhciIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXJEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBiYXIgKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIE5VTUJFUigxMCkgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgY2h1bmsgQkxPQiIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgZm9vICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBOVU1CRVIoMTApIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIG5hbWUgVkFSQ0hBUjIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhcl9pZCBSRUZFUkVOQ0VTIGJhcihpZCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGJheiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgTlVNQkVSKDEwKSBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIFZBUkNIQVIyKDIwKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgZm9vX2JheiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgZm9vX2lkIE5VTUJFUigxMCkgUkVGRVJFTkNFUyBmb28oaWQpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhel9pZCBOVU1CRVIoMTApIFJFRkVSRU5DRVMgYmF6KGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZUxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdDEiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJcInRlc3QzXCIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0MSAoaWQgTlVNQkVSKDEwKSwgbmFtZSBWQVJDSEFSMigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIFRFU1QyIChpZCBOVU1CRVIoMTApLCBuYW1lIFZBUkNIQVIyKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgXCJ0ZXN0M1wiIChpZCBOVU1CRVIoMTApLCBuYW1lIFZBUkNIQVIyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJVGFibGUgdGVzdDFUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJ0ZXN0MSIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QxVGFibGUpOwotCQl0ZXN0MVRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDFUYWJsZSk7Ci0KLQkJVGFibGUgdGVzdDJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJ0ZXN0MiIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QyVGFibGUpOwotCQl0ZXN0MlRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIlRFU1QyIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDJUYWJsZSk7Ci0KLQkJVGFibGUgdGVzdDNUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJcInRlc3QzXCIiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0M1RhYmxlKTsKLQkJdGVzdDNUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJ0ZXN0MyIpOwotCQlhc3NlcnROdWxsKHRlc3QzVGFibGUpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0MSIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlwidGVzdDNcIiIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIGxvd2VyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChpZCBOVU1CRVIoMTApLCBuYW1lIFZBUkNIQVIyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgTlVNQkVSKDEwKSwgTkFNRSBWQVJDSEFSMigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJOQU1FIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0Iik7Ci0KLQkJLy8gbWl4ZWQgY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChJZCBOVU1CRVIoMTApLCBOYW1lIFZBUkNIQVIyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIk5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQkvLyBkZWxpbWl0ZWQKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoXCJJZFwiIE5VTUJFUigxMCksIFwiTmFtZVwiIFZBUkNIQVIyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiXCJJZFwiIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJcIk5hbWVcIiIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJEUk9QIFRBQkxFICIgKyB0YWJsZU5hbWUgKyAiIENBU0NBREUgQ09OU1RSQUlOVFMiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnWEVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdYRVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZmI3ZGIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdYRVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLQotLyoqCi0gKiAgT3JhY2xlIDEwZyBUaGluIERyaXZlciBUZXN0Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9yYWNsZTEwZ1hFVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBPcmFjbGUxMGdYRVRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJvcmFjbGUxMGdYRS5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlIDEwZyBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5PcmFjbGUgVGhpbiBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub3JhY2xlLjEwLmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk9yYWNsZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMTAiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZTEwZ19YRSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiT3JhY2xlMTBnIFhFIFJlbGVhc2UgMiAoMTAuMikgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTlpVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlOWlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWZhMjBiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlOWlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi0KLS8qKgotICogIE9yYWNsZSA5aSBUaGluIERyaXZlciBUZXN0Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9yYWNsZTlpVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBPcmFjbGU5aVRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJvcmFjbGU5aS5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlIDlpIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk9yYWNsZSBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuOS5kcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJPcmFjbGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjkiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZTlpIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJPcmFjbGU5aSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvUG9zdGdyZVNRTFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1Bvc3RncmVTUUxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjMyYzc3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvUG9zdGdyZVNRTFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLQotCi0vKioKLSAqICBPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIFRlc3QKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUG9zdGdyZVNRTFRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgUG9zdGdyZVNRTFRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJwb3N0Z3Jlc3FsLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJQb3N0Z3JlU1FMIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLlBvc3RncmVTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQucG9zdGdyZXNxbC5wb3N0Z3Jlc3FsRHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAicG9zdGdyZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjgueCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmcucG9zdGdyZXNxbC5Ecml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEpEQkNVUkwoKSB7Ci0JCXJldHVybiAiamRiYzpwb3N0Z3Jlc3FsIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIlBvc3RncmVTUUwiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIlBvc3RncmVTUUwgOC4yIEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RPZmZsaW5lKCkgewotCQkvLyBEVFAgZG9lcyBub3Qgc3VwcG9ydCBQb3N0Z3JlU1FMIG9mZi1saW5lIC0gc2VlIDIyNjcwNC8yNDE1NTgKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyT2ZmbGluZSgpIHsKLQkJLy8gRFRQIGRvZXMgbm90IHN1cHBvcnQgUG9zdGdyZVNRTCBvZmYtbGluZSAtIHNlZSAyMjY3MDQvMjQxNTU4Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QxIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEVTVDEiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QyIik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMiIpOwotCQlhc3NlcnROdWxsKHNjaGVtYTIpOyAgLy8gc2hvdWxkIGJlIG51bGwgdW50aWwgcmVmcmVzaAotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQlzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlhc3NlcnROb3RTYW1lKHNjaGVtYTEsIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiVEVTVDEiKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBzY2hlbWEgYWZ0ZXIgdGhlIHJlZnJlc2gKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgTE9PS1VQX1RFU1QiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIkxPT0tVUF9URVNUIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX3Rlc3QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfVEVTVCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlwibG9va3VwX3Rlc3RcIiIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlwibG9va3VwX1RFU1RcIiIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFwibG9va3VwX1RFU1RcIiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiTE9PS1VQX1RFU1QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfdGVzdCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF9URVNUIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiXCJMT09LVVBfVEVTVFwiIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiXCJsb29rdXBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hQW5ub3RhdGlvbklkZW50aWZpZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJMT09LVVBfVEVTVCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBsb29rdXBfdGVzdCIpOyAgLy8gdGhpcyBnZXRzIGZvbGRlZCB0byB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFwibG9va3VwX1RFU1RcIiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpOwotCQlhc3NlcnRFcXVhbHMoImxvb2t1cF90ZXN0Iiwgc2NoZW1hLmdldEFubm90YXRpb25JZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoImxvb2t1cF90ZXN0Iiwgc2NoZW1hLmdldEFubm90YXRpb25JZGVudGlmaWVyKCJMb29rdXBUZXN0IikpOwotCQlhc3NlcnROdWxsKHNjaGVtYS5nZXRBbm5vdGF0aW9uSWRlbnRpZmllcigiTG9va3VwX1Rlc3QiKSk7Ci0KLQkJc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfdGVzdCIpOwotCQlhc3NlcnRFcXVhbHMoImxvb2t1cF90ZXN0Iiwgc2NoZW1hLmdldEFubm90YXRpb25JZGVudGlmaWVyKCkpOwotCi0JCXNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiXCJsb29rdXBfVEVTVFwiIik7Ci0JCWFzc2VydEVxdWFscygiXCJsb29rdXBfVEVTVFwiIiwgc2NoZW1hLmdldEFubm90YXRpb25JZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRBbm5vdGF0aW9uSWRlbnRpZmllcigibG9va3VwX1RFU1QiKSk7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJMT09LVVBfVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPT19CQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPTyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRBQkxFX1RFU1QiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgc2VhcmNoX3BhdGggVE8gVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0RETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXpEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vQmF6RERMKCkpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJUQUJMRV9URVNUIik7Ci0KLQkJLy8gRk9PCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZm9vVGFibGUuY29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5mb3JlaWduS2V5c1NpemUoKSk7Ci0KLQkJQ29sdW1uIHBrQ29sdW1uID0gZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcGtDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIGlkQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIklEIik7Ci0JCWFzc2VydFNhbWUocGtDb2x1bW4sIGlkQ29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlQ0IiwgaWRDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBpZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1ByaW1hcnlLZXlDb2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzRm9yZWlnbktleUNvbHVtbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUHJpbWFyeUtleUNvbHVtbigpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIkJBUl9JRCIpOwotCQlhc3NlcnRFcXVhbHMoIklOVDQiLCBiYXJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGJhckNvbHVtbi5pc0ZvcmVpZ25LZXlDb2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKGJhckNvbHVtbi5pc1ByaW1hcnlLZXlDb2x1bW4oKSk7Ci0KLQkJRm9yZWlnbktleSBiYXJGSyA9IGZvb1RhYmxlLmZvcmVpZ25LZXlzKCkubmV4dCgpOyAgLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBmb3JlaWduIGtleQotCQlhc3NlcnRFcXVhbHMoMSwgYmFyRksuY29sdW1uUGFpcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGJhckZLLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyX2lkIiwgYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJwcmltYXJ5QmFyIikpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBiYXJGSy5nZXRCYXNlVGFibGUoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZm9vVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWEsIGZvb1RhYmxlLmdldFNjaGVtYSgpKTsKLQotCQkvLyBCQVIKLQkJVGFibGUgYmFyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygyLCBiYXJUYWJsZS5jb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhclRhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhclRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShiYXJUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJZVEVBIiwgYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoIkNIVU5LIikuZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJDSFVOSyIpLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCS8vIGFzc2VydFRydWUoYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoIkNIVU5LIikuZGF0YVR5cGVJc0xPQigpKTsKLQkJYXNzZXJ0U2FtZShiYXJUYWJsZSwgYmFyRksuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIkZPT19CQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5jb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgiRk9PX0lEIikuaXNGb3JlaWduS2V5Q29sdW1uKCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPT19CQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPTyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhckRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEJBUiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgaW50ZWdlciBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBDSFVOSyBieXRlYSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgRk9PICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBJRCBpbnRlZ2VyIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIE5BTUUgdmFyY2hhcigyMCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgQkFSX0lEIGludGVnZXIgUkVGRVJFTkNFUyBCQVIoSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIGludGVnZXIgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgTkFNRSB2YXJjaGFyKDIwKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgRk9PX0JBWiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgRk9PX0lEIGludCBSRUZFUkVOQ0VTIEZPTyhJRCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgQkFaX0lEIGludCBSRUZFUkVOQ0VTIEJBWihJRCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRBQkxFX1RFU1QiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgc2VhcmNoX3BhdGggVE8gVEFCTEVfVEVTVCIpOwotCi0JCS8vIGxvd2VyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChpZCBpbnQsIG5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJUQUJMRV9URVNUIikuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJpZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgibmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElEIGludCwgTkFNRSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRBQkxFX1RFU1QiKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJOQU1FIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQotCQkvLyBtaXhlZCBjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElkIGludCwgTmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRBQkxFX1RFU1QiKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIklkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJOYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQotCQkvLyBkZWxpbWl0ZWQKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoXCJJZFwiIGludCwgXCJOYW1lXCIgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJUQUJMRV9URVNUIikuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJcIklkXCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIlwiTmFtZVwiIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcFRhYmxlKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgdGFibGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2NoZW1hIHNjaGVtYT0gdGhpcy5nZXRTY2hlbWFOYW1lZChzY2hlbWFOYW1lKTsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlpZiAoc2NoZW1hLmdldFRhYmxlTmFtZWQodGFibGVOYW1lKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFRBQkxFICIgKyBzY2hlbWFOYW1lICsgJy4nICsgdGFibGVOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkcm9wU2NoZW1hKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuZ2V0U2NoZW1hTmFtZWQobmFtZSkgIT0gbnVsbCkgewotCQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFNDSEVNQSAiICsgbmFtZSArICIgQ0FTQ0FERSIpOwotCQl9Ci0JfQotCi0vLyBzZWUgMjQxNTc4LzI0MTU1NwotLy8JcHVibGljIHZvaWQgdGVzdFNlcXVlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0vLwkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotLy8KLS8vCQl0aGlzLmRyb3BTZXF1ZW5jZSgiU0VRVUVOQ0VfVEVTVCIsICJGT08iKTsKLS8vCQl0aGlzLmRyb3BTY2hlbWEoIlNFUVVFTkNFX1RFU1QiKTsKLS8vCi0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFNFUVVFTkNFX1RFU1QiKTsKLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBzZWFyY2hfcGF0aCBUTyBTRVFVRU5DRV9URVNUIik7Ci0vLwotLy8JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotLy8JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNFUVVFTkNFIEZPTyBTVEFSVCAxIik7Ci0vLy8vCQlMaXN0PE9iamVjdFtdPiBsaXN0ID0gdGhpcy5leGVjdXRlKCJTRUxFQ1QgbmV4dHZhbCgnZm9vJykiKTsKLS8vLy8JCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0KTsKLS8vCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLS8vCi0vLwkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiU0VRVUVOQ0VfVEVTVCIpOwotLy8JCVNlcXVlbmNlIHNlcXVlbmNlID0gc2NoZW1hLmdldFNlcXVlbmNlTmFtZWQoIkZPTyIpOwotLy8JCWFzc2VydE5vdE51bGwoc2VxdWVuY2UpOwotLy8JCWFzc2VydEVxdWFscygiZm9vX3NlcSIsIHNlcXVlbmNlLmdldE5hbWUoKSk7Ci0vLwotLy8JCXRoaXMuZHJvcFNlcXVlbmNlKCJTRVFVRU5DRV9URVNUIiwgIkZPTyIpOwotLy8JCXRoaXMuZHJvcFNjaGVtYSgiU0VRVUVOQ0VfVEVTVCIpOwotLy8KLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSB2b2lkIGRyb3BTZXF1ZW5jZShTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHNlcXVlbmNlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJU2NoZW1hIHNjaGVtYT0gdGhpcy5nZXRTY2hlbWFOYW1lZChzY2hlbWFOYW1lKTsKLS8vCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLS8vCQkJaWYgKHNjaGVtYS5nZXRTZXF1ZW5jZU5hbWVkKHNlcXVlbmNlTmFtZSkgIT0gbnVsbCkgewotLy8JCQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFNFUVVFTkNFICIgKyBzY2hlbWFOYW1lICsgJy4nICsgc2VxdWVuY2VOYW1lKTsKLS8vCQkJfQotLy8JCX0KLS8vCX0KLS8vCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1NRTFNlcnZlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1NRTFNlcnZlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NjAzYjMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TUUxTZXJ2ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi0KLS8qKgotICogIFNRTCBTZXJ2ZXIgMjAwNSBEcml2ZXIgVGVzdAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTUUxTZXJ2ZXJUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIFNRTFNlcnZlclRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJzcWxzZXJ2ZXIucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIk1pY3Jvc29mdCBTUUwgU2VydmVyIDIwMDUgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgMjAwNSBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5tc2Z0LnNxbHNlcnZlci4yMDA1LmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIlNRTFNlcnZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMjAwNSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJjb20ubWljcm9zb2Z0LnNxbHNlcnZlci5qZGJjLlNRTFNlcnZlckRyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJTUUxTZXJ2ZXJfMjAwNSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgMjAwNSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3ZpZGVySUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLmNvbm5lY3Rpb25Qcm9maWxlIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU3liYXNlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU3liYXNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxNmUyYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1N5YmFzZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLQotLyoqCi0gKiAgT3JhY2xlIDEwZyBUaGluIERyaXZlciBUZXN0Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN5YmFzZVRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgU3liYXNlVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gInN5YmFzZS5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiU3liYXNlIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLlN5YmFzZSBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5zeWJhc2UuYXNlLjEyX3guZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiU3liYXNlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMi54IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gImNvbS5zeWJhc2UuamRiYzMuamRiYy5TeWJEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiU3liYXNlXzEyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJTeWJhc2UgMTIgakNvbm5lY3QgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvdGVzdC1kaXNhYmxlZC54bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvdGVzdC1kaXNhYmxlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMzIyNWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3Rlc3QtZGlzYWJsZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0JPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQk8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLQk8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUgLS0+Ci0JPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMiLz4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLQk8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotCTwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0JPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0JICAgIDxwcm9wZXJ0eSBuYW1lPSJqcHQtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pwdF9mb2xkZXIiLz4KLQkgICAgPGRlbGV0ZSBkaXI9IiR7anB0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0JCQotCQk8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkJICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7anB0LWZvbGRlcn0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlVGVzdHMiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj0ke3Rlc3REaXJ9LyR7anB0UGVyc2lzdGVuY2VMaWJEaXJ9Ii8+Ci0JCTwvYW50PgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0JPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotCTwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCwgc3VpdGUsIGNsZWFudXAiPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy90ZXN0LnhtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy90ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGRiYTVlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3Rlc3QueG1sCkBAIC0wLDAgKzEsNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgorCTwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+CisJPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KKwk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+CisJPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+CisJPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lIC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzIi8+CisgICAgPGVjaG8gbGV2ZWw9ImRlYnVnIiBtZXNzYWdlPSJ0ZXN0Um9vdDogJHt0ZXN0Um9vdH0iIC8+CisgICAgPGZhaWwgbWVzc2FnZT0idGVzdFJvb3QgbXVzdCBiZSBzZXQiIHVubGVzcz0idGVzdFJvb3QiIC8+CisKKwk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+CisJPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KKwk8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KKwk8dGFyZ2V0IG5hbWU9ImluaXQiPgorCQk8dHN0YW1wLz4KKwkJPGRlbGV0ZT4KKwkJCTxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KKwkJPC9kZWxldGU+CisJPC90YXJnZXQ+CisKKwk8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgorCTx0YXJnZXQgbmFtZT0ic3VpdGUiPgorICAgIAk8cHJvcGVydHkgZmlsZT0iJHt0ZXN0Um9vdH0vdGVzdFNlcnZlci5wcm9wZXJ0aWVzIi8+CisJICAgIDxwcm9wZXJ0eSBuYW1lPSJqcHQtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pwdF9mb2xkZXIiLz4KKwkgICAgPGRlbGV0ZSBkaXI9IiR7anB0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+CisJCQorCQk8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KKwkJICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7anB0LWZvbGRlcn0iLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+CisJCQk8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlVGVzdHMiIC8+CisJCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgorCQkJPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj0ke3Rlc3REaXJ9LyR7anB0UGVyc2lzdGVuY2VMaWJEaXJ9Ii8+CisJCTwvYW50PgorCTwvdGFyZ2V0PgorCisJPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+CisJPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgorCTwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KKwk8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorCTwvdGFyZ2V0PgorCisJPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgorCTwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KKwk8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCwgc3VpdGUsIGNsZWFudXAiPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwODc3Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjQwNzc0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudWkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2NGEwZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMDcgMTQ6Mjc6MTYgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMWE1MDIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdCwKLSBvcmcuanVuaXQ0O2J1bmRsZS12ZXJzaW9uPSI0LjMuMSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQudWksCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UudWkuZm9ybXM7YnVuZGxlLXZlcnNpb249IjMuMy4xMDAiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5qZmFjZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDJlNGQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYThhYjg3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0jICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0jICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSMgIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZT1KYXZhIFBlcnNpc3RlbmNlIEFQSSBVSSBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvSnB0VWlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL0pwdFVpVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwYWJiNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvSnB0VWlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnBsYXRmb3JtLkpwdFVpUGxhdGZvcm1UZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0LkpwdFVpU1dUVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWwuSnB0VWlVdGlsVGVzdHM7Ci0KLS8qKgotICogUnVucyBhbGwgSlBUIFVJIFRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVaVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVaVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFVpUGxhdGZvcm1UZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVaVNXVFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFVpVXRpbFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YTdlYzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5CYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbExpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGFsZXR0ZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIERlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0IGV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLXsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZTsKLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFZlaGljbGU+IHNlbGVjdGVkVmVoaWNsZTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBEZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdChTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnNlbGVjdGVkVmVoaWNsZSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VmVoaWNsZT4oKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXBhcmVudC5zZXRTaXplKDQwMCwgNDAwKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnVpbGRUcmVlUGFuZWwobWFpblBhbmVsKTsKLQkJYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbGFiZWwuc2V0VGV4dCgiTXkgVmVoaWNsZXMiKTsKLQkJCi0JCXRyZWUgPSBuZXcgVHJlZVZpZXdlcihwYW5lbCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl0cmVlLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCURlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlciA9IAotCQkJbmV3IERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIoCi0JCQkJbmV3IFZlaGljbGVDb250ZW50UHJvdmlkZXJGYWN0b3J5KCksCi0JCQkJbmV3IFZlaGljbGVMYWJlbFByb3ZpZGVyRmFjdG9yeSgpKTsKLQkJdHJlZS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl0cmVlLnNldExhYmVsUHJvdmlkZXIoY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl0cmVlLnNldElucHV0KG5ldyBSb290KCkpOwotCQl0cmVlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihidWlsZFRyZWVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSk7Ci0JfQotCQotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBidWlsZFRyZWVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2VsZWN0ZWRWZWhpY2xlLnNldFZhbHVlKChWZWhpY2xlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnVpbGRVcHBlckNvbnRyb2xQYW5lbChwYW5lbCk7Ci0JCWJ1aWxkTG93ZXJDb250cm9sUGFuZWwocGFuZWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRVcHBlckNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJYnVpbGRWZWhpY2xlQ29tYm8ocGFuZWwpOwotCQlidWlsZENvbG9yQ29tYm8ocGFuZWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRWZWhpY2xlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21ib1ZpZXdlciBjb21ibyA9IG5ldyBDb21ib1ZpZXdlcihwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQljb21iby5nZXRDb21ibygpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJY29tYm8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY29tYm8uc2V0TGFiZWxQcm92aWRlcihuZXcgVmVoaWNsZVR5cGVMYWJlbFByb3ZpZGVyKCkpOwotCQljb21iby5zZXRJbnB1dCgKLQkJCW5ldyBWZWhpY2xlVHlwZVtdIHsKLQkJCQlWZWhpY2xlVHlwZS5CSUNZQ0xFLCBWZWhpY2xlVHlwZS5DQVIsIAotCQkJCVZlaGljbGVUeXBlLlRSVUNLLCBWZWhpY2xlVHlwZS5CT0FUCi0JCQl9KTsKLQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2VsZWN0ZWRWZWhpY2xlKCkuc2V0VmVoaWNsZVR5cGUoKFZlaGljbGVUeXBlKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7IAotCQkJCX0KLQkJCX0pOwotCQlzZWxlY3RlZFZlaGljbGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgCi0JCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlWZWhpY2xlIHZlaGljbGUgPSBzZWxlY3RlZFZlaGljbGUoKTsKLQkJCQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRFbmFibGVkKHZlaGljbGUgIT0gbnVsbCk7Ci0JCQkJCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigodmVoaWNsZSA9PSBudWxsKSA/IG51bGwgOiB2ZWhpY2xlLnZlaGljbGVUeXBlKCkpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29sb3JDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbWJvVmlld2VyIGNvbWJvID0gbmV3IENvbWJvVmlld2VyKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWNvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQljb21iby5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQljb21iby5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2xvckxhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbWJvLnNldElucHV0KG5ldyBDb2xvcltdIHtDb2xvci5SRUQsIENvbG9yLkJMVUUsIENvbG9yLllFTExPVywgQ29sb3IuR1JFRU59KTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2VsZWN0ZWRWZWhpY2xlKCkuc2V0Q29sb3IoKENvbG9yKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7IAotCQkJCX0KLQkJCX0pOwotCQlzZWxlY3RlZFZlaGljbGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgCi0JCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlWZWhpY2xlIHZlaGljbGUgPSBzZWxlY3RlZFZlaGljbGUoKTsKLQkJCQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRFbmFibGVkKHZlaGljbGUgIT0gbnVsbCk7Ci0JCQkJCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigodmVoaWNsZSA9PSBudWxsKSA/IG51bGwgOiB2ZWhpY2xlLmNvbG9yKCkpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTG93ZXJDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlidWlsZEVmZmVjdHNMYWJlbChwYW5lbCk7Ci0JCWJ1aWxkR3JleWVkQ2hlY2tCb3gocGFuZWwpOwotCQlidWlsZFRyYW5zbHVjZW50Q2hlY2tCb3gocGFuZWwpOwotCQlidWlsZEFjdGlvblBhbmVsKHBhbmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRWZmZWN0c0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoIkNvbG9yIGVmZmVjdHM6ICIpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAzLCAxKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZEdyZXllZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlidXR0b24uc2V0VGV4dCgiZ3JleWVkIik7Ci0JCWJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzZWxlY3RlZFZlaGljbGUoKS5zZXRHcmV5ZWQoYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJc2VsZWN0ZWRWZWhpY2xlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIAotCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJVmVoaWNsZSB2ZWhpY2xlID0gc2VsZWN0ZWRWZWhpY2xlKCk7Ci0JCQkJCWJ1dHRvbi5zZXRFbmFibGVkKHZlaGljbGUgIT0gbnVsbCk7Ci0JCQkJCWJ1dHRvbi5zZXRTZWxlY3Rpb24odmVoaWNsZSAhPSBudWxsICYmIHZlaGljbGUuaXNHcmV5ZWQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFRyYW5zbHVjZW50Q2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJYnV0dG9uLnNldFRleHQoInRyYW5zbHVjZW50Iik7Ci0JCWJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzZWxlY3RlZFZlaGljbGUoKS5zZXRUcmFuc2x1Y2VudChidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0pOwotCQlzZWxlY3RlZFZlaGljbGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgCi0JCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlWZWhpY2xlIHZlaGljbGUgPSBzZWxlY3RlZFZlaGljbGUoKTsKLQkJCQkJYnV0dG9uLnNldEVuYWJsZWQodmVoaWNsZSAhPSBudWxsKTsKLQkJCQkJYnV0dG9uLnNldFNlbGVjdGlvbih2ZWhpY2xlICE9IG51bGwgJiYgdmVoaWNsZS5pc1RyYW5zbHVjZW50KCkpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRBY3Rpb25QYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnVpbGRSZWZyZXNoVHJlZUFDSSgpLmZpbGwocGFuZWwpOwotCX0KLQkKLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZWZyZXNoVHJlZUFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIlJlZnJlc2ggdHJlZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlZnJlc2hUcmVlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiUmVmcmVzaCB0aGUgdHJlZSdzIGxhYmVscyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0JCi0Jdm9pZCByZWZyZXNoVHJlZSgpIHsKLQkJdHJlZS5yZWZyZXNoKCk7Ci0JfQotCQotCXByaXZhdGUgVmVoaWNsZSBzZWxlY3RlZFZlaGljbGUoKSB7Ci0JCXJldHVybiBzZWxlY3RlZFZlaGljbGUuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZVR5cGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotCXsKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChWZWhpY2xlVHlwZSkgZWxlbWVudCkuZGVzY3JpcHRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb2xvckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyCi0JewotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoKENvbG9yKSBlbGVtZW50KS5kZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVDb250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgUm9vdCkgewotCQkJCXJldHVybiBuZXcgUm9vdENvbnRlbnRQcm92aWRlcigKLQkJCQkJKFJvb3QpIGl0ZW0sIChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFZlaGljbGVDb250ZW50UHJvdmlkZXIoCi0JCQkJKFZlaGljbGUpIGl0ZW0sIChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9vdENvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8VmVoaWNsZT4KLQl7Ci0JCXB1YmxpYyBSb290Q29udGVudFByb3ZpZGVyKFJvb3QgaXRlbSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIoaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxWZWhpY2xlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXRpY0xpc3RWYWx1ZU1vZGVsPFZlaGljbGU+KENvbGxlY3Rpb25Ub29scy5saXN0KCgoUm9vdCkgbW9kZWwoKSkudmVoaWNsZXMoKSkpOwotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgVmVoaWNsZUNvbnRlbnRQcm92aWRlcihWZWhpY2xlIGl0ZW0sIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuICgoVmVoaWNsZSkgbW9kZWwoKSkucGFyZW50KCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWwgYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBOdWxsTGlzdFZhbHVlTW9kZWwoKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlTGFiZWxQcm92aWRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLQl7Ci0JCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlciBidWlsZEl0ZW1MYWJlbFByb3ZpZGVyKE9iamVjdCBlbGVtZW50LCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQkJcmV0dXJuIG5ldyBWZWhpY2xlTGFiZWxQcm92aWRlcigoVmVoaWNsZSkgZWxlbWVudCwgbGFiZWxQcm92aWRlcik7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi0JewotCQlwdWJsaWMgVmVoaWNsZUxhYmVsUHJvdmlkZXIoVmVoaWNsZSB2ZWhpY2xlLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIodmVoaWNsZSwgbGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZWhpY2xlLCBTdHJpbmc+KAotCQkJCQluZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFZlaGljbGU+KChWZWhpY2xlKSBtb2RlbCgpKSwgCi0JCQkJCVZlaGljbGUuVkVISUNMRV9UWVBFX1BST1BFUlRZLCBWZWhpY2xlLkNPTE9SX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuY29sb3IoKS5kZXNjcmlwdGlvbigpICsgJyAnICsgc3ViamVjdC52ZWhpY2xlVHlwZSgpLmRlc2NyaXB0aW9uKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFZlaGljbGUsIEltYWdlPigKLQkJCQkJbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxWZWhpY2xlPigoVmVoaWNsZSkgbW9kZWwoKSksIAotCQkJCQlWZWhpY2xlLkNPTE9SX1BST1BFUlRZLCBWZWhpY2xlLkdSRVlFRF9QUk9QRVJUWSwgVmVoaWNsZS5UUkFOU0xVQ0VOVF9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbWFnZSBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuaW1hZ2UoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCXsKLQkJcHJpdmF0ZSBUcmVlTm9kZSBwYXJlbnQ7Ci0JCQotCQkKLQkJcHVibGljIFRyZWVOb2RlKFRyZWVOb2RlIHBhcmVudCkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgVHJlZU5vZGUgcGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSb290IGV4dGVuZHMgVHJlZU5vZGUKLQl7Ci0JCXByb3RlY3RlZCBmaW5hbCBWZWhpY2xlW10gdmVoaWNsZXM7Ci0JCQotCQkKLQkJcHVibGljIFJvb3QoKSB7Ci0JCQlzdXBlcihudWxsKTsKLQkJCXZlaGljbGVzID0gbmV3IFZlaGljbGVbXSB7Ci0JCQkJbmV3IFZlaGljbGUodGhpcywgVmVoaWNsZVR5cGUuQklDWUNMRSwgQ29sb3IuQkxVRSksCi0JCQkJbmV3IFZlaGljbGUodGhpcywgVmVoaWNsZVR5cGUuQ0FSLCBDb2xvci5ZRUxMT1cpLAotCQkJCW5ldyBWZWhpY2xlKHRoaXMsIFZlaGljbGVUeXBlLlRSVUNLLCBDb2xvci5SRUQpLAotCQkJCW5ldyBWZWhpY2xlKHRoaXMsIFZlaGljbGVUeXBlLkJPQVQsIENvbG9yLkdSRUVOKX07Ci0JCX0KLQkJCi0JCXB1YmxpYyBWZWhpY2xlW10gdmVoaWNsZXMoKSB7Ci0JCQlyZXR1cm4gdmVoaWNsZXM7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZSBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwcml2YXRlIFZlaGljbGVUeXBlIHZlaGljbGVUeXBlOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWRUhJQ0xFX1RZUEVfUFJPUEVSVFkgPSAidmVoaWNsZVR5cGUiOwotCQkKLQkJcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MT1JfUFJPUEVSVFkgPSAiY29sb3IiOwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGdyZXllZCA9IGZhbHNlOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBHUkVZRURfUFJPUEVSVFkgPSAiZ3JleWVkIjsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiB0cmFuc2x1Y2VudCA9IGZhbHNlOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUUkFOU0xVQ0VOVF9QUk9QRVJUWSA9ICJ0cmFuc2x1Y2VudCI7Ci0JCQotCQlwcml2YXRlIEltYWdlIGltYWdlOwotCQkKLQkJCQotCQlwdWJsaWMgVmVoaWNsZShUcmVlTm9kZSBwYXJlbnQsIFZlaGljbGVUeXBlIHZlaGljbGVUeXBlLCBDb2xvciBjb2xvcikgewotCQkJc3VwZXIocGFyZW50KTsKLQkJCXRoaXMudmVoaWNsZVR5cGUgPSB2ZWhpY2xlVHlwZTsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJfQotCQkKLQkJcHVibGljIFZlaGljbGVUeXBlIHZlaGljbGVUeXBlKCkgewotCQkJcmV0dXJuIHZlaGljbGVUeXBlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRWZWhpY2xlVHlwZShWZWhpY2xlVHlwZSBuZXdWZWhpY2xlVHlwZSkgewotCQkJVmVoaWNsZVR5cGUgb2xkVmVoaWNsZVR5cGUgPSB2ZWhpY2xlVHlwZTsKLQkJCXZlaGljbGVUeXBlID0gbmV3VmVoaWNsZVR5cGU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZFSElDTEVfVFlQRV9QUk9QRVJUWSwgb2xkVmVoaWNsZVR5cGUsIG5ld1ZlaGljbGVUeXBlKTsKLQkJfQotCQkKLQkJcHVibGljIENvbG9yIGNvbG9yKCkgewotCQkJcmV0dXJuIGNvbG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihDb2xvciBuZXdDb2xvcikgewotCQkJQ29sb3Igb2xkQ29sb3IgPSBjb2xvcjsKLQkJCWNvbG9yID0gbmV3Q29sb3I7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTE9SX1BST1BFUlRZLCBvbGRDb2xvciwgbmV3Q29sb3IpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc0dyZXllZCgpIHsKLQkJCXJldHVybiBncmV5ZWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEdyZXllZChib29sZWFuIG5ld0dyZXllZCkgewotCQkJYm9vbGVhbiBvbGRHcmV5ZWQgPSBncmV5ZWQ7Ci0JCQlncmV5ZWQgPSBuZXdHcmV5ZWQ7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdSRVlFRF9QUk9QRVJUWSwgb2xkR3JleWVkLCBuZXdHcmV5ZWQpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zbHVjZW50KCkgewotCQkJcmV0dXJuIHRyYW5zbHVjZW50OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRUcmFuc2x1Y2VudChib29sZWFuIG5ld1RyYW5zbHVjZW50KSB7Ci0JCQlib29sZWFuIG9sZFRyYW5zbHVjZW50ID0gdHJhbnNsdWNlbnQ7Ci0JCQl0cmFuc2x1Y2VudCA9IG5ld1RyYW5zbHVjZW50OwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUUkFOU0xVQ0VOVF9QUk9QRVJUWSwgb2xkVHJhbnNsdWNlbnQsIG5ld1RyYW5zbHVjZW50KTsKLQkJfQotCQkKLQkJcHVibGljIEltYWdlIGltYWdlKCkgewotCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBJbWFnZUZhY3RvcnkuaW1hZ2UoY29sb3IoKSwgZ3JleWVkLCB0cmFuc2x1Y2VudCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZW51bSBWZWhpY2xlVHlwZQotCXsKLQkJQklDWUNMRSgiYmljeWNsZSIpLAotCQlDQVIoImNhciIpLAotCQlUUlVDSygidHJ1Y2siKSwKLQkJQk9BVCgiYm9hdCIpOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCQotCQlwcml2YXRlIFZlaGljbGVUeXBlKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGVudW0gQ29sb3IKLQl7Ci0JCVJFRCgicmVkIiwgbmV3IFJHQigyNTUsIDAsIDApKSwKLQkJQkxVRSgiYmx1ZSIsIG5ldyBSR0IoMCwgMCwgMjU1KSksCi0JCVlFTExPVygieWVsbG93IiwgbmV3IFJHQigyNTUsIDI1NSwgMCkpLAotCQlHUkVFTigiZ3JlZW4iLCBuZXcgUkdCKDAsIDI1NSwgMCkpOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCQotCQlwcml2YXRlIGZpbmFsIFJHQiByZ2I7Ci0JCQotCQlwcml2YXRlIENvbG9yKFN0cmluZyBkZXNjcmlwdGlvbiwgUkdCIHJnYikgewotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJdGhpcy5yZ2IgPSByZ2I7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBSR0IgcmdiKCkgewotCQkJcmV0dXJuIHJnYjsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbWFnZUZhY3RvcnkKLQl7Ci0JCXByaXZhdGUgc3RhdGljIFJHQiByZ2IoQ29sb3IgY29sb3IsIGJvb2xlYW4gZ3JleWVkLCBib29sZWFuIHRyYW5zbHVjZW50KSB7Ci0JCQlSR0IgcmdiID0gKGdyZXllZCkgPyBuZXcgUkdCKDEyNywgMTI3LCAxMjcpIDogY29sb3IucmdiKCk7Ci0JCQlpZiAodHJhbnNsdWNlbnQpIHsKLQkJCQlyZ2IgPSBuZXcgUkdCKHRyYW5zbHVjaWZ5KHJnYi5yZWQpLCB0cmFuc2x1Y2lmeShyZ2IuZ3JlZW4pLCB0cmFuc2x1Y2lmeShyZ2IuYmx1ZSkpOwotCQkJfQotCQkJcmV0dXJuIHJnYjsKLQkJfQotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IHRyYW5zbHVjaWZ5KGludCBjb2xvcikgewotCQkJcmV0dXJuIDI1NSAtIChpbnQpICgoMjU1IC0gY29sb3IpICogMC4zKTsKLQkJfQotCQkKLQkJcHVibGljIHN0YXRpYyBJbWFnZSBpbWFnZShDb2xvciBjb2xvciwgYm9vbGVhbiBncmV5ZWQsIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKLQkJCVBhbGV0dGVEYXRhIHBkID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7cmdiKGNvbG9yLCBncmV5ZWQsIHRyYW5zbHVjZW50KX0pOwotCQkJSW1hZ2VEYXRhIGlkID0gbmV3IEltYWdlRGF0YSgyMCwgMjAsIDEsIHBkKTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgMjA7IHggKyspIHsKLQkJCQlmb3IgKGludCB5ID0gMDsgeSA8IDIwOyB5ICsrKSB7Ci0JCQkJCWlkLnNldFBpeGVsKHgsIHksIDApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgSW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCksIGlkKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MjAzZGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5CYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIERlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0IGV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLXsKLQlwcml2YXRlIGZpbmFsIFJvb3Qgcm9vdDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGU+IHNlbGVjdGVkTm9kZTsKLQotCXByaXZhdGUgVHJlZVZpZXdlciBjb250cm9sVHJlZTsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB2aWV3VHJlZTsKLQotCXByaXZhdGUgVGV4dCBub2RlTmFtZVRleHQ7Ci0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QoU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy5yb290ID0gbmV3IFJvb3QoKTsKLQkJdGhpcy5yb290LmFkZENoaWxkKCJQYXJlbnRfMSIpOwotCQl0aGlzLnNlbGVjdGVkTm9kZSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGU+KHRoaXMucm9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXBhcmVudC5zZXRTaXplKDgwMCwgNDAwKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnVpbGRUcmVlUGFuZWwobWFpblBhbmVsKTsKLQkJYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJYnVpbGRDb250cm9sVHJlZVBhbmVsKHBhbmVsKTsKLQkJYnVpbGRWaWV3VHJlZVBhbmVsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sVHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29udHJvbFRyZWUgPSBidWlsZFRyZWVQYW5lbCgKLQkJCQlwYXJlbnQsICJDb250cm9sIHRyZWUiLAotCQkJCW5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKG5ldyBDb250cm9sVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkpLAotCQkJCW5ldyBMYWJlbFByb3ZpZGVyKCkpOwotCQljb250cm9sVHJlZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYnVpbGRUcmVlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCQlzZWxlY3RlZE5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQljb250cm9sVHJlZS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZXZlbnQuZ2V0TmV3VmFsdWUoKSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRWaWV3VHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdmlld1RyZWUgPSBidWlsZFRyZWVQYW5lbCgKLQkJCQlwYXJlbnQsICJWaWV3IHRyZWUiLAotCQkJCW5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKG5ldyBWaWV3VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkpLAotCQkJCW5ldyBMYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotCXByaXZhdGUgVHJlZVZpZXdlciBidWlsZFRyZWVQYW5lbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LCBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWxhYmVsLnNldFRleHQobGFiZWxUZXh0KTsKLQotCQlmaW5hbCBUcmVlVmlld2VyIHRyZWUgPSBuZXcgVHJlZVZpZXdlcihwYW5lbCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl0cmVlLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRyZWUuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWUuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdHJlZS5zZXRJbnB1dChyb290KTsKLQotCQlyZXR1cm4gdHJlZTsKLQl9Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgYnVpbGRUcmVlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCVRyZWVOb2RlIHNlbGVjdGlvbiA9IChUcmVlTm9kZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCXNlbGVjdGVkTm9kZS5zZXRWYWx1ZSgoc2VsZWN0aW9uID09IG51bGwpID8gcm9vdCA6IHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDYsIGZhbHNlKSk7Ci0JCWJ1aWxkTm9kZU5hbWVUZXh0KHBhbmVsKTsKLQkJYnVpbGRBZGRDaGlsZEFDSSgpLmZpbGwocGFuZWwpOwotCQlidWlsZEFkZE5lc3RlZENoaWxkQUNJKCkuZmlsbChwYW5lbCk7Ci0JCWJ1aWxkUmVtb3ZlQUNJKCkuZmlsbChwYW5lbCk7Ci0JCWJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCQlidWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5vZGVOYW1lVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW5vZGVOYW1lVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlub2RlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEFkZENoaWxkQUNJKCkgewotCQlmaW5hbCBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiQWRkIGNoaWxkIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYWRkQ2hpbGQoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJBZGQgYSBjaGlsZCB3aXRoIHRoZSBnaXZlbiBuYW1lIik7Ci0JCXNlbGVjdGVkTm9kZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKCgoVHJlZU5vZGUpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmNhbkhhdmVDaGlsZHJlbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEFkZE5lc3RlZENoaWxkQUNJKCkgewotCQlmaW5hbCBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiQWRkIG5lc3RlZCBjaGlsZCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFkZE5lc3RlZENoaWxkKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiQWRkIGEgbmVzdGVkIGNoaWxkIHdpdGggdGhlIGdpdmVuIG5hbWUiKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzZWxlY3RlZE5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlhY3Rpb24uc2V0RW5hYmxlZCgoKFRyZWVOb2RlKSBldmVudC5nZXROZXdWYWx1ZSgpKS5jYW5IYXZlTmVzdGVkQ2hpbGRyZW4oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZW1vdmVBQ0koKSB7Ci0JCWZpbmFsIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJSZW1vdmUiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyZW1vdmUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJSZW1vdmUgdGhlIHNlbGVjdGVkIG5vZGUiKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzZWxlY3RlZE5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChldmVudC5nZXROZXdWYWx1ZSgpICE9IHJvb3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIkNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIkNsZWFyIHRoZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJSZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiUmVzdG9yZSB0aGUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBhZGRDaGlsZCgpIHsKLQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZU5hbWVUZXh0LmdldFRleHQoKTsKLQkJaWYgKG5vZGVOYW1lLmxlbmd0aCgpICE9IDApIHsKLQkJCXNlbGVjdGVkTm9kZS5nZXRWYWx1ZSgpLmFkZENoaWxkKG5vZGVOYW1lKTsKLQkJfQotCX0KLQotCXZvaWQgYWRkTmVzdGVkQ2hpbGQoKSB7Ci0JCVN0cmluZyBub2RlTmFtZSA9IG5vZGVOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChub2RlTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlzZWxlY3RlZE5vZGUuZ2V0VmFsdWUoKS5hZGROZXN0ZWRDaGlsZChub2RlTmFtZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZSgpIHsKLQkJVHJlZU5vZGUgbm9kZSA9IHNlbGVjdGVkTm9kZS5nZXRWYWx1ZSgpOwotCQlub2RlLnBhcmVudCgpLnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJY29udHJvbFRyZWUuc2V0SW5wdXQobnVsbCk7Ci0JCXZpZXdUcmVlLnNldElucHV0KG51bGwpOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQljb250cm9sVHJlZS5zZXRJbnB1dChyb290KTsKLQkJdmlld1RyZWUuc2V0SW5wdXQocm9vdCk7Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCXsKLQkJcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCXJldHVybiBuZXcgR2VuZXJpY1RyZWVJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCShUcmVlTm9kZSkgaXRlbSwgKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udHJvbFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCi0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWaWV3VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JCWV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgUGFyZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBWaWV3VHJlZVBhcmVudEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJCQkoUGFyZW50KSBpdGVtLCAoRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEdlbmVyaWNUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8VHJlZU5vZGU+Ci0JewotCQlwdWJsaWMgR2VuZXJpY1RyZWVJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCVRyZWVOb2RlIHRyZWVOb2RlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIodHJlZU5vZGUsIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgVHJlZU5vZGUgdHJlZU5vZGUoKSB7Ci0JCQlyZXR1cm4gKFRyZWVOb2RlKSBtb2RlbCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBUcmVlTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdHJlZU5vZGUoKS5wYXJlbnQoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VHJlZU5vZGUsIFRyZWVOb2RlPihUcmVlTm9kZS5DSElMRFJFTl9MSVNULCB0cmVlTm9kZSgpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxUcmVlTm9kZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJcmV0dXJuIHRyZWVOb2RlKCkuY2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmlld1RyZWVQYXJlbnRJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgR2VuZXJpY1RyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgVmlld1RyZWVQYXJlbnRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCVRyZWVOb2RlIHRyZWVOb2RlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIodHJlZU5vZGUsIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFRyZWVOb2RlIGdldFBhcmVudCgpIHsKLQkJCVRyZWVOb2RlIHBhcmVudCA9IHN1cGVyLmdldFBhcmVudCgpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE5lc3QpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIGJ1aWxkQ2hpbGRyZW5Nb2RlbCgKLQkJCQkJbmV3IENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRyZWVOb2RlLCBUcmVlTm9kZT4oc3VwZXIuYnVpbGRDaGlsZHJlbk1vZGVsKCkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFRyZWVOb2RlPiB0cmFuc2Zvcm0oVHJlZU5vZGUgdmFsdWUpIHsKLQkJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBOZXN0KSB7Ci0JCQkJCQkJCWZpbmFsIE5lc3QgbmVzdCA9IChOZXN0KSB2YWx1ZTsKLQkJCQkJCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFRyZWVOb2RlPigKLQkJCQkJCQkJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VHJlZU5vZGUsIFRyZWVOb2RlPihUcmVlTm9kZS5DSElMRFJFTl9MSVNULCBuZXN0KSB7Ci0JCQkJCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRyZWVOb2RlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQkJCQkJCQkJcmV0dXJuIG5lc3QuY2hpbGRyZW4oKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlyZXR1cm4gbmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFRyZWVOb2RlPihDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih2YWx1ZSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyCi0JewotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChUcmVlTm9kZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUcmVlTm9kZSBleHRlbmRzIEFic3RyYWN0TW9kZWwKLQl7Ci0JCXByaXZhdGUgVHJlZU5vZGUgcGFyZW50OwotCi0JCXByb3RlY3RlZCBmaW5hbCBMaXN0PFRyZWVOb2RlPiBjaGlsZHJlbjsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0hJTERSRU5fTElTVCA9ICJjaGlsZHJlbiI7Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0KLQkJcHVibGljIFRyZWVOb2RlKFRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGU+KCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFRyZWVOb2RlIHBhcmVudCgpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8VHJlZU5vZGU+KGNoaWxkcmVuKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkKFRyZWVOb2RlIGNoaWxkKSB7Ci0JCQlhZGRJdGVtVG9MaXN0KGNoaWxkLCBjaGlsZHJlbiwgQ0hJTERSRU5fTElTVCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChUcmVlTm9kZSBjaGlsZCkgewotCQkJcmVtb3ZlSXRlbUZyb21MaXN0KGNoaWxkLCBjaGlsZHJlbiwgQ0hJTERSRU5fTElTVCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChpbnQgaW5kZXgpIHsKLQkJCXJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgY2hpbGRyZW4sIENISUxEUkVOX0xJU1QpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCQluYW1lID0gbmV3TmFtZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRDaGlsZChTdHJpbmcgbmFtZSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlTmVzdGVkQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGROZXN0ZWRDaGlsZChTdHJpbmcgbmFtZSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKGdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJvb3QgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIFJvb3QoKSB7Ci0JCQlzdXBlcihudWxsLCBudWxsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhZGRDaGlsZChTdHJpbmcgbmFtZSkgewotCQkJYWRkQ2hpbGQobmV3IFBhcmVudCh0aGlzLCBuYW1lKSk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhcmVudCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgUGFyZW50KFRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKHBhcmVudCwgbmFtZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZUNoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgYWRkQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJCWFkZENoaWxkKG5ldyBDaGlsZCh0aGlzLCBuYW1lKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZU5lc3RlZENoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgYWRkTmVzdGVkQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJCVRyZWVOb2RlIG5lc3QgPSBuZXcgTmVzdCh0aGlzKTsKLQkJCWFkZENoaWxkKG5lc3QpOwotCQkJbmVzdC5hZGRDaGlsZChuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxDaGlsZD4gbmVzdGxlc3NDaGlsZHJlbigpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Q2hpbGQsIENoaWxkPigKLQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VHJlZU5vZGUsIENoaWxkPihjaGlsZHJlbigpKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBDaGlsZCB0cmFuc2Zvcm0oVHJlZU5vZGUgbmV4dCkgewotCQkJCQkJCWlmIChuZXh0IGluc3RhbmNlb2YgTmVzdCkgewotCQkJCQkJCQlyZXR1cm4gKChOZXN0KSBuZXh0KS5jaGlsZCgpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gKENoaWxkKSBuZXh0OwotCQkJCQkJfQotCQkJCQl9KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENoaWxkIGMpIHsKLQkJCQkJcmV0dXJuIGMgIT0gbnVsbDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXN0IGV4dGVuZHMgVHJlZU5vZGUKLQl7Ci0JCXB1YmxpYyBOZXN0KFRyZWVOb2RlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCAibmVzdCIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiBjaGlsZHJlbi5zaXplKCkgPT0gMDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhZGRDaGlsZChTdHJpbmcgbmFtZSkgewotCQkJYWRkQ2hpbGQobmV3IENoaWxkKHRoaXMsIG5hbWUpKTsKLQkJfQotCi0JCS8qIGNhbiBvbmx5IGhhdmUgb25lIGNoaWxkICovCi0JCXB1YmxpYyBDaGlsZCBjaGlsZCgpIHsKLQkJCXJldHVybiAoY2hpbGRyZW4uaXNFbXB0eSgpKSA/IG51bGwgOiAoQ2hpbGQpIGNoaWxkcmVuLmdldCgwKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hpbGQgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIENoaWxkKFRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKHBhcmVudCwgbmFtZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDI4YTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5FeHRlbnNpb25UZXN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5UZXN0SnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLlByb2plY3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotCi1wdWJsaWMgY2xhc3MgSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgdGVzdFByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiRXh0ZW5zaW9uVGVzdFByb2plY3QiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJleHRlbnNpb24udGVzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMVUdJTl9DTEFTUyA9IEV4dGVuc2lvblRlc3RQbHVnaW4uY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExVR0lOX0lEID0gRXh0ZW5zaW9uVGVzdFBsdWdpbi5QTFVHSU5fSUQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMQVRGT1JNX0lEID0gVGVzdEpwYVBsYXRmb3JtLklEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExBVEZPUk1fQ0xBU1MgPSBUZXN0SnBhUGxhdGZvcm0uY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExBVEZPUk1fTEFCRUwgPSAiVGVzdCBKcGEgUGxhdGZvcm0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9VSV9QTEFURk9STV9JRCA9IFRFU1RfUExBVEZPUk1fSUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9VSV9QTEFURk9STV9DTEFTUyA9IFRlc3RKcGFQbGF0Zm9ybVVpLmNsYXNzLmdldE5hbWUoKTsKLQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy50ZXN0UHJvamVjdCA9IHRoaXMuYnVpbGRKcGFQcm9qZWN0KFBST0pFQ1RfTkFNRSwgZmFsc2UpOyAgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsgIC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vdGVzdFByb2plY3QuZGlzcG9zZSgpOwotCQlQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotCQl0aGlzLnRlc3RQcm9qZWN0ID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBqcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy50ZXN0UHJvamVjdC5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpwYVBsYXRmb3JtKCkgewotCQlhc3NlcnROb3ROdWxsKEpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybShqcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnB0VWlQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnB0VWlQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYmNjOTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwdFVpUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VWlQbGF0Zm9ybVRlc3RzCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFVpUGxhdGZvcm1UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpUGxhdGZvcm1UZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjRjMTc1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TaW1wbGVEaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBzdWJqZWN0SG9sZGVyOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZEVtcHR5TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCXBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8TW9kZWwsIFNpbXBsZURpc3BsYXlhYmxlPihzdWJqZWN0SG9sZGVyLCBNb2RlbC5JVEVNU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U2ltcGxlRGlzcGxheWFibGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXRlbXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0Lml0ZW1zU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgU2ltcGxlRGlzcGxheWFibGUgYnVpbGRTZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlRGlzcGxheWFibGUoImJheiIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNb2RlbCwgU2ltcGxlRGlzcGxheWFibGU+KHN1YmplY3RIb2xkZXIsIE1vZGVsLklURU1fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNpbXBsZURpc3BsYXlhYmxlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEl0ZW0oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU2ltcGxlRGlzcGxheWFibGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldEl0ZW0odmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdDb252ZXJ0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTaW1wbGVEaXNwbGF5YWJsZT4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTaW1wbGVEaXNwbGF5YWJsZSB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLmRpc3BsYXlTdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBidWlsZFN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPigpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgY29tYm9TZWxlY3RlZEl0ZW0oKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGVtcHR5Q29tYm9DYW5IYXZlU2VsZWN0ZWRWYWx1ZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBpdGVtQXQoaW50IGluZGV4KTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgaXRlbUNvdW50cygpOwotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPFNpbXBsZURpc3BsYXlhYmxlPiBjKSB7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiZm9vIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImJhciIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJiYXoiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiam9vIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImphciIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqYXoiKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JfQotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc2hlbGwgICAgICAgICAgICAgID0gbmV3IFNoZWxsKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJbW9kZWwgICAgICAgICAgICAgID0gbmV3IE1vZGVsKCk7Ci0JCXN1YmplY3RIb2xkZXIgICAgICA9IGJ1aWxkU3ViamVjdEhvbGRlcigpOwotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTaGVsbCBzaGVsbCgpIHsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gc3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIHN1YmplY3RIb2xkZXI7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc2hlbGwgICAgICAgICAgICAgID0gbnVsbDsKLQkJc3ViamVjdEhvbGRlciAgICAgID0gbnVsbDsKLQkJc2VsZWN0ZWRJdGVtSG9sZGVyID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdEl0ZW1zKCkgewotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgY291bnQgb2YgaXRlbXMgaXMgbm90IGluIHN5bmMgd2l0aCB0aGUgbW9kZWwiLAotCQkJbW9kZWwuaXRlbXNTaXplKCksCi0JCQlpdGVtQ291bnRzKCkKLQkJKTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbW9kZWwuaXRlbXNTaXplKCk7IGluZGV4KyspIHsKLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIGl0ZW0gYXQgaW5kZXggIiArIGluZGV4ICsgIiBpcyBub3QgdGhlIHNhbWUgYmV0d2VlbiB0aGUgbW9kZWwgYW5kIHRoZSBjb21ibyIsCi0JCQkJbW9kZWwuaXRlbUF0KGluZGV4KS5kaXNwbGF5U3RyaW5nKCksCi0JCQkJaXRlbUF0KGluZGV4KQotCQkJKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfQWRkZWRBZnRlcl9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0UmVtb3ZlSXRlbXNfQWRkZWRBZnRlcigpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfQWRkZWRBZnRlcl9SZW1vdmVJdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0UmVtb3ZlSXRlbXNfQWRkZWRBZnRlcigpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfQWRkZWRCZWZvcmVfUmVtb3ZlSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQotCQlBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgwKSk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMykpOwotCQltb2RlbC5yZW1vdmVJdGVtcyhpdGVtcy5pdGVyYXRvcigpKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9BZGRlZEJlZm9yZV9SZW1vdmVJdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCi0JCUFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDApKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgzKSk7Ci0JCW1vZGVsLnJlbW92ZUl0ZW1zKGl0ZW1zLml0ZXJhdG9yKCkpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNBZnRlckFmdGVyX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNBZnRlckFmdGVyX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNBZnRlckJlZm9yZV9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQWZ0ZXJCZWZvcmVfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0JlZm9yZV9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0JlZm9yZV9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfU2VsZWN0ZWRJdGVtQ2hhbmdlZF9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDApOwotCi0JCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGFkYXB0ZXIgPSBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJYWRhcHRlci5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQWZ0ZXJfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBidWlsZFNlbGVjdGVkSXRlbSgpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1BZnRlcl9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGJ1aWxkU2VsZWN0ZWRJdGVtKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUFmdGVyX0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IGJ1aWxkTGlzdCgpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBsaXN0LmdldCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQWZ0ZXJfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gYnVpbGRMaXN0KCk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGxpc3QuZ2V0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1CZWZvcmVfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1CZWZvcmVfSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1CZWZvcmVfSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gYnVpbGRMaXN0KCk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGxpc3QuZ2V0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUJlZm9yZV9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBidWlsZExpc3QoKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbGlzdC5nZXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gcmVtYWluIG51bGwiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gcmVtYWluIG51bGwiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byByZW1haW4gbnVsbCIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIHJlbWFpbiBudWxsIiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfU2VsZWN0ZWRJdGVtQ2hhbmdlZF9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMyk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGFkYXB0ZXIgPSBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJYWRhcHRlci5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdE51bGxTdWJqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gc2hvdWxkIGJlIG51bGwiLCBzZWxlY3RlZEl0ZW1Ib2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKGJ1aWxkU2VsZWN0ZWRJdGVtKCkpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCS8vIE51bGwgYmVjYXVzZSB0aGUgc3ViamVjdCBob2xkZXIgZG9lc24ndCBoYXZlIHRoZSBzdWJqZWN0IHNldAotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3ViamVjdF9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0TnVsbFN1YmplY3QoKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN1YmplY3RfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdE51bGxTdWJqZWN0KCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE51bGxTdWJqZWN0X051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdE51bGxTdWJqZWN0KCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE51bGxTdWJqZWN0X051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdE51bGxTdWJqZWN0KCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNfQWRkZWRBZnRlcigpIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCi0JCUFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDApKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgzKSk7Ci0JCW1vZGVsLnJlbW92ZUl0ZW1zKGl0ZW1zLml0ZXJhdG9yKCkpOwotCi0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0U2VsZWN0ZWRJdGVtKFNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSkgewotCi0JCWlmIChzZWxlY3RlZEl0ZW0gPT0gbnVsbCkgewotCi0JCQlhc3NlcnROdWxsKAotCQkJCSJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byBiZSBudWxsIiwKLQkJCQltb2RlbC5nZXRJdGVtKCkKLQkJCSk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIGNvbWJvJ3Mgc2VsZWN0ZWQgaXRlbSBzaG91bGQgYmUgbnVsbCIsCi0JCQkJIiIsCi0JCQkJY29tYm9TZWxlY3RlZEl0ZW0oKQotCQkJKTsKLQkJfQotCQllbHNlIGlmICghZW1wdHlDb21ib0NhbkhhdmVTZWxlY3RlZFZhbHVlKCkpIHsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IGNvcnJlY3RseSIsCi0JCQkJc2VsZWN0ZWRJdGVtLAotCQkJCW1vZGVsLmdldEl0ZW0oKQotCQkJKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgY29tYm8ncyBzZWxlY3RlZCBpdGVtIHNob3VsZCBiZSBudWxsIiwKLQkJCQkiIiwKLQkJCQljb21ib1NlbGVjdGVkSXRlbSgpCi0JCQkpOwotCQl9Ci0JCWVsc2UgewotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgY29ycmVjdGx5IiwKLQkJCQlzZWxlY3RlZEl0ZW0sCi0JCQkJbW9kZWwuZ2V0SXRlbSgpCi0JCQkpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgY29ycmVjdGx5IiwKLQkJCQlzZWxlY3RlZEl0ZW0uZGlzcGxheVN0cmluZygpLAotCQkJCWNvbWJvU2VsZWN0ZWRJdGVtKCkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFNlbGVjdGVkSXRlbUNoYW5nZWQoU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotCi0JCS8vIFRlc3QgMQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGlvbkxpc3RlbmVyLmlzTGlzdGVuZXJOb3RpZmllZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCi0JCS8vIFRlc3QgMgotCQlzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMSk7Ci0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJc2VsZWN0aW9uTGlzdGVuZXIuY2xlYXJJbmZvKCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3Rpb25MaXN0ZW5lci5pc0xpc3RlbmVyTm90aWZpZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQotCQkvLyBUZXN0IDMKLQkJc2VsZWN0ZWRJdGVtID0gbnVsbDsKLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlzZWxlY3Rpb25MaXN0ZW5lci5jbGVhckluZm8oKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3Rpb25MaXN0ZW5lci5pc0xpc3RlbmVyTm90aWZpZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQotCQkvLyBUZXN0IDMKLQkJc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDIpOwotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCXNlbGVjdGlvbkxpc3RlbmVyLmNsZWFySW5mbygpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0aW9uTGlzdGVuZXIuaXNMaXN0ZW5lck5vdGlmaWVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lci5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQlwcml2YXRlIFNpbXBsZURpc3BsYXlhYmxlIGl0ZW07Ci0JCXByaXZhdGUgTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXM7Ci0JCXByaXZhdGUgYm9vbGVhbiBzZXRJdGVtQ2FsbGVkOwotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV9QUk9QRVJUWSA9ICJpdGVtIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNU19MSVNUID0gIml0ZW1zIjsKLQotCQl2b2lkIGFkZEl0ZW1zKEl0ZXJhdG9yPFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcykgewotCQkJYWRkSXRlbXNUb0xpc3QoaXRlbXMsIHRoaXMuaXRlbXMsIElURU1TX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCBhZGRJdGVtcyhMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcykgewotCQkJYWRkSXRlbXNUb0xpc3QoaXRlbXMsIHRoaXMuaXRlbXMsIElURU1TX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCBjbGVhckl0ZW1DYWxsZWRGbGFnKCkgewotCQkJc2V0SXRlbUNhbGxlZCA9IGZhbHNlOwotCQl9Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgZ2V0SXRlbSgpIHsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCQlpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCX0KLQotCQlib29sZWFuIGlzU2V0SXRlbUNhbGxlZCgpIHsKLQkJCXJldHVybiBzZXRJdGVtQ2FsbGVkOwotCQl9Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgaXRlbUF0KGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMuaXRlbXMuZ2V0KGluZGV4KTsKLQkJfQotCi0JCUxpc3RJdGVyYXRvcjxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMoKSB7Ci0JCQlyZXR1cm4gaXRlbXMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQotCQlpbnQgaXRlbXNTaXplKCkgewotCQkJcmV0dXJuIGl0ZW1zLnNpemUoKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlSXRlbXMoSXRlcmF0b3I8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zKSB7Ci0JCQlyZW1vdmVJdGVtc0Zyb21MaXN0KGl0ZW1zLCB0aGlzLml0ZW1zLCBJVEVNU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgc2V0SXRlbShTaW1wbGVEaXNwbGF5YWJsZSBpdGVtKSB7Ci0JCQlzZXRJdGVtQ2FsbGVkID0gdHJ1ZTsKLQotCQkJU2ltcGxlRGlzcGxheWFibGUgb2xkSXRlbSA9IHRoaXMuaXRlbTsKLQkJCXRoaXMuaXRlbSA9IGl0ZW07Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElURU1fUFJPUEVSVFksIG9sZEl0ZW0sIGl0ZW0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPFNpbXBsZURpc3BsYXlhYmxlPiB7Ci0KLQkJcHJpdmF0ZSBTaW1wbGVEaXNwbGF5YWJsZSBpdGVtOwotCQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuZXJOb3RpZmllZDsKLQotCQl2b2lkIGNsZWFySW5mbygpIHsKLQkJCXRoaXMubGlzdGVuZXJOb3RpZmllZCA9IGZhbHNlOwotCQkJdGhpcy5pdGVtID0gbnVsbDsKLQkJfQotCi0JCVNpbXBsZURpc3BsYXlhYmxlIGdldEl0ZW0oKSB7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJOb3RpZmllZCgpIHsKLQkJCXJldHVybiBsaXN0ZW5lck5vdGlmaWVkOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxTaW1wbGVEaXNwbGF5YWJsZT4gZSkgewotCQkJbGlzdGVuZXJOb3RpZmllZCA9IHRydWU7Ci0JCQlpdGVtID0gZS5zZWxlY3RlZEl0ZW0oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ0NvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9DQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjE0M2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9DQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkNDb21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TaW1wbGVEaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLQotcHVibGljIGNsYXNzIENDb21ib01vZGVsQWRhcHRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIENDb21ibyBjb21ibzsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKSB7Ci0KLQkJY29tYm8gPSBuZXcgQ0NvbWJvKHNoZWxsKCksIFNXVC5OVUxMKTsKLQotCQlyZXR1cm4gQ0NvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWNvbWJvLAotCQkJYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKSB7Ci0KLQkJY29tYm8gPSBuZXcgQ0NvbWJvKHNoZWxsKCksIFNXVC5SRUFEX09OTFkpOwotCi0JCXJldHVybiBDQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlidWlsZExpc3RIb2xkZXIoKSwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJY29tYm8sCi0JCQlidWlsZFN0cmluZ0NvbnZlcnRlcigpCi0JCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBjb21ib1NlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldFRleHQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbXB0eUNvbWJvQ2FuSGF2ZVNlbGVjdGVkVmFsdWUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgaXRlbUF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb21iby5nZXRJdGVtKGluZGV4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGl0ZW1Db3VudHMoKSB7Ci0JCXJldHVybiBjb21iby5nZXRJdGVtQ291bnQoKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQljb21ibyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9DaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9DaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmNmMTM5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQm9vbGVhbkJ1dHRvbk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBjaGVjayBib3hlcy4KLSAqLwotcHVibGljIGNsYXNzIENoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZzFIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMkhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IG5vdEZsYWcySG9sZGVyOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIENoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCh0cnVlLCB0cnVlKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLmZsYWcxSG9sZGVyID0gdGhpcy5idWlsZEZsYWcxSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5mbGFnMkhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMubm90RmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkTm90RmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLkZMQUcxX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRmxhZzEoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEZsYWcxKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRmxhZzJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0ZsYWcyKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vdEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuTk9UX0ZMQUcyX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzTm90RmxhZzIoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5vdEZsYWcyKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJcGFyZW50LnNldFNpemUoNDAwLCAxMDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBjaGVja0JveFBhbmVsID0gdGhpcy5idWlsZENoZWNrQm94UGFuZWwobWFpblBhbmVsKTsKLQkJdGhpcy5idWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwsIGNoZWNrQm94UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZENoZWNrQm94UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzUpOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZEZsYWcxQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkRmxhZzJDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGROb3RGbGFnMkNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZFVuYXR0YWNoZWRDaGVja0JveChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsYWcxQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgiZmxhZyAxIik7Ci0JCUJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIuYWRhcHQodGhpcy5mbGFnMUhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsYWcyQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgiZmxhZyAyIik7Ci0JCUJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIuYWRhcHQodGhpcy5mbGFnMkhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5vdEZsYWcyQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgibm90IGZsYWcgMiIpOwotCQlCb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMubm90RmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgidW5hdHRhY2hlZCIpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRVbmF0dGFjaGVkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hdHRhY2hlZCBkZWZhdWx0IHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2hlY2tCb3hQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxpcEZsYWcxQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZE5vdEZsYWcyVG9nZ2xlQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24ocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsaXBGbGFnMUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRGbGlwRmxhZzFBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkRmxpcEZsYWcxQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiZmxpcCBmbGFnIDEiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmZsaXBGbGFnMSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImZsaXAgZmxhZyAxIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgZmxpcEZsYWcxKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRGbGFnMSggISB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcxKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5vdEZsYWcyVG9nZ2xlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5UT0dHTEUpOwotCQljaGVja0JveC5zZXRUZXh0KCJub3QgZmxhZyAyIik7Ci0JCUJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIuYWRhcHQodGhpcy5ub3RGbGFnMkhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENsZWFyTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlc3RvcmVNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzdG9yZSBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW50TW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRQcmludE1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicHJpbnQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJwcmludCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAxOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc05vdEZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiIpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcxOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzFfUFJPUEVSVFkgPSAiZmxhZzEiOwotCQlwcml2YXRlIGJvb2xlYW4gZmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMl9QUk9QRVJUWSA9ICJmbGFnMiI7Ci0JCXByaXZhdGUgYm9vbGVhbiBub3RGbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GTEFHMl9QUk9QRVJUWSA9ICJub3RGbGFnMiI7Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoYm9vbGVhbiBmbGFnMSwgYm9vbGVhbiBmbGFnMikgewotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9ICEgZmxhZzI7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNGbGFnMSgpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcxOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcxKGJvb2xlYW4gZmxhZzEpIHsKLQkJCWJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMTsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMV9QUk9QRVJUWSwgb2xkLCBmbGFnMSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNGbGFnMigpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcyKGJvb2xlYW4gZmxhZzIpIHsKLQkJCWJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMjsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMl9QUk9QRVJUWSwgb2xkLCBmbGFnMik7Ci0JCi0JCQlvbGQgPSB0aGlzLm5vdEZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9ICEgZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9UX0ZMQUcyX1BST1BFUlRZLCBvbGQsIHRoaXMubm90RmxhZzIpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzTm90RmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub3RGbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROb3RGbGFnMihib29sZWFuIG5vdEZsYWcyKSB7Ci0JCQl0aGlzLnNldEZsYWcyKCAhIG5vdEZsYWcyKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmlzRmxhZzEoKSArICIgLSAiICsgdGhpcy5pc0ZsYWcyKCkgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmIxNTJhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkNvbWJvTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBDb21ibyBjb21ibzsKLQlwcml2YXRlIGJvb2xlYW4gZWRpdGFibGU7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCkgewotCi0JCWNvbWJvID0gbmV3IENvbWJvKHNoZWxsKCksIFNXVC5OVUxMKTsKLQkJZWRpdGFibGUgPSB0cnVlOwotCi0JCXJldHVybiBDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQljb21ibywKLQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCkgewotCi0JCWNvbWJvID0gbmV3IENvbWJvKHNoZWxsKCksIFNXVC5SRUFEX09OTFkpOwotCQllZGl0YWJsZSA9IGZhbHNlOwotCi0JCXJldHVybiBDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQljb21ibywKLQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbWJvU2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gY29tYm8uZ2V0VGV4dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGVtcHR5Q29tYm9DYW5IYXZlU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGVkaXRhYmxlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgaXRlbUF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb21iby5nZXRJdGVtKGluZGV4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGl0ZW1Db3VudHMoKSB7Ci0JCXJldHVybiBjb21iby5nZXRJdGVtQ291bnQoKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQljb21ibyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9KcHRVaVNXVFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0pwdFVpU1dUVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhOGMyZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0pwdFVpU1dUVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkpVbml0NFRlc3RBZGFwdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlLlN1aXRlQ2xhc3NlczsKLQotQFN1aXRlQ2xhc3NlcwotKHsKLQlDQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmNsYXNzLAotCUNvbWJvTW9kZWxBZGFwdGVyVGVzdC5jbGFzcywKLQlTcGlubmVyTW9kZWxBZGFwdGVyVGVzdC5jbGFzcywKLQlUYWJsZU1vZGVsQWRhcHRlclRlc3QuY2xhc3MKLX0pCi1AUnVuV2l0aChTdWl0ZS5jbGFzcykKLXB1YmxpYyBmaW5hbCBjbGFzcyBKcHRVaVNXVFRlc3RzIHsKLQotCXByaXZhdGUgSnB0VWlTV1RUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEpVbml0NFRlc3RBZGFwdGVyKEpwdFVpU1dUVGVzdHMuY2xhc3MpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvTGlzdEJveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9MaXN0Qm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZWZjNTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9MaXN0Qm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuTGlzdEJveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0Lkxpc3RCb3hNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogYW4gZXhhbXBsZSBVSSBmb3IgdGVzdGluZyB2YXJpb3VzIHBlcm11dGF0aW9ucyBvZiB0aGUKLSAqIFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0Qm94TW9kZWxBZGFwdGVyVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCWZpbmFsIFRhc2tMaXN0IHRhc2tMaXN0OwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyOwotCXByaXZhdGUgVGV4dCB0YXNrVGV4dEZpZWxkOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgTGlzdEJveE1vZGVsQWRhcHRlclVJVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgTGlzdEJveE1vZGVsQWRhcHRlclVJVGVzdChTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnRhc2tMaXN0ID0gbmV3IFRhc2tMaXN0KCk7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0Pih0aGlzLnRhc2tMaXN0KTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJzd2ltIik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygiYmlrZSIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJ1biIpOwotCQlUYXNrIHJlc3QgPSB0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJlc3QiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRQcmlvcml0eVRhc2socmVzdCk7Ci0JCVRhc2sgcmVwZWF0ID0gdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJyZXBlYXQiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRQcmlvcml0eVRhc2socmVwZWF0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJcGFyZW50LnNldFNpemUoODAwLCA0MDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCB0YXNrTGlzdFBhbmVsID0gdGhpcy5idWlsZFRhc2tMaXN0UGFuZWwobWFpblBhbmVsKTsKLQkJdGhpcy5idWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwsIHRhc2tMaXN0UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJdGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RQYW5lbChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkT2JqZWN0VGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRVbnNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0UGFuZWwocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJwcmltaXRpdmUgdW5zb3J0ZWQiLCB0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgInByaW1pdGl2ZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJwcmltaXRpdmUgcmV2ZXJzZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuc29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbDIocGFyZW50LCAib2JqZWN0IHVuc29ydGVkIiwgdGhpcy5idWlsZFVuc29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRMaXN0UGFuZWwyKHBhcmVudCwgIm9iamVjdCBzb3J0ZWQiLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRMaXN0UGFuZWwyKHBhcmVudCwgIm9iamVjdCByZXZlcnNlIHNvcnRlZCIsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZFVuc29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8VGFzaz4odGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxUYXNrPih0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21UYXNrQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIDxFPiBMaXN0Qm94TW9kZWxBZGFwdGVyPEU+IGJ1aWxkTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgTGlzdFZhbHVlTW9kZWw8RT4gbW9kZWwsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNNb2RlbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0KLQkJTGFiZWwgbGlzdExhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTEVGVCB8IFNXVC5WRVJUSUNBTCk7Ci0JCWxpc3RMYWJlbC5zZXRUZXh0KGxhYmVsKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAzKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAyMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJbGlzdExhYmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QgbGlzdEJveCA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0KHBhbmVsLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChsaXN0TGFiZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJbGlzdEJveC5zZXRMYXlvdXREYXRhKGZkKTsKLQkJcmV0dXJuIExpc3RCb3hNb2RlbEFkYXB0ZXIuYWRhcHQobW9kZWwsIHNlbGVjdGVkSXRlbXNNb2RlbCwgbGlzdEJveCk7ICAvLyB1c2UgI3RvU3RyaW5nKCkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRMaXN0UGFuZWwyKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgTGlzdFZhbHVlTW9kZWw8VGFzaz4gbW9kZWwsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFRhc2s+IHNlbGVjdGVkSXRlbXNNb2RlbCkgewotCQlMaXN0Qm94TW9kZWxBZGFwdGVyPFRhc2s+IGFkYXB0ZXIgPSB0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgbGFiZWwsIG1vZGVsLCBzZWxlY3RlZEl0ZW1zTW9kZWwpOwotCQlhZGFwdGVyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIodGhpcy5idWlsZERvdWJsZUNsaWNrTGlzdGVuZXIoKSk7Ci0JCWFkYXB0ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEJveE1vZGVsQWRhcHRlci5Eb3VibGVDbGlja0xpc3RlbmVyPFRhc2s+IGJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Qm94TW9kZWxBZGFwdGVyLkRvdWJsZUNsaWNrTGlzdGVuZXI8VGFzaz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhMaXN0Qm94TW9kZWxBZGFwdGVyLkRvdWJsZUNsaWNrRXZlbnQ8VGFzaz4gZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRvdWJsZS1jbGljazogIiArIGV2ZW50LnNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RCb3hNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8VGFzaz4gYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Qm94TW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPFRhc2s+KCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxUYXNrPiBldmVudCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy50YXNrTGlzdC5zZXRQcmlvcml0eVRhc2tzKGV2ZW50LnNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFRhc2s+IGJ1aWxkQ3VzdG9tVGFza0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxUYXNrPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShUYXNrIHRvMSwgVGFzayB0bzIpIHsKLQkJCQlyZXR1cm4gdG8yLmNvbXBhcmVUbyh0bzEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgU3RyaW5nPih0aGlzLnRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5UQVNLX05BTUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrTmFtZXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBUYXNrPih0aGlzLnRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5UQVNLU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VGFzaz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxUYXNrPiBidWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBUYXNrPih0aGlzLnRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5QUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxUYXNrPiBpdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wcmlvcml0eVRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgdGFza0xpc3RQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRhc2tMaXN0UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIG1pc2MgPSB0aGlzLmJ1aWxkTWlzY1Rhc2tQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwocGFuZWwsIG1pc2MpOwotCX0KLQotCS8vIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBhc3NvY2lhdGUgYW4gQUNJIHdpdGggZm9ybSBkYXRhPwotCXByaXZhdGUgQ29udHJvbCBidWlsZE1pc2NUYXNrUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTQwMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRDbGVhckxpc3RBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQWRkUHJpb3JpdHlUYXNrQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZW1vdmVQcmlvcml0eVRhc2tBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyUHJpb3JpdHlUYXNrc0FDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJMaXN0QUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbGlzdCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhclRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgYWxsIHRoZSB0YXNrcyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIHRoZSB0YXNrIGxpc3QgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzdG9yZSBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZXN0b3JlIHRoZSB0YXNrIGxpc3QgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQWRkUHJpb3JpdHlUYXNrQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiYWRkIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZFByaW9yaXR5VGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImFkZCBhIHRhc2sgdG8gdGhlIHByaW9yaXR5IHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlbW92ZVByaW9yaXR5VGFza0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlbW92ZSBwcmlvcml0eSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVQcmlvcml0eVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZW1vdmUgYSB0YXNrIGZyb20gdGhlIHByaW9yaXR5IHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyUHJpb3JpdHlUYXNrc0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyUHJpb3JpdHlUYXNrcygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIHRoZSBwcmlvcml0eSB0YXNrcyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjbGVhckJ1dHRvbikgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2xlYXJCdXR0b24pOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgYWRkQnV0dG9uID0gdGhpcy5idWlsZEFkZEJ1dHRvbihwYW5lbCk7Ci0JCUNvbnRyb2wgcmVtb3ZlQnV0dG9uID0gdGhpcy5idWlsZFJlbW92ZUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRUYXNrVGV4dEZpZWxkKHBhbmVsLCBhZGRCdXR0b24sIHJlbW92ZUJ1dHRvbik7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQWRkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkQWRkQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJhZGQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuYWRkVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImFkZCBhIHRhc2sgd2l0aCB0aGUgbmFtZSBpbiB0aGUgZW50cnkgZmllbGQiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkUmVtb3ZlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01MCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRSZW1vdmVBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlbW92ZUFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlbW92ZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVtb3ZlIHRoZSB0YXNrIHdpdGggdGhlIG5hbWUgaW4gdGhlIGVudHJ5IGZpZWxkIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFRhc2tUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBhZGRCdXR0b24sIENvbnRyb2wgcmVtb3ZlQnV0dG9uKSB7Ci0JCXRoaXMudGFza1RleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZEJ1dHRvbik7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChyZW1vdmVCdXR0b24pOwotCQl0aGlzLnRhc2tUZXh0RmllbGQuc2V0TGF5b3V0RGF0YShmZCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgdGFza1RleHRGaWVsZFRleHQoKSB7Ci0JCXJldHVybiB0aGlzLnRhc2tUZXh0RmllbGQuZ2V0VGV4dCgpOwotCX0KLQotCXZvaWQgYWRkVGFzaygpIHsKLQkJU3RyaW5nIHRhc2tUZXh0ID0gdGhpcy50YXNrVGV4dEZpZWxkVGV4dCgpOwotCQlpZiAodGFza1RleHQubGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKHRhc2tUZXh0KTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVGFzaygpIHsKLQkJU3RyaW5nIHRhc2sgPSB0aGlzLnRhc2tUZXh0RmllbGRUZXh0KCk7Ci0JCWlmICh0YXNrLmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QucmVtb3ZlVGFzayh0YXNrKTsKLQkJfQotCX0KLQotCXZvaWQgY2xlYXJUYXNrcygpIHsKLQkJdGhpcy50YXNrTGlzdC5jbGVhclRhc2tzKCk7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRhc2tMaXN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRhc2tMaXN0SG9sZGVyLnNldFZhbHVlKHRoaXMudGFza0xpc3QpOwotCX0KLQotCXZvaWQgYWRkUHJpb3JpdHlUYXNrKCkgewotCQlJdGVyYXRvcjxUYXNrPiB0YXNrcyA9IHRoaXMudGFza0xpc3QudGFza3MoKTsKLQkJd2hpbGUgKHRhc2tzLmhhc05leHQoKSkgewotCQkJaWYgKHRoaXMudGFza0xpc3QuYWRkUHJpb3JpdHlUYXNrKHRhc2tzLm5leHQoKSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVByaW9yaXR5VGFzaygpIHsKLQkJSXRlcmF0b3I8VGFzaz4gcFRhc2tzID0gdGhpcy50YXNrTGlzdC5wcmlvcml0eVRhc2tzKCk7Ci0JCWlmIChwVGFza3MuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LnJlbW92ZVByaW9yaXR5VGFzayhwVGFza3MubmV4dCgpKTsKLQkJfQotCX0KLQotCXZvaWQgY2xlYXJQcmlvcml0eVRhc2tzKCkgewotCQl0aGlzLnRhc2tMaXN0LmNsZWFyUHJpb3JpdHlUYXNrcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYXNrTGlzdCAqKioqKioqKioqCi0KLQkvLyBub3RlIGFic2VuY2Ugb2YgdmFsaWRhdGlvbi4uLgotCXByaXZhdGUgY2xhc3MgVGFza0xpc3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gdGFza05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX05BTUVTX0xJU1QgPSAidGFza05hbWVzIjsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0PFRhc2s+IHRhc2tzID0gbmV3IEFycmF5TGlzdDxUYXNrPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1NfTElTVCA9ICJ0YXNrcyI7Ci0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxUYXNrPiBwcmlvcml0eVRhc2tzID0gbmV3IEhhc2hTZXQ8VGFzaz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04gPSAicHJpb3JpdHlUYXNrcyI7Ci0JCVRhc2tMaXN0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFza05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza05hbWVzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VGFzaz4gdGFza3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrcy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8VGFzaz4gcHJpb3JpdHlUYXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnByaW9yaXR5VGFza3MuaXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgVGFzayBhZGRUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHRhc2tOYW1lLCB0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCVRhc2sgdGFzayA9IG5ldyBUYXNrKHRhc2tOYW1lKTsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdCh0YXNrLCB0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJCXJldHVybiB0YXNrOwotCQl9CQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlVGFzayhTdHJpbmcgdGFza05hbWUpIHsKLQkJCWludCBpbmRleCA9IHRoaXMudGFza05hbWVzLmluZGV4T2YodGFza05hbWUpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJCS8vIGFzc3VtZSB0aGUgaW5kZXhlcyBtYXRjaC4uLgotCQkJCVRhc2sgcmVtb3ZlZFRhc2sgPSB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24ocmVtb3ZlZFRhc2ssIHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJUYXNrcygpIHsKLQkJCXRoaXMudGFza05hbWVzLmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChUQVNLX05BTUVTX0xJU1QpOwotCQkJdGhpcy50YXNrcy5jbGVhcigpOwotCQkJdGhpcy5maXJlTGlzdENsZWFyZWQoVEFTS1NfTElTVCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gYWRkUHJpb3JpdHlUYXNrKFRhc2sgdGFzaykgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbih0YXNrLCB0aGlzLnByaW9yaXR5VGFza3MsIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQl9CQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlUHJpb3JpdHlUYXNrKFRhc2sgdGFzaykgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24odGFzaywgdGhpcy5wcmlvcml0eVRhc2tzLCBQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhclByaW9yaXR5VGFza3MoKSB7Ci0JCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLnByaW9yaXR5VGFza3MsIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFByaW9yaXR5VGFza3MoSXRlcmF0b3I8VGFzaz4gdGFza3MpIHsKLQkJCXRoaXMucHJpb3JpdHlUYXNrcy5jbGVhcigpOwotCQkJd2hpbGUgKHRhc2tzLmhhc05leHQoKSkgewotCQkJCXRoaXMucHJpb3JpdHlUYXNrcy5hZGQodGFza3MubmV4dCgpKTsKLQkJCX0KLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2sgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBUYXNrIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBEYXRlIGNyZWF0aW9uVGltZVN0YW1wOwotCQlwdWJsaWMgVGFzayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuY3JlYXRpb25UaW1lU3RhbXAgPSBuZXcgRGF0ZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWUgKyAiOiAiICsgdGhpcy5jcmVhdGlvblRpbWVTdGFtcC5nZXRUaW1lKCk7Ci0JCX0KLQkJcHVibGljIGludCBjb21wYXJlVG8oRGlzcGxheWFibGUgbykgewotCQkJcmV0dXJuIERFRkFVTFRfQ09NUEFSQVRPUi5jb21wYXJlKHRoaXMsIG8pOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIERpc3BsYXlhYmxlIGV4dGVuZHMgTW9kZWwsIENvbXBhcmFibGU8RGlzcGxheWFibGU+IHsKLQkKLQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcoKTsKLQkJCVN0cmluZyBESVNQTEFZX1NUUklOR19QUk9QRVJUWSA9ICJkaXNwbGF5U3RyaW5nIjsKLQkKLQkKLQkJLy8gKioqKioqKioqKiBoZWxwZXIgaW1wbGVtZW50YXRpb25zICoqKioqKioqKioKLQkKLQkJQ29sbGF0b3IgREVGQVVMVF9DT0xMQVRPUiA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JCi0JCUNvbXBhcmF0b3I8RGlzcGxheWFibGU+IERFRkFVTFRfQ09NUEFSQVRPUiA9Ci0JCQluZXcgQ29tcGFyYXRvcjxEaXNwbGF5YWJsZT4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKERpc3BsYXlhYmxlIGQxLCBEaXNwbGF5YWJsZSBkMikgewotCQkJCQkvLyBkaXNhbGxvdyBkdXBsaWNhdGVzIGJhc2VkIG9uIG9iamVjdCBpZGVudGl0eQotCQkJCQlpZiAoZDEgPT0gZDIpIHsKLQkJCQkJCXJldHVybiAwOwotCQkJCQl9Ci0JCi0JCQkJCS8vIGZpcnN0IGNvbXBhcmUgZGlzcGxheSBzdHJpbmdzIHVzaW5nIHRoZSBkZWZhdWx0IGNvbGxhdG9yCi0JCQkJCWludCByZXN1bHQgPSBERUZBVUxUX0NPTExBVE9SLmNvbXBhcmUoZDEuZGlzcGxheVN0cmluZygpLCBkMi5kaXNwbGF5U3RyaW5nKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gdGhlbiBjb21wYXJlIHVzaW5nIG9iamVjdC1pZAotCQkJCQlyZXN1bHQgPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShkMSkgLSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShkMik7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkgewotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJfQotCQotCQkJCQkvLyBJdCdzIHVubGlrZWx5IHRoYXQgd2UgZ2V0IHRvIHRoaXMgcG9pbnQ7IGJ1dCwganVzdCBpbiBjYXNlLCB3ZSB3aWxsIHJldHVybiAtMS4KLQkJCQkJLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBpbnRyb2R1Y2VzIHNvbWUgbWlsZCB1bnByZWRpY3RhYmlsaXR5IHRvIHRoZSBzb3J0IG9yZGVyCi0JCQkJCS8vICh1bmxlc3MgdGhlIG9iamVjdHMgYXJlIGFsd2F5cyBwYXNzZWQgaW50byB0aGlzIG1ldGhvZCBpbiB0aGUgc2FtZSBvcmRlcikuCi0JCQkJCXJldHVybiAtMTsJCS8vIGlmIGFsbCBlbHNlIGZhaWxzLCBpbmRpY2F0ZSB0aGF0IG8xIDwgbzIKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQkJcmV0dXJuICJEaXNwbGF5YWJsZS5ERUZBVUxUX0NPTVBBUkFUT1IiOwotCQkJCX0KLQkJCX07Ci0JCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDM0Mzc3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIE1vZGVsIG1vZGVsOwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gc3ViamVjdEhvbGRlcjsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+IGJ1aWxkU3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+KCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNb2RlbCwgSW50ZWdlcj4oc3ViamVjdEhvbGRlciwgTW9kZWwuVkFMVUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VmFsdWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0VmFsdWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXNoZWxsICAgICAgICAgICAgICA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCW1vZGVsICAgICAgICAgICAgICA9IG5ldyBNb2RlbCgpOwotCQlzdWJqZWN0SG9sZGVyICAgICAgPSBidWlsZFN1YmplY3RIb2xkZXIoKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzaGVsbCAgICAgICAgID0gbnVsbDsKLQkJc3ViamVjdEhvbGRlciA9IG51bGw7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZWQoKSB7Ci0KLQkJaW50IHZhbHVlID0gMjsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCQltb2RlbC5jbGVhclNldFZhbHVlQ2FsbGVkRmxhZygpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIGNvbWluZyBmcm9tIHRoZSBtb2RlbCIsCi0JCQl2YWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIG1vZGVsJ3MgdmFsdWUiLAotCQkJbW9kZWwuZ2V0VmFsdWUoKSwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIG1vZGVsIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwKLQkJCW1vZGVsLmlzU2V0VmFsdWVDYWxsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSB0aGUgdmFsdWUgaW4gdGhlIG1vZGVsCi0JCXNwaW5uZXIuZGlzcG9zZSgpOwotCi0JCXZhbHVlID0gNDsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbW9kZWwncyB2YWx1ZSB3YXMgc29tZWhvdyBjaGFuZ2VkIiwKLQkJCXZhbHVlLAotCQkJbW9kZWwuZ2V0VmFsdWUoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uXzEoKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0TnVsbCgKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSBudWxsIiwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb25fMigpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IHZhbHVlIiwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnROdWxsKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIG51bGwiLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbl8zKCkgewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdmFsdWUiLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydE51bGwoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgbnVsbCIsCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBtb2RlbCBzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHZhbHVlIGR1cmluZyBpbml0aWFsaXphdGlvbiIsCi0JCQltb2RlbC5pc1NldFZhbHVlQ2FsbGVkKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbl80KCkgewotCi0JCWludCB2YWx1ZSA9IDI7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQkJbW9kZWwuY2xlYXJTZXRWYWx1ZUNhbGxlZEZsYWcoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgdmFsdWUgY29taW5nIGZyb20gdGhlIG1vZGVsIiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSAiICsgdmFsdWUsCi0JCQl2YWx1ZSwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIG1vZGVsIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwKLQkJCW1vZGVsLmlzU2V0VmFsdWVDYWxsZWQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFZhbHVlQ2hhbmdlZCgpIHsKLQotCQlpbnQgdmFsdWUgPSAyOwotCQltb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCW1vZGVsLmNsZWFyU2V0VmFsdWVDYWxsZWRGbGFnKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgY29taW5nIGZyb20gdGhlIG1vZGVsIiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgbW9kZWwncyB2YWx1ZSIsCi0JCQltb2RlbC5nZXRWYWx1ZSgpLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgbW9kZWwgc2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHRoZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLAotCQkJbW9kZWwuaXNTZXRWYWx1ZUNhbGxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB2YWx1ZSBpbiB0aGUgbW9kZWwKLQkJdmFsdWUgPSA0OwotCQltb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIGNvbWluZyBmcm9tIHRoZSBtb2RlbCIsCi0JCQl2YWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG1vZGVsJ3MgdmFsdWUgd2FzIHNvbWVob3cgY2hhbmdlZCIsCi0JCQl2YWx1ZSwKLQkJCW1vZGVsLmdldFZhbHVlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHZhbHVlIGZyb20gdGhlIHNwaW5uZXIKLQkJdmFsdWUgPSA2OwotCQlzcGlubmVyLnNldFNlbGVjdGlvbih2YWx1ZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBuZXcgdmFsdWUgc2V0IiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbW9kZWwncyB2YWx1ZSB3YXMgc3VwcG9zZWQgdG8gYmUgdXBkYXRlZCIsCi0JCQl2YWx1ZSwKLQkJCW1vZGVsLmdldFZhbHVlKCkKLQkJKTsKLQotCQkvLyBEaXNjb25uZWN0IGZyb20gbW9kZWwKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdmFsdWUiLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHNldFZhbHVlQ2FsbGVkOwotCQlwcml2YXRlIEludGVnZXIgdmFsdWU7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7Ci0KLQkJdm9pZCBjbGVhclNldFZhbHVlQ2FsbGVkRmxhZygpIHsKLQkJCXNldFZhbHVlQ2FsbGVkID0gZmFsc2U7Ci0JCX0KLQotCQlJbnRlZ2VyIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1NldFZhbHVlQ2FsbGVkKCkgewotCQkJcmV0dXJuIHNldFZhbHVlQ2FsbGVkOwotCQl9Ci0KLQkJdm9pZCBzZXRWYWx1ZShJbnRlZ2VyIHZhbHVlKSB7Ci0JCQlzZXRWYWx1ZUNhbGxlZCA9IHRydWU7Ci0KLQkJCUludGVnZXIgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIHZhbHVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RhYmxlTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRhOTkwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXJUZXN0IHsKLQotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNYW5hZ2VyPiBzdWJqZWN0SG9sZGVyOwotCi0JcHJpdmF0ZSBDb2x1bW5BZGFwdGVyPEVtcGxveWVlPiBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVDb2x1bW5BZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gYnVpbGRFbXBsb3llZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+KCk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gYnVpbGRFbXBsb3llZUhvbGRlcnMoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RW1wbG95ZWU+KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8TWFuYWdlciwgRW1wbG95ZWU+KHN1YmplY3RIb2xkZXIsIE1hbmFnZXIuRU1QTE9ZRUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFbXBsb3llZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5lbXBsb3llZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmVtcGxveWVlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElUYWJsZUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlTGFiZWxQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RW1wbG95ZWU+IGJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoZmluYWwgQ29sbGVjdGlvbjxFbXBsb3llZT4gZW1wbG95ZWVzKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RW1wbG95ZWU+KCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxFbXBsb3llZT4gZSkgewotCQkJCWVtcGxveWVlcy5jbGVhcigpOwotCQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZW1wbG95ZWVzLCBlLnNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1hbmFnZXI+IGJ1aWxkU3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TWFuYWdlcj4oKTsKLQl9Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzaGVsbCAgICAgICAgID0gbmV3IFNoZWxsKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJc3ViamVjdEhvbGRlciA9IGJ1aWxkU3ViamVjdEhvbGRlcigpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXNoZWxsICAgICAgICAgPSBudWxsOwotCQlzdWJqZWN0SG9sZGVyID0gbnVsbDsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCW5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgVGFibGUgd2FzIHBvcHVsYXRlZAotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbXMgc2hvdWxkIGJlIDMiLCAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSBsaXN0IG9mIEVtcGxveWVlcwotCQlBcnJheUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDMpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQltYW5hZ2VyLmNoYW5nZUVtcGxveWVlcyhlbXBsb3llZXMpOwotCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtcyBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgMCwgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgMSwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgMiwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENsZWFyZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBUYWJsZSB3YXMgcG9wdWxhdGVkCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtcyBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBUZXN0IHJlbW92aW5nIHRoZW0gYWxsCi0JCW1hbmFnZXIucmVtb3ZlQWxsRW1wbG95ZWVzKCk7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGxpc3QgaG9sZGVyIHNob3VsZCBoYXZlIGJlZW4gY2xlYXJlZCIsIDAsIGxpc3RIb2xkZXIuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIFRhYmxlIHNob3VsZCBoYXZlIGJlZW4gY2xlYXJlZCIsIDAsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIGEgbmV3IEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUgICAgPSAiRGFsaSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIgPSAiV1RQIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUgICA9ICJwbHVnLWluIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZSA9IG1hbmFnZXIuYWRkRW1wbG95ZWUoZXhwZWN0ZWROYW1lLCBleHBlY3RlZFRpdGxlLCBleHBlY3RlZE1hbmFnZXIpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGNyZWF0ZWQiLCBlbXBsb3llZSk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbSByZXByZXNlbnRpbmcgdGhlIG5ldyBFbXBsb3llZQotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgsIGV4cGVjdGVkTmFtZSwgZXhwZWN0ZWRNYW5hZ2VyLCBleHBlY3RlZFRpdGxlKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtTW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBFbXBsb3llZXMgd2VyZSBhZGRlZCB0byB0aGUgVGFibGUKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDMiLCAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gTW92ZSBhbiBFbXBsb3llZSB1cCB0aGUgbGlzdAotCQltYW5hZ2VyLm1vdmVFbXBsb3llZVVwKGVtcGxveWVlMik7Ci0KLQkJaW50IGluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSB3YXMgbm90IG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDEsIGluZGV4MSk7Ci0KLQkJaW50IGluZGV4MiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiB3YXMgbm90IG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4Mik7Ci0KLQkJaW50IGluZGV4MyA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyBzaG91bGQgbm90IGhhdmUgYmVlbiBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAyLCBpbmRleDMpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0KLQkJLy8gTW92ZSBhbiBFbXBsb3llZSBkb3duIHRoZSBsaXN0Ci0JCW1hbmFnZXIubW92ZUVtcGxveWVlRG93bihlbXBsb3llZTEpOwotCi0JCWluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSBzaG91bGQgbm90IGhhdmUgYmVlbiBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAyLCBpbmRleDEpOwotCi0JCWluZGV4MiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiB3YXMgbm90IG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4Mik7Ci0KLQkJaW5kZXgzID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMSwgaW5kZXgzKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgxLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDIsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MywgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZW1vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBhIG5ldyBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lICAgID0gIkRhbGkiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyID0gIldUUCI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlICAgPSAicGx1Zy1pbiI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUgPSBtYW5hZ2VyLmFkZEVtcGxveWVlKGV4cGVjdGVkTmFtZSwgZXhwZWN0ZWRUaXRsZSwgZXhwZWN0ZWRNYW5hZ2VyKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBjcmVhdGVkIiwgZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBNYWtlIHN1cmUgaXQgd2FzIGFkZGVkIHRvIHRoZSBtb2RlbAotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgsIGV4cGVjdGVkTmFtZSwgZXhwZWN0ZWRNYW5hZ2VyLCBleHBlY3RlZFRpdGxlKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtIHJlcHJlc2VudGluZyB0aGUgbmV3IEVtcGxveWVlCi0JCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZS5nZXRJdGVtKGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIk5vIFRhYmxlSXRlbSB3YXMgZm91bmQgZm9yIHRoZSBuZXcgRW1wbG95ZWUiLCB0YWJsZUl0ZW0pOwotCi0JCS8vIE5vdyB0ZXN0IHRoZSBpdGVtIGJlaW5nIHJlbW92ZWQKLQkJbWFuYWdlci5yZW1vdmVFbXBsb3llZShlbXBsb3llZSk7Ci0JCWluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIHdhcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSB0YWJsZSBtb2RlbCIsIC0xLCBpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAwIiwgMCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZXBsYWNlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgYSBuZXcgRW1wbG95ZWUKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG1hbmFnZXIuYWRkRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGNyZWF0ZWQiLCBlbXBsb3llZTEpOwotCi0JCS8vIE1ha2Ugc3VyZSBpdCB3YXMgYWRkZWQgdG8gdGhlIG1vZGVsCi0JCWludCBpbmRleDEgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4MSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW0gcmVwcmVzZW50aW5nIHRoZSBuZXcgRW1wbG95ZWUKLQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlLmdldEl0ZW0oaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIk5vIFRhYmxlSXRlbSB3YXMgZm91bmQgZm9yIHRoZSBuZXcgRW1wbG95ZWUiLCB0YWJsZUl0ZW0pOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQotCQkvLyBSZXBsYWNlIHRoZSBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJbWFuYWdlci5yZXBsYWNlKGVtcGxveWVlMSwgZW1wbG95ZWUyKTsKLQotCQlpbnQgaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRTYW1lKCJUaGUgRW1wbG95ZWUgdGhhdCBnb3QgcmVwbGFjZWQgc2hvdWxkIGJlIGF0IGluZGV4ICIgKyBpbmRleDEsIGluZGV4MSwgaW5kZXgyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1zQWRkZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbXMgcmVwcmVzZW50aW5nIHRoZSBlbXBsb3llZXMKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDMiLCAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJaW50IGluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgpOwotCi0JCWluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMSwgaW5kZXgpOwotCi0JCWluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMiwgaW5kZXgpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgVGFibGVJdGVtIHdhcyBjb3JyZWN0bHkgcG9wdWxhdGVkCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAwLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAxLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAyLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbXNNb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWU0ICAgID0gIkRhbGlfNCI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXI0ID0gIldUUF80IjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGU0ICAgPSAicGx1Zy1pbl80IjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lNSAgICA9ICJEYWxpXzUiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyNSA9ICJXVFBfNSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlNSAgID0gInBsdWctaW5fNSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTYgICAgPSAiRGFsaV82IjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjYgPSAiV1RQXzYiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTYgICA9ICJwbHVnLWluXzYiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0JCUVtcGxveWVlIGVtcGxveWVlNCA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWU0LCBleHBlY3RlZFRpdGxlNCwgZXhwZWN0ZWRNYW5hZ2VyNCk7Ci0JCUVtcGxveWVlIGVtcGxveWVlNSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWU1LCBleHBlY3RlZFRpdGxlNSwgZXhwZWN0ZWRNYW5hZ2VyNSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlNiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWU2LCBleHBlY3RlZFRpdGxlNiwgZXhwZWN0ZWRNYW5hZ2VyNik7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTQpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlNSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWU2KTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIEVtcGxveWVlcyB3ZXJlIGFkZGVkIHRvIHRoZSBUYWJsZQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgNiIsIDYsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBNb3ZlIGFuIEVtcGxveWVlIHVwIHRoZSBsaXN0Ci0JCUFycmF5TGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMyk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTQpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlNSk7Ci0JCW1hbmFnZXIubW92ZUVtcGxveWVlcyhlbXBsb3llZXMsIDApOwotCi0JCWludCBpbmRleDEgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJaW50IGluZGV4MiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlpbnQgaW5kZXgzID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCWludCBpbmRleDQgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU0KTsKLQkJaW50IGluZGV4NSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTUpOwotCQlpbnQgaW5kZXg2ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNik7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDMsIGluZGV4MSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCA0LCBpbmRleDIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMCwgaW5kZXgzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDQgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDEsIGluZGV4NCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA1IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAyLCBpbmRleDUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNiBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgNSwgaW5kZXg2KTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgxLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDIsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MywgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg0LCBleHBlY3RlZE5hbWU0LCBleHBlY3RlZE1hbmFnZXI0LCBleHBlY3RlZFRpdGxlNCk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDUsIGV4cGVjdGVkTmFtZTUsIGV4cGVjdGVkTWFuYWdlcjUsIGV4cGVjdGVkVGl0bGU1KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NiwgZXhwZWN0ZWROYW1lNiwgZXhwZWN0ZWRNYW5hZ2VyNiwgZXhwZWN0ZWRUaXRsZTYpOwotCi0JCS8vIE1vdmUgYW4gRW1wbG95ZWUgZG93biB0aGUgbGlzdAotCQllbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIubW92ZUVtcGxveWVlcyhlbXBsb3llZXMsIDQpOwotCi0JCWluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJaW5kZXgzID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCWluZGV4NCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTQpOwotCQlpbmRleDUgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU1KTsKLQkJaW5kZXg2ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNik7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDQsIGluZGV4MSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCA1LCBpbmRleDIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMCwgaW5kZXgzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDQgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDEsIGluZGV4NCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA1IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAyLCBpbmRleDUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNiBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMywgaW5kZXg2KTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgxLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDIsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MywgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg0LCBleHBlY3RlZE5hbWU0LCBleHBlY3RlZE1hbmFnZXI0LCBleHBlY3RlZFRpdGxlNCk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDUsIGV4cGVjdGVkTmFtZTUsIGV4cGVjdGVkTWFuYWdlcjUsIGV4cGVjdGVkVGl0bGU1KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NiwgZXhwZWN0ZWROYW1lNiwgZXhwZWN0ZWRNYW5hZ2VyNiwgZXhwZWN0ZWRUaXRsZTYpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1zUmVtb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtcyByZXByZXNlbnRpbmcgdGhlIGVtcGxveWVlcwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0KLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAxLCBpbmRleCk7Ci0KLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAyLCBpbmRleCk7Ci0KLQkJLy8gUmVtb3ZlIDIgaXRlbXMKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCW1hbmFnZXIucmVtb3ZlRW1wbG95ZWVzKGVtcGxveWVlcyk7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2VkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBhIG5ldyBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lICAgID0gIkRhbGkiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyID0gIldUUCI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlICAgPSAicGx1Zy1pbiI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUgPSBtYW5hZ2VyLmFkZEVtcGxveWVlKGV4cGVjdGVkTmFtZSwgZXhwZWN0ZWRUaXRsZSwgZXhwZWN0ZWRNYW5hZ2VyKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBjcmVhdGVkIiwgZW1wbG95ZWUpOwotCi0JCS8vIE1ha2Ugc3VyZSBpdCB3YXMgYWRkZWQgdG8gdGhlIG1vZGVsCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW0gcmVwcmVzZW50aW5nIHRoZSBuZXcgRW1wbG95ZWUKLQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlLmdldEl0ZW0oaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIG5ldyBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJLy8gTmFtZSBwcm9wZXJ0eQotCQlTdHJpbmcgYWN0dWFsTmFtZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtOQU1FX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWROYW1lLCBhY3R1YWxOYW1lKTsKLQotCQlleHBlY3RlZE5hbWUgPSAiSnB0IjsKLQkJZW1wbG95ZWUuc2V0TmFtZShleHBlY3RlZE5hbWUpOwotCi0JCWFjdHVhbE5hbWUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTkFNRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTmFtZSwgYWN0dWFsTmFtZSk7Ci0KLQkJLy8gTWFuYWdlciBwcm9wZXJ0eQotCQlTdHJpbmcgYWN0dWFsTWFuYWdlciA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5NQU5BR0VSX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtNQU5BR0VSX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRNYW5hZ2VyLCBhY3R1YWxNYW5hZ2VyKTsKLQotCQlleHBlY3RlZE1hbmFnZXIgPSAiYm9zcyI7Ci0JCWVtcGxveWVlLnNldE1hbmFnZXIoZXhwZWN0ZWRNYW5hZ2VyKTsKLQotCQlhY3R1YWxNYW5hZ2VyID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk1BTkFHRVJfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW01BTkFHRVJfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE1hbmFnZXIsIGFjdHVhbE1hbmFnZXIpOwotCi0JCS8vIFRpdGxlIHByb3BlcnR5Ci0JCVN0cmluZyBhY3R1YWxUaXRsZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5USVRMRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bVElUTEVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZFRpdGxlLCBhY3R1YWxUaXRsZSk7Ci0KLQkJZXhwZWN0ZWRUaXRsZSA9ICJFY2xpcHNlTGluayI7Ci0JCWVtcGxveWVlLnNldFRpdGxlKGV4cGVjdGVkVGl0bGUpOwotCi0JCWFjdHVhbFRpdGxlID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLlRJVExFX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtUSVRMRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkVGl0bGUsIGFjdHVhbFRpdGxlKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3RlZEl0ZW1zQWRkZWRSZW1vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbXNIb2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVycygpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFRlc3QgYWRkaW5nIHNlbGVjdGVkIGl0ZW1zCi0JCUFycmF5TGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMik7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUxKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLmFkZEFsbChlbXBsb3llZXMpOwotCi0JCUNvbGxlY3Rpb248RW1wbG95ZWU+IGFjdHVhbEVtcGxveWVlcyA9IHRhYmxlTW9kZWwuc2VsZWN0ZWRJdGVtcygpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMgY2FuJ3QgYmUgbnVsbCIsIGFjdHVhbEVtcGxveWVlcyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBjb3VudCBvZiBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgMiIsIDIsIGFjdHVhbEVtcGxveWVlcy5zaXplKCkpOwotCi0JCWFjdHVhbEVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUxKTsKLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTMpOwotCi0JCUFzc2VydC5hc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbXMgd2FzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5IiwgYWN0dWFsRW1wbG95ZWVzLmlzRW1wdHkoKSk7Ci0KLQkJLy8gVGVzdCByZW1vdmluZyBzZWxlY3RlZCBpdGVtcwotCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLnJlbW92ZShlbXBsb3llZTEpOwotCi0JCWFjdHVhbEVtcGxveWVlcyA9IHRhYmxlTW9kZWwuc2VsZWN0ZWRJdGVtcygpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMgY2FuJ3QgYmUgbnVsbCIsIGFjdHVhbEVtcGxveWVlcyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBjb3VudCBvZiBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgMSIsIDEsIGFjdHVhbEVtcGxveWVlcy5zaXplKCkpOwotCi0JCWFjdHVhbEVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUzKTsKLQotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW1zIHdhcyBub3QgcmV0cmlldmVkIGNvcnJlY3RseSIsIGFjdHVhbEVtcGxveWVlcy5pc0VtcHR5KCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNlbGVjdGVkSXRlbXNDbGVhcmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbXNIb2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVycygpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFRlc3QgYWRkaW5nIHNlbGVjdGVkIGl0ZW1zCi0JCUFycmF5TGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMik7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUxKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLmFkZEFsbChlbXBsb3llZXMpOwotCi0JCUNvbGxlY3Rpb248RW1wbG95ZWU+IGFjdHVhbEVtcGxveWVlcyA9IHRhYmxlTW9kZWwuc2VsZWN0ZWRJdGVtcygpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMgY2FuJ3QgYmUgbnVsbCIsIGFjdHVhbEVtcGxveWVlcyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBjb3VudCBvZiBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgMiIsIDIsIGFjdHVhbEVtcGxveWVlcy5zaXplKCkpOwotCi0JCWFjdHVhbEVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUxKTsKLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW1zIHdhcyBub3QgcmV0cmlldmVkIGNvcnJlY3RseSIsIGFjdHVhbEVtcGxveWVlcy5pc0VtcHR5KCkpOwotCi0JCS8vIFRlc3QgcmVtb3Zpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJc2VsZWN0ZWRJdGVtc0hvbGRlci5jbGVhcigpOwotCi0JCWFjdHVhbEVtcGxveWVlcyA9IHRhYmxlTW9kZWwuc2VsZWN0ZWRJdGVtcygpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMgY2FuJ3QgYmUgbnVsbCIsIGFjdHVhbEVtcGxveWVlcyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBjb3VudCBvZiBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgIiwgMCwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCksCi0JCQlidWlsZEVtcGxveWVlSG9sZGVyKCksCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQlDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigpOwotCQl0YWJsZU1vZGVsLmFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoZW1wbG95ZWVzKSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gVGVzdCBhZGRpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7IDAsIDIgfSk7Ci0KLQkJLy8gSXQgc2VlbXMgYSBtYW51YWwgc2VsZWN0aW9uIGRvZXNuJ3Qgc2VuZCBhbnkgc2VsZWN0aW9uIGV2ZW50Ci0JCXRhYmxlTW9kZWwudGFibGVTZWxlY3Rpb25DaGFuZ2VkKG51bGwpOwotCi0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgZW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAyIiwgMiwgZW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJZW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTEpOwotCQllbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbXMgd2FzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5IiwgZW1wbG95ZWVzLmlzRW1wdHkoKSk7Ci0KLQkJLy8gVGVzdCBhZGRpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQkJLy8gSXQgc2VlbXMgYSBtYW51YWwgc2VsZWN0aW9uIGRvZXNuJ3Qgc2VuZCBhbnkgc2VsZWN0aW9uIGV2ZW50Ci0JCXRhYmxlTW9kZWwudGFibGVTZWxlY3Rpb25DaGFuZ2VkKG51bGwpOwotCi0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgZW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAwIiwgMCwgZW1wbG95ZWVzLnNpemUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKFRhYmxlIHRhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZE1hbmFnZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFRpdGxlKQotCXsKLQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlLmdldEl0ZW0oaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIEVtcGxveWVlIiwgdGFibGVJdGVtKTsKLQotCQlTdHJpbmcgYWN0dWFsTmFtZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtOQU1FX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWROYW1lLCBhY3R1YWxOYW1lKTsKLQotCQlTdHJpbmcgYWN0dWFsVGl0bGUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuVElUTEVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW1RJVExFX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRUaXRsZSwgYWN0dWFsVGl0bGUpOwotCi0JCVN0cmluZyBhY3R1YWxNYW5hZ2VyID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk1BTkFHRVJfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW01BTkFHRVJfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE1hbmFnZXIsIGFjdHVhbE1hbmFnZXIpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgRW1wbG95ZWUgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQlwcml2YXRlIFN0cmluZyBtYW5hZ2VyOwotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIE1BTkFHRVJfUFJPUEVSVFkgPSAibWFuYWdlciI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRV9QUk9QRVJUWSA9ICJ0aXRsZSI7Ci0KLQkJRW1wbG95ZWUoU3RyaW5nIG5hbWUsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1hbmFnZXIpIHsKLQkJCXN1cGVyKCk7Ci0KLQkJCXRoaXMubmFtZSAgICA9IG5hbWU7Ci0JCQl0aGlzLnRpdGxlICAgPSB0aXRsZTsKLQkJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0TWFuYWdlcigpIHsKLQkJCXJldHVybiBtYW5hZ2VyOwotCQl9Ci0KLQkJU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCVN0cmluZyBnZXRUaXRsZSgpIHsKLQkJCXJldHVybiB0aXRsZTsKLQkJfQotCi0JCXZvaWQgc2V0TWFuYWdlcihTdHJpbmcgbWFuYWdlcikgewotCQkJU3RyaW5nIG9sZE1hbmFnZXIgPSB0aGlzLm1hbmFnZXI7Ci0JCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQU5BR0VSX1BST1BFUlRZLCBvbGRNYW5hZ2VyLCBtYW5hZ2VyKTsKLQkJfQotCi0JCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuYW1lKTsKLQkJfQotCi0JCXZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0JCQlTdHJpbmcgb2xkVGl0bGUgPSB0aGlzLnRpdGxlOwotCQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUSVRMRV9QUk9QRVJUWSwgb2xkVGl0bGUsIHRpdGxlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgTWFuYWdlciBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgTGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzOwotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QTE9ZRUVTX0xJU1QgPSAiZW1wbG95ZWVzIjsKLQotCQlNYW5hZ2VyKCkgewotCQkJc3VwZXIoKTsKLQkJCWVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KCk7Ci0JCX0KLQotCQlFbXBsb3llZSBhZGRFbXBsb3llZShFbXBsb3llZSBlbXBsb3llZSkgewotCQkJYWRkSXRlbVRvTGlzdChlbXBsb3llZSwgZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCQlyZXR1cm4gZW1wbG95ZWU7Ci0JCX0KLQotCQlFbXBsb3llZSBhZGRFbXBsb3llZShTdHJpbmcgbmFtZSwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWFuYWdlcikgewotCQkJRW1wbG95ZWUgZW1wbG95ZWUgPSBuZXcgRW1wbG95ZWUobmFtZSwgdGl0bGUsIG1hbmFnZXIpOwotCQkJcmV0dXJuIGFkZEVtcGxveWVlKGVtcGxveWVlKTsKLQkJfQotCi0JCXZvaWQgY2hhbmdlRW1wbG95ZWVzKExpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcykgewotCQkJdGhpcy5lbXBsb3llZXMuY2xlYXIoKTsKLQkJCXRoaXMuZW1wbG95ZWVzLmFkZEFsbChlbXBsb3llZXMpOwotCQkJZmlyZUxpc3RDaGFuZ2VkKEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCUxpc3RJdGVyYXRvcjxFbXBsb3llZT4gZW1wbG95ZWVzKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxFbXBsb3llZT4oZW1wbG95ZWVzKTsKLQkJfQotCi0JCWludCBlbXBsb3llZXNTaXplKCkgewotCQkJcmV0dXJuIGVtcGxveWVlcy5zaXplKCk7Ci0JCX0KLQotCQl2b2lkIG1vdmVFbXBsb3llZURvd24oRW1wbG95ZWUgZW1wbG95ZWUpIHsKLQkJCWludCBpbmRleCA9IGVtcGxveWVlcy5pbmRleE9mKGVtcGxveWVlKTsKLQkJCW1vdmVJdGVtSW5MaXN0KGluZGV4ICsgMSwgaW5kZXgsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCBtb3ZlRW1wbG95ZWVzKENvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlcywgaW50IHRhcmdldEluZGV4KSB7Ci0KLQkJCWludCBzb3VyY2VJbmRleCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCi0JCQlmb3IgKEVtcGxveWVlIGVtcGxveWVlIDogZW1wbG95ZWVzKSB7Ci0JCQkJc291cmNlSW5kZXggPSBNYXRoLm1pbihzb3VyY2VJbmRleCwgdGhpcy5lbXBsb3llZXMuaW5kZXhPZihlbXBsb3llZSkpOwotCQkJfQotCi0JCQltb3ZlSXRlbXNJbkxpc3QoCi0JCQkJdGFyZ2V0SW5kZXgsCi0JCQkJc291cmNlSW5kZXgsCi0JCQkJZW1wbG95ZWVzLnNpemUoKSwKLQkJCQl0aGlzLmVtcGxveWVlcywKLQkJCQlFTVBMT1lFRVNfTElTVAotCQkJKTsKLQkJfQotCi0JCXZvaWQgbW92ZUVtcGxveWVlVXAoRW1wbG95ZWUgZW1wbG95ZWUpIHsKLQkJCWludCBpbmRleCA9IGVtcGxveWVlcy5pbmRleE9mKGVtcGxveWVlKTsKLQkJCW1vdmVJdGVtSW5MaXN0KGluZGV4IC0gMSwgaW5kZXgsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVBbGxFbXBsb3llZXMoKSB7Ci0JCQljbGVhckxpc3QoZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUVtcGxveWVlKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlyZW1vdmVJdGVtRnJvbUxpc3QoZW1wbG95ZWUsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVFbXBsb3llZXMoQ29sbGVjdGlvbjxFbXBsb3llZT4gZW1wbG95ZWVzKSB7Ci0JCQlyZW1vdmVJdGVtc0Zyb21MaXN0KGVtcGxveWVlcy5pdGVyYXRvcigpLCB0aGlzLmVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCByZXBsYWNlKEVtcGxveWVlIG9sZEVtcGxveWVlLCBFbXBsb3llZSBuZXdFbXBsb3llZSkgewotCQkJcmVwbGFjZUl0ZW1Jbkxpc3Qob2xkRW1wbG95ZWUsIG5ld0VtcGxveWVlLCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVDb2x1bW5BZGFwdGVyIGltcGxlbWVudHMgQ29sdW1uQWRhcHRlcjxFbXBsb3llZT4gewotCi0JCXN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gMzsKLQkJc3RhdGljIGZpbmFsIGludCBNQU5BR0VSX0NPTFVNTiA9IDI7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0xVTU4gPSAwOwotCQlzdGF0aWMgZmluYWwgaW50IFRJVExFX0NPTFVNTiA9IDE7Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTWFuYWdlckhvbGRlcihFbXBsb3llZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbXBsb3llZSwgU3RyaW5nPihFbXBsb3llZS5NQU5BR0VSX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TWFuYWdlcigpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXRNYW5hZ2VyKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcihFbXBsb3llZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbXBsb3llZSwgU3RyaW5nPihFbXBsb3llZS5OQU1FX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGl0bGVIb2xkZXIoRW1wbG95ZWUgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIFN0cmluZz4oRW1wbG95ZWUuVElUTEVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRUaXRsZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXRUaXRsZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGNlbGxNb2RlbHMoRW1wbG95ZWUgc3ViamVjdCkgewotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBob2xkZXJzID0gbmV3IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+WzNdOwotCQkJaG9sZGVyc1tOQU1FX0NPTFVNTl0gPSBidWlsZE5hbWVIb2xkZXIoc3ViamVjdCk7Ci0JCQlob2xkZXJzW1RJVExFX0NPTFVNTl0gPSBidWlsZFRpdGxlSG9sZGVyKHN1YmplY3QpOwotCQkJaG9sZGVyc1tNQU5BR0VSX0NPTFVNTl0gPSBidWlsZE1hbmFnZXJIb2xkZXIoc3ViamVjdCk7Ci0JCQlyZXR1cm4gaG9sZGVyczsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQlyZXR1cm4gQ09MVU1OX0NPVU5UOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNvbHVtbkluZGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJRW1wbG95ZWUgZW1wbG95ZWUgPSAoRW1wbG95ZWUpIGVsZW1lbnQ7Ci0KLQkJCWlmIChjb2x1bW5JbmRleCA9PSBUYWJsZUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pIHsKLQkJCQlyZXR1cm4gZW1wbG95ZWUuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlpZiAoY29sdW1uSW5kZXggPT0gVGFibGVDb2x1bW5BZGFwdGVyLlRJVExFX0NPTFVNTikgewotCQkJCXJldHVybiBlbXBsb3llZS5nZXRUaXRsZSgpOwotCQkJfQotCi0JCQlyZXR1cm4gZW1wbG95ZWUuZ2V0TWFuYWdlcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZU1vZGVsIGV4dGVuZHMgVGFibGVNb2RlbEFkYXB0ZXI8RW1wbG95ZWU+IHsKLQotCQlUYWJsZU1vZGVsKExpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyLAotCQkgICAgICAgICAgIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkgICAgICAgICAgIFRhYmxlIHRhYmxlLAotCQkgICAgICAgICAgIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IGNvbHVtbkFkYXB0ZXIsCi0JCSAgICAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJCXN1cGVyKGxpc3RIb2xkZXIsCi0JCQkgICAgICBzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJICAgICAgdGFibGUsCi0JCQkgICAgICBjb2x1bW5BZGFwdGVyLAotCQkJICAgICAgbGFiZWxQcm92aWRlcik7Ci0JCX0KLQotCQlUYWJsZU1vZGVsKExpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyLAotCQkgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgICAgICAgVGFibGUgdGFibGUsCi0JCSAgICAgICAgICAgQ29sdW1uQWRhcHRlcjxFbXBsb3llZT4gY29sdW1uQWRhcHRlciwKLQkJICAgICAgICAgICBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQkJc3VwZXIobGlzdEhvbGRlciwKLQkJCQkJbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEVtcGxveWVlPihzZWxlY3RlZEl0ZW1Ib2xkZXIpLAotCQkJICAgICAgdGFibGUsCi0JCQkgICAgICBjb2x1bW5BZGFwdGVyLAotCQkJICAgICAgbGFiZWxQcm92aWRlcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGludCBpbmRleE9mKEVtcGxveWVlIGl0ZW0pIHsKLQkJCXJldHVybiBzdXBlci5pbmRleE9mKGl0ZW0pOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1zKCkgewotCQkJcmV0dXJuIHN1cGVyLnNlbGVjdGVkSXRlbXMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB0YWJsZVNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyLnRhYmxlU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RleHRGaWVsZE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UZXh0RmllbGRNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4MTI4MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RleHRGaWVsZE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UZXh0RmllbGRNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgZW50cnkgZmllbGRzLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dEZpZWxkTW9kZWxBZGFwdGVyVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTkFNRSA9ICJTY29vYnkgRG9vIjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBuYW1lSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBhbGxDYXBzTmFtZUhvbGRlcjsKLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgVGV4dEZpZWxkTW9kZWxBZGFwdGVyVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0RmllbGRNb2RlbEFkYXB0ZXJVSVRlc3QoU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKERFRkFVTFRfTkFNRSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5uYW1lSG9sZGVyID0gdGhpcy5idWlsZE5hbWVIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmFsbENhcHNOYW1lSG9sZGVyID0gdGhpcy5idWlsZEFsbENhcHNOYW1lSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPih2bSwgVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRBbGxDYXBzTmFtZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFN0cmluZz4odm0sIFRlc3RNb2RlbC5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lKCkudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJcGFyZW50LnNldFNpemUoNDAwLCAxMDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCB0ZXh0RmllbGRQYW5lbCA9IHRoaXMuYnVpbGRUZXh0RmllbGRQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgdGV4dEZpZWxkUGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRleHRGaWVsZFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTM1KTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlYWRPbmx5TmFtZVRleHRGaWVsZChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRBbGxDYXBzTmFtZVRleHRGaWVsZChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5hbWVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSk7Ci0JCVRleHRGaWVsZE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLm5hbWVIb2xkZXIsIHRleHRGaWVsZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVhZE9ubHlOYW1lVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVGV4dCB0ZXh0RmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUpOwotCQl0ZXh0RmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCVRleHRGaWVsZE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLm5hbWVIb2xkZXIsIHRleHRGaWVsZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQWxsQ2Fwc05hbWVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSk7Ci0JCXRleHRGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMuYWxsQ2Fwc05hbWVIb2xkZXIsIHRleHRGaWVsZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2hlY2tCb3hQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkUmVzZXROYW1lQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24ocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlc2V0TmFtZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRSZXNldE5hbWVBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzZXROYW1lQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzZXQgbmFtZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRleHRGaWVsZE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc2V0TmFtZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc2V0IG5hbWUiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXNldE5hbWUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldE5hbWUoREVGQVVMVF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhck1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW50TW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRQcmludE1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicHJpbnQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicHJpbnQgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5hbWU6ICIgKyB0aGlzLnRlc3RNb2RlbC5uYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBjbGFzcyAqKioqKioqKioqCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHVibGljIFRlc3RNb2RlbChTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGI4ODQwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkRlZmF1bHRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlRyaVN0YXRlQ2hlY2tCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiB0cmktc3RhdGUgY2hlY2sgYm94ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZzFIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMkhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IG5vdEZsYWcySG9sZGVyOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdChTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoQm9vbGVhbi5UUlVFLCBCb29sZWFuLkZBTFNFKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLmZsYWcxSG9sZGVyID0gdGhpcy5idWlsZEZsYWcxSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5mbGFnMkhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMubm90RmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkTm90RmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLkZMQUcxX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuaXNGbGFnMSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5pc0ZsYWcyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEZsYWcyKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTm90RmxhZzJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5OT1RfRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5pc05vdEZsYWcyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5vdEZsYWcyKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJcGFyZW50LnNldFNpemUoNDAwLCAxMDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBjaGVja0JveFBhbmVsID0gdGhpcy5idWlsZENoZWNrQm94UGFuZWwobWFpblBhbmVsKTsKLQkJdGhpcy5idWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwsIGNoZWNrQm94UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZENoZWNrQm94UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzUpOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZEZsYWcxQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkRmxhZzJDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGROb3RGbGFnMkNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZFVuYXR0YWNoZWRDaGVja0JveChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsYWcxQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCAiZmxhZyAxIiwgRGVmYXVsdFdpZGdldEZhY3RvcnkuaW5zdGFuY2UoKSk7Ci0JCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuYWRhcHQodGhpcy5mbGFnMUhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsYWcyQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCAiZmxhZyAyIiwgRGVmYXVsdFdpZGdldEZhY3RvcnkuaW5zdGFuY2UoKSk7Ci0JCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuYWRhcHQodGhpcy5mbGFnMkhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5vdEZsYWcyQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCAibmV4dCBmbGFnIDIiLCBEZWZhdWx0V2lkZ2V0RmFjdG9yeS5pbnN0YW5jZSgpKTsKLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLm5vdEZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94KHBhcmVudCwgInVuYXR0YWNoZWQiLCBEZWZhdWx0V2lkZ2V0RmFjdG9yeS5pbnN0YW5jZSgpKTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFVuYXR0YWNoZWRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVW5hdHRhY2hlZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYXR0YWNoZWQgZGVmYXVsdCBzZWxlY3RlZDogIiArIGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hdHRhY2hlZCBzZWxlY3RlZDogIiArIGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGNoZWNrQm94UGFuZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjaGVja0JveFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZEZsaXBGbGFnMUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGlwRmxhZzFCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkRmxpcEZsYWcxQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEZsaXBGbGFnMUFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIm5leHQgZmxhZyAxIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLm5leHRGbGFnMSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIm5leHQgZmxhZyAxIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgbmV4dEZsYWcxKCkgewotCQl0aGlzLnRlc3RNb2RlbC5uZXh0RmxhZzEoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhck1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlc3RvcmVNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzdG9yZSBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZXN0b3JlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRQcmludE1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFByaW50TW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJwcmludCBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicHJpbnQgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMTogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNOb3RGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioiKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgQm9vbGVhbiBmbGFnMTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcxX1BST1BFUlRZID0gImZsYWcxIjsKLQkJcHJpdmF0ZSBCb29sZWFuIGZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzJfUFJPUEVSVFkgPSAiZmxhZzIiOwotCQlwcml2YXRlIEJvb2xlYW4gbm90RmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRkxBRzJfUFJPUEVSVFkgPSAibm90RmxhZzIiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKEJvb2xlYW4gZmxhZzEsIEJvb2xlYW4gZmxhZzIpIHsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSB0aGlzLm5leHQoZmxhZzIpOwotCQl9Ci0JCXByaXZhdGUgQm9vbGVhbiBuZXh0KEJvb2xlYW4gYikgewotCQkJcmV0dXJuIChiID09IG51bGwpID8gQm9vbGVhbi5UUlVFIDogYi5ib29sZWFuVmFsdWUoKSA/IEJvb2xlYW4uRkFMU0UgOiBudWxsOwotCQl9Ci0JCXB1YmxpYyBCb29sZWFuIGlzRmxhZzEoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMShCb29sZWFuIGZsYWcxKSB7Ci0JCQlCb29sZWFuIG9sZCA9IHRoaXMuZmxhZzE7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzFfUFJPUEVSVFksIG9sZCwgZmxhZzEpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG5leHRGbGFnMSgpIHsKLQkJCXRoaXMuc2V0RmxhZzEodGhpcy5uZXh0KHRoaXMuZmxhZzEpKTsKLQkJfQotCQlwdWJsaWMgQm9vbGVhbiBpc0ZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMuZmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RmxhZzIoQm9vbGVhbiBmbGFnMikgewotCQkJQm9vbGVhbiBvbGQgPSB0aGlzLmZsYWcyOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZMQUcyX1BST1BFUlRZLCBvbGQsIGZsYWcyKTsKLQotCQkJb2xkID0gdGhpcy5ub3RGbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSB0aGlzLm5leHQoZmxhZzIpOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PVF9GTEFHMl9QUk9QRVJUWSwgb2xkLCB0aGlzLm5vdEZsYWcyKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBuZXh0RmxhZzIoKSB7Ci0JCQl0aGlzLnNldEZsYWcyKHRoaXMubmV4dCh0aGlzLmZsYWcyKSk7Ci0JCX0KLQkJcHVibGljIEJvb2xlYW4gaXNOb3RGbGFnMigpIHsKLQkJCXJldHVybiB0aGlzLm5vdEZsYWcyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5vdEZsYWcyKEJvb2xlYW4gbm90RmxhZzIpIHsKLQkJCXRoaXMuc2V0RmxhZzIodGhpcy5uZXh0KGZsYWcyKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbmV4dE5vdEZsYWcyKCkgewotCQkJdGhpcy5zZXROb3RGbGFnMih0aGlzLm5leHQodGhpcy5ub3RGbGFnMikpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoIiArIHRoaXMuaXNGbGFnMSgpICsgIiAtICIgKyB0aGlzLmlzRmxhZzIoKSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEFsaWduZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sQWxpZ25lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwOWIxZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sQWxpZ25lclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sQWxpZ25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udHJvbEFsaWduZXJUZXN0IHsKLQotCXByaXZhdGUgQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXI7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLQlwcml2YXRlIExheW91dCBidWlsZFNwYWNlckxheW91dCgpIHsKLQkJcmV0dXJuIG5ldyBMYXlvdXQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0KLQkJCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoSGludCwgaGVpZ2h0SGludCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGNvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJY29tcG9zaXRlLnNldEJvdW5kcygwLCAwLCBkYXRhLndpZHRoSGludCwgZGF0YS5oZWlnaHRIaW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0KLQkJY29udHJvbEFsaWduZXIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQotCQlzaGVsbCAgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0KLQkJaWYgKGNvbnRyb2xBbGlnbmVyICE9IG51bGwpIHsKLQkJCWNvbnRyb2xBbGlnbmVyLmRpc3Bvc2UoKTsKLQkJCWNvbnRyb2xBbGlnbmVyID0gbnVsbDsKLQkJfQotCi0JCWlmIChzaGVsbCAhPSBudWxsKSB7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQlzaGVsbCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb250cm9sMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTlVMTCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbWF4aW11bSB3aWR0aCBzaG91bGQgYmUgMCwiLAotCQkJMCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplID0gbGFiZWwuZ2V0U2l6ZSgpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBzaXplLnggKyAiLCIsCi0JCQlzaXplLngsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2wyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBzaXplLnggKyAiLCIsCi0JCQlzaXplLngsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2wzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyB2ZXJ5IGxvbmcgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiU2hvcnQgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotCi0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2xBbGlnbmVyMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcjIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0KLQkJbGFiZWwxLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQlsYWJlbDIuc2V0VGV4dCgiVGhpcyBpcyBhIHZlcnkgbG9uZyBDb250cm9sQWxpZ25lciIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZTEgPSBsYWJlbDEuZ2V0U2l6ZSgpOwotCQlQb2ludCBzaXplMiA9IGxhYmVsMi5nZXRTaXplKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgubWF4KHNpemUxLngsIHNpemUyLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2xBbGlnbmVyMigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QoZXhwZWN0ZWQ9SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb250cm9sQWxpZ25lclRvSXRzZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcik7Ci0JCWZhaWwoIkEgQ29udHJvbEFsaWduZXIgY2FuJ3QgYmUgYWRkZWQgdG8gaXRzZWxmIik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nX0FkZENvbnRyb2wxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJZmluYWwgaW50W10gbWF4aW11bVdpZHRoID0gbmV3IGludFsxXTsKLQkJZmluYWwgaW50W10gc2l6ZSA9IG5ldyBpbnRbMV07Ci0KLQkJVGl0bGVBcmVhRGlhbG9nIGRpYWxvZyA9IG5ldyBUaXRsZUFyZWFEaWFsb2coU1dUVXRpbC5nZXRTaGVsbCgpKSB7Ci0KLQkJCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQkJbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULkxFRlQpOwotCQkJCWxhYmVsLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQkJCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQkJCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0KLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCb3VuZHMoKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZUJvdW5kcygpOwotCQkJCXNpemVbMF0gPSBsYWJlbC5nZXRTaXplKCkueDsKLQkJCQltYXhpbXVtV2lkdGhbMF0gPSBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKTsKLQkJCX0KLQkJfTsKLQotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5jbG9zZSgpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBzaXplWzBdICsgIiwiLAotCQkJc2l6ZVswXSwKLQkJCW1heGltdW1XaWR0aFswXQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdERpYWxvZ19BZGRDb250cm9sMigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWZpbmFsIGludFtdIG1heGltdW1XaWR0aCA9IG5ldyBpbnRbMV07Ci0JCWZpbmFsIGludFtdIHNpemVzID0gbmV3IGludFsyXTsKLQotCQlUaXRsZUFyZWFEaWFsb2cgZGlhbG9nID0gbmV3IFRpdGxlQXJlYURpYWxvZyhTV1RVdGlsLmdldFNoZWxsKCkpIHsKLQotCQkJcHJpdmF0ZSBCdXR0b24gYnV0dG9uOwotCQkJcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkJCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQlsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTlVMTCk7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkJCWJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQkJCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQkJCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCi0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQm91bmRzKCkgewotCQkJCXN1cGVyLmluaXRpYWxpemVCb3VuZHMoKTsKLQkJCQlzaXplc1swXSA9IGxhYmVsLmdldFNpemUoKS54OwotCQkJCXNpemVzWzFdID0gYnV0dG9uLmdldFNpemUoKS54OwotCQkJCW1heGltdW1XaWR0aFswXSA9IGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpOwotCQkJfQotCQl9OwotCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmNsb3NlKCk7Ci0KLQkJaW50IGxhYmVsU2l6ZSAgPSBzaXplc1swXTsKLQkJaW50IGJ1dHRvblNpemUgPSBzaXplc1sxXTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZSwgYnV0dG9uU2l6ZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCW1heGltdW1XaWR0aFswXQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdERpc3Bvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLQkJUG9pbnQgbGFiZWxTaXplICA9IGxhYmVsLmdldFNpemUoKTsKLQkJUG9pbnQgYnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0JCWludCBtYXggPSBNYXRoLm1heChsYWJlbFNpemUueCwgYnV0dG9uU2l6ZS54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlsYWJlbC5kaXNwb3NlKCk7Ci0KLQkJUG9pbnQgbmV3QnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW5ld0J1dHRvblNpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgQ29udHJvbEFsaWduZXIgZG9lc24ndCBoYXZlIHRoZSByaWdodCBtYXhpbXVtIHdpZHRoIiwKLQkJCW5ld0J1dHRvblNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SGllcmFyY2h5T2ZDb250cm9sQWxpZ25lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBBbGlnbmVyMQotCQkvLyAgXgotCQkvLyAgfC1BbGlnbmVyMgotCQkvLyAgICAgXgotCQkvLyAgICAgfC1BbGlnbmVyMwotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIzID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQoY29udHJvbEFsaWduZXIzKTsKLQotCQkvLyBUZXN0IDEKLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIGxhYmVsIHdpZGdldCIpOwotCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCWludCBsYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJY29udHJvbEFsaWduZXIzLmFkZChsYWJlbDEpOwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGxhYmVsV2lkdGgxKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCksIGxhYmVsV2lkdGgxKTsKLQotCQkvLyBUZXN0IDIKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbDIuc2V0VGV4dCgiU2hvcnRMYWJlbCIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0KLQkJaW50IG5ld0xhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQlpbnQgbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0KLQkJLy8gVGVzdCAzCi0JCUxhYmVsIGxhYmVsMyA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwzLnNldFRleHQoIkEgdmVyeSBsb25nIGxhYmVsIHRoYXQgdGFrZXMgYSBsb3Qgb2YgaG9yaXpvbnRhbCBzcGFjZSIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbDMpOwotCi0JCW5ld0xhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQkJaW50IG5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQotCQkvLyBNYWtlIHN1cmUgYWxsIHRoZSBsb2NrZWQgYXJlIHJlbW92ZWQKLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lciwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lcjIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhDbGFzc1Rvb2xzLmF0dGVtcHRUb0dldEZpZWxkVmFsdWUoY29udHJvbEFsaWduZXIzLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCi0JCS8vIENoYW5nZSB0aGUgdGV4dCBvZiBsYWJlbDIKLQkJbGFiZWwyLnNldFRleHQoIm1tIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMQotCQlsYWJlbDEuc2V0VGV4dCgiYSIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0KLQkJQ29tcG9zaXRlIHBhcmVudDEgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5VTEwpOwotCQlwYXJlbnQxLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlMYWJlbCB0ZW1wTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50MSwgU1dULk5VTEwpOwotCQl0ZW1wTGFiZWwuc2V0VGV4dCgiYSIpOwotLy8JCXBhcmVudDEubGF5b3V0KHRydWUpOwotCi0JCWludCByZWFsV2lkdGggPSB0ZW1wTGFiZWwuZ2V0U2l6ZSgpLng7Ci0KLQkJbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgyID0gbGFiZWwyLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMyA9IGxhYmVsMy5nZXRTaXplKCkueDsKLQotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIzLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgbmV3TGFiZWxXaWR0aDIpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDIsIG5ld0xhYmVsV2lkdGgzKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEZhbHNlKG5ld0xhYmVsV2lkdGgxID09IHJlYWxXaWR0aCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lciwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lcjIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhDbGFzc1Rvb2xzLmF0dGVtcHRUb0dldEZpZWxkVmFsdWUoY29udHJvbEFsaWduZXIzLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCi0JCS8vIENoYW5nZSB0aGUgdGV4dCBvZiBsYWJlbDEKLQkJbGFiZWwxLnNldFRleHQoIlllcyBhbm90aGVyIGJpZyBsb25nIGxvbmcgdGV4dCBzbyB0aGF0IGFsbCB0aGUgbGFiZWxzIHdpbGwgaGF2ZSB0byB0YWtlIHRoZSBzaXplIG9mIHRoaXMgbGFiZWwgdG8gbWFrZSBzdXJlIENvbnRyb2xBbGlnbmVyIHdvcmtzIGNvcnJlY3RseSIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0KLQkJLy8gV2VpcmQ6IEl0IHNlZW1zIG5vIG5vdGlmaWNhdGlvbiBpcyBzZW50LCBmaXJlIG9uZSBtYW51YWxseQotCQlFdmVudCBldmVudCAgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQud2lkZ2V0ID0gbGFiZWwxOwotCQlldmVudC50eXBlICAgPSBTV1QuUmVzaXplOwotCQlsYWJlbDEubm90aWZ5TGlzdGVuZXJzKFNXVC5SZXNpemUsIGV2ZW50KTsKLQotCQlDb21wb3NpdGUgcGFyZW50MiA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTlVMTCk7Ci0JCXBhcmVudDIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRlbXBMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQyLCBTV1QuTlVMTCk7Ci0JCXRlbXBMYWJlbC5zZXRUZXh0KGxhYmVsMS5nZXRUZXh0KCkpOwotCQlwYXJlbnQyLmxheW91dCh0cnVlKTsKLQotCQlyZWFsV2lkdGggPSB0ZW1wTGFiZWwuZ2V0U2l6ZSgpLng7Ci0KLQkJbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgyID0gbGFiZWwyLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMyA9IGxhYmVsMy5nZXRTaXplKCkueDsKLQotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIzLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgbmV3TGFiZWxXaWR0aDIpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDIsIG5ld0xhYmVsV2lkdGgzKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpLCBuZXdMYWJlbFdpZHRoMSk7Ci0JCWFzc2VydEVxdWFscyhyZWFsV2lkdGgsIG5ld0xhYmVsV2lkdGgxKTsKLQotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJY29udHJvbEFsaWduZXIucmVtb3ZlKGJ1dHRvbik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgMCwgIiwKLQkJCTAsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2wyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyB2ZXJ5IGxvbmcgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiU2hvcnQgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLQkJUG9pbnQgbGFiZWxTaXplICA9IGxhYmVsLmdldFNpemUoKTsKLQkJUG9pbnQgYnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0JCWludCBtYXggPSBNYXRoLm1heChsYWJlbFNpemUueCwgYnV0dG9uU2l6ZS54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQljb250cm9sQWxpZ25lci5yZW1vdmUobGFiZWwpOwotCi0JCVBvaW50IG5ld0J1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCi0JCWFzc2VydE5vdFNhbWUoCi0JCQkiVGhlIG9sZCBtYXggYW5kIG5ldyBtYXggc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSIsCi0JCQltYXgsCi0JCQluZXdCdXR0b25TaXplLngKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIENvbnRyb2xBbGlnbmVyIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgbWF4aW11bSB3aWR0aCIsCi0JCQluZXdCdXR0b25TaXplLngsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2w0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIFdpZGdldCAxCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyB2ZXJ5IGxvbmcgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0KLQkJLy8gV2lkZ2V0IDIKLQkJQ29tcG9zaXRlIHNwYWNlciA9IG5ldyBDb21wb3NpdGUocGFuZSwgU1dULk5VTEwpOwotCQlzcGFjZXIuc2V0TGF5b3V0KGJ1aWxkU3BhY2VyTGF5b3V0KCkpOwotCQl1cGRhdGVHcmlkRGF0YShzcGFjZXIpOwotCQljb250cm9sQWxpZ25lci5hZGQoc3BhY2VyKTsKLQotCQkvLyBXaWRnZXQgMwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCi0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIDMgd2lkZ2V0cyBoYXZlIHRoZSBzYW1lIHdpZHRoCi0JCVBvaW50IGxhYmVsU2l6ZSAgPSBsYWJlbC5nZXRTaXplKCk7Ci0JCVBvaW50IHNwYWNlclNpemUgPSBzcGFjZXIuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCQltYXggPSBNYXRoLm1heChtYXgsIHNwYWNlclNpemUueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGFjZXIncyB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCXNwYWNlclNpemUueAotCQkpOwotCi0JCS8vIFJlbW92ZSB0aGUgbGFiZWwgKHRoZSB3aWRlc3Qgd2lkZ2V0KSBhbmQgbWFrZSBzdXJlIHRoZSB3aWR0aCB3YXMKLQkJLy8gY29ycmVjdGx5IGNhbGN1bGF0ZWQKLQkJY29udHJvbEFsaWduZXIucmVtb3ZlKGxhYmVsKTsKLQotCQlzcGFjZXJTaXplID0gc3BhY2VyLmdldFNpemUoKTsKLQkJYnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0JCWludCBtYXgyID0gTWF0aC5tYXgoc3BhY2VyU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydE5vdFNhbWUoCi0JCQkiVGhlIG9sZCBtYXggYW5kIG5ldyBtYXggc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSIsCi0JCQltYXgsCi0JCQltYXgyCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBDb250cm9sQWxpZ25lciBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IG1heGltdW0gd2lkdGgiLAotCQkJbWF4MiwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGFjZXIncyB3aWR0aCBzaG91bGQgaGF2ZSBiZWVuIGFkanVzdGVkIiwKLQkJCW1heDIsCi0JCQlzcGFjZXJTaXplLngKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb250cm9sQWxpZ25lcjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsIGxhYmVsMiA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQl1cGRhdGVHcmlkRGF0YShsYWJlbDEpOwotCQl1cGRhdGVHcmlkRGF0YShsYWJlbDIpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbDEpOwotCi0JCUNvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyMiA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChsYWJlbDIpOwotCi0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJbGFiZWwyLnNldFRleHQoIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgQ29udHJvbEFsaWduZXIiKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUxID0gbGFiZWwxLmdldFNpemUoKTsKLQkJUG9pbnQgc2l6ZTIgPSBsYWJlbDIuZ2V0U2l6ZSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLm1heChzaXplMS54LCBzaXplMi54KTsKLQotCQkvLyBUZXN0IDEKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJLy8gVGVzdCAyCi0JCWNvbnRyb2xBbGlnbmVyLnJlbW92ZShsYWJlbDEpOwotCi0JCXdpZHRoID0gbGFiZWwyLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2xBbGlnbmVyMigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcjIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0KLQkJbGFiZWwxLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQlsYWJlbDIuc2V0VGV4dCgiVGhpcyBpcyBhIHZlcnkgbG9uZyBDb250cm9sQWxpZ25lciIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZTEgPSBsYWJlbDEuZ2V0U2l6ZSgpOwotCQlQb2ludCBzaXplMiA9IGxhYmVsMi5nZXRTaXplKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgubWF4KHNpemUxLngsIHNpemUyLngpOwotCi0JCS8vIFRlc3QgMQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQkvLyBUZXN0IDIKLQkJY29udHJvbEFsaWduZXIyLnJlbW92ZShsYWJlbDIpOwotCi0JCXdpZHRoID0gbGFiZWwxLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb250cm9sIGNvbnRyb2wpIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sRW5hYmxlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDYyY2M5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbEVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udHJvbEVuYWJsZXJUZXN0IHsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFN0YXRlKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyID0KLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4odHJ1ZSk7Ci0KLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSKTsKLQotCQluZXcgQ29udHJvbEVuYWJsZXIoYm9vbGVhbkhvbGRlciwgY29tYm8pOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBiZSBlbmFibGVkIiwKLQkJCWNvbWJvLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIG5vdCBiZSBlbmFibGVkIiwKLQkJCWNvbWJvLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQljb21iby5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDNlMmJjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xTd2l0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sU3dpdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sU3dpdGNoZXJUZXN0IHsKLQotCXByaXZhdGUgUGFnZUJvb2sgcGFnZUJvb2s7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFuZTE7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFuZTI7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYnVpbGRQYW5lMSgpIHsKLQotCQlpZiAocGFuZTEgPT0gbnVsbCkgewotCi0JCQlwYW5lMSA9IG5ldyBDb21wb3NpdGUocGFnZUJvb2ssIFNXVC5OVUxMKTsKLQkJCXBhbmUxLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lMSwgU1dULk5VTEwpOwotCQkJbGFiZWwuc2V0VGV4dCgiJlRlc3QyOiIpOwotCi0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYW5lMSwgU1dULkJPUkRFUik7Ci0JCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYW5lMSwgU1dULkJPUkRFUik7Ci0KLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJfQotCi0JCXJldHVybiBwYW5lMTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZFBhbmUyKCkgewotCi0JCWlmIChwYW5lMiA9PSBudWxsKSB7Ci0KLQkJCXBhbmUyID0gbmV3IENvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5VTEwpOwotCQkJcGFuZTIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUyLCBTV1QuTlVMTCk7Ci0JCQlsYWJlbC5zZXRUZXh0KCImVGVzdDE6Iik7Ci0KLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhbmUyLCBTV1QuQk9SREVSKTsKLQkJCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCX0KLQotCQlyZXR1cm4gcGFuZTI7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6ICh2YWx1ZSA/IHBhbmUxIDogcGFuZTIpOwotCQkJfQotCQl9OwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0KLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0KLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0KLQkJCXBhcmVudCAgID0gbnVsbDsKLQkJCXBhZ2VCb29rID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaCgpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gc3dpdGNoSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPigpOwotCQlUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPiB0cmFuc2Zvcm1lciA9IGJ1aWxkVHJhbnNmb3JtZXIoKTsKLQotCQlwYW5lMSA9IGJ1aWxkUGFuZTEoKTsKLQkJcGFuZTEuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJcGFuZTIgPSBidWlsZFBhbmUyKCk7Ci0JCXBhbmUyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCW5ldyBDb250cm9sU3dpdGNoZXIoCi0JCQlzd2l0Y2hIb2xkZXIsCi0JCQl0cmFuc2Zvcm1lciwKLQkJCXBhZ2VCb29rCi0JCSk7Ci0KLQkJLy8gVGVzdCAxCi0JCXN3aXRjaEhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIENsYXNzVG9vbHMuZmllbGRWYWx1ZShwYWdlQm9vaywgImN1cnJlbnRQYWdlIik7Ci0KLQkJYXNzZXJ0Tm90TnVsbCgKLQkJCSJUaGUgcGFnZSBib29rJ3MgcGFnZSBzaG91bGRuJ3QgYmUgbnVsbCIsCi0JCQljb250cm9sCi0JCSk7Ci0KLQkJYXNzZXJ0U2FtZSgKLQkJCSJUaGUgY3VycmVudCBwYW5lIHNob3VsZCBiZSBwYW5lMSIsCi0JCQlwYW5lMSwKLQkJCWNvbnRyb2wKLQkJKTsKLQotCQlQb2ludCBwYW5lMVNpemUgPSBwYW5lMS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlQb2ludCBwYWdlQm9va1NpemUgPSBwYWdlQm9vay5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggb2YgdGhlIFBhZ2VCb29rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgd2lkdGggb2YgcGFuZTEiLAotCQkJcGFuZTFTaXplLngsCi0JCQlwYWdlQm9va1NpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgaGVpZ2h0IG9mIHRoZSBQYWdlQm9vayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGhlaWdodCBvZiBwYW5lMSIsCi0JCQlwYW5lMVNpemUueSwKLQkJCXBhZ2VCb29rU2l6ZS55Ci0JCSk7Ci0KLQkJLy8gVGVzdCAyCi0JCXN3aXRjaEhvbGRlci5zZXRWYWx1ZShmYWxzZSk7Ci0JCWNvbnRyb2wgPSAoQ29udHJvbCkgQ2xhc3NUb29scy5maWVsZFZhbHVlKHBhZ2VCb29rLCAiY3VycmVudFBhZ2UiKTsKLQotCQlhc3NlcnROb3ROdWxsKAotCQkJIlRoZSBwYWdlIGJvb2sncyBwYWdlIHNob3VsZG4ndCBiZSBudWxsIiwKLQkJCWNvbnRyb2wKLQkJKTsKLQotCQlhc3NlcnRTYW1lKAotCQkJIlRoZSBjdXJyZW50IHBhbmUgc2hvdWxkIGJlIHBhbmUyIiwKLQkJCXBhbmUyLAotCQkJY29udHJvbAotCQkpOwotCi0JCVBvaW50IHBhbmUyU2l6ZSA9IHBhbmUyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCXBhZ2VCb29rU2l6ZSA9IHBhZ2VCb29rLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBvZiB0aGUgUGFnZUJvb2sgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSB3aWR0aCBvZiBwYW5lMiIsCi0JCQlwYW5lMlNpemUueCwKLQkJCXBhZ2VCb29rU2l6ZS54Ci0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBoZWlnaHQgb2YgdGhlIFBhZ2VCb29rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgaGVpZ2h0IG9mIHBhbmUyIiwKLQkJCXBhbmUyU2l6ZS55LAotCQkJcGFnZUJvb2tTaXplLnkKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYWZmMzUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFZpc2liaWxpdHlFbmFibGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbFZpc2liaWxpdHlFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCi0JCW5ldyBDb250cm9sVmlzaWJpbGl0eUVuYWJsZXIoYm9vbGVhbkhvbGRlciwgY29tYm8pOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIHZpc2libGUiLAotCQkJY29tYm8uaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIHZpc2libGUiLAotCQkJY29tYm8uaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQljb21iby5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnB0VWlVdGlsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0pwdFVpVXRpbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxY2ZiMDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnB0VWlVdGlsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5KVW5pdDRUZXN0QWRhcHRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZS5TdWl0ZUNsYXNzZXM7Ci0KLUBTdWl0ZUNsYXNzZXMKLSh7Ci0JQ29udHJvbEFsaWduZXJUZXN0LmNsYXNzLAotCUNvbnRyb2xTd2l0Y2hlclRlc3QuY2xhc3MsCi0JQ29udHJvbEVuYWJsZXJUZXN0LmNsYXNzLAotCUNvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QuY2xhc3MsCi0JTGFiZWxlZEJ1dHRvblRlc3QuY2xhc3MsCi0JTGFiZWxlZExhYmVsVGVzdC5jbGFzcywKLQlMYWJlbGVkQ29udHJvbFVwZGF0ZXJUZXN0LmNsYXNzLAotCVBhbmVFbmFibGVyVGVzdC5jbGFzcywKLQlQYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmNsYXNzLAotfSkKLUBSdW5XaXRoKFN1aXRlLmNsYXNzKQotcHVibGljIGZpbmFsIGNsYXNzIEpwdFVpVXRpbFRlc3RzIHsKLQotCXByaXZhdGUgSnB0VWlVdGlsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBKVW5pdDRUZXN0QWRhcHRlcihKcHRVaVV0aWxUZXN0cy5jbGFzcykpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvblRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNTdkMWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRCdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRCdXR0b25UZXN0IHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQkJcGFyZW50ID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRCdXR0b24xKCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQl9Ci0KLQlAVGVzdChleHBlY3RlZD1Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uY2xhc3MpCi0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRCdXR0b24yKCkgewotCQluZXcgTGFiZWxlZEJ1dHRvbihudWxsKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRCdXR0b24gbGFiZWxlZEJ1dHRvbiA9IG5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0KLQkJCWxhYmVsZWRCdXR0b24uc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBCdXR0b24gZGlkbid0IHJlY2VpdmUgdGhlIEltYWdlIiwKLQkJCQlleHBlY3RlZCwKLQkJCQlidXR0b24uZ2V0SW1hZ2UoKQotCQkJKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlRGlzcG9zZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRCdXR0b24gbGFiZWxlZEJ1dHRvbiA9IG5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0KLQkJCWJ1dHRvbi5kaXNwb3NlKCk7Ci0KLQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBmYWlsIGJ1dCBzaW1wbHkgZG8gbm90aGluZwotCQkJbGFiZWxlZEJ1dHRvbi5zZXRJbWFnZShleHBlY3RlZCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0KCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZEJ1dHRvbiBsYWJlbGVkQnV0dG9uID0gbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQlsYWJlbGVkQnV0dG9uLnNldFRleHQoZXhwZWN0ZWQpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgQnV0dG9uIGRpZG4ndCByZWNlaXZlIHRoZSB0ZXh0IiwKLQkJCWV4cGVjdGVkLAotCQkJYnV0dG9uLmdldFRleHQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHREaXNwb3NlKCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZEJ1dHRvbiBsYWJlbGVkQnV0dG9uID0gbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQotCQlidXR0b24uZGlzcG9zZSgpOwotCi0JCS8vIFRoaXMgc2hvdWxkIG5vdCBmYWlsIGJ1dCBzaW1wbHkgZG8gbm90aGluZwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQlsYWJlbGVkQnV0dG9uLnNldFRleHQoZXhwZWN0ZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIxMzg1Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbFVwZGF0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZENvbnRyb2xVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdCB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJCXBhcmVudCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGltYWdlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oKTsKLQkJCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIobGFiZWxlZExhYmVsLCBudWxsLCBpbWFnZUhvbGRlcik7Ci0KLQkJCWxhYmVsZWRMYWJlbC5zZXRJbWFnZShleHBlY3RlZCk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSBJbWFnZSIsCi0JCQkJZXhwZWN0ZWQsCi0JCQkJbGFiZWwuZ2V0SW1hZ2UoKQotCQkJKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlRGlzcG9zZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGltYWdlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oKTsKLQkJCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIobGFiZWxlZExhYmVsLCBudWxsLCBpbWFnZUhvbGRlcik7Ci0KLQkJCWxhYmVsLmRpc3Bvc2UoKTsKLQkJCWxhYmVsZWRMYWJlbC5zZXRJbWFnZShleHBlY3RlZCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0KCkgewotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIobGFiZWxlZExhYmVsLCB0ZXh0SG9sZGVyKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQl0ZXh0SG9sZGVyLnNldFZhbHVlKGV4cGVjdGVkKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSB0ZXh0IiwKLQkJCWV4cGVjdGVkLAotCQkJbGFiZWwuZ2V0VGV4dCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dERpc3Bvc2UoKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcihsYWJlbGVkTGFiZWwsIHRleHRIb2xkZXIpOwotCi0JCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQl0ZXh0SG9sZGVyLnNldFZhbHVlKGV4cGVjdGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWxUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDBkM2MuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRMYWJlbFRlc3QgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCQlwYXJlbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZEJ1dHRvbjEoKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQluZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQl9Ci0KLQlAVGVzdChleHBlY3RlZD1Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24uY2xhc3MpCi0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRCdXR0b24yKCkgewotCQluZXcgTGFiZWxlZExhYmVsKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCQlsYWJlbGVkTGFiZWwuc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBMYWJlbCBkaWRuJ3QgcmVjZWl2ZSB0aGUgSW1hZ2UiLAotCQkJCWV4cGVjdGVkLAotCQkJCWxhYmVsLmdldEltYWdlKCkKLQkJCSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZURpc3Bvc2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQkJLy8gVGhpcyBzaG91bGQgbm90IGZhaWwgYnV0IHNpbXBseSBkbyBub3RoaW5nCi0JCQlsYWJlbGVkTGFiZWwuc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dCgpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQlsYWJlbGVkTGFiZWwuc2V0VGV4dChleHBlY3RlZCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBMYWJlbCBkaWRuJ3QgcmVjZWl2ZSB0aGUgdGV4dCIsCi0JCQlleHBlY3RlZCwKLQkJCWxhYmVsLmdldFRleHQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHREaXNwb3NlKCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQkvLyBUaGlzIHNob3VsZCBub3QgZmFpbCBidXQgc2ltcGx5IGRvIG5vdGhpbmcKLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJbGFiZWxlZExhYmVsLnNldFRleHQoZXhwZWN0ZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjM3MjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0RGlhbG9nUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIFBhbmVFbmFibGVyVGVzdCB7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hTdGF0ZSgpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciA9Ci0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KHRydWUpOwotCi0JCUFic3RyYWN0RGlhbG9nUGFuZTxOb2RlPiBwYW5lID0gbmV3IEFic3RyYWN0RGlhbG9nUGFuZTxOb2RlPigKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Tm9kZT4oKSwKLQkJCXBhcmVudCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCX0KLQkJfTsKLQotCQlwYW5lLnBvcHVsYXRlKCk7Ci0JCW5ldyBQYW5lRW5hYmxlcihib29sZWFuSG9sZGVyLCBwYW5lKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBiZSBlbmFibGVkIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBub3QgYmUgZW5hYmxlZCIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAodHJ1ZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBiZSBlbmFibGVkIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChmYWxzZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIG5vdCBiZSBlbmFibGVkIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQlwYW5lLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkODhjOWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZVZpc2liaWxpdHlFbmFibGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZVZpc2liaWxpdHlFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3REaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgUGFuZVZpc2liaWxpdHlFbmFibGVyVGVzdCB7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hTdGF0ZSgpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciA9Ci0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KHRydWUpOwotCi0JCUFic3RyYWN0RGlhbG9nUGFuZTxOb2RlPiBwYW5lID0gbmV3IEFic3RyYWN0RGlhbG9nUGFuZTxOb2RlPigKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Tm9kZT4oKSwKLQkJCXBhcmVudCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCX0KLQkJfTsKLQotCQlwYW5lLnBvcHVsYXRlKCk7Ci0JCW5ldyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoYm9vbGVhbkhvbGRlciwgcGFuZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgYmUgdmlzaWJsZSIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAobnVsbCkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgbm90IGJlIHZpc2libGUiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgYmUgdmlzaWJsZSIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAoZmFsc2UpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoZmFsc2UpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBub3QgYmUgdmlzaWJsZSIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIERpc3Bvc2UKLQkJcGFuZS5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5jbGFzc3BhdGggYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4ZDkxYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YmE2MTIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1MjcxZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4ZjljMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEphbiAxNSAxMToxMjoyNiBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRiNWM0Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDo1NTo1OCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjhjZmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IlszLjAuMCw0LjAuMCkiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5ub2RlO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9hYm91dC5odG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlOWMwOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5NTc2OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IEphdmEgUGVyc2lzdGVuY2UgQVBJIFV0aWxpdHkgVGVzdHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9yZXNvdXJjZS9DbGFzc1Rvb2xzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvcmVzb3VyY2UvQ2xhc3NUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWMxN2I2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9yZXNvdXJjZS9DbGFzc1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGVzdDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyByZWxhdGVkIHRvIHRoZSBqYXZhLmxhbmcucmVmbGVjdCBwYWNrYWdlLgotICogVGhlc2UgbWV0aG9kcyBwcm92aWRlIHNob3J0Y3V0cyBmb3IgbWFuaXB1bGF0aW5nIG9iamVjdHMgdmlhCi0gKiByZWZsZWN0aW9uOyBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggZmllbGRzIGFuZC9vciBtZXRob2RzIHRoYXQKLSAqIGFyZSBub3QgcHVibGljbHkgYWNjZXNzaWJsZSBvciBhcmUgaW5oZXJpdGVkLgotICogCi0gKiBJbiBtb3N0IGNhc2VzLCBhbGwgdGhlIGV4Y2VwdGlvbnMgYXJlIGhhbmRsZWQgYW5kCi0gKiB3cmFwcGVkIGluIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uczsgc28gdGhlc2UgbWV0aG9kcyBzaG91bGQKLSAqIGJlIHVzZWQgd2hlbiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHlvdSB3aWxsIG5vdCBoYXZpbmcgYW55IHByb2JsZW1zCi0gKiB1c2luZyByZWZsZWN0aW9uLgotICogCi0gKiBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZiBtZXRob2RzIHdob3NlIG5hbWVzCi0gKiBiZWdpbiB3aXRoICJhdHRlbXB0Ii4gVGhlc2UgbWV0aG9kcyB3aWxsIHRocm93IGEgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gKiBvciBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB3aGVuIGFwcHJvcHJpYXRlLCBhbGxvd2luZyB5b3UgdG8gcHJvYmUKLSAqIGZvciBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgYnV0IG1pZ2h0IG5vdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIFpFUk9fUEFSQU1FVEVSX1RZUEVTID0gbmV3IENsYXNzWzBdOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gWkVST19QQVJBTUVURVJTID0gbmV3IE9iamVjdFswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTdHJpbmdUb29scy5DUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IgPSAnJCc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQVJSQVlfSU5ESUNBVE9SID0gJ1snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX09QRU4gPSAnWyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFRZUEVfREVDTEFSQVRJT05fQVJSQVlfQ0xPU0UgPSAnXSc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUkVGRVJFTkNFX0NMQVNTX0NPREUgPSAnTCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUiA9ICc7JzsKLQkKLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVbXSBQUklNSVRJVkVTOyAgLy8gcHNldWRvLSdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEJZVEVfQ09ERSA9ICdCJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hBUl9DT0RFID0gJ0MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfQ09ERSA9ICdEJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkxPQVRfQ09ERSA9ICdGJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSU5UX0NPREUgPSAnSSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIExPTkdfQ09ERSA9ICdKJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgU0hPUlRfQ09ERSA9ICdTJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQk9PTEVBTl9DT0RFID0gJ1onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBWT0lEX0NPREUgPSAnVic7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPSAtMTsgIC8vIHBzZXVkby0nZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgc3RhdGljIGludCBNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPSAtMTsgIC8vIHBzZXVkby0nZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9DTEFTU19OQU1FID0gdm9pZC5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9XUkFQUEVSX0NMQVNTX05BTUUgPSBqYXZhLmxhbmcuVm9pZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGZpZWxkcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNhbGxGaWVsZHMoKQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBGaWVsZFtdIGFsbEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RhY2s8RmllbGQ+IHN0YWNrID0gbmV3IFN0YWNrPEZpZWxkPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCXB1c2hEZWNsYXJlZEZpZWxkcyh0ZW1wQ2xhc3MsIHN0YWNrKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHN0YWNrKTsKLQkJcmV0dXJuIHN0YWNrLnRvQXJyYXkobmV3IEZpZWxkW3N0YWNrLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBtZXRob2RzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MsIGluY2x1ZGluZyBpbmhlcml0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNhbGxNZXRob2RzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFtdIGFsbE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVN0YWNrPE1ldGhvZD4gc3RhY2sgPSBuZXcgU3RhY2s8TWV0aG9kPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCXB1c2hEZWNsYXJlZE1ldGhvZHModGVtcENsYXNzLCBzdGFjayk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShzdGFjayk7Ci0JCXJldHVybiBzdGFjay50b0FycmF5KG5ldyBNZXRob2Rbc3RhY2suc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBhdHRlbXB0TmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKS5uZXdJbnN0YW5jZShwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIGllKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgaWFlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcykgKyBDUiArIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSwgaXRlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBhdHRlbXB0TmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHROZXdJbnN0YW5jZShqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBnZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBPYmplY3QjZ2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9HZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmllbGQob2JqZWN0LCBmaWVsZE5hbWUpLmdldChvYmplY3QpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBnZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjZ2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9HZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWVsZChqYXZhQ2xhc3MsIGZpZWxkTmFtZSkuZ2V0KG51bGwpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKG1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCByZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBJZiB0aGUgZXhlY3V0ZWQgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIAotCQl0aHJvd3MgVGhyb3dhYmxlLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24obWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgY2xhc3MgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKHN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBzZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlCi0JICogY29udGFpbmluZyBvYmplY3QsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIE9iamVjdCNzZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXR0ZW1wdFRvU2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWZpZWxkKG9iamVjdCwgZmllbGROYW1lKS5zZXQob2JqZWN0LCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gc2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUKLQkgKiBjb250YWluaW5nIGNsYXNzLCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNzZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXR0ZW1wdFRvU2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJZmllbGQoamF2YUNsYXNzLCBmaWVsZE5hbWUpLnNldChudWxsLCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNjb25zdHJ1Y3RvcihDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihwYXJhbWV0ZXJUeXBlcyk7Ci0JCWNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcjsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNjb25zdHJ1Y3RvcihDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI2FjY2Vzc2libGVEZWNsYXJlZEZpZWxkcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZFtdIGRlY2xhcmVkRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlGaWVsZFtdIGZpZWxkcyA9IGphdmFDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7Ci0JCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBmaWVsZHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgbWV0aG9kcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjYWNjZXNzaWJsZURlY2xhcmVkTWV0aG9kcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RbXSBkZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBtZXRob2RzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2RlZmF1bHRDb25zdHJ1Y3RvcigpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZGVmYXVsdENvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZmllbGQoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaWVsZCA9IGphdmFDbGFzcy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQlDbGFzczw/PiBzdXBlcmNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCS8vIHJlY3Vyc2UKLQkJCXJldHVybiBmaWVsZChzdXBlcmNsYXNzLCBmaWVsZE5hbWUpOwotCQl9Ci0JCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZmllbGQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpZWxkKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKENsYXNzPD8+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBudWxsLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoJy4nKTsKLQkJc2IuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QuZ2V0Q2xhc3MoKSwgZmllbGROYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJLy8gdGhpcyBjaGVjayBhbGxvd3MgdXMgdG8gdXNlIHRoaXMgY29kZSBmb3IgY29uc3RydWN0b3JzLCB3aGVyZSB0aGUgbWV0aG9kTmFtZSBpcyBudWxsCi0JCWlmIChtZXRob2ROYW1lICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZCgnLicpOwotCQkJc2IuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlpbnQgbWF4ID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMTsKLQkJaWYgKG1heCAhPSAtMSkgewotCQkJLy8gc3RvcCBvbmUgc2hvcnQgb2YgdGhlIGVuZCBvZiB0aGUgYXJyYXkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIiwgIik7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbbWF4XS5nZXROYW1lKCkpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKHJlY2VpdmVyLmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIE9iamVjdCNnZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShvYmplY3QsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI2dldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBzdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0dldFN0YXRpY0ZpZWxkVmFsdWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIG9uZS1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lKSAKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBvbmUtYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIAotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIAotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIENvbnZlcnQgZXhjZXB0aW9ucyB0byBSdW50aW1lRXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdCByZWNlaXZlciwgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIG1ldGhvZC5pbnZva2UocmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBtZXRob2QsIGlhZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXRob2QgKyBDUiArIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSwgaXRlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBDb252ZXJ0IGFsbCBvdGhlciBleGNlcHRpb25zIHRvIFJ1bnRpbWVFeGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE1ldGhvZCBtZXRob2QsIE9iamVjdCByZWNlaXZlciwgT2JqZWN0W10gcGFyYW1ldGVycykKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJdHJ5IHsKLQkJCXJldHVybiBtZXRob2QuaW52b2tlKHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgbWV0aG9kLCBpYWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJVGhyb3dhYmxlIGNhdXNlID0gaXRlLmdldENhdXNlKCk7Ci0JCQlpZiAoY2F1c2UgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1ldGhvZC50b1N0cmluZygpLCBpdGUpOwotCQkJfQotCQkJdGhyb3cgY2F1c2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IHN0YXRpYyBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIGNsYXNzIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBzdGF0aWMgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIENvbnZlcnQgZXhjZXB0aW9ucyB0byBSdW50aW1lRXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QobWV0aG9kLCBudWxsLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1ldGhvZCA9IGphdmFDbGFzcy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJQ2xhc3M8Pz4gc3VwZXJjbGFzcyA9IGphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCQkvLyByZWN1cnNlCi0JCQlyZXR1cm4gbWV0aG9kKHN1cGVyY2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCwgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2xhc3MgKHdpdGhvdXQgdGhlIGNoZWNrZWQgZXhjZXB0aW9uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihjbGFzc05hbWUsIGV4KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBjbGFzc0xvYWRlcikpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0TmV3SW5zdGFuY2UoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycywgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGNsYXNzTG9hZGVyKSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBwYXJhbWV0ZXJUeXBlLCBwYXJhbWV0ZXIsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyKSwgcGFyYW1ldGVyVHlwZSwgcGFyYW1ldGVyKTsKLQl9Ci0JCi0JLyoKLQkgKiBQdXNoIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHVzaERlY2xhcmVkRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcywgU3RhY2s8RmllbGQ+IHN0YWNrKSB7Ci0JCUZpZWxkW10gZmllbGRzID0gZGVjbGFyZWRGaWVsZHMoamF2YUNsYXNzKTsKLQkJZm9yIChpbnQgaSA9IGZpZWxkcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJc3RhY2sucHVzaChmaWVsZHNbaV0pOwotCQl9Ci0JfQotCQotCS8qCi0JICogUHVzaCB0aGUgZGVjbGFyZWQgbWV0aG9kcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIG9udG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXNoRGVjbGFyZWRNZXRob2RzKENsYXNzPD8+IGphdmFDbGFzcywgU3RhY2s8TWV0aG9kPiBzdGFjaykgewotCQlNZXRob2RbXSBtZXRob2RzID0gZGVjbGFyZWRNZXRob2RzKGphdmFDbGFzcyk7Ci0JCWZvciAoaW50IGkgPSBtZXRob2RzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlzdGFjay5wdXNoKG1ldGhvZHNbaV0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBPYmplY3Qjc2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgewotCQl0cnkgewotCQkJYXR0ZW1wdFRvU2V0RmllbGRWYWx1ZShvYmplY3QsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcywgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI3NldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgewotCQl0cnkgewotCQkJYXR0ZW1wdFRvU2V0U3RhdGljRmllbGRWYWx1ZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBvYmplY3QncyBjbGFzcy4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHNob3J0TmFtZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIk9iamVjdCIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnROYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIk9iamVjdCIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnROYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gc2hvcnROYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0ZWQgbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MuCi0JICogQ2xhc3MjZ2V0TmVzdGVkTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmVzdGVkQ2xhc3NOYW1lRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG5lc3RlZE5hbWVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiRW50cnkiKS4KLQkgKiBDbGFzcyNnZXROZXN0ZWROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXN0ZWROYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpICsgMSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGVkIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJFbnRyeSIpLgotCSAqIENsYXNzI2dldE5lc3RlZE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZE5hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXN0ZWROYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAidG9TdHJpbmcoKSIgbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdDbGFzc05hbWVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdG9TdHJpbmdOYW1lRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAidG9TdHJpbmcoKSIgbmFtZSBvZiB0aGUgY2xhc3MuCi0JICogIk1lbWJlciIgY2xhc3NlcyB3aWxsIHJldHVybiBvbmx5IHRoZSBmaW5hbCBuYW1lOgotCSAqICAgICAiY29tLmZvby5iYXIuVG9wTGV2ZWxDbGFzcyRNZW1iZXJDbGFzcyROZXN0ZWRNZW1iZXJDbGFzcyIKLQkgKiAgICAgICAgID0+ICJOZXN0ZWRNZW1iZXJDbGFzcyIKLQkgKiAiTG9jYWwiIGFuZCAiYW5vbnltb3VzIiBjbGFzc2VzIHdpbGwgc3RpbGwgcmV0dXJuIHRoZSBlbWJlZGRlZCAnJCdzOgotCSAqICAgICAiY29tLmZvby5iYXIuVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyIKLQkgKiAgICAgICAgID0+ICJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIgotCSAqICAgICAiY29tLmZvby5iYXIuVG9wTGV2ZWxDbGFzcyQxIgotCSAqICAgICAgICAgPT4gIlRvcExldmVsQ2xhc3MkMSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ05hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZWRJc01lbWJlcihjbGFzc05hbWUpID8KLQkJCWNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUikgKyAxKQotCQk6Ci0JCQljbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgInRvU3RyaW5nKCkiIG5hbWUgb2YgdGhlIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHRvU3RyaW5nTmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiamF2YS5sYW5nIikuCi0JICogQ2xhc3MjZ2V0UGFja2FnZU5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2thZ2VOYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gcGFja2FnZU5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gImphdmEubGFuZyIpLgotCSAqIENsYXNzI2dldFBhY2thZ2VOYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrYWdlTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgbGFzdFBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAobGFzdFBlcmlvZCA9PSAtMSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGxhc3RQZXJpb2QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzLAotCSAqIGZvbGxvd2VkIGJ5IGl0cyBwYWNrYWdlIG5hbWUgKGUuZy4gIk9iamVjdCAoamF2YS5sYW5nKSIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZVdpdGhQYWNrYWdlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydE5hbWVXaXRoUGFja2FnZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChzaG9ydE5hbWVGb3IoamF2YUNsYXNzKSk7Ci0JCWlmICggISBqYXZhQ2xhc3MuaXNQcmltaXRpdmUoKSkgewotCQkJc2IuYXBwZW5kKCIgKCIpOwotCQkJc2IuYXBwZW5kKHBhY2thZ2VOYW1lRm9yKGphdmFDbGFzcykpOwotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50LCBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIHN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCXJldHVybiBtZXRob2Q7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbihmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlc30pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgY2FuIGJlICJkZWNsYXJlZCIgaW4gY29kZTsKLQkgKiBpLmUuIGl0IGlzIGVpdGhlciBhICJ0b3AtbGV2ZWwiIGNsYXNzIG9yIGEgIm1lbWJlciIgY2xhc3MsIGJ1dCBpdAotCSAqIGlzIG5vdCBhbiAiYXJyYXkiIGNsYXNzLiBUaGlzIG1ldGhvZCByb2xscyB0b2dldGhlciBhbGwgdGhlIGNoZWNrcwotCSAqIGZyb20gdGhlIG90aGVyIG1ldGhvZHMgZm9yIGEgYml0IG9mIGEgcGVyZm9ybWFuY2UgdHdlYWsuCi0JICogQ2xhc3MjaXNEZWNsYXJhYmxlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzRGVjbGFyYWJsZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWUuY2hhckF0KDApID09IEFSUkFZX0lORElDQVRPUikgewotCQkJcmV0dXJuIGZhbHNlOwkJLy8gaXQgaXMgYW4gImFycmF5IiBjbGFzcwotCQl9Ci0JCWludCBpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIHRydWU7CQkvLyBpdCBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJZG8gewotCQkJLy8gdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlciBlYWNoIGRvbGxhciBzaWduIGNhbm5vdCBiZSBhIGRpZ2l0Ci0JCQlpbmRleCsrOwotCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaW5kZXgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SLCBpbmRleCk7Ci0JCX0gd2hpbGUgKGluZGV4ICE9IC0xKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidG9wLWxldmVsIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgIm1lbWJlciIsICJsb2NhbCIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgZG9lcyBOT1QgY29udGFpbiBhICckJzogIlRvcExldmVsQ2xhc3MiKS4KLQkgKiBDbGFzcyNpc1RvcExldmVsKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzVG9wTGV2ZWwoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpID09IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAibWVtYmVyIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJsb2NhbCIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgY29udGFpbnMgYXQgbGVhc3Qgb25lICckJyBhbmQgYWxsIHRoZSBuYW1lcyBiZXR3ZWVuCi0JICogZWFjaCAnJCcgYXJlIGxlZ2FsIGNsYXNzIG5hbWVzOgotCSAqICJUb3BMZXZlbENsYXNzJE1lbWJlckNsYXNzJE5lc3RlZE1lbWJlckNsYXNzIikuCi0JICogQ2xhc3MjaXNNZW1iZXIoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNNZW1iZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwkvLyBpdCBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJZG8gewotCQkJLy8gdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlciBlYWNoIGRvbGxhciBzaWduIGNhbm5vdCBiZSBhIGRpZ2l0Ci0JCQlpbmRleCsrOwotCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaW5kZXgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SLCBpbmRleCk7Ci0JCX0gd2hpbGUgKGluZGV4ICE9IC0xKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJsb2NhbCIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibWVtYmVyIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayAob3IgRWNsaXBzZSkgbmFtaW5nIGNvbnZlbnRpb25zLgotCSAqIEluIHRoZSBqZGssIHRoZSBjbGFzcyBuYW1lIGVuZHMgd2l0aCAnJG5ublhYWCcgd2hlcmUgdGhlICckJyBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIG51bWVyaWMgZGlnaXRzIHdoaWNoIGFyZSBmb2xsb3dlZCBieSB0aGUKLQkgKiBsb2NhbCBjbGFzcyBuYW1lOiAiVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyIuCi0JICogSW4gRWNsaXBzZSwgdGhlIGNsYXNzIG5hbWUgZW5kcyB3aXRoICckbm5uJFhYWCcgd2hlcmUgdGhlICckJyBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIG51bWVyaWMgZGlnaXRzIHdoaWNoIGFyZSBzZXBhcmF0ZWQgZnJvbQotCSAqIHRoZSBsb2NhbCBjbGFzcyBuYW1lIGJ5IGFub3RoZXIgJyQnOiAiVG9wTGV2ZWxDbGFzcyQxJExvY2FsQ2xhc3MiLgotCSAqIENsYXNzI2lzTG9jYWwoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNMb2NhbChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGRvbGxhciA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChkb2xsYXIgPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoICEgQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChkb2xsYXIgKyAxKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgbGVuID0gY2xhc3NOYW1lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gZG9sbGFyICsgMjsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjbGFzc05hbWUuY2hhckF0KGkpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAkIGFyZSBkaWdpdHMgKGFub255bW91cykKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gImFub255bW91cyIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibWVtYmVyIiwgb3IgImxvY2FsIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIG5hbWluZyBjb252ZW50aW9ucyAoaS5lLiB0aGUgY2xhc3MKLQkgKiBuYW1lIGVuZHMgd2l0aCAnJG5ubicgd2hlcmUgYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlCi0JICogbGFzdCAnJCcgYXJlIG51bWVyaWMgZGlnaXRzOiAiVG9wTGV2ZWxDbGFzcyQxIikuCi0JICogQ2xhc3MjaXNBbm9ueW1vdXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNBbm9ueW1vdXMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBkb2xsYXIgPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpOwotCQlpZiAoZG9sbGFyID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IHN0YXJ0ID0gZG9sbGFyICsgMTsKLQkJZm9yIChpbnQgaSA9IGNsYXNzTmFtZS5sZW5ndGgoKTsgaS0tID4gc3RhcnQ7ICkgewotCQkJaWYgKCAhIENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAkIGFyZSBkaWdpdHMKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYXJyYXkgZGVwdGgiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgaGF2ZSBhIGRlcHRoIG9mIHplcm8uCi0JICogQ2xhc3MjZ2V0QXJyYXlEZXB0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJd2hpbGUgKGphdmFDbGFzcy5pc0FycmF5KCkpIHsKLQkJCWRlcHRoKys7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYXJyYXkgZGVwdGgiIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFRoZSBkZXB0aCBpcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5LgotCSAqIE5vbi1hcnJheXMgaGF2ZSBhIGRlcHRoIG9mIHplcm8uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBhcnJheURlcHRoRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYXJyYXkgZGVwdGgiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgaGF2ZSBhIGRlcHRoIG9mIHplcm8uCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICogQ2xhc3MjZ2V0QXJyYXlEZXB0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgZGVwdGggPSAwOwotCQl3aGlsZSAoY2xhc3NOYW1lLmNoYXJBdChkZXB0aCkgPT0gQVJSQVlfSU5ESUNBVE9SKSB7Ci0JCQlkZXB0aCsrOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGFuIGFycmF5IHR5cGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0FycmF5KFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5jaGFyQXQoMCkgPT0gQVJSQVlfSU5ESUNBVE9SOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIEEgbm9uLWFycmF5IHR5cGUgc2ltcGx5IHJldHVybnMgaXRzZWxmLgotCSAqIENsYXNzI2dldEVsZW1lbnRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGVsZW1lbnRUeXBlRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQl3aGlsZSAoamF2YUNsYXNzLmlzQXJyYXkoKSkgewotCQkJamF2YUNsYXNzID0gamF2YUNsYXNzLmdldENvbXBvbmVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gamF2YUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkuCi0JICogQSBub24tYXJyYXkgc2ltcGx5IHJldHVybnMgaXRzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZWxlbWVudFR5cGVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZWxlbWVudFR5cGVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBzaW1wbHkgcmV0dXJuIHRoZW1zZWx2ZXMuCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGVsZW1lbnRUeXBlRm9yKGphdmFDbGFzcykuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBzaW1wbHkgcmV0dXJuIHRoZW1zZWx2ZXMuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgZGVwdGggPSBhcnJheURlcHRoRm9yQ2xhc3NOYW1lZChjbGFzc05hbWUpOwotCQlpZiAoZGVwdGggPT0gMCkgewotCQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJqYXZhLmxhbmcuT2JqZWN0IiBvciAiaW50IgotCQkJcmV0dXJuIGNsYXNzTmFtZTsKLQkJfQotCQlpbnQgbGFzdCA9IGNsYXNzTmFtZS5sZW5ndGgoKSAtIDE7Ci0JCWlmIChjbGFzc05hbWUuY2hhckF0KGRlcHRoKSA9PSBSRUZFUkVOQ0VfQ0xBU1NfQ09ERSkgewotCQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJbW1tMamF2YS5sYW5nLk9iamVjdDsiCi0JCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhkZXB0aCArIDEsIGxhc3QpOwkvLyBkcm9wIHRoZSB0cmFpbGluZyAnOycKLQkJfQotCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0kiCi0JCXJldHVybiBjbGFzc05hbWVGb3JDb2RlKGNsYXNzTmFtZS5jaGFyQXQobGFzdCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInJlZmVyZW5jZSIKLQkgKiBjbGFzcyAoaS5lLiBuZWl0aGVyICd2b2lkJyBub3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgY2xhc3NlcywKLQkgKiBbJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNSZWZlcmVuY2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gISBjbGFzc05hbWVkSXNQcmltaXRpdmUoY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ3ZvaWQnIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIGNsYXNzZXMsCi0JICogWydib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzUHJpbWl0aXZlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkgfHwgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuLCBidXQgbm90ICd2b2lkJykuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZShjbGFzc05hbWUpCi0JCQkmJiAoICEgY2xhc3NOYW1lLmVxdWFscyhWT0lEX0NMQVNTX05BTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiAnamF2YS5sYW5nLlZvaWQnIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIHdyYXBwZXIgY2xhc3NlcywKLQkgKiBbJ2phdmEubGFuZy5Cb29sZWFuJywgJ2phdmEubGFuZy5JbnRlZ2VyJywgJ2phdmEubGFuZy5GbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzUHJpbWl0aXZlV3JhcHBlckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkgfHwgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IG1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLndyYXBwZXJDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLiwgYnV0IG5vdCAndm9pZCcpLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWVkSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoY2xhc3NOYW1lKQotCQkJJiYgKCAhIGNsYXNzTmFtZS5lcXVhbHMoVk9JRF9XUkFQUEVSX0NMQVNTX05BTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiAnamF2YS5sYW5nLlZvaWQnIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIHdyYXBwZXIgY2xhc3NlcywKLQkgKiBbJ2phdmEubGFuZy5Cb29sZWFuJywgJ2phdmEubGFuZy5JbnRlZ2VyJywgJ2phdmEubGFuZy5GbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaWYgKGphdmFDbGFzcy5pc0FycmF5KCkgfHwgKGphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCkgPiBtYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS53cmFwcGVyQ2xhc3MgPT0gamF2YUNsYXNzKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICdib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy4sIGJ1dCBub3QgJ3ZvaWQnKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhQ2xhc3MpCi0JCQkmJiAoamF2YUNsYXNzICE9IGphdmEubGFuZy5Wb2lkLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JDb2RlKGNoYXIgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBjbGFzc0ZvckNvZGUoY2xhc3NDb2RlKS5nZXROYW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvckNvZGUoaW50IGNsYXNzQ29kZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lRm9yQ29kZSgoY2hhcikgY2xhc3NDb2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JDb2RlKGNoYXIgY2xhc3NDb2RlKSB7Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS5jb2RlID09IGNsYXNzQ29kZSkgewotCQkJCXJldHVybiBjb2Rlc1tpXS5qYXZhQ2xhc3M7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihjbGFzc0NvZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvckNvZGUoaW50IGNsYXNzQ29kZSkgewotCQlyZXR1cm4gY2xhc3NGb3JDb2RlKChjaGFyKSBjbGFzc0NvZGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGNvZGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGNvZGVGb3JDbGFzcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaWYgKCggISBqYXZhQ2xhc3MuaXNBcnJheSgpKSAmJiAoamF2YUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcyA9PSBqYXZhQ2xhc3MpIHsKLQkJCQkJcmV0dXJuIGNvZGVzW2ldLmNvZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oamF2YUNsYXNzLmdldE5hbWUoKSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBjb2RlRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmICgoICEgY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgJiYgKGNsYXNzTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQkJcmV0dXJuIGNvZGVzW2ldLmNvZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY2xhc3NOYW1lKTsJCQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uLCBDbGFzc1Rvb2xzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odGQuZWxlbWVudFR5cGVOYW1lLCB0ZC5hcnJheURlcHRoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJdHlwZURlY2xhcmF0aW9uID0gU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pOwotCQlpbnQgYXJyYXlEZXB0aCA9IGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbik7Ci0JCVN0cmluZyBlbGVtZW50VHlwZU5hbWUgPSB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKDAsIHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIChhcnJheURlcHRoICogMikpOwotCQlyZXR1cm4gbmV3IFR5cGVEZWNsYXJhdGlvbihlbGVtZW50VHlwZU5hbWUsIGFycmF5RGVwdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCS8vIHNlZSB0aGUgIkV2YWx1YXRpb24iIG9mIGpkayBidWcgNjQ0NjYyNyBmb3IgYSBkaXNjdXNzaW9uIG9mIGxvYWRpbmcgY2xhc3NlcwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCS8vIHByaW1pdGl2ZXMgY2Fubm90IGJlIGxvYWRlZCB2aWEgQ2xhc3MjZm9yTmFtZSgpLAotCQkvLyBzbyBjaGVjayBmb3IgYSBwcmltaXRpdmUgY2xhc3MgbmFtZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gY29kZXNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gKHBjYyA9PSBudWxsKSA/IENsYXNzLmZvck5hbWUoZWxlbWVudFR5cGVOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpIDogcGNjLmphdmFDbGFzczsKLQkJfQotCi0JCS8vIGFycmF5Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlmb3IgKGludCBpID0gYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoQVJSQVlfSU5ESUNBVE9SKTsKLQkJfQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfQ09ERSk7Ci0JCQlzYi5hcHBlbmQoZWxlbWVudFR5cGVOYW1lKTsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfTkFNRV9ERUxJTUlURVIpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKHBjYy5jb2RlKTsKLQkJfQotCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShzYi50b1N0cmluZygpLCBmYWxzZSwgY2xhc3NMb2FkZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuCi0JICogICAgICJpbnRbXSIgLT4gIltJIgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKHRkLmVsZW1lbnRUeXBlTmFtZSwgdGQuYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBkZXB0aCBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy4KLQkgKiAgICAgImludFtdIiAtPiAxCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHR5cGVEZWNsYXJhdGlvbikpOwotCX0KLQotCS8qCi0JICogQXNzdW1lIG5vIHdoaXRlc3BhY2UgaW4gdGhlIHR5cGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJaW50IGxhc3QgPSB0eXBlRGVjbGFyYXRpb24ubGVuZ3RoKCkgLSAxOwotCQlpbnQgZGVwdGggPSAwOwotCQlpbnQgY2xvc2UgPSBsYXN0OwotCQl3aGlsZSAodHlwZURlY2xhcmF0aW9uLmNoYXJBdChjbG9zZSkgPT0gVFlQRV9ERUNMQVJBVElPTl9BUlJBWV9DTE9TRSkgewotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQoY2xvc2UgLSAxKSA9PSBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX09QRU4pIHsKLQkJCQlkZXB0aCsrOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHR5cGUgZGVjbGFyYXRpb246ICIgKyB0eXBlRGVjbGFyYXRpb24pOwotCQkJfQotCQkJY2xvc2UgPSBsYXN0IC0gKGRlcHRoICogMik7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQkvLyBub24tYXJyYXkKLQkJaWYgKGFycmF5RGVwdGggPT0gMCkgewotCQkJcmV0dXJuIGVsZW1lbnRUeXBlTmFtZTsKLQkJfQotCi0JCWlmIChlbGVtZW50VHlwZU5hbWUuZXF1YWxzKFZPSURfQ0xBU1NfTkFNRSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIiciICsgVk9JRF9DTEFTU19OQU1FICsgIicgbXVzdCBoYXZlIGFuIGFycmF5IGRlcHRoIG9mIHplcm86ICIgKyBhcnJheURlcHRoICsgJy4nKTsKLQkJfQotCQkvLyBhcnJheQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwKTsKLQkJZm9yIChpbnQgaSA9IGFycmF5RGVwdGg7IGktLSA+IDA7ICkgewotCQkJc2IuYXBwZW5kKEFSUkFZX0lORElDQVRPUik7Ci0JCX0KLQotCQkvLyBsb29rIGZvciBhIHByaW1pdGl2ZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gY29kZXNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChwY2MgPT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19DT0RFKTsKLQkJCXNiLmFwcGVuZChlbGVtZW50VHlwZU5hbWUpOwotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaWYgKE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPT0gLTEpIHsKLQkJCU1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPSBjYWxjdWxhdGVNYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY2FsY3VsYXRlTWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpbnQgbWF4ID0gLTE7Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWludCBsZW4gPSBjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA+IG1heCkgewotCQkJCW1heCA9IGxlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBtYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpZiAoTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIID09IC0xKSB7Ci0JCQlNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPSBjYWxjdWxhdGVNYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIE1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY2FsY3VsYXRlTWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaW50IG1heCA9IC0xOwotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpbnQgbGVuID0gY29kZXNbaV0ud3JhcHBlckNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPiBtYXgpIHsKLQkJCQltYXggPSBsZW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVbXSBwcmltaXRpdmVzKCkgewotCQlpZiAoUFJJTUlUSVZFUyA9PSBudWxsKSB7Ci0JCQlQUklNSVRJVkVTID0gYnVpbGRQcmltaXRpdmVzKCk7Ci0JCX0KLQkJcmV0dXJuIFBSSU1JVElWRVM7Ci0JfQotCQotCS8qKgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVtdIGJ1aWxkUHJpbWl0aXZlcygpIHsKLQkJUHJpbWl0aXZlW10gcmVzdWx0ID0gbmV3IFByaW1pdGl2ZVs5XTsKLQkJcmVzdWx0WzBdID0gbmV3IFByaW1pdGl2ZShCWVRFX0NPREUsIGphdmEubGFuZy5CeXRlLmNsYXNzKTsKLQkJcmVzdWx0WzFdID0gbmV3IFByaW1pdGl2ZShDSEFSX0NPREUsIGphdmEubGFuZy5DaGFyYWN0ZXIuY2xhc3MpOwotCQlyZXN1bHRbMl0gPSBuZXcgUHJpbWl0aXZlKERPVUJMRV9DT0RFLCBqYXZhLmxhbmcuRG91YmxlLmNsYXNzKTsKLQkJcmVzdWx0WzNdID0gbmV3IFByaW1pdGl2ZShGTE9BVF9DT0RFLCBqYXZhLmxhbmcuRmxvYXQuY2xhc3MpOwotCQlyZXN1bHRbNF0gPSBuZXcgUHJpbWl0aXZlKElOVF9DT0RFLCBqYXZhLmxhbmcuSW50ZWdlci5jbGFzcyk7Ci0JCXJlc3VsdFs1XSA9IG5ldyBQcmltaXRpdmUoTE9OR19DT0RFLCBqYXZhLmxhbmcuTG9uZy5jbGFzcyk7Ci0JCXJlc3VsdFs2XSA9IG5ldyBQcmltaXRpdmUoU0hPUlRfQ09ERSwgamF2YS5sYW5nLlNob3J0LmNsYXNzKTsKLQkJcmVzdWx0WzddID0gbmV3IFByaW1pdGl2ZShCT09MRUFOX0NPREUsIGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKTsKLQkJcmVzdWx0WzhdID0gbmV3IFByaW1pdGl2ZShWT0lEX0NPREUsIGphdmEubGFuZy5Wb2lkLmNsYXNzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQ2xhc3NUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFByaW1pdGl2ZSB7Ci0JCWZpbmFsIGNoYXIgY29kZTsKLQkJZmluYWwgQ2xhc3M8Pz4gamF2YUNsYXNzOwotCQlmaW5hbCBDbGFzczw/PiB3cmFwcGVyQ2xhc3M7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVSX0NMQVNTX1RZUEVfRklFTERfTkFNRSA9ICJUWVBFIjsKLQkJLy8gZS5nLiBqYXZhLmxhbmcuQm9vbGVhbi5UWVBFID0+IGJvb2xlYW4uY2xhc3MKLQkJUHJpbWl0aXZlKGNoYXIgY29kZSwgQ2xhc3M8Pz4gd3JhcHBlckNsYXNzKSB7Ci0JCQl0aGlzLmNvZGUgPSBjb2RlOwotCQkJdGhpcy53cmFwcGVyQ2xhc3MgPSB3cmFwcGVyQ2xhc3M7Ci0JCQl0aGlzLmphdmFDbGFzcyA9IChDbGFzczw/Pikgc3RhdGljRmllbGRWYWx1ZSh3cmFwcGVyQ2xhc3MsIFdSQVBQRVJfQ0xBU1NfVFlQRV9GSUVMRF9OQU1FKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVEZWNsYXJhdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBlbGVtZW50VHlwZU5hbWU7Ci0JCWZpbmFsIGludCBhcnJheURlcHRoOwotCQlUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJCXRoaXMuZWxlbWVudFR5cGVOYW1lID0gZWxlbWVudFR5cGVOYW1lOwotCQkJdGhpcy5hcnJheURlcHRoID0gYXJyYXlEZXB0aDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaXRUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpdFRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyZTliOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpdFRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQml0VG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBCaXRUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGbGFnSXNTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc1NldCgweDAwMDAsIDB4MTEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGbGFnSXNPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc09mZigweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5mbGFnSXNPZmYoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc09mZigweDAzMDMsIDB4MDEwMykpOwotCi0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MjIwNCwgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnSXNTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDAwMSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAxLCAweDAwMDEpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAxMDEsIDB4MDEwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMzAzLCAweDAxMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgxMTAzLCAweDExMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAxMDMsIDB4MDEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ0lzT2ZmSW50SW50KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4RkZGRkZGRkUsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4RkZGRkZFRkUsIDB4MDEwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMzAzLCAweDAxMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4RkZGRkZFRkMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4RkZGRkVFRkMsIDB4MTEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxGbGFnc0FyZVNldEludEludCgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlT2ZmSW50SW50KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIDB4MDEwMykpOwotCi0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgyMjA0LCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDAsIDB4MTEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDEsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDEsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDEsIDB4MDEwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDExMDMsIDB4MTEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDAsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDMsIDB4MDEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRkZGRSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkUsIDB4MDEwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRUZDLCAweDAxMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRUVGQywgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFueUZsYWdzQXJlU2V0SW50SW50KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHhGRkZGLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAwMDMsIDB4RkZGRikpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDMwMywgMHgxMDEwKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMCwgMHhGRkZGKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFueUZsYWdzQXJlT2ZmSW50SW50KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4MzMzRSwgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHhGRkZFLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAwMDMsIDB4RkZGRikpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4NzM3MywgMHgxMDEwKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4RkZGRiwgMHhGRkZGKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlU2V0SW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMDAzLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgxMDAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMDAwLCBuZXcgaW50W10geyAweDEwMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxGbGFnc0FyZU9mZkludEludEFycmF5KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwNDAwLCAweDAwMjAsIDB4MDAwMCB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMDAwLCBuZXcgaW50W10geyAweDEwMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVTZXRJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDEsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMTAxLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MTEwMywgbmV3IGludFtdIHsgMHgxMTAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMDAwLCBuZXcgaW50W10geyAweDAxMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgbmV3IGludFtdIHsgMHgwMTAxLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25seUZsYWdzQXJlT2ZmSW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRkZFLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRUZFLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRUZDLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgxMTAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRUVGQywgbmV3IGludFtdIHsgMHgxMTAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVTZXRJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHhGRkZGLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHhGMDAwLCAweDBGMDAsIDB4MDBGMCwgMHgwMDBGIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMDEwIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAwLCBuZXcgaW50W10geyAweEYwMDAsIDB4MEYwMCwgMHgwMEYwLCAweDAwMEYgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbnlGbGFnc0FyZU9mZkludEludEFycmF5KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4RkZGRiwgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDIwMCwgMHgwMDAzLCAweDAwMDIgfSkpOwotCi0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDAxMCB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgwMDAwLCBuZXcgaW50W10geyAweEYwMDAsIDB4MEYwMCwgMHgwMEYwLCAweDAwMEYgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPckZsYWdzKCkgewotCQlhc3NlcnRFcXVhbHMoMHgwMDAxLCBCaXRUb29scy5vckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDAwIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAxMSwgQml0VG9vbHMub3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweEYwMTEsIEJpdFRvb2xzLm9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMCB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFuZEZsYWdzKCkgewotCQlhc3NlcnRFcXVhbHMoMHgwMDAxLCBCaXRUb29scy5hbmRGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLmFuZEZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMCwgQml0VG9vbHMuYW5kRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMCB9KSk7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLmFuZEZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RYb3JGbGFncygpIHsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMSwgQml0VG9vbHMueG9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMDAgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHgwMDEwLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweEYwMTAsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDAgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHhGRjExLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwLCAweDBGMDEgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHhGMDEwLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwLCAweDBGMDEsIDB4MEYwMSB9KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5Ib2xkZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Cb29sZWFuSG9sZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZjI2Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5Ib2xkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJvb2xlYW5Ib2xkZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBCb29sZWFuSG9sZGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQm9vbGVhbkhvbGRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHsKLQkJQm9vbGVhbkhvbGRlciBiaCA9IG5ldyBCb29sZWFuSG9sZGVyKHRydWUpOwotCQlhc3NlcnRUcnVlKGJoLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1RydWUoKSB7Ci0JCUJvb2xlYW5Ib2xkZXIgYmggPSBuZXcgQm9vbGVhbkhvbGRlcih0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShiaC5pc1RydWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRmFsc2UoKSB7Ci0JCUJvb2xlYW5Ib2xkZXIgYmggPSBuZXcgQm9vbGVhbkhvbGRlcih0cnVlKTsKLQkJYXNzZXJ0RmFsc2UoYmguaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXMoKSB7Ci0JCUJvb2xlYW5Ib2xkZXIgYmggPSBuZXcgQm9vbGVhbkhvbGRlcih0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShiaC5pcyh0cnVlKSk7Ci0JCWFzc2VydEZhbHNlKGJoLmlzKGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQlCb29sZWFuSG9sZGVyIGJoID0gbmV3IEJvb2xlYW5Ib2xkZXIodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYmguZ2V0VmFsdWUoKSk7Ci0JCWJoLnNldFZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYmguZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRydWUoKSB7Ci0JCUJvb2xlYW5Ib2xkZXIgYmggPSBuZXcgQm9vbGVhbkhvbGRlcihmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGJoLmdldFZhbHVlKCkpOwotCQliaC5zZXRUcnVlKCk7Ci0JCWFzc2VydFRydWUoYmguZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmFsc2UoKSB7Ci0JCUJvb2xlYW5Ib2xkZXIgYmggPSBuZXcgQm9vbGVhbkhvbGRlcih0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShiaC5nZXRWYWx1ZSgpKTsKLQkJYmguc2V0RmFsc2UoKTsKLQkJYXNzZXJ0RmFsc2UoYmguZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlCb29sZWFuSG9sZGVyIGJoID0gbmV3IEJvb2xlYW5Ib2xkZXIodHJ1ZSk7Ci0JCUJvb2xlYW5Ib2xkZXIgY2xvbmUgPSAoQm9vbGVhbkhvbGRlcikgYmguY2xvbmUoKTsKLQkJYXNzZXJ0VHJ1ZShjbG9uZS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGJoLCBjbG9uZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJQm9vbGVhbkhvbGRlciBiaDEgPSBuZXcgQm9vbGVhbkhvbGRlcih0cnVlKTsKLQkJQm9vbGVhbkhvbGRlciBiaDIgPSBuZXcgQm9vbGVhbkhvbGRlcih0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKGJoMSwgYmgyKTsKLQotCQlCb29sZWFuSG9sZGVyIGJoMyA9IG5ldyBCb29sZWFuSG9sZGVyKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYmgxLmVxdWFscyhiaDMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ2xhc3NUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmU0ZWFlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ2xhc3NUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlc3RTdGF0aWNGaWVsZDsKLQotCXB1YmxpYyBDbGFzc1Rvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb21waWxlci1nZW5lcmF0ZWQgY2xhc3MgbmFtZS4gVGhlIEVjbGlwc2UgY29tcGlsZXIgZ2VuZXJhdGVzCi0JICogImxvY2FsIiBjbGFzc2VzIHdpdGggbmFtZXMgaW4gdGhlIGZvcm0gImNvbS5mb28uT3V0ZXIkMSRMb2NhbCI7IHdoaWxlIHRoZQotCSAqIEpESyBjb21waWxlciBnZW5lcmF0ZXMgImNvbS5mb28uT3V0ZXIkMUxvY2FsIi4gVGhlcmUgbWlnaHQgYmUgb3RoZXIKLQkgKiBkaWZmZXJlbmNlcy4uLi4gfmJqdgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBpbGVyRGVwZW5kZW50Q2xhc3NOYW1lRm9yKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoIiQxJCIpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCX0KLQkJdHJ5IHsKLQkJCUNsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXggKyAyKSArIGNsYXNzTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAzKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtdW5nZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjb21waWxlckRlcGVuZGVudENsYXNzTmFtZUZvcihjbGFzc05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxGaWVsZHMoKSB7Ci0JCWludCBmaWVsZENvdW50ID0gMDsKLQkJZmllbGRDb3VudCArPSBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoOwotCQlmaWVsZENvdW50ICs9IGphdmEudXRpbC5BYnN0cmFjdExpc3QuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGg7Ci0JCWZpZWxkQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aDsKLQkJZmllbGRDb3VudCArPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoOwotCQlGaWVsZFtdIGZpZWxkcyA9IENsYXNzVG9vbHMuYWxsRmllbGRzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoZmllbGRDb3VudCwgZmllbGRzLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubmFtZXMoZmllbGRzKSwgIm1vZENvdW50IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKGZpZWxkcyksICJzZXJpYWxWZXJzaW9uVUlEIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKGZpZWxkcyksICJjYXBhY2l0eUluY3JlbWVudCIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5uYW1lcyhmaWVsZHMpLCAiZWxlbWVudENvdW50IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKGZpZWxkcyksICJlbGVtZW50RGF0YSIpKTsKLQkJYXNzZXJ0VHJ1ZShmaWVsZHNbMF0uaXNBY2Nlc3NpYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxNZXRob2RzKCkgewotCQlpbnQgbWV0aG9kQ291bnQgPSAwOwotCQltZXRob2RDb3VudCArPSBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJbWV0aG9kQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0TGlzdC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKS5sZW5ndGg7Ci0JCW1ldGhvZENvdW50ICs9IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoOwotCQltZXRob2RDb3VudCArPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IENsYXNzVG9vbHMuYWxsTWV0aG9kcyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZENvdW50LCBtZXRob2RzLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubmFtZXMobWV0aG9kcyksICJ3YWl0IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKG1ldGhvZHMpLCAiYWRkRWxlbWVudCIpKTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RzWzBdLmlzQWNjZXNzaWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3SW5zdGFuY2VDbGFzcygpIHsKLQkJVmVjdG9yPD8+IHYgPSBDbGFzc1Rvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbnN0YW5jZUNsYXNzQ2xhc3NPYmplY3QoKSB7Ci0JCWludCBpbml0aWFsQ2FwYWNpdHkgPSAyMDA7Ci0JCVZlY3Rvcjw/PiB2ID0gQ2xhc3NUb29scy5uZXdJbnN0YW5jZShqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBpbnQuY2xhc3MsIG5ldyBJbnRlZ2VyKGluaXRpYWxDYXBhY2l0eSkpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCQlPYmplY3RbXSBlbGVtZW50RGF0YSA9IChPYmplY3RbXSkgQ2xhc3NUb29scy5maWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIpOwotCQlhc3NlcnRFcXVhbHMoaW5pdGlhbENhcGFjaXR5LCBlbGVtZW50RGF0YS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbnN0YW5jZUNsYXNzQ2xhc3NBcnJheU9iamVjdEFycmF5KCkgewotCQlpbnQgaW5pdGlhbENhcGFjaXR5ID0gMjAwOwotCQlDbGFzczw/PltdIHBhcm1UeXBlcyA9IG5ldyBDbGFzc1sxXTsKLQkJcGFybVR5cGVzWzBdID0gaW50LmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gbmV3IEludGVnZXIoaW5pdGlhbENhcGFjaXR5KTsKLQkJVmVjdG9yPD8+IHYgPSBDbGFzc1Rvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIHBhcm1UeXBlcywgcGFybXMpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCQlPYmplY3RbXSBlbGVtZW50RGF0YSA9IChPYmplY3RbXSkgQ2xhc3NUb29scy5maWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIpOwotCQlhc3NlcnRFcXVhbHMoaW5pdGlhbENhcGFjaXR5LCBlbGVtZW50RGF0YS5sZW5ndGgpOwotCi0JCXBhcm1zWzBdID0gbmV3IEludGVnZXIoLTEpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl2ID0gQ2xhc3NUb29scy5uZXdJbnN0YW5jZShqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlJ1bnRpbWVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQotCQlwYXJtVHlwZXNbMF0gPSBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzOwotCQlwYXJtc1swXSA9ICJmb28iOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdiA9IENsYXNzVG9vbHMuYXR0ZW1wdE5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIHBhcm1UeXBlcywgcGFybXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hNZXRob2RFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRWYWx1ZSgpIHsKLQkJaW50IGluaXRpYWxDYXBhY2l0eSA9IDIwMDsKLQkJVmVjdG9yPD8+IHYgPSBuZXcgVmVjdG9yPE9iamVjdD4oaW5pdGlhbENhcGFjaXR5KTsKLQkJT2JqZWN0W10gZWxlbWVudERhdGEgPSAoT2JqZWN0W10pIENsYXNzVG9vbHMuZmllbGRWYWx1ZSh2LCAiZWxlbWVudERhdGEiKTsKLQkJYXNzZXJ0RXF1YWxzKGluaXRpYWxDYXBhY2l0eSwgZWxlbWVudERhdGEubGVuZ3RoKTsKLQotCQkvLyB0ZXN0IGluaGVyaXRlZCBmaWVsZAotCQlJbnRlZ2VyIG1vZENvdW50SW50ZWdlciA9IChJbnRlZ2VyKSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUodiwgIm1vZENvdW50Iik7Ci0JCWludCBtb2RDb3VudCA9IG1vZENvdW50SW50ZWdlci5pbnRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbW9kQ291bnQpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzRmllbGRWYWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlib2d1c0ZpZWxkVmFsdWUgPSBDbGFzc1Rvb2xzLmF0dGVtcHRUb0dldEZpZWxkVmFsdWUodiwgImJvZ3VzRmllbGQiKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNGaWVsZFZhbHVlLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVNZXRob2RPYmplY3RTdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJaW50IHNpemUgPSAoKEludGVnZXIpIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZCh2LCAic2l6ZSIpKS5pbnRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgc2l6ZSk7Ci0KLQkJdi5hZGRFbGVtZW50KCJmb28iKTsKLQkJc2l6ZSA9ICgoSW50ZWdlcikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHYsICJzaXplIikpLmludFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygxLCBzaXplKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU1ldGhvZE9iamVjdFN0cmluZ0NsYXNzT2JqZWN0KCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCWJvb2xlYW4gYm9vbGVhblJlc3VsdCA9ICgoQm9vbGVhbikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHYsICJhZGQiLCBPYmplY3QuY2xhc3MsICJmb28iKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoYm9vbGVhblJlc3VsdCk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCQlPYmplY3Qgdm9pZFJlc3VsdCA9IENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZCh2LCAiYWRkRWxlbWVudCIsIE9iamVjdC5jbGFzcywgImJhciIpOwotCQlhc3NlcnROdWxsKHZvaWRSZXN1bHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlTWV0aG9kT2JqZWN0U3RyaW5nQ2xhc3NBcnJheU9iamVjdEFycmF5KCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbmV3IENsYXNzWzFdOwotCQlwYXJtVHlwZXNbMF0gPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gImZvbyI7Ci0JCWJvb2xlYW4gYm9vbGVhblJlc3VsdCA9ICgoQm9vbGVhbikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHYsICJhZGQiLCBwYXJtVHlwZXMsIHBhcm1zKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoYm9vbGVhblJlc3VsdCk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzTWV0aG9kUmV0dXJuVmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJYm9ndXNNZXRob2RSZXR1cm5WYWx1ZSA9IENsYXNzVG9vbHMuYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZCh2LCAiYm9ndXNNZXRob2QiLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBib2d1c01ldGhvZFJldHVyblZhbHVlLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVTdGF0aWNNZXRob2RDbGFzc1N0cmluZygpIHsKLQkJRG91YmxlIHJhbmRvbU9iamVjdCA9IChEb3VibGUpIENsYXNzVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuTWF0aC5jbGFzcywgInJhbmRvbSIpOwotCQlhc3NlcnROb3ROdWxsKHJhbmRvbU9iamVjdCk7Ci0JCWRvdWJsZSByYW5kb20gPSByYW5kb21PYmplY3QuZG91YmxlVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShyYW5kb20gPj0gMCk7Ci0JCWFzc2VydFRydWUocmFuZG9tIDwgMSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVTdGF0aWNNZXRob2RDbGFzc1N0cmluZ0NsYXNzT2JqZWN0KCkgewotCQlTdHJpbmcgcyA9IChTdHJpbmcpIENsYXNzVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAidmFsdWVPZiIsIGJvb2xlYW4uY2xhc3MsIEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE5vdE51bGwocyk7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlU3RhdGljTWV0aG9kQ2xhc3NTdHJpbmdDbGFzc0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbmV3IENsYXNzWzFdOwotCQlwYXJtVHlwZXNbMF0gPSBib29sZWFuLmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gQm9vbGVhbi5UUlVFOwotCQlTdHJpbmcgcyA9IChTdHJpbmcpIENsYXNzVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAidmFsdWVPZiIsIHBhcm1UeXBlcywgcGFybXMpOwotCQlhc3NlcnROb3ROdWxsKHMpOwotCQlhc3NlcnRFcXVhbHMoInRydWUiLCBzKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBib2d1c1N0YXRpY01ldGhvZFJldHVyblZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUgPSBDbGFzc1Rvb2xzLmF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgImJvZ3VzU3RhdGljTWV0aG9kIiwgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSwgZXhDYXVnaHQpOwotCi0JCS8vIHRlc3Qgbm9uLXN0YXRpYyBtZXRob2QKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUgPSBDbGFzc1Rvb2xzLmF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgInRvU3RyaW5nIik7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGaWVsZFZhbHVlKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCU9iamVjdFtdIG5ld0VsZW1lbnREYXRhID0gbmV3IE9iamVjdFs1XTsKLQkJbmV3RWxlbWVudERhdGFbMF0gPSAiZm9vIjsKLQkJQ2xhc3NUb29scy5zZXRGaWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIsIG5ld0VsZW1lbnREYXRhKTsKLQkJQ2xhc3NUb29scy5zZXRGaWVsZFZhbHVlKHYsICJlbGVtZW50Q291bnQiLCBuZXcgSW50ZWdlcigxKSk7Ci0JCS8vIHRlc3QgaW5oZXJpdGVkIGZpZWxkCi0JCUNsYXNzVG9vbHMuc2V0RmllbGRWYWx1ZSh2LCAibW9kQ291bnQiLCBuZXcgSW50ZWdlcigxKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNsYXNzVG9vbHMuYXR0ZW1wdFRvU2V0RmllbGRWYWx1ZSh2LCAiYm9ndXNGaWVsZCIsICJmb28iKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTdGF0aWNGaWVsZFZhbHVlKCkgewotCQlDbGFzc1Rvb2xzLnNldFN0YXRpY0ZpZWxkVmFsdWUodGhpcy5nZXRDbGFzcygpLCAidGVzdFN0YXRpY0ZpZWxkIiwgIm5ldyB2YWx1ZSIpOwotCQlhc3NlcnRFcXVhbHModGVzdFN0YXRpY0ZpZWxkLCAibmV3IHZhbHVlIik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ2xhc3NUb29scy5hdHRlbXB0VG9TZXRTdGF0aWNGaWVsZFZhbHVlKHRoaXMuZ2V0Q2xhc3MoKSwgImJvZ3VzU3RhdGljRmllbGQiLCAibmV3IHZhbHVlIik7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRmllbGRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnROYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoIlZlY3RvciIsIENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3I8T2JqZWN0PigpKSk7Ci0JCWFzc2VydEVxdWFscygiVmVjdG9yIiwgQ2xhc3NUb29scy5zaG9ydE5hbWVGb3IoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWROYW1lKCkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQltYXAucHV0KCJmb28iLCAiYmFyIik7Ci0JCUVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkVudHJ5IiwgQ2xhc3NUb29scy5uZXN0ZWRDbGFzc05hbWVGb3JPYmplY3QoZW50cnkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFbnRyeSIsIENsYXNzVG9vbHMubmVzdGVkTmFtZUZvcihqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhY2thZ2VOYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbCIsIENsYXNzVG9vbHMucGFja2FnZU5hbWVGb3IoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbCIsIENsYXNzVG9vbHMucGFja2FnZU5hbWVGb3IoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheURlcHRoRm9yKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvcihpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvcih2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3IoamF2YS51dGlsLlZlY3RvcltdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3IoaW50W10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvcihqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3IoaW50W11bXVtdLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RGVwdGhGb3JPYmplY3QoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3I8T2JqZWN0PigpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3JbMF0pKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvck9iamVjdChuZXcgaW50WzBdKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3JbMF1bMF1bMF0pKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvck9iamVjdChuZXcgaW50WzBdWzBdWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RGVwdGhGb3JDbGFzc05hbWVkKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yQ2xhc3NOYW1lZChqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yQ2xhc3NOYW1lZChpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGphdmEudXRpbC5WZWN0b3JbXVtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGludFtdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVGb3IoKSB7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlRm9yKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3Iodm9pZC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihqYXZhLnV0aWwuVmVjdG9yW10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihpbnRbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3IoaW50W11bXVtdLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRUeXBlRm9yT2JqZWN0KCkgewotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvck9iamVjdChuZXcgamF2YS51dGlsLlZlY3RvcjxPYmplY3Q+KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3JbMF0pKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvck9iamVjdChuZXcgaW50WzBdKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlRm9yT2JqZWN0KG5ldyBqYXZhLnV0aWwuVmVjdG9yWzBdWzBdWzBdKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3JPYmplY3QobmV3IGludFswXVswXVswXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50VHlwZU5hbWVGb3IoKSB7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3IoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3IoaW50LmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3Iodm9pZC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3IoaW50W10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvcihqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvcihpbnRbXVtdW10uY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChpbnRbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoamF2YS51dGlsLlZlY3RvcltdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChpbnRbXVtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzQ29kZXMoKSB7Ci0JCWFzc2VydEVxdWFscygiYnl0ZSIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnQicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaGFyIiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdDJykpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnRCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmbG9hdCIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnRicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvckNvZGUoJ0knKSk7Ci0JCWFzc2VydEVxdWFscygibG9uZyIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnSicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydCIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnUycpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdaJykpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvckNvZGUoJ1YnKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdYJyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVkSXNUb3BMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoQ2xhc3MuZm9yTmFtZShtdW5nZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxJExvY2FsQ2xhc3MiKSkuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIikuZ2V0TmFtZSgpKSk7IC8vIGFub255bW91cwotCi0JCU9iamVjdFtdIGFycmF5ID0gbmV3IGphdmEudXRpbC5NYXBbMF07IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCWFycmF5ID0gbmV3IGphdmEudXRpbC5NYXAuRW50cnlbMF07IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG11bmdlKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDEkTG9jYWxDbGFzcyIpKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGFub25DbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYW5vbkNsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNUb3BMZXZlbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVkSXNNZW1iZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKENsYXNzLmZvck5hbWUobXVuZ2UodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMSRMb2NhbENsYXNzIikpLmdldE5hbWUoKSkpOyAvLyBsb2NhbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcihDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKS5nZXROYW1lKCkpKTsgLy8gYW5vbnltb3VzCi0KLQkJT2JqZWN0W10gYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcFswXTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCWFycmF5ID0gbmV3IGphdmEudXRpbC5NYXAuRW50cnlbMF07IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBsb2NhbENsYXNzID0gQ2xhc3MuZm9yTmFtZShtdW5nZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxJExvY2FsQ2xhc3MiKSk7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gYW5vbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhbm9uQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCi0JCS8vIHRlc3QgYSBmZXcgZWRnZSBjYXNlcwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExJGFhYSRiYmIiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDFhMSRhYWEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDFhIikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExMjM0NSRiMTIzNDUiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDEyMzQ1YSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoImphdmEudXRpbC5NYXAkMzMzIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcigiamF2YS51dGlsLk1hcDMkMzMzIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVkSXNMb2NhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljbGFzcyBMb2NhbENsYXNzIHsKLQkJCXZvaWQgZm9vKCkgewotCQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgiZm9vIik7Ci0JCQl9Ci0JCX0KLQkJbmV3IExvY2FsQ2xhc3MoKS5mb28oKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOyAvLyBtZW1iZXIKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKENsYXNzLmZvck5hbWUobXVuZ2UodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMSRMb2NhbENsYXNzIikpLmdldE5hbWUoKSkpOyAvLyBsb2NhbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBsb2NhbENsYXNzID0gQ2xhc3MuZm9yTmFtZShtdW5nZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxJExvY2FsQ2xhc3MiKSk7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQotCQkvLyB0ZXN0IGEgZmV3IGVkZ2UgY2FzZXMKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMSRhYWEkYmJiIikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMTEkYWFhIikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMSRhIikpOyAvLyBlY2xpcHNlIG5hbWluZyBjb252ZW50aW9uCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQyJGFiYyIpKTsgLy8gZWNsaXBzZSBuYW1pbmcgY29udmVudGlvbgotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMiRhYmMxIikpOyAvLyBlY2xpcHNlIG5hbWluZyBjb252ZW50aW9uCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQxYSIpKTsgLy8gamRrIG5hbWluZyBjb252ZW50aW9uCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQyYWJjIikpOyAvLyBqZGsgbmFtaW5nIGNvbnZlbnRpb24KLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDJhYmMxIikpOyAvLyBqZGsgbmFtaW5nIGNvbnZlbnRpb24KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMTIzNDUkYjEyMzQ1IikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMTIzNDUkYTEyMzQiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMzMzIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKCJqYXZhLnV0aWwuTWFwMyQzMzMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZWRJc0Fub255bW91cygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cyhqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKENsYXNzLmZvck5hbWUobXVuZ2UodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMSRMb2NhbENsYXNzIikpLmdldE5hbWUoKSkpOyAvLyBsb2NhbAotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcC5FbnRyeVswXTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG11bmdlKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDEkTG9jYWxDbGFzcyIpKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cyhhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0KLQkJLy8gdGVzdCBhIGZldyBlZGdlIGNhc2VzCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCRhMSRhYWEkYmJiIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxYTEkYWFhIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxJGEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJDFhIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCRhMTIzNDUkYjEyMzQ1IikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxMjM0NSRhMTIzNCIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCQzMzMiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAzJDMzMyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29kZUZvckNsYXNzKCkgewotCQlhc3NlcnRFcXVhbHMoJ0knLCBDbGFzc1Rvb2xzLmNvZGVGb3JDbGFzcyhpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCdCJywgQ2xhc3NUb29scy5jb2RlRm9yQ2xhc3MoYnl0ZS5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2RlRm9yQ2xhc3NOYW1lZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCdJJywgQ2xhc3NUb29scy5jb2RlRm9yQ2xhc3NOYW1lZChpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygnSScsIENsYXNzVG9vbHMuY29kZUZvckNsYXNzTmFtZWQoImludCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCdCJywgQ2xhc3NUb29scy5jb2RlRm9yQ2xhc3NOYW1lZChieXRlLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoJ0InLCBDbGFzc1Rvb2xzLmNvZGVGb3JDbGFzc05hbWVkKCJieXRlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0lzUHJpbWl0aXZlV3JhcHBlckNsYXNzKCkgewotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuVm9pZC5jbGFzcykpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcykpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuSW50ZWdlci5jbGFzcykpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuRmxvYXQuY2xhc3MpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLlN0cmluZy5jbGFzcykpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3Modm9pZC5jbGFzcykpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoaW50LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcygpIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLlZvaWQuY2xhc3MpKTsKLQotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLkludGVnZXIuY2xhc3MpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuRmxvYXQuY2xhc3MpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKHZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoaW50LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZWRJc1ByaW1pdGl2ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkpOwotCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ByaW1pdGl2ZShpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ByaW1pdGl2ZShqYXZhLmxhbmcuTnVtYmVyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ByaW1pdGl2ZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ByaW1pdGl2ZShqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUoamF2YS5sYW5nLkludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKCkgewotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKGZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKGphdmEubGFuZy5OdW1iZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZShqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoKSB7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLlZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLkZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuTnVtYmVyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb25TdHJpbmdJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5jbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoaW50W10uY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDEpKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdW11bXS5jbGFzcywgQ2xhc3NUb29scy5jbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMykpOwotCi0JCWFzc2VydEVxdWFscyhPYmplY3QuY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAwKSk7Ci0JCWFzc2VydEVxdWFscyhPYmplY3RbXVtdW10uY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oInZvaWQiLCAwKSk7Ci0JCXRyeSB7Ci0JCQlDbGFzc1Rvb2xzLmNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCAxKTsKLQkJCWZhaWwoInNob3VsZCBub3QgZ2V0IGhlcmUuLi4iKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb25TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IikpOwotCQlhc3NlcnRFcXVhbHMoIltJIiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludFtdIikpOwotCQlhc3NlcnRFcXVhbHMoIltbSSIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQgWyBdIFsgXSIpKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbTGphdmEubGFuZy5PYmplY3Q7IiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RcdFtdIikpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5PYmplY3Q7IiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RcdFtdXHRbXSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvblN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IikpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0W10iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RbXVtdW10iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiaW50IikpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJpbnRbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiaW50W11bXVtdIikpOwotCi0JCWFzc2VydEVxdWFscygwLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0IikpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJmbG9hdCBbIF0iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0W10gW10gW10iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvblN0cmluZ0ludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDApKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDEpKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdW11bXS5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE9iamVjdC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoT2JqZWN0W11bXVtdLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigidm9pZCIsIDApKTsKLQkJdHJ5IHsKLQkJCUNsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCAxKTsKLQkJCWZhaWwoInNob3VsZCBub3QgZ2V0IGhlcmUuLi4iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKEZpZWxkW10gZmllbGRzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGaWVsZCwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoZmllbGRzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShGaWVsZCBmaWVsZCkgewotCQkJCXJldHVybiBmaWVsZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKE1ldGhvZFtdIG1ldGhvZHMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE1ldGhvZCwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IobWV0aG9kcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE5ZGFjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ2xhc3NwYXRoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc3BhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfSE9NRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7Ci0KLQlwdWJsaWMgQ2xhc3NwYXRoVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzZWQoKSB7Ci0JCVN0cmluZyBwYXRoID0gIiI7Ci0KLQkJLy8gbm8gY2hhbmdlcwotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLnBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkucGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLnBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyOzs7O0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0Lmphcjs7OyIpKS5jb21wcmVzc2VkKCkucGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCS8vIG5vIGNoYW5nZXMKLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkucGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFwuLlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkucGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGsxXFxqZGsyXFxqZGszXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpkazFcXGpkazJcXGpkazNcXC4uXFwuLlxcLi5cXGpkazFcXGpkazJcXGpkazNcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrMVxcamRrMlxcamRrM1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzTmFtZSgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCksIGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyI7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJQ2xhc3M8Pz4gamF2YUNsYXNzID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0NsYXNzKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZSgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQ2xhc3NGaWxlTmFtZSgpIHsKLQkJY2hhciBzYyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YSIgKyBzYyArICJsYW5nIiArIHNjICsgIlN0cmluZy5jbGFzcyIsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YUZpbGVOYW1lKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvSmF2YUZpbGVOYW1lKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhIiArIHNjICsgImxhbmciICsgc2MgKyAiU3RyaW5nLmphdmEiLCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VSTHMoKSB7Ci0JCVVSTFtdIGVudHJpZXMgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkudXJscygpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovamRrL3J0LmphciIpLCBlbnRyaWVzW2krK10uZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9qZGsvaTE4bi5qYXIiKSwgZW50cmllc1tpKytdLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovamRrL2phd3MuamFyIiksIGVudHJpZXNbaSsrXS5nZXRQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaFVSTCgiL0M6L2Zvby9jbGFzc2VzIiksIGVudHJpZXNbaSsrXS5nZXRQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaFVSTCgiL0M6L2Jhci9iYXIuamFyIiksIGVudHJpZXNbaSsrXS5nZXRQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHMoaSwgZW50cmllcy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyaWVzKCkgewotCQlDbGFzc3BhdGggY3AgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0Lmphcjs7LjtDOlxcamRrXFxpMThuLmphcjs7O0M6XFxqZGtcXGphd3MuamFyOztDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGJhclxcYmFyLmphcjsiKSk7Ci0JCUNsYXNzcGF0aC5FbnRyeVtdIGVudHJpZXMgPSBjcC5lbnRyaWVzKCk7Ci0JCWludCBpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCIuIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGphd3MuamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxmb29cXGNsYXNzZXMiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGJhclxcYmFyLmphciIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcYmFyXFxiYXIuamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGksIGVudHJpZXMubGVuZ3RoKTsKLQotCQljcCA9IGNwLmNvbXByZXNzZWQoKTsKLQkJZW50cmllcyA9IGNwLmVudHJpZXMoKTsKLQkJaSA9IDA7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiLiIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphciIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxqYXdzLmphciIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcZm9vXFxjbGFzc2VzIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxiYXJcXGJhci5qYXIiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaSwgZW50cmllcy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyeUZvckZpbGVOYW1lZCgpIHsKLQkJQ2xhc3NwYXRoLkVudHJ5IGVudHJ5ID0gbnVsbDsKLQotCQkvLyBpbiB0aGUgbWlkZGxlIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5maWxlTmFtZSgpKTsKLQotCQkvLyBpbiB0aGUgbWlkZGxlIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO3J0LmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHMoInJ0LmphciIsIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmcgLSBxdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmcgLSB1bnF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGVuZCAtIHF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyO0M6XFxqZGtcXHJ0LmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGVuZCAtIHVucXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7cnQuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJydC5qYXIiLCBlbnRyeS5maWxlTmFtZSgpKTsKLQotCQkvLyBhbG9uZSAtIHF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5maWxlTmFtZSgpKTsKLQotCQkvLyBhbG9uZSAtIHVucXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCgicnQuamFyIikuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHMoInJ0LmphciIsIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIHRyaWNrIGVudHJ5IGF0IHRoZSBiZWdpbm5pbmcKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoInJ0Lmphci5uZXc7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gdHJpY2sgZW50cnkgaW4gdGhlIG1pZGRsZQotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydHJ0cnQuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIHRyaWNrIGVudHJ5IGF0IHRoZSBlbmQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoInJ0Lmphci5uZXc7QzpcXGpka1xccnRydHJ0LmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyO0M6XFxqZGtcXHJ0cnRydC5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIG1pc3NpbmcKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoInJ0Lmphci5uZXc7QzpcXGpka1xccnRydHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGpka1xccnRydHJ0LmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicGF0aCBlbnRyeSBzaG91bGQgbm90IGJlIGZvdW5kIiwgbnVsbCwgZW50cnkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvY2F0aW9uRm9yQ2xhc3MoKSB7Ci0JCUNsYXNzPD8+IGphdmFDbGFzcyA9IENsYXNzcGF0aC5jbGFzczsKLQkJRmlsZSBlbnRyeSA9IG5ldyBGaWxlKENsYXNzcGF0aC5sb2NhdGlvbkZvcihqYXZhQ2xhc3MpKTsKLQkJaWYgKGVudHJ5LmlzRmlsZSgpIHx8IGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCWFzc2VydFRydWUoZW50cnkuZXhpc3RzKCkpOwotCQl9Ci0JCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlhc3NlcnRUcnVlKG5ldyBGaWxlKGVudHJ5LCBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhQ2xhc3MpKS5leGlzdHMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnRKYXJOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBydEZpbGUgPSBuZXcgRmlsZShDbGFzc3BhdGgucnRKYXJOYW1lKCkpOwotCQlhc3NlcnRUcnVlKCJydC5qYXIgZG9lcyBub3QgZXhpc3QiLCBydEZpbGUuZXhpc3RzKCkpOwotCi0JCUphckZpbGUgcnRKYXJGaWxlID0gbmV3IEphckZpbGUocnRGaWxlKTsKLQkJSmFyRW50cnkgZW50cnkgPSBydEphckZpbGUuZ2V0SmFyRW50cnkoImphdmEvbGFuZy9PYmplY3QuY2xhc3MiKTsKLQkJcnRKYXJGaWxlLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoImJvZ3VzIHJ0LmphciIsIGVudHJ5ICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKUkVDbGFzc05hbWVzKCkgewotCQlhc3NlcnRUcnVlKCJWZWN0b3IgaXMgbWlzc2luZyBmcm9tIEpSRSBjbGFzcyBuYW1lcyIsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmNsYXNzTmFtZXMoKSwgamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlsZSBpcyBtaXNzaW5nIGZyb20gSlJFIGNsYXNzIG5hbWVzIiwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuY2xhc3NOYW1lcygpLCBqYXZhLmlvLkZpbGUuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpIHsKLQkJY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCVN0cmluZyBzdGRFeHREaXJOYW1lID0gSkFWQV9IT01FICsgc2VwICsgImxpYiIgKyBzZXAgKyAiZXh0IjsKLQkJYXNzZXJ0VHJ1ZSgic3RhbmRhcmQgZXh0ZW5zaW9uIGRpciBuYW1lIG1pc3Npbmc6ICIgKyBzdGRFeHREaXJOYW1lLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpLCBzdGRFeHREaXJOYW1lKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpIHsKLQkJY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCUZpbGUgc3RkRXh0RGlyID0gbmV3IEZpbGUoSkFWQV9IT01FICsgc2VwICsgImxpYiIgKyBzZXAgKyAiZXh0Iik7Ci0JCWFzc2VydFRydWUoInN0YW5kYXJkIGV4dGVuc2lvbiBkaXIgbWlzc2luZzogIiArIHN0ZEV4dERpci5nZXRQYXJlbnQoKSwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uRGlyZWN0b3JpZXMoKSwgc3RkRXh0RGlyKSk7Ci0JfQotCi0JLy9Db21tZW50ZWQgb3V0IGR1ZSB0byBpbmNvbXBhdGliaWxpdHkgd2l0aCBJQk0gSkRLICh1c2VkIGluIEVjbGlwc2UgV1RQIEJ1aWxkKQotCS8vVE9ETyBUZXN0IHNob3VsZCBiZSByZXZpc2VkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBJQk0gSkRLCi0JLy8JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25DbGFzc3BhdGhFbnRyaWVzKCkgewotCS8vCQljaGFyIHNlcCA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkvLwkJU3RyaW5nIGpkayA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIik7Ci0JLy8JCWlmIChqZGsuc3RhcnRzV2l0aCgiMS40IikgfHwgamRrLnN0YXJ0c1dpdGgoIjEuNSIpKSB7Ci0JLy8JCQlDb2xsZWN0aW9uIGphck5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vCQkJQ2xhc3NwYXRoLkVudHJ5W10gZW50cmllcyA9IENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCkuZ2V0RW50cmllcygpOwotCS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JLy8JCQkJamFyTmFtZXMuYWRkKGVudHJpZXNbaV0uZmlsZU5hbWUoKSk7Ci0JLy8JCQl9Ci0JLy8JCQlTdHJpbmcgc3RkRXh0SmFyTmFtZSA9IEpBVkFfSE9NRSArIHNlcCArICJsaWIiICsgc2VwICsgImV4dCIgKyBzZXAgKyAiZG5zbnMuamFyIjsKLQkvLwkJCWFzc2VydFRydWUoImpkayAxLjQueCBzdGFuZGFyZCBleHRlbnNpb24gamFyIG1pc3Npbmc6ICIgKyBzdGRFeHRKYXJOYW1lLCBqYXJOYW1lcy5jb250YWlucyhzdGRFeHRKYXJOYW1lKSk7Ci0JLy8JCX0gZWxzZSB7Ci0JLy8JCQlmYWlsKCJ3ZSBuZWVkIHRvIHVwZGF0ZSB0aGlzIHRlc3QgZm9yIHRoZSBjdXJyZW50IGpkayIpOwotCS8vCQl9Ci0JLy8JfQotCi0JLy9Db21tZW50ZWQgb3V0IGR1ZSB0byBpbmNvbXBhdGliaWxpdHkgd2l0aCBJQk0gSkRLICh1c2VkIGluIEVjbGlwc2UgV1RQIEJ1aWxkKQotCS8vVE9ETyBUZXN0IHNob3VsZCBiZSByZXZpc2VkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBJQk0gSkRLCi0JLy8JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25DbGFzc05hbWVzKCkgewotCS8vCQlTdHJpbmcgamRrID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsKLQkvLwkJaWYgKGpkay5zdGFydHNXaXRoKCIxLjQiKSB8fCBqZGsuc3RhcnRzV2l0aCgiMS41IikpIHsKLQkvLwkJCVN0cmluZyBjbGFzc05hbWUgPSAic3VuLm5ldC5zcGkubmFtZXNlcnZpY2UuZG5zLkROU05hbWVTZXJ2aWNlIjsKLQkvLwkJCWFzc2VydFRydWUoImpkayAxLjQueCBzdGFuZGFyZCBleHRlbnNpb24gY2xhc3MgbWlzc2luZzogIiArIGNsYXNzTmFtZSwKLQkvLwkJCQkJQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCkuY2xhc3NOYW1lcygpLCBjbGFzc05hbWUpKTsKLQkvLwkJfSBlbHNlIHsKLQkvLwkJCWZhaWwoIndlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdGVzdCBmb3IgdGhlIGN1cnJlbnQgamRrIik7Ci0JLy8JCX0KLQkvLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUNsYXNzcGF0aENsYXNzTmFtZXMoKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlDbGFzc0xvYWRlciBjbCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQkvLyBtYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlICJub3JtYWwiIGNsYXNzIGxvYWRlcjsKLQkJLy8gd2hlbiB0aGUgdGVzdHMgYXJlIGV4ZWN1dGVkIGFzIGFuIEFOVCB0YXNrLCB0aGV5IGFyZSBydW4gdW5kZXIKLQkJLy8gYW4gQU5UIGNsYXNzIGxvYWRlciBhbmQgdGhlICJKYXZhIiBjbGFzc3BhdGggZG9lcyBub3QgaW5jbHVkZSB0aGlzIGNsYXNzCi0JCWlmIChjbC5nZXRDbGFzcygpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJzdW4ubWlzYyIpKSB7Ci0JCQlhc3NlcnRUcnVlKCJjbGFzcyBtaXNzaW5nOiAiICsgY2xhc3NOYW1lLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFDbGFzc3BhdGgoKS5jbGFzc05hbWVzKCksIGNsYXNzTmFtZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbW9ycGggdGhlIHNwZWNpZmllZCBwYXRoIHRvIGEgcGxhdGZvcm0taW5kZXBlbmRlbnQgcGF0aAotCSAqLwotCXByaXZhdGUgU3RyaW5nIG1vcnBoKFN0cmluZyBwYXRoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBwYXRoOwotCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZSgnXFwnLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZSgnOycsIEZpbGUucGF0aFNlcGFyYXRvckNoYXIpOwotCQlpZiAoIUNvbGxlY3Rpb25Ub29scy5jb250YWlucyhGaWxlLmxpc3RSb290cygpLCBuZXcgRmlsZSgiQzpcXCIpKSkgewotCQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoIkM6IiwgIiIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogbW9ycGggdGhlIHNwZWNpZmllZCBVUkwgdG8gYSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBwYXRoCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbW9ycGhVUkwoU3RyaW5nIHVybCkgewotCQlTdHJpbmcgcmVzdWx0ID0gdXJsOwotCQlpZiAoIUNvbGxlY3Rpb25Ub29scy5jb250YWlucyhGaWxlLmxpc3RSb290cygpLCBuZXcgRmlsZSgiQzpcXCIpKSkgewotCQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoIi9DOiIsICIiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWM0ZWYzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJldmVyc2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvblRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvblRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVthLmxlbmd0aC0xXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5idWlsZFN0cmluZ0FycmF5MSgpLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVthLmxlbmd0aC0xXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0X0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscygxLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAyLCAiWCIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlJbnRPYmplY3RfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDIsICJYIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheUludE9iamVjdF9FbmQoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgNCwgIlgiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIsICJYIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X1plcm8oKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgMCwgIlgiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiWCIsICJhIiwgImIiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X0V4Y2VwdGlvbigpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAzMywgIlgiKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5idWlsZENoYXJBcnJheSgpLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAnZCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5Q2hhcl9FbXB0eSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgJ2QnKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5SW50Q2hhcigpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDIsICdYJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnWCcsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5SW50Q2hhcl9aZXJvKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgMCwgJ1gnKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1gnLCAnYScsICdiJywgJ2MnLCAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlJbnRDaGFyX0VuZCgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDQsICdYJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ1gnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuYnVpbGRJbnRBcnJheSgpLCAzMCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludEFycmF5SW50X0VtcHR5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFswXTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgMzApOwotCQlhc3NlcnRFcXVhbHMoMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAzMCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMzAgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgMiwgOTkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMiwgOTksIDMsIDQgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludEludF9aZXJvKCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAwLCA5OSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA5OSwgMSwgMiwgMywgNCB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludEFycmF5SW50SW50X0VuZCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgNCwgOTkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMiwgMywgNCwgOTkgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfU3RyaW5nTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGl0ZXJhYmxlMi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzZXQxCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0MSwgaXRlcmFibGUzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QxID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgaXRlcmFibGUyKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKChMaXN0PFN0cmluZz4pIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfT2JqZWN0VW5tb2RpZmllZCgpIHsKLQkJU2V0PE9iamVjdD4gc2V0MSA9IHRoaXMuYnVpbGRPYmplY3RTZXQxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgc2V0MQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGl0ZXJhYmxlMykpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHNldDEuY29udGFpbnNBbGwoKExpc3Q8U3RyaW5nPikgaXRlcmFibGUzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9FbXB0eUl0ZXJhYmxlKCkgewotCQlTZXQ8T2JqZWN0PiBzZXQxID0gdGhpcy5idWlsZE9iamVjdFNldDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50X01vZGlmaWVkKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gbGlzdDI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgaXRlcmFibGUyLml0ZXJhdG9yKCksIGxpc3QyLnNpemUoKSkpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0MS5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVJbnRfVW5tb2RpZmllZCgpIHsKLQkJU2V0PFN0cmluZz4gc2V0MSA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOyAvLyBzYW1lIGVsZW1lbnRzIGFzIHNldDEKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTMgPSBsaXN0MTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBpdGVyYWJsZTMuaXRlcmF0b3IoKSwgbGlzdDEuc2l6ZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JfU3RyaW5nTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QxLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgczEKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBsaXN0My5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbChsaXN0MykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0TW9kaWZpZWQoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBsaXN0MSA9IHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QxLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RVbm1vZGlmaWVkKCkgewotCQlTZXQ8T2JqZWN0PiBzZXQxID0gdGhpcy5idWlsZE9iamVjdFNldDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgczEKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBsaXN0My5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbChsaXN0MykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JfRW1wdHlJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0MS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JJbnRfTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QxLCBsaXN0Mi5pdGVyYXRvcigpLCAzKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvckludF9Vbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgczEKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBsaXN0My5pdGVyYXRvcigpLCAzKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbChsaXN0MykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JJbnRfRW1wdHlJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCAwKSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0MS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBhKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWluc0FsbChDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihhKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nTGlzdEVtcHR5QXJyYXkoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgbmV3IFN0cmluZ1swXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nVW5tb2RpZmllZCgpIHsKLQkJU2V0PFN0cmluZz4gc2V0ID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHNldC5jb250YWluc0FsbChDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihhKSkpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0LCBuZXcgU3RyaW5nWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdTZXRFbXB0eUFycmF5KCkgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldCwgbmV3IFN0cmluZ1swXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfT2JqZWN0TW9kaWZpZWQoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBsaXN0ID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9PYmplY3RVbm1vZGlmaWVkKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTZXQ8T2JqZWN0PiBzZXQgPSB0aGlzLmJ1aWxkT2JqZWN0U2V0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldCwgYSkpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRPYmplY3RBcnJheSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAiWCIsICJYIiwgIlgiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50T2JqZWN0QXJyYXlfWmVybygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRPYmplY3RBcnJheV9FbXB0eUFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlX1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMCwgaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZV9FbXB0eUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZUludCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJYIiwgIlgiLCAiWCIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZUludF9aZXJvKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDAsIGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgIlgiLCAiWCIsICJYIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmFibGVJbnRfRW1wdHlJdGVyYWJsZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYWJsZSwgMCk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSkuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYXRvcik7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJYIiwgIlgiLCAiWCIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvcl9aZXJvKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pLml0ZXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMCwgaXRlcmF0b3IpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvckludCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KS5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhdG9yLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9ySW50X1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSkuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBpdGVyYXRvciwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9ySW50X0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmF0b3IsIDApOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIGMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIGMpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fRW1wdHlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAxLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRDb2xsZWN0aW9uX0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMCwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAxLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZV9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDAsIGl0ZXJhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVfRW1wdHlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMSwgaXRlcmFibGUpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhYmxlSW50X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMSwgaXRlcmFibGUsIDMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZUludF9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMCwgaXRlcmFibGUsIDMpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZUludF9FbXB0eUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAxLCBpdGVyYWJsZSwgMCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmF0b3JfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmF0b3JfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMCwgaXRlcmF0b3IpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvcl9FbXB0eUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMSwgaXRlcmF0b3IpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9ySW50X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAxLCBpdGVyYXRvciwgMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9ySW50X0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDAsIGl0ZXJhdG9yLCAzKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmF0b3JJbnRfRW1wdHlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgaXRlcmFibGUpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYWJsZUludCgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgaXRlcmFibGUsIDMzKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JfT2JqZWN0KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JfRW1wdHlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkT2JqZWN0TGlzdDEoKS5pdGVyYXRvcigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgaXRlcmF0b3IsIDMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZE9iamVjdExpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgaXRlcmF0b3IsIDApOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGExID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlPYmplY3RbXSBhMiA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGExID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PYmplY3RTdHJpbmcoKSB7Ci0JCU9iamVjdFtdIGExID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJT2JqZWN0W10gYTEgPSBuZXcgT2JqZWN0WzBdOwotCQlPYmplY3RbXSBhMiA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5QXJyYXkyKCkgewotCQlPYmplY3RbXSBhMSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgT2JqZWN0WzBdOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYTEsIGEyKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGExKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJYIiwgIlgiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMiwgbmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgIlgiLCAiWCIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X09iamVjdFN0cmluZygpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAyLCBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiWCIsICJYIiwgIlgiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfRW5kKCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDQsIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiLCAiWCIsICJYIiwgIlgiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9aZXJvKCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFswXTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMCwgbmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCA0LCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfRW1wdHlBcnJheTEoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAwLCBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksIG5ldyBjaGFyW10geyAnZCcsICdlJyB9KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdlJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlDaGFyQXJyYXlfRW1wdHlBcnJheTIoKSB7Ci0JCWNoYXJbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksIG5ldyBjaGFyWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5Q2hhckFycmF5RW1wdHlBcnJheTEoKSB7Ci0JCWNoYXJbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChuZXcgY2hhclswXSwgbmV3IGNoYXJbXSB7ICdkJywgJ2UnIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAnZCcpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ2UnKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUludENoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBjaGFyW10geyAnWCcsICdYJywgJ1gnIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAnWCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ1gnLCAnWCcsICdYJywgJ2MnLCAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlJbnRDaGFyQXJyYXlfRW5kKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgNCwgbmV3IGNoYXJbXSB7ICdYJywgJ1gnLCAnWCcgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ1gnLCAnWCcsICdYJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUludENoYXJBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMCwgbmV3IGNoYXJbXSB7ICdYJywgJ1gnLCAnWCcgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdYJywgJ1gnLCAnWCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlJbnRDaGFyQXJyYXlfRW1wdHlBcnJheTIoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJyB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAyLCBuZXcgY2hhclswXSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5idWlsZEludEFycmF5KCksIG5ldyBpbnRbXSB7IDMwLCA0MCB9KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgMzApKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgNDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJaW50W10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5idWlsZEludEFycmF5KCksIG5ldyBpbnRbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEFycmF5X0VtcHR5QXJyYXkxKCkgewotCQlpbnRbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChuZXcgaW50WzBdLCBuZXcgaW50W10geyAzMCwgNDAgfSk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDQwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbEludEFycmF5SW50SW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCA5OSwgOTksIDk5LCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbmQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDQsIG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCAzLCA0LCA5OSwgOTksIDk5IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMiwgbmV3IGludFswXSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbMF07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDAsIG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA5OSwgOTksIDk5IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlPYmplY3RbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFycmF5KGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCU9iamVjdFtdIGEgPSBDb2xsZWN0aW9uVG9vbHMuYXJyYXkoaXRlcmFibGUsIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmFibGVPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheShpdGVyYWJsZSwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZU9iamVjdEFycmF5X09iamVjdCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlPYmplY3RbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFycmF5KGl0ZXJhYmxlLCBuZXcgT2JqZWN0WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlSW50T2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheShpdGVyYWJsZSwgMywgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvcigpIHsKLQkJT2JqZWN0W10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yX0VtcHR5KCkgewotCQlPYmplY3RbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFycmF5KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCU9iamVjdFtdIGEgPSBDb2xsZWN0aW9uVG9vbHMuYXJyYXkodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJT2JqZWN0W10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheShFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yT2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheShFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBDb2xsZWN0aW9uVG9vbHMuYXJyYXkodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgbmV3IE9iamVjdFswXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvckludE9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JJbnRPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheShFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSwgMywgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX1N0cmluZygpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnRW51bWVyYXRpb25fT2JqZWN0KCkgewotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX0VtcHR5KCkgewotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKEVtcHR5RW51bWVyYXRpb24uaW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uSW50KCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdFbnVtZXJhdGlvbkludF9FbXB0eSgpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoRW1wdHlFbnVtZXJhdGlvbi48U3RyaW5nPmluc3RhbmNlKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfU3RyaW5nT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCUJhZzxPYmplY3Q+IGIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5iYWcoYy5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JJbnQoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JJbnRfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnT2JqZWN0QXJyYXkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGIsIHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdPYmplY3RBcnJheV9WYXJhcmcoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKCJmb28iLCAiYmFyIiwgImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChiLCBuZXcgT2JqZWN0W117ImZvbyIsICJiYXIiLCAiYmF6In0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEJhZy5FbXB0eS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uRW51bWVyYXRpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkVudW1lcmF0aW9uX09iamVjdFN0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGMgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5jb2xsZWN0aW9uKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25FbnVtZXJhdGlvbkludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmFibGVJbnQoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0U3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYyA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmF0b3JJbnQoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uT2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYywgdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zRW51bWVyYXRpb25PYmplY3RfU3RyaW5nKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gdGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModi5lbGVtZW50cygpLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModi5lbGVtZW50cygpLCBudWxsKSk7Ci0JCXYuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh2LmVsZW1lbnRzKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNFbnVtZXJhdGlvbk9iamVjdF9PYmplY3QoKSB7Ci0JCVZlY3RvcjxPYmplY3Q+IGMgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlTdHJpbmcgb25lID0gIm9uZSI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuZWxlbWVudHMoKSwgb25lKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLmVsZW1lbnRzKCksIG51bGwpKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuZWxlbWVudHMoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0l0ZXJhYmxlT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gYzsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoaXRlcmFibGUsICJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoaXRlcmFibGUsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJdGVyYXRvck9iamVjdF9TdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zSXRlcmF0b3JPYmplY3RfT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYyA9IG5ldyBIYXNoQmFnPE9iamVjdD4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlTdHJpbmcgb25lID0gIm9uZSI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgb25lKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLml0ZXJhdG9yKCksIG51bGwpKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc09iamVjdEFycmF5T2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlPYmplY3RbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEyLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdhJykpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ3onKSk7Ci0JCWNoYXJbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgJ3onKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYTIsICd6JykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0ludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDEwKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCA1NSkpOwotCQlpbnRbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgNTUpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhMiwgNTUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYzEgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYzEuYWRkKCJ6ZXJvIik7Ci0JCWMxLmFkZCgib25lIik7Ci0JCWMxLmFkZCgidHdvIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoInR3byIpOwotCQljMi5hZGQoInplcm8iKTsKLQkJYzIuYWRkKCJvbmUiKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYzEsIGMyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nT2JqZWN0KCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5KCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUNvbGxlY3Rpb24oKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRDb2xsZWN0aW9uKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCAzLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUxLCAzLCBpdGVyYWJsZTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUl0ZXJhdG9yKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRJdGVyYXRvcigpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChpdGVyYWJsZSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlT2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSW50T2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbl9TdHJpbmdTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySW50Q29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgNSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCBpdGVyYWJsZSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYXRvckludEl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIGl0ZXJhYmxlKSk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySXRlcmF0b3JfU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRJdGVyYXRvcigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUNvbGxlY3Rpb24oKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgaXRlcmFibGUpKTsKLQkJaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUl0ZXJhdG9yKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbE9iamVjdEFycmF5SXRlcmF0b3JfRW1wdHkoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksIHRoaXMuYnVpbGRDaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZENoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsgJ3gnLCAneScgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEludEFycmF5SW50QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRJbnRBcnJheSgpLCB0aGlzLmJ1aWxkSW50QXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZEludEFycmF5KCksIG5ldyBpbnRbXSB7IDQ0NCwgODg4IH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZkVuZCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBuZXcgU3RyaW5nKCJhIik7Ci0JCVN0cmluZyBiXyA9IG5ldyBTdHJpbmcoImIiKTsKLQkJU3RyaW5nIGNfID0gbmV3IFN0cmluZygiYyIpOwotCQlTdHJpbmcgZF8gPSBuZXcgU3RyaW5nKCJkIik7Ci0JCVN0cmluZyBlXyA9IG5ldyBTdHJpbmcoImUiKTsKLQkJYXNzZXJ0VHJ1ZSgoYSAhPSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiAhPSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCAhPSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSAhPSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBhXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIG51bGwsIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZSYW5nZSgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgxLCAtMSksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBhXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgMiksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgMCksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgMyksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMiwgMiksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoNSwgLTEpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZTdGFydCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBuZXcgU3RyaW5nKCJhIik7Ci0JCVN0cmluZyBiXyA9IG5ldyBTdHJpbmcoImIiKTsKLQkJU3RyaW5nIGNfID0gbmV3IFN0cmluZygiYyIpOwotCQlTdHJpbmcgZF8gPSBuZXcgU3RyaW5nKCJkIik7Ci0JCVN0cmluZyBlXyA9IG5ldyBTdHJpbmcoImUiKTsKLQkJYXNzZXJ0VHJ1ZSgoYSAhPSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiAhPSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCAhPSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSAhPSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIENvbGxlY3Rpb25Ub29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGVfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY19fKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIG51bGwsIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNJdGVyYXRvckl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIxMDAwIik7Ci0JCWxpc3QxLmFkZCgiMjAwMCIpOwotCQlsaXN0MS5hZGQoIjMwMDAiKTsKLQkJbGlzdDEuYWRkKCI0MDAwIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdDEuc2l6ZSgpOyBpKyspIHsKLQkJCWxpc3QyLmFkZChTdHJpbmcudmFsdWVPZigoaSArIDEpICogMTAwMCkpOwotCQl9Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pZGVudGljYWwobGlzdDEubGlzdEl0ZXJhdG9yKCksIGxpc3QyLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVxdWFscyhsaXN0MS5saXN0SXRlcmF0b3IoKSwgbGlzdDIubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGlzdEl0ZXJhdG9ySW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmcgbyA9IENvbGxlY3Rpb25Ub29scy5nZXQobGlzdC5saXN0SXRlcmF0b3IoKSwgMSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbyk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlvID0gQ29sbGVjdGlvblRvb2xzLmdldChsaXN0Lmxpc3RJdGVyYXRvcigpLCBsaXN0LnNpemUoKSAtIDEpOwotCQlhc3NlcnROdWxsKG8pOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb25Ub29scy5nZXQobGlzdC5saXN0SXRlcmF0b3IoKSwgbGlzdC5zaXplKCkpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aWNhbE9iamVjdEFycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCU9iamVjdFtdIGExID0gbmV3IE9iamVjdFs0XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJYTFbaV0gPSBTdHJpbmcudmFsdWVPZihpICogMTAwMCk7Ci0JCX0KLQotCQlPYmplY3RbXSBhMiA9IG5ldyBPYmplY3RbYTEubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMi5sZW5ndGg7IGkrKykgewotCQkJYTJbaV0gPSBhMVtpXTsKLQkJfQotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlkZW50aWNhbChhMSwgYTIpKTsKLQkJYTJbMl0gPSAiMjAwMCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pZGVudGljYWwoYTEsIGEyKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9Cb3RoTnVsbCgpIHsKLQkJT2JqZWN0W10gYTEgPSBudWxsOwotCQlPYmplY3RbXSBhMiA9IG51bGw7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlkZW50aWNhbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PbmVOdWxsKCkgewotCQlPYmplY3RbXSBhMSA9IG51bGw7Ci0JCU9iamVjdFtdIGEyID0gbmV3IE9iamVjdFswXTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmlkZW50aWNhbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9EaWZmZXJlbnRMZW5ndGhzKCkgewotCQlPYmplY3RbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIifTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIiwgImJheiJ9OwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaWRlbnRpY2FsKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGljYWxMaXN0SXRlcmF0b3JMaXN0SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaWRlbnRpY2FsKGxpc3QxLmxpc3RJdGVyYXRvcigpLCBsaXN0Mi5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lcXVhbHMobGlzdDEubGlzdEl0ZXJhdG9yKCksIGxpc3QyLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aWNhbExpc3RJdGVyYXRvckxpc3RJdGVyYXRvcl9Ob3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJbGlzdDIucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaWRlbnRpY2FsKGxpc3QxLmxpc3RJdGVyYXRvcigpLCBsaXN0Mi5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZXF1YWxzKGxpc3QxLmxpc3RJdGVyYXRvcigpLCBsaXN0Mi5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGljYWxMaXN0SXRlcmF0b3JMaXN0SXRlcmF0b3JfRGlmZmVyZW50U2l6ZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJbGlzdDIucmVtb3ZlKDMpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaWRlbnRpY2FsKGxpc3QxLmxpc3RJdGVyYXRvcigpLCBsaXN0Mi5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZXF1YWxzKGxpc3QxLmxpc3RJdGVyYXRvcigpLCBsaXN0Mi5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZFbmQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gYTsKLQkJU3RyaW5nIGJfID0gYjsKLQkJU3RyaW5nIGNfID0gYzsKLQkJU3RyaW5nIGRfID0gZDsKLQkJU3RyaW5nIGVfID0gZTsKLQkJYXNzZXJ0VHJ1ZSgoYSA9PSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiA9PSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyA9PSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCA9PSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSA9PSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGFfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZSYW5nZSgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDEsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGFfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCAyKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDApLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgMyksIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMiwgMiksIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMiwgMiksIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZTdGFydCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBlXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mTGlzdEl0ZXJhdG9yT2JqZWN0X1N0cmluZygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QubGlzdEl0ZXJhdG9yKCksICJvbmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZMaXN0SXRlcmF0b3JPYmplY3RfTnVsbCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QubGlzdEl0ZXJhdG9yKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkxpc3RJdGVyYXRvck9iamVjdF9PYmplY3QoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0KLQkJU3RyaW5nIG9uZSA9ICIxIjsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QubGlzdEl0ZXJhdG9yKCksIG9uZSkpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5saXN0SXRlcmF0b3IoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihhLCAib25lIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGEsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkNoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoYSwgJ2InKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGEsICdkJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGEsIDEwKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoYSwgMzApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0aW9uSW5kZXhPZkxpc3RDb21wYXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkUiKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQSIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZMaXN0T2JqZWN0Q29tcGFyYXRvcigpIHsKLQkJQ29tcGFyYXRvcjxTdHJpbmc+IGMgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpOwotCQlMaXN0PFN0cmluZz4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIiwgYykpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIiwgYykpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH0pOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkUiLCBjKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQSIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJBIiwgIkEiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiLCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZPYmplY3RBcnJheUNvbXBhcmFibGUoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGEsICJFIikpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRpb25JbmRleE9mT2JqZWN0QXJyYXlPYmplY3RDb21wYXJhdG9yKCkgewotCQlDb21wYXJhdG9yPFN0cmluZz4gYyA9IG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIsICJBIiB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGEsICJFIiwgYykpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkEiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIiwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYWJsZUl0ZXJhdG9yKCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IGVtcHR5SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbXB0eUl0ZXJhdG9yKTsKLQkJCi0JCWFzc2VydEZhbHNlKGVtcHR5SXRlcmFibGUuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWVtcHR5SXRlcmF0b3IgPSBlbXB0eUl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGl0ZXJhdG9yOiAiICsgZW1wdHlJdGVyYXRvcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24uIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhYmxlT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIHN0cmluZ3MgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHN0cmluZ3MpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyaW5nc1tpKytdLCBzdHJpbmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvck9iamVjdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihsaXN0Lmxpc3RJdGVyYXRvcigpLCAib25lIikpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGxpc3QubGlzdEl0ZXJhdG9yKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvck9iamVjdF9FbXB0eSgpIHsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGEsICJvbmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihhLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YoYSwgJ2InKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihhLCAnZCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGEsIDEwKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGEsIDMwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlLCAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmdPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PE9iamVjdD4gbGlzdDIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5saXN0KGxpc3QxLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMobGlzdDEsIGxpc3QyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yX0VtcHR5KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmxpc3QoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5saXN0KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNSkuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdE9iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvck9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLmxpc3RJdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yT2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMubGlzdEl0ZXJhdG9yKGEsIDEpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhhW2ldLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygnYycsIENvbGxlY3Rpb25Ub29scy5tYXgodGhpcy5idWlsZENoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heEludEFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoMjAsIENvbGxlY3Rpb25Ub29scy5tYXgodGhpcy5idWlsZEludEFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWluQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoJ2EnLCBDb2xsZWN0aW9uVG9vbHMubWluKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaW5JbnRBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5taW4odGhpcy5idWlsZEludEFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU9iamVjdEFycmF5SW50SW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIgfTsKLQotCQlTdHJpbmdbXSByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgNCwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjMiLCAiNCIsICIyIiwgIjUiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAwLCA1KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgNCwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlT2JqZWN0QXJyYXlJbnRJbnRJbnQoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiB9OwotCi0JCVN0cmluZ1tdIHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCA0LCAyLCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIxIiwgIjMiLCAiNCIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgMiwgNCwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAyLCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMyIsICIyIiwgIjQiLCAiNSIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgMSwgMCwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAxLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQsIDUgfTsKLQotCQlpbnRbXSByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgNCwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAwLCAxLCAzLCA0LCAyLCA1IH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAwLCA1KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDEsIDMsIDQsIDIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgNCwgMSwgMywgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgMiwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCA0LCAxLCAzLCAyIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSW50QXJyYXlJbnRJbnRJbnQoKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFtdIHsgMCwgMSwgMiwgMywgNCwgNSB9OwotCi0JCWludFtdIHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCA0LCAyLCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDAsIDEsIDMsIDQsIDIsIDUgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMSwgMywgNCwgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgMiwgNCwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCA0LCAxLCAzLCAyIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAyLCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDMsIDIsIDQsIDEgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMCwgMywgMiwgNCwgNSwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgMSwgMCwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCAzLCAyLCA0LCAxIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAxLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDMsIDIsIDQsIDEgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUNoYXJBcnJheUludEludCgpIHsKLQkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKLQotCQljaGFyW10gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnZCcsICdlJywgJ2MnLCAnZicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDAsIDUpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdmJywgJ2EnLCAnYicsICdkJywgJ2UnLCAnYycgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdmJywgJ2EnLCAnZScsICdiJywgJ2QnLCAnYycgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDIsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdmJywgJ2EnLCAnZScsICdiJywgJ2QnLCAnYycgfSwgcmVzdWx0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVDaGFyQXJyYXlJbnRJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2InLCAnYycsICdkJywgJ2UnIH07Ci0KLQkJY2hhcltdIHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCA0LCAyLCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcsICdiJywgJ2UnIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAwLCA1LCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2InLCAnYycsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2QnLCAnYicsICdjJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAyLCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAwLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdjJywgJ2InLCAnZCcsICdlJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAxLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAxLCAwLCAwKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pOwotCi0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMCwgNSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDIsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVMaXN0SW50SW50U2VxdWVudGlhbEFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgbmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiB9KTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiNCIsICIxIiwgIjMiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUxpc3RJbnRJbnRJbnRTZXF1ZW50aWFsQWNjZXNzKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfTsKLQkJU3RyaW5nW10gYTMgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBhMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGEyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X05vTWF0Y2hlcygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1tdIHsgIlgiLCAiWSIsICJaIiB9OwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGEyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8Pz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGl0ZXJhYmxlKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmFibGVJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChhMSwgaXRlcmFibGUsIDcpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkYiLCAiRiIgfSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhYmxlPD8+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChhMSwgaXRlcmFibGUuaXRlcmF0b3IoKSwgNyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGNvbGxlY3Rpb24pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9Ob01hdGNoZXMoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWSIsICJaIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdBJywgJ0InLCAnQicsICdDJywgJ0MnLCAnRCcsICdEJywgJ0UnLCAnRScsICdGJywgJ0YnIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyW10geyAnRScsICdCJyB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQycsICdDJywgJ0QnLCAnRCcsICdGJywgJ0YnIH0sIENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDaGFyQXJyYXlDaGFyQXJyYXlfRW1wdHkoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdBJywgJ0InLCAnQicsICdDJywgJ0MnLCAnRCcsICdEJywgJ0UnLCAnRScsICdGJywgJ0YnIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyWzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDaGFyQXJyYXlDaGFyQXJyYXlfTm9NYXRjaGVzKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQScsICdCJywgJ0InLCAnQycsICdDJywgJ0QnLCAnRCcsICdFJywgJ0UnLCAnRicsICdGJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ1gnLCAnWicgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMSwgMywgMywgNCwgNCwgNiwgNiB9LCBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFswXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheV9Ob01hdGNoZXMoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiB9OwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUyLCA2NyB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVPYmplY3RBcnJheU9iamVjdF9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsICJ0aHJlZSIpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAiZm91ciIpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAiZml2ZSIpOwotCi0JCWFzc2VydEVxdWFscyg2LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmUoYSwgInRocmVlIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlT2JqZWN0QXJyYXlPYmplY3RfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAidGhyZWUiKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgImZvdXIiKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgImZpdmUiKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZCcpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZScpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZicpOwotCi0JCWFzc2VydEVxdWFscyg2LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdkJykpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZShhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdlJykpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAnZicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgMzApOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCA0MCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDUwKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAzMCkpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZShhLCAzMCk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAzMCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCA0MCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCA1MCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uSXRlcmFibGUoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQotCQljID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmFibGUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uSXRlcmFibGVJbnQoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlLCAzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQotCQljID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmFibGUsIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uSXRlcmF0b3JfRW1wdHkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQotCQljID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvcl9EdXBsaWNhdGVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiYSIpOwotCQljLmFkZCgiYSIpOwotCQljLmFkZCgiYiIpOwotCQljLmFkZCgiYyIpOwotCQljLmFkZCgiZCIpOwotCQljLmFkZCgiZCIpOwotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiZCIgfTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oYSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYXRvcikpOwotCQlhc3NlcnRFcXVhbHMoMiwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJhIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImIiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYyIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiZCIpKTsKLQotCQlpdGVyYXRvciA9IG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oYSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmF0b3IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX09iamVjdFN0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmF0b3IpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvdEludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmF0b3IsIDIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9EdXBsaWNhdGVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiYSIpOwotCQljLmFkZCgiYSIpOwotCQljLmFkZCgiYiIpOwotCQljLmFkZCgiYyIpOwotCQljLmFkZCgiZCIpOwotCQljLmFkZCgiZCIpOwotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiZCIgfTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9Nb3JlRHVwbGljYXRlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImMiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBhKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0NvbGxlY3Rpb25PYmplY3QoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsICJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAidHdvIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgYy5zaXplKCkpOwotCi0JCWMuYWRkKCJmaXZlIik7Ci0JCWMuYWRkKCJmaXZlIik7Ci0JCWMuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEVxdWFscyg1LCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsICJmaXZlIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgImZpdmUiKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0KLQkJYy5hZGQobnVsbCk7Ci0JCWMuYWRkKG51bGwpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc09iamVjdEFycmF5T2JqZWN0KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0d28iKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAidHdvIik7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0KLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgImZpdmUiKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgImZpdmUiKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgImZpdmUiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJmaXZlIik7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0KLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgbnVsbCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIG51bGwpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdiJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2InKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZycpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZycpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZycpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdnJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2cnKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDU1KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAxMCk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgMTApOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDc3KTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgNzcpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCA3Nyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgNzcpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDc3KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudEF0SW5kZXhPYmplY3RBcnJheUludCgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50QXRJbmRleChhLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudEF0SW5kZXhDaGFyQXJyYXlJbnQoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50QXRJbmRleChhLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQScsICdEJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRBdEluZGV4SW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMywgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA4LCA2LCA3IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4TGlzdEludEludCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH0pKTsKLQkJTGlzdDxTdHJpbmc+IHJlbW92ZWQgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGxpc3QsIDMsIDIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkQiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQyIsICJBIiB9LCByZW1vdmVkLnRvQXJyYXkoKSkpOwotCi0JCWxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiIH0pKTsKLQkJcmVtb3ZlZCA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgobGlzdCwgMywgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkMiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiRCIsICJFIiwgIkYiIH0sIHJlbW92ZWQudG9BcnJheSgpKSk7Ci0KLQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIgfSkpOwotCQlyZW1vdmVkID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChsaXN0LCAwLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJEIiwgIkUiLCAiRiIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIgfSwgcmVtb3ZlZC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4T2JqZWN0QXJyYXlJbnRJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDMsIDIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4T2JqZWN0QXJyYXlJbnRJbnRfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDAsIDYpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhDaGFyQXJyYXlJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMCwgNSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4Q2hhckFycmF5SW50SW50X0VtcHR5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDAsIDYpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyLCAxMSB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAzLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDgsIDYsIDcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhJbnRBcnJheUludEludF9FbXB0eSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyLCAxMSB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAwLCA2KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbE9iamVjdEFycmF5T2JqZWN0T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXBsYWNlQWxsKGEsICJBIiwgIloiKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJaIiwgIkIiLCAiWiIsICJDIiwgIloiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsT2JqZWN0QXJyYXlPYmplY3RPYmplY3RfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlcGxhY2VBbGwoYSwgIkEiLCAiWiIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIloiLCAiQiIsICJaIiwgIkMiLCAiWiIsICJEIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBbGxPYmplY3RBcnJheU9iamVjdE9iamVjdF9OdWxsKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgbnVsbCwgIkIiLCBudWxsLCAiQyIsIG51bGwsICJEIiB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlcGxhY2VBbGwoYSwgbnVsbCwgIloiKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJaIiwgIkIiLCAiWiIsICJDIiwgIloiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsQ2hhckFycmF5Q2hhckNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXBsYWNlQWxsKGEsICdBJywgJ1onKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnWicsICdCJywgJ1onLCAnQycsICdaJywgJ0QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbEludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMCwgMSwgMCwgNywgMCwgOTkgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXBsYWNlQWxsKGEsIDAsIDEzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDEzLCAxLCAxMywgNywgMTMsIDk5IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhYmxlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgaXRlcmFibGUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBpdGVyYWJsZSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYWJsZUludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgaXRlcmFibGUsIDcpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0U3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYzEgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYzEuYWRkKCJ6ZXJvIik7Ci0JCWMxLmFkZCgib25lIik7Ci0JCWMxLmFkZCgidHdvIik7Ci0JCQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCJ6ZXJvIik7Ci0JCWMyLmFkZCgib25lIik7Ci0JCWMyLmFkZCgidHdvIik7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMxLCBjMi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyhjMi5zaXplKCksIGMxLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhjMiwgYzEpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMy5hZGQoInRocmVlIik7Ci0JCWMzLmFkZCgiZm91ciIpOwotCQljMy5hZGQoImZpdmUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX0VtcHR5Q29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvckludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCA4KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSwgOSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpLCAwKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMykpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgbmV3IFN0cmluZ1tdIHsgImZvbyIgfSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgT2JqZWN0W10geyAiRSIsICJCIiwgbmV3IEludGVnZXIoNykgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9FbXB0eU9iamVjdEFycmF5MSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9OwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGEyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfRW1wdHlPYmplY3RBcnJheTIoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gYTMgPSBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBhMik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0JvdGhFbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEzID0gQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChhMSwgYTIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBpdGVyYWJsZSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYWJsZV9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhYmxlLCAzKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50X0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmF0b3IoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvcikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvciwgMykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhdG9yLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5Q29sbGVjdGlvbigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkUiLCAiRSIgfSwgQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChhMSwgY29sbGVjdGlvbikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0FsbCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiIH0pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGNvbGxlY3Rpb24pKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQicsICdCJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRScsICdFJywgJ0YnLCAnRicgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0InLCAnQicsICdFJywgJ0UnIH0sIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDaGFyQXJyYXlDaGFyQXJyYXlfRW1wdHlDaGFyQXJyYXkxKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhclswXTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWFzc2VydFNhbWUoYTEsIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENoYXJBcnJheUNoYXJBcnJheV9FbXB0eUNoYXJBcnJheTIoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnRScsICdCJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhclswXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGEyKS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDaGFyQXJyYXlDaGFyQXJyYXlfUmV0YWluQWxsKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicsICdFJywgJ0InLCAnRScsICdCJywgJ0UnLCAnQicsICdFJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0U2FtZShhMSwgQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMiwgMiwgNSwgNSB9LCBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUludEFycmF5MSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50WzBdOwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUsIDIgfTsKLQkJYXNzZXJ0U2FtZShhMSwgQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUludEFycmF5MigpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWludFtdIGEyID0gbmV3IGludFswXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGEyKS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxJbnRBcnJheUludEFycmF5X1JldGFpbkFsbCgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA1LCAyLCA1LCAyLCA1LCAyLCA1LCAyLCA1LCAyLCA1IH07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRTYW1lKGExLCBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlT2JqZWN0QXJyYXlfT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlT2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlQ2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlKGEpOwotCQlhc3NlcnRFcXVhbHMoJ2MnLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYScsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlSW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlKGEpOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGFjdHVhbCA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdChpdGVyYWJsZSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlTGlzdEl0ZXJhYmxlSW50KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QoaXRlcmFibGUsIDEwKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JfU3RyaW5nKCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUxpc3RJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5yZXZlcnNlTGlzdCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJTGlzdDxPYmplY3Q+IGV4cGVjdGVkID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMzMpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGEpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlfWmVybygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5X09uZSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiZm9vICAiIH07Ci0JCVN0cmluZ1tdIGEyID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhMSk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGEsIDIpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnRfWmVyb0Rpc3RhbmNlKCkgewotCQlTdHJpbmdbXSBhMSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJU3RyaW5nW10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExLCAwKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludF9aZXJvKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEyID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhMSwgNyk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnRfT25lKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJmb28gICIgfTsKLQkJU3RyaW5nW10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExLCA4KTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhKTsKLQkJYXNzZXJ0RXF1YWxzKCdjJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYScsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5X1plcm8oKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlfT25lKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ2EnIH07Ci0JCWNoYXJbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludCgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGEsIDIpOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdjJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYScsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlJbnRfWmVyb0Rpc3RhbmNlKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJyB9OwotCQljaGFyW10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExLCAwKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlJbnRfWmVybygpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbMF07Ci0JCWNoYXJbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5yb3RhdGUoYTEsIDIwMDEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludF9PbmUoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnYScgfTsKLQkJY2hhcltdIGEyID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhMSwgMjIpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGEpOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygxMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5X1plcm8oKSB7Ci0JCWludFtdIGExID0gbmV3IGludFswXTsKLQkJaW50W10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheV9PbmUoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgNzcgfTsKLQkJaW50W10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludF9aZXJvRGlzdGFuY2UoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgMywgMiwgMSB9OwotCQlpbnRbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5yb3RhdGUoYTEsIDApOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5SW50X1plcm8oKSB7Ci0JCWludFtdIGExID0gbmV3IGludFswXTsKLQkJaW50W10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExLCAzKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludF9PbmUoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgNzcgfTsKLQkJaW50W10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExLCA0NCk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhYmxlLCAyMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCXNldDEuYWRkKCIwIik7Ci0JCXNldDEuYWRkKCIxIik7Ci0JCXNldDEuYWRkKCIyIik7Ci0JCXNldDEuYWRkKCIzIik7Ci0KLQkJU2V0PE9iamVjdD4gc2V0MiA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PnNldChzZXQxLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoc2V0MSwgc2V0Mik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEl0ZXJhdG9ySW50KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCksIDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYXJyYXkxID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhcnJheTIgPSBDb2xsZWN0aW9uVG9vbHMuc2h1ZmZsZSh0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCkpOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhcnJheTEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWNoYXJbXSBhcnJheTIgPSBDb2xsZWN0aW9uVG9vbHMuc2h1ZmZsZSh0aGlzLmJ1aWxkQ2hhckFycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVJbnRBcnJheSgpIHsKLQkJaW50W10gYXJyYXkxID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWludFtdIGFycmF5MiA9IENvbGxlY3Rpb25Ub29scy5zaHVmZmxlKHRoaXMuYnVpbGRJbnRBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25JdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShzdHJlYW0uaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uSXRlcmF0b3JfT2JqZWN0KCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PnNpbmdsZXRvbkl0ZXJhdG9yKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShzdHJlYW0uaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uSXRlcmF0b3JfQ2FzdCgpIHsKLQkJSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3IoKE9iamVjdCkgImZvbyIpOwotCQlhc3NlcnRUcnVlKHN0cmVhbS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0cmVhbS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkT2JqZWN0TGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemVJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmFibGUoKSB7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MxLmFkZCgiMCIpOwotCQlzczEuYWRkKCIyIik7Ci0JCXNzMS5hZGQoIjMiKTsKLQkJc3MxLmFkZCgiMSIpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBzczE7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNldDIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0ZWRTZXQoaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoc3MxLCBzZXQyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmFibGVJbnQoKSB7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MxLmFkZCgiMCIpOwotCQlzczEuYWRkKCIyIik7Ci0JCXNzMS5hZGQoIjMiKTsKLQkJc3MxLmFkZCgiMSIpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBzczE7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNldDIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0ZWRTZXQoaXRlcmFibGUsIDUpOwotCQlhc3NlcnRFcXVhbHMoc3MxLCBzZXQyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc29ydGVkU2V0KHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYXRvcl9UcmVlU2V0KCkgewotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczEgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0JCXNzMS5hZGQoIjAiKTsKLQkJc3MxLmFkZCgiMiIpOwotCQlzczEuYWRkKCIzIik7Ci0JCXNzMS5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzZXQyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydGVkU2V0KHNzMS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHNzMSwgc2V0Mik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhdG9ySW50KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCksIDgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0T2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCkudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YkFycmF5T2JqZWN0QXJyYXlJbnRJbnQoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJiYXoiLCAiam9vIiwgImphciIsICJqYXoifTsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJiYXoiLCAiam9vIn07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIENvbGxlY3Rpb25Ub29scy5zdWJBcnJheShhcnJheSwgMCwgNCkpKTsKLQotCQlyZXN1bHQgPSBuZXcgU3RyaW5nW10geyJqYXIifTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQ29sbGVjdGlvblRvb2xzLnN1YkFycmF5KGFycmF5LCA0LCAxKSkpOwotCi0JCXJlc3VsdCA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIENvbGxlY3Rpb25Ub29scy5zdWJBcnJheShhcnJheSwgNSwgMCkpKTsKLQotCQlyZXN1bHQgPSBuZXcgU3RyaW5nW10geyJqb28iLCAiamFyIiwgImpheiJ9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBDb2xsZWN0aW9uVG9vbHMuc3ViQXJyYXkoYXJyYXksIDMsIDMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YkFycmF5SW50QXJyYXlJbnRJbnQoKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFtdIHs3NywgOTksIDMzMywgNCwgOTA5MCwgNDJ9OwotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W10gezc3LCA5OSwgMzMzLCA0fTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQ29sbGVjdGlvblRvb2xzLnN1YkFycmF5KGFycmF5LCAwLCA0KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBpbnRbXSB7OTA5MH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIENvbGxlY3Rpb25Ub29scy5zdWJBcnJheShhcnJheSwgNCwgMSkpKTsKLQotCQlyZXN1bHQgPSBuZXcgaW50WzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBDb2xsZWN0aW9uVG9vbHMuc3ViQXJyYXkoYXJyYXksIDUsIDApKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IGludFtdIHs0LCA5MDkwLCA0Mn07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIENvbGxlY3Rpb25Ub29scy5zdWJBcnJheShhcnJheSwgMywgMykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViQXJyYXlDaGFyQXJyYXlJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyW10geydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZid9OwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbXSB7J2EnLCAnYicsICdjJywgJ2QnfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQ29sbGVjdGlvblRvb2xzLnN1YkFycmF5KGFycmF5LCAwLCA0KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBjaGFyW10geydlJ307Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIENvbGxlY3Rpb25Ub29scy5zdWJBcnJheShhcnJheSwgNCwgMSkpKTsKLQotCQlyZXN1bHQgPSBuZXcgY2hhclswXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQ29sbGVjdGlvblRvb2xzLnN1YkFycmF5KGFycmF5LCA1LCAwKSkpOwotCi0JCXJlc3VsdCA9IG5ldyBjaGFyW10geydkJywgJ2UnLCAnZid9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBDb2xsZWN0aW9uVG9vbHMuc3ViQXJyYXkoYXJyYXksIDMsIDMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5zd2FwKGEsIDEsIDIpOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcENoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuc3dhcChhLCAxLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcEludEFycmF5KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuc3dhcChhLCAxLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJbGlzdC5hZGQoInR3byIpOwotCQlsaXN0LmFkZCgiemVybyIpOwotCQlsaXN0ID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoaSwgbGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3RfRW1wdHkoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobGlzdCk7Ci0JCWFzc2VydEVxdWFscygwLCBsaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzTGlzdF9TaW5nbGVFbGVtZW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiemVybyIpOwotCQlsaXN0ID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QpOwotCQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJU3RyaW5nW10gYXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKSk7Ci0JCWludCBpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgYXJyYXlbaSsrXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYXJyYXlbaSsrXSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYXJyYXlbaSsrXSk7Ci0JCWFzc2VydEVxdWFscyhpLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzT2JqZWN0QXJyYXlfU2luZ2xlRWxlbWVudCgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobmV3IFN0cmluZ1tdIHsgImZvbyIgfSk7Ci0JCWFzc2VydEVxdWFscygxLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3RvcihpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3RvcihpdGVyYWJsZSwgOCk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JfT2JqZWN0KCkgewotCQlWZWN0b3I8T2JqZWN0PiB2ID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+dmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JJbnQoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDcpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gYnVpbGRPYmplY3RBcnJheTEoKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gYnVpbGRTdHJpbmdBcnJheTEoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAiemVybyIsICJvbmUiLCAidHdvIiB9OwotCX0KLQotCXByaXZhdGUgY2hhcltdIGJ1aWxkQ2hhckFycmF5KCkgewotCQlyZXR1cm4gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycgfTsKLQl9Ci0KLQlwcml2YXRlIGludFtdIGJ1aWxkSW50QXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgaW50W10geyAwLCAxMCwgMjAgfTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkyKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInRocmVlIiwgImZvdXIiLCAiZml2ZSIgfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkU3RyaW5nQXJyYXkyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgInRocmVlIiwgImZvdXIiLCAiZml2ZSIgfTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkU3RyaW5nVmVjdG9yMSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEodik7Ci0JCXJldHVybiB2OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMShsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gYnVpbGRPYmplY3RMaXN0MSgpIHsKLQkJTGlzdDxPYmplY3Q+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uMShDb2xsZWN0aW9uPD8gc3VwZXIgU3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ6ZXJvIik7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInR3byIpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMihsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvQ29sbGVjdGlvbjIoQ29sbGVjdGlvbjw/IHN1cGVyIFN0cmluZz4gYykgewotCQljLmFkZCgidGhyZWUiKTsKLQkJYy5hZGQoImZvdXIiKTsKLQkJYy5hZGQoImZpdmUiKTsKLQl9Ci0KLQlwcml2YXRlIFNldDxTdHJpbmc+IGJ1aWxkU3RyaW5nU2V0MSgpIHsKLQkJU2V0PFN0cmluZz4gcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNldDxPYmplY3Q+IGJ1aWxkT2JqZWN0U2V0MSgpIHsKLQkJU2V0PE9iamVjdD4gcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNvcnRlZFNldDxTdHJpbmc+IGJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ291bnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvdW50ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDMxNDljLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ291bnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ291bnRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIENvdW50ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb3VudGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN0b3JzKCkgewotCQlDb3VudGVyIGNvdW50ZXI7Ci0JCWNvdW50ZXIgPSBuZXcgQ291bnRlcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgY291bnRlci5jb3VudCgpKTsKLQkJY291bnRlciA9IG5ldyBDb3VudGVyKDcpOwotCQlhc3NlcnRFcXVhbHMoNywgY291bnRlci5jb3VudCgpKTsKLQkJY291bnRlciA9IG5ldyBDb3VudGVyKC03KTsKLQkJYXNzZXJ0RXF1YWxzKC03LCBjb3VudGVyLmNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmNyZW1lbnQoKSB7Ci0JCUNvdW50ZXIgY291bnRlcjsKLQkJaW50IGNvdW50OwotCQljb3VudGVyID0gbmV3IENvdW50ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvdW50ZXIuY291bnQoKSk7Ci0KLQkJY291bnQgPSBjb3VudGVyLmluY3JlbWVudCgzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNvdW50ZXIuY291bnQoKSk7Ci0KLQkJY291bnQgPSBjb3VudGVyLmluY3JlbWVudCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgY291bnQpOwotCQlhc3NlcnRFcXVhbHMoNCwgY291bnRlci5jb3VudCgpKTsKLQotCQljb3VudCA9IGNvdW50ZXIuaW5jcmVtZW50KC03KTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBjb3VudCk7Ci0JCWFzc2VydEVxdWFscygtMywgY291bnRlci5jb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVjcmVtZW50KCkgewotCQlDb3VudGVyIGNvdW50ZXI7Ci0JCWludCBjb3VudDsKLQkJY291bnRlciA9IG5ldyBDb3VudGVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBjb3VudGVyLmNvdW50KCkpOwotCi0JCWNvdW50ID0gY291bnRlci5kZWNyZW1lbnQoMyk7Ci0JCWFzc2VydEVxdWFscygtMywgY291bnQpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGNvdW50ZXIuY291bnQoKSk7Ci0KLQkJY291bnQgPSBjb3VudGVyLmRlY3JlbWVudCgpOwotCQlhc3NlcnRFcXVhbHMoLTQsIGNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKC00LCBjb3VudGVyLmNvdW50KCkpOwotCi0JCWNvdW50ID0gY291bnRlci5kZWNyZW1lbnQoLTcpOwotCQlhc3NlcnRFcXVhbHMoMywgY291bnQpOwotCQlhc3NlcnRFcXVhbHMoMywgY291bnRlci5jb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUNvdW50ZXIgY291bnRlciA9IG5ldyBDb3VudGVyKDQ0KTsKLQkJQ291bnRlciBjb3VudGVyMiA9IChDb3VudGVyKSBjb3VudGVyLmNsb25lKCk7Ci0JCWFzc2VydEVxdWFscyg0NCwgY291bnRlcjIuY291bnQoKSk7Ci0JCWFzc2VydEVxdWFscyhjb3VudGVyLCBjb3VudGVyMik7Ci0JCWFzc2VydE5vdFNhbWUoY291bnRlciwgY291bnRlcjIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUNvdW50ZXIgY291bnRlciA9IG5ldyBDb3VudGVyKDQ0KTsKLQkJQ291bnRlciBjb3VudGVyMiA9IG5ldyBDb3VudGVyKDQ0KTsKLQkJYXNzZXJ0RXF1YWxzKGNvdW50ZXIsIGNvdW50ZXIyKTsKLQkJYXNzZXJ0RXF1YWxzKGNvdW50ZXIuaGFzaENvZGUoKSwgY291bnRlcjIuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ291bnRlciBjb3VudGVyID0gbmV3IENvdW50ZXIoNDQpOwotCQlDb3VudGVyIGNvdW50ZXIyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShjb3VudGVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQ0LCBjb3VudGVyMi5jb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvdW50ZXIsIGNvdW50ZXIyKTsKLQkJYXNzZXJ0Tm90U2FtZShjb3VudGVyLCBjb3VudGVyMik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0VtcHR5SXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9FbXB0eUl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2OTIwNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0VtcHR5SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkVtcHR5SXRlcmFibGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBFbXB0eUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1wdHlJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSkgewotCQkJZmFpbCgiYm9ndXMgc3RyaW5nOiAiICsgc3RyaW5nKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ZpbGVUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ZpbGVUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2NjZjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWxlVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkZpbGVUb29sczsKLQotcHVibGljIGNsYXNzIEZpbGVUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRmlsZSB0ZW1wRGlyOwotCi0JcHVibGljIEZpbGVUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVtcERpciA9IHRoaXMuYnVpbGRUZW1wRGlyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJdGhpcy5kZWxldGVEaXIodGhpcy50ZW1wRGlyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZXNJbigpIHsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWxlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKEZpbGVUb29scy5maWxlc0luKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGZpbGUgY291bnQiLCAzLCBmaWxlcy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJlY3Rvcmllc0luKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW4odGhpcy50ZW1wRGlyLmdldFBhdGgoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgZGlyZWN0b3J5IGNvdW50IiwgMiwgZmlsZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZXNJblRyZWUoKSB7Ci0JCUNvbGxlY3Rpb248RmlsZT4gZmlsZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihGaWxlVG9vbHMuZmlsZXNJblRyZWUodGhpcy50ZW1wRGlyLmdldFBhdGgoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgZmlsZSBjb3VudCIsIDksIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcmVjdG9yaWVzSW5UcmVlKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW5UcmVlKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGRpcmVjdG9yeSBjb3VudCIsIDMsIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZURpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIGFub3RoZXIgdGVtcG9yYXJ5IGRpcmVjdG9yeSBqdXN0IGZvciB0aGlzIHRlc3QKLQkJRmlsZSBkaXIgPSB0aGlzLmJ1aWxkVGVtcERpcigpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IG5vdCBjcmVhdGVkIiwgZGlyLmV4aXN0cygpKTsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeShkaXIuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RmFsc2UoInRlbXBvcmFyeSBkaXJlY3Rvcnkgbm90IGRlbGV0ZWQiLCBkaXIuZXhpc3RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVEaXJlY3RvcnlDb250ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIGFub3RoZXIgdGVtcG9yYXJ5IGRpcmVjdG9yeSBqdXN0IGZvciB0aGlzIHRlc3QKLQkJRmlsZSBkaXIgPSB0aGlzLmJ1aWxkVGVtcERpcigpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IG5vdCBjcmVhdGVkIiwgZGlyLmV4aXN0cygpKTsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpci5nZXRQYXRoKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IHNob3VsZCBub3QgaGF2ZSBiZWVuIGRlbGV0ZWQiLCBkaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGNvbnRlbnRzIG5vdCBkZWxldGVkIiwgZGlyLmxpc3RGaWxlcygpLmxlbmd0aCA9PSAwKTsKLQkJZGlyLmRlbGV0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9GaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgImRlc3RmaWxlLnR4dCIpOwotCQl0aGlzLmNvcHlUb0ZpbGUoZGVzdEZpbGUsICJ0ZXN0Q29weVRvRmlsZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9QcmVFeGlzdGluZ0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAiZGVzdGZpbGUudHh0Iik7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKSk7Ci0JCXdyaXRlci53cml0ZSgidGhpcyB0ZXh0IHNob3VsZCBiZSByZXBsYWNlZC4uLiIpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQkJdGhpcy5jb3B5VG9GaWxlKGRlc3RGaWxlLCAidGVzdENvcHlUb1ByZUV4aXN0aW5nRmlsZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5VG9GaWxlKEZpbGUgZGVzdEZpbGUsIFN0cmluZyB3cml0ZVN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAic291cmNlZmlsZS50eHQiKTsKLQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclt3cml0ZVN0cmluZy5sZW5ndGgoKV07Ci0KLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlRmlsZSkpOwotCQl3cml0ZXIud3JpdGUod3JpdGVTdHJpbmcpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQotCQlGaWxlVG9vbHMuY29weVRvRmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSk7Ci0KLQkJUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGRlc3RGaWxlKSk7Ci0JCXJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJU3RyaW5nIHJlYWRTdHJpbmcgPSBuZXcgU3RyaW5nKHJlYWRCdWZmZXIpOwotCQlhc3NlcnRFcXVhbHMod3JpdGVTdHJpbmcsIHJlYWRTdHJpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9EaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsICJzb3VyY2VmaWxlLnR4dCIpOwotCQlTdHJpbmcgd3JpdGVTdHJpbmcgPSAidGVzdENvcHlUb0RpcmVjdG9yeSI7Ci0KLQkJRmlsZSBkZXN0RGlyID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAiZGVzdGRpciIpOwotCQlkZXN0RGlyLm1rZGlyKCk7Ci0JCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCAic291cmNlZmlsZS50eHQiKTsKLQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclt3cml0ZVN0cmluZy5sZW5ndGgoKV07Ci0KLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlRmlsZSkpOwotCQl3cml0ZXIud3JpdGUod3JpdGVTdHJpbmcpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQotCQlGaWxlVG9vbHMuY29weVRvRGlyZWN0b3J5KHNvdXJjZUZpbGUsIGRlc3REaXIpOwotCi0JCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShkZXN0RmlsZSkpOwotCQlyZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCVN0cmluZyByZWFkU3RyaW5nID0gbmV3IFN0cmluZyhyZWFkQnVmZmVyKTsKLQkJYXNzZXJ0RXF1YWxzKHdyaXRlU3RyaW5nLCByZWFkU3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHByZWZpeCA9ICJYWFh0ZXN0RmlsZVhYWCI7Ci0JCUZpbGUgdGVzdEZpbGUxID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCBwcmVmaXggKyAiMSIpOwotCQl0ZXN0RmlsZTEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIHRlc3RGaWxlMiA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgcHJlZml4ICsgIjIiKTsKLQkJdGVzdEZpbGUyLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlRmlsdGVyIGZpbHRlciA9IHRoaXMuYnVpbGRGaWxlRmlsdGVyKHByZWZpeCk7Ci0JCUl0ZXJhdG9yPEZpbGU+IGZpbHRlcmVkRmlsZXNJdGVyYXRvciA9IEZpbGVUb29scy5maWx0ZXIoRmlsZVRvb2xzLmZpbGVzSW4odGhpcy50ZW1wRGlyKSwgZmlsdGVyKTsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWx0ZXJlZEZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oZmlsdGVyZWRGaWxlc0l0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZpbHRlcmVkRmlsZXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZEZpbGVzLmNvbnRhaW5zKHRlc3RGaWxlMSkpOwotCQlhc3NlcnRUcnVlKGZpbHRlcmVkRmlsZXMuY29udGFpbnModGVzdEZpbGUyKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlRmlsdGVyIGJ1aWxkRmlsZUZpbHRlcihmaW5hbCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLQkJCQlyZXR1cm4gZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpcEV4dGVuc2lvbigpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oImZvby54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vLmJhciIsIEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbigiZm9vLmJhci54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28uIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb24oKSB7Ci0JCWFzc2VydEVxdWFscygiLnhtbCIsIEZpbGVUb29scy5leHRlbnNpb24oImZvby54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiLnhtbCIsIEZpbGVUb29scy5leHRlbnNpb24oImZvby5iYXIueG1sIikpOwotCQlhc3NlcnRFcXVhbHMoIiIsIEZpbGVUb29scy5leHRlbnNpb24oImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28seG1sIikpOwotCQlhc3NlcnRFcXVhbHMoIi4iLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28uIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVRlbXBvcmFyeURpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgdGVtcERpcjEgPSBGaWxlVG9vbHMudGVtcG9yYXJ5RGlyZWN0b3J5KCk7Ci0JCUZpbGUgdGVzdEZpbGUxID0gbmV3IEZpbGUodGVtcERpcjEsICJqdW5rIik7Ci0JCXRlc3RGaWxlMS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSB0ZW1wRGlyMiA9IEZpbGVUb29scy5lbXB0eVRlbXBvcmFyeURpcmVjdG9yeSgpOwotCQlhc3NlcnRFcXVhbHModGVtcERpcjEsIHRlbXBEaXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wRGlyMi5pc0RpcmVjdG9yeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRlbXBEaXIyLmxpc3RGaWxlcygpLmxlbmd0aCk7Ci0JCXRlbXBEaXIyLmRlbGV0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5vbmljYWxGaWxlTmFtZSgpIHsKLQkJRmlsZSBmaWxlMSA9IG5ldyBGaWxlKCJmb28iKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJhciIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiYmF6Iik7Ci0JCWZpbGUxID0gbmV3IEZpbGUoZmlsZTEsICIuLiIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiLi4iKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJhciIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiYmF6Iik7Ci0JCUZpbGUgZmlsZTIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwotCQlmaWxlMiA9IG5ldyBGaWxlKGZpbGUyLCAiZm9vIik7Ci0JCWZpbGUyID0gbmV3IEZpbGUoZmlsZTIsICJiYXIiKTsKLQkJZmlsZTIgPSBuZXcgRmlsZShmaWxlMiwgImJheiIpOwotCQlGaWxlIGZpbGUzID0gRmlsZVRvb2xzLmNhbm9uaWNhbEZpbGUoZmlsZTEpOwotCQlhc3NlcnRFcXVhbHMoZmlsZTIsIGZpbGUzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPbldpbmRvd3MoKSB7Ci0JCXJldHVybiB0aGlzLmlzRXhlY3V0aW5nT24oIldpbmRvd3MiKTsKLQl9Ci0KLQkvLwlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPbkxpbnV4KCkgewotCS8vCQlyZXR1cm4gdGhpcy5pc0V4ZWN1dGluZ09uKCJMaW51eCIpOwotCS8vCX0KLQkvLwotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uKFN0cmluZyBvc05hbWUpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmluZGV4T2Yob3NOYW1lKSAhPSAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGF0aEZpbGVzKCkgewotCQlGaWxlW10gZXhwZWN0ZWQ7Ci0JCUZpbGVbXSBhY3R1YWw7Ci0KLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPbldpbmRvd3MoKSkgewotCQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoIkM6LyIpLCBuZXcgRmlsZSgiQzovZm9vIiksIG5ldyBGaWxlKCJDOi9mb28vYmFyIiksIG5ldyBGaWxlKCJDOi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIkM6L2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JCX0KLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLyIpLCBuZXcgRmlsZSgiL2ZvbyIpLCBuZXcgRmlsZSgiL2Zvby9iYXIiKSwgbmV3IEZpbGUoIi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiL2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiZm9vIiksIG5ldyBGaWxlKCJmb28vYmFyIiksIG5ldyBGaWxlKCJmb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiZm9vL2Jhci9iYXoudHh0IikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCi0JCWV4cGVjdGVkID0gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKCIuLiIpLCBuZXcgRmlsZSgiLi4vZm9vIiksIG5ldyBGaWxlKCIuLi9mb28vYmFyIiksIG5ldyBGaWxlKCIuLi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiLi4vZm9vL2Jhci9iYXoudHh0IikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCi0JCWV4cGVjdGVkID0gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKCIuIiksIG5ldyBGaWxlKCIuL2ZvbyIpLCBuZXcgRmlsZSgiLi9mb28vYmFyIiksIG5ldyBGaWxlKCIuL2Zvby9iYXIvYmF6LnR4dCIpIH07Ci0JCWFjdHVhbCA9IHRoaXMucGF0aEZpbGVzKG5ldyBGaWxlKCIuL2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGVbXSBwYXRoRmlsZXMoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiAoRmlsZVtdKSBDbGFzc1Rvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoRmlsZVRvb2xzLmNsYXNzLCAicGF0aEZpbGVzIiwgRmlsZS5jbGFzcywgZmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlUGFyZW50RmlsZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLiIpLCB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgxKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4iKSwgdGhpcy5yZWxhdGl2ZVBhcmVudEZpbGUoMikpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uIiksIHRoaXMucmVsYXRpdmVQYXJlbnRGaWxlKDMpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgwKTsKLQkJCWZhaWwoImludmFsaWQgcmV0dXJuOiAiICsgZmlsZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJCUludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlID0gKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGV4LmdldENhdXNlKCk7Ci0JCQkJaWYgKGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgRmlsZSByZWxhdGl2ZVBhcmVudEZpbGUoaW50IGxlbikgewotCQlyZXR1cm4gKEZpbGUpIENsYXNzVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChGaWxlVG9vbHMuY2xhc3MsICJyZWxhdGl2ZVBhcmVudEZpbGUiLCBpbnQuY2xhc3MsIG5ldyBJbnRlZ2VyKGxlbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9SZWxhdGl2ZUZpbGUoKSB7Ci0JCVN0cmluZyBwcmVmaXggPSB0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkgPyAiQzoiIDogIiI7Ci0JCUZpbGUgZmlsZTsKLQkJRmlsZSBkaXI7Ci0JCUZpbGUgcmVsYXRpdmVGaWxlOwotCi0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCS8vIG9uIFdpbmRvd3MsIGEgZHJpdmUgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGEgZmlsZSB0byBiZSBhYnNvbHV0ZSAoaS5lLiBub3QgcmVsYXRpdmUpCi0JCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiL2RpcjEvZGlyMi9maWxlLnR4dCIsICJDOi9kaXIxL2RpcjIiKTsKLQkJCS8vIGRpZmZlcmVudCBkcml2ZXMKLQkJCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCJEOi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCX0KLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRSZWxhdGl2ZUZpbGUoImRpcjEvZGlyMi9maWxlLnR4dCIsIHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCIuL2RpcjEvZGlyMi9maWxlLnR4dCIsIHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCIuLi8uLi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLiIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvLi4vZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImRpcjMvZGlyNC9kaXI1L2ZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi8uLi8uLi9maWxlLnR4dCIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi9maWxlLnR4dCIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4vLi4vZGlyQS9kaXJCL2RpckMvZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uIiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvTXkgRG9jdW1lbnRzL015IFdvcmtzcGFjZS9Qcm9qZWN0IDEvbGliL3RvcGxpbmsuamFyIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvTXkgRG9jdW1lbnRzL015IFdvcmtzcGFjZS9Qcm9qZWN0IDEiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImxpYi90b3BsaW5rLmphciIpLCByZWxhdGl2ZUZpbGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNoYW5nZWRSZWxhdGl2ZUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZGlyTmFtZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCUZpbGUgcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMoZmlsZSwgcmVsYXRpdmVGaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQWJzb2x1dGVGaWxlKCkgewotCQlTdHJpbmcgcHJlZml4ID0gdGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpID8gIkM6IiA6ICIiOwotCQlGaWxlIGZpbGU7Ci0JCUZpbGUgZGlyOwotCQlGaWxlIGFic29sdXRlRmlsZTsKLQotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpKSB7Ci0JCQkvLyBvbiBXaW5kb3dzLCBhIGRyaXZlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIGZpbGUgdG8gYmUgYWJzb2x1dGUgKGkuZS4gbm90IHJlbGF0aXZlKQotCQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUoIkM6L2RpcjEvZGlyMi9maWxlLnR4dCIsICJDOi9kaXIxL2RpcjIiKTsKLQkJCS8vIGRpZmZlcmVudCBkcml2ZXMKLQkJCXRoaXMudmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKCJEOi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCX0KLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZEFic29sdXRlRmlsZShwcmVmaXggKyAiLy4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvLi4vLi4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4iKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoImZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi9kaXIyL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJkaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQkvLyB0b28gbWFueSAiLi4iIGRpcmVjdG9yaWVzIHdpbGwgcmVzb2x2ZSB0byB0aGUgcm9vdDsKLQkJLy8gdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggV2luZG93cyBhbmQgTGludXggY29tbWFuZCBzaGVsbHMKLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi8uLi8uLi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4iKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoImxpYi90b3BsaW5rLmphciIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvTXkgRG9jdW1lbnRzL015IFdvcmtzcGFjZS9Qcm9qZWN0IDEvbGliL3RvcGxpbmsuamFyIiksIGFic29sdXRlRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVOYW1lSXNSZXNlcnZlZCgpIHsKLQkJYm9vbGVhbiBleHBlY3RlZCA9IHRoaXMuaXNFeGVjdXRpbmdPbldpbmRvd3MoKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJDT04iKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiY29uIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoImNPTiIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJBVVgiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQ09NMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJMUFQzIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoIm5VTCIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJQcm4iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMoKSB7Ci0JCWJvb2xlYW4gZXhwZWN0ZWQgPSB0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoIkM6L0NPTiIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoIi9jb24vZm9vIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiYzovdGVtcC9jT04iKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJiYXIvL2Jhei8vQVVYIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiQ09NMy8vdHR0IikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiZDovTFBUMy94eHgiKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJjOi9teSBkb2NzIGFuZCBzdHVmZi90dWVzZGF5L25VTCIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoIlBybiIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNob3J0ZW5GaWxlTmFtZUZpbGUoKSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZVdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlTm9uV2luKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZVdpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFxBZG1pbmlzdHJhdG9yXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFwuLi5cXERlc2t0b3BcXFByb2plY3RcXFRleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIkM6LyIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVOb25XaW4oKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCIvaG9tZS9hZG1pbmlzdHJhdG9yL2RvY3VtZW50cyBhbmQgc2V0dGluZ3MvZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvYWRtaW5pc3RyYXRvci8uLi4vZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi9ob21lIik7Ci0JCWZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZSIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNob3J0ZW5GaWxlTmFtZUZpbGVJbnQoKSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludFdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlSW50Tm9uV2luKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludFdpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFxBZG1pbmlzdHJhdG9yXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcLi4uXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDMxLCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJDOi9UaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0Iik7Ci0JCWZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAxMCk7Ci0JCWFzc2VydEVxdWFscygiQzpcXFRoaXMgaXMgdGhlIGZpbGUgbmFtZS50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygyOCwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlSW50Tm9uV2luKCkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSgiL2hvbWUvYWRtaW5pc3RyYXRvci9kb2N1bWVudHMgYW5kIHNldHRpbmdzL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZS8uLi4vZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMzQsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi9UaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0Iik7Ci0JCWZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAxMCk7Ci0JCWFzc2VydEVxdWFscygiL1RoaXMgaXMgdGhlIGZpbGUgbmFtZS50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygyNiwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydGVuRmlsZU5hbWVVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPbldpbmRvd3MoKSkgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxXaW4oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMTm9uV2luKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMV2luKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsICJDOi9Eb2N1bWVudHMgYW5kIFNldHRpbmdzL0FkbWluaXN0cmF0b3IvRGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUodXJsKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcLi4uXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTE5vbldpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiL2hvbWUvYWRtaW5pc3RyYXRvci9kb2N1bWVudHMgYW5kIHNldHRpbmdzL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKHVybCk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvYWRtaW5pc3RyYXRvci8uLi4vZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnRlbkZpbGVOYW1lVVJMSW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMSW50V2luKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludFdpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiL0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9EZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcLi4uXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDMxLCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludE5vbldpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiL2hvbWUvYWRtaW5pc3RyYXRvci9kb2N1bWVudHMgYW5kIHNldHRpbmdzL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKHVybCwgMzEpOwotCQlhc3NlcnRFcXVhbHMoIi9ob21lLy4uLi9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygzNCwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZGlyTmFtZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCUZpbGUgYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMoZmlsZSwgYWJzb2x1dGVGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgYnVpbGRUZW1wRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gYnVpbGQgYSBuZXcgZGlyZWN0b3J5IGZvciBlYWNoIHRlc3QsIHRvIHByZXZlbnQgYW55IGNyb3NzLXRlc3QgZWZmZWN0cwotCQlGaWxlIGRpciA9IEZpbGVUb29scy5uZXdUZW1wb3JhcnlEaXJlY3RvcnkoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSArICIuIiArIHRoaXMuZ2V0TmFtZSgpKTsKLQotCQlGaWxlIGZpbGUwYSA9IG5ldyBGaWxlKGRpciwgImZpbGUwYSIpOwotCQlmaWxlMGEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUwYiA9IG5ldyBGaWxlKGRpciwgImZpbGUwYiIpOwotCQlmaWxlMGIuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUwYyA9IG5ldyBGaWxlKGRpciwgImZpbGUwYyIpOwotCQlmaWxlMGMuY3JlYXRlTmV3RmlsZSgpOwotCi0JCUZpbGUgc3ViZGlyMSA9IG5ldyBGaWxlKGRpciwgInN1YmRpcjEiKTsKLQkJc3ViZGlyMS5ta2RpcigpOwotCQlGaWxlIGZpbGUxYSA9IG5ldyBGaWxlKHN1YmRpcjEsICJmaWxlMWEiKTsKLQkJZmlsZTFhLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlMWIgPSBuZXcgRmlsZShzdWJkaXIxLCAiZmlsZTFiIik7Ci0JCWZpbGUxYi5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSBzdWJkaXIyID0gbmV3IEZpbGUoZGlyLCAic3ViZGlyMiIpOwotCQlzdWJkaXIyLm1rZGlyKCk7Ci0JCUZpbGUgZmlsZTJhID0gbmV3IEZpbGUoc3ViZGlyMiwgImZpbGUyYSIpOwotCQlmaWxlMmEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUyYiA9IG5ldyBGaWxlKHN1YmRpcjIsICJmaWxlMmIiKTsKLQkJZmlsZTJiLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlIHN1YmRpcjMgPSBuZXcgRmlsZShzdWJkaXIyLCAic3ViZGlyMyIpOwotCQlzdWJkaXIzLm1rZGlyKCk7Ci0JCUZpbGUgZmlsZTNhID0gbmV3IEZpbGUoc3ViZGlyMywgImZpbGUzYSIpOwotCQlmaWxlM2EuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUzYiA9IG5ldyBGaWxlKHN1YmRpcjMsICJmaWxlM2IiKTsKLQkJZmlsZTNiLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlyZXR1cm4gZGlyOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxldGVEaXIoRmlsZSBkaXIpIHsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeShkaXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSGFzaEJhZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNjAxMmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEhhc2hCYWdUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEhhc2hCYWc8U3RyaW5nPiBiYWc7Ci0KLQlwdWJsaWMgSGFzaEJhZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuYmFnID0gdGhpcy5idWlsZEJhZygpOwotCX0KLQotCXByaXZhdGUgSGFzaEJhZzxTdHJpbmc+IGJ1aWxkQmFnKCkgewotCQlIYXNoQmFnPFN0cmluZz4gYiA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJYi5hZGQobnVsbCk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoIm9uZSIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidHdvIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJ0d28iKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJ0aHJlZSIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidGhyZWUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoImZvdXIiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoImZvdXIiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoImZvdXIiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoImZvdXIiKSk7Ci0JCXJldHVybiBiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImZvbyIpKTsKLQkJYy5hZGQobmV3IFN0cmluZygiZm9vIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJiYXIiKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImJhciIpKTsKLQkJYy5hZGQobmV3IFN0cmluZygiYmFyIikpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJQmFnPFN0cmluZz4gYiA9IG5ldyBIYXNoQmFnPFN0cmluZz4oYyk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKGIuY29udGFpbnMocykpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN0b3JJbnRGbG9hdCgpIHsKLQkJYm9vbGVhbiBleENhdWdodDsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KC0yMCwgMC42NmYpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KDIwLCAtMC42NmYpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQkvLyB0aGUgb3RoZXIgYWRkcyB0b29rIHBsYWNlIGluIHNldFVwCi0JCWFzc2VydFRydWUodGhpcy5iYWcuYWRkKCJmaXZlIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ291bnQoKSB7Ci0JCS8vIHRoZSBvdGhlciBhZGRzIHRvb2sgcGxhY2UgaW4gc2V0VXAKLQkJdGhpcy5iYWcuYWRkKCJtaW51czMiLCAtMyk7Ci0JCXRoaXMuYmFnLmFkZCgiemVybyIsIDApOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiLCA1KTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygibWludXMzIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiemVybyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuYmFnLmNvdW50KCJvbmUiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmJhZy5jb3VudCgidHdvIikpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5iYWcuY291bnQoImZvdXIiKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB0aGlzLmJhZy5jb3VudCgiZml2ZSIpKTsKLQotCQl0aGlzLmJhZy5hZGQoInRocmVlIiwgMik7Ci0JCWFzc2VydEVxdWFscyg1LCB0aGlzLmJhZy5jb3VudCgidGhyZWUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZEFsbChjKSk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJmb3VyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCB0aGlzLmJhZy5zaXplKCkpOwotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJmb3VyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJQmFnPFN0cmluZz4gYmFnMiA9IHRoaXMuYmFnLmNsb25lKCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZywgYmFnMik7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuaGFzaENvZGUoKSA9PSBiYWcyLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhuZXcgU3RyaW5nKCJmb3VyIikpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZm8iICsgInVyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKG51bGwpOwotCQljLmFkZChuZXcgU3RyaW5nKCJvbmUiKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoInR3byIpKTsKLQkJYy5hZGQobmV3IFN0cmluZygidGhyZWUiKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImZvdXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnNBbGwoYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3VudCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuYmFnLmNvdW50KCJ6ZXJvIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5iYWcuY291bnQoIm9uZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuYmFnLmNvdW50KCJ0d28iKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmJhZy5jb3VudCgidGhyZWUiKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmJhZy5jb3VudCgiZm91ciIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuYmFnLmNvdW50KCJmaXZlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZywgYmFnMik7Ci0JCWJhZzIuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmVxdWFscyhiYWcyKSk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRoaXMuYmFnKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuZXF1YWxzKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZy5oYXNoQ29kZSgpLCBiYWcyLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmlzRW1wdHkoKSk7Ci0JCXRoaXMuYmFnLmFkZCgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMTEsIGkpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlSXRlcmF0b3IoKSB7Ci0JCWludCBpID0gMDsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg1LCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJT2JqZWN0IG5leHQgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpICYmICEiZm91ciIuZXF1YWxzKG5leHQpKSB7Ci0JCQluZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQlhc3NlcnRFcXVhbHMoNywgdGhpcy5iYWcuc2l6ZSgpKTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCS8vIHN0YXJ0IG92ZXIKLQkJaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyaWVzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPEJhZy5FbnRyeTxTdHJpbmc+PiBpdGVyYXRvciA9IHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDUsIGkpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCS8vIHN0YXJ0IG92ZXIKLQkJaXRlcmF0b3IgPSB0aGlzLmJhZy5lbnRyaWVzKCk7Ci0JCUJhZy5FbnRyeTxTdHJpbmc+IG5leHQgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQluZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQuZ2V0RWxlbWVudCgpLmVxdWFscygiZm91ciIpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotLy9UT0RPIC0gcG9vciBsb2FkIGZhY3RvciBpcyBzZWVuIGluIHRoZSBFY2xpcHNlIGJ1aWxkIGVudmlyb25tZW50IGZvciBzb21lIHJlYXNvbgotLy8JcHVibGljIHZvaWQgdGVzdEhhc2hpbmdEaXN0cmlidXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlCYWc8U3RyaW5nPiBiaWdCYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7Ci0vLwkJCWJpZ0JhZy5hZGQoIm9iamVjdCIgKyBpKTsKLS8vCQl9Ci0vLwotLy8JCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkID0gYmlnQmFnLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgidGFibGUiKTsKLS8vCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotLy8JCU9iamVjdFtdIHRhYmxlID0gKE9iamVjdFtdKSBmaWVsZC5nZXQoYmlnQmFnKTsKLS8vCQlpbnQgYnVja2V0Q291bnQgPSB0YWJsZS5sZW5ndGg7Ci0vLwkJaW50IGZpbGxlZEJ1Y2tldENvdW50ID0gMDsKLS8vCQlmb3IgKE9iamVjdCBvIDogdGFibGUpIHsKLS8vCQkJaWYgKG8gIT0gbnVsbCkgewotLy8JCQkJZmlsbGVkQnVja2V0Q291bnQrKzsKLS8vCQkJfQotLy8JCX0KLS8vCQlmbG9hdCBsb2FkRmFjdG9yID0gKChmbG9hdCkgZmlsbGVkQnVja2V0Q291bnQpIC8gKChmbG9hdCkgYnVja2V0Q291bnQpOwotLy8JCWFzc2VydFRydWUoIldBUk5JTkcgLSBwb29yIGxvYWQgZmFjdG9yOiAiICsgbG9hZEZhY3RvciwgbG9hZEZhY3RvciA+IDAuMjApOwotLy8JCWFzc2VydFRydWUoIldBUk5JTkcgLSBwb29yIGxvYWQgZmFjdG9yOiAiICsgbG9hZEZhY3RvciwgbG9hZEZhY3RvciA8IDAuNzUpOwotLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvdW50KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoIm9uZSIsIDApKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJvbmUiLCAxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgib25lIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidHdvIiwgLTMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUoInR3byIsIDEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iLCAxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidHdvIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0aHJlZSIsIDMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlQWxsKGMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJldGFpbkFsbChjKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJmb3VyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJmb3VyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnNpemUoKSA9PSAxMSk7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJYXNzZXJ0RXF1YWxzKDE2LCB0aGlzLmJhZy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJhZzxTdHJpbmc+IGJhZzIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKHRoaXMuYmFnKTsKLQotCQlhc3NlcnRUcnVlKCJzYW1lIG9iamVjdD8iLCB0aGlzLmJhZyAhPSBiYWcyKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBiYWcyLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZywgYmFnMik7Ci0JCS8vIGxvb2sgZm9yIHNpbWlsYXIgZWxlbWVudHMKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUoYmFnMi5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKGJhZzIuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRUcnVlKGJhZzIuY29udGFpbnMoImZvdXIiKSk7Ci0KLQkJaW50IG51bGxDb3VudCA9IDAsIG9uZUNvdW50ID0gMCwgdHdvQ291bnQgPSAwLCB0aHJlZUNvdW50ID0gMCwgZm91ckNvdW50ID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGJhZzIpIHsKLQkJCWlmIChzID09IG51bGwpIHsKLQkJCQludWxsQ291bnQrKzsKLQkJCX0gZWxzZSBpZiAocy5lcXVhbHMoIm9uZSIpKSB7Ci0JCQkJb25lQ291bnQrKzsKLQkJCX0gZWxzZSBpZiAocy5lcXVhbHMoInR3byIpKSB7Ci0JCQkJdHdvQ291bnQrKzsKLQkJCX0gZWxzZSBpZiAocy5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0aHJlZUNvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJmb3VyIikpIHsKLQkJCQlmb3VyQ291bnQrKzsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgbnVsbENvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9uZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHR3b0NvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRocmVlQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoNCwgZm91ckNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYmFnLnRvQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiZm91ciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1sxMl07Ci0JCWFbMTFdID0gIm5vdCBudWxsIjsKLQkJU3RyaW5nW10gYiA9IHRoaXMuYmFnLnRvQXJyYXkoYSk7Ci0JCWFzc2VydEVxdWFscyhhLCBiKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZShhWzExXSA9PSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBzID0gdGhpcy5iYWcudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShzLnN0YXJ0c1dpdGgoIlsiKSk7Ci0JCWFzc2VydFRydWUocy5lbmRzV2l0aCgiXSIpKTsKLQkJaW50IGNvbW1hQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKHMuY2hhckF0KGkpID09ICcsJykgewotCQkJCWNvbW1hQ291bnQrKzsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoMTAsIGNvbW1hQ291bnQpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigib25lIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigidHdvIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigidGhyZWUiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJmb3VyIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigibnVsbCIpICE9IC0xKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxY2JiMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0lkZW50aXR5SGFzaEJhZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLklkZW50aXR5SGFzaEJhZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlIYXNoQmFnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWc7Ci0JcHJpdmF0ZSBTdHJpbmcgb25lID0gIm9uZSI7Ci0JcHJpdmF0ZSBTdHJpbmcgdHdvID0gInR3byI7Ci0JcHJpdmF0ZSBTdHJpbmcgdGhyZWUgPSAidGhyZWUiOwotCXByaXZhdGUgU3RyaW5nIGZvdXIgPSAiZm91ciI7Ci0JcHJpdmF0ZSBTdHJpbmcgZm9vID0gImZvbyI7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFyID0gImJhciI7Ci0KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5iYWcgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBidWlsZEJhZygpIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IElkZW50aXR5SGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQobnVsbCk7Ci0JCXJlc3VsdC5hZGQodGhpcy5vbmUpOwotCQlyZXN1bHQuYWRkKHRoaXMudHdvKTsKLQkJcmVzdWx0LmFkZCh0aGlzLnR3byk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy5mb3VyKTsKLQkJcmVzdWx0LmFkZCh0aGlzLmZvdXIpOwotCQlyZXN1bHQuYWRkKHRoaXMuZm91cik7Ci0JCXJlc3VsdC5hZGQodGhpcy5mb3VyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCXJldHVybiBjOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gbG9jYWxCYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oYyk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKGxvY2FsQmFnLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckludEZsb2F0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0OwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oLTIwLCAwLjY2Zik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oMjAsIC0wLjY2Zik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQkvLyB0aGUgb3RoZXIgYWRkcyB0b29rIHBsYWNlIGluIHNldFVwCi0JCVN0cmluZyBmaXZlID0gImZpdmUiOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZChmaXZlKSk7Ci0JCi0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhmaXZlKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3VudCgpIHsKLQkJU3RyaW5nIG1pbnVzMyA9ICJtaW51czMiOwotCQlTdHJpbmcgemVybyA9ICJ6ZXJvIjsKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCS8vIHRoZSBvdGhlciBhZGRzIHRvb2sgcGxhY2UgaW4gc2V0VXAKLQkJdGhpcy5iYWcuYWRkKG1pbnVzMywgLTMpOwotCQl0aGlzLmJhZy5hZGQoemVybywgMCk7Ci0JCXRoaXMuYmFnLmFkZChmaXZlLCA1KTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhtaW51czMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoemVybykpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5iYWcuY291bnQodGhpcy5vbmUpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuYmFnLmNvdW50KHRoaXMudHdvKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmJhZy5jb3VudCh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmJhZy5jb3VudCh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHRoaXMuYmFnLmNvdW50KGZpdmUpKTsKLQotCQl0aGlzLmJhZy5hZGQodGhpcy50aHJlZSwgMik7Ci0JCWFzc2VydEVxdWFscyg1LCB0aGlzLmJhZy5jb3VudCh0aGlzLnRocmVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZEFsbChjKSk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5iYWcuc2l6ZSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5iYWcuY2xvbmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiYmFkIGNsb25lIiwgdGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscygiYmFkIGNsb25lIiwgdGhpcy5iYWcsIGJhZzIpOwotCQlhc3NlcnRUcnVlKCJiYWQgY2xvbmUiLCB0aGlzLmJhZy5oYXNoQ29kZSgpID09IGJhZzIuaGFzaENvZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhuZXcgU3RyaW5nKCJmb3VyIikpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWMuYWRkKHRoaXMub25lKTsKLQkJYy5hZGQodGhpcy50d28pOwotCQljLmFkZCh0aGlzLnRocmVlKTsKLQkJYy5hZGQodGhpcy5mb3VyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWluc0FsbChjKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcodGhpcy5mb3VyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvdW50KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuY291bnQoInplcm8iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmJhZy5jb3VudCgib25lIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5iYWcuY291bnQoInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYmFnLmNvdW50KCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuYmFnLmNvdW50KCJmb3VyIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuY291bnQoImZpdmUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZywgYmFnMik7Ci0JCWJhZzIuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmVxdWFscyhiYWcyKSk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRoaXMuYmFnKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuZXF1YWxzKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcuaGFzaENvZGUoKSwgYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmlzRW1wdHkoKSk7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDExLCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmJhZy5zaXplKCkpOwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDUsIGkpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCS8vIHN0YXJ0IG92ZXIKLQkJaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkgJiYgIXRoaXMuZm91ci5lcXVhbHMobmV4dCkpIHsKLQkJCW5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCWFzc2VydEVxdWFscyg3LCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBmaXZlID0gImZpdmUiOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cmllcygpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWcuRW50cnk8U3RyaW5nPj4gaXRlcmF0b3IgPSB0aGlzLmJhZy5lbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg1LCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWcuRW50cnk8U3RyaW5nPiBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0LmdldEVsZW1lbnQoKS5lcXVhbHModGhpcy5mb3VyKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscyg3LCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCS8vIENvbW1lbnRpbmcgb3V0IHRoaXMgdGVzdCBhcyBpdCBpcyBhbHNvIGZhaWxpbmcgaW4gdGhlIEVjbGlwc2UgYnVpbGQKLQkvLyBhcHBhcmVubHkgdGhlcmUgYXJlIHNvbWUgaGFzaGluZyBpc3N1ZXMgdGhhdCBuZWVkIHRvIGJlIGxvb2tlZCBpbnRvLgotLy8JcHVibGljIHZvaWQgdGVzdEhhc2hpbmdEaXN0cmlidXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiaWdCYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKLS8vCQkJYmlnQmFnLmFkZCgib2JqZWN0IiArIGkpOwotLy8JCX0KLS8vCQotLy8JCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkID0gYmlnQmFnLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgidGFibGUiKTsKLS8vCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotLy8JCU9iamVjdFtdIHRhYmxlID0gKE9iamVjdFtdKSBmaWVsZC5nZXQoYmlnQmFnKTsKLS8vCQlpbnQgYnVja2V0Q291bnQgPSB0YWJsZS5sZW5ndGg7Ci0vLwkJaW50IGZpbGxlZEJ1Y2tldENvdW50ID0gMDsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1Y2tldENvdW50OyBpKyspIHsKLS8vCQkJaWYgKHRhYmxlW2ldICE9IG51bGwpIHsKLS8vCQkJCWZpbGxlZEJ1Y2tldENvdW50Kys7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZmxvYXQgbG9hZEZhY3RvciA9ICgoZmxvYXQpIGZpbGxlZEJ1Y2tldENvdW50KS8oKGZsb2F0KSBidWNrZXRDb3VudCk7Ci0vLwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IgKyAiICgiICsgZmlsbGVkQnVja2V0Q291bnQgKyAiLyIgKyBidWNrZXRDb3VudCArICIpIik7Ci0vLwkJYXNzZXJ0VHJ1ZSgiV0FSTklORyAtIHBvb3IgbG9hZCBmYWN0b3I6ICIgKyBsb2FkRmFjdG9yLCBsb2FkRmFjdG9yID4gMC4yMCk7Ci0vLwkJYXNzZXJ0VHJ1ZSgiV0FSTklORyAtIHBvb3IgbG9hZCBmYWN0b3I6ICIgKyBsb2FkRmFjdG9yLCBsb2FkRmFjdG9yIDwgMC43NSk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lKSk7Ci0JCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZShuZXcgU3RyaW5nKHRoaXMudGhyZWUpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb3VudCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lLCAwKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSwgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28sIC0zKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvLCAxKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bywgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnRocmVlLCAzKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudGhyZWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCh0aGlzLm9uZSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcodGhpcy50d28pKTsKLQkJYy5hZGQodGhpcy50aHJlZSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlQWxsKGMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmVBbGwoYykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCh0aGlzLm9uZSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcodGhpcy50d28pKTsKLQkJYy5hZGQodGhpcy50aHJlZSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmV0YWluQWxsKGMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5mb3VyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5mb3VyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJldGFpbkFsbChjKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnNpemUoKSA9PSAxMSk7Ci0JCVN0cmluZyBmaXZlID0gImZpdmUiOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCXRoaXMuYmFnLmFkZChuZXcgU3RyaW5nKGZpdmUpKTsKLQkJYXNzZXJ0RXF1YWxzKDE2LCB0aGlzLmJhZy5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWcyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZSh0aGlzLmJhZyk7Ci0JCi0JCWFzc2VydFRydWUoInNhbWUgb2JqZWN0PyIsIHRoaXMuYmFnICE9IGJhZzIpOwotCQlhc3NlcnRFcXVhbHMoMTEsIGJhZzIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5iYWcuaXRlcmF0b3IoKSksIENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKSk7Ci0JCS8vIGxvb2sgZm9yIHNpbWlsYXIgZWxlbWVudHMKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKS5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKS5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKS5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpLmNvbnRhaW5zKCJmb3VyIikpOwotCQotCQlpbnQgbnVsbENvdW50ID0gMCwgb25lQ291bnQgPSAwLCB0d29Db3VudCA9IDAsIHRocmVlQ291bnQgPSAwLCBmb3VyQ291bnQgPSAwOwotCQlmb3IgKFN0cmluZyBuZXh0IDogYmFnMikgewotCQkJaWYgKG5leHQgPT0gbnVsbCkKLQkJCQludWxsQ291bnQrKzsKLQkJCWVsc2UgaWYgKG5leHQuZXF1YWxzKCJvbmUiKSkKLQkJCQlvbmVDb3VudCsrOwotCQkJZWxzZSBpZiAobmV4dC5lcXVhbHMoInR3byIpKQotCQkJCXR3b0NvdW50Kys7Ci0JCQllbHNlIGlmIChuZXh0LmVxdWFscygidGhyZWUiKSkKLQkJCQl0aHJlZUNvdW50Kys7Ci0JCQllbHNlIGlmIChuZXh0LmVxdWFscygiZm91ciIpKQotCQkJCWZvdXJDb3VudCsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygxLCBudWxsQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoMSwgb25lQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoMiwgdHdvQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhyZWVDb3VudCk7Ci0JCWFzc2VydEVxdWFscyg0LCBmb3VyQ291bnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYmFnLnRvQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgdGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgdGhpcy50d28pKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgdGhpcy50aHJlZSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCB0aGlzLmZvdXIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMTJdOwotCQlhWzExXSA9ICJub3QgbnVsbCI7Ci0JCVN0cmluZ1tdIGIgPSB0aGlzLmJhZy50b0FycmF5KGEpOwotCQlhc3NlcnRFcXVhbHMoYSwgYik7Ci0JCWFzc2VydEVxdWFscygxMiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIHRoaXMub25lKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgdGhpcy5mb3VyKSk7Ci0JCWFzc2VydFRydWUoYVsxMV0gPT0gbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJU3RyaW5nIHMgPSB0aGlzLmJhZy50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHMuc3RhcnRzV2l0aCgiWyIpKTsKLQkJYXNzZXJ0VHJ1ZShzLmVuZHNXaXRoKCJdIikpOwotCQlpbnQgY29tbWFDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAocy5jaGFyQXQoaSkgPT0gJywnKSB7Ci0JCQkJY29tbWFDb3VudCsrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBudW1iZXIgb2YgY29tbWFzIiwgMTAsIGNvbW1hQ291bnQpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigib25lIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigidHdvIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigidGhyZWUiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJmb3VyIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigibnVsbCIpICE9IC0xKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NzE4OTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5JbmRlbnRpbmdQcmludFdyaXRlcjsKLQotcHVibGljIGNsYXNzIEluZGVudGluZ1ByaW50V3JpdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JU3RyaW5nV3JpdGVyIHN3MTsKLQlTdHJpbmdXcml0ZXIgc3cyOwotCUluZGVudGluZ1ByaW50V3JpdGVyIGlwdzE7Ci0JSW5kZW50aW5nUHJpbnRXcml0ZXIgaXB3MjsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLQlwdWJsaWMgSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN3MSA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJdGhpcy5pcHcxID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKHRoaXMuc3cxKTsKLQkJdGhpcy5zdzIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCXRoaXMuaXB3MiA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcih0aGlzLnN3MiwgIiAgICAiKTsgLy8gaW5kZW50IHdpdGggNCBzcGFjZXMgaW5zdGVhZCBvZiBhIHRhYgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZW50KCkgewotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5pbmRlbnRMZXZlbCgpKTsKLQkJdGhpcy5pcHcxLmluZGVudCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDEsIHRoaXMuaXB3MS5pbmRlbnRMZXZlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZW50KCkgewotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5pbmRlbnRMZXZlbCgpKTsKLQkJdGhpcy5pcHcxLmluZGVudCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDEsIHRoaXMuaXB3MS5pbmRlbnRMZXZlbCgpKTsKLQkJdGhpcy5pcHcxLnVuZGVudCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5pbmRlbnRMZXZlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50SW5kZW50TGV2ZWwoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5jcmVtZW50SW5kZW50TGV2ZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAxLCB0aGlzLmlwdzEuaW5kZW50TGV2ZWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlY3JlbWVudEluZGVudExldmVsKCkgewotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5pbmRlbnRMZXZlbCgpKTsKLQkJdGhpcy5pcHcxLmluY3JlbWVudEluZGVudExldmVsKCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMSwgdGhpcy5pcHcxLmluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuZGVjcmVtZW50SW5kZW50TGV2ZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuaW5kZW50TGV2ZWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW50VGFiKCkgewotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiZm9vMCIgKyBDUiArICJcdGZvbzEiICsgQ1IgKyAiXHRmb28xIiArIENSICsgIlx0XHRmb28yIiArIENSICsgIlx0Zm9vMSIgKyBDUiArICJcdGZvbzEiICsgQ1IgKyAiZm9vMCIgKyBDUjsKLQotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMCIpOwotCQl0aGlzLmlwdzEuaW5kZW50KCk7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3MS5pbmRlbnQoKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzIiKTsKLQkJdGhpcy5pcHcxLnVuZGVudCgpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzEudW5kZW50KCk7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28wIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBvdXRwdXQiLCBleHBlY3RlZCwgdGhpcy5zdzEudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW50U3BhY2VzKCkgewotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiZm9vMCIgKyBDUiArICIgICAgZm9vMSIgKyBDUiArICIgICAgZm9vMSIgKyBDUiArICIgICAgICAgIGZvbzIiICsgQ1IgKyAiICAgIGZvbzEiICsgQ1IgKyAiICAgIGZvbzEiICsgQ1IgKyAiZm9vMCIgKyBDUjsKLQotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMCIpOwotCQl0aGlzLmlwdzIuaW5kZW50KCk7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3Mi5pbmRlbnQoKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzIiKTsKLQkJdGhpcy5pcHcyLnVuZGVudCgpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzIudW5kZW50KCk7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28wIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBvdXRwdXQiLCBleHBlY3RlZCwgdGhpcy5zdzIudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0pEQkNUeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSkRCQ1R5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2RhZDE5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSkRCQ1R5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLlR5cGVzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5KREJDVHlwZTsKLQotcHVibGljIGNsYXNzIEpEQkNUeXBlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSkRCQ1R5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZXNTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoVHlwZXMuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGgsIEpEQkNUeXBlLnR5cGVzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZSgpIHsKLQkJSkRCQ1R5cGUgamRiY1R5cGU7Ci0JCWpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShUeXBlcy5WQVJDSEFSKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSIiwgamRiY1R5cGUubmFtZSgpKTsKLQotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuSU5URUdFUik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGpkYmNUeXBlLm5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvZGUoKSB7Ci0JCUpEQkNUeXBlIGpkYmNUeXBlOwotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7Ci0JCWFzc2VydEVxdWFscyhUeXBlcy5WQVJDSEFSLCBqZGJjVHlwZS5jb2RlKCkpOwotCi0JCWpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShUeXBlcy5JTlRFR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKFR5cGVzLklOVEVHRVIsIGpkYmNUeXBlLmNvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUeXBlQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoNTUpOwotCQkJZmFpbCgiaW52YWxpZCBKREJDVHlwZTogIiArIGpkYmNUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUeXBlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoIlZBUkNIQVIyIik7Ci0JCQlmYWlsKCJpbnZhbGlkIEpEQkNUeXBlOiAiICsgamRiY1R5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSmF2YVR5cGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KYXZhVHlwZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNjMzNmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KYXZhVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZUphdmFUeXBlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBKYXZhVHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRWxlbWVudFR5cGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKG51bGwsIDApOwotCQkJZmFpbCgiaW52YWxpZCBKYXZhVHlwZTogIiArIGphdmFUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRFbGVtZW50VHlwZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKCIiLCAwKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRWxlbWVudFR5cGVBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MuZ2V0TmFtZSgpLCAwKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQXJyYXlEZXB0aE5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpLCAtMik7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFZvaWRBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzLmdldE5hbWUoKSwgMik7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCRFbnRyeSIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCRFbnRyeSIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoMCwgamF2YVR5cGUuZ2V0QXJyYXlEZXB0aCgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygyLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlLmlzQXJyYXkoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNBcnJheSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhpbnQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhpbnRbXS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKHZvaWQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3MoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlKYXZhQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YUNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFDbGFzcywgamF2YVR5cGUuZ2V0SmF2YUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQ2xhc3NOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIltMamF2YS5sYW5nLk9iamVjdDsiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiW0kiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAkRW50cnkiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0xqYXZhLnV0aWwuTWFwJEVudHJ5OyIsIGphdmFUeXBlLmdldEphdmFDbGFzc05hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaWJlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoaW50LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoaW50W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyh2b2lkLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuZGVzY3JpYmVzKGphdmFDbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdFtdIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50W10iLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcC5FbnRyeSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLkVudHJ5W11bXSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50W10uY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSnB0VXRpbGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0pwdFV0aWxpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzMwNmMwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSnB0VXRpbGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzLkpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5KcHRVdGlsaXR5TW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5ub2RlLkpwdFV0aWxpdHlOb2RlVGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlOb2RlVGVzdHMuc3VpdGUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJpdFRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQm9vbGVhbkhvbGRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsYXNzcGF0aFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsYXNzVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb2xsZWN0aW9uVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb3VudGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW1wdHlJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbGVUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEhhc2hCYWdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJZGVudGl0eUhhc2hCYWdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFUeXBlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSkRCQ1R5cGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNZXRob2RTaWduYXR1cmVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOYW1lVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSYW5nZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJldmVyc2VDb21wYXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVTdGFja1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0cmluZ1Rvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkQm9vbGVhblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZE9iamVjdFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZFN0YWNrVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWE1MU3RyaW5nRW5jb2RlclRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5VGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NZXRob2RTaWduYXR1cmVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NZXRob2RTaWduYXR1cmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ2ZjViLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTWV0aG9kU2lnbmF0dXJlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5KYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlTWV0aG9kU2lnbmF0dXJlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2lnbmF0dXJlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTWV0aG9kU2lnbmF0dXJlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgoU3RyaW5nKSBudWxsKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoIiIpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgKEphdmFUeXBlW10pIG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVzTnVsbEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIG5ldyBKYXZhVHlwZVsxXSk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyVHlwZXNWb2lkSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqdCA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgSmF2YVR5cGVbXSB7anR9KTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJUeXBlTmFtZXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCAoU3RyaW5nW10pIG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVOYW1lc051bGxJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgU3RyaW5nWzFdKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJKYXZhQ2xhc3Nlc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIChDbGFzczw/PltdKSBudWxsKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJKYXZhQ2xhc3Nlc051bGxJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgQ2xhc3NbMV0pOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMCgpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QwIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDAoKSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QxIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDEoaW50KSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QyIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDIoaW50LCBqYXZhLmxhbmcuU3RyaW5nKSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMygpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDMoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W11bXSkiLCBtcy5nZXRTaWduYXR1cmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QyIiwgbXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyYW1ldGVyVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJSmF2YVR5cGVbXSBleHBlY3RlZCA9IG5ldyBKYXZhVHlwZVszXTsKLQkJZXhwZWN0ZWRbMF0gPSBuZXcgU2ltcGxlSmF2YVR5cGUoImludCIpOwotCQlleHBlY3RlZFsxXSA9IG5ldyBTaW1wbGVKYXZhVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOwotCQlleHBlY3RlZFsyXSA9IG5ldyBTaW1wbGVKYXZhVHlwZSgiamF2YS5sYW5nLk9iamVjdCIsIDIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIG1zLmdldFBhcmFtZXRlclR5cGVzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtczEgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlPYmplY3QgbXMyID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJYXNzZXJ0Tm90U2FtZShtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMSk7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEuaGFzaENvZGUoKSwgbXMyLmhhc2hDb2RlKCkpOwotCi0JCU9iamVjdCBtczMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QyIikpOwotCQlhc3NlcnROb3RTYW1lKG1zMSwgbXMzKTsKLQkJYXNzZXJ0RmFsc2UobXMxLmVxdWFscyhtczMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMxID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zMiA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtczEuY29tcGFyZVRvKG1zMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG8yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZFNpZ25hdHVyZSBtczEgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlNZXRob2RTaWduYXR1cmUgbXMyID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMiIpKTsKLQkJYXNzZXJ0VHJ1ZShtczEuY29tcGFyZVRvKG1zMikgPiAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvMygpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXNBMSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZEEiLCBuZXcgQ2xhc3NbXSB7aW50LmNsYXNzLCBTdHJpbmcuY2xhc3N9KSk7Ci0JCU1ldGhvZFNpZ25hdHVyZSBtc0EyID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kQSIsIG5ldyBDbGFzc1tdIHtpbnQuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfSkpOwotCQlhc3NlcnRUcnVlKG1zQTEuY29tcGFyZVRvKG1zQTIpIDwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBhcmVUbzQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zQjEgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2RCIiwgbmV3IENsYXNzW10ge2ludC5jbGFzcywgT2JqZWN0LmNsYXNzfSkpOwotCQlNZXRob2RTaWduYXR1cmUgbXNCMiA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZEIiLCBuZXcgQ2xhc3NbXSB7aW50LmNsYXNzLCBTdHJpbmcuY2xhc3N9KSk7Ci0JCWFzc2VydFRydWUobXNCMS5jb21wYXJlVG8obXNCMikgPCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTWV0aG9kU2lnbmF0dXJlIG1zMSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCVNpbXBsZU1ldGhvZFNpZ25hdHVyZSBtczIgPSAoU2ltcGxlTWV0aG9kU2lnbmF0dXJlKSBtczEuY2xvbmUoKTsKLQkJYXNzZXJ0Tm90U2FtZShtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTWV0aG9kU2lnbmF0dXJlIG1zMSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCVNpbXBsZU1ldGhvZFNpZ25hdHVyZSBtczIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKG1zMSk7Ci0JCWFzc2VydE5vdFNhbWUobXMxLCBtczIpOwotCQlhc3NlcnRFcXVhbHMobXMxLCBtczIpOwotCX0KLQotCXByaXZhdGUgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlmb3IgKE1ldGhvZCBtZXRob2QgOiB0aGlzLmdldENsYXNzKCkuZ2V0TWV0aG9kcygpKSB7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1ldGhvZCBub3QgZm91bmQ6ICIgKyBtZXRob2ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIE1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+Li4uIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1ldGhvZDAoKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCXB1YmxpYyB2b2lkIG1ldGhvZDEoaW50IGZvbykgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlwdWJsaWMgdm9pZCBtZXRob2QyKGludCBmb28sIFN0cmluZyBiYXIpIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0JcHVibGljIHZvaWQgbWV0aG9kMyhpbnQgZm9vLCBTdHJpbmcgYmFyLCBPYmplY3RbXVtdIGJheikgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQotCXB1YmxpYyB2b2lkIG1ldGhvZEEoaW50IGZvbywgU3RyaW5nIGJhcikgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlwdWJsaWMgdm9pZCBtZXRob2RBKGludCBmb28sIFN0cmluZyBiYXIsIFN0cmluZyBiYXopIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0KLQlwdWJsaWMgdm9pZCBtZXRob2RCKGludCBmb28sIE9iamVjdCBiYXIpIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0JcHVibGljIHZvaWQgbWV0aG9kQihpbnQgZm9vLCBTdHJpbmcgYmFyKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODk1ODMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9OYW1lVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBOYW1lVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBOYW1lVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQWJzZW50SWdub3JlQ2FzZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xvckNvbGxlY3Rpb24oKTsKLQkJU3RyaW5nIHJldHVybmVkID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUYXVwZSIsIGNvbG9yQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiVGF1cGUiLCByZXR1cm5lZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1ByZXNlbnRDYXNlRGlmZmVycygpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xvckNvbGxlY3Rpb24oKTsKLQkJU3RyaW5nIHJldHVybmVkID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoImdyZWVuIiwgY29sb3JDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJncmVlbiIsIHJldHVybmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUHJlc2VudElnbm9yZUNhc2UoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sb3JDb2xsZWN0aW9uKCk7Ci0JCVN0cmluZyByZXR1cm5lZCA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiZ3JlZW4iLCBjb2xvckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImdyZWVuMiIsIHJldHVybmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUHJlc2VudFdpdGhBcHBlbmRpY2VzKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbG9yQ29sbGVjdGlvbigpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJSZWQxIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoInJlZDIiKTsKLQkJU3RyaW5nIHJldHVybmVkID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJyZWQiLCBjb2xvckNvbGxlY3Rpb24pOwotCQljb2xvckNvbGxlY3Rpb24ucmVtb3ZlKCJSZWQxIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5yZW1vdmUoInJlZDIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJyZWQzIiwgcmV0dXJuZWQpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQ29sb3JDb2xsZWN0aW9uKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIlJlZCIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJPcmFuZ2UiKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiWWVsbG93Iik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIkdyZWVuIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIkJsdWUiKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiSW5kaWdvIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIlZpb2xldCIpOwotCQlyZXR1cm4gY29sb3JDb2xsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9yQ29sbGVjdGlvbjEoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSBDb3Jwb3JhdGlvbiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgib3JhY2xlMSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2wiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiVGVzdCIsIHN0cmluZ3MpKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIk9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJvcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiVGVzdCIsIHN0cmluZ3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckNvbGxlY3Rpb24yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJvcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTEiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiVGVzdCIsIHN0cmluZ3MpKTsKLQotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIENvcnBvcmF0aW9uIik7Ci0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiT3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIm9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIm9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUZXN0Iiwgc3RyaW5ncykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9yQ29sbGVjdGlvbjMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JJdGVyYXRvcjEoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSBDb3Jwb3JhdGlvbiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgib3JhY2xlMSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2wiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJUZXN0Iiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJvcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUZXN0Iiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JJdGVyYXRvcjIoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIm9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIlRlc3QiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIENvcnBvcmF0aW9uIik7Ci0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygib3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgib3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiVGVzdCIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9ySXRlcmF0b3IzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTEiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoImNhdGFsb2cuc2NoZW1hLm5hbWUiLCBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUoImNhdGFsb2ciLCAic2NoZW1hIiwgIm5hbWUiKSk7Ci0JCWFzc2VydEVxdWFscygiY2F0YWxvZy4ubmFtZSIsIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZSgiY2F0YWxvZyIsIG51bGwsICJuYW1lIikpOwotCQlhc3NlcnRFcXVhbHMoInNjaGVtYS5uYW1lIiwgTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKG51bGwsICJzY2hlbWEiLCAibmFtZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKG51bGwsIG51bGwsICJuYW1lIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUmVzZXJ2ZWRXb3JkcygpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoTmFtZVRvb2xzLmphdmFSZXNlcnZlZFdvcmRzKCksICJjbGFzcyIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKE5hbWVUb29scy5qYXZhUmVzZXJ2ZWRXb3JkcygpLCAiQ2xhc3MiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKE5hbWVUb29scy5qYXZhUmVzZXJ2ZWRXb3JkcygpLCAicHJpdmF0ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Y29udmVydFRvSmF2YUlkZW50aWZpZXJTdHJpbmcoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMSIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vMSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcml2YXRlXyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigicHJpdmF0ZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJvd18iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInRocm93IikpOwotCQlhc3NlcnRFcXVhbHMoIl9mb28iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoIjFmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vXyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vJSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fX2Jhcl9fIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28gIGJhciAgIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Rjb252ZXJ0VG9KYXZhSWRlbnRpZmllclN0cmluZ0NoYXIoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28iLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28xIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygicHJpdmF0ZSQiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInByaXZhdGUiLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJvd3NzIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJ0aHJvdyIsICdzJykpOwotCQlhc3NlcnRFcXVhbHMoIiRmb28iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoIjFmb28iLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28kIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28lIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vJCRiYXIkJCIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vICBiYXIgICIsICckJykpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCIxZm9vIiwgJzcnKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiBcIiIgKyBzICsgIlwiIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCc3JykgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28lIiwgJ14nKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiBcIiIgKyBzICsgIlwiIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCdeJykgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJwcml2YXRlIiwgJ14nKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiBcIiIgKyBzICsgIlwiIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCdeJykgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCkgewotCQlhc3NlcnRGYWxzZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCJjbGFzcyIpKTsKLQkJYXNzZXJ0VHJ1ZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCJjbGFzUyIpKTsKLQotCQlhc3NlcnRGYWxzZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCI3Zm9vIikpOwotCQlhc3NlcnRGYWxzZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCJmb29AYmFyIikpOwotCQlhc3NlcnRUcnVlKE5hbWVUb29scy5zdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoIl9mb28iKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JhbmdlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmFuZ2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2YyY2NlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmFuZ2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLQotcHVibGljIGNsYXNzIFJhbmdlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmFuZ2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZXMoKSB7Ci0JCVJhbmdlIHJhbmdlID0gbmV3IFJhbmdlKDUsIDE3KTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UuaW5jbHVkZXMoLTU1KSk7Ci0JCWFzc2VydEZhbHNlKHJhbmdlLmluY2x1ZGVzKDApKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UuaW5jbHVkZXMoNCkpOwotCQlhc3NlcnRUcnVlKHJhbmdlLmluY2x1ZGVzKDUpKTsKLQkJYXNzZXJ0VHJ1ZShyYW5nZS5pbmNsdWRlcyg2KSk7Ci0JCWFzc2VydFRydWUocmFuZ2UuaW5jbHVkZXMoMTYpKTsKLQkJYXNzZXJ0VHJ1ZShyYW5nZS5pbmNsdWRlcygxNykpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcygxOCkpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcygyMDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlSYW5nZSByYW5nZTEgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlSYW5nZSByYW5nZTIgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlhc3NlcnROb3RTYW1lKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMiwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0KLQkJcmFuZ2UyID0gbmV3IFJhbmdlKDE3LCA1KTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UxLmVxdWFscyhyYW5nZTIpKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UyLmVxdWFscyhyYW5nZTEpKTsKLQkJLy8gYWx0aG91Z2ggdGhleSBhcmUgdW5lcXVhbCwgdGhleSBjYW4gaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0KLQkJcmFuZ2UyID0gbmV3IFJhbmdlKDUsIDE1KTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UxLmVxdWFscyhyYW5nZTIpKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UyLmVxdWFscyhyYW5nZTEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCVJhbmdlIHJhbmdlMSA9IG5ldyBSYW5nZSg1LCAxNyk7Ci0JCVJhbmdlIHJhbmdlMiA9IHJhbmdlMS5jbG9uZSgpOwotCQlhc3NlcnROb3RTYW1lKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMiwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmFuZ2UgcmFuZ2UxID0gbmV3IFJhbmdlKDUsIDE3KTsKLQkJUmFuZ2UgcmFuZ2UyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShyYW5nZTEpOwotCQlhc3NlcnROb3RTYW1lKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMiwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JldmVyc2VDb21wYXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWUwMGZkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmV2ZXJzZUNvbXBhcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBSZXZlcnNlQ29tcGFyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IG5hdHVyYWxSZXZlcnNlQ29tcGFyYXRvcjsKLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBjdXN0b21Db21wYXJhdG9yOwotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGN1c3RvbVJldmVyc2VDb21wYXJhdG9yOwotCi0JcHVibGljIFJldmVyc2VDb21wYXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5uYXR1cmFsUmV2ZXJzZUNvbXBhcmF0b3IgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpOwotCQl0aGlzLmN1c3RvbUNvbXBhcmF0b3IgPSB0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpOwotCQl0aGlzLmN1c3RvbVJldmVyc2VDb21wYXJhdG9yID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4odGhpcy5jdXN0b21Db21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJU3RyaW5nIGxvd2VyMSA9IHMxLnRvTG93ZXJDYXNlKCk7Ci0JCQkJU3RyaW5nIGxvd2VyMiA9IHMyLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaW50IHJlc3VsdCA9IGxvd2VyMS5jb21wYXJlVG8obG93ZXIyKTsKLQkJCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQkJcmV0dXJuIHMxLmNvbXBhcmVUbyhzMik7IC8vIHVzZSBjYXNlIHRvIGRpZmZlcmVudGlhdGUgImVxdWFsIiBzdHJpbmdzCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRVbnNvcnRlZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiVCIpOwotCQlyZXN1bHQuYWRkKCJaIik7Ci0JCXJlc3VsdC5hZGQoIlkiKTsKLQkJcmVzdWx0LmFkZCgiTSIpOwotCQlyZXN1bHQuYWRkKCJtIik7Ci0JCXJlc3VsdC5hZGQoImEiKTsKLQkJcmVzdWx0LmFkZCgiQiIpOwotCQlyZXN1bHQuYWRkKCJiIik7Ci0JCXJlc3VsdC5hZGQoIkEiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZE5hdHVyYWxseVNvcnRlZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odGhpcy5idWlsZFVuc29ydGVkTGlzdCgpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQ3VzdG9tU29ydGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCwgdGhpcy5jdXN0b21Db21wYXJhdG9yKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hdHVyYWwoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFVuc29ydGVkTGlzdCgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIHRoaXMubmF0dXJhbFJldmVyc2VDb21wYXJhdG9yKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMuYnVpbGROYXR1cmFsbHlTb3J0ZWRMaXN0KCksIGxpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b20oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFVuc29ydGVkTGlzdCgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIHRoaXMuY3VzdG9tUmV2ZXJzZUNvbXBhcmF0b3IpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5idWlsZEN1c3RvbVNvcnRlZExpc3QoKSwgbGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoTGlzdDxTdHJpbmc+IG5vcm1hbCwgTGlzdDxTdHJpbmc+IHJldmVyc2UpIHsKLQkJaW50IHNpemUgPSBub3JtYWwuc2l6ZSgpOwotCQlpbnQgbWF4ID0gc2l6ZSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMobm9ybWFsLmdldChpKSwgcmV2ZXJzZS5nZXQobWF4IC0gaSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVBc3NvY2lhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzMjAwYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Bc3NvY2lhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVBc3NvY2lhdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXNzb2NpYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBhc3NvYzsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBTaW1wbGVBc3NvY2lhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuYXNzb2MgPSBuZXcgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KCJmb28iLCAiYmFyIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRLZXkoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hc3NvYy5rZXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuYXNzb2MudmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuYXNzb2MudmFsdWUoKSk7Ci0JCXRoaXMuYXNzb2Muc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuYXNzb2MudmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYXNzb2MsIHRoaXMuY29weSh0aGlzLmFzc29jKSk7Ci0KLQkJU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFzc29jMiA9IG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4oImZvbyIsICJiYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hc3NvYy5lcXVhbHMoYXNzb2MyKSk7Ci0KLQkJYXNzb2MyID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPigiZm9wIiwgImJhciIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFzc29jLmVxdWFscyhhc3NvYzIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFzc29jLmhhc2hDb2RlKCksIHRoaXMuY29weSh0aGlzLmFzc29jKS5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCXRoaXMudmVyaWZ5Q2xvbmUodGhpcy5hc3NvYywgdGhpcy5hc3NvYy5jbG9uZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2xvbmUoQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkLCBBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYWN0dWFsKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQkJYXNzZXJ0Tm90U2FtZShleHBlY3RlZCwgYWN0dWFsKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmtleSgpLCBhY3R1YWwua2V5KCkpOwotCQlhc3NlcnRTYW1lKGV4cGVjdGVkLmtleSgpLCBhY3R1YWwua2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQudmFsdWUoKSwgYWN0dWFsLnZhbHVlKCkpOwotCQlhc3NlcnRTYW1lKGV4cGVjdGVkLnZhbHVlKCksIGFjdHVhbC52YWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlAU3VwcHJlc3NXYXJuaW5ncygiY2FzdCIpCi0JCUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBhc3NvYzIgPSAoQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KSBUZXN0VG9vbHMuc2VyaWFsaXplKHRoaXMuYXNzb2MpOwotCi0JCWFzc2VydEVxdWFscyh0aGlzLmFzc29jLCBhc3NvYzIpOwotCQlhc3NlcnROb3RTYW1lKHRoaXMuYXNzb2MsIGFzc29jMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFzc29jLmtleSgpLCBhc3NvYzIua2V5KCkpOwotCQlhc3NlcnROb3RTYW1lKHRoaXMuYXNzb2Mua2V5KCksIGFzc29jMi5rZXkoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFzc29jLnZhbHVlKCksIGFzc29jMi52YWx1ZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZSh0aGlzLmFzc29jLnZhbHVlKCksIGFzc29jMi52YWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBjb3B5KFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBzYSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPihzYS5rZXkoKSwgc2EudmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZVN0YWNrVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlU3RhY2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjI5Nzk3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlU3RhY2tUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZVN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0YWNrOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlU3RhY2tUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTaW1wbGVTdGFja1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gbmV3IFNpbXBsZVN0YWNrPFN0cmluZz4oKTsKLQkJYXNzZXJ0VHJ1ZShzdGFjay5pc0VtcHR5KCkpOwotCQlzdGFjay5wdXNoKCJmaXJzdCIpOwotCQlhc3NlcnRGYWxzZShzdGFjay5pc0VtcHR5KCkpOwotCQlzdGFjay5wdXNoKCJzZWNvbmQiKTsKLQkJYXNzZXJ0RmFsc2Uoc3RhY2suaXNFbXB0eSgpKTsKLQkJc3RhY2sucG9wKCk7Ci0JCWFzc2VydEZhbHNlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JCXN0YWNrLnBvcCgpOwotCQlhc3NlcnRUcnVlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFB1c2hBbmRQb3AoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU2ltcGxlU3RhY2s8U3RyaW5nPigpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJc3RhY2sucHVzaChmaXJzdCk7Ci0JCXN0YWNrLnB1c2goc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBvcCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHVzaEFuZFBlZWsoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU2ltcGxlU3RhY2s8U3RyaW5nPigpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJc3RhY2sucHVzaChmaXJzdCk7Ci0JCXN0YWNrLnB1c2goc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wb3AoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5U3RhY2tFeGNlcHRpb25QZWVrKCkgewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gbmV3IFNpbXBsZVN0YWNrPFN0cmluZz4oKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXN0YWNrLnB1c2goZmlyc3QpOwotCQlzdGFjay5wdXNoKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBvcCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdGFjay5wZWVrKCk7Ci0JCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdGFja0V4Y2VwdGlvblBvcCgpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IG5ldyBTaW1wbGVTdGFjazxTdHJpbmc+KCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlzdGFjay5wdXNoKGZpcnN0KTsKLQkJc3RhY2sucHVzaChzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wb3AoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3RhY2sucG9wKCk7Ci0JCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCVNpbXBsZVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU2ltcGxlU3RhY2s8U3RyaW5nPigpOwotCQlzdGFjay5wdXNoKCJmaXJzdCIpOwotCQlzdGFjay5wdXNoKCJzZWNvbmQiKTsKLQkJc3RhY2sucHVzaCgidGhpcmQiKTsKLQotCQl0aGlzLnZlcmlmeUNsb25lKHN0YWNrLCBzdGFjay5jbG9uZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVTdGFjazxTdHJpbmc+IHN0YWNrID0gbmV3IFNpbXBsZVN0YWNrPFN0cmluZz4oKTsKLQkJc3RhY2sucHVzaCgiZmlyc3QiKTsKLQkJc3RhY2sucHVzaCgic2Vjb25kIik7Ci0JCXN0YWNrLnB1c2goInRoaXJkIik7Ci0KLQkJdGhpcy52ZXJpZnlDbG9uZShzdGFjaywgVGVzdFRvb2xzLnNlcmlhbGl6ZShzdGFjaykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDbG9uZShTdGFjazxTdHJpbmc+IG9yaWdpbmFsLCBTdGFjazxTdHJpbmc+IGNsb25lKSB7Ci0JCWFzc2VydE5vdFNhbWUob3JpZ2luYWwsIGNsb25lKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBvcCgpLCBjbG9uZS5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wb3AoKSwgY2xvbmUucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuaXNFbXB0eSgpLCBjbG9uZS5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucGVlaygpLCBjbG9uZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucG9wKCksIGNsb25lLnBvcCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbC5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuaXNFbXB0eSgpLCBjbG9uZS5pc0VtcHR5KCkpOwotCi0JCW9yaWdpbmFsLnB1c2goImZvdXJ0aCIpOwotCQlhc3NlcnRGYWxzZShvcmlnaW5hbC5pc0VtcHR5KCkpOwotCQkvLyBjbG9uZSBzaG91bGQgc3RpbGwgYmUgZW1wdHkKLQkJYXNzZXJ0VHJ1ZShjbG9uZS5pc0VtcHR5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TdHJpbmdUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N0cmluZ1Rvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4NWIxNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N0cmluZ1Rvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdHJpbmdUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN0cmluZ1Rvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gYWN0dWFsKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IFN0cmluZyhhY3R1YWwpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHBhZGRpbmcvdHJ1bmNhdGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkKCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWQoImZyZWQiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgU3RyaW5nVG9vbHMucGFkKCJmcmVkIiwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoImZyIiwgU3RyaW5nVG9vbHMucGFkKCJmcmVkIiwgMikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWQobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgU3RyaW5nVG9vbHMucGFkKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoImZyIiwgU3RyaW5nVG9vbHMucGFkKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgMikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT25Xcml0ZXIoKSB7Ci0JCVdyaXRlciB3cml0ZXI7Ci0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA0LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDYsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCAyLCB3cml0ZXIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT25TdHJpbmdCdWZmZXIoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYjsKLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA2LCBzYik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgMiwgc2IpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT25TdHJpbmdCdWlsZGVyKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiOwotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNiwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCAyLCBzYik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlKCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKCJmcmVkIiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUoImZyZWQiLCA2KSk7Ci0JCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKCJmcmVkIiwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCA2KSk7Ci0JCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCJmcmVkIiwgImZyZWQiLCA0KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25Xcml0ZXIoImZyZWQgICIsICJmcmVkIiwgNik7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCJmciIsICJmcmVkIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVBhZE9yVHJ1bmNhdGVPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiZnJlZCIsICJmcmVkIiwgNCk7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCJmcmVkICAiLCAiZnJlZCIsIDYpOwotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiZnIiLCAiZnJlZCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiZnJlZCIsICJmcmVkIiwgNCk7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiZnJlZCAgIiwgImZyZWQiLCA2KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCJmciIsICJmcmVkIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZCgiMTIzNCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkKCIxMjM0IiwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjEyIiwgU3RyaW5nVG9vbHMuemVyb1BhZCgiMTIzNCIsIDIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWQobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZChuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDYpKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCIxMiIsIFN0cmluZ1Rvb2xzLnplcm9QYWQobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCAyKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT25Xcml0ZXIoKSB7Ci0JCVdyaXRlciB3cml0ZXI7Ci0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0Iiwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNiwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCAyLCB3cml0ZXIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9uU3RyaW5nQnVmZmVyKCkgewotCQlTdHJpbmdCdWZmZXIgc2I7Ci0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA0LCBzYik7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA2LCBzYik7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0Iiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDIsIHNiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2I7Ci0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDYsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDIsIHNiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlKCkgewotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZSgiMTIzNCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZSgiMTIzNCIsIDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKCIxMjM0IiwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA2KSk7Ci0JCWFzc2VydEVxdWFscygiMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCIxMjM0IiwgIjEyMzQiLCA0KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCIwMDEyMzQiLCAiMTIzNCIsIDYpOwotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25Xcml0ZXIoIjM0IiwgIjEyMzQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiMTIzNCIsICIxMjM0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiMDAxMjM0IiwgIjEyMzQiLCA2KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCIzNCIsICIxMjM0IiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiMTIzNCIsICIxMjM0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoIjAwMTIzNCIsICIxMjM0IiwgNik7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoIjM0IiwgIjEyMzQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB3cmFwcGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcCgpIHsKLQkJdGhpcy52ZXJpZnlXcmFwKCJFbXBsb3llZSIsICIxMjMiLCAiMTIzRW1wbG95ZWUxMjMiKTsKLQkJdGhpcy52ZXJpZnlXcmFwKCIxMjMiLCAiMTIzIiwgIjEyMzEyMzEyMyIpOwotCQl0aGlzLnZlcmlmeVdyYXAoIiIsICIxMjMiLCAiMTIzMTIzIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdyYXAoU3RyaW5nIHN0cmluZywgU3RyaW5nIHdyYXAsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLndyYXAoc3RyaW5nLCB3cmFwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlXcmFwT25Xcml0ZXIoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeVdyYXBPbldyaXRlcigiMTIzIiwgIjEyMyIsICIxMjMxMjMxMjMiKTsKLQkJdGhpcy52ZXJpZnlXcmFwT25Xcml0ZXIoIiIsICIxMjMiLCAiMTIzMTIzIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdyYXBPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgd3JhcCwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLndyYXBPbihzdHJpbmcsIHdyYXAsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5V3JhcE9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSIsICIxMjMiLCAiMTIzRW1wbG95ZWUxMjMiKTsKLQkJdGhpcy52ZXJpZnlXcmFwT25TdHJpbmdCdWZmZXIoIjEyMyIsICIxMjMiLCAiMTIzMTIzMTIzIik7Ci0JCXRoaXMudmVyaWZ5V3JhcE9uU3RyaW5nQnVmZmVyKCIiLCAiMTIzIiwgIjEyMzEyMyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXcmFwT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIHdyYXAsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLndyYXBPbihzdHJpbmcsIHdyYXAsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcE9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlXcmFwT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSIsICIxMjMiLCAiMTIzRW1wbG95ZWUxMjMiKTsKLQkJdGhpcy52ZXJpZnlXcmFwT25TdHJpbmdCdWlsZGVyKCIxMjMiLCAiMTIzIiwgIjEyMzEyMzEyMyIpOwotCQl0aGlzLnZlcmlmeVdyYXBPblN0cmluZ0J1aWxkZXIoIiIsICIxMjMiLCAiMTIzMTIzIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdyYXBPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIHdyYXAsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMud3JhcE9uKHN0cmluZywgd3JhcCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZSgpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZSgiRW1wbG95ZWUiLCAiXCJFbXBsb3llZVwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIiIsICJcIlwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVF1b3RlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnF1b3RlKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVF1b3RlT25Xcml0ZXIoIkVtcGxveWVlIiwgIlwiRW1wbG95ZWVcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25Xcml0ZXIoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPbldyaXRlcigiIiwgIlwiXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UXVvdGVPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucXVvdGVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIiwgIlwiRW1wbG95ZWVcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcigiIiwgIlwiXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5xdW90ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUiLCAiXCJFbXBsb3llZVwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1aWxkZXIoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1aWxkZXIoIiIsICJcIlwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucXVvdGVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlbW92aW5nIGNoYXJhY3RlcnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpcnN0T2NjdXJyZW5jZSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCJFbXBsbyZ5ZWUmIiwgJyYnLCAiRW1wbG95ZWUmIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCJFbXBsb3llZSAmRm9vIiwgJyYnLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZSgiJkVtcGxveWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVGaXJzdE9jY3VycmVuY2Uoc3RyaW5nLCBjaGFyVG9SZW1vdmUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZShzdHJpbmcudG9DaGFyQXJyYXkoKSwgY2hhclRvUmVtb3ZlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCJFbXBsbyZ5ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCJFbXBsbyZ5ZWUmIiwgJyYnLCAiRW1wbG95ZWUmIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcigiRW1wbG95ZWUmIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcigiJkVtcGxveWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVGaXJzdE9jY3VycmVuY2VPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCJFbXBsbyZ5ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCJFbXBsbyZ5ZWUmIiwgJyYnLCAiRW1wbG95ZWUmIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUmIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcigiJkVtcGxveWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKHN0cmluZywgY2hhclRvUmVtb3ZlLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCJFbXBsbyZ5ZWUmIiwgJyYnLCAiRW1wbG95ZWUmIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSAmRm9vIiwgJyYnLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVpbGRlcigiJkVtcGxveWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKHN0cmluZywgY2hhclRvUmVtb3ZlLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzKCJFbXBsb3llZSBGcmVkIiwgJyAnLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIiBFbXBsb3llZSAiLCAnICcsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzKCJFbXBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIiBFbXAgbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcyhTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoc3RyaW5nLCBjaGFyVG9SZW1vdmUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoIkVtcGxveWVlIEZyZWQiLCAnICcsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiIEVtcCBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgY2hhclRvUmVtb3ZlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoIiBFbXBsb3llZSAiLCAnICcsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIEZyZWQiLCAnICcsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcigiIEVtcCBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIEZyZWQiLCAnICcsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigiIEVtcCBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsV2hpdGVzcGFjZSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKCJFbXBsb3llZSBGcmVkXHQiLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZSgiXHRFbXBsb3llZVxuIiwgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZSgiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZSgiIEVtcFx0bG95ZWUgXG4gRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2UoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCJFbXBsb3llZSBGcmVkXHQiLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheSgiXHRFbXBsb3llZVxuIiwgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheSgiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheSgiIEVtcFx0bG95ZWUgXG4gRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZShzdHJpbmcudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKCJFbXBsb3llZSBGcmVkXHQiLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKCJcdEVtcGxveWVlXG4iLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcigiIEVtcFx0bG95ZWUgXG4gRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIlx0RW1wbG95ZWVcbiIsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2VPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSBGcmVkXHQiLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigiXHRFbXBsb3llZVxuIiwgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigiIEVtcFx0bG95ZWUgXG4gRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb21tb24gcHJlZml4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb21tb25QcmVmaXhMZW5ndGgoKSB7Ci0JCWFzc2VydEVxdWFscygzLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvb1paWiIsICJmb29CQkIiKSk7Ci0JCWFzc2VydEVxdWFscygzLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvbyIsICJmb29CQkIiKSk7Ci0JCWFzc2VydEVxdWFscygzLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvb1paWiIsICJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvbyIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbW1vblByZWZpeExlbmd0aE1heCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDIsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vWlpaIiwgImZvb0JCQiIsIDIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vIiwgImZvb0JCQiIsIDIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vWlpaIiwgImZvbyIsIDIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vIiwgImZvbyIsIDIpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNhcGl0YWxpemF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplQ2hhckFycmF5KCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCJBIiwgbmV3IGNoYXJbXSB7ICdhJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCJcdTAwQzljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwRTknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZVN0cmluZygpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCJPcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiT3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiIiwgIiIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIlx1MDBDOWNvbGUiLCAiXHUwMEU5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVTdHJpbmcoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJBIiwgbmV3IGNoYXJbXSB7ICdhJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIlx1MDBDOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBFOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiQSIsIG5ldyBjaGFyW10geyAnYScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiXHUwMEM5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEU5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJPcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJPcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJBIiwgImEiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIlx1MDBDOWNvbGUiLCAiXHUwMEU5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiT3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJBIiwgImEiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJcdTAwQzljb2xlIiwgIlx1MDBFOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIkEiLCBuZXcgY2hhcltdIHsgJ2EnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiXHUwMEM5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEU5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJPcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJPcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJBIiwgImEiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIlx1MDBDOWNvbGUiLCAiXHUwMEU5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuYXBpdGFsaXplQ2hhckFycmF5KCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJhIiwgbmV3IGNoYXJbXSB7ICdBJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIlx1MDBFOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBDOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplU3RyaW5nKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygib3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygib3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygiYSIsICJBIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJcdTAwRTljb2xlIiwgIlx1MDBDOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiYSIsIG5ldyBjaGFyW10geyAnQScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIlx1MDBFOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBDOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiYSIsIG5ldyBjaGFyW10geyAnQScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJcdTAwRTljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwQzknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigib3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoImEiLCAiQSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJcdTAwRTljb2xlIiwgIlx1MDBDOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigib3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigib3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiYSIsICJBIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJcdTAwRTljb2xlIiwgIlx1MDBDOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoImEiLCBuZXcgY2hhcltdIHsgJ0EnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJcdTAwRTljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwQzknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigib3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoImEiLCAiQSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJcdTAwRTljb2xlIiwgIlx1MDBDOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzRW1wdHlTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgoU3RyaW5nKSBudWxsKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgiIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiAgICAgICIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KCIgICAgICBcdFx0ICAgIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiAgICAgIFx0XHQgICAiICsgU3RyaW5nVG9vbHMuQ1IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KChjaGFyW10pIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIgICAgICBcdFx0ICAgIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgiICAgICAgIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgiICAgICAgXHRcdCAgICIgKyBTdHJpbmdUb29scy5DUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzRW1wdHlDaGFyQXJyYXkoU3RyaW5nIHN0cmluZykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZVN0cmluZ1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKChTdHJpbmcpIG51bGwsIChTdHJpbmcpIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZShudWxsLCAiYXNkZiIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGYiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIsICJBU0RGIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoKGNoYXJbXSkgbnVsbCwgKGNoYXJbXSkgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKChjaGFyW10pIG51bGwsICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksIChjaGFyW10pIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXNkZiIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBU0RGIi50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFTIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgIiIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJBIikpOwotCi0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImJzZGYiKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImciKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGciKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGZnIikpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJhc2RmZ2dnZ2dnIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZUNoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhUyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBU0RGIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJic2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiZyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGciLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmZyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGZnZ2dnZ2ciLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdhJywgJ2EnKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgnYScsICdBJykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ0EnLCAnYScpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdBJywgJ0EnKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdhJywgJ2InKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ0EnLCAnYicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNVcHBlcmNhc2UoKSB7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNVcHBlcmNhc2UoIkZPTyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzVXBwZXJjYXNlKCJGT08yIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNVcHBlcmNhc2UoIkYgTyBPIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzVXBwZXJjYXNlKCJGb28iKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNVcHBlcmNhc2UoIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc1VwcGVyY2FzZShTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzVXBwZXJjYXNlKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNVcHBlcmNhc2Uocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzTG93ZXJjYXNlKCkgewotCQl0aGlzLnZlcmlmeVN0cmluZ0lzTG93ZXJjYXNlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0xvd2VyY2FzZSgiZm9vMiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzTG93ZXJjYXNlKCJmIG8gbyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0xvd2VyY2FzZSgiRm9vIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzTG93ZXJjYXNlKCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNMb3dlcmNhc2UoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2Uocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc0xvd2VyY2FzZShTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTG93ZXJjYXNlKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVydCBjYW1lbC1jYXNlIHRvIGFsbC1jYXBzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCkgewotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJURVNUIikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRFU1RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRFU1RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUX1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUIiwgInRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1QiLCAiVEVTVCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUIiwgInRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUIiwgIlRFU1QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfVEVTVCIsICJ0ZXN0VEVTVFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1RfVCIsICJUZXN0VEVTVFRlc3RUIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVCIsICJURVNUIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUX1RFU1QiLCAidGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUX1RFU1RfVCIsICJUZXN0VEVTVFRlc3RUIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGgoKSB7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiLCA0NCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0IiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFUyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiLCAzKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRFU1QiLCA1KSk7Ci0JCWFzc2VydEVxdWFscygiVEUiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJURVNUIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IiwgOSkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA4KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9UIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA2KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF8iLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRlc3QiLCA5KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRlc3QiLCAxMTAwKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUXyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RURVNUVGVzdCIsIDEwKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3QiLCAxNCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUX1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIiwgMTYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfVEVTVF8iLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIiwgMTUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJ0ZXN0IiwgNDQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJ0ZXN0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVMiLCAidGVzdCIsIDMpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJURVNUIiwgNSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURSIsICJURVNUIiwgMik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1QiLCAidGVzdFRlc3QiLCA5KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTIiwgInRlc3RUZXN0IiwgOCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1QiLCAidGVzdFRlc3QiLCA2KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfIiwgInRlc3RUZXN0IiwgNSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgInRlc3RUZXN0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiLCA5KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIsIDExMDApOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVNUXyIsICJ0ZXN0VEVTVFRlc3QiLCAxMCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfVEVTVCIsICJUZXN0VEVTVFRlc3QiLCAxNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiLCAxNik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF8iLCAiVGVzdFRFU1RUZXN0VCIsIDE1KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IG1heCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBtYXgsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgInRlc3QiLCA0NCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgInRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFUyIsICJ0ZXN0IiwgMyk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgIlRFU1QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFIiwgIlRFU1QiLCAyKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVMiLCAidGVzdFRlc3QiLCA4KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVCIsICJ0ZXN0VGVzdCIsIDYpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF8iLCAidGVzdFRlc3QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAidGVzdFRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0IiwgMTEwMCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfIiwgInRlc3RURVNUVGVzdCIsIDEwKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIsIDE0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUX1QiLCAiVGVzdFRFU1RUZXN0VCIsIDE2KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUXyIsICJUZXN0VEVTVFRlc3RUIiwgMTUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbWF4KSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKHN0cmluZywgbWF4LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0IHVuZGVyc2NvcmVzIHRvIGFsbC1jYXBzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF8iLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9fX18iLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRlU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9fX1RFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUX1RFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1RfVEVTVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX19URVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVF9URVNUX1QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9fVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VMb3dlcmNhc2UoKSB7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfX19fIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfX190ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdF90ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0X3Rlc3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl90ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJURVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAiVEVTVF8iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJURVNUX19fXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0IiwgIlRFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgIlRlU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3QiLCAiVEVTVF9URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0IiwgIlRFU1RfX19URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0IiwgIlRFU1RfVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdCIsICJURVNUX1RFU1RfVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3QiLCAiVEVTVF9URVNUX1RFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJfVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9fVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIl9URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJfX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlckxvd2VyY2FzZSgpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgInRlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJ0ZXN0XyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgInRlc3RfX19fIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3QiLCAidGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAidGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdCIsICJ0ZXN0X3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3QiLCAidGVzdF9fX3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3QiLCAidGVzdF90ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0IiwgInRlc3RfdGVzdF90ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdCIsICJ0ZXN0X3Rlc3RfdGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl90ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAiX190ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAiX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihzdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJURVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAiVEVTVF8iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJURVNUX19fXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0IiwgIlRFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgIlRlU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3QiLCAiVEVTVF9URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0IiwgIlRFU1RfX19URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0IiwgIlRFU1RfVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdCIsICJURVNUX1RFU1RfVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3QiLCAiVEVTVF9URVNUX1RFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0VCIsICJfVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9fVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIl9URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0VCIsICJfX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlckxvd2VyY2FzZSgpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgInRlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJ0ZXN0XyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgInRlc3RfX19fIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3QiLCAidGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAidGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdCIsICJ0ZXN0X3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3QiLCAidGVzdF9fX3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3QiLCAidGVzdF90ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0IiwgInRlc3RfdGVzdF90ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdCIsICJ0ZXN0X3Rlc3RfdGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl90ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAiX190ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAiX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKHN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkZWxpbWl0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc1F1b3RlZCgpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoImZvbyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzUXVvdGVkKCJcImZvb1wiIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzUXVvdGVkKCJcIlwiIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoIlwiIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUXVvdGVkKCIgIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUXVvdGVkKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1F1b3RlZCgiJ2ZvbyciKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNRdW90ZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc1F1b3RlZChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNRdW90ZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc1F1b3RlZChTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc1F1b3RlZChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUXVvdGVkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc1BhcmVudGhldGljYWwoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCIoZm9vKSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCIoKSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiKCIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoIiAiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoIidmb28nIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzUGFyZW50aGV0aWNhbChTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNQYXJlbnRoZXRpY2FsKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNCcmFja2V0ZWQoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2tldGVkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0JyYWNrZXRlZCgiW2Zvb10iKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNrZXRlZCgiIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNCcmFja2V0ZWQoIltdIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIlsiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIiAiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIicnIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2tldGVkKCInZm9vJyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0JyYWNrZXRlZChTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNrZXRlZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzQnJhY2tldGVkKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzQnJhY2VkKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNlZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNCcmFjZWQoIntmb299Iik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFjZWQoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzQnJhY2VkKCJ7fSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCJ7Iik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCIgIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNlZCgiJ2ZvbyciKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNCcmFjZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNlZChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFjZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc0JyYWNlZChTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNlZChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2VkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0NoZXZyb25lZCgpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNDaGV2cm9uZWQoImZvbyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzQ2hldnJvbmVkKCI8Zm9vPiIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzQ2hldnJvbmVkKCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0NoZXZyb25lZCgiPD4iKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgieyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgiICIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgiJyciKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNDaGV2cm9uZWQoIidmb28nIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzQ2hldnJvbmVkKFN0cmluZyBzKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNDaGV2cm9uZWQocykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQ2hldnJvbmVkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNDaGV2cm9uZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNDaGV2cm9uZWQocykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0NoZXZyb25lZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNEZWxpbWl0ZWQoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCJmb28iLCAnPycpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkKCI/Zm9vPyIsICc/Jyk7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIiIsICc/Jyk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQoIlwiXCIiLCAnIicpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkKCI/eHg/IiwgJz8nKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIj94eF0iLCAnPycpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCJcIiIsICciJyk7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCIgIiwgJyAnKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIicnIiwgJyInKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIidmb28nIiwgJz8nKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQoU3RyaW5nIHMsIGNoYXIgYykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMsIGMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLnRvQ2hhckFycmF5KCksIGMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzRGVsaW1pdGVkKFN0cmluZyBzLCBjaGFyIGMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocywgYykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLnRvQ2hhckFycmF5KCksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNEZWxpbWl0ZWQyKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoImZvbyIsICdbJywgJ10nKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0RlbGltaXRlZDIoIntmb299IiwgJ3snLCAnfScpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkMigiIiwgJ1snLCAnXScpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkMigiW10iLCAnWycsICddJyk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQyKCJbeHhdIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIj94eF0iLCAnWycsICddJyk7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCJcIiIsICdbJywgJ10nKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCIgIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIicnIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIidmb28nIiwgJ1snLCAnXScpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0RlbGltaXRlZDIoU3RyaW5nIHMsIGNoYXIgc3RhcnQsIGNoYXIgZW5kKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocywgc3RhcnQsIGVuZCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMudG9DaGFyQXJyYXkoKSwgc3RhcnQsIGVuZCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNEZWxpbWl0ZWQyKFN0cmluZyBzLCBjaGFyIHN0YXJ0LCBjaGFyIGVuZCkgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLCBzdGFydCwgZW5kKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMudG9DaGFyQXJyYXkoKSwgc3RhcnQsIGVuZCkpOwotCX0KLQotCS8vICoqKioqKioqKiogdW53cmFwcGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VW53cmFwKCkgewotCQl0aGlzLnZlcmlmeVVud3JhcCgiXCJmb29cIiIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbndyYXAoIlwiXCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW53cmFwKCInZm9vJyIsICJmb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW53cmFwKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bndyYXAocykpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLnVud3JhcChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW53cmFwSW50KCkgewotCQl0aGlzLnZlcmlmeVVud3JhcEludCgiXCJmb29cIiIsIDIsICJvIik7Ci0JCXRoaXMudmVyaWZ5VW53cmFwSW50KCJcIlwiZm9vXCJcIiIsIDIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbndyYXBJbnQoIidmb28nIiwgMiwgIm8iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW53cmFwSW50KFN0cmluZyBzLCBpbnQgY291bnQsIFN0cmluZyBleHBlY3RlZCkgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLnVud3JhcChzLCBjb3VudCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLnVud3JhcChzLnRvQ2hhckFycmF5KCksIGNvdW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVud3JhcEludEV4Y2VwdGlvbigpIHsKLQkJdGhpcy5kZW55VW53cmFwSW50KCJcIlwiIiwgMik7Ci0JCXRoaXMuZGVueVVud3JhcEludCgiJ28nIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlVbndyYXBJbnQoU3RyaW5nIHMsIGludCBjb3VudCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgYm9ndXMgPSBTdHJpbmdUb29scy51bndyYXAocywgY291bnQpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6ICIgKyBib2d1cyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQljaGFyW10gYm9ndXMgPSBTdHJpbmdUb29scy51bndyYXAocy50b0NoYXJBcnJheSgpLCBjb3VudCk7Ci0JCQlmYWlsKCJpbnZhbGlkIHN0cmluZzogIiArIG5ldyBTdHJpbmcoYm9ndXMpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVud3JhcE9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVVud3JhcE9uV3JpdGVyKCJcImZvb1wiIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVud3JhcE9uV3JpdGVyKCJcIlwiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVud3JhcE9uV3JpdGVyKCInZm9vJyIsICJmb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW53cmFwT25Xcml0ZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bndyYXBPbihzLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVud3JhcE9uKHMudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVud3JhcE9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVVud3JhcE9uU3RyaW5nQnVmZmVyKCJcImZvb1wiIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVud3JhcE9uU3RyaW5nQnVmZmVyKCJcIlwiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVud3JhcE9uU3RyaW5nQnVmZmVyKCInZm9vJyIsICJmb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW53cmFwT25TdHJpbmdCdWZmZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVud3JhcE9uKHMsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW53cmFwT24ocy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVud3JhcE9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbndyYXBPblN0cmluZ0J1aWxkZXIoIlwiZm9vXCIiLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW53cmFwT25TdHJpbmdCdWlsZGVyKCJcIlwiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVud3JhcE9uU3RyaW5nQnVpbGRlcigiJ2ZvbyciLCAiZm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVud3JhcE9uU3RyaW5nQnVpbGRlcihTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy51bndyYXBPbihzLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy51bndyYXBPbihzLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW53cmFwT25Xcml0ZXJDb3VudCgpIHsKLQkJdGhpcy52ZXJpZnlVbndyYXBPbldyaXRlckNvdW50KCJcImZvb1wiIiwgMiwgIm8iKTsKLQkJdGhpcy52ZXJpZnlVbndyYXBPbldyaXRlckNvdW50KCJcIlwiXCJcIiIsIDIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbndyYXBPbldyaXRlckNvdW50KCJYWGZvb1hYIiwgMiwgImZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbndyYXBPbldyaXRlckNvdW50KFN0cmluZyBzLCBpbnQgY291bnQsIFN0cmluZyBleHBlY3RlZCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bndyYXBPbihzLCBjb3VudCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bndyYXBPbihzLnRvQ2hhckFycmF5KCksIGNvdW50LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW53cmFwT25TdHJpbmdCdWZmZXJDb3VudCgpIHsKLQkJdGhpcy52ZXJpZnlVbndyYXBPblN0cmluZ0J1ZmZlckNvdW50KCJcImZvb1wiIiwgMiwgIm8iKTsKLQkJdGhpcy52ZXJpZnlVbndyYXBPblN0cmluZ0J1ZmZlckNvdW50KCJcIlwiXCJcIiIsIDIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbndyYXBPblN0cmluZ0J1ZmZlckNvdW50KCJYWGZvb1hYIiwgMiwgImZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbndyYXBPblN0cmluZ0J1ZmZlckNvdW50KFN0cmluZyBzLCBpbnQgY291bnQsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVud3JhcE9uKHMsIGNvdW50LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVud3JhcE9uKHMudG9DaGFyQXJyYXkoKSwgY291bnQsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW53cmFwT25TdHJpbmdCdWlsZGVyQ291bnQoKSB7Ci0JCXRoaXMudmVyaWZ5VW53cmFwT25TdHJpbmdCdWlsZGVyQ291bnQoIlwiZm9vXCIiLCAyLCAibyIpOwotCQl0aGlzLnZlcmlmeVVud3JhcE9uU3RyaW5nQnVpbGRlckNvdW50KCJcIlwiXCJcIiIsIDIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbndyYXBPblN0cmluZ0J1aWxkZXJDb3VudCgiWFhmb29YWCIsIDIsICJmb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW53cmFwT25TdHJpbmdCdWlsZGVyQ291bnQoU3RyaW5nIHMsIGludCBjb3VudCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy51bndyYXBPbihzLCBjb3VudCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMudW53cmFwT24ocy50b0NoYXJBcnJheSgpLCBjb3VudCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVydGluZyB0byBKYXZhIHN0cmluZyBsaXRlcmFsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiIiwgIlwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiXCJcIiIsICJcIlxcXCJcXFwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiJ2ZvbyciLCAiXCInZm9vJ1wiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoImZvb1xiYmFyIiwgIlwiZm9vXFxiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiZm9vXG5cdGJhciIsICJcImZvb1xcblxcdGJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoImZvb1wiYmFyIiwgIlwiZm9vXFxcImJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoImZvb1xcYmFyIiwgIlwiZm9vXFxcXGJhclwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChzKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiIiwgIlwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCJcIlwiIiwgIlwiXFxcIlxcXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoIidmb28nIiwgIlwiJ2ZvbydcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoImZvb1xiYmFyIiwgIlwiZm9vXFxiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCJmb29cblx0YmFyIiwgIlwiZm9vXFxuXFx0YmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCJmb29cImJhciIsICJcImZvb1xcXCJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoImZvb1xcYmFyIiwgIlwiZm9vXFxcXGJhclwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKHMudG9DaGFyQXJyYXkoKSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiIiwgIlwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiXCJcIiIsICJcIlxcXCJcXFwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiJ2ZvbyciLCAiXCInZm9vJ1wiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoImZvb1xiYmFyIiwgIlwiZm9vXFxiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiZm9vXG5cdGJhciIsICJcImZvb1xcblxcdGJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoImZvb1wiYmFyIiwgIlwiZm9vXFxcImJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoImZvb1xcYmFyIiwgIlwiZm9vXFxcXGJhclwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoIlwiXCIiLCAiXCJcXFwiXFxcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiJ2ZvbyciLCAiXCInZm9vJ1wiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiZm9vXGJiYXIiLCAiXCJmb29cXGJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoImZvb1xuXHRiYXIiLCAiXCJmb29cXG5cXHRiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoImZvb1wiYmFyIiwgIlwiZm9vXFxcImJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiZm9vXFxiYXIiLCAiXCJmb29cXFxcYmFyXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcihTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKHMudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0MjgzOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkQm9vbGVhblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkQm9vbGVhbiBzYjsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZXhDYXVnaHQ7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQlwcml2YXRlIHZvbGF0aWxlIGxvbmcgc3RhcnRUaW1lOwotCXByaXZhdGUgdm9sYXRpbGUgbG9uZyBlbmRUaW1lOwotCi0KLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc2IgPSBuZXcgU3luY2hyb25pemVkQm9vbGVhbigpOwotCQl0aGlzLmV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gZmFsc2U7Ci0JCXRoaXMuc3RhcnRUaW1lID0gMDsKLQkJdGhpcy5lbmRUaW1lID0gMDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc29ycygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi52YWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc0ZhbHNlKCkpOwotCi0JCXRoaXMuc2Iuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi52YWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzVHJ1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc0ZhbHNlKCkpOwotCi0JCXRoaXMuc2Iuc2V0RmFsc2UoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi52YWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc0ZhbHNlKCkpOwotCi0JCXRoaXMuc2Iuc2V0VHJ1ZSgpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IudmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQotCQlhc3NlcnRTYW1lKHRoaXMuc2IsIHRoaXMuc2IubXV0ZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFZhbHVlKGZhbHNlKTsKLQkJU3luY2hyb25pemVkQm9vbGVhbiBzYjIgPSBuZXcgU3luY2hyb25pemVkQm9vbGVhbihmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnNiLCBzYjIpOwotCi0JCXRoaXMuc2Iuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZXF1YWxzKHNiMikpOwotCi0JCXNiMi5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc2IsIHNiMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQl0aGlzLnNiLnNldFZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2IuaGFzaENvZGUoKSk7Ci0KLQkJdGhpcy5zYi5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuc2IuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VW50aWxUcnVlKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0cnVlIGJ5IHQyCi0JCWFzc2VydFRydWUodGhpcy5zYi52YWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuZWxhcHNlZFRpbWUoKSA+IDE1MCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbFRydWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsVHJ1ZSgyMCk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gdHJ1ZSBieSB0MQotCQlhc3NlcnRUcnVlKHRoaXMuc2IudmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVsYXBzZWRUaW1lKCkgPCAxNTApOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VW50aWxUcnVlKGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0RmFsc2UoKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZFNldFRydWVDb21tYW5kKCksIHRoaXMuc2IsIDIwMCk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRXYWl0VW50aWxUcnVlQ29tbWFuZCh0aW1lb3V0KSwgdGhpcy5zYiwgMCk7Ci0JCVRocmVhZCB0MSA9IG5ldyBUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLQkJCVRocmVhZC5zbGVlcCg1MCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldEZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0RmFsc2UoMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIGZhbHNlIGJ5IHQyCi0JCWFzc2VydEZhbHNlKHRoaXMuc2IudmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVsYXBzZWRUaW1lKCkgPiAxNTApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9TZXRGYWxzZVRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9TZXRGYWxzZSgyMCk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gdHJ1ZSBieSB0MQotCQlhc3NlcnRUcnVlKHRoaXMuc2IudmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVsYXBzZWRUaW1lKCkgPCAxNTApOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9TZXRGYWxzZShsb25nIHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldEZhbHNlKCk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRTZXRUcnVlQ29tbWFuZCgpLCB0aGlzLnNiLCAyMDApOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFRvU2V0RmFsc2VDb21tYW5kKHRpbWVvdXQpLCB0aGlzLnNiLCAwKTsKLQkJVGhyZWFkIHQxID0gbmV3IFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IG5ldyBUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgewotCQkJVGhyZWFkLnNsZWVwKDUwKTsKLQkJfQotCQlhc3NlcnRGYWxzZSh0aGlzLmV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRTZXRUcnVlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNCb29sKSB7Ci0JCQkJc3luY0Jvb2wuc2V0VHJ1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRVbnRpbFRydWVDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wpIHRocm93cyBFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnNldFN0YXJ0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMuc2V0VGltZW91dE9jY3VycmVkKCAhIHN5bmNCb29sLndhaXRVbnRpbFRydWUodGltZW91dCkpOwotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnNldEVuZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRUb1NldEZhbHNlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNCb29sKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5zZXRTdGFydFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnNldFRpbWVvdXRPY2N1cnJlZCggISBzeW5jQm9vbC53YWl0VG9TZXRGYWxzZSh0aW1lb3V0KSk7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMuc2V0RW5kVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCwgZmluYWwgbG9uZyBzbGVlcCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChzbGVlcCAhPSAwKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoc2xlZXApOwotCQkJCQl9Ci0JCQkJCWNvbW1hbmQuZXhlY3V0ZShzeW5jQm9vbCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnNldEV4Q2F1Z2h0KHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHNldEV4Q2F1Z2h0KGJvb2xlYW4gZXhDYXVnaHQpIHsKLQkJdGhpcy5leENhdWdodCA9IGV4Q2F1Z2h0OwotCX0KLQotCXZvaWQgc2V0VGltZW91dE9jY3VycmVkKGJvb2xlYW4gdGltZW91dE9jY3VycmVkKSB7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gdGltZW91dE9jY3VycmVkOwotCX0KLQotCXZvaWQgc2V0U3RhcnRUaW1lKGxvbmcgc3RhcnRUaW1lKSB7Ci0JCXRoaXMuc3RhcnRUaW1lID0gc3RhcnRUaW1lOwotCX0KLQotCXZvaWQgc2V0RW5kVGltZShsb25nIGVuZFRpbWUpIHsKLQkJdGhpcy5lbmRUaW1lID0gZW5kVGltZTsKLQl9Ci0KLQlsb25nIGVsYXBzZWRUaW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbmRUaW1lIC0gdGhpcy5zdGFydFRpbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbW1hbmQgaW50ZXJmYWNlICoqKioqKioqKioKLQotCXByaXZhdGUgaW50ZXJmYWNlIENvbW1hbmQgewotCQl2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkT2JqZWN0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkT2JqZWN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3M2FhMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZE9iamVjdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZE9iamVjdFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc287Ci0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGV4Q2F1Z2h0OwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQ7Ci0Jdm9sYXRpbGUgT2JqZWN0IHZhbHVlID0gbmV3IE9iamVjdCgpOwotCXByaXZhdGUgdm9sYXRpbGUgbG9uZyBzdGFydFRpbWU7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBsb25nIGVuZFRpbWU7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBPYmplY3Qgc29WYWx1ZTsKLQotCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc28gPSBuZXcgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4oKTsKLQkJdGhpcy5leENhdWdodCA9IGZhbHNlOwotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IGZhbHNlOwotCQl0aGlzLnN0YXJ0VGltZSA9IDA7Ci0JCXRoaXMuZW5kVGltZSA9IDA7Ci0JCXRoaXMuc29WYWx1ZSA9IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zby5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNvLnZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNvLmlzTm90TnVsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQotCQl0aGlzLnNvLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zby52YWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTm90TnVsbCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zby5pc051bGwoKSk7Ci0KLQkJdGhpcy5zby5zZXROdWxsKCk7Ci0JCWFzc2VydE51bGwodGhpcy5zby52YWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zby5pc05vdE51bGwoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zby5pc051bGwoKSk7Ci0KLQkJYXNzZXJ0U2FtZSh0aGlzLnNvLCB0aGlzLnNvLm11dGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zby5zZXRWYWx1ZShudWxsKTsKLQkJU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc28yID0gbmV3IFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+KG51bGwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zbywgc28yKTsKLQotCQl0aGlzLnNvLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNvLmVxdWFscyhzbzIpKTsKLQotCQlzbzIuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnNvLCBzbzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKLQkJdGhpcy5zby5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUuaGFzaENvZGUoKSwgdGhpcy5zby5oYXNoQ29kZSgpKTsKLQotCQl0aGlzLnNvLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zby5oYXNoQ29kZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIHQxIHNldHMgdGhlIHZhbHVlIHRvIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFVudGlsTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRVbnRpbE51bGwoMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIG51bGwgYnkgdDIKLQkJYXNzZXJ0TnVsbCh0aGlzLnNvLnZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuZWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgZWFybHkgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA+IDE1MCk6ICIgKyB0aW1lLCB0aW1lID4gMTUwKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHRpbWUgb3V0IHdhaXRpbmcgZm9yIHQxIHRvIHNldCB0aGUgdmFsdWUgdG8gbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxOdWxsVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRVbnRpbE51bGwoMjApOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSB3aWxsIGV2ZW50dWFsbHkgYmUgc2V0IHRvIG51bGwgYnkgdDEKLQkJYXNzZXJ0TnVsbCh0aGlzLnNvLnZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuZWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgbGF0ZSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlIDwgMTUwKTogIiArIHRpbWUsIHRpbWUgPCAxNTApOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VW50aWxOdWxsKGxvbmcgdDJUaW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVGhyZWFkcyh0aGlzLmJ1aWxkU2V0TnVsbENvbW1hbmQoKSwgdGhpcy5idWlsZFdhaXRVbnRpbE51bGxDb21tYW5kKHQyVGltZW91dCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgdDEgc2V0cyB0aGUgdmFsdWUgdG8gbnVsbDsKLQkgKiB0aGVuIHQyIHdpbGwgc2V0IHRoZSB2YWx1ZSB0byBhbiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9TZXRWYWx1ZSgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gYW4gb2JqZWN0IGJ5IHQyCi0JCWFzc2VydFRydWUodGhpcy5zby5pc05vdE51bGwoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5lbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBlYXJseSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlID4gMTUwKTogIiArIHRpbWUsIHRpbWUgPiAxNTApOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byBudWxsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldFZhbHVlVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldFZhbHVlKDIwKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgd2lsbCBldmVudHVhbGx5IGJlIHNldCB0byBudWxsIGJ5IHQxCi0JCWFzc2VydFRydWUodGhpcy5zby5pc051bGwoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5lbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBsYXRlIChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPCAxNTApOiAiICsgdGltZSwgdGltZSA8IDE1MCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRUb1NldFZhbHVlKGxvbmcgdDJUaW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVGhyZWFkcyh0aGlzLmJ1aWxkU2V0TnVsbENvbW1hbmQoKSwgdGhpcy5idWlsZFdhaXRUb1NldFZhbHVlQ29tbWFuZCh0MlRpbWVvdXQpKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHdhaXQgdW50aWwgdDEgaXMgZmluaXNoZWQgImluaXRpYWxpemluZyIgdGhlIHZhbHVlOwotCSAqIHRoZW4gdDIgd2lsbCBnZXQgdGhlIG5ld2x5LWluaXRpYWxpemVkIHZhbHVlICgiZm9vIikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNvLnNldFZhbHVlKG51bGwpOwotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkSW5pdGlhbGl6ZVZhbHVlQ29tbWFuZCgpLCB0aGlzLnNvLCAwKTsKLQkJLy8gZ2l2ZSB0MSBhIGhlYWQgc3RhcnQgb2YgMTAwIG1zCi0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRHZXRWYWx1ZUNvbW1hbmQoKSwgdGhpcy5zbywgMTAwKTsKLQkJVGhyZWFkIHQxID0gbmV3IFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IG5ldyBUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgewotCQkJVGhyZWFkLnNsZWVwKDUwKTsKLQkJfQotCQlhc3NlcnRGYWxzZSh0aGlzLmV4Q2F1Z2h0KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNvLnZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc29WYWx1ZSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5lbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBlYXJseSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlID4gMTAwKTogIiArIHRpbWUsIHRpbWUgPiAzMDApOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjdXRlVGhyZWFkcyhDb21tYW5kIHQxQ29tbWFuZCwgQ29tbWFuZCB0MkNvbW1hbmQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNvLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0MUNvbW1hbmQsIHRoaXMuc28sIDIwMCk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHQyQ29tbWFuZCwgdGhpcy5zbywgMCk7Ci0JCVRocmVhZCB0MSA9IG5ldyBUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLQkJCVRocmVhZC5zbGVlcCg1MCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkU2V0TnVsbENvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCkgewotCQkJCXNPYmplY3Quc2V0TnVsbCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRVbnRpbE51bGxDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc2V0U3RhcnRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNldFRpbWVvdXRPY2N1cnJlZCggISBzT2JqZWN0LndhaXRVbnRpbE51bGwodGltZW91dCkpOwotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc2V0RW5kVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvU2V0VmFsdWVDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc2V0U3RhcnRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNldFRpbWVvdXRPY2N1cnJlZCggISBzT2JqZWN0LndhaXRUb1NldFZhbHVlKFN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMudmFsdWUsIHRpbWVvdXQpKTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNldEVuZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZEluaXRpYWxpemVWYWx1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJc09iamVjdC5leGVjdXRlKAotCQkJCQluZXcgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZCgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJCQkJLy8gcHJldGVuZCB0byBwZXJmb3JtIHNvbWUgbG9uZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc2V0RXhDYXVnaHQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCXNPYmplY3Quc2V0VmFsdWUoImZvbyIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRHZXRWYWx1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zZXRTdGFydFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc2V0U09WYWx1ZShzT2JqZWN0LnZhbHVlKCkpOwotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc2V0RW5kVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCwgZmluYWwgbG9uZyBzbGVlcCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChzbGVlcCAhPSAwKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoc2xlZXApOwotCQkJCQl9Ci0JCQkJCWNvbW1hbmQuZXhlY3V0ZShzT2JqZWN0KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zZXRFeENhdWdodCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBzZXRFeENhdWdodChib29sZWFuIGV4Q2F1Z2h0KSB7Ci0JCXRoaXMuZXhDYXVnaHQgPSBleENhdWdodDsKLQl9Ci0KLQl2b2lkIHNldFRpbWVvdXRPY2N1cnJlZChib29sZWFuIHRpbWVvdXRPY2N1cnJlZCkgewotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IHRpbWVvdXRPY2N1cnJlZDsKLQl9Ci0KLQl2b2lkIHNldFN0YXJ0VGltZShsb25nIHN0YXJ0VGltZSkgewotCQl0aGlzLnN0YXJ0VGltZSA9IHN0YXJ0VGltZTsKLQl9Ci0KLQl2b2lkIHNldEVuZFRpbWUobG9uZyBlbmRUaW1lKSB7Ci0JCXRoaXMuZW5kVGltZSA9IGVuZFRpbWU7Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGVsYXBzZWRUaW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbmRUaW1lIC0gdGhpcy5zdGFydFRpbWU7Ci0JfQotCi0Jdm9pZCBzZXRTT1ZhbHVlKE9iamVjdCBzb1ZhbHVlKSB7Ci0JCXRoaXMuc29WYWx1ZSA9IHNvVmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbW1hbmQgaW50ZXJmYWNlICoqKioqKioqKioKLQotCXByaXZhdGUgaW50ZXJmYWNlIENvbW1hbmQgewotCQl2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc28pIHRocm93cyBFeGNlcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGI4M2Q5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2tUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZVN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZFN0YWNrOwotCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkU3RhY2tUZXN0cyBleHRlbmRzIFNpbXBsZVN0YWNrVGVzdHMgewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzczsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZXhDYXVnaHQ7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQlwcml2YXRlIHZvbGF0aWxlIGxvbmcgc3RhcnRUaW1lOwotCXByaXZhdGUgdm9sYXRpbGUgbG9uZyBlbmRUaW1lOwotCXByaXZhdGUgdm9sYXRpbGUgT2JqZWN0IHBvcHBlZE9iamVjdDsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV8xID0gbmV3IFN0cmluZygpOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV8yID0gbmV3IFN0cmluZygpOwotCi0JcHVibGljIFN5bmNocm9uaXplZFN0YWNrVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zcyA9IG5ldyBTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+KCk7Ci0JCXRoaXMuZXhDYXVnaHQgPSBmYWxzZTsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSBmYWxzZTsKLQkJdGhpcy5zdGFydFRpbWUgPSAwOwotCQl0aGlzLmVuZFRpbWUgPSAwOwotCQl0aGlzLnBvcHBlZE9iamVjdCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBmaXJzdCB3aXRoIGFuIHVuc3luY2hyb25pemVkIHN0YWNrLAotCSAqIHRoZW4gd2l0aCBhIHN5bmNocm9uaXplZCBzdGFjawotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW50QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5Q29uY3VycmVudEFjY2VzcyhuZXcgU2xvd1NpbXBsZVN0YWNrPFN0cmluZz4oKSwgInNlY29uZCIpOwotCQl0aGlzLnZlcmlmeUNvbmN1cnJlbnRBY2Nlc3MobmV3IFNsb3dTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+KCksICJmaXJzdCIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb25jdXJyZW50QWNjZXNzKFNsb3dTdGFjazxTdHJpbmc+IHNsb3dTdGFjaywgU3RyaW5nIGV4cGVjdGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2xvd1N0YWNrLnB1c2goImZpcnN0Iik7Ci0JCXNsb3dTdGFjay5wdXNoKCJzZWNvbmQiKTsKLQotCQluZXcgVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZShzbG93U3RhY2spKS5zdGFydCgpOwotCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNsb3dTdGFjay5wb3AoKSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIFNsb3dTdGFjazxTdHJpbmc+IHNsb3dTdGFjaykgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNsb3dTdGFjay5zbG93UG9wKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcml2YXRlIGludGVyZmFjZSBTbG93U3RhY2s8RT4gZXh0ZW5kcyBTdGFjazxFPiB7Ci0JCU9iamVjdCBzbG93UG9wKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTbG93U2ltcGxlU3RhY2s8RT4gZXh0ZW5kcyBTaW1wbGVTdGFjazxFPiBpbXBsZW1lbnRzIFNsb3dTdGFjazxFPiB7Ci0JCVNsb3dTaW1wbGVTdGFjaygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBzbG93UG9wKCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJcmV0dXJuIHRoaXMucG9wKCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgU2xvd1N5bmNocm9uaXplZFN0YWNrPEU+IGV4dGVuZHMgU3luY2hyb25pemVkU3RhY2s8RT4gaW1wbGVtZW50cyBTbG93U3RhY2s8RT4gewotCQlTbG93U3luY2hyb25pemVkU3RhY2soKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHNsb3dQb3AoKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5wb3AoKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHdhaXRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9Qb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9Qb3AoMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIGFuIGl0ZW0gc2hvdWxkIGhhdmUgYmVlbiBwb3BwZWQgYnkgdDIuLi4KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMucG9wcGVkT2JqZWN0KTsKLQkJLy8gLi4uYW5kIHRoZSBzdGFjayBzaG91bGQgYmUgZW1wdHkKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNzLmlzRW1wdHkoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVsYXBzZWRUaW1lKCkgPiAxNTApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9Qb3BUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvUG9wKDIwKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgc3RhY2sgd2FzIG5ldmVyIHBvcHBlZC4uLgotCQlhc3NlcnROdWxsKHRoaXMucG9wcGVkT2JqZWN0KTsKLQkJLy8gLi4uYW5kIGl0IHN0aWxsIGhvbGRzIHRoZSBpdGVtCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLnNzLnBlZWsoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVsYXBzZWRUaW1lKCkgPCAxNTApOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9Qb3AobG9uZyB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZFB1c2hDb21tYW5kKCksIHRoaXMuc3MsIDIwMCk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRXYWl0VG9Qb3BDb21tYW5kKHRpbWVvdXQpLCB0aGlzLnNzLCAwKTsKLQkJVGhyZWFkIHQxID0gbmV3IFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IG5ldyBUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgewotCQkJVGhyZWFkLnNsZWVwKDUwKTsKLQkJfQotCQlhc3NlcnRGYWxzZSh0aGlzLmV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvUHVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1B1c2goMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBzdGFjayBnZXRzIHBvcHBlZCBieSB0MS4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5wb3BwZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgYW4gaXRlbSBpcyBwdXNoZWQgb24gdG8gdGhlIHN0YWNrIGJ5IHQyCi0JCWFzc2VydEZhbHNlKHRoaXMuc3MuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0U2FtZShJVEVNXzIsIHRoaXMuc3MucGVlaygpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuZWxhcHNlZFRpbWUoKSA+IDE1MCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1B1c2hUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvUHVzaCgyMCk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHN0YWNrIGlzIGV2ZW50dWFsbHkgcG9wcGVkIGJ5IHQxLi4uCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLnBvcHBlZE9iamVjdCk7Ci0JCS8vIC4uLmJ1dCBub3RoaW5nIGlzIHB1c2hlZCBvbiB0byB0aGUgc3RhY2sgYnkgdDIKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNzLmlzRW1wdHkoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVsYXBzZWRUaW1lKCkgPCAxNTApOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9QdXNoKGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc3MucHVzaChJVEVNXzEpOwotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkUG9wQ29tbWFuZCgpLCB0aGlzLnNzLCAyMDApOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFRvUHVzaENvbW1hbmQodGltZW91dCksIHRoaXMuc3MsIDApOwotCQlUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gbmV3IFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTApOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFB1c2hDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHsKLQkJCQlzeW5jaHJvbml6ZWRTdGFjay5wdXNoKElURU1fMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvUG9wQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHN5bmNocm9uaXplZFN0YWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuc2V0U3RhcnRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCQl0cnkgewotCQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuc2V0UG9wcGVkT2JqZWN0KHN5bmNocm9uaXplZFN0YWNrLndhaXRUb1BvcCh0aW1lb3V0KSk7Ci0JCQkJfSBjYXRjaCAoRW1wdHlTdGFja0V4Y2VwdGlvbiBleCkgewotCQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuc2V0VGltZW91dE9jY3VycmVkKHRydWUpOwotCQkJCX0KLQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuc2V0RW5kVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkUG9wQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHN5bmNocm9uaXplZFN0YWNrKSB7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnNldFBvcHBlZE9iamVjdChzeW5jaHJvbml6ZWRTdGFjay5wb3AoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvUHVzaENvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzeW5jaHJvbml6ZWRTdGFjaykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnNldFN0YXJ0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnNldFRpbWVvdXRPY2N1cnJlZCggISBzeW5jaHJvbml6ZWRTdGFjay53YWl0VG9QdXNoKElURU1fMiwgdGltZW91dCkpOwotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5zZXRFbmRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoZmluYWwgQ29tbWFuZCBjb21tYW5kLCBmaW5hbCBTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHN5bmNocm9uaXplZFN0YWNrLCBmaW5hbCBsb25nIHNsZWVwKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHNsZWVwICE9IDApIHsKLQkJCQkJCVRocmVhZC5zbGVlcChzbGVlcCk7Ci0JCQkJCX0KLQkJCQkJY29tbWFuZC5leGVjdXRlKHN5bmNocm9uaXplZFN0YWNrKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnNldEV4Q2F1Z2h0KHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHNldEV4Q2F1Z2h0KGJvb2xlYW4gZXhDYXVnaHQpIHsKLQkJdGhpcy5leENhdWdodCA9IGV4Q2F1Z2h0OwotCX0KLQotCXZvaWQgc2V0VGltZW91dE9jY3VycmVkKGJvb2xlYW4gdGltZW91dE9jY3VycmVkKSB7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gdGltZW91dE9jY3VycmVkOwotCX0KLQotCXZvaWQgc2V0U3RhcnRUaW1lKGxvbmcgc3RhcnRUaW1lKSB7Ci0JCXRoaXMuc3RhcnRUaW1lID0gc3RhcnRUaW1lOwotCX0KLQotCXZvaWQgc2V0RW5kVGltZShsb25nIGVuZFRpbWUpIHsKLQkJdGhpcy5lbmRUaW1lID0gZW5kVGltZTsKLQl9Ci0KLQl2b2lkIHNldFBvcHBlZE9iamVjdChPYmplY3QgcG9wcGVkT2JqZWN0KSB7Ci0JCXRoaXMucG9wcGVkT2JqZWN0ID0gcG9wcGVkT2JqZWN0OwotCX0KLQotCWxvbmcgZWxhcHNlZFRpbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVuZFRpbWUgLSB0aGlzLnN0YXJ0VGltZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tbWFuZCBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgQ29tbWFuZCB7Ci0JCXZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHN5bmNocm9uaXplZFN0YWNrKSB0aHJvd3MgRXhjZXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9UZXN0VG9vbHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVGVzdFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZmUxOTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9UZXN0VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXQ7Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0RmFpbHVyZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLQotLyoqCi0gKiB2YXJpb3VzIHRvb2xzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGVzdCBjYXNlcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFRvb2xzIHsKLQotCS8qKgotCSAqIHRlc3QgYW4gb2JqZWN0J3MgaW1wbGVtZW50YXRpb24gb2YgU2VyaWFsaXphYmxlIGJ5IHNlcmlhbGl6aW5nIHRoZQotCSAqIHNwZWNpZmllZCBvYmplY3QgdG8gYSBieXRlIGFycmF5OyB0aGVuIGRlLXNlcmlhbGl6aW5nIHRoZSBieXRlIGFycmF5IGFuZAotCSAqIHJldHVybmluZyB0aGUgcmVzdWx0YW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgc2VyaWFsaXplKFQgbykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhT3V0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgyMDAwKTsKLQkJT2JqZWN0T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFPdXRTdHJlYW0pOwotCQlvdXRTdHJlYW0ud3JpdGVPYmplY3Qobyk7Ci0JCW91dFN0cmVhbS5jbG9zZSgpOwotCi0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGJhSW5TdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFPdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCU9iamVjdElucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhSW5TdHJlYW0pOwotCQlUIG8yID0gcmVhZE9iamVjdChpblN0cmVhbSk7Ci0JCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkJcmV0dXJuIG8yOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIDxUPiBUIHJlYWRPYmplY3QoT2JqZWN0SW5wdXQgb2JqZWN0SW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoVCkgb2JqZWN0SW5wdXQucmVhZE9iamVjdCgpOwotCX0KLQotCS8qKgotCSAqIHJlZGlyZWN0IHN0ZCBvdXQgYW5kIHN0ZCBlcnIgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVkaXJlY3RTeXN0ZW1TdHJlYW1zVG8oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgewotCQlyZWRpcmVjdFN5c3RlbVN0cmVhbXNUbyhuZXcgUHJpbnRTdHJlYW0ob3V0cHV0U3RyZWFtKSk7Ci0JfQotCi0JLyoqCi0JICogcmVkaXJlY3Qgc3RkIG91dCBhbmQgc3RkIGVyciB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWRpcmVjdFN5c3RlbVN0cmVhbXNUbyhQcmludFN0cmVhbSBwcmludFN0cmVhbSkgewotCQlTeXN0ZW0uc2V0T3V0KHByaW50U3RyZWFtKTsKLQkJU3lzdGVtLnNldEVycihwcmludFN0cmVhbSk7Ci0JfQotCi0JLyoqCi0JICogZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIHRlc3QgYW5kIGR1bXAgdGhlIHJlc3VsdHMgdG8gdGhlIGNvbnNvbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGVjdXRlKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJVGVzdFJlc3VsdCByZXN1bHQgPSB0ZXN0Q2FzZS5ydW4oKTsKLQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKLQkJd3JpdGVyLnByaW50KHRlc3RDYXNlLmdldE5hbWUoKSk7Ci0JCXdyaXRlci5wcmludCgiOiAiKTsKLQkJaWYgKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpIHsKLQkJCXdyaXRlci5wcmludGxuKCJPSyIpOwotCQl9IGVsc2UgewotCQkJVGVzdEZhaWx1cmUgZmFpbHVyZSA9IG51bGw7Ci0JCQlpZiAocmVzdWx0LmZhaWx1cmVzKCkuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlmYWlsdXJlID0gKFRlc3RGYWlsdXJlKSByZXN1bHQuZmFpbHVyZXMoKS5uZXh0RWxlbWVudCgpOwotCQkJfSBlbHNlIHsKLQkJCQlmYWlsdXJlID0gKFRlc3RGYWlsdXJlKSByZXN1bHQuZXJyb3JzKCkubmV4dEVsZW1lbnQoKTsKLQkJCX0KLQkJCWZhaWx1cmUudGhyb3duRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7Ci0JCX0KLQkJd3JpdGVyLnByaW50KCJlbGFwc2VkIHRpbWU6ICIpOwotCQlsb25nIGVsYXBzZWQgPSBlbmQgLSBzdGFydDsKLQkJd3JpdGVyLnByaW50KGVsYXBzZWQgLyAxMDAwTCk7Ci0JCXdyaXRlci5wcmludGxuKCIgc2VjLiIpOwotCQlyZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8VGVzdENhc2U+IFRlc3RDYXNlX2NsYXNzID0gVGVzdENhc2UuY2xhc3M7Ci0KLQkvKioKLQkgKiBDbGVhciBvdXQgYWxsIHRoZSBpbnN0YW5jZSB2YXJpYWJsZSBvZiB0aGUgc3BlY2lmaWVkIHRlc3QgY2FzZSwgYWxsb3dpbmcKLQkgKiB0aGUgdmFyaW91cyB0ZXN0IGZpeHR1cmVzIHRvIGJlIGdhcmJhZ2UtY29sbGVjdGVkLiBUeXBpY2FsbHkgdGhpcyBpcwotCSAqIGNhbGxlZCBpbiB0aGUgI3RlYXJEb3duKCkgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcihUZXN0Q2FzZSB0ZXN0Q2FzZSkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IHRlc3RDYXNlLmdldENsYXNzKCk7IHRlbXBDbGFzcyAhPSBUZXN0Q2FzZV9jbGFzczsgdGVtcENsYXNzID0gdGVtcENsYXNzLmdldFN1cGVyY2xhc3MoKSkgewotCQkJRmllbGRbXSBmaWVsZHMgPSB0ZW1wQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJCWZvciAoaW50IGkgPSBmaWVsZHMubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJCUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQkJCS8vIGxlYXZlIHByaW1pdGl2ZXMgYWxvbmUgLSB0aGV5IGRvbid0IGdldCBnYXJiYWdlLWNvbGxlY3RlZCwgYW5kIHdlIGNhbid0IHNldCB0aGVtIHRvIG51bGwuLi4KLQkJCQlpZiAoZmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vIGxlYXZlIHN0YXRpYyBmaWVsZHMgYWxvbmUgKD8pCi0JCQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKGZpZWxkLmdldE1vZGlmaWVycygpKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCQlmaWVsZC5zZXQodGVzdENhc2UsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogV29ya2Fyb3VuZCBmb3IgYSBKVW5pdCBidWc6IEpVbml0IGRvZXMgbm90IGNvbmZpZ3VyZSB0aGUgdGVzdGluZyBUaHJlYWQKLQkgKiB3aXRoIGEgY29udGV4dCBjbGFzcyBsb2FkZXIuIFRoaXMgc2hvdWxkIHByb2JhYmx5IGhhcHBlbiBpbgotCSAqIFRlc3RSdW5uZXIuZG9SdW5UZXN0KFRlc3QpLCBqdXN0IGJlZm9yZSBzdGFydGluZyB0aGUgdGhyZWFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcEpVbml0VGhyZWFkQ29udGV4dENsYXNzTG9hZGVyKCkgewotCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihUZXN0VG9vbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0VG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2RlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTA0YjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkZpbGVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5YTUxTdHJpbmdFbmNvZGVyOwotCi1wdWJsaWMgY2xhc3MgWE1MU3RyaW5nRW5jb2RlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFhNTFN0cmluZ0VuY29kZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlTm9DaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gImZvbyI7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmVuY29kZShzKSk7Ci0KLQkJcyA9ICIxMjNmb28xMjMiOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5lbmNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbmNvZGVDaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gIj9mb28/IjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIiYjeDNmO2ZvbyYjeDNmOyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5lbmNvZGUocykpOwotCi0JCXMgPSAiP2ZvbyYxMjMiOwotCQlleHBlY3RlZCA9ICImI3gzZjtmb28mI3gyNjsxMjMiOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGVuY29kZXIuZW5jb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVub3JtYWxpemVWYWxpZEZpbGVOYW1lKCkgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQotCQlTdHJpbmcgcyA9ICJmb28iOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5kZWNvZGUocykpOwotCi0JCXMgPSAiMTIzZm9vMTIzIjsKLQkJYXNzZXJ0RXF1YWxzKHMsIGVuY29kZXIuZGVjb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVub3JtYWxpemVJbnZhbGlkRmlsZU5hbWUoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gIiYjeDNmO2ZvbyYjeDNmOyI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICI/Zm9vPyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5kZWNvZGUocykpOwotCi0JCXMgPSAiJiN4M2Y7Zm9vJiN4MjY7MTIzIjsKLQkJZXhwZWN0ZWQgPSAiP2ZvbyYxMjMiOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGVuY29kZXIuZGVjb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um91bmRUcmlwTm9DaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5Um91bmRUcmlwKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlSb3VuZFRyaXAoIjEyM2ZvbzQ1NiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3VuZFRyaXBDaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5Um91bmRUcmlwKCI/Zm9vPyIpOwotCQl0aGlzLnZlcmlmeVJvdW5kVHJpcCgiP2ZvbyYxMjMmJiYmJiY+Pj4+Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJvdW5kVHJpcChTdHJpbmcgcykgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQkJU3RyaW5nIGFjdHVhbCA9IGVuY29kZXIuZW5jb2RlKHMpOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5kZWNvZGUoYWN0dWFsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTEoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTIoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mIyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2UzKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJiN4Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTQoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI3gzIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTUoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI3g7Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTYoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mQSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2U3KCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJiNBIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJcyA9IGVuY29kZXIuZGVjb2RlKHMpOwotCQkJZmFpbChzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTgoKSB7Ci0JCVN0cmluZyBzID0gImZvbyYjeFpaWlo7IjsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXMgPSBlbmNvZGVyLmRlY29kZShzKTsKLQkJCWZhaWwocyk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzMDljMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBcnJheUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQXJyYXlJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRBcnJheSgpLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgKytpLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmVhbS5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoIjMiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpIHsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKC0xLCAxKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDgsIDEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oMCwgLTEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oMCwgOSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdlbmVyaWNzKCkgewotCQlJbnRlZ2VyW10gaW50ZWdlcnMgPSBuZXcgSW50ZWdlclszXTsKLQkJaW50ZWdlcnNbMF0gPSBuZXcgSW50ZWdlcigwKTsKLQkJaW50ZWdlcnNbMV0gPSBuZXcgSW50ZWdlcigxKTsKLQkJaW50ZWdlcnNbMl0gPSBuZXcgSW50ZWdlcigyKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE51bWJlcj4gc3RyZWFtID0gbmV3IEFycmF5SXRlcmF0b3I8TnVtYmVyPihpbnRlZ2Vycyk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpbnRlZ2Vycy5sZW5ndGgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYXJhcmdzKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8TnVtYmVyPiBzdHJlYW0gPSBuZXcgQXJyYXlJdGVyYXRvcjxOdW1iZXI+KG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoMikpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMywgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3Ioc3RhcnQsIGxlbmd0aCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyZWFtLCBleENhdWdodCk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhdG9yKHRoaXMuYnVpbGRBcnJheSgpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoU3RyaW5nW10gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oYXJyYXkpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYXRvcih0aGlzLmJ1aWxkQXJyYXkoKSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oYXJyYXksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCVN0cmluZ1tdIGJ1aWxkQXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiB9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NhYjg3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEFycmF5TGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBBcnJheUl0ZXJhdG9yVGVzdHMgewotCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1ByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEFycmF5KCkubGVuZ3RoLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJaW50IGkgPSB0aGlzLmJ1aWxkQXJyYXkoKS5sZW5ndGg7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgaS0tLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmVhbS5wcmV2aW91cygpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXNJbmRleCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbkFkZCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygiMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLmFkZCgiMy41Iik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvblNldCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygiMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnNldCgidGhyZWUiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEdlbmVyaWNzKCkgewotCQlJbnRlZ2VyW10gaW50ZWdlcnMgPSBuZXcgSW50ZWdlclszXTsKLQkJaW50ZWdlcnNbMF0gPSBuZXcgSW50ZWdlcigwKTsKLQkJaW50ZWdlcnNbMV0gPSBuZXcgSW50ZWdlcigxKTsKLQkJaW50ZWdlcnNbMl0gPSBuZXcgSW50ZWdlcigyKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE51bWJlcj4gc3RyZWFtID0gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE51bWJlcj4oaW50ZWdlcnMpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaW50ZWdlcnMubGVuZ3RoLCBpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0VmFyYXJncygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE51bWJlcj4gc3RyZWFtID0gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE51bWJlcj4obmV3IEludGVnZXIoMCksIG5ldyBJbnRlZ2VyKDEpLCBuZXcgSW50ZWdlcigyKSk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygzLCBpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RJdGVyYXRvcih0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZExpc3RJdGVyYXRvcihTdHJpbmdbXSBhcnJheSkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPFN0cmluZz4oYXJyYXkpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihTdHJpbmdbXSBhcnJheSkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPFN0cmluZz4oYXJyYXkpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihTdHJpbmdbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8U3RyaW5nPihhcnJheSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGIzZGIyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2hhaW5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIENoYWluSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFZFQ1RPUl9ISUVSQVJDSFkgPSB7IFZlY3Rvci5jbGFzcywgQWJzdHJhY3RMaXN0LmNsYXNzLCBBYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MsIE9iamVjdC5jbGFzcyB9OwotCi0JcHVibGljIENoYWluSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKFZFQ1RPUl9ISUVSQVJDSFkubGVuZ3RoLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhWRUNUT1JfSElFUkFSQ0hZLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBsaW5rIiwgVkVDVE9SX0hJRVJBUkNIWVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBsaW5rIiwgVkVDVE9SX0hJRVJBUkNIWVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCUNsYXNzPD8+IGphdmFDbGFzcyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlqYXZhQ2xhc3MgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgamF2YUNsYXNzLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkgPT0gQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENoYWluSXRlcmF0b3IoVmVjdG9yLmNsYXNzLCB0aGlzLmJ1aWxkTGlua2VyKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8Q2xhc3M8Pz4+IGJ1aWxkSW5uZXJJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbm5lckNoYWluSXRlcmF0b3IoVmVjdG9yLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZENoYWluSXRlcmF0b3IoQ2xhc3M8Pz4gc3RhcnRMaW5rLCBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxDbGFzczw/Pj4gbGlua2VyKSB7Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxDbGFzczw/Pj4oc3RhcnRMaW5rLCBsaW5rZXIpOwotCX0KLQotCXByaXZhdGUgQ2hhaW5JdGVyYXRvci5MaW5rZXI8Q2xhc3M8Pz4+IGJ1aWxkTGlua2VyKCkgewotCQkvLyBjaGFpbiB1cCB0aGUgY2xhc3MncyBoaWVyYXJjaHkKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxDbGFzczw/Pj4oKSB7Ci0JCQlwdWJsaWMgQ2xhc3M8Pz4gbmV4dExpbmsoQ2xhc3M8Pz4gY3VycmVudExpbmspIHsKLQkJCQlyZXR1cm4gY3VycmVudExpbmsuZ2V0U3VwZXJjbGFzcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8Q2xhc3M8Pz4+IGJ1aWxkSW5uZXJDaGFpbkl0ZXJhdG9yKENsYXNzPD8+IHN0YXJ0TGluaykgewotCQkvLyBjaGFpbiB1cCB0aGUgY2xhc3MncyBoaWVyYXJjaHkKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPENsYXNzPD8+PihzdGFydExpbmspIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENsYXNzPD8+IG5leHRMaW5rKENsYXNzPD8+IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYWluSXRlcmF0b3IoKSB7Ci0JCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCUl0ZXJhdG9yPENsYXNzPD8+PiBpdGVyYXRvciA9IG5ldyBDaGFpbkl0ZXJhdG9yPENsYXNzPD8+PihWZWN0b3IuY2xhc3MpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDbGFzczw/PiBjID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBjbGFzczogIiArIGMuZ2V0TmFtZSgpKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2FmZGI1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBDbG9uZUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JQ29sbGVjdGlvbjxTdHJpbmc+IG9yaWdpbmFsQ29sbGVjdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBjb25jdXJyZW50UHJvYmxlbTsKLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBjb25jdXJyZW50Q29sbGVjdGlvbjsKLQotCXB1YmxpYyBDbG9uZUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IG9yaWdpbmFsU2l6ZSA9IHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLnNpemUoKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQkvLyBzaG91bGQgYWxsb3cgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbFNpemUgIT0gdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsU2l6ZSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEZWZhdWx0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxpbWluYXRvcigpIHsKLQkJQ2xvbmVJdGVyYXRvci5NdXRhdG9yPFN0cmluZz4gZWxpbWluYXRvciA9IG5ldyBDbG9uZUl0ZXJhdG9yLk11dGF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgY3VycmVudCkgewotCQkJCUNsb25lSXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5yZW1vdmUoY3VycmVudCk7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKG5ldyBDbG9uZUl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbENvbGxlY3Rpb24sIGVsaW1pbmF0b3IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3ViY2xhc3MoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKG5ldyBDbG9uZUl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbENvbGxlY3Rpb24pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFN0cmluZyBjdXJyZW50KSB7Ci0JCQkJQ2xvbmVJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLnJlbW92ZShjdXJyZW50KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBjb25jdXJyZW50IGFjY2VzczogRmlyc3QgYnVpbGQgYSBjbG9uZSBpdGVyYXRvciBpbiBhIHNlcGFyYXRlIHRocmVhZAotCSAqIHRoYXQgaGFuZ3MgbW9tZW50YXJpbHkgZHVyaW5nIGl0cyBjb25zdHJ1Y3Rpb247IHRoZW4gbW9kaWZ5IHRoZSBzaGFyZWQKLQkgKiBjb2xsZWN0aW9uIGluIHRoaXMgdGhyZWFkLiBUaGlzIHdvdWxkIGNhdXNlIGEKLQkgKiBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGluIHRoZSBvdGhlciB0aHJlYWQgaWYgdGhlIGNsb25lIGl0ZXJhdG9yCi0JICogd2VyZSBub3Qgc3luY2hyb25pemVkIG9uIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW50QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNsb3dDb2xsZWN0aW9uPFN0cmluZz4gc2xvdyA9IG5ldyBTbG93Q29sbGVjdGlvbjxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKHNsb3cpOwotCQkvLyB1c2luZyB0aGUgdW5zeW5jaHJvbml6ZWQgY29sbGVjdGlvbiB3aWxsIGNhdXNlIHRoZSB0ZXN0IHRvIGZhaWwKLQkJLy8JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uID0gc2xvdzsKLQkJdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24gPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uKHNsb3cpOwotCi0JCXRoaXMuY29uY3VycmVudFByb2JsZW0gPSBmYWxzZTsKLQkJdGhpcy5jb25jdXJyZW50Q29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLmJ1aWxkUnVubmFibGUoKSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCQl3aGlsZSAoIXNsb3cuaGFzU3RhcnRlZENsb25lKCkpIHsKLQkJCS8vIHdhaXQgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gc3RhcnQgdGhlIGNsb25lLi4uCi0JCQlUaHJlYWQueWllbGQoKTsKLQkJfQotCQkvLyAuLi50aGVuIHNuZWFrIGluIGFuIGV4dHJhIGVsZW1lbnQKLQkJdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uYWRkKCJzZXZlbnRlZW4iKTsKLQkJd2hpbGUgKHRocmVhZC5pc0FsaXZlKCkpIHsKLQkJCS8vIHdhaXQgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gZmluaXNoCi0JCQlUaHJlYWQueWllbGQoKTsKLQkJfQotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbmN1cnJlbnRQcm9ibGVtKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbmN1cnJlbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2xvbmVJdGVyYXRvclRlc3RzLnRoaXMubG9vcFdpdGhDbG9uZUl0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogdXNlIGEgY2xvbmUgaXRlcmF0b3IgdG8gbG9vcCBvdmVyIHRoZSAic2xvdyIgY29sbGVjdGlvbiBhbmQgY29weSBpdHMKLQkgKiBjb250ZW50cyB0byB0aGUgY29uY3VycmVudCBjb2xsZWN0aW9uCi0JICovCi0Jdm9pZCBsb29wV2l0aENsb25lSXRlcmF0b3IoKSB7Ci0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQl0aGlzLmNvbmN1cnJlbnRDb2xsZWN0aW9uLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCXRoaXMuY29uY3VycmVudFByb2JsZW0gPSB0cnVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZShJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCU9iamVjdCByZW1vdmVkID0gInRocmVlIjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5jb250YWlucyhyZW1vdmVkKSk7Ci0JCS8vIHRyeSB0byByZW1vdmUgYmVmb3JlIGNhbGxpbmcgI25leHQoKQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKHJlbW92ZWQpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJLy8gdHJ5IHRvIHJlbW92ZSB0d2ljZQotCQkJCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uY29udGFpbnMocmVtb3ZlZCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZENsb25lSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcih0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8U3RyaW5nPihjKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZEVtcHR5Q29sbGVjdGlvbigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihjKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZEVtcHR5Q29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgic2l4Iik7Ci0JCWMuYWRkKCJzZXZlbiIpOwotCQljLmFkZCgiZWlnaHQiKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGN1c3RvbSBjb2xsZWN0aW9uICoqKioqKioqKioKLQlzdGF0aWMgY2xhc3MgU2xvd0NvbGxlY3Rpb248RT4gZXh0ZW5kcyBBcnJheUxpc3Q8RT4gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBib29sZWFuIGhhc1N0YXJ0ZWRDbG9uZSA9IGZhbHNlOwotCi0JCXB1YmxpYyBTbG93Q29sbGVjdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCQl0aGlzLnNldEhhc1N0YXJ0ZWRDbG9uZSh0cnVlKTsKLQkJCS8vIHRha2UgYSBsaXR0bGUgc25vb3plIGJlZm9yZSByZXR1cm5pbmcgdGhlIGFycmF5Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIudG9BcnJheSgpOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIHZvaWQgc2V0SGFzU3RhcnRlZENsb25lKGJvb2xlYW4gaGFzU3RhcnRlZENsb25lKSB7Ci0JCQl0aGlzLmhhc1N0YXJ0ZWRDbG9uZSA9IGhhc1N0YXJ0ZWRDbG9uZTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCBib29sZWFuIGhhc1N0YXJ0ZWRDbG9uZSgpIHsKLQkJCXJldHVybiB0aGlzLmhhc1N0YXJ0ZWRDbG9uZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA0NWE5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBDbG9uZUxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCUxpc3Q8U3RyaW5nPiBvcmlnaW5hbExpc3Q7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29uY3VycmVudFByb2JsZW07Ci0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gY29uY3VycmVudExpc3Q7Ci0KLQlwdWJsaWMgQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9yaWdpbmFsTGlzdCA9IHRoaXMuYnVpbGRMaXN0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgb3JpZ2luYWxTaXplID0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJLy8gc2hvdWxkIGFsbG93IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoImZvbyIpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbFNpemUsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gY2xvbmVMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWNsb25lTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJY2xvbmVMaXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0KLQkJd2hpbGUgKG5lc3RlZExpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQljbG9uZUxpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcmV2aW91cygpIHsKLQkJaW50IG9yaWdpbmFsU2l6ZSA9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKTsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoImZvbyIpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKSk7Ci0JCW9yaWdpbmFsU2l6ZSA9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCS8vIHNob3VsZCBhbGxvdyBjb25jdXJyZW50IG1vZGlmaWNhdGlvbgotCQkJdGhpcy5vcmlnaW5hbExpc3QuYWRkKCJiYXIiKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRUcnVlKG9yaWdpbmFsU2l6ZSAhPSB0aGlzLm9yaWdpbmFsTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKSwgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeURlZmF1bHQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5hZGQoInRocmVlIGFuZCBhIGhhbGYiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5zZXQoImFub3RoZXIgdGhyZWUiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU11dGF0b3JOZXh0KCkgewotCQl0aGlzLnZlcmlmeU1vZGlmeU5leHQobmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbExpc3QsIHRoaXMuYnVpbGRNdXRhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TXV0YXRvclByZXZpb3VzKCkgewotCQl0aGlzLnZlcmlmeU1vZGlmeVByZXZpb3VzKG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxMaXN0LCB0aGlzLmJ1aWxkTXV0YXRvcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPFN0cmluZz4gYnVpbGRNdXRhdG9yKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIFN0cmluZyBvKSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5hZGQoaW5kZXgsIG8pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5yZW1vdmUoaW5kZXgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBTdHJpbmcgbykgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3Quc2V0KGluZGV4LCBvKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3ViY2xhc3NOZXh0KCkgewotCQl0aGlzLnZlcmlmeU1vZGlmeU5leHQodGhpcy5idWlsZFN1YmNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdWJjbGFzc1ByZXZpb3VzKCkgewotCQl0aGlzLnZlcmlmeU1vZGlmeVByZXZpb3VzKHRoaXMuYnVpbGRTdWJjbGFzcygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU3ViY2xhc3MoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm9yaWdpbmFsTGlzdCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IGN1cnJlbnRJbmRleCwgU3RyaW5nIG8pIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LmFkZChjdXJyZW50SW5kZXgsIG8pOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShpbnQgY3VycmVudEluZGV4KSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5yZW1vdmUoY3VycmVudEluZGV4KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXQoaW50IGN1cnJlbnRJbmRleCwgU3RyaW5nIG8pIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LnNldChjdXJyZW50SW5kZXgsIG8pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlNb2RpZnlOZXh0KExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCVN0cmluZyByZW1vdmVkID0gInRocmVlIjsKLQkJU3RyaW5nIGFkZGVkQWZ0ZXIgPSAiZml2ZSI7Ci0JCVN0cmluZyBhZGRlZCA9ICJmaXZlIGFuZCBhIGhhbGYiOwotCQlTdHJpbmcgcmVwbGFjZWQgPSAic2V2ZW4iOwotCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSAiYW5vdGhlciBzZXZlbiI7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKGFkZGVkQWZ0ZXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZXBsYWNlZCkpOwotCQkvLyB0cnkgdG8gcmVtb3ZlIGJlZm9yZSBjYWxsaW5nICNuZXh0KCkKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0LmVxdWFscyhhZGRlZEFmdGVyKSkgewotCQkJCWl0ZXJhdG9yLmFkZChhZGRlZCk7Ci0JCQl9Ci0JCQlpZiAobmV4dC5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkvLyB0cnkgdG8gcmVtb3ZlIHR3aWNlCi0JCQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQkJCX0KLQkJCWlmIChuZXh0LmVxdWFscyhyZXBsYWNlZCkpIHsKLQkJCQlpdGVyYXRvci5zZXQocmVwbGFjZW1lbnQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMoYWRkZWQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZXBsYWNlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU1vZGlmeVByZXZpb3VzKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCVN0cmluZyByZW1vdmVkID0gInRocmVlIjsKLQkJU3RyaW5nIGFkZGVkQmVmb3JlID0gImZpdmUiOwotCQlTdHJpbmcgYWRkZWQgPSAiZm91ciBhbmQgYSBoYWxmIjsKLQkJU3RyaW5nIHJlcGxhY2VkID0gInNldmVuIjsKLQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gImFub3RoZXIgc2V2ZW4iOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlbW92ZWQpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhhZGRlZEJlZm9yZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gaXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoYWRkZWRCZWZvcmUpKSB7Ci0JCQkJaXRlcmF0b3IuYWRkKGFkZGVkKTsKLQkJCX0KLQkJCWlmIChwcmV2aW91cy5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkvLyB0cnkgdG8gcmVtb3ZlIHR3aWNlCi0JCQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQkJfQotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhyZXBsYWNlZCkpIHsKLQkJCQlpdGVyYXRvci5zZXQocmVwbGFjZW1lbnQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMoYWRkZWQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZXBsYWNlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZENsb25lTGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKHRoaXMub3JpZ2luYWxMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLm9yaWdpbmFsTGlzdC5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZEVtcHR5TGlzdCgpOwotCQl0aGlzLnBvcHVsYXRlTGlzdChsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTGlzdChMaXN0PFN0cmluZz4gbGlzdCkgewotCQlsaXN0LmFkZCgiemVybyIpOwotCQlsaXN0LmFkZCgib25lIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInRocmVlIik7Ci0JCWxpc3QuYWRkKCJmb3VyIik7Ci0JCWxpc3QuYWRkKCJmaXZlIik7Ci0JCWxpc3QuYWRkKCJzaXgiKTsKLQkJbGlzdC5hZGQoInNldmVuIik7Ci0JCWxpc3QuYWRkKCJlaWdodCIpOwotCQlsaXN0LmFkZCgibmluZSIpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRFbXB0eUxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGNvbmN1cnJlbnQgYWNjZXNzOiBGaXJzdCBidWlsZCBhIGNsb25lIGl0ZXJhdG9yIGluIGEgc2VwYXJhdGUgdGhyZWFkCi0JICogdGhhdCBoYW5ncyBtb21lbnRhcmlseSBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbjsgdGhlbiBtb2RpZnkgdGhlIHNoYXJlZAotCSAqIGNvbGxlY3Rpb24gaW4gdGhpcyB0aHJlYWQuIFRoaXMgd291bGQgY2F1c2UgYQotCSAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaW4gdGhlIG90aGVyIHRocmVhZCBpZiB0aGUgY2xvbmUgaXRlcmF0b3IKLQkgKiB3ZXJlIG5vdCBzeW5jaHJvbml6ZWQgb24gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbnRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ2xvbmVJdGVyYXRvclRlc3RzLlNsb3dDb2xsZWN0aW9uPFN0cmluZz4gc2xvdyA9IG5ldyBDbG9uZUl0ZXJhdG9yVGVzdHMuU2xvd0NvbGxlY3Rpb248U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlTGlzdChzbG93KTsKLQkJLy8gdXNpbmcgdGhlIHVuc3luY2hyb25pemVkIGxpc3Qgd2lsbCBjYXVzZSB0aGUgdGVzdCB0byBmYWlsCi0JCS8vIHRoaXMub3JpZ2luYWxMaXN0ID0gc2xvdzsKLQkJdGhpcy5vcmlnaW5hbExpc3QgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KHNsb3cpOwotCi0JCXRoaXMuY29uY3VycmVudFByb2JsZW0gPSBmYWxzZTsKLQkJdGhpcy5jb25jdXJyZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLmJ1aWxkUnVubmFibGUoKSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCQl3aGlsZSAoIXNsb3cuaGFzU3RhcnRlZENsb25lKCkpIHsKLQkJCS8vIHdhaXQgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gc3RhcnQgdGhlIGNsb25lLi4uCi0JCQlUaHJlYWQueWllbGQoKTsKLQkJfQotCQkvLyAuLi50aGVuIHNuZWFrIGluIGFuIGV4dHJhIGVsZW1lbnQKLQkJdGhpcy5vcmlnaW5hbExpc3QuYWRkKCJzZXZlbnRlZW4iKTsKLQkJd2hpbGUgKHRocmVhZC5pc0FsaXZlKCkpIHsKLQkJCS8vIHdhaXQgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gZmluaXNoCi0JCQlUaHJlYWQueWllbGQoKTsKLQkJfQotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbmN1cnJlbnRQcm9ibGVtKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVMaXN0KGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbmN1cnJlbnRMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLmxvb3BXaXRoQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiB1c2UgYSBjbG9uZSBpdGVyYXRvciB0byBsb29wIG92ZXIgdGhlICJzbG93IiBjb2xsZWN0aW9uIGFuZCBjb3B5IGl0cwotCSAqIGNvbnRlbnRzIHRvIHRoZSBjb25jdXJyZW50IGNvbGxlY3Rpb24KLQkgKi8KLQl2b2lkIGxvb3BXaXRoQ2xvbmVMaXN0SXRlcmF0b3IoKSB7Ci0JCXRyeSB7Ci0JCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCXRoaXMuY29uY3VycmVudExpc3QuYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJdGhpcy5jb25jdXJyZW50UHJvYmxlbSA9IHRydWU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjMzk3Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbm90aGVyKCkgewotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbm90aGVyMigpIHsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0Fub3RoZXIzKCkgewotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUhhc0Fub3RoZXIoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKDgsIHN0cmVhbSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlIYXNBbm90aGVyKGludCBleHBlY3RlZCwgSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm90aGVyKCkgewotCQl0aGlzLnZlcmlmeUFub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm90aGVyMigpIHsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFub3RoZXIzKCkgewotCQl0aGlzLnZlcmlmeUFub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUFub3RoZXIoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKDEsIHN0cmVhbSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlBbm90aGVyKGludCBzdGFydCwgSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJaW50IGluZGV4ID0gc3RhcnQ7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBTdHJpbmcudmFsdWVPZihpbmRleCsrKSwgc3RyZWFtLm5leHQoKS5zdWJzdHJpbmcoMCwgMSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlSZW1vdmUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRMaXN0MSgpOwotCQlPYmplY3QgbGFzdEVsZW1lbnQxID0gbGlzdDEuZ2V0KGxpc3QxLnNpemUoKSAtIDEpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkTGlzdDIoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZExpc3QzKCk7Ci0KLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsaXN0MS5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QyLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDMubGlzdEl0ZXJhdG9yKCkpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAobmV4dC5lcXVhbHMobGFzdEVsZW1lbnQxKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNOZXh0KCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLnJlbW92ZSgpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAxIiwgdGhpcy5idWlsZExpc3QxKCkuc2l6ZSgpIC0gMiwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0RmFsc2UoImxhc3QgZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucyhsYXN0RWxlbWVudDEpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjIyIikpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAzIiwgdGhpcy5idWlsZExpc3QzKCkuc2l6ZSgpIC0gMSwgbGlzdDMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoIjg4ODg4ODg4IikpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBlbGVtZW50IHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDMiLCBsaXN0My5jb250YWlucygiNjY2NjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVFbGVtZW50KCkgewotCQlTdHJpbmcgaXRlbSA9ICIwIjsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKDksIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihpdGVtLCB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSkpOwotCQl0aGlzLnZlcmlmeUFub3RoZXIoMCwgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGl0ZW0sIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeVVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVDb21wb3NpdGVJdGVyYXRvcigpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeVVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmluZy5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCX0KLQotCXZvaWQgdmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3RyZWFtLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlIYXNBbm90aGVyMSgpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUhhc0Fub3RoZXIodGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IxKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5RW1wdHlIYXNBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eU5vU3VjaEVsZW1lbnRFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlIYXNBbm90aGVyMigpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUhhc0Fub3RoZXIodGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eU5vU3VjaEVsZW1lbnRFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZEl0ZXJhdG9ycygpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZEVtcHR5SXRlcmF0b3JzMSgpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZEVtcHR5SXRlcmF0b3JzMigpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlQ29tcG9zaXRlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9ycygpKTsKLQl9Ci0KLQkvLyBsZWF2ZSB1bmNoZWNrZWQgc28gd2UgY2FuIG92ZXJyaWRlIGluIHN1YmNsYXNzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9ycykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oaXRlcmF0b3JzKTsKLQl9Ci0KLQkvLyB1c2UgdmFyYXJnIGNvbnN0cnVjdG9yCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkpOwotCX0KLQotCS8vIHVzZSB2YXJhcmcgY29uc3RydWN0b3IKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4obmV3IEl0ZXJhdG9yW10geyB0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpIH0pOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gYnVpbGRJdGVyYXRvcnMoKSB7Ci0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEl0ZXJhdG9yMSgpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEl0ZXJhdG9yMigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEl0ZXJhdG9yMygpKTsKLQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkRW1wdHlJdGVyYXRvcnMxKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEVtcHR5SXRlcmF0b3JJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxJdGVyYXRvcjxTdHJpbmc+PiBidWlsZEVtcHR5SXRlcmF0b3JzMigpIHsKLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkRW1wdHlTdHJpbmdJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEVtcHR5U3RyaW5nSXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRFbXB0eVN0cmluZ0l0ZXJhdG9yKCkpOwotCQlyZXR1cm4gbGlzdC5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcnMoKSB7Ci0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMSgpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMygpKTsKLQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdDEoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0MigpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTGlzdDEoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRVbm1vZGlmaWFibGVMaXN0MigpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFVubW9kaWZpYWJsZUxpc3QzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkRW1wdHlJdGVyYXRvckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKSkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRFbXB0eVN0cmluZ0l0ZXJhdG9yKCkgewotCQlyZXR1cm4gKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRMaXN0MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQkJbGlzdC5hZGQoIjIyIik7Ci0JCWxpc3QuYWRkKCIzMzMiKTsKLQkJbGlzdC5hZGQoIjQ0NDQiKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdDIoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRMaXN0MygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjU1NTU1Iik7Ci0JCWxpc3QuYWRkKCI2NjY2NjYiKTsKLQkJbGlzdC5hZGQoIjc3Nzc3NzciKTsKLQkJbGlzdC5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCUxpc3Q8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUxpc3QxKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0aGlzLmJ1aWxkTGlzdDEoKSk7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdDIoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRoaXMuYnVpbGRMaXN0MigpKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVMaXN0MygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5idWlsZExpc3QzKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMmJkYmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzIHsKLQotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlzdXBlci50ZXN0UmVtb3ZlKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkTGlzdDIoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZExpc3QzKCk7Ci0JCU9iamVjdCBmaXJzdEVsZW1lbnQzID0gbGlzdDMuZ2V0KDApOwotCi0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQobGlzdDEubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0Mi5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QzLmxpc3RJdGVyYXRvcigpKTsKLQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQkJLy8gcG9zaXRpb24gdG8gZW5kIG9mIHN0cmVhbQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBwcmV2aW91cyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQkJaWYgKHByZXZpb3VzLmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhmaXJzdEVsZW1lbnQzKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNQcmV2aW91cygpOwotCQkJCS8vIG5vdyB0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXN0cmVhbS5yZW1vdmUoKTsKLQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMSIsIHRoaXMuYnVpbGRMaXN0MSgpLnNpemUoKSAtIDIsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIxIikpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucygiMzMzIikpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAzIiwgdGhpcy5idWlsZExpc3QzKCkuc2l6ZSgpIC0gMSwgbGlzdDMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImZpcnN0IGVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoZmlyc3RFbGVtZW50MykpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBlbGVtZW50IHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDMiLCBsaXN0My5jb250YWlucygiNjY2NjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRMaXN0MSgpOwotCQlPYmplY3QgbGFzdEVsZW1lbnQxID0gbGlzdDEuZ2V0KGxpc3QxLnNpemUoKSAtIDEpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkTGlzdDIoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZExpc3QzKCk7Ci0JCU9iamVjdCBmaXJzdEVsZW1lbnQzID0gbGlzdDMuZ2V0KDApOwotCi0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQobGlzdDEubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0Mi5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QzLmxpc3RJdGVyYXRvcigpKTsKLQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChuZXh0LmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0uYWRkKCIzLjUiKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAobmV4dC5lcXVhbHMobGFzdEVsZW1lbnQxKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNOZXh0KCk7Ci0JCQkJLy8gbm93IHRyeSB0byBhZGQgdG8gdGhlIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLmFkZCgic29tZXRoaW5nIGluIDMiKTsKLQkJCX0KLQkJfQotCQlzdHJlYW0uYWRkKCJmaW5hbGUiKTsKLQkJYm9vbGVhbiBjaGVja0ZvckZpbmFsZSA9IHRydWU7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpZiAoY2hlY2tGb3JGaW5hbGUpIHsKLQkJCQljaGVja0ZvckZpbmFsZSA9IGZhbHNlOwotCQkJCWFzc2VydEVxdWFscygiYWRkZWQgZWxlbWVudCBkcm9wcGVkIiwgImZpbmFsZSIsIHByZXZpb3VzKTsKLQkJCX0KLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLmFkZCgiMi41Iik7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhmaXJzdEVsZW1lbnQzKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNQcmV2aW91cygpOwotCQkJCS8vIG5vdyB0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLmFkZCgib2xkIHN0YXJ0IG9mIDMiKTsKLQkJCX0KLQkJfQotCQlzdHJlYW0uYWRkKCJwcmVsdWRlIik7Ci0JCWFzc2VydEVxdWFscygiYWRkZWQgZWxlbWVudCBkcm9wcGVkIiwgInByZWx1ZGUiLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50cyBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAxIiwgdGhpcy5idWlsZExpc3QxKCkuc2l6ZSgpICsgMywgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCAicHJlbHVkZSIsIGxpc3QxLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAxIiwgIjIuNSIsIGxpc3QxLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAxIiwgIjMuNSIsIGxpc3QxLmdldCg1KSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50cyBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgdGhpcy5idWlsZExpc3QzKCkuc2l6ZSgpICsgMywgbGlzdDMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCAic29tZXRoaW5nIGluIDMiLCBsaXN0My5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsICJvbGQgc3RhcnQgb2YgMyIsIGxpc3QzLmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgImZpbmFsZSIsIGxpc3QzLmdldChsaXN0My5zaXplKCkgLSAxKSk7Ci0KLQkJLy8gYWRkIHRvIHRoZSBmcm9udAotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLm5leHQoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRUcnVlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLnByZXZpb3VzKCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRUcnVlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLnByZXZpb3VzKCkuZXF1YWxzKCJibGFoIikpOwotCi0JCS8vIGFkZCB0byB0aGUgbWlkZGxlCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXN0cmVhbS5uZXh0KCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0RmFsc2UoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ubmV4dCgpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlzdHJlYW0ubmV4dCgpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0RmFsc2UoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ubmV4dCgpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRUcnVlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLnByZXZpb3VzKCkuZXF1YWxzKCJibGFoIikpOwotCi0JCS8vIGFkZCB0byB0aGUgZW5kCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0RmFsc2UoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0uaGFzTmV4dCgpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZExpc3QxKCk7Ci0JCU9iamVjdCBsYXN0RWxlbWVudDEgPSBsaXN0MS5nZXQobGlzdDEuc2l6ZSgpIC0gMSk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRMaXN0MigpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkTGlzdDMoKTsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudDMgPSBsaXN0My5nZXQoMCk7Ci0KLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsaXN0MS5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QyLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDMubGlzdEl0ZXJhdG9yKCkpOwotCi0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCQkvLyBwb3NpdGlvbiB0byBlbmQgb2Ygc3RyZWFtCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobmV4dC5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLnNldCgiMzMzYSIpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChuZXh0LmVxdWFscyhsYXN0RWxlbWVudDEpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc05leHQoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRvcgotCQkJCXN0cmVhbS5zZXQoImVuZCBvZiAxIik7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjIyIikpIHsKLQkJCQlzdHJlYW0uc2V0KCIyMmEiKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAocHJldmlvdXMuZXF1YWxzKGZpcnN0RWxlbWVudDMpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc1ByZXZpb3VzKCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0uc2V0KCJzdGFydCBvZiAzIik7Ci0JCQl9Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQocykgYWRkZWQgdG8gY29sbGVjdGlvbiAxIiwgdGhpcy5idWlsZExpc3QxKCkuc2l6ZSgpLCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCAiMjJhIiwgbGlzdDEuZ2V0KDEpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucygiMjIiKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsICIzMzNhIiwgbGlzdDEuZ2V0KDIpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucygiMzMzIikpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCAiZW5kIG9mIDEiLCBsaXN0MS5nZXQobGlzdDEuc2l6ZSgpIC0gMSkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKGxhc3RFbGVtZW50MSkpOwotCi0JCWFzc2VydEVxdWFscygiZWxlbWVudChzKSBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCB0aGlzLmJ1aWxkTGlzdDMoKS5zaXplKCksIGxpc3QzLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMyIsICJzdGFydCBvZiAzIiwgbGlzdDMuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDMiLCBsaXN0My5jb250YWlucyhmaXJzdEVsZW1lbnQzKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleFByZXZpb3VzSW5kZXgoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCQlpZiAobmV4dC5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCWktLTsKLQkJCX0KLQkJCWlmIChuZXh0LmVxdWFscygiNzc3Nzc3NyIpKSB7Ci0JCQkJc3RyZWFtLmFkZCgiNy41Iik7Ci0JCQkJaSsrOwotCQkJfQotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaW5kZXggaXMgY29ycnVwdCIsIDgsIGkpOwotCi0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBwcmV2aW91cyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQkJaWYgKHByZXZpb3VzLmVxdWFscygiNjY2NjY2IikpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJLy8gcmVtb3ZpbmcgYSBwcmV2aW91cyBlbGVtZW50LCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnNvcgotCQkJfQotCQkJaWYgKHByZXZpb3VzLmVxdWFscygiMjIiKSkgewotCQkJCXN0cmVhbS5hZGQoIjEuNSIpOwotCQkJCWkrKzsKLQkJCX0KLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCAwLCBpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMigpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKTsKLQl9Ci0KLQkvLyB1bmNoZWNrZWQgc28gd2UgY2FuIG92ZXJyaWRlIHRoZSB1bmNoZWNrZWQgbWV0aG9kIGluIHN1cGVyY2xhc3MKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3IgaXRlcmF0b3JzKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oKExpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8U3RyaW5nPj4pIGl0ZXJhdG9ycyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KG5ldyBMaXN0SXRlcmF0b3JbXSB7IHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkgfSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVMaXN0SXRlcmF0b3IoU3RyaW5nIHN0cmluZywgTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5RW51bWVyYXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlFbnVtZXJhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Njk3ODkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlFbnVtZXJhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5RW51bWVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFbXB0eUVudW1lcmF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1wdHlFbnVtZXJhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNNb3JlRWxlbWVudHMoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChFbnVtZXJhdGlvbjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5RW51bWVyYXRpb24uaW5zdGFuY2UoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0RWxlbWVudCgpIHsKLQkJZm9yIChFbnVtZXJhdGlvbjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5RW51bWVyYXRpb24uaW5zdGFuY2UoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5uZXh0RWxlbWVudCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUVudW1lcmF0aW9uPE9iamVjdD4gc3RyZWFtID0gRW1wdHlFbnVtZXJhdGlvbi5pbnN0YW5jZSgpOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJfQotCQl0cnkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4NWFkNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEVtcHR5SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbXB0eUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8TnVtYmVyPiBzdHJlYW0gPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWM4ZWZjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEVtcHR5TGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1wdHlMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKExpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJZm9yIChMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1ByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXNJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24gKG5leHQpOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQl0cnkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIChwcmV2aW91cyk6ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpLnJlbW92ZSgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24gKHJlbW92ZSkiLCBleENhdWdodCk7Ci0JCXRyeSB7Ci0JCQlFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpLnNldChuZXcgT2JqZWN0KCkpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24gKHNldCkiLCBleENhdWdodCk7Ci0JCXRyeSB7Ci0JCQlFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpLmFkZChuZXcgT2JqZWN0KCkpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24gKGFkZCkiLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjhmMTAxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW51bWVyYXRpb25JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEVudW1lcmF0aW9uSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUVudW1lcmF0aW9uPFN0cmluZz4gZW51bWVyYXRpb24gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dFVwY2FzdCgpIHsKLQkJRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbiA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhdG9yKHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGVudW1lcmF0aW9uKSB7Ci0JCXJldHVybiBuZXcgRW51bWVyYXRpb25JdGVyYXRvcjxTdHJpbmc+KGVudW1lcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPFN0cmluZz4gYnVpbGRFbnVtZXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRWZWN0b3IoKS5lbGVtZW50cygpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkRW51bWVyYXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkSXRlcmF0b3JVcGNhc3QoRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbikgewotCQlyZXR1cm4gbmV3IEVudW1lcmF0aW9uSXRlcmF0b3I8T2JqZWN0PihlbnVtZXJhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9GaWx0ZXJpbmdJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9GaWx0ZXJpbmdJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNDk4YWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAicHJlZml4IjsKLQotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJpbmcuZXF1YWxzKFBSRUZJWCArICIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2NlcHRIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQWNjZXB0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2NlcHROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBhY2NlcHQiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyTmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBhY2NlcHQiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVqZWN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlamVjdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygyLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVqZWN0TmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWplY3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RmFsc2UoImJvZ3VzIHJlamVjdCIsIHN0cmVhbS5uZXh0KCkuc3RhcnRzV2l0aChQUkVGSVgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb3RoSGFzTmV4dCgpIHsKLQkJLy8gaWYgYm90aCBhY2NlcHQoKSBhbmQgcmVqZWN0KCkgYXJlIG92ZXJyaWRkZW4sIGFjY2VwdCgpIGlzIHVzZWQKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEJvdGhJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvYWROZXh0KCkgewotCQkvLyBsb2FkTmV4dCgpIHVzZWQgdG8gY2F1c2UgYSBOUEUgd2hlbiBleGVjdXRpbmcgZHVyaW5nIHRoZQotCQkvLyBjb25zdHJ1Y3RvciBiZWNhdXNlIHRoZSAib3V0ZXIiIGNsYXNzIGlzIG5vdCBib3VuZCB1bnRpbCBjb21wbGV0aW9uCi0JCS8vIG9mIHRoZSBjb25zdHJ1Y3RvcgotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IyKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBhY2NlcHQiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IGEgZmlsdGVyZWQgaXRlcmF0b3Igd2l0aCBhIG5lc3RlZCBpdGVyYXRvciBvZiBhIHN1Yi10eXBlIChOdW1iZXIgdnMuIEludGVnZXIpCi0JcHVibGljIHZvaWQgdGVzdEdlbmVyaWNzMSgpIHsKLQkJTGlzdDxJbnRlZ2VyPiBpbnRlZ2VycyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLQkJaW50ZWdlcnMuYWRkKG5ldyBJbnRlZ2VyKDApKTsKLQkJaW50ZWdlcnMuYWRkKG5ldyBJbnRlZ2VyKDEpKTsKLQkJaW50ZWdlcnMuYWRkKG5ldyBJbnRlZ2VyKDIpKTsKLQkJaW50ZWdlcnMuYWRkKG5ldyBJbnRlZ2VyKDMpKTsKLQkJSXRlcmF0b3I8TnVtYmVyPiBzdHJlYW0gPSBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SW50ZWdlciwgTnVtYmVyPihpbnRlZ2Vycy5pdGVyYXRvcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJbnRlZ2VyIG8pIHsKLQkJCQlyZXR1cm4gby5pbnRWYWx1ZSgpID4gMTsKLQkJCX0KLQkJfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHN0cmVhbSkpOwotCX0KLQotCS8vIHRlc3QgYSBmaWx0ZXJlZCBpdGVyYXRvciB3aXRoIGEgbmVzdGVkIGl0ZXJhdG9yIG9mIGEgc3VwZXItdHlwZSAoSW50ZWdlciB2cy4gTnVtYmVyKQotCS8vIGkuZS4gdHJ1c3QgdGhhdCBGaWx0ZXIgd2lsbCBvbmx5IHJldHVybiB0aGUgYXBwcm9wcmlhdGUgc3ViLXR5cGUgb2JqZWN0cwotCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmljczIoKSB7Ci0JCUxpc3Q8TnVtYmVyPiBudW1iZXJzID0gbmV3IEFycmF5TGlzdDxOdW1iZXI+KCk7Ci0JCW51bWJlcnMuYWRkKG5ldyBJbnRlZ2VyKDApKTsKLQkJbnVtYmVycy5hZGQobmV3IExvbmcoMSkpOwotCQludW1iZXJzLmFkZChuZXcgSW50ZWdlcigyKSk7Ci0JCW51bWJlcnMuYWRkKG5ldyBGbG9hdCgzKSk7Ci0JCUl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxOdW1iZXIsIEludGVnZXI+KG51bWJlcnMuaXRlcmF0b3IoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoTnVtYmVyIG8pIHsKLQkJCQlyZXR1cm4gbyBpbnN0YW5jZW9mIEludGVnZXI7Ci0JCQl9Ci0JCX07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShzdHJlYW0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsdGVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEZpbHRlckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyTmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRGaWx0ZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRmlsdGVyZWRJdGVyYXRvcihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4obmVzdGVkSXRlcmF0b3IsIGZpbHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4obmVzdGVkSXRlcmF0b3IpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aChQUkVGSVgpOwotCQkJfQotCQl9OwotCX0KLQotCVN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBQUkVGSVg7Ci0JfQotCi0JLy8gdGhpcyBpbm5lciBpdGVyYXRvciB3aWxsIGNhbGwgdGhlICJvdXRlciIgb2JqZWN0Ci0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yMihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgoRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy50aGlzLmdldFByZWZpeCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoUFJFRklYICsgIjEiKTsKLQkJYy5hZGQoUFJFRklYICsgIjIiKTsKLQkJYy5hZGQoUFJFRklYICsgIjMiKTsKLQkJYy5hZGQoIjQiKTsKLQkJYy5hZGQoUFJFRklYICsgIjUiKTsKLQkJYy5hZGQoUFJFRklYICsgIjYiKTsKLQkJYy5hZGQoUFJFRklYICsgIjciKTsKLQkJYy5hZGQoIjgiKTsKLQkJcmV0dXJuIGMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRBY2NlcHRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkQWNjZXB0RmlsdGVyKFBSRUZJWCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQkvLyB0aGlzIGlubmVyIGl0ZXJhdG9yIHdpbGwgY2FsbCB0aGUgIm91dGVyIiBvYmplY3QKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbm5lckZpbHRlcmVkSXRlcmF0b3IyKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRGaWx0ZXJJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkRmlsdGVyRmlsdGVyKFBSRUZJWCkpOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRBY2NlcHRGaWx0ZXIoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmcsIFN0cmluZz4ocHJlZml4KSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRSZWplY3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkUmVqZWN0RmlsdGVyKFBSRUZJWCkpOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRSZWplY3RGaWx0ZXIoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmcsIFN0cmluZz4ocHJlZml4KSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiByZWplY3QoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyB1c2UgYW5vbnltb3VzIGlubmVyIEZpbHRlcgotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRGaWx0ZXJGaWx0ZXIoZmluYWwgU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aChwcmVmaXgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEJvdGhJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkQm90aEZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkQm90aEZpbHRlcihTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlRmlsdGVyPFN0cmluZywgU3RyaW5nPihwcmVmaXgpIHsKLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHJlamVjdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgodGhpcy5jcml0ZXJpb24pOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgodGhpcy5jcml0ZXJpb24pOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRmlsdGVyaW5nSXRlcmF0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JCQlTdHJpbmcgcyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiAiICsgcyk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0OGEyZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkdyYXBoSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgR3JhcGhJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCS8qKiB0aGlzIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYWxsIHRoZSBub2RlcyBjcmVhdGVkIGZvciB0aGUgdGVzdCAqLwotCUNvbGxlY3Rpb248R3JhcGhOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8R3JhcGhOb2RlPigpOwotCi0JcHVibGljIEdyYXBoSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQxKCkgewotCQl0aGlzLnZlcmlmeUhhc05leHQodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0MigpIHsKLQkJdGhpcy52ZXJpZnlIYXNOZXh0KHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTmV4dChJdGVyYXRvcjxHcmFwaE5vZGU+IGl0ZXJhdG9yKSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLm5vZGVzLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQxKCkgewotCQl0aGlzLnZlcmlmeU5leHQodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0MigpIHsKLQkJdGhpcy52ZXJpZnlOZXh0KHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TmV4dChJdGVyYXRvcjxHcmFwaE5vZGU+IGl0ZXJhdG9yKSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydFRydWUoImJvZ3VzIGVsZW1lbnQiLCB0aGlzLm5vZGVzLmNvbnRhaW5zKGl0ZXJhdG9yLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEdyYXBoSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uMigpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbihJdGVyYXRvcjxHcmFwaE5vZGU+IGl0ZXJhdG9yKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUxKCkgewotCQl0aGlzLnZlcmlmeVNpemUodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplMigpIHsKLQkJdGhpcy52ZXJpZnlTaXplKHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2l6ZShJdGVyYXRvcjxHcmFwaE5vZGU+IGl0ZXJhdG9yKSB7Ci0JCWludCBpdGVyYXRvclNpemUgPSBDb2xsZWN0aW9uVG9vbHMuc2l6ZShpdGVyYXRvcik7Ci0JCWludCBhY3R1YWxTaXplID0gdGhpcy5ub2Rlcy5zaXplKCk7Ci0JCWFzc2VydFRydWUoIlRvbyBmZXcgaXRlbXMgaW4gaXRlcmF0b3IuIiwgaXRlcmF0b3JTaXplID49IGFjdHVhbFNpemUpOwotCQlhc3NlcnRUcnVlKCJUb28gbWFueSBpdGVtcyBpbiBpdGVyYXRvci4iLCBpdGVyYXRvclNpemUgPD0gYWN0dWFsU2l6ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRHcmFwaEl0ZXJhdG9yKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQkJSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvciA9IG5ldyBHcmFwaEl0ZXJhdG9yPEdyYXBoTm9kZT4odGhpcy5idWlsZEdyYXBoUm9vdCgpKTsKLQkJCUdyYXBoTm9kZSBnbiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoImludmFsaWQgZ3JhcGggbm9kZTogIiArIGduKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSBncmFwaCBpdGVyYXRvciB3aXRoIGFuIGV4cGxpY2l0IG1pc3RlclJvZ2VycwotCSAqLwotCXByaXZhdGUgSXRlcmF0b3I8R3JhcGhOb2RlPiBidWlsZEdyYXBoSXRlcmF0b3IxKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmF0b3I8R3JhcGhOb2RlPih0aGlzLmJ1aWxkR3JhcGhSb290KCksIHRoaXMuYnVpbGRNaXN0ZXJSb2dlcnMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxHcmFwaE5vZGU+IGJ1aWxkTWlzdGVyUm9nZXJzKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEdyYXBoTm9kZT4oKSB7Ci0JCQlwdWJsaWMgSXRlcmF0b3I8R3JhcGhOb2RlPiBuZWlnaGJvcnMoR3JhcGhOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uZWlnaGJvcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBhIGdyYXBoIGl0ZXJhdG9yIHdpdGggYW4gb3ZlcnJpZGUKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPEdyYXBoTm9kZT4gYnVpbGRHcmFwaEl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhdG9yPEdyYXBoTm9kZT4odGhpcy5idWlsZEdyYXBoUm9vdCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycyhHcmFwaE5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5laWdoYm9ycygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgR3JhcGhOb2RlIGJ1aWxkR3JhcGhSb290KCkgewotCQlHcmFwaE5vZGUgbmNOb2RlID0gbmV3IEdyYXBoTm9kZSgiTm9ydGggQ2Fyb2xpbmEiKTsKLQkJR3JhcGhOb2RlIHZhTm9kZSA9IG5ldyBHcmFwaE5vZGUoIlZpcmdpbmlhIik7Ci0JCUdyYXBoTm9kZSBzY05vZGUgPSBuZXcgR3JhcGhOb2RlKCJTb3V0aCBDYXJvbGluYSIpOwotCQlHcmFwaE5vZGUgZ2FOb2RlID0gbmV3IEdyYXBoTm9kZSgiR2VvcmdpYSIpOwotCQlHcmFwaE5vZGUgZmxOb2RlID0gbmV3IEdyYXBoTm9kZSgiRmxvcmlkYSIpOwotCQlHcmFwaE5vZGUgYWxOb2RlID0gbmV3IEdyYXBoTm9kZSgiQWxhYmFtYSIpOwotCQlHcmFwaE5vZGUgbXNOb2RlID0gbmV3IEdyYXBoTm9kZSgiTWlzc2lzc2lwcGkiKTsKLQkJR3JhcGhOb2RlIHRuTm9kZSA9IG5ldyBHcmFwaE5vZGUoIlRlbm5lc3NlZSIpOwotCi0JCW5jTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgdmFOb2RlLCBzY05vZGUsIGdhTm9kZSwgdG5Ob2RlIH0pOwotCQl2YU5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IG5jTm9kZSwgdG5Ob2RlIH0pOwotCQlzY05vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IG5jTm9kZSwgZ2FOb2RlIH0pOwotCQlnYU5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IG5jTm9kZSwgc2NOb2RlLCBmbE5vZGUsIGFsTm9kZSwgdG5Ob2RlIH0pOwotCQlmbE5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IGdhTm9kZSB9KTsKLQkJYWxOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBnYU5vZGUsIG1zTm9kZSwgdG5Ob2RlIH0pOwotCQltc05vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IGFsTm9kZSwgdG5Ob2RlIH0pOwotCQl0bk5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IHZhTm9kZSwgbmNOb2RlLCBnYU5vZGUsIGFsTm9kZSwgbXNOb2RlIH0pOwotCi0JCXJldHVybiBuY05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBHcmFwaE5vZGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCXByaXZhdGUgQ29sbGVjdGlvbjxHcmFwaE5vZGU+IG5laWdoYm9ycyA9IG5ldyBBcnJheUxpc3Q8R3JhcGhOb2RlPigpOwotCi0JCXB1YmxpYyBHcmFwaE5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlHcmFwaEl0ZXJhdG9yVGVzdHMudGhpcy5ub2Rlcy5hZGQodGhpcyk7IC8vIGxvZyBub2RlCi0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXZvaWQgc2V0TmVpZ2hib3JzKEdyYXBoTm9kZVtdIG5laWdoYm9ycykgewotCQkJdGhpcy5uZWlnaGJvcnMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChuZWlnaGJvcnMpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKCkgewotCQkJcmV0dXJuIHRoaXMubmVpZ2hib3JzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG5laWdoYm9yc1NpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZWlnaGJvcnMuc2l6ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkdyYXBoTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSXRlcmF0b3JFbnVtZXJhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9JdGVyYXRvckVudW1lcmF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJkOGViNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9JdGVyYXRvckVudW1lcmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuSXRlcmF0b3JFbnVtZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEl0ZXJhdG9yRW51bWVyYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBJdGVyYXRvckVudW1lcmF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc01vcmVFbGVtZW50cygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCXN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTW9yZUVsZW1lbnRzVXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRW51bWVyYXRpb248T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb25VcGNhc3QoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0RWxlbWVudCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJRW51bWVyYXRpb248U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248U3RyaW5nPiBidWlsZEVudW1lcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEVudW1lcmF0aW9uKHRoaXMuYnVpbGRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPE9iamVjdD4gYnVpbGRFbnVtZXJhdGlvblVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRFbnVtZXJhdGlvblVwY2FzdCh0aGlzLmJ1aWxkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxTdHJpbmc+IGJ1aWxkRW51bWVyYXRpb24oSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEl0ZXJhdG9yRW51bWVyYXRpb248U3RyaW5nPihpdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxPYmplY3Q+IGJ1aWxkRW51bWVyYXRpb25VcGNhc3QoSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEl0ZXJhdG9yRW51bWVyYXRpb248T2JqZWN0PihpdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVmVjdG9yKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkVmVjdG9yKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXYuYWRkRWxlbWVudCgib25lIik7Ci0JCXYuYWRkRWxlbWVudCgidHdvIik7Ci0JCXYuYWRkRWxlbWVudCgidGhyZWUiKTsKLQkJdi5hZGRFbGVtZW50KCJmb3VyIik7Ci0JCXYuYWRkRWxlbWVudCgiZml2ZSIpOwotCQl2LmFkZEVsZW1lbnQoInNpeCIpOwotCQl2LmFkZEVsZW1lbnQoInNldmVuIik7Ci0JCXYuYWRkRWxlbWVudCgiZWlnaHQiKTsKLQkJcmV0dXJuIHY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9KcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0pwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDlkM2Y3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0pwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDaGFpbkl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xvbmVJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsb25lTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUVudW1lcmF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW1wdHlJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtcHR5TGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR3JhcGhJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZWVrYWJsZUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkT25seUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTNiNDdiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5QZWVrYWJsZUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgUGVla2FibGVJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFBlZWthYmxlSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJpbmcuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJlZSIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvdXIiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmaXZlIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRVcGNhc3QoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidGhyZWUiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb3VyIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZml2ZSIsIHN0cmVhbS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZWVrKCkgewotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCWZvciAoUGVla2FibGVJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGVlayA9IHN0cmVhbS5wZWVrKCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBwcmVtYXR1cmVseSBpZGVudGljYWwiLCBwZWVrICE9IG5leHQpOwotCQkJbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBub3QgaWRlbnRpY2FsIiwgcGVlayA9PSBuZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZWVrVXBjYXN0KCkgewotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCWZvciAoUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGVlayA9IHN0cmVhbS5wZWVrKCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBwcmVtYXR1cmVseSBpZGVudGljYWwiLCBwZWVrICE9IG5leHQpOwotCQkJbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBub3QgaWRlbnRpY2FsIiwgcGVlayA9PSBuZXh0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUGVla2FibGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIFBlZWthYmxlSXRlcmF0b3I8T2JqZWN0PiBidWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4obmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdChJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQlyZXR1cm4gYy5pdGVyYXRvcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDkyYzAzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgQ29tcG9zaXRlSXRlcmF0b3JUZXN0cyB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeUhhc0Fub3RoZXIoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJc3VwZXIudmVyaWZ5SGFzQW5vdGhlcihzdHJlYW0pOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbTIuaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtMi5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeUFub3RoZXIoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJc3VwZXIudmVyaWZ5QW5vdGhlcihzdHJlYW0pOwotCQlpbnQgaSA9IDg7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHN0cmVhbTsKLQkJd2hpbGUgKHN0cmVhbTIuaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgU3RyaW5nLnZhbHVlT2YoaS0tKSwgc3RyZWFtMi5wcmV2aW91cygpLnN1YnN0cmluZygwLCAxKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4UHJldmlvdXNJbmRleCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCBpcyBjb3JydXB0IiwgOCwgaSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCBpcyBjb3JydXB0IiwgMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzSW5kZXgoKSB7Ci0JCS8vIFRPRE8KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQkvLyAjcmVtb3ZlKCkgaXMgbm90IHN1cHBvcnRlZAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB7Ci0JCS8vICNyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMSgpIHsKLQkJLy8gI3JlbW92ZSgpIGlzIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCkgewotCQkvLyAjcmVtb3ZlKCkgaXMgbm90IHN1cHBvcnRlZAotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHN0cmVhbSk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHN0cmVhbTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbTIuaGFzUHJldmlvdXMoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtMi5wcmV2aW91cygpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeVVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeVVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHN0cmVhbSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3Qgc3RyaW5nID0gc3RyZWFtMi5wcmV2aW91cygpOwotCQkJaWYgKHN0cmluZy5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtMi5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJc3VwZXIudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKHN0cmVhbSk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHN0cmVhbTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3RyZWFtMi5zZXQoImp1bmsiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlFbXB0eUhhc0Fub3RoZXIoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJc3VwZXIudmVyaWZ5RW1wdHlIYXNBbm90aGVyKHN0cmVhbSk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHN0cmVhbTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCS8vIHVuY2hlY2tlZCBzbyB3ZSBjYW4gb3ZlcnJpZGUgdGhlIHVuY2hlY2tlZCBtZXRob2QgaW4gc3VwZXJjbGFzcwotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvcnMpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KChMaXN0SXRlcmF0b3I8TGlzdEl0ZXJhdG9yPFN0cmluZz4+KSBpdGVyYXRvcnMpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4obmV3IExpc3RJdGVyYXRvcltdIHsgdGhpcy5idWlsZEl0ZXJhdG9yMSgpLCB0aGlzLmJ1aWxkSXRlcmF0b3IyKCksIHRoaXMuYnVpbGRJdGVyYXRvcjMoKSB9KTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoU3RyaW5nIHN0cmluZywgTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDb21wb3NpdGVMaXN0SXRlcmF0b3Ioc3RyaW5nLCBpdGVyYXRvcik7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVMaXN0SXRlcmF0b3IoU3RyaW5nIHN0cmluZywgTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHN0cmluZywgaXRlcmF0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYXJpZWROZXN0ZWRJdGVyYXRvcnMoKSB7Ci0JCUxpc3Q8SW50ZWdlcj4gaW50ZWdlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0JCWludGVnZXJMaXN0LmFkZChuZXcgSW50ZWdlcig0MikpOwotCQlpbnRlZ2VyTGlzdC5hZGQobmV3IEludGVnZXIoNDIpKTsKLQkJaW50ZWdlckxpc3QuYWRkKG5ldyBJbnRlZ2VyKDExMSkpOwotCQlpbnRlZ2VyTGlzdC5hZGQobmV3IEludGVnZXIoNzcpKTsKLQotCQlMaXN0PEZsb2F0PiBmbG9hdExpc3QgPSBuZXcgQXJyYXlMaXN0PEZsb2F0PigpOwotCQlmbG9hdExpc3QuYWRkKG5ldyBGbG9hdCg0Mi40MmYpKTsKLQkJZmxvYXRMaXN0LmFkZChuZXcgRmxvYXQoMjIuMjJmKSk7Ci0JCWZsb2F0TGlzdC5hZGQobmV3IEZsb2F0KDExMS4xMTFmKSk7Ci0JCWZsb2F0TGlzdC5hZGQobmV3IEZsb2F0KDc3Ljc3ZikpOwotCi0JCUxpc3Q8TGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBOdW1iZXI+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0SXRlcmF0b3I8PyBleHRlbmRzIE51bWJlcj4+KCk7Ci0JCWxpc3QuYWRkKGludGVnZXJMaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQoZmxvYXRMaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQkJTGlzdEl0ZXJhdG9yPE51bWJlcj4gbGkgPSBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8TnVtYmVyPihsaXN0KTsKLQkJd2hpbGUgKGxpLmhhc05leHQoKSkgewotCQkJYXNzZXJ0VHJ1ZShsaS5uZXh0KCkuaW50VmFsdWUoKSA+IDApOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGVmYTJlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFJlYWRPbmx5SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0VXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRVcGNhc3QoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRSZWFkT25seUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlJdGVyYXRvcihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxTdHJpbmc+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPE9iamVjdD4obmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZlY3RvcigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBidWlsZFZlY3RvcigpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl2LmFkZEVsZW1lbnQoIm9uZSIpOwotCQl2LmFkZEVsZW1lbnQoInR3byIpOwotCQl2LmFkZEVsZW1lbnQoInRocmVlIik7Ci0JCXYuYWRkRWxlbWVudCgiZm91ciIpOwotCQl2LmFkZEVsZW1lbnQoImZpdmUiKTsKLQkJdi5hZGRFbGVtZW50KCJzaXgiKTsKLQkJdi5hZGRFbGVtZW50KCJzZXZlbiIpOwotCQl2LmFkZEVsZW1lbnQoImVpZ2h0Iik7Ci0JCXJldHVybiB2OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGI3MmY2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRBbmRIYXNQcmV2aW91c1VwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpLCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEFuZFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKSwgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRBbmRQcmV2aW91c1VwY2FzdCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCksIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCB0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIC0xLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4QW5kUHJldmlvdXNJbmRleFVwY2FzdCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAtMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnNldCgiYm9ndXMiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLmFkZCgiYm9ndXMiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8T2JqZWN0PiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFN0cmluZz4obmVzdGVkTGlzdEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8T2JqZWN0PihuZXN0ZWRMaXN0SXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdCgpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbC5hZGQoIm9uZSIpOwotCQlsLmFkZCgidHdvIik7Ci0JCWwuYWRkKCJ0aHJlZSIpOwotCQlsLmFkZCgiZm91ciIpOwotCQlsLmFkZCgiZml2ZSIpOwotCQlsLmFkZCgic2l4Iik7Ci0JCWwuYWRkKCJzZXZlbiIpOwotCQlsLmFkZCgiZWlnaHQiKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0NjU3Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCB0aGlzLnNpbmdsZUVsZW1lbnQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPFN0cmluZz4odGhpcy5zaW5nbGVFbGVtZW50KCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgc2luZ2xlRWxlbWVudCgpIHsKLQkJcmV0dXJuICJzaW5nbGUgZWxlbWVudCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlNDE5Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMgewotCi0JcHVibGljIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIDAsIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAxLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcmV2aW91cygpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCB0aGlzLnNpbmdsZUVsZW1lbnQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIHRoaXMuc2luZ2xlRWxlbWVudCgpLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXNJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIDAsIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgMCwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCi0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAtMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCi0JCXRyeSB7Ci0JCQlzdHJlYW0uYWRkKCJmb28iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCi0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHModGhpcy5zaW5nbGVFbGVtZW50KCkpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnNldCgiZm9vIik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLnNpbmdsZUVsZW1lbnQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmMjU1Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dFVwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIHRyYW5zZm9ybWF0aW9uIiwgKytpLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyB0cmFuc2Zvcm1hdGlvbiIsICsraSwgKChJbnRlZ2VyKSBzdHJlYW0ubmV4dCgpKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyB0cmFuc2Zvcm1hdGlvbiIsICsraSwgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJZm9yIChJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKGMuaXRlcmF0b3IoKSk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpID09IDMpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQiLCB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLnNpemUoKSAtIDEsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiIsIGMuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIiwgYy5jb250YWlucygiMjIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyUmVtb3ZlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoYy5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpID09IDMpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQiLCB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLnNpemUoKSAtIDEsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiIsIGMuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIiwgYy5jb250YWlucygiMjIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCUludGVnZXIgaW50ZWdlciA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlpbnRlZ2VyID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJaW50ZWdlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBpbnRlZ2VyLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpbnQgaSA9IHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKTsKLQkJCWlmIChpID09IDMpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYnVpbGRJdGVyYXRvcigpLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZEl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbm5lclRyYW5zZm9ybWF0aW9uSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVOZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciwgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiB0cmFuc2Zvcm1lcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JVcGNhc3QoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciwgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPiB0cmFuc2Zvcm1lcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8T2JqZWN0LCBPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+KCkgewotCQkJcHVibGljIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyVXBjYXN0KCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShPYmplY3QgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcigoKFN0cmluZykgbmV4dCkubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRJbm5lclRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIEludGVnZXI+KG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVOZXN0ZWRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRVbm1vZGlmaWFibGVDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCIxIik7Ci0JCWMuYWRkKCIyMiIpOwotCQljLmFkZCgiMzMzIik7Ci0JCWMuYWRkKCI0NDQ0Iik7Ci0JCWMuYWRkKCI1NTU1NSIpOwotCQljLmFkZCgiNjY2NjY2Iik7Ci0JCWMuYWRkKCI3Nzc3Nzc3Iik7Ci0JCWMuYWRkKCI4ODg4ODg4OCIpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHJhbnNmb3JtYXRpb25JdGVyYXRvcigpIHsKLQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJSXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IgPSBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIEludGVnZXI+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUludGVnZXIgaW50ZWdlciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoImludmFsaWQgaW50ZWdlcjogIiArIGludGVnZXIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4YTJlMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dEFuZEhhc1ByZXZpb3VzVXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0QW5kUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0QW5kUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygrK2ksIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQkrK2k7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoLS1pLCBzdHJlYW0ucHJldmlvdXMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IC0xOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygrK2ksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHRJbmRleEFuZFByZXZpb3VzSW5kZXgoKSB7Ci0JCWludCBpID0gLTE7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCi0JCSsraTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygtLWksIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlMaXN0PFN0cmluZz4gbCA9IHRoaXMuYnVpbGRMaXN0KCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lclRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKGwubGlzdEl0ZXJhdG9yKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCkgLSAxLCBsLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGxpc3QiLCBsLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGwuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlbW92ZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSB0aGlzLmJ1aWxkTGlzdCgpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IobC5saXN0SXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCkgLSAxLCBsLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGxpc3QiLCBsLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGwuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbk9uQWRkKCkgewotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5hZGQobmV3IEludGVnZXIoMCkpOwotCQkJZmFpbCgiZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbk9uU2V0KCkgewotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5zZXQobmV3IEludGVnZXIoMCkpOwotCQkJZmFpbCgiZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJSW50ZWdlciBpbnRlZ2VyID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWludGVnZXIgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnRlZ2VyID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGludGVnZXIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWludCBpID0gc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpOwotCQkJaWYgKGkgPT0gMykgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5idWlsZEl0ZXJhdG9yKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkSXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxTdHJpbmcsIEludGVnZXI+KG5lc3RlZEl0ZXJhdG9yLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8T2JqZWN0PiBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVXBjYXN0KExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxPYmplY3QsIEludGVnZXI+IHRyYW5zZm9ybWVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8T2JqZWN0LCBPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+KCkgewotCQkJcHVibGljIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyVXBjYXN0KCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShPYmplY3QgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcigoKFN0cmluZykgbmV4dCkubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTGlzdCgpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbC5hZGQoIjEiKTsKLQkJbC5hZGQoIjIyIik7Ci0JCWwuYWRkKCIzMzMiKTsKLQkJbC5hZGQoIjQ0NDQiKTsKLQkJbC5hZGQoIjU1NTU1Iik7Ci0JCWwuYWRkKCI2NjY2NjYiKTsKLQkJbC5hZGQoIjc3Nzc3NzciKTsKLQkJbC5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcigpIHsKLQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJSXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IgPSBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPih0aGlzLmJ1aWxkTGlzdCgpLmxpc3RJdGVyYXRvcigpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSW50ZWdlciBpbnRlZ2VyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBpbnRlZ2VyOiAiICsgaW50ZWdlcik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNWYxYTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIFRyZWVJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCS8qKiB0aGlzIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYWxsIHRoZSBub2RlcyBjcmVhdGVkIGZvciB0aGUgdGVzdCAqLwotCUNvbGxlY3Rpb248VHJlZU5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZT4oKTsKLQotCXB1YmxpYyBUcmVlSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQxKCkgewotCQl0aGlzLnZlcmlmeUhhc05leHQodGhpcy5idWlsZFRyZWVJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQyKCkgewotCQl0aGlzLnZlcmlmeUhhc05leHQodGhpcy5idWlsZFRyZWVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05leHQoSXRlcmF0b3I8VHJlZU5vZGU+IGl0ZXJhdG9yKSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLm5vZGVzLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQxKCkgewotCQl0aGlzLnZlcmlmeU5leHQodGhpcy5idWlsZFRyZWVJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQyKCkgewotCQl0aGlzLnZlcmlmeU5leHQodGhpcy5idWlsZFRyZWVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU5leHQoSXRlcmF0b3I8VHJlZU5vZGU+IGl0ZXJhdG9yKSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydFRydWUoImJvZ3VzIGVsZW1lbnQiLCB0aGlzLm5vZGVzLmNvbnRhaW5zKGl0ZXJhdG9yLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZFRyZWVJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZFRyZWVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24oSXRlcmF0b3I8VHJlZU5vZGU+IGl0ZXJhdG9yKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZTEoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZSh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlKEl0ZXJhdG9yPFRyZWVOb2RlPiBpdGVyYXRvcikgewotCQlTdHJpbmcgcGFyZW50TmFtZSA9ICJjaGlsZCAyIjsKLQkJU3RyaW5nIGNoaWxkTmFtZSA9ICJncmFuZGNoaWxkIDJBIjsKLQkJaW50IHN0YXJ0U2l6ZSA9IHRoaXMuY2hpbGRyZW5TaXplKHBhcmVudE5hbWUpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlUcmVlTm9kZSBub2RlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJaW50IGVuZFNpemUgPSB0aGlzLmNoaWxkcmVuU2l6ZShwYXJlbnROYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKHN0YXJ0U2l6ZSAtIDEsIGVuZFNpemUpOwotCX0KLQotCXByaXZhdGUgaW50IGNoaWxkcmVuU2l6ZShTdHJpbmcgbm9kZU5hbWUpIHsKLQkJZm9yIChJdGVyYXRvcjxUcmVlTm9kZT4gc3RyZWFtID0gdGhpcy5ub2Rlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJVHJlZU5vZGUgbm9kZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKG5vZGVOYW1lKSkgewotCQkJCXJldHVybiBub2RlLmNoaWxkcmVuU2l6ZSgpOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obm9kZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgdHJlZSBpdGVyYXRvciB3aXRoIGFuIGV4cGxpY2l0IG1pZHdpZmUKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPFRyZWVOb2RlPiBidWlsZFRyZWVJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPFRyZWVOb2RlPih0aGlzLmJ1aWxkVHJlZSgpLCB0aGlzLmJ1aWxkTWlkd2lmZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVJdGVyYXRvci5NaWR3aWZlPFRyZWVOb2RlPiBidWlsZE1pZHdpZmUoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8VHJlZU5vZGU+KCkgewotCQkJcHVibGljIEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbihUcmVlTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuY2hpbGRyZW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBhIHRyZWUgaXRlcmF0b3Igd2l0aCBhbiBvdmVycmlkZQotCSAqLwotCXByaXZhdGUgSXRlcmF0b3I8VHJlZU5vZGU+IGJ1aWxkVHJlZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3I8VHJlZU5vZGU+KHRoaXMuYnVpbGRUcmVlKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbihUcmVlTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuY2hpbGRyZW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRyZWVJdGVyYXRvcigpIHsKLQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJSXRlcmF0b3I8VHJlZU5vZGU+IGl0ZXJhdG9yID0gbmV3IFRyZWVJdGVyYXRvcjxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVRyZWVOb2RlIHRuID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCB0cmVlIG5vZGU6ICIgKyB0bik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgVHJlZU5vZGUgYnVpbGRUcmVlKCkgewotCQlUcmVlTm9kZSByb290ID0gbmV3IFRyZWVOb2RlKCJyb290Iik7Ci0JCVRyZWVOb2RlIGNoaWxkMSA9IG5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMSIpOwotCQluZXcgVHJlZU5vZGUoY2hpbGQxLCAiZ3JhbmRjaGlsZCAxQSIpOwotCQlUcmVlTm9kZSBjaGlsZDIgPSBuZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDIiKTsKLQkJbmV3IFRyZWVOb2RlKGNoaWxkMiwgImdyYW5kY2hpbGQgMkEiKTsKLQkJVHJlZU5vZGUgZ3JhbmRjaGlsZDJCID0gbmV3IFRyZWVOb2RlKGNoaWxkMiwgImdyYW5kY2hpbGQgMkIiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQiwgImdyZWF0LWdyYW5kY2hpbGQgMkIxIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkIsICJncmVhdC1ncmFuZGNoaWxkIDJCMiIpOwotCQlUcmVlTm9kZSBncmFuZGNoaWxkMkMgPSBuZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQyIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJDLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQzEiKTsKLQkJbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAzIik7Ci0JCXJldHVybiByb290OwotCX0KLQotCXByaXZhdGUgY2xhc3MgVHJlZU5vZGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIENvbGxlY3Rpb248VHJlZU5vZGU+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZT4oKTsKLQotCQlwdWJsaWMgVHJlZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlUcmVlSXRlcmF0b3JUZXN0cy50aGlzLm5vZGVzLmFkZCh0aGlzKTsgLy8gbG9nIG5vZGUKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgVHJlZU5vZGUoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcyhuYW1lKTsKLQkJCXBhcmVudC5hZGRDaGlsZCh0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkQ2hpbGQoVHJlZU5vZGUgY2hpbGQpIHsKLQkJCXRoaXMuY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZHJlbi5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBjaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZHJlbi5zaXplKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVHJlZU5vZGUoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMzk0YTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RNb2RlbFRlc3RzCi0JZXh0ZW5kcyBUZXN0Q2FzZQotCWltcGxlbWVudHMgU3RhdGVDaGFuZ2VMaXN0ZW5lciwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLCBMaXN0Q2hhbmdlTGlzdGVuZXIsIFRyZWVDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9UT19TVFJJTkcgPSAidGhpcyBpcyBhIHRlc3QiOwotCi0JcHJpdmF0ZSBTdGF0ZUNoYW5nZUV2ZW50IHN0YXRlQ2hhbmdlRXZlbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIHN0YXRlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IHByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIHByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAicHJvcGVydHlOYW1lIjsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IE9MRF9PQkpFQ1RfVkFMVUUgPSBuZXcgT2JqZWN0KCk7Ci0Jc3RhdGljIGZpbmFsIE9iamVjdCBORVdfT0JKRUNUX1ZBTFVFID0gbmV3IE9iamVjdCgpOwotCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIE9MRF9JTlRfVkFMVUUgPSBuZXcgSW50ZWdlcigyNyk7Ci0Jc3RhdGljIGZpbmFsIEludGVnZXIgTkVXX0lOVF9WQUxVRSA9IG5ldyBJbnRlZ2VyKDQyKTsKLQlzdGF0aWMgZmluYWwgQm9vbGVhbiBPTERfQk9PTEVBTl9WQUxVRSA9IEJvb2xlYW4uVFJVRTsKLQlzdGF0aWMgZmluYWwgQm9vbGVhbiBORVdfQk9PTEVBTl9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBjb2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIGl0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MTEVDVElPTl9OQU1FID0gImNvbGxlY3Rpb25OYW1lIjsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IEFEREVEX09CSkVDVF9WQUxVRSA9IG5ldyBPYmplY3QoKTsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IFJFTU9WRURfT0JKRUNUX1ZBTFVFID0gbmV3IE9iamVjdCgpOwotCXN0YXRpYyBmaW5hbCBpbnQgVEFSR0VUX0lOREVYID0gNzsKLQlzdGF0aWMgZmluYWwgaW50IFNPVVJDRV9JTkRFWCA9IDIyOwotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgbGlzdENoYW5nZUV2ZW50OwotCXByaXZhdGUgYm9vbGVhbiBpdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBpdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGl0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGl0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfTkFNRSA9ICJsaXN0TmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9JTkRFWCA9IDM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9JTkRFWCA9IDU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VfSU5ERVggPSAyOwotCi0JcHJpdmF0ZSBUcmVlQ2hhbmdlRXZlbnQgdHJlZUNoYW5nZUV2ZW50OwotCXByaXZhdGUgYm9vbGVhbiBub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gbm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gdHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gdHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJFRV9OQU1FID0gInRyZWVOYW1lIjsKLQlzdGF0aWMgZmluYWwgT2JqZWN0W10gT0JKRUNUX0FSUkFZX1BBVEggPSB7bmV3IE9iamVjdCgpLCBuZXcgT2JqZWN0KCksIG5ldyBTdHJpbmcoKX07Ci0Jc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX1BBVEggPSB7fTsKLQotCXB1YmxpYyBBYnN0cmFjdE1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVN0YXRlQ2hhbmdlKCkgewotCQl0aGlzLnN0YXRlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnN0YXRlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVN0YXRlQ2hhbmdlKCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zdGF0ZUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLnN0YXRlQ2hhbmdlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3RhdGVDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlT2JqZWN0T2JqZWN0KCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VPYmplY3RPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZU9iamVjdE9iamVjdCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZU9iamVjdE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlT2JqZWN0T2JqZWN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZU9iamVjdCgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlT2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChudWxsLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VPYmplY3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KG51bGwsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZU9iamVjdCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VJbnRJbnQoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZUludEludCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX0lOVF9WQUxVRSwgTkVXX0lOVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlSW50SW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlSW50SW50KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfSU5UX1ZBTFVFLCBORVdfSU5UX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VJbnRJbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlQm9vbGVhbkJvb2xlYW4oKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZUJvb2xlYW5Cb29sZWFuKCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfQk9PTEVBTl9WQUxVRSwgTkVXX0JPT0xFQU5fVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZUJvb2xlYW5Cb29sZWFuKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlQm9vbGVhbkJvb2xlYW4oKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9CT09MRUFOX1ZBTFVFLCBORVdfQk9PTEVBTl9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlQm9vbGVhbkJvb2xlYW4oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkQ29sbGVjdGlvbigpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VFdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZUV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKSB7Ci0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCkgewotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdENoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoUkVNT1ZFX0lOREVYLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCkgewotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoUkVQTEFDRV9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudChSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdENoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtTW92ZWRMaXN0KCkgewotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1Nb3ZlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbU1vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdENoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1Nb3ZlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDbGVhcmVkKCkgewotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZUV2ZW50KC0xLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoLTEsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdENoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2hhbmdlZCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudCgtMSwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2hhbmdlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdENoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkKCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZUV2ZW50KC0xLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTm9kZUFkZGVkT2JqZWN0QXJyYXlQYXRoKCkgewotCQl0aGlzLnRyZWVDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRPYmplY3RBcnJheVBhdGgoKTsKLQkJdGhpcy52ZXJpZnlUcmVlQ2hhbmdlRXZlbnQoT0JKRUNUX0FSUkFZX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRPYmplY3RBcnJheVBhdGgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZE9iamVjdEFycmF5UGF0aCgpOwotCQl0aGlzLnZlcmlmeVRyZWVDaGFuZ2VFdmVudChPQkpFQ1RfQVJSQVlfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlQWRkZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZUFkZGVkT2JqZWN0QXJyYXlQYXRoKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlQ2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlUmVtb3ZlZE9iamVjdEFycmF5UGF0aCgpIHsKLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlUmVtb3ZlZE9iamVjdEFycmF5UGF0aCgpOwotCQl0aGlzLnZlcmlmeVRyZWVDaGFuZ2VFdmVudChPQkpFQ1RfQVJSQVlfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlUmVtb3ZlZE9iamVjdEFycmF5UGF0aCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkT2JqZWN0QXJyYXlQYXRoKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUNoYW5nZUV2ZW50KE9CSkVDVF9BUlJBWV9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRPYmplY3RBcnJheVBhdGgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZVJlbW92ZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNsZWFyZWQoKSB7Ci0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlQ2hhbmdlRXZlbnQoRU1QVFlfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUNoYW5nZUV2ZW50KEVNUFRZX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2hhbmdlZE9iamVjdEFycmF5UGF0aCgpIHsKLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZE9iamVjdEFycmF5UGF0aCgpOwotCQl0aGlzLnZlcmlmeVRyZWVDaGFuZ2VFdmVudChPQkpFQ1RfQVJSQVlfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZE9iamVjdEFycmF5UGF0aCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkT2JqZWN0QXJyYXlQYXRoKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUNoYW5nZUV2ZW50KE9CSkVDVF9BUlJBWV9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWRPYmplY3RBcnJheVBhdGgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENPTExFQ1RJT05fTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ09MTEVDVElPTl9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ09MTEVDVElPTl9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcyk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcyk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVFJFRV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRSRUVfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRSRUVfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKCkgewotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCi0JCS8vIHZlcmlmeSB0aGF0IHRoZSBjbG9uZSBkb2VzIG5vdCBoYXZlIGFueSBsaXN0ZW5lcnMKLQkJVGVzdE1vZGVsIGNsb25lID0gdGhpcy50ZXN0TW9kZWwuY2xvbmUoKTsKLQkJYXNzZXJ0RmFsc2UoY2xvbmUuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQljbG9uZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlhc3NlcnRUcnVlKGNsb25lLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJLy8gY2hlY2sgb3JpZ2luYWwKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0KLQkJLy8gbm93IHRlc3QgZXZlbnRzIGZpcmVkIGJ5IG9yaWdpbmFsCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZU9iamVjdE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJLy8gbm93IHRlc3QgZXZlbnRzIGZpcmVkIGJ5IGNsb25lCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJY2xvbmUudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZU9iamVjdE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoY2xvbmUsIE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsU3RhdGVMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbFByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxDb2xsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbExpc3RMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsVHJlZUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxQcm9wZXJ0eUxpc3RlbmVyTmFtZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxDb2xsZWN0aW9uTGlzdGVuZXJOYW1lKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsTGlzdExpc3RlbmVyTmFtZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCBudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbFRyZWVMaXN0ZW5lck5hbWUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUJvZ3VzU3RhdGVMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKG5ldyBBYnN0cmFjdE1vZGVsVGVzdHMoImR1bW15IikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgQWJzdHJhY3RNb2RlbFRlc3RzKCJkdW1teSIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUJvZ3VzQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihuZXcgQWJzdHJhY3RNb2RlbFRlc3RzKCJkdW1teSIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUJvZ3VzTGlzdExpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihuZXcgQWJzdHJhY3RNb2RlbFRlc3RzKCJkdW1teSIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUJvZ3VzVHJlZUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihuZXcgQWJzdHJhY3RNb2RlbFRlc3RzKCJkdW1teSIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUJvZ3VzUHJvcGVydHlMaXN0ZW5lck5hbWUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IEFic3RyYWN0TW9kZWxUZXN0cygiZHVtbXkiKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c0NvbGxlY3Rpb25MaXN0ZW5lck5hbWUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IEFic3RyYWN0TW9kZWxUZXN0cygiZHVtbXkiKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c0xpc3RMaXN0ZW5lck5hbWUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IEFic3RyYWN0TW9kZWxUZXN0cygiZHVtbXkiKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c1RyZWVMaXN0ZW5lck5hbWUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IEFic3RyYWN0TW9kZWxUZXN0cygiZHVtbXkiKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50b1N0cmluZygpLmluZGV4T2YoVEVTVF9UT19TVFJJTkcpICE9IC0xKTsKLQl9Ci0KLS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy50ZXN0TW9kZWwsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRFcXVhbHMoc291cmNlLCB0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUFJPUEVSVFlfTkFNRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCB0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQoT2JqZWN0IGl0ZW0pIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQuaXRlbXMoKS5oYXNOZXh0KCkpOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKGl0ZW0sIHRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50Lml0ZW1zKCkubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudChpbmRleCwgaXRlbSwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2VFdmVudChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMubGlzdENoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmxpc3RDaGFuZ2VFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMSVNUX05BTUUsIHRoaXMubGlzdENoYW5nZUV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGFyZ2V0SW5kZXgsIHRoaXMubGlzdENoYW5nZUV2ZW50LmdldFRhcmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoc291cmNlSW5kZXgsIHRoaXMubGlzdENoYW5nZUV2ZW50LmdldFNvdXJjZUluZGV4KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoaW50IGluZGV4LCBPYmplY3QgaXRlbSwgT2JqZWN0IHJlcGxhY2VkSXRlbSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMubGlzdENoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmxpc3RDaGFuZ2VFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMSVNUX05BTUUsIHRoaXMubGlzdENoYW5nZUV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaW5kZXgsIHRoaXMubGlzdENoYW5nZUV2ZW50LmdldEluZGV4KCkpOwotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDaGFuZ2VFdmVudC5pdGVtcygpLmhhc05leHQoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoaXRlbSwgdGhpcy5saXN0Q2hhbmdlRXZlbnQuaXRlbXMoKS5uZXh0KCkpOwotCQl9Ci0JCWlmIChyZXBsYWNlZEl0ZW0gPT0gbnVsbCkgewotCQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2hhbmdlRXZlbnQucmVwbGFjZWRJdGVtcygpLmhhc05leHQoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMocmVwbGFjZWRJdGVtLCB0aGlzLmxpc3RDaGFuZ2VFdmVudC5yZXBsYWNlZEl0ZW1zKCkubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlUcmVlQ2hhbmdlRXZlbnQoT2JqZWN0W10gcGF0aCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMudHJlZUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLnRyZWVDaGFuZ2VFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhUUkVFX05BTUUsIHRoaXMudHJlZUNoYW5nZUV2ZW50LmdldFRyZWVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocGF0aCwgdGhpcy50cmVlQ2hhbmdlRXZlbnQuZ2V0UGF0aCgpKSk7Ci0JfQotCi0vLyAqKioqKioqKioqIGxpc3RlbmVyIGltcGxlbWVudGF0aW9ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLQkJdGhpcy5zdGF0ZUNoYW5nZUV2ZW50ID0gZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSB0cnVlOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBlOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IHRydWU7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gZTsKLQl9Ci0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IHRydWU7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gZTsKLQl9Ci0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IHRydWU7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gZTsKLQl9Ci0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSB0cnVlOwotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IGU7Ci0JfQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSB0cnVlOwotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IGU7Ci0JfQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IHRydWU7Ci0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gZTsKLQl9Ci0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBlOwotCX0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gdHJ1ZTsKLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBlOwotCX0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBlOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IHRydWU7Ci0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gZTsKLQl9Ci0JcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5ub2RlUmVtb3ZlZENhbGxlZCA9IHRydWU7Ci0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gZTsKLQl9Ci0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IHRydWU7Ci0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gZTsKLQl9Ci0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQkJVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVN0YXRlQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZU9iamVjdE9iamVjdCgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlT2JqZWN0KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VJbnRJbnQoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgT0xEX0lOVF9WQUxVRS5pbnRWYWx1ZSgpLCBORVdfSU5UX1ZBTFVFLmludFZhbHVlKCkpOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VCb29sZWFuQm9vbGVhbigpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfQk9PTEVBTl9WQUxVRS5ib29sZWFuVmFsdWUoKSwgTkVXX0JPT0xFQU5fVkFMVUUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbUFkZGVkQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChDT0xMRUNUSU9OX05BTUUsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChDT0xMRUNUSU9OX05BTUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoTElTVF9OQU1FLCBBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtUmVtb3ZlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChMSVNUX05BTUUsIFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbU1vdmVkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1Nb3ZlZChMSVNUX05BTUUsIFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDbGVhcmVkKCkgewotCQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9OQU1FKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDaGFuZ2VkKCkgewotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9OQU1FKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVBZGRlZE9iamVjdEFycmF5UGF0aCgpIHsKLQkJCXRoaXMuZmlyZU5vZGVBZGRlZChUUkVFX05BTUUsIE9CSkVDVF9BUlJBWV9QQVRIKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVSZW1vdmVkT2JqZWN0QXJyYXlQYXRoKCkgewotCQkJdGhpcy5maXJlTm9kZVJlbW92ZWQoVFJFRV9OQU1FLCBPQkpFQ1RfQVJSQVlfUEFUSCk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2xlYXJlZCgpIHsKLQkJCXRoaXMuZmlyZVRyZWVDbGVhcmVkKFRSRUVfTkFNRSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2hhbmdlZE9iamVjdEFycmF5UGF0aCgpIHsKLQkJCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKFRSRUVfTkFNRSwgT0JKRUNUX0FSUkFZX1BBVEgpOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG51bGwsIG5ldyBPYmplY3QoKSkpOwotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChuZXcgT2JqZWN0KCksIG51bGwpKTsKLQkJCWFzc2VydFRydWUodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQobmV3IE9iamVjdCgpLCBuZXcgT2JqZWN0KCkpKTsKLQkKLQkJCU9iamVjdCBzYW1lID0gbmV3IE9iamVjdCgpOwotCQkJYXNzZXJ0RmFsc2UodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoc2FtZSwgc2FtZSkpOwotCQkJYXNzZXJ0RmFsc2UodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQobnVsbCwgbnVsbCkpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgVGVzdE1vZGVsIGNsb25lKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKFRlc3RNb2RlbCkgc3VwZXIuY2xvbmUoKTsKLQkJCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJCX0KLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKFRFU1RfVE9fU1RSSU5HKTsKLQkJfQotCQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXJpYWxpemF0aW9uIHRlc3QgKioqKioqKioqKgkKLQotLy9UT0RPIC0gVGhpcyB0ZXN0IGRvZXNuJ3QgcGFzcyBpbiB0aGUgRWNsaXBzZSBidWlsZCBlbnZpcm9ubWVudCAoTGludXgpIGZvciBzb21lIHJlYXNvbgotLy8JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotLy8JCUxvY2FsTW9kZWwgbW9kZWwxID0gbmV3IExvY2FsTW9kZWwoKTsKLS8vCQlGb28gZm9vMSA9IG5ldyBGb28oKTsKLS8vCQlCYXIgYmFyMSA9IG5ldyBCYXIoKTsKLS8vCQlKb28gam9vMSA9IG5ldyBKb28oKTsKLS8vCQlKYXIgamFyMSA9IG5ldyBKYXIoKTsKLS8vCQltb2RlbDEuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihmb28xKTsKLS8vCQltb2RlbDEuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihiYXIxKTsKLS8vCQltb2RlbDEuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGpvbzEpOwotLy8JCW1vZGVsMS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoamFyMSk7Ci0vLwotLy8JCUNoYW5nZUxpc3RlbmVyW10gbGlzdGVuZXJzMSA9IHRoaXMubGlzdGVuZXJzKG1vZGVsMSwgU3RhdGVDaGFuZ2VMaXN0ZW5lci5jbGFzcyk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDIsIGxpc3RlbmVyczEubGVuZ3RoKTsKLS8vCQkvLyB0aGUgb3JkZXIgb2YgdGhlc2UgY291bGQgY2hhbmdlLi4uCi0vLwkJYXNzZXJ0RXF1YWxzKEZvby5jbGFzcywgbGlzdGVuZXJzMVswXS5nZXRDbGFzcygpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQmFyLmNsYXNzLCBsaXN0ZW5lcnMxWzFdLmdldENsYXNzKCkpOwotLy8KLS8vCQlsaXN0ZW5lcnMxID0gdGhpcy5saXN0ZW5lcnMobW9kZWwxLCBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3MpOwotLy8JCWFzc2VydEVxdWFscygyLCBsaXN0ZW5lcnMxLmxlbmd0aCk7Ci0vLwkJLy8gdGhlIG9yZGVyIG9mIHRoZXNlIGNvdWxkIGNoYW5nZS4uLgotLy8JCWFzc2VydEVxdWFscyhKb28uY2xhc3MsIGxpc3RlbmVyczFbMF0uZ2V0Q2xhc3MoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEphci5jbGFzcywgbGlzdGVuZXJzMVsxXS5nZXRDbGFzcygpKTsKLS8vCi0vLwkJTG9jYWxNb2RlbCBtb2RlbDIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKG1vZGVsMSk7Ci0vLwotLy8JCUNoYW5nZUxpc3RlbmVyW10gbGlzdGVuZXJzMiA9IHRoaXMubGlzdGVuZXJzKG1vZGVsMiwgU3RhdGVDaGFuZ2VMaXN0ZW5lci5jbGFzcyk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDEsIGxpc3RlbmVyczIubGVuZ3RoKTsKLS8vCQlhc3NlcnRFcXVhbHMoRm9vLmNsYXNzLCBsaXN0ZW5lcnMyWzBdLmdldENsYXNzKCkpOwotLy8KLS8vCQlsaXN0ZW5lcnMyID0gdGhpcy5saXN0ZW5lcnMobW9kZWwyLCBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3MpOwotLy8JCWFzc2VydEVxdWFscygxLCBsaXN0ZW5lcnMyLmxlbmd0aCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEpvby5jbGFzcywgbGlzdGVuZXJzMlswXS5nZXRDbGFzcygpKTsKLS8vCX0KLQotLy8gPj4+Pj4+Pj4+Pj4+Pj4+Pj4gdGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5ICN0ZXN0U2VyaWFsaXphdGlvbigpLCBjb21tZW50ZWQgb3V0IGFib3ZlLi4uCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lcltdIGxpc3RlbmVycyhMb2NhbE1vZGVsIG1vZGVsLCBDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MpIHsKLQkJQ2hhbmdlU3VwcG9ydCBjaGFuZ2VTdXBwb3J0ID0gKENoYW5nZVN1cHBvcnQpIENsYXNzVG9vbHMuZmllbGRWYWx1ZShtb2RlbCwgImNoYW5nZVN1cHBvcnQiKTsKLQkJcmV0dXJuIChDaGFuZ2VMaXN0ZW5lcltdKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QoY2hhbmdlU3VwcG9ydCwgImxpc3RlbmVycyIsIENsYXNzLmNsYXNzLCBsaXN0ZW5lckNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCUxvY2FsTW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9vIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKLQkJRm9vKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmFyIGltcGxlbWVudHMgU3RhdGVDaGFuZ2VMaXN0ZW5lciB7Ci0JCUJhcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEpvbyBleHRlbmRzIExpc3RDaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLS8vCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgPSB7bmV3IE9iamVjdFN0cmVhbUZpZWxkKCJjaGFuZ2VTdXBwb3J0IiwgQ2hhbmdlU3VwcG9ydC5jbGFzcyl9OwotCQlKb28oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmFyIGV4dGVuZHMgTGlzdENoYW5nZUFkYXB0ZXIgewotCQlKYXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJ1Zyg/KSB0ZXN0ICoqKioqKioqKioJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNFX01FU1NBR0UgPSAidGhpcyBvYmplY3QgaXMgbm8gbG9uZ2VyIGxpc3RlbmluZyB0byBsb2NhbEEiOwotCi0JLyoqCi0JICogVGVzdCB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbjoKLQkgKiAJLSBib3RoIEIgYW5kIEMgYXJlIGxpc3RlbmluZyB0byBBCi0JICogCS0gQyBpcyBhbHNvIGxpc3RlbmluZyB0byBCCi0JICogCS0gd2hlbiBCIHJlY2VpdmVzIGFuIGV2ZW50IGZyb20gQSwgaXQgd2lsbCBmaXJlIGFuIGV2ZW50IHRvIEMKLQkgKiAJLSB3aGVuIEMgcmVjZWl2ZXMgYW4gZXZlbnQgZnJvbSBCLCBpdCB3aWxsIFNUT1AgbGlzdGVuaW5nIHRvIEEKLQkgKiAJLSB0aGUgZXZlbnQgZnJvbSBCIHRvIEMgbWF5IGJlIHByZWNlZGVkIG9yIGZvbGxvd2VkIChkZXBlbmRpbmcgb24KLQkgKiAJCXRoZSBoYXNoIHBvc2l0aW9ucyBvZiBsaXN0ZW5lcnMpIGJ5IGFuIGV2ZW50IGZyb20gQSB0byBDOgotCSAqIAkJLSBpZiB0aGUgQSB0byBDIGV2ZW50IGNvbWVzIGZpcnN0LCBubyBwcm9ibGVtCi0JICogCQktIGJ1dCBpZiB0aGUgQSB0byBCIGV2ZW50IGNvbWVzIGZpcnN0LCB0aGUgQSB0byBDIGV2ZW50IHNob3VsZCBOT1QgaGFwcGVuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlU3RhdGVMaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlbW92ZVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcigKLQkJCW5ldyBOb3RpZnlDb21tYW5kKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKSB7Ci0JCQkJCWxvY2FsQS5ub3RpZnlQcm9wZXJ0eUxpc3RlbmVycygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RSZW1vdmVDb2xsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcigKLQkJCW5ldyBOb3RpZnlDb21tYW5kKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKSB7Ci0JCQkJCWxvY2FsQS5ub3RpZnlDb2xsZWN0aW9uTGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlbW92ZUxpc3RMaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeUxpc3RMaXN0ZW5lcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlVHJlZUxpc3RlbmVyKCkgewotCQl0aGlzLnZlcmlmeUluZGlyZWN0UmVtb3ZlTGlzdGVuZXIoCi0JCQluZXcgTm90aWZ5Q29tbWFuZCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSkgewotCQkJCQlsb2NhbEEubm90aWZ5VHJlZUxpc3RlbmVycygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKE5vdGlmeUNvbW1hbmQgY29tbWFuZCkgewotCQlMb2NhbEEgbG9jYWxBID0gbmV3IExvY2FsQSgpOwotCQlMb2NhbEIgbG9jYWxCID0gbmV3IExvY2FsQihsb2NhbEEpOwotCi0JCS8vIGJ1aWxkIGEgYnVuY2ggb2YgTG9jYWxDcyBzbyBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBub3RpZmllZCBBRlRFUiB0aGUgTG9jYWxCOwotCQkvLyB1c2luZyAxMDAwIHNlZW1lZCB0byBmYWlsIHZlcnkgY29uc2lzdGVudGx5IGJlZm9yZSBDaGFuZ2VTdXBwb3J0IHdhcyBmaXhlZAotCQlMb2NhbENbXSBsb2NhbENzID0gbmV3IExvY2FsQ1sxMDAwXTsKLQkJZm9yIChpbnQgaSA9IGxvY2FsQ3MubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWxvY2FsQ3NbaV0gPSBuZXcgTG9jYWxDKGxvY2FsQSwgbG9jYWxCKTsKLQkJfQotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWNvbW1hbmQubm90aWZ5TGlzdGVuZXJzKGxvY2FsQSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKSA9PSBJU0VfTUVTU0FHRSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RmFsc2UoZXhDYXVnaHQpOwotCi0JCWZvciAoaW50IGkgPSBsb2NhbENzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlhc3NlcnRGYWxzZShsb2NhbENzW2ldLmlzTGlzdGVuaW5nVG9Mb2NhbEEoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludGVyZmFjZSBOb3RpZnlDb21tYW5kIHsKLQkJdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBvYmplY3Qgc2ltcGx5IGZpcmVzIGEgc3RhdGUgY2hhbmdlIGV2ZW50LiBCb3RoIExvY2FsQiBhbmQgTG9jYWxDCi0JICogd2lsbCBiZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxBIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCUxvY2FsQSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJdm9pZCBub3RpZnlTdGF0ZUxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCXZvaWQgbm90aWZ5UHJvcGVydHlMaXN0ZW5lcnMoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoImZvbyIsIDEsIDIpOwotCQl9Ci0JCXZvaWQgbm90aWZ5Q29sbGVjdGlvbkxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCJmb28iKTsKLQkJfQotCQl2b2lkIG5vdGlmeUxpc3RMaXN0ZW5lcnMoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZCgiZm9vIik7Ci0JCX0KLQkJdm9pZCBub3RpZnlUcmVlTGlzdGVuZXJzKCkgewotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoImZvbyIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBvYmplY3Qgd2lsbCBmaXJlIHN0YXRlIGNoYW5nZSBldmVudHMgd2hlbmV2ZXIgaXQgcmVjZWl2ZXMKLQkgKiBhIHN0YXRlIGNoYW5nZSBldmVudCBmcm9tIGxvY2FsQS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbEIKLQkJZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JCWltcGxlbWVudHMgU3RhdGVDaGFuZ2VMaXN0ZW5lciwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLCBMaXN0Q2hhbmdlTGlzdGVuZXIsIFRyZWVDaGFuZ2VMaXN0ZW5lcgotCXsKLQkJTG9jYWxCKExvY2FsQSBsb2NhbEEpIHsKLQkJCXN1cGVyKCk7Ci0JCQlsb2NhbEEuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCWxvY2FsQS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJbG9jYWxBLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCWxvY2FsQS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQlsb2NhbEEuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZCgiYmFyIiwgMSwgMik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoImJhciIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKCJiYXIiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0KLQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKCJiYXIiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgb2JqZWN0IHdpbGwgbGlzdGVuIHRvIHR3byBvdGhlciBvYmplY3RzLCBsb2NhbEEgYW5kIGxvY2FsQi4KLQkgKiBJZiB0aGlzIG9iamVjdCByZWNlaXZlcyBub3RpZmljYXRpb24gZnJvbSBsb2NhbEIsIGl0IHdpbGwgc3RvcCBsaXN0ZW5pbmcgdG8KLQkgKiBsb2NhbEEuIElmIHRoaXMgb2JqZWN0IHJlY2VpdmVzIG5vdGlmaWNhdGlvbiBmcm9tIGxvY2FsQSwgaXQgd2lsbCBjaGVjayB0bwotCSAqIHNlZSB3aGV0aGVyIGl0IHN0aWxsIGxpc3RlbmluZyB0byBsb2NhbEEuIElmIHRoaXMgb2JqZWN0IGlzIG5vIGxvbmdlcgotCSAqIGxpc3RlbmluZyB0byBsb2NhbEEsIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgcmVjZWl2aW5nIHRoZSBldmVudCBhbmQKLQkgKiB0aHJvdyBhbiBleGNlcHRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxDCi0JCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCQlpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciwgTGlzdENoYW5nZUxpc3RlbmVyLCBUcmVlQ2hhbmdlTGlzdGVuZXIKLQl7Ci0JCXByaXZhdGUgTG9jYWxBIGxvY2FsQTsKLQkJcHJpdmF0ZSBMb2NhbEIgbG9jYWxCOwotCQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuaW5nVG9Mb2NhbEE7Ci0KLQkJTG9jYWxDKExvY2FsQSBsb2NhbEEsIExvY2FsQiBsb2NhbEIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmxvY2FsQSA9IGxvY2FsQTsKLQkJCXRoaXMubG9jYWxCID0gbG9jYWxCOwotCi0JCQlsb2NhbEEuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCWxvY2FsQS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJbG9jYWxBLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCWxvY2FsQS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQlsb2NhbEEuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IHRydWU7Ci0KLQkJCWxvY2FsQi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJbG9jYWxCLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQlsb2NhbEIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJbG9jYWxCLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCWxvY2FsQi5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJYm9vbGVhbiBpc0xpc3RlbmluZ1RvTG9jYWxBKCkgewotCQkJcmV0dXJuIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEE7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEEpIHsKLQkJCQlpZiAoICEgdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKElTRV9NRVNTQUdFKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQikgewotCQkJCXRoaXMubG9jYWxBLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2d1cyBldmVudCBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYm9ndXMgZXZlbnQgc291cmNlOiAiICsgc291cmNlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEEpIHsKLQkJCQlpZiAoICEgdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKElTRV9NRVNTQUdFKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQikgewotCQkJCXRoaXMubG9jYWxBLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl0aGlzLmxpc3RlbmluZ1RvTG9jYWxBID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJvZ3VzIGV2ZW50IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2d1cyBldmVudCBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2d1cyBldmVudCBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVDaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0pwdFV0aWxpdHlNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0pwdFV0aWxpdHlNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3N2JhN2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRVdGlsaXR5TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyLkpwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5TW9kZWxUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMuc3VpdGUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFic3RyYWN0TW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOZXdFdmVudFRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL05ld0V2ZW50VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvTmV3RXZlbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTBlMTNlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvTmV3RXZlbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiB0ZXN0IHdoYXQgaXQgdGFrZXMgdG8gYWRkIGEgbmV3IHR5cGUgb2YgZXZlbnQgdG8KLSAqIG1vZGVsIGFuZCBjaGFuZ2Ugc3VwcG9ydAotICovCi1wdWJsaWMgY2xhc3MgTmV3RXZlbnRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEZvbyBmb287Ci0KLQlwdWJsaWMgTmV3RXZlbnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5mb28gPSBuZXcgRm9vKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOb0Zvb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNOb0Zvb0NoYW5nZUxpc3RlbmVycygpKTsKLQkJTG9jYWxMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCXRoaXMuZm9vLmFkZEZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzTm9Gb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMuZm9vLnJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNOb0Zvb0NoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCUxvY2FsTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQl0aGlzLmZvby5hZGRGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLmZvby5yZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUZvb0NoYW5nZUV2ZW50KCkgewotCQlMb2NhbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXIucmVjZWl2ZWRGb29FdmVudCk7Ci0JCXRoaXMuZm9vLmFkZEZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5mb28uZm9vKCk7Ci0JCWFzc2VydFRydWUobGlzdGVuZXIucmVjZWl2ZWRGb29FdmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGhhcm5lc3MgY2xhc3NlcyAqKioqKioqKioqCi0KLQljbGFzcyBGb28gZXh0ZW5kcyBBYnN0cmFjdEZvb01vZGVsIHsKLQkJRm9vKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQl2b2lkIGZvbygpIHsKLQkJCXRoaXMuZmlyZUZvb0NoYW5nZUV2ZW50KCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBMb2NhbExpc3RlbmVyIGltcGxlbWVudHMgRm9vQ2hhbmdlTGlzdGVuZXIgewotCQlib29sZWFuIHJlY2VpdmVkRm9vRXZlbnQgPSBmYWxzZTsKLQkJTG9jYWxMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZm9vQ2hhbmdlZChGb29DaGFuZ2VFdmVudCBldmVudCkgewotCQkJdGhpcy5yZWNlaXZlZEZvb0V2ZW50ID0gdHJ1ZTsKLQkJfQotCX0KLQotCWludGVyZmFjZSBGb29Nb2RlbCBleHRlbmRzIE1vZGVsIHsKLQkJdm9pZCBhZGRGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCXZvaWQgcmVtb3ZlRm9vQ2hhbmdlTGlzdGVuZXIoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCX0KLQotCWludGVyZmFjZSBGb29DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIENoYW5nZUxpc3RlbmVyIHsKLQkJdm9pZCBmb29DaGFuZ2VkKEZvb0NoYW5nZUV2ZW50IGV2ZW50KTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgRm9vQ2hhbmdlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwdWJsaWMgRm9vQ2hhbmdlRXZlbnQoRm9vTW9kZWwgc291cmNlKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldEFzcGVjdE5hbWUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsgIC8vIHRoZSBwb2ludCBvZiB0aGUgZXZlbnQgaXMgdGhhdCB0aGUgbmFtZSBpcyB1bmtub3duLi4uCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBGb29DaGFuZ2VFdmVudCBjbG9uZVdpdGhTb3VyY2UoTW9kZWwgbmV3U291cmNlKSB7Ci0JCQlyZXR1cm4gbmV3IEZvb0NoYW5nZUV2ZW50KChGb29Nb2RlbCkgbmV3U291cmNlKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBBYnN0cmFjdEZvb01vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIEZvb01vZGVsIHsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgRm9vQ2hhbmdlU3VwcG9ydCBnZXRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIChGb29DaGFuZ2VTdXBwb3J0KSBzdXBlci5nZXRDaGFuZ2VTdXBwb3J0KCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiBuZXcgRm9vQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJcHJvdGVjdGVkIHZvaWQgZmlyZUZvb0NoYW5nZUV2ZW50KCkgewotCQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUZvb0NoYW5nZWQoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaGFzTm9Gb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gISB0aGlzLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZvb0NoYW5nZVN1cHBvcnQgZXh0ZW5kcyBDaGFuZ2VTdXBwb3J0IHsKLQkJRm9vQ2hhbmdlU3VwcG9ydChGb29Nb2RlbCBzb3VyY2UpIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCX0KLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxGb29DaGFuZ2VMaXN0ZW5lcj4gRk9PX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IEZvb0NoYW5nZUxpc3RlbmVyLmNsYXNzOwotCQl2b2lkIGFkZEZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmFkZExpc3RlbmVyKEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQkJfQotCQl2b2lkIHJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLnJlbW92ZUxpc3RlbmVyKEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoRk9PX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JCX0KLQkJcHJpdmF0ZSBGb29DaGFuZ2VMaXN0ZW5lcltdIGZvb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJCXJldHVybiAoRm9vQ2hhbmdlTGlzdGVuZXJbXSkgdGhpcy5saXN0ZW5lcnMoRk9PX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmlyZUZvb0NoYW5nZWQoKSB7Ci0JCQlGb29DaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJRm9vQ2hhbmdlTGlzdGVuZXJbXSBmb29DaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmZvb0NoYW5nZUxpc3RlbmVycygpOwotCQkJCWlmIChmb29DaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQl0YXJnZXRzID0gZm9vQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJCUZvb0NoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJCQlmb3IgKEZvb0NoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmZvb0NoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCQl9Ci0JCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQkJZXZlbnQgPSBuZXcgRm9vQ2hhbmdlRXZlbnQoKEZvb01vZGVsKSB0aGlzLnNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQl0YXJnZXQuZm9vQ2hhbmdlZChldmVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0aGlzLnNvdXJjZUNoYW5nZWQobnVsbCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9KcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NGE5YjguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9KcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDBiYWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFJlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJpdGVtQWRkZWRaZXJvQXJndW1lbnQiLCAiaXRlbVJlbW92ZWRaZXJvQXJndW1lbnQiLCAiY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnQiLCAiY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnQiKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnQiLCAiY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudCIsICJjb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZFplcm9Bcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkWmVyb0FyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWRTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWRTaW5nbGVBcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVtb3ZlZFplcm9Bcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVtb3ZlZFplcm9Bcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyU3RyaW5ncygpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyU3RyaW5ncygpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclN0cmluZ3MoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZ3MobmV3IFN0cmluZ1tdIHsiYmFyIiwgImJheiJ9KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQxKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgImNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQiKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpID09IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbi5jbGFzcykgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCU1ldGhvZCBtZXRob2QgPSBDbGFzc1Rvb2xzLm1ldGhvZCh0YXJnZXQsICJjb2xsZWN0aW9uQ2hhbmdlZERvdWJsZUFyZ3VtZW50IiwgbmV3IENsYXNzW10ge0NvbGxlY3Rpb25DaGFuZ2VFdmVudC5jbGFzcywgT2JqZWN0LmNsYXNzfSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMobWV0aG9kLnRvU3RyaW5nKCkpKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lck1pc21hdGNoKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJLy8gYnVpbGQgYSBDT0xMRUNUSU9OIGNoYW5nZSBsaXN0ZW5lciBhbmQgaGFjayBpdCBzbyB3ZQotCQkvLyBjYW4gYWRkIGl0IGFzIGEgTElTVCBjaGFuZ2UgbGlzdGVuZXIKLQkJT2JqZWN0IGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoKExpc3RDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRlc3RNb2RlbC5jaGFuZ2VMaXN0KCk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdTX0NPTExFQ1RJT04gPSAic3RyaW5ncyI7Ci0JCVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPFN0cmluZz4odGhpcy5zdHJpbmdzKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFN0cmluZyBzKSB7Ci0JCQkJCVRlc3RNb2RlbC50aGlzLnJlbW92ZVN0cmluZyhzKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXZvaWQgYWRkU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihzdHJpbmcsIHRoaXMuc3RyaW5ncywgU1RSSU5HU19DT0xMRUNUSU9OKTsKLQkJfQotCQl2b2lkIHJlbW92ZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihzdHJpbmcsIHRoaXMuc3RyaW5ncywgU1RSSU5HU19DT0xMRUNUSU9OKTsKLQkJfQotCQl2b2lkIGNsZWFyU3RyaW5ncygpIHsKLQkJCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuc3RyaW5ncywgU1RSSU5HU19DT0xMRUNUSU9OKTsKLQkJfQotCQl2b2lkIHJlcGxhY2VTdHJpbmdzKFN0cmluZ1tdIG5ld1N0cmluZ3MpIHsKLQkJCXRoaXMuc3RyaW5ncy5jbGVhcigpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLnN0cmluZ3MsIG5ld1N0cmluZ3MpOwotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoU1RSSU5HU19DT0xMRUNUSU9OKTsKLQkJfQotCQl2b2lkIGNoYW5nZUxpc3QoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZCgiYm9ndXMgbGlzdCIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWU7Ci0JCVN0cmluZyBzdHJpbmc7Ci0JCWJvb2xlYW4gaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLmNvbGxlY3Rpb25OYW1lID0gY29sbGVjdGlvbk5hbWU7Ci0JCQl0aGlzLnN0cmluZyA9IHN0cmluZzsKLQkJfQotCQl2b2lkIGl0ZW1BZGRlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtQWRkZWRTaW5nbGVBcmd1bWVudChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5jb2xsZWN0aW9uTmFtZSwgZS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZywgZS5pdGVtcygpLm5leHQoKSk7Ci0JCX0KLQkJdm9pZCBpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5jb2xsZWN0aW9uTmFtZSwgZS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZywgZS5pdGVtcygpLm5leHQoKSk7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5jb2xsZWN0aW9uTmFtZSwgZS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJCWFzc2VydEZhbHNlKGUuaXRlbXMoKS5oYXNOZXh0KCkpOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29sbGVjdGlvbk5hbWUsIGUuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCQlhc3NlcnRGYWxzZShlLml0ZW1zKCkuaGFzTmV4dCgpKTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlTGlzdENoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzNmFhNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlTGlzdENoYW5nZUxpc3RlbmVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAiaXRlbUFkZGVkWmVyb0FyZ3VtZW50IiwgIml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50IiwgIml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudCIsICJpdGVtTW92ZWRaZXJvQXJndW1lbnQiLCAibGlzdENsZWFyZWRaZXJvQXJndW1lbnQiLCAibGlzdENoYW5nZWRaZXJvQXJndW1lbnQiKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnQiLCAiaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnQiLCAiaXRlbU1vdmVkU2luZ2xlQXJndW1lbnQiLCAibGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudCIsICJsaXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZFplcm9Bcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWRTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVtb3ZlZFplcm9Bcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVtb3ZlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIG9sZFN0cmluZyA9ICJmb28iOwotCQlTdHJpbmcgbmV3U3RyaW5nID0gImJhciI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcob2xkU3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBuZXdTdHJpbmcsIDAsIG9sZFN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZyhvbGRTdHJpbmcsIG5ld1N0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgb2xkU3RyaW5nID0gImZvbyI7Ci0JCVN0cmluZyBuZXdTdHJpbmcgPSAiYmFyIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhvbGRTdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG5ld1N0cmluZywgMCwgb2xkU3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlU3RyaW5nKG9sZFN0cmluZywgbmV3U3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIG9sZFN0cmluZyA9ICJmb28iOwotCQlTdHJpbmcgbmV3U3RyaW5nID0gImJhciI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcob2xkU3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBuZXdTdHJpbmcsIDAsIG9sZFN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlU3RyaW5nKG9sZFN0cmluZywgbmV3U3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIG9sZFN0cmluZyA9ICJmb28iOwotCQlTdHJpbmcgbmV3U3RyaW5nID0gImJhciI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcob2xkU3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBuZXdTdHJpbmcsIDAsIG9sZFN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlU3RyaW5nKG9sZFN0cmluZywgbmV3U3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtTW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoInplcm8iKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygib25lIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoInR3byIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ0aHJlZSIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIDAsIDIpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLm1vdmVTdHJpbmcoMCwgMik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbU1vdmVkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ6ZXJvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoIm9uZSIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ0d28iKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidGhyZWUiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCAwLCAyKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5tb3ZlU3RyaW5nKDAsIDIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ6ZXJvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoIm9uZSIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ0d28iKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidGhyZWUiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCAwLCAyKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLm1vdmVTdHJpbmcoMCwgMik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbU1vdmVkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoInplcm8iKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygib25lIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoInR3byIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ0aHJlZSIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIDAsIDIpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwubW92ZVN0cmluZygwLCAyKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2xlYXJlZFplcm9Bcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyU3RyaW5ncygpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDbGVhcmVkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBudWxsLCAtMSk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlQWxsU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBudWxsLCAtMSk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZUFsbFN0cmluZ3MobmV3IFN0cmluZ1tdIHsiYmFyIiwgImJheiJ9KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBudWxsLCAtMSk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlQWxsU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VBbGxTdHJpbmdzKG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDEoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAibGlzdENoYW5nZWREb3VibGVBcmd1bWVudCIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENsYXNzKCkgPT0gTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJTWV0aG9kIG1ldGhvZCA9IENsYXNzVG9vbHMubWV0aG9kKHRhcmdldCwgImxpc3RDaGFuZ2VkRG91YmxlQXJndW1lbnQiLCBuZXcgQ2xhc3NbXSB7TGlzdENoYW5nZUV2ZW50LmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmVxdWFscyhtZXRob2QudG9TdHJpbmcoKSkpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyTWlzbWF0Y2goKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQkvLyBidWlsZCBhIExJU1QgY2hhbmdlIGxpc3RlbmVyIGFuZCBoYWNrIGl0IHNvIHdlCi0JCS8vIGNhbiBhZGQgaXQgYXMgYSBDT0xMRUNUSU9OIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAiaXRlbUFkZGVkU2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGVzdE1vZGVsLmNoYW5nZUNvbGxlY3Rpb24oKTsKLQkJCWZhaWwoImxpc3RlbmVyIG1pc21hdGNoOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR1NfTElTVCA9ICJzdHJpbmdzIjsKLQkJVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc3RyaW5ncyk7Ci0JCX0KLQkJdm9pZCBhZGRTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHN0cmluZywgdGhpcy5zdHJpbmdzLCBTVFJJTkdTX0xJU1QpOwotCQl9Ci0JCXZvaWQgcmVtb3ZlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KHRoaXMuc3RyaW5ncy5pbmRleE9mKHN0cmluZyksIHRoaXMuc3RyaW5ncywgU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIHJlcGxhY2VTdHJpbmcoU3RyaW5nIG9sZFN0cmluZywgU3RyaW5nIG5ld1N0cmluZykgewotCQkJdGhpcy5zZXRJdGVtSW5MaXN0KHRoaXMuc3RyaW5ncy5pbmRleE9mKG9sZFN0cmluZyksIG5ld1N0cmluZywgdGhpcy5zdHJpbmdzLCBTVFJJTkdTX0xJU1QpOwotCQl9Ci0JCXZvaWQgbW92ZVN0cmluZyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJdGhpcy5tb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuc3RyaW5ncywgU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIGNsZWFyU3RyaW5ncygpIHsKLQkJCXRoaXMuY2xlYXJMaXN0KHRoaXMuc3RyaW5ncywgU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIHJlcGxhY2VBbGxTdHJpbmdzKFN0cmluZ1tdIG5ld1N0cmluZ3MpIHsKLQkJCXRoaXMuc3RyaW5ncy5jbGVhcigpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLnN0cmluZ3MsIG5ld1N0cmluZ3MpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIGNoYW5nZUNvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgiYm9ndXMgY29sbGVjdGlvbiIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlTdHJpbmcgbGlzdE5hbWU7Ci0JCVN0cmluZyBzdHJpbmc7Ci0JCWludCBpbmRleDsKLQkJU3RyaW5nIHJlcGxhY2VkU3RyaW5nOwotCQlpbnQgc291cmNlSW5kZXg7Ci0JCWJvb2xlYW4gaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBsaXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBsaXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgbGlzdE5hbWUsIFN0cmluZyBzdHJpbmcsIGludCBpbmRleCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGVzdE1vZGVsID0gdGVzdE1vZGVsOwotCQkJdGhpcy5saXN0TmFtZSA9IGxpc3ROYW1lOwotCQkJdGhpcy5zdHJpbmcgPSBzdHJpbmc7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCX0KLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwsIFN0cmluZyBsaXN0TmFtZSwgU3RyaW5nIHN0cmluZywgaW50IGluZGV4LCBTdHJpbmcgcmVwbGFjZWRTdHJpbmcpIHsKLQkJCXRoaXModGVzdE1vZGVsLCBsaXN0TmFtZSwgc3RyaW5nLCBpbmRleCk7Ci0JCQl0aGlzLnJlcGxhY2VkU3RyaW5nID0gcmVwbGFjZWRTdHJpbmc7Ci0JCX0KLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwsIFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMubGlzdE5hbWUgPSBsaXN0TmFtZTsKLQkJCXRoaXMuaW5kZXggPSB0YXJnZXRJbmRleDsKLQkJCXRoaXMuc291cmNlSW5kZXggPSBzb3VyY2VJbmRleDsKLQkJfQotCQl2b2lkIGl0ZW1BZGRlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtQWRkZWRTaW5nbGVBcmd1bWVudChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZywgZS5pdGVtcygpLm5leHQoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5pbmRleCwgZS5nZXRJbmRleCgpKTsKLQkJfQotCQl2b2lkIGl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLml0ZW1zKCkubmV4dCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmluZGV4LCBlLmdldEluZGV4KCkpOwotCQl9Ci0JCXZvaWQgaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50KExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLml0ZW1zKCkubmV4dCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnJlcGxhY2VkU3RyaW5nLCBlLnJlcGxhY2VkSXRlbXMoKS5uZXh0KCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuaW5kZXgsIGUuZ2V0SW5kZXgoKSk7Ci0JCX0KLQkJdm9pZCBpdGVtTW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbU1vdmVkU2luZ2xlQXJndW1lbnQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5pbmRleCwgZS5nZXRUYXJnZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZUluZGV4LCBlLmdldFNvdXJjZUluZGV4KCkpOwotCQl9Ci0JCXZvaWQgbGlzdENoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBsaXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50KExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCQlhc3NlcnRGYWxzZShlLml0ZW1zKCkuaGFzTmV4dCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmluZGV4LCBlLmdldEluZGV4KCkpOwotCQl9Ci0JCXZvaWQgbGlzdENsZWFyZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBsaXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50KExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCQlhc3NlcnRGYWxzZShlLml0ZW1zKCkuaGFzTmV4dCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmluZGV4LCBlLmdldEluZGV4KCkpOwotCQl9Ci0JCXZvaWQgbGlzdENoYW5nZWREb3VibGVBcmd1bWVudChMaXN0Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IG8pIHsKLQkJCWZhaWwoImJvZ3VzIGV2ZW50OiAiICsgZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyODYyMjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQl0ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFplcm9Bcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvQXJndW1lbnROYW1lZFByb3BlcnR5KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFplcm9Bcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQiKSk7Ci0JCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IG1ldGhvZCB0aGF0IGhhcyBtb3JlIGdlbmVyYWwgbWV0aG9kIHBhcmFtZXRlciB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJTWV0aG9kIG1ldGhvZCA9IENsYXNzVG9vbHMubWV0aG9kKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50MiIsIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCkpOwotCQl0ZXN0TW9kZWwuc2V0VmFsdWUoOTkpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50TmFtZWRQcm9wZXJ0eSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgbWV0aG9kIHRoYXQgaGFzIG1vcmUgZ2VuZXJhbCBtZXRob2QgcGFyYW1ldGVyIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQXJndW1lbnROYW1lZFByb3BlcnR5MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJTWV0aG9kIG1ldGhvZCA9IENsYXNzVG9vbHMubWV0aG9kKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50MiIsIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKSk7Ci0JCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCS8vIGJ1aWxkIGEgUFJPUEVSVFkgY2hhbmdlIGxpc3RlbmVyIGFuZCBoYWNrIGl0IHNvIHdlCi0JCS8vIGNhbiBhZGQgaXQgYXMgYSBTVEFURSBjaGFuZ2UgbGlzdGVuZXIKLQkJT2JqZWN0IGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCQl0ZXN0TW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcigoU3RhdGVDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQxKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAic3RhdGVDaGFuZ2VkRG91YmxlQXJndW1lbnQiKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpID09IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbi5jbGFzcykgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCU1ldGhvZCBtZXRob2QgPSBDbGFzc1Rvb2xzLm1ldGhvZCh0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtQcm9wZXJ0eUNoYW5nZUV2ZW50LmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgaW50IHZhbHVlID0gMDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsKLQkJVGVzdE1vZGVsKGludCB2YWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJfQotCQl2b2lkIHNldFZhbHVlKGludCB2YWx1ZSkgewotCQkJaW50IG9sZCA9IHRoaXMudmFsdWU7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCQkJaWYgKG9sZCAhPSB2YWx1ZSkgewotCQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lOwotCQlPYmplY3Qgb2xkVmFsdWU7Ci0JCU9iamVjdCBuZXdWYWx1ZTsKLQkJYm9vbGVhbiB6ZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gc2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGVzdE1vZGVsID0gdGVzdE1vZGVsOwotCQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0JCQl0aGlzLm9sZFZhbHVlID0gbmV3IEludGVnZXIob2xkVmFsdWUpOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ldyBJbnRlZ2VyKG5ld1ZhbHVlKTsKLQkJfQotCQl2b2lkIHByb3BlcnR5Q2hhbmdlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuemVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuc2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJvcGVydHlOYW1lLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQkJdm9pZCBwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudDIoT2JqZWN0IG8pIHsKLQkJCVByb3BlcnR5Q2hhbmdlRXZlbnQgZSA9IChQcm9wZXJ0eUNoYW5nZUV2ZW50KSBvOwotCQkJdGhpcy5zaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5wcm9wZXJ0eU5hbWUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMub2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5uZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCQl2b2lkIHByb3BlcnR5Q2hhbmdlZERvdWJsZUFyZ3VtZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IG8pIHsKLQkJCWZhaWwoImJvZ3VzIGV2ZW50OiAiICsgZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMzBiMWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCXRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAic3RhdGVDaGFuZ2VkWmVyb0FyZ3VtZW50IikpOwotCQl0ZXN0TW9kZWwuY2hhbmdlU3RhdGUoKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsKTsKLQkJdGVzdE1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLmNoYW5nZVN0YXRlKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IG1ldGhvZCB0aGF0IGhhcyBtb3JlIGdlbmVyYWwgbWV0aG9kIHBhcmFtZXRlciB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQlNZXRob2QgbWV0aG9kID0gQ2xhc3NUb29scy5tZXRob2QodGFyZ2V0LCAic3RhdGVDaGFuZ2VkU2luZ2xlQXJndW1lbnQyIiwgbmV3IENsYXNzW10ge09iamVjdC5jbGFzc30pOwotCQl0ZXN0TW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKSk7Ci0JCXRlc3RNb2RlbC5jaGFuZ2VTdGF0ZSgpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyTWlzbWF0Y2goKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCS8vIGJ1aWxkIGEgU1RBVEUgY2hhbmdlIGxpc3RlbmVyIGFuZCBoYWNrIGl0IHNvIHdlCi0JCS8vIGNhbiBhZGQgaXQgYXMgYSBQUk9QRVJUWSBjaGFuZ2UgbGlzdGVuZXIKLQkJT2JqZWN0IGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCQl0ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRlc3RNb2RlbC5jaGFuZ2VQcm9wZXJ0eSgpOwotCQkJZmFpbCgibGlzdGVuZXIgbWlzbWF0Y2g6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAic3RhdGVDaGFuZ2VkRG91YmxlQXJndW1lbnQiKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpID09IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbi5jbGFzcykgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsKTsKLQkJTWV0aG9kIG1ldGhvZCA9IENsYXNzVG9vbHMubWV0aG9kKHRhcmdldCwgInN0YXRlQ2hhbmdlZERvdWJsZUFyZ3VtZW50IiwgbmV3IENsYXNzW10ge1N0YXRlQ2hhbmdlRXZlbnQuY2xhc3MsIE9iamVjdC5jbGFzc30pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMobWV0aG9kLnRvU3RyaW5nKCkpKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQl2b2lkIGNoYW5nZVN0YXRlKCkgewotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJdm9pZCBjaGFuZ2VQcm9wZXJ0eSgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZCgidmFsdWUiLCA1NSwgNDIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlib29sZWFuIHplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBzaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJfQotCQl2b2lkIHN0YXRlQ2hhbmdlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuemVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuc2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQl9Ci0JCXZvaWQgc3RhdGVDaGFuZ2VkU2luZ2xlQXJndW1lbnQyKE9iamVjdCBlKSB7Ci0JCQl0aGlzLnNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCAoKFN0YXRlQ2hhbmdlRXZlbnQpIGUpLmdldFNvdXJjZSgpKTsKLQkJfQotCQl2b2lkIHN0YXRlQ2hhbmdlZERvdWJsZUFyZ3VtZW50KFN0YXRlQ2hhbmdlRXZlbnQgZSwgT2JqZWN0IG8pIHsKLQkJCWZhaWwoImJvZ3VzIGV2ZW50OiAiICsgZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVUcmVlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTdjNzg1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFJlZmxlY3RpdmVUcmVlQ2hhbmdlTGlzdGVuZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgIm5vZGVBZGRlZFplcm9Bcmd1bWVudCIsICJub2RlUmVtb3ZlZFplcm9Bcmd1bWVudCIsICJ0cmVlQ2xlYXJlZFplcm9Bcmd1bWVudCIsICJ0cmVlQ2hhbmdlZFplcm9Bcmd1bWVudCIpOwotCX0KLQotCXByaXZhdGUgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAibm9kZUFkZGVkU2luZ2xlQXJndW1lbnQiLCAibm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudCIsICJ0cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50IiwgInRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZUFkZGVkWmVyb0FyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZUFkZGVkWmVyb0FyZ3VtZW50TmFtZWRUcmVlKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZUFkZGVkU2luZ2xlQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50TmFtZWRUcmVlKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlUmVtb3ZlZFplcm9Bcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlTm9kZSgiY2hpbGQiKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlUmVtb3ZlZFplcm9Bcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlTm9kZSgiY2hpbGQiKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZU5vZGUoImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVOb2RlKCJjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgiY2hpbGQiLCAiZ3JhbmRjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbMF0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyVHJlZSgpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50TmFtZWRUcmVlKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgiY2hpbGQiLCAiZ3JhbmRjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbMF0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyVHJlZSgpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJjaGlsZCIsICJncmFuZGNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1swXSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclRyZWUoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50TmFtZWRUcmVlKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgiY2hpbGQiLCAiZ3JhbmRjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbMF0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJUcmVlKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZUNoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImFub3RoZXIgY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZU5vZGUoImNoaWxkIiwgImFub3RoZXIgY2hpbGQiKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlQ2hhbmdlZFplcm9Bcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiYW5vdGhlciBjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlTm9kZSgiY2hpbGQiLCAiYW5vdGhlciBjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImFub3RoZXIgY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlTm9kZSgiY2hpbGQiLCAiYW5vdGhlciBjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImFub3RoZXIgY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlTm9kZSgiY2hpbGQiLCAiYW5vdGhlciBjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQxKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJjaGlsZCJ9KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgImNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQiKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpID09IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbi5jbGFzcykgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCU1ldGhvZCBtZXRob2QgPSBDbGFzc1Rvb2xzLm1ldGhvZCh0YXJnZXQsICJjb2xsZWN0aW9uQ2hhbmdlZERvdWJsZUFyZ3VtZW50IiwgbmV3IENsYXNzW10ge1RyZWVDaGFuZ2VFdmVudC5jbGFzcywgT2JqZWN0LmNsYXNzfSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMobWV0aG9kLnRvU3RyaW5nKCkpKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lck1pc21hdGNoKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJjaGlsZCJ9KTsKLQkJLy8gYnVpbGQgYSBUUkVFIGNoYW5nZSBsaXN0ZW5lciBhbmQgaGFjayBpdCBzbyB3ZQotCQkvLyBjYW4gYWRkIGl0IGFzIGEgQ09MTEVDVElPTiBjaGFuZ2UgbGlzdGVuZXIKLQkJT2JqZWN0IGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgIm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRlc3RNb2RlbC5jaGFuZ2VDb2xsZWN0aW9uKCk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIFN0cmluZyByb290OwotCQlwcml2YXRlIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gY2hpbGRyZW5MaXN0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PigpOwotCQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HU19UUkVFID0gInN0cmluZ3MiOwotCQlUZXN0TW9kZWwoU3RyaW5nIHJvb3QpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnJvb3QgPSByb290OwotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChyb290LCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0JCQl0aGlzLnBhcmVudHMucHV0KHJvb3QsIG51bGwpOwotCQl9Ci0JCVN0cmluZyBnZXRSb290KCkgewotCQkJcmV0dXJuIHRoaXMucm9vdDsKLQkJfQotCQlwcml2YXRlIFN0cmluZ1tdIHBhdGgoU3RyaW5nIG5vZGUpIHsKLQkJCVN0cmluZyB0ZW1wID0gbm9kZTsKLQkJCUxpc3Q8U3RyaW5nPiByZXZlcnNlUGF0aCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJZG8gewotCQkJCXJldmVyc2VQYXRoLmFkZCh0ZW1wKTsKLQkJCQl0ZW1wID0gdGhpcy5wYXJlbnRzLmdldCh0ZW1wKTsKLQkJCX0gd2hpbGUgKHRlbXAgIT0gbnVsbCk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnJldmVyc2UocmV2ZXJzZVBhdGgpLnRvQXJyYXkobmV3IFN0cmluZ1tyZXZlcnNlUGF0aC5zaXplKCldKTsKLQkJfQotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8U3RyaW5nPih0aGlzLmNoaWxkcmVuTGlzdHMua2V5U2V0KCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoU3RyaW5nIHMpIHsKLQkJCQkJVGVzdE1vZGVsLnRoaXMucmVtb3ZlTm9kZShzKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXZvaWQgYWRkTm9kZShTdHJpbmcgcGFyZW50LCBTdHJpbmcgY2hpbGQpIHsKLQkJCWlmICgocGFyZW50ID09IG51bGwpIHx8IChjaGlsZCA9PSBudWxsKSkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCi0JCQlDb2xsZWN0aW9uPFN0cmluZz4gY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBhZGQgYSBjaGlsZCB0byBhIG5vbi1leGlzdGVudCBwYXJlbnQiKTsKLQkJCX0KLQotCQkJaWYgKHRoaXMuY2hpbGRyZW5MaXN0cy5nZXQoY2hpbGQpICE9IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3QgYWRkIGEgY2hpbGQgdGhhdCBpcyBhbHJlYWR5IGluIHRoZSB0cmVlIik7Ci0JCQl9Ci0JCQkKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucHV0KGNoaWxkLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0JCQl0aGlzLnBhcmVudHMucHV0KGNoaWxkLCBwYXJlbnQpOwotCQkJdGhpcy5maXJlTm9kZUFkZGVkKFNUUklOR1NfVFJFRSwgdGhpcy5wYXRoKGNoaWxkKSk7Ci0JCX0KLQkJdm9pZCByZW1vdmVOb2RlKFN0cmluZyBub2RlKSB7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0KLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5MaXN0cy5nZXQobm9kZSk7Ci0JCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vZGUgaXMgbm90IGluIHRyZWUiKTsKLQkJCX0KLQkJCU9iamVjdFtdIHBhdGggPSB0aGlzLnBhdGgobm9kZSk7Ci0JCQlmb3IgKFN0cmluZyBzIDogY2hpbGRyZW4pIHsKLQkJCQl0aGlzLnJlbW92ZU5vZGUocyk7Ci0JCQl9Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKG5vZGUpOwotCQkJdGhpcy5wYXJlbnRzLnJlbW92ZShub2RlKTsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKFNUUklOR1NfVFJFRSwgcGF0aCk7Ci0JCX0KLQkJdm9pZCByZXBsYWNlTm9kZShTdHJpbmcgb2xkTm9kZSwgU3RyaW5nIG5ld05vZGUpIHsKLQkJCWlmICgob2xkTm9kZSA9PSBudWxsKSB8fCAobmV3Tm9kZSA9PSBudWxsKSkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCi0JCQlDb2xsZWN0aW9uPFN0cmluZz4gY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKG9sZE5vZGUpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbGQgbm9kZSBpcyBub3QgaW4gdHJlZSIpOwotCQkJfQotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChuZXdOb2RlLCBjaGlsZHJlbik7Ci0JCQlmb3IgKFN0cmluZyBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkJdGhpcy5wYXJlbnRzLnB1dChjaGlsZCwgbmV3Tm9kZSk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBwYXJlbnQgPSB0aGlzLnBhcmVudHMucmVtb3ZlKG9sZE5vZGUpOwotCQkJdGhpcy5wYXJlbnRzLnB1dChuZXdOb2RlLCBwYXJlbnQpOwotCi0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChTVFJJTkdTX1RSRUUsIHRoaXMucGF0aChuZXdOb2RlKSk7Ci0JCX0KLQkJdm9pZCBjbGVhclRyZWUoKSB7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMuY2xlYXIoKTsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQocm9vdCwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQkJdGhpcy5wYXJlbnRzLmNsZWFyKCk7Ci0JCQl0aGlzLnBhcmVudHMucHV0KHJvb3QsIG51bGwpOwotCQkJdGhpcy5maXJlVHJlZUNsZWFyZWQoU1RSSU5HU19UUkVFKTsKLQkJfQotCQl2b2lkIGNoYW5nZUNvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgiYm9ndXMgY29sbGVjdGlvbiIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlTdHJpbmcgdHJlZU5hbWU7Ci0JCVN0cmluZ1tdIHBhdGg7Ci0JCWJvb2xlYW4gbm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIG5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIG5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIG5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gdHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gdHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiB0cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiB0cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIHRyZWVOYW1lLCBTdHJpbmdbXSBwYXRoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLnRyZWVOYW1lID0gdHJlZU5hbWU7Ci0JCQl0aGlzLnBhdGggPSBwYXRoOwotCQl9Ci0JCXZvaWQgbm9kZUFkZGVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIG5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50KFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnRyZWVOYW1lLCBlLmdldFRyZWVOYW1lKCkpOwotCQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHRoaXMucGF0aCwgZS5nZXRQYXRoKCkpKTsKLQkJfQotCQl2b2lkIG5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgbm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnRyZWVOYW1lLCBlLmdldFRyZWVOYW1lKCkpOwotCQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHRoaXMucGF0aCwgZS5nZXRQYXRoKCkpKTsKLQkJfQotCQl2b2lkIHRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgdHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnRyZWVOYW1lLCBlLmdldFRyZWVOYW1lKCkpOwotCQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHRoaXMucGF0aCwgZS5nZXRQYXRoKCkpKTsKLQkJfQotCQl2b2lkIHRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgdHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnRyZWVOYW1lLCBlLmdldFRyZWVOYW1lKCkpOwotCQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHRoaXMucGF0aCwgZS5nZXRQYXRoKCkpKTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQoVHJlZUNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZjk0Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRW1wbG95ZWUgZW1wbG95ZWU7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gZW1wbG95ZWVIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBlbXBsb3llZUV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBpZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGF0ZT4gaGlyZURhdGVBZGFwdGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgYWRhcHRlckV2ZW50OwotCi0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLlRyaWdnZXIgdHJpZ2dlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1ZmZlcmVkSURIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1ZmZlcmVkTmFtZUhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPERhdGU+IGJ1ZmZlcmVkSGlyZURhdGVIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBidWZmZXJlZEV2ZW50OwotCi0JcHVibGljIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXRoaXMuZW1wbG95ZWUgPSBuZXcgRW1wbG95ZWUoMTcsICJGcmVkZHkiLCBuZXcgRGF0ZSgpKTsKLQkJdGhpcy5lbXBsb3llZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+KHRoaXMuZW1wbG95ZWUpOwotCi0JCXRoaXMudHJpZ2dlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLlRyaWdnZXIoKTsKLQotCQl0aGlzLmlkQWRhcHRlciA9IHRoaXMuYnVpbGRJREFkYXB0ZXIodGhpcy5lbXBsb3llZUhvbGRlcik7Ci0JCXRoaXMuYnVmZmVyZWRJREhvbGRlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KHRoaXMuaWRBZGFwdGVyLCB0aGlzLnRyaWdnZXIpOwotCi0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIodGhpcy5lbXBsb3llZUhvbGRlcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm5hbWVBZGFwdGVyLCB0aGlzLnRyaWdnZXIpOwotCi0JCXRoaXMuaGlyZURhdGVBZGFwdGVyID0gdGhpcy5idWlsZEhpcmVEYXRlQWRhcHRlcih0aGlzLmVtcGxveWVlSG9sZGVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGF0ZT4odGhpcy5oaXJlRGF0ZUFkYXB0ZXIsIHRoaXMudHJpZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZElEQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIEludGVnZXI+KGVIb2xkZXIsIEVtcGxveWVlLklEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0SUQoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldElEKHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbXBsb3llZSwgU3RyaW5nPihlSG9sZGVyLCBFbXBsb3llZS5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxEYXRlPiBidWlsZEhpcmVEYXRlQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIERhdGU+KGVIb2xkZXIsIEVtcGxveWVlLkhJUkVfREFURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGF0ZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEhpcmVEYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhEYXRlIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEhpcmVEYXRlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCURhdGUgdGVtcCA9IHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuc2V0VmFsdWUobmV3IEludGVnZXIoMzIzKSk7Ci0JCWFzc2VydEVxdWFscygxNywgdGhpcy5lbXBsb3llZS5nZXRJRCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMjMpLCB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0KCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDMyMykpOwotCQlhc3NlcnRFcXVhbHMoMTcsIHRoaXMuZW1wbG95ZWUuZ2V0SUQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuaWRBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzIzKSwgdGhpcy5idWZmZXJlZElESG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlEYXRlIHRlbXAgPSB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCk7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnRyaWdnZXIuYWNjZXB0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMyMywgdGhpcy5lbXBsb3llZS5nZXRJRCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuaWRBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzIzKSwgdGhpcy5idWZmZXJlZElESG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzZXQoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuc2V0VmFsdWUobmV3IEludGVnZXIoMzIzKSk7Ci0JCWFzc2VydEVxdWFscygxNywgdGhpcy5lbXBsb3llZS5nZXRJRCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMjMpLCB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCURhdGUgdGVtcCA9IHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuaGlyZURhdGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJpZ2dlci5yZXNldCgpOwotCi0JCWFzc2VydEVxdWFscygxNywgdGhpcy5lbXBsb3llZS5nZXRJRCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5pZEFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm5hbWVBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSURfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5ISVJFX0RBVEVfUFJPUEVSVFkpKTsKLQotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRJREhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmlkQWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm5hbWVBZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaGlyZURhdGVBZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSURfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLkhJUkVfREFURV9QUk9QRVJUWSkpOwotCi0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZElESG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaWRBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5uYW1lQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaGlyZURhdGVBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLklEX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSElSRV9EQVRFX1BST1BFUlRZKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYWRhcHRlckxpc3RlbmVyID0gdGhpcy5idWlsZEFkYXB0ZXJMaXN0ZW5lcigpOwotCQl0aGlzLm5hbWVBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBhZGFwdGVyTGlzdGVuZXIpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZW1wbG95ZWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRFbXBsb3llZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZW1wbG95ZWUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihFbXBsb3llZS5OQU1FX1BST1BFUlRZLCBlbXBsb3llZUxpc3RlbmVyKTsKLQotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBhZGFwdGVyTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQWRhcHRlckxpc3RlbmVyKCk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihhZGFwdGVyTGlzdGVuZXIpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZW1wbG95ZWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRFbXBsb3llZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZW1wbG95ZWUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihlbXBsb3llZUxpc3RlbmVyKTsKLQotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKSB7Ci0JCXRoaXMuYnVmZmVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuYWRhcHRlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5lbXBsb3llZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYnVmZmVyZWRFdmVudCwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIkZyZWRkeSIsICJSaXBsZXkiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFkYXB0ZXJFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5lbXBsb3llZUV2ZW50KTsKLQotCQl0aGlzLmJ1ZmZlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmFkYXB0ZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMuZW1wbG95ZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJDaGFybGllIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5idWZmZXJlZEV2ZW50LCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAiUmlwbGV5IiwgIkNoYXJsaWUiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFkYXB0ZXJFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5lbXBsb3llZUV2ZW50KTsKLQotCQl0aGlzLmJ1ZmZlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmFkYXB0ZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMuZW1wbG95ZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJpZ2dlci5hY2NlcHQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmJ1ZmZlcmVkRXZlbnQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYWRhcHRlckV2ZW50LCB0aGlzLm5hbWVBZGFwdGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsICJGcmVkZHkiLCAiQ2hhcmxpZSIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZW1wbG95ZWVFdmVudCwgdGhpcy5lbXBsb3llZSwgRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSwgIkZyZWRkeSIsICJDaGFybGllIik7Ci0KLQkJdGhpcy5idWZmZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5hZGFwdGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLmVtcGxveWVlRXZlbnQgPSBudWxsOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiSmFzb24iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmJ1ZmZlcmVkRXZlbnQsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsICJDaGFybGllIiwgIkphc29uIik7Ci0JCWFzc2VydE51bGwodGhpcy5hZGFwdGVyRXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuZW1wbG95ZWVFdmVudCk7Ci0KLQkJdGhpcy5idWZmZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5hZGFwdGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLmVtcGxveWVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyaWdnZXIucmVzZXQoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmJ1ZmZlcmVkRXZlbnQsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsICJKYXNvbiIsICJDaGFybGllIik7Ci0JCWFzc2VydE51bGwodGhpcy5hZGFwdGVyRXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuZW1wbG95ZWVFdmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmJ1ZmZlcmVkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEFkYXB0ZXJMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmFkYXB0ZXJFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRW1wbG95ZWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmVtcGxveWVlRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhwcm9wZXJ0eU5hbWUsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCBldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBFbXBsb3llZSBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGludCBpZDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BST1BFUlRZID0gImlkIjsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXByaXZhdGUgRGF0ZSBoaXJlRGF0ZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJUkVfREFURV9QUk9QRVJUWSA9ICJoaXJlRGF0ZSI7Ci0KLQkJRW1wbG95ZWUoaW50IGlkLCBTdHJpbmcgbmFtZSwgRGF0ZSBoaXJlRGF0ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmhpcmVEYXRlID0gaGlyZURhdGU7Ci0JCX0KLQkJaW50IGdldElEKCkgewotCQkJcmV0dXJuIHRoaXMuaWQ7Ci0JCX0KLQkJdm9pZCBzZXRJRChpbnQgaWQpIHsKLQkJCWludCBvbGQgPSB0aGlzLmlkOwotCQkJdGhpcy5pZCA9IGlkOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElEX1BST1BFUlRZLCBvbGQsIGlkKTsKLQkJfQotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCURhdGUgZ2V0SGlyZURhdGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5oaXJlRGF0ZTsKLQkJfQotCQl2b2lkIHNldEhpcmVEYXRlKERhdGUgaGlyZURhdGUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmhpcmVEYXRlOwotCQkJdGhpcy5oaXJlRGF0ZSA9IGhpcmVEYXRlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhJUkVfREFURV9QUk9QRVJUWSwgb2xkLCBoaXJlRGF0ZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwZDcxYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQlwcml2YXRlIExvY2FsQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIgYWExOwotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50MTsKLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0JcHJpdmF0ZSBTdHJpbmcgZXZlbnQxVHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRSA9ICJjaGFuZ2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUiA9ICJjbGVhciI7Ci0KLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JcHVibGljIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWVzKHRoaXMuc3ViamVjdDFOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbnModGhpcy5zdWJqZWN0MURlc2NyaXB0aW9ucygpKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KHRoaXMuc3ViamVjdDEpOwotCQl0aGlzLmFhMSA9IHRoaXMuYnVpbGRBc3BlY3RBZGFwdGVyKHRoaXMuc3ViamVjdEhvbGRlcjEpOwotCQl0aGlzLmxpc3RlbmVyMSA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmFhMS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5ldmVudDFUeXBlID0gbnVsbDsKLQotCQl0aGlzLnN1YmplY3QyID0gbmV3IFRlc3RTdWJqZWN0KCk7Ci0JCXRoaXMuc3ViamVjdDIuYWRkTmFtZXModGhpcy5zdWJqZWN0Mk5hbWVzKCkpOwotCQl0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9ucyh0aGlzLnN1YmplY3QyRGVzY3JpcHRpb25zKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN1YmplY3QxTmFtZXMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdWJqZWN0MURlc2NyaXB0aW9ucygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MSBkZXNjcmlwdGlvbjEiKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MSBkZXNjcmlwdGlvbjIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdWJqZWN0Mk5hbWVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJiYXoiKTsKLQkJcmVzdWx0LmFkZCgiYmFtIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3ViamVjdDJEZXNjcmlwdGlvbnMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDIgZGVzY3JpcHRpb24xIik7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDIgZGVzY3JpcHRpb24yIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyIGJ1aWxkQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKHN1YmplY3RIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUsIEFERCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlLCBSRU1PVkUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlLCBDTEVBUik7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUsIENIQU5HRSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlLCBTdHJpbmcgZXZlbnRUeXBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQkJdGhpcy5ldmVudDFUeXBlID0gZXZlbnRUeXBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIENIQU5HRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ldmVudDEuaXRlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0Mk5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQ0hBTkdFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV2ZW50MS5pdGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKCh0aGlzLmFhMS5pdGVyYXRvcigpKS5oYXNOZXh0KCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDEpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQ0hBTkdFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV2ZW50MS5pdGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lKCJqYW0iKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYW0iLCB0aGlzLmV2ZW50MS5pdGVtcygpLm5leHQoKSk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBuYW1lc1BsdXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzLmFkZCgiamFtIik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5ldmVudDFUeXBlID0gbnVsbDsKLQkJdGhpcy5hYTEuYWRkQWxsKENvbGxlY3Rpb25zLnNpbmdsZXRvbigiamF6IikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpheiIsIHRoaXMuZXZlbnQxLml0ZW1zKCkubmV4dCgpKTsKLQkJbmFtZXNQbHVzLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEucmVtb3ZlTmFtZSgiZm9vIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBSRU1PVkUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXNNaW51cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc01pbnVzLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IG51bGw7Ci0JCXRoaXMuYWExLnJlbW92ZUFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oImJhciIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIFJFTU9WRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmV2ZW50MS5pdGVtcygpLm5leHQoKSk7Ci0JCW5hbWVzTWludXMucmVtb3ZlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzTWludXMsIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLmFkZFR3b05hbWVzKCJqYW0iLCAiamF6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBDSEFOR0UpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXZlbnQxLml0ZW1zKCkuaGFzTmV4dCgpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzUGx1czIgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzMi5hZGQoImphbSIpOwotCQluYW1lc1BsdXMyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMyLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLnN1YmplY3QxLm5hbWVzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zdWJqZWN0MS5uYW1lcygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pKTsKLQkJdGhpcy5hYTEucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQl0aGlzLmFhMS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCQotCXByaXZhdGUgY2xhc3MgVGVzdFN1YmplY3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTX0NPTExFQ1RJT04gPSAibmFtZXMiOwotCQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBkZXNjcmlwdGlvbnM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OU19DT0xMRUNUSU9OID0gImRlc2NyaXB0aW9ucyI7Ci0JCi0JCXB1YmxpYyBUZXN0U3ViamVjdCgpIHsKLQkJCXRoaXMubmFtZXMgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCQl0aGlzLmRlc2NyaXB0aW9ucyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBuYW1lcygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxTdHJpbmc+KHRoaXMubmFtZXMpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCWlmICh0aGlzLm5hbWVzLmFkZChuYW1lKSkgewotCQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChOQU1FU19DT0xMRUNUSU9OLCBuYW1lKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lcyhJdGVyYXRvcjxTdHJpbmc+IG5ld05hbWVzKSB7Ci0JCQl3aGlsZSAobmV3TmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5hZGROYW1lKG5ld05hbWVzLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IG5ld05hbWVzKSB7Ci0JCQl0aGlzLmFkZE5hbWVzKG5ld05hbWVzLml0ZXJhdG9yKCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFR3b05hbWVzKFN0cmluZyBuYW1lMSwgU3RyaW5nIG5hbWUyKSB7Ci0JCQlpZiAodGhpcy5uYW1lcy5hZGQobmFtZTEpIHwgdGhpcy5uYW1lcy5hZGQobmFtZTIpKSB7Ci0JCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoTkFNRVNfQ09MTEVDVElPTik7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTmFtZShTdHJpbmcgbmFtZSkgewotCQkJaWYgKHRoaXMubmFtZXMucmVtb3ZlKG5hbWUpKSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoTkFNRVNfQ09MTEVDVElPTiwgbmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZGVzY3JpcHRpb25zKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPFN0cmluZz4odGhpcy5kZXNjcmlwdGlvbnMpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJaWYgKHRoaXMuZGVzY3JpcHRpb25zLmFkZChkZXNjcmlwdGlvbikpIHsKLQkJCQl0aGlzLmZpcmVJdGVtQWRkZWQoREVTQ1JJUFRJT05TX0NPTExFQ1RJT04sIGRlc2NyaXB0aW9uKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbnMoSXRlcmF0b3I8U3RyaW5nPiBuZXdEZXNjcmlwdGlvbnMpIHsKLQkJCXdoaWxlIChuZXdEZXNjcmlwdGlvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5hZGREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbnMubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbnMoQ29sbGVjdGlvbjxTdHJpbmc+IG5ld0Rlc2NyaXB0aW9ucykgewotCQkJdGhpcy5hZGREZXNjcmlwdGlvbnMobmV3RGVzY3JpcHRpb25zLml0ZXJhdG9yKCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZURlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJaWYgKHRoaXMuZGVzY3JpcHRpb25zLnJlbW92ZShkZXNjcmlwdGlvbikpIHsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChERVNDUklQVElPTlNfQ09MTEVDVElPTiwgZGVzY3JpcHRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gdGhpcyBpcyBub3QgYSB0eXBpY2FsIGFzcGVjdCBhZGFwdGVyIC0gdGhlIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIGFzcGVjdCBuYW1lCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyIGV4dGVuZHMgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4gewotCi0JCUxvY2FsQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcl8oKSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZXMoKTsKLQkJCX0KLQkJCWlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfQ09MTEVDVElPTikgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZGVzY3JpcHRpb25zKCk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKFN0cmluZyBpdGVtKSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikgewotCQkJCXRoaXMuc3ViamVjdC5hZGROYW1lKGl0ZW0pOwotCQkJfSBlbHNlIGlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfQ09MTEVDVElPTikgewotCQkJCXRoaXMuc3ViamVjdC5hZGREZXNjcmlwdGlvbihpdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEFsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgaXRlbSkgewotCQkJaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pIHsKLQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlTmFtZSgoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0NPTExFQ1RJT04pIHsKLQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlRGVzY3JpcHRpb24oKFN0cmluZykgaXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gaXRlbXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5yZW1vdmUoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzRlMjMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb25Ib2xkZXI7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb247Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb24gPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZSgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEhhc2hCYWc8U3RyaW5nPigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IHRoaXMuYWRhcHRlckNvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNoKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihzeW5jaExpc3QpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnNldENvbGxlY3Rpb24obmV3IEhhc2hCYWc8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJSGFzaEJhZzxTdHJpbmc+IGJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJYmFnLmFkZCgiZm9vIik7Ci0JCWJhZy5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnNldENvbGxlY3Rpb24oYmFnKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5VG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCUhhc2hCYWc8U3RyaW5nPiBiYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuc2V0Q29sbGVjdGlvbihiYWcpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCi0JY2xhc3MgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmNDYyNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBhZGFwdGVyOwotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbkhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0JcHVibGljIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBMb2NhbEFkYXB0ZXIodGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlciwgIjY2NiIpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjExMSIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiMjIyIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCI2NjYiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiNjY2Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5jbGVhcigpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMuYWRhcHRlci5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMuYWRhcHRlci5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFdmVudEZpcmluZygpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiMTExIik7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjIyMiIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCI2NjYiKTsKLQkJdGhpcy52ZXJpZnlFdmVudChmYWxzZSwgdHJ1ZSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoIjY2NiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRydWUsIGZhbHNlKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoZmFsc2UsIHRydWUpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuY2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0cnVlLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWRhcHRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCB0aGlzLmV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi52YWx1ZU9mKG5ld1ZhbHVlKSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWUoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCI2NjYiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9OwotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCi0JLyoqCi0JICogdGhlIHZhbHVlIGlzIHRydWUgaWYgdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBjb250YWlucyB0aGUgc3BlY2lmaWVkIGl0ZW0sCi0JICogb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyBmYWxzZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsQWRhcHRlcgotCQlleHRlbmRzIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+Ci0JCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4KLQl7Ci0JCXByaXZhdGUgU3RyaW5nIGl0ZW07Ci0KLQkJTG9jYWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nIGl0ZW0pIHsKLQkJCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQkJdGhpcy5pdGVtID0gaXRlbTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQkvKioKLQkJICogYWx3YXlzIHJldHVybiBhIEJvb2xlYW4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQm9vbGVhbiBnZXRWYWx1ZSgpIHsKLQkJCUJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuZ2V0VmFsdWUoKTsKLQkJCXJldHVybiAocmVzdWx0ID09IG51bGwpID8gQm9vbGVhbi5GQUxTRSA6IHJlc3VsdDsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJaWYgKHRoaXMuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlpZiAoICEgdGhpcy5ib29sZWFuVmFsdWVPZih2YWx1ZSkpIHsKLQkJCQkJLy8gdGhlIHZhbHVlIGlzIGNoYW5naW5nIGZyb20gdHJ1ZSB0byBmYWxzZQotCQkJCQkoKFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4pIHRoaXMuY29sbGVjdGlvbkhvbGRlcikucmVtb3ZlKHRoaXMuaXRlbSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAodGhpcy5ib29sZWFuVmFsdWVPZih2YWx1ZSkpIHsKLQkJCQkJLy8gdGhlIHZhbHVlIGlzIGNoYW5naW5nIGZyb20gZmFsc2UgdG8gdHJ1ZQotCQkJCQkoKFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4pIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuYWRkKHRoaXMuaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCksIHRoaXMuaXRlbSkpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQkJcHJpdmF0ZSBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLmJvb2xlYW5WYWx1ZU9mKHRoaXMudmFsdWUpOwotCQl9Ci0JCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWVPZihPYmplY3QgYikgewotCQkJcmV0dXJuIChiID09IG51bGwpID8gZmFsc2UgOiAoKEJvb2xlYW4pIGIpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjRiNmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBOZWlnaGJvcmhvb2QgbmVpZ2hib3Job29kOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TmVpZ2hib3Job29kPiBuZWlnaGJvcmhvb2RIb2xkZXI7Ci0KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm5laWdoYm9yaG9vZCA9IG5ldyBOZWlnaGJvcmhvb2QoIkhhbm5hLUJhcmJlcmEiKTsKLQkJdGhpcy5uZWlnaGJvcmhvb2RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE5laWdoYm9yaG9vZD4odGhpcy5uZWlnaGJvcmhvb2QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2gxKCkgewotCQl0aGlzLnZlcmlmeVN5bmNoKHRoaXMuYnVpbGRBbGxNZW1iZXJzQ29tcG9zaXRlKHRoaXMubmVpZ2hib3Job29kSG9sZGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNoMigpIHsKLQkJdGhpcy52ZXJpZnlTeW5jaCh0aGlzLmJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZTIodGhpcy5uZWlnaGJvcmhvb2RIb2xkZXIpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3luY2goQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiBjb21wb3NpdGVDVk0pIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0JCUJhZzxGYW1pbHk+IGZhbWlsaWVzU3luY2ggPSBuZXcgQ29vcmRpbmF0ZWRCYWc8RmFtaWx5Pih0aGlzLmJ1aWxkRmFtaWxpZXNBc3BlY3RBZGFwdGVyKHRoaXMubmVpZ2hib3Job29kSG9sZGVyKSk7Ci0JCUJhZzxNZW1iZXI+IG1lbWJlcnNTeW5jaCA9IG5ldyBDb29yZGluYXRlZEJhZzxNZW1iZXI+KGNvbXBvc2l0ZUNWTSk7Ci0JCXRoaXMucG9wdWxhdGVOZWlnaGJvcmhvb2QodGhpcy5uZWlnaGJvcmhvb2QpOwotCi0JCUZhbWlseSBqZXRzb25zID0gdGhpcy5uZWlnaGJvcmhvb2QuZmFtaWx5TmFtZWQoIkpldHNvbiIpOwotCi0JCWFzc2VydEVxdWFscygzLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMiwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscygxMiwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQlqZXRzb25zLnJlbW92ZU1lbWJlcihqZXRzb25zLm1lbWJlck5hbWVkKCJBc3RybyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCWpldHNvbnMucmVtb3ZlTWVtYmVyKGpldHNvbnMubWVtYmVyTmFtZWQoIkp1ZHkiKSk7Ci0JCWFzc2VydEVxdWFscygzLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQlqZXRzb25zLmFkZE1lbWJlcigiRmlkbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTEsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTEsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5uZWlnaGJvcmhvb2QucmVtb3ZlRmFtaWx5KGpldHNvbnMpOwotCQlhc3NlcnRFcXVhbHMoMiwgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCUZhbWlseSBiZWFycyA9IHRoaXMubmVpZ2hib3Job29kLmFkZEZhbWlseSgiQmVhciIpOwotCQkJYmVhcnMuYWRkTWVtYmVyKCJZb2dpIik7Ci0JCWFzc2VydEVxdWFscygzLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg4LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDgsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJYmVhcnMuYWRkTWVtYmVyKCJCb28tQm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg5LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDksIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJTmVpZ2hib3Job29kIG4yID0gbmV3IE5laWdoYm9yaG9vZCgiSGFubmEtQmFyYmVyYSAyIik7Ci0JCXRoaXMubmVpZ2hib3Job29kSG9sZGVyLnNldFZhbHVlKG4yKTsKLQkJdGhpcy5wb3B1bGF0ZU5laWdoYm9yaG9vZChuMik7Ci0JCWFzc2VydEVxdWFscygzLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMiwgQ29sbGVjdGlvblRvb2xzLnNpemUobjIuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscygxMiwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKG4yLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9UcmFuc2Zvcm1lcigpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBzdWJDVk0xID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBzdWJDVk0yID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJQ29sbGVjdGlvbjxDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+PiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQljb2xsZWN0aW9uLmFkZChzdWJDVk0xKTsKLQkJY29sbGVjdGlvbi5hZGQoc3ViQ1ZNMik7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQmFnID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4obmV3IENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oY29sbGVjdGlvbikpOwotCi0JCWFzc2VydEVxdWFscygwLCBzeW5jaEJhZy5zaXplKCkpOwotCi0JCXN1YkNWTTEuYWRkKCJmb28iKTsKLQkJc3ViQ1ZNMS5hZGQoImJhciIpOwotCQlzdWJDVk0xLmFkZCgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygzLCBzeW5jaEJhZy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHN5bmNoQmFnLmNvbnRhaW5zKCJmb28iKSk7Ci0KLQkJc3ViQ1ZNMi5hZGQoImpvbyIpOwotCQlzdWJDVk0yLmFkZCgiamFyIik7Ci0JCXN1YkNWTTIuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoQmFnLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc3luY2hCYWcuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShzeW5jaEJhZy5jb250YWlucygiamF6IikpOwotCi0JCXN1YkNWTTEucmVtb3ZlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHN5bmNoQmFnLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKHN5bmNoQmFnLmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUl0ZW0oKSB7Ci0JCUJhZzxNZW1iZXI+IHN5bmNoQmFnID0gbmV3IENvb3JkaW5hdGVkQmFnPE1lbWJlcj4odGhpcy5idWlsZEFsbE1lbWJlcnNDb21wb3NpdGUodGhpcy5uZWlnaGJvcmhvb2RIb2xkZXIpKTsKLQkJdGhpcy5wb3B1bGF0ZU5laWdoYm9yaG9vZCh0aGlzLm5laWdoYm9yaG9vZCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMubmVpZ2hib3Job29kLmFkZEZhbWlseSh0aGlzLm5laWdoYm9yaG9vZC5mYW1pbHlOYW1lZCgiSmV0c29uIikpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuaW5kZXhPZigiZHVwbGljYXRlIGNvbXBvbmVudCIpICE9IC0xKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQlhc3NlcnRFcXVhbHMoMTIsIHN5bmNoQmFnLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8RmFtaWx5LCBNZW1iZXI+IGNvbXBvc2l0ZUNWTSA9IHRoaXMuYnVpbGRBbGxNZW1iZXJzQ29tcG9zaXRlKHRoaXMubmVpZ2hib3Job29kSG9sZGVyKTsKLQkJQ29vcmRpbmF0ZWRCYWc8TWVtYmVyPiBzeW5jaEJhZyA9IG5ldyBDb29yZGluYXRlZEJhZzxNZW1iZXI+KGNvbXBvc2l0ZUNWTSk7Ci0JCXRoaXMucG9wdWxhdGVOZWlnaGJvcmhvb2QodGhpcy5uZWlnaGJvcmhvb2QpOwotCQlGYW1pbHkgamV0c29ucyA9IHRoaXMubmVpZ2hib3Job29kLmZhbWlseU5hbWVkKCJKZXRzb24iKTsKLQotCQlhc3NlcnRUcnVlKGNvbXBvc2l0ZUNWTS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRUcnVlKGpldHNvbnMuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhGYW1pbHkuTUVNQkVSU19DT0xMRUNUSU9OKSk7Ci0KLQkJY29tcG9zaXRlQ1ZNLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHN5bmNoQmFnKTsKLQkJYXNzZXJ0RmFsc2UoY29tcG9zaXRlQ1ZNLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKGpldHNvbnMuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhGYW1pbHkuTUVNQkVSU19DT0xMRUNUSU9OKSk7Ci0KLQkJY29tcG9zaXRlQ1ZNLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHN5bmNoQmFnKTsKLQkJYXNzZXJ0VHJ1ZShjb21wb3NpdGVDVk0uaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShqZXRzb25zLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZU5laWdoYm9yaG9vZChOZWlnaGJvcmhvb2QgbikgewotCQlGYW1pbHkgZmFtaWx5MSA9IG4uYWRkRmFtaWx5KCJGbGludHN0b25lIik7Ci0JCQlmYW1pbHkxLmFkZE1lbWJlcigiRnJlZCIpOwotCQkJZmFtaWx5MS5hZGRNZW1iZXIoIldpbG1hIik7Ci0JCQlmYW1pbHkxLmFkZE1lbWJlcigiUGViYmxlcyIpOwotCQkJZmFtaWx5MS5hZGRNZW1iZXIoIkRpbm8iKTsKLQkJRmFtaWx5IGZhbWlseTIgPSBuLmFkZEZhbWlseSgiUnViYmxlIik7Ci0JCQlmYW1pbHkyLmFkZE1lbWJlcigiQmFybmV5Iik7Ci0JCQlmYW1pbHkyLmFkZE1lbWJlcigiQmV0dHkiKTsKLQkJCWZhbWlseTIuYWRkTWVtYmVyKCJCYW1tLUJhbW0iKTsKLQkJRmFtaWx5IGZhbWlseTMgPSBuLmFkZEZhbWlseSgiSmV0c29uIik7Ci0JCQlmYW1pbHkzLmFkZE1lbWJlcigiR2VvcmdlIik7Ci0JCQlmYW1pbHkzLmFkZE1lbWJlcigiSmFuZSIpOwotCQkJZmFtaWx5My5hZGRNZW1iZXIoIkp1ZHkiKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJFbHJveSIpOwotCQkJZmFtaWx5My5hZGRNZW1iZXIoIkFzdHJvIik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHk+IGJ1aWxkRmFtaWxpZXNBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+IGNvbW11bmVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxOZWlnaGJvcmhvb2QsIEZhbWlseT4oY29tbXVuZUhvbGRlciwgTmVpZ2hib3Job29kLkZBTUlMSUVTX0NPTExFQ1RJT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPEZhbWlseT4gaXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZmFtaWxpZXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxNZW1iZXI+IGJ1aWxkTWVtYmVyc0FkYXB0ZXIoRmFtaWx5IGZhbWlseSkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPEZhbWlseSwgTWVtYmVyPihGYW1pbHkuTUVNQkVSU19DT0xMRUNUSU9OLCBmYW1pbHkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPE1lbWJlcj4gaXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubWVtYmVycygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8RmFtaWx5LCBNZW1iZXI+IGJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8TmVpZ2hib3Job29kPiBjb21tdW5lSG9sZGVyKSB7Ci0JCS8vIG92ZXJyaWRlICN0cmFuc2Zvcm0oT2JqZWN0KQotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEZhbWlseSwgTWVtYmVyPih0aGlzLmJ1aWxkRmFtaWxpZXNBc3BlY3RBZGFwdGVyKGNvbW11bmVIb2xkZXIpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxNZW1iZXI+IHRyYW5zZm9ybShGYW1pbHkgZmFtaWx5KSB7Ci0JCQkJcmV0dXJuIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5idWlsZE1lbWJlcnNBZGFwdGVyKGZhbWlseSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxNZW1iZXI+IGJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZTIoUHJvcGVydHlWYWx1ZU1vZGVsPE5laWdoYm9yaG9vZD4gY29tbXVuZUhvbGRlcikgewotCQkvLyBidWlsZCBhIGN1c3RvbSBUcmFuc2Zvcm1lcgotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEZhbWlseSwgTWVtYmVyPih0aGlzLmJ1aWxkRmFtaWxpZXNBc3BlY3RBZGFwdGVyKGNvbW11bmVIb2xkZXIpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxGYW1pbHksIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8RmFtaWx5LCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxNZW1iZXI+PigpIHsKLQkJCXB1YmxpYyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxNZW1iZXI+IHRyYW5zZm9ybShGYW1pbHkgZmFtaWx5KSB7Ci0JCQkJcmV0dXJuIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5idWlsZE1lbWJlcnNBZGFwdGVyKGZhbWlseSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJMb2NhbCBUcmFuc2Zvcm1lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBpbm5lciBjbGFzcwotCSAqLwotCXByaXZhdGUgY2xhc3MgTmVpZ2hib3Job29kIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIENvbGxlY3Rpb248RmFtaWx5PiBmYW1pbGllcyA9IG5ldyBBcnJheUxpc3Q8RmFtaWx5PigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFNSUxJRVNfQ09MTEVDVElPTiA9ICJmYW1pbGllcyI7Ci0JCi0JCXB1YmxpYyBOZWlnaGJvcmhvb2QoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIEl0ZXJhdG9yPEZhbWlseT4gZmFtaWxpZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mYW1pbGllcy5pdGVyYXRvcigpOwotCQl9Ci0JCi0JCXB1YmxpYyBGYW1pbHkgYWRkRmFtaWx5KFN0cmluZyBmYW1pbHlOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRGYW1pbHkobmV3IEZhbWlseShmYW1pbHlOYW1lKSk7Ci0JCX0KLQotCQkvLyBiYWNrZG9vciB0byBhbGxvdyBkdXBsaWNhdGVzCi0JCXB1YmxpYyBGYW1pbHkgYWRkRmFtaWx5KEZhbWlseSBmYW1pbHkpIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihmYW1pbHksIHRoaXMuZmFtaWxpZXMsIEZBTUlMSUVTX0NPTExFQ1RJT04pOwotCQkJcmV0dXJuIGZhbWlseTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUZhbWlseShGYW1pbHkgZmFtaWx5KSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihmYW1pbHksIHRoaXMuZmFtaWxpZXMsIEZBTUlMSUVTX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCXB1YmxpYyBGYW1pbHkgZmFtaWx5TmFtZWQoU3RyaW5nIGZhbWlseU5hbWUpIHsKLQkJCWZvciAoRmFtaWx5IGZhbWlseSA6IHRoaXMuZmFtaWxpZXMpIHsKLQkJCQlpZiAoZmFtaWx5LmdldE5hbWUoKS5lcXVhbHMoZmFtaWx5TmFtZSkpIHsKLQkJCQkJcmV0dXJuIGZhbWlseTsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZhbWlseU5hbWUpOwotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxNZW1iZXI+IGFsbE1lbWJlcnMoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPE1lbWJlcj4odGhpcy5tZW1iZXJzSXRlcmF0b3JzKCkpOwotCQl9Ci0JCi0JCXByaXZhdGUgSXRlcmF0b3I8SXRlcmF0b3I8TWVtYmVyPj4gbWVtYmVyc0l0ZXJhdG9ycygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGYW1pbHksIEl0ZXJhdG9yPE1lbWJlcj4+KHRoaXMuZmFtaWxpZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxNZW1iZXI+IHRyYW5zZm9ybShGYW1pbHkgZmFtaWx5KSB7Ci0JCQkJCXJldHVybiBmYW1pbHkubWVtYmVycygpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHVibGljIE1lbWJlciBtZW1iZXJOYW1lZChTdHJpbmcgZmFtaWx5TmFtZSwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmZhbWlseU5hbWVkKGZhbWlseU5hbWUpLm1lbWJlck5hbWVkKG1lbWJlck5hbWUpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBpbm5lciBjbGFzcwotCSAqLwotCXByaXZhdGUgY2xhc3MgRmFtaWx5IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIENvbGxlY3Rpb248TWVtYmVyPiBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXI+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1CRVJTX0NPTExFQ1RJT04gPSAibWVtYmVycyI7Ci0JCi0JCXB1YmxpYyBGYW1pbHkoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIEl0ZXJhdG9yPE1lbWJlcj4gbWVtYmVycygpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlcnMuaXRlcmF0b3IoKTsKLQkJfQotCQotCQlwdWJsaWMgTWVtYmVyIGFkZE1lbWJlcihTdHJpbmcgbWVtYmVyTmFtZSkgewotCQkJTWVtYmVyIG1lbWJlciA9IG5ldyBNZW1iZXIobWVtYmVyTmFtZSk7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24obWVtYmVyLCB0aGlzLm1lbWJlcnMsIE1FTUJFUlNfQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gbWVtYmVyOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVNZW1iZXIoTWVtYmVyIG1lbWJlcikgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24obWVtYmVyLCB0aGlzLm1lbWJlcnMsIE1FTUJFUlNfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJcHVibGljIE1lbWJlciBtZW1iZXJOYW1lZChTdHJpbmcgbWVtYmVyTmFtZSkgewotCQkJZm9yIChNZW1iZXIgbWVtYmVyIDogdGhpcy5tZW1iZXJzKSB7Ci0JCQkJaWYgKG1lbWJlci5nZXROYW1lKCkuZXF1YWxzKG1lbWJlck5hbWUpKSB7Ci0JCQkJCXJldHVybiBtZW1iZXI7Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZW1iZXJOYW1lKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCX0KLQkKLQl9Ci0KLQotCS8qKgotCSAqIGlubmVyIGNsYXNzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBNZW1iZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHVibGljIE1lbWJlcihTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmMDdkYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTA7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTE7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTI7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTM7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiB1YmVyTFZNOwotCXByaXZhdGUgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8U2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPiBjb21wb3NpdGVMVk07Ci0KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXRoaXMubHZtMCA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMubHZtMC5hZGQoImFhYSIpOwotCQl0aGlzLmx2bTAuYWRkKCJiYmIiKTsKLQkJdGhpcy5sdm0wLmFkZCgiY2NjIik7Ci0KLQkJdGhpcy5sdm0xID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5sdm0xLmFkZCgiZGRkIik7Ci0JCXRoaXMubHZtMS5hZGQoImVlZSIpOwotCi0JCXRoaXMubHZtMiA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMubHZtMi5hZGQoImZmZiIpOwotCi0JCXRoaXMubHZtMyA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMubHZtMy5hZGQoImdnZyIpOwotCQl0aGlzLmx2bTMuYWRkKCJoaGgiKTsKLQkJdGhpcy5sdm0zLmFkZCgiaWlpIik7Ci0JCXRoaXMubHZtMy5hZGQoImpqaiIpOwotCQl0aGlzLmx2bTMuYWRkKCJra2siKTsKLQotCQl0aGlzLnViZXJMVk0gPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJdGhpcy51YmVyTFZNLmFkZCh0aGlzLmx2bTApOwotCQl0aGlzLnViZXJMVk0uYWRkKHRoaXMubHZtMSk7Ci0JCXRoaXMudWJlckxWTS5hZGQodGhpcy5sdm0yKTsKLQkJdGhpcy51YmVyTFZNLmFkZCh0aGlzLmx2bTMpOwotCi0JCXRoaXMuY29tcG9zaXRlTFZNID0gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oKExpc3RWYWx1ZU1vZGVsPFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KSB0aGlzLnViZXJMVk0pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgY29vcmRMaXN0LmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiYmJiIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYmIiLCBjb29yZExpc3QuZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjY2MiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMikpOwotCQlhc3NlcnRFcXVhbHMoImNjYyIsIGNvb3JkTGlzdC5nZXQoMikpOwotCi0JCWFzc2VydEVxdWFscygiZGRkIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCBjb29yZExpc3QuZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZWUiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNCkpOwotCQlhc3NlcnRFcXVhbHMoImVlZSIsIGNvb3JkTGlzdC5nZXQoNCkpOwotCi0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIHRoaXMuY29tcG9zaXRlTFZNLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCBjb29yZExpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTEgPSBjb29yZExpc3QuaXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSB0aGlzLmNvbXBvc2l0ZUxWTS5pdGVyYXRvcigpOyBzdHJlYW0yLmhhc05leHQoKTsgKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyZWFtMS5uZXh0KCksIHN0cmVhbTIubmV4dCgpKTsKLQkJfQotCQlhc3NlcnRGYWxzZShzdHJlYW0xLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBjb29yZExpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuY29tcG9zaXRlTFZNLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmx2bTAuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuY29tcG9zaXRlTFZNLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgY29vcmRMaXN0KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb21wb3NpdGVMVk0uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmx2bTAuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgY29vcmRMaXN0KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbXBvc2l0ZUxWTS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5sdm0wLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtLmFkZCgieHh4Iik7Ci0JCWx2bS5hZGQoInl5eSIpOwotCQlsdm0uYWRkKCJ6enoiKTsKLQkJdGhpcy51YmVyTFZNLmFkZCgwLCBsdm0pOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJ5eXkiLCAienp6IiwgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTb3VyY2VfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtLmFkZCgieHh4Iik7Ci0JCWx2bS5hZGQoInl5eSIpOwotCQlsdm0uYWRkKCJ6enoiKTsKLQkJdGhpcy51YmVyTFZNLmFkZCgyLCBsdm0pOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAieHh4IiwgInl5eSIsICJ6enoiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTb3VyY2VfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtLmFkZCgieHh4Iik7Ci0JCWx2bS5hZGQoInl5eSIpOwotCQlsdm0uYWRkKCJ6enoiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm0pOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAieHh4IiwgInl5eSIsICJ6enoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTb3VyY2VzKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtQSA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bUEuYWRkKCJ4eHgiKTsKLQkJbHZtQS5hZGQoInl5eSIpOwotCQlsdm1BLmFkZCgienp6Iik7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtQiA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bUIuYWRkKCJwcHAiKTsKLQkJbHZtQi5hZGQoInFxcSIpOwotCQlsdm1CLmFkZCgicnJyIik7Ci0JCUNvbGxlY3Rpb248U2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gYyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJYy5hZGQobHZtQSk7Ci0JCWMuYWRkKGx2bUIpOwotCQl0aGlzLnViZXJMVk0uYWRkQWxsKDIsIGMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAieHh4IiwgInl5eSIsICJ6enoiLCAicHBwIiwgInFxcSIsICJycnIiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMTIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNvdXJjZV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDApOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTb3VyY2VfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5yZW1vdmUoMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU291cmNlX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDIsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZWUiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNCkpOwotCQlhc3NlcnRFcXVhbHMoImVlZSIsIGNvb3JkTGlzdC5nZXQoNCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bUEgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm1BLmFkZCgieHh4Iik7Ci0JCWx2bUEuYWRkKCJ5eXkiKTsKLQkJbHZtQS5hZGQoInp6eiIpOwotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bUIgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm1CLmFkZCgicHBwIik7Ci0JCWx2bUIuYWRkKCJxcXEiKTsKLQkJbHZtQi5hZGQoInJyciIpOwotCQlMaXN0PFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGx2bUEpOwotCQlsaXN0LmFkZChsdm1CKTsKLQkJdGhpcy51YmVyTFZNLnNldCgyLCBsaXN0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJ5eXkiLCAienp6IiwgInBwcCIsICJxcXEiLCAicnJyIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygicXFxIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxcXEiLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNvdXJjZXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLm1vdmUoMCwgMiwgMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgxKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTb3VyY2VzX01pZGRsZSgpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNCk7Ci0KLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNS5hZGQoIm5ubiIpOwotCQlsdm01LmFkZCgib29vIik7Ci0JCWx2bTUuYWRkKCJwcHAiKTsKLQkJbHZtNS5hZGQoInFxcSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTUpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLm1vdmUoMSwgMywgMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJsbGwiLCAibW1tIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgIm5ubiIsICJvb28iLCAicHBwIiwgInFxcSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTb3VyY2VzX0VuZCgpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNCk7Ci0KLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNS5hZGQoIm5ubiIpOwotCQlsdm01LmFkZCgib29vIik7Ci0JCWx2bTUuYWRkKCJwcHAiKTsKLQkJbHZtNS5hZGQoInFxcSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTUpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLm1vdmUoMywgMCwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJsbGwiLCAibW1tIiwgIm5ubiIsICJvb28iLCAicHBwIiwgInFxcSIsICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTb3VyY2UoKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTQpOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNSA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5tb3ZlKDMsIDEpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgImRkZCIsICJlZWUiLCAibGxsIiwgIm1tbSIsICJubm4iLCAib29vIiwgInBwcCIsICJxcXEiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMTQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCBjb29yZExpc3QuZ2V0KDE0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0uY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbMF07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU291cmNlcygpIHsKLQkJTGlzdDxTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTQgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm00LmFkZCgibGxsIik7Ci0JCWx2bTQuYWRkKCJtbW0iKTsKLQkJbmV3TGlzdC5hZGQobHZtNCk7Ci0KLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNS5hZGQoIm5ubiIpOwotCQlsdm01LmFkZCgib29vIik7Ci0JCWx2bTUuYWRkKCJwcHAiKTsKLQkJbHZtNS5hZGQoInFxcSIpOwotCQluZXdMaXN0LmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5zZXRMaXN0KG5ld0xpc3QpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImxsbCIsICJtbW0iLCAibm5uIiwgIm9vbyIsICJwcHAiLCAicXFxIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygib29vIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuYWRkKDAsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJ4eHgiLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1fTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMi5hZGQoMSwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgInh4eCIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmFkZCg1LCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJ4eHgiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuYWRkQWxsKDAsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgInl5eSIsICJ6enoiLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIuYWRkQWxsKDEsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAieHh4IiwgInl5eSIsICJ6enoiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuYWRkQWxsKDUsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJ4eHgiLCAieXl5IiwgInp6eiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1fQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnJlbW92ZSgwKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIucmVtb3ZlKDApOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1fRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5yZW1vdmUoNCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnJlbW92ZSgwLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5yZW1vdmUoMSwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImtrayIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMucmVtb3ZlKDMsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1fQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnNldCgwLCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIuc2V0KDAsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1fRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXQoNCwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJ4eHgiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnNldCgwLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJ5eXkiLCAienp6IiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbXNfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXQoMSwgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAieHh4IiwgInl5eSIsICJ6enoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDEwKSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgY29vcmRMaXN0LmdldCgxMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbXNfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXQoMywgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgInh4eCIsICJ5eXkiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAubW92ZSgyLCAwKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJiYmIiLCAiY2NjIiwgImFhYSIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1fTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5tb3ZlKDAsIDEpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImVlZSIsICJkZGQiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLm1vdmUoMCwgNCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAia2trIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAubW92ZSgxLCAwLCAyKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJjY2MiLCAiYWFhIiwgImJiYiIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuYWRkKCJlZWUuMSIpOwotCQl0aGlzLmx2bTEuYWRkKCJlZWUuMiIpOwotCQl0aGlzLmx2bTEuYWRkKCJlZWUuMyIpOwotCQl0aGlzLmx2bTEubW92ZSgxLCAyLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlLjEiLCAiZWVlLjIiLCAiZWVlLjMiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMubW92ZSgwLCAyLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJpaWkiLCAiampqIiwgImtrayIsICJnZ2ciLCAiaGhoIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJJdGVtc19NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLmNsZWFyKCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNCkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5zZXRMaXN0KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgInl5eSIsICJ6enoiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuc2V0TGlzdChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgInh4eCIsICJ5eXkiLCAienp6IiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXRMaXN0KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAieHh4IiwgInl5eSIsICJ6enoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db29yZGluYXRlZEJhZy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db29yZGluYXRlZEJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmVlMzM3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IGtlZXBzIGFuIGludGVybmFsIGNvbGxlY3Rpb24gaW4gc3luY2ggd2l0aCB0aGUKLSAqIGNvbGxlY3Rpb24gaGVsZCBieSBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0gKi8KLWNsYXNzIENvb3JkaW5hdGVkQmFnPEU+IGltcGxlbWVudHMgQmFnPEU+LCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBCYWc8RT4gYmFnID0gbmV3IEhhc2hCYWc8RT4oKTsKLQotCUNvb3JkaW5hdGVkQmFnKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGN2bSkgewotCQljdm0uYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gdGhpcy5iYWcuYWRkKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5hZGRBbGwoYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmNvbnRhaW5zKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5iYWcuY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5iYWcucmVtb3ZlKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZUFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5yZXRhaW5BbGwoYyk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5iYWcuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5iYWcudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnRvQXJyYXkoYSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJhZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5jb3VudChvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvLCBpbnQgY291bnQpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmFkZChvLCBjb3VudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY291bnQpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZShvLCBjb3VudCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBlbnRyaWVzKCkgewotCQlyZXR1cm4gdGhpcy5iYWcuZW50cmllcygpOwotCX0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJZm9yIChAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgSXRlcmF0b3I8RT4gc3RyZWFtID0gKEl0ZXJhdG9yPEU+KSBlLml0ZW1zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5iYWcuYWRkKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCWZvciAoQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIEl0ZXJhdG9yPEU+IHN0cmVhbSA9IChJdGVyYXRvcjxFPikgZS5pdGVtcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuYmFnLnJlbW92ZShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmJhZywgKChDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPikgZS5nZXRTb3VyY2UoKSkuaXRlcmF0b3IoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5lcXVhbHMobyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkTGlzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db29yZGluYXRlZExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmN2I4OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IGtlZXBzIGFuIGludGVybmFsIGxpc3QgaW4gc3luY2ggd2l0aCB0aGUKLSAqIGxpc3QgaGVsZCBieSBhIGxpc3QgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb29yZGluYXRlZExpc3Q8RT4gaW1wbGVtZW50cyBMaXN0PEU+LCBMaXN0Q2hhbmdlTGlzdGVuZXIsIExpc3REYXRhTGlzdGVuZXIgewotCXByaXZhdGUgTGlzdDxFPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxFPigpOwotCi0JcHVibGljIENvb3JkaW5hdGVkTGlzdChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0VmFsdWVNb2RlbCkgewotCQlsaXN0VmFsdWVNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMpOwotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IGxpc3RWYWx1ZU1vZGVsLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29vcmRpbmF0ZWRMaXN0KExpc3RNb2RlbCBsaXN0TW9kZWwpIHsKLQkJbGlzdE1vZGVsLmFkZExpc3REYXRhTGlzdGVuZXIodGhpcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdE1vZGVsLmdldFNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmFkZChpLCB0aGlzLmdldEVsZW1lbnRBdChsaXN0TW9kZWwsIGkpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQl0aGlzLmxpc3QuYWRkKGluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuYWRkKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuYWRkQWxsKGMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5hZGRBbGwoaW5kZXgsIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmNvbnRhaW5zKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LmNvbnRhaW5zQWxsKGMpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmluZGV4T2Yobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxhc3RJbmRleE9mKG8pOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxpc3RJdGVyYXRvcihpbmRleCk7Ci0JfQotCi0JcHVibGljIEUgcmVtb3ZlKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QucmVtb3ZlKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5yZW1vdmVBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LnJldGFpbkFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgRSBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIExpc3Q8RT4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoYSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuaXRlbXMoZSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5saXN0LmFkZChpKyssIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuaXRlbXMoZSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCXRoaXMubGlzdC5yZW1vdmUoaSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuaXRlbXMoZSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5saXN0LnNldChpKyssIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmxpc3QsIGUuZ2V0VGFyZ2V0SW5kZXgoKSwgZS5nZXRTb3VyY2VJbmRleCgpLCBlLmdldE1vdmVMZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5saXN0LCB0aGlzLmdldFNvdXJjZShlKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdERhdGFMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjb250ZW50c0NoYW5nZWQoTGlzdERhdGFFdmVudCBlKSB7Ci0JCXRoaXMubGlzdC5jbGVhcigpOwotCQlMaXN0TW9kZWwgbG0gPSAoTGlzdE1vZGVsKSBlLmdldFNvdXJjZSgpOwotCQlpbnQgc2l6ZSA9IGxtLmdldFNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRoaXMubGlzdC5hZGQoaSwgdGhpcy5nZXRFbGVtZW50QXQobG0sIGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGludGVydmFsQWRkZWQoTGlzdERhdGFFdmVudCBlKSB7Ci0JCUxpc3RNb2RlbCBsbSA9IChMaXN0TW9kZWwpIGUuZ2V0U291cmNlKCk7Ci0JCWludCBzdGFydCA9IE1hdGgubWluKGUuZ2V0SW5kZXgwKCksIGUuZ2V0SW5kZXgxKCkpOwotCQlpbnQgZW5kID0gTWF0aC5tYXgoZS5nZXRJbmRleDAoKSwgZS5nZXRJbmRleDEoKSk7Ci0JCWZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykgewotCQkJdGhpcy5saXN0LmFkZChpLCB0aGlzLmdldEVsZW1lbnRBdChsbSwgaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW50ZXJ2YWxSZW1vdmVkKExpc3REYXRhRXZlbnQgZSkgewotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbihlLmdldEluZGV4MCgpLCBlLmdldEluZGV4MSgpKTsKLQkJaW50IGVuZCA9IE1hdGgubWF4KGUuZ2V0SW5kZXgwKCksIGUuZ2V0SW5kZXgxKCkpOwotCQlpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQgKyAxOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW5ndGg7IGkrKykgewotCQkJdGhpcy5saXN0LnJlbW92ZShzdGFydCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5lcXVhbHMobyk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5oYXNoQ29kZSgpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MuPQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRSBnZXRFbGVtZW50QXQoTGlzdE1vZGVsIGxpc3RNb2RlbCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoRSkgbGlzdE1vZGVsLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgdGhlIHNjb3BlIG9mIHRoZSBzdXBwcmVzc2VkIHdhcm5pbmdzLj0KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEl0ZXJhdG9yPEU+IGl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhdG9yPEU+KSBldmVudC5pdGVtcygpOwotCX0KLQotCS8qKgotCSAqIG1pbmltaXplIHRoZSBzY29wZSBvZiB0aGUgc3VwcHJlc3NlZCB3YXJuaW5ncy49Ci0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFPiBnZXRTb3VyY2UoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoTGlzdFZhbHVlTW9kZWw8RT4pIGV2ZW50LmdldFNvdXJjZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0V4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjYmE4OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0V4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGV4dGVuZGVkTGlzdEhvbGRlcjsKLQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0JU3RyaW5nIGV2ZW50VHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0UgPSAicmVwbGFjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkUgPSAibW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSID0gImNsZWFyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7Ci0KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkRXh0ZW5kZWRMaXN0SG9sZGVyKHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoIkEiKTsKLQkJcmVzdWx0LmFkZCgiQiIpOwotCQlyZXN1bHQuYWRkKCJDIik7Ci0JCXJlc3VsdC5hZGQoIkQiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZEV4dGVuZGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGV4dGVuZGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlleHRlbmRlZExpc3QuYWRkQWxsKHRoaXMuYnVpbGRQcmVmaXgoKSk7Ci0JCWV4dGVuZGVkTGlzdC5hZGRBbGwodGhpcy5idWlsZExpc3QoKSk7Ci0JCWV4dGVuZGVkTGlzdC5hZGRBbGwodGhpcy5idWlsZFN1ZmZpeCgpKTsKLQkJcmV0dXJuIGV4dGVuZGVkTGlzdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFByZWZpeCgpIHsKLQkJTGlzdDxTdHJpbmc+IHByZWZpeCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlwcmVmaXguYWRkKCJ4Iik7Ci0JCXByZWZpeC5hZGQoInkiKTsKLQkJcHJlZml4LmFkZCgieiIpOwotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3VmZml4KCkgewotCQlMaXN0PFN0cmluZz4gc3VmZml4ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN1ZmZpeC5hZGQoImkiKTsKLQkJc3VmZml4LmFkZCgiaiIpOwotCQlyZXR1cm4gc3VmZml4OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEV4dGVuZGVkTGlzdEhvbGRlcihMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSkgewotCQlyZXR1cm4gbmV3IEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByZWZpeCgpLCBsdm0sIHRoaXMuYnVpbGRTdWZmaXgoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkRXh0ZW5kZWRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkRXh0ZW5kZWRMaXN0KCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkRXh0ZW5kZWRMaXN0KCkuc2l6ZSgpLCB0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5zaXplKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleHRlbmRlZExpc3RDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleHRlbmRlZExpc3RDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkTGlzdENvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlMaXN0PFN0cmluZz4gZXh0ZW5kZWRMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5leHRlbmRlZExpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChleHRlbmRlZExpc3QuY29udGFpbnMoc3RyZWFtLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0vLwlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotLy8JCUxpc3Q8U3RyaW5nPiBleHRlbmRlZExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0vLwkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotLy8JCQlpZiAoZXh0ZW5kZWRMaXN0LmNvbnRhaW5zKHN0cmVhbS5uZXh0KCkpKSB7Ci0vLwkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9Ci0vLwotCXB1YmxpYyB2b2lkIHRlc3RBZGQxKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKCJFIikpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDQsICJFIik7Ci0JCWFzc2VydFRydWUodGhpcy5leHRlbmRlZExpc3RDb250YWlucygiRSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiRSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkMigpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leHRlbmRlZExpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoNCwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5leHRlbmRlZExpc3RDb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQWRkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGFkZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYWRkTGlzdC5hZGQoIkUiKTsKLQkJYWRkTGlzdC5hZGQoIkYiKTsKLQkJcmV0dXJuIGFkZExpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbDEoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnNBbnkodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDQsIHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnNBbGwodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlMSgpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKCJCIikpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKHRoaXMuYnVpbGRMaXN0KCkuaW5kZXhPZigiQiIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5leHRlbmRlZExpc3RDb250YWlucygiQiIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoIkIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VHZW5lcmljKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZU5hbWVkKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoNCwgIkUiKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQsIDcsICJFIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCg1LCBudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQsIDgsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoNSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVNT1ZFLCA4LCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgNywgIkUiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDAsIHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmV2ZW50Lml0ZW1zKCkpKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuc2V0KDAsICJBQSIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFUExBQ0UpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5ldmVudC5pdGVtcygpLCAiQSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5ldmVudC5pdGVtcygpLCAiQUEiKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IEFERDsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRVBMQUNFOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IE1PVkU7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENMRUFSOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIHR5cGUpIHsKLQkJYXNzZXJ0RXF1YWxzKHR5cGUsIHRoaXMuZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgdHlwZSwgaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQl0aGlzLnZlcmlmeUV2ZW50KHR5cGUpOwotCQlhc3NlcnRFcXVhbHMoaW5kZXgsIHRoaXMuZXZlbnQuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCB0aGlzLmV2ZW50Lml0ZW1zKCkubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQkvKgotCQkgKiBhZGRpbmcgbGlzdGVuZXJzIHRvIHRoZSBleHRlbmRlZCBsaXN0IHdpbGwgY2F1c2UgbGlzdGVuZXJzCi0JCSAqIHRvIGJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3Q7Ci0JCSAqIGxpa2V3aXNlLCByZW1vdmluZyBsaXN0ZW5lcnMgZnJvbSB0aGUgZXh0ZW5kZWQgbGlzdCB3aWxsCi0JCSAqIGNhdXNlIGxpc3RlbmVycyB0byBiZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdAotCQkgKi8KLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmNmU3OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlcjsKLQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgYWRkRXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUV2ZW50IHJlbW92ZUV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBjb2xsZWN0aW9uQ2xlYXJlZEV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBjb2xsZWN0aW9uQ2hhbmdlZEV2ZW50OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlcjsKLQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZmlsdGVyZWRBZGRFdmVudDsKLQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZmlsdGVyZWRSZW1vdmVFdmVudDsKLQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZmlsdGVyZWRDb2xsZWN0aW9uQ2xlYXJlZEV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBmaWx0ZXJlZENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0KLQlwdWJsaWMgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPihidWlsZENvbGxlY3Rpb24oKSk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyID0gbmV3IEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0aGlzLmJ1aWxkRmlsdGVyKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQlyZXR1cm4gY29sbGVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCgiYiIpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlclZhbHVlID0gdGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sbGVjdGlvbkhvbGRlclZhbHVlLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29sbGVjdGlvbkhvbGRlclZhbHVlLm5leHQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQkvLyBhZGQgYSBsaXN0ZW5lciB0byAiYWN0aXZhdGUiIHRoZSB3cmFwcGVyCi0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBuZXdDb2xsZWN0aW9uID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNldENvbGxlY3Rpb24obmV3Q29sbGVjdGlvbik7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBjb2xsZWN0aW9uVmFsdWVzID0gdGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm94IiwgY29sbGVjdGlvblZhbHVlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIGNvbGxlY3Rpb25WYWx1ZXMubmV4dCgpKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBmaWx0ZXJlZENvbGxlY3Rpb25WYWx1ZXMgPSB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIGZpbHRlcmVkQ29sbGVjdGlvblZhbHVlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShmaWx0ZXJlZENvbGxlY3Rpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQl9CQkKLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJFdmVudHMoKSB7Ci0JCXRoaXMuYWRkRXZlbnQgPSBudWxsOwotCQl0aGlzLnJlbW92ZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEFkZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VzKCkgewotCQljbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHRlbXBDb2xsZWN0aW9uID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5hZGRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZEFkZEV2ZW50LCB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCQkKLQkJY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCXRlbXBDb2xsZWN0aW9uLnJlbW92ZSgiYmFyIik7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5yZW1vdmVFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50KTsKLQotCi0JCWNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImJhciIpOwotCQl0ZW1wQ29sbGVjdGlvbi5hZGQoImJhciIpOwotCQl0ZW1wQ29sbGVjdGlvbi5yZW1vdmUoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMucmVtb3ZlRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRSZW1vdmVFdmVudCwgdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIsIHRlbXBDb2xsZWN0aW9uKTsKLQotCi0JCWNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0ZW1wQ29sbGVjdGlvbi5yZW1vdmUoImJhciIpOwotCQl0ZW1wQ29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYWRkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCQlhc3NlcnROdWxsKHRoaXMuZmlsdGVyZWRBZGRFdmVudCk7Ci0KLQotCQljbGVhckV2ZW50cygpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmV3Q29sbGVjdGlvbiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiZm94Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5zZXRDb2xsZWN0aW9uKG5ld0NvbGxlY3Rpb24pOwotCi0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIG5ldyBWZWN0b3I8U3RyaW5nPigpKTsKLQkJCi0JCXRlbXBDb2xsZWN0aW9uLnJlbW92ZSgiZm9vIik7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiYmF6Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQsIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLCBuZXcgVmVjdG9yPFN0cmluZz4oKSk7Ci0JCQotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5hZGRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMucmVtb3ZlRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZEZpbHRlcmVkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZEFkZEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBpdGVtcykgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaXRlbXMsIENvbGxlY3Rpb25Ub29scy52ZWN0b3IoZXZlbnQuaXRlbXMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaWx0ZXJlZEl0ZW0oKSB7Ci0JCS8vIGJ1aWxkIGNvbGxlY3Rpb24gd2l0aCBUZXN0SXRlbXMKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8VGVzdEl0ZW0+IHRpSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RJdGVtPih0aGlzLmJ1aWxkQ29sbGVjdGlvbjIoKSk7Ci0JCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RJdGVtPiBmaWx0ZXJlZFRJSG9sZGVyID0gbmV3IEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RJdGVtPih0aUhvbGRlciwgdGhpcy5idWlsZEZpbHRlcjIoKSk7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJZmlsdGVyZWRUSUhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgZmlsdGVyZWRUSUhvbGRlci5zaXplKCkpOwotCi0JCXRpSG9sZGVyLmFkZChuZXcgVGVzdEl0ZW0oImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZpbHRlcmVkVElIb2xkZXIuc2l6ZSgpKTsKLQotCQlUZXN0SXRlbSBiYXogPSBuZXcgVGVzdEl0ZW0oImJheiIpOwotCQl0aUhvbGRlci5hZGQoYmF6KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZpbHRlcmVkVElIb2xkZXIuc2l6ZSgpKTsKLQkJLy8gYmVmb3JlIHJlbW92aW5nIGl0LCBjaGFuZ2UgdGhlIGl0ZW0gc28gdGhhdCBpdCBpcyBmaWx0ZXJlZAotCQliYXoubmFtZSA9ICJqYXoiOwotCQl0aUhvbGRlci5yZW1vdmUoYmF6KTsKLQkJLy8gdGhpcyB3b3VsZCBmYWlsIGJlY2F1c2UgdGhlIGl0ZW0gd2FzIG5vdCByZW1vdmVkIGZyb20KLQkJLy8gdGhlIGZpbHRlcmVkIGNvbGxlY3Rpb24gY2FjaGUuLi4gYnV0IHdlJ3ZlIGZpeGVkIGl0IG5vdwotCQlhc3NlcnRFcXVhbHMoMSwgZmlsdGVyZWRUSUhvbGRlci5zaXplKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxUZXN0SXRlbT4gYnVpbGRDb2xsZWN0aW9uMigpIHsKLQkJQ29sbGVjdGlvbjxUZXN0SXRlbT4gY29sbGVjdGlvbiA9IG5ldyBWZWN0b3I8VGVzdEl0ZW0+KCk7Ci0JCWNvbGxlY3Rpb24uYWRkKG5ldyBUZXN0SXRlbSgiZm9vIikpOwotCQlyZXR1cm4gY29sbGVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxUZXN0SXRlbT4gYnVpbGRGaWx0ZXIyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxUZXN0SXRlbT4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoVGVzdEl0ZW0gdGkpIHsKLQkJCQlyZXR1cm4gdGkubmFtZS5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRlc3RJdGVtIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgVGVzdEl0ZW0gewotCQlTdHJpbmcgbmFtZTsKLQkJVGVzdEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOTEyZmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaWRpRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG9iamVjdEhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGZpbHRlcmVkT2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZmlsdGVyZWRFdmVudDsKLQotCXB1YmxpYyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiZm9vIik7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIgPSBuZXcgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm9iamVjdEhvbGRlciwgdGhpcy5idWlsZEZpbHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIEJpZGlGaWx0ZXI8U3RyaW5nPiBidWlsZEZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBCaWRpRmlsdGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gKHMgIT0gbnVsbCkgJiYgcy5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIChzICE9IG51bGwpICYmIHMuc3RhcnRzV2l0aCgiYiIpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiZm9vIiwgImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRFdmVudCwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlciwgbnVsbCwgImJhciIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJiYXIiLCAiYmF6Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZEV2ZW50LCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLCAiYmFyIiwgImJheiIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJiYXoiLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZEV2ZW50LCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLCAiYmF6IiwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb3AiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImZvbyIsICJmb3AiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkRXZlbnQpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImZvcCIsIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZmlsdGVyZWRFdmVudCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgbnVsbCwgImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRFdmVudCwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlciwgbnVsbCwgImJhciIpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0N2JiZWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsgZm9vOwotCXByaXZhdGUgSnVuayBiYXI7Ci0JcHJpdmF0ZSBKdW5rIGJhejsKLQlwcml2YXRlIEp1bmsgam9vOwotCXByaXZhdGUgSnVuayBqYXI7Ci0JcHJpdmF0ZSBKdW5rIGphejsKLQotCXByaXZhdGUgSnVuayB0b207Ci0JcHJpdmF0ZSBKdW5rIGRpY2s7Ci0JcHJpdmF0ZSBKdW5rIGhhcnJ5OwotCi0JcHVibGljIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5mb28gPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuYmFyID0gbmV3IEp1bmsoImJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJiYXoiKTsKLQkJdGhpcy5qb28gPSBuZXcgSnVuaygiam9vIik7Ci0JCXRoaXMuamFyID0gbmV3IEp1bmsoImphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJqYXoiKTsKLQotCQl0aGlzLnRvbSA9IG5ldyBKdW5rKCJ0b20iKTsKLQkJdGhpcy5kaWNrID0gbmV3IEp1bmsoImRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJoYXJyeSIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5nZXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlsaXN0VmFsdWVNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0VmFsdWVNb2RlbC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDApKTsKLQkJdGhpcy5iYXIucmVtb3ZlU3R1ZmYoImJhciIpOwotCQl0aGlzLmJhci5hZGRTdHVmZigienp6Iik7Ci0JCXRoaXMuYmFyLmFkZFN0dWZmKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoNSkpOwotCQl0aGlzLmJhci5yZW1vdmVTdHVmZigienp6Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEp1bms+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQmFnPEp1bms+IGJhZyA9IG5ldyBIYXNoQmFnPEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGJhZyk7Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PEp1bms+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxKdW5rPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPEp1bms+IGMpIHsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCWMuYWRkKHRoaXMuYmF6KTsKLQkJYy5hZGQodGhpcy5qb28pOwotCQljLmFkZCh0aGlzLmphcik7Ci0JCWMuYWRkKHRoaXMuamF6KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUgewotCQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdHVmZjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUZGX0NPTExFQ1RJT04gPSAic3R1ZmYiOwotCQkJCi0JCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgYWRkU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfQ09MTEVDVElPTik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRvU3RyaW5nKCk7Ci0JCX0KLQkKLQkJcHVibGljIEljb24gaWNvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhEaXNwbGF5YWJsZSBvKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9DT01QQVJBVE9SLmNvbXBhcmUodGhpcywgbyk7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMuc3R1ZmYgKyAiKSI7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzgxNjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsgZm9vOwotCXByaXZhdGUgSnVuayBiYXI7Ci0JcHJpdmF0ZSBKdW5rIGJhejsKLQlwcml2YXRlIEp1bmsgam9vOwotCXByaXZhdGUgSnVuayBqYXI7Ci0JcHJpdmF0ZSBKdW5rIGphejsKLQotCXByaXZhdGUgSnVuayB0b207Ci0JcHJpdmF0ZSBKdW5rIGRpY2s7Ci0JcHJpdmF0ZSBKdW5rIGhhcnJ5OwotCi0JcHVibGljIEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5mb28gPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuYmFyID0gbmV3IEp1bmsoImJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJiYXoiKTsKLQkJdGhpcy5qb28gPSBuZXcgSnVuaygiam9vIik7Ci0JCXRoaXMuamFyID0gbmV3IEp1bmsoImphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJqYXoiKTsKLQotCQl0aGlzLnRvbSA9IG5ldyBKdW5rKCJ0b20iKTsKLQkJdGhpcy5kaWNrID0gbmV3IEp1bmsoImRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJoYXJyeSIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIEp1bmsuU1RVRkZfTElTVCk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfTElTVCk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5nZXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlsaXN0VmFsdWVNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0VmFsdWVNb2RlbC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDApKTsKLQkJdGhpcy5iYXIucmVtb3ZlU3R1ZmYoImJhciIpOwotCQl0aGlzLmJhci5hZGRTdHVmZigienp6Iik7Ci0JCXRoaXMuYmFyLmFkZFN0dWZmKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoNSkpOwotCQl0aGlzLmJhci5yZW1vdmVTdHVmZigienp6Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEp1bms+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQmFnPEp1bms+IGJhZyA9IG5ldyBIYXNoQmFnPEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGJhZyk7Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PEp1bms+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxKdW5rPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPEp1bms+IGMpIHsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCWMuYWRkKHRoaXMuYmF6KTsKLQkJYy5hZGQodGhpcy5qb28pOwotCQljLmFkZCh0aGlzLmphcik7Ci0JCWMuYWRkKHRoaXMuamF6KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdHVmZjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUZGX0xJU1QgPSAic3R1ZmYiOwotCQkJCi0JCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5zdHVmZi5hZGQoc3R1ZmZJdGVtKTsKLQkJCWZpcmVJdGVtQWRkZWQoU1RVRkZfTElTVCwgdGhpcy5zdHVmZi5pbmRleE9mKHN0dWZmSXRlbSksIHN0dWZmSXRlbSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCWludCBpbmRleCA9IHRoaXMuc3R1ZmYuaW5kZXhPZihzdHVmZkl0ZW0pOwotCQkJdGhpcy5zdHVmZi5yZW1vdmUoc3R1ZmZJdGVtKTsKLQkJCWZpcmVJdGVtUmVtb3ZlZChTVFVGRl9MSVNULCBpbmRleCwgc3R1ZmZJdGVtKTsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoKTsKLQkJfQotCQotCQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIG8pIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBvKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5zdHVmZiArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODYwNzAzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGZvbzsKLQlwcml2YXRlIEp1bmsgYmFyOwotCXByaXZhdGUgSnVuayBiYXo7Ci0JcHJpdmF0ZSBKdW5rIGpvbzsKLQlwcml2YXRlIEp1bmsgamFyOwotCXByaXZhdGUgSnVuayBqYXo7Ci0KLQlwcml2YXRlIEp1bmsgdG9tOwotCXByaXZhdGUgSnVuayBkaWNrOwotCXByaXZhdGUgSnVuayBoYXJyeTsKLQotCXB1YmxpYyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBKdW5rKCJ0aGlzLmZvbyIpOwotCQl0aGlzLmJhciA9IG5ldyBKdW5rKCJ0aGlzLmJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJ0aGlzLmJheiIpOwotCQl0aGlzLmpvbyA9IG5ldyBKdW5rKCJ0aGlzLmpvbyIpOwotCQl0aGlzLmphciA9IG5ldyBKdW5rKCJ0aGlzLmphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJ0aGlzLmpheiIpOwotCi0JCXRoaXMudG9tID0gbmV3IEp1bmsoInRoaXMudG9tIik7Ci0JCXRoaXMuZGljayA9IG5ldyBKdW5rKCJ0aGlzLmRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJ0aGlzLmhhcnJ5Iik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmZvbyk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuamFyKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuc2V0Q29sbGVjdGlvbih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIuYWRkKDYsIHRoaXMudG9tKTsKLQkJbGlzdEhvbGRlci5hZGQoNywgdGhpcy5kaWNrKTsKLQkJbGlzdEhvbGRlci5hZGQoOCwgdGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCS8vIHRlc3QgY29uY3VycmVudCBtb2RpZmljYXRpb24gZXhjZXB0aW9uCi0JCWxpc3RIb2xkZXIuc2V0TGlzdCh0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5nZXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUNvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21MaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8SnVuaz4gYnVpbGRDdXN0b21Db21wYXJhdG9yKCkgewotCQkvLyBzb3J0IHdpdGggcmV2ZXJzZSBvcmRlcgotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8SnVuaz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoSnVuayBvMSwgSnVuayBvMikgewotCQkJCXJldHVybiBvMi5jb21wYXJlVG8obzEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uU29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIGNvbXBhcmF0b3IpLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmZvbyk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuamFyKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnNldENvbGxlY3Rpb24odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdFNvcnQoQ29tcGFyYXRvcjxKdW5rPiBjb21wYXJhdG9yKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBjb21wYXJhdG9yKSwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNSk7Ci0JCWFzc2VydEVxdWFscyg1LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLnNldExpc3QodGhpcy5idWlsZExpc3QoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZVNvcnQoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCwgQ29tcGFyYXRvcjxKdW5rPiBjb21wYXJhdG9yKSB7Ci0JCVNvcnRlZFNldDxKdW5rPiBzcyA9IG5ldyBUcmVlU2V0PEp1bms+KGNvbXBhcmF0b3IpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWYWx1ZU1vZGVsLnNpemUoKTsgaSsrKSB7Ci0JCQlzcy5hZGQobGlzdFZhbHVlTW9kZWwuZ2V0KGkpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoc3Muc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3I8SnVuaz4gc3RyZWFtMSA9IHNzLml0ZXJhdG9yKCksIHN0cmVhbTIgPSBsaXN0Lml0ZXJhdG9yKCk7IHN0cmVhbTEuaGFzTmV4dCgpOyApIHsKLQkJCWFzc2VydEVxdWFscyhzdHJlYW0xLm5leHQoKSwgc3RyZWFtMi5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIpLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJbGlzdFZhbHVlTW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyKSwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RWYWx1ZU1vZGVsLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCQl0aGlzLmJhci5zZXROYW1lKCJ6enoiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoNSkpOwotCQl0aGlzLmJhci5zZXROYW1lKCJ0aGlzLmJhciIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxKdW5rPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUJhZzxKdW5rPiBiYWcgPSBuZXcgSGFzaEJhZzxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihiYWcpOwotCQlyZXR1cm4gYmFnOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxKdW5rPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8SnVuaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxKdW5rPiBjKSB7Ci0JCWMuYWRkKHRoaXMuZm9vKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJheik7Ci0JCWMuYWRkKHRoaXMuam9vKTsKLQkJYy5hZGQodGhpcy5qYXIpOwotCQljLmFkZCh0aGlzLmpheik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEp1bmsgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHVibGljIEp1bmsoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIGludCBjb21wYXJlVG8oRGlzcGxheWFibGUgbykgewotCQkJcmV0dXJuIERFRkFVTFRfQ09NUEFSQVRPUi5jb21wYXJlKHRoaXMsIG8pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxNDZkZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGZvbzsKLQlwcml2YXRlIEp1bmsgYmFyOwotCXByaXZhdGUgSnVuayBiYXo7Ci0JcHJpdmF0ZSBKdW5rIGpvbzsKLQlwcml2YXRlIEp1bmsgamFyOwotCXByaXZhdGUgSnVuayBqYXo7Ci0KLQlwcml2YXRlIEp1bmsgdG9tOwotCXByaXZhdGUgSnVuayBkaWNrOwotCXByaXZhdGUgSnVuayBoYXJyeTsKLQotCXB1YmxpYyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBKdW5rKCJ0aGlzLmZvbyIpOwotCQl0aGlzLmJhciA9IG5ldyBKdW5rKCJ0aGlzLmJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJ0aGlzLmJheiIpOwotCQl0aGlzLmpvbyA9IG5ldyBKdW5rKCJ0aGlzLmpvbyIpOwotCQl0aGlzLmphciA9IG5ldyBKdW5rKCJ0aGlzLmphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJ0aGlzLmpheiIpOwotCi0JCXRoaXMudG9tID0gbmV3IEp1bmsoInRoaXMudG9tIik7Ci0JCXRoaXMuZGljayA9IG5ldyBKdW5rKCJ0aGlzLmRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJ0aGlzLmhhcnJ5Iik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5nZXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUNvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21MaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8SnVuaz4gYnVpbGRDdXN0b21Db21wYXJhdG9yKCkgewotCQkvLyBzb3J0IHdpdGggcmV2ZXJzZSBvcmRlcgotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8SnVuaz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoSnVuayBvMSwgSnVuayBvMikgewotCQkJCXJldHVybiBvMi5jb21wYXJlVG8obzEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uU29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0U29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5hZGQoMCwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDUpOwotCQlhc3NlcnRFcXVhbHMoNSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmVTb3J0KExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsLCBMaXN0PEp1bms+IGxpc3QsIENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTb3J0ZWRTZXQ8SnVuaz4gc3MgPSBuZXcgVHJlZVNldDxKdW5rPihjb21wYXJhdG9yKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJc3MuYWRkKGxpc3RWYWx1ZU1vZGVsLmdldChpKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHNzLnNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEp1bms+IHN0cmVhbTEgPSBzcy5pdGVyYXRvcigpLCBzdHJlYW0yID0gbGlzdC5pdGVyYXRvcigpOyBzdHJlYW0xLmhhc05leHQoKTsgKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyZWFtMS5uZXh0KCksIHN0cmVhbTIubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyKSk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJbGlzdFZhbHVlTW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDApKTsKLQkJdGhpcy5iYXIuc2V0TmFtZSgienp6Iik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDUpKTsKLQkJdGhpcy5iYXIuc2V0TmFtZSgidGhpcy5iYXIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SnVuaz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlCYWc8SnVuaz4gYmFnID0gbmV3IEhhc2hCYWc8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SnVuaz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PEp1bms+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248SnVuaz4gYykgewotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXopOwotCQljLmFkZCh0aGlzLmpvbyk7Ci0JCWMuYWRkKHRoaXMuamFyKTsKLQkJYy5hZGQodGhpcy5qYXopOwotCX0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENvbXBhcmFibGU8SnVuaz4gewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwdWJsaWMgSnVuayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJcHVibGljIGludCBjb21wYXJlVG8oSnVuayBqKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lLmNvbXBhcmVUbyhqLm5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MzA3MGMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnMuSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkpwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMuc3VpdGUoKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdEN1cmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOdWxsTGlzdFZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOdWxsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RhdGljVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5UcmFuc2Zvcm1lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVmFsdWVMaXN0QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RBc3BlY3RBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgyNWJhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIExpc3RBc3BlY3RBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQlwcml2YXRlIExvY2FsTGlzdEFzcGVjdEFkYXB0ZXIgYWExOwotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50IGV2ZW50MTsKLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0KLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JcHVibGljIExpc3RBc3BlY3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWVzKHRoaXMuc3ViamVjdDFOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbnModGhpcy5zdWJqZWN0MURlc2NyaXB0aW9ucygpKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KHRoaXMuc3ViamVjdDEpOwotCQl0aGlzLmFhMSA9IHRoaXMuYnVpbGRBc3BlY3RBZGFwdGVyKHRoaXMuc3ViamVjdEhvbGRlcjEpOwotCQl0aGlzLmxpc3RlbmVyMSA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmFhMS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCi0JCXRoaXMuc3ViamVjdDIgPSBuZXcgVGVzdFN1YmplY3QoKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGROYW1lcyh0aGlzLnN1YmplY3QyTmFtZXMoKSk7Ci0JCXRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb25zKHRoaXMuc3ViamVjdDJEZXNjcmlwdGlvbnMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3ViamVjdDFOYW1lcygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJlc3VsdC5hZGQoImJheiIpOwotCQlyZXN1bHQuYWRkKCJiYW0iKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0MURlc2NyaXB0aW9ucygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QxIGRlc2NyaXB0aW9uMSIpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QxIGRlc2NyaXB0aW9uMiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QyTmFtZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiam9vIik7Ci0JCXJlc3VsdC5hZGQoImphciIpOwotCQlyZXN1bHQuYWRkKCJqYXoiKTsKLQkJcmVzdWx0LmFkZCgiamFtIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3ViamVjdDJEZXNjcmlwdGlvbnMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MiBkZXNjcmlwdGlvbjEiKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MiBkZXNjcmlwdGlvbjIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExvY2FsTGlzdEFzcGVjdEFkYXB0ZXIgYnVpbGRBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IExvY2FsTGlzdEFzcGVjdEFkYXB0ZXIoc3ViamVjdEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdmFsdWUxQ2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmV2ZW50MSA9IGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0Mik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aGlzLmV2ZW50MS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ldmVudDEuaXRlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0Mk5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aGlzLmV2ZW50MS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ldmVudDEuaXRlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0MSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aGlzLmV2ZW50MS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ldmVudDEuaXRlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWUoImphbSIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoImphbSIsIHRoaXMuZXZlbnQxLml0ZW1zKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzUGx1cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMuYWRkKCJqYW0iKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuYWExLmFkZCgyLCAiamF6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoImpheiIsIHRoaXMuZXZlbnQxLml0ZW1zKCkubmV4dCgpKTsKLQkJbmFtZXNQbHVzLmFkZCgyLCAiamF6Iik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBZGQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJTGlzdDxTdHJpbmc+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWl0ZW1zLmFkZCgiam9vIik7Ci0JCWl0ZW1zLmFkZCgiamFyIik7Ci0JCWl0ZW1zLmFkZCgiamF6Iik7Ci0JCWl0ZW1zLmFkZCgiamFtIik7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmFhMS5hZGRBbGwoMiwgaXRlbXMpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB0aGlzLmV2ZW50MS5nZXRJbmRleCgpKTsJCS8vIG9ubHkgdGhlIGxhc3QgImFkZCIgZXZlbnQgd2lsbCBzdGlsbCBiZSB0aGVyZQotCQlhc3NlcnRFcXVhbHMoImphbSIsIHRoaXMuZXZlbnQxLml0ZW1zKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzUGx1cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMuYWRkQWxsKDIsIGl0ZW1zKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCVN0cmluZyByZW1vdmVkTmFtZSA9IHRoaXMuc3ViamVjdDEucmVtb3ZlTmFtZSgwKTsJLy8gc2hvdWxkIGJlICJmb28iCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMocmVtb3ZlZE5hbWUsIHRoaXMuZXZlbnQxLml0ZW1zKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzTWludXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNNaW51cy5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJT2JqZWN0IHJlbW92ZWRJdGVtID0gdGhpcy5hYTEucmVtb3ZlKDApOwkKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5ldmVudDEuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhyZW1vdmVkSXRlbSwgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQluYW1lc01pbnVzLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzTWludXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRMZW5ndGgoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJTGlzdDxTdHJpbmc+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWl0ZW1zLmFkZCgiYmFyIik7Ci0JCWl0ZW1zLmFkZCgiYmF6Iik7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmFhMS5yZW1vdmUoMSwgMik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwkJLy8gb25seSB0aGUgbGFzdCAicmVtb3ZlIiBldmVudCB3aWxsIHN0aWxsIGJlIHRoZXJlCi0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1cy5yZW1vdmUoMSk7Ci0JCW5hbWVzUGx1cy5yZW1vdmUoMSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2UoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJU3RyaW5nIHJlcGxhY2VkTmFtZSA9IHRoaXMuc3ViamVjdDEuc2V0TmFtZSgwLCAiamVsbHkiKTsJLy8gc2hvdWxkIGJlICJmb28iCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoImplbGx5IiwgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocmVwbGFjZWROYW1lLCB0aGlzLmV2ZW50MS5yZXBsYWNlZEl0ZW1zKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzQ2hhbmdlZCA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc0NoYW5nZWQuc2V0KDAsICJqZWxseSIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNDaGFuZ2VkLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJcmVwbGFjZWROYW1lID0gdGhpcy5zdWJqZWN0MS5zZXROYW1lKDEsICJyb2xsIik7CS8vIHNob3VsZCBiZSAiYmFyIgotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmV2ZW50MS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJyb2xsIiwgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocmVwbGFjZWROYW1lLCB0aGlzLmV2ZW50MS5yZXBsYWNlZEl0ZW1zKCkubmV4dCgpKTsKLQkJbmFtZXNDaGFuZ2VkID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzQ2hhbmdlZC5zZXQoMCwgImplbGx5Iik7Ci0JCW5hbWVzQ2hhbmdlZC5zZXQoMSwgInJvbGwiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzQ2hhbmdlZCwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLmFkZFR3b05hbWVzKCJqYW0iLCAiamF6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aGlzLmV2ZW50MS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ldmVudDEuaXRlbXMoKS5oYXNOZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNQbHVzMiA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMyLmFkZCgwLCAiamF6Iik7Ci0JCW5hbWVzUGx1czIuYWRkKDAsICJqYW0iKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1czIsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc3ViamVjdDEubmFtZXMoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLmdldCgwKSwgdGhpcy5zdWJqZWN0MS5nZXROYW1lKDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLmdldCgwKSwgdGhpcy5hYTEuZ2V0KDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zdWJqZWN0MS5uYW1lcygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpKTsKLQkJdGhpcy5hYTEucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfTElTVCkpOwotCQl0aGlzLmFhMS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IG5hbWVzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU19MSVNUID0gIm5hbWVzIjsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVzY3JpcHRpb25zOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTlNfTElTVCA9ICJkZXNjcmlwdGlvbnMiOwotCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoKSB7Ci0JCQl0aGlzLm5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQl0aGlzLmRlc2NyaXB0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBuYW1lcygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm5hbWVzKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lcy5nZXQoaW5kZXgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWUoaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lcy5hZGQoaW5kZXgsIG5hbWUpOwotCQkJdGhpcy5maXJlSXRlbUFkZGVkKE5BTUVTX0xJU1QsIGluZGV4LCBuYW1lKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmFkZE5hbWUodGhpcy5uYW1lcy5zaXplKCksIG5hbWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKExpc3RJdGVyYXRvcjxTdHJpbmc+IG5ld05hbWVzKSB7Ci0JCQl3aGlsZSAobmV3TmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5hZGROYW1lKG5ld05hbWVzLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoTGlzdDxTdHJpbmc+IG5ld05hbWVzKSB7Ci0JCQl0aGlzLmFkZE5hbWVzKG5ld05hbWVzLmxpc3RJdGVyYXRvcigpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRUd29OYW1lcyhTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQkJdGhpcy5uYW1lcy5hZGQoMCwgbmFtZTIpOwotCQkJdGhpcy5uYW1lcy5hZGQoMCwgbmFtZTEpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTkFNRVNfTElTVCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyByZW1vdmVOYW1lKGludCBpbmRleCkgewotCQkJU3RyaW5nIHJlbW92ZWROYW1lID0gdGhpcy5uYW1lcy5yZW1vdmUoaW5kZXgpOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoTkFNRVNfTElTVCwgaW5kZXgsIHJlbW92ZWROYW1lKTsKLQkJCXJldHVybiByZW1vdmVkTmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHNldE5hbWUoaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgewotCQkJU3RyaW5nIHJlcGxhY2VkTmFtZSA9IHRoaXMubmFtZXMuc2V0KGluZGV4LCBuYW1lKTsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChOQU1FU19MSVNULCBpbmRleCwgbmFtZSwgcmVwbGFjZWROYW1lKTsKLQkJCXJldHVybiByZXBsYWNlZE5hbWU7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IGRlc2NyaXB0aW9ucygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmRlc2NyaXB0aW9ucyk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLmRlc2NyaXB0aW9ucy5nZXQoaW5kZXgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9uKGludCBpbmRleCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9ucy5hZGQoaW5kZXgsIGRlc2NyaXB0aW9uKTsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChERVNDUklQVElPTlNfTElTVCwgaW5kZXgsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuYWRkRGVzY3JpcHRpb24odGhpcy5kZXNjcmlwdGlvbnMuc2l6ZSgpLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb25zKExpc3RJdGVyYXRvcjxTdHJpbmc+IG5ld0Rlc2NyaXB0aW9ucykgewotCQkJd2hpbGUgKG5ld0Rlc2NyaXB0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmFkZERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9ucy5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9ucyhMaXN0PFN0cmluZz4gbmV3RGVzY3JpcHRpb25zKSB7Ci0JCQl0aGlzLmFkZERlc2NyaXB0aW9ucyhuZXdEZXNjcmlwdGlvbnMubGlzdEl0ZXJhdG9yKCkpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlRGVzY3JpcHRpb24oaW50IGluZGV4KSB7Ci0JCQlTdHJpbmcgcmVtb3ZlZERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbnMucmVtb3ZlKGluZGV4KTsKLQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKERFU0NSSVBUSU9OU19MSVNULCBpbmRleCwgcmVtb3ZlZERlc2NyaXB0aW9uKTsKLQkJCXJldHVybiByZW1vdmVkRGVzY3JpcHRpb247Ci0JCX0KLQkJcHVibGljIFN0cmluZyBzZXREZXNjcmlwdGlvbihpbnQgaW5kZXgsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJU3RyaW5nIHJlcGxhY2VkRGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9ucy5zZXQoaW5kZXgsIGRlc2NyaXB0aW9uKTsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChERVNDUklQVElPTlNfTElTVCwgaW5kZXgsIGRlc2NyaXB0aW9uLCByZXBsYWNlZERlc2NyaXB0aW9uKTsKLQkJCXJldHVybiByZXBsYWNlZERlc2NyaXB0aW9uOwotCQl9Ci0JfQotCi0KLQkvLyB0aGlzIGlzIG5vdCBhIHR5cGljYWwgYXNwZWN0IGFkYXB0ZXIgLSB0aGUgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYXNwZWN0IG5hbWUKLQlwcml2YXRlIGNsYXNzIExvY2FsTGlzdEFzcGVjdEFkYXB0ZXIgZXh0ZW5kcyBMaXN0QXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPiB7Ci0KLQkJTG9jYWxMaXN0QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJCXN1cGVyKHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVzKCk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19MSVNUKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5kZXNjcmlwdGlvbnMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMubGlzdE5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCQlpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfTElTVCkgewotCQkJCXRoaXMuc3ViamVjdC5hZGROYW1lKGluZGV4LCAoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0xJU1QpIHsKLQkJCQl0aGlzLnN1YmplY3QuYWRkRGVzY3JpcHRpb24oaW5kZXgsIChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5saXN0TmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkQWxsKGludCBpbmRleCwgTGlzdDxTdHJpbmc+IGl0ZW1zKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJdGhpcy5hZGQoaW5kZXggKyBpLCBpdGVtcy5nZXQoaSkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFN0cmluZyByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQlpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucmVtb3ZlTmFtZShpbmRleCk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19MSVNUKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5yZW1vdmVEZXNjcmlwdGlvbihpbmRleCk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmxpc3ROYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTGlzdDxTdHJpbmc+IHJlbW92ZShpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJCUxpc3Q8U3RyaW5nPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlyZW1vdmVkSXRlbXMuYWRkKHRoaXMucmVtb3ZlKGluZGV4KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVtb3ZlZEl0ZW1zOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCByZXBsYWNlKGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJCWlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19MSVNUKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zZXROYW1lKGluZGV4LCAoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNldERlc2NyaXB0aW9uKGluZGV4LCAoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMubGlzdE5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYzRjNWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZExpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gd3JhcHBlZExpc3Q7Ci0KLQlwdWJsaWMgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlciA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMud3JhcHBlZExpc3QpOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMud3JhcHBlZExpc3RIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy53cmFwcGVkTGlzdC5pdGVyYXRvcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCS8vIG92ZXJyaWRlIGZhaWx1cmUKLQkJCX0KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZXMoKSB7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBIYXNoQmFnPFN0cmluZz4oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy53cmFwcGVkTGlzdEhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgzLCAiam9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDQsICJqYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNSwgImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy53cmFwcGVkTGlzdC5zaXplKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBzeW5jaENvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy53cmFwcGVkTGlzdEhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDMsICJqb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNCwgImphciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg1LCAiamF6Iik7Ci0JCWFzc2VydEVxdWFscygiamF6IiwgdGhpcy53cmFwcGVkTGlzdEhvbGRlci5yZW1vdmUoNSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJqYXoiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy53cmFwcGVkTGlzdEhvbGRlci5yZW1vdmUoMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRMaXN0LnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQkvLyBvdmVycmlkZSBmYWlsdXJlCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCS8vIG92ZXJyaWRlIGZhaWx1cmUKLQkJCX0KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDMsICJqb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNCwgImphciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg1LCAiamF6Iik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIucmVtb3ZlKDUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRMaXN0LnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2UoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJLy8gb3ZlcnJpZGUgZmFpbHVyZQotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQkvLyBvdmVycmlkZSBmYWlsdXJlCi0JCQl9Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlLml0ZW1zKCkubmV4dCgpKTsKLQkJCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuYWRhcHRlci5pdGVyYXRvcigpLCAiam9vIikpOwotCQkJCWFzc2VydEVxdWFscygyLCBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5hZGFwdGVyLnNpemUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImpvbyIsIGUuaXRlbXMoKS5uZXh0KCkpOwotCQkJCWFzc2VydEVxdWFscygzLCBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5hZGFwdGVyLnNpemUoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnNldCgwLCAiam9vIik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlDb29yZGluYXRlZEJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBzeW5jaENvbGxlY3Rpb24pOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihzeW5jaENvbGxlY3Rpb24pOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHN5bmNoQ29sbGVjdGlvbik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnNldExpc3QobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJmb28iKTsKLQkJbGlzdC5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnNldExpc3QobGlzdCk7Ci0JCWFzc2VydEVxdWFscygyLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eVRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuc2V0TGlzdChsaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JY2xhc3MgVGVzdExpc3RlbmVyIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyYmJjZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdEN1cmF0b3JUZXN0cyAKLQlleHRlbmRzIFRlc3RDYXNlIAotewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JCi0JcHJpdmF0ZSBMaXN0Q3VyYXRvcjxUZXN0U3ViamVjdCwgU3RyaW5nPiBjdXJhdG9yOwotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMTsKLQlwcml2YXRlIExpc3RDaGFuZ2VFdmVudCBldmVudDE7Ci0JCi0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MjsKLQotCXB1YmxpYyBMaXN0Q3VyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdDEgPSBuZXcgVGVzdFN1YmplY3QodGhpcy5zdWJqZWN0MU5hbWVzKCkpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4odGhpcy5zdWJqZWN0MSk7Ci0JCXRoaXMuY3VyYXRvciA9IHRoaXMuYnVpbGRMaXN0Q3VyYXRvcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmN1cmF0b3IuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJCi0JCXRoaXMuc3ViamVjdDIgPSBuZXcgVGVzdFN1YmplY3QodGhpcy5zdWJqZWN0Mk5hbWVzKCkpOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0MU5hbWVzKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJhbHBoYSIpOwotCQlsaXN0LmFkZCgiYnJhdm8iKTsKLQkJbGlzdC5hZGQoImNoYXJsaWUiKTsKLQkJbGlzdC5hZGQoImRlbHRhIik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0Mk5hbWVzKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJlY2hvIik7Ci0JCWxpc3QuYWRkKCJmb3h0cm90Iik7Ci0JCWxpc3QuYWRkKCJnbG92ZSIpOwotCQlsaXN0LmFkZCgiaG90ZWwiKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByaXZhdGUgTGlzdEN1cmF0b3I8VGVzdFN1YmplY3QsIFN0cmluZz4gYnVpbGRMaXN0Q3VyYXRvcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q3VyYXRvcjxUZXN0U3ViamVjdCwgU3RyaW5nPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yRm9yUmVjb3JkKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc3RyaW5ncygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyMSgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdmFsdWUxQ2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmV2ZW50MSA9IGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV2ZW50MS5pdGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QyTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgdGhpcy5ldmVudDEuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXZlbnQxLml0ZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jdXJhdG9yLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QxKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aGlzLmV2ZW50MS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ldmVudDEuaXRlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkU3RyaW5nKCJlY2hvIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoImVjaG8iLCB0aGlzLmV2ZW50MS5pdGVtcygpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBzdHJpbmdzUGx1cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQlzdHJpbmdzUGx1cy5hZGQoImVjaG8iKTsKLQkJYXNzZXJ0RXF1YWxzKHN0cmluZ3NQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdDEuYWRkU3RyaW5nKDAsICJ6dWx1Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmV2ZW50MS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6dWx1IiwgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQlzdHJpbmdzUGx1cy5hZGQoMCwgInp1bHUiKTsKLQkJYXNzZXJ0RXF1YWxzKHN0cmluZ3NQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJU3RyaW5nIHJlbW92ZWRTdHJpbmcgPSB0aGlzLnN1YmplY3QxLnJlbW92ZVN0cmluZygwKTsJLy8gc2hvdWxkIGJlICJhbHBoYSIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMocmVtb3ZlZFN0cmluZywgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gc3RyaW5nc01pbnVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCXN0cmluZ3NNaW51cy5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscyhzdHJpbmdzTWludXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQkKLQkJcmVtb3ZlZFN0cmluZyA9IHRoaXMuc3ViamVjdDEucmVtb3ZlU3RyaW5nKDIpOwkvLyBzaG91bGQgYmUgImRlbHRhIgotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5ldmVudDEuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhyZW1vdmVkU3RyaW5nLCB0aGlzLmV2ZW50MS5pdGVtcygpLm5leHQoKSk7Ci0JCXN0cmluZ3NNaW51cy5yZW1vdmUoMik7Ci0JCWFzc2VydEVxdWFscyhzdHJpbmdzTWludXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGVMaXN0Q2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQkJCi0JCXRoaXMuc3ViamVjdDEuc2V0U3RyaW5ncyh0aGlzLnN1YmplY3QyTmFtZXMoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuZXdTdHJpbmdzID0gdGhpcy5zdWJqZWN0Mk5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhuZXdTdHJpbmdzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBhcnRpYWxMaXN0Q2hhbmdlKCkgewotCQlMaXN0PFN0cmluZz4gc3RhcnRpbmdMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBzdGFydGluZ0xpc3QpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQkJCi0JCVN0cmluZyBpZGVudGljYWxTdHJpbmcgPSBzdGFydGluZ0xpc3QuZ2V0KDEpOyAgLy8gc2hvdWxkIGJlICJicmF2byIKLQkJU3RyaW5nIG5vbmlkZW50aWNhbFN0cmluZyA9IHN0YXJ0aW5nTGlzdC5nZXQoMCk7IC8vIHNob3VsZCBiZSAiYWxwaGEiCi0JCUxpc3Q8U3RyaW5nPiBuZXdTdHJpbmdzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QobmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKCJicmF2byIpLCBuZXcgU3RyaW5nKCJhbHBoYSIpLCAiZWNobyIsICJkZWx0YSIsICJmb3h0cm90In0pOwotCQl0aGlzLnN1YmplY3QxLnNldFN0cmluZ3MobmV3U3RyaW5ncyk7Ci0JCQotCQlMaXN0PFN0cmluZz4gZmluYWxMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1N0cmluZ3MsIGZpbmFsTGlzdCk7Ci0JCWFzc2VydFRydWUoaWRlbnRpY2FsU3RyaW5nID09IGZpbmFsTGlzdC5nZXQoMCkpOwotCQlhc3NlcnRUcnVlKG5vbmlkZW50aWNhbFN0cmluZyAhPSBmaW5hbExpc3QuZ2V0KDEpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc3ViamVjdDEuc3RyaW5ncygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5nZXQoMCksIHRoaXMuc3ViamVjdDEuZ2V0U3RyaW5nKDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLmdldCgwKSwgdGhpcy5jdXJhdG9yLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnN1YmplY3QxLnN0cmluZ3MoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgdGhpcy5jdXJhdG9yLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5jdXJhdG9yLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLmN1cmF0b3IucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY3VyYXRvci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuY3VyYXRvci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmN1cmF0b3IuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMuY3VyYXRvci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jdXJhdG9yLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJbm5lciBDbGFzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JY2xhc3MgVGVzdFN1YmplY3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3RyaW5nczsKLQkJCi0JCXB1YmxpYyBUZXN0U3ViamVjdCgpIHsKLQkJCXRoaXMuc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoTGlzdDxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJCXRoaXMoKTsKLQkJCXRoaXMuc2V0U3RyaW5ncyhzdHJpbmdzKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zdHJpbmdzLmdldChpbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc3RyaW5ncyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZFN0cmluZyhpbnQgaW5kZXgsIFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMuc3RyaW5ncy5hZGQoaW5kZXgsIHN0cmluZyk7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMuYWRkU3RyaW5nKHRoaXMuc3RyaW5ncy5zaXplKCksIHN0cmluZyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlU3RyaW5nKGludCBpbmRleCkgewotCQkJU3RyaW5nIHN0cmluZyA9IHRoaXMuc3RyaW5ncy5nZXQoaW5kZXgpOwotCQkJdGhpcy5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLnN0cmluZ3MucmVtb3ZlKHN0cmluZyk7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U3RyaW5ncyhMaXN0PFN0cmluZz4gc3RyaW5ncykgewotCQkJdGhpcy5zdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHN0cmluZ3MpOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFN0cmluZ3MoU3RyaW5nW10gc3RyaW5ncykgewotCQkJdGhpcy5zdHJpbmdzID0gQ29sbGVjdGlvblRvb2xzLmxpc3Qoc3RyaW5ncyk7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlZmViOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PiBjb2xsZWN0aW9uSG9sZGVyOwotCi0JcHVibGljIE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlciA9IG5ldyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmZWQzNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbExpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE51bGxMaXN0VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T2JqZWN0PiBsaXN0SG9sZGVyOwotCi0JcHVibGljIE51bGxMaXN0VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBOdWxsTGlzdFZhbHVlTW9kZWw8T2JqZWN0PigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIuZ2V0KDApOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjNzVkYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLk51bGxQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE51bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCi0JcHVibGljIE51bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IE51bGxQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydE51bGwodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQxMmEwNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4gYWExOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDE7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMTsKLQotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDI7Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgbXVsdGlwbGVWYWx1ZUV2ZW50OwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGN1c3RvbVZhbHVlRXZlbnQ7Ci0KLQotCXB1YmxpYyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QxID0gbmV3IFRlc3RTdWJqZWN0KCJmb28iLCAidGVzdCBzdWJqZWN0IDEiKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+ICh0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5hYTEgPSB0aGlzLmJ1aWxkQXNwZWN0QWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCi0JCXRoaXMuc3ViamVjdDIgPSBuZXcgVGVzdFN1YmplY3QoImJhciIsICJ0ZXN0IHN1YmplY3QgMiIpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+IGJ1aWxkQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4oc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJLy8gdGhpcyBpcyBub3QgYSBhc3BlY3QgYWRhcHRlciAtIHRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhc3BlY3QgbmFtZQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnByb3BlcnR5TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgaWYgKHRoaXMucHJvcGVydHlOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTl9QUk9QRVJUWSkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMucHJvcGVydHlOYW1lc1swXSk7Ci0JCQkJfQotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHRoaXMucHJvcGVydHlOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9IGVsc2UgaWYgKHRoaXMucHJvcGVydHlOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTl9QUk9QRVJUWSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0RGVzY3JpcHRpb24odmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLnByb3BlcnR5TmFtZXNbMF0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHZhbHVlMUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0Mik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QxKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuc2V0TmFtZSgiYmF6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3QxLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0MS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zdWJqZWN0MS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc3ViamVjdDEuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmFhMS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5hYTEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmFhMS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5hYTEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMuYWExLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLnN1YmplY3QxLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpKTsKLQkJdGhpcy5hYTEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpKTsKLQkJdGhpcy5hYTEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQXNwZWN0QWRhcHRlcigpIHsKLQkJVGVzdFN1YmplY3QgdGVzdFN1YmplY3QgPSBuZXcgVGVzdFN1YmplY3QoImZyZWQiLCAiaHVzYmFuZCIpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gdGVzdFN1YmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0ZXN0U3ViamVjdCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGVzdEFBID0gdGhpcy5idWlsZE11bHRpcGxlQXNwZWN0QWRhcHRlcih0ZXN0U3ViamVjdEhvbGRlcik7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGVzdExpc3RlbmVyID0gdGhpcy5idWlsZE11bHRpcGxlVmFsdWVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0ZXN0QUEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRlc3RMaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygiZnJlZDpodXNiYW5kIiwgdGVzdEFBLmdldFZhbHVlKCkpOwotCi0JCXRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50ID0gbnVsbDsKLQkJdGVzdFN1YmplY3Quc2V0TmFtZSgid2lsbWEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYTpodXNiYW5kIiwgdGVzdEFBLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQ6aHVzYmFuZCIsIHRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hOmh1c2JhbmQiLCB0aGlzLm11bHRpcGxlVmFsdWVFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQotCQl0aGlzLm11bHRpcGxlVmFsdWVFdmVudCA9IG51bGw7Ci0JCXRlc3RTdWJqZWN0LnNldERlc2NyaXB0aW9uKCJ3aWZlIik7Ci0JCWFzc2VydEVxdWFscygid2lsbWE6d2lmZSIsIHRlc3RBQS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYTpodXNiYW5kIiwgdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygid2lsbWE6d2lmZSIsIHRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE11bHRpcGxlQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4oc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSwgVGVzdFN1YmplY3QuREVTQ1JJUFRJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKSArICI6IiArIHRoaXMuc3ViamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE11bHRpcGxlVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMubXVsdGlwbGVWYWx1ZUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBtdWx0aXBsZVZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQgPSBlOwotCX0KLQotCS8qKgotCSAqIHRlc3QgYSBidWcgd2hlcmUgd2Ugd291bGQgY2FsbCAjYnVpbGRWYWx1ZSgpIGluCi0JICogI2VuZ2FnZU5vbk51bGxTdWJqZWN0KCksIHdoZW4gd2UgbmVlZGVkIHRvIGNhbGwKLQkgKiBpdCBpbiAjZW5nYWdlU3ViamVjdCgpLCBzbyB0aGUgY2FjaGVkIHZhbHVlIHdvdWxkCi0JICogYmUgcmVidWlsdCB3aGVuIHRoZSB0aGlzLnN1YmplY3Qgd2FzIHNldCB0byBudWxsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUJ1aWxkVmFsdWVXaXRoTnVsbFN1YmplY3QoKSB7Ci0JCVRlc3RTdWJqZWN0IGN1c3RvbVN1YmplY3QgPSBuZXcgVGVzdFN1YmplY3QoImZyZWQiLCAibGFib3JlciIpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gY3VzdG9tU3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KGN1c3RvbVN1YmplY3QpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGN1c3RvbUFBID0gdGhpcy5idWlsZEN1c3RvbUFzcGVjdEFkYXB0ZXIoY3VzdG9tU3ViamVjdEhvbGRlcik7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY3VzdG9tTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ3VzdG9tVmFsdWVDaGFuZ2VMaXN0ZW5lcigpOwotCQljdXN0b21BQS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgY3VzdG9tTGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBjdXN0b21BQS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmN1c3RvbVZhbHVlRXZlbnQgPSBudWxsOwotCQljdXN0b21TdWJqZWN0LnNldE5hbWUoIndpbG1hIik7Ci0JCWFzc2VydEVxdWFscygid2lsbWEiLCBjdXN0b21BQS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkIiwgdGhpcy5jdXN0b21WYWx1ZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hIiwgdGhpcy5jdXN0b21WYWx1ZUV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCi0JCXRoaXMuY3VzdG9tVmFsdWVFdmVudCA9IG51bGw7Ci0JCWN1c3RvbVN1YmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRoaXMgd291bGQgZmFpbCAtIHRoZSB2YWx1ZSB3b3VsZCBiZSBudWxsLi4uCi0JCWFzc2VydEVxdWFscygiPHVubmFtZWQ+IiwgY3VzdG9tQUEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygid2lsbWEiLCB0aGlzLmN1c3RvbVZhbHVlRXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiPHVubmFtZWQ+IiwgdGhpcy5jdXN0b21WYWx1ZUV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEN1c3RvbUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+KHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlKCkgewotCQkJCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gIjx1bm5hbWVkPiIgOiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEN1c3RvbVZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLmN1c3RvbVZhbHVlQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIGN1c3RvbVZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5jdXN0b21WYWx1ZUV2ZW50ID0gZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCQotCXByaXZhdGUgY2xhc3MgVGVzdFN1YmplY3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX1BST1BFUlRZID0gImRlc2NyaXB0aW9uIjsKLQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmRlc2NyaXB0aW9uOwotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUSU9OX1BST1BFUlRZLCBvbGQsIGRlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiZjg3Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHdyYXBwZWRWYWx1ZUhvbGRlcjsKLQotCXB1YmxpYyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMud3JhcHBlZFZhbHVlSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8U3RyaW5nPih0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFkYXB0ZXJDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZSgpIHsKLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9OwotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEhhc2hCYWc8U3RyaW5nPigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlDb29yZGluYXRlZEJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBzeW5jaENvbGxlY3Rpb24pOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihzeW5jaENvbGxlY3Rpb24pOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHN5bmNoQ29sbGVjdGlvbik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eVRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCQotCXN0YXRpYyBjbGFzcyBUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4YmQzYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHdyYXBwZWRWYWx1ZUhvbGRlcjsKLQotCXB1YmxpYyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMud3JhcHBlZFZhbHVlSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkTGlzdCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5saXN0KG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8U3RyaW5nPih0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJTGlzdDxTdHJpbmc+IGFkYXB0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZExpc3QoKSwgYWRhcHRlckxpc3QpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFkYXB0ZXJMaXN0Lml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWRhcHRlci5nZXQoMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb0FycmF5MSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJT2JqZWN0W10gYXJyYXkgPSB0aGlzLmFkYXB0ZXIudG9BcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFycmF5WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkyKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkpOwotCQlPYmplY3RbXSBhcnJheSA9IHRoaXMuYWRhcHRlci50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygwLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlKCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9OwotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJTGlzdDxTdHJpbmc+IGFkYXB0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZExpc3QoKSwgYWRhcHRlckxpc3QpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFkYXB0ZXJMaXN0Lml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCBhZGFwdGVyTGlzdCk7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRMaXN0KCksIGFkYXB0ZXJMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyTGlzdC5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihzeW5jaExpc3QpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRUb0VtcHR5KCkgewotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRGcm9tRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVtQ2hhbmdlZCgpIHsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgakxpc3QuZ2V0TW9kZWwoKS5nZXRFbGVtZW50QXQoMCkpOwotCQkKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoMSwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGpMaXN0LmdldE1vZGVsKCkuZ2V0RWxlbWVudEF0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkRnJvbUVtcHR5VG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpKTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzICoqKioqKioqKioKLQkKLQlzdGF0aWMgY2xhc3MgVGVzdExpc3RlbmVyIGltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJlZDQzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYmFnSG9sZGVyOwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBiYWdFdmVudDsKLQlTdHJpbmcgYmFnRXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHNldEhvbGRlcjsKLQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgc2V0RXZlbnQ7Ci0JU3RyaW5nIHNldEV2ZW50VHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRSA9ICJjaGFuZ2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUiA9ICJjbGVhciI7Ci0KLQkKLQlwdWJsaWMgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJhZ0hvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRCYWcoKSk7Ci0JCXRoaXMuc2V0SG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZFNldCgpKTsKLQl9Ci0KLQlwcml2YXRlIEJhZzxTdHJpbmc+IGJ1aWxkQmFnKCkgewotCQlCYWc8U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkSXRlbXNUbyhyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU2V0PFN0cmluZz4gYnVpbGRTZXQoKSB7Ci0JCVNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRJdGVtc1RvKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEl0ZW1zVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoImZvbyIpOwotCQljLmFkZCgiYmFyIik7Ci0JCWMuYWRkKCJiYXoiKTsKLQl9Ci0KLQlwcml2YXRlIEJhZzxTdHJpbmc+IGJ1aWxkQWRkSXRlbXMoKSB7Ci0JCUJhZzxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiam9vIik7Ci0JCXJlc3VsdC5hZGQoImphciIpOwotCQlyZXN1bHQuYWRkKCJqYXoiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEJhZzxTdHJpbmc+IGJ1aWxkUmVtb3ZlSXRlbXMoKSB7Ci0JCUJhZzxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiZm9vIik7Ci0JCXJlc3VsdC5hZGQoImJheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkQmFnKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNldCgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRCYWcoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuYmFnSG9sZGVyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTZXQoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmFnSG9sZGVyQ29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmJhZ0hvbGRlci5pdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2V0SG9sZGVyQ29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnNldEhvbGRlci5pdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmFnSG9sZGVyQ29udGFpbnNBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRIb2xkZXJDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLnNldEhvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJhZ0hvbGRlckNvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlCYWc8U3RyaW5nPiBiYWcgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYmFnSG9sZGVyLml0ZXJhdG9yKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBpdGVtcykgewotCQkJaWYgKGJhZy5jb250YWlucyhzdHJpbmcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRIb2xkZXJDb250YWluc0FueShDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJU2V0PFN0cmluZz4gc2V0ID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLnNldEhvbGRlci5pdGVyYXRvcigpKTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogaXRlbXMpIHsKLQkJCWlmIChzZXQuY29udGFpbnMoc3RyaW5nKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJqb28iKSk7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucygiam9vIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucyhudWxsKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucygiam9vIikpOwotCQl0aGlzLnNldEhvbGRlci5hZGQoImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImpvbyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGwoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnNBbnkodGhpcy5idWlsZEFkZEl0ZW1zKCkpKTsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRBZGRJdGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRJdGVtcygpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkSXRlbXMoKSkpOwotCQl0aGlzLnNldEhvbGRlci5hZGRBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnNBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucygiYmFyIikpOwotCi0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucygiYmFyIikpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnNBbGwodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlQWxsKHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWluc0FueSh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSkpOwotCi0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWluc0FsbCh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSkpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmVBbGwodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zQW55KHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbGxlY3Rpb24oKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0JCXRoaXMuYmFnSG9sZGVyLnNldENvbGxlY3Rpb24odGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucygiamFyIikpOwotCi0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQl0aGlzLmJhZ0hvbGRlci5zZXRDb2xsZWN0aW9uKG5ldyBIYXNoQmFnPFN0cmluZz4oKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImphciIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucygiamFyIikpOwotCQl0aGlzLnNldEhvbGRlci5zZXRDb2xsZWN0aW9uKHRoaXMuYnVpbGRBZGRJdGVtcygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImphciIpKTsKLQotCQl0aGlzLnNldEhvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucyhudWxsKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZShudWxsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucyhudWxsKSk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuc2V0Q29sbGVjdGlvbihuZXcgSGFzaEJhZzxTdHJpbmc+KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UxKCkgewotCQl0aGlzLmJhZ0hvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZEJhZ0xpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUJhZ0NoYW5nZSgpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2V0TGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5U2V0Q2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UyKCkgewotCQl0aGlzLmJhZ0hvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkQmFnTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5QmFnQ2hhbmdlKCk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZFNldExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVNldENoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlCYWdDaGFuZ2UoKSB7Ci0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCAiZm9vIik7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChBREQsICJmb28iKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgImpvbyIpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChBREQsIG51bGwpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChBREQsIG51bGwpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLnJlbW92ZSgiam9vIik7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoUkVNT1ZFLCAiam9vIik7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKG51bGwpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KFJFTU9WRSwgbnVsbCk7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuc2V0Q29sbGVjdGlvbih0aGlzLmJ1aWxkQmFnKCkpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KENIQU5HRSk7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRCYWcoKSk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRCYWcoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJhZ0V2ZW50Lml0ZW1zKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2V0Q2hhbmdlKCkgewotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KEFERCwgImpvbyIpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZChudWxsKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChBREQsIG51bGwpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50VHlwZSk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlKCJqb28iKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChSRU1PVkUsICJqb28iKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUoImpvbyIpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5U2V0RXZlbnQoUkVNT1ZFLCBudWxsKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5zZXRDb2xsZWN0aW9uKHRoaXMuYnVpbGRTZXQoKSk7Ci0JCXRoaXMudmVyaWZ5U2V0RXZlbnQoQ0hBTkdFKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5hZGRBbGwodGhpcy5idWlsZFNldCgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50VHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRCYWdMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50VHlwZSA9IEFERDsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50VHlwZSA9IENIQU5HRTsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkU2V0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudFR5cGUgPSBBREQ7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudFR5cGUgPSBSRU1PVkU7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50VHlwZSA9IENMRUFSOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5QmFnRXZlbnQoU3RyaW5nIGV2ZW50VHlwZSkgewotCQlhc3NlcnRFcXVhbHMoZXZlbnRUeXBlLCB0aGlzLmJhZ0V2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZ0hvbGRlciwgdGhpcy5iYWdFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYmFnRXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUJhZ0V2ZW50KFN0cmluZyBldmVudFR5cGUsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sIHRoaXMuYmFnRXZlbnQuaXRlbXMoKS5uZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXRFdmVudChTdHJpbmcgZXZlbnRUeXBlKSB7Ci0JCWFzc2VydEVxdWFscyhldmVudFR5cGUsIHRoaXMuc2V0RXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc2V0SG9sZGVyLCB0aGlzLnNldEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5zZXRFdmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2V0RXZlbnQoU3RyaW5nIGV2ZW50VHlwZSwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChldmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHMoaXRlbSwgdGhpcy5zZXRFdmVudC5pdGVtcygpLm5leHQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWY1NGMxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjsKLQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0JU3RyaW5nIGV2ZW50VHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0UgPSAicmVwbGFjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkUgPSAibW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSID0gImNsZWFyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7Ci0KLQkKLQlwdWJsaWMgU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiZm9vIik7Ci0JCXJlc3VsdC5hZGQoImJhciIpOwotCQlyZXN1bHQuYWRkKCJiYXoiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZEFkZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiam9vIik7Ci0JCXJlc3VsdC5hZGQoImphciIpOwotCQlyZXN1bHQuYWRkKCJqYXoiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLS8vCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkUmVtb3ZlTGlzdCgpIHsKLS8vCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0vLwkJcmVzdWx0LmFkZCgiZm9vIik7Ci0vLwkJcmVzdWx0LmFkZCgiYmFyIik7Ci0vLwkJcmV0dXJuIHJlc3VsdDsKLS8vCX0KLS8vCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmJ1aWxkTGlzdCgpLmxpc3RJdGVyYXRvcigxKSksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoMSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpLCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSwgaXRlbXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCVNldDxTdHJpbmc+IHNldCA9IENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCkpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gaXRlbXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoc2V0LmNvbnRhaW5zKHN0cmVhbS5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3QoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJqb28iKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJqb28iKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW50T2JqZWN0KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiam9vIikpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDIsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiam9vIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgwLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb24oKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zQW55KHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZEFsbCh0aGlzLmJ1aWxkQWRkTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWluc0FsbCh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbEludENvbGxlY3Rpb24oKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zQW55KHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZEFsbCgyLCB0aGlzLmJ1aWxkQWRkTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWluc0FsbCh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuaXNFbXB0eSgpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmNsZWFyKCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0SG9sZGVyLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT2JqZWN0KCkgewotCQlhc3NlcnRUcnVlKHRoaXMubGlzdEhvbGRlci5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuY29udGFpbnMoImpvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiZm9vIik7Ci0JCWMuYWRkKCJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RIb2xkZXIuY29udGFpbnNBbGwoYykpOwotCi0JCWMuYWRkKCJqb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlhc3NlcnRFcXVhbHMobmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QoKSksIHRoaXMubGlzdEhvbGRlcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5lcXVhbHMobmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZEFkZExpc3QoKSkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5lcXVhbHMobmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnQoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5saXN0SG9sZGVyLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5saXN0SG9sZGVyLmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5saXN0SG9sZGVyLmdldCgyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlhc3NlcnRFcXVhbHMobmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QoKSkuaGFzaENvZGUoKSwgdGhpcy5saXN0SG9sZGVyLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5saXN0SG9sZGVyLmluZGV4T2YoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMubGlzdEhvbGRlci5pbmRleE9mKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmxpc3RIb2xkZXIuaW5kZXhPZigiYmF6IikpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHRoaXMubGlzdEhvbGRlci5pbmRleE9mKCJqb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5saXN0SG9sZGVyLmxhc3RJbmRleE9mKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMubGlzdEhvbGRlci5sYXN0SW5kZXhPZigiYmF6IikpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHRoaXMubGlzdEhvbGRlci5sYXN0SW5kZXhPZigiam9vIikpOwotCi0JCXRoaXMubGlzdEhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5saXN0SG9sZGVyLmxhc3RJbmRleE9mKCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5pc0VtcHR5KCkpOwotCQl0aGlzLmxpc3RIb2xkZXIuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RIb2xkZXIuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJiYXIiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUodGhpcy5idWlsZExpc3QoKS5pbmRleE9mKCJiYXIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJiYXIiKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgxLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVzKCkgewotCQlMaXN0PFN0cmluZz4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQluZXdMaXN0LmFkZCgiam9vIik7Ci0JCW5ld0xpc3QuYWRkKCJqYXIiKTsKLQkJbmV3TGlzdC5hZGQoImpheiIpOwotCi0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImphciIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnNldExpc3QobmV3TGlzdCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMoImphciIpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCi0JCXRoaXMubGlzdEhvbGRlci5zZXRMaXN0KG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImphciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZTEoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZTIoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgMSwgImpvbyIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCAxLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgMSwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDEsICJqb28iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuc2V0TGlzdCh0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChDSEFOR0UpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMCwgdGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuZXZlbnQuaXRlbXMoKSkpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5zZXQoMCwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFUExBQ0UpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5ldmVudC5pdGVtcygpLCAiZm9vIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmV2ZW50Lml0ZW1zKCksICJqb28iKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IEFERDsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRVBMQUNFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IE1PVkU7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENMRUFSOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKGUsIHRoaXMuZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdEhvbGRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIGUsIGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcy52ZXJpZnlFdmVudChlKTsKLQkJYXNzZXJ0RXF1YWxzKGluZGV4LCB0aGlzLmV2ZW50LmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoaXRlbSwgdGhpcy5ldmVudC5pdGVtcygpLm5leHQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YmVhMjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBvYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCQotCXB1YmxpYyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiZm9vIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgiZm9vIiwgImJhciIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgiYmFyIiwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudChudWxsLCAiYmF6Iik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgdGhpcy5ldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCB0aGlzLmV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODY3ZDIyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZXZlcnNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb25Ib2xkZXI7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb247Ci0KLQkKLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbiA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb24pOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0KENvbGxlY3Rpb248U3RyaW5nPiBleHBlY3RlZCwgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBhY3R1YWwpIHsKLQkJdGhpcy52ZXJpZnlMaXN0KGV4cGVjdGVkLCBhY3R1YWwsIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0KENvbGxlY3Rpb248U3RyaW5nPiBleHBlY3RlZCwgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBhY3R1YWwsIENvbXBhcmF0b3I8U3RyaW5nPiBjb21wYXJhdG9yKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzb3J0ZWRTZXQgPSBuZXcgVHJlZVNldDxTdHJpbmc+KGNvbXBhcmF0b3IpOwotCQlzb3J0ZWRTZXQuYWRkQWxsKGV4cGVjdGVkKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihzb3J0ZWRTZXQpOwotCQlMaXN0PFN0cmluZz4gYWN0dWFsTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KGFjdHVhbC5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTGlzdCwgYWN0dWFsTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYWRhcHRlci5zaXplKCkpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImpheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy53cmFwcGVkQ29sbGVjdGlvbi5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29tcGFyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIuc2V0Q29tcGFyYXRvcihuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlciwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHN5bmNoTGlzdCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCWNsYXNzIFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyODM5ZTIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IENPTExFQ1RJT04gPSBidWlsZENvbGxlY3Rpb24oKTsKLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXI7Ci0KLQotCXB1YmxpYyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KENPTExFQ1RJT04pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyhidWlsZENvbGxlY3Rpb24oKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoYnVpbGRDb2xsZWN0aW9uKCkuc2l6ZSgpLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZGQ5ZWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IExJU1QgPSBidWlsZExpc3QoKTsKLQlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjsKLQotCi0JcHVibGljIFN0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3IFN0YXRpY0xpc3RWYWx1ZU1vZGVsPFN0cmluZz4oTElTVCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IGJ1aWxkTGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubGlzdEhvbGRlci5zaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldChpKSwgdGhpcy5saXN0SG9sZGVyLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyhidWlsZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyhidWlsZExpc3QoKS5zaXplKCksIHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTRlNzEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFN0YXRpY1ZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG9iamVjdEhvbGRlcjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBPQkpFQ1RfSE9MREVSID0gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJmb28iKTsKLQotCQotCXB1YmxpYyBTdGF0aWNWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBPQkpFQ1RfSE9MREVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKHRoaXMub2JqZWN0SG9sZGVyLnRvU3RyaW5nKCkuaW5kZXhPZigiZm9vIikgPj0gMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTQ3ODUzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IHRyYW5zZm9ybWVkTGlzdEhvbGRlcjsKLQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0JU3RyaW5nIGV2ZW50VHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0UgPSAicmVwbGFjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkUgPSAibW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSID0gImNsZWFyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7Ci0KLQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1lZExpc3RIb2xkZXIodGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiZm9vIik7Ci0JCXJlc3VsdC5hZGQoImJhciIpOwotCQlyZXN1bHQuYWRkKCJiYXoiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFRyYW5zZm9ybWVkTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHRyYW5zZm9ybShMaXN0PFN0cmluZz4gbGlzdCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogbGlzdCkgewotCQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0LmFkZChudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0LmFkZChzdHJpbmcudG9VcHBlckNhc2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZEFkZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiam9vIik7Ci0JCXJlc3VsdC5hZGQoImphciIpOwotCQlyZXN1bHQuYWRkKCJqYXoiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFRyYW5zZm9ybWVkQWRkTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCX0KLQotLy8JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRSZW1vdmVMaXN0KCkgewotLy8JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLS8vCQlyZXN1bHQuYWRkKCJmb28iKTsKLS8vCQlyZXN1bHQuYWRkKCJiYXIiKTsKLS8vCQlyZXR1cm4gcmVzdWx0OwotLy8JfQotLy8KLS8vCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZWRSZW1vdmVMaXN0KCkgewotLy8JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLmJ1aWxkUmVtb3ZlTGlzdCgpKTsKLS8vCX0KLS8vCi0JTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRyYW5zZm9ybWVkTGlzdEhvbGRlcihMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZywgU3RyaW5nPihsdm0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm1JdGVtKFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IHMudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRUcmFuc2Zvcm1lZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlcygpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFRyYW5zZm9ybWVkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFRyYW5zZm9ybWVkTGlzdCgpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB0cmFuc2Zvcm1lZExpc3RDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB0cmFuc2Zvcm1lZExpc3RDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHRyYW5zZm9ybWVkTGlzdENvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlMaXN0PFN0cmluZz4gdHJhbnNmb3JtZWRMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmICh0cmFuc2Zvcm1lZExpc3QuY29udGFpbnMoc3RyZWFtLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucygiSk9PIikpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDIsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKCJKT08iKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMCwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWluc0FueSh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRBZGRMaXN0KCkpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZEFsbCgyLCB0aGlzLmJ1aWxkQWRkTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zQWxsKHRoaXMuYnVpbGRUcmFuc2Zvcm1lZEFkZExpc3QoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydFRydWUodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucygiQkFSIikpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKHRoaXMuYnVpbGRMaXN0KCkuaW5kZXhPZigiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKCJCQVIiKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgxLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VHZW5lcmljKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZU5hbWVkKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgMSwgIkpPTyIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCAxLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgMSwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDEsICJKT08iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDAsIHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuZXZlbnQuaXRlbXMoKSkpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5zZXQoMCwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFUExBQ0UpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5ldmVudC5pdGVtcygpLCAiRk9PIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmV2ZW50Lml0ZW1zKCksICJKT08iKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IEFERDsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRVBMQUNFOwotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IE1PVkU7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENMRUFSOwotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIHR5cGUpIHsKLQkJYXNzZXJ0RXF1YWxzKHR5cGUsIHRoaXMuZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgdHlwZSwgaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQl0aGlzLnZlcmlmeUV2ZW50KHR5cGUpOwotCQlhc3NlcnRFcXVhbHMoaW5kZXgsIHRoaXMuZXZlbnQuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCB0aGlzLmV2ZW50Lml0ZW1zKCkubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQkvKgotCQkgKiBhZGRpbmcgbGlzdGVuZXJzIHRvIHRoZSB0cmFuc2Zvcm1lZCBsaXN0IHdpbGwgY2F1c2UgbGlzdGVuZXJzCi0JCSAqIHRvIGJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3Q7Ci0JCSAqIGxpa2V3aXNlLCByZW1vdmluZyBsaXN0ZW5lcnMgZnJvbSB0aGUgdHJhbnNmb3JtZWQgbGlzdCB3aWxsCi0JCSAqIGNhdXNlIGxpc3RlbmVycyB0byBiZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdAotCQkgKi8KLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCi0JLyoqCi0JICogZXhlY3V0ZSB0aGUgc2FtZSBzZXQgb2YgdGVzdHMgYWdhaW4sIGJ1dCBieSBwYXNzaW5nIGEgVHJhbnNmb3JtZXIgdG8gdGhlIGFkYXB0ZXIKLQkgKiAoYXMgb3Bwb3NlZCB0byBvdmVycmlkaW5nICN0cmFuc2Zvcm1JdGVtKE9iamVjdCkpCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUcmFuc2Zvcm1lclRlc3RzIGV4dGVuZHMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyB7Ci0JCXB1YmxpYyBUcmFuc2Zvcm1lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRyYW5zZm9ybWVkTGlzdEhvbGRlcihMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmcsIFN0cmluZz4obHZtLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JCX0KLQkJcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzKSB7Ci0JCQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBzLnRvVXBwZXJDYXNlKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDg3ZTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCB0cmFuc2Zvcm1hdGlvbkV2ZW50OwotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oImZvbyIpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyID0gbmV3IFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nLCBTdHJpbmc+KHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBCaWRpVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgQmlkaVRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IHMudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgcmV2ZXJzZVRyYW5zZm9ybShTdHJpbmcgcykgewotCQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBzLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsICJGT08iLCAiQkFSIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJhciIsICJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsICJCQVIiLCAiQkFaIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJGb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJheiIsICJGb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsICJCQVoiLCAiRk9PIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJGT08iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgIkZvbyIsICJGT08iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgIkZPTyIsIG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkZPTyIsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG51bGwsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsIG51bGwsICJCQVIiKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlQXNwZWN0QWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVBc3BlY3RBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1OTc1MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVBc3BlY3RBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmVlQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUcmVlQXNwZWN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JcHJpdmF0ZSBUcmVlQXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgVGVzdE5vZGVbXT4gYWExOwotCXByaXZhdGUgVHJlZUNoYW5nZUV2ZW50IGV2ZW50MTsKLQlwcml2YXRlIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0KLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JCi0JcHVibGljIFRyZWVBc3BlY3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQlUZXN0Tm9kZSByb290LCBub2RlOwotCi0JCXJvb3QgPSB0aGlzLnN1YmplY3QxLmdldFJvb3ROYW1lTm9kZSgpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGROYW1lKHJvb3QsICJuYW1lIDEuMSIpOwotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWUobm9kZSwgIm5hbWUgMS4xLjEiKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lKG5vZGUsICJuYW1lIDEuMS4yIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZE5hbWUocm9vdCwgIm5hbWUgMS4yIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZShub2RlLCAibmFtZSAxLjIuMSIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGROYW1lKHJvb3QsICJuYW1lIDEuMyIpOwotCi0JCXJvb3QgPSB0aGlzLnN1YmplY3QxLmdldFJvb3REZXNjcmlwdGlvbk5vZGUoKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24ocm9vdCwgImRlc2NyaXB0aW9uIDEuMSIpOwotCQl0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAxLjEuMSIpOwotCQl0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAxLjEuMiIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbihyb290LCAiZGVzY3JpcHRpb24gMS4yIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDEuMi4xIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKHJvb3QsICJkZXNjcmlwdGlvbiAxLjMiKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4odGhpcy5zdWJqZWN0MSk7Ci0JCXRoaXMuYWExID0gdGhpcy5idWlsZEFzcGVjdEFkYXB0ZXIodGhpcy5zdWJqZWN0SG9sZGVyMSk7Ci0JCXRoaXMubGlzdGVuZXIxID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0KLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCgpOwotCi0JCXJvb3QgPSB0aGlzLnN1YmplY3QyLmdldFJvb3ROYW1lTm9kZSgpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGROYW1lKHJvb3QsICJuYW1lIDIuMSIpOwotCQl0aGlzLnN1YmplY3QyLmFkZE5hbWUobm9kZSwgIm5hbWUgMi4xLjEiKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGROYW1lKG5vZGUsICJuYW1lIDIuMS4yIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZE5hbWUocm9vdCwgIm5hbWUgMi4yIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkTmFtZShub2RlLCAibmFtZSAyLjIuMSIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGROYW1lKHJvb3QsICJuYW1lIDIuMyIpOwotCi0JCXJvb3QgPSB0aGlzLnN1YmplY3QyLmdldFJvb3REZXNjcmlwdGlvbk5vZGUoKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24ocm9vdCwgImRlc2NyaXB0aW9uIDIuMSIpOwotCQl0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAyLjEuMSIpOwotCQl0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAyLjEuMiIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbihyb290LCAiZGVzY3JpcHRpb24gMi4yIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDIuMi4xIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKHJvb3QsICJkZXNjcmlwdGlvbiAyLjMiKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBUZXN0Tm9kZVtdPiBidWlsZEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJlZUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFRlc3ROb2RlW10+KHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVTX1RSRUUpIHsKLQkJCS8vIHRoaXMgaXMgbm90IGEgdHlwaWNhbCBhc3BlY3QgYWRhcHRlciAtIHRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhc3BlY3QgbmFtZQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8VGVzdE5vZGVbXT4gbm9kZXNfKCkgewotCQkJCWlmICh0aGlzLnRyZWVOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19UUkVFKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZVBhdGhzKCk7Ci0JCQkJfQotCQkJCWlmICh0aGlzLnRyZWVOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfVFJFRSkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmRlc2NyaXB0aW9uUGF0aHMoKTsKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMudHJlZU5hbWVzWzBdKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdmFsdWUxQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmV2ZW50MSA9IGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgewotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5ldmVudDEuZ2V0VHJlZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmV2ZW50MS5nZXRQYXRoKCkubGVuZ3RoKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoVHJlZVZhbHVlTW9kZWwuTk9ERVMsIHRoaXMuZXZlbnQxLmdldFRyZWVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5ldmVudDEuZ2V0UGF0aCgpLmxlbmd0aCk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0MSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLmV2ZW50MS5nZXRUcmVlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuZXZlbnQxLmdldFBhdGgoKS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlU3RydWN0dXJlQ2hhbmdlKCkgewotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLmFkZFR3b05hbWVzKHRoaXMuc3ViamVjdDEuZ2V0Um9vdE5hbWVOb2RlKCksICJqYW0iLCAiamF6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLmV2ZW50MS5nZXRUcmVlTmFtZSgpKTsKLQkJT2JqZWN0W10gcGF0aCA9IHRoaXMuZXZlbnQxLmdldFBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDEuZ2V0Um9vdE5hbWVOb2RlKCksIHBhdGhbcGF0aC5sZW5ndGggLSAxXSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5jb250YWluc05hbWVOb2RlKCJqYW0iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5jb250YWluc05hbWVOb2RlKCJqYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vZGVzKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5jb252ZXJ0VG9OYW1lcyh0aGlzLnN1YmplY3QxLm5hbWVQYXRocygpKSwgdGhpcy5jb252ZXJ0VG9OYW1lcyh0aGlzLmFhMS5ub2RlcygpKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gY29udmVydFRvTmFtZXMoSXRlcmF0b3I8VGVzdE5vZGVbXT4gbmFtZVBhdGhzKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXdoaWxlIChuYW1lUGF0aHMuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3RbXSBwYXRoID0gbmFtZVBhdGhzLm5leHQoKTsKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNiLmFwcGVuZCgnWycpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2IuYXBwZW5kKCgoVGVzdE5vZGUpIHBhdGhbaV0pLmdldFRleHQoKSk7Ci0JCQkJaWYgKGkgPCBwYXRoLmxlbmd0aCAtIDEpIHsKLQkJCQkJc2IuYXBwZW5kKCc6Jyk7Ci0JCQkJfQotCQkJfQotCQkJc2IuYXBwZW5kKCddJyk7Ci0JCQlyZXN1bHQuYWRkKHNiLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRyZWVWYWx1ZU1vZGVsLk5PREVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX1RSRUUpKTsKLQkJdGhpcy5hYTEucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19UUkVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVHJlZVZhbHVlTW9kZWwuTk9ERVMpKTsKLQotCQlUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVHJlZVZhbHVlTW9kZWwuTk9ERVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfVFJFRSkpOwotCQl0aGlzLmFhMS5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX1RSRUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUcmVlVmFsdWVNb2RlbC5OT0RFUykpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBjbGFzcyBUZXN0U3ViamVjdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFRlc3ROb2RlIHJvb3ROYW1lTm9kZTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNfVFJFRSA9ICJuYW1lcyI7Ci0JCXByaXZhdGUgVGVzdE5vZGUgcm9vdERlc2NyaXB0aW9uTm9kZTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05TX1RSRUUgPSAiZGVzY3JpcHRpb25zIjsKLQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KCkgewotCQkJdGhpcy5yb290TmFtZU5vZGUgPSBuZXcgVGVzdE5vZGUoInJvb3QgbmFtZSIpOwotCQkJdGhpcy5yb290RGVzY3JpcHRpb25Ob2RlID0gbmV3IFRlc3ROb2RlKCJyb290IGRlc2NyaXB0aW9uIik7Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIGdldFJvb3ROYW1lTm9kZSgpIHsKLQkJCXJldHVybiB0aGlzLnJvb3ROYW1lTm9kZTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8VGVzdE5vZGU+IG5hbWVOb2RlcygpIHsKLQkJCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPFRlc3ROb2RlPih0aGlzLnJvb3ROYW1lTm9kZSkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZT4gY2hpbGRyZW4oVGVzdE5vZGUgbmV4dCkgewotCQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPFRlc3ROb2RlW10+IG5hbWVQYXRocygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUZXN0Tm9kZSwgVGVzdE5vZGVbXT4odGhpcy5uYW1lTm9kZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBUZXN0Tm9kZVtdIHRyYW5zZm9ybShUZXN0Tm9kZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBuZXh0LnBhdGgoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZSBhZGROYW1lKFRlc3ROb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCVRlc3ROb2RlIGNoaWxkID0gbmV3IFRlc3ROb2RlKG5hbWUpOwotCQkJcGFyZW50LmFkZENoaWxkKGNoaWxkKTsKLQkJCXRoaXMuZmlyZU5vZGVBZGRlZChOQU1FU19UUkVFLCBjaGlsZC5wYXRoKCkpOwotCQkJcmV0dXJuIGNoaWxkOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFR3b05hbWVzKFRlc3ROb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLQkJCXBhcmVudC5hZGRDaGlsZChuZXcgVGVzdE5vZGUobmFtZTEpKTsKLQkJCXBhcmVudC5hZGRDaGlsZChuZXcgVGVzdE5vZGUobmFtZTIpKTsKLQkJCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKE5BTUVTX1RSRUUsIHBhcmVudC5wYXRoKCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVOb2RlKFRlc3ROb2RlIG5hbWVOb2RlKSB7Ci0JCQluYW1lTm9kZS5nZXRQYXJlbnQoKS5yZW1vdmVDaGlsZChuYW1lTm9kZSk7Ci0JCQl0aGlzLmZpcmVOb2RlUmVtb3ZlZChOQU1FU19UUkVFLCBuYW1lTm9kZS5wYXRoKCkpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zTmFtZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiB0aGlzLm5hbWVOb2RlKG5hbWUpICE9IG51bGw7Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIG5hbWVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFRlc3ROb2RlPiBzdHJlYW0gPSB0aGlzLm5hbWVOb2RlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlUZXN0Tm9kZSBub2RlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAobm9kZS5nZXRUZXh0KCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZSBnZXRSb290RGVzY3JpcHRpb25Ob2RlKCkgewotCQkJcmV0dXJuIHRoaXMucm9vdERlc2NyaXB0aW9uTm9kZTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8VGVzdE5vZGU+IGRlc2NyaXB0aW9uTm9kZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvcjxUZXN0Tm9kZT4odGhpcy5yb290RGVzY3JpcHRpb25Ob2RlKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIEl0ZXJhdG9yPFRlc3ROb2RlPiBjaGlsZHJlbihUZXN0Tm9kZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8VGVzdE5vZGVbXT4gZGVzY3JpcHRpb25QYXRocygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUZXN0Tm9kZSwgVGVzdE5vZGVbXT4odGhpcy5kZXNjcmlwdGlvbk5vZGVzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgVGVzdE5vZGVbXSB0cmFuc2Zvcm0oVGVzdE5vZGUgbmV4dCkgewotCQkJCQlyZXR1cm4gbmV4dC5wYXRoKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlwdWJsaWMgVGVzdE5vZGUgYWRkRGVzY3JpcHRpb24oVGVzdE5vZGUgcGFyZW50LCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCVRlc3ROb2RlIGNoaWxkID0gbmV3IFRlc3ROb2RlKGRlc2NyaXB0aW9uKTsKLQkJCXBhcmVudC5hZGRDaGlsZChjaGlsZCk7Ci0JCQl0aGlzLmZpcmVOb2RlQWRkZWQoREVTQ1JJUFRJT05TX1RSRUUsIGNoaWxkLnBhdGgoKSk7Ci0JCQlyZXR1cm4gY2hpbGQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRpb25Ob2RlKFRlc3ROb2RlIGRlc2NyaXB0aW9uTm9kZSkgewotCQkJZGVzY3JpcHRpb25Ob2RlLmdldFBhcmVudCgpLnJlbW92ZUNoaWxkKGRlc2NyaXB0aW9uTm9kZSk7Ci0JCQl0aGlzLmZpcmVOb2RlUmVtb3ZlZChERVNDUklQVElPTlNfVFJFRSwgZGVzY3JpcHRpb25Ob2RlLnBhdGgoKSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnNEZXNjcmlwdGlvbk5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCWZvciAoSXRlcmF0b3I8VGVzdE5vZGU+IHN0cmVhbSA9IHRoaXMuZGVzY3JpcHRpb25Ob2RlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlUZXN0Tm9kZSBub2RlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAobm9kZS5nZXRUZXh0KCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFRlc3ROb2RlIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGV4dDsKLQkJcHJpdmF0ZSBUZXN0Tm9kZSBwYXJlbnQ7Ci0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxUZXN0Tm9kZT4gY2hpbGRyZW47Ci0JCi0JCXB1YmxpYyBUZXN0Tm9kZShTdHJpbmcgdGV4dCkgewotCQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJCXRoaXMuY2hpbGRyZW4gPSBuZXcgSGFzaEJhZzxUZXN0Tm9kZT4oKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXh0OwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIHNldFBhcmVudChUZXN0Tm9kZSBwYXJlbnQpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZT4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8VGVzdE5vZGU+KHRoaXMuY2hpbGRyZW4pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFRlc3ROb2RlIGNoaWxkKSB7Ci0JCQl0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoVGVzdE5vZGUgY2hpbGQpIHsKLQkJCXRoaXMuY2hpbGRyZW4ucmVtb3ZlKGNoaWxkKTsKLQkJfQotCQlwdWJsaWMgVGVzdE5vZGVbXSBwYXRoKCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdCh0aGlzLmJ1aWxkQW50aVBhdGgoKSkudG9BcnJheShuZXcgVGVzdE5vZGVbMF0pOwotCQl9Ci0JCXByaXZhdGUgSXRlcmF0b3I8VGVzdE5vZGU+IGJ1aWxkQW50aVBhdGgoKSB7Ci0JCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8VGVzdE5vZGU+KHRoaXMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgVGVzdE5vZGUgbmV4dExpbmsoVGVzdE5vZGUgY3VycmVudExpbmspIHsKLQkJCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3ROb2RlKCIgKyB0aGlzLnRleHQgKyAiKSI7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3YmFiNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVDb2xsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGp1bms7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4ganVua0hvbGRlcjsKLQlwcml2YXRlIFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXI8SnVuaz4ganVua0hvbGRlcjI7Ci0KLQotCXB1YmxpYyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVDb2xsZWN0aW9uQWRhcHRlcjxKdW5rPih0aGlzLmp1bmtIb2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwcGVkUFZNKCkgewotCQlKdW5rIGp1bmsyID0gbmV3IEp1bmsoImJhciIpOwotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCB0aGlzLmp1bmssIGp1bmsyKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmtIb2xkZXIuc2V0VmFsdWUoanVuazIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVuay5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkFkZCgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLmFkZFN0dWZmKCJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25SZW1vdmUoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5yZW1vdmVTdHVmZigiZm9vIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbExpc3RlbmVyIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgU3RhdGVDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmVudFJlY2VpdmVkID0gZmFsc2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHNvdXJjZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UpIHsKLQkJCXRoaXMoc291cmNlLCBudWxsLCBudWxsKTsKLQkJfQotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5vbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnROdWxsKGUuZ2V0QXNwZWN0TmFtZSgpKTsKLQkJfQotCQlib29sZWFuIGV2ZW50UmVjZWl2ZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudFJlY2VpdmVkOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3R1ZmY7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVGRl9DT0xMRUNUSU9OID0gInN0dWZmIjsKLQotCQlwdWJsaWMgSnVuayhTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnN0dWZmID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQl0aGlzLnN0dWZmLmFkZChzdHVmZkl0ZW0pOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIGFkZFN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihzdHVmZkl0ZW0sIHRoaXMuc3R1ZmYsIFNUVUZGX0NPTExFQ1RJT04pOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihzdHVmZkl0ZW0sIHRoaXMuc3R1ZmYsIFNUVUZGX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLnN0dWZmICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlTGlzdEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwNTBkOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlTGlzdEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVMaXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBWYWx1ZUxpc3RBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGp1bms7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4ganVua0hvbGRlcjsKLQlwcml2YXRlIFZhbHVlTGlzdEFkYXB0ZXI8SnVuaz4ganVua0hvbGRlcjI7Ci0KLQotCQotCXB1YmxpYyBWYWx1ZUxpc3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVMaXN0QWRhcHRlcjxKdW5rPih0aGlzLmp1bmtIb2xkZXIsIEp1bmsuU1RVRkZfTElTVCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwcGVkUFZNKCkgewotCQlKdW5rIGp1bmsyID0gbmV3IEp1bmsoImJhciIpOwotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCB0aGlzLmp1bmssIGp1bmsyKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmtIb2xkZXIuc2V0VmFsdWUoanVuazIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVuay5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEFkZCgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsuYWRkU3R1ZmYoImJhciIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFJlbW92ZSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsucmVtb3ZlU3R1ZmYoImZvbyIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFJlcGxhY2UoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLnJlcGxhY2VTdHVmZigiZm9vIiwgImJhciIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgTG9jYWxMaXN0ZW5lciBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgewotCQlwcml2YXRlIGJvb2xlYW4gZXZlbnRSZWNlaXZlZCA9IGZhbHNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMub2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5uZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0TnVsbChlLmdldEFzcGVjdE5hbWUoKSk7Ci0JCX0KLQkJYm9vbGVhbiBldmVudFJlY2VpdmVkKCkgewotCQkJcmV0dXJuIHRoaXMuZXZlbnRSZWNlaXZlZDsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdHVmZjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUZGX0xJU1QgPSAic3R1ZmYiOwotCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgYWRkU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfTElTVCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfTElTVCk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcmVwbGFjZVN0dWZmKFN0cmluZyBvbGRTdHVmZkl0ZW0sIFN0cmluZyBuZXdTdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVwbGFjZUl0ZW1Jbkxpc3Qob2xkU3R1ZmZJdGVtLCBuZXdTdHVmZkl0ZW0sIHRoaXMuc3R1ZmYsIFNUVUZGX0xJU1QpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLnN0dWZmICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjgzMmM4YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVQcm9wZXJ0eUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsganVuazsKLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPiBqdW5rSG9sZGVyOwotCXByaXZhdGUgVmFsdWVQcm9wZXJ0eUFkYXB0ZXI8SnVuaz4ganVua0hvbGRlcjI7Ci0KLQotCXB1YmxpYyBWYWx1ZVByb3BlcnR5QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuanVuayA9IG5ldyBKdW5rKCJmb28iKTsKLQkJdGhpcy5qdW5rSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPih0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyID0gbmV3IFZhbHVlUHJvcGVydHlBZGFwdGVyPEp1bms+KHRoaXMuanVua0hvbGRlciwgSnVuay5OQU1FX1BST1BFUlRZKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBwZWRQVk0oKSB7Ci0JCUp1bmsganVuazIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIHRoaXMuanVuaywganVuazIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVua0hvbGRlci5zZXRWYWx1ZShqdW5rMik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoSnVuay5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVuay5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhKdW5rLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEp1bmsuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VQcm9wZXJ0eSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbExpc3RlbmVyIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgU3RhdGVDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmVudFJlY2VpdmVkID0gZmFsc2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHNvdXJjZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UpIHsKLQkJCXRoaXMoc291cmNlLCBudWxsLCBudWxsKTsKLQkJfQotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5vbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnROdWxsKGUuZ2V0QXNwZWN0TmFtZSgpKTsKLQkJfQotCQlib29sZWFuIGV2ZW50UmVjZWl2ZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudFJlY2VpdmVkOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZGZlZTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlZhbHVlU3RhdGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFZhbHVlU3RhdGVBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGp1bms7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4ganVua0hvbGRlcjsKLQlwcml2YXRlIFZhbHVlU3RhdGVBZGFwdGVyPEp1bms+IGp1bmtIb2xkZXIyOwotCi0KLQlwdWJsaWMgVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmp1bmsgPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuanVua0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4odGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMiA9IG5ldyBWYWx1ZVN0YXRlQWRhcHRlcjxKdW5rPih0aGlzLmp1bmtIb2xkZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZFBWTSgpIHsKLQkJSnVuayBqdW5rMiA9IG5ldyBKdW5rKCJiYXIiKTsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgdGhpcy5qdW5rLCBqdW5rMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rSG9sZGVyLnNldFZhbHVlKGp1bmsyKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVN0YXRlKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgTG9jYWxMaXN0ZW5lciBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgewotCQlwcml2YXRlIGJvb2xlYW4gZXZlbnRSZWNlaXZlZCA9IGZhbHNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMub2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5uZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0TnVsbChlLmdldEFzcGVjdE5hbWUoKSk7Ci0JCX0KLQkJYm9vbGVhbiBldmVudFJlY2VpdmVkKCkgewotCQkJcmV0dXJuIHRoaXMuZXZlbnRSZWNlaXZlZDsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCQlwdWJsaWMgSnVuayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL0pwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDNkYTA3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY5Y2FlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnMuUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgUHJlZmVyZW5jZXNUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4gbm9kZUhvbGRlcjsKLQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gcHJlZmVyZW5jZUFkYXB0ZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCWJvb2xlYW4gbGlzdGVuZXJSZW1vdmVkID0gZmFsc2U7Ci0JUHJlZmVyZW5jZUNoYW5nZUV2ZW50IHByZWZlcmVuY2VFdmVudDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUUgPSAiZm9vIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1ZBTFVFID0gIm9yaWdpbmFsIHN0cmluZyB2YWx1ZSI7Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUpOwotCi0JCXRoaXMubm9kZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+KHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyID0gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm5vZGVIb2xkZXIsIEtFWV9OQU1FKTsKLQkJdGhpcy5saXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgIT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCQl9Ci0JCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gInNvbWUgb3RoZXIgdmFsdWUiOwotCQlQcmVmZXJlbmNlcyBhbm90aGVyTm9kZSA9IHRoaXMuY2xhc3NOb2RlLm5vZGUoImFub3RoZXIgdGVzdCBub2RlIik7Ci0JCWFub3RoZXJOb2RlLnB1dChLRVlfTkFNRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZShhbm90aGVyTm9kZSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhBTk9USEVSX1NUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQU5PVEhFUl9TVFJJTkdfVkFMVUUsIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsIFNUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZWZlcmVuY2VDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFICsgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIFNUUklOR19WQUxVRSArIFNUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUgKyBTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSArIFNUUklOR19WQUxVRSwgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChudWxsLCBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgIjxtaXNzaW5nIHByZWZlcmVuY2U+IikpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUUgPSAic29tZSBvdGhlciB2YWx1ZSI7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuc2V0VmFsdWUoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoQU5PVEhFUl9TVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBTk9USEVSX1NUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsICI8bWlzc2luZyBwcmVmZXJlbmNlPiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbmRSZUFkZFByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQkvLyByZW1vdmUgdGhlIHByZWZlcmVuY2UgZW50aXJlbHkuLi4KLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlhc3NlcnROdWxsKHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCBudWxsKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCS8vIC4uLnRoZW4gcmUtYWRkIGl0IHdpdGggdGhlIHNhbWUga2V5Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChudWxsLCBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gcmVidWlsZCB0aGUgYWRhcHRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZQotCQlTdHJpbmcgREVGQVVMVF9WQUxVRSA9ICJkZWZhdWx0IHZhbHVlIjsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIgPSBuZXcgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMubm9kZUhvbGRlciwgS0VZX05BTUUsIERFRkFVTFRfVkFMVUUpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCS8vIHJlbW92ZSB0aGUgcHJlZmVyZW5jZSBlbnRpcmVseS4uLgotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydE51bGwodGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIERFRkFVTFRfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoREVGQVVMVF9WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQkvLyAuLi50aGVuIHJlLWFkZCBpdCB3aXRoIHRoZSBzYW1lIGtleQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCBudWxsKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoREVGQVVMVF9WQUxVRSwgU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCS8vIHJlbW92ZSB0aGUgdGhpcy5saXN0ZW5lciBzbyB0aGUgYWRhcHRlciBubyBsb25nZXIgbGlzdGVucyB0byB0aGUgcHJlZmVyZW5jZQotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFICsgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJLy8gbm8gdGhpcy5ldmVudCBzaG91bGQgaGF2ZSBiZWVuIGZpcmVkLi4uCi0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCS8vIC4uLmFuZCB0aGUgYWRhcHRlcidzIHZhbHVlIHNob3VsZCBiZSBudWxsCi0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMudGVzdE5vZGUucmVtb3ZlKEtFWV9OQU1FKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQkvLyBhZGQgdGhlIHRoaXMubGlzdGVuZXIgc28gdGhlIGFkYXB0ZXIgc3luY2hzCi0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBzdG9wIGxpc3RlbmluZyB0byB0aGUgbm9kZSBhbmQgY29udmVydCBpdCB0byBhbiBpbnRlZ2VyCi0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCi0JCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyID0gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4odGhpcy5ub2RlSG9sZGVyLCBLRVlfTkFNRSk7Ci0JCXRoaXMudGVzdE5vZGUucHV0SW50KEtFWV9OQU1FLCAxMjMpOwotCQlpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIgPSBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsLmZvckludGVnZXIodGhpcy50ZXN0Tm9kZSwgS0VZX05BTUUsIDApOwotCQlpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIzKSwgaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMudGVzdE5vZGUucHV0SW50KEtFWV9OQU1FLCAyNDYpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGludGVnZXJQcmVmZXJlbmNlQWRhcHRlciwgbmV3IEludGVnZXIoMTIzKSwgbmV3IEludGVnZXIoMjQ2KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyNDYpLCBpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGludGVnZXJQcmVmZXJlbmNlQWRhcHRlciwgbmV3IEludGVnZXIoMjQ2KSwgbmV3IEludGVnZXIoMCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIGludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnB1dEludChLRVlfTkFNRSwgMTIzKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIsIG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxMjMpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyMyksIGludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGEgc2l0dWF0aW9uIHdoZXJlCi0JICogLSB3ZSBhcmUgbGlzdGVuaW5nIHRvIHRoZSBub2RlIHdoZW4gaXQgZ2V0cyByZW1vdmVkIGZyb20gdGhlIHByZWZlcmVuY2VzICJyZXBvc2l0b3J5IgotCSAqIC0gd2UgZ2V0IG5vdGlmaWNhdGlvbiB0aGF0IGl0IGhhcyBiZWVuIHJlbW92ZWQKLQkgKiAtIHdlIHRyeSB0byByZW1vdmUgb3VyIHRoaXMubGlzdGVuZXIKLQkgKiAtIHRoZSBub2RlIHdpbGwgdGhyb3cgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIC0gdGhlIGFkYXB0ZXIgc2hvdWxkIGhhbmRsZSBpdCBPSy4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlQcmVmZXJlbmNlcyBwYXJlbnQgPSB0aGlzLnRlc3ROb2RlLnBhcmVudCgpOwotCQlwYXJlbnQuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRQYXJlbnROb2RlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMudGVzdE5vZGUucmVtb3ZlTm9kZSgpOwotCQl0aGlzLnRlc3ROb2RlLmZsdXNoKCk7CQkvLyB0aGlzIHNlZW1zIHRvIGJlIHJlcXVpcmVkIGZvciB0aGUgdGhpcy5ldmVudCB0byB0cmlnZ2VyLi4uCi0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RlbmVyUmVtb3ZlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXByaXZhdGUgTm9kZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUGFyZW50Tm9kZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoaWxkQWRkZWQoTm9kZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoaWxkUmVtb3ZlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChlLmdldENoaWxkKCkgPT0gUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMudGVzdE5vZGUpIHsKLQkJCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmxpc3RlbmVyKTsKLQkJCQkJLy8gdGhpcyBsaW5lIG9mIGNvZGUgd2lsbCBub3QgZXhlY3V0ZSBpZiB0aGUgbGluZSBhYm92ZSB0cmlnZ2VycyBhbiBleGNlcHRpb24KLQkJCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMubGlzdGVuZXJSZW1vdmVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNhbWVWYWx1ZSgpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VFdmVudCk7Ci0JCXRoaXMudGVzdE5vZGUuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gInNvbWUgb3RoZXIgdmFsdWUiOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeVByZWZlcmVuY2VFdmVudChBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJLy8gbm93IHNldCB0byAqc2FtZSogdmFsdWUgLSBub3RoaW5nIHNob3VsZCBoYXBwZW4uLi4KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHJlZmVyZW5jZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5zZXRWYWx1ZShBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNhbWVWYWx1ZUZvcmNlUGFzc1Rocm91Z2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VFdmVudCk7Ci0KLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIgPSBuZXcgQWx3YXlzVXBkYXRlUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMubm9kZUhvbGRlciwgS0VZX05BTUUpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQotCQl0aGlzLnRlc3ROb2RlLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkpOwotCi0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRSA9ICJzb21lIG90aGVyIHZhbHVlIjsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5zZXRWYWx1ZShBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlQcmVmZXJlbmNlRXZlbnQoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCS8vIG5vdyBzZXQgdG8gKnNhbWUqIHZhbHVlIC0gb25seSBvbmUgdGhpcy5ldmVudCBzaG91bGQgZmlyZQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVmZXJlbmNlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeVByZWZlcmVuY2VFdmVudChBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJlZmVyZW5jZUNoYW5nZShQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMucHJlZmVyZW5jZUV2ZW50ID0gZXZ0OwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChNb2RlbCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCB0aGlzLmV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5wcmVmZXJlbmNlQWRhcHRlciwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJlZmVyZW5jZUV2ZW50KE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMucHJlZmVyZW5jZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE5vZGUsIHRoaXMucHJlZmVyZW5jZUV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEtFWV9OQU1FLCB0aGlzLnByZWZlcmVuY2VFdmVudC5nZXRLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5wcmVmZXJlbmNlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsICI8bWlzc2luZyBwcmVmZXJlbmNlPiIpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9kZUhhc0FueVByZWZMaXN0ZW5lcnMoUHJlZmVyZW5jZXMgbm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcltdIHByZWZMaXN0ZW5lcnMgPSAoUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyW10pIENsYXNzVG9vbHMuZmllbGRWYWx1ZShub2RlLCAicHJlZkxpc3RlbmVycyIpOwotCQlyZXR1cm4gcHJlZkxpc3RlbmVycy5sZW5ndGggPiAwOwotCX0KLQotCi0JLyoqCi0JICogVXNlIHRoaXMgYWRhcHRlciB0byB0ZXN0IG91dCBhbHdheXMgcGFzc2luZyB0aHJvdWdoIHRoZSBuZXcgdmFsdWUKLQkgKiB0byB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEFsd2F5c1VwZGF0ZVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gZXh0ZW5kcyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+IHsKLQotCQlBbHdheXNVcGRhdGVQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4gcHJlZmVyZW5jZXNIb2xkZXIsIFN0cmluZyBrZXkpIHsKLQkJCXN1cGVyKHByZWZlcmVuY2VzSG9sZGVyLCBrZXkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNldFByZWZlcmVuY2UoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmU0YTU5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmcy5QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzLlByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgUHJlZmVyZW5jZXNUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkVmFsdWVzOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+IG5vZGVIb2xkZXI7Ci0JUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHByZWZlcmVuY2VzQWRhcHRlcjsKLQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpdGVtTGlzdGVuZXI7Ci0JYm9vbGVhbiBsaXN0ZW5lclJlbW92ZWQgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUVfMSA9ICJmb28gMSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FXzIgPSAiZm9vIDIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRV8zID0gImZvbyAzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1ZBTFVFXzEgPSAib3JpZ2luYWwgc3RyaW5nIHZhbHVlIDEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfVkFMVUVfMiA9ICJvcmlnaW5hbCBzdHJpbmcgdmFsdWUgMiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19WQUxVRV8zID0gIm9yaWdpbmFsIHN0cmluZyB2YWx1ZSAzIjsKLQotCXB1YmxpYyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRV8xLCBTVFJJTkdfVkFMVUVfMSk7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzEsIFNUUklOR19WQUxVRV8xKTsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUVfMiwgU1RSSU5HX1ZBTFVFXzIpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8yLCBTVFJJTkdfVkFMVUVfMik7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FXzMsIFNUUklOR19WQUxVRV8zKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMywgU1RSSU5HX1ZBTFVFXzMpOwotCi0JCXRoaXMubm9kZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+KHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnByZWZlcmVuY2VzQWRhcHRlciA9IG5ldyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5ub2RlSG9sZGVyKTsKLQkJdGhpcy5saXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5pdGVtTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbUxpc3RlbmVyKCk7Ci0JCXRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMubGlzdGVuZXIpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlwcml2YXRlIHZvaWQgbG9nRXZlbnQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgIT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCQl9Ci0JCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJU3RyaW5nIEFOT1RIRVJfS0VZX05BTUVfMSA9ICJhbm90aGVyIGtleSAxIjsKLQkJU3RyaW5nIEFOT1RIRVJfS0VZX05BTUVfMiA9ICJhbm90aGVyIGtleSAyIjsKLQkJU3RyaW5nIEFOT1RIRVJfS0VZX05BTUVfMyA9ICJhbm90aGVyIGtleSAzIjsKLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzEgPSAiYW5vdGhlciBzdHJpbmcgdmFsdWUgMSI7Ci0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRV8yID0gImFub3RoZXIgc3RyaW5nIHZhbHVlIDIiOwotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMyA9ICJhbm90aGVyIHN0cmluZyB2YWx1ZSAzIjsKLQkJUHJlZmVyZW5jZXMgYW5vdGhlck5vZGUgPSB0aGlzLmNsYXNzTm9kZS5ub2RlKCJhbm90aGVyIHRlc3Qgbm9kZSIpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLmNsZWFyKCk7Ci0JCWFub3RoZXJOb2RlLnB1dChBTk9USEVSX0tFWV9OQU1FXzEsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzEpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChBTk9USEVSX0tFWV9OQU1FXzEsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzEpOwotCQlhbm90aGVyTm9kZS5wdXQoQU5PVEhFUl9LRVlfTkFNRV8yLCBBTk9USEVSX1NUUklOR19WQUxVRV8yKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoQU5PVEhFUl9LRVlfTkFNRV8yLCBBTk9USEVSX1NUUklOR19WQUxVRV8yKTsKLQkJYW5vdGhlck5vZGUucHV0KEFOT1RIRVJfS0VZX05BTUVfMywgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMyk7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEFOT1RIRVJfS0VZX05BTUVfMywgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMyk7Ci0KLQkJdGhpcy5ub2RlSG9sZGVyLnNldFZhbHVlKGFub3RoZXJOb2RlKTsKLQkJLy8gY29sbGVjdGlvbkNoYW5nZWQgZG9lcyBub3QgcGFzcyBhbnkgaXRlbXMgaW4gdGhlIHRoaXMuZXZlbnQKLQkJdGhpcy52ZXJpZnlFdmVudChDb2xsZWN0aW9ucy48U3RyaW5nLCBTdHJpbmc+ZW1wdHlNYXAoKSk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5jbGVhcigpOwotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5leHBlY3RlZFZhbHVlcyk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0Tm9kZSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQ29sbGVjdGlvbnMuPFN0cmluZywgU3RyaW5nPmVtcHR5TWFwKCkpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLmNsZWFyKCk7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzEsIFNUUklOR19WQUxVRV8xKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMiwgU1RSSU5HX1ZBTFVFXzIpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8zLCBTVFJJTkdfVkFMVUVfMyk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQlTdHJpbmcgQU5PVEhFUl9LRVlfTkFNRSA9ICJhbm90aGVyIGtleSI7Ci0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRSA9ICJhbm90aGVyIHN0cmluZyB2YWx1ZSI7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEFOT1RIRVJfS0VZX05BTUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBleHBlY3RlZEl0ZW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWV4cGVjdGVkSXRlbXMucHV0KEFOT1RIRVJfS0VZX05BTUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlFdmVudChleHBlY3RlZEl0ZW1zKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoQU5PVEhFUl9LRVlfTkFNRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUVfMik7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuZXZlbnQuaXRlbXNTaXplKCkpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJU3RyaW5nIGtleSA9ICgoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KSB0aGlzLmV2ZW50Lml0ZW1zKCkubmV4dCgpKS5nZXRLZXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEtFWV9OQU1FXzIsIGtleSk7Ci0KLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5yZW1vdmUoS0VZX05BTUVfMik7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQlTdHJpbmcgRElGRkVSRU5UID0gInNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCI7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FXzIsIERJRkZFUkVOVCk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8yLCBESUZGRVJFTlQpOwotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlOb2RlKHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgYSBzaXR1YXRpb24gd2hlcmUKLQkgKiAtIHdlIGFyZSBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUgd2hlbiBpdCBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgcHJlZmVyZW5jZXMgInJlcG9zaXRvcnkiCi0JICogLSB3ZSBnZXQgbm90aWZpY2F0aW9uIHRoYXQgaXQgaGFzIGJlZW4gcmVtb3ZlZAotCSAqIC0gd2UgdHJ5IHRvIHJlbW92ZSBvdXIgdGhpcy5saXN0ZW5lcgotCSAqIC0gdGhlIG5vZGUgd2lsbCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLSB0aGUgYWRhcHRlciBzaG91bGQgaGFuZGxlIGl0IE9LLi4uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCVByZWZlcmVuY2VzIHBhcmVudCA9IHRoaXMudGVzdE5vZGUucGFyZW50KCk7Ci0JCXBhcmVudC5hZGROb2RlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFBhcmVudE5vZGVDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmVOb2RlKCk7Ci0JCXRoaXMudGVzdE5vZGUuZmx1c2goKTsJCS8vIHRoaXMgc2VlbXMgdG8gYmUgcmVxdWlyZWQgZm9yIHRoZSB0aGlzLmV2ZW50IHRvIHRyaWdnZXIuLi4KLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMubGlzdGVuZXJSZW1vdmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIE5vZGVDaGFuZ2VMaXN0ZW5lciBidWlsZFBhcmVudE5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBOb2RlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGlsZEFkZGVkKE5vZGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGlsZFJlbW92ZWQoTm9kZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5nZXRDaGlsZCgpID09IFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnRlc3ROb2RlKSB7Ci0JCQkJCVByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnByZWZlcmVuY2VzQWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5saXN0ZW5lcik7Ci0JCQkJCS8vIHRoaXMgbGluZSBvZiBjb2RlIHdpbGwgbm90IGV4ZWN1dGUgaWYgdGhlIGxpbmUgYWJvdmUgdHJpZ2dlcnMgYW4gZXhjZXB0aW9uCi0JCQkJCVByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmxpc3RlbmVyUmVtb3ZlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQl0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJdGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChNYXA8U3RyaW5nLCBTdHJpbmc+IGl0ZW1zKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnByZWZlcmVuY2VzQWRhcHRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtcy5zaXplKCksIHRoaXMuZXZlbnQuaXRlbXNTaXplKCkpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+PiBldmVudEl0ZW1zID0gKEl0ZXJhdG9yPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPj4pIHRoaXMuZXZlbnQuaXRlbXMoKTsKLQkJdGhpcy52ZXJpZnlJdGVtcyhpdGVtcywgZXZlbnRJdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU5vZGUoUHJlZmVyZW5jZXMgbm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIGtleXMgPSBub2RlLmtleXMoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXhwZWN0ZWRWYWx1ZXMuc2l6ZSgpLCBrZXlzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXhwZWN0ZWRWYWx1ZXMuZ2V0KGtleXNbaV0pLCBub2RlLmdldChrZXlzW2ldLCAiPG1pc3NpbmcgcHJlZmVyZW5jZT4iKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5QWRhcHRlcihQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY3ZtKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV4cGVjdGVkVmFsdWVzLnNpemUoKSwgY3ZtLnNpemUoKSk7Ci0JCXRoaXMudmVyaWZ5SXRlbXModGhpcy5leHBlY3RlZFZhbHVlcywgY3ZtLml0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlJdGVtcyhNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkLCBJdGVyYXRvcjxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4+IHN0cmVhbSkgewotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG1vZGVsID0gc3RyZWFtLm5leHQoKTsKLQkJCW1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLml0ZW1MaXN0ZW5lcik7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0KG1vZGVsLmdldEtleSgpKSwgbW9kZWwuZ2V0VmFsdWUoKSk7Ci0JCQltb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5pdGVtTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKFByZWZlcmVuY2VzIG5vZGUpIHRocm93cyBFeGNlcHRpb24gewotCQlQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXJbXSBwcmVmTGlzdGVuZXJzID0gKFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcltdKSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUobm9kZSwgInByZWZMaXN0ZW5lcnMiKTsKLQkJcmV0dXJuIHByZWZMaXN0ZW5lcnMubGVuZ3RoID4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYTI4NGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIHNldCB1cCBhbmQgdGVhciBkb3duIGEgdGVzdCBub2RlIGZvciBhbnkgc3ViY2xhc3MgdGhhdAotICogbmVlZHMgdG8gdGVzdCBwcmVmZXJlbmNlcy1yZWxhdGVkIHN0dWZmCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcmVmZXJlbmNlc1Rlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBjbGFzc05vZGU7Ci0JcHVibGljIFByZWZlcmVuY2VzIHRlc3ROb2RlOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTk9ERV9OQU1FID0gInRlc3Qgbm9kZSI7Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXNUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlQcmVmZXJlbmNlcyBwYWNrYWdlTm9kZSA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZSh0aGlzLmdldENsYXNzKCkpOwotCQl0aGlzLmNsYXNzTm9kZSA9IHBhY2thZ2VOb2RlLm5vZGUoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCS8vIGNsZWFuIG91dCBhbnkgbGVmdG92ZXIgY3JhcC4uLgotCQlpZiAoKHRoaXMuY2xhc3NOb2RlLmtleXMoKS5sZW5ndGggPiAwKSB8fCAodGhpcy5jbGFzc05vZGUuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCA+IDApKSB7Ci0JCQl0aGlzLmNsYXNzTm9kZS5yZW1vdmVOb2RlKCk7Ci0JCQkvLyAuLi5hbmQgcmUtY3JlYXRlIHRoZSBub2RlCi0JCQl0aGlzLmNsYXNzTm9kZSA9IHBhY2thZ2VOb2RlLm5vZGUoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCX0KLQkJdGhpcy50ZXN0Tm9kZSA9IHRoaXMuY2xhc3NOb2RlLm5vZGUoVEVTVF9OT0RFX05BTUUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHdhaXQgZm9yIGFsbCB0aGUgZXZlbnRzIHRvIGJlIGRlbGl2ZXJlZCBiZWZvcmUgdGVhcmluZyBkb3duCi0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSB0aGlzLmNsYXNzTm9kZS5wYXJlbnQoKTsKLQkJdGhpcy5jbGFzc05vZGUucmVtb3ZlTm9kZSgpOwotCQl3aGlsZSAodGhpcy5ub2RlSXNWZXN0aWdpYWwobm9kZSkpIHsKLQkJCVByZWZlcmVuY2VzIHBhcmVudCA9IG5vZGUucGFyZW50KCk7Ci0JCQlub2RlLnJlbW92ZU5vZGUoKTsKLQkJCW5vZGUgPSBwYXJlbnQ7Ci0JCX0KLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub2RlSXNWZXN0aWdpYWwoUHJlZmVyZW5jZXMgbm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsKQotCQkJJiYgKG5vZGUua2V5cygpLmxlbmd0aCA9PSAwKQotCQkJJiYgKG5vZGUuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCA9PSAwKQotCQkJJiYgKG5vZGUgIT0gUHJlZmVyZW5jZXMudXNlclJvb3QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCkgewotCQl0cnkgewotCQkJd2hpbGUgKCAhIHRoaXMucHJlZmVyZW5jZXNFdmVudFF1ZXVlKCkuaXNFbXB0eSgpKSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQl9Ci0JCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxFdmVudE9iamVjdD4gcHJlZmVyZW5jZXNFdmVudFF1ZXVlKCkgewotCQlyZXR1cm4gKExpc3Q8RXZlbnRPYmplY3Q+KSBDbGFzc1Rvb2xzLnN0YXRpY0ZpZWxkVmFsdWUoQWJzdHJhY3RQcmVmZXJlbmNlcy5jbGFzcywgImV2ZW50UXVldWUiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMTlmY2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ2hlY2tCb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXI7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBidXR0b25Nb2RlbEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIENoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlciA9IG5ldyBDaGVja0JveE1vZGVsQWRhcHRlcih0aGlzLmJvb2xlYW5Ib2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZWxlY3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHRoaXMuYm9vbGVhbkhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydFRydWUodGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBsb2NhbEJvb2xlYW5Ib2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KSB0aGlzLmJvb2xlYW5Ib2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsQm9vbGVhbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbEJvb2xlYW5Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsQm9vbGVhbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKE9iamVjdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IChFdmVudExpc3RlbmVyTGlzdCkgQ2xhc3NUb29scy5maWVsZFZhbHVlKG1vZGVsLCAibGlzdGVuZXJMaXN0Iik7Ci0JCWFzc2VydEVxdWFscygwLCBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IChFdmVudExpc3RlbmVyTGlzdCkgQ2xhc3NUb29scy5maWVsZFZhbHVlKG1vZGVsLCAibGlzdGVuZXJMaXN0Iik7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDE4NDJlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDaGVja0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5DaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBjaGVjayBib3hlcy4KLSAqLwotcHVibGljIGNsYXNzIENoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZzFIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMkhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IG5vdEZsYWcySG9sZGVyOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgZmxhZzFCdXR0b25Nb2RlbDsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGZsYWcyQnV0dG9uTW9kZWw7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBub3RGbGFnMkJ1dHRvbk1vZGVsOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKHRydWUsIHRydWUpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuZmxhZzFIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzFIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcxQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5mbGFnMUhvbGRlcik7Ci0JCXRoaXMuZmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcyQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5mbGFnMkhvbGRlcik7Ci0JCXRoaXMubm90RmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkTm90RmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLm5vdEZsYWcyQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5ub3RGbGFnMkhvbGRlcik7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzEodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb3RGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuTk9UX0ZMQUcyX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzTm90RmxhZzIoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5vdEZsYWcyKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcikgewotCQlyZXR1cm4gbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyKGJvb2xlYW5Ib2xkZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNDAwLCAxMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2hlY2tCb3hQYW5lbCgpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENoZWNrQm94UGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRGbGFnMUNoZWNrQm94KCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkRmxhZzJDaGVja0JveCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZE5vdEZsYWcyQ2hlY2tCb3goKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkRmxhZzFDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDEiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5mbGFnMUJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkRmxhZzJDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDIiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5mbGFnMkJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkTm90RmxhZzJDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJub3QgZmxhZyAyIik7Ci0JCWNoZWNrQm94LnNldE1vZGVsKHRoaXMubm90RmxhZzJCdXR0b25Nb2RlbCk7Ci0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQlwcml2YXRlIEpDaGVja0JveCBidWlsZFVuYXR0YWNoZWRDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgidW5hdHRhY2hlZCIpOwotCQljaGVja0JveC5nZXRNb2RlbCgpLmFkZEl0ZW1MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZEl0ZW1MaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSXRlbUxpc3RlbmVyIGJ1aWxkVW5hdHRhY2hlZEl0ZW1MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHN0YXRlIGNoYW5nZWQ6ICIgKyBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRGbGlwRmxhZzFCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRGbGlwRmxhZzFCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkRmxpcEZsYWcxQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkRmxpcEZsYWcxQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJmbGlwIGZsYWcgMSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuZmxpcEZsYWcxKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgZmxpcEZsYWcxKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRGbGFnMSggISB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcxKCkpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMTogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNOb3RGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioiKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmbGFnMTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcxX1BST1BFUlRZID0gImZsYWcxIjsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzJfUFJPUEVSVFkgPSAiZmxhZzIiOwotCQlwcml2YXRlIGJvb2xlYW4gbm90RmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRkxBRzJfUFJPUEVSVFkgPSAibm90RmxhZzIiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKGJvb2xlYW4gZmxhZzEsIGJvb2xlYW4gZmxhZzIpIHsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzEoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMShib29sZWFuIGZsYWcxKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzE7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzFfUFJPUEVSVFksIG9sZCwgZmxhZzEpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihib29sZWFuIGZsYWcyKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCQotCQkJb2xkID0gdGhpcy5ub3RGbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PVF9GTEFHMl9QUk9QRVJUWSwgb2xkLCB0aGlzLm5vdEZsYWcyKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoYm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMiggISBub3RGbGFnMik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmExZGM2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db21ib0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TaW1wbGVEaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLkNvb3JkaW5hdGVkTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIENvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkvLyBub3RoaW5nIHlldC4uLgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcgeWV0Li4uCi0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxEaXNwbGF5YWJsZT4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4obGlzdEhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHNlbGVjdGlvbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlDb21ib0JveE1vZGVsIGNvbWJvQm94TW9kZWwgPSBuZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIobGlzdEhvbGRlciwgc2VsZWN0aW9uSG9sZGVyKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHNlbGVjdGlvbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhjb21ib0JveE1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8RGlzcGxheWFibGU+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8RGlzcGxheWFibGU+KGNvbWJvQm94TW9kZWwpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXNlbGVjdGlvbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHNlbGVjdGlvbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMoY29tYm9Cb3hNb2RlbCk7Ci0KLQkJY29tYm9Cb3hNb2RlbC5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKHN5bmNoTGlzdCk7Ci0JCXNlbGVjdGlvbkhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2Uoc2VsZWN0aW9uSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGNvbWJvQm94TW9kZWwpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKLQkJCQkvLyBkbyBub3RoaW5nLi4uCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RNb2RlbCBsaXN0TW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGhhc05vTGlzdGVuZXJzID0gKChCb29sZWFuKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QobGlzdE1vZGVsLCAiaGFzTm9MaXN0RGF0YUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNOb0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0TW9kZWwgbGlzdE1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSAoKEJvb2xlYW4pIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChsaXN0TW9kZWwsICJoYXNMaXN0RGF0YUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNMaXN0ZW5lcnMpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8RGlzcGxheWFibGU+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxEaXNwbGF5YWJsZT4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PERpc3BsYXlhYmxlPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8RGlzcGxheWFibGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PERpc3BsYXlhYmxlPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPERpc3BsYXlhYmxlPiBjKSB7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiZm9vIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImJhciIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJiYXoiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiam9vIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImphciIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqYXoiKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZDc3MTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29tYm9Cb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRmlsdGVyaW5nTGlzdEJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuTGlzdENob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU2ltcGxlTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGNvbWJvLWJveGVzLgotICogCi0gKiBEZWZhdWx0TG9uZ0xpc3RCcm93c2VyRGlhbG9nVUlUZXN0IHN1YmNsYXNzZXMgdGhpcyBjbGFzczsgc28gYmUKLSAqIGNhcmVmdWwgd2hlbiBtYWtpbmcgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXByb3RlY3RlZCBKRnJhbWUgd2luZG93OwotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBjb2xvckhvbGRlcjsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gY29sb3JMaXN0SG9sZGVyOwotCXByb3RlY3RlZCBDb21ib0JveE1vZGVsIGNvbG9yQ29tYm9Cb3hNb2RlbDsKLQlwcml2YXRlIGludCBuZXh0Q29sb3JOdW1iZXIgPSAwOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWMoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChVSU1hbmFnZXIuZ2V0U3lzdGVtTG9va0FuZEZlZWxDbGFzc05hbWUoKSk7Ci0vLwkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRDcm9zc1BsYXRmb3JtTG9va0FuZEZlZWxDbGFzc05hbWUoKSk7CS8vIE1ldGFsIExBRgotLy8JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChjb20uc3VuLmphdmEuc3dpbmcucGxhZi53aW5kb3dzLldpbmRvd3NMb29rQW5kRmVlbC5jbGFzcy5nZXROYW1lKCkpOwotLy8JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChjb20uc3VuLmphdmEuc3dpbmcucGxhZi5tb3RpZi5Nb3RpZkxvb2tBbmRGZWVsLmNsYXNzLmdldE5hbWUoKSk7Ci0vLwkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKG9yYWNsZS5iYWxpLmV3dC5vbGFmLk9yYWNsZUxvb2tBbmRGZWVsLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXRoaXMudGVzdE1vZGVsID0gdGhpcy5idWlsZFRlc3RNb2RlbCgpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuY29sb3JIb2xkZXIgPSB0aGlzLmJ1aWxkQ29sb3JIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmNvbG9yTGlzdEhvbGRlciA9IHRoaXMuYnVpbGRDb2xvckxpc3RIb2xkZXIoKTsKLQkJdGhpcy5jb2xvckNvbWJvQm94TW9kZWwgPSB0aGlzLmJ1aWxkQ29tYm9Cb3hNb2RlbEFkYXB0ZXIodGhpcy5jb2xvckxpc3RIb2xkZXIsIHRoaXMuY29sb3JIb2xkZXIpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRDb2xvckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4odm0sIFRlc3RNb2RlbC5DT0xPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29sb3IoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRDb2xvcigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFRlc3RNb2RlbCBidWlsZFRlc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0TW9kZWwoKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2xvckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihUZXN0TW9kZWwudmFsaWRDb2xvcnMoKSk7Ci0vLwkJcmV0dXJuIG5ldyBBYnN0cmFjdFJlYWRPbmx5TGlzdFZhbHVlTW9kZWwoKSB7Ci0vLwkJCXB1YmxpYyBPYmplY3QgdmFsdWUoKSB7Ci0vLwkJCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yKFRlc3RNb2RlbC5WQUxJRF9DT0xPUlMpOwotLy8JCQl9Ci0vLwkJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLS8vCQkJCXJldHVybiBUZXN0TW9kZWwuVkFMSURfQ09MT1JTLmxlbmd0aDsKLS8vCQkJfQotLy8JCX07Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gdWlDb2xvckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbG9yTGlzdEhvbGRlcjsKLQl9Ci0KLQlwcml2YXRlIENvbWJvQm94TW9kZWwgYnVpbGRDb21ib0JveE1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIobGlzdEhvbGRlciwgc2VsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJdGhpcy53aW5kb3cgPSBuZXcgSkZyYW1lKENsYXNzVG9vbHMuc2hvcnROYW1lRm9yKHRoaXMuZ2V0Q2xhc3MoKSkpOwotCQl0aGlzLndpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl0aGlzLndpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXRoaXMud2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl0aGlzLndpbmRvdy5zZXRMb2NhdGlvbigzMDAsIDMwMCk7Ci0JCXRoaXMud2luZG93LnNldFNpemUoNDAwLCAxNTApOwotCQl0aGlzLndpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb21ib0JveFBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByb3RlY3RlZCBKUGFuZWwgYnVpbGRDb21ib0JveFBhbmVsKCkgewotCQlKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJcGFuZWwuYWRkKHRoaXMuYnVpbGRDb21ib0JveCgpKTsKLQkJcGFuZWwuYWRkKHRoaXMuYnVpbGRDb21ib0JveCgpKTsKLQkJcGFuZWwuYWRkKHRoaXMuYnVpbGRMaXN0Q2hvb3NlcjEoKSk7Ci0JCXBhbmVsLmFkZCh0aGlzLmJ1aWxkTGlzdENob29zZXIyKCkpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQ29tYm9Cb3ggYnVpbGRDb21ib0JveCgpIHsKLQkJSkNvbWJvQm94IGNvbWJvQm94ID0gbmV3IEpDb21ib0JveCh0aGlzLmNvbG9yQ29tYm9Cb3hNb2RlbCk7Ci0JCWNvbWJvQm94LnNldFJlbmRlcmVyKHRoaXMuYnVpbGRDb21ib0JveFJlbmRlcmVyKCkpOwotCQlyZXR1cm4gY29tYm9Cb3g7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDZWxsUmVuZGVyZXIgYnVpbGRDb21ib0JveFJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkgewotCQkJCXJldHVybiBzdXBlci5idWlsZFRleHQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdENob29zZXIgYnVpbGRMaXN0Q2hvb3NlcjEoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxMaXN0Q2hvb3NlcjEodGhpcy5jb2xvckNvbWJvQm94TW9kZWwpOwotCX0KLQotCXByaXZhdGUgTGlzdENob29zZXIgYnVpbGRMaXN0Q2hvb3NlcjIoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxMaXN0Q2hvb3NlcjIodGhpcy5jb2xvckNvbWJvQm94TW9kZWwpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgyLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0Q29sb3JCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkVGVuQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW1vdmVUZW5CdXR0b24oKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JLy8gKioqKioqKioqKiByZXNldCBjb2xvciBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0Q29sb3JCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzZXRDb2xvckFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0Q29sb3JBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IGNvbG9yIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldENvbG9yKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzZXRDb2xvcigpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0Q29sb3IoVGVzdE1vZGVsLkRFRkFVTFRfQ09MT1IpOwotCX0KLQotCS8vICoqKioqKioqKiogY2xlYXIgbW9kZWwgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCS8vICoqKioqKioqKiogcmVzdG9yZSBtb2RlbCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc3RvcmUgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpbnQgbW9kZWwgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhZGQgMjAgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRBZGRUZW5CdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQWRkVGVuQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQWRkVGVuQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJhZGQgMjAiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZFRlbigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGFkZFRlbigpIHsKLQkJZm9yIChpbnQgaSA9IHRoaXMubmV4dENvbG9yTnVtYmVyOyBpIDwgdGhpcy5uZXh0Q29sb3JOdW1iZXIgKyAyMDsgaSsrKSB7Ci0JCQl0aGlzLmNvbG9yTGlzdEhvbGRlci5hZGQodGhpcy5jb2xvckxpc3RIb2xkZXIuc2l6ZSgpLCAiY29sb3IiICsgaSk7Ci0JCX0KLQkJdGhpcy5uZXh0Q29sb3JOdW1iZXIgKz0gMjA7Ci0JfQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgMjAgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW1vdmVUZW5CdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVtb3ZlVGVuQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVtb3ZlVGVuQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW1vdmUgMjAiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbW92ZVRlbigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlbW92ZVRlbigpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5jb2xvckxpc3RIb2xkZXIuc2l6ZSgpID4gMCkgewotCQkJCXRoaXMuY29sb3JMaXN0SG9sZGVyLnJlbW92ZSh0aGlzLmNvbG9yTGlzdEhvbGRlci5zaXplKCkgLSAxKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgY29sb3I7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9QUk9QRVJUWSA9ICJjb2xvciI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUQgPSAicmVkIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SQU5HRSA9ICJvcmFuZ2UiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVMTE9XID0gInllbGxvdyI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVFTiA9ICJncmVlbiI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFID0gImJsdWUiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ESUdPID0gImluZGlnbyI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSU9MRVQgPSAidmlvbGV0IjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09MT1IgPSBSRUQ7Ci0JCQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiB2YWxpZENvbG9yczsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9WQUxJRF9DT0xPUlMgPSB7Ci0JCQkJUkVELAotCQkJCU9SQU5HRSwKLQkJCQlZRUxMT1csCi0JCQkJR1JFRU4sCi0JCQkJQkxVRSwKLQkJCQlJTkRJR08sCi0JCQkJVklPTEVUCi0JCQl9OwotCQotCQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiB2YWxpZENvbG9ycygpIHsKLQkJCWlmICh2YWxpZENvbG9ycyA9PSBudWxsKSB7Ci0JCQkJdmFsaWRDb2xvcnMgPSBidWlsZERlZmF1bHRWYWxpZENvbG9ycygpOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkQ29sb3JzOwotCQl9Ci0JCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFZhbGlkQ29sb3JzKCkgewotCQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChyZXN1bHQsIERFRkFVTFRfVkFMSURfQ09MT1JTKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJcHVibGljIFRlc3RNb2RlbCgpIHsKLQkJCXRoaXMoREVGQVVMVF9DT0xPUik7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbChTdHJpbmcgY29sb3IpIHsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldENvbG9yKCkgewotCQkJcmV0dXJuIHRoaXMuY29sb3I7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoU3RyaW5nIGNvbG9yKSB7Ci0JCQl0aGlzLmNoZWNrQ29sb3IoY29sb3IpOwotCQkJT2JqZWN0IG9sZCA9IHRoaXMuY29sb3I7Ci0JCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MT1JfUFJPUEVSVFksIG9sZCwgY29sb3IpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNoZWNrQ29sb3IoU3RyaW5nIGMpIHsKLQkJCWlmICggISB2YWxpZENvbG9ycygpLmNvbnRhaW5zKGMpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjKTsKLQkJCX0KLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmNvbG9yICsgIikiOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsTGlzdENob29zZXIxIGV4dGVuZHMgTGlzdENob29zZXIgewotCQlwdWJsaWMgTG9jYWxMaXN0Q2hvb3NlcjEoQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQkJc3VwZXIobW9kZWwpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsTGlzdENob29zZXIyIGV4dGVuZHMgTGlzdENob29zZXIgewotCQlwdWJsaWMgTG9jYWxMaXN0Q2hvb3NlcjIoQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQkJc3VwZXIobW9kZWwpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEJyb3dzZXIgYnVpbGRCcm93c2VyKCkgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdMaXN0QnJvd3NlcjxTdHJpbmc+KCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2QxYzA0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuTGlzdENlbGxSZW5kZXJlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZUxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIgZXh0ZW5kcyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0MigpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHVibGljIENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0MigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiB1c2UgYSBkaWZmZXJlbnQgbW9kZWwgdGhhdCBhbGxvd3MgdGhlIGNvbG9yIHRvIGJlIHNldCB0byBudWxsCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRlc3RNb2RlbCBidWlsZFRlc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0TW9kZWwyKCk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgbnVsbCB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiB1aUNvbG9yTGlzdEhvbGRlcigpIHsKLQkJLy8gdGhlIGRlZmF1bHQgaXMgdG8gcHJlcGVuZCB0aGUgd3JhcHBlZCBsaXN0IHdpdGggYSBudWxsIGl0ZW0KLQkJcmV0dXJuIG5ldyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHN1cGVyLnVpQ29sb3JMaXN0SG9sZGVyKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlcnQgbnVsbCB0byBzb21lIHRleHQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdENlbGxSZW5kZXJlciBidWlsZENvbWJvQm94UmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdENlbGxSZW5kZXJlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/ICI8bm9uZSBzZWxlY3RlZD4iIDogc3VwZXIuYnVpbGRUZXh0KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsMiBleHRlbmRzIFRlc3RNb2RlbCB7Ci0JCS8qKgotCQkgKiBudWxsIGlzIE9LIGhlcmUKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjaGVja0NvbG9yKFN0cmluZyBjb2xvcikgewotCQkJaWYgKGNvbG9yID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzdXBlci5jaGVja0NvbG9yKGNvbG9yKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5ZjVlZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KG5ldyBEYXRlKCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3Bpbm5lck1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlEYXRlIG5ld0RhdGUgPSBuZXcgRGF0ZSgpOwotCQluZXdEYXRlLnNldFRpbWUoNzc3Nzc3KTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnNldFZhbHVlKG5ld0RhdGUpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyg3Nzc3NzcsICgoRGF0ZSkgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVZhbHVlSG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlEYXRlIG5ld0RhdGUgPSBuZXcgRGF0ZSgpOwotCQluZXdEYXRlLnNldFRpbWUoNzc3Nzc3KTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXdEYXRlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUoKTsKLQkJbmV3RGF0ZS5zZXRUaW1lKDc3Nzc3Nyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3RGF0ZSk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKCgoRGF0ZSkgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpLmdldFRpbWUoKSA9PSA3Nzc3NzcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhTcGlubmVyTW9kZWwgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCAoKERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSgoKERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxJbml0aWFsVmFsdWUoKSB7Ci0JCURhdGUgdG9kYXkgPSBuZXcgRGF0ZSgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciA9IG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLnZhbHVlSG9sZGVyLCB0b2RheSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKHRvZGF5LCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUoKTsKLQkJbmV3RGF0ZS5zZXRUaW1lKDc3Nzc3Nyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3RGF0ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWZlM2FhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQuRXZlbnRUeXBlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Eb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcjsKLQlEb2N1bWVudCBkb2N1bWVudEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIERvY3VtZW50QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCIwMTIzNDU2Nzg5Iik7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyID0gbmV3IERvY3VtZW50QWRhcHRlcih0aGlzLnN0cmluZ0hvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN0cmluZ0xpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkU3RyaW5nTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmFkZERvY3VtZW50TGlzdGVuZXIobmV3IFRlc3REb2N1bWVudExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoRXZlbnRUeXBlLlJFTU9WRSwgZS5nZXRUeXBlKCkpOwotCQkJCWFzc2VydEVxdWFscyhEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmRvY3VtZW50QWRhcHRlciwgZS5nZXREb2N1bWVudCgpKTsKLQkJCQkvLyB0aGlzIHdpbGwgYmUgdGhlIHJlbW92YWwgb2YgIjIzNDU2IgotCQkJCWFzc2VydEVxdWFscygyLCBlLmdldE9mZnNldCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoNSwgZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5yZW1vdmUoMiwgNSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMTc4OSIsIHRoaXMuc3RyaW5nSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmFkZERvY3VtZW50TGlzdGVuZXIobmV3IFRlc3REb2N1bWVudExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoRXZlbnRUeXBlLklOU0VSVCwgZS5nZXRUeXBlKCkpOwotCQkJCWFzc2VydEVxdWFscyhEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmRvY3VtZW50QWRhcHRlciwgZS5nZXREb2N1bWVudCgpKTsKLQkJCQkvLyB0aGlzIHdpbGwgYmUgdGhlIGluc2VydCBvZiAieHh4eHh4IgotCQkJCWFzc2VydEVxdWFscygyLCBlLmdldE9mZnNldCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoNSwgZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5pbnNlcnRTdHJpbmcoMiwgInh4eHh4IiwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMXh4eHh4MjM0NTY3ODkiLCB0aGlzLnN0cmluZ0hvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmFkZERvY3VtZW50TGlzdGVuZXIobmV3IFRlc3REb2N1bWVudExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoRXZlbnRUeXBlLklOU0VSVCwgZS5nZXRUeXBlKCkpOwotCQkJCWFzc2VydEVxdWFscyhEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmRvY3VtZW50QWRhcHRlciwgZS5nZXREb2N1bWVudCgpKTsKLQkJCQkvLyB0aGlzIHdpbGwgYmUgdGhlIGluc2VydCBvZiAiZm9vIgotCQkJCWFzc2VydEVxdWFscygwLCBlLmdldE9mZnNldCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoMywgZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlhc3NlcnRFcXVhbHMoRXZlbnRUeXBlLlJFTU9WRSwgZS5nZXRUeXBlKCkpOwotCQkJCWFzc2VydEVxdWFscyhEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmRvY3VtZW50QWRhcHRlciwgZS5nZXREb2N1bWVudCgpKTsKLQkJCQkvLyB0aGlzIHdpbGwgYmUgdGhlIHJlbW92YWwgb2YgIjAxMjM0NTY3ODkiCi0JCQkJYXNzZXJ0RXF1YWxzKDAsIGUuZ2V0T2Zmc2V0KCkpOwotCQkJCWFzc2VydEVxdWFscygxMCwgZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkiLCB0aGlzLmRvY3VtZW50QWRhcHRlci5nZXRUZXh0KDAsIHRoaXMuZG9jdW1lbnRBZGFwdGVyLmdldExlbmd0aCgpKSk7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZG9jdW1lbnRBZGFwdGVyLmdldFRleHQoMCwgdGhpcy5kb2N1bWVudEFkYXB0ZXIuZ2V0TGVuZ3RoKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGxvY2FsU3RyaW5nSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KSB0aGlzLnN0cmluZ0hvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxTdHJpbmdIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5kb2N1bWVudEFkYXB0ZXIpOwotCi0JCURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdERvY3VtZW50TGlzdGVuZXIoKTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuYWRkRG9jdW1lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxTdHJpbmdIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuZG9jdW1lbnRBZGFwdGVyKTsKLQotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxTdHJpbmdIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5kb2N1bWVudEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhPYmplY3QgZG9jdW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgZGVsZWdhdGUgPSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUoZG9jdW1lbnQsICJkZWxlZ2F0ZSIpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSAoT2JqZWN0W10pIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChkZWxlZ2F0ZSwgImdldERvY3VtZW50TGlzdGVuZXJzIik7Ci0JCWFzc2VydEVxdWFscygwLCBsaXN0ZW5lcnMubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBkb2N1bWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBkZWxlZ2F0ZSA9IENsYXNzVG9vbHMuZmllbGRWYWx1ZShkb2N1bWVudCwgImRlbGVnYXRlIik7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IChPYmplY3RbXSkgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKGRlbGVnYXRlLCAiZ2V0RG9jdW1lbnRMaXN0ZW5lcnMiKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXJzLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQotcHJpdmF0ZSBjbGFzcyBUZXN0RG9jdW1lbnRMaXN0ZW5lciBpbXBsZW1lbnRzIERvY3VtZW50TGlzdGVuZXIgewotCVRlc3REb2N1bWVudExpc3RlbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgdm9pZCBjaGFuZ2VkVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JfQotCXB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQl9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzhiNGVhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkFic3RyYWN0RG9jdW1lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuUGxhaW5Eb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Eb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgZW50cnkgZmllbGRzLgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRBZGFwdGVyVUlUZXN0IHsKLQotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTkFNRSA9ICJTY29vYnkgRG9vIjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBuYW1lSG9sZGVyOwotCXByaXZhdGUgRG9jdW1lbnQgbmFtZURvY3VtZW50OwotCXByaXZhdGUgRG9jdW1lbnQgdXBwZXJDYXNlTmFtZURvY3VtZW50OwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBEb2N1bWVudEFkYXB0ZXJVSVRlc3QoKS5leGVjKGFyZ3MpOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnRBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoREVGQVVMVF9OQU1FKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLm5hbWVIb2xkZXIgPSB0aGlzLmJ1aWxkTmFtZUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMubmFtZURvY3VtZW50ID0gdGhpcy5idWlsZE5hbWVEb2N1bWVudCh0aGlzLm5hbWVIb2xkZXIpOwotCQl0aGlzLnVwcGVyQ2FzZU5hbWVEb2N1bWVudCA9IHRoaXMuYnVpbGRVcHBlckNhc2VOYW1lRG9jdW1lbnQodGhpcy5uYW1lSG9sZGVyKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFN0cmluZz4odm0sIFRlc3RNb2RlbC5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBidWlsZE5hbWVEb2N1bWVudChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcikgewotCQlyZXR1cm4gbmV3IERvY3VtZW50QWRhcHRlcihzdHJpbmdIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgYnVpbGRVcHBlckNhc2VOYW1lRG9jdW1lbnQoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBEb2N1bWVudEFkYXB0ZXIoc3RyaW5nSG9sZGVyLCB0aGlzLmJ1aWxkVXBwZXJDYXNlTmFtZURvY3VtZW50RGVsZWdhdGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBBYnN0cmFjdERvY3VtZW50IGJ1aWxkVXBwZXJDYXNlTmFtZURvY3VtZW50RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBuZXcgUGxhaW5Eb2N1bWVudCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaW5zZXJ0U3RyaW5nKGludCBvZmZzZXQsIFN0cmluZyBzdHJpbmcsIEF0dHJpYnV0ZVNldCBhKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQkJCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWNoYXJbXSB1cHBlciA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXBwZXIubGVuZ3RoOyBpKyspIHsKLQkJCQkJdXBwZXJbaV0gPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UodXBwZXJbaV0pOwotCQkJCX0KLQkJCQlzdXBlci5pbnNlcnRTdHJpbmcob2Zmc2V0LCBuZXcgU3RyaW5nKHVwcGVyKSwgYSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRUZXh0RmllbGRQYW5lbCgpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFRleHRGaWVsZFBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkTmFtZVRleHRGaWVsZCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFJlYWRPbmx5TmFtZVRleHRGaWVsZCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFVwcGVyQ2FzZU5hbWVUZXh0RmllbGQoKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgSlRleHRGaWVsZCBidWlsZE5hbWVUZXh0RmllbGQoKSB7Ci0JCXJldHVybiBuZXcgSlRleHRGaWVsZCh0aGlzLm5hbWVEb2N1bWVudCwgbnVsbCwgMCk7Ci0JfQotCi0JcHJpdmF0ZSBKVGV4dEZpZWxkIGJ1aWxkUmVhZE9ubHlOYW1lVGV4dEZpZWxkKCkgewotCQlKVGV4dEZpZWxkIG5hbWVUZXh0RmllbGQgPSB0aGlzLmJ1aWxkTmFtZVRleHRGaWVsZCgpOwotCQluYW1lVGV4dEZpZWxkLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJcmV0dXJuIG5hbWVUZXh0RmllbGQ7Ci0JfQotCi0JcHJpdmF0ZSBKVGV4dEZpZWxkIGJ1aWxkVXBwZXJDYXNlTmFtZVRleHRGaWVsZCgpIHsKLQkJcmV0dXJuIG5ldyBKVGV4dEZpZWxkKHRoaXMudXBwZXJDYXNlTmFtZURvY3VtZW50LCBudWxsLCAwKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXNldE5hbWVCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldE5hbWVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzZXROYW1lQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXROYW1lQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCBuYW1lIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzZXROYW1lKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXROYW1lKERFRkFVTFRfTkFNRSk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiY2xlYXIgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCURvY3VtZW50QWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFByaW50TW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFByaW50TW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInByaW50IG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibmFtZTogIiArIHRoaXMudGVzdE1vZGVsLmdldE5hbWUoKSk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkKLQkJcHVibGljIFRlc3RNb2RlbChTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5nZXROYW1lKCkgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0pwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTMxYmQzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21ib0JveE1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRG9jdW1lbnRBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdE1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUYWJsZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDg4ZTVmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db29yZGluYXRlZExpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0TW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTGlzdE1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCS8vIG5vdGhpbmcgeWV0Li4uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbEFkYXB0ZXIgYnVpbGRMaXN0TW9kZWwoTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihsaXN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRMaXN0TW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25TeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJ0b20iKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoImRpY2siKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoImhhcnJ5Iik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImphciIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiaGFycnkiKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobGlzdEhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgInRvbSIpOwotCQlsaXN0SG9sZGVyLmFkZCg3LCAiZGljayIpOwotCQlsaXN0SG9sZGVyLmFkZCg4LCAiaGFycnkiKTsKLQkJbGlzdEhvbGRlci5hZGQoOSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygxMCwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOSk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TW9kZWwoKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjEgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0TW9kZWxBZGFwdGVyIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobGlzdEhvbGRlcjEpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIyID0gdGhpcy5idWlsZExpc3RIb2xkZXIyKCk7Ci0JCWxpc3RNb2RlbC5zZXRNb2RlbChsaXN0SG9sZGVyMik7Ci0JCWFzc2VydEVxdWFscygzLCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMi5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJbGlzdE1vZGVsLnNldE1vZGVsKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlcjEuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlcjIuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdE1vZGVsIGxpc3RNb2RlbCwgTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJYXNzZXJ0RXF1YWxzKGxpc3RNb2RlbC5nZXRTaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0TW9kZWwuZ2V0U2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0TW9kZWwuZ2V0RWxlbWVudEF0KGkpLCBsaXN0LmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21Db2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tTGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRDdXN0b21Db21wYXJhdG9yKCkgewotCQkvLyBzb3J0IHdpdGggcmV2ZXJzZSBvcmRlcgotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uU29ydChDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oY29sbGVjdGlvbkhvbGRlciwgY29tcGFyYXRvcikpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgidG9tIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJkaWNrIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJoYXJyeSIpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImphciIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiaGFycnkiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdFNvcnQoQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KGxpc3RIb2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5hZGQoMCwgInRvbSIpOwotCQlsaXN0SG9sZGVyLmFkZCgwLCAiZGljayIpOwotCQlsaXN0SG9sZGVyLmFkZCgwLCAiaGFycnkiKTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg1KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZVNvcnQoTGlzdE1vZGVsIGxpc3RNb2RlbCwgTGlzdDxTdHJpbmc+IGxpc3QsIENvbXBhcmF0b3I8U3RyaW5nPiBjb21wYXJhdG9yKSB7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihjb21wYXJhdG9yKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0TW9kZWwuZ2V0U2l6ZSgpOyBpKyspIHsKLQkJCXNzLmFkZCgoU3RyaW5nKSBsaXN0TW9kZWwuZ2V0RWxlbWVudEF0KGkpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoc3Muc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0xID0gc3MuaXRlcmF0b3IoKSwgc3RyZWFtMiA9IGxpc3QuaXRlcmF0b3IoKTsgc3RyZWFtMS5oYXNOZXh0KCk7ICkgewotCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbTEubmV4dCgpLCBzdHJlYW0yLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKGxpc3RIb2xkZXIpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCi0JCWxpc3RNb2RlbC5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobGlzdEhvbGRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RNb2RlbC5nZXRTaXplKCkpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdE1vZGVsLmdldFNpemUoKSk7Ci0KLQkJbGlzdE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIoc3luY2hMaXN0KTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdE1vZGVsLmdldFNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRBdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4obGlzdEhvbGRlcikpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBsaXN0TW9kZWwuZ2V0RWxlbWVudEF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBzeW5jaExpc3QuZ2V0KDApKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdE1vZGVsIGxpc3RNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMgPSAoKEJvb2xlYW4pIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChsaXN0TW9kZWwsICJoYXNOb0xpc3REYXRhTGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKGhhc05vTGlzdGVuZXJzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RNb2RlbCBsaXN0TW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9ICgoQm9vbGVhbikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKGxpc3RNb2RlbCwgImhhc0xpc3REYXRhTGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKGhhc0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQmFnPFN0cmluZz4gYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihiYWcpOwotCQlyZXR1cm4gYmFnOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248U3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJmb28iKTsKLQkJYy5hZGQoImJhciIpOwotCQljLmFkZCgiYmF6Iik7Ci0JCWMuYWRkKCJqb28iKTsKLQkJYy5hZGQoImphciIpOwotCQljLmFkZCgiamF6Iik7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcjIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdDIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0MigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24yKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uMihDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQljLmFkZCgidG9tIik7Ci0JCWMuYWRkKCJkaWNrIik7Ci0JCWMuYWRkKCJoYXJyeSIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlYmMxZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LlRleHRGaWVsZDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIGFuIGV4YW1wbGUgVUkgZm9yIHRlc3RpbmcgdmFyaW91cyBwZXJtdXRhdGlvbnMgb2YgdGhlIExpc3RNb2RlbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIExpc3RNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBUZXh0RmllbGQgdGFza1RleHRGaWVsZDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgTGlzdE1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRhc2tMaXN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4obmV3IFRhc2tMaXN0KCkpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRTaXplKDgwMCwgNDAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRhc2tMaXN0UGFuZWwoKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVGFza0xpc3RQYW5lbCgpIHsKLQkJSlBhbmVsIHRhc2tMaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDAsIDEpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0UGFuZWwoKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbCgpIHsKLQkJSlBhbmVsIHRhc2tMaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdFBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkVW5zb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFN0YW5kYXJkU29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoInByaW1pdGl2ZSB1bnNvcnRlZCIsIHRoaXMuYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgicHJpbWl0aXZlIHNvcnRlZCIsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoInByaW1pdGl2ZSByZXZlcnNlIHNvcnRlZCIsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRVbnNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgiZGlzcGxheWFibGUgdW5zb3J0ZWQiLCB0aGlzLmJ1aWxkVW5zb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFN0YW5kYXJkU29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJkaXNwbGF5YWJsZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEN1c3RvbVNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgiZGlzcGxheWFibGUgcmV2ZXJzZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21TdHJpbmdDb21wYXJhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZFVuc29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRTdGFuZGFyZFNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxUYXNrPih0aGlzLmJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdEFkYXB0ZXIoKSkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkQ3VzdG9tU29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFRhc2s+KHRoaXMuYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0QWRhcHRlcigpLCB0aGlzLmJ1aWxkQ3VzdG9tVGFza09iamVjdENvbXBhcmF0b3IoKSkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTGlzdFBhbmVsKFN0cmluZyBsYWJlbCwgTGlzdE1vZGVsIGxpc3RNb2RlbCkgewotCQlKUGFuZWwgbGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQlKTGFiZWwgbGlzdExhYmVsID0gbmV3IEpMYWJlbCgiICAiICsgbGFiZWwpOwotCQlsaXN0UGFuZWwuYWRkKGxpc3RMYWJlbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQotCQlKTGlzdCBsaXN0Qm94ID0gbmV3IEpMaXN0KCk7Ci0JCWxpc3RCb3guc2V0TW9kZWwobGlzdE1vZGVsKTsKLQkJbGlzdEJveC5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJbGlzdExhYmVsLnNldExhYmVsRm9yKGxpc3RCb3gpOwotCQlsaXN0UGFuZWwuYWRkKG5ldyBKU2Nyb2xsUGFuZShsaXN0Qm94KSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCXJldHVybiBsaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRDdXN0b21TdHJpbmdDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxUYXNrPiBidWlsZEN1c3RvbVRhc2tPYmplY3RDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8VGFzaz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVGFzayB0bzEsIFRhc2sgdG8yKSB7Ci0JCQkJcmV0dXJuIHRvMi5jb21wYXJlVG8odG8xKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFN0cmluZz4oVGFza0xpc3QuVEFTS19OQU1FU19MSVNULCB0aGlzLnRhc2tMaXN0KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrTmFtZXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+KFRhc2tMaXN0LlRBU0tTX0xJU1QsIHRoaXMudGFza0xpc3QoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRhc2s+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwoKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyQnV0dG9uKCksIEJvcmRlckxheW91dC5FQVNUKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEFkZFJlbW92ZVRhc2tQYW5lbCgpIHsKLQkJSlBhbmVsIGFkZFJlbW92ZVRhc2tQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJYWRkUmVtb3ZlVGFza1BhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkQnV0dG9uKCksIEJvcmRlckxheW91dC5XRVNUKTsKLQkJYWRkUmVtb3ZlVGFza1BhbmVsLmFkZCh0aGlzLmJ1aWxkVGFza1RleHRGaWVsZCgpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJYWRkUmVtb3ZlVGFza1BhbmVsLmFkZCh0aGlzLmJ1aWxkUmVtb3ZlQnV0dG9uKCksIEJvcmRlckxheW91dC5FQVNUKTsKLQkJcmV0dXJuIGFkZFJlbW92ZVRhc2tQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRUYXNrKCkgewotCQlyZXR1cm4gdGhpcy50YXNrVGV4dEZpZWxkLmdldFRleHQoKTsKLQl9Ci0KLQlwcml2YXRlIFRhc2tMaXN0IHRhc2tMaXN0KCkgewotCQlyZXR1cm4gdGhpcy50YXNrTGlzdEhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXZvaWQgYWRkVGFzaygpIHsKLQkJU3RyaW5nIHRhc2sgPSB0aGlzLmdldFRhc2soKTsKLQkJaWYgKHRhc2subGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdCgpLmFkZFRhc2sodGFzayk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVRhc2soKSB7Ci0JCVN0cmluZyB0YXNrID0gdGhpcy5nZXRUYXNrKCk7Ci0JCWlmICh0YXNrLmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QoKS5yZW1vdmVUYXNrKHRhc2spOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclRhc2tzKCkgewotCQl0aGlzLnRhc2tMaXN0KCkuY2xlYXJUYXNrcygpOwotCX0KLQotCXByaXZhdGUgVGV4dEZpZWxkIGJ1aWxkVGFza1RleHRGaWVsZCgpIHsKLQkJdGhpcy50YXNrVGV4dEZpZWxkID0gbmV3IFRleHRGaWVsZCgpOwotCQlyZXR1cm4gdGhpcy50YXNrVGV4dEZpZWxkOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEFkZEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRBZGRBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRBZGRBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImFkZCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5hZGRUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQ2xlYXJBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyVGFza3MoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYXNrTGlzdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiB0YXNrTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcHJpdmF0ZSBMaXN0PFRhc2s+IHRhc2tPYmplY3RzID0gbmV3IEFycmF5TGlzdDxUYXNrPigpOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX05BTUVTX0xJU1QgPSAidGFza05hbWVzIjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1NfTElTVCA9ICJ0YXNrcyI7Ci0JCVRhc2tMaXN0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFza05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza05hbWVzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VGFzaz4gdGFza3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrT2JqZWN0cy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJaW50IGluZGV4ID0gdGhpcy50YXNrTmFtZXMuc2l6ZSgpOwotCQkJdGhpcy50YXNrTmFtZXMuYWRkKGluZGV4LCB0YXNrTmFtZSk7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoVEFTS19OQU1FU19MSVNULCBpbmRleCwgdGFza05hbWUpOwotCQotCQkJVGFzayB0YXNrT2JqZWN0ID0gbmV3IFRhc2sodGFza05hbWUpOwotCQkJdGhpcy50YXNrT2JqZWN0cy5hZGQoaW5kZXgsIHRhc2tPYmplY3QpOwotCQkJdGhpcy5maXJlSXRlbUFkZGVkKFRBU0tTX0xJU1QsIGluZGV4LCB0YXNrT2JqZWN0KTsKLQkJfQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnRhc2tOYW1lcy5pbmRleE9mKHRhc2tOYW1lKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCU9iamVjdCByZW1vdmVkVGFzayA9IHRoaXMudGFza05hbWVzLnJlbW92ZShpbmRleCk7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVEFTS19OQU1FU19MSVNULCBpbmRleCwgcmVtb3ZlZFRhc2spOwotCQkJCS8vIGFzc3VtZSB0aGUgaW5kZXhlcyBtYXRjaC4uLgotCQkJCU9iamVjdCByZW1vdmVkVGFza09iamVjdCA9IHRoaXMudGFza09iamVjdHMucmVtb3ZlKGluZGV4KTsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChUQVNLU19MSVNULCBpbmRleCwgcmVtb3ZlZFRhc2tPYmplY3QpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCQl0aGlzLnRhc2tOYW1lcy5jbGVhcigpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVEFTS19OQU1FU19MSVNUKTsKLQkJCXRoaXMudGFza09iamVjdHMuY2xlYXIoKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFRBU0tTX0xJU1QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYXNrIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBEYXRlIGNyZWF0aW9uVGltZVN0YW1wOwotCQlwdWJsaWMgVGFzayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuY3JlYXRpb25UaW1lU3RhbXAgPSBuZXcgRGF0ZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWUgKyAiOiAiICsgdGhpcy5jcmVhdGlvblRpbWVTdGFtcC5nZXRUaW1lKCk7Ci0JCX0KLQkJcHVibGljIEljb24gaWNvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIG8pIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBvKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kaXNwbGF5U3RyaW5nKCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGU4MjU1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMVUVfTElTVCA9IHsicmVkIiwgImdyZWVuIiwgImJsdWUifTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WQUxVRSA9IFZBTFVFX0xJU1RbMF07Ci0KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KERFRkFVTFRfVkFMVUUpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgVkFMVUVfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTcGlubmVyTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlVmFsdWVIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoREVGQVVMVF9WQUxVRSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoVkFMVUVfTElTVFswXSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhTcGlubmVyTW9kZWwgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSgoKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1ZDI4MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IHZhbHVlSG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIHNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+KG5ldyBJbnRlZ2VyKDApKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgLTMzLCAzMywgMSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE51bWJlckNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVNwaW5uZXJNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuc2V0VmFsdWUobmV3IEludGVnZXIoNSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVWYWx1ZUhvbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDcpLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoLTMzKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhTcGlubmVyTW9kZWwgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCAoKE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIpIGFkYXB0ZXIpLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhPYmplY3QgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKCgoTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcikgYWRhcHRlcikuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsSW5pdGlhbFZhbHVlKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+KCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciA9IG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMudmFsdWVIb2xkZXIsIG5ldyBJbnRlZ2VyKC0zMyksIG5ldyBJbnRlZ2VyKDMzKSwgbmV3IEludGVnZXIoMSksIG5ldyBJbnRlZ2VyKDApKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDcpLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzUwNjguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIERlZmF1bHRMaXN0TW9kZWwgbGlzdE1vZGVsOwotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHNlbGVjdGlvbk1vZGVsOwotCi0JcHVibGljIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbCgpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsID0gdGhpcy5idWlsZFNlbGVjdGlvbk1vZGVsKHRoaXMubGlzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIERlZmF1bHRMaXN0TW9kZWwgYnVpbGRMaXN0TW9kZWwoKSB7Ci0JCURlZmF1bHRMaXN0TW9kZWwgbG0gPSBuZXcgRGVmYXVsdExpc3RNb2RlbCgpOwotCQlsbS5hZGRFbGVtZW50KCJmb28iKTsKLQkJbG0uYWRkRWxlbWVudCgiYmFyIik7Ci0JCWxtLmFkZEVsZW1lbnQoImJheiIpOwotCQlyZXR1cm4gbG07Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgYnVpbGRTZWxlY3Rpb25Nb2RlbChMaXN0TW9kZWwgbG0pIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwobG0pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdERhdGFMaXN0ZW5lcigpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZExpc3RTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3Rpb25JbnRlcnZhbCgwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKSk7Ci0JCXRoaXMubGlzdE1vZGVsLnNldCgwLCAiamFyIik7Ci0JCWFzc2VydEVxdWFscygiamFyIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGlvbkludGVydmFsKDAsIDApOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uSW50ZXJ2YWwoMCwgMCk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0aW9uSW50ZXJ2YWwoMiwgMik7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpLCAiZm9vIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCksICJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiZm9vIiwgImJheiJ9KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoImZvbyIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkVmFsdWUoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg0KSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWxlY3RlZFZhbHVlcygpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXoiKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJmb28iKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJiYXIiLCAiamFyIn0pOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgzKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiZm9vIiwgImJheiIsICJqYXIifSk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwucmVtb3ZlU2VsZWN0ZWRWYWx1ZSgiamFyIik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlbGVjdGVkVmFsdWVzKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXoiLCAiam9vIiwgImphciJ9KTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5yZW1vdmVTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiam9vIn0pOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDApKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbmNob3JTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldEFuY2hvclNlbGVjdGlvbkluZGV4KDEpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0QW5jaG9yU2VsZWN0ZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVhZFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRMZWFkU2VsZWN0ZWRWYWx1ZSgpKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiYmF6In0pOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TGVhZFNlbGVjdGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1pbk1heFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiYmFyIiwgImphciJ9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGVkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamFyIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3RlZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUlzU2VsZWN0ZWQoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiYmFyIiwgImphciJ9KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLnZhbHVlSXNTZWxlY3RlZCgiZm9vIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwudmFsdWVJc1NlbGVjdGVkKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC52YWx1ZUlzU2VsZWN0ZWQoImphciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC52YWx1ZUlzU2VsZWN0ZWQoImJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdE1vZGVsLmdldExpc3REYXRhTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5saXN0TW9kZWwuZ2V0TGlzdERhdGFMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnJlbW92ZUxpc3RTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RNb2RlbC5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0U2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKExpc3RTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZyBmb3Igbm93Li4uCi0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1ByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5ZTIwMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1ByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdE11dGFibGVUcmVlTm9kZTsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVNb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlByaW1pdGl2ZUxpc3RUcmVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgVHJlZU1vZGVsIHRyZWVNb2RlbDsKLQotCXB1YmxpYyBQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSB0aGlzLmJ1aWxkVGVzdE1vZGVsKCk7Ci0JCXRoaXMudHJlZU1vZGVsID0gdGhpcy5idWlsZFRyZWVNb2RlbCgpOwotCX0KLQotCXByaXZhdGUgVGVzdE1vZGVsIGJ1aWxkVGVzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRlc3RNb2RlbCgpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwodGhpcy5idWlsZExpc3RWYWx1ZU1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJpbWl0aXZlQ2hhbmdlZChpbnQgaW5kZXgsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJCWlmICggISBuZXdWYWx1ZS5lcXVhbHMoIiIpKSB7Ci0JCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy50aGlzLnRlc3RNb2RlbC5yZXBsYWNlTmFtZShpbmRleCwgKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPD8+IGJ1aWxkTGlzdFZhbHVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBTdHJpbmc+KFRlc3RNb2RlbC5OQU1FU19MSVNULCB0aGlzLnRlc3RNb2RlbCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBpbmRleCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZShpbmRleCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJpbWl0aXZlKCkgewotCQl0aGlzLnRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNJbnNlcnRlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLnRoaXMudmVyaWZ5VHJlZU1vZGVsRXZlbnQoZSwgbmV3IGludFtdIHswfSwgbmV3IFN0cmluZ1tdIHsiZm9vIn0pOwotCQkJfQotCQl9KTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiZm9vIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVByaW1pdGl2ZSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiZm9vIik7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImJhciIpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJiYXoiKTsKLQkJdGhpcy50cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLnRoaXMudmVyaWZ5VHJlZU1vZGVsRXZlbnQoZSwgbmV3IGludFtdIHsxfSwgbmV3IFN0cmluZ1tdIHsiYmFyIn0pOwotCQkJfQotCQl9KTsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLnRlc3RNb2RlbC5yZW1vdmVOYW1lKDEpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUHJpbWl0aXZlKCkgewotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJmb28iKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiYmFyIik7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImJheiIpOwotCQl0aGlzLnRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMudGhpcy52ZXJpZnlUcmVlTW9kZWxFdmVudChlLCBuZXcgaW50W10gezF9LCBuZXcgU3RyaW5nW10geyJqYXIifSk7Ci0JCQl9Ci0JCX0pOwotCQlTdHJpbmcgbmFtZSA9IHRoaXMudGVzdE1vZGVsLnJlcGxhY2VOYW1lKDEsICJqYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBuYW1lKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeVRyZWVNb2RlbEV2ZW50KFRyZWVNb2RlbEV2ZW50IGUsIGludFtdIGV4cGVjdGVkQ2hpbGRJbmRpY2VzLCBTdHJpbmdbXSBleHBlY3RlZE5hbWVzKSB7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZENoaWxkSW5kaWNlcywgZS5nZXRDaGlsZEluZGljZXMoKSkpOwotCQlPYmplY3RbXSBhY3R1YWxDaGlsZHJlbiA9IGUuZ2V0Q2hpbGRyZW4oKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTmFtZXMubGVuZ3RoLCBhY3R1YWxDaGlsZHJlbi5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSBhY3R1YWxDaGlsZHJlbltpXTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZE5hbWVzW2ldLCBub2RlLmdldFVzZXJPYmplY3QoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIGUuZ2V0UGF0aCgpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRyZWVNb2RlbC5nZXRSb290KCksIGUuZ2V0UGF0aCgpWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQl9Ci0KLQotLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG5hbWVzOwotCQkJc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU19MSVNUID0gIm5hbWVzIjsKLQkKLQkJVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJfQotCQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5uYW1lcyk7Ci0JCX0KLQkJcHVibGljIGludCBuYW1lc1NpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lcy5zaXplKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMubmFtZXMuZ2V0KGluZGV4KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKGludCBpbmRleCwgU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgbmFtZSwgdGhpcy5uYW1lcywgTkFNRVNfTElTVCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZShTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5hZGROYW1lKHRoaXMubmFtZXNTaXplKCksIG5hbWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKGludCBpbmRleCwgTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJCXRoaXMuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIHRoaXMubmFtZXMsIGxpc3QsIE5BTUVTX0xJU1QpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCQl0aGlzLmFkZE5hbWVzKHRoaXMubmFtZXNTaXplKCksIGxpc3QpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlTmFtZShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5uYW1lcywgTkFNRVNfTElTVCk7Ci0JCX0KLQkJcHVibGljIExpc3Q8U3RyaW5nPiByZW1vdmVOYW1lcyhpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaW5kZXgsIGxlbmd0aCwgdGhpcy5uYW1lcywgTkFNRVNfTElTVCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyByZXBsYWNlTmFtZShpbnQgaW5kZXgsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXRJdGVtSW5MaXN0KGluZGV4LCBuZXdOYW1lLCB0aGlzLm5hbWVzLCBOQU1FU19MSVNUKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgY2xhc3MgVGVzdFRyZWVNb2RlbExpc3RlbmVyIGltcGxlbWVudHMgVHJlZU1vZGVsTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNJbnNlcnRlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZVN0cnVjdHVyZUNoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjE3YzQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5FdmVudExpc3RlbmVyTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCByZWRCdXR0b25Nb2RlbEFkYXB0ZXI7Ci0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciByZWRMaXN0ZW5lcjsKLQlib29sZWFuIHJlZEV2ZW50RmlyZWQ7Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyOwotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgZ3JlZW5MaXN0ZW5lcjsKLQlib29sZWFuIGdyZWVuRXZlbnRGaXJlZDsKLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcjsKLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJsdWVMaXN0ZW5lcjsKLQlib29sZWFuIGJsdWVFdmVudEZpcmVkOwotCi0vLwlwcml2YXRlIEJ1dHRvbkdyb3VwIGJ1dHRvbkdyb3VwOwkvLyBETyBOT1QgdXNlIGEgQnV0dG9uR3JvdXAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUQgPSAicmVkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFRU4gPSAiZ3JlZW4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFID0gImJsdWUiOwotCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PihudWxsKTsKLS8vCQlidXR0b25Hcm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOwotCi0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyID0gdGhpcy5idWlsZEJ1dHRvbk1vZGVsKHRoaXMudmFsdWVIb2xkZXIsIFJFRCk7Ci0vLwkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0R3JvdXAoYnV0dG9uR3JvdXApOwotCQl0aGlzLnJlZExpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLnRoaXMucmVkRXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0KLQkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlciA9IHRoaXMuYnVpbGRCdXR0b25Nb2RlbCh0aGlzLnZhbHVlSG9sZGVyLCBHUkVFTik7Ci0vLwkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5zZXRHcm91cChidXR0b25Hcm91cCk7Ci0JCXRoaXMuZ3JlZW5MaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmdyZWVuRXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0KLQkJdGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyID0gdGhpcy5idWlsZEJ1dHRvbk1vZGVsKHRoaXMudmFsdWVIb2xkZXIsIEJMVUUpOwotLy8JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5zZXRHcm91cChidXR0b25Hcm91cCk7Ci0JCXRoaXMuYmx1ZUxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLnRoaXMuYmx1ZUV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCQkKLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBidWlsZEJ1dHRvbk1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gcHZtLCBPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcihwdm0sIGJ1dHRvblZhbHVlKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0ZW5Ub01vZGVsQWRhcHRlcnMoKSB7Ci0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMucmVkTGlzdGVuZXIpOwotCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuZ3JlZW5MaXN0ZW5lcik7Ci0JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJsdWVMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRmxhZ3MoKSB7Ci0JCXRoaXMucmVkRXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmdyZWVuRXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJsdWVFdmVudEZpcmVkID0gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZWxlY3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmxpc3RlblRvTW9kZWxBZGFwdGVycygpOwotCi0JCXRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKEdSRUVOLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoQkxVRSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoUkVELCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmxpc3RlblRvTW9kZWxBZGFwdGVycygpOwotCi0JCXRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoQkxVRSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoUkVEKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMubGlzdGVuVG9Nb2RlbEFkYXB0ZXJzKCk7Ci0KLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShHUkVFTik7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKEJMVUUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGxvY2FsVmFsdWVIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKE9iamVjdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IChFdmVudExpc3RlbmVyTGlzdCkgQ2xhc3NUb29scy5maWVsZFZhbHVlKG1vZGVsLCAibGlzdGVuZXJMaXN0Iik7Ci0JCWFzc2VydEVxdWFscygwLCBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IChFdmVudExpc3RlbmVyTGlzdCkgQ2xhc3NUb29scy5maWVsZFZhbHVlKG1vZGVsLCAibGlzdGVuZXJMaXN0Iik7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NTcyNWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlJhZGlvQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiByYWRpbyBidXR0b25zLgotICovCi1wdWJsaWMgY2xhc3MgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNvbG9ySG9sZGVyOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgcmVkQnV0dG9uTW9kZWw7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBncmVlbkJ1dHRvbk1vZGVsOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgYmx1ZUJ1dHRvbk1vZGVsOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5jb2xvckhvbGRlciA9IHRoaXMuYnVpbGRDb2xvckhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMucmVkQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIodGhpcy5jb2xvckhvbGRlciwgVGVzdE1vZGVsLlJFRCk7Ci0JCXRoaXMuZ3JlZW5CdXR0b25Nb2RlbCA9IHRoaXMuYnVpbGRSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcih0aGlzLmNvbG9ySG9sZGVyLCBUZXN0TW9kZWwuR1JFRU4pOwotCQl0aGlzLmJsdWVCdXR0b25Nb2RlbCA9IHRoaXMuYnVpbGRSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcih0aGlzLmNvbG9ySG9sZGVyLCBUZXN0TW9kZWwuQkxVRSk7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZENvbG9ySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBPYmplY3Q+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5DT0xPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT2JqZWN0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29sb3IoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRDb2xvcigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBidWlsZFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gY29sb3JQVk0sIFN0cmluZyBjb2xvcikgewotCQlyZXR1cm4gbmV3IFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKGNvbG9yUFZNLCBjb2xvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCXdpbmRvdy5zZXRMb2NhdGlvbigyMDAsIDIwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRSYWRpb0J1dHRvblBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkUmFkaW9CdXR0b25QYW5lbCgpIHsKLQkJSlBhbmVsIHRhc2tMaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFJlZFJhZGlvQnV0dG9uKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkR3JlZW5SYWRpb0J1dHRvbigpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEJsdWVSYWRpb0J1dHRvbigpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKUmFkaW9CdXR0b24gYnVpbGRSZWRSYWRpb0J1dHRvbigpIHsKLQkJSlJhZGlvQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigpOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0KCJyZWQiKTsKLQkJcmFkaW9CdXR0b24uc2V0TW9kZWwodGhpcy5yZWRCdXR0b25Nb2RlbCk7Ci0JCXJldHVybiByYWRpb0J1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIEpSYWRpb0J1dHRvbiBidWlsZEdyZWVuUmFkaW9CdXR0b24oKSB7Ci0JCUpSYWRpb0J1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oKTsKLQkJcmFkaW9CdXR0b24uc2V0VGV4dCgiZ3JlZW4iKTsKLQkJcmFkaW9CdXR0b24uc2V0TW9kZWwodGhpcy5ncmVlbkJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIHJhZGlvQnV0dG9uOwotCX0KLQotCXByaXZhdGUgSlJhZGlvQnV0dG9uIGJ1aWxkQmx1ZVJhZGlvQnV0dG9uKCkgewotCQlKUmFkaW9CdXR0b24gcmFkaW9CdXR0b24gPSBuZXcgSlJhZGlvQnV0dG9uKCk7Ci0JCXJhZGlvQnV0dG9uLnNldFRleHQoImJsdWUiKTsKLQkJcmFkaW9CdXR0b24uc2V0TW9kZWwodGhpcy5ibHVlQnV0dG9uTW9kZWwpOwotCQlyZXR1cm4gcmFkaW9CdXR0b247Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDb250cm9sUGFuZWwoKSB7Ci0JCUpQYW5lbCBjb250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRDb2xvckJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKCkpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0Q29sb3JCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzZXRDb2xvckFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0Q29sb3JBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IGNvbG9yIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldENvbG9yKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzZXRDb2xvcigpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0Q29sb3IoVGVzdE1vZGVsLkRFRkFVTFRfQ09MT1IpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIGNvbG9yOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfUFJPUEVSVFkgPSAiY29sb3IiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVEID0gInJlZCI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVFTiA9ICJncmVlbiI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFID0gImJsdWUiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT0xPUiA9IFJFRDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMSURfQ09MT1JTID0gewotCQkJCVJFRCwKLQkJCQlHUkVFTiwKLQkJCQlCTFVFCi0JCQl9OwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKCkgewotCQkJdGhpcyhERUZBVUxUX0NPTE9SKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBjb2xvcikgewotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2xvcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihTdHJpbmcgY29sb3IpIHsKLQkJCWlmICggISBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoVkFMSURfQ09MT1JTLCBjb2xvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbG9yKTsKLQkJCX0KLQkJCU9iamVjdCBvbGQgPSB0aGlzLmNvbG9yOwotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTE9SX1BST1BFUlRZLCBvbGQsIGNvbG9yKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmNvbG9yICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmZiNjZmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5QZXJzb25Db2x1bW5BZGFwdGVyOwotCi0vKioKLSAqIE1ha2UgaXQgZWFzeSB0byB0ZXN0IHRoZSB0YWJsZSBtb2RlbCBhZGFwdGVyIGFuZAotICogcmVuZGVyZXJzIHdpdGhvdXQgYW55IGVkaXRpbmcgYWxsb3dlZC4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QgZXh0ZW5kcyBUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFJlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKGFyZ3MpOwotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2x1bW5BZGFwdGVyIGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQZXJzb25Db2x1bW5BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBjb2x1bW5Jc0VkaXRhYmxlKGludCBpbmRleCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDRiMGVmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcjsKLQlTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4obmV3IEludGVnZXIoMCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLnZhbHVlSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZFZhbHVlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVNwaW5uZXJNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQkJYXNzZXJ0RXF1YWxzKFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIsIGUuZ2V0U291cmNlKCkpOwotCQkJfQotCQl9KTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNSksIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlVmFsdWVIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLCBlLmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDcpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNyksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGxvY2FsVmFsdWVIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgZGVsZWdhdGUgPSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUoYWRhcHRlciwgImRlbGVnYXRlIik7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IChPYmplY3RbXSkgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKGRlbGVnYXRlLCAiZ2V0Q2hhbmdlTGlzdGVuZXJzIik7Ci0JCWFzc2VydEVxdWFscygwLCBsaXN0ZW5lcnMubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGRlbGVnYXRlID0gQ2xhc3NUb29scy5maWVsZFZhbHVlKGFkYXB0ZXIsICJkZWxlZ2F0ZSIpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSAoT2JqZWN0W10pIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChkZWxlZ2F0ZSwgImdldENoYW5nZUxpc3RlbmVycyIpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lcnMubGVuZ3RoID09IDApOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2ZWM0NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU3Bpbm5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5EYXRlU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0U3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHNwaW5uZXJzLgotICovCi1wdWJsaWMgY2xhc3MgU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHRlc3RNb2RlbEhvbGRlcjsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBiaXJ0aERhdGVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYmlydGhEYXRlU3Bpbm5lck1vZGVsOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IGFnZUhvbGRlcjsKLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBhZ2VTcGlubmVyTW9kZWw7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZXllQ29sb3JIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgZXllQ29sb3JTcGlubmVyTW9kZWw7Ci0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCi0JCXRoaXMuYmlydGhEYXRlSG9sZGVyID0gdGhpcy5idWlsZEJpcnRoRGF0ZUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuYmlydGhEYXRlU3Bpbm5lck1vZGVsID0gdGhpcy5idWlsZEJpcnRoRGF0ZVNwaW5uZXJNb2RlbCh0aGlzLmJpcnRoRGF0ZUhvbGRlcik7Ci0KLQkJdGhpcy5hZ2VIb2xkZXIgPSB0aGlzLmJ1aWxkQWdlSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5hZ2VTcGlubmVyTW9kZWwgPSB0aGlzLmJ1aWxkQWdlU3Bpbm5lck1vZGVsKHRoaXMuYWdlSG9sZGVyKTsKLQotCQl0aGlzLmV5ZUNvbG9ySG9sZGVyID0gdGhpcy5idWlsZEV5ZUNvbG9ySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5leWVDb2xvclNwaW5uZXJNb2RlbCA9IHRoaXMuYnVpbGRFeWVDb2xvclNwaW5uZXJNb2RlbCh0aGlzLmV5ZUNvbG9ySG9sZGVyKTsKLQotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRCaXJ0aERhdGVIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBPYmplY3Q+KHZtLCBUZXN0TW9kZWwuQklSVEhfREFURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT2JqZWN0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QmlydGhEYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QmlydGhEYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRCaXJ0aERhdGVTcGlubmVyTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKHZhbHVlSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYnVpbGRBZ2VIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBOdW1iZXI+KHZtLCBUZXN0TW9kZWwuQUdFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOdW1iZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRBZ2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhOdW1iZXIgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QWdlKHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkQWdlU3Bpbm5lck1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gdmFsdWVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKHZhbHVlSG9sZGVyLCB2YWx1ZUhvbGRlci5nZXRWYWx1ZSgpLmludFZhbHVlKCksIFRlc3RNb2RlbC5NSU5fQUdFLCBUZXN0TW9kZWwuTUFYX0FHRSwgMSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXllQ29sb3JIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBPYmplY3Q+KHZtLCBUZXN0TW9kZWwuRVlFX0NPTE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeWVDb2xvcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV5ZUNvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEV5ZUNvbG9yU3Bpbm5lck1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcih2YWx1ZUhvbGRlciwgVGVzdE1vZGVsLlZBTElEX0VZRV9DT0xPUlMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNjAwLCAxMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkU3Bpbm5lclBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkU3Bpbm5lclBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQmlydGhEYXRlU3Bpbm5lcigpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEFnZVNwaW5uZXIoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRFeWVDb2xvclNwaW5uZXIoKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRCaXJ0aERhdGVTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYmlydGhEYXRlU3Bpbm5lck1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkQWdlU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmFnZVNwaW5uZXJNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEV5ZUNvbG9yU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmV5ZUNvbG9yU3Bpbm5lck1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXNldE1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24oKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc2V0TW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldEJpcnRoRGF0ZShUZXN0TW9kZWwuREVGQVVMVF9CSVJUSF9EQVRFKTsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0RXllQ29sb3IoVGVzdE1vZGVsLkRFRkFVTFRfRVlFX0NPTE9SKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiaXJ0aCBkYXRlOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0QmlydGhEYXRlKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImFnZTogIiArIHRoaXMudGVzdE1vZGVsLmdldEFnZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJleWVzOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0RXllQ29sb3IoKSk7Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBDYWxlbmRhciBiaXJ0aENhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCQkvLyAidmlydHVhbCIgcHJvcGVydGllcwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklSVEhfREFURV9QUk9QRVJUWSA9ICJiaXJ0aERhdGUiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUdFX1BST1BFUlRZID0gImFnZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9CSVJUSF9EQVRFID0gbmV3IERhdGUoKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQUdFID0gMDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9BR0UgPSAwOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FHRSA9IDE1MDsKLQkJcHJpdmF0ZSBTdHJpbmcgZXllQ29sb3I7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfUFJPUEVSVFkgPSAiZXllQ29sb3IiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9FWUVfQ09MT1JTID0geyJibHVlIiwgImJyb3duIiwgImdyZWVuIiwgImhhemVsIiwgInBpbmsifTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVlFX0NPTE9SID0gVkFMSURfRVlFX0NPTE9SU1szXTsKLQkKLQkJcHVibGljIFRlc3RNb2RlbCgpIHsKLQkJCXRoaXMoREVGQVVMVF9CSVJUSF9EQVRFLCBERUZBVUxUX0VZRV9DT0xPUik7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbChEYXRlIGJpcnRoRGF0ZSwgU3RyaW5nIGV5ZUNvbG9yKSB7Ci0JCQl0aGlzLnNldEJpcnRoRGF0ZShiaXJ0aERhdGUpOwotCQkJdGhpcy5zZXRFeWVDb2xvcihleWVDb2xvcik7Ci0JCX0KLQkJcHVibGljIERhdGUgZ2V0QmlydGhEYXRlKCkgewotCQkJcmV0dXJuIChEYXRlKSB0aGlzLmJpcnRoQ2FsLmdldFRpbWUoKS5jbG9uZSgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEJpcnRoRGF0ZShEYXRlIGJpcnRoRGF0ZSkgewotCQkJRGF0ZSBvbGRCaXJ0aERhdGUgPSB0aGlzLmdldEJpcnRoRGF0ZSgpOwotCQkJaW50IG9sZEFnZSA9IHRoaXMuZ2V0QWdlKCk7Ci0JCQl0aGlzLmJpcnRoQ2FsLnNldFRpbWVJbk1pbGxpcyhiaXJ0aERhdGUuZ2V0VGltZSgpKTsKLQkJCWludCBuZXdBZ2UgPSB0aGlzLmdldEFnZSgpOwotCQkJaWYgKG5ld0FnZSA8IE1JTl9BR0UgfHwgbmV3QWdlID4gTUFYX0FHRSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oYmlydGhEYXRlLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJJUlRIX0RBVEVfUFJPUEVSVFksIG9sZEJpcnRoRGF0ZSwgdGhpcy5nZXRCaXJ0aERhdGUoKSk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUdFX1BST1BFUlRZLCBvbGRBZ2UsIG5ld0FnZSk7Ci0JCX0KLQkJcHVibGljIGludCBnZXRBZ2UoKSB7Ci0JCQlDYWxlbmRhciBjdXJyZW50Q2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWludCBhZ2UgPSBjdXJyZW50Q2FsLmdldChDYWxlbmRhci5ZRUFSKSAtIHRoaXMuYmlydGhDYWwuZ2V0KENhbGVuZGFyLllFQVIpOwotCQkJaWYgKGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSA8IHRoaXMuYmlydGhDYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSkgewotCQkJCWFnZS0tOwotCQkJfSBlbHNlIGlmIChjdXJyZW50Q2FsLmdldChDYWxlbmRhci5NT05USCkgPT0gdGhpcy5iaXJ0aENhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpKSB7Ci0JCQkJaWYgKGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkgPCB0aGlzLmJpcnRoQ2FsLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKSB7Ci0JCQkJCWFnZS0tOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBhZ2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0QWdlKGludCBuZXdBZ2UpIHsKLQkJCWlmIChuZXdBZ2UgPCBNSU5fQUdFIHx8IG5ld0FnZSA+IE1BWF9BR0UpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKG5ld0FnZSkpOwotCQkJfQotCQotCQkJaW50IG9sZEFnZSA9IHRoaXMuZ2V0QWdlKCk7Ci0JCQlpbnQgZGVsdGEgPSBuZXdBZ2UgLSBvbGRBZ2U7Ci0JCi0JCQlDYWxlbmRhciBuZXdCaXJ0aENhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCQluZXdCaXJ0aENhbC5zZXRUaW1lSW5NaWxsaXModGhpcy5iaXJ0aENhbC5nZXRUaW1lKCkuZ2V0VGltZSgpKTsKLQkJCS8vIGlmIHRoZSBhZ2UgaW5jcmVhc2VkLCB0aGUgYmlydGggZGF0ZSBtdXN0IGJlICJkZWNyZWFzZWQiOyBhbmQgdmljZSB2ZXJzYQotCQkJbmV3QmlydGhDYWwuc2V0KENhbGVuZGFyLllFQVIsIG5ld0JpcnRoQ2FsLmdldChDYWxlbmRhci5ZRUFSKSAtIGRlbHRhKTsKLQkJCXRoaXMuc2V0QmlydGhEYXRlKG5ld0JpcnRoQ2FsLmdldFRpbWUoKSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRFeWVDb2xvcigpIHsKLQkJCXJldHVybiB0aGlzLmV5ZUNvbG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEV5ZUNvbG9yKFN0cmluZyBleWVDb2xvcikgewotCQkJaWYgKCAhIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhWQUxJRF9FWUVfQ09MT1JTLCBleWVDb2xvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV5ZUNvbG9yKTsKLQkJCX0KLQkJCU9iamVjdCBvbGQgPSB0aGlzLmV5ZUNvbG9yOwotCQkJdGhpcy5leWVDb2xvciA9IGV5ZUNvbG9yOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVZRV9DT0xPUl9QUk9QRVJUWSwgb2xkLCBleWVDb2xvcik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbChiaXJ0aDogIiArIHRoaXMuZ2V0QmlydGhEYXRlKCkgKyAiIC0gZXllczogIiArIHRoaXMuZXllQ29sb3IgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTNjNzIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRhYmxlTW9kZWxFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UYWJsZU1vZGVsTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIENyb3dkIGNyb3dkOwotCVRhYmxlTW9kZWxFdmVudCBldmVudDsKLQotCXB1YmxpYyBUYWJsZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY3Jvd2QgPSB0aGlzLmJ1aWxkQ3Jvd2QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJvd0NvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZU1vZGVsQWRhcHRlci5nZXRSb3dDb3VudCgpKTsKLQkJLy8gd2UgbmVlZCB0byBhZGQgYSBsaXN0ZW5lciB0byB3YWtlIHVwIHRoZSBhZGFwdGVyCi0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcih0aGlzLmJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jcm93ZC5wZW9wbGVTaXplKCksIHRhYmxlTW9kZWxBZGFwdGVyLmdldFJvd0NvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5Db3VudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRFcXVhbHMoUGVyc29uQ29sdW1uQWRhcHRlci5DT0xVTU5fQ09VTlQsIHRhYmxlTW9kZWxBZGFwdGVyLmdldENvbHVtbkNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcih0aGlzLmJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCkpOwotCi0JCUxpc3Q8U3RyaW5nPiBzb3J0ZWROYW1lcyA9IHRoaXMuc29ydGVkTmFtZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNyb3dkLnBlb3BsZVNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc29ydGVkTmFtZXMuZ2V0KGkpLCB0YWJsZU1vZGVsQWRhcHRlci5nZXRWYWx1ZUF0KGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUYWJsZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChUYWJsZU1vZGVsRXZlbnQgZSkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX0pOwotCi0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLmNyb3dkLnBlcnNvbk5hbWVkKCJHb2xsdW0iKTsKLQkJYXNzZXJ0RXF1YWxzKFBlcnNvbi5FWUVfQ09MT1JfQkxVRSwgcGVyc29uLmdldEV5ZUNvbG9yKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzb24uaXNFdmlsKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGVyc29uLmdldFJhbmsoKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZU1vZGVsQWRhcHRlci5nZXRSb3dDb3VudCgpOyBpKyspIHsKLQkJCWlmICh0YWJsZU1vZGVsQWRhcHRlci5nZXRWYWx1ZUF0KGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pLmVxdWFscygiR29sbHVtIikpIHsKLQkJCQl0YWJsZU1vZGVsQWRhcHRlci5zZXRWYWx1ZUF0KFBlcnNvbi5FWUVfQ09MT1JfSEFaRUwsIGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVlFX0NPTE9SX0NPTFVNTik7Ci0JCQkJdGFibGVNb2RlbEFkYXB0ZXIuc2V0VmFsdWVBdChCb29sZWFuLlRSVUUsIGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVZJTF9DT0xVTU4pOwotCQkJCXRhYmxlTW9kZWxBZGFwdGVyLnNldFZhbHVlQXQobmV3IEludGVnZXIoLTEpLCBpLCBQZXJzb25Db2x1bW5BZGFwdGVyLlJBTktfQ09MVU1OKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHMoUGVyc29uLkVZRV9DT0xPUl9IQVpFTCwgcGVyc29uLmdldEV5ZUNvbG9yKCkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5pc0V2aWwoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgcGVyc29uLmdldFJhbmsoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJvdygpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVFdmVudExpc3RlbmVyKCkpOwotCQkvLyBhZGQgYSBwZXJzb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBzbyB3ZSBvbmx5IHRyaWdnZXIgb25lIGV2ZW50Ci0JCXRoaXMuY3Jvd2QuYWRkUGVyc29uKCJaenp6eiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHMoVGFibGVNb2RlbEV2ZW50LklOU0VSVCwgdGhpcy5ldmVudC5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoVGFibGVNb2RlbEV2ZW50LkFMTF9DT0xVTU5TLCB0aGlzLmV2ZW50LmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUm93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUV2ZW50TGlzdGVuZXIoKSk7Ci0JCS8vIHJlbW92aW5nIGEgcGVyc29uIHNob3VsZCBvbmx5IHRyaWdnZXIgb25lIGV2ZW50LCBzaW5jZSBhIHJlLXNvcnQgaXMgbm90IG5lZWRlZAotCQl0aGlzLmNyb3dkLnJlbW92ZVBlcnNvbih0aGlzLmNyb3dkLnBlcnNvbk5hbWVkKCJHb2xsdW0iKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyhUYWJsZU1vZGVsRXZlbnQuREVMRVRFLCB0aGlzLmV2ZW50LmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUYWJsZU1vZGVsRXZlbnQuQUxMX0NPTFVNTlMsIHRoaXMuZXZlbnQuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VDZWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUV2ZW50TGlzdGVuZXIoKSk7Ci0JCS8vIGFkZCBhIHBlcnNvbiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IHNvIHdlIG9ubHkgdHJpZ2dlciBvbmUgZXZlbnQKLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMuY3Jvd2QucGVyc29uTmFtZWQoIkdvbGx1bSIpOwotCQlwZXJzb24uc2V0RXZpbCh0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKFRhYmxlTW9kZWxFdmVudC5VUERBVEUsIHRoaXMuZXZlbnQuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVZJTF9DT0xVTU4sIHRoaXMuZXZlbnQuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCVRhYmxlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZU1vZGVsTGlzdGVuZXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNyb3dkLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDcm93ZC5QRU9QTEVfQ09MTEVDVElPTikpOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY3Jvd2QuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDcm93ZC5QRU9QTEVfQ09MTEVDVElPTikpOwotCQl0YWJsZU1vZGVsQWRhcHRlci5yZW1vdmVUYWJsZU1vZGVsTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY3Jvd2QuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENyb3dkLlBFT1BMRV9DT0xMRUNUSU9OKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlDZWxsTGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJVGFibGVNb2RlbExpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlTW9kZWxMaXN0ZW5lcigpOwotCQlQZXJzb24gcGVyc29uID0gdGhpcy5jcm93ZC5wZXJzb25OYW1lZCgiR29sbHVtIik7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FWUVfQ09MT1JfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVZJTF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5SQU5LX1BST1BFUlRZKSk7Ci0KLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkJJUlRIX0RBVEVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVZRV9DT0xPUl9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVZJTF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uUkFOS19QUk9QRVJUWSkpOwotCi0JCXRhYmxlTW9kZWxBZGFwdGVyLnJlbW92ZVRhYmxlTW9kZWxMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FWUVfQ09MT1JfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVZJTF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5SQU5LX1BST1BFUlRZKSk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IGJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPih0aGlzLmJ1aWxkU29ydGVkUGVvcGxlQWRhcHRlcigpLCB0aGlzLmJ1aWxkQ29sdW1uQWRhcHRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2VsbExpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQ2VsbExpc3RlbmVyXygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFNvcnRlZFBlb3BsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFBlcnNvbj4odGhpcy5idWlsZFBlb3BsZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkUGVvcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxDcm93ZCwgUGVyc29uPihDcm93ZC5QRU9QTEVfQ09MTEVDVElPTiwgdGhpcy5jcm93ZCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc29uPiBpdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wZW9wbGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnBlb3BsZVNpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENyb3dkIGJ1aWxkQ3Jvd2QoKSB7Ci0JCUNyb3dkIHJlc3VsdCA9IG5ldyBDcm93ZCgpOwotCQlyZXN1bHQuYWRkUGVyc29uKCJCaWxibyIpOwotCQlyZXN1bHQuYWRkUGVyc29uKCJHb2xsdW0iKTsKLQkJcmVzdWx0LmFkZFBlcnNvbigiRnJvZG8iKTsKLQkJcmVzdWx0LmFkZFBlcnNvbigiU2Ftd2lzZSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQ29sdW1uQWRhcHRlciBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUGVyc29uQ29sdW1uQWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgVGFibGVNb2RlbExpc3RlbmVyIGJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRlc3RUYWJsZU1vZGVsTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzb3J0ZWROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuc29ydGVkU2V0KHRoaXMuY3Jvd2QucGVvcGxlTmFtZXMoKSkpOwotCX0KLQotCXByaXZhdGUgVGFibGVNb2RlbExpc3RlbmVyIGJ1aWxkU2luZ2xlRXZlbnRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUZXN0VGFibGVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGVNb2RlbEV2ZW50IGUpIHsKLQkJCQkvLyB3ZSBleHBlY3Qgb25seSBhIHNpbmdsZSBldmVudAotCQkJCWlmIChUYWJsZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPT0gbnVsbCkgewotCQkJCQlUYWJsZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQZXJzb25Db2x1bW5BZGFwdGVyIGltcGxlbWVudHMgQ29sdW1uQWRhcHRlciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DT1VOVCA9IDc7Ci0JCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfQ09MVU1OID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklSVEhfREFURV9DT0xVTU4gPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHT05FX1dFU1RfREFURV9DT0xVTU4gPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWUVfQ09MT1JfQ09MVU1OID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZJTF9DT0xVTU4gPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQU5LX0NPTFVNTiA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEVkVOVFVSRV9DT1VOVF9DT0xVTU4gPSA2OwotCQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5fTkFNRVMgPSBuZXcgU3RyaW5nW10gewotCQkJIk5hbWUiLAotCQkJIkJpcnRoIiwKLQkJCSJHb25lIFdlc3QiLAotCQkJIkV5ZXMiLAotCQkJIkV2aWwiLAotCQkJIlJhbmsiLAotCQkJIkFkdmVudHVyZXMiCi0JCX07Ci0JCi0JCi0JCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQlyZXR1cm4gQ09MVU1OX0NPVU5UOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBDT0xVTU5fTkFNRVNbaW5kZXhdOwotCQl9Ci0JCi0JCXB1YmxpYyBDbGFzczw/PiBjb2x1bW5DbGFzcyhpbnQgaW5kZXgpIHsKLQkJCXN3aXRjaCAoaW5kZXgpIHsKLQkJCQljYXNlIE5BTUVfQ09MVU1OOgkJCQkJcmV0dXJuIE9iamVjdC5jbGFzczsKLQkJCQljYXNlIEJJUlRIX0RBVEVfQ09MVU1OOgkJCXJldHVybiBEYXRlLmNsYXNzOwotCQkJCWNhc2UgR09ORV9XRVNUX0RBVEVfQ09MVU1OOglyZXR1cm4gRGF0ZS5jbGFzczsKLQkJCQljYXNlIEVZRV9DT0xPUl9DT0xVTU46CQkJcmV0dXJuIE9iamVjdC5jbGFzczsKLQkJCQljYXNlIEVWSUxfQ09MVU1OOgkJCQkJcmV0dXJuIEJvb2xlYW4uY2xhc3M7Ci0JCQkJY2FzZSBSQU5LX0NPTFVNTjoJCQkJCXJldHVybiBJbnRlZ2VyLmNsYXNzOwotCQkJCWNhc2UgQURWRU5UVVJFX0NPVU5UX0NPTFVNTjpyZXR1cm4gSW50ZWdlci5jbGFzczsKLQkJCQlkZWZhdWx0OiAJCQkJCQkJCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCQkJfQotCQl9Ci0JCi0JCXB1YmxpYyBib29sZWFuIGNvbHVtbklzRWRpdGFibGUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gaW5kZXggIT0gTkFNRV9DT0xVTU47Ci0JCX0KLQkKLQkJcHVibGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSBjZWxsTW9kZWxzKE9iamVjdCBzdWJqZWN0KSB7Ci0JCQlQZXJzb24gcGVyc29uID0gKFBlcnNvbikgc3ViamVjdDsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJlc3VsdCA9IG5ldyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFtDT0xVTU5fQ09VTlRdOwotCQotCQkJcmVzdWx0W05BTUVfQ09MVU1OXSA9IHRoaXMuYnVpbGROYW1lQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W0JJUlRIX0RBVEVfQ09MVU1OXSA9IHRoaXMuYnVpbGRCaXJ0aERhdGVBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbR09ORV9XRVNUX0RBVEVfQ09MVU1OXSA9IHRoaXMuYnVpbGRHb25lV2VzdERhdGVBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbRVlFX0NPTE9SX0NPTFVNTl0gPSB0aGlzLmJ1aWxkRXllQ29sb3JBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbRVZJTF9DT0xVTU5dID0gdGhpcy5idWlsZEV2aWxBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbUkFOS19DT0xVTU5dID0gdGhpcy5idWlsZFJhbmtBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbQURWRU5UVVJFX0NPVU5UX0NPTFVNTl0gPSB0aGlzLmJ1aWxkQWR2ZW50dXJlQ291bnRBZGFwdGVyKHBlcnNvbik7Ci0JCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZE5hbWVBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uTkFNRV9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUoKFN0cmluZykgdmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkQmlydGhEYXRlQWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLkJJUlRIX0RBVEVfUFJPUEVSVFksIHBlcnNvbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEJpcnRoRGF0ZSgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRCaXJ0aERhdGUoKERhdGUpIHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEdvbmVXZXN0RGF0ZUFkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5HT05FX1dFU1RfREFURV9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIERhdGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0R29uZVdlc3REYXRlKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEdvbmVXZXN0RGF0ZSgoRGF0ZSkgdmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXllQ29sb3JBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV5ZUNvbG9yKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEV5ZUNvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEV2aWxBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uRVZJTF9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRXZpbCgpKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0RXZpbCgoKEJvb2xlYW4pdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZFJhbmtBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uUkFOS19QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0UmFuaygpKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0UmFuaygoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEFkdmVudHVyZUNvdW50QWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLkFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0QWR2ZW50dXJlQ291bnQoKSk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEFkdmVudHVyZUNvdW50KCgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ3Jvd2QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFBlcnNvbj4gcGVvcGxlOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVPUExFX0NPTExFQ1RJT04gPSAicGVvcGxlIjsKLQkKLQkJcHVibGljIENyb3dkKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGVvcGxlID0gbmV3IEFycmF5TGlzdDxQZXJzb24+KCk7Ci0JCX0KLQkKLQkKLQkJcHVibGljIEl0ZXJhdG9yPFBlcnNvbj4gcGVvcGxlKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPFBlcnNvbj4odGhpcy5wZW9wbGUpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoUGVyc29uIHBlcnNvbikgewotCQkJCQlDcm93ZC50aGlzLnJlbW92ZVBlcnNvbihwZXJzb24pOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHVibGljIGludCBwZW9wbGVTaXplKCkgewotCQkJcmV0dXJuIHRoaXMucGVvcGxlLnNpemUoKTsKLQkJfQotCQotCQlwdWJsaWMgUGVyc29uIGFkZFBlcnNvbihTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5jaGVja1BlcnNvbk5hbWUobmFtZSk7Ci0JCQlyZXR1cm4gdGhpcy5hZGRQZXJzb24obmV3IFBlcnNvbih0aGlzLCBuYW1lKSk7Ci0JCX0KLQkKLQkJcHJpdmF0ZSBQZXJzb24gYWRkUGVyc29uKFBlcnNvbiBwZXJzb24pIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihwZXJzb24sIHRoaXMucGVvcGxlLCBQRU9QTEVfQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gcGVyc29uOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBlcnNvbihQZXJzb24gcGVyc29uKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihwZXJzb24sIHRoaXMucGVvcGxlLCBQRU9QTEVfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlUGVvcGxlKENvbGxlY3Rpb248UGVyc29uPiBwZXJzb25zKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocGVyc29ucywgdGhpcy5wZW9wbGUsIFBFT1BMRV9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCByZW1vdmVQZW9wbGUoSXRlcmF0b3I8UGVyc29uPiBwZXJzb25zKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocGVyc29ucywgdGhpcy5wZW9wbGUsIFBFT1BMRV9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQl2b2lkIGNoZWNrUGVyc29uTmFtZShTdHJpbmcgcGVyc29uTmFtZSkgewotCQkJaWYgKHBlcnNvbk5hbWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnBlb3BsZU5hbWVzKCksIHBlcnNvbk5hbWUpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihwZXJzb25OYW1lKTsKLQkJCX0KLQkJfQotCQotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBwZW9wbGVOYW1lcygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQZXJzb24sIFN0cmluZz4odGhpcy5wZW9wbGUuaXRlcmF0b3IoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFBlcnNvbiBwZXJzb24pIHsKLQkJCQkJcmV0dXJuIHBlcnNvbi5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwdWJsaWMgUGVyc29uIHBlcnNvbk5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFBlcnNvbj4gc3RyZWFtID0gdGhpcy5wZW9wbGUuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJUGVyc29uIHBlcnNvbiA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJaWYgKHBlcnNvbi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiBwZXJzb247Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBTdHJpbmcudmFsdWVPZih0aGlzLnBlb3BsZS5zaXplKCkpICsgIiBwZW9wbGUiKTsKLQkJfQotCQotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbiBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBDb21wYXJhYmxlPFBlcnNvbj4gewotCQlwcml2YXRlIENyb3dkIGNyb3dkOwotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWT0gIm5hbWUiOwotCQlwcml2YXRlIERhdGUgYmlydGhEYXRlOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklSVEhfREFURV9QUk9QRVJUWT0gImJpcnRoRGF0ZSI7Ci0JCXByaXZhdGUgRGF0ZSBnb25lV2VzdERhdGU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT05FX1dFU1RfREFURV9QUk9QRVJUWT0gImdvbmVXZXN0RGF0ZSI7Ci0JCXByaXZhdGUgU3RyaW5nIGV5ZUNvbG9yOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX1BST1BFUlRZPSAiZXllQ29sb3IiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX0JMVUUgPSAiYmx1ZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfR1JFRU4gPSAiZ3JlZW4iOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX0JST1dOID0gImJyb3duIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVZRV9DT0xPUl9IQVpFTCA9ICJoYXplbCI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfUElOSyA9ICJwaW5rIjsKLQkJCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiB2YWxpZEV5ZUNvbG9yczsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVlFX0NPTE9SID0gRVlFX0NPTE9SX0JMVUU7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmlsOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZJTF9QUk9QRVJUWT0gImV2aWwiOwotCQlwcml2YXRlIGludCByYW5rOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOS19QUk9QRVJUWT0gInJhbmsiOwotCQlwcml2YXRlIGludCBhZHZlbnR1cmVDb3VudDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWT0gImFkdmVudHVyZUNvdW50IjsKLQkKLQkJUGVyc29uKENyb3dkIGNyb3dkLCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY3Jvd2QgPSBjcm93ZDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmJpcnRoRGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCQlDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWMuYWRkKENhbGVuZGFyLllFQVIsIDI1MCk7Ci0JCQl0aGlzLmdvbmVXZXN0RGF0ZSA9IG5ldyBEYXRlKGMuZ2V0VGltZUluTWlsbGlzKCkpOwotCQkJdGhpcy5leWVDb2xvciA9IERFRkFVTFRfRVlFX0NPTE9SOwotCQkJdGhpcy5ldmlsID0gZmFsc2U7Ci0JCQl0aGlzLnJhbmsgPSAwOwotCQkJdGhpcy5hZHZlbnR1cmVDb3VudCA9IDA7Ci0JCX0KLQkKLQkJcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0VmFsaWRFeWVDb2xvcnMoKSB7Ci0JCQlpZiAodmFsaWRFeWVDb2xvcnMgPT0gbnVsbCkgewotCQkJCXZhbGlkRXllQ29sb3JzID0gYnVpbGRWYWxpZEV5ZUNvbG9ycygpOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkRXllQ29sb3JzOwotCQl9Ci0JCi0JCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZFZhbGlkRXllQ29sb3JzKCkgewotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcmVzdWx0LmFkZChFWUVfQ09MT1JfQkxVRSk7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9HUkVFTik7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9CUk9XTik7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9IQVpFTCk7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9QSU5LKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJcHVibGljIENyb3dkIGdldENyb3dkKCkgewotCQkJcmV0dXJuIHRoaXMuY3Jvd2Q7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmNyb3dkLmNoZWNrUGVyc29uTmFtZShuYW1lKTsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIERhdGUgZ2V0QmlydGhEYXRlKCkgewotCQkJcmV0dXJuIHRoaXMuYmlydGhEYXRlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEJpcnRoRGF0ZShEYXRlIGJpcnRoRGF0ZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMuYmlydGhEYXRlOwotCQkJdGhpcy5iaXJ0aERhdGUgPSBiaXJ0aERhdGU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQklSVEhfREFURV9QUk9QRVJUWSwgb2xkLCBiaXJ0aERhdGUpOwotCQl9Ci0JCi0JCXB1YmxpYyBEYXRlIGdldEdvbmVXZXN0RGF0ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdvbmVXZXN0RGF0ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRHb25lV2VzdERhdGUoRGF0ZSBnb25lV2VzdERhdGUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmdvbmVXZXN0RGF0ZTsKLQkJCXRoaXMuZ29uZVdlc3REYXRlID0gZ29uZVdlc3REYXRlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEdPTkVfV0VTVF9EQVRFX1BST1BFUlRZLCBvbGQsIGdvbmVXZXN0RGF0ZSk7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBnZXRFeWVDb2xvcigpIHsKLQkJCXJldHVybiB0aGlzLmV5ZUNvbG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEV5ZUNvbG9yKFN0cmluZyBleWVDb2xvcikgewotCQkJaWYgKCEgZ2V0VmFsaWRFeWVDb2xvcnMoKS5jb250YWlucyhleWVDb2xvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV5ZUNvbG9yKTsKLQkJCX0KLQkJCU9iamVjdCBvbGQgPSB0aGlzLmV5ZUNvbG9yOwotCQkJdGhpcy5leWVDb2xvciA9IGV5ZUNvbG9yOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVZRV9DT0xPUl9QUk9QRVJUWSwgb2xkLCBleWVDb2xvcik7Ci0JCX0KLQkKLQkJcHVibGljIGJvb2xlYW4gaXNFdmlsKCkgewotCQkJcmV0dXJuIHRoaXMuZXZpbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRFdmlsKGJvb2xlYW4gZXZpbCkgewotCQkJYm9vbGVhbiBvbGQgPSB0aGlzLmV2aWw7Ci0JCQl0aGlzLmV2aWwgPSBldmlsOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVWSUxfUFJPUEVSVFksIG9sZCwgZXZpbCk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBnZXRSYW5rKCkgewotCQkJcmV0dXJuIHRoaXMucmFuazsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRSYW5rKGludCByYW5rKSB7Ci0JCQlpbnQgb2xkID0gdGhpcy5yYW5rOwotCQkJdGhpcy5yYW5rID0gcmFuazsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSQU5LX1BST1BFUlRZLCBvbGQsIHJhbmspOwotCQl9Ci0JCi0JCXB1YmxpYyBpbnQgZ2V0QWR2ZW50dXJlQ291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZHZlbnR1cmVDb3VudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRBZHZlbnR1cmVDb3VudChpbnQgYWR2ZW50dXJlQ291bnQpIHsKLQkJCWludCBvbGQgPSB0aGlzLmFkdmVudHVyZUNvdW50OwotCQkJdGhpcy5hZHZlbnR1cmVDb3VudCA9IGFkdmVudHVyZUNvdW50OwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWSwgb2xkLCBhZHZlbnR1cmVDb3VudCk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBjb21wYXJlVG8oUGVyc29uIHApIHsKLQkJCXJldHVybiB0aGlzLm5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShwLm5hbWUpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZSArIAotCQkJCQkJIlx0Ym9ybjogIiArIERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCkuZm9ybWF0KHRoaXMuYmlydGhEYXRlKSArIAotCQkJCQkJIlx0Z29uZSB3ZXN0OiAiICsgRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKS5mb3JtYXQodGhpcy5nb25lV2VzdERhdGUpICsgCi0JCQkJCQkiXHRleWVzOiAiICsgdGhpcy5leWVDb2xvciArIAotCQkJCQkJIlx0ZXZpbDogIiArIHRoaXMuZXZpbCArIAotCQkJCQkJIlx0cmFuazogIiArIHRoaXMucmFuayArCi0JCQkJCQkiXHRhZHZlbnR1cmVzOiAiICsgdGhpcy5hZHZlbnR1cmVDb3VudAotCQkJOwotCQl9Ci0JCi0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RUYWJsZU1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBUYWJsZU1vZGVsTGlzdGVuZXIgewotCQlUZXN0VGFibGVNb2RlbExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDYwODQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQnV0dG9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDaGVja0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KU3Bpbm5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ29sdW1uOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5DaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbWJvQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRhdGVTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRhYmxlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLkNoZWNrQm94VGFibGVDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TcGlubmVyVGFibGVDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuVGFibGVDZWxsRWRpdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlclRlc3RzLkNyb3dkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRhYmxlTW9kZWxBZGFwdGVyVGVzdHMuUGVyc29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRhYmxlTW9kZWxBZGFwdGVyVGVzdHMuUGVyc29uQ29sdW1uQWRhcHRlcjsKLQotLyoqCi0gKiBhbiBleGFtcGxlIFVJIGZvciB0ZXN0aW5nIHRoZSBUYWJsZU1vZGVsQWRhcHRlcgotICogCSJuYW1lIiBjb2x1bW4gaXMgcmVhZC1vbmx5IHRleHQgZmllbGQKLSAqIAkiYmlydGggZGF0ZSIgY29sdW1uIGlzIGRhdGUgdGV4dCBmaWVsZAotICogCSJnb25lIHdlc3QgZGF0ZSIgY29sdW1uIGlzIGRhdGUgc3Bpbm5lcgotICogCSJleWUgY29sb3IiIGNvbHVtbiBpcyBjb21iby1ib3gKLSAqIAkiZXZpbCIgY29sdW1uIGlzIGNoZWNrIGJveAotICogCSJyYW5rIiBjb2x1bW4gaXMgbnVtYmVyIHRleHQgZmllbGQKLSAqIAkiYWR2ZW50dXJlIGNvdW50IiBjb2x1bW4gaXMgbnVtYmVyIHNwaW5uZXIKLSAqIAotICogTm90ZSB0aGF0IHRoZSB0YWJsZSBtb2RlbCBhbmQgcm93IHNlbGVjdGlvbiBtb2RlbCBzaGFyZSB0aGUgc2FtZQotICogbGlzdCB2YWx1ZSBtb2RlbCAodGhlIHNvcnRlZCBwZW9wbGUgYWRhcHRlcikKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE9iamVjdD4gZXllQ29sb3JzSG9sZGVyOyAgLy8gT2JqZWN0IGJlY2F1c2UgaXQgYWRhcHRzIHRvIGEgY29tYm8tYm94Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxDcm93ZD4gY3Jvd2RIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+IHNlbGVjdGVkUGVyc29uSG9sZGVyOwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UGVyc29uPiBzb3J0ZWRQZW9wbGVBZGFwdGVyOwotCXByaXZhdGUgVGFibGVNb2RlbCB0YWJsZU1vZGVsOwotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHJvd1NlbGVjdGlvbk1vZGVsOwotCXByaXZhdGUgQWN0aW9uIHJlbW92ZUFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiByZW5hbWVBY3Rpb247Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlYyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRTeXN0ZW1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsKLQkJdGhpcy5leWVDb2xvcnNIb2xkZXIgPSB0aGlzLiBidWlsZEV5ZUNvbG9yQ29sbGVjdGlvbkhvbGRlcigpOwotCQl0aGlzLmNyb3dkSG9sZGVyID0gdGhpcy5idWlsZENyb3dkSG9sZGVyKCk7Ci0JCXRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRQZXJzb25Ib2xkZXIoKTsKLQkJdGhpcy5zb3J0ZWRQZW9wbGVBZGFwdGVyID0gdGhpcy5idWlsZFNvcnRlZFBlb3BsZUFkYXB0ZXIoKTsKLQkJdGhpcy50YWJsZU1vZGVsID0gdGhpcy5idWlsZFRhYmxlTW9kZWwoKTsKLQkJdGhpcy5yb3dTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYnVpbGRSb3dTZWxlY3Rpb25Nb2RlbCgpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRFeWVDb2xvckNvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PihuZXcgQXJyYXlMaXN0PE9iamVjdD4oUGVyc29uLmdldFZhbGlkRXllQ29sb3JzKCkpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENyb3dkPiBidWlsZENyb3dkSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDcm93ZD4odGhpcy5idWlsZENyb3dkKCkpOwotCX0KLQotCXByaXZhdGUgQ3Jvd2QgYnVpbGRDcm93ZCgpIHsKLQkJQ3Jvd2QgY3Jvd2QgPSBuZXcgQ3Jvd2QoKTsKLQotCQlQZXJzb24gcCA9IGNyb3dkLmFkZFBlcnNvbigiQmlsYm8iKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX0JST1dOKTsKLQkJcC5zZXRSYW5rKDIyKTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCgxKTsKLQotCQlwID0gY3Jvd2QuYWRkUGVyc29uKCJHb2xsdW0iKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX1BJTkspOwotCQlwLnNldEV2aWwodHJ1ZSk7Ci0JCXAuc2V0UmFuaygyKTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCg1MCk7Ci0KLQkJcCA9IGNyb3dkLmFkZFBlcnNvbigiRnJvZG8iKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX0JMVUUpOwotCQlwLnNldFJhbmsoMzQpOwotCQlwLnNldEFkdmVudHVyZUNvdW50KDEpOwotCi0JCXAgPSBjcm93ZC5hZGRQZXJzb24oIlNhbXdpc2UiKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX0dSRUVOKTsKLQkJcC5zZXRSYW5rKDE5KTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCgxKTsKLQotCQlyZXR1cm4gY3Jvd2Q7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkU2VsZWN0ZWRQZXJzb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRTb3J0ZWRQZW9wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxQZXJzb24+KHRoaXMuYnVpbGRQZW9wbGVOYW1lQWRhcHRlcigpKTsKLQl9Ci0KLQkvLyB0aGUgbGlzdCB3aWxsIG5lZWQgdG8gYmUgcmUtc29ydGVkIGlmIGEgbmFtZSBjaGFuZ2VzCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkUGVvcGxlTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFBlcnNvbj4odGhpcy5idWlsZFBlb3BsZUFkYXB0ZXIoKSwgUGVyc29uLk5BTUVfUFJPUEVSVFkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFBlb3BsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8Q3Jvd2QsIFBlcnNvbj4odGhpcy5jcm93ZEhvbGRlciwgQ3Jvd2QuUEVPUExFX0NPTExFQ1RJT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNvbj4gaXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucGVvcGxlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wZW9wbGVTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZU1vZGVsIGJ1aWxkVGFibGVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+KHRoaXMuc29ydGVkUGVvcGxlQWRhcHRlciwgdGhpcy5idWlsZENvbHVtbkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbHVtbkFkYXB0ZXIgYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBlcnNvbkNvbHVtbkFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBidWlsZFJvd1NlbGVjdGlvbk1vZGVsKCkgewotCQlPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgcnNtID0gbmV3IE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLnNvcnRlZFBlb3BsZUFkYXB0ZXIpKTsKLQkJcnNtLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkUm93U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXJzbS5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfU0VMRUNUSU9OKTsKLQkJcmV0dXJuIHJzbTsKLQl9Ci0KLQlwcml2YXRlIExpc3RTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFJvd1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChMaXN0U2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlLmdldFZhbHVlSXNBZGp1c3RpbmcoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucm93U2VsZWN0aW9uQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHJvd1NlbGVjdGlvbkNoYW5nZWQoTGlzdFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJUGVyc29uIHNlbGVjdGlvbiA9IChQZXJzb24pIHRoaXMucm93U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCQl0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLnNldFZhbHVlKHNlbGVjdGlvbik7Ci0JCWJvb2xlYW4gcGVyc29uU2VsZWN0ZWQgPSAoc2VsZWN0aW9uICE9IG51bGwpOwotCQl0aGlzLnJlbW92ZUFjdGlvbi5zZXRFbmFibGVkKHBlcnNvblNlbGVjdGVkKTsKLQkJdGhpcy5yZW5hbWVBY3Rpb24uc2V0RW5hYmxlZChwZXJzb25TZWxlY3RlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcykpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0TG9jYXRpb24oMjAwLCAyMDApOwotCQl3aW5kb3cuc2V0U2l6ZSg2MDAsIDQwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRUYWJsZVBhbmUoKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVGFibGVQYW5lKCkgewotCQlyZXR1cm4gbmV3IEpTY3JvbGxQYW5lKHRoaXMuYnVpbGRUYWJsZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEpUYWJsZSBidWlsZFRhYmxlKCkgewotCQlKVGFibGUgdGFibGUgPSBuZXcgSlRhYmxlKHRoaXMudGFibGVNb2RlbCk7Ci0JCXRhYmxlLnB1dENsaWVudFByb3BlcnR5KCJ0ZXJtaW5hdGVFZGl0T25Gb2N1c0xvc3QiLCBCb29sZWFuLlRSVUUpOwkvLyBzZWUgSmF2YSBidWcgNTAwNzY1MgotCQl0YWJsZS5zZXRTZWxlY3Rpb25Nb2RlbCh0aGlzLnJvd1NlbGVjdGlvbk1vZGVsKTsKLQkJdGFibGUuc2V0RG91YmxlQnVmZmVyZWQodHJ1ZSk7Ci0JCXRhYmxlLnNldEF1dG9SZXNpemVNb2RlKEpUYWJsZS5BVVRPX1JFU0laRV9ORVhUX0NPTFVNTik7Ci0JCWludCByb3dIZWlnaHQgPSAyMDsJLy8gc3RhcnQgd2l0aCBtaW5pbXVtIG9mIDIwCi0KLQkJLy8gZ29uZSB3ZXN0IGNvbHVtbiAoc3Bpbm5lcikKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oUGVyc29uQ29sdW1uQWRhcHRlci5HT05FX1dFU1RfREFURV9DT0xVTU4pOwotCQlTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIgc3Bpbm5lclJlbmRlcmVyID0gdGhpcy5idWlsZERhdGVTcGlubmVyUmVuZGVyZXIoKTsKLQkJY29sdW1uLnNldENlbGxSZW5kZXJlcihzcGlubmVyUmVuZGVyZXIpOwotCQljb2x1bW4uc2V0Q2VsbEVkaXRvcihuZXcgVGFibGVDZWxsRWRpdG9yQWRhcHRlcih0aGlzLmJ1aWxkRGF0ZVNwaW5uZXJSZW5kZXJlcigpKSk7Ci0JCXJvd0hlaWdodCA9IE1hdGgubWF4KHJvd0hlaWdodCwgc3Bpbm5lclJlbmRlcmVyLnByZWZlcnJlZEhlaWdodCgpKTsKLQotCQkvLyBleWUgY29sb3IgY29sdW1uIChjb21iby1ib3gpCi0JCS8vIHRoZSBqZGsgY29tYm8tYm94IHJlbmRlcmVyIGxvb2tzIGxpa2UgYSB0ZXh0IGZpZWxkCi0JCS8vIHVudGlsIHRoZSB1c2VyIHN0YXJ0cyBhbiBlZGl0IC0gdXNlIGEgY3VzdG9tIG9uZQotCQljb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihQZXJzb25Db2x1bW5BZGFwdGVyLkVZRV9DT0xPUl9DT0xVTU4pOwotCQlDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyIGV5ZUNvbG9yUmVuZGVyZXIgPSB0aGlzLmJ1aWxkRXllQ29sb3JDb21ib0JveFJlbmRlcmVyKCk7Ci0JCWNvbHVtbi5zZXRDZWxsUmVuZGVyZXIoZXllQ29sb3JSZW5kZXJlcik7Ci0JCWNvbHVtbi5zZXRDZWxsRWRpdG9yKG5ldyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKHRoaXMuYnVpbGRFeWVDb2xvckNvbWJvQm94UmVuZGVyZXIoKSkpOwotCQlyb3dIZWlnaHQgPSBNYXRoLm1heChyb3dIZWlnaHQsIGV5ZUNvbG9yUmVuZGVyZXIucHJlZmVycmVkSGVpZ2h0KCkpOwotCi0JCS8vIGV2aWwgKGNoZWNrIGJveCkKLQkJLy8gdGhlIGpkayBjaGVjayBib3ggcmVuZGVyZXIgYW5kIGVkaXRvciBzdWNrIC0gdXNlIGEgY3VzdG9tIG9uZXMKLQkJY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oUGVyc29uQ29sdW1uQWRhcHRlci5FVklMX0NPTFVNTik7Ci0JCUNoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIgZXZpbFJlbmRlcmVyID0gbmV3IENoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIoKTsKLQkJY29sdW1uLnNldENlbGxSZW5kZXJlcihldmlsUmVuZGVyZXIpOwotCQljb2x1bW4uc2V0Q2VsbEVkaXRvcihuZXcgVGFibGVDZWxsRWRpdG9yQWRhcHRlcihuZXcgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcigpKSk7Ci0JCXJvd0hlaWdodCA9IE1hdGgubWF4KHJvd0hlaWdodCwgZXZpbFJlbmRlcmVyLnByZWZlcnJlZEhlaWdodCgpKTsKLQotCQkvLyBhZHZlbnR1cmUgY291bnQgY29sdW1uIChzcGlubmVyKQotCQljb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihQZXJzb25Db2x1bW5BZGFwdGVyLkFEVkVOVFVSRV9DT1VOVF9DT0xVTU4pOwotCQlzcGlubmVyUmVuZGVyZXIgPSB0aGlzLmJ1aWxkTnVtYmVyU3Bpbm5lclJlbmRlcmVyKCk7Ci0JCWNvbHVtbi5zZXRDZWxsUmVuZGVyZXIoc3Bpbm5lclJlbmRlcmVyKTsKLQkJY29sdW1uLnNldENlbGxFZGl0b3IobmV3IFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIodGhpcy5idWlsZE51bWJlclNwaW5uZXJSZW5kZXJlcigpKSk7Ci0JCXJvd0hlaWdodCA9IE1hdGgubWF4KHJvd0hlaWdodCwgc3Bpbm5lclJlbmRlcmVyLnByZWZlcnJlZEhlaWdodCgpKTsKLQotCQl0YWJsZS5zZXRSb3dIZWlnaHQocm93SGVpZ2h0KTsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyIGJ1aWxkRGF0ZVNwaW5uZXJSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIobmV3IERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIgYnVpbGROdW1iZXJTcGlubmVyUmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyKG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyIGJ1aWxkRXllQ29sb3JDb21ib0JveFJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIodGhpcy5idWlsZFJlYWRPbmx5RXllQ29sb3JDb21ib0JveE1vZGVsKCksIHRoaXMuYnVpbGRFeWVDb2xvclJlbmRlcmVyKCkpOwotCX0KLQotCXByaXZhdGUgQ29tYm9Cb3hNb2RlbCBidWlsZFJlYWRPbmx5RXllQ29sb3JDb21ib0JveE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyKHRoaXMuZXllQ29sb3JzSG9sZGVyLCBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2VsbFJlbmRlcmVyIGJ1aWxkRXllQ29sb3JSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBFeWVDb2xvclJlbmRlcmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDb250cm9sUGFuZWwoKSB7Ci0JCUpQYW5lbCBjb250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDAsIDEpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQnV0dG9uUGFuZWwoKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFBlcnNvblBhbmVsKCkpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQnV0dG9uUGFuZWwoKSB7Ci0JCUpQYW5lbCBidXR0b25QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZEFkZEJ1dHRvbigpKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW1vdmVCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVuYW1lQnV0dG9uKCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZEFkZEV5ZUNvbG9yQnV0dG9uKCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZFByaW50QnV0dG9uKCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0QnV0dG9uKCkpOwotCQlyZXR1cm4gYnV0dG9uUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRQZXJzb25QYW5lbCgpIHsKLQkJSlBhbmVsIHBlcnNvblBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkTmFtZVRleHRGaWVsZCgpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRCaXJ0aERhdGVTcGlubmVyKCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZEdvbmVXZXN0RGF0ZVNwaW5uZXIoKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkRXllQ29sb3JDb21ib0JveCgpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRFdmlsQ2hlY2tCb3goKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkUmFua1NwaW5uZXIoKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkQWR2ZW50dXJlQ291bnRTcGlubmVyKCkpOwotCQlyZXR1cm4gcGVyc29uUGFuZWw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZCBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQWRkQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZEFkZEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiYWRkIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5hZGRQZXJzb24oKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBhZGRQZXJzb24oKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lRnJvbVVzZXIoKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRTZWxlY3RlZFBlcnNvbih0aGlzLmNyb3dkKCkuYWRkUGVyc29uKG5hbWUpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVBY3Rpb24oKSB7Ci0JCXRoaXMucmVtb3ZlQWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW1vdmUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbW92ZVBlcnNvbigpOwotCQkJfQotCQl9OwotCQl0aGlzLnJlbW92ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlQWN0aW9uOwotCX0KLQotCXZvaWQgcmVtb3ZlUGVyc29uKCkgewotCQlQZXJzb24gcGVyc29uID0gdGhpcy5zZWxlY3RlZFBlcnNvbigpOwotCQlpZiAocGVyc29uICE9IG51bGwpIHsKLQkJCXRoaXMuY3Jvd2QoKS5yZW1vdmVQZXJzb24ocGVyc29uKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW5hbWUgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbmFtZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW5hbWVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW5hbWVBY3Rpb24oKSB7Ci0JCXRoaXMucmVuYW1lQWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW5hbWUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbmFtZVBlcnNvbigpOwotCQkJfQotCQl9OwotCQl0aGlzLnJlbmFtZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmV0dXJuIHRoaXMucmVuYW1lQWN0aW9uOwotCX0KLQotCXZvaWQgcmVuYW1lUGVyc29uKCkgewotCQlQZXJzb24gcGVyc29uID0gdGhpcy5zZWxlY3RlZFBlcnNvbigpOwotCQlpZiAocGVyc29uICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gdGhpcy5wcm9tcHRVc2VyRm9yTmFtZShwZXJzb24uZ2V0TmFtZSgpKTsKLQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQlwZXJzb24uc2V0TmFtZShuYW1lKTsKLQkJCQl0aGlzLnNldFNlbGVjdGVkUGVyc29uKHBlcnNvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkIGV5ZSBjb2xvciBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQWRkRXllQ29sb3JCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQWRkRXllQ29sb3JBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRBZGRFeWVDb2xvckFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiYWRkIGV5ZSBjb2xvciIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuYWRkRXllQ29sb3IoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBhZGRFeWVDb2xvcigpIHsKLQkJU3RyaW5nIGNvbG9yID0gdGhpcy5wcm9tcHRVc2VyRm9yRXllQ29sb3IoKTsKLQkJaWYgKGNvbG9yICE9IG51bGwpIHsKLQkJCXRoaXMuZXllQ29sb3JzSG9sZGVyLmFkZChjb2xvcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwcm9tcHRVc2VyRm9yRXllQ29sb3IoKSB7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlTdHJpbmcgZXllQ29sb3IgPSBKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coIkV5ZSBDb2xvciIpOwotCQkJaWYgKGV5ZUNvbG9yID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsJCS8vIHVzZXIgcHJlc3NlZCA8Q2FuY2VsPgotCQkJfQotCQkJaWYgKChleWVDb2xvci5sZW5ndGgoKSA9PSAwKSkgewotCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsICJUaGUgZXllIGNvbG9yIGlzIHJlcXVpcmVkLiIsICJJbnZhbGlkIEV5ZSBDb2xvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotCQkJfSBlbHNlIGlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5leWVDb2xvcnNIb2xkZXIuaXRlcmF0b3IoKSwgZXllQ29sb3IpKSB7Ci0JCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgIlRoZSBleWUgY29sb3IgYWxyZWFkeSBleGlzdHMuIiwgIkludmFsaWQgRXllIENvbG9yIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBleWVDb2xvcjsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmludCBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUHJpbnRBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50Q3Jvd2QoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludENyb3dkKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5jcm93ZCgpKTsKLQkJZm9yIChJdGVyYXRvcjxQZXJzb24+IHN0cmVhbSA9IHRoaXMuY3Jvd2QoKS5wZW9wbGUoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc2V0IGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0QWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXQoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXNldCgpIHsKLQkJdGhpcy5jcm93ZEhvbGRlci5zZXRWYWx1ZSh0aGlzLmJ1aWxkQ3Jvd2QoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5ldyBuYW1lIGRpYWxvZyAqKioqKioqKioqCi0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lRnJvbVVzZXIoKSB7Ci0JCXJldHVybiB0aGlzLnByb21wdFVzZXJGb3JOYW1lKG51bGwpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHByb21wdFVzZXJGb3JOYW1lKFN0cmluZyBvcmlnaW5hbE5hbWUpIHsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCVN0cmluZyBuYW1lID0gSk9wdGlvblBhbmUuc2hvd0lucHV0RGlhbG9nKCJQZXJzb24gTmFtZSIpOwotCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwkJLy8gdXNlciBwcmVzc2VkIDxDYW5jZWw+Ci0JCQl9Ci0JCQlpZiAoKG5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAiVGhlIG5hbWUgaXMgcmVxdWlyZWQuIiwgIkludmFsaWQgTmFtZSIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotCQkJfSBlbHNlIGlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jcm93ZCgpLnBlb3BsZU5hbWVzKCksIG5hbWUpKSB7Ci0JCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgIlRoZSBuYW1lIGFscmVhZHkgZXhpc3RzLiIsICJJbnZhbGlkIE5hbWUiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSB0ZXh0IGZpZWxkICoqKioqKioqKioKLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTmFtZVRleHRGaWVsZCgpIHsKLQkJSlRleHRGaWVsZCB0ZXh0RmllbGQgPSBuZXcgSlRleHRGaWVsZCh0aGlzLmJ1aWxkTmFtZURvY3VtZW50KCksIG51bGwsIDApOwotCQl0ZXh0RmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlyZXR1cm4gdGV4dEZpZWxkOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgYnVpbGROYW1lRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBuZXcgRG9jdW1lbnRBZGFwdGVyKHRoaXMuYnVpbGROYW1lQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBTdHJpbmc+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJpcnRoIGRhdGUgc3Bpbm5lciAqKioqKioqKioqCi0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkQmlydGhEYXRlU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmJ1aWxkQmlydGhEYXRlU3Bpbm5lck1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkQmlydGhEYXRlU3Bpbm5lck1vZGVsKCkgewotCQlyZXR1cm4gbmV3IERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMuYnVpbGRCaXJ0aERhdGVBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEJpcnRoRGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0Pih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGF0ZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEJpcnRoRGF0ZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEJpcnRoRGF0ZSgoRGF0ZSkgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnb25lIHdlc3QgZGF0ZSBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRHb25lV2VzdERhdGVTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYnVpbGRHb25lV2VzdERhdGVTcGlubmVyTW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRHb25lV2VzdERhdGVTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy5idWlsZEdvbmVXZXN0RGF0ZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkR29uZVdlc3REYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5HT05FX1dFU1RfREFURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGF0ZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEdvbmVXZXN0RGF0ZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEdvbmVXZXN0RGF0ZSgoRGF0ZSkgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleWUgY29sb3IgY29tYm8tYm94ICoqKioqKioqKioKLQotCXByaXZhdGUgSkNvbWJvQm94IGJ1aWxkRXllQ29sb3JDb21ib0JveCgpIHsKLQkJcmV0dXJuIG5ldyBKQ29tYm9Cb3godGhpcy5idWlsZEV5ZUNvbG9yQ29tYm9Cb3hNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbWJvQm94TW9kZWwgYnVpbGRFeWVDb2xvckNvbWJvQm94TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIodGhpcy5leWVDb2xvcnNIb2xkZXIsIHRoaXMuYnVpbGRFeWVDb2xvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXllQ29sb3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLkVZRV9DT0xPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT2JqZWN0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXllQ29sb3IoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFeWVDb2xvcigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV2aWwgY2hlY2sgYm94ICoqKioqKioqKioKLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkRXZpbENoZWNrQm94KCkgewotCQlKQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCk7Ci0JCWNoZWNrQm94LnNldFRleHQoImV2aWwiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5idWlsZEV2aWxDaGVja0JveE1vZGVsKCkpOwotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBidWlsZEV2aWxDaGVja0JveE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyKHRoaXMuYnVpbGRFdmlsQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRXZpbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgQm9vbGVhbj4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLkVWSUxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNFdmlsKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFdmlsKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmFuayBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRSYW5rU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmJ1aWxkUmFua1NwaW5uZXJNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZFJhbmtTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkUmFua0FkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IGJ1aWxkUmFua0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgTnVtYmVyPih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uUkFOS19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTnVtYmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0UmFuaygpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE51bWJlciB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRSYW5rKHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZHZlbnR1cmUgY291bnQgc3Bpbm5lciAqKioqKioqKioqCi0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkQWR2ZW50dXJlQ291bnRTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYnVpbGRBZHZlbnR1cmVDb3VudFNwaW5uZXJNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEFkdmVudHVyZUNvdW50U3Bpbm5lck1vZGVsKCkgewotCQlyZXR1cm4gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy5idWlsZEFkdmVudHVyZUNvdW50QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYnVpbGRBZHZlbnR1cmVDb3VudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgTnVtYmVyPih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uQURWRU5UVVJFX0NPVU5UX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOdW1iZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRBZHZlbnR1cmVDb3VudCgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE51bWJlciB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRBZHZlbnR1cmVDb3VudCh2YWx1ZS5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcml2YXRlIENyb3dkIGNyb3dkKCkgewotCQlyZXR1cm4gdGhpcy5jcm93ZEhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgUGVyc29uIHNlbGVjdGVkUGVyc29uKCkgewotCQlpZiAodGhpcy5yb3dTZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGlvbkVtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoUGVyc29uKSB0aGlzLnJvd1NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRQZXJzb24oUGVyc29uIHBlcnNvbikgewotCQl0aGlzLnJvd1NlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUocGVyc29uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY3VzdG9tIHJlbmRlcmVyICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBUaGlzIGlzIHNpbXBseSBhbiBleGFtcGxlIG9mIGEgcmVuZGVyZXIgZm9yIHRoZSBlbWJlZGRlZCBjb21iby1ib3guCi0JICogSXQgZG9lcyBub3RoaW5nIHNwZWNpYWwgdW5sZXNzIHlvdSB1bmNvbW1lbnQgdGhlIGNvZGUgYmVsb3cuLi4uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBFeWVDb2xvclJlbmRlcmVyIGV4dGVuZHMgRGVmYXVsdExpc3RDZWxsUmVuZGVyZXIgewotCQlFeWVDb2xvclJlbmRlcmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCQkvLyBqdXN0IGRvIHNvbWV0aGluZyB0byBzaG93IHRoZSByZW5kZXJlciBpcyB3b3JraW5nLi4uCi0JLy8JCXZhbHVlID0gIj4iICsgdmFsdWU7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChsaXN0LCB2YWx1ZSwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWFhNTgyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KVHJlZTsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVNb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSW5kZW50aW5nUHJpbnRXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbExpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZU5vZGVWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVHJlZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCWJvb2xlYW4gZXZlbnRGaXJlZDsKLQotCXB1YmxpYyBUcmVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJvb3QoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE1vZGVsIHJvb3QgPSByb290Tm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJyb290Iiwgcm9vdC5nZXROYW1lKCkpOwotLy8JCXJvb3QuZHVtcCgpOwotLy8JCXJvb3ROb2RlLmR1bXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hpbGQoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQotCQlUZXN0Tm9kZSBleHBlY3RlZCA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlUZXN0Tm9kZSBhY3R1YWwgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRDaGlsZChyb290Tm9kZSwgMSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQotCQlleHBlY3RlZCA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMiIpOwotCQlhY3R1YWwgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRDaGlsZChyb290Tm9kZSwgMik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hpbGRDb3VudCgpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRTb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCi0JCWFzc2VydEVxdWFscyg1LCB0cmVlTW9kZWwuZ2V0Q2hpbGRDb3VudChyb290Tm9kZSkpOwotCi0JCVRlc3ROb2RlIG5vZGUgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRyZWVNb2RlbC5nZXRDaGlsZENvdW50KG5vZGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5kZXhPZkNoaWxkKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0KLQkJVGVzdE5vZGUgY2hpbGQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDAiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRyZWVNb2RlbC5nZXRJbmRleE9mQ2hpbGQocm9vdE5vZGUsIGNoaWxkKSk7Ci0KLQkJY2hpbGQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRyZWVNb2RlbC5nZXRJbmRleE9mQ2hpbGQocm9vdE5vZGUsIGNoaWxkKSk7Ci0KLQkJY2hpbGQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRyZWVNb2RlbC5nZXRJbmRleE9mQ2hpbGQocm9vdE5vZGUsIGNoaWxkKSk7Ci0JCVRlc3ROb2RlIGdyYW5kY2hpbGQgPSBjaGlsZC5jaGlsZE5hbWVkKCJub2RlIDIuMiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgdHJlZU1vZGVsLmdldEluZGV4T2ZDaGlsZChjaGlsZCwgZ3JhbmRjaGlsZCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xlYWYoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJYXNzZXJ0RmFsc2UodHJlZU1vZGVsLmlzTGVhZihyb290Tm9kZSkpOwotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCWFzc2VydEZhbHNlKHRyZWVNb2RlbC5pc0xlYWYobm9kZSkpOwotCQlub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAzIik7Ci0JCWFzc2VydFRydWUodHJlZU1vZGVsLmlzTGVhZihub2RlKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZU5vZGVzQ2hhbmdlZCgpIHsKLQkJLy8gdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSAibm9kZSBjaGFuZ2VkIiBldmVudCBpcyB0byB1c2UgYW4gdW5zb3J0ZWQgdHJlZTsKLQkJLy8gYSBzb3J0ZWQgdHJlZSB3aWxsIHdpbGwgdHJpZ2dlciBvbmx5ICJub2RlIHJlbW92ZWQiIGFuZCAibm9kZSBpbnNlcnRlZCIgZXZlbnRzCi0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCVRlc3RNb2RlbCB0bSA9IG5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCXRtLnNldE5hbWUoIm5vZGUgMSsrIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJbm9kZSA9IG5vZGUuY2hpbGROYW1lZCgibm9kZSAxLjEiKTsKLQkJdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5zZXROYW1lKCJub2RlIDEuMSsrIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZU5vZGVzSW5zZXJ0ZWQoKSB7Ci0JCS8vIHVzZSBhbiB1bnNvcnRlZCB0cmVlIHNvIHRoZSBub2RlcyBhcmUgbm90IHJlLXNodWZmbGVkLi4uCi0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNJbnNlcnRlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlUZXN0TW9kZWwgdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5hZGRDaGlsZCgibmV3IGNoaWxkLi4uIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJbm9kZSA9IG5vZGUuY2hpbGROYW1lZCgibm9kZSAxLjEiKTsKLQkJdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5hZGRDaGlsZCgiYW5vdGhlciBuZXcgY2hpbGQuLi4iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlTm9kZXNSZW1vdmVkKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFVuc29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE1vZGVsIHJvb3QgPSByb290Tm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJcm9vdC5yZW1vdmVDaGlsZChyb290LmNoaWxkTmFtZWQoIm5vZGUgMyIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCi0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAyIik7Ci0JCVRlc3RNb2RlbCB0bSA9IG5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCXRtLnJlbW92ZUNoaWxkKHRtLmNoaWxkTmFtZWQoIm5vZGUgMi4yIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKCkgewotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gbm9kZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGRTb3J0ZWRSb290Tm9kZSgpKTsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRUcmVlTW9kZWwobm9kZUhvbGRlcik7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlU3RydWN0dXJlQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlub2RlSG9sZGVyLnNldFZhbHVlKHRoaXMuYnVpbGRVbnNvcnRlZFJvb3ROb2RlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhIHByb2JsZW0gd2UgaGFkIHdoZXJlIHJlbW92aW5nIGEgY2hpbGQgZnJvbSBhIHRyZWUgd291bGQgY2F1c2UKLQkgKiB0aGUgSlRyZWUgdG8gY2FsbCAjZXF1YWxzKE9iamVjdCkgb24gZWFjaCBub2RlIHJlbW92ZWQgKGFjdHVhbGx5LCBpdCB3YXMKLQkgKiBUcmVlUGF0aCwgYnV0IHRoYXQgd2FzIGJlY2F1c2UgaXRzIG93biAjZXF1YWxzKE9iamVjdCkgd2FzIGNhbGxlZCBieQotCSAqIEpUcmVlKTsgYW5kIHNpbmNlIHdlIGhhZCBhbHJlYWR5IHJlbW92ZWQgdGhlIGxhc3QgbGlzdGVuZXIgZnJvbSB0aGUKLQkgKiBhc3BlY3QgYWRhcHRlciwgdGhlIGFzcGVjdCBhZGFwdGVyIHdvdWxkIHNheSBpdHMgdmFsdWUgd2FzIG51bGw7IHRoaXMKLQkgKiB3b3VsZCBjYXVzZSBhIE5QRSB1bnRpbCB3ZSB0d2Vha2VkIFRyZWVNb2RlbEFkYXB0ZXIgdG8gcmVtb3ZlIGl0cwotCSAqIGxpc3RlbmVycyBmcm9tIGEgbm9kZSBvbmx5ICphZnRlciogdGhlIG5vZGUgaGFkIGJlZW4gY29tcGxldGVseQotCSAqIHJlbW92ZWQgZnJvbSB0aGUgSlRyZWUKLQkgKiBAc2VlIFRyZWVNb2RlbEFkYXB0ZXIjcmVtb3ZlTm9kZShPYmplY3RbXSwgaW50LCBUcmVlTm9kZVZhbHVlTW9kZWwpCi0JICogQHNlZSBUcmVlTW9kZWxBZGFwdGVyI2FkZE5vZGUoT2JqZWN0W10sIGludCwgVHJlZU5vZGVWYWx1ZU1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMYXp5SW5pdGlhbGl6YXRpb24oKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU3BlY2lhbFRyZWVNb2RlbCgpOwotCQlKVHJlZSBqVHJlZSA9IG5ldyBKVHJlZSh0cmVlTW9kZWwpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE1vZGVsIHJvb3QgPSByb290Tm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJLy8gdGhpcyB3b3VsZCBjYXVzZSBhIE5QRToKLQkJcm9vdC5yZW1vdmVDaGlsZChyb290LmNoaWxkTmFtZWQoIm5vZGUgMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKHRyZWVNb2RlbCwgalRyZWUuZ2V0TW9kZWwoKSk7Ci0JfQotCi0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFNvcnRlZFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwodGhpcy5idWlsZFNvcnRlZFJvb3ROb2RlKCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE5vZGUgYnVpbGRTb3J0ZWRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFVuc29ydGVkVHJlZU1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyZWVNb2RlbCh0aGlzLmJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBVbnNvcnRlZFRlc3ROb2RlKHRoaXMuYnVpbGRSb290KCkpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkU3BlY2lhbFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwodGhpcy5idWlsZFNwZWNpYWxSb290Tm9kZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkU3BlY2lhbFJvb3ROb2RlKCkgewotCQlyZXR1cm4gbmV3IFNwZWNpYWxUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCBidWlsZFJvb3QoKSB7Ci0JCVRlc3RNb2RlbCByb290ID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQkvKk5vZGUgbm9kZV8wID0gKi9yb290LmFkZENoaWxkKCJub2RlIDAiKTsKLQkJVGVzdE1vZGVsIG5vZGVfMSA9IHJvb3QuYWRkQ2hpbGQoIm5vZGUgMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8xXzEgPSBub2RlXzEuYWRkQ2hpbGQoIm5vZGUgMS4xIik7Ci0JCS8qTm9kZSBub2RlXzFfMV8xID0gKi9ub2RlXzFfMS5hZGRDaGlsZCgibm9kZSAxLjEuMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8yID0gcm9vdC5hZGRDaGlsZCgibm9kZSAyIik7Ci0JCS8qTm9kZSBub2RlXzJfMCA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMCIpOwotCQkvKk5vZGUgbm9kZV8yXzEgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjEiKTsKLQkJLypOb2RlIG5vZGVfMl8yID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4yIik7Ci0JCS8qTm9kZSBub2RlXzJfMyA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMyIpOwotCQkvKk5vZGUgbm9kZV8yXzQgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjQiKTsKLQkJLypOb2RlIG5vZGVfMl81ID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi41Iik7Ci0JCS8qTm9kZSBub2RlXzMgPSAqL3Jvb3QuYWRkQ2hpbGQoIm5vZGUgMyIpOwotCQkvKk5vZGUgbm9kZV80ID0gKi9yb290LmFkZENoaWxkKCJub2RlIDQiKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgYSB0eXBpY2FsIG1vZGVsIGNsYXNzIHdpdGggdGhlIHR5cGljYWwgY2hhbmdlIG5vdGlmaWNhdGlvbnMKLQkgKiBmb3IgI25hbWUgYW5kICNjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCS8vIHRoZSAgcGFyZW50IGlzIGltbXV0YWJsZTsgdGhlIHJvb3QncyBwYXJlbnQgaXMgbnVsbAotCQlwcml2YXRlIGZpbmFsIFRlc3RNb2RlbCBwYXJlbnQ7Ci0KLQkJLy8gdGhlIG5hbWUgaXMgbXV0YWJsZTsgc28gSSBndWVzcyBpdCBpc24ndCB0aGUgInByaW1hcnkga2V5IiA6LSkKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFRlc3RNb2RlbD4gY2hpbGRyZW47Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRFJFTl9DT0xMRUNUSU9OID0gImNoaWxkcmVuIjsKLQotCi0JCXB1YmxpYyBUZXN0TW9kZWwoU3RyaW5nIG5hbWUpIHsJLy8gcm9vdCBjdG9yCi0JCQl0aGlzKG51bGwsIG5hbWUpOwotCQl9Ci0JCXByaXZhdGUgVGVzdE1vZGVsKFRlc3RNb2RlbCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBIYXNoQmFnPFRlc3RNb2RlbD4oKTsKLQkJfQotCi0JCXB1YmxpYyBUZXN0TW9kZWwgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMucGFyZW50OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPFRlc3RNb2RlbD4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8VGVzdE1vZGVsPih0aGlzLmNoaWxkcmVuKTsKLQkJfQotCQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsIGFkZENoaWxkKFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJCVRlc3RNb2RlbCBjaGlsZCA9IG5ldyBUZXN0TW9kZWwodGhpcywgY2hpbGROYW1lKTsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihjaGlsZCwgdGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gY2hpbGQ7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbFtdIGFkZENoaWxkcmVuKFN0cmluZ1tdIGNoaWxkTmFtZXMpIHsKLQkJCVRlc3RNb2RlbFtdIG5ld0NoaWxkcmVuID0gbmV3IFRlc3RNb2RlbFtjaGlsZE5hbWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQluZXdDaGlsZHJlbltpXSA9IG5ldyBUZXN0TW9kZWwodGhpcywgY2hpbGROYW1lc1tpXSk7Ci0JCQl9Ci0JCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKG5ld0NoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLCBDSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBuZXdDaGlsZHJlbjsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChUZXN0TW9kZWwgY2hpbGQpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKGNoaWxkLCB0aGlzLmNoaWxkcmVuLCBDSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZHJlbihUZXN0TW9kZWxbXSB0ZXN0TW9kZWxzKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24odGVzdE1vZGVscywgdGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJDaGlsZHJlbigpIHsKLQkJCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuY2hpbGRyZW4sIENISUxEUkVOX0NPTExFQ1RJT04pOwotCQl9Ci0JCXB1YmxpYyBUZXN0TW9kZWwgY2hpbGROYW1lZChTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCQlmb3IgKFRlc3RNb2RlbCBjaGlsZCA6IHRoaXMuY2hpbGRyZW4pIHsKLQkJCQlpZiAoY2hpbGQuZ2V0TmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKSB7Ci0JCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2hpbGQgbm90IGZvdW5kOiAiICsgY2hpbGROYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZHVtcFN0cmluZygpIHsKLQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCUluZGVudGluZ1ByaW50V3JpdGVyIGlwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihzdyk7Ci0JCQl0aGlzLmR1bXBPbihpcHcpOwotCQkJcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHVtcE9uKEluZGVudGluZ1ByaW50V3JpdGVyIHdyaXRlcikgewotCQkJd3JpdGVyLnByaW50bG4odGhpcyk7Ci0JCQl3cml0ZXIuaW5kZW50KCk7Ci0JCQlmb3IgKFRlc3RNb2RlbCBjaGlsZCA6IHRoaXMuY2hpbGRyZW4pIHsKLQkJCQljaGlsZC5kdW1wT24od3JpdGVyKTsKLQkJCX0KLQkJCXdyaXRlci51bmRlbnQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkdW1wT24oT3V0cHV0U3RyZWFtIHN0cmVhbSkgewotCQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtKSk7Ci0JCQl0aGlzLmR1bXBPbih3cml0ZXIpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHVtcCgpIHsKLQkJCXRoaXMuZHVtcE9uKFN5c3RlbS5vdXQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5hbWUpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgTm9kZSB3cmFwcyBhIFRlc3RNb2RlbCBhbmQgY29udmVydHMgaW50byBzb21ldGhpbmcgdGhhdCBjYW4KLQkgKiBiZSB1c2VkIGJ5IFRyZWVNb2RlbEFkYXB0ZXIuIEl0IGNvbnZlcnRzIGNoYW5nZXMgdG8gdGhlIFRlc3RNb2RlbCdzCi0JICogbmFtZSBpbnRvICJzdGF0ZSBjaGFuZ2VzIiB0byB0aGUgTm9kZTsgYW5kIGNvbnZlcnRzIHRoZQotCSAqIFRlc3RNb2RlbCdzIGNoaWxkcmVuIGludG8gYSBMaXN0VmFsdWVNb2RlbCBvZiBOb2RlcyB3aG9zZSBvcmRlciBpcwotCSAqIGRldGVybWluZWQgYnkgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVGVzdE5vZGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+IGltcGxlbWVudHMgRGlzcGxheWFibGUgewotCQkvKiogdGhlIG1vZGVsIG9iamVjdCB3cmFwcGVkIGJ5IHRoaXMgbm9kZSAqLwotCQlwcml2YXRlIGZpbmFsIFRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JCS8qKiB0aGlzIG5vZGUncyBwYXJlbnQgbm9kZTsgbnVsbCBmb3IgdGhlIHJvb3Qgbm9kZSAqLwotCQlwcml2YXRlIGZpbmFsIFRlc3ROb2RlIHBhcmVudDsKLQkJLyoqIHRoaXMgbm9kZSdzIGNoaWxkIG5vZGVzICovCi0JCXByaXZhdGUgZmluYWwgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGNoaWxkcmVuTW9kZWw7Ci0JCS8qKiBhIGxpc3RlbmVyIHRoYXQgbm90aWZpZXMgdXMgd2hlbiB0aGUgbW9kZWwgb2JqZWN0J3MgImludGVybmFsIHN0YXRlIiBjaGFuZ2VzICovCi0JCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0ZXN0TW9kZWxMaXN0ZW5lcjsKLQotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCQkvKioKLQkJICogcm9vdCBub2RlIGNvbnN0cnVjdG9yCi0JCSAqLwotCQlwdWJsaWMgVGVzdE5vZGUoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJdGhpcyhudWxsLCB0ZXN0TW9kZWwpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGJyYW5jaCBvciBsZWFmIG5vZGUgY29uc3RydWN0b3IKLQkJICovCi0JCXB1YmxpYyBUZXN0Tm9kZShUZXN0Tm9kZSBwYXJlbnQsIFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMudGVzdE1vZGVsID0gdGVzdE1vZGVsOwotCQkJdGhpcy5jaGlsZHJlbk1vZGVsID0gdGhpcy5idWlsZENoaWxkcmVuTW9kZWwodGVzdE1vZGVsKTsKLQkJCXRoaXMudGVzdE1vZGVsTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGVzdE1vZGVsTGlzdGVuZXIoKTsKLQkJfQotCi0JCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRlc3RNb2RlbExpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQkJVGVzdE5vZGUudGhpcy50ZXN0TW9kZWxDaGFuZ2VkKGUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogc3ViY2xhc3NlcyBkZWNpZGUgdGhlIG9yZGVyIG9mIHRoZSBjaGlsZCBub2RlcwotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZENoaWxkcmVuTW9kZWwoVGVzdE1vZGVsIG1vZGVsKTsKLQotCQkvKioKLQkJICogdXNlZCBieSBzdWJjbGFzc2VzOwotCQkgKiB0cmFuc2Zvcm0gdGhlIHRlc3QgbW9kZWwgY2hpbGRyZW4gaW50byBub2RlcwotCQkgKi8KLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZE5vZGVBZGFwdGVyKFRlc3RNb2RlbCBtb2RlbCkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxUZXN0TW9kZWwsIFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkQ2hpbGRyZW5BZGFwdGVyKG1vZGVsKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBUZXN0Tm9kZSB0cmFuc2Zvcm1JdGVtKFRlc3RNb2RlbCBpdGVtKSB7Ci0JCQkJCXJldHVybiBUZXN0Tm9kZS50aGlzLmJ1aWxkQ2hpbGROb2RlKGl0ZW0pOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogc3ViY2xhc3NlcyBtdXN0IGJ1aWxkIGEgY29uY3JldGUgbm9kZSBmb3IgdGhlIHNwZWNpZmllZCB0ZXN0IG1vZGVsCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGVzdE5vZGUgYnVpbGRDaGlsZE5vZGUoVGVzdE1vZGVsIGNoaWxkVGVzdE1vZGVsKTsKLQotCQkvKioKLQkJICogcmV0dXJuIGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBvbiB0aGUgc3BlY2lmaWVkIG1vZGVsJ3MgY2hpbGRyZW4KLQkJICovCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxUZXN0TW9kZWw+IGJ1aWxkQ2hpbGRyZW5BZGFwdGVyKFRlc3RNb2RlbCBtb2RlbCkgewotCQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFRlc3RNb2RlbD4oVGVzdE1vZGVsLkNISUxEUkVOX0NPTExFQ1RJT04sIG1vZGVsKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFRlc3RNb2RlbD4gaXRlcmF0b3JfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuY2hpbGRyZW5TaXplKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBUcmVlTm9kZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCXB1YmxpYyBUZXN0TW9kZWwgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXN0TW9kZWw7Ci0JCX0KLQotCQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4gcGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMucGFyZW50OwotCQl9Ci0KLQkJcHVibGljIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbDsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlKCkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSwgdGhpcy50ZXN0TW9kZWxMaXN0ZW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWUoKSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5OQU1FX1BST1BFUlRZLCB0aGlzLnRlc3RNb2RlbExpc3RlbmVyKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBEaXNwbGF5YWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMudGVzdE1vZGVsLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBkZWJ1Z2dpbmcgc3VwcG9ydCAqKioqKioqKioqCi0KLQkJcHVibGljIFN0cmluZyBkdW1wU3RyaW5nKCkgewotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgaXB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKHN3KTsKLQkJCXRoaXMuZHVtcE9uKGlwdyk7Ci0JCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGR1bXBPbihJbmRlbnRpbmdQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJCXdyaXRlci5wcmludGxuKHRoaXMpOwotCQkJd3JpdGVyLmluZGVudCgpOwotCQkJZm9yIChJdGVyYXRvcjxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbk1vZGVsLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCS8vIGNhc3QgdG8gYSBUZXN0Tm9kZSAoaS5lLiB0aGlzIHdvbid0IHdvcmsgd2l0aCBhIE5hbWVUZXN0Tm9kZSBpbiB0aGUgdHJlZSkKLQkJCQkoKFRlc3ROb2RlKSBzdHJlYW0ubmV4dCgpKS5kdW1wT24od3JpdGVyKTsKLQkJCX0KLQkJCXdyaXRlci51bmRlbnQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGR1bXBPbihPdXRwdXRTdHJlYW0gc3RyZWFtKSB7Ci0JCQlJbmRlbnRpbmdQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihzdHJlYW0pKTsKLQkJCXRoaXMuZHVtcE9uKHdyaXRlcik7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGR1bXAoKSB7Ci0JCQl0aGlzLmR1bXBPbihTeXN0ZW0ub3V0KTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIHRoZSBtb2RlbCdzIG5hbWUgaGFzIGNoYW5nZWQsIGZvcndhcmQgdGhlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHRlc3RNb2RlbENoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkvLyB3ZSBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcnMgdGhhdCBvdXIgImludGVybmFsIHN0YXRlIiBoYXMgY2hhbmdlZAotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCQkvLyBvdXIgZGlzcGxheSBzdHJpbmcgc3RheXMgaW4gc3luY2ggd2l0aCB0aGUgbW9kZWwncyBuYW1lCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIGUuZ2V0T2xkVmFsdWUoKSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCQlwdWJsaWMgVGVzdE1vZGVsIGdldFRlc3RNb2RlbCgpIHsKLQkJCXJldHVybiB0aGlzLnRlc3RNb2RlbDsKLQkJfQotCi0JCS8qKgotCQkgKiB0ZXN0aW5nIGNvbnZlbmllbmNlIG1ldGhvZAotCQkgKi8KLQkJcHVibGljIFRlc3ROb2RlIGNoaWxkTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJCWZvciAoSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW5Nb2RlbC5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PiBjaGlsZE5vZGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChjaGlsZE5vZGUgaW5zdGFuY2VvZiBUZXN0Tm9kZSkgewotCQkJCQlpZiAoKChUZXN0Tm9kZSkgY2hpbGROb2RlKS5nZXRUZXN0TW9kZWwoKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQlyZXR1cm4gKFRlc3ROb2RlKSBjaGlsZE5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjaGlsZCBub3QgZm91bmQ6ICIgKyBuYW1lKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCQkvKioKLQkJICogdXNlIHRoZSBzdGFuZGFyZCBEaXNwbGF5YWJsZSBjb21wYXJhdG9yCi0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhEaXNwbGF5YWJsZSBkKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9DT01QQVJBVE9SLmNvbXBhcmUodGhpcywgZCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiTm9kZSgiICsgdGhpcy50ZXN0TW9kZWwgKyAiKSI7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIHRoYXQga2VlcHMgaXRzIGNoaWxkcmVuIHNvcnRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU29ydGVkVGVzdE5vZGUgZXh0ZW5kcyBUZXN0Tm9kZSB7Ci0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQlwdWJsaWMgU29ydGVkVGVzdE5vZGUoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIodGVzdE1vZGVsKTsKLQkJfQotCQlwdWJsaWMgU29ydGVkVGVzdE5vZGUoVGVzdE5vZGUgcGFyZW50LCBUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlc3RNb2RlbCk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkJLyoqIHRoZSBsaXN0IHNob3VsZCBiZSBzb3J0ZWQgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkRGlzcGxheVN0cmluZ0FkYXB0ZXIodGVzdE1vZGVsKSk7Ci0JCX0KLQkJLyoqIHRoZSBkaXNwbGF5IHN0cmluZyAobmFtZSkgb2YgZWFjaCBub2RlIGNhbiBjaGFuZ2UgKi8KLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZERpc3BsYXlTdHJpbmdBZGFwdGVyKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkTm9kZUFkYXB0ZXIodGVzdE1vZGVsKSwgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpOwotCQl9Ci0JCS8qKiBjaGlsZHJlbiBhcmUgYWxzbyBzb3J0ZWQgbm9kZXMgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBUZXN0Tm9kZSBidWlsZENoaWxkTm9kZShUZXN0TW9kZWwgY2hpbGROb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IFNvcnRlZFRlc3ROb2RlKHRoaXMsIGNoaWxkTm9kZSk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gdGhhdCBsZWF2ZXMgaXRzIGNoaWxkcmVuIHVuc29ydGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBVbnNvcnRlZFRlc3ROb2RlIGV4dGVuZHMgVGVzdE5vZGUgewotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkJcHVibGljIFVuc29ydGVkVGVzdE5vZGUoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIodGVzdE1vZGVsKTsKLQkJfQotCQlwdWJsaWMgVW5zb3J0ZWRUZXN0Tm9kZShUZXN0Tm9kZSBwYXJlbnQsIFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKHBhcmVudCwgdGVzdE1vZGVsKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQkvKiogdGhlIGxpc3Qgc2hvdWxkIE5PVCBiZSBzb3J0ZWQgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkTm9kZUFkYXB0ZXIodGVzdE1vZGVsKTsKLQkJfQotCQkvKiogY2hpbGRyZW4gYXJlIGFsc28gdW5zb3J0ZWQgbm9kZXMgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBUZXN0Tm9kZSBidWlsZENoaWxkTm9kZShUZXN0TW9kZWwgY2hpbGROb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IFVuc29ydGVkVGVzdE5vZGUodGhpcywgY2hpbGROb2RlKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGxlYXZlcyBpdHMgY2hpbGRyZW4gdW5zb3J0ZWQKLQkgKiBhbmQgaGFzIGEgc3BlY2lhbCBzZXQgb2YgY2hpbGRyZW4gZm9yICJub2RlIDMiCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTcGVjaWFsVGVzdE5vZGUgZXh0ZW5kcyBVbnNvcnRlZFRlc3ROb2RlIHsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCXB1YmxpYyBTcGVjaWFsVGVzdE5vZGUoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIodGVzdE1vZGVsKTsKLQkJfQotCQlwdWJsaWMgU3BlY2lhbFRlc3ROb2RlKFRlc3ROb2RlIHBhcmVudCwgVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIocGFyZW50LCB0ZXN0TW9kZWwpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCS8qKiByZXR1cm4gYSBkaWZmZXJlbnQgbGlzdCBvZiBjaGlsZHJlbiBmb3IgIm5vZGUgMyIgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCWlmICh0ZXN0TW9kZWwuZ2V0TmFtZSgpLmVxdWFscygibm9kZSAzIikpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZFNwZWNpYWxDaGlsZHJlbk1vZGVsKHRlc3RNb2RlbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuYnVpbGRDaGlsZHJlbk1vZGVsKHRlc3RNb2RlbCk7Ci0JCX0KLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZFNwZWNpYWxDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+W10gY2hpbGRyZW4gPSBuZXcgTmFtZVRlc3ROb2RlWzFdOwotCQkJY2hpbGRyZW5bMF0gPSBuZXcgTmFtZVRlc3ROb2RlKHRoaXMpOwotCQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4oQXJyYXlzLmFzTGlzdChjaGlsZHJlbikpOwotCQl9Ci0JCS8qKiBjaGlsZHJlbiBhcmUgYWxzbyBzcGVjaWFsIG5vZGVzICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgVGVzdE5vZGUgYnVpbGRDaGlsZE5vZGUoVGVzdE1vZGVsIGNoaWxkTm9kZSkgewotCQkJcmV0dXJuIG5ldyBTcGVjaWFsVGVzdE5vZGUodGhpcywgY2hpbGROb2RlKTsKLQkJfQotCi0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVUZXN0Tm9kZSBleHRlbmRzIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4gewotCQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JCXByaXZhdGUgZmluYWwgU3BlY2lhbFRlc3ROb2RlIHNwZWNpYWxOb2RlOwkJLy8gcGFyZW50IG5vZGUKLQkJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG5hbWVMaXN0ZW5lcjsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gY2hpbGRyZW5Nb2RlbDsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIE5hbWVUZXN0Tm9kZShTcGVjaWFsVGVzdE5vZGUgc3BlY2lhbE5vZGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWVMaXN0ZW5lciA9IHRoaXMuYnVpbGROYW1lTGlzdGVuZXIoKTsKLQkJCXRoaXMuc3BlY2lhbE5vZGUgPSBzcGVjaWFsTm9kZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIoKTsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IG5ldyBOdWxsTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KCk7Ci0JCX0KLQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROYW1lTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCQlOYW1lVGVzdE5vZGUudGhpcy5uYW1lQ2hhbmdlZChlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFN0cmluZz4oVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFksIHRoaXMuZ2V0VGVzdE1vZGVsKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBUZXN0TW9kZWwgZ2V0VGVzdE1vZGVsKCkgewotCQkJcmV0dXJuIHRoaXMuc3BlY2lhbE5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIFRyZWVOb2RlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZSgoU3RyaW5nKSB2YWx1ZSk7Ci0JCX0KLQkJcHVibGljIFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+IHBhcmVudCgpIHsKLQkJCXJldHVybiB0aGlzLnNwZWNpYWxOb2RlOwotCQl9Ci0JCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gY2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuTW9kZWw7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWUoKSB7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5hbWVMaXN0ZW5lcik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlKCkgewotCQkJdGhpcy5uYW1lQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5uYW1lTGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkJcHJvdGVjdGVkIHZvaWQgbmFtZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkvLyB3ZSBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcnMgdGhhdCBvdXIgInZhbHVlIiBoYXMgY2hhbmdlZAotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBlLmdldE9sZFZhbHVlKCksIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFRyZWVNb2RlbChUZXN0Tm9kZSByb290KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJlZU1vZGVsKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHJvb3QpKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFRyZWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IHJvb3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmVlTW9kZWxBZGFwdGVyPE9iamVjdD4ocm9vdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZENoaWxkcmVuTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVN0YXRlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROb2RlU3RhdGVMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROb2RlVmFsdWVMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE5vZGVWYWx1ZUxpc3RlbmVyXygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFJvb3RMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZFJvb3RMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCi0JLyoqCi0JICogbGlzdGVuZXIgdGhhdCB3aWxsIGJsb3cgdXAgd2l0aCBhbnkgZXZlbnQ7Ci0JICogb3ZlcnJpZGUgYW5kIGltcGxlbWVudCBleHBlY3RlZCBldmVudCBtZXRob2RzCi0JICovCi0JcHVibGljIGNsYXNzIFRlc3RUcmVlTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIFRyZWVNb2RlbExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc1JlbW92ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyYzViMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LlRleHRGaWVsZDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUcmVlOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdFRyZWVTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVQYXRoOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZVNlbGVjdGlvbk1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbnVtZXJhdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVOb2RlVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyVGVzdHMuU29ydGVkVGVzdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVHJlZU1vZGVsQWRhcHRlclRlc3RzLlRlc3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyVGVzdHMuVGVzdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVHJlZU1vZGVsQWRhcHRlclRlc3RzLlVuc29ydGVkVGVzdE5vZGU7Ci0KLS8qKgotICogYW4gZXhhbXBsZSBVSSBmb3IgdGVzdGluZyB0aGUgVHJlZU1vZGVsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVHJlZU1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQkvLyBob2xkIHRoZSB0cmVlIHNvIHdlIGNhbiByZXN0b3JlIGl0cyBleHBhbnNpb24gc3RhdGUKLQlwcml2YXRlIEpUcmVlIHRyZWU7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gcm9vdE5vZGVIb2xkZXI7Ci0JcHJpdmF0ZSBib29sZWFuIHNvcnRlZDsKLQlwcml2YXRlIFRyZWVNb2RlbCB0cmVlTW9kZWw7Ci0JcHJpdmF0ZSBUcmVlU2VsZWN0aW9uTW9kZWwgdHJlZVNlbGVjdGlvbk1vZGVsOwotCXByaXZhdGUgVGV4dEZpZWxkIG5hbWVUZXh0RmllbGQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKGFyZ3MpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5yb290Tm9kZUhvbGRlciA9IHRoaXMuYnVpbGRSb290Tm9kZUhvbGRlcigpOwotCQl0aGlzLnNvcnRlZCA9IHRoaXMucm9vdE5vZGVIb2xkZXIuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFNvcnRlZFRlc3ROb2RlOwotCQl0aGlzLnRyZWVNb2RlbCA9IHRoaXMuYnVpbGRUcmVlTW9kZWwoKTsKLQkJdGhpcy50cmVlU2VsZWN0aW9uTW9kZWwgPSB0aGlzLmJ1aWxkVHJlZVNlbGVjdGlvbk1vZGVsKCk7Ci0JCXRoaXMubmFtZVRleHRGaWVsZCA9IG5ldyBUZXh0RmllbGQoKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRSb290Tm9kZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGRTb3J0ZWRSb290Tm9kZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkU29ydGVkUm9vdE5vZGUoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkVGVzdE5vZGUodGhpcy5idWlsZFJvb3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSBidWlsZFVuc29ydGVkUm9vdE5vZGUoKSB7Ci0JCXJldHVybiBuZXcgVW5zb3J0ZWRUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCBidWlsZFJvb3QoKSB7Ci0JCVRlc3RNb2RlbCByb290ID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCi0JCVRlc3RNb2RlbCBub2RlXzEgPSByb290LmFkZENoaWxkKCJub2RlIDEiKTsKLQkJLypOb2RlIG5vZGVfMV8xID0gKi9ub2RlXzEuYWRkQ2hpbGQoIm5vZGUgMS4xIik7Ci0KLQkJVGVzdE1vZGVsIG5vZGVfMiA9IHJvb3QuYWRkQ2hpbGQoIm5vZGUgMiIpOwotCQkvKk5vZGUgbm9kZV8yXzEgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjEiKTsKLQkJVGVzdE1vZGVsIG5vZGVfMl8yID0gbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMiIpOwotCQkvKk5vZGUgbm9kZV8yXzJfMSA9ICovbm9kZV8yXzIuYWRkQ2hpbGQoIm5vZGUgMi4yLjEiKTsKLQkJLypOb2RlIG5vZGVfMl8yXzIgPSAqL25vZGVfMl8yLmFkZENoaWxkKCJub2RlIDIuMi4yIik7Ci0JCS8qTm9kZSBub2RlXzJfMyA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMyIpOwotCQkvKk5vZGUgbm9kZV8yXzQgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjQiKTsKLQkJLypOb2RlIG5vZGVfMl81ID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi41Iik7Ci0KLQkJVGVzdE1vZGVsIG5vZGVfMyA9IHJvb3QuYWRkQ2hpbGQoIm5vZGUgMyIpOwotCQlUZXN0TW9kZWwgbm9kZV8zXzEgPSBub2RlXzMuYWRkQ2hpbGQoIm5vZGUgMy4xIik7Ci0JCVRlc3RNb2RlbCBub2RlXzNfMV8xID0gbm9kZV8zXzEuYWRkQ2hpbGQoIm5vZGUgMy4xLjEiKTsKLQkJLypOb2RlIG5vZGVfM18xXzFfMSA9ICovbm9kZV8zXzFfMS5hZGRDaGlsZCgibm9kZSAzLjEuMS4xIik7Ci0KLQkJLypOb2RlIG5vZGVfNCA9ICovcm9vdC5hZGRDaGlsZCgibm9kZSA0Iik7Ci0KLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWwgYnVpbGRUcmVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgVHJlZU1vZGVsQWRhcHRlcjxPYmplY3Q+KHRoaXMucm9vdE5vZGVIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgVHJlZVNlbGVjdGlvbk1vZGVsIGJ1aWxkVHJlZVNlbGVjdGlvbk1vZGVsKCkgewotCQlUcmVlU2VsZWN0aW9uTW9kZWwgdHNtID0gbmV3IERlZmF1bHRUcmVlU2VsZWN0aW9uTW9kZWwoKTsKLQkJdHNtLmFkZFRyZWVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkVHJlZVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQl0c20uc2V0U2VsZWN0aW9uTW9kZShUcmVlU2VsZWN0aW9uTW9kZWwuU0lOR0xFX1RSRUVfU0VMRUNUSU9OKTsKLQkJcmV0dXJuIHRzbTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFRyZWVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmVlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoVHJlZVNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMudHJlZVNlbGVjdGlvbkNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB0cmVlU2VsZWN0aW9uQ2hhbmdlZChUcmVlU2VsZWN0aW9uRXZlbnQgZSkgewotCQlUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwgPSB0aGlzLnNlbGVjdGVkVGVzdE1vZGVsKCk7Ci0JCWlmIChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLm5hbWVUZXh0RmllbGQuc2V0VGV4dChzZWxlY3RlZFRlc3RNb2RlbC5nZXROYW1lKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0TG9jYXRpb24oMzAwLCAzMDApOwotCQl3aW5kb3cuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRUcmVlUGFuZSgpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRUcmVlUGFuZSgpIHsKLQkJcmV0dXJuIG5ldyBKU2Nyb2xsUGFuZSh0aGlzLmJ1aWxkVHJlZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEpUcmVlIGJ1aWxkVHJlZSgpIHsKLQkJdGhpcy50cmVlID0gbmV3IEpUcmVlKHRoaXMudHJlZU1vZGVsKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9UZXh0KE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBleHBhbmRlZCwgYm9vbGVhbiBsZWFmLCBpbnQgcm93LCBib29sZWFuIGhhc0ZvY3VzKSB7Ci0JCQkJcmV0dXJuICgoRGlzcGxheWFibGUpIHZhbHVlKS5kaXNwbGF5U3RyaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMudHJlZS5zZXRTZWxlY3Rpb25Nb2RlbCh0aGlzLnRyZWVTZWxlY3Rpb25Nb2RlbCk7Ci0JCXRoaXMudHJlZS5zZXRSb290VmlzaWJsZSh0cnVlKTsKLQkJdGhpcy50cmVlLnNldFNob3dzUm9vdEhhbmRsZXModHJ1ZSk7Ci0JCXRoaXMudHJlZS5zZXRSb3dIZWlnaHQoMjApOwotCQl0aGlzLnRyZWUuc2V0RG91YmxlQnVmZmVyZWQodHJ1ZSk7Ci0JCXJldHVybiB0aGlzLnRyZWU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDb250cm9sUGFuZWwoKSB7Ci0JCUpQYW5lbCBjb250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDAsIDEpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkUmVuYW1lTm9kZVBhbmVsKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRNaXNjUGFuZWwoKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRBZGRSZW5hbWVOb2RlUGFuZWwoKSB7Ci0JCUpQYW5lbCBhZGRSZW5hbWVOb2RlUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCWFkZFJlbmFtZU5vZGVQYW5lbC5hZGQodGhpcy5idWlsZEFkZEJ1dHRvbigpLCBCb3JkZXJMYXlvdXQuV0VTVCk7Ci0JCWFkZFJlbmFtZU5vZGVQYW5lbC5hZGQodGhpcy5uYW1lVGV4dEZpZWxkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJYWRkUmVuYW1lTm9kZVBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVuYW1lQnV0dG9uKCksIEJvcmRlckxheW91dC5FQVNUKTsKLQkJcmV0dXJuIGFkZFJlbmFtZU5vZGVQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1pc2NQYW5lbCgpIHsKLQkJSlBhbmVsIG1pc2NQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQltaXNjUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhckNoaWxkcmVuQnV0dG9uKCkpOwotCQltaXNjUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW1vdmVCdXR0b24oKSk7Ci0JCW1pc2NQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0QnV0dG9uKCkpOwotCQlyZXR1cm4gbWlzY1BhbmVsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVUZXh0RmllbGQuZ2V0VGV4dCgpOwotCX0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBUZXN0Tm9kZSBzZWxlY3RlZE5vZGUoKSB7Ci0JCWlmICh0aGlzLnRyZWVTZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGlvbkVtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoVGVzdE5vZGUpIHRoaXMudHJlZVNlbGVjdGlvbk1vZGVsLmdldFNlbGVjdGlvblBhdGgoKS5nZXRMYXN0UGF0aENvbXBvbmVudCgpOwotCX0KLQotCXByaXZhdGUgVGVzdE1vZGVsIHNlbGVjdGVkVGVzdE1vZGVsKCkgewotCQlpZiAodGhpcy50cmVlU2VsZWN0aW9uTW9kZWwuaXNTZWxlY3Rpb25FbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZE5vZGUoKS5nZXRWYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgVGVzdE5vZGUgcm9vdE5vZGUoKSB7Ci0JCXJldHVybiAoVGVzdE5vZGUpIHRoaXMudHJlZU1vZGVsLmdldFJvb3QoKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCByb290KCkgewotCQlyZXR1cm4gdGhpcy5yb290Tm9kZSgpLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFRyZWVQYXRoPiBleHBhbmRlZFBhdGhzKCkgewotCQlFbnVtZXJhdGlvbjxUcmVlUGF0aD4gc3RyZWFtID0gdGhpcy50cmVlLmdldEV4cGFuZGVkRGVzY2VuZGFudHMobmV3IFRyZWVQYXRoKHRoaXMucm9vdE5vZGUoKSkpOwotCQlpZiAoc3RyZWFtID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QobmV3IEVudW1lcmF0aW9uSXRlcmF0b3I8VHJlZVBhdGg+KHN0cmVhbSkpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZE5vZGUoVGVzdE5vZGUgc2VsZWN0ZWROb2RlKSB7Ci0JCXRoaXMudHJlZVNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGlvblBhdGgobmV3IFRyZWVQYXRoKHNlbGVjdGVkTm9kZS5wYXRoKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhwYW5kUGF0aHMoQ29sbGVjdGlvbjxUcmVlUGF0aD4gcGF0aHMpIHsKLQkJZm9yIChUcmVlUGF0aCBwYXRoIDogcGF0aHMpIHsKLQkJCXRoaXMudHJlZS5leHBhbmRQYXRoKHBhdGgpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBhZGQgKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEFkZEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRBZGRBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRBZGRBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImFkZCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5hZGROb2RlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIGFkZGluZyBjYXVzZXMgdGhlIHRyZWUgdG8gYmUgc29ydGVkIGFuZCBub2RlcyB0byBiZQotCSAqIHJlbW92ZWQgYW5kIHJlLWFkZGVkOyBzbyB3ZSBoYXZlIHRvIGZpZGRsZSB3aXRoIHRoZSBleHBhbnNpb24gc3RhdGUKLQkgKi8KLQl2b2lkIGFkZE5vZGUoKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJaWYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCQkvLyBzYXZlIHRoZSBleHBhbnNpb24gc3RhdGUgYW5kIHJlc3RvcmUgaXQgYWZ0ZXIgdGhlIGFkZAotCQkJQ29sbGVjdGlvbjxUcmVlUGF0aD4gcGF0aHMgPSB0aGlzLmV4cGFuZGVkUGF0aHMoKTsKLQotCQkJc2VsZWN0ZWRUZXN0TW9kZWwuYWRkQ2hpbGQobmFtZSk7Ci0KLQkJCXRoaXMuZXhwYW5kUGF0aHMocGF0aHMpOwotCQkJdGhpcy5zZXRTZWxlY3RlZE5vZGUodGhpcy5zZWxlY3RlZE5vZGUoKS5jaGlsZE5hbWVkKG5hbWUpKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW1vdmVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVtb3ZlQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVtb3ZlQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW1vdmUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVtb3ZlTm9kZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggbm9kZSB0byBzZWxlY3QgYWZ0ZXIKLQkgKiB0aGUgc2VsZWN0ZWQgbm9kZSBpcyBkZWxldGVkCi0JICovCi0Jdm9pZCByZW1vdmVOb2RlKCkgewotCQlUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwgPSB0aGlzLnNlbGVjdGVkVGVzdE1vZGVsKCk7Ci0JCS8vIGRvIG5vdCBhbGxvdyB0aGUgcm9vdCB0byBiZSByZW1vdmVkCi0JCWlmICgoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gbnVsbCkgJiYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IHRoaXMucm9vdCgpKSkgewotCQkJLy8gc2F2ZSB0aGUgcGFyZW50IGFuZCBpbmRleCwgc28gd2UgY2FuIHNlbGVjdCBhbm90aGVyLCBuZWFyYnksIG5vZGUKLQkJCS8vIG9uY2UgdGhlIHNlbGVjdGVkIG5vZGUgaXMgcmVtb3ZlZAotCQkJVGVzdE5vZGUgcGFyZW50Tm9kZSA9IChUZXN0Tm9kZSkgdGhpcy5zZWxlY3RlZE5vZGUoKS5wYXJlbnQoKTsKLQkJCWludCBjaGlsZEluZGV4ID0gcGFyZW50Tm9kZS5pbmRleE9mQ2hpbGQodGhpcy5zZWxlY3RlZE5vZGUoKSk7Ci0KLQkJCXNlbGVjdGVkVGVzdE1vZGVsLmdldFBhcmVudCgpLnJlbW92ZUNoaWxkKHNlbGVjdGVkVGVzdE1vZGVsKTsKLQotCQkJaW50IGNoaWxkcmVuU2l6ZSA9IHBhcmVudE5vZGUuY2hpbGRyZW5TaXplKCk7Ci0JCQlpZiAoY2hpbGRJbmRleCA8IGNoaWxkcmVuU2l6ZSkgewotCQkJCS8vIHNlbGVjdCB0aGUgY2hpbGQgdGhhdCBtb3ZlZCB1cCBhbmQgcmVwbGFjZWQgdGhlIGp1c3QtZGVsZXRlZCBjaGlsZAotCQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKChUZXN0Tm9kZSkgcGFyZW50Tm9kZS5jaGlsZChjaGlsZEluZGV4KSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjaGlsZHJlblNpemUgPT0gMCkgewotCQkJCQkvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBjaGlsZHJlbiwgc2VsZWN0IHRoZSBwYXJlbnQKLQkJCQkJdGhpcy5zZXRTZWxlY3RlZE5vZGUocGFyZW50Tm9kZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gaWYgdGhlIGNoaWxkIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3Qgd2FzIGRlbGV0ZWQsIHNlbGVjdCB0aGUgbmV4dCBjaGlsZCB1cAotCQkJCQl0aGlzLnNldFNlbGVjdGVkTm9kZSgoVGVzdE5vZGUpIHBhcmVudE5vZGUuY2hpbGQoY2hpbGRJbmRleCAtIDEpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlbmFtZSAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVuYW1lQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlbmFtZUFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlbmFtZUFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVuYW1lIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbmFtZU5vZGUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoqCi0JICogcmVuYW1pbmcgY2F1c2VzIHRoZSB0cmVlIHRvIGJlIHNvcnRlZCBhbmQgbm9kZXMgdG8gYmUKLQkgKiByZW1vdmVkIGFuZCByZS1hZGRlZDsgc28gd2UgaGF2ZSB0byBmaWRkbGUgd2l0aCB0aGUgZXhwYW5zaW9uIHN0YXRlCi0JICovCi0Jdm9pZCByZW5hbWVOb2RlKCkgewotCQlUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwgPSB0aGlzLnNlbGVjdGVkVGVzdE1vZGVsKCk7Ci0JCWlmIChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBzYXZlIHRoZSBub2RlIGFuZCByZS1zZWxlY3QgaXQgYWZ0ZXIgdGhlIHJlbmFtZQotCQkJVGVzdE5vZGUgc2VsZWN0ZWROb2RlID0gdGhpcy5zZWxlY3RlZE5vZGUoKTsKLQkJCS8vIHNhdmUgdGhlIGV4cGFuc2lvbiBzdGF0ZSBhbmQgcmVzdG9yZSBpdCBhZnRlciB0aGUgcmVuYW1lCi0JCQlDb2xsZWN0aW9uPFRyZWVQYXRoPiBwYXRocyA9IHRoaXMuZXhwYW5kZWRQYXRocygpOwotCi0JCQlzZWxlY3RlZFRlc3RNb2RlbC5zZXROYW1lKHRoaXMuZ2V0TmFtZSgpKTsKLQotCQkJdGhpcy5leHBhbmRQYXRocyhwYXRocyk7Ci0JCQl0aGlzLnNldFNlbGVjdGVkTm9kZShzZWxlY3RlZE5vZGUpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBjbGVhciBjaGlsZHJlbiAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQ2xlYXJDaGlsZHJlbkJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRDbGVhckNoaWxkcmVuQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQ2xlYXJDaGlsZHJlbkFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiY2xlYXIgY2hpbGRyZW4iKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJDaGlsZHJlbigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBub3RoaW5nIHNwZWNpYWwsIHdlIGp1c3Qgd2FudCB0byB0ZXN0ICNmaXJlQ29sbGVjdGlvbkNoYW5nZWQoU3RyaW5nKQotCSAqLwotCXZvaWQgY2xlYXJDaGlsZHJlbigpIHsKLQkJVGVzdE1vZGVsIHNlbGVjdGVkVGVzdE1vZGVsID0gdGhpcy5zZWxlY3RlZFRlc3RNb2RlbCgpOwotCQlpZiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gbnVsbCkgewotCQkJc2VsZWN0ZWRUZXN0TW9kZWwuY2xlYXJDaGlsZHJlbigpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiByZXNldCAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzZXRBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXQoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoqCi0JICogdGVzdCB0aGUgYWRhcHRlcidzIHJvb3Qgbm9kZSBob2xkZXI7Ci0JICogdG9nZ2xlIGJldHdlZW4gc29ydGVkIGFuZCB1bnNvcnRlZCBsaXN0cwotCSAqLwotCXZvaWQgcmVzZXQoKSB7Ci0JCXRoaXMuc29ydGVkID0gISB0aGlzLnNvcnRlZDsKLQkJaWYgKHRoaXMuc29ydGVkKSB7Ci0JCQl0aGlzLnJvb3ROb2RlSG9sZGVyLnNldFZhbHVlKHRoaXMuYnVpbGRTb3J0ZWRSb290Tm9kZSgpKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucm9vdE5vZGVIb2xkZXIuc2V0VmFsdWUodGhpcy5idWlsZFVuc29ydGVkUm9vdE5vZGUoKSk7Ci0JCX0KLQkJdGhpcy50cmVlLmV4cGFuZFBhdGgobmV3IFRyZWVQYXRoKHRoaXMucm9vdE5vZGUoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9ub2RlL0Fic3RyYWN0Tm9kZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0MWQ2OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuQWJzdHJhY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLlByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3ROb2RlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0V29ya2JlbmNoTW9kZWwgcm9vdDsKLQotCXB1YmxpYyBBYnN0cmFjdE5vZGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnJvb3QgPSB0aGlzLmJ1aWxkUm9vdCgpOwotCX0KLQotCXByaXZhdGUgVGVzdFdvcmtiZW5jaE1vZGVsIGJ1aWxkUm9vdCgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHIgPSBuZXcgUm9vdFRlc3RXb3JrYmVuY2hNb2RlbCgicm9vdCIpOwotCQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUxID0gci5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUxXzEgPSBub2RlMS5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxLjEiKTsKLQkJCQkJbm9kZTFfMS5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxLjEuMSIpOwotCQkJCQlub2RlMV8xLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMS4yIik7Ci0JCQkJCW5vZGUxXzEuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJCQlub2RlMS5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxLjIiKTsKLQkJCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlMiA9IHIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMiIpOwotCQkJCW5vZGUyLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDIuMSIpOwotCQkJCW5vZGUyLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDIuMiIpOwotCQkJci5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAzIik7Ci0JCQlyLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDQiKTsKLQotCQkvLyBtYXJrIHRoZSBlbnRpcmUgdHJlZSBjbGVhbgotCQlyLm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRlc3RXb3JrYmVuY2hNb2RlbCgpIHsKLQkJLy8gbWFrZSBzdXJlIG91ciB0ZXN0IGNsYXNzIHdvcmtzIE9LLi4uCi0JCWFzc2VydE51bGwodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDEiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDEiKS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAxIikuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMiIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMiIpLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDIiKS5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnROdWxsKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAyLjEiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgiIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAyLjEiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMi4xIikuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAyLjEiKS5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIikpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIikuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpLmlzQ2xlYW5CcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcmVudEFuZENoaWxkcmVuKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCWFzc2VydEVxdWFscygibm9kZSAxLjEuMyIsIG5vZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuY2hpbGRyZW4oKSkpOwotCi0JCW5vZGUgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRFcXVhbHMoIm5vZGUgMS4xIiwgbm9kZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5jaGlsZHJlbigpKSk7Ci0KLQkJbm9kZSA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydEVxdWFscygibm9kZSAxIiwgbm9kZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5jaGlsZHJlbigpKSk7Ci0KLQkJbm9kZSA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydEVxdWFscygicm9vdCIsIG5vZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuY2hpbGRyZW4oKSkpOwotCi0JCW5vZGUgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnROdWxsKG5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eSgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldFNpemUoNDIpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eSgpKTsKLQotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlVbmNoYW5nZWRBdHRyaWJ1dGUoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXRTaXplKDQyKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzRGlydHkoKSk7Ci0KLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0KLQkJdGhpcy5yb290Lm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCQkvLyBzZXQgc2l6ZSB0byBzYW1lIG51bWJlciAtIHNob3VsZCBzdGF5IGNsZWFuCi0JCW5vZGUuc2V0U2l6ZSg0Mik7Ci0JCWFzc2VydFRydWUobm9kZS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eUJyYW5jaCgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldFNpemUoNDIpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQlwYXJlbnQuc2V0U2l6ZSg3Nyk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJbm9kZS5tYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlCcmFuY2hDbGVhbkNoaWxkRGlydHlQYXJlbnQoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXRTaXplKDQyKTsKLQotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJcGFyZW50LnNldFNpemUoNzcpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCS8vIG5vdywgY2xlYW4gdGhlIGNoaWxkLCBidXQgbGVhdmUgdGhlIHBhcmVudCBkaXJ0eQotCQlub2RlLm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eUJyYW5jaENsZWFuQ2hpbGREaXJ0eUNoaWxkKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTEgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMSIpOwotCQlub2RlMS5zZXRTaXplKDQxKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUyID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjIiKTsKLQkJbm9kZTIuc2V0U2l6ZSg0Mik7Ci0KLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUxLmdldFBhcmVudCgpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCS8vIG5vdywgY2xlYW4gdGhlIGZpcnN0IGNoaWxkLCBidXQgbGVhdmUgdGhlIHNlY29uZCBjaGlsZCBkaXJ0eQotCQlub2RlMS5tYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlCcmFuY2hGb3JjZWQoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0KLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUobm9kZS5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuQnJhbmNoKCkpOwotCi0JCXRoaXMucm9vdC5tYXJrRW50aXJlQnJhbmNoRGlydHkoKTsKLQotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzRGlydHlCcmFuY2goKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzRGlydHlCcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5VHJhbnNpZW50QXR0cmlidXRlKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzRGlydHkoKSk7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCXRoaXMucm9vdC5tYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQucHJvYmxlbXNTaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLnByb2JsZW1zU2l6ZSgpID4gMCk7Ci0KLQkJLy8gc2luY2UgcHJvYmxlbXMgYXJlIHRyYW5zaWVudCwgZXZlcnl0aGluZyBzaG91bGQgc3RpbGwgYmUgY2xlYW4KLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUobm9kZS5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuQnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9ibGVtcygpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldE5hbWUoIkJPR1VTIik7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCVByb2JsZW0gcHJvYmxlbTEgPSBub2RlLnByb2JsZW1zKCkubmV4dCgpOwotCi0JCS8vIG5vdyBjcmVhdGUgYW5vdGhlciBwcm9ibGVtIHRoYXQgc2hvdWxkIHJlbW92ZSB0aGUgb2xkIHByb2JsZW0KLQkJbm9kZS5zZXROYW1lKCJTVElMTCBCT0dVUyIpOwotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlQcm9ibGVtIHByb2JsZW0yID0gbm9kZS5wcm9ibGVtcygpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UocHJvYmxlbTEgPT0gcHJvYmxlbTIpOwotCQlwcm9ibGVtMSA9IHByb2JsZW0yOwotCi0JCS8vIG5vdyBjcmVhdGUgYW5vdGhlciBwcm9ibGVtIHRoYXQgc2hvdWxkIHJlcGxhY2UgdGhlIG9sZCBwcm9ibGVtCi0JCW5vZGUuc2V0TmFtZSgiU1RJTEwgQk9HVVMiKTsKLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUobm9kZS5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJcHJvYmxlbTIgPSBub2RlLnByb2JsZW1zKCkubmV4dCgpOwotCQkvLyB0aGUgc2FtZSBwcm9ibGVtIHNob3VsZCBiZSB0aGVyZQotCQlhc3NlcnRUcnVlKHByb2JsZW0xLmVxdWFscyhwcm9ibGVtMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCcmFuY2hQcm9ibGVtcygpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldE5hbWUoIkJPR1VTIik7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlwYXJlbnQuc2V0TmFtZSgiQk9HVVMgVE9PIik7Ci0JCXRoaXMucm9vdC5zZXROYW1lKCJCT0dVUyBUT08gVE9PIik7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCi0JCW5vZGUuc2V0TmFtZSgib2tpZS1kb2tpZSIpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5yb290LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBub2RlLmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJBbGxCcmFuY2hQcm9ibGVtcygpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldE5hbWUoIkJPR1VTIik7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlwYXJlbnQuc2V0TmFtZSgiQk9HVVMgVE9PIik7Ci0JCXRoaXMucm9vdC5zZXROYW1lKCJCT0dVUyBUT08gVE9PIik7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCi0JCXBhcmVudC5jbGVhckFsbEJyYW5jaFByb2JsZW1zKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuYnJhbmNoUHJvYmxlbXMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVkQnJhbmNoUHJvYmxlbXMoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXROYW1lKCJCT0dVUyIpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJcGFyZW50LnNldE5hbWUoIkJPR1VTIFRPTyIpOwotCQl0aGlzLnJvb3Quc2V0TmFtZSgiQk9HVVMgVE9PIFRPTyIpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5yb290LmJyYW5jaFByb2JsZW1zKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBwYXJlbnQuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmJyYW5jaFByb2JsZW1zKCkpKTsKLQotCQkvLyBjb21wbGV0ZWx5IHJlbW92ZSBhIG5vZGUgdGhhdCBoYXMgcHJvYmxlbXMgLQotCQkvLyB0aGUgZW50aXJlIHRyZWUgc2hvdWxkIHJlY2FsY3VsYXRlIGl0cyAiYnJhbmNoIiBwcm9ibGVtcwotCQlwYXJlbnQucmVtb3ZlVGVzdENoaWxkKG5vZGUpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5yb290LmJyYW5jaFByb2JsZW1zKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0KCkgewotCQlMaXN0PFRlc3RXb3JrYmVuY2hNb2RlbD4gbm9kZXMgPSB0aGlzLmJ1aWxkU29ydGVkTm9kZXMoKTsKLQkJYXNzZXJ0VHJ1ZShuZXcgUmFuZ2UoMCwgMSkuaW5jbHVkZXModGhpcy5pbmRleE9mKG5vZGVzLCAiYWFhIikpKTsKLQkJYXNzZXJ0VHJ1ZShuZXcgUmFuZ2UoMCwgMSkuaW5jbHVkZXModGhpcy5pbmRleE9mKG5vZGVzLCAiQUFBIikpKTsKLQkJYXNzZXJ0VHJ1ZShuZXcgUmFuZ2UoMiwgMykuaW5jbHVkZXModGhpcy5pbmRleE9mKG5vZGVzLCAiYmJiIikpKTsKLQkJYXNzZXJ0VHJ1ZShuZXcgUmFuZ2UoMiwgMykuaW5jbHVkZXModGhpcy5pbmRleE9mKG5vZGVzLCAiQkJCIikpKTsKLQkJYXNzZXJ0VHJ1ZShuZXcgUmFuZ2UoNCwgNikuaW5jbHVkZXModGhpcy5pbmRleE9mKG5vZGVzLCAiY2NjIikpKTsKLQkJYXNzZXJ0VHJ1ZShuZXcgUmFuZ2UoNCwgNikuaW5jbHVkZXModGhpcy5pbmRleE9mKG5vZGVzLCAiQ0NDIikpKTsKLQkJYXNzZXJ0VHJ1ZShuZXcgUmFuZ2UoNCwgNikuaW5jbHVkZXModGhpcy5pbmRleE9mKG5vZGVzLCAi77+977+977+9IikpKTsKLQl9Ci0KLQlwcml2YXRlIGludCBpbmRleE9mKExpc3Q8VGVzdFdvcmtiZW5jaE1vZGVsPiBub2RlcywgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBub2Rlcy5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJaWYgKG5vZGVzLmdldChpKS5nZXROYW1lKCkuZXF1YWxzKG5vZGVOYW1lKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8VGVzdFdvcmtiZW5jaE1vZGVsPiBidWlsZFNvcnRlZE5vZGVzKCkgewotCQlMaXN0PFRlc3RXb3JrYmVuY2hNb2RlbD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxUZXN0V29ya2JlbmNoTW9kZWw+KCk7Ci0JCXJlc3VsdC5hZGQobmV3IFJvb3RUZXN0V29ya2JlbmNoTW9kZWwoIkFBQSIpKTsKLQkJcmVzdWx0LmFkZChuZXcgUm9vdFRlc3RXb3JrYmVuY2hNb2RlbCgiQkJCIikpOwotCQlyZXN1bHQuYWRkKG5ldyBSb290VGVzdFdvcmtiZW5jaE1vZGVsKCJDQ0MiKSk7Ci0JCXJlc3VsdC5hZGQobmV3IFJvb3RUZXN0V29ya2JlbmNoTW9kZWwoIu+/ve+/ve+/vSIpKTsKLQkJcmVzdWx0LmFkZChuZXcgUm9vdFRlc3RXb3JrYmVuY2hNb2RlbCgiY2NjIikpOwotCQlyZXN1bHQuYWRkKG5ldyBSb290VGVzdFdvcmtiZW5jaE1vZGVsKCJiYmIiKSk7Ci0JCXJlc3VsdC5hZGQobmV3IFJvb3RUZXN0V29ya2JlbmNoTW9kZWwoImFhYSIpKTsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zb3J0KHJlc3VsdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0V29ya2JlbmNoTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE5vZGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJcHJpdmF0ZSBpbnQgc2l6ZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJWkVfUFJPUEVSVFkgPSAic2l6ZSI7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxUZXN0V29ya2JlbmNoTW9kZWw+IHRlc3RDaGlsZHJlbjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0hJTERSRU5fQ09MTEVDVElPTiA9ICJjaGlsZHJlbiI7Ci0JCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkJcHVibGljIFRlc3RXb3JrYmVuY2hNb2RlbChUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIocGFyZW50KTsKLQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCQl0aGlzLnNpemUgPSAwOwotCQkJdGhpcy50ZXN0Q2hpbGRyZW4gPSBuZXcgSGFzaEJhZzxUZXN0V29ya2JlbmNoTW9kZWw+KCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCi0JCi0JCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCi0JCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLnNpemU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgc2l6ZSkgewotCQkJaW50IG9sZCA9IHRoaXMuc2l6ZTsKLQkJCXRoaXMuc2l6ZSA9IHNpemU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0laRV9QUk9QRVJUWSwgb2xkLCBzaXplKTsKLQkJfQotCQotCQlwdWJsaWMgSXRlcmF0b3I8VGVzdFdvcmtiZW5jaE1vZGVsPiB0ZXN0Q2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8VGVzdFdvcmtiZW5jaE1vZGVsPih0aGlzLnRlc3RDaGlsZHJlbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShUZXN0V29ya2JlbmNoTW9kZWwgY3VycmVudCkgewotCQkJCQlUZXN0V29ya2JlbmNoTW9kZWwudGhpcy5yZW1vdmVUZXN0Q2hpbGQoY3VycmVudCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlwdWJsaWMgaW50IHRlc3RDaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXN0Q2hpbGRyZW4uc2l6ZSgpOwotCQl9Ci0JCXByaXZhdGUgVGVzdFdvcmtiZW5jaE1vZGVsIGFkZFRlc3RDaGlsZChUZXN0V29ya2JlbmNoTW9kZWwgdGVzdENoaWxkKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24odGVzdENoaWxkLCB0aGlzLnRlc3RDaGlsZHJlbiwgVEVTVF9DSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJCXJldHVybiB0ZXN0Q2hpbGQ7Ci0JCX0KLQkJcHVibGljIFRlc3RXb3JrYmVuY2hNb2RlbCBhZGRUZXN0Q2hpbGROYW1lZChTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCQlpZiAodGhpcy50ZXN0Q2hpbGROYW1lZChjaGlsZE5hbWUpICE9IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNoaWxkTmFtZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5hZGRUZXN0Q2hpbGQobmV3IFRlc3RXb3JrYmVuY2hNb2RlbCh0aGlzLCBjaGlsZE5hbWUpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVUZXN0Q2hpbGQoVGVzdFdvcmtiZW5jaE1vZGVsIHRlc3RDaGlsZCkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24odGVzdENoaWxkLCB0aGlzLnRlc3RDaGlsZHJlbiwgVEVTVF9DSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyBUZXN0V29ya2JlbmNoTW9kZWwgdGVzdENoaWxkTmFtZWQoU3RyaW5nIGNoaWxkTmFtZSkgewotCQkJZm9yIChUZXN0V29ya2JlbmNoTW9kZWwgdGVzdENoaWxkIDogdGhpcy50ZXN0Q2hpbGRyZW4pIHsKLQkJCQlpZiAodGVzdENoaWxkLmdldE5hbWUoKS5lcXVhbHMoY2hpbGROYW1lKSkgewotCQkJCQlyZXR1cm4gdGVzdENoaWxkOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBUZXN0V29ya2JlbmNoTW9kZWwgdGVzdERlc2NlbmRhbnROYW1lZChTdHJpbmcgZGVzY2VuZGFudE5hbWUpIHsKLQkJCWZvciAoVGVzdFdvcmtiZW5jaE1vZGVsIHRlc3REZXNjZW5kYW50IDogdGhpcy50ZXN0Q2hpbGRyZW4pIHsKLQkJCQlpZiAodGVzdERlc2NlbmRhbnQuZ2V0TmFtZSgpLmVxdWFscyhkZXNjZW5kYW50TmFtZSkpIHsKLQkJCQkJcmV0dXJuIHRlc3REZXNjZW5kYW50OwotCQkJCX0KLQkJCQkvLyByZWN1cnNlLi4uCi0JCQkJdGVzdERlc2NlbmRhbnQgPSB0ZXN0RGVzY2VuZGFudC50ZXN0RGVzY2VuZGFudE5hbWVkKGRlc2NlbmRhbnROYW1lKTsKLQkJCQlpZiAodGVzdERlc2NlbmRhbnQgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdGVzdERlc2NlbmRhbnQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkKLQkJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlblRvKExpc3Q8Tm9kZT4gY2hpbGRyZW4pIHsKLQkJCXN1cGVyLmFkZENoaWxkcmVuVG8oY2hpbGRyZW4pOwotCQkJY2hpbGRyZW4uYWRkQWxsKHRoaXMudGVzdENoaWxkcmVuKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQkJc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCQkJLy8gbmFtZXMgbXVzdCBiZSBhbGwgbG93ZXJjYXNlLi4uCi0JCQlmb3IgKGludCBpID0gdGhpcy5uYW1lLmxlbmd0aCgpOyBpLS0gPiAwOyApIHsKLQkJCQljaGFyIGMgPSB0aGlzLm5hbWUuY2hhckF0KGkpOwotCQkJCWlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoYykgJiYgISBDaGFyYWN0ZXIuaXNMb3dlckNhc2UoYykpIHsKLQkJCQkJY3VycmVudFByb2JsZW1zLmFkZCh0aGlzLmJ1aWxkUHJvYmxlbSgiTkFNRV9NVVNUX0JFX0xPV0VSQ0FTRSIsIHRoaXMubmFtZSkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBSb290VGVzdFdvcmtiZW5jaE1vZGVsIGV4dGVuZHMgVGVzdFdvcmtiZW5jaE1vZGVsIHsKLQkJcHVibGljIFJvb3RUZXN0V29ya2JlbmNoTW9kZWwoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG51bGwsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJCXJldHVybiBOb2RlLk5VTExfVkFMSURBVE9SOwotCQl9Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9KcHRVdGlsaXR5Tm9kZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL25vZGUvSnB0VXRpbGl0eU5vZGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGY2ODJkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9KcHRVdGlsaXR5Tm9kZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU5vZGVUZXN0cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlOb2RlVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBYnN0cmFjdE5vZGVUZXN0cy5jbGFzcyk7Ci0JCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRVdGlsaXR5Tm9kZVRlc3RzKCkgewotCQlzdXBlcigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy90ZXN0LnhtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzYWI3ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLQk8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotCTwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0JPGVjaG8gbWVzc2FnZT0iYmFzZWRpciAke2Jhc2VkaXJ9IiAvPgotCTxlY2hvIG1lc3NhZ2U9ImVjbGlwc2UgcGxhY2UgJHtlY2xpcHNlLWhvbWV9IiAvPgotCTwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSAtLT4KLQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cyIvPgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotCTwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0JPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JCTxkZWxldGU+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0JCTwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLQkJPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLkpwdFV0aWxpdHlUZXN0cyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIiLz4KLQkJPC9hbnQ+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLQk8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0JPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotCTx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0JPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotCTx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LCBzdWl0ZSwgY2xlYW51cCI+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=